pnpm
Version:
Fast, disk space efficient package manager
213 lines • 7.71 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// Map SIGINT & SIGTERM to process exit
// so that lockfiles are removed automatically
process
.once('SIGINT', () => process.exit(1))
.once('SIGTERM', () => process.exit(1));
// Patch the global fs module here at the app level
const fs = require("fs");
const gfs = require("graceful-fs");
gfs.gracefulify(fs);
const loud_rejection_1 = require("loud-rejection");
loud_rejection_1.default();
const config_1 = require("@pnpm/config");
const logger_1 = require("@pnpm/logger");
const isCI = require("is-ci");
const nopt = require("nopt");
const checkForUpdates_1 = require("./checkForUpdates");
const cmd_1 = require("./cmd");
const getCommandFullName_1 = require("./getCommandFullName");
const getConfigs_1 = require("./getConfigs");
const loggers_1 = require("./loggers");
require("./logging/fileLogger");
const pnpmPkgJson_1 = require("./pnpmPkgJson");
const reporter_1 = require("./reporter");
cmd_1.default['install-test'] = cmd_1.default.installTest;
const COMMANDS_WITH_NO_DASHDASH_FILTER = new Set(['run', 'exec', 'test']);
const supportedCmds = new Set([
'install',
'uninstall',
'update',
'link',
'prune',
'install-test',
'server',
'store',
'list',
'unlink',
'help',
'root',
'outdated',
'rebuild',
'recursive',
'import',
'test',
'run',
]);
async function run(argv) {
// tslint:disable
const shortHands = {
's': ['--loglevel', 'silent'],
'd': ['--loglevel', 'info'],
'dd': ['--loglevel', 'verbose'],
'ddd': ['--loglevel', 'silly'],
'L': ['--latest'],
'noreg': ['--no-registry'],
'N': ['--no-registry'],
'r': ['--recursive'],
'no-reg': ['--no-registry'],
'silent': ['--loglevel', 'silent'],
'verbose': ['--loglevel', 'verbose'],
'quiet': ['--loglevel', 'warn'],
'q': ['--loglevel', 'warn'],
'h': ['--usage'],
'H': ['--usage'],
'?': ['--usage'],
'help': ['--usage'],
'v': ['--version'],
'f': ['--force'],
'desc': ['--description'],
'no-desc': ['--no-description'],
'local': ['--no-global'],
'l': ['--long'],
'm': ['--message'],
'p': ['--parseable'],
'porcelain': ['--parseable'],
'prod': ['--production'],
'g': ['--global'],
'S': ['--save'],
'D': ['--save-dev'],
'P': ['--save-prod'],
'E': ['--save-exact'],
'O': ['--save-optional'],
'y': ['--yes'],
'n': ['--no-yes'],
'B': ['--save-bundle'],
'C': ['--prefix'],
'lockfile-directory': ['--shrinkwrap-directory'],
'lockfile-only': ['--shrinkwrap-only'],
'shared-workspace-lockfile': ['--shared-workspace-shrinkwrap'],
'frozen-lockfile': ['--frozen-shrinkwrap'],
'prefer-frozen-lockfile': ['--prefer-frozen-shrinkwrap'],
};
// tslint:enable
const cliConf = nopt(config_1.types, shortHands, argv, 0);
let cmd = getCommandFullName_1.default(cliConf.argv.remain[0])
|| 'help';
if (!supportedCmds.has(cmd)) {
cmd = 'help';
}
if (cliConf['dry-run']) {
console.error(`Error: 'dry-run' is not supported yet, sorry!`);
process.exit(1);
}
cliConf.save = cliConf.save || !cliConf['save-dev'] && !cliConf['save-optional'];
let subCmd = cliConf.argv.remain[1] && getCommandFullName_1.default(cliConf.argv.remain[1]);
const dashDashFilterUsed = ((cmd === 'recursive' && !COMMANDS_WITH_NO_DASHDASH_FILTER.has(subCmd)
|| cmd !== 'recursive' && !COMMANDS_WITH_NO_DASHDASH_FILTER.has(cmd))
&& cliConf.argv.cooked.includes('--'));
const filterArgs = [];
if (dashDashFilterUsed) {
const dashDashIndex = cliConf.argv.cooked.indexOf('--');
Array.prototype.push.apply(filterArgs, cliConf.argv.cooked.slice(dashDashIndex + 1));
const afterDashDash = cliConf.argv.cooked.length - dashDashIndex - 1;
cliConf.argv.remain = cliConf.argv.remain.slice(0, cliConf.argv.remain.length - afterDashDash);
}
// `pnpm install ""` is going to be just `pnpm install`
const cliArgs = cliConf.argv.remain.slice(1).filter(Boolean);
if (cmd !== 'recursive' && (dashDashFilterUsed || argv.includes('--filter') || cliConf['recursive'] === true)) {
subCmd = cmd;
cmd = 'recursive';
cliArgs.unshift(subCmd);
}
let opts;
try {
opts = await getConfigs_1.default(cliConf, {
command: subCmd ? [cmd, subCmd] : [cmd],
excludeReporter: false,
});
opts.include = {
dependencies: opts.production !== false,
devDependencies: opts.development !== false,
optionalDependencies: opts.optional !== false,
};
opts.forceSharedLockfile = typeof opts.workspacePrefix === 'string' && opts.sharedWorkspaceLockfile === true;
if (opts.filter) {
Array.prototype.push.apply(opts.filter, filterArgs);
}
else {
opts.filter = filterArgs;
}
}
catch (err) {
// Reporting is not initialized at this point, so just printing the error
console.error(err.message);
process.exit(1);
return;
}
const selfUpdate = opts.global && (cmd === 'install' || cmd === 'update') && cliConf.argv.remain.includes(pnpmPkgJson_1.default.name);
// Don't check for updates
// 1. on CI environments
// 2. when in the middle of an actual update
if (!isCI && !selfUpdate) {
checkForUpdates_1.default();
}
const reporterType = (() => {
if (opts.loglevel === 'silent')
return 'silent';
if (opts.reporter)
return opts.reporter;
if (isCI || !process.stdout.isTTY)
return 'append-only';
return 'default';
})();
reporter_1.default(reporterType, {
cmd,
pnpmConfigs: opts,
subCmd,
});
delete opts.reporter; // This is a silly workaround because supi expects a function as opts.reporter
if (selfUpdate) {
await cmd_1.default.server(['stop'], opts); // tslint:disable-line:no-any
}
// NOTE: we defer the next stage, otherwise reporter might not catch all the logs
await new Promise((resolve, reject) => {
setTimeout(() => {
if (cliConf['shamefully-flatten'] === true) {
logger_1.default.info({
message: 'Installing a flat node_modules. Use flat node_modules only if you rely on buggy dependencies that you cannot fix.',
prefix: opts.prefix,
});
}
if (opts.force === true) {
logger_1.default.warn({
message: 'using --force I sure hope you know what you are doing',
prefix: opts.prefix,
});
}
if (cmd !== 'recursive') {
loggers_1.scopeLogger.debug({
selected: 1,
workspacePrefix: opts.workspacePrefix,
});
}
try {
const result = cmd_1.default[cmd](cliArgs, opts, cliConf.argv.remain[0]);
if (result instanceof Promise) {
result
.then(resolve)
.catch(reject);
}
else {
resolve();
}
}
catch (err) {
reject(err);
}
}, 0);
});
}
exports.default = run;
//# sourceMappingURL=main.js.map