UNPKG

tynode

Version:

A CLI to quickly scaffold a Node.js TypeScript boilerplate with Express, Mongoose, and more.

100 lines (99 loc) • 5.11 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.enterProjectName = void 0; const inquirer_1 = __importDefault(require("inquirer")); const chalk_1 = __importDefault(require("chalk")); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const child_process_1 = require("child_process"); // šŸ” Boilerplate imports const env_1 = require("./boilerplate/env"); const main_1 = require("./boilerplate/main"); const package_json_1 = require("./boilerplate/package-json"); const tsconfig_1 = require("./boilerplate/tsconfig"); // šŸŽÆ Prompt project name with validation const enterProjectName = async () => { const { projectName } = await inquirer_1.default.prompt([ { type: 'input', name: 'projectName', message: chalk_1.default.cyanBright('šŸ‘‰ Enter your project name: (type exit to close)'), validate: (input) => { const trimmed = input.trim(); if (!trimmed) return chalk_1.default.red('āœ– Project name cannot be empty.'); if (!/^[a-z0-9-]+$/.test(trimmed)) { return chalk_1.default.red('āœ– Use only lowercase letters, numbers, and hyphens (no spaces or special characters).'); } if (/^\d/.test(trimmed)) return chalk_1.default.red('āœ– Project name cannot start with a number.'); if (trimmed.length > 214) return chalk_1.default.red('āœ– Project name is too long (must be under 214 characters).'); return true; } } ]); return projectName.trim(); }; exports.enterProjectName = enterProjectName; // āœļø Utility to write file with folder creation const createFile = (filePath, content) => { fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true }); fs_1.default.writeFileSync(filePath, content); console.log(chalk_1.default.greenBright(`āœ… Created:`), chalk_1.default.gray(filePath)); }; // šŸš€ Main CLI flow const main = async () => { console.log(chalk_1.default.magentaBright(`\nšŸš€ Welcome to the Project Setup CLI by ${chalk_1.default.bold('CodingOtt')}`)); console.log(chalk_1.default.gray('🌐 Website:'), chalk_1.default.underline.blue('https://www.codingott.com')); console.log(chalk_1.default.yellow('────────────────────────────────────────────\n')); try { let name; let root; while (true) { name = await (0, exports.enterProjectName)(); if (name === 'exit') { console.log(chalk_1.default.redBright('\nšŸ‘‹ Exiting by user command...')); process.exit(0); } root = path_1.default.join(process.cwd(), name); if (fs_1.default.existsSync(root)) { console.log(chalk_1.default.red(`āŒ Folder "${name}" already exists in this directory.\n`)); continue; } break; } // šŸ› ļø Create project structure createFile(path_1.default.join(root, '.env'), (0, env_1.envBoilerplate)()); createFile(path_1.default.join(root, 'src/main.ts'), (0, main_1.mainBoilerplate)()); createFile(path_1.default.join(root, 'package.json'), (0, package_json_1.packageJsonBoilerplate)(name)); createFile(path_1.default.join(root, 'tsconfig.json'), (0, tsconfig_1.tsconfigBoilerplate)()); // šŸ“¦ Install dependencies console.log(chalk_1.default.greenBright(`\nšŸ“¦ Installing dependencies...`)); const install = (0, child_process_1.spawn)('npm', ['install'], { cwd: root, stdio: 'inherit', shell: true }); install.on('exit', (code) => { if (code !== 0) { console.error(chalk_1.default.redBright(`āŒ npm install failed with exit code ${code}`)); return; } // šŸš€ Start dev server console.log(chalk_1.default.greenBright(`\nšŸš€ Starting development server...`)); console.log(chalk_1.default.gray(`šŸ’” Hint: Type ${chalk_1.default.yellow(':q')} and press Enter to exit\n`)); const dev = (0, child_process_1.spawn)('npm', ['run', 'dev'], { cwd: root, stdio: 'inherit', shell: true }); }); } catch (err) { console.error(chalk_1.default.bgRed.white('āŒ Error:'), chalk_1.default.redBright(err)); } console.log(chalk_1.default.gray('\n────────────────────────────────────────────')); console.log(chalk_1.default.gray(`Ā© ${new Date().getFullYear()}`), chalk_1.default.bold('CodingOtt'), '| Start learning code today.\n'); }; main();