feat: инициализация API CodeGen

CLI утилита для генерации TypeScript API клиента из OpenAPI спецификации.
- Поддержка локальных файлов и URL для спецификаций
- Кастомизация имени выходного файла через флаг --name
- Генерация типизированного клиента с SWR хуками
- Минимальный вывод логов для лучшего UX
This commit is contained in:
2025-10-26 22:30:58 +03:00
commit 15ed8c8b8d
26 changed files with 1854 additions and 0 deletions

52
src/cli.ts Normal file
View File

@@ -0,0 +1,52 @@
#!/usr/bin/env node
import { Command } from 'commander';
import chalk from 'chalk';
import { validateConfig, type GeneratorConfig } from './config.js';
import { generate } from './generator.js';
import { fileExists } from './utils/file.js';
const program = new Command();
program
.name('api-codegen')
.description('Generate TypeScript API client from OpenAPI specification')
.version('1.0.0')
.requiredOption('-u, --url <url>', 'Base API URL (e.g., https://api.example.com)')
.requiredOption('-i, --input <path>', 'Path to OpenAPI specification file (JSON or YAML)')
.requiredOption('-o, --output <path>', 'Output directory for generated files')
.option('-n, --name <name>', 'Name of generated file (without extension)')
.action(async (options) => {
try {
// Создание конфигурации
const config: Partial<GeneratorConfig> = {
apiUrl: options.url,
inputPath: options.input,
outputPath: options.output,
fileName: options.name,
};
// Валидация конфигурации
validateConfig(config);
// Проверка существования входного файла (только для локальных файлов)
if (!config.inputPath!.startsWith('http://') && !config.inputPath!.startsWith('https://')) {
if (!(await fileExists(config.inputPath!))) {
console.error(chalk.red(`\n❌ Error: Input file not found: ${config.inputPath}\n`));
process.exit(1);
}
}
// Генерация API
await generate(config as GeneratorConfig);
console.log(chalk.green('\n✨ Done!\n'));
} catch (error) {
console.error(chalk.red('\n❌ Error:'), error instanceof Error ? error.message : error);
console.error();
process.exit(1);
}
});
program.parse();