Index: node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/node_modules/argparse/lib/action_container.js |
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/node_modules/argparse/lib/action_container.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/node_modules/argparse/lib/action_container.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dbe3e3c46abd7514b83b6098f72e5875c7fc09d5 |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/node_modules/argparse/lib/action_container.js |
@@ -0,0 +1,481 @@ |
+/** internal |
+ * class ActionContainer |
+ * |
+ * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]] |
+ **/ |
+ |
+'use strict'; |
+ |
+var format = require('util').format; |
+var _ = require('underscore'); |
+ |
+_.str = require('underscore.string'); |
+ |
+// Constants |
+var $$ = require('./const'); |
+ |
+//Actions |
+var ActionHelp = require('./action/help'); |
+var ActionAppend = require('./action/append'); |
+var ActionAppendConstant = require('./action/append/constant'); |
+var ActionCount = require('./action/count'); |
+var ActionStore = require('./action/store'); |
+var ActionStoreConstant = require('./action/store/constant'); |
+var ActionStoreTrue = require('./action/store/true'); |
+var ActionStoreFalse = require('./action/store/false'); |
+var ActionVersion = require('./action/version'); |
+var ActionSubparsers = require('./action/subparsers'); |
+ |
+// Errors |
+var argumentErrorHelper = require('./argument/error'); |
+ |
+ |
+ |
+/** |
+ * new ActionContainer(options) |
+ * |
+ * Action container. Parent for [[ArgumentParser]] and [[ArgumentGroup]] |
+ * |
+ * ##### Options: |
+ * |
+ * - `description` -- A description of what the program does |
+ * - `prefixChars` -- Characters that prefix optional arguments |
+ * - `argumentDefault` -- The default value for all arguments |
+ * - `conflictHandler` -- The conflict handler to use for duplicate arguments |
+ **/ |
+var ActionContainer = module.exports = function ActionContainer(options) { |
+ options = options || {}; |
+ |
+ this.description = options.description; |
+ this.argumentDefault = options.argumentDefault; |
+ this.prefixChars = options.prefixChars || ''; |
+ this.conflictHandler = options.conflictHandler; |
+ |
+ // set up registries |
+ this._registries = {}; |
+ |
+ // register actions |
+ this.register('action', null, ActionStore); |
+ this.register('action', 'store', ActionStore); |
+ this.register('action', 'storeConst', ActionStoreConstant); |
+ this.register('action', 'storeTrue', ActionStoreTrue); |
+ this.register('action', 'storeFalse', ActionStoreFalse); |
+ this.register('action', 'append', ActionAppend); |
+ this.register('action', 'appendConst', ActionAppendConstant); |
+ this.register('action', 'count', ActionCount); |
+ this.register('action', 'help', ActionHelp); |
+ this.register('action', 'version', ActionVersion); |
+ this.register('action', 'parsers', ActionSubparsers); |
+ |
+ // raise an exception if the conflict handler is invalid |
+ this._getHandler(); |
+ |
+ // action storage |
+ this._actions = []; |
+ this._optionStringActions = {}; |
+ |
+ // groups |
+ this._actionGroups = []; |
+ this._mutuallyExclusiveGroups = []; |
+ |
+ // defaults storage |
+ this._defaults = {}; |
+ |
+ // determines whether an "option" looks like a negative number |
+ // -1, -1.5 -5e+4 |
+ this._regexpNegativeNumber = new RegExp('^[-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$'); |
+ |
+ // whether or not there are any optionals that look like negative |
+ // numbers -- uses a list so it can be shared and edited |
+ this._hasNegativeNumberOptionals = []; |
+}; |
+ |
+// Groups must be required, then ActionContainer already defined |
+var ArgumentGroup = require('./argument/group'); |
+var MutuallyExclusiveGroup = require('./argument/exclusive'); |
+ |
+// |
+// Registration methods |
+// |
+ |
+/** |
+ * ActionContainer#register(registryName, value, object) -> Void |
+ * - registryName (String) : object type action|type |
+ * - value (string) : keyword |
+ * - object (Object|Function) : handler |
+ * |
+ * Register handlers |
+ **/ |
+ActionContainer.prototype.register = function (registryName, value, object) { |
+ this._registries[registryName] = this._registries[registryName] || {}; |
+ this._registries[registryName][value] = object; |
+}; |
+ |
+ActionContainer.prototype._registryGet = function (registryName, value, defaultValue) { |
+ if (3 > arguments.length) { |
+ defaultValue = null; |
+ } |
+ return this._registries[registryName][value] || defaultValue; |
+}; |
+ |
+// |
+// Namespace default accessor methods |
+// |
+ |
+/** |
+ * ActionContainer#setDefaults(options) -> Void |
+ * - options (object):hash of options see [[Action.new]] |
+ * |
+ * Set defaults |
+ **/ |
+ActionContainer.prototype.setDefaults = function (options) { |
+ options = options || {}; |
+ for (var property in options) { |
+ this._defaults[property] = options[property]; |
+ } |
+ |
+ // if these defaults match any existing arguments, replace the previous |
+ // default on the object with the new one |
+ this._actions.forEach(function (action) { |
+ if (action.dest in options) { |
+ action.defaultValue = options[action.dest]; |
+ } |
+ }); |
+}; |
+ |
+/** |
+ * ActionContainer#getDefault(dest) -> Mixed |
+ * - dest (string): action destination |
+ * |
+ * Return action default value |
+ **/ |
+ActionContainer.prototype.getDefault = function (dest) { |
+ var result = (_.has(this._defaults, dest)) ? this._defaults[dest] : null; |
+ |
+ this._actions.forEach(function (action) { |
+ if (action.dest === dest && _.has(action, 'defaultValue')) { |
+ result = action.defaultValue; |
+ } |
+ }); |
+ |
+ return result; |
+}; |
+// |
+// Adding argument actions |
+// |
+ |
+/** |
+ * ActionContainer#addArgument(args, options) -> Object |
+ * - args (Array): array of argument keys |
+ * - options (Object): action objects see [[Action.new]] |
+ * |
+ * #### Examples |
+ * - addArgument([-f, --foo], {action:'store', defaultValue=1, ...}) |
+ * - addArgument(['bar'], action: 'store', nargs:1, ...}) |
+ **/ |
+ActionContainer.prototype.addArgument = function (args, options) { |
+ args = args; |
+ options = options || {}; |
+ |
+ if (!_.isArray(args)) { |
+ throw new TypeError('addArgument first argument should be an array'); |
+ } |
+ if (!_.isObject(options) || _.isArray(options)) { |
+ throw new TypeError('addArgument second argument should be a hash'); |
+ } |
+ |
+ // if no positional args are supplied or only one is supplied and |
+ // it doesn't look like an option string, parse a positional argument |
+ if (!args || args.length === 1 && this.prefixChars.indexOf(args[0][0]) < 0) { |
+ if (args && !!options.dest) { |
+ throw new Error('dest supplied twice for positional argument'); |
+ } |
+ options = this._getPositional(args, options); |
+ |
+ // otherwise, we're adding an optional argument |
+ } else { |
+ options = this._getOptional(args, options); |
+ } |
+ |
+ // if no default was supplied, use the parser-level default |
+ if (_.isUndefined(options.defaultValue)) { |
+ var dest = options.dest; |
+ if (_.has(this._defaults, dest)) { |
+ options.defaultValue = this._defaults[dest]; |
+ } else if (!_.isUndefined(this.argumentDefault)) { |
+ options.defaultValue = this.argumentDefault; |
+ } |
+ } |
+ |
+ // create the action object, and add it to the parser |
+ var ActionClass = this._popActionClass(options); |
+ if (! _.isFunction(ActionClass)) { |
+ throw new Error(format('Unknown action "%s".', ActionClass)); |
+ } |
+ var action = new ActionClass(options); |
+ |
+ // throw an error if the action type is not callable |
+ var typeFunction = this._registryGet('type', action.type, action.type); |
+ if (!_.isFunction(typeFunction)) { |
+ throw new Error(format('"%s" is not callable', typeFunction)); |
+ } |
+ |
+ return this._addAction(action); |
+}; |
+ |
+/** |
+ * ActionContainer#addArgumentGroup(options) -> ArgumentGroup |
+ * - options (Object): hash of options see [[ArgumentGroup.new]] |
+ * |
+ * Create new arguments groups |
+ **/ |
+ActionContainer.prototype.addArgumentGroup = function (options) { |
+ var group = new ArgumentGroup(this, options); |
+ this._actionGroups.push(group); |
+ return group; |
+}; |
+ |
+/** |
+ * ActionContainer#addMutuallyExclusiveGroup(options) -> ArgumentGroup |
+ * - options (Object): {required: false} |
+ * |
+ * Create new mutual exclusive groups |
+ **/ |
+ActionContainer.prototype.addMutuallyExclusiveGroup = function (options) { |
+ var group = new MutuallyExclusiveGroup(this, options); |
+ this._mutuallyExclusiveGroups.push(group); |
+ return group; |
+}; |
+ |
+ActionContainer.prototype._addAction = function (action) { |
+ var self = this; |
+ |
+ // resolve any conflicts |
+ this._checkConflict(action); |
+ |
+ // add to actions list |
+ this._actions.push(action); |
+ action.container = this; |
+ |
+ // index the action by any option strings it has |
+ action.optionStrings.forEach(function (optionString) { |
+ self._optionStringActions[optionString] = action; |
+ }); |
+ |
+ // set the flag if any option strings look like negative numbers |
+ action.optionStrings.forEach(function (optionString) { |
+ if (optionString.match(self._regexpNegativeNumber)) { |
+ if (!_.any(self._hasNegativeNumberOptionals)) { |
+ self._hasNegativeNumberOptionals.push(true); |
+ } |
+ } |
+ }); |
+ |
+ // return the created action |
+ return action; |
+}; |
+ |
+ActionContainer.prototype._removeAction = function (action) { |
+ var actionIndex = this._actions.indexOf(action); |
+ if (actionIndex >= 0) { |
+ this._actions.splice(actionIndex, 1); |
+ } |
+}; |
+ |
+ActionContainer.prototype._addContainerActions = function (container) { |
+ // collect groups by titles |
+ var titleGroupMap = {}; |
+ this._actionGroups.forEach(function (group) { |
+ if (titleGroupMap[group.title]) { |
+ throw new Error(format('Cannot merge actions - two groups are named "%s".', group.title)); |
+ } |
+ titleGroupMap[group.title] = group; |
+ }); |
+ |
+ // map each action to its group |
+ var groupMap = {}; |
+ function actionHash(action) { |
+ // unique (hopefully?) string suitable as dictionary key |
+ return action.getName(); |
+ } |
+ container._actionGroups.forEach(function (group) { |
+ // if a group with the title exists, use that, otherwise |
+ // create a new group matching the container's group |
+ if (!titleGroupMap[group.title]) { |
+ titleGroupMap[group.title] = this.addArgumentGroup({ |
+ title: group.title, |
+ description: group.description |
+ }); |
+ } |
+ |
+ // map the actions to their new group |
+ group._groupActions.forEach(function (action) { |
+ groupMap[actionHash(action)] = titleGroupMap[group.title]; |
+ }); |
+ }, this); |
+ |
+ // add container's mutually exclusive groups |
+ // NOTE: if add_mutually_exclusive_group ever gains title= and |
+ // description= then this code will need to be expanded as above |
+ var mutexGroup; |
+ container._mutuallyExclusiveGroups.forEach(function (group) { |
+ mutexGroup = this.addMutuallyExclusiveGroup({ |
+ required: group.required |
+ }); |
+ // map the actions to their new mutex group |
+ group._groupActions.forEach(function (action) { |
+ groupMap[actionHash(action)] = mutexGroup; |
+ }); |
+ }, this); // forEach takes a 'this' argument |
+ |
+ // add all actions to this container or their group |
+ container._actions.forEach(function (action) { |
+ var key = actionHash(action); |
+ if (!!groupMap[key]) { |
+ groupMap[key]._addAction(action); |
+ } |
+ else |
+ { |
+ this._addAction(action); |
+ } |
+ }); |
+}; |
+ |
+ActionContainer.prototype._getPositional = function (dest, options) { |
+ if (_.isArray(dest)) { |
+ dest = _.first(dest); |
+ } |
+ // make sure required is not specified |
+ if (options.required) { |
+ throw new Error('"required" is an invalid argument for positionals.'); |
+ } |
+ |
+ // mark positional arguments as required if at least one is |
+ // always required |
+ if (options.nargs !== $$.OPTIONAL && options.nargs !== $$.ZERO_OR_MORE) { |
+ options.required = true; |
+ } |
+ if (options.nargs === $$.ZERO_OR_MORE && options.defaultValue === undefined) { |
+ options.required = true; |
+ } |
+ |
+ // return the keyword arguments with no option strings |
+ options.dest = dest; |
+ options.optionStrings = []; |
+ return options; |
+}; |
+ |
+ActionContainer.prototype._getOptional = function (args, options) { |
+ var prefixChars = this.prefixChars; |
+ var optionStrings = []; |
+ var optionStringsLong = []; |
+ |
+ // determine short and long option strings |
+ args.forEach(function (optionString) { |
+ // error on strings that don't start with an appropriate prefix |
+ if (prefixChars.indexOf(optionString[0]) < 0) { |
+ throw new Error(format('Invalid option string "%s": must start with a "%s".', |
+ optionString, |
+ prefixChars |
+ )); |
+ } |
+ |
+ // strings starting with two prefix characters are long options |
+ optionStrings.push(optionString); |
+ if (optionString.length > 1 && prefixChars.indexOf(optionString[1]) >= 0) { |
+ optionStringsLong.push(optionString); |
+ } |
+ }); |
+ |
+ // infer dest, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' |
+ var dest = options.dest || null; |
+ delete options.dest; |
+ |
+ if (!dest) { |
+ var optionStringDest = optionStringsLong.length ? optionStringsLong[0] :optionStrings[0]; |
+ dest = _.str.strip(optionStringDest, this.prefixChars); |
+ |
+ if (dest.length === 0) { |
+ throw new Error( |
+ format('dest= is required for options like "%s"', optionStrings.join(', ')) |
+ ); |
+ } |
+ dest = dest.replace(/-/g, '_'); |
+ } |
+ |
+ // return the updated keyword arguments |
+ options.dest = dest; |
+ options.optionStrings = optionStrings; |
+ |
+ return options; |
+}; |
+ |
+ActionContainer.prototype._popActionClass = function (options, defaultValue) { |
+ defaultValue = defaultValue || null; |
+ |
+ var action = (options.action || defaultValue); |
+ delete options.action; |
+ |
+ var actionClass = this._registryGet('action', action, action); |
+ return actionClass; |
+}; |
+ |
+ActionContainer.prototype._getHandler = function () { |
+ var handlerString = this.conflictHandler; |
+ var handlerFuncName = "_handleConflict" + _.str.capitalize(handlerString); |
+ var func = this[handlerFuncName]; |
+ if (typeof func === 'undefined') { |
+ var msg = "invalid conflict resolution value: " + handlerString; |
+ throw new Error(msg); |
+ } else { |
+ return func; |
+ } |
+}; |
+ |
+ActionContainer.prototype._checkConflict = function (action) { |
+ var optionStringActions = this._optionStringActions; |
+ var conflictOptionals = []; |
+ |
+ // find all options that conflict with this option |
+ // collect pairs, the string, and an existing action that it conflicts with |
+ action.optionStrings.forEach(function (optionString) { |
+ var conflOptional = optionStringActions[optionString]; |
+ if (typeof conflOptional !== 'undefined') { |
+ conflictOptionals.push([optionString, conflOptional]); |
+ } |
+ }); |
+ |
+ if (conflictOptionals.length > 0) { |
+ var conflictHandler = this._getHandler(); |
+ conflictHandler.call(this, action, conflictOptionals); |
+ } |
+}; |
+ |
+ActionContainer.prototype._handleConflictError = function (action, conflOptionals) { |
+ var conflicts = _.map(conflOptionals, function (pair) {return pair[0]; }); |
+ conflicts = conflicts.join(', '); |
+ throw argumentErrorHelper( |
+ action, |
+ format('Conflicting option string(s): %s', conflicts) |
+ ); |
+}; |
+ |
+ActionContainer.prototype._handleConflictResolve = function (action, conflOptionals) { |
+ // remove all conflicting options |
+ var self = this; |
+ conflOptionals.forEach(function (pair) { |
+ var optionString = pair[0]; |
+ var conflictingAction = pair[1]; |
+ // remove the conflicting option string |
+ var i = conflictingAction.optionStrings.indexOf(optionString); |
+ if (i >= 0) { |
+ conflictingAction.optionStrings.splice(i, 1); |
+ } |
+ delete self._optionStringActions[optionString]; |
+ // if the option now has no option string, remove it from the |
+ // container holding it |
+ if (conflictingAction.optionStrings.length === 0) { |
+ conflictingAction.container._removeAction(conflictingAction); |
+ } |
+ }); |
+}; |