UNPKG

@dojo/cli

Version:

Dojo CLI utility

196 lines 7.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const chalk_1 = require("chalk"); const CommandHelper_1 = require("./CommandHelper"); const configurationHelper_1 = require("./configurationHelper"); const Helper_1 = require("./Helper"); const help_1 = require("./help"); const validation_1 = require("./validation"); const command_1 = require("./command"); const validate_1 = require("./commands/validate"); const requireOptions = { demand: false, demandOption: false, requiresArg: false, require: false, required: false }; function reportError(error) { let exitCode = 1; if (error.exitCode !== undefined) { exitCode = error.exitCode; } console.error(chalk_1.default.red.bold(error.message)); process.exit(exitCode); } function userSetOption(option, aliases) { function searchForOption(option) { if (process.argv.indexOf(option) > -1) { return true; } return false; } if (searchForOption(`-${option}`) || searchForOption(`--${option}`)) { return true; } // Handle aliases for same option for (let aliasIndex in aliases[option]) { let alias = aliases[option][aliasIndex]; if (searchForOption(`-${alias}`) || searchForOption(`--${alias}`)) { return true; } } return false; } function getRcOption(rcConfig, option, aliases) { if (rcConfig === undefined) { return undefined; } if (rcConfig[option] !== undefined) { return option; } for (let aliasIndex in aliases[option]) { let alias = aliases[option][aliasIndex]; if (rcConfig[alias] !== undefined) { return alias; } } return undefined; } function getOptions(aliases, rcOptions, commandLineArgs = {}) { const result = Object.keys(commandLineArgs).reduce((config, key) => { if (userSetOption(key, aliases)) { config[key] = commandLineArgs[key]; return config; } const rcOption = getRcOption(rcOptions, key, aliases); if (rcOption) { config[key] = rcOptions[rcOption]; aliases[key].forEach((alias) => { config[alias] = rcOptions[rcOption]; }); } else { config[key] = commandLineArgs[key]; } return config; }, {}); return Object.assign({}, rcOptions, result); } function parseAliases(aliases, key, optionAlias = []) { if (typeof optionAlias === 'string') { aliases[key] = [optionAlias]; aliases[optionAlias] = [key]; } else { aliases[key] = optionAlias; optionAlias.forEach((option, index) => { const optionsCopy = [...optionAlias]; optionsCopy.splice(index, 1); aliases[option] = [key, ...optionsCopy]; }); } return aliases; } /** * Runs through a command's validation and run phases. */ function executeCommand(command, argv, groupName, aliases, helper) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const config = helper.sandbox(groupName, command.name).configuration.get(); const args = getOptions(aliases, config, argv); if (typeof command.validate === 'function') { const valid = yield command.validate(helper.sandbox(groupName, command.name)); if (!valid && !argv.force) { return; } } return command .run(helper.sandbox(groupName, command.name), args) .then(() => { process.exit(0); }) .catch(reportError); }); } function registerGroups(yargs, helper, groupName, commandMap) { const groupMap = new Map().set(groupName, commandMap); const defaultCommand = command_1.getCommand(groupMap, groupName); let aliases = {}; yargs.command(groupName, false, (subYargs) => { defaultCommand.register((key, options) => { aliases = parseAliases(aliases, key, options.alias); subYargs.option(key, Object.assign({}, options, requireOptions)); }, helper.sandbox(groupName, defaultCommand.name)); registerCommands(subYargs, helper, groupName, commandMap); return subYargs .option('h', { alias: 'help' }) .option('force', { type: 'boolean', description: 'Continue running commands even if validation fails' }) .option('dojorc', { default: '.dojorc', type: 'string', description: 'The dojorc config file' }) .showHelpOnFail(false, help_1.formatHelp({ _: [groupName] }, groupMap)) .strict(); }, (argv) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (defaultCommand && argv._.length === 1) { if (argv.h || argv.help) { console.log(help_1.formatHelp(argv, groupMap)); return Promise.resolve({}); } return executeCommand(defaultCommand, argv, groupName, aliases, helper); } })); } function registerCommands(yargs, helper, groupName, commandMap) { [...commandMap.values()].forEach((command) => { const { name, register } = command; let aliases = {}; const groupMap = new Map().set(groupName, commandMap); yargs.command(name, false, (optionsYargs) => { register((key, options) => { aliases = parseAliases(aliases, key, options.alias); optionsYargs.option(key, Object.assign({}, options, requireOptions)); }, helper.sandbox(groupName, name)); return optionsYargs .option('force', { type: 'boolean', description: 'Continue running commands even if validation fails' }) .option('dojorc', { default: '.dojorc', type: 'string', description: 'The dojorc config file' }) .showHelpOnFail(false, help_1.formatHelp({ _: [groupName, name] }, groupMap)) .strict(); }, (argv) => { if (argv.h || argv.help) { console.log(help_1.formatHelp(argv, groupMap)); return Promise.resolve({}); } return executeCommand(command, argv, groupName, aliases, helper); }); }); } function default_1(yargs, groupMap) { const helperContext = {}; const commandHelper = new CommandHelper_1.default(groupMap, helperContext, configurationHelper_1.default); const validateHelper = { validate: validate_1.builtInCommandValidation }; // Provide the default validation helper const helperFactory = new Helper_1.default(commandHelper, yargs, helperContext, configurationHelper_1.default, validateHelper); groupMap.forEach((commandMap, group) => { registerGroups(yargs, helperFactory, group, commandMap); }); yargs .demand(1, '') .command('$0', false, (dojoYargs) => { dojoYargs.option('h', { alias: 'help' }); return dojoYargs; }, (argv) => { console.log(help_1.formatHelp(argv, groupMap)); }) .check(validation_1.createOptionValidator(groupMap), true) .help(false) .showHelpOnFail(false) .strict().argv; } exports.default = default_1; //# sourceMappingURL=registerCommands.js.map