Обратная совместимость

В библиотеке Vest обратная совместимость строится вокруг строгого соблюдения принципов семантического версионирования. Любое изменение API оценивается не только с точки зрения функциональности, но и с точки зрения влияния на существующие проекты, уже использующие библиотеку в продакшене.

Мажорные версии используются исключительно для изменений, которые ломают существующее поведение. Это включает переработку API, удаление методов или изменение логики валидации, которая может привести к другим результатам проверки без изменения кода пользователя.

Минорные версии допускают расширение функциональности при сохранении прежнего поведения. Например, добавление новых валидаторов или расширение возможностей существующих функций без изменения их контрактов.

Патч-версии ограничиваются исправлением ошибок, оптимизацией и внутренними улучшениями, не влияющими на публичное поведение API.

Ключевой принцип заключается в том, что любой код, корректно работающий на предыдущей минорной версии, должен продолжать работать без изменений после обновления на новую минорную или патч-версию.


Стабильность публичного API

Публичный API Vest разделяется на стабильное ядро и внутренние механизмы. Обратная совместимость гарантируется только для публичной части, которая включает:

  • определение тест-сьютов (suite)
  • функции проверки (test)
  • композицию правил валидации
  • механизм асинхронной валидации
  • обработку результатов

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

Особое внимание уделяется структуре результатов валидации. Формат объекта результата считается контрактом, и любые изменения в нём требуют либо полной совместимости, либо введения нового поля без удаления старых.


Стратегия устаревания (deprecation)

Перед удалением любой функциональности вводится этап устаревания. Устаревшие API сохраняются в библиотеке минимум на несколько минорных релизов, сопровождаясь предупреждениями.

Механизм устаревания реализуется через:

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

Критически важно, что устаревший функционал продолжает работать идентично прежнему поведению, даже если он помечен как deprecated. Это снижает риск поломки существующих приложений при обновлении зависимостей.


Совместимость валидаторов и правил

Одной из сложных областей является совместимость валидаторов. В Vest валидаторы часто представляют собой функции, возвращающие результат проверки или промис.

Проблемы обратной совместимости возникают в следующих случаях:

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

Для предотвращения нарушений контрактов используется правило неизменности интерфейса валидатора: функция всегда должна принимать одинаковые аргументы и возвращать совместимый тип результата.

При расширении функциональности добавляются новые валидаторы, а не модифицируются существующие.


Совместимость цепочек валидации

Vest использует декларативное описание правил, где тесты объединяются в логические структуры. Обратная совместимость здесь обеспечивается за счёт неизменности поведения композиции.

Основные гарантии:

  • порядок выполнения тестов сохраняется
  • логика объединения результатов не изменяется
  • поведение при первом провале не меняется (fail-fast сценарии)
  • асинхронные тесты сохраняют модель выполнения

Любые изменения в движке исполнения тестов требуют отдельной версии, так как даже небольшие изменения порядка могут привести к другим результатам в сложных схемах валидации.


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

Vest используется как в браузере, так и в Node.js, поэтому важной частью обратной совместимости является поддержка различных JavaScript-окружений.

Поддерживаются следующие принципы:

  • отсутствие зависимости от специфичных API браузера
  • корректная работа в разных версиях Node.js
  • изоляция от глобальных объектов
  • отсутствие жёсткой привязки к платформенным особенностям

Если вводится зависимость от новых возможностей языка (например, новых методов массива или Promise-расширений), обязательно предусматриваются полифиллы или альтернативные реализации для старых окружений.


Совместимость типов и контрактов данных

Хотя JavaScript не является строго типизированным языком, Vest фактически опирается на контрактную модель данных. Нарушение этих контрактов приводит к поломке обратной совместимости.

Основные требования:

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

При необходимости изменения структуры вводится параллельная версия API, а старая структура сохраняется для существующего кода.


Совместимость асинхронной модели

Асинхронная валидация является одной из наиболее чувствительных зон с точки зрения обратной совместимости. Любое изменение поведения Promise-цепочек может привести к изменению логики проверки.

Гарантируется:

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

Если вводятся оптимизации асинхронного выполнения, они не должны влиять на наблюдаемое поведение результатов.


Политика расширения API без нарушения совместимости

Расширение функциональности в Vest реализуется через добавление новых сущностей, а не изменение старых. Это позволяет сохранять стабильность интерфейсов.

Используются следующие подходы:

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

Каждое новое расширение проходит проверку на потенциальное влияние на существующие сценарии использования.


Тестовая стратегия как инструмент совместимости

Обратная совместимость поддерживается не только архитектурными решениями, но и системой тестирования. Для Vest характерно наличие регрессионных тестов, фиксирующих поведение API.

Основные типы тестов:

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

Регрессионный набор тестов рассматривается как часть публичного контракта: любое изменение, ломающее тесты, считается нарушением обратной совместимости.


Управление критическими изменениями

Когда изменение невозможно реализовать без нарушения совместимости, применяется многоэтапный процесс:

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

Такой подход минимизирует риск внезапных поломок в проектах, использующих библиотеку в продакшене.


Совместимость конфигураций и схем валидации

Схемы валидации часто используются повторно между версиями, поэтому их совместимость является отдельной областью ответственности.

Гарантируется:

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

Изменения в интерпретации схем допускаются только при явном переходе на новую мажорную версию, где поведение документировано как изменённое.