@tomjs/pkg
Version:
npm package tools
76 lines (75 loc) • 2.07 kB
JavaScript
// src/index.ts
import cp from "node:child_process";
import fs from "node:fs";
import path from "node:path";
import util from "node:util";
import { readJson } from "@tomjs/node";
import semver from "semver";
var exec = util.promisify(cp.exec);
var configs = {
npm: {
cli: "npm",
id: "npm",
lockfiles: ["package-lock.json", "npm-shrinkwrap.json"],
version: ""
},
pnpm: {
cli: "pnpm",
id: "pnpm",
lockfiles: ["pnpm-lock.yaml"],
version: ""
},
yarn: {
cli: "yarn",
id: "yarn",
lockfiles: ["yarn.lock"],
version: ""
},
berry: {
cli: "yarn",
id: "berry",
lockfiles: ["yarn.lock"],
version: ""
}
};
function configFromPackageManagerField(pkg) {
if (!pkg || typeof pkg.packageManager !== "string") {
return void 0;
}
const [cli, version] = pkg.packageManager.split("@");
if (cli === "yarn" && version && semver.gte(version, "2.0.0")) {
return configs["berry"];
}
const config = configs[cli];
if (config) {
return config;
}
throw new Error(`Invalid package manager: ${pkg.packageManager}`);
}
function findLockfile(rootDirectory, config) {
return config.lockfiles.map((filename) => path.resolve(rootDirectory || ".", filename)).find((filepath) => fs.existsSync(filepath));
}
function configFromLockfile(rootDirectory) {
return [configs.npm, configs.pnpm, configs.yarn].find(
(config) => findLockfile(rootDirectory, config)
);
}
async function getPackageManager(rootDir) {
const pkg = await readJson(path.join(rootDir, "package.json"));
const pm = configFromPackageManagerField(pkg) || configFromLockfile(rootDir) || configs.npm;
const { stdout, stderr } = await exec(`${pm.cli} --version`);
if (stderr) {
throw new Error(`Get package manager ${pm.id} version failed:
${stderr}`);
}
pm.version = (stdout || "").trim().replace(/\n|\r/g, "");
if (!pm.version) {
throw new Error(
`Package manager ${pm.id} has unknown version, please make sure ${pm.id} has been installed`
);
}
return pm;
}
export {
getPackageManager
};