namune
Version:
A Quick Setup Express API.
199 lines (166 loc) • 5.74 kB
JavaScript
#!/usr/bin/env node
const fs = require("fs");
const path = require("path");
const { exec } = require("child_process");
const namunePkg = require(path.join(__dirname, "..", "package.json"));
const namuneVersion = namunePkg.version;
function createProjectStructure(projectName) {
// Create a project folder
const targetDir = path.resolve(process.cwd(), projectName);
if (fs.existsSync(targetDir)) {
console.error(`❌ Folder "${projectName}" already exists.`);
process.exit(1);
}
fs.mkdirSync(targetDir);
console.log(`📁 Created project folder: ${projectName}`);
const folders = ["routes", "models"];
// For creating package.json file
const packageJson = {
name: projectName,
version: "1.0.0",
description: "",
main: "index.js",
scripts: {
test: 'echo "Error: no test specified" && exit 1',
start: "node index.js",
dev: "nodemon index.js",
},
keywords: [],
author: "",
license: "ISC",
dependencies: {
namune: `^${namuneVersion}`,
},
};
// Files to dynamically create with boilerplate
const files = {
".gitignore": "node_modules\n",
".env": `DATABASE_NAME=myapp\n`,
"deps.js": `module.exports = {
global: {},
models: {},
utils: {},
hooks: {}
};
`,
"index.js": `require("dotenv").config();
const express = require("express");
const app = express();
const http = require("http").createServer(app);
const MidsConfigs = require("namune/config/mids-configs");
const mid_configs = new MidsConfigs(app);
mid_configs.registerMiddlewares({
dbConfig: { database_name: process.env.DATABASE_NAME || "myapp" },
usePassportLogin: true,
passportConfig: {
// Add your seperate custom local strategies for login authentication to the list
// Seperate strategy name with one dash (e.g user-local)
strategyList: [
{
strategyName: "user-local",
model: require("./models/User"),
usernameField: "email", // Change relevant logic in routes/auth/api.routes.js to match your username field
verifyAccount: (user) => { // For additional validation
if (!user.accountActive) return "Please verify your email first.";
return null;
},
},
],
},
});
app.use("/v1/", require("namune/routes/api"));
// This will fire if the requested route/url is not defined
app.get("/{*any}", (req, res) => {
return res.json({ success: false, message: "That API route is not found!", data: null });
});
const PORT = process.env.PORT || 8000;
http.listen(PORT, () => {
console.log(\`Server running on port \${PORT}\`);
});
`,
"package.json": JSON.stringify(packageJson, null, 2),
};
// Create folders
folders.forEach((folder) => {
const fullPath = path.join(targetDir, folder);
fs.mkdirSync(fullPath);
console.log(`📂 Created folder: ${folder}`);
});
// Create files
Object.entries(files).forEach(([filename, content]) => {
const fullPath = path.join(targetDir, filename);
fs.writeFileSync(fullPath, content);
console.log(`📄 Created file: ${filename}`);
});
// Create routes/foo/api.routes.js
const fooRouteDir = path.join(targetDir, "routes", "foo");
fs.mkdirSync(fooRouteDir, { recursive: true });
const fooRouteContent = `class FooRoutes {
constructor(router, dependencies) {
this.router = router;
this.dependencies = dependencies;
}
getFoo(req, res) {
return res
.status(200)
.json({ success: true, message: "Successfully found foo!", data: null });
}
// Add your other methods
registerRoutes() {
this.router.get("/", this.getFoo);
}
}
module.exports = FooRoutes;
`;
fs.writeFileSync(path.join(fooRouteDir, "api.routes.js"), fooRouteContent);
console.log("📄 Created file: routes/foo/api.routes.js");
// Create the user model
const userModelDir = path.join(targetDir, "models");
fs.mkdirSync(userModelDir, { recursive: true });
const userModelContent = `const mongoose = require("mongoose");
const userSchema = new mongoose.Schema(
{
fullName: { type: String, required: true },
password: { type: String, required: true }, // Required for auth
email: { type: String, required: true, unique: true },
accountActive: { type: Boolean, default: false }, // Required for passport-local strategy
token: { type: String }, // Required for auth
},
{
timestamps: true,
}
);
module.exports = mongoose.model("User", userSchema);
`;
fs.writeFileSync(path.join(userModelDir, "User.js"), userModelContent);
console.log("📄 Created file: models/User.js");
console.log("✅ Project structure initialized.\n");
runNpmInstall(targetDir);
}
function runNpmInstall(targetDir) {
console.log("📦 Installing dependencies...");
exec("npm install", { cwd: targetDir }, (error, stdout, stderr) => {
if (error) {
console.error(`❌ Error installing dependencies: ${error.message}`);
return;
}
if (stderr) {
console.error(`⚠️ npm stderr: ${stderr}`);
}
console.log(stdout);
console.log("✅ Dependencies installed.");
});
}
const command = process.argv[2];
const projectName = process.argv[3];
if (command === "create") {
if (!projectName) {
console.error(
"❌ Please provide a project name.\nUsage: nmn create <projectname>"
);
process.exit(1);
}
createProjectStructure(projectName);
} else {
console.log("Unknown command. Usage: nmn create <projectname>");
}