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
JavaScript
// 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);`));
}
}