express-api-template
Version:
Project for quick express.js setup
85 lines (77 loc) ⢠3.13 kB
JavaScript
import { exec } from "node:child_process";
import fs from "node:fs";
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import inquirer from "inquirer";
import ora from "ora";
import createDirectoryContents from "./createDirectoryContents.js";
const CURR_DIR = process.cwd();
const __dirname = dirname(fileURLToPath(import.meta.url));
const STRUCTURE_CHOICES = {
"MVC (Model-View-Controller)": "MVC",
"Scalable (Modular)": "Scalable",
};
const QUESTIONS = [
{
name: "project-name",
type: "input",
message: "What should your project folder be called?",
default: "my-express-api",
validate: (input) => {
if (/^([A-Za-z\-_\d])+$/.test(input)) return true;
return "Project name can only include letters, numbers, underscores, and hyphens.";
},
},
{
name: "project-choice",
type: "list",
message: "Choose a project structure:",
choices: Object.keys(STRUCTURE_CHOICES),
},
{
name: "language-choice",
type: "confirm",
message: "Would you like to use TypeScript?",
default: false,
},
{
name: "install-packages",
type: "confirm",
message: "Install npm dependencies after setup?",
default: true,
},
];
console.log("\n\x1b[36m%s\x1b[0m", "Welcome to Express API Template CLI š\n");
inquirer.prompt(QUESTIONS).then((answers) => {
const projectName = answers["project-name"];
const projectLanguage = answers["language-choice"] ? "Typescript" : "Javascript";
const projectChoice = `${projectLanguage}-${STRUCTURE_CHOICES[answers["project-choice"]]}`;
const templatePath = `${__dirname}/templates/${projectChoice}`;
const shouldInstallPackages = answers["install-packages"];
if (fs.existsSync(`${CURR_DIR}/${projectName}`)) {
console.log("\x1b[31m%s\x1b[0m", `Error: Folder '${projectName}' already exists. Choose a different name.\n`);
return process.exit(1);
}
fs.mkdirSync(`${CURR_DIR}/${projectName}`);
createDirectoryContents(templatePath, projectName);
if (shouldInstallPackages) {
const spinner = ora("Installing packages...").start();
exec("npm install", { cwd: `${CURR_DIR}/${projectName}` }, (error) => {
spinner.stop();
if (error) {
console.error(`Error installing dependencies: ${error.message}`);
return;
}
console.log("\n\x1b[36m%s\x1b[0m", "š Your Express API project is ready!");
console.log("\x1b[32m%s\x1b[0m", `š cd ${projectName}`);
console.log("\x1b[32m%s\x1b[0m", "š npm run dev");
console.log("\x1b[33m%s\x1b[0m", "⨠Happy coding!\n");
});
} else {
console.log("\n\x1b[36m%s\x1b[0m", "\nš Your Express API project is ready!");
console.log("\x1b[32m%s\x1b[0m", `š cd ${projectName}`);
console.log("\x1b[32m%s\x1b[0m", "š npm run dev");
console.log("\x1b[33m%s\x1b[0m", "⨠Happy coding!\n");
}
});