Моя команда использует ESDoc для генерации документации JS проектов. Мы используем кастомные плагины, чтобы сгенерированные документы соответствовали нашим потребностям. В этом посте я расскажу о некоторых наших плагинах, чтобы показать, что вывод ESDoc можно легко настроить.

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

Импорт из корневого пакета

ESDoc сгенерирует рекомендуемую строку импорта для метода, используя полный путь:

import {sum} from "awesome-math/src/sum.js";

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

import {sum} from ‘awesome-math’ 

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

Замаскируйте переменную как функцию

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

Чтобы решить эту проблему, мы используем специальный тег: function, чтобы отметить код.

На шаге onHandleDocs ищем тег. Если присутствует, запись документа устанавливается в kind function, эффективно обманывая ESDoc. Обратите внимание, что неподдерживаемые теги можно найти в массиве doc.unknown.

Внедрение ссылок

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

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

Примеры внедрения кода

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

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

Попался: зависимости

У плагина примеров есть небольшая проблема. Если вы попробуете, то заметите, что он не работает с обучающими программами. Проблема тонкая. Учебные файлы создаются во время выполнения с помощью esdoc-integration-manual-plugin (включенного в esdoc-standard-plugin). Наш плагин зависит от esdoc-integration-manual-plugin, но, в зависимости от порядка выполнения, он может быть выполнен раньше. Чтобы обеспечить правильный порядок, мы используем другой плагин.

Используя onHandlePlugins, можно изменить порядок коллекции подключаемых модулей, чтобы наши настраиваемые подключаемые модули выполнялись после модулей ESDoc. Магия!

Добавление разметки в макет: Google Analytics

Иногда необходимо изменить разметку, созданную ESDoc. Например, добавление дополнительной разметки, удаление ненужных фрагментов, изменение текстов, перевод и т. Д. В этом случае мы хотим отслеживать некоторые общедоступные документы с помощью кода отслеживания Google Analytics.

С помощью обработчика onHandleContent мы можем изменить тег head и добавить фрагмент отслеживания Google Analytics. Код отслеживания будет передан как опция плагина.

В этом примере мы использовали простую замену текста, но я рекомендую вам использовать некоторую библиотеку, например cheerio, если вы собираетесь сильно изменить HTML.

Архивирование документов

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

Мы используем обработчик onComplete для этой задачи и полагаемся на библиотеку архиватора для сжатия. Имя ZIP-файла определяется с помощью ключей package.json name и version.

Попался: ваш плагин не работает

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

../esdoc-plugins-example/node_modules/esdoc/out/src/Util/InvalidCodeLogger.js:72
const start = Math.max(error.loc.line — 3, 1);
TypeError: Cannot read property ‘line’ of undefined

Не отчаивайтесь, ваш плагин сломан. У вас просто синтаксическая ошибка или ошибка времени выполнения. ESDoc имеет некоторые ошибки и не может вывести, где находится ошибка.

Подвести итог

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