UNPKG

@hanamura/rcgen

Version:

Generate optimized React container components from configuration

191 lines (190 loc) 9.33 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateTemplateComponents = generateTemplateComponents; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const chalk_1 = __importDefault(require("chalk")); const prettier_1 = __importDefault(require("prettier")); // Import the core templates const types_ts_tmpl_1 = __importDefault(require("../templates/types.ts.tmpl")); const utils_ts_tmpl_1 = __importDefault(require("../templates/utils.ts.tmpl")); const index_ts_tmpl_1 = __importDefault(require("../templates/index.ts.tmpl")); const useMediaQueries_ts_tmpl_1 = __importDefault(require("../templates/useMediaQueries.ts.tmpl")); // Import the component templates const Cluster_module_css_tmpl_1 = __importDefault(require("../templates/components/Cluster.module.css.tmpl")); const Cluster_tsx_tmpl_1 = __importDefault(require("../templates/components/Cluster.tsx.tmpl")); const Reel_module_css_tmpl_1 = __importDefault(require("../templates/components/Reel.module.css.tmpl")); const Reel_tsx_tmpl_1 = __importDefault(require("../templates/components/Reel.tsx.tmpl")); const Stack_module_css_tmpl_1 = __importDefault(require("../templates/components/Stack.module.css.tmpl")); const Stack_tsx_tmpl_1 = __importDefault(require("../templates/components/Stack.tsx.tmpl")); const Switcher_module_css_tmpl_1 = __importDefault(require("../templates/components/Switcher.module.css.tmpl")); const Switcher_tsx_tmpl_1 = __importDefault(require("../templates/components/Switcher.tsx.tmpl")); const Tile_module_css_tmpl_1 = __importDefault(require("../templates/components/Tile.module.css.tmpl")); const Tile_tsx_tmpl_1 = __importDefault(require("../templates/components/Tile.tsx.tmpl")); /** * Generate components from the templates */ async function generateTemplateComponents(config, options) { const { coreDir, componentsDir } = options; await generateCoreFiles(config, coreDir); await generateComponentFiles(config, componentsDir); } /** * Generate the core files */ async function generateCoreFiles(config, coreDir) { console.log(chalk_1.default.blue('\nGenerating core files:')); // Generate the types.ts file { const content = (0, types_ts_tmpl_1.default)(config); const filePath = path_1.default.join(coreDir, 'types.ts'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated types.ts`); } // Generate the utils.ts file { const content = (0, utils_ts_tmpl_1.default)(config); const filePath = path_1.default.join(coreDir, 'utils.ts'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated utils.ts`); } // Generate the index.ts file { const content = (0, index_ts_tmpl_1.default)(config); const filePath = path_1.default.join(coreDir, 'index.ts'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated index.ts`); } // Generate the useMediaQueries.ts file { const content = (0, useMediaQueries_ts_tmpl_1.default)(config); const filePath = path_1.default.join(coreDir, 'useMediaQueries.ts'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated useMediaQueries.ts`); } } /** * Generate the component files */ async function generateComponentFiles(config, componentsDir) { console.log(chalk_1.default.blue('\nGenerating component files:')); if (config.containers.includes('Cluster')) { { const content = (0, Cluster_tsx_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Cluster.tsx'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated Cluster.tsx`); } { const content = (0, Cluster_module_css_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Cluster.module.css'); await formatAndWriteFile(filePath, content, 'css'); console.log(`${chalk_1.default.green('✓')} Generated Cluster.module.css`); } } if (config.containers.includes('Reel')) { { const content = (0, Reel_tsx_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Reel.tsx'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated Reel.tsx`); } { const content = (0, Reel_module_css_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Reel.module.css'); await formatAndWriteFile(filePath, content, 'css'); console.log(`${chalk_1.default.green('✓')} Generated Reel.module.css`); } } if (config.containers.includes('Stack')) { { const content = (0, Stack_tsx_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Stack.tsx'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated Stack.tsx`); } { const content = (0, Stack_module_css_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Stack.module.css'); await formatAndWriteFile(filePath, content, 'css'); console.log(`${chalk_1.default.green('✓')} Generated Stack.module.css`); } } if (config.containers.includes('Switcher')) { { const content = (0, Switcher_tsx_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Switcher.tsx'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated Switcher.tsx`); } { const content = (0, Switcher_module_css_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Switcher.module.css'); await formatAndWriteFile(filePath, content, 'css'); console.log(`${chalk_1.default.green('✓')} Generated Switcher.module.css`); } } if (config.containers.includes('Tile')) { { const content = (0, Tile_tsx_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Tile.tsx'); await formatAndWriteFile(filePath, content, 'typescript'); console.log(`${chalk_1.default.green('✓')} Generated Tile.tsx`); } { const content = (0, Tile_module_css_tmpl_1.default)(config); const filePath = path_1.default.join(componentsDir, 'Tile.module.css'); await formatAndWriteFile(filePath, content, 'css'); console.log(`${chalk_1.default.green('✓')} Generated Tile.module.css`); } } } /** * Format and write a file */ const formatAndWriteFile = async (filePath, content, parser) => { // Create directory if it doesn't exist const dir = path_1.default.dirname(filePath); if (!fs_1.default.existsSync(dir)) { fs_1.default.mkdirSync(dir, { recursive: true }); } try { // Validate content if (!content || typeof content !== 'string') { throw new Error(`Invalid content provided for ${filePath} (type: ${typeof content})`); } try { // Format the file contents with Prettier const formattedContent = await prettier_1.default.format(content, { parser }); fs_1.default.writeFileSync(filePath, formattedContent, 'utf8'); return true; } catch (formattingError) { // If Prettier formatting fails, log and write unformatted content const errorMessage = formattingError instanceof Error ? formattingError.message : String(formattingError); console.error(chalk_1.default.yellow(`Warning: Couldn't format file (writing unformatted): ${errorMessage}`)); // Write unformatted content as fallback fs_1.default.writeFileSync(filePath, content, 'utf8'); return true; } } catch (error) { // Handle severe errors that prevent writing the file const errorMessage = error instanceof Error ? error.message : String(error); console.error(chalk_1.default.red(`Error writing file ${filePath}: ${errorMessage}`)); // Try to write a minimal error file try { const errorContent = `// Error creating file: ${errorMessage}\n// Timestamp: ${new Date().toISOString()}`; fs_1.default.writeFileSync(filePath, errorContent, 'utf8'); } catch (writeError) { console.error(chalk_1.default.red(`Failed to write even error content to ${filePath}`)); } return false; } };