create-new-express-app
Version:
A CLI tool to create a TypeScript Express application with best practices
112 lines (111 loc) • 3.94 kB
JavaScript
;
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);
}
});
}