index.cjs
1 'use strict'; 2 3 var assert = require('assert'); 4 5 class YError extends Error { 6 constructor(msg) { 7 super(msg || 'yargs error'); 8 this.name = 'YError'; 9 Error.captureStackTrace(this, YError); 10 } 11 } 12 13 let previouslyVisitedConfigs = []; 14 let shim; 15 function applyExtends(config, cwd, mergeExtends, _shim) { 16 shim = _shim; 17 let defaultConfig = {}; 18 if (Object.prototype.hasOwnProperty.call(config, 'extends')) { 19 if (typeof config.extends !== 'string') 20 return defaultConfig; 21 const isPath = /\.json|\..*rc$/.test(config.extends); 22 let pathToDefault = null; 23 if (!isPath) { 24 try { 25 pathToDefault = require.resolve(config.extends); 26 } 27 catch (_err) { 28 return config; 29 } 30 } 31 else { 32 pathToDefault = getPathToDefaultConfig(cwd, config.extends); 33 } 34 checkForCircularExtends(pathToDefault); 35 previouslyVisitedConfigs.push(pathToDefault); 36 defaultConfig = isPath 37 ? JSON.parse(shim.readFileSync(pathToDefault, 'utf8')) 38 : require(config.extends); 39 delete config.extends; 40 defaultConfig = applyExtends(defaultConfig, shim.path.dirname(pathToDefault), mergeExtends, shim); 41 } 42 previouslyVisitedConfigs = []; 43 return mergeExtends 44 ? mergeDeep(defaultConfig, config) 45 : Object.assign({}, defaultConfig, config); 46 } 47 function checkForCircularExtends(cfgPath) { 48 if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) { 49 throw new YError(`Circular extended configurations: '${cfgPath}'.`); 50 } 51 } 52 function getPathToDefaultConfig(cwd, pathToExtend) { 53 return shim.path.resolve(cwd, pathToExtend); 54 } 55 function mergeDeep(config1, config2) { 56 const target = {}; 57 function isObject(obj) { 58 return obj && typeof obj === 'object' && !Array.isArray(obj); 59 } 60 Object.assign(target, config1); 61 for (const key of Object.keys(config2)) { 62 if (isObject(config2[key]) && isObject(target[key])) { 63 target[key] = mergeDeep(config1[key], config2[key]); 64 } 65 else { 66 target[key] = config2[key]; 67 } 68 } 69 return target; 70 } 71 72 function parseCommand(cmd) { 73 const extraSpacesStrippedCommand = cmd.replace(/\s{2,}/g, ' '); 74 const splitCommand = extraSpacesStrippedCommand.split(/\s+(?![^[]*]|[^<]*>)/); 75 const bregex = /\.*[\][<>]/g; 76 const firstCommand = splitCommand.shift(); 77 if (!firstCommand) 78 throw new Error(`No command found in: ${cmd}`); 79 const parsedCommand = { 80 cmd: firstCommand.replace(bregex, ''), 81 demanded: [], 82 optional: [], 83 }; 84 splitCommand.forEach((cmd, i) => { 85 let variadic = false; 86 cmd = cmd.replace(/\s/g, ''); 87 if (/\.+[\]>]/.test(cmd) && i === splitCommand.length - 1) 88 variadic = true; 89 if (/^\[/.test(cmd)) { 90 parsedCommand.optional.push({ 91 cmd: cmd.replace(bregex, '').split('|'), 92 variadic, 93 }); 94 } 95 else { 96 parsedCommand.demanded.push({ 97 cmd: cmd.replace(bregex, '').split('|'), 98 variadic, 99 }); 100 } 101 }); 102 return parsedCommand; 103 } 104 105 const positionName = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']; 106 function argsert(arg1, arg2, arg3) { 107 function parseArgs() { 108 return typeof arg1 === 'object' 109 ? [{ demanded: [], optional: [] }, arg1, arg2] 110 : [ 111 parseCommand(`cmd ${arg1}`), 112 arg2, 113 arg3, 114 ]; 115 } 116 try { 117 let position = 0; 118 const [parsed, callerArguments, _length] = parseArgs(); 119 const args = [].slice.call(callerArguments); 120 while (args.length && args[args.length - 1] === undefined) 121 args.pop(); 122 const length = _length || args.length; 123 if (length < parsed.demanded.length) { 124 throw new YError(`Not enough arguments provided. Expected ${parsed.demanded.length} but received ${args.length}.`); 125 } 126 const totalCommands = parsed.demanded.length + parsed.optional.length; 127 if (length > totalCommands) { 128 throw new YError(`Too many arguments provided. Expected max ${totalCommands} but received ${length}.`); 129 } 130 parsed.demanded.forEach(demanded => { 131 const arg = args.shift(); 132 const observedType = guessType(arg); 133 const matchingTypes = demanded.cmd.filter(type => type === observedType || type === '*'); 134 if (matchingTypes.length === 0) 135 argumentTypeError(observedType, demanded.cmd, position); 136 position += 1; 137 }); 138 parsed.optional.forEach(optional => { 139 if (args.length === 0) 140 return; 141 const arg = args.shift(); 142 const observedType = guessType(arg); 143 const matchingTypes = optional.cmd.filter(type => type === observedType || type === '*'); 144 if (matchingTypes.length === 0) 145 argumentTypeError(observedType, optional.cmd, position); 146 position += 1; 147 }); 148 } 149 catch (err) { 150 console.warn(err.stack); 151 } 152 } 153 function guessType(arg) { 154 if (Array.isArray(arg)) { 155 return 'array'; 156 } 157 else if (arg === null) { 158 return 'null'; 159 } 160 return typeof arg; 161 } 162 function argumentTypeError(observedType, allowedTypes, position) { 163 throw new YError(`Invalid ${positionName[position] || 'manyith'} argument. Expected ${allowedTypes.join(' or ')} but received ${observedType}.`); 164 } 165 166 function isPromise(maybePromise) { 167 return (!!maybePromise && 168 !!maybePromise.then && 169 typeof maybePromise.then === 'function'); 170 } 171 172 function assertNotStrictEqual(actual, expected, shim, message) { 173 shim.assert.notStrictEqual(actual, expected, message); 174 } 175 function assertSingleKey(actual, shim) { 176 shim.assert.strictEqual(typeof actual, 'string'); 177 } 178 function objectKeys(object) { 179 return Object.keys(object); 180 } 181 182 function objFilter(original = {}, filter = () => true) { 183 const obj = {}; 184 objectKeys(original).forEach(key => { 185 if (filter(key, original[key])) { 186 obj[key] = original[key]; 187 } 188 }); 189 return obj; 190 } 191 192 function globalMiddlewareFactory(globalMiddleware, context) { 193 return function (callback, applyBeforeValidation = false) { 194 argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length); 195 if (Array.isArray(callback)) { 196 for (let i = 0; i < callback.length; i++) { 197 if (typeof callback[i] !== 'function') { 198 throw Error('middleware must be a function'); 199 } 200 callback[i].applyBeforeValidation = applyBeforeValidation; 201 } 202 Array.prototype.push.apply(globalMiddleware, callback); 203 } 204 else if (typeof callback === 'function') { 205 callback.applyBeforeValidation = applyBeforeValidation; 206 globalMiddleware.push(callback); 207 } 208 return context; 209 }; 210 } 211 function commandMiddlewareFactory(commandMiddleware) { 212 if (!commandMiddleware) 213 return []; 214 return commandMiddleware.map(middleware => { 215 middleware.applyBeforeValidation = false; 216 return middleware; 217 }); 218 } 219 function applyMiddleware(argv, yargs, middlewares, beforeValidation) { 220 const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true'); 221 return middlewares.reduce((acc, middleware) => { 222 if (middleware.applyBeforeValidation !== beforeValidation) { 223 return acc; 224 } 225 if (isPromise(acc)) { 226 return acc 227 .then(initialObj => Promise.all([ 228 initialObj, 229 middleware(initialObj, yargs), 230 ])) 231 .then(([initialObj, middlewareObj]) => Object.assign(initialObj, middlewareObj)); 232 } 233 else { 234 const result = middleware(acc, yargs); 235 if (beforeValidation && isPromise(result)) 236 throw beforeValidationError; 237 return isPromise(result) 238 ? result.then(middlewareObj => Object.assign(acc, middlewareObj)) 239 : Object.assign(acc, result); 240 } 241 }, argv); 242 } 243 244 function getProcessArgvBinIndex() { 245 if (isBundledElectronApp()) 246 return 0; 247 return 1; 248 } 249 function isBundledElectronApp() { 250 return isElectronApp() && !process.defaultApp; 251 } 252 function isElectronApp() { 253 return !!process.versions.electron; 254 } 255 function hideBin(argv) { 256 return argv.slice(getProcessArgvBinIndex() + 1); 257 } 258 function getProcessArgvBin() { 259 return process.argv[getProcessArgvBinIndex()]; 260 } 261 262 var processArgv = /*#__PURE__*/Object.freeze({ 263 __proto__: null, 264 hideBin: hideBin, 265 getProcessArgvBin: getProcessArgvBin 266 }); 267 268 function whichModule(exported) { 269 if (typeof require === 'undefined') 270 return null; 271 for (let i = 0, files = Object.keys(require.cache), mod; i < files.length; i++) { 272 mod = require.cache[files[i]]; 273 if (mod.exports === exported) 274 return mod; 275 } 276 return null; 277 } 278 279 const DEFAULT_MARKER = /(^\*)|(^\$0)/; 280 function command(yargs, usage, validation, globalMiddleware = [], shim) { 281 const self = {}; 282 let handlers = {}; 283 let aliasMap = {}; 284 let defaultCommand; 285 self.addHandler = function addHandler(cmd, description, builder, handler, commandMiddleware, deprecated) { 286 let aliases = []; 287 const middlewares = commandMiddlewareFactory(commandMiddleware); 288 handler = handler || (() => { }); 289 if (Array.isArray(cmd)) { 290 if (isCommandAndAliases(cmd)) { 291 [cmd, ...aliases] = cmd; 292 } 293 else { 294 for (const command of cmd) { 295 self.addHandler(command); 296 } 297 } 298 } 299 else if (isCommandHandlerDefinition(cmd)) { 300 let command = Array.isArray(cmd.command) || typeof cmd.command === 'string' 301 ? cmd.command 302 : moduleName(cmd); 303 if (cmd.aliases) 304 command = [].concat(command).concat(cmd.aliases); 305 self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler, cmd.middlewares, cmd.deprecated); 306 return; 307 } 308 else if (isCommandBuilderDefinition(builder)) { 309 self.addHandler([cmd].concat(aliases), description, builder.builder, builder.handler, builder.middlewares, builder.deprecated); 310 return; 311 } 312 if (typeof cmd === 'string') { 313 const parsedCommand = parseCommand(cmd); 314 aliases = aliases.map(alias => parseCommand(alias).cmd); 315 let isDefault = false; 316 const parsedAliases = [parsedCommand.cmd].concat(aliases).filter(c => { 317 if (DEFAULT_MARKER.test(c)) { 318 isDefault = true; 319 return false; 320 } 321 return true; 322 }); 323 if (parsedAliases.length === 0 && isDefault) 324 parsedAliases.push('$0'); 325 if (isDefault) { 326 parsedCommand.cmd = parsedAliases[0]; 327 aliases = parsedAliases.slice(1); 328 cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd); 329 } 330 aliases.forEach(alias => { 331 aliasMap[alias] = parsedCommand.cmd; 332 }); 333 if (description !== false) { 334 usage.command(cmd, description, isDefault, aliases, deprecated); 335 } 336 handlers[parsedCommand.cmd] = { 337 original: cmd, 338 description, 339 handler, 340 builder: builder || {}, 341 middlewares, 342 deprecated, 343 demanded: parsedCommand.demanded, 344 optional: parsedCommand.optional, 345 }; 346 if (isDefault) 347 defaultCommand = handlers[parsedCommand.cmd]; 348 } 349 }; 350 self.addDirectory = function addDirectory(dir, context, req, callerFile, opts) { 351 opts = opts || {}; 352 if (typeof opts.recurse !== 'boolean') 353 opts.recurse = false; 354 if (!Array.isArray(opts.extensions)) 355 opts.extensions = ['js']; 356 const parentVisit = typeof opts.visit === 'function' ? opts.visit : (o) => o; 357 opts.visit = function visit(obj, joined, filename) { 358 const visited = parentVisit(obj, joined, filename); 359 if (visited) { 360 if (~context.files.indexOf(joined)) 361 return visited; 362 context.files.push(joined); 363 self.addHandler(visited); 364 } 365 return visited; 366 }; 367 shim.requireDirectory({ require: req, filename: callerFile }, dir, opts); 368 }; 369 function moduleName(obj) { 370 const mod = whichModule(obj); 371 if (!mod) 372 throw new Error(`No command name given for module: ${shim.inspect(obj)}`); 373 return commandFromFilename(mod.filename); 374 } 375 function commandFromFilename(filename) { 376 return shim.path.basename(filename, shim.path.extname(filename)); 377 } 378 function extractDesc({ describe, description, desc, }) { 379 for (const test of [describe, description, desc]) { 380 if (typeof test === 'string' || test === false) 381 return test; 382 assertNotStrictEqual(test, true, shim); 383 } 384 return false; 385 } 386 self.getCommands = () => Object.keys(handlers).concat(Object.keys(aliasMap)); 387 self.getCommandHandlers = () => handlers; 388 self.hasDefaultCommand = () => !!defaultCommand; 389 self.runCommand = function runCommand(command, yargs, parsed, commandIndex) { 390 let aliases = parsed.aliases; 391 const commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand; 392 const currentContext = yargs.getContext(); 393 let numFiles = currentContext.files.length; 394 const parentCommands = currentContext.commands.slice(); 395 let innerArgv = parsed.argv; 396 let positionalMap = {}; 397 if (command) { 398 currentContext.commands.push(command); 399 currentContext.fullCommands.push(commandHandler.original); 400 } 401 const builder = commandHandler.builder; 402 if (isCommandBuilderCallback(builder)) { 403 const builderOutput = builder(yargs.reset(parsed.aliases)); 404 const innerYargs = isYargsInstance(builderOutput) ? builderOutput : yargs; 405 if (shouldUpdateUsage(innerYargs)) { 406 innerYargs 407 .getUsageInstance() 408 .usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description); 409 } 410 innerArgv = innerYargs._parseArgs(null, null, true, commandIndex); 411 aliases = innerYargs.parsed.aliases; 412 } 413 else if (isCommandBuilderOptionDefinitions(builder)) { 414 const innerYargs = yargs.reset(parsed.aliases); 415 if (shouldUpdateUsage(innerYargs)) { 416 innerYargs 417 .getUsageInstance() 418 .usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description); 419 } 420 Object.keys(commandHandler.builder).forEach(key => { 421 innerYargs.option(key, builder[key]); 422 }); 423 innerArgv = innerYargs._parseArgs(null, null, true, commandIndex); 424 aliases = innerYargs.parsed.aliases; 425 } 426 if (!yargs._hasOutput()) { 427 positionalMap = populatePositionals(commandHandler, innerArgv, currentContext); 428 } 429 const middlewares = globalMiddleware 430 .slice(0) 431 .concat(commandHandler.middlewares); 432 applyMiddleware(innerArgv, yargs, middlewares, true); 433 if (!yargs._hasOutput()) { 434 yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error, !command); 435 } 436 if (commandHandler.handler && !yargs._hasOutput()) { 437 yargs._setHasOutput(); 438 const populateDoubleDash = !!yargs.getOptions().configuration['populate--']; 439 yargs._postProcess(innerArgv, populateDoubleDash); 440 innerArgv = applyMiddleware(innerArgv, yargs, middlewares, false); 441 let handlerResult; 442 if (isPromise(innerArgv)) { 443 handlerResult = innerArgv.then(argv => commandHandler.handler(argv)); 444 } 445 else { 446 handlerResult = commandHandler.handler(innerArgv); 447 } 448 const handlerFinishCommand = yargs.getHandlerFinishCommand(); 449 if (isPromise(handlerResult)) { 450 yargs.getUsageInstance().cacheHelpMessage(); 451 handlerResult 452 .then(value => { 453 if (handlerFinishCommand) { 454 handlerFinishCommand(value); 455 } 456 }) 457 .catch(error => { 458 try { 459 yargs.getUsageInstance().fail(null, error); 460 } 461 catch (err) { 462 } 463 }) 464 .then(() => { 465 yargs.getUsageInstance().clearCachedHelpMessage(); 466 }); 467 } 468 else { 469 if (handlerFinishCommand) { 470 handlerFinishCommand(handlerResult); 471 } 472 } 473 } 474 if (command) { 475 currentContext.commands.pop(); 476 currentContext.fullCommands.pop(); 477 } 478 numFiles = currentContext.files.length - numFiles; 479 if (numFiles > 0) 480 currentContext.files.splice(numFiles * -1, numFiles); 481 return innerArgv; 482 }; 483 function shouldUpdateUsage(yargs) { 484 return (!yargs.getUsageInstance().getUsageDisabled() && 485 yargs.getUsageInstance().getUsage().length === 0); 486 } 487 function usageFromParentCommandsCommandHandler(parentCommands, commandHandler) { 488 const c = DEFAULT_MARKER.test(commandHandler.original) 489 ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() 490 : commandHandler.original; 491 const pc = parentCommands.filter(c => { 492 return !DEFAULT_MARKER.test(c); 493 }); 494 pc.push(c); 495 return `$0 ${pc.join(' ')}`; 496 } 497 self.runDefaultBuilderOn = function (yargs) { 498 assertNotStrictEqual(defaultCommand, undefined, shim); 499 if (shouldUpdateUsage(yargs)) { 500 const commandString = DEFAULT_MARKER.test(defaultCommand.original) 501 ? defaultCommand.original 502 : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 '); 503 yargs.getUsageInstance().usage(commandString, defaultCommand.description); 504 } 505 const builder = defaultCommand.builder; 506 if (isCommandBuilderCallback(builder)) { 507 builder(yargs); 508 } 509 else if (!isCommandBuilderDefinition(builder)) { 510 Object.keys(builder).forEach(key => { 511 yargs.option(key, builder[key]); 512 }); 513 } 514 }; 515 function populatePositionals(commandHandler, argv, context) { 516 argv._ = argv._.slice(context.commands.length); 517 const demanded = commandHandler.demanded.slice(0); 518 const optional = commandHandler.optional.slice(0); 519 const positionalMap = {}; 520 validation.positionalCount(demanded.length, argv._.length); 521 while (demanded.length) { 522 const demand = demanded.shift(); 523 populatePositional(demand, argv, positionalMap); 524 } 525 while (optional.length) { 526 const maybe = optional.shift(); 527 populatePositional(maybe, argv, positionalMap); 528 } 529 argv._ = context.commands.concat(argv._.map(a => '' + a)); 530 postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original)); 531 return positionalMap; 532 } 533 function populatePositional(positional, argv, positionalMap) { 534 const cmd = positional.cmd[0]; 535 if (positional.variadic) { 536 positionalMap[cmd] = argv._.splice(0).map(String); 537 } 538 else { 539 if (argv._.length) 540 positionalMap[cmd] = [String(argv._.shift())]; 541 } 542 } 543 function postProcessPositionals(argv, positionalMap, parseOptions) { 544 const options = Object.assign({}, yargs.getOptions()); 545 options.default = Object.assign(parseOptions.default, options.default); 546 for (const key of Object.keys(parseOptions.alias)) { 547 options.alias[key] = (options.alias[key] || []).concat(parseOptions.alias[key]); 548 } 549 options.array = options.array.concat(parseOptions.array); 550 options.config = {}; 551 const unparsed = []; 552 Object.keys(positionalMap).forEach(key => { 553 positionalMap[key].map(value => { 554 if (options.configuration['unknown-options-as-args']) 555 options.key[key] = true; 556 unparsed.push(`--${key}`); 557 unparsed.push(value); 558 }); 559 }); 560 if (!unparsed.length) 561 return; 562 const config = Object.assign({}, options.configuration, { 563 'populate--': true, 564 }); 565 const parsed = shim.Parser.detailed(unparsed, Object.assign({}, options, { 566 configuration: config, 567 })); 568 if (parsed.error) { 569 yargs.getUsageInstance().fail(parsed.error.message, parsed.error); 570 } 571 else { 572 const positionalKeys = Object.keys(positionalMap); 573 Object.keys(positionalMap).forEach(key => { 574 positionalKeys.push(...parsed.aliases[key]); 575 }); 576 Object.keys(parsed.argv).forEach(key => { 577 if (positionalKeys.indexOf(key) !== -1) { 578 if (!positionalMap[key]) 579 positionalMap[key] = parsed.argv[key]; 580 argv[key] = parsed.argv[key]; 581 } 582 }); 583 } 584 } 585 self.cmdToParseOptions = function (cmdString) { 586 const parseOptions = { 587 array: [], 588 default: {}, 589 alias: {}, 590 demand: {}, 591 }; 592 const parsed = parseCommand(cmdString); 593 parsed.demanded.forEach(d => { 594 const [cmd, ...aliases] = d.cmd; 595 if (d.variadic) { 596 parseOptions.array.push(cmd); 597 parseOptions.default[cmd] = []; 598 } 599 parseOptions.alias[cmd] = aliases; 600 parseOptions.demand[cmd] = true; 601 }); 602 parsed.optional.forEach(o => { 603 const [cmd, ...aliases] = o.cmd; 604 if (o.variadic) { 605 parseOptions.array.push(cmd); 606 parseOptions.default[cmd] = []; 607 } 608 parseOptions.alias[cmd] = aliases; 609 }); 610 return parseOptions; 611 }; 612 self.reset = () => { 613 handlers = {}; 614 aliasMap = {}; 615 defaultCommand = undefined; 616 return self; 617 }; 618 const frozens = []; 619 self.freeze = () => { 620 frozens.push({ 621 handlers, 622 aliasMap, 623 defaultCommand, 624 }); 625 }; 626 self.unfreeze = () => { 627 const frozen = frozens.pop(); 628 assertNotStrictEqual(frozen, undefined, shim); 629 ({ handlers, aliasMap, defaultCommand } = frozen); 630 }; 631 return self; 632 } 633 function isCommandBuilderDefinition(builder) { 634 return (typeof builder === 'object' && 635 !!builder.builder && 636 typeof builder.handler === 'function'); 637 } 638 function isCommandAndAliases(cmd) { 639 if (cmd.every(c => typeof c === 'string')) { 640 return true; 641 } 642 else { 643 return false; 644 } 645 } 646 function isCommandBuilderCallback(builder) { 647 return typeof builder === 'function'; 648 } 649 function isCommandBuilderOptionDefinitions(builder) { 650 return typeof builder === 'object'; 651 } 652 function isCommandHandlerDefinition(cmd) { 653 return typeof cmd === 'object' && !Array.isArray(cmd); 654 } 655 656 function setBlocking(blocking) { 657 if (typeof process === 'undefined') 658 return; 659 [process.stdout, process.stderr].forEach(_stream => { 660 const stream = _stream; 661 if (stream._handle && 662 stream.isTTY && 663 typeof stream._handle.setBlocking === 'function') { 664 stream._handle.setBlocking(blocking); 665 } 666 }); 667 } 668 669 function usage(yargs, y18n, shim) { 670 const __ = y18n.__; 671 const self = {}; 672 const fails = []; 673 self.failFn = function failFn(f) { 674 fails.push(f); 675 }; 676 let failMessage = null; 677 let showHelpOnFail = true; 678 self.showHelpOnFail = function showHelpOnFailFn(arg1 = true, arg2) { 679 function parseFunctionArgs() { 680 return typeof arg1 === 'string' ? [true, arg1] : [arg1, arg2]; 681 } 682 const [enabled, message] = parseFunctionArgs(); 683 failMessage = message; 684 showHelpOnFail = enabled; 685 return self; 686 }; 687 let failureOutput = false; 688 self.fail = function fail(msg, err) { 689 const logger = yargs._getLoggerInstance(); 690 if (fails.length) { 691 for (let i = fails.length - 1; i >= 0; --i) { 692 fails[i](msg, err, self); 693 } 694 } 695 else { 696 if (yargs.getExitProcess()) 697 setBlocking(true); 698 if (!failureOutput) { 699 failureOutput = true; 700 if (showHelpOnFail) { 701 yargs.showHelp('error'); 702 logger.error(); 703 } 704 if (msg || err) 705 logger.error(msg || err); 706 if (failMessage) { 707 if (msg || err) 708 logger.error(''); 709 logger.error(failMessage); 710 } 711 } 712 err = err || new YError(msg); 713 if (yargs.getExitProcess()) { 714 return yargs.exit(1); 715 } 716 else if (yargs._hasParseCallback()) { 717 return yargs.exit(1, err); 718 } 719 else { 720 throw err; 721 } 722 } 723 }; 724 let usages = []; 725 let usageDisabled = false; 726 self.usage = (msg, description) => { 727 if (msg === null) { 728 usageDisabled = true; 729 usages = []; 730 return self; 731 } 732 usageDisabled = false; 733 usages.push([msg, description || '']); 734 return self; 735 }; 736 self.getUsage = () => { 737 return usages; 738 }; 739 self.getUsageDisabled = () => { 740 return usageDisabled; 741 }; 742 self.getPositionalGroupName = () => { 743 return __('Positionals:'); 744 }; 745 let examples = []; 746 self.example = (cmd, description) => { 747 examples.push([cmd, description || '']); 748 }; 749 let commands = []; 750 self.command = function command(cmd, description, isDefault, aliases, deprecated = false) { 751 if (isDefault) { 752 commands = commands.map(cmdArray => { 753 cmdArray[2] = false; 754 return cmdArray; 755 }); 756 } 757 commands.push([cmd, description || '', isDefault, aliases, deprecated]); 758 }; 759 self.getCommands = () => commands; 760 let descriptions = {}; 761 self.describe = function describe(keyOrKeys, desc) { 762 if (Array.isArray(keyOrKeys)) { 763 keyOrKeys.forEach(k => { 764 self.describe(k, desc); 765 }); 766 } 767 else if (typeof keyOrKeys === 'object') { 768 Object.keys(keyOrKeys).forEach(k => { 769 self.describe(k, keyOrKeys[k]); 770 }); 771 } 772 else { 773 descriptions[keyOrKeys] = desc; 774 } 775 }; 776 self.getDescriptions = () => descriptions; 777 let epilogs = []; 778 self.epilog = msg => { 779 epilogs.push(msg); 780 }; 781 let wrapSet = false; 782 let wrap; 783 self.wrap = cols => { 784 wrapSet = true; 785 wrap = cols; 786 }; 787 function getWrap() { 788 if (!wrapSet) { 789 wrap = windowWidth(); 790 wrapSet = true; 791 } 792 return wrap; 793 } 794 const deferY18nLookupPrefix = '__yargsString__:'; 795 self.deferY18nLookup = str => deferY18nLookupPrefix + str; 796 self.help = function help() { 797 if (cachedHelpMessage) 798 return cachedHelpMessage; 799 normalizeAliases(); 800 const base$0 = yargs.customScriptName 801 ? yargs.$0 802 : shim.path.basename(yargs.$0); 803 const demandedOptions = yargs.getDemandedOptions(); 804 const demandedCommands = yargs.getDemandedCommands(); 805 const deprecatedOptions = yargs.getDeprecatedOptions(); 806 const groups = yargs.getGroups(); 807 const options = yargs.getOptions(); 808 let keys = []; 809 keys = keys.concat(Object.keys(descriptions)); 810 keys = keys.concat(Object.keys(demandedOptions)); 811 keys = keys.concat(Object.keys(demandedCommands)); 812 keys = keys.concat(Object.keys(options.default)); 813 keys = keys.filter(filterHiddenOptions); 814 keys = Object.keys(keys.reduce((acc, key) => { 815 if (key !== '_') 816 acc[key] = true; 817 return acc; 818 }, {})); 819 const theWrap = getWrap(); 820 const ui = shim.cliui({ 821 width: theWrap, 822 wrap: !!theWrap, 823 }); 824 if (!usageDisabled) { 825 if (usages.length) { 826 usages.forEach(usage => { 827 ui.div(`${usage[0].replace(/\$0/g, base$0)}`); 828 if (usage[1]) { 829 ui.div({ text: `${usage[1]}`, padding: [1, 0, 0, 0] }); 830 } 831 }); 832 ui.div(); 833 } 834 else if (commands.length) { 835 let u = null; 836 if (demandedCommands._) { 837 u = `${base$0} <${__('command')}>\n`; 838 } 839 else { 840 u = `${base$0} [${__('command')}]\n`; 841 } 842 ui.div(`${u}`); 843 } 844 } 845 if (commands.length) { 846 ui.div(__('Commands:')); 847 const context = yargs.getContext(); 848 const parentCommands = context.commands.length 849 ? `${context.commands.join(' ')} ` 850 : ''; 851 if (yargs.getParserConfiguration()['sort-commands'] === true) { 852 commands = commands.sort((a, b) => a[0].localeCompare(b[0])); 853 } 854 commands.forEach(command => { 855 const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\$0 ?/, '')}`; 856 ui.span({ 857 text: commandString, 858 padding: [0, 2, 0, 2], 859 width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4, 860 }, { text: command[1] }); 861 const hints = []; 862 if (command[2]) 863 hints.push(`[${__('default')}]`); 864 if (command[3] && command[3].length) { 865 hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`); 866 } 867 if (command[4]) { 868 if (typeof command[4] === 'string') { 869 hints.push(`[${__('deprecated: %s', command[4])}]`); 870 } 871 else { 872 hints.push(`[${__('deprecated')}]`); 873 } 874 } 875 if (hints.length) { 876 ui.div({ 877 text: hints.join(' '), 878 padding: [0, 0, 0, 2], 879 align: 'right', 880 }); 881 } 882 else { 883 ui.div(); 884 } 885 }); 886 ui.div(); 887 } 888 const aliasKeys = (Object.keys(options.alias) || []).concat(Object.keys(yargs.parsed.newAliases) || []); 889 keys = keys.filter(key => !yargs.parsed.newAliases[key] && 890 aliasKeys.every(alias => (options.alias[alias] || []).indexOf(key) === -1)); 891 const defaultGroup = __('Options:'); 892 if (!groups[defaultGroup]) 893 groups[defaultGroup] = []; 894 addUngroupedKeys(keys, options.alias, groups, defaultGroup); 895 const isLongSwitch = (sw) => /^--/.test(getText(sw)); 896 const displayedGroups = Object.keys(groups) 897 .filter(groupName => groups[groupName].length > 0) 898 .map(groupName => { 899 const normalizedKeys = groups[groupName] 900 .filter(filterHiddenOptions) 901 .map(key => { 902 if (~aliasKeys.indexOf(key)) 903 return key; 904 for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) { 905 if (~(options.alias[aliasKey] || []).indexOf(key)) 906 return aliasKey; 907 } 908 return key; 909 }); 910 return { groupName, normalizedKeys }; 911 }) 912 .filter(({ normalizedKeys }) => normalizedKeys.length > 0) 913 .map(({ groupName, normalizedKeys }) => { 914 const switches = normalizedKeys.reduce((acc, key) => { 915 acc[key] = [key] 916 .concat(options.alias[key] || []) 917 .map(sw => { 918 if (groupName === self.getPositionalGroupName()) 919 return sw; 920 else { 921 return ((/^[0-9]$/.test(sw) 922 ? ~options.boolean.indexOf(key) 923 ? '-' 924 : '--' 925 : sw.length > 1 926 ? '--' 927 : '-') + sw); 928 } 929 }) 930 .sort((sw1, sw2) => isLongSwitch(sw1) === isLongSwitch(sw2) 931 ? 0 932 : isLongSwitch(sw1) 933 ? 1 934 : -1) 935 .join(', '); 936 return acc; 937 }, {}); 938 return { groupName, normalizedKeys, switches }; 939 }); 940 const shortSwitchesUsed = displayedGroups 941 .filter(({ groupName }) => groupName !== self.getPositionalGroupName()) 942 .some(({ normalizedKeys, switches }) => !normalizedKeys.every(key => isLongSwitch(switches[key]))); 943 if (shortSwitchesUsed) { 944 displayedGroups 945 .filter(({ groupName }) => groupName !== self.getPositionalGroupName()) 946 .forEach(({ normalizedKeys, switches }) => { 947 normalizedKeys.forEach(key => { 948 if (isLongSwitch(switches[key])) { 949 switches[key] = addIndentation(switches[key], '-x, '.length); 950 } 951 }); 952 }); 953 } 954 displayedGroups.forEach(({ groupName, normalizedKeys, switches }) => { 955 ui.div(groupName); 956 normalizedKeys.forEach(key => { 957 const kswitch = switches[key]; 958 let desc = descriptions[key] || ''; 959 let type = null; 960 if (~desc.lastIndexOf(deferY18nLookupPrefix)) 961 desc = __(desc.substring(deferY18nLookupPrefix.length)); 962 if (~options.boolean.indexOf(key)) 963 type = `[${__('boolean')}]`; 964 if (~options.count.indexOf(key)) 965 type = `[${__('count')}]`; 966 if (~options.string.indexOf(key)) 967 type = `[${__('string')}]`; 968 if (~options.normalize.indexOf(key)) 969 type = `[${__('string')}]`; 970 if (~options.array.indexOf(key)) 971 type = `[${__('array')}]`; 972 if (~options.number.indexOf(key)) 973 type = `[${__('number')}]`; 974 const deprecatedExtra = (deprecated) => typeof deprecated === 'string' 975 ? `[${__('deprecated: %s', deprecated)}]` 976 : `[${__('deprecated')}]`; 977 const extra = [ 978 key in deprecatedOptions 979 ? deprecatedExtra(deprecatedOptions[key]) 980 : null, 981 type, 982 key in demandedOptions ? `[${__('required')}]` : null, 983 options.choices && options.choices[key] 984 ? `[${__('choices:')} ${self.stringifiedValues(options.choices[key])}]` 985 : null, 986 defaultString(options.default[key], options.defaultDescription[key]), 987 ] 988 .filter(Boolean) 989 .join(' '); 990 ui.span({ 991 text: getText(kswitch), 992 padding: [0, 2, 0, 2 + getIndentation(kswitch)], 993 width: maxWidth(switches, theWrap) + 4, 994 }, desc); 995 if (extra) 996 ui.div({ text: extra, padding: [0, 0, 0, 2], align: 'right' }); 997 else 998 ui.div(); 999 }); 1000 ui.div(); 1001 }); 1002 if (examples.length) { 1003 ui.div(__('Examples:')); 1004 examples.forEach(example => { 1005 example[0] = example[0].replace(/\$0/g, base$0); 1006 }); 1007 examples.forEach(example => { 1008 if (example[1] === '') { 1009 ui.div({ 1010 text: example[0], 1011 padding: [0, 2, 0, 2], 1012 }); 1013 } 1014 else { 1015 ui.div({ 1016 text: example[0], 1017 padding: [0, 2, 0, 2], 1018 width: maxWidth(examples, theWrap) + 4, 1019 }, { 1020 text: example[1], 1021 }); 1022 } 1023 }); 1024 ui.div(); 1025 } 1026 if (epilogs.length > 0) { 1027 const e = epilogs 1028 .map(epilog => epilog.replace(/\$0/g, base$0)) 1029 .join('\n'); 1030 ui.div(`${e}\n`); 1031 } 1032 return ui.toString().replace(/\s*$/, ''); 1033 }; 1034 function maxWidth(table, theWrap, modifier) { 1035 let width = 0; 1036 if (!Array.isArray(table)) { 1037 table = Object.values(table).map(v => [v]); 1038 } 1039 table.forEach(v => { 1040 width = Math.max(shim.stringWidth(modifier ? `${modifier} ${getText(v[0])}` : getText(v[0])) + getIndentation(v[0]), width); 1041 }); 1042 if (theWrap) 1043 width = Math.min(width, parseInt((theWrap * 0.5).toString(), 10)); 1044 return width; 1045 } 1046 function normalizeAliases() { 1047 const demandedOptions = yargs.getDemandedOptions(); 1048 const options = yargs.getOptions(); 1049 (Object.keys(options.alias) || []).forEach(key => { 1050 options.alias[key].forEach(alias => { 1051 if (descriptions[alias]) 1052 self.describe(key, descriptions[alias]); 1053 if (alias in demandedOptions) 1054 yargs.demandOption(key, demandedOptions[alias]); 1055 if (~options.boolean.indexOf(alias)) 1056 yargs.boolean(key); 1057 if (~options.count.indexOf(alias)) 1058 yargs.count(key); 1059 if (~options.string.indexOf(alias)) 1060 yargs.string(key); 1061 if (~options.normalize.indexOf(alias)) 1062 yargs.normalize(key); 1063 if (~options.array.indexOf(alias)) 1064 yargs.array(key); 1065 if (~options.number.indexOf(alias)) 1066 yargs.number(key); 1067 }); 1068 }); 1069 } 1070 let cachedHelpMessage; 1071 self.cacheHelpMessage = function () { 1072 cachedHelpMessage = this.help(); 1073 }; 1074 self.clearCachedHelpMessage = function () { 1075 cachedHelpMessage = undefined; 1076 }; 1077 function addUngroupedKeys(keys, aliases, groups, defaultGroup) { 1078 let groupedKeys = []; 1079 let toCheck = null; 1080 Object.keys(groups).forEach(group => { 1081 groupedKeys = groupedKeys.concat(groups[group]); 1082 }); 1083 keys.forEach(key => { 1084 toCheck = [key].concat(aliases[key]); 1085 if (!toCheck.some(k => groupedKeys.indexOf(k) !== -1)) { 1086 groups[defaultGroup].push(key); 1087 } 1088 }); 1089 return groupedKeys; 1090 } 1091 function filterHiddenOptions(key) { 1092 return (yargs.getOptions().hiddenOptions.indexOf(key) < 0 || 1093 yargs.parsed.argv[yargs.getOptions().showHiddenOpt]); 1094 } 1095 self.showHelp = (level) => { 1096 const logger = yargs._getLoggerInstance(); 1097 if (!level) 1098 level = 'error'; 1099 const emit = typeof level === 'function' ? level : logger[level]; 1100 emit(self.help()); 1101 }; 1102 self.functionDescription = fn => { 1103 const description = fn.name 1104 ? shim.Parser.decamelize(fn.name, '-') 1105 : __('generated-value'); 1106 return ['(', description, ')'].join(''); 1107 }; 1108 self.stringifiedValues = function stringifiedValues(values, separator) { 1109 let string = ''; 1110 const sep = separator || ', '; 1111 const array = [].concat(values); 1112 if (!values || !array.length) 1113 return string; 1114 array.forEach(value => { 1115 if (string.length) 1116 string += sep; 1117 string += JSON.stringify(value); 1118 }); 1119 return string; 1120 }; 1121 function defaultString(value, defaultDescription) { 1122 let string = `[${__('default:')} `; 1123 if (value === undefined && !defaultDescription) 1124 return null; 1125 if (defaultDescription) { 1126 string += defaultDescription; 1127 } 1128 else { 1129 switch (typeof value) { 1130 case 'string': 1131 string += `"${value}"`; 1132 break; 1133 case 'object': 1134 string += JSON.stringify(value); 1135 break; 1136 default: 1137 string += value; 1138 } 1139 } 1140 return `${string}]`; 1141 } 1142 function windowWidth() { 1143 const maxWidth = 80; 1144 if (shim.process.stdColumns) { 1145 return Math.min(maxWidth, shim.process.stdColumns); 1146 } 1147 else { 1148 return maxWidth; 1149 } 1150 } 1151 let version = null; 1152 self.version = ver => { 1153 version = ver; 1154 }; 1155 self.showVersion = () => { 1156 const logger = yargs._getLoggerInstance(); 1157 logger.log(version); 1158 }; 1159 self.reset = function reset(localLookup) { 1160 failMessage = null; 1161 failureOutput = false; 1162 usages = []; 1163 usageDisabled = false; 1164 epilogs = []; 1165 examples = []; 1166 commands = []; 1167 descriptions = objFilter(descriptions, k => !localLookup[k]); 1168 return self; 1169 }; 1170 const frozens = []; 1171 self.freeze = function freeze() { 1172 frozens.push({ 1173 failMessage, 1174 failureOutput, 1175 usages, 1176 usageDisabled, 1177 epilogs, 1178 examples, 1179 commands, 1180 descriptions, 1181 }); 1182 }; 1183 self.unfreeze = function unfreeze() { 1184 const frozen = frozens.pop(); 1185 assertNotStrictEqual(frozen, undefined, shim); 1186 ({ 1187 failMessage, 1188 failureOutput, 1189 usages, 1190 usageDisabled, 1191 epilogs, 1192 examples, 1193 commands, 1194 descriptions, 1195 } = frozen); 1196 }; 1197 return self; 1198 } 1199 function isIndentedText(text) { 1200 return typeof text === 'object'; 1201 } 1202 function addIndentation(text, indent) { 1203 return isIndentedText(text) 1204 ? { text: text.text, indentation: text.indentation + indent } 1205 : { text, indentation: indent }; 1206 } 1207 function getIndentation(text) { 1208 return isIndentedText(text) ? text.indentation : 0; 1209 } 1210 function getText(text) { 1211 return isIndentedText(text) ? text.text : text; 1212 } 1213 1214 const completionShTemplate = `###-begin-{{app_name}}-completions-### 1215 # 1216 # yargs command completion script 1217 # 1218 # Installation: {{app_path}} {{completion_command}} >> ~/.bashrc 1219 # or {{app_path}} {{completion_command}} >> ~/.bash_profile on OSX. 1220 # 1221 _yargs_completions() 1222 { 1223 local cur_word args type_list 1224 1225 cur_word="\${COMP_WORDS[COMP_CWORD]}" 1226 args=("\${COMP_WORDS[@]}") 1227 1228 # ask yargs to generate completions. 1229 type_list=$({{app_path}} --get-yargs-completions "\${args[@]}") 1230 1231 COMPREPLY=( $(compgen -W "\${type_list}" -- \${cur_word}) ) 1232 1233 # if no match was found, fall back to filename completion 1234 if [ \${#COMPREPLY[@]} -eq 0 ]; then 1235 COMPREPLY=() 1236 fi 1237 1238 return 0 1239 } 1240 complete -o default -F _yargs_completions {{app_name}} 1241 ###-end-{{app_name}}-completions-### 1242 `; 1243 const completionZshTemplate = `###-begin-{{app_name}}-completions-### 1244 # 1245 # yargs command completion script 1246 # 1247 # Installation: {{app_path}} {{completion_command}} >> ~/.zshrc 1248 # or {{app_path}} {{completion_command}} >> ~/.zsh_profile on OSX. 1249 # 1250 _{{app_name}}_yargs_completions() 1251 { 1252 local reply 1253 local si=$IFS 1254 IFS=$'\n' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" {{app_path}} --get-yargs-completions "\${words[@]}")) 1255 IFS=$si 1256 _describe 'values' reply 1257 } 1258 compdef _{{app_name}}_yargs_completions {{app_name}} 1259 ###-end-{{app_name}}-completions-### 1260 `; 1261 1262 function completion(yargs, usage, command, shim) { 1263 const self = { 1264 completionKey: 'get-yargs-completions', 1265 }; 1266 let aliases; 1267 self.setParsed = function setParsed(parsed) { 1268 aliases = parsed.aliases; 1269 }; 1270 const zshShell = (shim.getEnv('SHELL') && shim.getEnv('SHELL').indexOf('zsh') !== -1) || 1271 (shim.getEnv('ZSH_NAME') && shim.getEnv('ZSH_NAME').indexOf('zsh') !== -1); 1272 self.getCompletion = function getCompletion(args, done) { 1273 const completions = []; 1274 const current = args.length ? args[args.length - 1] : ''; 1275 const argv = yargs.parse(args, true); 1276 const parentCommands = yargs.getContext().commands; 1277 function runCompletionFunction(argv) { 1278 assertNotStrictEqual(completionFunction, null, shim); 1279 if (isSyncCompletionFunction(completionFunction)) { 1280 const result = completionFunction(current, argv); 1281 if (isPromise(result)) { 1282 return result 1283 .then(list => { 1284 shim.process.nextTick(() => { 1285 done(list); 1286 }); 1287 }) 1288 .catch(err => { 1289 shim.process.nextTick(() => { 1290 throw err; 1291 }); 1292 }); 1293 } 1294 return done(result); 1295 } 1296 else { 1297 return completionFunction(current, argv, completions => { 1298 done(completions); 1299 }); 1300 } 1301 } 1302 if (completionFunction) { 1303 return isPromise(argv) 1304 ? argv.then(runCompletionFunction) 1305 : runCompletionFunction(argv); 1306 } 1307 const handlers = command.getCommandHandlers(); 1308 for (let i = 0, ii = args.length; i < ii; ++i) { 1309 if (handlers[args[i]] && handlers[args[i]].builder) { 1310 const builder = handlers[args[i]].builder; 1311 if (isCommandBuilderCallback(builder)) { 1312 const y = yargs.reset(); 1313 builder(y); 1314 return y.argv; 1315 } 1316 } 1317 } 1318 if (!current.match(/^-/) && 1319 parentCommands[parentCommands.length - 1] !== current) { 1320 usage.getCommands().forEach(usageCommand => { 1321 const commandName = parseCommand(usageCommand[0]).cmd; 1322 if (args.indexOf(commandName) === -1) { 1323 if (!zshShell) { 1324 completions.push(commandName); 1325 } 1326 else { 1327 const desc = usageCommand[1] || ''; 1328 completions.push(commandName.replace(/:/g, '\\:') + ':' + desc); 1329 } 1330 } 1331 }); 1332 } 1333 if (current.match(/^-/) || (current === '' && completions.length === 0)) { 1334 const descs = usage.getDescriptions(); 1335 const options = yargs.getOptions(); 1336 Object.keys(options.key).forEach(key => { 1337 const negable = !!options.configuration['boolean-negation'] && 1338 options.boolean.includes(key); 1339 let keyAndAliases = [key].concat(aliases[key] || []); 1340 if (negable) 1341 keyAndAliases = keyAndAliases.concat(keyAndAliases.map(key => `no-${key}`)); 1342 function completeOptionKey(key) { 1343 const notInArgs = keyAndAliases.every(val => args.indexOf(`--${val}`) === -1); 1344 if (notInArgs) { 1345 const startsByTwoDashes = (s) => /^--/.test(s); 1346 const isShortOption = (s) => /^[^0-9]$/.test(s); 1347 const dashes = !startsByTwoDashes(current) && isShortOption(key) ? '-' : '--'; 1348 if (!zshShell) { 1349 completions.push(dashes + key); 1350 } 1351 else { 1352 const desc = descs[key] || ''; 1353 completions.push(dashes + 1354 `${key.replace(/:/g, '\\:')}:${desc.replace('__yargsString__:', '')}`); 1355 } 1356 } 1357 } 1358 completeOptionKey(key); 1359 if (negable && !!options.default[key]) 1360 completeOptionKey(`no-${key}`); 1361 }); 1362 } 1363 done(completions); 1364 }; 1365 self.generateCompletionScript = function generateCompletionScript($0, cmd) { 1366 let script = zshShell 1367 ? completionZshTemplate 1368 : completionShTemplate; 1369 const name = shim.path.basename($0); 1370 if ($0.match(/\.js$/)) 1371 $0 = `./${$0}`; 1372 script = script.replace(/{{app_name}}/g, name); 1373 script = script.replace(/{{completion_command}}/g, cmd); 1374 return script.replace(/{{app_path}}/g, $0); 1375 }; 1376 let completionFunction = null; 1377 self.registerFunction = fn => { 1378 completionFunction = fn; 1379 }; 1380 return self; 1381 } 1382 function isSyncCompletionFunction(completionFunction) { 1383 return completionFunction.length < 3; 1384 } 1385 1386 function levenshtein(a, b) { 1387 if (a.length === 0) 1388 return b.length; 1389 if (b.length === 0) 1390 return a.length; 1391 const matrix = []; 1392 let i; 1393 for (i = 0; i <= b.length; i++) { 1394 matrix[i] = [i]; 1395 } 1396 let j; 1397 for (j = 0; j <= a.length; j++) { 1398 matrix[0][j] = j; 1399 } 1400 for (i = 1; i <= b.length; i++) { 1401 for (j = 1; j <= a.length; j++) { 1402 if (b.charAt(i - 1) === a.charAt(j - 1)) { 1403 matrix[i][j] = matrix[i - 1][j - 1]; 1404 } 1405 else { 1406 matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, Math.min(matrix[i][j - 1] + 1, matrix[i - 1][j] + 1)); 1407 } 1408 } 1409 } 1410 return matrix[b.length][a.length]; 1411 } 1412 1413 const specialKeys = ['$0', '--', '_']; 1414 function validation(yargs, usage, y18n, shim) { 1415 const __ = y18n.__; 1416 const __n = y18n.__n; 1417 const self = {}; 1418 self.nonOptionCount = function nonOptionCount(argv) { 1419 const demandedCommands = yargs.getDemandedCommands(); 1420 const positionalCount = argv._.length + (argv['--'] ? argv['--'].length : 0); 1421 const _s = positionalCount - yargs.getContext().commands.length; 1422 if (demandedCommands._ && 1423 (_s < demandedCommands._.min || _s > demandedCommands._.max)) { 1424 if (_s < demandedCommands._.min) { 1425 if (demandedCommands._.minMsg !== undefined) { 1426 usage.fail(demandedCommands._.minMsg 1427 ? demandedCommands._.minMsg 1428 .replace(/\$0/g, _s.toString()) 1429 .replace(/\$1/, demandedCommands._.min.toString()) 1430 : null); 1431 } 1432 else { 1433 usage.fail(__n('Not enough non-option arguments: got %s, need at least %s', 'Not enough non-option arguments: got %s, need at least %s', _s, _s.toString(), demandedCommands._.min.toString())); 1434 } 1435 } 1436 else if (_s > demandedCommands._.max) { 1437 if (demandedCommands._.maxMsg !== undefined) { 1438 usage.fail(demandedCommands._.maxMsg 1439 ? demandedCommands._.maxMsg 1440 .replace(/\$0/g, _s.toString()) 1441 .replace(/\$1/, demandedCommands._.max.toString()) 1442 : null); 1443 } 1444 else { 1445 usage.fail(__n('Too many non-option arguments: got %s, maximum of %s', 'Too many non-option arguments: got %s, maximum of %s', _s, _s.toString(), demandedCommands._.max.toString())); 1446 } 1447 } 1448 } 1449 }; 1450 self.positionalCount = function positionalCount(required, observed) { 1451 if (observed < required) { 1452 usage.fail(__n('Not enough non-option arguments: got %s, need at least %s', 'Not enough non-option arguments: got %s, need at least %s', observed, observed + '', required + '')); 1453 } 1454 }; 1455 self.requiredArguments = function requiredArguments(argv) { 1456 const demandedOptions = yargs.getDemandedOptions(); 1457 let missing = null; 1458 for (const key of Object.keys(demandedOptions)) { 1459 if (!Object.prototype.hasOwnProperty.call(argv, key) || 1460 typeof argv[key] === 'undefined') { 1461 missing = missing || {}; 1462 missing[key] = demandedOptions[key]; 1463 } 1464 } 1465 if (missing) { 1466 const customMsgs = []; 1467 for (const key of Object.keys(missing)) { 1468 const msg = missing[key]; 1469 if (msg && customMsgs.indexOf(msg) < 0) { 1470 customMsgs.push(msg); 1471 } 1472 } 1473 const customMsg = customMsgs.length ? `\n${customMsgs.join('\n')}` : ''; 1474 usage.fail(__n('Missing required argument: %s', 'Missing required arguments: %s', Object.keys(missing).length, Object.keys(missing).join(', ') + customMsg)); 1475 } 1476 }; 1477 self.unknownArguments = function unknownArguments(argv, aliases, positionalMap, isDefaultCommand, checkPositionals = true) { 1478 const commandKeys = yargs.getCommandInstance().getCommands(); 1479 const unknown = []; 1480 const currentContext = yargs.getContext(); 1481 Object.keys(argv).forEach(key => { 1482 if (specialKeys.indexOf(key) === -1 && 1483 !Object.prototype.hasOwnProperty.call(positionalMap, key) && 1484 !Object.prototype.hasOwnProperty.call(yargs._getParseContext(), key) && 1485 !self.isValidAndSomeAliasIsNotNew(key, aliases)) { 1486 unknown.push(key); 1487 } 1488 }); 1489 if (checkPositionals && 1490 (currentContext.commands.length > 0 || 1491 commandKeys.length > 0 || 1492 isDefaultCommand)) { 1493 argv._.slice(currentContext.commands.length).forEach(key => { 1494 if (commandKeys.indexOf('' + key) === -1) { 1495 unknown.push('' + key); 1496 } 1497 }); 1498 } 1499 if (unknown.length > 0) { 1500 usage.fail(__n('Unknown argument: %s', 'Unknown arguments: %s', unknown.length, unknown.join(', '))); 1501 } 1502 }; 1503 self.unknownCommands = function unknownCommands(argv) { 1504 const commandKeys = yargs.getCommandInstance().getCommands(); 1505 const unknown = []; 1506 const currentContext = yargs.getContext(); 1507 if (currentContext.commands.length > 0 || commandKeys.length > 0) { 1508 argv._.slice(currentContext.commands.length).forEach(key => { 1509 if (commandKeys.indexOf('' + key) === -1) { 1510 unknown.push('' + key); 1511 } 1512 }); 1513 } 1514 if (unknown.length > 0) { 1515 usage.fail(__n('Unknown command: %s', 'Unknown commands: %s', unknown.length, unknown.join(', '))); 1516 return true; 1517 } 1518 else { 1519 return false; 1520 } 1521 }; 1522 self.isValidAndSomeAliasIsNotNew = function isValidAndSomeAliasIsNotNew(key, aliases) { 1523 if (!Object.prototype.hasOwnProperty.call(aliases, key)) { 1524 return false; 1525 } 1526 const newAliases = yargs.parsed.newAliases; 1527 for (const a of [key, ...aliases[key]]) { 1528 if (!Object.prototype.hasOwnProperty.call(newAliases, a) || 1529 !newAliases[key]) { 1530 return true; 1531 } 1532 } 1533 return false; 1534 }; 1535 self.limitedChoices = function limitedChoices(argv) { 1536 const options = yargs.getOptions(); 1537 const invalid = {}; 1538 if (!Object.keys(options.choices).length) 1539 return; 1540 Object.keys(argv).forEach(key => { 1541 if (specialKeys.indexOf(key) === -1 && 1542 Object.prototype.hasOwnProperty.call(options.choices, key)) { 1543 [].concat(argv[key]).forEach(value => { 1544 if (options.choices[key].indexOf(value) === -1 && 1545 value !== undefined) { 1546 invalid[key] = (invalid[key] || []).concat(value); 1547 } 1548 }); 1549 } 1550 }); 1551 const invalidKeys = Object.keys(invalid); 1552 if (!invalidKeys.length) 1553 return; 1554 let msg = __('Invalid values:'); 1555 invalidKeys.forEach(key => { 1556 msg += `\n ${__('Argument: %s, Given: %s, Choices: %s', key, usage.stringifiedValues(invalid[key]), usage.stringifiedValues(options.choices[key]))}`; 1557 }); 1558 usage.fail(msg); 1559 }; 1560 let checks = []; 1561 self.check = function check(f, global) { 1562 checks.push({ 1563 func: f, 1564 global, 1565 }); 1566 }; 1567 self.customChecks = function customChecks(argv, aliases) { 1568 for (let i = 0, f; (f = checks[i]) !== undefined; i++) { 1569 const func = f.func; 1570 let result = null; 1571 try { 1572 result = func(argv, aliases); 1573 } 1574 catch (err) { 1575 usage.fail(err.message ? err.message : err, err); 1576 continue; 1577 } 1578 if (!result) { 1579 usage.fail(__('Argument check failed: %s', func.toString())); 1580 } 1581 else if (typeof result === 'string' || result instanceof Error) { 1582 usage.fail(result.toString(), result); 1583 } 1584 } 1585 }; 1586 let implied = {}; 1587 self.implies = function implies(key, value) { 1588 argsert('<string|object> [array|number|string]', [key, value], arguments.length); 1589 if (typeof key === 'object') { 1590 Object.keys(key).forEach(k => { 1591 self.implies(k, key[k]); 1592 }); 1593 } 1594 else { 1595 yargs.global(key); 1596 if (!implied[key]) { 1597 implied[key] = []; 1598 } 1599 if (Array.isArray(value)) { 1600 value.forEach(i => self.implies(key, i)); 1601 } 1602 else { 1603 assertNotStrictEqual(value, undefined, shim); 1604 implied[key].push(value); 1605 } 1606 } 1607 }; 1608 self.getImplied = function getImplied() { 1609 return implied; 1610 }; 1611 function keyExists(argv, val) { 1612 const num = Number(val); 1613 val = isNaN(num) ? val : num; 1614 if (typeof val === 'number') { 1615 val = argv._.length >= val; 1616 } 1617 else if (val.match(/^--no-.+/)) { 1618 val = val.match(/^--no-(.+)/)[1]; 1619 val = !argv[val]; 1620 } 1621 else { 1622 val = argv[val]; 1623 } 1624 return val; 1625 } 1626 self.implications = function implications(argv) { 1627 const implyFail = []; 1628 Object.keys(implied).forEach(key => { 1629 const origKey = key; 1630 (implied[key] || []).forEach(value => { 1631 let key = origKey; 1632 const origValue = value; 1633 key = keyExists(argv, key); 1634 value = keyExists(argv, value); 1635 if (key && !value) { 1636 implyFail.push(` ${origKey} -> ${origValue}`); 1637 } 1638 }); 1639 }); 1640 if (implyFail.length) { 1641 let msg = `${__('Implications failed:')}\n`; 1642 implyFail.forEach(value => { 1643 msg += value; 1644 }); 1645 usage.fail(msg); 1646 } 1647 }; 1648 let conflicting = {}; 1649 self.conflicts = function conflicts(key, value) { 1650 argsert('<string|object> [array|string]', [key, value], arguments.length); 1651 if (typeof key === 'object') { 1652 Object.keys(key).forEach(k => { 1653 self.conflicts(k, key[k]); 1654 }); 1655 } 1656 else { 1657 yargs.global(key); 1658 if (!conflicting[key]) { 1659 conflicting[key] = []; 1660 } 1661 if (Array.isArray(value)) { 1662 value.forEach(i => self.conflicts(key, i)); 1663 } 1664 else { 1665 conflicting[key].push(value); 1666 } 1667 } 1668 }; 1669 self.getConflicting = () => conflicting; 1670 self.conflicting = function conflictingFn(argv) { 1671 Object.keys(argv).forEach(key => { 1672 if (conflicting[key]) { 1673 conflicting[key].forEach(value => { 1674 if (value && argv[key] !== undefined && argv[value] !== undefined) { 1675 usage.fail(__('Arguments %s and %s are mutually exclusive', key, value)); 1676 } 1677 }); 1678 } 1679 }); 1680 }; 1681 self.recommendCommands = function recommendCommands(cmd, potentialCommands) { 1682 const threshold = 3; 1683 potentialCommands = potentialCommands.sort((a, b) => b.length - a.length); 1684 let recommended = null; 1685 let bestDistance = Infinity; 1686 for (let i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) { 1687 const d = levenshtein(cmd, candidate); 1688 if (d <= threshold && d < bestDistance) { 1689 bestDistance = d; 1690 recommended = candidate; 1691 } 1692 } 1693 if (recommended) 1694 usage.fail(__('Did you mean %s?', recommended)); 1695 }; 1696 self.reset = function reset(localLookup) { 1697 implied = objFilter(implied, k => !localLookup[k]); 1698 conflicting = objFilter(conflicting, k => !localLookup[k]); 1699 checks = checks.filter(c => c.global); 1700 return self; 1701 }; 1702 const frozens = []; 1703 self.freeze = function freeze() { 1704 frozens.push({ 1705 implied, 1706 checks, 1707 conflicting, 1708 }); 1709 }; 1710 self.unfreeze = function unfreeze() { 1711 const frozen = frozens.pop(); 1712 assertNotStrictEqual(frozen, undefined, shim); 1713 ({ implied, checks, conflicting } = frozen); 1714 }; 1715 return self; 1716 } 1717 1718 let shim$1; 1719 function YargsWithShim(_shim) { 1720 shim$1 = _shim; 1721 return Yargs; 1722 } 1723 function Yargs(processArgs = [], cwd = shim$1.process.cwd(), parentRequire) { 1724 const self = {}; 1725 let command$1; 1726 let completion$1 = null; 1727 let groups = {}; 1728 const globalMiddleware = []; 1729 let output = ''; 1730 const preservedGroups = {}; 1731 let usage$1; 1732 let validation$1; 1733 let handlerFinishCommand = null; 1734 const y18n = shim$1.y18n; 1735 self.middleware = globalMiddlewareFactory(globalMiddleware, self); 1736 self.scriptName = function (scriptName) { 1737 self.customScriptName = true; 1738 self.$0 = scriptName; 1739 return self; 1740 }; 1741 let default$0; 1742 if (/\b(node|iojs|electron)(\.exe)?$/.test(shim$1.process.argv()[0])) { 1743 default$0 = shim$1.process.argv().slice(1, 2); 1744 } 1745 else { 1746 default$0 = shim$1.process.argv().slice(0, 1); 1747 } 1748 self.$0 = default$0 1749 .map(x => { 1750 const b = rebase(cwd, x); 1751 return x.match(/^(\/|([a-zA-Z]:)?\\)/) && b.length < x.length ? b : x; 1752 }) 1753 .join(' ') 1754 .trim(); 1755 if (shim$1.getEnv('_') && shim$1.getProcessArgvBin() === shim$1.getEnv('_')) { 1756 self.$0 = shim$1 1757 .getEnv('_') 1758 .replace(`${shim$1.path.dirname(shim$1.process.execPath())}/`, ''); 1759 } 1760 const context = { resets: -1, commands: [], fullCommands: [], files: [] }; 1761 self.getContext = () => context; 1762 let hasOutput = false; 1763 let exitError = null; 1764 self.exit = (code, err) => { 1765 hasOutput = true; 1766 exitError = err; 1767 if (exitProcess) 1768 shim$1.process.exit(code); 1769 }; 1770 let completionCommand = null; 1771 self.completion = function (cmd, desc, fn) { 1772 argsert('[string] [string|boolean|function] [function]', [cmd, desc, fn], arguments.length); 1773 if (typeof desc === 'function') { 1774 fn = desc; 1775 desc = undefined; 1776 } 1777 completionCommand = cmd || completionCommand || 'completion'; 1778 if (!desc && desc !== false) { 1779 desc = 'generate completion script'; 1780 } 1781 self.command(completionCommand, desc); 1782 if (fn) 1783 completion$1.registerFunction(fn); 1784 return self; 1785 }; 1786 let options; 1787 self.resetOptions = self.reset = function resetOptions(aliases = {}) { 1788 context.resets++; 1789 options = options || {}; 1790 const tmpOptions = {}; 1791 tmpOptions.local = options.local ? options.local : []; 1792 tmpOptions.configObjects = options.configObjects 1793 ? options.configObjects 1794 : []; 1795 const localLookup = {}; 1796 tmpOptions.local.forEach(l => { 1797 localLookup[l] = true; 1798 (aliases[l] || []).forEach(a => { 1799 localLookup[a] = true; 1800 }); 1801 }); 1802 Object.assign(preservedGroups, Object.keys(groups).reduce((acc, groupName) => { 1803 const keys = groups[groupName].filter(key => !(key in localLookup)); 1804 if (keys.length > 0) { 1805 acc[groupName] = keys; 1806 } 1807 return acc; 1808 }, {})); 1809 groups = {}; 1810 const arrayOptions = [ 1811 'array', 1812 'boolean', 1813 'string', 1814 'skipValidation', 1815 'count', 1816 'normalize', 1817 'number', 1818 'hiddenOptions', 1819 ]; 1820 const objectOptions = [ 1821 'narg', 1822 'key', 1823 'alias', 1824 'default', 1825 'defaultDescription', 1826 'config', 1827 'choices', 1828 'demandedOptions', 1829 'demandedCommands', 1830 'coerce', 1831 'deprecatedOptions', 1832 ]; 1833 arrayOptions.forEach(k => { 1834 tmpOptions[k] = (options[k] || []).filter((k) => !localLookup[k]); 1835 }); 1836 objectOptions.forEach((k) => { 1837 tmpOptions[k] = objFilter(options[k], k => !localLookup[k]); 1838 }); 1839 tmpOptions.envPrefix = options.envPrefix; 1840 options = tmpOptions; 1841 usage$1 = usage$1 ? usage$1.reset(localLookup) : usage(self, y18n, shim$1); 1842 validation$1 = validation$1 1843 ? validation$1.reset(localLookup) 1844 : validation(self, usage$1, y18n, shim$1); 1845 command$1 = command$1 1846 ? command$1.reset() 1847 : command(self, usage$1, validation$1, globalMiddleware, shim$1); 1848 if (!completion$1) 1849 completion$1 = completion(self, usage$1, command$1, shim$1); 1850 completionCommand = null; 1851 output = ''; 1852 exitError = null; 1853 hasOutput = false; 1854 self.parsed = false; 1855 return self; 1856 }; 1857 self.resetOptions(); 1858 const frozens = []; 1859 function freeze() { 1860 frozens.push({ 1861 options, 1862 configObjects: options.configObjects.slice(0), 1863 exitProcess, 1864 groups, 1865 strict, 1866 strictCommands, 1867 strictOptions, 1868 completionCommand, 1869 output, 1870 exitError, 1871 hasOutput, 1872 parsed: self.parsed, 1873 parseFn, 1874 parseContext, 1875 handlerFinishCommand, 1876 }); 1877 usage$1.freeze(); 1878 validation$1.freeze(); 1879 command$1.freeze(); 1880 } 1881 function unfreeze() { 1882 const frozen = frozens.pop(); 1883 assertNotStrictEqual(frozen, undefined, shim$1); 1884 let configObjects; 1885 ({ 1886 options, 1887 configObjects, 1888 exitProcess, 1889 groups, 1890 output, 1891 exitError, 1892 hasOutput, 1893 parsed: self.parsed, 1894 strict, 1895 strictCommands, 1896 strictOptions, 1897 completionCommand, 1898 parseFn, 1899 parseContext, 1900 handlerFinishCommand, 1901 } = frozen); 1902 options.configObjects = configObjects; 1903 usage$1.unfreeze(); 1904 validation$1.unfreeze(); 1905 command$1.unfreeze(); 1906 } 1907 self.boolean = function (keys) { 1908 argsert('<array|string>', [keys], arguments.length); 1909 populateParserHintArray('boolean', keys); 1910 return self; 1911 }; 1912 self.array = function (keys) { 1913 argsert('<array|string>', [keys], arguments.length); 1914 populateParserHintArray('array', keys); 1915 return self; 1916 }; 1917 self.number = function (keys) { 1918 argsert('<array|string>', [keys], arguments.length); 1919 populateParserHintArray('number', keys); 1920 return self; 1921 }; 1922 self.normalize = function (keys) { 1923 argsert('<array|string>', [keys], arguments.length); 1924 populateParserHintArray('normalize', keys); 1925 return self; 1926 }; 1927 self.count = function (keys) { 1928 argsert('<array|string>', [keys], arguments.length); 1929 populateParserHintArray('count', keys); 1930 return self; 1931 }; 1932 self.string = function (keys) { 1933 argsert('<array|string>', [keys], arguments.length); 1934 populateParserHintArray('string', keys); 1935 return self; 1936 }; 1937 self.requiresArg = function (keys) { 1938 argsert('<array|string|object> [number]', [keys], arguments.length); 1939 if (typeof keys === 'string' && options.narg[keys]) { 1940 return self; 1941 } 1942 else { 1943 populateParserHintSingleValueDictionary(self.requiresArg, 'narg', keys, NaN); 1944 } 1945 return self; 1946 }; 1947 self.skipValidation = function (keys) { 1948 argsert('<array|string>', [keys], arguments.length); 1949 populateParserHintArray('skipValidation', keys); 1950 return self; 1951 }; 1952 function populateParserHintArray(type, keys) { 1953 keys = [].concat(keys); 1954 keys.forEach(key => { 1955 key = sanitizeKey(key); 1956 options[type].push(key); 1957 }); 1958 } 1959 self.nargs = function (key, value) { 1960 argsert('<string|object|array> [number]', [key, value], arguments.length); 1961 populateParserHintSingleValueDictionary(self.nargs, 'narg', key, value); 1962 return self; 1963 }; 1964 self.choices = function (key, value) { 1965 argsert('<object|string|array> [string|array]', [key, value], arguments.length); 1966 populateParserHintArrayDictionary(self.choices, 'choices', key, value); 1967 return self; 1968 }; 1969 self.alias = function (key, value) { 1970 argsert('<object|string|array> [string|array]', [key, value], arguments.length); 1971 populateParserHintArrayDictionary(self.alias, 'alias', key, value); 1972 return self; 1973 }; 1974 self.default = self.defaults = function (key, value, defaultDescription) { 1975 argsert('<object|string|array> [*] [string]', [key, value, defaultDescription], arguments.length); 1976 if (defaultDescription) { 1977 assertSingleKey(key, shim$1); 1978 options.defaultDescription[key] = defaultDescription; 1979 } 1980 if (typeof value === 'function') { 1981 assertSingleKey(key, shim$1); 1982 if (!options.defaultDescription[key]) 1983 options.defaultDescription[key] = usage$1.functionDescription(value); 1984 value = value.call(); 1985 } 1986 populateParserHintSingleValueDictionary(self.default, 'default', key, value); 1987 return self; 1988 }; 1989 self.describe = function (key, desc) { 1990 argsert('<object|string|array> [string]', [key, desc], arguments.length); 1991 setKey(key, true); 1992 usage$1.describe(key, desc); 1993 return self; 1994 }; 1995 function setKey(key, set) { 1996 populateParserHintSingleValueDictionary(setKey, 'key', key, set); 1997 return self; 1998 } 1999 function demandOption(keys, msg) { 2000 argsert('<object|string|array> [string]', [keys, msg], arguments.length); 2001 populateParserHintSingleValueDictionary(self.demandOption, 'demandedOptions', keys, msg); 2002 return self; 2003 } 2004 self.demandOption = demandOption; 2005 self.coerce = function (keys, value) { 2006 argsert('<object|string|array> [function]', [keys, value], arguments.length); 2007 populateParserHintSingleValueDictionary(self.coerce, 'coerce', keys, value); 2008 return self; 2009 }; 2010 function populateParserHintSingleValueDictionary(builder, type, key, value) { 2011 populateParserHintDictionary(builder, type, key, value, (type, key, value) => { 2012 options[type][key] = value; 2013 }); 2014 } 2015 function populateParserHintArrayDictionary(builder, type, key, value) { 2016 populateParserHintDictionary(builder, type, key, value, (type, key, value) => { 2017 options[type][key] = (options[type][key] || []).concat(value); 2018 }); 2019 } 2020 function populateParserHintDictionary(builder, type, key, value, singleKeyHandler) { 2021 if (Array.isArray(key)) { 2022 key.forEach(k => { 2023 builder(k, value); 2024 }); 2025 } 2026 else if (((key) => typeof key === 'object')(key)) { 2027 for (const k of objectKeys(key)) { 2028 builder(k, key[k]); 2029 } 2030 } 2031 else { 2032 singleKeyHandler(type, sanitizeKey(key), value); 2033 } 2034 } 2035 function sanitizeKey(key) { 2036 if (key === '__proto__') 2037 return '___proto___'; 2038 return key; 2039 } 2040 function deleteFromParserHintObject(optionKey) { 2041 objectKeys(options).forEach((hintKey) => { 2042 if (((key) => key === 'configObjects')(hintKey)) 2043 return; 2044 const hint = options[hintKey]; 2045 if (Array.isArray(hint)) { 2046 if (~hint.indexOf(optionKey)) 2047 hint.splice(hint.indexOf(optionKey), 1); 2048 } 2049 else if (typeof hint === 'object') { 2050 delete hint[optionKey]; 2051 } 2052 }); 2053 delete usage$1.getDescriptions()[optionKey]; 2054 } 2055 self.config = function config(key = 'config', msg, parseFn) { 2056 argsert('[object|string] [string|function] [function]', [key, msg, parseFn], arguments.length); 2057 if (typeof key === 'object' && !Array.isArray(key)) { 2058 key = applyExtends(key, cwd, self.getParserConfiguration()['deep-merge-config'] || false, shim$1); 2059 options.configObjects = (options.configObjects || []).concat(key); 2060 return self; 2061 } 2062 if (typeof msg === 'function') { 2063 parseFn = msg; 2064 msg = undefined; 2065 } 2066 self.describe(key, msg || usage$1.deferY18nLookup('Path to JSON config file')); 2067 (Array.isArray(key) ? key : [key]).forEach(k => { 2068 options.config[k] = parseFn || true; 2069 }); 2070 return self; 2071 }; 2072 self.example = function (cmd, description) { 2073 argsert('<string|array> [string]', [cmd, description], arguments.length); 2074 if (Array.isArray(cmd)) { 2075 cmd.forEach(exampleParams => self.example(...exampleParams)); 2076 } 2077 else { 2078 usage$1.example(cmd, description); 2079 } 2080 return self; 2081 }; 2082 self.command = function (cmd, description, builder, handler, middlewares, deprecated) { 2083 argsert('<string|array|object> [string|boolean] [function|object] [function] [array] [boolean|string]', [cmd, description, builder, handler, middlewares, deprecated], arguments.length); 2084 command$1.addHandler(cmd, description, builder, handler, middlewares, deprecated); 2085 return self; 2086 }; 2087 self.commandDir = function (dir, opts) { 2088 argsert('<string> [object]', [dir, opts], arguments.length); 2089 const req = parentRequire || shim$1.require; 2090 command$1.addDirectory(dir, self.getContext(), req, shim$1.getCallerFile(), opts); 2091 return self; 2092 }; 2093 self.demand = self.required = self.require = function demand(keys, max, msg) { 2094 if (Array.isArray(max)) { 2095 max.forEach(key => { 2096 assertNotStrictEqual(msg, true, shim$1); 2097 demandOption(key, msg); 2098 }); 2099 max = Infinity; 2100 } 2101 else if (typeof max !== 'number') { 2102 msg = max; 2103 max = Infinity; 2104 } 2105 if (typeof keys === 'number') { 2106 assertNotStrictEqual(msg, true, shim$1); 2107 self.demandCommand(keys, max, msg, msg); 2108 } 2109 else if (Array.isArray(keys)) { 2110 keys.forEach(key => { 2111 assertNotStrictEqual(msg, true, shim$1); 2112 demandOption(key, msg); 2113 }); 2114 } 2115 else { 2116 if (typeof msg === 'string') { 2117 demandOption(keys, msg); 2118 } 2119 else if (msg === true || typeof msg === 'undefined') { 2120 demandOption(keys); 2121 } 2122 } 2123 return self; 2124 }; 2125 self.demandCommand = function demandCommand(min = 1, max, minMsg, maxMsg) { 2126 argsert('[number] [number|string] [string|null|undefined] [string|null|undefined]', [min, max, minMsg, maxMsg], arguments.length); 2127 if (typeof max !== 'number') { 2128 minMsg = max; 2129 max = Infinity; 2130 } 2131 self.global('_', false); 2132 options.demandedCommands._ = { 2133 min, 2134 max, 2135 minMsg, 2136 maxMsg, 2137 }; 2138 return self; 2139 }; 2140 self.getDemandedOptions = () => { 2141 argsert([], 0); 2142 return options.demandedOptions; 2143 }; 2144 self.getDemandedCommands = () => { 2145 argsert([], 0); 2146 return options.demandedCommands; 2147 }; 2148 self.deprecateOption = function deprecateOption(option, message) { 2149 argsert('<string> [string|boolean]', [option, message], arguments.length); 2150 options.deprecatedOptions[option] = message; 2151 return self; 2152 }; 2153 self.getDeprecatedOptions = () => { 2154 argsert([], 0); 2155 return options.deprecatedOptions; 2156 }; 2157 self.implies = function (key, value) { 2158 argsert('<string|object> [number|string|array]', [key, value], arguments.length); 2159 validation$1.implies(key, value); 2160 return self; 2161 }; 2162 self.conflicts = function (key1, key2) { 2163 argsert('<string|object> [string|array]', [key1, key2], arguments.length); 2164 validation$1.conflicts(key1, key2); 2165 return self; 2166 }; 2167 self.usage = function (msg, description, builder, handler) { 2168 argsert('<string|null|undefined> [string|boolean] [function|object] [function]', [msg, description, builder, handler], arguments.length); 2169 if (description !== undefined) { 2170 assertNotStrictEqual(msg, null, shim$1); 2171 if ((msg || '').match(/^\$0( |$)/)) { 2172 return self.command(msg, description, builder, handler); 2173 } 2174 else { 2175 throw new YError('.usage() description must start with $0 if being used as alias for .command()'); 2176 } 2177 } 2178 else { 2179 usage$1.usage(msg); 2180 return self; 2181 } 2182 }; 2183 self.epilogue = self.epilog = function (msg) { 2184 argsert('<string>', [msg], arguments.length); 2185 usage$1.epilog(msg); 2186 return self; 2187 }; 2188 self.fail = function (f) { 2189 argsert('<function>', [f], arguments.length); 2190 usage$1.failFn(f); 2191 return self; 2192 }; 2193 self.onFinishCommand = function (f) { 2194 argsert('<function>', [f], arguments.length); 2195 handlerFinishCommand = f; 2196 return self; 2197 }; 2198 self.getHandlerFinishCommand = () => handlerFinishCommand; 2199 self.check = function (f, _global) { 2200 argsert('<function> [boolean]', [f, _global], arguments.length); 2201 validation$1.check(f, _global !== false); 2202 return self; 2203 }; 2204 self.global = function global(globals, global) { 2205 argsert('<string|array> [boolean]', [globals, global], arguments.length); 2206 globals = [].concat(globals); 2207 if (global !== false) { 2208 options.local = options.local.filter(l => globals.indexOf(l) === -1); 2209 } 2210 else { 2211 globals.forEach(g => { 2212 if (options.local.indexOf(g) === -1) 2213 options.local.push(g); 2214 }); 2215 } 2216 return self; 2217 }; 2218 self.pkgConf = function pkgConf(key, rootPath) { 2219 argsert('<string> [string]', [key, rootPath], arguments.length); 2220 let conf = null; 2221 const obj = pkgUp(rootPath || cwd); 2222 if (obj[key] && typeof obj[key] === 'object') { 2223 conf = applyExtends(obj[key], rootPath || cwd, self.getParserConfiguration()['deep-merge-config'] || false, shim$1); 2224 options.configObjects = (options.configObjects || []).concat(conf); 2225 } 2226 return self; 2227 }; 2228 const pkgs = {}; 2229 function pkgUp(rootPath) { 2230 const npath = rootPath || '*'; 2231 if (pkgs[npath]) 2232 return pkgs[npath]; 2233 let obj = {}; 2234 try { 2235 let startDir = rootPath || shim$1.mainFilename; 2236 if (!rootPath && shim$1.path.extname(startDir)) { 2237 startDir = shim$1.path.dirname(startDir); 2238 } 2239 const pkgJsonPath = shim$1.findUp(startDir, (dir, names) => { 2240 if (names.includes('package.json')) { 2241 return 'package.json'; 2242 } 2243 else { 2244 return undefined; 2245 } 2246 }); 2247 assertNotStrictEqual(pkgJsonPath, undefined, shim$1); 2248 obj = JSON.parse(shim$1.readFileSync(pkgJsonPath, 'utf8')); 2249 } 2250 catch (_noop) { } 2251 pkgs[npath] = obj || {}; 2252 return pkgs[npath]; 2253 } 2254 let parseFn = null; 2255 let parseContext = null; 2256 self.parse = function parse(args, shortCircuit, _parseFn) { 2257 argsert('[string|array] [function|boolean|object] [function]', [args, shortCircuit, _parseFn], arguments.length); 2258 freeze(); 2259 if (typeof args === 'undefined') { 2260 const argv = self._parseArgs(processArgs); 2261 const tmpParsed = self.parsed; 2262 unfreeze(); 2263 self.parsed = tmpParsed; 2264 return argv; 2265 } 2266 if (typeof shortCircuit === 'object') { 2267 parseContext = shortCircuit; 2268 shortCircuit = _parseFn; 2269 } 2270 if (typeof shortCircuit === 'function') { 2271 parseFn = shortCircuit; 2272 shortCircuit = false; 2273 } 2274 if (!shortCircuit) 2275 processArgs = args; 2276 if (parseFn) 2277 exitProcess = false; 2278 const parsed = self._parseArgs(args, !!shortCircuit); 2279 completion$1.setParsed(self.parsed); 2280 if (parseFn) 2281 parseFn(exitError, parsed, output); 2282 unfreeze(); 2283 return parsed; 2284 }; 2285 self._getParseContext = () => parseContext || {}; 2286 self._hasParseCallback = () => !!parseFn; 2287 self.option = self.options = function option(key, opt) { 2288 argsert('<string|object> [object]', [key, opt], arguments.length); 2289 if (typeof key === 'object') { 2290 Object.keys(key).forEach(k => { 2291 self.options(k, key[k]); 2292 }); 2293 } 2294 else { 2295 if (typeof opt !== 'object') { 2296 opt = {}; 2297 } 2298 options.key[key] = true; 2299 if (opt.alias) 2300 self.alias(key, opt.alias); 2301 const deprecate = opt.deprecate || opt.deprecated; 2302 if (deprecate) { 2303 self.deprecateOption(key, deprecate); 2304 } 2305 const demand = opt.demand || opt.required || opt.require; 2306 if (demand) { 2307 self.demand(key, demand); 2308 } 2309 if (opt.demandOption) { 2310 self.demandOption(key, typeof opt.demandOption === 'string' ? opt.demandOption : undefined); 2311 } 2312 if (opt.conflicts) { 2313 self.conflicts(key, opt.conflicts); 2314 } 2315 if ('default' in opt) { 2316 self.default(key, opt.default); 2317 } 2318 if (opt.implies !== undefined) { 2319 self.implies(key, opt.implies); 2320 } 2321 if (opt.nargs !== undefined) { 2322 self.nargs(key, opt.nargs); 2323 } 2324 if (opt.config) { 2325 self.config(key, opt.configParser); 2326 } 2327 if (opt.normalize) { 2328 self.normalize(key); 2329 } 2330 if (opt.choices) { 2331 self.choices(key, opt.choices); 2332 } 2333 if (opt.coerce) { 2334 self.coerce(key, opt.coerce); 2335 } 2336 if (opt.group) { 2337 self.group(key, opt.group); 2338 } 2339 if (opt.boolean || opt.type === 'boolean') { 2340 self.boolean(key); 2341 if (opt.alias) 2342 self.boolean(opt.alias); 2343 } 2344 if (opt.array || opt.type === 'array') { 2345 self.array(key); 2346 if (opt.alias) 2347 self.array(opt.alias); 2348 } 2349 if (opt.number || opt.type === 'number') { 2350 self.number(key); 2351 if (opt.alias) 2352 self.number(opt.alias); 2353 } 2354 if (opt.string || opt.type === 'string') { 2355 self.string(key); 2356 if (opt.alias) 2357 self.string(opt.alias); 2358 } 2359 if (opt.count || opt.type === 'count') { 2360 self.count(key); 2361 } 2362 if (typeof opt.global === 'boolean') { 2363 self.global(key, opt.global); 2364 } 2365 if (opt.defaultDescription) { 2366 options.defaultDescription[key] = opt.defaultDescription; 2367 } 2368 if (opt.skipValidation) { 2369 self.skipValidation(key); 2370 } 2371 const desc = opt.describe || opt.description || opt.desc; 2372 self.describe(key, desc); 2373 if (opt.hidden) { 2374 self.hide(key); 2375 } 2376 if (opt.requiresArg) { 2377 self.requiresArg(key); 2378 } 2379 } 2380 return self; 2381 }; 2382 self.getOptions = () => options; 2383 self.positional = function (key, opts) { 2384 argsert('<string> <object>', [key, opts], arguments.length); 2385 if (context.resets === 0) { 2386 throw new YError(".positional() can only be called in a command's builder function"); 2387 } 2388 const supportedOpts = [ 2389 'default', 2390 'defaultDescription', 2391 'implies', 2392 'normalize', 2393 'choices', 2394 'conflicts', 2395 'coerce', 2396 'type', 2397 'describe', 2398 'desc', 2399 'description', 2400 'alias', 2401 ]; 2402 opts = objFilter(opts, (k, v) => { 2403 let accept = supportedOpts.indexOf(k) !== -1; 2404 if (k === 'type' && ['string', 'number', 'boolean'].indexOf(v) === -1) 2405 accept = false; 2406 return accept; 2407 }); 2408 const fullCommand = context.fullCommands[context.fullCommands.length - 1]; 2409 const parseOptions = fullCommand 2410 ? command$1.cmdToParseOptions(fullCommand) 2411 : { 2412 array: [], 2413 alias: {}, 2414 default: {}, 2415 demand: {}, 2416 }; 2417 objectKeys(parseOptions).forEach(pk => { 2418 const parseOption = parseOptions[pk]; 2419 if (Array.isArray(parseOption)) { 2420 if (parseOption.indexOf(key) !== -1) 2421 opts[pk] = true; 2422 } 2423 else { 2424 if (parseOption[key] && !(pk in opts)) 2425 opts[pk] = parseOption[key]; 2426 } 2427 }); 2428 self.group(key, usage$1.getPositionalGroupName()); 2429 return self.option(key, opts); 2430 }; 2431 self.group = function group(opts, groupName) { 2432 argsert('<string|array> <string>', [opts, groupName], arguments.length); 2433 const existing = preservedGroups[groupName] || groups[groupName]; 2434 if (preservedGroups[groupName]) { 2435 delete preservedGroups[groupName]; 2436 } 2437 const seen = {}; 2438 groups[groupName] = (existing || []).concat(opts).filter(key => { 2439 if (seen[key]) 2440 return false; 2441 return (seen[key] = true); 2442 }); 2443 return self; 2444 }; 2445 self.getGroups = () => Object.assign({}, groups, preservedGroups); 2446 self.env = function (prefix) { 2447 argsert('[string|boolean]', [prefix], arguments.length); 2448 if (prefix === false) 2449 delete options.envPrefix; 2450 else 2451 options.envPrefix = prefix || ''; 2452 return self; 2453 }; 2454 self.wrap = function (cols) { 2455 argsert('<number|null|undefined>', [cols], arguments.length); 2456 usage$1.wrap(cols); 2457 return self; 2458 }; 2459 let strict = false; 2460 self.strict = function (enabled) { 2461 argsert('[boolean]', [enabled], arguments.length); 2462 strict = enabled !== false; 2463 return self; 2464 }; 2465 self.getStrict = () => strict; 2466 let strictCommands = false; 2467 self.strictCommands = function (enabled) { 2468 argsert('[boolean]', [enabled], arguments.length); 2469 strictCommands = enabled !== false; 2470 return self; 2471 }; 2472 self.getStrictCommands = () => strictCommands; 2473 let strictOptions = false; 2474 self.strictOptions = function (enabled) { 2475 argsert('[boolean]', [enabled], arguments.length); 2476 strictOptions = enabled !== false; 2477 return self; 2478 }; 2479 self.getStrictOptions = () => strictOptions; 2480 let parserConfig = {}; 2481 self.parserConfiguration = function parserConfiguration(config) { 2482 argsert('<object>', [config], arguments.length); 2483 parserConfig = config; 2484 return self; 2485 }; 2486 self.getParserConfiguration = () => parserConfig; 2487 self.showHelp = function (level) { 2488 argsert('[string|function]', [level], arguments.length); 2489 if (!self.parsed) 2490 self._parseArgs(processArgs); 2491 if (command$1.hasDefaultCommand()) { 2492 context.resets++; 2493 command$1.runDefaultBuilderOn(self); 2494 } 2495 usage$1.showHelp(level); 2496 return self; 2497 }; 2498 let versionOpt = null; 2499 self.version = function version(opt, msg, ver) { 2500 const defaultVersionOpt = 'version'; 2501 argsert('[boolean|string] [string] [string]', [opt, msg, ver], arguments.length); 2502 if (versionOpt) { 2503 deleteFromParserHintObject(versionOpt); 2504 usage$1.version(undefined); 2505 versionOpt = null; 2506 } 2507 if (arguments.length === 0) { 2508 ver = guessVersion(); 2509 opt = defaultVersionOpt; 2510 } 2511 else if (arguments.length === 1) { 2512 if (opt === false) { 2513 return self; 2514 } 2515 ver = opt; 2516 opt = defaultVersionOpt; 2517 } 2518 else if (arguments.length === 2) { 2519 ver = msg; 2520 msg = undefined; 2521 } 2522 versionOpt = typeof opt === 'string' ? opt : defaultVersionOpt; 2523 msg = msg || usage$1.deferY18nLookup('Show version number'); 2524 usage$1.version(ver || undefined); 2525 self.boolean(versionOpt); 2526 self.describe(versionOpt, msg); 2527 return self; 2528 }; 2529 function guessVersion() { 2530 const obj = pkgUp(); 2531 return obj.version || 'unknown'; 2532 } 2533 let helpOpt = null; 2534 self.addHelpOpt = self.help = function addHelpOpt(opt, msg) { 2535 const defaultHelpOpt = 'help'; 2536 argsert('[string|boolean] [string]', [opt, msg], arguments.length); 2537 if (helpOpt) { 2538 deleteFromParserHintObject(helpOpt); 2539 helpOpt = null; 2540 } 2541 if (arguments.length === 1) { 2542 if (opt === false) 2543 return self; 2544 } 2545 helpOpt = typeof opt === 'string' ? opt : defaultHelpOpt; 2546 self.boolean(helpOpt); 2547 self.describe(helpOpt, msg || usage$1.deferY18nLookup('Show help')); 2548 return self; 2549 }; 2550 const defaultShowHiddenOpt = 'show-hidden'; 2551 options.showHiddenOpt = defaultShowHiddenOpt; 2552 self.addShowHiddenOpt = self.showHidden = function addShowHiddenOpt(opt, msg) { 2553 argsert('[string|boolean] [string]', [opt, msg], arguments.length); 2554 if (arguments.length === 1) { 2555 if (opt === false) 2556 return self; 2557 } 2558 const showHiddenOpt = typeof opt === 'string' ? opt : defaultShowHiddenOpt; 2559 self.boolean(showHiddenOpt); 2560 self.describe(showHiddenOpt, msg || usage$1.deferY18nLookup('Show hidden options')); 2561 options.showHiddenOpt = showHiddenOpt; 2562 return self; 2563 }; 2564 self.hide = function hide(key) { 2565 argsert('<string>', [key], arguments.length); 2566 options.hiddenOptions.push(key); 2567 return self; 2568 }; 2569 self.showHelpOnFail = function showHelpOnFail(enabled, message) { 2570 argsert('[boolean|string] [string]', [enabled, message], arguments.length); 2571 usage$1.showHelpOnFail(enabled, message); 2572 return self; 2573 }; 2574 let exitProcess = true; 2575 self.exitProcess = function (enabled = true) { 2576 argsert('[boolean]', [enabled], arguments.length); 2577 exitProcess = enabled; 2578 return self; 2579 }; 2580 self.getExitProcess = () => exitProcess; 2581 self.showCompletionScript = function ($0, cmd) { 2582 argsert('[string] [string]', [$0, cmd], arguments.length); 2583 $0 = $0 || self.$0; 2584 _logger.log(completion$1.generateCompletionScript($0, cmd || completionCommand || 'completion')); 2585 return self; 2586 }; 2587 self.getCompletion = function (args, done) { 2588 argsert('<array> <function>', [args, done], arguments.length); 2589 completion$1.getCompletion(args, done); 2590 }; 2591 self.locale = function (locale) { 2592 argsert('[string]', [locale], arguments.length); 2593 if (!locale) { 2594 guessLocale(); 2595 return y18n.getLocale(); 2596 } 2597 detectLocale = false; 2598 y18n.setLocale(locale); 2599 return self; 2600 }; 2601 self.updateStrings = self.updateLocale = function (obj) { 2602 argsert('<object>', [obj], arguments.length); 2603 detectLocale = false; 2604 y18n.updateLocale(obj); 2605 return self; 2606 }; 2607 let detectLocale = true; 2608 self.detectLocale = function (detect) { 2609 argsert('<boolean>', [detect], arguments.length); 2610 detectLocale = detect; 2611 return self; 2612 }; 2613 self.getDetectLocale = () => detectLocale; 2614 const _logger = { 2615 log(...args) { 2616 if (!self._hasParseCallback()) 2617 console.log(...args); 2618 hasOutput = true; 2619 if (output.length) 2620 output += '\n'; 2621 output += args.join(' '); 2622 }, 2623 error(...args) { 2624 if (!self._hasParseCallback()) 2625 console.error(...args); 2626 hasOutput = true; 2627 if (output.length) 2628 output += '\n'; 2629 output += args.join(' '); 2630 }, 2631 }; 2632 self._getLoggerInstance = () => _logger; 2633 self._hasOutput = () => hasOutput; 2634 self._setHasOutput = () => { 2635 hasOutput = true; 2636 }; 2637 let recommendCommands; 2638 self.recommendCommands = function (recommend = true) { 2639 argsert('[boolean]', [recommend], arguments.length); 2640 recommendCommands = recommend; 2641 return self; 2642 }; 2643 self.getUsageInstance = () => usage$1; 2644 self.getValidationInstance = () => validation$1; 2645 self.getCommandInstance = () => command$1; 2646 self.terminalWidth = () => { 2647 argsert([], 0); 2648 return shim$1.process.stdColumns; 2649 }; 2650 Object.defineProperty(self, 'argv', { 2651 get: () => self._parseArgs(processArgs), 2652 enumerable: true, 2653 }); 2654 self._parseArgs = function parseArgs(args, shortCircuit, _calledFromCommand, commandIndex) { 2655 let skipValidation = !!_calledFromCommand; 2656 args = args || processArgs; 2657 options.__ = y18n.__; 2658 options.configuration = self.getParserConfiguration(); 2659 const populateDoubleDash = !!options.configuration['populate--']; 2660 const config = Object.assign({}, options.configuration, { 2661 'populate--': true, 2662 }); 2663 const parsed = shim$1.Parser.detailed(args, Object.assign({}, options, { 2664 configuration: Object.assign({ 'parse-positional-numbers': false }, config), 2665 })); 2666 let argv = parsed.argv; 2667 if (parseContext) 2668 argv = Object.assign({}, argv, parseContext); 2669 const aliases = parsed.aliases; 2670 argv.$0 = self.$0; 2671 self.parsed = parsed; 2672 try { 2673 guessLocale(); 2674 if (shortCircuit) { 2675 return self._postProcess(argv, populateDoubleDash, _calledFromCommand); 2676 } 2677 if (helpOpt) { 2678 const helpCmds = [helpOpt] 2679 .concat(aliases[helpOpt] || []) 2680 .filter(k => k.length > 1); 2681 if (~helpCmds.indexOf('' + argv._[argv._.length - 1])) { 2682 argv._.pop(); 2683 argv[helpOpt] = true; 2684 } 2685 } 2686 const handlerKeys = command$1.getCommands(); 2687 const requestCompletions = completion$1.completionKey in argv; 2688 const skipRecommendation = argv[helpOpt] || requestCompletions; 2689 const skipDefaultCommand = skipRecommendation && 2690 (handlerKeys.length > 1 || handlerKeys[0] !== '$0'); 2691 if (argv._.length) { 2692 if (handlerKeys.length) { 2693 let firstUnknownCommand; 2694 for (let i = commandIndex || 0, cmd; argv._[i] !== undefined; i++) { 2695 cmd = String(argv._[i]); 2696 if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) { 2697 const innerArgv = command$1.runCommand(cmd, self, parsed, i + 1); 2698 return self._postProcess(innerArgv, populateDoubleDash); 2699 } 2700 else if (!firstUnknownCommand && cmd !== completionCommand) { 2701 firstUnknownCommand = cmd; 2702 break; 2703 } 2704 } 2705 if (command$1.hasDefaultCommand() && !skipDefaultCommand) { 2706 const innerArgv = command$1.runCommand(null, self, parsed); 2707 return self._postProcess(innerArgv, populateDoubleDash); 2708 } 2709 if (recommendCommands && firstUnknownCommand && !skipRecommendation) { 2710 validation$1.recommendCommands(firstUnknownCommand, handlerKeys); 2711 } 2712 } 2713 if (completionCommand && 2714 ~argv._.indexOf(completionCommand) && 2715 !requestCompletions) { 2716 if (exitProcess) 2717 setBlocking(true); 2718 self.showCompletionScript(); 2719 self.exit(0); 2720 } 2721 } 2722 else if (command$1.hasDefaultCommand() && !skipDefaultCommand) { 2723 const innerArgv = command$1.runCommand(null, self, parsed); 2724 return self._postProcess(innerArgv, populateDoubleDash); 2725 } 2726 if (requestCompletions) { 2727 if (exitProcess) 2728 setBlocking(true); 2729 args = [].concat(args); 2730 const completionArgs = args.slice(args.indexOf(`--${completion$1.completionKey}`) + 1); 2731 completion$1.getCompletion(completionArgs, completions => { 2732 (completions || []).forEach(completion => { 2733 _logger.log(completion); 2734 }); 2735 self.exit(0); 2736 }); 2737 return self._postProcess(argv, !populateDoubleDash, _calledFromCommand); 2738 } 2739 if (!hasOutput) { 2740 Object.keys(argv).forEach(key => { 2741 if (key === helpOpt && argv[key]) { 2742 if (exitProcess) 2743 setBlocking(true); 2744 skipValidation = true; 2745 self.showHelp('log'); 2746 self.exit(0); 2747 } 2748 else if (key === versionOpt && argv[key]) { 2749 if (exitProcess) 2750 setBlocking(true); 2751 skipValidation = true; 2752 usage$1.showVersion(); 2753 self.exit(0); 2754 } 2755 }); 2756 } 2757 if (!skipValidation && options.skipValidation.length > 0) { 2758 skipValidation = Object.keys(argv).some(key => options.skipValidation.indexOf(key) >= 0 && argv[key] === true); 2759 } 2760 if (!skipValidation) { 2761 if (parsed.error) 2762 throw new YError(parsed.error.message); 2763 if (!requestCompletions) { 2764 self._runValidation(argv, aliases, {}, parsed.error); 2765 } 2766 } 2767 } 2768 catch (err) { 2769 if (err instanceof YError) 2770 usage$1.fail(err.message, err); 2771 else 2772 throw err; 2773 } 2774 return self._postProcess(argv, populateDoubleDash, _calledFromCommand); 2775 }; 2776 self._postProcess = function (argv, populateDoubleDash, calledFromCommand = false) { 2777 if (isPromise(argv)) 2778 return argv; 2779 if (calledFromCommand) 2780 return argv; 2781 if (!populateDoubleDash) { 2782 argv = self._copyDoubleDash(argv); 2783 } 2784 const parsePositionalNumbers = self.getParserConfiguration()['parse-positional-numbers'] || 2785 self.getParserConfiguration()['parse-positional-numbers'] === undefined; 2786 if (parsePositionalNumbers) { 2787 argv = self._parsePositionalNumbers(argv); 2788 } 2789 return argv; 2790 }; 2791 self._copyDoubleDash = function (argv) { 2792 if (!argv._ || !argv['--']) 2793 return argv; 2794 argv._.push.apply(argv._, argv['--']); 2795 try { 2796 delete argv['--']; 2797 } 2798 catch (_err) { } 2799 return argv; 2800 }; 2801 self._parsePositionalNumbers = function (argv) { 2802 const args = argv['--'] ? argv['--'] : argv._; 2803 for (let i = 0, arg; (arg = args[i]) !== undefined; i++) { 2804 if (shim$1.Parser.looksLikeNumber(arg) && 2805 Number.isSafeInteger(Math.floor(parseFloat(`${arg}`)))) { 2806 args[i] = Number(arg); 2807 } 2808 } 2809 return argv; 2810 }; 2811 self._runValidation = function runValidation(argv, aliases, positionalMap, parseErrors, isDefaultCommand = false) { 2812 if (parseErrors) 2813 throw new YError(parseErrors.message); 2814 validation$1.nonOptionCount(argv); 2815 validation$1.requiredArguments(argv); 2816 let failedStrictCommands = false; 2817 if (strictCommands) { 2818 failedStrictCommands = validation$1.unknownCommands(argv); 2819 } 2820 if (strict && !failedStrictCommands) { 2821 validation$1.unknownArguments(argv, aliases, positionalMap, isDefaultCommand); 2822 } 2823 else if (strictOptions) { 2824 validation$1.unknownArguments(argv, aliases, {}, false, false); 2825 } 2826 validation$1.customChecks(argv, aliases); 2827 validation$1.limitedChoices(argv); 2828 validation$1.implications(argv); 2829 validation$1.conflicting(argv); 2830 }; 2831 function guessLocale() { 2832 if (!detectLocale) 2833 return; 2834 const locale = shim$1.getEnv('LC_ALL') || 2835 shim$1.getEnv('LC_MESSAGES') || 2836 shim$1.getEnv('LANG') || 2837 shim$1.getEnv('LANGUAGE') || 2838 'en_US'; 2839 self.locale(locale.replace(/[.:].*/, '')); 2840 } 2841 self.help(); 2842 self.version(); 2843 return self; 2844 } 2845 const rebase = (base, dir) => shim$1.path.relative(base, dir); 2846 function isYargsInstance(y) { 2847 return !!y && typeof y._parseArgs === 'function'; 2848 } 2849 2850 var _a, _b; 2851 const { readFileSync } = require('fs'); 2852 const { inspect } = require('util'); 2853 const { resolve } = require('path'); 2854 const y18n = require('y18n'); 2855 const Parser = require('yargs-parser'); 2856 var cjsPlatformShim = { 2857 assert: { 2858 notStrictEqual: assert.notStrictEqual, 2859 strictEqual: assert.strictEqual, 2860 }, 2861 cliui: require('cliui'), 2862 findUp: require('escalade/sync'), 2863 getEnv: (key) => { 2864 return process.env[key]; 2865 }, 2866 getCallerFile: require('get-caller-file'), 2867 getProcessArgvBin: getProcessArgvBin, 2868 inspect, 2869 mainFilename: (_b = (_a = require === null || require === void 0 ? void 0 : require.main) === null || _a === void 0 ? void 0 : _a.filename) !== null && _b !== void 0 ? _b : process.cwd(), 2870 Parser, 2871 path: require('path'), 2872 process: { 2873 argv: () => process.argv, 2874 cwd: process.cwd, 2875 execPath: () => process.execPath, 2876 exit: (code) => { 2877 process.exit(code); 2878 }, 2879 nextTick: process.nextTick, 2880 stdColumns: typeof process.stdout.columns !== 'undefined' 2881 ? process.stdout.columns 2882 : null, 2883 }, 2884 readFileSync, 2885 require: require, 2886 requireDirectory: require('require-directory'), 2887 stringWidth: require('string-width'), 2888 y18n: y18n({ 2889 directory: resolve(__dirname, '../locales'), 2890 updateFiles: false, 2891 }), 2892 }; 2893 2894 const minNodeVersion = process && process.env && process.env.YARGS_MIN_NODE_VERSION 2895 ? Number(process.env.YARGS_MIN_NODE_VERSION) 2896 : 10; 2897 if (process && process.version) { 2898 const major = Number(process.version.match(/v([^.]+)/)[1]); 2899 if (major < minNodeVersion) { 2900 throw Error(`yargs supports a minimum Node.js version of ${minNodeVersion}. Read our version support policy: https://github.com/yargs/yargs#supported-nodejs-versions`); 2901 } 2902 } 2903 const Parser$1 = require('yargs-parser'); 2904 const Yargs$1 = YargsWithShim(cjsPlatformShim); 2905 var cjs = { 2906 applyExtends, 2907 cjsPlatformShim, 2908 Yargs: Yargs$1, 2909 argsert, 2910 globalMiddlewareFactory, 2911 isPromise, 2912 objFilter, 2913 parseCommand, 2914 Parser: Parser$1, 2915 processArgv, 2916 rebase, 2917 YError, 2918 }; 2919 2920 module.exports = cjs;