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
117 lines (116 loc) • 4.34 kB
JavaScript
// src/commands/generate-backend.ts
import fs from 'fs';
import { validateName, ensureDirectoryExists, generateFileContent, createFilePath, logError, logWarning, logGenerationStart, logFileCreated, logApiStructure, logGenerationComplete } from '../utils/backend-utils.js';
// Import all templates
import { controllerTemplateJS, controllerTemplateTS, serviceTemplateJS, serviceTemplateTS, modelTemplateJS, modelTemplateTS, dtoTemplateJS, dtoTemplateTS, middlewareTemplateJS, middlewareTemplateTS, jwtMiddlewareTemplateJS, jwtMiddlewareTemplateTS, routeTemplateJS, routeTemplateTS } from '../templates/backend/index.js';
// Template mapping
const templates = {
js: {
controller: controllerTemplateJS,
service: serviceTemplateJS,
model: modelTemplateJS,
dto: dtoTemplateJS,
middleware: middlewareTemplateJS,
jwtMiddleware: jwtMiddlewareTemplateJS,
route: routeTemplateJS
},
ts: {
controller: controllerTemplateTS,
service: serviceTemplateTS,
model: modelTemplateTS,
dto: dtoTemplateTS,
middleware: middlewareTemplateTS,
jwtMiddleware: jwtMiddlewareTemplateTS,
route: routeTemplateTS
}
};
export async function generateBackendFile(type, name, fileType, options = {}) {
try {
// Validate name
if (!validateName(name)) {
logError('❌ Invalid name. Use only letters, numbers, hyphens and underscores. Must start with a letter.');
process.exit(1);
}
// Prepare template options
const templateOptions = {
middlewareType: options.middlewareType || (options.jwt ? 'jwt' : 'default')
};
logGenerationStart(type, name, fileType);
if (type === 'api') {
// Generate all API files including routes
await generateApiFiles(name, fileType, templateOptions);
}
else {
// Generate single file
const success = await generateSingleFile(type, name, fileType, templateOptions);
if (success) {
logGenerationComplete(type, name);
}
}
}
catch (error) {
logError('\n❌ Backend file generation failed');
if (error instanceof Error) {
logError(error.message);
}
process.exit(1);
}
}
async function generateApiFiles(name, fileType, options) {
const fileCategories = [
'controller',
'service',
'model',
'dto',
'route' // Added route generation
];
let allSuccess = true;
const generatedFiles = [];
for (const category of fileCategories) {
const result = await generateSingleFile(category, name, fileType, options);
if (result) {
const { filePath } = createFilePath(category, name, fileType);
generatedFiles.push(filePath);
}
else {
allSuccess = false;
}
}
if (allSuccess) {
logApiStructure(name, fileType);
}
}
async function generateSingleFile(type, name, fileType, options = {}) {
try {
const { dirPath, fileName, filePath } = createFilePath(type, name, fileType);
// Create directory if it doesn't exist
ensureDirectoryExists(dirPath);
// Check if file already exists
if (fs.existsSync(filePath)) {
logWarning(`⚠️ File ${fileName} already exists!`);
return false;
}
// Get the appropriate template
const template = getTemplate(type, fileType, options);
if (!template) {
throw new Error(`Template not found for ${type} with ${fileType}`);
}
// Generate content
const content = generateFileContent(template, name);
// Write file
fs.writeFileSync(filePath, content, 'utf8');
logFileCreated(fileName, dirPath);
return true;
}
catch (error) {
logError(`Failed to generate ${type}: ${error instanceof Error ? error.message : 'Unknown error'}`);
return false;
}
}
function getTemplate(type, fileType, options = {}) {
const templateSet = templates[fileType];
if (type === 'middleware' && options.middlewareType === 'jwt') {
return templateSet.jwtMiddleware;
}
return templateSet[type] || '';
}