Класс ESLint

ESLint предоставляет программный API поверх собственного ядра линтинга, где центральным элементом выступает объект, инкапсулирующий процесс анализа кода, загрузку конфигураций, применение правил и форматирование результатов. Этот объект служит точкой входа для интеграции линтера в сборочные системы, тестовые окружения и пользовательские инструменты автоматизации.

Основная логика работы строится вокруг создания экземпляра, который конфигурируется параметрами окружения, путями к конфигурационным файлам и набором правил. Внутри реализуется пайплайн: загрузка конфигурации → разрешение плагинов → анализ файлов → формирование отчёта → применение форматтера.


Конструирование экземпляра и параметры инициализации

Создание экземпляра осуществляется через конструктор, который принимает объект конфигурации. Этот объект определяет поведение линтера на уровне проекта.

Ключевые параметры:

  • overrideConfig — позволяет задать конфигурацию напрямую в коде
  • cwd — базовая директория для разрешения путей
  • rulePaths — дополнительные директории с пользовательскими правилами
  • plugins — подключаемые плагины
  • fix — автоматическое исправление проблем при анализе
  • cache — включение кэширования результатов анализа
  • cacheLocation — путь к файлу кэша

Внутренне экземпляр сохраняет состояние окружения и использует его при каждом запуске линтинга, что позволяет повторно использовать тяжёлые ресурсы: загруженные правила, резолверы и конфигурации.


Основной API анализа файлов

Центральной функцией является метод анализа файлов, который принимает набор путей и возвращает структурированный отчёт о найденных проблемах.

Процесс работы включает:

  1. Резолвинг glob-путей
  2. Чтение исходного кода
  3. Применение парсера
  4. Выполнение правил
  5. Формирование результата

Метод возвращает массив отчётов, где каждый элемент соответствует одному файлу и содержит:

  • список сообщений об ошибках
  • список предупреждений
  • метаданные файла
  • информацию о применённых правилах

Типовая структура результата:

[
  {
    filePath: "src/index.js",
    messages: [
      {
        ruleId: "no-unused-vars",
        severity: 2,
        message: "'x' is defined but never used",
        line: 3,
        column: 5
      }
    ],
    errorCount: 1,
    warningCount: 0
  }
]

Анализ текстовых строк кода

Отдельный режим работы предназначен для анализа фрагментов кода, не привязанных к файловой системе. Он используется в редакторах кода, интерактивных окружениях и тестовых раннерах.

Метод принимает:

  • строку исходного кода
  • объект конфигурации
  • путь, относительно которого интерпретируются правила

Особенность данного режима заключается в том, что он не выполняет файловый резолвинг, но сохраняет полноценную систему правил и парсинга.


Система конфигурационного разрешения

Экземпляр ESLint обладает встроенным механизмом загрузки конфигурации, который поддерживает несколько источников:

  • конфигурационные файлы JSON/YAML/JS
  • поле overrideConfig
  • наследование через extends
  • плагины с собственными правилами

Приоритет конфигурации определяется следующим образом:

  1. локальные overrides
  2. inline-конфигурации
  3. конфигурационные файлы ближе к файлу анализа
  4. базовые конфигурации и расширения

Разрешение конфигурации выполняется один раз для каждой области файлов, после чего результат кешируется внутри экземпляра.


Работа с форматтерами отчётов

Экземпляр предоставляет механизм загрузки форматтера, преобразующего внутреннюю структуру результатов в человекочитаемый формат.

Форматтеры могут быть:

  • встроенными (stylish, json, compact)
  • пользовательскими модулями
  • подключаемыми через плагины

Процесс форматирования включает:

  1. получение отчёта линтинга
  2. загрузку выбранного форматтера
  3. применение трансформации
  4. возврат строки результата

Пример логики использования:

const eslint = new ESLint();
const results = await eslint.lintFiles(["src/**/*.js"]);
const formatter = await eslint.loadFormatter("stylish");
const output = formatter.format(results);

