From 26a09f08cf1ed43c640879f23fdad56c5c9282f7 Mon Sep 17 00:00:00 2001 From: HelenHuang <LinHuang@pollex.com.tw> Date: 星期四, 09 六月 2022 15:02:38 +0800 Subject: [PATCH] TODO#139884 Banner 1 文案調整 --- PAMapp/node_modules/yargs/build/lib/command.js | 276 +++++++++++++++++++++++++++++++------------------------ 1 files changed, 155 insertions(+), 121 deletions(-) diff --git a/PAMapp/node_modules/yargs/build/lib/command.js b/PAMapp/node_modules/yargs/build/lib/command.js index 9a55dae..d90c455 100644 --- a/PAMapp/node_modules/yargs/build/lib/command.js +++ b/PAMapp/node_modules/yargs/build/lib/command.js @@ -1,113 +1,131 @@ -import { assertNotStrictEqual, } from './typings/common-types.js'; -import { isPromise } from './utils/is-promise.js'; -import { applyMiddleware, commandMiddlewareFactory, } from './middleware.js'; -import { parseCommand } from './parse-command.js'; -import { isYargsInstance, } from './yargs-factory.js'; -import whichModule from './utils/which-module.js'; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isCommandBuilderCallback = exports.isCommandBuilderDefinition = exports.isCommandHandlerDefinition = exports.command = void 0; +const common_types_1 = require("./common-types"); +const is_promise_1 = require("./is-promise"); +const middleware_1 = require("./middleware"); +const parse_command_1 = require("./parse-command"); +const path = require("path"); +const util_1 = require("util"); +const yargs_1 = require("./yargs"); +const requireDirectory = require("require-directory"); +const whichModule = require("which-module"); +const Parser = require("yargs-parser"); const DEFAULT_MARKER = /(^\*)|(^\$0)/; -export function command(yargs, usage, validation, globalMiddleware = [], shim) { +// handles parsing positional arguments, +// and populating argv with said positional +// arguments. +function command(yargs, usage, validation, globalMiddleware = []) { const self = {}; let handlers = {}; let aliasMap = {}; let defaultCommand; self.addHandler = function addHandler(cmd, description, builder, handler, commandMiddleware, deprecated) { let aliases = []; - const middlewares = commandMiddlewareFactory(commandMiddleware); + const middlewares = middleware_1.commandMiddlewareFactory(commandMiddleware); handler = handler || (() => { }); if (Array.isArray(cmd)) { - if (isCommandAndAliases(cmd)) { - [cmd, ...aliases] = cmd; - } - else { - for (const command of cmd) { - self.addHandler(command); - } - } + aliases = cmd.slice(1); + cmd = cmd[0]; } else if (isCommandHandlerDefinition(cmd)) { - let command = Array.isArray(cmd.command) || typeof cmd.command === 'string' - ? cmd.command - : moduleName(cmd); + let command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd); if (cmd.aliases) command = [].concat(command).concat(cmd.aliases); self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler, cmd.middlewares, cmd.deprecated); return; } - else if (isCommandBuilderDefinition(builder)) { + // allow a module to be provided instead of separate builder and handler + if (isCommandBuilderDefinition(builder)) { self.addHandler([cmd].concat(aliases), description, builder.builder, builder.handler, builder.middlewares, builder.deprecated); return; } - if (typeof cmd === 'string') { - const parsedCommand = parseCommand(cmd); - aliases = aliases.map(alias => parseCommand(alias).cmd); - let isDefault = false; - const parsedAliases = [parsedCommand.cmd].concat(aliases).filter(c => { - if (DEFAULT_MARKER.test(c)) { - isDefault = true; - return false; - } - return true; - }); - if (parsedAliases.length === 0 && isDefault) - parsedAliases.push('$0'); - if (isDefault) { - parsedCommand.cmd = parsedAliases[0]; - aliases = parsedAliases.slice(1); - cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd); + // parse positionals out of cmd string + const parsedCommand = parse_command_1.parseCommand(cmd); + // remove positional args from aliases only + aliases = aliases.map(alias => parse_command_1.parseCommand(alias).cmd); + // check for default and filter out '*'' + let isDefault = false; + const parsedAliases = [parsedCommand.cmd].concat(aliases).filter((c) => { + if (DEFAULT_MARKER.test(c)) { + isDefault = true; + return false; } - aliases.forEach(alias => { - aliasMap[alias] = parsedCommand.cmd; - }); - if (description !== false) { - usage.command(cmd, description, isDefault, aliases, deprecated); - } - handlers[parsedCommand.cmd] = { - original: cmd, - description, - handler, - builder: builder || {}, - middlewares, - deprecated, - demanded: parsedCommand.demanded, - optional: parsedCommand.optional, - }; - if (isDefault) - defaultCommand = handlers[parsedCommand.cmd]; + return true; + }); + // standardize on $0 for default command. + if (parsedAliases.length === 0 && isDefault) + parsedAliases.push('$0'); + // shift cmd and aliases after filtering out '*' + if (isDefault) { + parsedCommand.cmd = parsedAliases[0]; + aliases = parsedAliases.slice(1); + cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd); } + // populate aliasMap + aliases.forEach((alias) => { + aliasMap[alias] = parsedCommand.cmd; + }); + if (description !== false) { + usage.command(cmd, description, isDefault, aliases, deprecated); + } + handlers[parsedCommand.cmd] = { + original: cmd, + description, + handler, + builder: builder || {}, + middlewares, + deprecated, + demanded: parsedCommand.demanded, + optional: parsedCommand.optional + }; + if (isDefault) + defaultCommand = handlers[parsedCommand.cmd]; }; self.addDirectory = function addDirectory(dir, context, req, callerFile, opts) { opts = opts || {}; + // disable recursion to support nested directories of subcommands if (typeof opts.recurse !== 'boolean') opts.recurse = false; + // exclude 'json', 'coffee' from require-directory defaults if (!Array.isArray(opts.extensions)) opts.extensions = ['js']; + // allow consumer to define their own visitor function const parentVisit = typeof opts.visit === 'function' ? opts.visit : (o) => o; + // call addHandler via visitor function opts.visit = function visit(obj, joined, filename) { const visited = parentVisit(obj, joined, filename); + // allow consumer to skip modules with their own visitor if (visited) { + // check for cyclic reference + // each command file path should only be seen once per execution if (~context.files.indexOf(joined)) return visited; + // keep track of visited files in context.files context.files.push(joined); self.addHandler(visited); } return visited; }; - shim.requireDirectory({ require: req, filename: callerFile }, dir, opts); + requireDirectory({ require: req, filename: callerFile }, dir, opts); }; + // lookup module object from require()d command and derive name + // if module was not require()d and no name given, throw error function moduleName(obj) { const mod = whichModule(obj); if (!mod) - throw new Error(`No command name given for module: ${shim.inspect(obj)}`); + throw new Error(`No command name given for module: ${util_1.inspect(obj)}`); return commandFromFilename(mod.filename); } + // derive command name from filename function commandFromFilename(filename) { - return shim.path.basename(filename, shim.path.extname(filename)); + return path.basename(filename, path.extname(filename)); } - function extractDesc({ describe, description, desc, }) { + function extractDesc({ describe, description, desc }) { for (const test of [describe, description, desc]) { if (typeof test === 'string' || test === false) return test; - assertNotStrictEqual(test, true, shim); + common_types_1.assertNotStrictEqual(test, true); } return false; } @@ -120,6 +138,7 @@ const currentContext = yargs.getContext(); let numFiles = currentContext.files.length; const parentCommands = currentContext.commands.slice(); + // what does yargs look like after the builder is run? let innerArgv = parsed.argv; let positionalMap = {}; if (command) { @@ -128,24 +147,24 @@ } const builder = commandHandler.builder; if (isCommandBuilderCallback(builder)) { + // a function can be provided, which builds + // up a yargs chain and possibly returns it. const builderOutput = builder(yargs.reset(parsed.aliases)); - const innerYargs = isYargsInstance(builderOutput) ? builderOutput : yargs; + const innerYargs = yargs_1.isYargsInstance(builderOutput) ? builderOutput : yargs; if (shouldUpdateUsage(innerYargs)) { - innerYargs - .getUsageInstance() - .usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description); + innerYargs.getUsageInstance().usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description); } innerArgv = innerYargs._parseArgs(null, null, true, commandIndex); aliases = innerYargs.parsed.aliases; } else if (isCommandBuilderOptionDefinitions(builder)) { + // as a short hand, an object can instead be provided, specifying + // the options that a command takes. const innerYargs = yargs.reset(parsed.aliases); if (shouldUpdateUsage(innerYargs)) { - innerYargs - .getUsageInstance() - .usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description); + innerYargs.getUsageInstance().usage(usageFromParentCommandsCommandHandler(parentCommands, commandHandler), commandHandler.description); } - Object.keys(commandHandler.builder).forEach(key => { + Object.keys(commandHandler.builder).forEach((key) => { innerYargs.option(key, builder[key]); }); innerArgv = innerYargs._parseArgs(null, null, true, commandIndex); @@ -154,27 +173,30 @@ if (!yargs._hasOutput()) { positionalMap = populatePositionals(commandHandler, innerArgv, currentContext); } - const middlewares = globalMiddleware - .slice(0) - .concat(commandHandler.middlewares); - applyMiddleware(innerArgv, yargs, middlewares, true); + const middlewares = globalMiddleware.slice(0).concat(commandHandler.middlewares); + middleware_1.applyMiddleware(innerArgv, yargs, middlewares, true); + // we apply validation post-hoc, so that custom + // checks get passed populated positional arguments. if (!yargs._hasOutput()) { yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error, !command); } if (commandHandler.handler && !yargs._hasOutput()) { yargs._setHasOutput(); + // to simplify the parsing of positionals in commands, + // we temporarily populate '--' rather than _, with arguments const populateDoubleDash = !!yargs.getOptions().configuration['populate--']; - yargs._postProcess(innerArgv, populateDoubleDash); - innerArgv = applyMiddleware(innerArgv, yargs, middlewares, false); + if (!populateDoubleDash) + yargs._copyDoubleDash(innerArgv); + innerArgv = middleware_1.applyMiddleware(innerArgv, yargs, middlewares, false); let handlerResult; - if (isPromise(innerArgv)) { + if (is_promise_1.isPromise(innerArgv)) { handlerResult = innerArgv.then(argv => commandHandler.handler(argv)); } else { handlerResult = commandHandler.handler(innerArgv); } const handlerFinishCommand = yargs.getHandlerFinishCommand(); - if (isPromise(handlerResult)) { + if (is_promise_1.isPromise(handlerResult)) { yargs.getUsageInstance().cacheHelpMessage(); handlerResult .then(value => { @@ -187,6 +209,7 @@ yargs.getUsageInstance().fail(null, error); } catch (err) { + // fail's throwing would cause an unhandled rejection. } }) .then(() => { @@ -209,39 +232,37 @@ return innerArgv; }; function shouldUpdateUsage(yargs) { - return (!yargs.getUsageInstance().getUsageDisabled() && - yargs.getUsageInstance().getUsage().length === 0); + return !yargs.getUsageInstance().getUsageDisabled() && + yargs.getUsageInstance().getUsage().length === 0; } function usageFromParentCommandsCommandHandler(parentCommands, commandHandler) { - const c = DEFAULT_MARKER.test(commandHandler.original) - ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() - : commandHandler.original; - const pc = parentCommands.filter(c => { - return !DEFAULT_MARKER.test(c); - }); + const c = DEFAULT_MARKER.test(commandHandler.original) ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() : commandHandler.original; + const pc = parentCommands.filter((c) => { return !DEFAULT_MARKER.test(c); }); pc.push(c); return `$0 ${pc.join(' ')}`; } self.runDefaultBuilderOn = function (yargs) { - assertNotStrictEqual(defaultCommand, undefined, shim); + common_types_1.assertNotStrictEqual(defaultCommand, undefined); if (shouldUpdateUsage(yargs)) { + // build the root-level command string from the default string. const commandString = DEFAULT_MARKER.test(defaultCommand.original) - ? defaultCommand.original - : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 '); + ? defaultCommand.original : defaultCommand.original.replace(/^[^[\]<>]*/, '$0 '); yargs.getUsageInstance().usage(commandString, defaultCommand.description); } const builder = defaultCommand.builder; if (isCommandBuilderCallback(builder)) { builder(yargs); } - else if (!isCommandBuilderDefinition(builder)) { - Object.keys(builder).forEach(key => { + else { + Object.keys(builder).forEach((key) => { yargs.option(key, builder[key]); }); } }; + // transcribe all positional arguments "command <foo> <bar> [apple]" + // onto argv. function populatePositionals(commandHandler, argv, context) { - argv._ = argv._.slice(context.commands.length); + argv._ = argv._.slice(context.commands.length); // nuke the current commands const demanded = commandHandler.demanded.slice(0); const optional = commandHandler.optional.slice(0); const positionalMap = {}; @@ -254,7 +275,7 @@ const maybe = optional.shift(); populatePositional(maybe, argv, positionalMap); } - argv._ = context.commands.concat(argv._.map(a => '' + a)); + argv._ = context.commands.concat(argv._); postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original)); return positionalMap; } @@ -268,41 +289,50 @@ positionalMap[cmd] = [String(argv._.shift())]; } } + // we run yargs-parser against the positional arguments + // applying the same parsing logic used for flags. function postProcessPositionals(argv, positionalMap, parseOptions) { + // combine the parsing hints we've inferred from the command + // string with explicitly configured parsing hints. const options = Object.assign({}, yargs.getOptions()); options.default = Object.assign(parseOptions.default, options.default); for (const key of Object.keys(parseOptions.alias)) { options.alias[key] = (options.alias[key] || []).concat(parseOptions.alias[key]); } options.array = options.array.concat(parseOptions.array); - options.config = {}; + delete options.config; // don't load config when processing positionals. const unparsed = []; - Object.keys(positionalMap).forEach(key => { - positionalMap[key].map(value => { + Object.keys(positionalMap).forEach((key) => { + positionalMap[key].map((value) => { if (options.configuration['unknown-options-as-args']) options.key[key] = true; unparsed.push(`--${key}`); unparsed.push(value); }); }); + // short-circuit parse. if (!unparsed.length) return; const config = Object.assign({}, options.configuration, { - 'populate--': true, + 'populate--': true }); - const parsed = shim.Parser.detailed(unparsed, Object.assign({}, options, { - configuration: config, + const parsed = Parser.detailed(unparsed, Object.assign({}, options, { + configuration: config })); if (parsed.error) { yargs.getUsageInstance().fail(parsed.error.message, parsed.error); } else { + // only copy over positional keys (don't overwrite + // flag arguments that were already parsed). const positionalKeys = Object.keys(positionalMap); - Object.keys(positionalMap).forEach(key => { + Object.keys(positionalMap).forEach((key) => { positionalKeys.push(...parsed.aliases[key]); }); - Object.keys(parsed.argv).forEach(key => { + Object.keys(parsed.argv).forEach((key) => { if (positionalKeys.indexOf(key) !== -1) { + // any new aliases need to be placed in positionalMap, which + // is used for validation. if (!positionalMap[key]) positionalMap[key] = parsed.argv[key]; argv[key] = parsed.argv[key]; @@ -315,10 +345,10 @@ array: [], default: {}, alias: {}, - demand: {}, + demand: {} }; - const parsed = parseCommand(cmdString); - parsed.demanded.forEach(d => { + const parsed = parse_command_1.parseCommand(cmdString); + parsed.demanded.forEach((d) => { const [cmd, ...aliases] = d.cmd; if (d.variadic) { parseOptions.array.push(cmd); @@ -327,7 +357,7 @@ parseOptions.alias[cmd] = aliases; parseOptions.demand[cmd] = true; }); - parsed.optional.forEach(o => { + parsed.optional.forEach((o) => { const [cmd, ...aliases] = o.cmd; if (o.variadic) { parseOptions.array.push(cmd); @@ -343,40 +373,44 @@ defaultCommand = undefined; return self; }; + // used by yargs.parse() to freeze + // the state of commands such that + // we can apply .parse() multiple times + // with the same yargs instance. const frozens = []; self.freeze = () => { frozens.push({ handlers, aliasMap, - defaultCommand, + defaultCommand }); }; self.unfreeze = () => { const frozen = frozens.pop(); - assertNotStrictEqual(frozen, undefined, shim); - ({ handlers, aliasMap, defaultCommand } = frozen); + common_types_1.assertNotStrictEqual(frozen, undefined); + ({ + handlers, + aliasMap, + defaultCommand + } = frozen); }; return self; } -export function isCommandBuilderDefinition(builder) { - return (typeof builder === 'object' && +exports.command = command; +function isCommandHandlerDefinition(cmd) { + return typeof cmd === 'object'; +} +exports.isCommandHandlerDefinition = isCommandHandlerDefinition; +function isCommandBuilderDefinition(builder) { + return typeof builder === 'object' && !!builder.builder && - typeof builder.handler === 'function'); + typeof builder.handler === 'function'; } -function isCommandAndAliases(cmd) { - if (cmd.every(c => typeof c === 'string')) { - return true; - } - else { - return false; - } -} -export function isCommandBuilderCallback(builder) { +exports.isCommandBuilderDefinition = isCommandBuilderDefinition; +function isCommandBuilderCallback(builder) { return typeof builder === 'function'; } +exports.isCommandBuilderCallback = isCommandBuilderCallback; function isCommandBuilderOptionDefinitions(builder) { return typeof builder === 'object'; -} -export function isCommandHandlerDefinition(cmd) { - return typeof cmd === 'object' && !Array.isArray(cmd); } -- Gitblit v1.8.0