Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/yargs/lib/command.js')
-rw-r--r--node_modules/yargs/lib/command.js93
1 files changed, 57 insertions, 36 deletions
diff --git a/node_modules/yargs/lib/command.js b/node_modules/yargs/lib/command.js
index 65322dbbd..d2a6e4d49 100644
--- a/node_modules/yargs/lib/command.js
+++ b/node_modules/yargs/lib/command.js
@@ -1,6 +1,8 @@
'use strict'
const inspect = require('util').inspect
+const isPromise = require('./is-promise')
+const { applyMiddleware, commandMiddlewareFactory } = require('./middleware')
const path = require('path')
const Parser = require('yargs-parser')
@@ -9,15 +11,18 @@ const DEFAULT_MARKER = /(^\*)|(^\$0)/
// handles parsing positional arguments,
// and populating argv with said positional
// arguments.
-module.exports = function command (yargs, usage, validation) {
+module.exports = function command (yargs, usage, validation, globalMiddleware) {
const self = {}
let handlers = {}
let aliasMap = {}
let defaultCommand
- self.addHandler = function addHandler (cmd, description, builder, handler, middlewares) {
+ globalMiddleware = globalMiddleware || []
+
+ self.addHandler = function addHandler (cmd, description, builder, handler, commandMiddleware) {
let aliases = []
+ const middlewares = commandMiddlewareFactory(commandMiddleware)
handler = handler || (() => {})
- middlewares = middlewares || []
+
if (Array.isArray(cmd)) {
aliases = cmd.slice(1)
cmd = cmd[0]
@@ -169,7 +174,7 @@ module.exports = function command (yargs, usage, validation) {
let numFiles = currentContext.files.length
const parentCommands = currentContext.commands.slice()
- // what does yargs look like after the buidler is run?
+ // what does yargs look like after the builder is run?
let innerArgv = parsed.argv
let innerYargs = null
let positionalMap = {}
@@ -181,24 +186,17 @@ module.exports = function command (yargs, usage, validation) {
// a function can be provided, which builds
// up a yargs chain and possibly returns it.
innerYargs = commandHandler.builder(yargs.reset(parsed.aliases))
- // if the builder function did not yet parse argv with reset yargs
- // and did not explicitly set a usage() string, then apply the
- // original command string as usage() for consistent behavior with
- // options object below.
- if (yargs.parsed === false) {
- 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 {
- innerArgv = yargs.parsed.argv
+ if (!innerYargs || (typeof innerYargs._parseArgs !== 'function')) {
+ innerYargs = yargs
}
-
- if (innerYargs && yargs.parsed === false) aliases = innerYargs.parsed.aliases
- else aliases = yargs.parsed.aliases
+ if (shouldUpdateUsage(innerYargs)) {
+ innerYargs.getUsageInstance().usage(
+ usageFromParentCommandsCommandHandler(parentCommands, commandHandler),
+ commandHandler.description
+ )
+ }
+ innerArgv = innerYargs._parseArgs(null, null, true, commandIndex)
+ aliases = innerYargs.parsed.aliases
} else if (typeof commandHandler.builder === 'object') {
// as a short hand, an object can instead be provided, specifying
// the options that a command takes.
@@ -220,24 +218,37 @@ module.exports = function command (yargs, usage, validation) {
positionalMap = populatePositionals(commandHandler, innerArgv, currentContext, yargs)
}
+ const middlewares = globalMiddleware.slice(0).concat(commandHandler.middlewares || [])
+ applyMiddleware(innerArgv, yargs, middlewares, true)
+
// we apply validation post-hoc, so that custom
// checks get passed populated positional arguments.
if (!yargs._hasOutput()) yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error)
if (commandHandler.handler && !yargs._hasOutput()) {
yargs._setHasOutput()
- if (commandHandler.middlewares.length > 0) {
- const middlewareArgs = commandHandler.middlewares.reduce(function (initialObj, middleware) {
- return Object.assign(initialObj, middleware(innerArgv))
- }, {})
- Object.assign(innerArgv, middlewareArgs)
+ // to simplify the parsing of positionals in commands,
+ // we temporarily populate '--' rather than _, with arguments
+ const populateDoubleDash = !!yargs.getOptions().configuration['populate--']
+ if (!populateDoubleDash) yargs._copyDoubleDash(innerArgv)
+
+ innerArgv = applyMiddleware(innerArgv, yargs, middlewares, false)
+ let handlerResult
+ if (isPromise(innerArgv)) {
+ handlerResult = innerArgv.then(argv => commandHandler.handler(argv))
+ } else {
+ handlerResult = commandHandler.handler(innerArgv)
}
- const handlerResult = commandHandler.handler(innerArgv)
- if (handlerResult && typeof handlerResult.then === 'function') {
- handlerResult.then(
- null,
- (error) => yargs.getUsageInstance().fail(null, error)
- )
+
+ if (isPromise(handlerResult)) {
+ yargs.getUsageInstance().cacheHelpMessage()
+ handlerResult.catch(error => {
+ try {
+ yargs.getUsageInstance().fail(null, error)
+ } catch (err) {
+ // fail's throwing would cause an unhandled rejection.
+ }
+ })
}
}
@@ -328,6 +339,7 @@ module.exports = function command (yargs, usage, validation) {
options.default = Object.assign(parseOptions.default, options.default)
options.alias = Object.assign(parseOptions.alias, options.alias)
options.array = options.array.concat(parseOptions.array)
+ delete options.config // don't load config when processing positionals.
const unparsed = []
Object.keys(positionalMap).forEach((key) => {
@@ -340,7 +352,12 @@ module.exports = function command (yargs, usage, validation) {
// short-circuit parse.
if (!unparsed.length) return
- const parsed = Parser.detailed(unparsed, options)
+ const config = Object.assign({}, options.configuration, {
+ 'populate--': true
+ })
+ const parsed = Parser.detailed(unparsed, Object.assign({}, options, {
+ configuration: config
+ }))
if (parsed.error) {
yargs.getUsageInstance().fail(parsed.error.message, parsed.error)
@@ -354,6 +371,9 @@ module.exports = function command (yargs, usage, validation) {
Object.keys(parsed.argv).forEach((key) => {
if (positionalKeys.indexOf(key) !== -1) {
+ // any new aliases need to be placed in positionalMap, which
+ // is used for validation.
+ if (!positionalMap[key]) positionalMap[key] = parsed.argv[key]
argv[key] = parsed.argv[key]
}
})
@@ -408,18 +428,19 @@ module.exports = function command (yargs, usage, validation) {
// the state of commands such that
// we can apply .parse() multiple times
// with the same yargs instance.
- let frozen
+ let frozens = []
self.freeze = () => {
- frozen = {}
+ let frozen = {}
+ frozens.push(frozen)
frozen.handlers = handlers
frozen.aliasMap = aliasMap
frozen.defaultCommand = defaultCommand
}
self.unfreeze = () => {
+ let frozen = frozens.pop()
handlers = frozen.handlers
aliasMap = frozen.aliasMap
defaultCommand = frozen.defaultCommand
- frozen = undefined
}
return self