В ранних версиях Yup основная модель построения схем опиралась на
цепочечные вызовы через фабрики типов: string(),
number(), boolean(), object(),
array(). С течением времени API стал более строгим и
предсказуемым, а поведение некоторых методов изменилось для устранения
неоднозначностей.
Одним из ключевых изменений стало постепенное выравнивание поведения
базового класса Schema. В более старых версиях методы вроде
required(), nullable(), default()
могли вести себя по-разному в зависимости от типа схемы. В новых версиях
их поведение унифицировано: теперь они наследуются от общего прототипа и
обрабатываются консистентно независимо от типа данных.
Особое внимание уделялось работе с mixed() — базовым
типом, от которого наследуются все остальные схемы. Ранее он
использовался редко, но позже стал центральной точкой расширения через
addMethod, что привело к изменению внутренней архитектуры
расширяемости.
Одним из наиболее заметных изменений стало поведение методов
validate, isValid и
validateSync.
В старых версиях:
validate() мог возвращать не всегда предсказуемые
ошибки при использовании abortEarlyisValid() иногда запускал полную валидацию даже при
частичном успехеВ более новых версиях:
validate() стал строго Promise-ориентированнымvalidateSync() получил более ограниченную область
применения и явное поведение при ошибкахabortEarly по умолчанию изменил семантику остановки:
теперь он предсказуемо останавливает проверку на первой ошибке без
частичного накопления состоянияТакже была стабилизирована работа с ValidationError,
который стал более структурированным: поле inner теперь
гарантированно содержит массив ошибок только при отключённом
abortEarly.
Существенная переработка затронула object() и работу с
вложенными схемами.
Ранее:
reach(schema, path) был
менее строгимstrict и noUnknownПозже:
reach стал строго типизированным инструментом доступа к
схемеnoUnknown унифицировалось и перестало влиять
на валидацию вложенных схемdefault() для
вложенных объектовИзменение архитектуры привело к тому, что схемы объектов стали ближе к декларативному описанию структуры данных, а не к динамической проверке в рантайме.
Одним из крупнейших изменений между версиями стала эволюция типизации.
В ранних версиях:
InferType часто давал неточные результаты.required().nullable() могли приводить к
конфликтам типовПозже:
object().shape()mixed()Особенно заметно изменение поведения при использовании
as const-подходов: схемы стали лучше выводить literal-типы,
что снизило необходимость ручного указания generic-параметров.
Метод test() подвергся значительной переработке.
Ранее:
Позже:
true | false | ValidationErrorthisИзменилось и поведение addMethod(). Если ранее
добавленные методы могли конфликтовать при повторном объявлении, то
позже введена более строгая регистрация, предотвращающая перезапись без
явного намерения.
Метод transform() стал одним из ключевых инструментов
нормализации данных, и его поведение также менялось.
Ранее трансформации:
default()В более поздних версиях:
cast,
затем transform, затем validatetransform и
nullableNaN,
undefined и пустыми строкамиЭто изменение сделало схемы более детерминированными при обработке “грязных” данных из форм и API.
Метод when() претерпел значительную переработку логики
зависимостей.
Ранее:
Позже:
Также изменилось поведение при использовании
switch-подобной логики: теперь каждая ветка вычисляется
детерминированно, без побочных эффектов от предыдущих условий.
Схемы array() получили ряд изменений в API и
поведении:
Ранее:
of() мог вести себя непредсказуемо при смешанных
типахПозже:
ValidationError.innerundefinedОсобенно важным стало изменение порядка валидации: теперь каждый элемент массива валидируется независимо, а ошибки собираются в структурированную иерархию.
Класс ValidationError стал более формализованным.
Ранее:
path иногда отсутствовалоПозже:
path, message и
typeinnerТакже изменилось поведение при кастомных сообщениях: теперь шаблонные строки и функции сообщений обрабатываются через единый механизм интерполяции.
В процессе развития библиотеки ряд методов был признан устаревшим:
concat() в сторону более
строгого слияния схемmixed()cast постепенно заменены
на явные трансформацииУдаление старого поведения происходило постепенно, через предупреждения и обратную совместимость, но в новых версиях часть старых возможностей полностью исключена ради консистентности API.
Цепочный API, являющийся основой Yup, также был пересмотрен.
Ранее:
nullable, required,
default могли конфликтоватьПозже:
Теперь каждая цепочка воспринимается как декларативное описание, а не как последовательность императивных изменений.
Одним из наиболее критичных изменений стало изменение дефолтных настроек:
abortEarly получил более строгую семантикуstrict стало более последовательнымЭто привело к необходимости пересмотра многих старых схем, особенно тех, что рассчитывали на мягкую типизацию входных данных.
Совместимость между версиями поддерживается частично, но логика построения схем требует более явного описания намерений разработчика, чем в ранних релизах библиотеки.