Установка и настройка
npm install -D @arfa-tools/generatoryarn add -D @arfa-tools/generatorpnpm add -D @arfa-tools/generatorbun add -D @arfa-tools/generatorДля запуска создайте отдельный файл, например builder/generator.ts, и вызывайте через Node.js API в своём пайплайне сборки. CLI доступен только для получения логов.
Для быстрой оценки с помощью ИИ, будет ли полезен генератор в вашем проекте, можно использовать llms.md — это Markdown-версия текущей документации. Также можно на практике посмотреть на работу, использовав готовые Примеры.
Быстрый старт
Ниже — минимальный пример настройки и запуска с PluginReexport, который создаёт _reexport.ts и package.json в папке src/models.
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import {
FileGenerator,
PluginReexport,
logsToConsole
} from '@arfa-tools/generator';
const rootDir = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
'../src'
);
const generator = new FileGenerator({
rootDir,
plugins: [
new PluginReexport([
{
entries: ['models'],
template({ files }) {
return files
.map(({ name }) => `export * from './${name}';`)
.join('\n');
},
},
]),
],
});
await generator.runFullCycle({
afterCheckers() {
// maybe run bundler
},
afterFinish({ logs }) {
logsToConsole(logs, { verbosity: 'normal' });
},
});Для локальной разработки после основной сборки можно подключить watch-процесс.
await generator.startWatch({
aggregationTimeout: 50,
afterCheckers() {
// maybe run bundler
},
afterFinish({ logs }) {
logsToConsole(logs, { verbosity: 'normal' });
},
});Вывод логов
logsToConsole поддерживает режимы minimal и normal. Для первых запусков и настройки рекомендуется использовать normal, чтобы проверить скорость работы каждого этапа генерации. Для повседневного использования — компактный minimal.
Подробнее познакомиться с форматом вывода можно в примерах работы плагинов и чекеров.
Форматирование
Для форматирования контента сгенерированных файлов перед записью на диск используйте функцию format.
const generator = new FileGenerator({
rootDir,
plugins: [],
format(files) {
return files.map(({ content, filePath, plugin }) => ({
plugin,
filePath,
// maybe manual
content: content.trimEnd() + '\n',
// maybe Biome
// content: new biome.Workspace().fixFile({ path: filePath, ... })
// maybe Prettier
// content: prettierSync.format(content, { filepath: filePath })
// maybe ESLint
// content: new Linter().verifyAndFix(
// content,
// [{ rules }],
// { filename: filePath }
// ).output
}));
},
});