Форматтер compact

Форматтер compact в ESLint представляет собой специализированный способ вывода результатов линтинга в максимально сжатом, однострочном виде. Его основная цель — обеспечить удобочитаемость логов в средах, где критичны плотность информации и возможность быстрой фильтрации: CI/CD системы, терминальные пайплайны, лог-агрегаторы, системы мониторинга.

В отличие от человеко-ориентированных форматтеров (например, stylish или default), compact устраняет структурные блоки и многострочные сообщения, заменяя их линейной структурой с фиксированными полями.


Структура вывода compact

Каждое сообщение об ошибке или предупреждении выводится в одну строку и включает следующие компоненты:

<путь к файлу>:<строка>:<колонка>: <уровень>: <сообщение> <правило>

Пример:

src/app.js:10:5: error: 'x' is defined but never used no-unused-vars

Составные части строки

Путь к файлу

  • Относительный или абсолютный путь
  • Позволяет быстро определить источник проблемы

Строка и колонка

  • Указывают точное место в коде
  • Формат: line:column

Уровень

  • error — нарушение, приводящее к ошибке линтинга
  • warning — предупреждение, не блокирующее процесс

Сообщение

  • Текстовое описание проблемы
  • Формируется правилом ESLint

Имя правила

  • Идентификатор правила (например, no-unused-vars)
  • Используется для поиска и настройки поведения линтера

Назначение и область применения

Формат compact оптимизирован под сценарии, где важны:

1. CI/CD пайплайны

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

  • уменьшить объем логов
  • ускорить парсинг
  • упростить интеграцию с анализаторами

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

eslint . -f compact

2. Логирование в консоли

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

src/utils.js:25:12: warning: Unexpected console statement no-console

3. Интеграция с инструментами анализа

Compact формат часто используется как промежуточный слой для:

  • парсинга логов
  • преобразования в JSON
  • отправки в системы мониторинга
  • генерации отчетов

Отличия от других форматтеров ESLint

stylish

Stylish формат ориентирован на читаемость человеком и использует группировку по файлам:

/src/app.js
  10:5  error  'x' is defined but never used  no-unused-vars

Недостатки по сравнению с compact:

  • многострочность
  • сложнее парсить автоматически

json

JSON формат предназначен для программной обработки:

[
  {
    "filePath": "src/app.js",
    "messages": [
      {
        "ruleId": "no-unused-vars",
        "message": "'x' is defined but never used",
        "line": 10,
        "column": 5,
        "severity": 2
      }
    ]
  }
]

Недостатки по сравнению с compact:

  • больший объем
  • избыточность структуры

compact

Compact занимает промежуточное положение:

  • не требует сложного парсинга JSON
  • остается читаемым в терминале
  • минимизирует объем

Форматирование сообщений

Ошибка (error)

src/index.js:3:1: error: Parsing error: Unexpected token import no-undef

Предупреждение (warning)

src/index.js:15:8: warning: Unexpected console statement no-console

Поведение при множественных ошибках

Если в файле несколько проблем, каждая выводится отдельной строкой:

src/app.js:5:10: error: 'a' is defined but never used no-unused-vars
src/app.js:8:5: warning: Missing semicolon semi
src/app.js:12:1: error: Unexpected console statement no-console

Порядок вывода:

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

Использование через CLI

ESLint поддерживает выбор форматтера через флаг -f или --format:

eslint src -f compact

Также возможно перенаправление вывода:

eslint src -f compact > eslint.log

или использование в связке с фильтрацией:

eslint src -f compact | grep error

Поведение с различными уровнями severity

Внутренне ESLint классифицирует нарушения как:

  • 0 — off
  • 1 — warning
  • 2 — error

Compact формат отображает это как текстовые метки:

  • warning
  • error

Пример:

utils/math.js:22:3: error: 'sum' is not defined no-undef
utils/math.js:30:7: warning: Unexpected any usage @typescript-eslint/no-explicit-any

Работа с путями файлов

Пути могут быть:

Относительные

src/components/button.js:14:2: error: Missing return type

Абсолютные

/Users/dev/project/src/components/button.js:14:2: error: Missing return type

С нормализованными разделителями

В кроссплатформенных средах используются /, даже на Windows, если не изменено поведение CLI.


Особенности парсинга compact формата

Compact формат легко обрабатывается регулярными выражениями:

^(.*?):(\d+):(\d+):\s(error|warning):\s(.*?)\s([a-zA-Z0-9-_/]+)$

Поля можно извлечь как:

  • file
  • line
  • column
  • severity
  • message
  • rule

Это делает формат удобным для:

  • собственных линтер-дашбордов
  • интеграции с системами логирования
  • построения аналитики качества кода

Ограничения compact формата

1. Отсутствие структурированности

В отличие от JSON, compact не содержит вложенной структуры, что усложняет:

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

2. Потеря контекста

Сообщение не включает:

  • код строки
  • фрагмент исходного кода
  • исправления

3. Сложность расширения

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


Поведение при большом количестве ошибок

При тысячах сообщений compact формат может создавать длинные потоки текста:

src/a.js:1:1: error: ...
src/a.js:2:5: warning: ...
src/a.js:10:3: error: ...
...

Для оптимизации часто комбинируется с:

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

Комбинация с другими инструментами

Compact формат часто используется вместе с:

grep

eslint . -f compact | grep no-unused-vars

awk

eslint . -f compact | awk -F: '{print $1}'

CI лог-анализаторами

  • GitLab CI
  • GitHub Actions
  • Jenkins pipelines

Применение в больших кодовых базах

В монорепозиториях compact формат позволяет:

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

Пример вывода:

packages/ui/button.js:45:2: error: 'props' is missing validation react/prop-types
packages/api/index.js:10:8: warning: Unexpected console statement no-console
packages/core/utils.js:88:1: error: 'fetchData' is not defined no-undef

Роль compact в экосистеме ESLint

Compact формат является компромиссом между:

  • читаемостью (human-friendly)
  • компактностью (machine-friendly)
  • простотой парсинга (regex-friendly)

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