Spec-Zone.ru › ESLint

Архитектура

dependency graph

В целом, ESLint состоит из нескольких ключевых частей:

  • bin/eslint.js — это файл, который фактически выполняется с помощью утилиты командной строки. Это простая обёртка, которая ничего не делает, кроме загрузки ESLint и передачи аргументов командной строки в cli. Она умышленно простая, чтобы не требовать интенсивного тестирования.
  • lib/api.js — это точка входа в require("eslint"). Этот файл экспонирует объект, содержащий публичные классы Linter, ESLint, RuleTester, и SourceCode.
  • lib/cli.js — это сердце ESLint CLI. Она принимает массив аргументов и затем использует 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 и работает с глобальными методами тестирования 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 используется для обхода AST сверху вниз. На каждом узле объект 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API