UNPKG

@micro-app/core

Version:

[Core] Pluggable micro application framework.

107 lines (95 loc) 3.99 kB
'use strict'; module.exports = function HelpCommand(api, opts) { api.registerCommand('help', { hide: true, }, args => { const commands = api.service.commands; const helpInfo = api.applyPluginHooks('modifyCommandHelp', { scriptName: 'micro-app', commands, }); const command = args._[0]; if (!command) { logMainHelp(api, helpInfo); } else { logHelpForCommand(api, command, helpInfo.commands[command]); } }); }; module.exports.registerMethod = require('./methods'); function logMainHelp(api, helpInfo) { const os = require('os'); const { _, chalk, getPadLength, logger: { SPACE_CHAR } } = require('@micro-app/shared-utils'); const loggerStacks = []; loggerStacks.push(`${SPACE_CHAR} Usage: ${helpInfo.scriptName} <command> [options]`); loggerStacks.push(''); loggerStacks.push(`${SPACE_CHAR} ${chalk.green('Commands')}:`); const commands = helpInfo.commands; const padLength = getPadLength(commands); for (const name in commands) { const opts = commands[name].opts || {}; if (opts.hide !== true) { loggerStacks.push(`${SPACE_CHAR}${SPACE_CHAR} * ${chalk.yellow(_.padEnd(name, padLength))}${opts.description ? ` ( ${chalk.gray(opts.description)} )` : ''}`); } } loggerStacks.push(''); loggerStacks.push( `${SPACE_CHAR} run ${chalk.blue( `${helpInfo.scriptName} help [command]` )} for usage of a specific command.` ); if (loggerStacks.length) { api.logger.logo(os.EOL, os.EOL, loggerStacks.join(os.EOL), os.EOL); } } function logHelpForCommand(api, name, command) { const os = require('os'); const { _, chalk, getPadLength, logger: { SPACE_CHAR } } = require('@micro-app/shared-utils'); if (!command) { api.logger.error(`Command "${name}" does not exist.`); } else { const loggerStacks = []; const opts = command.opts || {}; if (opts.usage) { loggerStacks.push(''); loggerStacks.push(`${SPACE_CHAR} Usage: ${opts.usage}`); } if (opts.options) { loggerStacks.push(''); loggerStacks.push(`${SPACE_CHAR} ${chalk.green('Options')}:`); const tempObj = Object.keys(opts.options).reduce((obj, name) => { if (_.isString(opts.options[name])) { obj[name] = opts.options[name]; } else if (_.isPlainObject(opts.options[name])) { const subOptions = opts.options[name]; for (const key in subOptions) { obj[key] = subOptions[name]; } } return obj; }, {}); const padLength = getPadLength(tempObj); for (const name in opts.options) { if (_.isString(opts.options[name])) { loggerStacks.push(`${SPACE_CHAR.repeat(2)} * ${chalk.yellow(_.padEnd(name, padLength))} ( ${chalk.gray(opts.options[name])} )`); } else { const subOptions = opts.options[name]; loggerStacks.push(`${SPACE_CHAR.repeat(2)} * ${chalk.yellow(_.padEnd(name, padLength))} ( ${chalk.gray(subOptions[''])} )`); delete subOptions['']; for (const key in subOptions) { loggerStacks.push(`${SPACE_CHAR.repeat(2)} ${chalk.gray('|')} ${chalk.cyan(_.padEnd(key, padLength))} ( ${chalk.gray(subOptions[key])} )`); } } } } if (opts.details) { loggerStacks.push(''); loggerStacks.push(...opts.details .split(os.EOL) .map(line => `${SPACE_CHAR} ${line}`)); } if (loggerStacks.length) { api.logger.logo(os.EOL, loggerStacks.join(os.EOL), os.EOL); } } }