#!/usr/bin/env node import { Command } from 'commander'; import chalk from 'chalk'; import { readFileSync } from 'fs'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { validateConfig, type GeneratorConfig } from './config.js'; import { generate } from './generator.js'; import { fileExists } from './utils/file.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf-8')); const program = new Command(); program .name('api-codegen') .description('Generate TypeScript API client from OpenAPI specification') .version(pkg.version) .requiredOption('-i, --input ', 'Path to OpenAPI specification file (JSON or YAML)') .requiredOption('-o, --output ', 'Output directory for generated files') .option('-n, --name ', 'Name of generated file (without extension)') .option('--swr', 'Generate SWR hooks for React') .action(async (options) => { try { // Создание конфигурации const config: Partial = { inputPath: options.input, outputPath: options.output, fileName: options.name, useSwr: options.swr || false, }; // Валидация конфигурации 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✨ API client generated successfully!\n')); } catch (error) { console.error(chalk.red('\n❌ Error:'), error instanceof Error ? error.message : error); console.error(); process.exit(1); } }); program.parse();