UNPKG

@tomjs/pkg

Version:

npm package tools

76 lines (75 loc) 2.07 kB
// 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 };