UNPKG

@vivo-minigame/cli

Version:

Command line interface for rapid Vivo minigame development

153 lines (128 loc) 5.41 kB
#!/usr/bin/env node "use strict";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) { }