@vivo-minigame/cli
Version:
Command line interface for rapid Vivo minigame development
153 lines (128 loc) • 5.41 kB
JavaScript
;var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");var _commander = _interopRequireDefault(require("commander"));
var _didyoumean = _interopRequireDefault(require("didyoumean"));
var _cliSharedUtils = require("@vivo-minigame/cli-shared-utils");
var _checkVersion = require("./lib/util/checkVersion");
var _enhanceErrorMessages = _interopRequireDefault(require("./lib/util/enhanceErrorMessages"));
var _create = _interopRequireDefault(require("./lib/create"));
var _upgrade = _interopRequireDefault(require("./lib/upgrade"));
var _Service = _interopRequireDefault(require("./Service"));
_didyoumean.default.threshold = 0.6;
const pkg = require('../package.json');
function suggestCommands(cmd) {
const availableCommands = _commander.default.commands.map((cmd) => {
return cmd._name;
});
const suggestion = (0, _didyoumean.default)(cmd, availableCommands);
if (suggestion) {
(0, _cliSharedUtils.log)(` ` + _cliSharedUtils.chalk.red(`Did you mean ${_cliSharedUtils.chalk.yellow(suggestion)}?`));
}
}
// 检查node版本
(0, _checkVersion.checkNodeVersion)(_cliSharedUtils.requiredVersion, pkg.name);
// service 迁移
if (!_cliSharedUtils.semver.satisfies(process.version, _cliSharedUtils.requiredVersion)) {
(0, _cliSharedUtils.error)(
`You are using Node ${process.version}, but mg-service ` +
`requires Node ${_cliSharedUtils.requiredVersion}.\nPlease upgrade your Node version.`
);
process.exit(1);
}
// PATH_PROJECT为当前服务执行的目录,调试时会被注入,非调试模式,取process.cwd()
const service = new _Service.default(_cliSharedUtils.projectPath);
// 解析参数
const args = (0, _cliSharedUtils.minimist)(process.argv.slice(2), { boolean: ['isStreamPack'], string: ['buildType'], default: { isStreamPack: true } });
// 取出命令
const cleanedArgs = {};
for (const key in args) {
const cleanedKey = key.replace(/--/g, ''); // 使用正则表达式替换 -- 为空字符串
cleanedArgs[cleanedKey] = args[key];
}
const cmd = cleanedArgs._[0];
async function main() {
// 检查Cli版本
(0, _checkVersion.checkCliVersion)(pkg);
_commander.default.
version(pkg.version, '-v, --version').
usage('<command> [options]');
_commander.default.
command('init <app-name>').
description('init a new project').
option('-t, --template <template>', 'Choose a template for this project', 'default').
option('-c, --cwd <dir>', 'input the target dir for initing').
option('-f, --force', 'force overwrite the minigame project if existed').
action((name, cmd) => {
const options = cleanArgs(cmd);
(0, _create.default)(name, options);
});
_commander.default.
command('upgrade').
description('upgrade the current project for new features, such as loadsubpackage').
action((cmd) => {
(0, _upgrade.default)();
});
// output help information on unknown commands
_commander.default.
arguments('<command>').
action((cmd) => {
if (cmd === 'server' || cmd === 'build' || cmd === 'release' || cmd === 'watch' || cmd === 'transfer') {
return;
}
_commander.default.outputHelp();
(0, _cliSharedUtils.log)(` ` + _cliSharedUtils.chalk.red(`Unknown command ${_cliSharedUtils.chalk.yellow(cmd)}.`));
(0, _cliSharedUtils.log)();
suggestCommands(cmd);
});
// add some useful info on help
_commander.default.on('--help', () => {
(0, _cliSharedUtils.log)();
(0, _cliSharedUtils.log)(` Run ${_cliSharedUtils.chalk.cyan(`mg <command> --help`)} for detailed usage of given command.`);
(0, _cliSharedUtils.log)();
});
_commander.default.commands.forEach((c) => c.on('--help', () => (0, _cliSharedUtils.log)()));
// enhance common error messages
(0, _enhanceErrorMessages.default)('missingArgument', (argName) => {
return `Missing required argument ${_cliSharedUtils.chalk.yellow(`<${argName}>`)}.`;
});
(0, _enhanceErrorMessages.default)('unknownOption', (optionName) => {
return `Unknown option ${_cliSharedUtils.chalk.yellow(optionName)}.`;
});
(0, _enhanceErrorMessages.default)('optionMissingArgument', (option, flag) => {
return `Missing required argument for option ${_cliSharedUtils.chalk.yellow(option.flags)}` + (
flag ? `, got ${_cliSharedUtils.chalk.yellow(flag)}` : ``);
});
_commander.default.parse(process.argv);
// 如果没有输入命令,输出提示信息
if (!process.argv.slice(2).length) {
_commander.default.outputHelp();
}
};
function camelize(str) {
return str.replace(/-(\w)/g, (_, c) => c ? c.toUpperCase() : '');
}
// commander passes the Command object itself as options,
// extract only actual options into a fresh object.
function cleanArgs(cmd) {
const args = {};
cmd.options.forEach((o) => {
const key = camelize(o.long.replace(/^--/, ''));
// if an option is not present and Command has a method with the same name
// it should not be copied
if (typeof cmd[key] !== 'function' && typeof cmd[key] !== 'undefined') {
args[key] = cmd[key];
}
});
return args;
}
// 开始服务
try {
if (cmd === 'server' || cmd === 'build' || cmd === 'release' || cmd === 'watch' || cmd === 'transfer') {
_commander.default.
version(pkg.version, '-v, --version').
parse(process.argv);
service.run(cmd, cleanedArgs);
} else {
main();
}
} catch (err) {
}