diff options
Diffstat (limited to 'node_modules/yargs/lib')
-rw-r--r-- | node_modules/yargs/lib/apply-extends.js | 21 | ||||
-rw-r--r-- | node_modules/yargs/lib/argsert.js | 30 | ||||
-rw-r--r-- | node_modules/yargs/lib/assign.js | 15 | ||||
-rw-r--r-- | node_modules/yargs/lib/command.js | 309 | ||||
-rw-r--r-- | node_modules/yargs/lib/completion.js | 51 | ||||
-rw-r--r-- | node_modules/yargs/lib/levenshtein.js | 10 | ||||
-rw-r--r-- | node_modules/yargs/lib/obj-filter.js | 7 | ||||
-rw-r--r-- | node_modules/yargs/lib/usage.js | 299 | ||||
-rw-r--r-- | node_modules/yargs/lib/validation.js | 239 | ||||
-rw-r--r-- | node_modules/yargs/lib/yerror.js | 1 |
10 files changed, 543 insertions, 439 deletions
diff --git a/node_modules/yargs/lib/apply-extends.js b/node_modules/yargs/lib/apply-extends.js index 5fc69fab1..3005848e3 100644 --- a/node_modules/yargs/lib/apply-extends.js +++ b/node_modules/yargs/lib/apply-extends.js @@ -1,13 +1,14 @@ -var fs = require('fs') -var path = require('path') -var assign = require('./assign') -var YError = require('./yerror') -var previouslyVisitedConfigs = [] +'use strict' +const fs = require('fs') +const path = require('path') +const YError = require('./yerror') + +let previouslyVisitedConfigs = [] function checkForCircularExtends (path) { if (previouslyVisitedConfigs.indexOf(path) > -1) { - throw new YError("Circular extended configurations: '" + path + "'.") + throw new YError(`Circular extended configurations: '${path}'.`) } } @@ -16,12 +17,12 @@ function getPathToDefaultConfig (cwd, pathToExtend) { } function applyExtends (config, cwd) { - var defaultConfig = {} + let defaultConfig = {} if (config.hasOwnProperty('extends')) { if (typeof config.extends !== 'string') return defaultConfig - var isPath = /\.json$/.test(config.extends) - var pathToDefault = null + const isPath = /\.json$/.test(config.extends) + let pathToDefault = null if (!isPath) { try { pathToDefault = require.resolve(config.extends) @@ -46,7 +47,7 @@ function applyExtends (config, cwd) { previouslyVisitedConfigs = [] - return assign(defaultConfig, config) + return Object.assign({}, defaultConfig, config) } module.exports = applyExtends diff --git a/node_modules/yargs/lib/argsert.js b/node_modules/yargs/lib/argsert.js index d3e72fce5..ed1d59871 100644 --- a/node_modules/yargs/lib/argsert.js +++ b/node_modules/yargs/lib/argsert.js @@ -1,20 +1,21 @@ +'use strict' const command = require('./command')() const YError = require('./yerror') const positionName = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth'] -module.exports = function (expected, callerArguments, length) { +module.exports = function argsert (expected, callerArguments, length) { // TODO: should this eventually raise an exception. try { // preface the argument description with "cmd", so // that we can run it through yargs' command parser. - var position = 0 - var parsed = {demanded: [], optional: []} + let position = 0 + let parsed = {demanded: [], optional: []} if (typeof expected === 'object') { length = callerArguments callerArguments = expected } else { - parsed = command.parseCommand('cmd ' + expected) + parsed = command.parseCommand(`cmd ${expected}`) } const args = [].slice.call(callerArguments) @@ -22,33 +23,27 @@ module.exports = function (expected, callerArguments, length) { length = length || args.length if (length < parsed.demanded.length) { - throw new YError('Not enough arguments provided. Expected ' + parsed.demanded.length + - ' but received ' + args.length + '.') + throw new YError(`Not enough arguments provided. Expected ${parsed.demanded.length} but received ${args.length}.`) } const totalCommands = parsed.demanded.length + parsed.optional.length if (length > totalCommands) { - throw new YError('Too many arguments provided. Expected max ' + totalCommands + - ' but received ' + length + '.') + throw new YError(`Too many arguments provided. Expected max ${totalCommands} but received ${length}.`) } - parsed.demanded.forEach(function (demanded) { + parsed.demanded.forEach((demanded) => { const arg = args.shift() const observedType = guessType(arg) - const matchingTypes = demanded.cmd.filter(function (type) { - return type === observedType || type === '*' - }) + const matchingTypes = demanded.cmd.filter(type => type === observedType || type === '*') if (matchingTypes.length === 0) argumentTypeError(observedType, demanded.cmd, position, false) position += 1 }) - parsed.optional.forEach(function (optional) { + parsed.optional.forEach((optional) => { if (args.length === 0) return const arg = args.shift() const observedType = guessType(arg) - const matchingTypes = optional.cmd.filter(function (type) { - return type === observedType || type === '*' - }) + const matchingTypes = optional.cmd.filter(type => type === observedType || type === '*') if (matchingTypes.length === 0) argumentTypeError(observedType, optional.cmd, position, true) position += 1 }) @@ -67,6 +62,5 @@ function guessType (arg) { } function argumentTypeError (observedType, allowedTypes, position, optional) { - throw new YError('Invalid ' + (positionName[position] || 'manyith') + ' argument.' + - ' Expected ' + allowedTypes.join(' or ') + ' but received ' + observedType + '.') + throw new YError(`Invalid ${positionName[position] || 'manyith'} argument. Expected ${allowedTypes.join(' or ')} but received ${observedType}.`) } diff --git a/node_modules/yargs/lib/assign.js b/node_modules/yargs/lib/assign.js deleted file mode 100644 index 7d5a3cef2..000000000 --- a/node_modules/yargs/lib/assign.js +++ /dev/null @@ -1,15 +0,0 @@ -// lazy Object.assign logic that only works for merging -// two objects; eventually we should replace this with Object.assign. -module.exports = function assign (defaults, configuration) { - var o = {} - configuration = configuration || {} - - Object.keys(defaults).forEach(function (k) { - o[k] = defaults[k] - }) - Object.keys(configuration).forEach(function (k) { - o[k] = configuration[k] - }) - - return o -} diff --git a/node_modules/yargs/lib/command.js b/node_modules/yargs/lib/command.js index 3567cf953..5ac848e21 100644 --- a/node_modules/yargs/lib/command.js +++ b/node_modules/yargs/lib/command.js @@ -1,27 +1,29 @@ -const path = require('path') +'use strict' + const inspect = require('util').inspect -const camelCase = require('camelcase') +const path = require('path') +const Parser = require('yargs-parser') -const DEFAULT_MARKER = '*' +const DEFAULT_MARKER = /(^\*)|(^\$0)/ // handles parsing positional arguments, // and populating argv with said positional // arguments. -module.exports = function (yargs, usage, validation) { +module.exports = function command (yargs, usage, validation) { const self = {} - var handlers = {} - var aliasMap = {} - var defaultCommand - self.addHandler = function (cmd, description, builder, handler) { - var aliases = [] - handler = handler || function () {} + let handlers = {} + let aliasMap = {} + let defaultCommand + self.addHandler = function addHandler (cmd, description, builder, handler) { + let aliases = [] + handler = handler || (() => {}) if (Array.isArray(cmd)) { aliases = cmd.slice(1) cmd = cmd[0] } else if (typeof cmd === 'object') { - var command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd) + let command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd) if (cmd.aliases) command = [].concat(command).concat(cmd.aliases) self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler) return @@ -34,34 +36,22 @@ module.exports = function (yargs, usage, validation) { } // parse positionals out of cmd string - var parsedCommand = self.parseCommand(cmd) + const parsedCommand = self.parseCommand(cmd) // remove positional args from aliases only - aliases = aliases.map(function (alias) { - return self.parseCommand(alias).cmd - }) + aliases = aliases.map(alias => self.parseCommand(alias).cmd) // check for default and filter out '*'' - var isDefault = false - var parsedAliases = [parsedCommand.cmd].concat(aliases).filter(function (c) { - if (c === DEFAULT_MARKER) { + let isDefault = false + const parsedAliases = [parsedCommand.cmd].concat(aliases).filter((c) => { + if (DEFAULT_MARKER.test(c)) { isDefault = true return false } return true }) - - // short-circuit if default with no aliases - if (isDefault && parsedAliases.length === 0) { - defaultCommand = { - original: cmd.replace(DEFAULT_MARKER, '').trim(), - handler: handler, - builder: builder || {}, - demanded: parsedCommand.demanded, - optional: parsedCommand.optional - } - return - } + // standardize on $0 for default command. + if (parsedAliases.length === 0 && isDefault) parsedAliases.push('$0') // shift cmd and aliases after filtering out '*' if (isDefault) { @@ -71,7 +61,7 @@ module.exports = function (yargs, usage, validation) { } // populate aliasMap - aliases.forEach(function (alias) { + aliases.forEach((alias) => { aliasMap[alias] = parsedCommand.cmd }) @@ -81,7 +71,8 @@ module.exports = function (yargs, usage, validation) { handlers[parsedCommand.cmd] = { original: cmd, - handler: handler, + description: description, + handler, builder: builder || {}, demanded: parsedCommand.demanded, optional: parsedCommand.optional @@ -90,16 +81,16 @@ module.exports = function (yargs, usage, validation) { if (isDefault) defaultCommand = handlers[parsedCommand.cmd] } - self.addDirectory = function (dir, context, req, callerFile, opts) { + self.addDirectory = function addDirectory (dir, context, req, callerFile, opts) { opts = opts || {} // disable recursion to support nested directories of subcommands if (typeof opts.recurse !== 'boolean') opts.recurse = false // exclude 'json', 'coffee' from require-directory defaults if (!Array.isArray(opts.extensions)) opts.extensions = ['js'] // allow consumer to define their own visitor function - const parentVisit = typeof opts.visit === 'function' ? opts.visit : function (o) { return o } + const parentVisit = typeof opts.visit === 'function' ? opts.visit : o => o // call addHandler via visitor function - opts.visit = function (obj, joined, filename) { + opts.visit = function visit (obj, joined, filename) { const visited = parentVisit(obj, joined, filename) // allow consumer to skip modules with their own visitor if (visited) { @@ -119,7 +110,7 @@ module.exports = function (yargs, usage, validation) { // if module was not require()d and no name given, throw error function moduleName (obj) { const mod = require('which-module')(obj) - if (!mod) throw new Error('No command name given for module: ' + inspect(obj)) + if (!mod) throw new Error(`No command name given for module: ${inspect(obj)}`) return commandFromFilename(mod.filename) } @@ -129,66 +120,62 @@ module.exports = function (yargs, usage, validation) { } function extractDesc (obj) { - for (var keys = ['describe', 'description', 'desc'], i = 0, l = keys.length, test; i < l; i++) { + for (let keys = ['describe', 'description', 'desc'], i = 0, l = keys.length, test; i < l; i++) { test = obj[keys[i]] if (typeof test === 'string' || typeof test === 'boolean') return test } return false } - self.parseCommand = function (cmd) { - var extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' ') - var splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/) - var bregex = /\.*[\][<>]/g - var parsedCommand = { + self.parseCommand = function parseCommand (cmd) { + const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' ') + const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/) + const bregex = /\.*[\][<>]/g + const parsedCommand = { cmd: (splitCommand.shift()).replace(bregex, ''), demanded: [], optional: [] } - splitCommand.forEach(function (cmd, i) { - var variadic = false + splitCommand.forEach((cmd, i) => { + let variadic = false cmd = cmd.replace(/\s/g, '') if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1) variadic = true if (/^\[/.test(cmd)) { parsedCommand.optional.push({ cmd: cmd.replace(bregex, '').split('|'), - variadic: variadic + variadic }) } else { parsedCommand.demanded.push({ cmd: cmd.replace(bregex, '').split('|'), - variadic: variadic + variadic }) } }) return parsedCommand } - self.getCommands = function () { - return Object.keys(handlers).concat(Object.keys(aliasMap)) - } + self.getCommands = () => Object.keys(handlers).concat(Object.keys(aliasMap)) - self.getCommandHandlers = function () { - return handlers - } + self.getCommandHandlers = () => handlers - self.hasDefaultCommand = function () { - return !!defaultCommand - } + self.hasDefaultCommand = () => !!defaultCommand - self.runCommand = function (command, yargs, parsed, commandIndex) { - var aliases = parsed.aliases - var commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand - var currentContext = yargs.getContext() - var numFiles = currentContext.files.length - var parentCommands = currentContext.commands.slice() + self.runCommand = function runCommand (command, yargs, parsed, commandIndex) { + let aliases = parsed.aliases + const commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand + const currentContext = yargs.getContext() + let numFiles = currentContext.files.length + const parentCommands = currentContext.commands.slice() // what does yargs look like after the buidler is run? - var innerArgv = parsed.argv - var innerYargs = null - var positionalMap = {} - - if (command) currentContext.commands.push(command) + let innerArgv = parsed.argv + let innerYargs = null + let positionalMap = {} + if (command) { + currentContext.commands.push(command) + currentContext.fullCommands.push(commandHandler.original) + } if (typeof commandHandler.builder === 'function') { // a function can be provided, which builds // up a yargs chain and possibly returns it. @@ -198,8 +185,11 @@ module.exports = function (yargs, usage, validation) { // original command string as usage() for consistent behavior with // options object below. if (yargs.parsed === false) { - if (typeof yargs.getUsageInstance().getUsage() === 'undefined') { - yargs.usage('$0 ' + (parentCommands.length ? parentCommands.join(' ') + ' ' : '') + commandHandler.original) + if (shouldUpdateUsage(yargs)) { + yargs.getUsageInstance().usage( + usageFromParentCommandsCommandHandler(parentCommands, commandHandler), + commandHandler.description + ) } innerArgv = innerYargs ? innerYargs._parseArgs(null, null, true, commandIndex) : yargs._parseArgs(null, null, true, commandIndex) } else { @@ -212,8 +202,13 @@ module.exports = function (yargs, usage, validation) { // as a short hand, an object can instead be provided, specifying // the options that a command takes. innerYargs = yargs.reset(parsed.aliases) - innerYargs.usage('$0 ' + (parentCommands.length ? parentCommands.join(' ') + ' ' : '') + commandHandler.original) - Object.keys(commandHandler.builder).forEach(function (key) { + if (shouldUpdateUsage(innerYargs)) { + innerYargs.getUsageInstance().usage( + usageFromParentCommandsCommandHandler(parentCommands, commandHandler), + commandHandler.description + ) + } + Object.keys(commandHandler.builder).forEach((key) => { innerYargs.option(key, commandHandler.builder[key]) }) innerArgv = innerYargs._parseArgs(null, null, true, commandIndex) @@ -233,81 +228,163 @@ module.exports = function (yargs, usage, validation) { commandHandler.handler(innerArgv) } - if (command) currentContext.commands.pop() + if (command) { + currentContext.commands.pop() + currentContext.fullCommands.pop() + } numFiles = currentContext.files.length - numFiles if (numFiles > 0) currentContext.files.splice(numFiles * -1, numFiles) return innerArgv } + function shouldUpdateUsage (yargs) { + return !yargs.getUsageInstance().getUsageDisabled() && + yargs.getUsageInstance().getUsage().length === 0 + } + + function usageFromParentCommandsCommandHandler (parentCommands, commandHandler) { + const c = DEFAULT_MARKER.test(commandHandler.original) ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() : commandHandler.original + const pc = parentCommands.filter((c) => { return !DEFAULT_MARKER.test(c) }) + pc.push(c) + return `$0 ${pc.join(' ')}` + } + + self.runDefaultBuilderOn = function (yargs) { + if (shouldUpdateUsage(yargs)) { + // build the root-level command string from the default string. + const commandString = DEFAULT_MARKER.test(defaultCommand.original) + ? defaultCommand.original : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 ') + yargs.getUsageInstance().usage( + commandString, + defaultCommand.description + ) + } + const builder = defaultCommand.builder + if (typeof builder === 'function') { + builder(yargs) + } else { + Object.keys(builder).forEach((key) => { + yargs.option(key, builder[key]) + }) + } + } + // transcribe all positional arguments "command <foo> <bar> [apple]" // onto argv. function populatePositionals (commandHandler, argv, context, yargs) { argv._ = argv._.slice(context.commands.length) // nuke the current commands - var demanded = commandHandler.demanded.slice(0) - var optional = commandHandler.optional.slice(0) - var positionalMap = {} + const demanded = commandHandler.demanded.slice(0) + const optional = commandHandler.optional.slice(0) + const positionalMap = {} validation.positionalCount(demanded.length, argv._.length) while (demanded.length) { - var demand = demanded.shift() - populatePositional(demand, argv, yargs, positionalMap) + const demand = demanded.shift() + populatePositional(demand, argv, positionalMap) } while (optional.length) { - var maybe = optional.shift() - populatePositional(maybe, argv, yargs, positionalMap) + const maybe = optional.shift() + populatePositional(maybe, argv, positionalMap) } argv._ = context.commands.concat(argv._) + + postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original)) + return positionalMap } - // populate a single positional argument and its - // aliases onto argv. - function populatePositional (positional, argv, yargs, positionalMap) { - // "positional" consists of the positional.cmd, an array representing - // the positional's name and aliases, and positional.variadic - // indicating whether or not it is a variadic array. - var variadics = null - var value = null - for (var i = 0, cmd; (cmd = positional.cmd[i]) !== undefined; i++) { - if (positional.variadic) { - if (variadics) argv[cmd] = variadics.slice(0) - else argv[cmd] = variadics = argv._.splice(0) - } else { - if (!value && !argv._.length) continue - if (value) argv[cmd] = value - else argv[cmd] = value = argv._.shift() - } - positionalMap[cmd] = true - postProcessPositional(yargs, argv, cmd) - addCamelCaseExpansions(argv, cmd) + function populatePositional (positional, argv, positionalMap, parseOptions) { + const cmd = positional.cmd[0] + if (positional.variadic) { + positionalMap[cmd] = argv._.splice(0).map(String) + } else { + if (argv._.length) positionalMap[cmd] = [String(argv._.shift())] } } - // TODO move positional arg logic to yargs-parser and remove this duplication - function postProcessPositional (yargs, argv, key) { - var coerce = yargs.getOptions().coerce[key] - if (typeof coerce === 'function') { - try { - argv[key] = coerce(argv[key]) - } catch (err) { - yargs.getUsageInstance().fail(err.message, err) - } + // we run yargs-parser against the positional arguments + // applying the same parsing logic used for flags. + function postProcessPositionals (argv, positionalMap, parseOptions) { + // combine the parsing hints we've inferred from the command + // string with explicitly configured parsing hints. + const options = Object.assign({}, yargs.getOptions()) + options.default = Object.assign(parseOptions.default, options.default) + options.alias = Object.assign(parseOptions.alias, options.alias) + options.array = options.array.concat(parseOptions.array) + + const unparsed = [] + Object.keys(positionalMap).forEach((key) => { + positionalMap[key].map((value) => { + unparsed.push(`--${key}`) + unparsed.push(value) + }) + }) + + // short-circuit parse. + if (!unparsed.length) return + + const parsed = Parser.detailed(unparsed, options) + + if (parsed.error) { + yargs.getUsageInstance().fail(parsed.error.message, parsed.error) + } else { + // only copy over positional keys (don't overwrite + // flag arguments that were already parsed). + const positionalKeys = Object.keys(positionalMap) + Object.keys(positionalMap).forEach((key) => { + [].push.apply(positionalKeys, parsed.aliases[key]) + }) + + Object.keys(parsed.argv).forEach((key) => { + if (positionalKeys.indexOf(key) !== -1) { + argv[key] = parsed.argv[key] + } + }) } } - function addCamelCaseExpansions (argv, option) { - if (/-/.test(option)) { - const cc = camelCase(option) - if (typeof argv[option] === 'object') argv[cc] = argv[option].slice(0) - else argv[cc] = argv[option] + self.cmdToParseOptions = function (cmdString) { + const parseOptions = { + array: [], + default: {}, + alias: {}, + demand: {} } + + const parsed = self.parseCommand(cmdString) + parsed.demanded.forEach((d) => { + const cmds = d.cmd.slice(0) + const cmd = cmds.shift() + if (d.variadic) { + parseOptions.array.push(cmd) + parseOptions.default[cmd] = [] + } + cmds.forEach((c) => { + parseOptions.alias[cmd] = c + }) + parseOptions.demand[cmd] = true + }) + + parsed.optional.forEach((o) => { + const cmds = o.cmd.slice(0) + const cmd = cmds.shift() + if (o.variadic) { + parseOptions.array.push(cmd) + parseOptions.default[cmd] = [] + } + cmds.forEach((c) => { + parseOptions.alias[cmd] = c + }) + }) + + return parseOptions } - self.reset = function () { + self.reset = () => { handlers = {} aliasMap = {} defaultCommand = undefined @@ -318,14 +395,14 @@ module.exports = function (yargs, usage, validation) { // the state of commands such that // we can apply .parse() multiple times // with the same yargs instance. - var frozen - self.freeze = function () { + let frozen + self.freeze = () => { frozen = {} frozen.handlers = handlers frozen.aliasMap = aliasMap frozen.defaultCommand = defaultCommand } - self.unfreeze = function () { + self.unfreeze = () => { handlers = frozen.handlers aliasMap = frozen.aliasMap defaultCommand = frozen.defaultCommand diff --git a/node_modules/yargs/lib/completion.js b/node_modules/yargs/lib/completion.js index 5cd9a18a0..ad6969a2d 100644 --- a/node_modules/yargs/lib/completion.js +++ b/node_modules/yargs/lib/completion.js @@ -1,16 +1,17 @@ +'use strict' const fs = require('fs') const path = require('path') // add bash completions to your // yargs-powered applications. -module.exports = function (yargs, usage, command) { +module.exports = function completion (yargs, usage, command) { const self = { completionKey: 'get-yargs-completions' } // get a list of completion commands. // 'args' is the array of strings from the line to be completed - self.getCompletion = function (args, done) { + self.getCompletion = function getCompletion (args, done) { const completions = [] const current = args.length ? args[args.length - 1] : '' const argv = yargs.parse(args, true) @@ -20,14 +21,14 @@ module.exports = function (yargs, usage, command) { // to completion(). if (completionFunction) { if (completionFunction.length < 3) { - var result = completionFunction(current, argv) + const result = completionFunction(current, argv) // promise based completion function. if (typeof result.then === 'function') { - return result.then(function (list) { - process.nextTick(function () { done(list) }) - }).catch(function (err) { - process.nextTick(function () { throw err }) + return result.then((list) => { + process.nextTick(() => { done(list) }) + }).catch((err) => { + process.nextTick(() => { throw err }) }) } @@ -35,14 +36,14 @@ module.exports = function (yargs, usage, command) { return done(result) } else { // asynchronous completion function - return completionFunction(current, argv, function (completions) { + return completionFunction(current, argv, (completions) => { done(completions) }) } } - var handlers = command.getCommandHandlers() - for (var i = 0, ii = args.length; i < ii; ++i) { + const handlers = command.getCommandHandlers() + for (let i = 0, ii = args.length; i < ii; ++i) { if (handlers[args[i]] && handlers[args[i]].builder) { const builder = handlers[args[i]].builder if (typeof builder === 'function') { @@ -54,22 +55,21 @@ module.exports = function (yargs, usage, command) { } if (!current.match(/^-/)) { - usage.getCommands().forEach(function (command) { - if (args.indexOf(command[0]) === -1) { - completions.push(command[0]) + usage.getCommands().forEach((usageCommand) => { + const commandName = command.parseCommand(usageCommand[0]).cmd + if (args.indexOf(commandName) === -1) { + completions.push(commandName) } }) } if (current.match(/^-/)) { - Object.keys(yargs.getOptions().key).forEach(function (key) { + Object.keys(yargs.getOptions().key).forEach((key) => { // If the key and its aliases aren't in 'args', add the key to 'completions' - var keyAndAliases = [key].concat(aliases[key] || []) - var notInArgs = keyAndAliases.every(function (val) { - return args.indexOf('--' + val) === -1 - }) + const keyAndAliases = [key].concat(aliases[key] || []) + const notInArgs = keyAndAliases.every(val => args.indexOf(`--${val}`) === -1) if (notInArgs) { - completions.push('--' + key) + completions.push(`--${key}`) } }) } @@ -78,25 +78,26 @@ module.exports = function (yargs, usage, command) { } // generate the completion script to add to your .bashrc. - self.generateCompletionScript = function ($0) { - var script = fs.readFileSync( + self.generateCompletionScript = function generateCompletionScript ($0, cmd) { + let script = fs.readFileSync( path.resolve(__dirname, '../completion.sh.hbs'), 'utf-8' ) - var name = path.basename($0) + const name = path.basename($0) // add ./to applications not yet installed as bin. - if ($0.match(/\.js$/)) $0 = './' + $0 + if ($0.match(/\.js$/)) $0 = `./${$0}` script = script.replace(/{{app_name}}/g, name) + script = script.replace(/{{completion_command}}/g, cmd) return script.replace(/{{app_path}}/g, $0) } // register a function to perform your own custom // completions., this function can be either // synchrnous or asynchronous. - var completionFunction = null - self.registerFunction = function (fn) { + let completionFunction = null + self.registerFunction = (fn) => { completionFunction = fn } diff --git a/node_modules/yargs/lib/levenshtein.js b/node_modules/yargs/lib/levenshtein.js index 6ec216f59..f32b0c277 100644 --- a/node_modules/yargs/lib/levenshtein.js +++ b/node_modules/yargs/lib/levenshtein.js @@ -10,22 +10,22 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI // levenshtein distance algorithm, pulled from Andrei Mackenzie's MIT licensed. // gist, which can be found here: https://gist.github.com/andrei-m/982927 - +'use strict' // Compute the edit distance between the two given strings -module.exports = function (a, b) { +module.exports = function levenshtein (a, b) { if (a.length === 0) return b.length if (b.length === 0) return a.length - var matrix = [] + const matrix = [] // increment along the first column of each row - var i + let i for (i = 0; i <= b.length; i++) { matrix[i] = [i] } // increment each column in the first row - var j + let j for (j = 0; j <= a.length; j++) { matrix[0][j] = j } diff --git a/node_modules/yargs/lib/obj-filter.js b/node_modules/yargs/lib/obj-filter.js index 42cb9961e..c344ac58c 100644 --- a/node_modules/yargs/lib/obj-filter.js +++ b/node_modules/yargs/lib/obj-filter.js @@ -1,7 +1,8 @@ -module.exports = function (original, filter) { +'use strict' +module.exports = function objFilter (original, filter) { const obj = {} - filter = filter || function (k, v) { return true } - Object.keys(original || {}).forEach(function (key) { + filter = filter || ((k, v) => true) + Object.keys(original || {}).forEach((key) => { if (filter(key, original[key])) { obj[key] = original[key] } diff --git a/node_modules/yargs/lib/usage.js b/node_modules/yargs/lib/usage.js index 43f71225c..cf79b10de 100644 --- a/node_modules/yargs/lib/usage.js +++ b/node_modules/yargs/lib/usage.js @@ -1,23 +1,25 @@ +'use strict' // this file handles outputting usage instructions, // failures, etc. keeps logging in one place. const stringWidth = require('string-width') const objFilter = require('./obj-filter') +const path = require('path') const setBlocking = require('set-blocking') const YError = require('./yerror') -module.exports = function (yargs, y18n) { +module.exports = function usage (yargs, y18n) { const __ = y18n.__ const self = {} // methods for ouputting/building failure message. - var fails = [] - self.failFn = function (f) { + const fails = [] + self.failFn = function failFn (f) { fails.push(f) } - var failMessage = null - var showHelpOnFail = true - self.showHelpOnFail = function (enabled, message) { + let failMessage = null + let showHelpOnFail = true + self.showHelpOnFail = function showHelpOnFailFn (enabled, message) { if (typeof enabled === 'string') { message = enabled enabled = true @@ -29,12 +31,12 @@ module.exports = function (yargs, y18n) { return self } - var failureOutput = false - self.fail = function (msg, err) { + let failureOutput = false + self.fail = function fail (msg, err) { const logger = yargs._getLoggerInstance() if (fails.length) { - for (var i = fails.length - 1; i >= 0; --i) { + for (let i = fails.length - 1; i >= 0; --i) { fails[i](msg, err, self) } } else { @@ -63,56 +65,67 @@ module.exports = function (yargs, y18n) { } // methods for ouputting/building help (usage) message. - var usage - self.usage = function (msg) { - usage = msg + let usages = [] + let usageDisabled = false + self.usage = (msg, description) => { + if (msg === null) { + usageDisabled = true + usages = [] + return + } + usageDisabled = false + usages.push([msg, description || '']) + return self + } + self.getUsage = () => { + return usages } - self.getUsage = function () { - return usage + self.getUsageDisabled = () => { + return usageDisabled + } + + self.getPositionalGroupName = () => { + return __('Positionals:') } - var examples = [] - self.example = function (cmd, description) { + let examples = [] + self.example = (cmd, description) => { examples.push([cmd, description || '']) } - var commands = [] - self.command = function (cmd, description, isDefault, aliases) { + let commands = [] + self.command = function command (cmd, description, isDefault, aliases) { // the last default wins, so cancel out any previously set default if (isDefault) { - commands = commands.map(function (cmdArray) { + commands = commands.map((cmdArray) => { cmdArray[2] = false return cmdArray }) } commands.push([cmd, description || '', isDefault, aliases]) } - self.getCommands = function () { - return commands - } + self.getCommands = () => commands - var descriptions = {} - self.describe = function (key, desc) { + let descriptions = {} + self.describe = function describe (key, desc) { if (typeof key === 'object') { - Object.keys(key).forEach(function (k) { + Object.keys(key).forEach((k) => { self.describe(k, key[k]) }) } else { descriptions[key] = desc } } - self.getDescriptions = function () { - return descriptions - } + self.getDescriptions = () => descriptions - var epilog - self.epilog = function (msg) { + let epilog + self.epilog = (msg) => { epilog = msg } - var wrapSet = false - var wrap - self.wrap = function (cols) { + let wrapSet = false + let wrap + self.wrap = (cols) => { wrapSet = true wrap = cols } @@ -126,41 +139,57 @@ module.exports = function (yargs, y18n) { return wrap } - var deferY18nLookupPrefix = '__yargsString__:' - self.deferY18nLookup = function (str) { - return deferY18nLookupPrefix + str - } + const deferY18nLookupPrefix = '__yargsString__:' + self.deferY18nLookup = str => deferY18nLookupPrefix + str - var defaultGroup = 'Options:' - self.help = function () { + const defaultGroup = 'Options:' + self.help = function help () { normalizeAliases() // handle old demanded API - var demandedOptions = yargs.getDemandedOptions() - var demandedCommands = yargs.getDemandedCommands() - var groups = yargs.getGroups() - var options = yargs.getOptions() - var keys = Object.keys( + const base$0 = path.basename(yargs.$0) + const demandedOptions = yargs.getDemandedOptions() + const demandedCommands = yargs.getDemandedCommands() + const groups = yargs.getGroups() + const options = yargs.getOptions() + let keys = Object.keys( Object.keys(descriptions) .concat(Object.keys(demandedOptions)) .concat(Object.keys(demandedCommands)) .concat(Object.keys(options.default)) - .reduce(function (acc, key) { + .reduce((acc, key) => { if (key !== '_') acc[key] = true return acc }, {}) ) - var theWrap = getWrap() - var ui = require('cliui')({ + const theWrap = getWrap() + const ui = require('cliui')({ width: theWrap, wrap: !!theWrap }) // the usage string. - if (usage) { - var u = usage.replace(/\$0/g, yargs.$0) - ui.div(u + '\n') + if (!usageDisabled) { + if (usages.length) { + // user-defined usage. + usages.forEach((usage) => { + ui.div(`${usage[0].replace(/\$0/g, base$0)}`) + if (usage[1]) { + ui.div({text: `${usage[1]}`, padding: [1, 0, 0, 0]}) + } + }) + ui.div() + } else if (commands.length) { + let u = null + // demonstrate how commands are used. + if (demandedCommands._) { + u = `${base$0} <${__('command')}>\n` + } else { + u = `${base$0} [${__('command')}]\n` + } + ui.div(`${u}`) + } } // your application's commands, i.e., non-option @@ -168,15 +197,23 @@ module.exports = function (yargs, y18n) { if (commands.length) { ui.div(__('Commands:')) - commands.forEach(function (command) { + const context = yargs.getContext() + const parentCommands = context.commands.length ? `${context.commands.join(' ')} ` : '' + + commands.forEach((command) => { + const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\$0 ?/, '')}` // drop $0 from default commands. ui.span( - {text: command[0], padding: [0, 2, 0, 2], width: maxWidth(commands, theWrap) + 4}, + { + text: commandString, + padding: [0, 2, 0, 2], + width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4 + }, {text: command[1]} ) - var hints = [] - if (command[2]) hints.push('[' + __('default:').slice(0, -1) + ']') // TODO hacking around i18n here + const hints = [] + if (command[2]) hints.push(`[${__('default:').slice(0, -1)}]`) // TODO hacking around i18n here if (command[3] && command[3].length) { - hints.push('[' + __('aliases:') + ' ' + command[3].join(', ') + ']') + hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`) } if (hints.length) { ui.div({text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right'}) @@ -190,14 +227,10 @@ module.exports = function (yargs, y18n) { // perform some cleanup on the keys array, making it // only include top-level keys not their aliases. - var aliasKeys = (Object.keys(options.alias) || []) + const aliasKeys = (Object.keys(options.alias) || []) .concat(Object.keys(yargs.parsed.newAliases) || []) - keys = keys.filter(function (key) { - return !yargs.parsed.newAliases[key] && aliasKeys.every(function (alias) { - return (options.alias[alias] || []).indexOf(key) === -1 - }) - }) + keys = keys.filter(key => !yargs.parsed.newAliases[key] && aliasKeys.every(alias => (options.alias[alias] || []).indexOf(key) === -1)) // populate 'Options:' group with any keys that have not // explicitly had a group set. @@ -205,51 +238,54 @@ module.exports = function (yargs, y18n) { addUngroupedKeys(keys, options.alias, groups) // display 'Options:' table along with any custom tables: - Object.keys(groups).forEach(function (groupName) { + Object.keys(groups).forEach((groupName) => { if (!groups[groupName].length) return ui.div(__(groupName)) // if we've grouped the key 'f', but 'f' aliases 'foobar', // normalizedKeys should contain only 'foobar'. - var normalizedKeys = groups[groupName].map(function (key) { + const normalizedKeys = groups[groupName].map((key) => { if (~aliasKeys.indexOf(key)) return key - for (var i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) { + for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) { if (~(options.alias[aliasKey] || []).indexOf(key)) return aliasKey } return key }) // actually generate the switches string --foo, -f, --bar. - var switches = normalizedKeys.reduce(function (acc, key) { + const switches = normalizedKeys.reduce((acc, key) => { acc[key] = [ key ].concat(options.alias[key] || []) - .map(function (sw) { - return (sw.length > 1 ? '--' : '-') + sw + .map(sw => { + // for the special positional group don't + // add '--' or '-' prefix. + if (groupName === self.getPositionalGroupName()) return sw + else return (sw.length > 1 ? '--' : '-') + sw }) .join(', ') return acc }, {}) - normalizedKeys.forEach(function (key) { - var kswitch = switches[key] - var desc = descriptions[key] || '' - var type = null + normalizedKeys.forEach((key) => { + const kswitch = switches[key] + let desc = descriptions[key] || '' + let type = null if (~desc.lastIndexOf(deferY18nLookupPrefix)) desc = __(desc.substring(deferY18nLookupPrefix.length)) - if (~options.boolean.indexOf(key)) type = '[' + __('boolean') + ']' - if (~options.count.indexOf(key)) type = '[' + __('count') + ']' - if (~options.string.indexOf(key)) type = '[' + __('string') + ']' - if (~options.normalize.indexOf(key)) type = '[' + __('string') + ']' - if (~options.array.indexOf(key)) type = '[' + __('array') + ']' - if (~options.number.indexOf(key)) type = '[' + __('number') + ']' + if (~options.boolean.indexOf(key)) type = `[${__('boolean')}]` + if (~options.count.indexOf(key)) type = `[${__('count')}]` + if (~options.string.indexOf(key)) type = `[${__('string')}]` + if (~options.normalize.indexOf(key)) type = `[${__('string')}]` + if (~options.array.indexOf(key)) type = `[${__('array')}]` + if (~options.number.indexOf(key)) type = `[${__('number')}]` - var extra = [ + const extra = [ type, - (key in demandedOptions) ? '[' + __('required') + ']' : null, - options.choices && options.choices[key] ? '[' + __('choices:') + ' ' + - self.stringifiedValues(options.choices[key]) + ']' : null, + (key in demandedOptions) ? `[${__('required')}]` : null, + options.choices && options.choices[key] ? `[${__('choices:')} ${ + self.stringifiedValues(options.choices[key])}]` : null, defaultString(options.default[key], options.defaultDescription[key]) ].filter(Boolean).join(' ') @@ -269,11 +305,11 @@ module.exports = function (yargs, y18n) { if (examples.length) { ui.div(__('Examples:')) - examples.forEach(function (example) { - example[0] = example[0].replace(/\$0/g, yargs.$0) + examples.forEach((example) => { + example[0] = example[0].replace(/\$0/g, base$0) }) - examples.forEach(function (example) { + examples.forEach((example) => { if (example[1] === '') { ui.div( { @@ -299,8 +335,8 @@ module.exports = function (yargs, y18n) { // the usage string. if (epilog) { - var e = epilog.replace(/\$0/g, yargs.$0) - ui.div(e + '\n') + const e = epilog.replace(/\$0/g, base$0) + ui.div(`${e}\n`) } return ui.toString() @@ -308,19 +344,20 @@ module.exports = function (yargs, y18n) { // return the maximum width of a string // in the left-hand column of a table. - function maxWidth (table, theWrap) { - var width = 0 + function maxWidth (table, theWrap, modifier) { + let width = 0 // table might be of the form [leftColumn], // or {key: leftColumn} if (!Array.isArray(table)) { - table = Object.keys(table).map(function (key) { - return [table[key]] - }) + table = Object.keys(table).map(key => [table[key]]) } - table.forEach(function (v) { - width = Math.max(stringWidth(v[0]), width) + table.forEach((v) => { + width = Math.max( + stringWidth(modifier ? `${modifier} ${v[0]}` : v[0]), + width + ) }) // if we've enabled 'wrap' we should limit @@ -334,11 +371,11 @@ module.exports = function (yargs, y18n) { // are copied to the keys being aliased. function normalizeAliases () { // handle old demanded API - var demandedOptions = yargs.getDemandedOptions() - var options = yargs.getOptions() + const demandedOptions = yargs.getDemandedOptions() + const options = yargs.getOptions() - ;(Object.keys(options.alias) || []).forEach(function (key) { - options.alias[key].forEach(function (alias) { + ;(Object.keys(options.alias) || []).forEach((key) => { + options.alias[key].forEach((alias) => { // copy descriptions. if (descriptions[alias]) self.describe(key, descriptions[alias]) // copy demanded. @@ -357,43 +394,41 @@ module.exports = function (yargs, y18n) { // given a set of keys, place any keys that are // ungrouped under the 'Options:' grouping. function addUngroupedKeys (keys, aliases, groups) { - var groupedKeys = [] - var toCheck = null - Object.keys(groups).forEach(function (group) { + let groupedKeys = [] + let toCheck = null + Object.keys(groups).forEach((group) => { groupedKeys = groupedKeys.concat(groups[group]) }) - keys.forEach(function (key) { + keys.forEach((key) => { toCheck = [key].concat(aliases[key]) - if (!toCheck.some(function (k) { - return groupedKeys.indexOf(k) !== -1 - })) { + if (!toCheck.some(k => groupedKeys.indexOf(k) !== -1)) { groups[defaultGroup].push(key) } }) return groupedKeys } - self.showHelp = function (level) { + self.showHelp = (level) => { const logger = yargs._getLoggerInstance() if (!level) level = 'error' - var emit = typeof level === 'function' ? level : logger[level] + const emit = typeof level === 'function' ? level : logger[level] emit(self.help()) } - self.functionDescription = function (fn) { - var description = fn.name ? require('decamelize')(fn.name, '-') : __('generated-value') + self.functionDescription = (fn) => { + const description = fn.name ? require('decamelize')(fn.name, '-') : __('generated-value') return ['(', description, ')'].join('') } - self.stringifiedValues = function (values, separator) { - var string = '' - var sep = separator || ', ' - var array = [].concat(values) + self.stringifiedValues = function stringifiedValues (values, separator) { + let string = '' + const sep = separator || ', ' + const array = [].concat(values) if (!values || !array.length) return string - array.forEach(function (value) { + array.forEach((value) => { if (string.length) string += sep string += JSON.stringify(value) }) @@ -404,7 +439,7 @@ module.exports = function (yargs, y18n) { // format the default-value-string displayed in // the right-hand column. function defaultString (value, defaultDescription) { - var string = '[' + __('default:') + ' ' + let string = `[${__('default:')} ` if (value === undefined && !defaultDescription) return null @@ -413,7 +448,7 @@ module.exports = function (yargs, y18n) { } else { switch (typeof value) { case 'string': - string += JSON.stringify(value) + string += `"${value}"` break case 'object': string += JSON.stringify(value) @@ -423,12 +458,12 @@ module.exports = function (yargs, y18n) { } } - return string + ']' + return `${string}]` } // guess the width of the console window, max-width 80. function windowWidth () { - var maxWidth = 80 + const maxWidth = 80 if (typeof process === 'object' && process.stdout && process.stdout.columns) { return Math.min(maxWidth, process.stdout.columns) } else { @@ -437,47 +472,47 @@ module.exports = function (yargs, y18n) { } // logic for displaying application version. - var version = null - self.version = function (ver) { + let version = null + self.version = (ver) => { version = ver } - self.showVersion = function () { + self.showVersion = () => { const logger = yargs._getLoggerInstance() - if (typeof version === 'function') logger.log(version()) - else logger.log(version) + logger.log(version) } - self.reset = function (localLookup) { + self.reset = function reset (localLookup) { // do not reset wrap here // do not reset fails here failMessage = null failureOutput = false - usage = undefined + usages = [] + usageDisabled = false epilog = undefined examples = [] commands = [] - descriptions = objFilter(descriptions, function (k, v) { - return !localLookup[k] - }) + descriptions = objFilter(descriptions, (k, v) => !localLookup[k]) return self } - var frozen - self.freeze = function () { + let frozen + self.freeze = function freeze () { frozen = {} frozen.failMessage = failMessage frozen.failureOutput = failureOutput - frozen.usage = usage + frozen.usages = usages + frozen.usageDisabled = usageDisabled frozen.epilog = epilog frozen.examples = examples frozen.commands = commands frozen.descriptions = descriptions } - self.unfreeze = function () { + self.unfreeze = function unfreeze () { failMessage = frozen.failMessage failureOutput = frozen.failureOutput - usage = frozen.usage + usages = frozen.usages + usageDisabled = frozen.usageDisabled epilog = frozen.epilog examples = frozen.examples commands = frozen.commands diff --git a/node_modules/yargs/lib/validation.js b/node_modules/yargs/lib/validation.js index 2f9ff8e6c..1eee2fb02 100644 --- a/node_modules/yargs/lib/validation.js +++ b/node_modules/yargs/lib/validation.js @@ -1,16 +1,18 @@ +'use strict' +const argsert = require('./argsert') const objFilter = require('./obj-filter') const specialKeys = ['$0', '--', '_'] // validation-type-stuff, missing params, // bad implications, custom checks. -module.exports = function (yargs, usage, y18n) { +module.exports = function validation (yargs, usage, y18n) { const __ = y18n.__ const __n = y18n.__n const self = {} // validate appropriate # of non-option // arguments were provided, i.e., '_'. - self.nonOptionCount = function (argv) { + self.nonOptionCount = function nonOptionCount (argv) { const demandedCommands = yargs.getDemandedCommands() // don't count currently executing commands const _s = argv._.length - yargs.getContext().commands.length @@ -44,7 +46,7 @@ module.exports = function (yargs, usage, y18n) { // validate the appropriate # of <required> // positional arguments were provided: - self.positionalCount = function (required, observed) { + self.positionalCount = function positionalCount (required, observed) { if (observed < required) { usage.fail( __('Not enough non-option arguments: got %s, need at least %s', observed, required) @@ -54,14 +56,14 @@ module.exports = function (yargs, usage, y18n) { // make sure that any args that require an // value (--foo=bar), have a value. - self.missingArgumentValue = function (argv) { + self.missingArgumentValue = function missingArgumentValue (argv) { const defaultValues = [true, false, ''] const options = yargs.getOptions() if (options.requiresArg.length > 0) { const missingRequiredArgs = [] - options.requiresArg.forEach(function (key) { + options.requiresArg.forEach((key) => { const value = argv[key] // if a value is explicitly requested, @@ -85,11 +87,11 @@ module.exports = function (yargs, usage, y18n) { } // make sure all the required arguments are present. - self.requiredArguments = function (argv) { + self.requiredArguments = function requiredArguments (argv) { const demandedOptions = yargs.getDemandedOptions() - var missing = null + let missing = null - Object.keys(demandedOptions).forEach(function (key) { + Object.keys(demandedOptions).forEach((key) => { if (!argv.hasOwnProperty(key) || typeof argv[key] === 'undefined') { missing = missing || {} missing[key] = demandedOptions[key] @@ -98,14 +100,14 @@ module.exports = function (yargs, usage, y18n) { if (missing) { const customMsgs = [] - Object.keys(missing).forEach(function (key) { + Object.keys(missing).forEach((key) => { const msg = missing[key] if (msg && customMsgs.indexOf(msg) < 0) { customMsgs.push(msg) } }) - const customMsg = customMsgs.length ? '\n' + customMsgs.join('\n') : '' + const customMsg = customMsgs.length ? `\n${customMsgs.join('\n')}` : '' usage.fail(__n( 'Missing required argument: %s', @@ -117,33 +119,23 @@ module.exports = function (yargs, usage, y18n) { } // check for unknown arguments (strict-mode). - self.unknownArguments = function (argv, aliases, positionalMap) { - const aliasLookup = {} - const descriptions = usage.getDescriptions() - const demandedOptions = yargs.getDemandedOptions() + self.unknownArguments = function unknownArguments (argv, aliases, positionalMap) { const commandKeys = yargs.getCommandInstance().getCommands() const unknown = [] const currentContext = yargs.getContext() - Object.keys(aliases).forEach(function (key) { - aliases[key].forEach(function (alias) { - aliasLookup[alias] = key - }) - }) - - Object.keys(argv).forEach(function (key) { + Object.keys(argv).forEach((key) => { if (specialKeys.indexOf(key) === -1 && - !descriptions.hasOwnProperty(key) && - !demandedOptions.hasOwnProperty(key) && !positionalMap.hasOwnProperty(key) && !yargs._getParseContext().hasOwnProperty(key) && - !aliasLookup.hasOwnProperty(key)) { + !aliases.hasOwnProperty(key) + ) { unknown.push(key) } }) if (commandKeys.length > 0) { - argv._.slice(currentContext.commands.length).forEach(function (key) { + argv._.slice(currentContext.commands.length).forEach((key) => { if (commandKeys.indexOf(key) === -1) { unknown.push(key) } @@ -161,18 +153,19 @@ module.exports = function (yargs, usage, y18n) { } // validate arguments limited to enumerated choices - self.limitedChoices = function (argv) { + self.limitedChoices = function limitedChoices (argv) { const options = yargs.getOptions() const invalid = {} if (!Object.keys(options.choices).length) return - Object.keys(argv).forEach(function (key) { + Object.keys(argv).forEach((key) => { if (specialKeys.indexOf(key) === -1 && options.choices.hasOwnProperty(key)) { - [].concat(argv[key]).forEach(function (value) { + [].concat(argv[key]).forEach((value) => { // TODO case-insensitive configurability - if (options.choices[key].indexOf(value) === -1) { + if (options.choices[key].indexOf(value) === -1 && + value !== undefined) { invalid[key] = (invalid[key] || []).concat(value) } }) @@ -183,31 +176,31 @@ module.exports = function (yargs, usage, y18n) { if (!invalidKeys.length) return - var msg = __('Invalid values:') - invalidKeys.forEach(function (key) { - msg += '\n ' + __( + let msg = __('Invalid values:') + invalidKeys.forEach((key) => { + msg += `\n ${__( 'Argument: %s, Given: %s, Choices: %s', key, usage.stringifiedValues(invalid[key]), usage.stringifiedValues(options.choices[key]) - ) + )}` }) usage.fail(msg) } // custom checks, added using the `check` option on yargs. - var checks = [] - self.check = function (f, global) { + let checks = [] + self.check = function check (f, global) { checks.push({ func: f, - global: global + global }) } - self.customChecks = function (argv, aliases) { - for (var i = 0, f; (f = checks[i]) !== undefined; i++) { - var func = f.func - var result = null + self.customChecks = function customChecks (argv, aliases) { + for (let i = 0, f; (f = checks[i]) !== undefined; i++) { + const func = f.func + let result = null try { result = func(argv, aliases) } catch (err) { @@ -224,107 +217,129 @@ module.exports = function (yargs, usage, y18n) { } // check implications, argument foo implies => argument bar. - var implied = {} - self.implies = function (key, value) { + let implied = {} + self.implies = function implies (key, value) { + argsert('<string|object> [array|number|string]', [key, value], arguments.length) + if (typeof key === 'object') { - Object.keys(key).forEach(function (k) { + Object.keys(key).forEach((k) => { self.implies(k, key[k]) }) } else { yargs.global(key) - implied[key] = value + if (!implied[key]) { + implied[key] = [] + } + if (Array.isArray(value)) { + value.forEach((i) => self.implies(key, i)) + } else { + implied[key].push(value) + } } } - self.getImplied = function () { + self.getImplied = function getImplied () { return implied } - self.implications = function (argv) { + self.implications = function implications (argv) { const implyFail = [] - Object.keys(implied).forEach(function (key) { - var num + Object.keys(implied).forEach((key) => { const origKey = key - var value = implied[key] - - // convert string '1' to number 1 - num = Number(key) - key = isNaN(num) ? key : num - - if (typeof key === 'number') { - // check length of argv._ - key = argv._.length >= key - } else if (key.match(/^--no-.+/)) { - // check if key doesn't exist - key = key.match(/^--no-(.+)/)[1] - key = !argv[key] - } else { - // check if key exists - key = argv[key] - } - - num = Number(value) - value = isNaN(num) ? value : num + ;(implied[key] || []).forEach((value) => { + let num + let key = origKey + const origValue = value + + // convert string '1' to number 1 + num = Number(key) + key = isNaN(num) ? key : num + + if (typeof key === 'number') { + // check length of argv._ + key = argv._.length >= key + } else if (key.match(/^--no-.+/)) { + // check if key doesn't exist + key = key.match(/^--no-(.+)/)[1] + key = !argv[key] + } else { + // check if key exists + key = argv[key] + } - if (typeof value === 'number') { - value = argv._.length >= value - } else if (value.match(/^--no-.+/)) { - value = value.match(/^--no-(.+)/)[1] - value = !argv[value] - } else { - value = argv[value] - } + num = Number(value) + value = isNaN(num) ? value : num - if (key && !value) { - implyFail.push(origKey) - } + if (typeof value === 'number') { + value = argv._.length >= value + } else if (value.match(/^--no-.+/)) { + value = value.match(/^--no-(.+)/)[1] + value = !argv[value] + } else { + value = argv[value] + } + if (key && !value) { + implyFail.push(` ${origKey} -> ${origValue}`) + } + }) }) if (implyFail.length) { - var msg = __('Implications failed:') + '\n' + let msg = `${__('Implications failed:')}\n` - implyFail.forEach(function (key) { - msg += (' ' + key + ' -> ' + implied[key]) + implyFail.forEach((value) => { + msg += (value) }) usage.fail(msg) } } - var conflicting = {} - self.conflicts = function (key, value) { + let conflicting = {} + self.conflicts = function conflicts (key, value) { + argsert('<string|object> [array|string]', [key, value], arguments.length) + if (typeof key === 'object') { - Object.keys(key).forEach(function (k) { + Object.keys(key).forEach((k) => { self.conflicts(k, key[k]) }) } else { yargs.global(key) - conflicting[key] = value + if (!conflicting[key]) { + conflicting[key] = [] + } + if (Array.isArray(value)) { + value.forEach((i) => self.conflicts(key, i)) + } else { + conflicting[key].push(value) + } } } - self.getConflicting = function () { - return conflicting - } - - self.conflicting = function (argv) { - var args = Object.getOwnPropertyNames(argv) - - args.forEach(function (arg) { - if (conflicting[arg] && args.indexOf(conflicting[arg]) !== -1) { - usage.fail(__('Arguments %s and %s are mutually exclusive', arg, conflicting[arg])) + self.getConflicting = () => conflicting + + self.conflicting = function conflictingFn (argv) { + Object.keys(argv).forEach((key) => { + if (conflicting[key]) { + conflicting[key].forEach((value) => { + // we default keys to 'undefined' that have been configured, we should not + // apply conflicting check unless they are a value other than 'undefined'. + if (value && argv[key] !== undefined && argv[value] !== undefined) { + usage.fail(__(`Arguments ${key} and ${value} are mutually exclusive`)) + } + }) } }) } - self.recommendCommands = function (cmd, potentialCommands) { + self.recommendCommands = function recommendCommands (cmd, potentialCommands) { const distance = require('./levenshtein') const threshold = 3 // if it takes more than three edits, let's move on. - potentialCommands = potentialCommands.sort(function (a, b) { return b.length - a.length }) + potentialCommands = potentialCommands.sort((a, b) => b.length - a.length) - var recommended = null - var bestDistance = Infinity - for (var i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) { - var d = distance(cmd, candidate) + let recommended = null + let bestDistance = Infinity + for (let i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) { + const d = distance(cmd, candidate) if (d <= threshold && d < bestDistance) { bestDistance = d recommended = candidate @@ -333,27 +348,21 @@ module.exports = function (yargs, usage, y18n) { if (recommended) usage.fail(__('Did you mean %s?', recommended)) } - self.reset = function (localLookup) { - implied = objFilter(implied, function (k, v) { - return !localLookup[k] - }) - conflicting = objFilter(conflicting, function (k, v) { - return !localLookup[k] - }) - checks = checks.filter(function (c) { - return c.global - }) + self.reset = function reset (localLookup) { + implied = objFilter(implied, (k, v) => !localLookup[k]) + conflicting = objFilter(conflicting, (k, v) => !localLookup[k]) + checks = checks.filter(c => c.global) return self } - var frozen - self.freeze = function () { + let frozen + self.freeze = function freeze () { frozen = {} frozen.implied = implied frozen.checks = checks frozen.conflicting = conflicting } - self.unfreeze = function () { + self.unfreeze = function unfreeze () { implied = frozen.implied checks = frozen.checks conflicting = frozen.conflicting diff --git a/node_modules/yargs/lib/yerror.js b/node_modules/yargs/lib/yerror.js index ad96a8776..53375a0f7 100644 --- a/node_modules/yargs/lib/yerror.js +++ b/node_modules/yargs/lib/yerror.js @@ -1,3 +1,4 @@ +'use strict' function YError (msg) { this.name = 'YError' this.message = msg || 'yargs error' |