UNPKG

@hanamura/rcgen

Version:

Generate optimized React container components from configuration

109 lines (107 loc) • 4.51 kB
#!/usr/bin/env node 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const fs_1 = tslib_1.__importDefault(require("fs")); const path_1 = tslib_1.__importDefault(require("path")); const commander_1 = require("commander"); const chalk_1 = tslib_1.__importDefault(require("chalk")); const template_generator_1 = require("./template-generator"); const validator_1 = require("./validator"); /** * Create the CLI program */ function createProgram() { return new commander_1.Command() .name('rcgen') .description('Generate optimized React container components from configuration') .version('0.1.0') .requiredOption('-c, --config <path>', 'path to configuration file (JSON)') .option('-o, --outdir <directory>', 'output directory for generated files', './dist') .option('-f, --force', 'overwrite existing files without confirmation', false) .option('-v, --verbose', 'enable verbose output', false); } /** * Parse the configuration file */ function parseConfig(configPath) { if (!fs_1.default.existsSync(configPath)) { console.error(chalk_1.default.red(`Error: Configuration file not found at ${configPath}`)); process.exit(1); } const fileContent = fs_1.default.readFileSync(configPath, 'utf8'); try { if (configPath.endsWith('.json')) { return JSON.parse(fileContent); } else { console.error(chalk_1.default.red('Error: Configuration file must be JSON format')); process.exit(1); } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error(chalk_1.default.red(`Error parsing configuration file: ${errorMessage}`)); process.exit(1); } } /** * Main function */ async function main() { try { // Create and parse the program const program = createProgram(); program.parse(process.argv); const options = program.opts(); console.log(chalk_1.default.bold(`\nšŸš€ React Containers Generator\n`)); // Read and parse the configuration file const configPath = path_1.default.resolve(process.cwd(), options.config); console.log(`Reading configuration from: ${chalk_1.default.cyan(configPath)}`); const config = parseConfig(configPath); // Configuration is used as-is from the file // Validate the configuration console.log('Validating configuration...'); const validationResult = (0, validator_1.validateConfig)(config); if (!validationResult.valid) { console.error(chalk_1.default.red(`Configuration validation failed:`)); validationResult.errors.forEach((error) => { console.error(chalk_1.default.red(`- ${error}`)); }); process.exit(1); } console.log(chalk_1.default.green('āœ“ Configuration is valid')); // Create output directories const outputDir = path_1.default.resolve(process.cwd(), options.outdir); const coreDir = outputDir; const componentsDir = path_1.default.join(outputDir, 'components'); // Create directories if they don't exist for (const dir of [outputDir, coreDir, componentsDir]) { if (!fs_1.default.existsSync(dir)) { console.log(`Creating directory: ${chalk_1.default.cyan(dir)}`); fs_1.default.mkdirSync(dir, { recursive: true }); } } // Generate the components console.log(`\nGenerating container components in: ${chalk_1.default.cyan(outputDir)}`); await (0, template_generator_1.generateTemplateComponents)(config, { outputDir, coreDir, componentsDir, force: options.force, verbose: options.verbose, }); console.log(chalk_1.default.green('\nāœ… Container components generated successfully!')); console.log(`\nNext steps: - Import your components from ${chalk_1.default.cyan(outputDir)} - Use the components in your React application - Customize with your own spacing variables\n`); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error(chalk_1.default.red(`\nāŒ Error generating container components: ${errorMessage}`)); console.error(error); process.exit(1); } } main();