@rnm/pm
Version:
Unified Package Manager for Node.js
108 lines • 14.7 kB
JavaScript
import fs from "node:fs/promises";
import path from "node:path";
import process from "node:process";
import { fileURLToPath } from "node:url";
import semver from "semver";
import whichPmRuns from "which-pm-runs";
import { getPackageJson } from "./common.js";
import { executorMap } from "./constants.js";
import { detect } from "./utils/detector.js";
await main();
async function main() {
switch (process.argv[2] ?? "") {
case "enable-shim":
await enableShim();
break;
case "check-pm":
await checkPm();
break;
case "-v":
case "--version":
await version();
break;
default:
help();
}
}
function help() {
console.log("Usage:");
console.log(" pm-util enable-shim [npm] [yarn] [pnpm]");
console.log(" pm-util check-pm");
}
async function checkPm() {
const expectedPm = await detect();
if (!expectedPm) {
console.error("❌ No package manager configured in package.json. Please configure a package manager using one of the following methods:");
console.error(' - Add "packageManager" field in package.json');
console.error(' - Add "devEngines.packageManager" field in package.json');
console.error(' - Add package manager in "engines" field in package.json');
process.exit(1);
}
const currentPm = whichPmRuns();
if (!currentPm) {
console.error("❌ Unable to detect the current package manager");
process.exit(1);
}
if (expectedPm.name !== currentPm.name) {
console.error("❌ Package manager mismatch:");
console.error(` Expected: ${expectedPm.name}`);
console.error(` Current: ${currentPm.name}`);
process.exit(1);
}
if (!expectedPm.version) {
console.warn("⚠️ Unable to detect the package manager version");
process.exit(0);
}
if (expectedPm.version &&
currentPm.version &&
!semver.satisfies(currentPm.version, expectedPm.version)) {
console.warn("⚠️ Package manager version mismatch:");
console.warn(` Expected: ${expectedPm.name}@${expectedPm.version}`);
console.warn(` Current: ${currentPm.name}@${currentPm.version}`);
process.exit(0);
}
}
async function enableShim() {
const argv = process.argv.slice(3);
const packageManagers = [];
if (argv.length === 0) {
packageManagers.push(...["npm", "yarn", "pnpm"]);
}
else {
if (argv.includes("npm"))
packageManagers.push("npm");
if (argv.includes("yarn"))
packageManagers.push("yarn");
if (argv.includes("pnpm"))
packageManagers.push("pnpm");
}
// 1. Get installDirectory
const currentFile = process.argv[1];
if (!currentFile || !path.isAbsolute(currentFile)) {
throw new Error(`The path '${String(currentFile)}' is not an absolute path.`);
}
const installDirectory = await fs.realpath(path.dirname(currentFile));
// 2. Get shimsDirectory
const importMetaFile = fileURLToPath(import.meta.url);
const importMetaDirname = path.dirname(importMetaFile);
const shimsDirectory = path.join(importMetaDirname, "shims");
// 3. Get extension
const extension = path.extname(importMetaFile);
for (const shimName of packageManagers.flatMap((packageManager) => [
packageManager,
executorMap[packageManager],
])) {
const cliFile = path.join(shimsDirectory, `${shimName}.cli${extension}`);
await fs.chmod(cliFile, 0o755);
const file = path.join(installDirectory, shimName);
const symlink = path.relative(installDirectory, cliFile);
await fs.unlink(file).catch((_error) => undefined);
await fs.symlink(symlink, file);
}
}
async function version() {
const packageJson = await getPackageJson();
console.log(packageJson.version);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG0tdXRpbC5jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcG0tdXRpbC5jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxXQUFXLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUViLEtBQUssVUFBVSxJQUFJO0lBQ2pCLFFBQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QixLQUFLLGFBQWE7WUFDaEIsTUFBTSxVQUFVLEVBQUUsQ0FBQztZQUNuQixNQUFNO1FBQ1IsS0FBSyxVQUFVO1lBQ2IsTUFBTSxPQUFPLEVBQUUsQ0FBQztZQUNoQixNQUFNO1FBQ1IsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLFdBQVc7WUFDZCxNQUFNLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE1BQU07UUFDUjtZQUNFLElBQUksRUFBRSxDQUFDO0lBQ1gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLElBQUk7SUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUN6RCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFD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QWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBZSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1RCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLE9BQU87SUFDcEIsTUFBTSxXQUFXLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCB3aGljaFBtUnVucyBmcm9tIFwid2hpY2gtcG0tcnVuc1wiO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUpzb24gfSBmcm9tIFwiLi9jb21tb24udHNcIjtcbmltcG9ydCB7IGV4ZWN1dG9yTWFwLCB0eXBlIFN1cHBvcnRlZFBtIH0gZnJvbSBcIi4vY29uc3RhbnRzLnRzXCI7XG5pbXBvcnQgeyBkZXRlY3QgfSBmcm9tIFwiLi91dGlscy9kZXRlY3Rvci50c1wiO1xuXG5hd2FpdCBtYWluKCk7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN3aXRjaCAocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpIHtcbiAgICBjYXNlIFwiZW5hYmxlLXNoaW1cIjpcbiAgICAgIGF3YWl0IGVuYWJsZVNoaW0oKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjaGVjay1wbVwiOlxuICAgICAgYXdhaXQgY2hlY2tQbSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIi12XCI6XG4gICAgY2FzZSBcIi0tdmVyc2lvblwiOlxuICAgICAgYXdhaXQgdmVyc2lvbigpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGhlbHAoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoZWxwKCkge1xuICBjb25zb2xlLmxvZyhcIlVzYWdlOlwiKTtcbiAgY29uc29sZS5sb2coXCIgIHBtLXV0aWwgZW5hYmxlLXNoaW0gW25wbV0gW3lhcm5dIFtwbnBtXVwiKTtcbiAgY29uc29sZS5sb2coXCIgIHBtLXV0aWwgY2hlY2stcG1cIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUG0oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV4cGVjdGVkUG0gPSBhd2FpdCBkZXRlY3QoKTtcbiAgaWYgKCFleHBlY3RlZFBtKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwi4p2MIE5vIHBhY2thZ2UgbWFuYWdlciBjb25maWd1cmVkIGluIHBhY2thZ2UuanNvbi4gUGxlYXNlIGNvbmZpZ3VyZSBhIHBhY2thZ2UgbWFuYWdlciB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOlwiLFxuICAgICk7XG4gICAgY29uc29sZS5lcnJvcignICAtIEFkZCBcInBhY2thZ2VNYW5hZ2VyXCIgZmllbGQgaW4gcGFja2FnZS5qc29uJyk7XG4gICAgY29uc29sZS5lcnJvcignICAtIEFkZCBcImRldkVuZ2luZXMucGFja2FnZU1hbmFnZXJcIiBmaWVsZCBpbiBwYWNrYWdlLmpzb24nKTtcbiAgICBjb25zb2xlLmVycm9yKCcgIC0gQWRkIHBhY2thZ2UgbWFuYWdlciBpbiBcImVuZ2luZXNcIiBmaWVsZCBpbiBwYWNrYWdlLmpzb24nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjdXJyZW50UG0gPSB3aGljaFBtUnVucygpO1xuICBpZiAoIWN1cnJlbnRQbSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCLinYwgVW5hYmxlIHRvIGRldGVjdCB0aGUgY3VycmVudCBwYWNrYWdlIG1hbmFnZXJcIik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGV4cGVjdGVkUG0ubmFtZSAhPT0gY3VycmVudFBtLm5hbWUpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFBhY2thZ2UgbWFuYWdlciBtaXNtYXRjaDpcIik7XG4gICAgY29uc29sZS5lcnJvcihgICBFeHBlY3RlZDogJHtleHBlY3RlZFBtLm5hbWV9YCk7XG4gICAgY29uc29sZS5lcnJvcihgICBDdXJyZW50OiAgJHtjdXJyZW50UG0ubmFtZX1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBpZiAoIWV4cGVjdGVkUG0udmVyc2lvbikge1xuICAgIGNvbnNvbGUud2FybihcIuKaoO+4jyAgVW5hYmxlIHRvIGRldGVjdCB0aGUgcGFja2FnZSBtYW5hZ2VyIHZlcnNpb25cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgaWYgKFxuICAgIGV4cGVjdGVkUG0udmVyc2lvbiAmJlxuICAgIGN1cnJlbnRQbS52ZXJzaW9uICYmXG4gICAgIXNlbXZlci5zYXRpc2ZpZXMoY3VycmVudFBtLnZlcnNpb24sIGV4cGVjdGVkUG0udmVyc2lvbilcbiAgKSB7XG4gICAgY29uc29sZS53YXJuKFwi4pqg77iPICBQYWNrYWdlIG1hbmFnZXIgdmVyc2lvbiBtaXNtYXRjaDpcIik7XG4gICAgY29uc29sZS53YXJuKGAgIEV4cGVjdGVkOiAke2V4cGVjdGVkUG0ubmFtZX1AJHtleHBlY3RlZFBtLnZlcnNpb259YCk7XG4gICAgY29uc29sZS53YXJuKGAgIEN1cnJlbnQ6ICAke2N1cnJlbnRQbS5uYW1lfUAke2N1cnJlbnRQbS52ZXJzaW9ufWApO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBlbmFibGVTaGltKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDMpO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnM6IFN1cHBvcnRlZFBtW10gPSBbXTtcbiAgaWYgKGFyZ3YubGVuZ3RoID09PSAwKSB7XG4gICAgcGFja2FnZU1hbmFnZXJzLnB1c2goLi4uKFtcIm5wbVwiLCBcInlhcm5cIiwgXCJwbnBtXCJdIGFzIGNvbnN0KSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGFyZ3YuaW5jbHVkZXMoXCJucG1cIikpIHBhY2thZ2VNYW5hZ2Vycy5wdXNoKFwibnBtXCIpO1xuICAgIGlmIChhcmd2LmluY2x1ZGVzKFwieWFyblwiKSkgcGFja2FnZU1hbmFnZXJzLnB1c2goXCJ5YXJuXCIpO1xuICAgIGlmIChhcmd2LmluY2x1ZGVzKFwicG5wbVwiKSkgcGFja2FnZU1hbmFnZXJzLnB1c2goXCJwbnBtXCIpO1xuICB9XG5cbiAgLy8gMS4gR2V0IGluc3RhbGxEaXJlY3RvcnlcbiAgY29uc3QgY3VycmVudEZpbGUgPSBwcm9jZXNzLmFyZ3ZbMV07XG4gIGlmICghY3VycmVudEZpbGUgfHwgIXBhdGguaXNBYnNvbHV0ZShjdXJyZW50RmlsZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHBhdGggJyR7U3RyaW5nKGN1cnJlbnRGaWxlKX0nIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLmAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsRGlyZWN0b3J5ID0gYXdhaXQgZnMucmVhbHBhdGgocGF0aC5kaXJuYW1lKGN1cnJlbnRGaWxlKSk7XG5cbiAgLy8gMi4gR2V0IHNoaW1zRGlyZWN0b3J5XG4gIGNvbnN0IGltcG9ydE1ldGFGaWxlID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBpbXBvcnRNZXRhRGlybmFtZSA9IHBhdGguZGlybmFtZShpbXBvcnRNZXRhRmlsZSk7XG4gIGNvbnN0IHNoaW1zRGlyZWN0b3J5ID0gcGF0aC5qb2luKGltcG9ydE1ldGFEaXJuYW1lLCBcInNoaW1zXCIpO1xuXG4gIC8vIDMuIEdldCBleHRlbnNpb25cbiAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGltcG9ydE1ldGFGaWxlKTtcblxuICBmb3IgKGNvbnN0IHNoaW1OYW1lIG9mIHBhY2thZ2VNYW5hZ2Vycy5mbGF0TWFwKChwYWNrYWdlTWFuYWdlcikgPT4gW1xuICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgIGV4ZWN1dG9yTWFwW3BhY2thZ2VNYW5hZ2VyXSxcbiAgXSkpIHtcbiAgICBjb25zdCBjbGlGaWxlID0gcGF0aC5qb2luKHNoaW1zRGlyZWN0b3J5LCBgJHtzaGltTmFtZX0uY2xpJHtleHRlbnNpb259YCk7XG4gICAgYXdhaXQgZnMuY2htb2QoY2xpRmlsZSwgMG83NTUpO1xuXG4gICAgY29uc3QgZmlsZSA9IHBhdGguam9pbihpbnN0YWxsRGlyZWN0b3J5LCBzaGltTmFtZSk7XG4gICAgY29uc3Qgc3ltbGluayA9IHBhdGgucmVsYXRpdmUoaW5zdGFsbERpcmVjdG9yeSwgY2xpRmlsZSk7XG4gICAgYXdhaXQgZnMudW5saW5rKGZpbGUpLmNhdGNoKChfZXJyb3I6IHVua25vd24pID0+IHVuZGVmaW5lZCk7XG4gICAgYXdhaXQgZnMuc3ltbGluayhzeW1saW5rLCBmaWxlKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJzaW9uKCkge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IGdldFBhY2thZ2VKc29uKCk7XG4gIGNvbnNvbGUubG9nKHBhY2thZ2VKc29uLnZlcnNpb24pO1xufVxuIl19