Класс Linter представляет собой низкоуровневый программный интерфейс, реализующий механизм анализа исходного кода на соответствие набору правил. Он используется тогда, когда требуется встроить линтинг непосредственно в приложение или инструмент сборки без запуска CLI-обвязки.
В отличие от высокоуровневых механизмов конфигурации через файлы
.eslintrc и командную строку, Linter работает
как самостоятельный вычислительный модуль: ему передаются код,
конфигурация и правила, после чего он возвращает структурированный
результат анализа.
Основная ответственность класса:
Класс является частью внутреннего API ESLint и часто используется в инструментах, интегрирующих анализ кода в редакторы, серверные пайплайны и кастомные системы проверки качества.
Процесс анализа через Linter можно представить как
последовательность этапов:
SourceCode)Важным компонентом является то, что Linter не выполняет
код, а работает исключительно со статической структурой.
Базовая форма использования заключается в создании экземпляра класса:
import { Linter } from "eslint";
const linter = new Linter();
После создания экземпляр может многократно использоваться для анализа различных фрагментов кода.
Основной метод анализа — verify.
Сигнатура:
linter.verify(code, config, options);
Параметры:
code — строка исходного JavaScript-кодаconfig — объект конфигурации правилoptions — дополнительные параметры анализаВозвращаемое значение — массив сообщений о проблемах.
Каждое сообщение содержит:
ruleId — идентификатор правилаmessage — текст ошибкиline, column — позиция в кодеseverity — уровень (warning/error)nodeType — тип AST-узлаfix — данные для автоматического исправления (если
доступно)Пример:
const messages = linter.verify("const a = 1", {
rules: {
semi: "error"
}
});
console.log(messages);
Конфигурация передаётся в виде объекта, содержащего секцию
rules.
{
rules: {
"no-unused-vars": "error",
"no-console": "warn"
}
}
Возможные значения:
"off" или 0 — отключено"warn" или 1 — предупреждение"error" или 2 — ошибкаТакже поддерживается расширенная форма:
"no-console": ["warn", { allow: ["warn", "error"] }]
Метод verifyAndFix расширяет функциональность
verify, добавляя автоматическое исправление кода.
const result = linter.verifyAndFix(code, config);
Результат содержит:
messages — список найденных проблемoutput — исправленный кодПример:
const result = linter.verifyAndFix("var a = 1", {
rules: {
"no-var": "error"
}
});
console.log(result.output);
Класс Linter позволяет добавлять собственные правила
через defineRule.
linter.defineRule("no-foo", {
create(context) {
return {
Identifier(node) {
if (node.name === "foo") {
context.report({
node,
message: "Использование foo запрещено"
});
}
}
};
}
});
Структура правила:
create(context) — функция, возвращающая набор
обработчиков ASTcontext.report — механизм генерации сообщенияОбъект context предоставляет API для взаимодействия с
анализируемым кодом:
context.getSourceCode() — доступ к исходному кодуcontext.report() — регистрация нарушенияcontext.options — параметры правилаПример использования:
create(context) {
const sourceCode = context.getSourceCode();
return {
Program() {
const text = sourceCode.getText();
}
};
}
Linter оперирует абстрактным синтаксическим деревом,
которое строится на основе входного кода.
Каждый узел AST содержит:
VariableDeclaration,
FunctionDeclaration)range)loc)SourceCode предоставляет:
Экземпляр Linter не требует пересоздания для каждого
файла. Повторное использование:
Однако состояние правил должно оставаться статeless, так как один экземпляр может использоваться параллельно в разных контекстах анализа.
Во время работы Linter может выбрасывать ошибки в
случаях:
Ошибки правил обычно связаны с некорректной реализацией
create или обращением к несуществующим свойствам AST.
Linter поддерживает различные режимы, определяемые
конфигурацией:
Пример:
linter.verify(code, {
parserOptions: {
ecmaVersion: 2021,
sourceType: "module"
}
});
Несмотря на гибкость, Linter имеет ряд ограничений:
.eslintrc автоматическиЭти задачи делегируются CLI-инструменту ESLint или внешним интеграциям.
Класс Linter является ядром исполнения правил, но сам по
себе не определяет их набор. Правила подключаются через:
defineRuleКаждое правило выполняется в изолированном контексте и реагирует на события обхода AST, что формирует событийно-ориентированную модель анализа.