Comparing version 17.0.0-candidate.3 to 17.0.0-candidate.4
@@ -6,6 +6,5 @@ import { assertNotStrictEqual, } from './typings/common-types.js'; | ||
import { isYargsInstance, } from './yargs-factory.js'; | ||
import { maybeAsyncResult } from './utils/maybe-async-result.js'; | ||
import whichModule from './utils/which-module.js'; | ||
const DEFAULT_MARKER = /(^\*)|(^\$0)/; | ||
export function command(yargs, usage, validation, globalMiddleware, shim) { | ||
export function command(yargs, usage, validation, globalMiddleware = [], shim) { | ||
const self = {}; | ||
@@ -135,2 +134,4 @@ let handlers = {}; | ||
const innerYargs = isYargsInstance(builderOutput) ? builderOutput : yargs; | ||
if (!command) | ||
innerYargs.getUsageInstance().unfreeze(); | ||
if (shouldUpdateUsage(innerYargs)) { | ||
@@ -146,2 +147,4 @@ innerYargs | ||
const innerYargs = yargs.reset(parsed.aliases); | ||
if (!command) | ||
innerYargs.getUsageInstance().unfreeze(); | ||
if (shouldUpdateUsage(innerYargs)) { | ||
@@ -164,3 +167,2 @@ innerYargs | ||
const middlewares = globalMiddleware | ||
.getMiddleware() | ||
.slice(0) | ||
@@ -171,8 +173,11 @@ .concat(commandHandler.middlewares); | ||
const validation = yargs._runValidation(aliases, positionalMap, yargs.parsed.error, !command); | ||
innerArgv = maybeAsyncResult(innerArgv, (err) => { | ||
throw err; | ||
}, result => { | ||
validation(result); | ||
return result; | ||
}); | ||
if (isPromise(innerArgv)) { | ||
innerArgv = innerArgv.then(argv => { | ||
validation(argv); | ||
return argv; | ||
}); | ||
} | ||
else { | ||
validation(innerArgv); | ||
} | ||
} | ||
@@ -184,13 +189,15 @@ if (commandHandler.handler && !yargs._hasOutput()) { | ||
innerArgv = applyMiddleware(innerArgv, yargs, middlewares, false); | ||
innerArgv = maybeAsyncResult(innerArgv, (err) => { | ||
throw err; | ||
}, result => { | ||
const handlerResult = commandHandler.handler(result); | ||
if (isPromise(innerArgv)) { | ||
const innerArgvRef = innerArgv; | ||
innerArgv = innerArgv | ||
.then(argv => commandHandler.handler(argv)) | ||
.then(() => innerArgvRef); | ||
} | ||
else { | ||
const handlerResult = commandHandler.handler(innerArgv); | ||
if (isPromise(handlerResult)) { | ||
return handlerResult.then(() => result); | ||
const innerArgvRef = innerArgv; | ||
innerArgv = handlerResult.then(() => innerArgvRef); | ||
} | ||
else { | ||
return result; | ||
} | ||
}); | ||
} | ||
yargs.getUsageInstance().cacheHelpMessage(); | ||
@@ -296,3 +303,3 @@ if (isPromise(innerArgv) && !yargs._hasParseCallback()) { | ||
const config = Object.assign({}, options.configuration, { | ||
'populate--': false, | ||
'populate--': true, | ||
}); | ||
@@ -299,0 +306,0 @@ const parsed = shim.Parser.detailed(unparsed, Object.assign({}, options, { |
@@ -114,3 +114,3 @@ import { isCommandBuilderCallback } from './command.js'; | ||
else if (isFallbackCompletionFunction(this.customCompletionFunction)) { | ||
return this.customCompletionFunction(current, argv, () => this.defaultCompletion(args, argv, current, done), completions => { | ||
return this.customCompletionFunction(current, argv, (onCompleted = done) => this.defaultCompletion(args, argv, current, onCompleted), completions => { | ||
done(null, completions); | ||
@@ -117,0 +117,0 @@ }); |
import { argsert } from './argsert.js'; | ||
import { isPromise } from './utils/is-promise.js'; | ||
export class GlobalMiddleware { | ||
constructor(yargs) { | ||
this.globalMiddleware = []; | ||
this.frozens = []; | ||
this.yargs = yargs; | ||
} | ||
addMiddleware(callback, applyBeforeValidation, global = true) { | ||
argsert('<array|function> [boolean] [boolean]', [callback, applyBeforeValidation, global], arguments.length); | ||
export function globalMiddlewareFactory(globalMiddleware, context) { | ||
return function (callback, applyBeforeValidation = false) { | ||
argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length); | ||
if (Array.isArray(callback)) { | ||
@@ -16,42 +11,12 @@ for (let i = 0; i < callback.length; i++) { | ||
} | ||
const m = callback[i]; | ||
m.applyBeforeValidation = applyBeforeValidation; | ||
m.global = global; | ||
callback[i].applyBeforeValidation = applyBeforeValidation; | ||
} | ||
Array.prototype.push.apply(this.globalMiddleware, callback); | ||
Array.prototype.push.apply(globalMiddleware, callback); | ||
} | ||
else if (typeof callback === 'function') { | ||
const m = callback; | ||
m.applyBeforeValidation = applyBeforeValidation; | ||
m.global = global; | ||
this.globalMiddleware.push(callback); | ||
callback.applyBeforeValidation = applyBeforeValidation; | ||
globalMiddleware.push(callback); | ||
} | ||
return this.yargs; | ||
} | ||
addCoerceMiddleware(callback, option) { | ||
const aliases = this.yargs.getAliases(); | ||
this.globalMiddleware = this.globalMiddleware.filter(m => { | ||
const toCheck = [...(aliases[option] ? aliases[option] : []), option]; | ||
if (!m.option) | ||
return true; | ||
else | ||
return !toCheck.includes(m.option); | ||
}); | ||
callback.option = option; | ||
return this.addMiddleware(callback, true, true); | ||
} | ||
getMiddleware() { | ||
return this.globalMiddleware; | ||
} | ||
freeze() { | ||
this.frozens.push([...this.globalMiddleware]); | ||
} | ||
unfreeze() { | ||
const frozen = this.frozens.pop(); | ||
if (frozen !== undefined) | ||
this.globalMiddleware = frozen; | ||
} | ||
reset() { | ||
this.globalMiddleware = this.globalMiddleware.filter(m => m.global); | ||
} | ||
return context; | ||
}; | ||
} | ||
@@ -58,0 +23,0 @@ export function commandMiddlewareFactory(commandMiddleware) { |
@@ -1,2 +0,1 @@ | ||
import { assertNotStrictEqual, } from './typings/common-types.js'; | ||
import { objFilter } from './utils/obj-filter.js'; | ||
@@ -193,3 +192,3 @@ import { YError } from './yerror.js'; | ||
} | ||
if (commands.length) { | ||
if (commands.length > 1 || (commands.length === 1 && !commands[0][2])) { | ||
ui.div(__('Commands:')); | ||
@@ -537,3 +536,4 @@ const context = yargs.getContext(); | ||
const frozen = frozens.pop(); | ||
assertNotStrictEqual(frozen, undefined, shim); | ||
if (!frozen) | ||
return; | ||
({ | ||
@@ -540,0 +540,0 @@ failMessage, |
@@ -151,2 +151,28 @@ import { argsert } from './argsert.js'; | ||
}; | ||
let checks = []; | ||
self.check = function check(f, global) { | ||
checks.push({ | ||
func: f, | ||
global, | ||
}); | ||
}; | ||
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) { | ||
usage.fail(err.message ? err.message : err, err); | ||
continue; | ||
} | ||
if (!result) { | ||
usage.fail(__('Argument check failed: %s', func.toString())); | ||
} | ||
else if (typeof result === 'string' || result instanceof Error) { | ||
usage.fail(result.toString(), result); | ||
} | ||
} | ||
}; | ||
let implied = {}; | ||
@@ -265,2 +291,3 @@ self.implies = function implies(key, value) { | ||
conflicting = objFilter(conflicting, k => !localLookup[k]); | ||
checks = checks.filter(c => c.global); | ||
return self; | ||
@@ -272,2 +299,3 @@ }; | ||
implied, | ||
checks, | ||
conflicting, | ||
@@ -279,5 +307,5 @@ }); | ||
assertNotStrictEqual(frozen, undefined, shim); | ||
({ implied, conflicting } = frozen); | ||
({ implied, checks, conflicting } = frozen); | ||
}; | ||
return self; | ||
} |
@@ -10,5 +10,4 @@ import { command as Command, } from './command.js'; | ||
import { applyExtends } from './utils/apply-extends.js'; | ||
import { applyMiddleware, GlobalMiddleware, } from './middleware.js'; | ||
import { applyMiddleware, globalMiddlewareFactory, } from './middleware.js'; | ||
import { isPromise } from './utils/is-promise.js'; | ||
import { maybeAsyncResult } from './utils/maybe-async-result.js'; | ||
import setBlocking from './utils/set-blocking.js'; | ||
@@ -25,8 +24,9 @@ let shim; | ||
let groups = {}; | ||
const globalMiddleware = []; | ||
let output = ''; | ||
const preservedGroups = {}; | ||
const globalMiddleware = new GlobalMiddleware(self); | ||
let usage; | ||
let validation; | ||
const y18n = shim.y18n; | ||
self.middleware = globalMiddlewareFactory(globalMiddleware, self); | ||
self.scriptName = function (scriptName) { | ||
@@ -126,2 +126,3 @@ self.customScriptName = true; | ||
'demandedCommands', | ||
'coerce', | ||
'deprecatedOptions', | ||
@@ -146,3 +147,2 @@ ]; | ||
completion = Completion(self, usage, command, shim); | ||
globalMiddleware.reset(); | ||
completionCommand = null; | ||
@@ -177,3 +177,2 @@ output = ''; | ||
command.freeze(); | ||
globalMiddleware.freeze(); | ||
} | ||
@@ -204,3 +203,2 @@ function unfreeze() { | ||
command.unfreeze(); | ||
globalMiddleware.unfreeze(); | ||
} | ||
@@ -307,38 +305,3 @@ self.boolean = function (keys) { | ||
argsert('<object|string|array> [function]', [keys, value], arguments.length); | ||
if (Array.isArray(keys)) { | ||
if (!value) { | ||
throw new YError('coerce callback must be provided'); | ||
} | ||
for (const key of keys) { | ||
self.coerce(key, value); | ||
} | ||
return self; | ||
} | ||
else if (typeof keys === 'object') { | ||
for (const key of Object.keys(keys)) { | ||
self.coerce(key, keys[key]); | ||
} | ||
return self; | ||
} | ||
if (!value) { | ||
throw new YError('coerce callback must be provided'); | ||
} | ||
self.alias(keys, keys); | ||
globalMiddleware.addCoerceMiddleware((argv, yargs) => { | ||
let aliases; | ||
return maybeAsyncResult(() => { | ||
aliases = yargs.getAliases(); | ||
return value(argv[keys]); | ||
}, (err) => { | ||
throw new YError(err.message); | ||
}, (result) => { | ||
argv[keys] = result; | ||
if (aliases[keys]) { | ||
for (const alias of aliases[keys]) { | ||
argv[alias] = result; | ||
} | ||
} | ||
return argv; | ||
}); | ||
}, keys); | ||
populateParserHintSingleValueDictionary(self.coerce, 'coerce', keys, value); | ||
return self; | ||
@@ -418,3 +381,3 @@ }; | ||
}; | ||
self.command = function (cmd, description, builder, handler, middlewares, deprecated) { | ||
self.command = self.commands = function (cmd, description, builder, handler, middlewares, deprecated) { | ||
argsert('<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]', [cmd, description, builder, handler, middlewares, deprecated], arguments.length); | ||
@@ -477,5 +440,2 @@ command.addHandler(cmd, description, builder, handler, middlewares, deprecated); | ||
}; | ||
self.getAliases = () => { | ||
return self.parsed ? self.parsed.aliases : {}; | ||
}; | ||
self.getDemandedOptions = () => { | ||
@@ -537,25 +497,7 @@ argsert([], 0); | ||
}; | ||
self.check = function (f, global) { | ||
argsert('<function> [boolean]', [f, global], arguments.length); | ||
self.middleware((argv, yargs) => { | ||
return maybeAsyncResult(() => { | ||
return f(argv, yargs); | ||
}, (err) => { | ||
usage.fail(err.message ? err.message : err.toString(), err); | ||
return argv; | ||
}, (result) => { | ||
if (!result) { | ||
usage.fail(y18n.__('Argument check failed: %s', f.toString())); | ||
} | ||
else if (typeof result === 'string' || result instanceof Error) { | ||
usage.fail(result.toString(), result); | ||
} | ||
return argv; | ||
}); | ||
}, false, global); | ||
self.check = function (f, _global) { | ||
argsert('<function> [boolean]', [f, _global], arguments.length); | ||
validation.check(f, _global !== false); | ||
return self; | ||
}; | ||
self.middleware = (callback, applyBeforeValidation, global = true) => { | ||
return globalMiddleware.addMiddleware(callback, !!applyBeforeValidation, global); | ||
}; | ||
self.global = function global(globals, global) { | ||
@@ -1037,7 +979,9 @@ argsert('<string|array> [boolean]', [globals, global], arguments.length); | ||
Object.defineProperty(self, 'argv', { | ||
get: () => self._parseArgs(processArgs), | ||
get: () => { | ||
return self.parse(); | ||
}, | ||
enumerable: true, | ||
}); | ||
self._parseArgs = function parseArgs(args, shortCircuit, calledFromCommand, commandIndex = 0, helpOnly = false) { | ||
let skipValidation = !!calledFromCommand; | ||
let skipValidation = !!calledFromCommand || helpOnly; | ||
args = args || processArgs; | ||
@@ -1079,5 +1023,3 @@ options.__ = y18n.__; | ||
const requestCompletions = completion.completionKey in argv; | ||
const skipRecommendation = argv[helpOpt] || requestCompletions; | ||
const skipDefaultCommand = skipRecommendation && | ||
(handlerKeys.length > 1 || handlerKeys[0] !== '$0'); | ||
const skipRecommendation = argv[helpOpt] || requestCompletions || helpOnly; | ||
if (argv._.length) { | ||
@@ -1097,3 +1039,3 @@ if (handlerKeys.length) { | ||
} | ||
if (command.hasDefaultCommand() && !skipDefaultCommand) { | ||
if (command.hasDefaultCommand() && !skipRecommendation) { | ||
const innerArgv = command.runCommand(null, self, parsed, 0, helpOnly); | ||
@@ -1115,3 +1057,3 @@ return self._postProcess(innerArgv, populateDoubleDash, !!calledFromCommand, false); | ||
} | ||
else if (command.hasDefaultCommand() && !skipDefaultCommand) { | ||
else if (command.hasDefaultCommand() && !skipRecommendation) { | ||
const innerArgv = command.runCommand(null, self, parsed, 0, helpOnly); | ||
@@ -1162,10 +1104,5 @@ return self._postProcess(innerArgv, populateDoubleDash, !!calledFromCommand, false); | ||
if (!calledFromCommand) { | ||
argvPromise = applyMiddleware(argv, self, globalMiddleware.getMiddleware(), true); | ||
argvPromise = applyMiddleware(argv, self, globalMiddleware, true); | ||
} | ||
argvPromise = validateAsync(validation, argvPromise !== null && argvPromise !== void 0 ? argvPromise : argv); | ||
if (isPromise(argvPromise) && !calledFromCommand) { | ||
argvPromise = argvPromise.then(() => { | ||
return applyMiddleware(argv, self, globalMiddleware.getMiddleware(), false); | ||
}); | ||
} | ||
} | ||
@@ -1183,8 +1120,12 @@ } | ||
function validateAsync(validation, argv) { | ||
return maybeAsyncResult(argv, (err) => { | ||
throw err; | ||
}, result => { | ||
validation(result); | ||
return result; | ||
}); | ||
if (isPromise(argv)) { | ||
argv = argv.then(argv => { | ||
validation(argv); | ||
return argv; | ||
}); | ||
} | ||
else { | ||
validation(argv); | ||
} | ||
return argv; | ||
} | ||
@@ -1205,3 +1146,3 @@ self._postProcess = function (argv, populateDoubleDash, calledFromCommand, runGlobalMiddleware) { | ||
if (runGlobalMiddleware) { | ||
argv = applyMiddleware(argv, self, globalMiddleware.getMiddleware(), false); | ||
argv = applyMiddleware(argv, self, globalMiddleware, false); | ||
} | ||
@@ -1249,2 +1190,3 @@ return argv; | ||
} | ||
validation.customChecks(argv, aliases); | ||
validation.limitedChoices(argv); | ||
@@ -1251,0 +1193,0 @@ validation.implications(argv); |
{ | ||
"name": "yargs", | ||
"version": "17.0.0-candidate.3", | ||
"version": "17.0.0-candidate.4", | ||
"description": "yargs the modern, pirate-themed, successor to optimist.", | ||
@@ -82,4 +82,4 @@ "main": "./index.cjs", | ||
"posttest": "npm run check", | ||
"test": "c8 mocha --enable-source-maps ./test/*.cjs --require ./test/before.cjs --timeout=12000 --check-leaks", | ||
"test:esm": "c8 mocha --enable-source-maps ./test/esm/*.mjs --check-leaks", | ||
"test": "c8 mocha ./test/*.cjs --require ./test/before.cjs --timeout=12000 --check-leaks", | ||
"test:esm": "c8 mocha ./test/esm/*.mjs --check-leaks", | ||
"coverage": "c8 report --check-coverage", | ||
@@ -86,0 +86,0 @@ "prepare": "npm run compile", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
293899
57
7281