Автоматическое исправление кода

Встроенная система фиксов позволяет модифицировать исходный код на основе правил, поддерживающих автоматическое исправление.

Механизм работы:

  • правило возвращает объект фикса
  • фиксы агрегируются
  • конфликты разрешаются по приоритету
  • итоговый код записывается обратно в файл (или возвращается в памяти)

Поддерживаются два режима:

  • безопасные фиксы (без изменения логики)
  • потенциально рискованные фиксы (зависят от правил)

Результат содержит дополнительное поле output, где находится исправленный код.


Кэширование результатов анализа

Для повышения производительности используется кэширование. Оно особенно важно при анализе больших проектов.

Кэш хранит:

  • hash содержимого файла
  • применённые конфигурации
  • результаты линтинга

При повторном запуске система сравнивает хеши и пропускает анализ неизменённых файлов.

Кэш может быть:

  • файловым (persisted)
  • in-memory (временным)

Загрузка и управление плагинами

Экземпляр поддерживает динамическое подключение плагинов, расширяющих функциональность линтера.

Плагины могут содержать:

  • набор правил
  • парсеры
  • процессоры файлов
  • дополнительные конфигурации

Резолвинг плагинов осуществляется через Node.js-механизм модулей, с учётом текущего рабочего каталога и параметров cwd.

При загрузке происходит:

  1. поиск модуля
  2. импорт пакета
  3. регистрация правил
  4. связывание с конфигурацией

Обработка исключений и диагностическая модель

Ошибки в процессе анализа делятся на несколько категорий:

  • синтаксические ошибки парсера
  • ошибки правил
  • ошибки конфигурации
  • ошибки резолвинга модулей

Каждое сообщение содержит:

  • идентификатор правила
  • уровень серьёзности
  • позицию в коде
  • текстовое описание
  • опциональные данные для автоматического исправления

Эта структура унифицирована, что позволяет одинаково обрабатывать результаты в редакторах и CI-системах.


Интеграция с файловой системой

Работа с файлами осуществляется через стандартные механизмы Node.js, но дополнительно поддерживается:

  • glob-паттерны
  • исключения через ignore-файлы
  • расширения по умолчанию
  • фильтрация по типу файлов

Разрешение путей происходит относительно cwd, что позволяет переносить конфигурации между окружениями без изменений.


Внутренний цикл обработки данных

Полный цикл обработки одного файла включает последовательность этапов:

  • загрузка исходного текста
  • определение конфигурации
  • инициализация парсера
  • построение AST
  • запуск правил по AST
  • сбор сообщений
  • применение фиксов (при включении)
  • упаковка результата

Каждый этап изолирован и может быть расширен через плагины или кастомные парсеры.


Поведение в многопоточном окружении

Экземпляр рассчитан на использование в асинхронной среде. Основные операции возвращают Promise, что позволяет:

  • параллелить анализ файлов
  • интегрировать в сборщики
  • избегать блокировки event loop

При этом внутреннее состояние экземпляра не предполагает конкурентной модификации конфигурации во время выполнения анализа, что обеспечивает предсказуемость результатов.


Управление зависимостями правил

Каждое правило может иметь зависимости:

  • другие правила
  • плагины
  • глобальные настройки парсера

Разрешение зависимостей происходит при инициализации конфигурации. В случае конфликтов приоритет определяется локальностью конфигурации и порядком подключения расширений.


Формирование итоговой структуры данных

Результат работы экземпляра представляет собой нормализованный набор данных, пригодный для дальнейшей обработки.

Он включает:

  • идентификацию файла
  • статистику ошибок и предупреждений
  • детализированные сообщения
  • информацию о применённых фикcах
  • метаданные о производительности анализа

Эта структура служит основой для построения интерфейсов анализа кода, отчётных систем и интеграций с CI/CD пайплайнами.