Система сообщений ESLint строится вокруг двух взаимосвязанных уровней: уровня правила (severity) и самого сообщения (message), которое формируется внутри правила при обнаружении проблемного кода. Эти два слоя определяют, как линтер классифицирует нарушения, как они отображаются и как влияют на процесс сборки.
Каждое правило в ESLint может работать в одном из трёх режимов:
Конфигурация может задаваться как числовыми значениями, так и строковыми эквивалентами:
{
"no-unused-vars": "off",
"eqeqeq": "warn",
"no-undef": "error"
}
или:
{
"no-unused-vars": 0,
"eqeqeq": 1,
"no-undef": 2
}
Внутри ESLint эти значения нормализуются в числовую шкалу, где именно она участвует в принятии решений о статусе проверки.
Система конфигурации позволяет задавать уровни строгости на разных уровнях вложенности:
overrides для файловых шаблонов{
"rules": {
"no-console": "error"
},
"overrides": [
{
"files": ["*.test.js"],
"rules": {
"no-console": "off"
}
}
]
}
Inline-комментарии дают локальное управление:
console.log("debug"); // eslint-disable-line no-console
или:
/* eslint-disable no-console */
Эти механизмы не изменяют само сообщение правила, но полностью подавляют его генерацию.
Каждое правило ESLint при срабатывании формирует объект сообщения,
который передаётся через context.report. Минимальная
форма:
context.report({
node,
message: "Unexpected console statement"
});
Однако современный ESLint опирается на более формализованный подход
через messageId.
Внутри meta.messages правило может определять набор
шаблонов:
meta: {
messages: {
unexpectedConsole: "Unexpected console statement.",
avoidConsole: "Avoid using console in production code."
}
}
Использование:
context.report({
node,
messageId: "unexpectedConsole"
});
Такой подход обеспечивает:
ESLint поддерживает подстановку значений через объект
data:
meta: {
messages: {
restrictedName: "Identifier '{{name}}' is restricted."
}
}
context.report({
node,
messageId: "restrictedName",
data: {
name: node.name
}
});
Механизм интерполяции использует шаблон {{ключ}},
подставляя значения из data.
Полный объект, передаваемый в context.report, может
включать:
node — AST-узел, связанный с нарушениемloc — ручное указание позиции (редко используется)message или messageIddata — данные для шаблонаfix — функция автоматического исправленияsuggest — альтернативные исправленияПример с автофиксом:
context.report({
node,
messageId: "unexpectedSemicolon",
fix(fixer) {
return fixer.remove(node);
}
});
Сообщения ESLint не содержат логики исправления, но тесно связаны с
возможностью fix.
Если правило объявлено как fixable, это указывается в
метаданных:
meta: {
fixable: "code"
}
Типы:
"code" — исправляет код"whitespace" — изменяет только форматированиеСообщение при этом остаётся диагностическим слоем, не зависящим от исправления.
Помимо fix, ESLint поддерживает множественные варианты
исправления:
context.report({
node,
messageId: "useConst",
suggest: [
{
messageId: "convertToConst",
fix(fixer) {
return fixer.replaceText(varNode.kind, "const");
}
}
]
});
Каждое предложение может иметь собственное сообщение, что расширяет модель диагностики: одно нарушение → несколько интерпретаций решения.
Важно различать:
Сообщение не имеет собственной степени важности. Оно всегда наследует severity от правила.
Это означает:
Помимо сообщений правил, существует отдельная категория — фатальные ошибки парсинга.
Пример:
Такие ошибки:
context.reportОни формируются парсером (например, Espree или Babel parser) и передаются как критические события уровня анализа файла.
Система сообщений дополняется механизмами фильтрации вывода:
--quiet — скрывает warnings, оставляет только
errors--max-warnings — задаёт порог, после которого процесс
завершается с ошибкойПример логики:
Это влияет не на генерацию сообщений, а на финальную агрегацию результатов.
ESLint предоставляет точечное управление генерацией сообщений через комментарии:
// eslint-disable-next-line no-debugger
debugger;
или:
/* eslint-disable no-debugger */
debugger;
Также возможно временное включение:
/* eslint-enable no-debugger */
или полное игнорирование строки:
debugger; // eslint-disable-line
Эти механизмы работают на уровне фильтрации, не изменяя сам процесс создания сообщений внутри правил.
Каждое сообщение ESLint проходит несколько стадий:
context.reportФорматтеры (stylish, json, compact) используют единый объект сообщения:
ruleIdmessageline, columnseverityТаким образом, сообщение становится универсальной единицей анализа.
Одно правило может генерировать неограниченное количество сообщений в рамках одного файла. При этом каждое сообщение:
messageIdЭто делает модель ESLint событийно-ориентированной: правило не возвращает результат, а потоково регистрирует нарушения.
context передаётся в каждое правило и содержит:
Сообщения формируются синхронно во время обхода дерева:
create(context) {
return {
Identifier(node) {
if (node.name === "eval") {
context.report({
node,
messageId: "unexpectedEval"
});
}
}
};
}
Таким образом, система сообщений является прямым результатом обхода AST, а не постобработки.
Использование messageId и шаблонов:
Эта архитектура делает сообщения ESLint не просто текстовыми строками, а частью декларативной модели диагностики кода.