Архитектура
На высоком уровне ESLint состоит из нескольких ключевых частей:
-
bin/eslint.js— это файл, который фактически выполняется утилитой командной строки. Это простая оболочка, которая лишь запускает ESLint и передаёт аргументы командной строки вcli. Этот файл намеренно сделан небольшим, чтобы не требовалось тщательно его тестировать. -
lib/api.js— это точка входа вrequire("eslint"). Этот файл предоставляет объект, содержащий общедоступные классыLinter,ESLint,RuleTesterиSourceCode. -
lib/cli.js— это сердце CLI ESLint. Он принимает массив аргументов, а затем используетeslintдля выполнения команд. Благодаря тому, что это отдельная утилита, другие программы могут вызывать ESLint из программы на Node.js так, как если бы он был запущен из командной строки. Основной вызов —cli.execute(). Именно эта часть также отвечает за чтение файлов, обход каталогов, ввод и вывод данных. -
lib/cli-engine/— этот модуль представляет собой классCLIEngine, который находит файлы исходного кода и файлы конфигурации, а затем проверяет код с помощью классаLinter. В его обязанности входит загрузка файлов конфигурации, парсеров, плагинов и форматтеров. -
lib/linter/— этот модуль представляет собой основной классLinter, который проверяет код на основе параметров конфигурации. Этот файл не выполняет операций ввода-вывода с файлами и вообще не взаимодействует сconsole. Другие программы на Node.js, которым нужно проверить текст на JavaScript, могут напрямую использовать этот интерфейс. -
lib/rule-tester/— этот модуль представляет собой классRuleTester, который служит оболочкой для Mocha и позволяет модульно тестировать правила. Этот класс позволяет писать тесты для каждого реализованного правила в едином формате и быть уверенными, что все правила работают. Интерфейс RuleTester создан по образцу Mocha и использует его глобальные методы тестирования. RuleTester также можно адаптировать для работы с другими платформами тестирования. -
lib/source-code/— этот модуль представляет собой классSourceCode, который используется для представления разобранного исходного кода. Он принимает исходный код и узел Program AST, представляющий этот код. -
lib/rules/— содержит встроенные правила для проверки исходного кода.
Объект cli
Объект cli — это API интерфейса командной строки. По сути, файл bin/eslint.js просто передаёт аргументы объекту cli, а затем присваивает process.exitCode возвращённый код завершения.
Основной метод — cli.execute(). Он принимает массив строк, представляющих параметры командной строки (как если бы process.argv был вызван без первых двух аргументов). Если вы хотите запустить ESLint из другой программы и заставить его работать как CLI, используйте объект cli.
В обязанности этого объекта входит:
- Интерпретация аргументов командной строки.
- Чтение файловой системы.
- Вывод данных в консоль.
- Запись данных в файловую систему.
- Использование форматтера.
- Возврат правильного кода завершения.
Этот объект не должен:
- Вызывать
process.exit()напрямую. - Выполнять асинхронные операции.
Объект CLIEngine
Тип CLIEngine представляет основную функциональность CLI, за исключением того, что он ничего не читает из командной строки и по умолчанию ничего не выводит. Вместо этого он принимает многие (но не все) аргументы, передаваемые CLI. Он читает файлы конфигурации и исходного кода, а также управляет средой, передаваемой объекту Linter.
Основной метод CLIEngine — executeOnFiles(). Он принимает массив имён файлов и каталогов, для которых нужно запустить линтер.
В обязанности этого объекта входит:
- Управление средой выполнения для
Linter. - Чтение файловой системы.
- Чтение информации о конфигурации из файлов конфигурации (включая
.eslintrcиpackage.json).
Этот объект не должен:
- Вызывать
process.exit()напрямую. - Выполнять асинхронные операции.
- Выводить данные в консоль.
- Использовать форматтеры.
Объект Linter
Основной метод объекта Linter — verify(). Он принимает два аргумента: исходный текст для проверки и объект конфигурации (итоговую конфигурацию, сформированную из заданного файла конфигурации и параметров командной строки). Сначала метод разбирает переданный текст с помощью espree (или настроенного парсера) и получает AST. AST содержит координаты в формате строка/столбец и диапазоны, которые полезны соответственно для указания местоположения проблем и получения исходного текста, связанного с узлом AST.
После получения AST для его обхода сверху вниз используется estraverse. Для каждого узла объект Linter генерирует событие, имя которого совпадает с типом узла (например, «Identifier», «WithStatement» и т. д.). При обратном обходе поддерева генерируется событие с именем типа AST и суффиксом «:exit», например «Identifier:exit». Это позволяет правилам выполнять действия как при движении вниз, так и при движении вверх по дереву. Каждое событие содержит соответствующий узел AST.
В обязанности этого объекта входит:
- Проверка строк с кодом JavaScript.
- Создание AST для кода.
- Выполнение правил над AST.
- Возврат результатов выполнения.
Этот объект не должен:
- Вызывать
process.exit()напрямую. - Выполнять асинхронные операции.
- Использовать специфичные для Node.js возможности.
- Обращаться к файловой системе.
- Вызывать
console.log()или любые другие подобные методы.
Правила
Отдельные правила — самая специализированная часть архитектуры ESLint. Возможности правил весьма ограничены: это всего лишь набор инструкций, выполняемых для переданного AST. Им передаётся некоторая контекстная информация, но главная задача правила — проверять AST и сообщать о предупреждениях.
В обязанности этих объектов входит:
- Проверка AST на наличие определённых шаблонов.
- Выдача предупреждений при обнаружении определённых шаблонов.
Эти объекты не должны:
- Вызывать
process.exit()напрямую. - Выполнять асинхронные операции.
- Использовать специфичные для Node.js возможности.
- Обращаться к файловой системе.
- Вызывать
console.log()или любые другие подобные методы.
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/contribute/architecture