@vivo-minigame/cli
Version:
Command line interface for rapid Vivo minigame development
166 lines (120 loc) • 4.73 kB
JavaScript
;var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");_Object$defineProperty(exports, "__esModule", { value: true });exports.updatePackage = exports.uninstallPackage = exports.progress = exports.installPackage = exports.installDeps = void 0;var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));var _events = _interopRequireDefault(require("events"));
var _registries = _interopRequireDefault(require("./registries"));
var _packageManager = require("./packageManager");
var _cliSharedUtils = require("@vivo-minigame/cli-shared-utils");
var _debug = _interopRequireDefault(require("debug"));
const debug = (0, _debug.default)('minigame-cli:install');
const taobaoDistURL = 'https://npm.taobao.org/dist';
const supportPackageManagerList = ['npm', 'yarn', 'pnpm'];
const packageManagerConfig = {
npm: {
installDeps: ['install', '--loglevel', 'error'],
installPackage: ['install', '--loglevel', 'error'],
uninstallPackage: ['uninstall', '--loglevel', 'error'],
updatePackage: ['update', '--loglevel', 'error']
},
pnpm: {
installDeps: ['install', '--loglevel', 'error', '--shamefully-flatten'],
installPackage: ['install', '--loglevel', 'error'],
uninstallPackage: ['uninstall', '--loglevel', 'error'],
updatePackage: ['update', '--loglevel', 'error']
},
yarn: {
installDeps: [],
installPackage: ['add'],
uninstallPackage: ['remove'],
updatePackage: ['upgrade']
}
};
class InstallProgress extends _events.default {
constructor() {
super();
this._progress = -1;
}
get progress() {
return this._progress;
}
set progress(value) {
this._progress = value;
this.emit('progress', value);
}
get enabled() {
return this._progress !== -1;
}
set enabled(value) {
this.progress = value ? 0 : -1;
}
log(value) {
this.emit('log', value);
}
}
const progress = exports.progress = new InstallProgress();
function checkPackageManagerIsSupported(command) {
if (supportPackageManagerList.indexOf(command) === -1) {
throw new Error(`Unknown package manager: ${command}`);
}
}
async function addRegistryToArgs(command, args) {
const altRegistry = await (0, _packageManager.getRegistry)({ packageManager: command });
if (altRegistry) {
args.push(`--registry=${altRegistry}`);
if (altRegistry === _registries.default.taobao) {
args.push(`--disturl=${taobaoDistURL}`);
}
}
}
function executeCommand(command, args, targetDir) {
return new _promise.default((resolve, reject) => {
progress.enabled = false;
const child = (0, _cliSharedUtils.execa)(command, args, {
cwd: targetDir,
stdio: ['inherit', 'inherit', 'inherit']
});
child.on('close', (code) => {
if (code !== 0) {
reject(new Error(`command failed: ${command} ${args.join(' ')}`));
return;
}
resolve();
});
});
}
const installDeps = exports.installDeps = async function installDeps(targetDir, command) {
try {
checkPackageManagerIsSupported(command);
const args = packageManagerConfig[command].installDeps;
await addRegistryToArgs(command, args);
debug(`command: `, command);
debug(`args: `, args);
await executeCommand(command, args, targetDir);
} catch (error) {
}
};
const installPackage = async function (targetDir, command, packageName, dev = true) {
checkPackageManagerIsSupported(command);
const args = packageManagerConfig[command].installPackage;
if (dev) args.push('-D');
await addRegistryToArgs(command, args);
args.push(packageName);
debug(`command: `, command);
debug(`args: `, args);
await executeCommand(command, args, targetDir);
};exports.installPackage = installPackage;
const uninstallPackage = async function (targetDir, command, packageName) {
checkPackageManagerIsSupported(command);
const args = packageManagerConfig[command].uninstallPackage;
await addRegistryToArgs(command, args);
args.push(packageName);
debug(`command: `, command);
debug(`args: `, args);
await executeCommand(command, args, targetDir);
};exports.uninstallPackage = uninstallPackage;
const updatePackage = async function (targetDir, command, packageName) {
checkPackageManagerIsSupported(command);
const args = packageManagerConfig[command].updatePackage;
await addRegistryToArgs(command, args);
packageName.split(' ').forEach((name) => args.push(name));
debug(`command: `, command);
debug(`args: `, args);
await executeCommand(command, args, targetDir);
};exports.updatePackage = updatePackage;