outbreak-cli
Version:
🚀 Outbreak CLI - A fast, customizable developer command-line tool to scaffold nodejs projects, and boost productivity.
169 lines (146 loc) • 4.69 kB
JavaScript
import {
intro,
outro,
isCancel,
cancel,
text,
multiselect,
spinner,
log,
confirm,
} from "@clack/prompts";
import color from "picocolors";
import path from "path";
import { execa } from "execa";
import fse from "fs-extra";
const appJsData = `
import express from "express"
const app = express();
const PORT = process.env.PORT || 5000;
// Middleware
app.use(express.json());
// Routes
app.get("/", (req, res) => {
res.send("🚀 Server is running!");
});
app.listen(PORT, () => {
console.log(\`✅ Server started on http://localhost:\${PORT}\`);
});
process.on("SIGINT", () => {
console.log("🛑 Caught interrupt signal (Ctrl+C). Closing server...");
server.close(() => {
console.log("✅ Server stopped cleanly.");
process.exit(0);
});
});
`;
export async function nodejs(){
intro(color.bgCyan(color.black(" Welcome to Nikhil Mishra CLI ")));
// Ask for folder name
const folderName = await text({
message: "📂 Enter your project folder name:",
placeholder: "my-app",
validate(value) {
if (value.length === 0) return "Folder name is required.";
},
});
if (isCancel(folderName)) {
cancel("❌ Operation cancelled by user.");
process.exit(0);
}
// Ask which subfolders to create
const selectFolder = await multiselect({
message: "📦 Select sub-folders to include:",
options: [
{ value: "src", label: "src" },
{ value: "config", label: "config" },
{ value: "controller", label: "controller", hint: "recommended" },
{ value: "middleware", label: "middleware" },
{ value: "router", label: "router", hint: "recommended" },
{ value: "models", label: "models", hint: "recommended" },
{ value: "utils", label: "utils" },
{ value: "services", label: "services" },
{ value: "validation", label: "validation" },
{ value: "tests", label: "tests" },
{ value: "lib", label: "lib" },
{ value: "public", label: "public" },
{ value: "scripts", label: "scripts" },
{ value: "migration", label: "migration" },
],
});
if (isCancel(selectFolder)) {
cancel("❌ Operation cancelled by user.");
process.exit(0);
}
const pathName = path.join(process.cwd(), folderName);
const s = spinner();
try {
s.start("Creating project structure...");
await fse.mkdirp(pathName.toLowerCase());
for (const folder of selectFolder) {
await fse.mkdirp(path.join(pathName, folder).toLowerCase());
}
// Write starter app.js
await fse.writeFile(
path.join(pathName, "app.js"),
appJsData.trim(),
"utf-8"
);
s.stop("✅ Project structure created.");
// Initialize npm & install deps
const installDeps = await confirm({
message:
"Do you want to install dependencies (express, helmet, nodemon)?",
initialValue: true,
});
if (isCancel(installDeps)) {
cancel("❌ Operation cancelled by user.");
process.exit(0);
}
if (installDeps) {
s.start("📥 Initializing project...");
await execa("npm", ["init", "-y"], { cwd: pathName });
// Modify package.json
const packageJsonPath = path.join(pathName, "package.json");
const pkg = await fse.readJson(packageJsonPath);
pkg.type = "module";
pkg.scripts = {
start: "node app.js",
dev: "nodemon app.js",
};
await fse.writeJson(packageJsonPath, pkg, { spaces: 2 });
// Install dependencies
s.message("Installing dependencies...");
await execa("npm", ["i", "express", "helmet", "nodemon"], {
cwd: pathName,
});
s.stop("✅ Dependencies installed.");
}
log.success(`🎉 Project '${folderName}' is ready!`);
log.step("Next steps:");
console.log(`
👉 cd ${folderName}
👉 npm run dev
`);
outro(color.green("✨ Setup complete. Happy coding!"));
} catch(error) {
console.log(error)
process.exit(1)
}
}
export async function vite() {
intro(color.bgCyan(color.black("Welcome to Nikhil Mishra CLI")))
const folderName = await text({
message: "Enter the folder name ?",
placeholder: "my-folder",
validate(item) {
if (item.length === 0) return "Folder name is required.";
}
})
const s = spinner()
s.start("Creating folder...")
const pathName = path.join(process.cwd(), folderName)
await new Promise((resolve) => setTimeout(resolve, 1000))
console.log("\n",pathName)
s.stop("Created folder.")
}