UNPKG

4bnode

Version:

4bnode is a CLI-powered backend development platform with a built-in visual dashboard to generate, manage, and test Node.js/Express APIs faster.

115 lines (95 loc) 3 kB
#!/usr/bin/env node import path from "path"; import { select } from "@inquirer/prompts"; import { toPascalCase } from "./lib/names.js"; import { listRoutes, listModels, getModelSchema } from "./lib/project.js"; import { getRouteFilePath, addImportToRoute, insertCodeIntoRoute, detectHttpMethod, getRequestDataSource, } from "./lib/routeFile.js"; import { showHeader, showTaskDone, showError, showFileAction, installDeps, } from "./lib/ui.js"; async function main() { showHeader("add-mongo-insert", "Add data insertion route"); const routeFiles = listRoutes(); if (routeFiles.length === 0) { showError("No route files found in src/routes."); process.exit(1); } const modelFiles = listModels(); if (modelFiles.length === 0) { showError("No model files found in src/models."); process.exit(1); } const selectedRoute = await select({ message: "Select route file to modify:", choices: routeFiles.map((f) => ({ name: f, value: f })), }); const selectedModelFile = await select({ message: "Select model file to use:", choices: modelFiles.map((f) => ({ name: f, value: f })), }); const modelName = path.basename(selectedModelFile, ".js"); const pascalName = toPascalCase(modelName); const fields = getModelSchema(modelName); if (fields.length === 0) { showError("No fields found in the selected model."); process.exit(1); } console.log(); const routeFilePath = getRouteFilePath(selectedRoute); const method = detectHttpMethod(routeFilePath); const dataSource = getRequestDataSource(method); let importBlock = `import ${pascalName} from '../models/${modelName}.js';`; let passwordLogic = ""; if (fields.includes("password")) { importBlock = `import bcrypt from 'bcrypt';\n${importBlock}`; passwordLogic = ` if (newData.password) { const salt = await bcrypt.genSalt(10); newData.password = await bcrypt.hash(newData.password, salt); }`; } addImportToRoute(routeFilePath, importBlock); const fieldAssignments = fields .map((f) => ` ${f}: ${dataSource}.${f}`) .join(",\n"); const insertCode = ` router.post('/create', async (req, res) => { const newData = { ${fieldAssignments} }; ${passwordLogic} try { const newDocument = new ${pascalName}(newData); await newDocument.save(); res.json({ message: 'Data inserted successfully', data: newDocument }); } catch (err) { console.error(err); res.status(500).json({ message: 'Server error' }); } });`; insertCodeIntoRoute(routeFilePath, insertCode); showFileAction("updated", `src/routes/${selectedRoute}`); if (fields.includes("password")) { await installDeps("bcrypt"); } showTaskDone("Insert route added", [ `Route: POST /create in ${selectedRoute}`, `Model: ${modelName}`, `Fields: ${fields.join(", ")}`, ]); } main().catch((err) => { if (err.name === "ExitPromptError") process.exit(0); showError(err.message); process.exit(1); });