UNPKG

@tomjs/pkg

Version:

npm package tools

76 lines (73 loc) 2.59 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/index.ts var _child_process = require('child_process'); var _child_process2 = _interopRequireDefault(_child_process); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _util = require('util'); var _util2 = _interopRequireDefault(_util); var _node = require('@tomjs/node'); var _semver = require('semver'); var _semver2 = _interopRequireDefault(_semver); var exec = _util2.default.promisify(_child_process2.default.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 && _semver2.default.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) => _path2.default.resolve(rootDirectory || ".", filename)).find((filepath) => _fs2.default.existsSync(filepath)); } function configFromLockfile(rootDirectory) { return [configs.npm, configs.pnpm, configs.yarn].find( (config) => findLockfile(rootDirectory, config) ); } async function getPackageManager(rootDir) { const pkg = await _node.readJson.call(void 0, _path2.default.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; } exports.getPackageManager = getPackageManager;