@pitifulhawk/flash-up
Version:
Interactive project scaffolder for modern web applications
172 lines • 5.54 kB
JavaScript
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