51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
|
|
#!/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('-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> = {
|
||
|
|
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();
|
||
|
|
|