@tomjs/pkg
Version:
npm package tools
76 lines (73 loc) • 2.59 kB
JavaScript
;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;