node-express-template
Version:
npm package to get ready to go Node/Express code template
128 lines (108 loc) • 3.96 kB
JavaScript
import inquirer from "inquirer";
import fs from "fs-extra";
import { execSync } from "child_process";
import {
ejsContent,
envData,
configData,
appContent,
connectMongo,
serverContent,
} from "./es_modules.js";
async function main() {
console.log("Welcome to Node-Express Template!");
// Ask if the user wants to use CommonJS or ESM
const { moduleType } = await inquirer.prompt({
type: "list",
name: "moduleType",
message: "Do you want to use ES Module?",
choices: ["Yes", "No"],
default: "Yes",
});
// Ask which packages to install
const { packages } = await inquirer.prompt({
type: "input",
name: "packages",
message:
"Enter the packages you want to install (comma or space-separated): like express,cors or mongoose dotenv",
default: "express, dotenv",
});
const packageList = packages.split(/[\s,]+/).filter(Boolean);
// Initialize the project directory
console.log("Initializing project...");
execSync("npm init -y", { stdio: "inherit" });
// Add type: module if ESM is selected
if (moduleType === "Yes") {
const packageJson = JSON.parse(fs.readFileSync("package.json", "utf-8"));
packageJson.type = "module";
fs.writeFileSync("package.json", JSON.stringify(packageJson, null, 2));
console.log('Added "type: module" to package.json');
}
// Install selected packages
console.log("Installing packages...");
execSync(`npm install ${packageList.join(" ")}`, { stdio: "inherit" });
execSync(`npm install -D nodemon`, { stdio: "inherit" });
// Create project folder structure inside "src"
const isEjsInstalled = packageList.includes("ejs");
// Define folder structure
const folders = [
"controllers",
"config",
"routes",
"models",
"middlewares",
"utils",
"services",
];
// Add "views" if ejs is installed
if (isEjsInstalled) {
folders.push("views");
}
// Create the "src" directory and its subfolders
console.log("Setting up folder structure inside src...");
const srcDir = "src"; // Root src directory
fs.ensureDirSync(srcDir);
fs.writeFileSync(`${srcDir}/config.js`, configData(moduleType));
folders.forEach((folder) => {
const folderPath = `${srcDir}/${folder}`;
fs.ensureDirSync(folderPath);
if (folder === "views" && isEjsInstalled) {
fs.writeFileSync(`${folderPath}/home.ejs`, ejsContent);
}
if (folder === "services" && packageList.includes("mongoose")) {
fs.ensureDirSync(folderPath);
fs.writeFileSync(
`${folderPath}/connectMongo.js`,
connectMongo(moduleType)
);
}
if (folder === "config") {
if (packageList.includes("mongoose")) {
let addDataToEnv = `${envData}\nMONGO_URI="mongodb://127.0.0.1:27017/"`;
fs.writeFileSync(`${folderPath}/config.env`, addDataToEnv);
} else {
fs.writeFileSync(`${folderPath}/config.env`, envData);
}
}
});
console.log("Folders created:", folders.join(", "));
// Add a basic Express app file inside the src folder
// Save the app file in src directory
fs.writeFileSync(`${srcDir}/app.js`, appContent(moduleType, packageList));
fs.writeFileSync(`${srcDir}/server.js`, serverContent(moduleType));
console.log("Basic Express app created in src/server.js");
// Add start and dev scripts to package.json
const packageJson = JSON.parse(fs.readFileSync("package.json", "utf-8"));
packageJson.scripts = {
...packageJson.scripts,
start: "cd src && node server.js",
dev: "cd src && nodemon server.js",
};
fs.writeFileSync("package.json", JSON.stringify(packageJson, null, 2));
console.log('Added "start" and "dev" scripts to package.json');
console.log("Setup complete! 🎉");
}
main().catch((err) => {
console.error("Error:", err.message);
});