Документирование правила — важная часть разработки собственных правил ESLint. Даже идеально реализованное правило теряет практическую ценность, если разработчики не понимают его назначение, принцип работы, ограничения и способы настройки.
Качественная документация выполняет несколько задач:
Для публичных наборов правил документация считается обязательным компонентом наряду с исходным кодом и тестами.
Большинство ESLint-проектов придерживаются единого формата описания правил. Обычно для каждого правила создаётся отдельный Markdown-файл.
Пример структуры:
docs/
└── rules/
└── no-console-log.md
Типичная документация содержит следующие разделы:
Документация обычно начинается с названия правила.
Пример:
# no-console-log
Сразу после заголовка размещается краткое описание.
# no-console-log
Запрещает использование console.log в производственном коде.
Описание должно быть коротким и максимально конкретным.
Нежелательный вариант:
Правило проверяет некоторые случаи использования консоли.
Предпочтительный вариант:
Запрещает вызовы console.log, поскольку отладочные сообщения
не должны попадать в production-сборку.
После краткого описания раскрывается причина существования правила.
Пример:
Отладочные сообщения часто остаются в кодовой базе после завершения
разработки. Это приводит к засорению логов и раскрытию внутренней
информации приложения.
В этом разделе полезно описывать:
Документация должна объяснять не только что запрещается, но и почему это запрещается.
Почти каждая официальная документация ESLint содержит блоки с примерами нарушений.
Традиционно используется подпись:
## Examples of incorrect code for this rule:
Пример:
## Examples of incorrect code for this rule:
```js
console.log("debug");
```
```js
console.log(user);
```
В русскоязычной документации аналогичный раздел может выглядеть так:
## Некорректный код
```js
console.log("test");
```
```js
console.log(response);
```
Примеры должны быть минимальными и демонстрировать только нарушение конкретного правила.
Плохо:
function processData(data) {
const result = transform(data);
console.log(result);
return result;
}
Лучше:
console.log(result);
После примеров нарушений обязательно показываются допустимые варианты.
Пример:
## Корректный код
```js
logger.info(result);
```
```js
sendMetric(result);
```
Такой подход помогает понять ожидаемый стиль программирования.
Если правило запрещает конструкцию без альтернативы, всё равно полезно показать допустимый вариант.
Например:
Нарушение:
var count = 0;
Исправление:
let count = 0;
Многие правила ESLint поддерживают настройки через объект конфигурации.
Пример конфигурации:
{
"rules": {
"custom/max-function-size": [
"error",
{
"maxLines": 50
}
]
}
}
Каждый параметр необходимо описывать отдельно.
Пример:
### maxLines
Тип: number
Значение по умолчанию: 50
Определяет максимально допустимое количество строк
внутри функции.
Для нескольких параметров рекомендуется использовать таблицу.
| Параметр | Тип | По умолчанию | Описание |
|-----------|------|--------------|-----------|
| maxLines | number | 50 | Максимальное число строк |
| ignoreComments | boolean | false | Игнорировать комментарии |
Если правило использует JSON Schema для валидации опций, документация должна отражать ограничения этой схемы.
Пример схемы:
schema: [
{
type: "object",
properties: {
allowWarn: {
type: "boolean"
}
},
additionalProperties: false
}
]
Соответствующее описание:
### allowWarn
Разрешает использование console.warn.
Допустимые значения:
- true
- false
Важно явно указывать:
Если правило работает по-разному в зависимости от настроек, каждая конфигурация должна сопровождаться отдельными примерами.
Например:
Конфигурация:
{
"custom/no-console-log": [
"error",
{
"allowWarn": true
}
]
}
Некорректный код:
console.log("message");
Корректный код:
console.warn("warning");
Для другой конфигурации:
{
"custom/no-console-log": [
"error",
{
"allowWarn": false
}
]
}
Некорректным станет уже следующий код:
console.warn("warning");
Документация должна отражать все значимые сценарии использования.
Если правило поддерживает автоматическое исправление, это следует указывать явно.
В метаданных правило содержит:
meta: {
fixable: "code"
}
Документация может содержать отдельный раздел.
## Автоматическое исправление
Правило поддерживает автоматическое исправление через ESLint.
До исправления:
```js
var count = 0;
```
После исправления:
```js
let count = 0;
```
Также полезно указать команду запуска:
eslint . --fix
Начиная с ESLint 7 появилась возможность предоставлять suggestions.
Пример метаданных:
meta: {
hasSuggestions: true
}
Если правило использует подсказки, их желательно перечислять.
Пример:
Возможные предложения исправления:
- заменить var на let;
- заменить var на const.
Это особенно полезно для пользователей редакторов, поддерживающих ESLint Suggestions.
Любое правило имеет границы применимости.
Пример:
Ограничения:
- анализируются только прямые вызовы console.log;
- динамические обращения через переменные не проверяются;
- обращения через globalThis не обрабатываются.
Подобная информация предотвращает ложные ожидания пользователей.
Этот раздел помогает принять решение о включении правила в проект.
Пример:
Используйте правило, если:
- требуется строгий контроль качества кода;
- запрещены отладочные сообщения;
- проект имеет production-ориентированные стандарты.
Особенно полезен для больших наборов правил, где не каждое правило подходит всем проектам.
Не менее важен и обратный сценарий.
Пример:
Не используйте правило, если:
- проект находится на стадии прототипирования;
- console.log является частью процесса диагностики;
- команда не ограничивает использование консольного вывода.
Такие рекомендации помогают избежать чрезмерного применения линтеров.
Некоторые правила пересекаются между собой.
Например:
Связанные правила:
- no-console
- no-debugger
- custom/no-console-log
Если правило дублирует функциональность другого правила или расширяет её, это следует указывать напрямую.
Пример:
Данное правило является более строгой альтернативой no-console,
поскольку запрещает только console.log и позволяет использовать
остальные методы объекта console.
Иногда правило содержит специальные исключения.
Пример реализации:
if (node.parent.type === "CatchClause") {
return;
}
Документация должна объяснять подобное поведение.
Пример:
Внутри блоков catch использование console.error допускается,
поскольку оно применяется для регистрации ошибок.
Любое нестандартное решение в коде правила желательно отражать в документации.
Документация правил ESLint чаще всего хранится в формате Markdown.
Основные элементы оформления:
Заголовки:
# Заголовок первого уровня
## Заголовок второго уровня
### Заголовок третьего уровня
Списки:
- Пункт 1
- Пункт 2
- Пункт 3
Нумерация:
1. Первый пункт
2. Второй пункт
3. Третий пункт
Таблицы:
| Опция | Тип |
|--------|------|
| allow | boolean |
Блоки кода:
```js
const value = 1;
```
Единый стиль оформления облегчает навигацию по документации всего набора правил.
Наиболее распространённая проблема — устаревшая документация.
Типичные ситуации:
Для предотвращения расхождений часто используется следующий процесс:
Документация должна рассматриваться как часть исходного кода, а не как дополнительный материал.
# custom-rule
Краткое описание назначения правила.
## Почему существует это правило
Описание проблемы и мотивации.
## Некорректный код
```js
// пример нарушения
```
## Корректный код
```js
// корректный пример
```
## Опции
### optionA
Описание параметра.
### optionB
Описание параметра.
## Автоматическое исправление
Описание поведения fix.
## Ограничения
Описание известных ограничений.
## Когда использовать правило
Рекомендации по применению.
## Когда не использовать правило
Сценарии, в которых правило не требуется.
## Связанные правила
- another-rule
- some-other-rule
Такой шаблон обеспечивает единообразие документации, ускоряет сопровождение набора правил и делает использование пользовательских правил ESLint предсказуемым и понятным для всех участников проекта.