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