Стратегия версионирования ESLint

ESLint следует модели семантического версионирования (Semantic Versioning, SemVer), где версия представляется в виде MAJOR.MINOR.PATCH. Эта стратегия определяет предсказуемость обновлений и управляет рисками совместимости в экосистеме линтинга JavaScript-кода.

MAJOR-версия изменяется при внесении несовместимых изменений. MINOR-версия — при добавлении функциональности с обратной совместимостью. PATCH-версия — при исправлении ошибок без изменения публичного API.

Ключевая особенность ESLint заключается в том, что «публичным API» считается не только программный интерфейс, но и поведение правил, формат конфигурации, CLI-опции и контракт плагинов.


Области, охватываемые версионированием

Версионирование ESLint распространяется на несколько независимых, но связанных слоёв:

  • CLI-интерфейс (eslint команда)
  • API ядра (ESLint class и Node.js API)
  • система правил (core rules)
  • механизм плагинов
  • формат конфигурации (.eslintrc, flat config)
  • обработчики парсинга (parsers)
  • интеграции с TypeScript и другими транспайлерами

Изменение любого из этих слоёв может приводить к увеличению MAJOR-версии, если нарушается обратная совместимость.


MAJOR-релизы и стратегия миграций

MAJOR-версии ESLint традиционно вводят архитектурные изменения, требующие адаптации конфигураций и плагинов.

Характерные типы breaking changes

  1. Удаление устаревших правил

    • правила, помеченные как deprecated, удаляются в следующем MAJOR-релизе
    • альтернативы часто предлагаются через новые правила или плагины
  2. Изменение поведения правил

    • корректировка AST-логики
    • изменение дефолтных параметров
    • пересмотр edge-case поведения
  3. Изменение конфигурационного формата

    • переход от .eslintrc к flat config стал одним из крупнейших изменений
    • изменение схемы наследования конфигураций
  4. Обновление API ядра

    • изменения в классе ESLint
    • изменение формата результатов linting
  5. Обновления плагинного контракта

    • изменение структуры rule meta
    • обновление API context

Переход к flat config и влияние на версионирование

Одним из наиболее значимых шагов стало введение flat config, который существенно изменил стратегию совместимости.

Flat config:

  • убрал каскадное наследование .eslintrc
  • ввёл явную декларацию конфигураций через JS-модули
  • изменил модель расширений (extends)
  • упростил резолвинг правил и плагинов

Переход на flat config стал причиной роста MAJOR-версии, так как затронул базовую модель конфигурации.


MINOR-релизы: расширение без ломающих изменений

MINOR-версии ESLint используются для постепенного развития функциональности без нарушения существующих конфигураций.

Типичные изменения:

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

MINOR-релизы часто включают поддержку новых возможностей ECMAScript без изменения поведения существующих правил.


PATCH-релизы и модель исправлений

PATCH-версии ориентированы на стабильность. Они включают:

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

Особенность ESLint заключается в том, что даже небольшие изменения в правилах могут влиять на количество предупреждений, поэтому PATCH-релизы требуют аккуратного тестирования на больших кодовых базах.


Версионирование плагинов и peerDependencies

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

Основные принципы:

  • плагины используют peerDependencies на ESLint
  • диапазон совместимости обычно указывается как ^8 || ^9
  • breaking changes в ESLint часто требуют обновления плагинов

Типичная проблема:

  • обновление ESLint до нового MAJOR требует одновременного обновления всех плагинов

Это создаёт эффект «версионного каскада», где стабильность проекта зависит от согласованности всей цепочки зависимостей.


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

Конфигурации ESLint чувствительны к версии ядра.

Основные зоны несовместимости:

  • формат .eslintrc vs flat config
  • изменение поведения extends
  • различия в резолвинге плагинов
  • новые значения parserOptions

Стратегия миграции обычно включает:

  • фиксацию версии ESLint в lockfile
  • постепенное обновление конфигураций
  • параллельное тестирование старой и новой версии линтера

Политика устаревания (deprecation policy)

ESLint использует поэтапную систему устаревания:

  1. Функция или правило помечается как deprecated
  2. В логах CLI выводятся предупреждения
  3. Документация указывает альтернативу
  4. В следующем MAJOR-релизе функциональность удаляется

Такая стратегия снижает риск резких миграций, но требует регулярного отслеживания предупреждений в CI.


Версионирование правил ESLint

Каждое правило ESLint имеет собственный жизненный цикл внутри общей версии пакета.

Статусы правил:

  • stable — активно поддерживается
  • deprecated — рекомендуется замена
  • removed — отсутствует в текущем MAJOR

Изменения правил часто являются скрытыми breaking changes, даже если версия ESLint не увеличивает MAJOR, поэтому анализ changelog критичен при обновлениях.


CLI и API как часть контрактной стабильности

CLI ESLint рассматривается как стабильный интерфейс:

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

Node.js API (ESLint class) имеет более строгие гарантии стабильности, так как используется в сборочных системах и CI/CD пайплайнах.


Стратегия обновления в больших проектах

В крупных кодовых базах стратегия обновления ESLint обычно включает:

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

Особое внимание уделяется:

  • увеличению количества lint errors после обновлений
  • изменению поведения правил без явного предупреждения
  • несовместимости плагинов

Эволюция стратегии версионирования

Со временем ESLint перешёл от простого набора правил к сложной экосистеме, где версионирование стало инструментом управления совместимостью всей JavaScript-инфраструктуры.

Ключевые направления эволюции:

  • усиление роли конфигурационного слоя
  • переход к модульной архитектуре правил
  • стандартизация plugin API
  • сокращение скрытых breaking changes
  • повышение предсказуемости обновлений в CI-средах