Vest реализует декларативный подход к валидации данных, в котором правила группируются в тестовые сьюты, а результат вычисления представляет собой структурированное дерево состояний. Одной из ключевых особенностей является разделение результатов валидации на ошибки и предупреждения, что позволяет строить более гибкую бизнес-логику: не только блокировать некорректные данные, но и сигнализировать о потенциальных проблемах.
Система результатов валидации в Vest построена вокруг двух независимых потоков:
Такой подход позволяет разделять критические и некритические состояния формы или данных.
Внутренне результат выполнения теста формируется как объект, содержащий структурированную информацию по каждому полю, включая агрегированные флаги состояния:
hasErrorshasWarningsЭти флаги являются производными от результатов выполнения всех правил валидации и используются для быстрого определения общего состояния набора данных.
hasErrors — это булевый индикатор, который показывает
наличие хотя бы одной критической ошибки в наборе валидационных
результатов.
Если хотя бы один тест вернул ошибку, значение hasErrors
становится true.
Обобщённо поведение можно представить следующим образом:
hasErrors = truehasErrors = falsehasErrors используется в сценариях, где необходимо
строго запретить дальнейшее выполнение операций:
Если задан набор правил:
И email не проходит проверку, результат будет:
hasErrors: truehasErrors не учитывает предупреждения. Даже если
присутствует множество warning-сообщений, но отсутствуют ошибки,
значение останется false.
Это делает флаг строго бинарным индикатором критичности состояния.
hasWarnings отражает наличие некритических отклонений от
рекомендуемых правил.
В отличие от ошибок, warnings не блокируют выполнение логики, но сигнализируют о потенциальных проблемах или нежелательных паттернах.
hasWarnings = truehasWarnings = falseWarnings применяются для:
Пароль соответствует минимальным требованиям, но:
В этом случае:
hasErrors = falsehasWarnings = trueСистема может разрешить отправку формы, но показать рекомендации по улучшению безопасности.
Ключевое различие:
Это разделение позволяет строить UX с постепенным улучшением данных без жёстких ограничений.
Оба флага могут существовать одновременно, но описывают разные уровни состояния:
hasErrors = true, hasWarnings = true
Данные некорректны и одновременно содержат рекомендации
hasErrors = true, hasWarnings = false
Данные строго некорректны без дополнительных предупреждений
hasErrors = false, hasWarnings = true
Данные допустимы, но требуют улучшения
hasErrors = false, hasWarnings = false
Полностью корректные данные
Такое разделение позволяет формировать многослойную систему обратной связи.
import { suite, test, enforce } from 'vest';
const validateUser = (data) => {
return suite('user_validation', () => {
test('email', 'Email обязателен', () => {
enforce(data.email).isNotEmpty();
});
test('email', 'Email должен быть корректным', () => {
enforce(data.email).matches(/.+@.+\..+/);
});
test('password', () => {
if (data.password && data.password.length < 8) {
warn('Пароль слишком короткий');
}
enforce(data.password).isNotEmpty();
});
});
};
В результате выполнения такого сьюта:
hasErrors = truehasWarnings = trueВ приложениях с использованием Vest флаги hasErrors и
hasWarnings часто применяются на разных уровнях:
hasErrorshasWarningsПри каждом запуске сьюта Vest пересчитывает:
hasErrors и hasWarnings являются
производными от всей структуры, а не от отдельных тестов, что делает их
устойчивыми к изменению внутренней реализации правил.
Такая модель позволяет использовать Vest как систему декларативной валидации с многоуровневой семантикой состояния данных.