UNPKG

myex-cli

Version:

Opinionated Express.js framework with CLI tools

100 lines (82 loc) 3.19 kB
import path from 'path'; import fs from 'fs-extra'; import chalk from 'chalk'; import ora from 'ora'; import { fileURLToPath } from 'url'; import ejs from 'ejs'; import { camelCase } from '../utils/string-utils.js'; // Convert ES Module path const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const templatesDir = path.resolve(__dirname, '../templates/middleware'); /** * Generate a new middleware file * @param {string} name - Middleware name */ export async function generateMiddleware(name) { const spinner = ora(`Generating middleware: ${chalk.blue(name)}`).start(); try { // Ensure proper casing const middlewareName = camelCase(name) + 'Middleware'; const middlewareFileName = `${camelCase(name)}.middleware.js`; const destPath = path.join(process.cwd(), 'src', 'middlewares', middlewareFileName); // Check if middleware already exists if (fs.existsSync(destPath)) { spinner.warn(chalk.yellow(`Middleware ${middlewareFileName} already exists. Skipping.`)); return; } // Load template const templateFile = path.join(templatesDir, 'middleware.template.ejs'); const template = await fs.readFile(templateFile, 'utf8'); // Render template const content = ejs.render(template, { middlewareName, middlewareNameCamel: camelCase(name) + 'Middleware', name: camelCase(name) }); // Create middleware file await fs.ensureDir(path.dirname(destPath)); await fs.writeFile(destPath, content, 'utf8'); // Update middlewares index.js to export the new middleware await updateMiddlewaresIndex(name); spinner.succeed(chalk.green(`Middleware generated: ${destPath}`)); } catch (error) { spinner.fail(chalk.red(`Failed to generate middleware: ${error.message}`)); } } /** * Update the middlewares index.js file to export the new middleware * @param {string} name - Middleware name */ async function updateMiddlewaresIndex(name) { const indexPath = path.join(process.cwd(), 'src', 'middlewares', 'index.js'); // Create the index file if it doesn't exist if (!fs.existsSync(indexPath)) { await fs.ensureDir(path.dirname(indexPath)); await fs.writeFile(indexPath, '', 'utf8'); } // Read existing file let content = await fs.readFile(indexPath, 'utf8'); // Import and export statements to add const middlewareName = camelCase(name) + 'Middleware'; const importStatement = `import { ${middlewareName} } from './${camelCase(name)}.middleware.js';`; // Check if import already exists if (content.includes(importStatement)) { return; // Already imported } // Add import statement content += `\\n${importStatement}\\n`; // Add export statement if (content.includes('export {')) { // Update existing export statement content = content.replace( /export\s*{([^}]*)}/, (match, exports) => `export {${exports}, ${middlewareName}}` ); } else { // Add new export statement content += `\\nexport { ${middlewareName} };\\n`; } // Write updated content back to file await fs.writeFile(indexPath, content, 'utf8'); }