Какие правила поддерживают --fix

Механизм автоматического исправления в ESLint опирается на то, что каждое правило может содержать встроенную поддержку преобразования кода. Эта возможность определяется на уровне реализации правила и задаётся через поле meta.fixable. Только правила, в которых явно описана логика исправления, участвуют в работе режима --fix. Остальные правила могут только сообщать об ошибках или предупреждениях, но не способны изменять исходный код.

Внутри ESLint каждое правило возвращает сообщения о проблемах через context.report. Помимо текста ошибки и позиции в коде, сообщение может содержать функцию fix, которая описывает конкретное изменение исходного файла.

Структурно это выглядит следующим образом:

  • правило анализирует AST-код
  • обнаруживает нарушение
  • формирует report
  • при наличии fix описывает трансформацию текста

При запуске с флагом --fix ESLint собирает все такие исправления и применяет их последовательно.

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

Категория правил fixable

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

  • meta.fixable: "code" — правила, которые напрямую изменяют код
  • meta.fixable: "whitespace" — правила, ограниченные форматированием (отступы, пробелы, переносы строк)

Только эти категории участвуют в --fix. Если поле отсутствует, правило считается неавтоисправляемым.

Правила форматирования

Наиболее предсказуемая группа — форматирующие правила. Они работают с пробелами, отступами и структурой строк.

Типичные примеры:

  • indent — выравнивание отступов
  • linebreak-style — перевод строк
  • space-infix-ops — пробелы вокруг операторов
  • keyword-spacing — пробелы вокруг ключевых слов
  • comma-spacing — форматирование запятых

Эти правила относятся к категории whitespace, поскольку не меняют семантику программы.

Пример поведения:

const a=1+2

После --fix:

const a = 1 + 2

Правила, изменяющие синтаксис

Вторая группа — правила, которые трансформируют кодовую конструкцию, не затрагивая её смысл.

semi

Одно из наиболее известных правил.

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

Пример:

const a = 1

После автоисправления:

const a = 1;

или наоборот:

const a = 1

в режиме never.

quotes

Приведение строковых литералов к единому стилю.

const s = "text"

const s = 'text'

Если включён режим avoidEscape, правило может учитывать содержимое строки.

eqeqeq

Одно из правил, изменяющих логику сравнения.

if (a == b) {}

if (a === b) {}

Автоисправление работает только там, где преобразование безопасно и не требует анализа типов.

Правила рефакторинга кода

Некоторые правила выполняют более сложные преобразования, затрагивающие структуру кода.

prefer-const

let a = 1
console.log(a)

const a = 1
console.log(a)

Правило анализирует, изменяется ли переменная после объявления. Если нет — выполняется преобразование let в const.

no-var

var a = 1

const a = 1

или

let a = 1

в зависимости от того, есть ли последующее изменение значения.

object-shorthand

const obj = { a: a }

const obj = { a }

Здесь ESLint выполняет сокращение синтаксиса без изменения поведения объекта.

arrow-body-style

const f = () => {
  return 1
}

const f = () => 1

Если функция содержит единственный return, выполняется преобразование в краткую форму стрелочной функции.

Правила работы с запятыми и структурами

comma-dangle

const obj = {
  a: 1
}

const obj = {
  a: 1,
}

или наоборот, в зависимости от конфигурации.

object-curly-newline, array-bracket-newline

Эти правила форматируют переносы строк в структурах:

const arr = [1,2,3]

const arr = [
  1,
  2,
  3
]

Ограничения автоисправлений

Не каждое правило может быть автоматически исправлено. Причины ограничений:

Невозможность однозначного преобразования

Некоторые нарушения требуют контекста, который ESLint не может гарантированно интерпретировать.

Пример: правило no-unused-vars

function f(a) {
  return 1
}

Удаление параметра a может сломать публичный API, поэтому автоисправление отсутствует.

Потенциальное изменение поведения

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

Например:

  • no-implicit-coercion
  • части no-restricted-syntax

Конфликтующие исправления

Если два правила модифицируют один участок AST, ESLint может:

  • применить только одно исправление
  • или пропустить оба
  • или выдать частичное применение

Механизм применения исправлений

Алгоритм работы --fix можно описать последовательно:

  1. построение AST
  2. запуск всех правил
  3. сбор сообщений с fix
  4. сортировка исправлений по позициям в файле
  5. проверка пересечений
  6. применение безопасных изменений
  7. повторный проход до стабилизации результата

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

Разделение fixable и suggestions

Помимо fix, ESLint поддерживает suggest — предложения исправлений, которые не применяются автоматически.

Разница:

  • fix — применяется через --fix
  • suggest — требует ручного подтверждения или стороннего инструмента

Правила с suggest не попадают в автоматическое исправление даже при наличии корректного предложения.

Практическая классификация правил по типу исправления

Строго форматирующие

  • indent
  • space-infix-ops
  • semi-spacing
  • keyword-spacing

Характеристика: безопасны, не меняют логику.

Синтаксические трансформации

  • semi
  • quotes
  • comma-dangle
  • arrow-body-style

Характеристика: изменяют структуру, но сохраняют поведение.

Рефакторинговые

  • prefer-const
  • no-var
  • object-shorthand

Характеристика: требуют анализа контекста, но допускают безопасное преобразование.

Частично фиксируемые

  • eqeqeq (ограниченные случаи)
  • curly (только простые конструкции)

Характеристика: автоисправление возможно не во всех сценариях.

Влияние конфигурации ESLint

Поддержка --fix зависит не только от правил, но и от конфигурации:

  • .eslintrc
  • eslint.config.js (flat config)
  • overrides для файлов

Если правило отключено или переопределено, его исправления не участвуют в процессе.

Также важно учитывать, что некоторые плагины переопределяют meta.fixable, расширяя или ограничивая поведение стандартных правил.

Итоговая структура поддержки –fix

Поддержка автоисправления в ESLint строится на сочетании трёх факторов:

  • наличие meta.fixable
  • наличие функции fix в report
  • безопасность преобразования кода

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