Breaking changes между версиями

Vest изначально проектировалась как декларативная библиотека валидации, вдохновлённая подходами тестовых фреймворков. Её ключевая идея — описывать правила проверки данных в виде «сессий», где каждая проверка группируется, кешируется и может выполняться условно. На ранних этапах развития библиотека активно меняла внутреннюю архитектуру, что привело к нескольким крупным несовместимым изменениям между версиями.


Переход от ранних версий к стабильному API (0.x → 1.0)

Основной разрыв между ранними версиями и первым стабильным релизом связан с переходом от экспериментального API к формально закреплённой модели сессий.

Изменение модели описания валидации

Ранние версии допускали более «свободную» структуру описания правил, где порядок вызова функций мог влиять на результат непредсказуемо. В версии 1.0 введена строгая сессионная модель:

  • каждая валидация выполняется внутри create()
  • результат формируется через единый механизм завершения сессии
  • устранена возможность «побочных» проверок вне контекста

Ключевое изменение: переход к детерминированной системе выполнения правил.


Упрощение API результатов

В ранних версиях структура результата содержала избыточные поля, ориентированные на отладку. В 1.0:

  • убраны внутренние метаданные выполнения
  • стандартизирован объект ошибок
  • введена единая модель доступа к состоянию валидности

Изменения в версии 2.x: переход к декларативным коллекциям правил

Версия 2.0 стала важным этапом, так как изменила способ организации правил внутри сессии.

Введение группировки правил

До 2.x правила часто писались линейно. После обновления появилась концепция групп:

  • логическое объединение проверок по полям
  • оптимизация выполнения через ранние прерывания
  • улучшение читаемости сложных схем валидации

Breaking change: старые валидаторы без групп могли требовать переписывания структуры.


Изменение поведения асинхронных проверок

Одним из ключевых переломных моментов стало уточнение работы асинхронных правил:

  • ранее асинхронные проверки могли запускаться параллельно без явного контроля
  • в 2.x введено строгие правила ожидания завершения
  • изменён порядок агрегации ошибок

Это повлияло на проекты, где использовались запросы к API внутри валидации: поведение стало более предсказуемым, но потребовало адаптации к новому потоку выполнения.


Изменение API матчеров и условий

Внутренние вспомогательные функции для условий (например, условные проверки) были переработаны:

  • изменены сигнатуры предикатов
  • убраны неявные преобразования значений
  • усилена типизация условий

Версия 3.x: переработка производительности и модели исполнения

В 3.x основной фокус был направлен на ускорение и предсказуемость выполнения.

Новый механизм кеширования

Старая модель кеширования результатов могла приводить к повторному выполнению одних и тех же проверок. В 3.x:

  • внедрён более агрессивный кеш на уровне сессий
  • изменены правила инвалидирования кеша
  • переработан механизм повторного запуска проверок

Breaking change: в некоторых сценариях проверки перестали выполняться повторно при изменении внешних зависимостей без явного сброса состояния.


Изменение модели зависимостей полей

Ранее зависимости между полями (например, password/confirm password) отслеживались неявно. В 3.x:

  • введено явное определение зависимостей
  • изменено поведение перекрёстных проверок
  • устранены скрытые реактивные связи

Это сделало систему более контролируемой, но потребовало явного указания связей там, где раньше они определялись автоматически.


Рефакторинг API ошибок

Структура ошибок была стандартизирована:

  • унифицирован формат сообщений
  • изменён способ привязки ошибки к полю
  • убрана часть legacy-полей

Версия 4.x: переход к модульности и более строгой типизации

В 4.x изменения затронули архитектуру экспорта и интеграции.

Изменение структуры импортов

Ранее библиотека предоставляла более монолитный API. В 4.x:

  • разделены основные и вспомогательные функции
  • изменены пути импорта
  • убраны некоторые default-экспорты

Breaking change: проекты, использующие старые импорты, потребовали массового рефакторинга импортных путей.


Усиление TypeScript-интеграции

Хотя библиотека работала с типами и раньше, в 4.x:

  • переписаны основные типы
  • изменены generics для описания схем
  • усилена проверка соответствия типов правил

Это привело к тому, что ранее «гибкие» конструкции стали более строго типизированными и иногда требовали явного указания типов там, где раньше они выводились автоматически.


Изменение поведения условных сессий

Условные блоки валидации получили новую модель исполнения:

  • убраны некоторые неявные ветвления
  • изменён порядок выполнения условий внутри сессии
  • унифицирована логика short-circuit

Совместимость и миграционные последствия между версиями

Across major versions, наиболее критичные разрывы касались трёх направлений:

  • модель выполнения (синхронная/асинхронная координация)
  • структура API (импорты, экспорты, сигнатуры функций)
  • поведение кеширования и зависимостей

Типичный эффект миграции между версиями выражался не только в изменении синтаксиса, но и в изменении логики выполнения валидаторов, что особенно критично для форм с комплексной бизнес-логикой.


Изменения в поведении ошибок и диагностики

На протяжении всех крупных версий наблюдалась тенденция к:

  • уменьшению «внутренних» деталей ошибок
  • стандартизации структуры error-объектов
  • усилению связи ошибка → поле → правило

Ранние версии допускали более «размытые» сообщения, тогда как поздние версии требуют строгой привязки каждой ошибки к конкретному правилу валидации.


Изменение философии библиотеки

Хотя формально это не всегда фиксировалось как breaking change, фактически произошёл сдвиг:

  • от гибкой, почти скриптовой модели
  • к строгой, предсказуемой декларативной системе

Это проявилось в каждом крупном релизе через ужесточение правил выполнения, уменьшение неявного поведения и переход к более явным контрактам API.