react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / handlebars / node_modules / uglify-js / node_modules / optimist / index.js
80728 viewsvar path = require('path');1var wordwrap = require('wordwrap');23/* Hack an instance of Argv with process.argv into Argv4so people can do5require('optimist')(['--beeble=1','-z','zizzle']).argv6to parse a list of args and7require('optimist').argv8to get a parsed version of process.argv.9*/1011var inst = Argv(process.argv.slice(2));12Object.keys(inst).forEach(function (key) {13Argv[key] = typeof inst[key] == 'function'14? inst[key].bind(inst)15: inst[key];16});1718var exports = module.exports = Argv;19function Argv (args, cwd) {20var self = {};21if (!cwd) cwd = process.cwd();2223self.$0 = process.argv24.slice(0,2)25.map(function (x) {26var b = rebase(cwd, x);27return x.match(/^\//) && b.length < x.length28? b : x29})30.join(' ')31;3233if (process.env._ != undefined && process.argv[1] == process.env._) {34self.$0 = process.env._.replace(35path.dirname(process.execPath) + '/', ''36);37}3839var flags = { bools : {}, strings : {} };4041self.boolean = function (bools) {42if (!Array.isArray(bools)) {43bools = [].slice.call(arguments);44}4546bools.forEach(function (name) {47flags.bools[name] = true;48});4950return self;51};5253self.string = function (strings) {54if (!Array.isArray(strings)) {55strings = [].slice.call(arguments);56}5758strings.forEach(function (name) {59flags.strings[name] = true;60});6162return self;63};6465var aliases = {};66self.alias = function (x, y) {67if (typeof x === 'object') {68Object.keys(x).forEach(function (key) {69self.alias(key, x[key]);70});71}72else if (Array.isArray(y)) {73y.forEach(function (yy) {74self.alias(x, yy);75});76}77else {78var zs = (aliases[x] || []).concat(aliases[y] || []).concat(x, y);79aliases[x] = zs.filter(function (z) { return z != x });80aliases[y] = zs.filter(function (z) { return z != y });81}8283return self;84};8586var demanded = {};87self.demand = function (keys) {88if (typeof keys == 'number') {89if (!demanded._) demanded._ = 0;90demanded._ += keys;91}92else if (Array.isArray(keys)) {93keys.forEach(function (key) {94self.demand(key);95});96}97else {98demanded[keys] = true;99}100101return self;102};103104var usage;105self.usage = function (msg, opts) {106if (!opts && typeof msg === 'object') {107opts = msg;108msg = null;109}110111usage = msg;112113if (opts) self.options(opts);114115return self;116};117118function fail (msg) {119self.showHelp();120if (msg) console.error(msg);121process.exit(1);122}123124var checks = [];125self.check = function (f) {126checks.push(f);127return self;128};129130var defaults = {};131self.default = function (key, value) {132if (typeof key === 'object') {133Object.keys(key).forEach(function (k) {134self.default(k, key[k]);135});136}137else {138defaults[key] = value;139}140141return self;142};143144var descriptions = {};145self.describe = function (key, desc) {146if (typeof key === 'object') {147Object.keys(key).forEach(function (k) {148self.describe(k, key[k]);149});150}151else {152descriptions[key] = desc;153}154return self;155};156157self.parse = function (args) {158return Argv(args).argv;159};160161self.option = self.options = function (key, opt) {162if (typeof key === 'object') {163Object.keys(key).forEach(function (k) {164self.options(k, key[k]);165});166}167else {168if (opt.alias) self.alias(key, opt.alias);169if (opt.demand) self.demand(key);170if (typeof opt.default !== 'undefined') {171self.default(key, opt.default);172}173174if (opt.boolean || opt.type === 'boolean') {175self.boolean(key);176}177if (opt.string || opt.type === 'string') {178self.string(key);179}180181var desc = opt.describe || opt.description || opt.desc;182if (desc) {183self.describe(key, desc);184}185}186187return self;188};189190var wrap = null;191self.wrap = function (cols) {192wrap = cols;193return self;194};195196self.showHelp = function (fn) {197if (!fn) fn = console.error;198fn(self.help());199};200201self.help = function () {202var keys = Object.keys(203Object.keys(descriptions)204.concat(Object.keys(demanded))205.concat(Object.keys(defaults))206.reduce(function (acc, key) {207if (key !== '_') acc[key] = true;208return acc;209}, {})210);211212var help = keys.length ? [ 'Options:' ] : [];213214if (usage) {215help.unshift(usage.replace(/\$0/g, self.$0), '');216}217218var switches = keys.reduce(function (acc, key) {219acc[key] = [ key ].concat(aliases[key] || [])220.map(function (sw) {221return (sw.length > 1 ? '--' : '-') + sw222})223.join(', ')224;225return acc;226}, {});227228var switchlen = longest(Object.keys(switches).map(function (s) {229return switches[s] || '';230}));231232var desclen = longest(Object.keys(descriptions).map(function (d) {233return descriptions[d] || '';234}));235236keys.forEach(function (key) {237var kswitch = switches[key];238var desc = descriptions[key] || '';239240if (wrap) {241desc = wordwrap(switchlen + 4, wrap)(desc)242.slice(switchlen + 4)243;244}245246var spadding = new Array(247Math.max(switchlen - kswitch.length + 3, 0)248).join(' ');249250var dpadding = new Array(251Math.max(desclen - desc.length + 1, 0)252).join(' ');253254var type = null;255256if (flags.bools[key]) type = '[boolean]';257if (flags.strings[key]) type = '[string]';258259if (!wrap && dpadding.length > 0) {260desc += dpadding;261}262263var prelude = ' ' + kswitch + spadding;264var extra = [265type,266demanded[key]267? '[required]'268: null269,270defaults[key] !== undefined271? '[default: ' + JSON.stringify(defaults[key]) + ']'272: null273,274].filter(Boolean).join(' ');275276var body = [ desc, extra ].filter(Boolean).join(' ');277278if (wrap) {279var dlines = desc.split('\n');280var dlen = dlines.slice(-1)[0].length281+ (dlines.length === 1 ? prelude.length : 0)282283body = desc + (dlen + extra.length > wrap - 2284? '\n'285+ new Array(wrap - extra.length + 1).join(' ')286+ extra287: new Array(wrap - extra.length - dlen + 1).join(' ')288+ extra289);290}291292help.push(prelude + body);293});294295help.push('');296return help.join('\n');297};298299Object.defineProperty(self, 'argv', {300get : parseArgs,301enumerable : true,302});303304function parseArgs () {305var argv = { _ : [], $0 : self.$0 };306Object.keys(flags.bools).forEach(function (key) {307setArg(key, defaults[key] || false);308});309310function setArg (key, val) {311var num = Number(val);312var value = typeof val !== 'string' || isNaN(num) ? val : num;313if (flags.strings[key]) value = val;314315setKey(argv, key.split('.'), value);316317(aliases[key] || []).forEach(function (x) {318argv[x] = argv[key];319});320}321322for (var i = 0; i < args.length; i++) {323var arg = args[i];324325if (arg === '--') {326argv._.push.apply(argv._, args.slice(i + 1));327break;328}329else if (arg.match(/^--.+=/)) {330// Using [\s\S] instead of . because js doesn't support the331// 'dotall' regex modifier. See:332// http://stackoverflow.com/a/1068308/13216333var m = arg.match(/^--([^=]+)=([\s\S]*)$/);334setArg(m[1], m[2]);335}336else if (arg.match(/^--no-.+/)) {337var key = arg.match(/^--no-(.+)/)[1];338setArg(key, false);339}340else if (arg.match(/^--.+/)) {341var key = arg.match(/^--(.+)/)[1];342var next = args[i + 1];343if (next !== undefined && !next.match(/^-/)344&& !flags.bools[key]345&& (aliases[key] ? !flags.bools[aliases[key]] : true)) {346setArg(key, next);347i++;348}349else if (/^(true|false)$/.test(next)) {350setArg(key, next === 'true');351i++;352}353else {354setArg(key, true);355}356}357else if (arg.match(/^-[^-]+/)) {358var letters = arg.slice(1,-1).split('');359360var broken = false;361for (var j = 0; j < letters.length; j++) {362if (letters[j+1] && letters[j+1].match(/\W/)) {363setArg(letters[j], arg.slice(j+2));364broken = true;365break;366}367else {368setArg(letters[j], true);369}370}371372if (!broken) {373var key = arg.slice(-1)[0];374375if (args[i+1] && !args[i+1].match(/^-/)376&& !flags.bools[key]377&& (aliases[key] ? !flags.bools[aliases[key]] : true)) {378setArg(key, args[i+1]);379i++;380}381else if (args[i+1] && /true|false/.test(args[i+1])) {382setArg(key, args[i+1] === 'true');383i++;384}385else {386setArg(key, true);387}388}389}390else {391var n = Number(arg);392argv._.push(flags.strings['_'] || isNaN(n) ? arg : n);393}394}395396Object.keys(defaults).forEach(function (key) {397if (!(key in argv)) {398argv[key] = defaults[key];399if (key in aliases) {400argv[aliases[key]] = defaults[key];401}402}403});404405if (demanded._ && argv._.length < demanded._) {406fail('Not enough non-option arguments: got '407+ argv._.length + ', need at least ' + demanded._408);409}410411var missing = [];412Object.keys(demanded).forEach(function (key) {413if (!argv[key]) missing.push(key);414});415416if (missing.length) {417fail('Missing required arguments: ' + missing.join(', '));418}419420checks.forEach(function (f) {421try {422if (f(argv) === false) {423fail('Argument check failed: ' + f.toString());424}425}426catch (err) {427fail(err)428}429});430431return argv;432}433434function longest (xs) {435return Math.max.apply(436null,437xs.map(function (x) { return x.length })438);439}440441return self;442};443444// rebase an absolute path to a relative one with respect to a base directory445// exported for tests446exports.rebase = rebase;447function rebase (base, dir) {448var ds = path.normalize(dir).split('/').slice(1);449var bs = path.normalize(base).split('/').slice(1);450451for (var i = 0; ds[i] && ds[i] == bs[i]; i++);452ds.splice(0, i); bs.splice(0, i);453454var p = path.normalize(455bs.map(function () { return '..' }).concat(ds).join('/')456).replace(/\/$/,'').replace(/^$/, '.');457return p.match(/^[.\/]/) ? p : './' + p;458};459460function setKey (obj, keys, value) {461var o = obj;462keys.slice(0,-1).forEach(function (key) {463if (o[key] === undefined) o[key] = {};464o = o[key];465});466467var key = keys[keys.length - 1];468if (o[key] === undefined || typeof o[key] === 'boolean') {469o[key] = value;470}471else if (Array.isArray(o[key])) {472o[key].push(value);473}474else {475o[key] = [ o[key], value ];476}477}478479480