UNPKG

create-new-express-app

Version:

A CLI tool to create a TypeScript Express application with best practices

112 lines (111 loc) 3.94 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.detectPackageManager = detectPackageManager; exports.promptForPackageManager = promptForPackageManager; exports.installDependencies = installDependencies; const prompts_1 = __importDefault(require("prompts")); const cross_spawn_1 = __importDefault(require("cross-spawn")); const picocolors_1 = __importDefault(require("picocolors")); /** * Detect the package manager from the environment * @returns The detected package manager */ function detectPackageManager() { const userAgent = process.env.npm_config_user_agent || ""; if (userAgent.startsWith("yarn")) { return "yarn"; } if (userAgent.startsWith("pnpm")) { return "pnpm"; } if (userAgent.startsWith("bun")) { return "bun"; } return "npm"; } /** * Prompt the user to select a package manager * @param defaultManager The default package manager to suggest * @returns A Promise that resolves to the selected package manager */ async function promptForPackageManager(defaultManager) { const detected = defaultManager || detectPackageManager(); const response = await (0, prompts_1.default)({ type: "select", name: "packageManager", message: "Which package manager would you like to use?", choices: [ { title: "Auto-detect (detected: " + detected + ")", value: "detect", }, { title: "npm", value: "npm" }, { title: "pnpm", value: "pnpm" }, { title: "yarn", value: "yarn" }, { title: "bun", value: "bun" }, ], initial: 0, }); // If user selects auto-detect or cancels (undefined), use detected if (!response.packageManager || response.packageManager === "detect") { return detected; } return response.packageManager; } /** * Install dependencies using the specified package manager * @param projectPath Path to the project directory * @param chosenManager The package manager to use * @returns A Promise that resolves when installation is complete */ async function installDependencies(projectPath, chosenManager) { return new Promise((resolve, reject) => { try { console.log(picocolors_1.default.green(`Installing dependencies using ${chosenManager}...`)); // Build the install command based on the package manager let installCmd; switch (chosenManager) { case "yarn": installCmd = ["install"]; break; case "pnpm": installCmd = ["install"]; break; case "bun": installCmd = ["install"]; break; case "npm": default: installCmd = ["install"]; break; } // Run install command const child = (0, cross_spawn_1.default)(chosenManager, installCmd, { cwd: projectPath, stdio: "inherit", env: { ...process.env, ADBLOCK: "1", NODE_ENV: "development", DISABLE_OPENCOLLECTIVE: "1", }, }); child.on("close", (code) => { if (code !== 0) { reject(new Error(`${chosenManager} ${installCmd.join(" ")} exited with code ${code}`)); return; } resolve(); }); child.on("error", (error) => { reject(error); }); } catch (error) { reject(error); } }); }