Назначение форматтеров

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

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


Модель данных, передаваемых форматтеру

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

  • имя файла
  • список проблем
  • позицию (строка и колонка)
  • уровень серьёзности (error, warning)
  • идентификатор правила
  • текст сообщения
  • при наличии — фрагменты исправлений (fix)

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


Основные задачи форматтеров

Форматтеры решают несколько прикладных задач, связанных с представлением данных анализа:

1. Человеко-ориентированный вывод Создание читаемого отчёта для терминала, где важно быстро оценить состояние кодовой базы.

2. Машиночитаемый вывод Генерация структурированных форматов (JSON, XML, Checkstyle), используемых в CI/CD системах и инструментах анализа качества.

3. Интеграция с внешними системами Подготовка отчётов для систем мониторинга, баг-трекеров и платформ статического анализа.

4. Оптимизация визуального восприятия Сокращение или группировка информации для уменьшения шума при большом количестве сообщений.


Встроенные форматтеры ESLint

ESLint поставляется с набором стандартных форматтеров, ориентированных на разные сценарии использования.

stylish Формат по умолчанию, ориентированный на разработку. Группирует ошибки по файлам, использует цветовое выделение и компактную структуру.

compact Минималистичный формат, где каждая проблема выводится в одной строке. Удобен для логов.

json Полный экспорт структуры результатов анализа. Используется для интеграций и последующей обработки.

checkstyle XML-подобный формат, применяемый в Java-экосистеме и CI-системах.

junit Формат отчёта, совместимый с тестовыми фреймворками, где линтинг интерпретируется как набор тест-кейсов.

tap Вывод в формате Test Anything Protocol, позволяющий интеграцию с тестовыми раннерами.


Выбор форматтера через CLI

В командной строке ESLint выбор форматтера осуществляется через параметр:

eslint . -f stylish

или

eslint . --format json

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


Форматтеры и уровень детализации отчёта

Разные форматтеры по-разному интерпретируют одну и ту же информацию:

  • агрегирование по файлам или вывод построчно
  • наличие или отсутствие цветового выделения
  • отображение исправлений (fix suggestions)
  • включение статистики по проекту

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


Использование форматтеров в Node.js API

ESLint предоставляет программный интерфейс, позволяющий применять форматтеры без CLI:

import { ESLint } from "eslint";

const eslint = new ESLint();

const results = await eslint.lintFiles(["src/**/*.js"]);

const formatter = await eslint.loadFormatter("stylish");
const resultText = formatter.format(results);

console.log(resultText);

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


Кастомные форматтеры

Архитектура ESLint позволяет создавать собственные форматтеры. Форматтер представляет собой функцию или модуль, принимающий массив результатов и возвращающий строку.

Базовая структура:

export default function customFormatter(results) {
  let output = "";

  for (const file of results) {
    output += `File: ${file.filePath}\n`;

    for (const message of file.messages) {
      output += `${message.line}:${message.column} ${message.message} (${message.ruleId})\n`;
    }
  }

  return output;
}

Кастомные форматтеры применяются при необходимости адаптации вывода под внутренние стандарты команды или специфические требования системы сборки.


Форматтер как слой представления

В архитектурном смысле форматтеры выступают аналогом view-слоя:

  • анализатор (rules engine) формирует данные
  • форматтер интерпретирует их для вывода
  • CLI или API предоставляет точку интеграции

Такое разделение позволяет расширять систему без изменения ядра анализа.


Формат JSON как промежуточный слой

JSON-формат занимает особое положение, так как часто используется как промежуточное представление между ESLint и внешними инструментами.

Типичный сценарий:

  1. ESLint выполняет анализ
  2. результаты экспортируются в JSON
  3. внешний сервис преобразует данные в отчёты, графики или метрики

JSON-структура включает:

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

Использование форматтеров в CI/CD

В системах непрерывной интеграции форматтеры выполняют роль стандартизированного вывода, позволяя:

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

Чаще всего применяются форматы:

  • json (для дальнейшей обработки)
  • junit (для интерпретации как тестов)
  • checkstyle (для корпоративных систем качества)

Производительность и форматирование

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

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

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


Структурирование вывода и читаемость

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

  • уменьшить когнитивную нагрузку
  • быстрее локализовать ошибки
  • отделить критические проблемы от второстепенных

Визуальная иерархия часто строится вокруг:

  • файлов
  • уровней ошибок
  • типов правил

Расширяемость системы форматирования

ESLint поддерживает подключение форматтеров как внешних пакетов. Это позволяет:

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

Форматтеры могут распространяться как npm-пакеты и подключаться по имени, аналогично плагинам правил.