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.

136 lines (113 loc) 3.65 kB
#!/usr/bin/env node import fs from "fs"; import path from "path"; import { input, select, confirm } from "@inquirer/prompts"; import { getProjectRoot } from "./lib/project.js"; import { updateEnvFile } from "./lib/env.js"; import { addImport, readIndex, writeIndex } from "./lib/indexFile.js"; import { showHeader, showTaskDone, showWarning, showError, showFileAction, showInfo, installDeps, } from "./lib/ui.js"; function isDatabaseConfigured() { const envPath = path.join(getProjectRoot(), ".env"); return fs.existsSync(envPath) && fs.readFileSync(envPath, "utf8").includes("MONGO_URI="); } function addMongoDB(uri) { const projectRoot = getProjectRoot(); const dbContent = `import mongoose from 'mongoose'; const connectDB = async () => { try { const conn = await mongoose.connect(process.env.MONGO_URI); console.log(\`MongoDB connected: \${conn.connection.host}\`); } catch (err) { console.error(err); process.exit(1); } }; export default connectDB;`; const srcDir = path.join(projectRoot, "src"); if (!fs.existsSync(srcDir)) { fs.mkdirSync(srcDir, { recursive: true }); } fs.writeFileSync(path.join(srcDir, "db.js"), dbContent + "\n", "utf8"); showFileAction("created", "src/db.js"); addImport("import connectDB from './src/db.js';"); let indexContent = readIndex(); const dbCall = "connectDB();"; if (!indexContent.includes(dbCall)) { indexContent = indexContent.replace( "const app = express();", `${dbCall}\nconst app = express();` ); writeIndex(indexContent); } showFileAction("updated", "index.js"); updateEnvFile(path.join(projectRoot, ".env"), "MONGO_URI", uri); showFileAction("updated", ".env"); } async function main() { showHeader("add-mongo", "Configure MongoDB integration"); if (isDatabaseConfigured()) { showWarning("MongoDB is already configured. Aborting."); process.exit(0); } const method = await select({ message: "How do you want to configure MongoDB?", choices: [ { name: "Quick setup (just database name)", value: "quick" }, { name: "Paste a connection URI", value: "uri" }, ], }); let devUri; if (method === "quick") { const dbName = await input({ message: "Database name:", validate: (v) => (v.trim() ? true : "Required."), }); let ip = "127.0.0.1"; let port = "27017"; let auth = ""; const customize = await confirm({ message: "Configure IP, port, or auth? (optional)", default: false, }); if (customize) { ip = (await input({ message: "IP address:", default: "127.0.0.1" })).trim(); port = (await input({ message: "Port:", default: "27017" })).trim(); const user = (await input({ message: "Username (blank to skip):" })).trim(); if (user) { const pass = (await input({ message: "Password:" })).trim(); auth = `${user}:${pass}@`; } } devUri = `mongodb://${auth}${ip}:${port}/${dbName.trim()}`; showInfo(`URI: ${devUri}`); } else { devUri = await input({ message: "MongoDB URI:", default: "mongodb://127.0.0.1:27017/mydb", validate: (v) => v.trim().startsWith("mongodb://") || v.trim().startsWith("mongodb+srv://") ? true : "Must start with mongodb:// or mongodb+srv://", }); devUri = devUri.trim(); } console.log(); addMongoDB(devUri); await installDeps("mongoose"); showTaskDone("MongoDB integration complete", [ `URI: ${devUri}`, ]); } main().catch((err) => { if (err.name === "ExitPromptError") process.exit(0); showError(err.message); process.exit(1); });