yfe-ynpm
Version:
遥望网络私有NPM仓库客户端
114 lines (98 loc) • 2.51 kB
JavaScript
;
const debug = require('debug')('cnpm:origin');
const match = require('auto-correct');
const spawn = require('cross-spawn');
const cp = require('child_process');
const fs = require('fs');
const path = require('path');
const config = require('./config');
const parseArgv = require('./parse_argv');
const program = parseArgv();
const rawArgs = program.rawArgs.slice(2);
const args = [];
let isInstall = false;
let installer = 'npminstall';
for (let i = 0; i < rawArgs.length; i++) {
let arg = rawArgs[i];
if (arg[0] !== '-') {
arg = correct(arg);
}
if (i === 0 && (arg === 'i' || arg === 'install')) {
isInstall = true;
continue;
}
// support `$ cnpm i --by=npm`
if (arg.indexOf('--by=') === 0) {
installer = arg.split('=', 2)[1];
continue;
}
args.push(arg);
}
const env = Object.assign({}, process.env);
const CWD = process.cwd();
args.unshift('--registry=' + program.registry);
if (program.disturl) {
args.unshift('--disturl=' + program.disturl);
}
if (program.userconfig) {
args.unshift('--userconfig=' + program.userconfig);
}
if (program.proxy) {
debug('use program.proxy: %s', program.proxy);
args.unshift('--proxy=' + program.proxy);
} else if (config.proxy) {
debug('use config.proxy: %s', config.proxy);
args.unshift('--proxy=' + config.proxy);
}
let npmBin;
let execMethod = spawn;
const stdio = [
process.stdin,
process.stdout,
process.stderr,
];
if (isInstall) {
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', installer);
if (installer === 'npminstall') {
// use fork to spawn can fix install cnpm itself fail on Windows
execMethod = cp.fork;
stdio.push('ipc');
npmBin = require.resolve('npminstall/bin/install.js');
args.unshift('--china');
args.unshift('--fix-bug-versions');
} else {
// other installer, like npm
args.unshift('install');
}
// maybe outside installer, just use installer as binary name
if (!fs.existsSync(npmBin)) {
npmBin = installer;
}
} else {
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm');
}
debug('%s %s', npmBin, args.join(' '));
const child = execMethod(npmBin, args, {
env,
cwd: CWD,
stdio,
});
child.on('exit', code => {
process.exit(code);
});
function correct(command) {
const cmds = [
'install',
'publish',
'adduser',
'author',
'config',
'unpublish',
];
for (const cmd of cmds) {
if (match(command, cmd)) {
return cmd;
}
}
return command;
}