react / wstein / node_modules / browserify / node_modules / module-deps / node_modules / detective / node_modules / escodegen / node_modules / optionator / lib / index.js
80621 views// Generated by LiveScript 1.3.11(function(){2var VERSION, ref$, id, map, compact, any, groupBy, partition, chars, isItNaN, keys, Obj, camelize, deepIs, closestString, nameToRaw, dasherize, generateHelp, generateHelpForOption, parsedTypeCheck, parseType, parseLevn, camelizeKeys, parseString, main, toString$ = {}.toString, slice$ = [].slice;3VERSION = '0.5.0';4ref$ = require('prelude-ls'), id = ref$.id, map = ref$.map, compact = ref$.compact, any = ref$.any, groupBy = ref$.groupBy, partition = ref$.partition, chars = ref$.chars, isItNaN = ref$.isItNaN, keys = ref$.keys, Obj = ref$.Obj, camelize = ref$.camelize;5deepIs = require('deep-is');6ref$ = require('./util'), closestString = ref$.closestString, nameToRaw = ref$.nameToRaw, dasherize = ref$.dasherize;7ref$ = require('./help'), generateHelp = ref$.generateHelp, generateHelpForOption = ref$.generateHelpForOption;8ref$ = require('type-check'), parsedTypeCheck = ref$.parsedTypeCheck, parseType = ref$.parseType;9parseLevn = require('levn').parsedTypeParse;10camelizeKeys = function(obj){11var key, value, resultObj$ = {};12for (key in obj) {13value = obj[key];14resultObj$[camelize(key)] = value;15}16return resultObj$;17};18parseString = function(string){19var assignOpt, regex, replaceRegex, result;20assignOpt = '--?[a-zA-Z][-a-z-A-Z0-9]*=';21regex = RegExp('(?:' + assignOpt + ')?(?:\'(?:\\\\\'|[^\'])+\'|"(?:\\\\"|[^"])+")|[^\'"\\s]+', 'g');22replaceRegex = RegExp('^(' + assignOpt + ')?[\'"]([\\s\\S]*)[\'"]$');23result = map(function(it){24return it.replace(replaceRegex, '$1$2');25}, string.match(regex) || []);26return result;27};28main = function(libOptions){29var opts, defaults, required, traverse, getOption, parse;30opts = {};31defaults = {};32required = [];33if (toString$.call(libOptions.stdout).slice(8, -1) === 'Undefined') {34libOptions.stdout = process.stdout;35}36traverse = function(options){37var i$, len$, option, name, e, parsedPossibilities, parsedType, j$, ref$, len1$, possibility, that, rawDependsType, dependsOpts, dependsType, alias, shortNames, longNames;38if (toString$.call(options).slice(8, -1) !== 'Array') {39throw new Error('No options defined.');40}41for (i$ = 0, len$ = options.length; i$ < len$; ++i$) {42option = options[i$];43if (option.heading == null) {44name = option.option;45if (opts[name] != null) {46throw new Error("Option '" + name + "' already defined.");47}48if (option.type === 'Boolean') {49option.boolean == null && (option.boolean = true);50}51if (option.parsedType == null) {52if (!option.type) {53throw new Error("No type defined for option '" + name + "'.");54}55try {56option.parsedType = parseType(option.type);57} catch (e$) {58e = e$;59throw new Error("Option '" + name + "': Error parsing type '" + option.type + "': " + e.message);60}61}62if (option['default']) {63try {64defaults[name] = parseLevn(option.parsedType, option['default']);65} catch (e$) {66e = e$;67throw new Error("Option '" + name + "': Error parsing default value '" + option['default'] + "' for type '" + option.type + "': " + e.message);68}69}70if (option['enum'] && !option.parsedPossiblities) {71parsedPossibilities = [];72parsedType = option.parsedType;73for (j$ = 0, len1$ = (ref$ = option['enum']).length; j$ < len1$; ++j$) {74possibility = ref$[j$];75try {76parsedPossibilities.push(parseLevn(parsedType, possibility));77} catch (e$) {78e = e$;79throw new Error("Option '" + name + "': Error parsing enum value '" + possibility + "' for type '" + option.type + "': " + e.message);80}81}82option.parsedPossibilities = parsedPossibilities;83}84if (that = option.dependsOn) {85if (that.length) {86ref$ = [].concat(option.dependsOn), rawDependsType = ref$[0], dependsOpts = slice$.call(ref$, 1);87dependsType = rawDependsType.toLowerCase();88if (dependsOpts.length) {89if (dependsType === 'and' || dependsType === 'or') {90option.dependsOn = [dependsType].concat(slice$.call(dependsOpts));91} else {92throw new Error("Option '" + name + "': If you have more than one dependency, you must specify either 'and' or 'or'");93}94} else {95if ((ref$ = dependsType.toLowerCase()) === 'and' || ref$ === 'or') {96option.dependsOn = null;97} else {98option.dependsOn = ['and', rawDependsType];99}100}101} else {102option.dependsOn = null;103}104}105if (option.required) {106required.push(name);107}108opts[name] = option;109if (option.alias || option.aliases) {110if (name === 'NUM') {111throw new Error("-NUM option can't have aliases.");112}113if (option.alias) {114option.aliases == null && (option.aliases = [].concat(option.alias));115}116for (j$ = 0, len1$ = (ref$ = option.aliases).length; j$ < len1$; ++j$) {117alias = ref$[j$];118if (opts[alias] != null) {119throw new Error("Option '" + alias + "' already defined.");120}121opts[alias] = option;122}123ref$ = partition(fn$, option.aliases), shortNames = ref$[0], longNames = ref$[1];124option.shortNames == null && (option.shortNames = shortNames);125option.longNames == null && (option.longNames = longNames);126}127if ((!option.aliases || option.shortNames.length === 0) && option.type === 'Boolean' && option['default'] === 'true') {128option.negateName = true;129}130}131}132function fn$(it){133return it.length === 1;134}135};136traverse(libOptions.options);137getOption = function(name){138var opt, possiblyMeant;139opt = opts[name];140if (opt == null) {141possiblyMeant = closestString(keys(opts), name);142throw new Error("Invalid option '" + nameToRaw(name) + "'" + (possiblyMeant ? " - perhaps you meant '" + nameToRaw(possiblyMeant) + "'?" : '.'));143}144return opt;145};146parse = function(input, arg$){147var slice, obj, positional, restPositional, overrideRequired, prop, setValue, setDefaults, checkRequired, mutuallyExclusiveError, checkMutuallyExclusive, checkDependency, checkDependencies, args, key, value, option, ref$, i$, len$, arg, that, result, short, argName, usingAssign, val, flags, len, j$, len1$, i, flag, opt, name, negated, noedName, valPrime;148slice = (arg$ != null149? arg$150: {}).slice;151obj = {};152positional = [];153restPositional = false;154overrideRequired = false;155prop = null;156setValue = function(name, value){157var opt, val, e, currentType;158opt = getOption(name);159if (opt.boolean) {160val = value;161} else {162try {163val = parseLevn(opt.parsedType, value);164} catch (e$) {165e = e$;166throw new Error("Invalid value for option '" + name + "' - expected type " + opt.type + ", received value: " + value + ".");167}168if (opt['enum'] && !any(function(it){169return deepIs(it, val);170}, opt.parsedPossibilities)) {171throw new Error("Option " + name + ": '" + val + "' not in [" + opt['enum'].join(', ') + "].");172}173}174currentType = toString$.call(obj[name]).slice(8, -1);175if (obj[name] != null) {176if (libOptions.concatRepeatedArrays && currentType === 'Array') {177obj[name] = obj[name].concat(val);178} else if (libOptions.mergeRepeatedObjects && currentType === 'Object') {179import$(obj[name], val);180} else {181obj[name] = val;182}183} else {184obj[name] = val;185}186if (opt.restPositional) {187restPositional = true;188}189if (opt.overrideRequired) {190overrideRequired = true;191}192};193setDefaults = function(){194var name, ref$, value;195for (name in ref$ = defaults) {196value = ref$[name];197if (obj[name] == null) {198obj[name] = value;199}200}201};202checkRequired = function(){203var i$, ref$, len$, name;204if (overrideRequired) {205return;206}207for (i$ = 0, len$ = (ref$ = required).length; i$ < len$; ++i$) {208name = ref$[i$];209if (!obj[name]) {210throw new Error("Option " + nameToRaw(name) + " is required.");211}212}213};214mutuallyExclusiveError = function(first, second){215throw new Error("The options " + nameToRaw(first) + " and " + nameToRaw(second) + " are mutually exclusive - you cannot use them at the same time.");216};217checkMutuallyExclusive = function(){218var rules, i$, len$, rule, present, j$, len1$, element, k$, len2$, opt;219rules = libOptions.mutuallyExclusive;220if (!rules) {221return;222}223for (i$ = 0, len$ = rules.length; i$ < len$; ++i$) {224rule = rules[i$];225present = null;226for (j$ = 0, len1$ = rule.length; j$ < len1$; ++j$) {227element = rule[j$];228if (toString$.call(element).slice(8, -1) === 'Array') {229for (k$ = 0, len2$ = element.length; k$ < len2$; ++k$) {230opt = element[k$];231if (opt in obj) {232if (present != null) {233mutuallyExclusiveError(present, opt);234} else {235present = opt;236break;237}238}239}240} else {241if (element in obj) {242if (present != null) {243mutuallyExclusiveError(present, element);244} else {245present = element;246}247}248}249}250}251};252checkDependency = function(option){253var dependsOn, type, targetOptionNames, i$, len$, targetOptionName, targetOption;254dependsOn = option.dependsOn;255if (!dependsOn || option.dependenciesMet) {256return true;257}258type = dependsOn[0], targetOptionNames = slice$.call(dependsOn, 1);259for (i$ = 0, len$ = targetOptionNames.length; i$ < len$; ++i$) {260targetOptionName = targetOptionNames[i$];261targetOption = obj[targetOptionName];262if (targetOption && checkDependency(targetOption)) {263if (type === 'or') {264return true;265}266} else if (type === 'and') {267throw new Error("The option '" + option.option + "' did not have its dependencies met.");268}269}270if (type === 'and') {271return true;272} else {273throw new Error("The option '" + option.option + "' did not meet any of its dependencies.");274}275};276checkDependencies = function(){277var name;278for (name in obj) {279checkDependency(opts[name]);280}281};282switch (toString$.call(input).slice(8, -1)) {283case 'String':284args = parseString(input.slice(slice != null ? slice : 0));285break;286case 'Array':287args = input.slice(slice != null ? slice : 2);288break;289case 'Object':290obj = {};291for (key in input) {292value = input[key];293if (key !== '_') {294option = getOption(dasherize(key));295if (parsedTypeCheck(option.parsedType, value)) {296obj[option.option] = value;297} else {298throw new Error("Option '" + option.option + "': Invalid type for '" + value + "' - expected type '" + option.type + "'.");299}300}301}302checkMutuallyExclusive();303checkDependencies();304setDefaults();305checkRequired();306return ref$ = camelizeKeys(obj), ref$._ = input._ || [], ref$;307default:308throw new Error("Invalid argument to 'parse': " + input + ".");309}310for (i$ = 0, len$ = args.length; i$ < len$; ++i$) {311arg = args[i$];312if (arg === '--') {313restPositional = true;314} else if (restPositional) {315positional.push(arg);316} else {317if (that = arg.match(/^(--?)([a-zA-Z][-a-zA-Z0-9]*)(=)?(.*)?$/)) {318result = that;319if (prop) {320throw new Error("Value for '" + prop + "' of type '" + getOption(prop).type + "' required.");321}322short = result[1].length === 1;323argName = result[2];324usingAssign = result[3] != null;325val = result[4];326if (usingAssign && val == null) {327throw new Error("No value for '" + argName + "' specified.");328}329if (short) {330flags = chars(argName);331len = flags.length;332for (j$ = 0, len1$ = flags.length; j$ < len1$; ++j$) {333i = j$;334flag = flags[j$];335opt = getOption(flag);336name = opt.option;337if (restPositional) {338positional.push(flag);339} else if (opt.boolean) {340setValue(name, true);341} else if (i === len - 1) {342if (usingAssign) {343setValue(name, val);344} else {345prop = name;346}347} else {348throw new Error("Can't set argument '" + flag + "' when not last flag in a group of short flags.");349}350}351} else {352negated = false;353if (that = argName.match(/^no-(.+)$/)) {354negated = true;355noedName = that[1];356opt = getOption(noedName);357} else {358opt = getOption(argName);359}360name = opt.option;361if (opt.boolean) {362valPrime = usingAssign ? parseLevn([{363type: 'Boolean'364}], val) : true;365if (negated) {366setValue(name, !valPrime);367} else {368setValue(name, valPrime);369}370} else {371if (negated) {372throw new Error("Only use 'no-' prefix for Boolean options, not with '" + noedName + "'.");373}374if (usingAssign) {375setValue(name, val);376} else {377prop = name;378}379}380}381} else if (that = arg.match(/^-([0-9]+(?:\.[0-9]+)?)$/)) {382opt = opts.NUM;383if (!opt) {384throw new Error('No -NUM option defined.');385}386setValue(opt.option, that[1]);387} else {388if (prop) {389setValue(prop, arg);390prop = null;391} else {392positional.push(arg);393}394}395}396}397checkMutuallyExclusive();398checkDependencies();399setDefaults();400checkRequired();401return ref$ = camelizeKeys(obj), ref$._ = positional, ref$;402};403return {404parse: parse,405generateHelp: generateHelp(libOptions),406generateHelpForOption: generateHelpForOption(getOption, libOptions)407};408};409main.VERSION = VERSION;410module.exports = main;411function import$(obj, src){412var own = {}.hasOwnProperty;413for (var key in src) if (own.call(src, key)) obj[key] = src[key];414return obj;415}416}).call(this);417418419