#!/usr/bin/env node const chalk = require('chalk') const path = require('path') const eject = require('./eject') const program = require('commander') program .version(require('../package.json').version) .usage(' [options]') program .version(require('../package.json').version) .command('eject [otherDirs...]') .description('copy the default skin into .xgplayer/skin for customization.') .action((dir = '.', otherDirs = ['custom']) => { wrapCommand(eject)(path.resolve(dir), otherDirs[0]) }) // output help information on unknown commands program .arguments('') .action((cmd) => { program.outputHelp() console.log(` ` + chalk.red(`Unknown command ${chalk.yellow(cmd)}.`)) console.log() }) // add some useful info on help program.on('--help', () => { console.log() console.log(` Run ${chalk.cyan(`xgplayer --help`)} for detailed usage of given command.`) console.log() }) program.commands.forEach(c => c.on('--help', () => console.log())) // enhance common error messages const enhanceErrorMessages = (methodName, log) => { program.Command.prototype[methodName] = function (...args) { if (methodName === 'unknownOption' && this._allowUnknownOption) { return } this.outputHelp() console.log(` ` + chalk.red(log(...args))) console.log() process.exit(1) } } enhanceErrorMessages('missingArgument', argName => { return `Missing required argument ${chalk.yellow(`<${argName}>`)}.` }) enhanceErrorMessages('unknownOption', optionName => { return `Unknown option ${chalk.yellow(optionName)}.` }) enhanceErrorMessages('optionMissingArgument', (option, flag) => { return `Missing required argument for option ${chalk.yellow(option.flags)}` + ( flag ? `, got ${chalk.yellow(flag)}` : `` ) }) program.parse(process.argv) if (!process.argv.slice(2).length) { program.outputHelp() } function wrapCommand (fn) { return (...args) => { return fn(...args).catch(err => { console.error(chalk.red(err.stack)) }) } }