@dojo/cli
Version:
196 lines • 7.39 kB
JavaScript
;
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