Справочник API Node.js
Хотя ESLint предназначен для работы в командной строке, есть возможность использовать ESLint программно через API Node.js. Цель API Node.js — предоставить авторам плагинов и инструментов возможность использовать функциональность ESLint напрямую, минуя интерфейс командной строки.
Примечание: Использование недокументированных частей API происходит на ваш страх и риск. Только те части API, которые специально указаны в этом документе, одобрены для использования и будут оставаться стабильными и надёжными. Любые недокументированные части API нестабильны и могут быть изменены или удалены в любое время.
Класс ESLint
Класс ESLint является основным классом для использования в приложениях Node.js.
Этот класс зависит от модуля Node.js fs и файловой системы, поэтому его нельзя использовать в браузерах. Если вам нужно проверять код в браузере, используйте класс Linter вместо этого.
Вот простой пример использования класса ESLint.
const { ESLint } = require("eslint");
(async function main() {
// 1. Create an instance.
const eslint = new ESLint();
// 2. Lint files.
const results = await eslint.lintFiles(["lib/**/*.js"]);
// 3. Format the results.
const formatter = await eslint.loadFormatter("stylish");
const resultText = formatter.format(results);
// 4. Output it.
console.log(resultText);
})().catch((error) => {
process.exitCode = 1;
console.error(error);
});
Вот пример, который автоматически исправляет проблемы с проверкой:
const { ESLint } = require("eslint");
(async function main() {
// 1. Create an instance with the `fix` option.
const eslint = new ESLint({ fix: true });
// 2. Lint files. This doesn't modify target files.
const results = await eslint.lintFiles(["lib/**/*.js"]);
// 3. Modify the files with the fixed code.
await ESLint.outputFixes(results);
// 4. Format the results.
const formatter = await eslint.loadFormatter("stylish");
const resultText = formatter.format(results);
// 5. Output it.
console.log(resultText);
})().catch((error) => {
process.exitCode = 1;
console.error(error);
});
И вот пример использования класса ESLint с API lintText.
const { ESLint } = require("eslint");
const testCode = `
const name = "eslint";
if(true) {
console.log("constant condition warning")
};
`;
(async function main() {
// 1. Create an instance
const eslint = new ESLint({
overrideConfigFile: true,
overrideConfig: {
languageOptions: {
ecmaVersion: 2018,
sourceType: "commonjs"
}
},
});
// 2. Lint text.
const results = await eslint.lintText(testCode);
// 3. Format the results.
const formatter = await eslint.loadFormatter("stylish");
const resultText = formatter.format(results);
// 4. Output it.
console.log(resultText);
})().catch((error) => {
process.exitCode = 1;
console.error(error);
});
◆ new ESLint(options)
const eslint = new ESLint(options);
Создаёт новый экземпляр класса ESLint.
Параметры
Конструктор класса ESLint принимает объект options. Если вы опустите объект options, будут использоваться значения по умолчанию для всех опций. Объект options имеет следующие свойства.
Перечисление файлов
-
options.cwd(string)
По умолчаниюprocess.cwd(). Рабочая директория. Должна быть абсолютным путём. -
options.errorOnUnmatchedPattern(boolean)
По умолчаниюtrue. Если не установлено значениеfalse, методeslint.lintFiles()будет генерировать ошибку, если не будут найдены целевые файлы. -
options.globInputPaths(boolean)
По умолчаниюtrue. Еслиfalseприсутствует, методeslint.lintFiles()не интерпретирует шаблоны glob. -
options.ignore(boolean)
По умолчаниюtrue. Еслиfalseприсутствует, методeslint.lintFiles()не учитываетignorePatternsв вашей конфигурации. -
options.ignorePatterns(string[] | null)
По умолчаниюnull. Игнорировать шаблоны файлов, используемые дополнительно к игнорированиям из конфигурации. Эти шаблоны относительны кcwd. -
options.passOnNoPatterns(boolean)
По умолчаниюfalse. При установке в значениеtrue, отсутствующие шаблоны приводят к прерыванию операции проверки и не отображают никаких ошибок. -
options.warnIgnored(boolean)
По умолчаниюtrue. Показывать предупреждения, когда список файлов включает игнорируемые файлы.
Проверка кода
-
options.allowInlineConfig(boolean)
По умолчаниюtrue. Еслиfalseприсутствует, ESLint подавляет директивы в исходном коде. Если эта опцияfalse, она переопределяет настройкуnoInlineConfigв ваших конфигурациях. -
options.baseConfig(ConfigData | ConfigData[] | null)
По умолчаниюnull. Объект конфигурации, расширенный всеми конфигурациями, используемыми с этим экземпляром. Вы можете использовать эту опцию для определения значений по умолчанию, которые будут использоваться, если ваши файлы конфигурации их не задают. -
options.overrideConfig(ConfigData | ConfigData[] | null)
По умолчаниюnull. Объект конфигурации, переопределяет все конфигурации, используемые с этим экземпляром. Вы можете использовать эту опцию для определения настроек, которые будут использоваться, даже если ваши файлы конфигурации их задают. -
options.overrideConfigFile(string | boolean)
По умолчаниюfalse. Путь к файлу конфигурации, переопределяет все конфигурации, используемые с этим экземпляром. Опцияoptions.overrideConfigприменяется после применения этой опции. -
options.plugins(Record<string, Plugin> | null)
По умолчаниюnull. Реализации плагинов, которые ESLint использует для настройкиpluginsвашей конфигурации. Это объект типа «карта». Ключи — идентификаторы плагинов, а значения — реализации. -
options.ruleFilter(({ruleId: string, severity: number}) => boolean)
По умолчанию() => true. Функция-предикат, которая фильтрует правила для выполнения. Эта функция вызывается с объектом, содержащимruleIdиseverity, и возвращаетtrue, если правило должно быть выполнено. -
options.stats(boolean)
По умолчаниюfalse. Если установлено значениеtrue, к результатам проверки добавляется дополнительная статистика (см. Тип статистики).
Автоисправление
-
options.fix(boolean | (message: LintMessage) => boolean)
По умолчаниюfalse. Еслиtrueприсутствует, методыeslint.lintFiles()иeslint.lintText()работают в режиме автоматического исправления. Если присутствует функция-предикат, методы передают каждое сообщение о проверке в функцию, а затем используют только сообщения о проверке, для которых функция вернулаtrue. -
options.fixTypes(("directive" | "problem" | "suggestion" | "layout")[] | null)
По умолчаниюnull. Типы правил, которые методыeslint.lintFiles()иeslint.lintText()используют для автоматического исправления.
Связанные с кэшем
-
options.cache(boolean)
По умолчаниюfalse. Еслиtrueприсутствует, методeslint.lintFiles()кэширует результаты проверки и использует их, если каждый целевой файл не изменён. Обратите внимание, что ESLint не очищает кэш при обновлении плагинов ESLint. В этом случае вам нужно вручную удалить файл кэша. Методeslint.lintText()не использует кэш, даже если вы передаётеoptions.filePathв метод. -
options.cacheLocation(string)
По умолчанию.eslintcache. Методeslint.lintFiles()записывает кэши в этот файл. -
options.cacheStrategy(string)
По умолчанию"metadata". Стратегия для использования кэша для определения изменённых файлов. Может быть либо"metadata", либо"content".
Другие опции
-
options.flags(string[])
По умолчанию[]. Флаги функций, которые необходимо включить для этого экземпляра.
◆ eslint.lintFiles(patterns)
const results = await eslint.lintFiles(patterns);
Этот метод проверяет файлы, соответствующие шаблонам glob, и возвращает результаты.
Параметры
-
patterns(string | string[])
Целевые файлы проверки. Может содержать пути к файлам, каталогам и шаблоны glob.
Возвращаемое значение
- (
Promise<LintResult[]>)
Обещание, которое будет выполнено с массивом объектов LintResult.
◆ eslint.lintText(code, options)
const results = await eslint.lintText(code, options);
Этот метод проверяет предоставленный текст исходного кода и возвращает результаты.
По умолчанию этот метод использует конфигурацию, которая применяется к файлам в текущей рабочей директории (опция конструктора cwd). Если вы хотите использовать другую конфигурацию, передайте options.filePath, и ESLint загрузит ту же конфигурацию, которую eslint.lintFiles() использовал бы для файла в options.filePath.
Если значение options.filePath настроено на игнорирование, этот метод возвращает пустой массив. Если опция options.warnIgnored установлена вместе с опцией options.filePath, этот метод возвращает объект LintResult. В этом случае результат может содержать предупреждение, указывающее, что файл был проигнорирован.
Параметры
Второй параметр options необязателен.
-
code(string)
Текст исходного кода для проверки. -
options.filePath(string)
Необязательно. Путь к файлу с текстом исходного кода. Если опущено,result.filePathстановится строкой"<text>". -
options.warnIgnored(boolean)
Необязательно, по умолчанию равно значениюoptions.warnIgnored, переданному в конструктор. Еслиtrueприсутствует, аoptions.filePath— это файл, который ESLint должен пропустить, этот метод возвращает результат проверки, содержащий сообщение об ошибке.
Возвращаемое значение
- (
Promise<LintResult[]>)
Обещание, которое будет выполнено с массивом объектов LintResult. Это массив (несмотря на то, что есть только один результат проверки), чтобы сохранить сходство интерфейсов между этим и методомeslint.lintFiles().
◆ eslint.getRulesMetaForResults(results)
const results = await eslint.lintFiles(patterns);
const rulesMeta = eslint.getRulesMetaForResults(results);
Этот метод возвращает объект, содержащий метаданные для каждого правила, которое вызвало ошибку проверки в предоставленном массиве results.
Параметры
-
results(LintResult[])
Массив объектов LintResult, возвращённых из вызоваESLint#lintFiles()илиESLint#lintText().
Возвращаемое значение
- (
Object)
Объект, имена свойств которого — идентификаторы правил изresults, а значения свойств — метаданные правила (если доступны).
◆ eslint.calculateConfigForFile(filePath)
const config = await eslint.calculateConfigForFile(filePath);
Этот метод вычисляет конфигурацию для данного файла, что может быть полезно для отладки.
Параметры
-
filePath(string)
Путь к файлу, конфигурацию которого вы хотите рассчитать. Пути к каталогам запрещены, так как ESLint не может обработать настройкуoverrides.
Значение возврата
- (
Promise<Object>)
Обещание, которое будет выполнено с объектом конфигурации.
◆ eslint.isPathIgnored(filePath)
const isPathIgnored = await eslint.isPathIgnored(filePath);
Этот метод проверяет, игнорируется ли указанный файл вашей конфигурацией.
Параметры
-
filePath(string)
Путь к файлу, который вы хотите проверить.
Значение возврата
- (
Promise<boolean>)
Обещание, которое будет выполнено со значением, игнорируется ли файл или нет. Если файл игнорируется, то возвращаетсяtrue.
◆ eslint.loadFormatter(nameOrPath)
const formatter = await eslint.loadFormatter(nameOrPath);
Этот метод загружает форматировщик. Форматировщики преобразуют результаты проверки в строку, удобочитаемую для человека или машины.
Параметры
-
nameOrPath(string | undefined)
Путь к файлу, который вы хотите проверить. Допустимы следующие значения:-
undefined. В этом случае загружается встроенный форматировщик"stylish". - Имя встроенного форматировщика из списка.
- Имя стороннего форматировщика из списка. Примеры:
-
"foo"загрузитeslint-formatter-foo. -
"@foo"загрузит@foo/eslint-formatter. -
"@foo/bar"загрузит@foo/eslint-formatter-bar.
-
- Путь к файлу, определяющему форматировщик. Путь должен содержать один или несколько разделителей путей (
/) для различения пути от имени. - Например, начинаться с
./.
-
Значение возврата
- (
Promise<LoadedFormatter>)
Обещание, которое будет выполнено с объектом LoadedFormatter.
◆ eslint.hasFlag(flagName)
Этот метод используется для определения, установлена ли данная метка функции, как в этом примере:
if (eslint.hasFlag("x_feature")) {
// handle flag
}
Параметры
-
flagName(string)
Метка для проверки.
Значение возврата
- (
boolean)
True, если метка включена.
◆ ESLint.version
const version = ESLint.version;
Строка версии ESLint. Например, "7.0.0".
Это статический свойство.
◆ ESLint.defaultConfig
const defaultConfig = ESLint.defaultConfig;
Конфигурация по умолчанию, которую ESLint использует внутри. Она предоставляется для инструментов, которые хотят рассчитать конфигурации, используя те же значения по умолчанию, что и ESLint. Имейте в виду, что конфигурация по умолчанию может меняться с версии на версию, поэтому вы не должны полагаться на наличие определённых ключей или значений.
Это статическое свойство.
◆ ESLint.outputFixes(results)
await ESLint.outputFixes(results);
Этот метод записывает изменения в код, сделанные функцией автоисправления ESLint, в соответствующие файлы. Если какой-либо из изменённых файлов не существует, этот метод ничего не делает.
Это статический метод.
Параметры
-
results(LintResult[])
Объекты LintResult, которые нужно записать.
Значение возврата
- (
Promise<void>)
Обещание, которое будет выполнено после записи всех файлов.
◆ ESLint.getErrorResults(results)
const filteredResults = ESLint.getErrorResults(results);
Этот метод копирует заданные результаты и удаляет предупреждения. Возвращаемое значение содержит только ошибки.
Это статический метод.
Параметры
-
results(LintResult[])
Объекты LintResult, которые нужно отфильтровать.
Значение возврата
- (
LintResult[])
Отфильтрованные объекты LintResult.
◆ Тип LintResult
Значение LintResult — это информация о результате проверки каждого файла. Методы eslint.lintFiles() и eslint.lintText() возвращают его. У него есть следующие свойства:
-
filePath(string)
Абсолютный путь к файлу этого результата. Это строка"<text>"если путь к файлу неизвестен (когда вы не передали опциюoptions.filePathметодуeslint.lintText()). -
messages(LintMessage[])
Массив объектов LintMessage. -
suppressedMessages(SuppressedLintMessage[])
Массив объектов SuppressedLintMessage. -
fixableErrorCount(number)
Количество ошибок, которые можно автоматически исправить с помощью опции конструктораfix. -
fixableWarningCount(number)
Количество предупреждений, которые можно автоматически исправить с помощью опции конструктораfix. -
errorCount(number)
Количество ошибок. Это включает исправимые ошибки и фатальные ошибки. -
fatalErrorCount(number)
Количество фатальных ошибок. -
warningCount(number)
Количество предупреждений. Это включает исправимые предупреждения. -
output(string | undefined)
Изменённый текст исходного кода. Это свойство не определено, если не было ни одной исправляемой ошибки. -
source(string | undefined)
Исходный текст исходного кода. Это свойство не определено, если не было ни одной ошибки или свойствоoutputсуществует. -
stats(Stats | undefined)
Объект Stats. Он содержит статистику производительности проверки, собранную с помощью опцииstats. -
usedDeprecatedRules({ ruleId: string; replacedBy: string[] }[])
Информация о устаревших правилах, которые использовались для проверки этого файла.
◆ Тип LintMessage
Значение LintMessage — это информация о каждой ошибке проверки. Свойство messages типа LintResult содержит его. У него есть следующие свойства:
-
ruleId(string|null)
Имя правила, которое сгенерировало это сообщение об ошибке проверки. Если это сообщение сгенерировано ядром ESLint, а не правилами, этоnull. -
severity(1 | 2)
Уровень серьёзности этого сообщения.1означает предупреждение, а2означает ошибку. -
fatal(boolean | undefined)
trueесли это фатальная ошибка, не связанная с правилом, например, ошибка разбора. -
message(string)
Сообщение об ошибке. -
messageId(string | undefined)
Идентификатор сообщения об ошибке проверки. Это свойство не определено, если правило не использует идентификаторы сообщений. -
line(number | undefined)
Номер строки (с 1) начала этого сообщения. -
column(number | undefined)
Номер столбца (с 1) начала этого сообщения. -
endLine(number | undefined)
Номер строки (с 1) конца этого сообщения. Это свойство не определено, если это сообщение не является диапазоном. -
endColumn(number | undefined)
Номер столбца (с 1) конца этого сообщения. Это свойство не определено, если это сообщение не является диапазоном. -
fix(EditInfo | undefined)
Объект EditInfo автоисправления. Это свойство не определено, если это сообщение не исправляется. -
suggestions({ desc: string; fix: EditInfo; messageId?: string; data?: object }[] | undefined)
Список предложений. Каждое предложение — пара описания и объекта EditInfo для исправления кода. Пользователи API, такие как интегрированные редакторы, могут выбрать одно из них для исправления проблемы этого сообщения. Это свойство не определено, если это сообщение не содержит предложений.
◆ Тип SuppressedLintMessage
Значение SuppressedLintMessage — это информация о каждой подавленной ошибке проверки. Свойство suppressedMessages типа LintResult содержит его. У него есть следующие свойства:
-
ruleId(string|null)
То же, что иruleIdв типе LintMessage. -
severity(1 | 2)
То же, что иseverityв типе LintMessage. -
fatal(boolean | undefined)
То же, что иfatalв типе LintMessage. -
message(string)
То же, что иmessageв типе LintMessage. -
messageId(string | undefined)
То же, что иmessageIdв типе LintMessage. -
line(number | undefined)
То же, что иlineв типе LintMessage. -
column(number | undefined)
То же, что иcolumnв типе LintMessage. -
endLine(number | undefined)
То же, что иendLineв типе LintMessage. -
endColumn(number | undefined)
То же, что иendColumnв типе LintMessage. -
fix(EditInfo | undefined)
То же, что иfixв типе LintMessage. -
suggestions({ desc: string; fix: EditInfo; messageId?: string; data?: object }[] | undefined)
То же, что иsuggestionsв типе LintMessage. -
suppressions({ kind: string; justification: string}[])
Список подавлений. Каждое подавление — это пара вида и обоснования.
◆ Тип EditInfo
Значение EditInfo — информация для редактирования текста. Свойства fix и suggestions типа LintMessage содержат его. Оно имеет следующие свойства:
-
range([number, number])
Пара индексов с нулевой базой в тексте исходного кода для удаления. -
text(string)
Текст для добавления.
Эта информация об изменении означает замену диапазона свойства range значением свойства text. Это похоже на sourceCodeText.slice(0, edit.range[0]) + edit.text + sourceCodeText.slice(edit.range[1]). Следовательно, это добавление, если значения свойств range[0] и range[1] — одно и то же значение, и удаление, если значение свойства text — пустая строка.
◆ Тип LoadedFormatter
Значение LoadedFormatter — объект для преобразования объектов LintResult в текст. Метод eslint.loadFormatter() возвращает его. Он имеет следующий метод:
-
format((results: LintResult[], resultsMeta?: ResultsMeta) => string | Promise<string>)
Метод для преобразования объектов LintResult в текст.resultsMeta— необязательный параметр, предназначенный в первую очередь для использования командной строкой ESLint и может содержать только свойствоmaxWarningsExceeded, которое будет передано в объектcontextпри вызове функции форматирования. Обратите внимание, что ESLint автоматически генерирует свойстваcwdиrulesMetaобъектаcontext, поэтому обычно нет необходимости передавать второй аргумент при вызове этого метода.
loadESLint()
Функция loadESLint() используется для интеграций, которые хотят поддерживать как текущую систему конфигурации (плоская конфигурация), так и старую систему конфигурации (eslintrc). Эта функция возвращает правильную реализацию класса ESLint на основе предоставленных аргументов:
const { loadESLint } = require("eslint");
// loads the default ESLint that the CLI would use based on process.cwd()
const DefaultESLint = await loadESLint();
// loads the flat config version specifically
const FlatESLint = await loadESLint({ useFlatConfig: true });
// loads the legacy version specifically
const LegacyESLint = await loadESLint({ useFlatConfig: false });
Затем вы можете использовать возвращенный конструктор для создания нового экземпляра ESLint следующим образом:
// loads the default ESLint that the CLI would use based on process.cwd()
const DefaultESLint = await loadESLint();
const eslint = new DefaultESLint();
Если вы не уверены, какую систему конфигурации использует возвращенный конструктор, проверьте свойство configType, которое равно "flat" или "eslintrc".
// loads the default ESLint that the CLI would use based on process.cwd()
const DefaultESLint = await loadESLint();
if (DefaultESLint.configType === "flat") {
// do something specific to flat config
}
Если вам не нужно поддерживать как старую, так и новую системы конфигурации, рекомендуется использовать напрямую конструктор ESLint.
SourceCode
Тип SourceCode представляет собой обработанный исходный код, на котором выполняется ESLint. Он используется внутри ESLint, а также доступен для использования уже обработанного кода. Вы можете создать новый экземпляр SourceCode, передав строку текста, представляющую код, и абстрактное синтаксическое дерево (AST) в формате ESTree (включая информацию о местоположении, диапазоне, комментариях и маркерах):
const SourceCode = require("eslint").SourceCode;
const code = new SourceCode("var foo = bar;", ast);
Конструктор SourceCode выводит ошибку, если в AST отсутствует какая-либо необходимая информация.
Конструктор SourceCode удаляет BOM Unicode. Обратите внимание, что AST также должен быть распарсен из очищенного текста.
const SourceCode = require("eslint").SourceCode;
const code = new SourceCode("\uFEFFvar foo = bar;", ast);
assert(code.hasBOM === true);
assert(code.text === "var foo = bar;");
SourceCode#splitLines()
Это статическая функция в SourceCode, которая используется для разделения текста исходного кода на массив строк.
const SourceCode = require("eslint").SourceCode;
const code = "var a = 1;\nvar b = 2;"
// split code into an array
const codeLines = SourceCode.splitLines(code);
/*
Value of codeLines will be
[
"var a = 1;",
"var b = 2;"
]
*/
Linter
Объект Linter выполняет фактическое оценивание JavaScript-кода. Он не выполняет никаких операций с файловой системой, а просто анализирует и сообщает об ошибках в коде. В частности, объект Linter не обрабатывает файлы конфигурации. Если вы не работаете в браузере, вам, вероятно, следует использовать класс ESLint вместо него.
Linter — это конструктор, и вы можете создать новый экземпляр, передав необходимые параметры. Доступные параметры:
-
cwd— Путь к каталогу, который должен рассматриваться как текущая рабочая директория. Он доступен правилам изcontext.cwdили вызовомcontext.getCwd()(см. Объект контекста). Еслиcwdравноundefined, оно будет нормализовано доprocess.cwd(), если глобальный объектprocessопределен (например, в среде Node.js), или доundefinedв противном случае.
Например:
const Linter = require("eslint").Linter;
const linter1 = new Linter({ cwd: 'path/to/project' });
const linter2 = new Linter();
В этом примере правила, запущенные на linter1, получат path/to/project из context.cwd или при вызове context.getCwd(). Те, которые запущены на linter2, получат process.cwd() если глобальный объект process определен, или undefined в противном случае (например, в браузере https://eslint.org/demo).
Linter#verify
Самый важный метод в Linter — это verify(), который инициирует проверку заданного текста. Этот метод принимает три аргумента:
-
code— исходный код для проверки (строка или экземплярSourceCode). -
config— объект конфигурации или массив объектов конфигурации.-
Примечание: Если вы хотите проверить текст и получить свою конфигурацию из файловой системы, используйте
ESLint#lintFiles()илиESLint#lintText()вместо этого.
-
Примечание: Если вы хотите проверить текст и получить свою конфигурацию из файловой системы, используйте
-
options— (необязательно) Дополнительные параметры для этого запуска.-
filename— (необязательно) имя файла для привязки к исходному коду. -
preprocess— (необязательно) функция, описанная в документации обработчики в плагинах как методpreprocess. -
postprocess— (необязательно) функция, описанная в документации обработчики в плагинах как методpostprocess. -
filterCodeBlock— (необязательно) функция, которая определяет, какие блоки кода линтер должен принять. Функция получает два аргумента. Первый аргумент — виртуальное имя файла блока кода. Второй аргумент — текст блока кода. Если функция вернулаtrue, линтер принимает блок кода. Если функция опущена, линтер принимает только*.jsблоки кода. Если вы предоставили функциюfilterCodeBlock, она переопределяет это поведение по умолчанию, поэтому линтер не принимает*.jsблоки кода автоматически. -
disableFixes— (необязательно) когда установлено вtrue, линтер не создает ни свойстваfix, ни свойстваsuggestionsрезультата проверки. -
allowInlineConfig— (необязательно) установите вfalse, чтобы отключить изменение правил ESLint от встроенных комментариев. -
reportUnusedDisableDirectives— (необязательно) при установке вtrue, добавляет сообщения об ошибках для неиспользуемыхeslint-disableиeslint-enableдиректив, если в отключенной области не было бы сообщений об ошибках. -
ruleFilter— (необязательно) Функциональный предикат, который определяет, какие правила нужно запускать. Он получает объект, содержащийruleIdиseverity, и возвращаетtrueесли правило нужно запустить.
-
Если третий аргумент — строка, она интерпретируется как filename.
Вы можете вызвать verify() так:
const Linter = require("eslint").Linter;
const linter = new Linter();
const messages = linter.verify("var foo;", {
rules: {
semi: 2
}
}, { filename: "foo.js" });
// or using SourceCode
const Linter = require("eslint").Linter,
linter = new Linter(),
SourceCode = require("eslint").SourceCode;
const code = new SourceCode("var foo = bar;", ast);
const messages = linter.verify(code, {
rules: {
semi: 2
}
}, { filename: "foo.js" });
Метод verify() возвращает массив объектов, содержащих информацию о предупреждениях и ошибках проверки. Вот пример:
[
{
fatal: false,
ruleId: "semi",
severity: 2,
line: 1,
column: 23,
message: "Expected a semicolon.",
fix: {
range: [1, 15],
text: ";"
}
}
]
Доступная информация для каждого сообщения проверки:
-
column- столбец, в котором произошла ошибка. -
fatal- обычно опускается, но будет установлен в true, если произошла ошибка разбора (не связанная с правилом). -
line- строка, в которой произошла ошибка. -
message- сообщение, которое должно быть выведено. -
messageId- идентификатор сообщения, используемого для генерации сообщения (это свойство опущено, если правило не использует идентификаторы сообщений). -
nodeType- (Устаревшее: это свойство будет удалено в будущей версии ESLint.) тип узла или токена, о котором сообщалось с проблемой. -
ruleId- идентификатор правила, которое сгенерировало сообщения (или null, еслиfatalимеет значение true). -
severity- 1 или 2, в зависимости от вашей конфигурации. -
endColumn- конечный столбец диапазона, в котором произошла ошибка (это свойство опущено, если это не диапазон). -
endLine- конечная строка диапазона, в котором произошла ошибка (это свойство опущено, если это не диапазон). -
fix- объект, описывающий исправление проблемы (это свойство опущено, если исправление недоступно). -
suggestions- массив объектов, описывающих возможные исправления lint для редакторов, чтобы программно включить (см. подробности в документации по работе с правилами).
Вы можете получить подавленные сообщения из предыдущего запуска с помощью метода getSuppressedMessages(). Если предыдущего запуска не было, getSuppressedMessage() вернёт пустой список.
const Linter = require("eslint").Linter;
const linter = new Linter();
const messages = linter.verify("var foo = bar; // eslint-disable-line -- Need to suppress", {
rules: {
semi: ["error", "never"]
}
}, { filename: "foo.js" });
const suppressedMessages = linter.getSuppressedMessages();
console.log(suppressedMessages[0].suppressions); // [{ "kind": "directive", "justification": "Need to suppress" }]
Вы также можете получить экземпляр объекта SourceCode используемого внутри linter с помощью метода getSourceCode().
const Linter = require("eslint").Linter;
const linter = new Linter();
const messages = linter.verify("var foo = bar;", {
rules: {
semi: 2
}
}, { filename: "foo.js" });
const code = linter.getSourceCode();
console.log(code.text); // "var foo = bar;"
Таким образом, вы можете получить текст и AST, используемые для последнего запуска linter.verify().
Linter#verifyAndFix()
Этот метод похож на verify, за исключением того, что он также выполняет логику автоматического исправления, аналогично флагу --fix в командной строке. Объект результата будет содержать отформатированный код, а также любые оставшиеся сообщения линтера для кода, который не был отформатирован автоматически.
const Linter = require("eslint").Linter;
const linter = new Linter();
const messages = linter.verifyAndFix("var foo", {
rules: {
semi: 2
}
});
Объект вывода из этого метода:
{
fixed: true,
output: "var foo;",
messages: []
}
Доступная информация:
-
fixed- true, если код был исправлен. -
output- отформатированный текст кода (может быть таким же, как входной, если не было применено исправлений). -
messages- набор всех сообщений для данного кода (он содержит ту же информацию, что и описано выше в блокеverify).
Linter#version/Linter.version
Каждый экземпляр Linter имеет свойство version, содержащее номер семантической версии ESLint, из которой происходит экземпляр Linter.
const Linter = require("eslint").Linter;
const linter = new Linter();
linter.version; // => '9.0.0'
Также есть свойство Linter.version, которое можно прочитать без создания экземпляра Linter.
const Linter = require("eslint").Linter;
Linter.version; // => '9.0.0'
Linter#getTimes()
Этот метод используется для получения времени, затраченного на (парсинг, исправление, линтер) файла. См. свойство times объекта Stats.
Linter#getFixPassCount()
Этот метод используется для получения количества проходов автоматического исправления. См. свойство fixPasses объекта Stats.
Linter#hasFlag()
Этот метод используется для определения, установлен ли данный флаг функции, как в этом примере:
const Linter = require("eslint").Linter;
const linter = new Linter({ flags: ["x_feature"] });
console.log(linter.hasFlag("x_feature")); // true
RuleTester
eslint.RuleTester — это утилита для написания тестов для правил ESLint. Она используется внутри для набора правил, поставляемых с ESLint, и может также использоваться плагинами.
Пример использования:
"use strict";
const rule = require("../../../lib/rules/my-rule"),
RuleTester = require("eslint").RuleTester;
const ruleTester = new RuleTester();
ruleTester.run("my-rule", rule, {
valid: [
{
code: "var foo = true",
options: [{ allowFoo: true }]
}
],
invalid: [
{
code: "var invalidVariable = true",
errors: [{ message: "Unexpected invalid variable." }]
},
{
code: "var invalidVariable = true",
errors: [{ message: /^Unexpected.+variable/ }]
}
]
});
Конструктор RuleTester принимает необязательный аргумент объекта, который может быть использован для указания значений по умолчанию для ваших тестовых случаев. Например, если все ваши тестовые случаи используют ES2015, вы можете установить его в качестве значения по умолчанию:
const ruleTester = new RuleTester({ languageOptions: { ecmaVersion: 2015 } });
Метод RuleTester#run() используется для запуска тестов. Ему должны быть переданы следующие аргументы:
- Название правила (строка)
- Объект правила (см. “Работа с правилами”)
- Объект, содержащий свойства
validиinvalid, каждое из которых — массив, содержащий тестовые случаи.
Тестовый случай — это объект со следующими свойствами:
-
name(строка, необязательно): Имя, используемое для тестового случая, для облегчения поиска -
code(строка, обязательно): Исходный код, на котором должно быть выполнено правило -
options(массив, необязательно): Опции, передаваемые правилу. Уровень строгости правила не должен включаться в этот список. -
before(функция, необязательно): Функция, выполняемая перед тестированием случая. -
after(функция, необязательно): Функция, выполняемая после тестирования случая независимо от его результата. -
filename(строка, необязательно): Имя файла для данного случая (полезно для правил, которые делают утверждения о именах файлов). -
only(логическое значение, необязательно): Запуск этого случая исключительно для отладки в поддерживаемых тестовых фреймворках.
В дополнение к вышеперечисленным свойствам, некорректные тестовые случаи также могут иметь следующие свойства:
-
errors(число или массив, обязательно): Утверждает некоторые свойства ошибок, которые правило должно генерировать при выполнении на этом коде. Если это число, утверждает число созданных ошибок. В противном случае это должен быть список объектов, каждый из которых содержит информацию об одной ошибке. Для ошибки могут использоваться следующие свойства (все необязательны, если не указано иное):-
message(строка/регулярное выражение): Сообщение об ошибке. Должно быть указано илиmessageId -
messageId(строка): Идентификатор ошибки. Должно быть указано илиmessage. См. тестирование ошибок с messageId для получения подробностей -
data(объект): Данные-заполнитель, которые можно использовать в сочетании сmessageId -
type(строка): (Устаревшее: это свойство будет удалено в будущей версии ESLint.) Тип отчётного узла AST -
line(число): Номер строки (с учётом 1) отчётного местоположения -
column(число): Номер колонки (с учётом 1) отчётного местоположения -
endLine(число): Номер строки (с учётом 1) конца отчётного местоположения -
endColumn(число): Номер колонки (с учётом 1) конца отчётного местоположения -
suggestions(массив): Массив объектов с деталями предложений для проверки. Требуется, если правило генерирует предложения. См. Тестирование предложений для подробностей
Если вместо объекта в качестве ошибки предоставлена строка, то строка используется для утверждения
messageошибки. -
-
output(строка, обязательно, если правило исправляет код): Утверждает вывод, который будет создан при использовании этого правила для одного прохода автоматического исправления (например, с флагом--fixкомандной строки). Если этоnullили опущено, утверждается, что ни одна из сообщённых проблем не предполагает автоматического исправления.
Любые дополнительные свойства тестового случая будут переданы непосредственно линтеру в качестве опций конфигурации. Например, тестовый случай может иметь свойство languageOptions для настройки поведения парсера:
{
code: "let foo;",
languageOptions: { ecmaVersion: 2015 }
}
Если допустимый тестовый случай использует только свойство code, его можно необязательно предоставить в виде строки, содержащей код, а не объекта со свойством code.
Тестирование ошибок с messageId
Если правило, которое тестируется, использует messageIdы, вы можете использовать свойство messageId в тестовом случае, чтобы утвердить messageId отчётной ошибки вместо её message.
{
code: "let foo;",
errors: [{ messageId: "unexpected" }]
}
Для сообщений с заменителями тестовый случай также может использовать свойство data для дополнительного утверждения message отчётной ошибки.
{
code: "let foo;",
errors: [{ messageId: "unexpected", data: { name: "foo" } }]
}
Обратите внимание, что data в тестовом случае не утверждает data переданное в context.report. Вместо этого оно используется для формирования ожидаемого текста сообщения, которое затем сравнивается с полученным message.
Тестирование исправлений
Результат применения исправлений можно проверить, используя свойство output некорректного тестового случая. Свойство output должно использоваться только тогда, когда вы ожидаете применения исправления к указанному code; вы можете безопасно опустить output если изменений кода не ожидается. Вот пример:
ruleTester.run("my-rule-for-no-foo", rule, {
valid: [],
invalid: [{
code: "var foo;",
output: "var bar;",
errors: [{
messageId: "shouldBeBar",
line: 1,
column: 5
}]
}]
})
В конце этого некорректного тестового случая, RuleTester ожидает применения исправления, которое изменяет код из var foo; в var bar; . Если результат после применения исправления не совпадает, то тест завершается неудачей.
Тестирование предложений
Предложения можно проверить, определив ключ suggestions в объекте ошибок. Если это число, оно утверждает число предложений, предоставленных для ошибки. В противном случае это должен быть массив объектов, каждый из которых содержит информацию об одном предложении. Могут быть использованы следующие свойства:
-
desc(строка): Значение предложенияdesc. Необходимо предоставить это значение илиmessageId -
messageId(строка): Значение предложенияmessageIdдля предложений, использующихmessageId. Необходимо предоставить это значение илиdesc -
data(объект): Данные-заполнитель, которые можно использовать в сочетании сmessageId. -
output(строка, обязательно): Строка кода, представляющая результат применения исправления предложения к входному коду
Пример:
ruleTester.run("my-rule-for-no-foo", rule, {
valid: [],
invalid: [{
code: "var foo;",
errors: [{
suggestions: [{
desc: "Rename identifier 'foo' to 'bar'",
output: "var bar;"
}]
}]
}]
})
Свойства messageId и data в объектах тестирования предложений работают так же, как и в объектах тестирования ошибок. Подробности см. в разделе тестирование ошибок с messageId.
ruleTester.run("my-rule-for-no-foo", rule, {
valid: [],
invalid: [{
code: "var foo;",
errors: [{
suggestions: [{
messageId: "renameFoo",
data: { newName: "bar" },
output: "var bar;"
}]
}]
}]
})
Настройка RuleTester
RuleTester зависит от двух функций для выполнения тестов: describe и it. Эти функции могут поступать из различных источников:
-
Если
RuleTester.describeиRuleTester.itустановлены в значения функций,RuleTesterбудет использоватьRuleTester.describeиRuleTester.itдля выполнения тестов. Это позволяет настроить поведениеRuleTesterдля соответствия используемой тестовой системе.Если
RuleTester.itOnlyустановлено в значение функции,RuleTesterбудет вызыватьRuleTester.itOnlyвместоRuleTester.itдля выполнения тестов сonly: true. ЕслиRuleTester.itOnlyне установлено, ноRuleTester.itимеет свойство функцииonly,RuleTesterвернется кRuleTester.it.only. -
В противном случае, если
describeиitприсутствуют в качестве глобальных переменных,RuleTesterбудет использоватьglobalThis.describeиglobalThis.itдля выполнения тестов иglobalThis.it.onlyдля выполнения тестов сonly: true. Это позволяетRuleTesterработать при использовании таких фреймворков, как Mocha, без дополнительной конфигурации. -
В противном случае,
RuleTester#runпросто выполнит все тесты последовательно и выведет ошибку, если один из них завершится неудачей. Это означает, что вы можете просто выполнить файл теста, который вызываетRuleTester.runс помощьюNode.js, без необходимости в тестовом фреймворке.
RuleTester#run вызывает функцию describe с двумя аргументами: строкой, описывающей правило, и функцией обратного вызова. Функция обратного вызова вызывает функцию it со строкой, описывающей тестовый случай, и тестовой функцией. Тестовая функция успешно завершит выполнение, если тест пройден, и выбросит ошибку, если тест провален. Подпись для only такая же, как и для it. RuleTester вызывает либо it, либо only для каждого случая, даже если некоторые случаи имеют only: true, и тестовый фреймворк отвечает за реализацию исключительности тестовых случаев. (Обратите внимание, что это стандартное поведение для наборов тестов при использовании таких фреймворков, как Mocha; эта информация актуальна только если вы планируете настроить RuleTester.describe, RuleTester.it, или RuleTester.itOnly.)
Пример настройки RuleTester:
"use strict";
const RuleTester = require("eslint").RuleTester,
test = require("my-test-runner"),
myRule = require("../../../lib/rules/my-rule");
RuleTester.describe = function(text, method) {
RuleTester.it.title = text;
return method.call(this);
};
RuleTester.it = function(text, method) {
test(RuleTester.it.title + ": " + text, method);
};
// then use RuleTester as documented
const ruleTester = new RuleTester();
ruleTester.run("my-rule", myRule, {
valid: [
// valid test cases
],
invalid: [
// invalid test cases
]
})
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/integrate/nodejs-api