UNPKG

@pitifulhawk/flash-up

Version:

Interactive project scaffolder for modern web applications

172 lines 5.54 kB
import { PackageManager, } from "../types/index.js"; import { executeCommand, executeCommandWithOutput, commandExists, } from "../utils/shell.js"; import { logger } from "../ui/logger.js"; const PACKAGE_MANAGER_CONFIGS = { [PackageManager.NPM]: { name: PackageManager.NPM, installCmd: "install", addCmd: "install", removeCmd: "uninstall", runCmd: "run", createCmd: "create", }, [PackageManager.PNPM]: { name: PackageManager.PNPM, installCmd: "install", addCmd: "add", removeCmd: "remove", runCmd: "run", createCmd: "create", }, [PackageManager.YARN]: { name: PackageManager.YARN, installCmd: "install", addCmd: "add", removeCmd: "remove", runCmd: "run", createCmd: "create", }, [PackageManager.BUN]: { name: PackageManager.BUN, installCmd: "install", addCmd: "add", removeCmd: "remove", runCmd: "run", createCmd: "create", }, }; export class PackageManagerUtil { config; constructor(packageManager) { this.config = PACKAGE_MANAGER_CONFIGS[packageManager]; } getConfig() { return this.config; } async isAvailable() { return await commandExists(this.config.name); } async getVersion() { try { const result = await executeCommand(this.config.name, ["--version"]); return result.success ? result.stdout.trim() : null; } catch { return null; } } async install(cwd, silent = false) { logger.debug(`Running ${this.config.name} ${this.config.installCmd} in ${cwd}`); if (silent) { return await executeCommand(this.config.name, [this.config.installCmd], { cwd, }); } else { return await executeCommandWithOutput(this.config.name, [this.config.installCmd], cwd); } } async addPackages(packages, cwd, dev = false, silent = false) { if (packages.length === 0) { return { exitCode: 0, stdout: "", stderr: "", success: true, }; } const args = [this.config.addCmd, ...packages]; if (dev) { switch (this.config.name) { case PackageManager.NPM: args.push("--save-dev"); break; case PackageManager.PNPM: case PackageManager.YARN: case PackageManager.BUN: args.push("--dev"); break; } } logger.debug(`Running ${this.config.name} ${args.join(" ")} in ${cwd}`); if (silent) { return await executeCommand(this.config.name, args, { cwd }); } else { return await executeCommandWithOutput(this.config.name, args, cwd); } } async removePackages(packages, cwd, silent = false) { if (packages.length === 0) { return { exitCode: 0, stdout: "", stderr: "", success: true, }; } const args = [this.config.removeCmd, ...packages]; logger.debug(`Running ${this.config.name} ${args.join(" ")} in ${cwd}`); if (silent) { return await executeCommand(this.config.name, args, { cwd }); } else { return await executeCommandWithOutput(this.config.name, args, cwd); } } async runScript(script, cwd, args = [], silent = false) { const cmdArgs = [this.config.runCmd, script, ...args]; logger.debug(`Running ${this.config.name} ${cmdArgs.join(" ")} in ${cwd}`); if (silent) { return await executeCommand(this.config.name, cmdArgs, { cwd }); } else { return await executeCommandWithOutput(this.config.name, cmdArgs, cwd); } } async createProject(template, projectName, cwd, additionalArgs = []) { const args = [ this.config.createCmd, template, projectName, ...additionalArgs, ]; logger.debug(`Running ${this.config.name} ${args.join(" ")} in ${cwd}`); if (this.config.name === PackageManager.NPM) { args.push("--yes"); } else if (this.config.name === PackageManager.PNPM) { args.push("--yes"); } else if (this.config.name === PackageManager.YARN) { args.push("--yes"); } return await executeCommandWithOutput(this.config.name, args, cwd); } getRunCommand(script) { return `${this.config.name} ${this.config.runCmd} ${script}`; } getInstallCommand() { return `${this.config.name} ${this.config.installCmd}`; } } export async function detectPackageManager() { const managers = [ PackageManager.BUN, PackageManager.PNPM, PackageManager.YARN, PackageManager.NPM, ]; for (const manager of managers) { const util = new PackageManagerUtil(manager); if (await util.isAvailable()) { return manager; } } return null; } export async function validatePackageManager(packageManager) { const util = new PackageManagerUtil(packageManager); return await util.isAvailable(); } //# sourceMappingURL=package-manager.js.map