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/usage.js')
-rw-r--r--node_modules/yargs/lib/usage.js89
1 files changed, 57 insertions, 32 deletions
diff --git a/node_modules/yargs/lib/usage.js b/node_modules/yargs/lib/usage.js
index bd0906a89..92bf37862 100644
--- a/node_modules/yargs/lib/usage.js
+++ b/node_modules/yargs/lib/usage.js
@@ -1,6 +1,7 @@
'use strict'
// this file handles outputting usage instructions,
// failures, etc. keeps logging in one place.
+const decamelize = require('decamelize')
const stringWidth = require('string-width')
const objFilter = require('./obj-filter')
const path = require('path')
@@ -45,7 +46,10 @@ module.exports = function usage (yargs, y18n) {
// don't output failure message more than once
if (!failureOutput) {
failureOutput = true
- if (showHelpOnFail) yargs.showHelp('error')
+ if (showHelpOnFail) {
+ yargs.showHelp('error')
+ logger.error()
+ }
if (msg || err) logger.error(msg || err)
if (failMessage) {
if (msg || err) logger.error('')
@@ -118,9 +122,9 @@ module.exports = function usage (yargs, y18n) {
}
self.getDescriptions = () => descriptions
- let epilog
+ let epilogs = []
self.epilog = (msg) => {
- epilog = msg
+ epilogs.push(msg)
}
let wrapSet = false
@@ -144,24 +148,26 @@ module.exports = function usage (yargs, y18n) {
const defaultGroup = 'Options:'
self.help = function help () {
+ if (cachedHelpMessage) return cachedHelpMessage
normalizeAliases()
// handle old demanded API
- const base$0 = path.basename(yargs.$0)
+ const base$0 = yargs.customScriptName ? yargs.$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((acc, key) => {
- if (key !== '_') acc[key] = true
- return acc
- }, {})
- )
+
+ let keys = []
+ keys = keys.concat(Object.keys(descriptions))
+ keys = keys.concat(Object.keys(demandedOptions))
+ keys = keys.concat(Object.keys(demandedCommands))
+ keys = keys.concat(Object.keys(options.default))
+ keys = keys.filter(filterHiddenOptions)
+ keys = Object.keys(keys.reduce((acc, key) => {
+ if (key !== '_') acc[key] = true
+ return acc
+ }, {}))
const theWrap = getWrap()
const ui = require('cliui')({
@@ -176,7 +182,7 @@ module.exports = function usage (yargs, y18n) {
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({ text: `${usage[1]}`, padding: [1, 0, 0, 0] })
}
})
ui.div()
@@ -200,6 +206,10 @@ module.exports = function usage (yargs, y18n) {
const context = yargs.getContext()
const parentCommands = context.commands.length ? `${context.commands.join(' ')} ` : ''
+ if (yargs.getParserConfiguration()['sort-commands'] === true) {
+ commands = commands.sort((a, b) => a[0].localeCompare(b[0]))
+ }
+
commands.forEach((command) => {
const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\$0 ?/, '')}` // drop $0 from default commands.
ui.span(
@@ -208,7 +218,7 @@ module.exports = function usage (yargs, y18n) {
padding: [0, 2, 0, 2],
width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4
},
- {text: command[1]}
+ { text: command[1] }
)
const hints = []
if (command[2]) hints.push(`[${__('default:').slice(0, -1)}]`) // TODO hacking around i18n here
@@ -216,7 +226,7 @@ module.exports = function usage (yargs, y18n) {
hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`)
}
if (hints.length) {
- ui.div({text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right'})
+ ui.div({ text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right' })
} else {
ui.div()
}
@@ -241,11 +251,9 @@ module.exports = function usage (yargs, y18n) {
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'.
- const normalizedKeys = groups[groupName].map((key) => {
+ const normalizedKeys = groups[groupName].filter(filterHiddenOptions).map((key) => {
if (~aliasKeys.indexOf(key)) return key
for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) {
if (~(options.alias[aliasKey] || []).indexOf(key)) return aliasKey
@@ -253,6 +261,10 @@ module.exports = function usage (yargs, y18n) {
return key
})
+ if (normalizedKeys.length < 1) return
+
+ ui.div(__(groupName))
+
// actually generate the switches string --foo, -f, --bar.
const switches = normalizedKeys.reduce((acc, key) => {
acc[key] = [ key ].concat(options.alias[key] || [])
@@ -290,11 +302,11 @@ module.exports = function usage (yargs, y18n) {
].filter(Boolean).join(' ')
ui.span(
- {text: kswitch, padding: [0, 2, 0, 2], width: maxWidth(switches, theWrap) + 4},
+ { text: kswitch, padding: [0, 2, 0, 2], width: maxWidth(switches, theWrap) + 4 },
desc
)
- if (extra) ui.div({text: extra, padding: [0, 0, 0, 2], align: 'right'})
+ if (extra) ui.div({ text: extra, padding: [0, 0, 0, 2], align: 'right' })
else ui.div()
})
@@ -334,12 +346,13 @@ module.exports = function usage (yargs, y18n) {
}
// the usage string.
- if (epilog) {
- const e = epilog.replace(/\$0/g, base$0)
+ if (epilogs.length > 0) {
+ const e = epilogs.map(epilog => epilog.replace(/\$0/g, base$0)).join('\n')
ui.div(`${e}\n`)
}
- return ui.toString()
+ // Remove the trailing white spaces
+ return ui.toString().replace(/\s*$/, '')
}
// return the maximum width of a string
@@ -391,6 +404,13 @@ module.exports = function usage (yargs, y18n) {
})
}
+ // if yargs is executing an async handler, we take a snapshot of the
+ // help message to display on failure:
+ let cachedHelpMessage
+ self.cacheHelpMessage = function () {
+ cachedHelpMessage = this.help()
+ }
+
// given a set of keys, place any keys that are
// ungrouped under the 'Options:' grouping.
function addUngroupedKeys (keys, aliases, groups) {
@@ -409,6 +429,10 @@ module.exports = function usage (yargs, y18n) {
return groupedKeys
}
+ function filterHiddenOptions (key) {
+ return yargs.getOptions().hiddenOptions.indexOf(key) < 0 || yargs.parsed.argv[yargs.getOptions().showHiddenOpt]
+ }
+
self.showHelp = (level) => {
const logger = yargs._getLoggerInstance()
if (!level) level = 'error'
@@ -417,7 +441,7 @@ module.exports = function usage (yargs, y18n) {
}
self.functionDescription = (fn) => {
- const description = fn.name ? require('decamelize')(fn.name, '-') : __('generated-value')
+ const description = fn.name ? decamelize(fn.name, '-') : __('generated-value')
return ['(', description, ')'].join('')
}
@@ -489,35 +513,36 @@ module.exports = function usage (yargs, y18n) {
failureOutput = false
usages = []
usageDisabled = false
- epilog = undefined
+ epilogs = []
examples = []
commands = []
descriptions = objFilter(descriptions, (k, v) => !localLookup[k])
return self
}
- let frozen
+ let frozens = []
self.freeze = function freeze () {
- frozen = {}
+ let frozen = {}
+ frozens.push(frozen)
frozen.failMessage = failMessage
frozen.failureOutput = failureOutput
frozen.usages = usages
frozen.usageDisabled = usageDisabled
- frozen.epilog = epilog
+ frozen.epilogs = epilogs
frozen.examples = examples
frozen.commands = commands
frozen.descriptions = descriptions
}
self.unfreeze = function unfreeze () {
+ let frozen = frozens.pop()
failMessage = frozen.failMessage
failureOutput = frozen.failureOutput
usages = frozen.usages
usageDisabled = frozen.usageDisabled
- epilog = frozen.epilog
+ epilogs = frozen.epilogs
examples = frozen.examples
commands = frozen.commands
descriptions = frozen.descriptions
- frozen = undefined
}
return self