Валидация данных в Superstruct строится не только на проверке значения как такового, но и на окружении, в котором это значение существует. Контекст валидации представляет собой набор служебной информации, которая передаётся в каждый пользовательский валидатор и позволяет учитывать структуру объекта, путь до текущего узла, режим преобразования и состояние проверки.
При обработке значения Superstruct формирует объект контекста, который сопровождает каждую проверку, включая вложенные поля сложных структур. Это позволяет реализовывать:
Контекст становится связующим звеном между текущим значением и всей структурой данных, в которой оно находится.
Одним из ключевых элементов контекста является path. Это
массив, описывающий путь к текущему проверяемому значению внутри
объекта.
Пример логики пути:
["user", "profile", "email"]
Такой путь указывает, что валидация происходит на уровне
email, вложенного в profile, который, в свою
очередь, находится в user.
Значение path используется для:
Контекст содержит также branch — исходное значение, от
которого происходит текущая проверка. В отличие от value,
которое может быть преобразовано или уточнено в процессе валидации,
branch остаётся неизменным и представляет первоначальные
данные на данном уровне дерева.
Использование branch позволяет:
Контекст может содержать флаг coerce, определяющий,
разрешено ли автоматическое приведение типов.
В режиме coercion возможны преобразования:
Проверяющие функции могут учитывать этот флаг для изменения поведения:
При создании пользовательских структур в Superstruct функция-валидатор получает доступ к контексту вторым параметром.
Типичная сигнатура:
(value, context) => boolean | string | void
Контекст предоставляет инструменты для управления результатом проверки:
context.path — путь к значению;context.branch — исходное значение на текущем
уровне;context.coerce — режим преобразования;context.fail() — явное формирование ошибки.Использование context.fail позволяет завершить проверку
с детализированным сообщением:
context.fail("Недопустимый формат значения")
или с более точной структурой ошибки, включая путь и тип нарушения.
Superstruct не ограничивается возвратом булевого результата. Контекст
позволяет формировать структурированные ошибки через механизм
fail.
При вызове fail выполнение текущей проверки прерывается,
а ошибка регистрируется в общей структуре результата.
Это обеспечивает:
При использовании refine контекст сохраняется и
передаётся в пользовательскую функцию уточнения.
Это позволяет реализовывать зависимые ограничения, например:
Пример логики:
role = "admin", поле permissions
должно быть заполнено;При проверке сложных объектов контекст не создаётся заново для каждого уровня, а расширяется по мере углубления структуры.
Это означает:
path дополняется новым ключом;branch сужается до текущего поддерева;coerce сохраняется;Такой подход обеспечивает согласованность валидации для глубоко вложенных объектов без потери исходной информации.
Контекст позволяет реализовывать динамические схемы, в которых структура проверки зависит от текущих данных.
Это достигается через:
branch;path для определения положения;Подобные механизмы используются для:
Контекст валидации напрямую влияет на детализацию ошибок. Комбинация
path, branch и fail позволяет
формировать сообщения, которые:
Это особенно важно при работе с большими объектами, где простое сообщение о несоответствии типа недостаточно информативно.
При использовании композиции (object,
array, union) контекст передаётся через всю
цепочку проверок без потери информации.
Это обеспечивает:
Каждый уровень композиции расширяет контекст, не разрушая предыдущие данные, что делает систему предсказуемой при масштабировании схем.