react / react-0.13.3 / examples / basic-commonjs / node_modules / browserify / node_modules / umd / node_modules / uglify-js / node_modules / yargs / index.js
80756 viewsvar assert = require('assert'),1path = require('path'),2Completion = require('./lib/completion'),3Parser = require('./lib/parser'),4Usage = require('./lib/usage'),5Validation = require('./lib/validation');67Argv(process.argv.slice(2));89var exports = module.exports = Argv;10function Argv (processArgs, cwd) {11processArgs = processArgs || []; // handle calling yargs().1213var self = {};14var completion = null;15var usage = null;16var validation = null;1718if (!cwd) cwd = process.cwd();1920self.$0 = process.argv21.slice(0,2)22.map(function (x) {23// ignore the node bin, specify this in your24// bin file with #!/usr/bin/env node25if (~x.indexOf('node')) return;26var b = rebase(cwd, x);27return x.match(/^\//) && b.length < x.length28? b : x29})30.join(' ').trim();31;3233if (process.env._ != undefined && process.argv[1] == process.env._) {34self.$0 = process.env._.replace(35path.dirname(process.execPath) + '/', ''36);37}3839var options;40self.resetOptions = self.reset = function () {41// put yargs back into its initial42// state, this is useful for creating a43// nested CLI.44options = {45array: [],46boolean: [],47string: [],48narg: {},49key: {},50alias: {},51default: {},52defaultDescription: {},53requiresArg: [],54count: [],55normalize: [],56config: []57};5859usage = Usage(self); // handle usage output.60validation = Validation(self, usage); // handle arg validation.61completion = Completion(self, usage);6263demanded = {};6465exitProcess = true;66strict = false;67helpOpt = null;68versionOpt = null;69completionOpt = null;7071return self;72};73self.resetOptions();7475self.boolean = function (bools) {76options.boolean.push.apply(options.boolean, [].concat(bools));77return self;78};7980self.array = function (arrays) {81options.array.push.apply(options.array, [].concat(arrays));82return self;83}8485self.nargs = function (key, n) {86if (typeof key === 'object') {87Object.keys(key).forEach(function(k) {88self.nargs(k, key[k]);89});90} else {91options.narg[key] = n;92}93return self;94}9596self.normalize = function (strings) {97options.normalize.push.apply(options.normalize, [].concat(strings));98return self;99};100101self.config = function (configs) {102options.config.push.apply(options.config, [].concat(configs));103return self;104};105106self.example = function (cmd, description) {107usage.example(cmd, description);108return self;109};110111self.command = function (cmd, description) {112usage.command(cmd, description);113return self;114};115116self.string = function (strings) {117options.string.push.apply(options.string, [].concat(strings));118return self;119};120121self.default = function (key, value, defaultDescription) {122if (typeof key === 'object') {123Object.keys(key).forEach(function (k) {124self.default(k, key[k]);125});126}127else {128options.defaultDescription[key] = defaultDescription;129options.default[key] = value;130}131return self;132};133134self.alias = function (x, y) {135if (typeof x === 'object') {136Object.keys(x).forEach(function (key) {137self.alias(key, x[key]);138});139}140else {141options.alias[x] = (options.alias[x] || []).concat(y);142}143return self;144};145146self.count = function(counts) {147options.count.push.apply(options.count, [].concat(counts));148return self;149};150151var demanded = {};152self.demand = self.required = self.require = function (keys, msg) {153if (typeof keys == 'number') {154if (!demanded._) demanded._ = { count: 0, msg: null };155demanded._.count += keys;156demanded._.msg = msg;157}158else if (Array.isArray(keys)) {159keys.forEach(function (key) {160self.demand(key, msg);161});162}163else {164if (typeof msg === 'string') {165demanded[keys] = { msg: msg };166}167else if (msg === true || typeof msg === 'undefined') {168demanded[keys] = { msg: null };169}170}171172return self;173};174self.getDemanded = function() {175return demanded;176};177178self.requiresArg = function (requiresArgs) {179options.requiresArg.push.apply(options.requiresArg, [].concat(requiresArgs));180return self;181};182183self.implies = function (key, value) {184validation.implies(key, value);185return self;186};187188self.usage = function (msg, opts) {189if (!opts && typeof msg === 'object') {190opts = msg;191msg = null;192}193194usage.usage(msg);195196if (opts) self.options(opts);197198return self;199};200201self.epilogue = self.epilog = function (msg) {202usage.epilog(msg);203return self;204};205206self.fail = function (f) {207usage.failFn(f);208return self;209};210211self.check = function (f) {212validation.check(f);213return self;214};215216self.defaults = self.default;217218self.describe = function (key, desc) {219usage.describe(key, desc);220return self;221};222223self.parse = function (args) {224return parseArgs(args);225};226227self.option = self.options = function (key, opt) {228if (typeof key === 'object') {229Object.keys(key).forEach(function (k) {230self.options(k, key[k]);231});232}233else {234assert(typeof opt === 'object', 'second argument to option must be an object');235236options.key[key] = true; // track manually set keys.237238if (opt.alias) self.alias(key, opt.alias);239240var demand = opt.demand || opt.required || opt.require;241242if (demand) {243self.demand(key, demand);244}245if ('default' in opt) {246self.default(key, opt.default);247}248if ('nargs' in opt) {249self.nargs(key, opt.nargs);250}251if (opt.boolean || opt.type === 'boolean') {252self.boolean(key);253if (opt.alias) self.boolean(opt.alias);254}255if (opt.array || opt.type === 'array') {256self.array(key);257if (opt.alias) self.array(opt.alias);258}259if (opt.string || opt.type === 'string') {260self.string(key);261if (opt.alias) self.string(opt.alias);262}263if (opt.count || opt.type === 'count') {264self.count(key);265}266267var desc = opt.describe || opt.description || opt.desc;268if (desc) {269self.describe(key, desc);270}271272if (opt.requiresArg) {273self.requiresArg(key);274}275}276277return self;278};279self.getOptions = function() {280return options;281};282283self.wrap = function (cols) {284usage.wrap(cols);285return self;286};287288var strict = false;289self.strict = function () {290strict = true;291return self;292};293self.getStrict = function () {294return strict;295}296297self.showHelp = function (fn) {298usage.showHelp(fn);299return self;300};301302var versionOpt = null;303self.version = function (ver, opt, msg) {304versionOpt = opt || 'version';305usage.version(ver);306self.describe(versionOpt, msg || 'Show version number');307return self;308};309310var helpOpt = null;311self.addHelpOpt = function (opt, msg) {312helpOpt = opt;313self.describe(opt, msg || 'Show help');314return self;315};316317self.showHelpOnFail = function (enabled, message) {318usage.showHelpOnFail(enabled, message);319return self;320};321322var exitProcess = true;323self.exitProcess = function (enabled) {324if (typeof enabled !== 'boolean') {325enabled = true;326}327exitProcess = enabled;328return self;329};330self.getExitProcess = function () {331return exitProcess;332}333334self.help = function () {335if (arguments.length > 0) return self.addHelpOpt.apply(self, arguments);336337if (!self.parsed) parseArgs(processArgs); // run parser, if it has not already been executed.338339return usage.help();340};341342var completionOpt = null,343completionCommand = null;344self.completion = function(cmd, desc, fn) {345// a function to execute when generating346// completions can be provided as the second347// or third argument to completion.348if (typeof desc === 'function') {349fn = desc;350desc = null;351}352353// register the completion command.354completionCommand = cmd;355completionOpt = completion.completionKey;356self.command(completionCommand, desc || 'generate bash completion script');357358// a function can be provided359if (fn) completion.registerFunction(fn);360361return self;362};363364self.showCompletionScript = function($0) {365$0 = $0 || self.$0;366console.log(completion.generateCompletionScript($0));367return self;368};369370self.getUsageInstance = function () {371return usage;372};373374self.getValidationInstance = function () {375return validation;376}377378Object.defineProperty(self, 'argv', {379get : function () {380var args = null;381382try {383args = parseArgs(processArgs);384} catch (err) {385usage.fail(err.message);386}387388return args;389},390enumerable : true391});392393function parseArgs (args) {394var parsed = Parser(args, options),395argv = parsed.argv,396aliases = parsed.aliases;397398argv.$0 = self.$0;399400self.parsed = parsed;401402// generate a completion script for adding to ~/.bashrc.403if (completionCommand && ~argv._.indexOf(completionCommand)) {404self.showCompletionScript();405if (exitProcess){406process.exit(0);407}408}409410Object.keys(argv).forEach(function(key) {411if (key === helpOpt) {412self.showHelp('log');413if (exitProcess){414process.exit(0);415}416}417else if (key === versionOpt) {418usage.showVersion();419if (exitProcess){420process.exit(0);421}422}423else if (key === completionOpt) {424// we allow for asynchronous completions,425// e.g., loading in a list of commands from an API.426completion.getCompletion(function(completions) {427(completions || []).forEach(function(completion) {428console.log(completion);429});430431if (exitProcess){432process.exit(0);433}434});435return;436}437});438439validation.nonOptionCount(argv);440validation.missingArgumentValue(argv);441validation.requiredArguments(argv);442443if (strict) {444validation.unknownArguments(argv, aliases);445}446447validation.customChecks(argv, aliases);448validation.implications(argv);449setPlaceholderKeys(argv);450451return argv;452}453454function setPlaceholderKeys (argv) {455Object.keys(options.key).forEach(function(key) {456if (typeof argv[key] === 'undefined') argv[key] = undefined;457});458}459460sigletonify(self);461return self;462};463464// rebase an absolute path to a relative one with respect to a base directory465// exported for tests466exports.rebase = rebase;467function rebase (base, dir) {468return path.relative(base, dir);469};470471/* Hack an instance of Argv with process.argv into Argv472so people can do473require('yargs')(['--beeble=1','-z','zizzle']).argv474to parse a list of args and475require('yargs').argv476to get a parsed version of process.argv.477*/478function sigletonify(inst) {479Object.keys(inst).forEach(function (key) {480if (key === 'argv') {481Argv.__defineGetter__(key, inst.__lookupGetter__(key));482} else {483Argv[key] = typeof inst[key] == 'function'484? inst[key].bind(inst)485: inst[key];486}487});488}489490491