В экосистеме React Hook Form резолвер YupResolver претерпевал изменения, связанные с развитием как самой библиотеки Yup, так и архитектуры валидационных резолверов. Эти изменения затрагивали сигнатуры функций, поведение асинхронной валидации, обработку ошибок и типизацию в TypeScript, что в совокупности приводило к необходимости адаптации кода при переходе между версиями.
Ранние версии YupResolver опирались на относительно прямолинейную
схему преобразования схемы Yup в формат ошибок React Hook Form. Основная
идея заключалась в вызове schema.validate(values) и
последующем маппинге ошибок.
Позднее модель была переработана в сторону унификации с другими резолверами:
Resolver<T>{ values, errors }Ключевое изменение: обработка Yup-ошибок перестала быть «встроенной логикой» и стала частью адаптера.
Одним из наиболее заметных изменений стало усиление роли асинхронной валидации.
Ранние реализации допускали частично синхронное поведение при отсутствии асинхронных правил в Yup-схеме. Позднее это было устранено:
validate() всегда возвращает PromiseЭто изменение повлияло на интеграцию с React Hook Form, где теперь любые вызовы resolver обрабатываются как асинхронные вне зависимости от сложности схемы.
Сигнатура функции yupResolver изменялась несколько раз,
что является одной из основных причин несовместимости версий.
yupResolver(schema)
Простой вызов без дополнительных параметров.
Добавление контекста и опций:
yupResolver(schema, options)
Где options включали:
contextabortEarlystripUnknownyupResolver(schema, options?, resolverOptions?)
Появился третий аргумент, связанный с React Hook Form resolver options:
mode)Критическое изменение: перенос части конфигурации из Yup-уровня в уровень интеграции с формой.
Одним из самых чувствительных изменений стала переработка структуры ошибок.
Ошибки формировались в упрощённом виде:
{
fieldName: {
type: "validation",
message: "Error message"
}
}
Структура стала более унифицированной с React Hook Form:
{
type?: string;
message?: string;
ref?: any;
}
Дополнительно:
array fields)path → RHF field name)Суть изменения: отказ от упрощённого маппинга в пользу полной совместимости с системой ошибок формы.
Поведение abortEarly в Yup претерпело важную
эволюцию.
Это привело к следующему:
Существенный пласт breaking changes связан с TypeScript.
Ранее:
Resolver<T>
Позднее:
Resolver<TFieldValues, TContext>
Добавился контекст формы как отдельный generic-параметр.
FieldErrors<T> стал строго связан с ключами
формыFieldArray)Практический эффект: меньше неявных
any, но больше требований к точности описания схемы
формы.
С ростом версии Yup часть breaking changes была обусловлена не самим резолвером, а изменениями в Yup API.
ValidationError.innertest())nullable() и
required()YupResolver адаптировался к этим изменениям через:
ValidationErrorpathВ новых версиях изменился подход к обработке cast и
transform:
Это повлияло на:
Работа с вложенными структурами (user.address.street)
претерпела несколько улучшений:
Ранее частыми проблемами были:
Поздние версии решают это через более строгую нормализацию путей.
Оптимизации затронули:
validate() вызововОсновные изменения:
abortEarly=falseВ более ранних версиях наблюдалось:
Позднее появились улучшения:
onChange, onBlur)YupResolver стал более строго следовать контракту React Hook Form:
{ values, errors }shouldUseNativeValidationcriteriaMode: "all"Также изменилось поведение при:
Каждое из этих изменений направлено на предсказуемость состояния формы при сложных сценариях управления UI.