@hanamura/rcgen
Version:
Generate optimized React container components from configuration
191 lines (190 loc) • 9.33 kB
JavaScript
;
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;
}
};