UNPKG

initrajs

Version:

⚔ InitraJS - JavaScript CLI Toolkit | Lightning-fast scaffolding for React, Next.js, Node.js with TypeScript | The future of JavaScript development | 10x faster than create-react-app | Ultimate developer productivity tool

105 lines (104 loc) • 4.19 kB
// src/utils/backend-utils.ts import fs from 'fs'; import path from 'path'; import chalk from 'chalk'; // Validation export function validateName(name) { return /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name); } // Directory management export function ensureDirectoryExists(dirPath) { if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath, { recursive: true }); } } // File path creation export function createFilePath(type, name, fileType) { const baseDir = 'src'; const dirMap = { controller: path.join(baseDir, 'controllers'), service: path.join(baseDir, 'services'), model: path.join(baseDir, 'models'), dto: path.join(baseDir, 'dto'), middleware: path.join(baseDir, 'middleware'), route: path.join(baseDir, 'routes') }; const dirPath = dirMap[type]; const fileName = `${toKebabCase(name)}.${type}.${fileType}`; const filePath = path.join(dirPath, fileName); return { dirPath, fileName, filePath }; } // Content generation export function generateFileContent(template, name) { const replacements = { '{{PascalName}}': toPascalCase(name), '{{camelName}}': toCamelCase(name), '{{kebabName}}': toKebabCase(name), '{{lowerName}}': name.toLowerCase(), '{{UPPER_NAME}}': name.toUpperCase() }; let content = template; Object.entries(replacements).forEach(([placeholder, replacement]) => { content = content.replace(new RegExp(placeholder, 'g'), replacement); }); return content; } // String transformation utilities function toPascalCase(str) { return str .replace(/[-_]/g, ' ') .replace(/\b\w/g, char => char.toUpperCase()) .replace(/\s/g, ''); } function toCamelCase(str) { const pascal = toPascalCase(str); return pascal.charAt(0).toLowerCase() + pascal.slice(1); } function toKebabCase(str) { return str .replace(/([A-Z])/g, '-$1') .replace(/[-_\s]+/g, '-') .toLowerCase() .replace(/^-/, ''); } // Logging utilities export function logError(message) { console.log(chalk.red(message)); } export function logWarning(message) { console.log(chalk.yellow(message)); } export function logGenerationStart(type, name, fileType) { if (type === 'api') { console.log(chalk.cyan(`\nšŸš€ Generating full API for "${name}" (${fileType.toUpperCase()})...\n`)); } else { console.log(chalk.cyan(`\nšŸš€ Generating ${type} for "${name}" (${fileType.toUpperCase()})...\n`)); } } export function logFileCreated(fileName, dirPath) { console.log(chalk.green(`āœ… Created: ${fileName} in ${dirPath}`)); } export function logApiStructure(name, fileType) { const kebabName = toKebabCase(name); const ext = fileType; console.log(chalk.magenta.bold(`\nšŸ“ Generated API structure for "${name}":`)); console.log(chalk.gray(`ā”œā”€ā”€ controllers/${kebabName}.controller.${ext}`)); console.log(chalk.gray(`ā”œā”€ā”€ services/${kebabName}.service.${ext}`)); console.log(chalk.gray(`ā”œā”€ā”€ models/${kebabName}.model.${ext}`)); console.log(chalk.gray(`ā”œā”€ā”€ dto/${kebabName}.dto.${ext}`)); console.log(chalk.gray(`└── routes/${kebabName}.route.${ext}`)); console.log(chalk.cyan.bold(`\nšŸŽ‰ API "${name}" generated successfully!`)); console.log(chalk.yellow(`\nšŸ’” Don't forget to register your routes in your main app file:`)); console.log(chalk.white(` import ${toCamelCase(name)}Router from './routes/${kebabName}.route.${ext === 'ts' ? '' : '.js'}';`)); console.log(chalk.white(` app.use('/api/${kebabName}', ${toCamelCase(name)}Router);`)); } export function logGenerationComplete(type, name) { console.log(chalk.green.bold(`\nšŸŽ‰ ${type} "${name}" generated successfully!`)); if (type === 'route') { const kebabName = toKebabCase(name); console.log(chalk.yellow(`\nšŸ’” Don't forget to register your route in your main app file:`)); console.log(chalk.white(` import ${toCamelCase(name)}Router from './routes/${kebabName}.route';`)); console.log(chalk.white(` app.use('/api/${kebabName}', ${toCamelCase(name)}Router);`)); } }