@kd-kfront/knpm
Version:
knpm: npm client for knpm
253 lines (228 loc) • 7.38 kB
JavaScript
;
/* eslint-disable */
const debug = require('debug')('knpm:origin');
const match = require('auto-correct');
const request = require('request');
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 isUnInstall = false;
let installer = 'npminstall-nouse';
let uninstaller = 'npmuninstall-nouse';
let packageInfo = {};
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;
let packageLockPath = path.resolve(process.cwd(), './package-lock.json');
// console.log("packageLockPath===", packageLockPath);
if (fs.existsSync(packageLockPath)) {
// console.log('该路径已存在');
// fs.unlink(packageLockPath, (err) => {
// if (err) {
// process.exit();
// throw err;
// }
// console.log('文件已被删除');
// });
try {
fs.unlinkSync(packageLockPath);
} catch (e) {
console.error("remove package-lock.json error:",e);
process.exit(1);
}
}
continue;
} else if (i === 0 && (arg === 'un' || arg === 'uninstall')) {
isUnInstall = true;
continue;
}
// support `$ knpm 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();
let theRegistry = program.registry;
if (program.registry.endsWith('/')) {
theRegistry = theRegistry.substring(0, theRegistry.length - 1);
}
// if (theRegistry === config.knpmRegistry && (isInstall || isUnInstall)) {
// args.unshift('--registry=' + theRegistry + '/knpm-server-router');
// } else {
// args.unshift('--registry=' + program.registry);
// }
// console.log('theRegistry:',theRegistry)
// 如果是公司内网环境
if (process.env.netRight === 'true') {
// if (theRegistry === config.knpmRegistry && (isInstall || isUnInstall)) {
// args.unshift('--registry=' + theRegistry + '/knpm-server-router');
// } else {
// args.unshift('--registry=' + program.registry);
// }
args.unshift('--registry=' + theRegistry);
} else {
args.unshift('--registry=https://registry.npm.taobao.org/');
}
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);
}
// console.log('args==',args)
let npmBin;
let execMethod = spawn;
const stdio = [
process.stdin,
process.stdout,
process.stderr,
];
if (isInstall) {
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', installer);
// // 收集下载包情况
// let packageArr = args.filter(arg => !arg.startsWith('-'));
// if (packageArr.length > 0) {
// let installName = packageArr[0];
// let packageName;
// if (installName.startsWith('@')) {
// packageName = installName.substring(0, installName.lastIndexOf('@') != 0 ? installName.lastIndexOf('@') : installName.length);
// packageInfo[packageName] = installName.lastIndexOf('@') != 0 ? installName.substring(installName.lastIndexOf('@') + 1) : '';
// } else {
// packageName = installName.substring(0, installName.includes('@') ? installName.indexOf('@') : installName.length);
// packageInfo[packageName] = installName.includes('@') ? installName.substring(installName.indexOf('@') + 1) : '';
// }
// } else {
// try {
// let packageJsonPath = path.resolve(CWD, './package.json');
// if (fs.existsSync(packageJsonPath)) {
// let data = fs.readFileSync(packageJsonPath, 'utf-8');
// let packageJson = JSON.parse(data);
// if (args.includes('--production')) {
// let dependencies = packageJson.dependencies;
// packageInfo = dependencies;
// } else {
// packageInfo = Object.assign({}, packageJson.dependencies, packageJson.devDependencies);
// }
// }
// } catch (err) {
// }
// }
if (installer === 'npminstall') {
// use fork to spawn can fix install knpm 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;
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm');
}
} else if (isUnInstall) {
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', uninstaller);
if (uninstaller === 'npmuninstall') {
// use fork to spawn can fix install knpm itself fail on Windows
execMethod = cp.fork;
stdio.push('ipc');
npmBin = require.resolve('npminstall/bin/uninstall.js');
args.unshift('--china');
args.unshift('--fix-bug-versions');
} else {
// other installer, like npm
args.unshift('uninstall');
}
// maybe outside uninstaller, just use uninstaller as binary name
if (!fs.existsSync(npmBin)) {
// npmBin = uninstaller;
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm');
}
} else {
npmBin = path.join(__dirname, '..', 'node_modules', '.bin', 'npm');
}
debug('%s %s', npmBin, args.join(' '));
// console.log(args, 'args-origin_npm')
// console.log(npmBin, 'npmBin')
const child = execMethod(npmBin, args, {
env,
cwd: CWD,
stdio,
});
child.on('exit', code => {
process.exit(code);
// 发送下载包情况
let keys = Object.keys(packageInfo);
if (code == 0 && keys.length > 0 && theRegistry === config.knpmRegistry) {
let packageLockJsonPath = path.resolve(CWD, './package-lock.json');
if (fs.existsSync(packageLockJsonPath)) {
let data = fs.readFileSync(packageLockJsonPath, 'utf-8');
let packageLockJson = JSON.parse(data);
keys.map(key => {
if (packageLockJson.dependencies[key]) {
packageInfo[key] = packageLockJson.dependencies[key].version;
} else {
packageInfo[key] = undefined;
}
}).filter(key => packageInfo[key]);
}
// console.log(packageInfo, 'packageInfo');
let postParam = {
dependencies: JSON.stringify(packageInfo)
};
request({
// url: theRegistry + '/knpm-server-router/package/install/statistics',
url: theRegistry + '/package/install/statistics',
method: 'POST',
json: true,
headers: {
"content-type": 'application/json',
},
body: JSON.stringify(postParam)
}, () => {
process.exit(code);
});
} else {
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;
}