Skip to content

Установка и настройка ​

sh
npm install -D @arfa-tools/generator
sh
yarn add -D @arfa-tools/generator
sh
pnpm add -D @arfa-tools/generator
sh
bun add -D @arfa-tools/generator

Для запуска создайте отдельный файл, например builder/generator.ts, и вызывайте через Node.js API в своём пайплайне сборки. CLI доступен только для получения логов.

Для быстрой оценки с помощью ИИ, будет ли полезен генератор в вашем проекте, можно использовать llms.md — это Markdown-версия текущей документации. Также можно на практике посмотреть на работу, использовав готовые Примеры.

Быстрый старт ​

Ниже — минимальный пример настройки и запуска с PluginReexport, который создаёт _reexport.ts и package.json в папке src/models.

ts
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-процесс.

ts
await generator.startWatch({
  aggregationTimeout: 50,
  afterCheckers() {
    // maybe run bundler
  },
  afterFinish({ logs }) {
    logsToConsole(logs, { verbosity: 'normal' });
  },
});

Вывод логов ​

logsToConsole поддерживает режимы minimal и normal. Для первых запусков и настройки рекомендуется использовать normal, чтобы проверить скорость работы каждого этапа генерации. Для повседневного использования — компактный minimal.

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

Форматирование ​

Для форматирования контента сгенерированных файлов перед записью на диск используйте функцию format.

ts
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
    }));
  },
});

MIT License