banah
Version:
Start up your Node.js projects with ease. No need to install express, cors, or the basic things you need for a Node.js project. We got you covered.
107 lines (91 loc) • 3.85 kB
text/typescript
import fs from "fs";
import path from "path";
import { execSync } from "child_process";
import color from "colors-cli";
/**
* Creates a new TypeScript-based Node.js project with a predefined structure.
* @param projectName - The name of the project to create.
*/
function createProject(projectName: string): void {
try {
// ✅ Validate name
if (!projectName || !/^[a-zA-Z0-9_-]+$/.test(projectName)) {
console.error(
color.red(
"Invalid project name. Use only letters, numbers, underscores, or hyphens."
)
);
process.exit(1);
}
const projectPath = path.join(process.cwd(), projectName);
if (fs.existsSync(projectPath)) {
console.error(color.red(`Project "${projectName}" already exists.`));
process.exit(1);
}
console.log(color.cyan(`Creating TypeScript project: ${projectName}...`));
fs.mkdirSync(projectPath, { recursive: true });
const blueprintDir = path.join(__dirname, "../lib/blueprint");
// ✅ 1. Copy package.json with {{projectName}} replacement
const packageJsonPath = path.join(blueprintDir, "package.json");
if (fs.existsSync(packageJsonPath)) {
const pkgTemplate = fs.readFileSync(packageJsonPath, "utf-8");
const pkgContent = pkgTemplate.replace(/{{projectName}}/g, projectName);
fs.writeFileSync(path.join(projectPath, "package.json"), pkgContent);
}
// ✅ 2. Copy tsconfig.json
const tsconfigPath = path.join(blueprintDir, "tsconfig.json");
if (fs.existsSync(tsconfigPath)) {
const tsconfig = fs.readFileSync(tsconfigPath, "utf-8");
fs.writeFileSync(path.join(projectPath, "tsconfig.json"), tsconfig);
}
// ✅ 3. Copy .gitignore
const gitignorePath = path.join(blueprintDir, ".gitignore");
if (fs.existsSync(gitignorePath)) {
const gitignoreContent = fs.readFileSync(gitignorePath, "utf-8");
fs.writeFileSync(path.join(projectPath, ".gitignore"), gitignoreContent);
}
// ✅ 4. Copy README.md (with project name replacement)
const readmePath = path.join(blueprintDir, "README.md");
if (fs.existsSync(readmePath)) {
const readmeTemplate = fs.readFileSync(readmePath, "utf-8");
const readmeContent = readmeTemplate.replace(
/{{projectName}}/g,
projectName
);
fs.writeFileSync(path.join(projectPath, "README.md"), readmeContent);
}
// ✅ 5. Copy .env file
const envTemplatePath = path.join(blueprintDir, "env-template.txt");
if (fs.existsSync(envTemplatePath)) {
const envContent = fs.readFileSync(envTemplatePath, "utf-8");
fs.writeFileSync(path.join(projectPath, ".env"), envContent);
}
// ✅ 6. Create src/ folder and copy index.ts
const srcDir = path.join(projectPath, "src");
fs.mkdirSync(srcDir, { recursive: true });
const indexTSPath = path.join(blueprintDir, "index.ts");
if (fs.existsSync(indexTSPath)) {
const indexContent = fs.readFileSync(indexTSPath, "utf-8");
fs.writeFileSync(path.join(srcDir, "index.ts"), indexContent);
}
// ✅ 7. Create src/controller folder
const controllerDir = path.join(srcDir, "controller");
fs.mkdirSync(controllerDir);
console.log(color.green("Controller folder created."));
// ✅ 8. Install dependencies
process.chdir(projectPath);
console.log(color.yellow("Installing dependencies..."));
execSync("npm install", { stdio: "inherit" });
console.log(
color.green(`\nTypeScript project "${projectName}" created successfully.`)
);
console.log(
color.magenta(`\nNavigate to your project directory:\ncd ${projectName}`)
);
} catch (error) {
console.error(color.red("\nAn error occurred:"));
console.error(color.red((error as Error).message));
process.exit(1);
}
}
export default createProject;