@hanamura/rcgen
Version:
Generate optimized React container components from configuration
110 lines (109 loc) ⢠4.59 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const commander_1 = require("commander");
const chalk_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();