В архитектуре ESLint каждая пользовательская или встроенная проверка
реализуется как функция правила, получающая единственный аргумент —
объект context. Этот объект является центральным механизмом
взаимодействия правила с анализатором кода, предоставляя доступ к
метаданным, AST, сервисам парсера и API для регистрации проблем.
context формируется ESLint во время инициализации
правила и остается неизменным на протяжении всего анализа файла. Он не
предназначен для модификации со стороны правила и рассматривается как
интерфейс только для чтения и вызова методов ESLint.
contextОбъект context можно рассматривать как контейнер из
нескольких функциональных блоков:
В типичном виде структура выглядит следующим образом:
context = {
id,
options,
settings,
parserServices,
parserPath,
getSourceCode,
getFilename,
report,
cwd,
sourceCode
}
Конкретный набор свойств может отличаться в зависимости от версии ESLint и используемого парсера.
context.idcontext.id содержит строковый идентификатор правила. Он
соответствует имени правила, зарегистрированного в конфигурации
ESLint.
Используется для:
Пример:
create(context) {
if (context.id === "no-console") {
// специфическая логика
}
}
На практике прямое использование встречается редко, поскольку правило обычно уже специализировано.
context.optionscontext.options представляет собой массив параметров,
переданных пользователем в конфигурации ESLint для конкретного
правила.
Пример конфигурации:
{
"no-console": ["error", { "allow": ["warn", "error"] }]
}
Внутри правила:
create(context) {
const options = context.options[0];
const allowed = options?.allow || [];
}
Особенности:
context.settingscontext.settings содержит глобальные пользовательские
настройки ESLint, заданные в конфигурации settings.
Пример:
{
"settings": {
"react": {
"version": "detect"
}
}
}
Использование:
create(context) {
const reactVersion = context.settings.react?.version;
}
Особенности:
context.getSourceCode()Метод getSourceCode() возвращает объект
SourceCode, содержащий полную информацию о текущем
файле.
Это один из ключевых инструментов анализа.
const sourceCode = context.getSourceCode();
Через него доступны:
Примеры использования:
const text = sourceCode.getText();
const comments = sourceCode.getAllComments();
context.sourceCodeВ новых версиях ESLint вместо getSourceCode() часто
используется прямое свойство context.sourceCode, являющееся
тем же объектом SourceCode.
const sourceCode = context.sourceCode;
Различие:
getSourceCode() — метод (устаревающий подход)sourceCode — прямой доступcontext.report()context.report() — основной механизм генерации ошибок и
предупреждений.
Сигнатура:
context.report(descriptor)
Где descriptor может включать:
node — AST-узелmessage — текст ошибкиloc — позиция (опционально)data — шаблонные данныеfix — функция автоматического исправленияПример:
context.report({
node,
message: "Использование console запрещено"
});
С автозаменой:
context.report({
node,
message: "Удалите console.log",
fix(fixer) {
return fixer.remove(node);
}
});
Ключевые особенности:
fixercontext.getFilename()Возвращает путь к текущему анализируемому файлу.
const filename = context.getFilename();
Особенности:
<input> при анализе stdincontext.cwdСодержит текущую рабочую директорию процесса ESLint.
const root = context.cwd;
Используется для:
context.parserServicesparserServices предоставляется кастомными парсерами
(например, TypeScript ESLint) и содержит дополнительные данные,
недоступные в стандартном AST.
Пример:
const services = context.parserServices;
Возможности:
Пример проверки:
if (!context.parserServices?.program) {
return {};
}
Особенности:
context.parserPathСодержит путь к используемому парсеру.
const parser = context.parserPath;
Используется редко, обычно для:
context в
функции правилаЛюбое ESLint-правило определяется через функцию create,
возвращающую набор обработчиков AST.
export default {
create(context) {
return {
Identifier(node) {
context.report({
node,
message: "Запрещён идентификатор"
});
}
};
}
};
Модель работы:
create(context)context.report фиксируются нарушенияcontext и ASTcontext тесно связан с AST через
SourceCode. Каждый узел AST содержит:
typelocrangeПример анализа:
create(context) {
return {
Literal(node) {
const text = context.sourceCode.getText(node);
}
};
}
contextcontext не предназначен для изменения. Любые попытки
модификации:
context.options = [];
не поддерживаются и могут привести к:
Все данные внутри объекта считаются read-only интерфейсом.
context.report поддерживает механизм автоматического
исправления через fixer.
fix(fixer) {
return fixer.replaceText(node, "newValue");
}
context обеспечивает доступ к:
что делает возможным точечные изменения без пересборки файла.
context в
экосистеме ESLintcontext является связующим звеном между:
Без него правило представляет собой изолированную функцию без доступа к среде выполнения анализа.
Плагины ESLint активно используют context для расширения
возможностей:
settingsparserServices для типизацииcwd и
getFilenamecontextЧасто встречающиеся проблемы:
parserServicesoptionscontextgetSourceCode() вместо
sourceCode в новых версияхnull/undefined в
настройкахЭти ошибки приводят к нестабильности правил и снижению переносимости между проектами.
context обеспечивает формальный контракт:
Это делает ESLint-плагины детерминированными и воспроизводимыми в разных окружениях.