Механизм автоматического исправления в ESLint опирается на то, что
каждое правило может содержать встроенную поддержку преобразования кода.
Эта возможность определяется на уровне реализации правила и задаётся
через поле meta.fixable. Только правила, в которых явно
описана логика исправления, участвуют в работе режима
--fix. Остальные правила могут только сообщать об ошибках
или предупреждениях, но не способны изменять исходный код.
Внутри ESLint каждое правило возвращает сообщения о проблемах через
context.report. Помимо текста ошибки и позиции в коде,
сообщение может содержать функцию fix, которая описывает
конкретное изменение исходного файла.
Структурно это выглядит следующим образом:
fix описывает трансформацию текстаПри запуске с флагом --fix ESLint собирает все такие
исправления и применяет их последовательно.
Ключевой момент: исправления должны быть детерминированными и не конфликтовать друг с другом. Если несколько правил пытаются изменить один и тот же участок кода, ESLint либо пропускает часть фиксов, либо применяет только безопасную комбинацию.
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-constlet a = 1
console.log(a)
→
const a = 1
console.log(a)
Правило анализирует, изменяется ли переменная после объявления. Если
нет — выполняется преобразование let в
const.
no-varvar a = 1
→
const a = 1
или
let a = 1
в зависимости от того, есть ли последующее изменение значения.
object-shorthandconst obj = { a: a }
→
const obj = { a }
Здесь ESLint выполняет сокращение синтаксиса без изменения поведения объекта.
arrow-body-styleconst f = () => {
return 1
}
→
const f = () => 1
Если функция содержит единственный return, выполняется преобразование в краткую форму стрелочной функции.
comma-dangleconst 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-coercionno-restricted-syntaxЕсли два правила модифицируют один участок AST, ESLint может:
Алгоритм работы --fix можно описать последовательно:
fixМногопроходная модель необходима, потому что одно исправление может породить новые возможности для других правил.
Помимо fix, ESLint поддерживает suggest —
предложения исправлений, которые не применяются автоматически.
Разница:
fix — применяется через --fixsuggest — требует ручного подтверждения или стороннего
инструментаПравила с suggest не попадают в автоматическое
исправление даже при наличии корректного предложения.
indentspace-infix-opssemi-spacingkeyword-spacingХарактеристика: безопасны, не меняют логику.
semiquotescomma-danglearrow-body-styleХарактеристика: изменяют структуру, но сохраняют поведение.
prefer-constno-varobject-shorthandХарактеристика: требуют анализа контекста, но допускают безопасное преобразование.
eqeqeq (ограниченные случаи)curly (только простые конструкции)Характеристика: автоисправление возможно не во всех сценариях.
Поддержка --fix зависит не только от правил, но и от
конфигурации:
.eslintrceslint.config.js (flat config)Если правило отключено или переопределено, его исправления не участвуют в процессе.
Также важно учитывать, что некоторые плагины переопределяют
meta.fixable, расширяя или ограничивая поведение
стандартных правил.
Поддержка автоисправления в ESLint строится на сочетании трёх факторов:
meta.fixablefix в reportТолько правила, удовлетворяющие этим условиям, участвуют в
автоматической модификации исходного кода при запуске линтера с
параметром --fix.