react / react-0.13.3 / examples / basic-commonjs / node_modules / browserify / node_modules / umd / node_modules / uglify-js / node_modules / yargs / lib / validation.js
80759 views// validation-type-stuff, missing params,1// bad implications, custom checks.2module.exports = function (yargs, usage) {3var self = {};45// validate appropriate # of non-option6// arguments were provided, i.e., '_'.7self.nonOptionCount = function(argv) {8var demanded = yargs.getDemanded();910if (demanded._ && argv._.length < demanded._.count) {11if (demanded._.msg !== undefined) {12usage.fail(demanded._.msg);13} else {14usage.fail('Not enough non-option arguments: got '15+ argv._.length + ', need at least ' + demanded._.count16);17}18}19};2021// make sure that any args that require an22// value (--foo=bar), have a value.23self.missingArgumentValue = function(argv) {24var options = yargs.getOptions();2526if (options.requiresArg.length > 0) {27var missingRequiredArgs = [];2829options.requiresArg.forEach(function(key) {30var value = argv[key];3132// parser sets --foo value to true / --no-foo to false33if (value === true || value === false) {34missingRequiredArgs.push(key);35}36});3738if (missingRequiredArgs.length == 1) {39usage.fail("Missing argument value: " + missingRequiredArgs[0]);40}41else if (missingRequiredArgs.length > 1) {42var message = "Missing argument values: " + missingRequiredArgs.join(", ");43usage.fail(message);44}45}46};4748// make sure all the required arguments are present.49self.requiredArguments = function(argv) {50var demanded = yargs.getDemanded(),51missing = null;5253Object.keys(demanded).forEach(function (key) {54if (!argv.hasOwnProperty(key)) {55missing = missing || {};56missing[key] = demanded[key];57}58});5960if (missing) {61var customMsgs = [];62Object.keys(missing).forEach(function(key) {63var msg = missing[key].msg;64if (msg && customMsgs.indexOf(msg) < 0) {65customMsgs.push(msg);66}67});68var customMsg = customMsgs.length ? '\n' + customMsgs.join('\n') : '';6970usage.fail('Missing required arguments: ' + Object.keys(missing).join(', ') + customMsg);71}72};7374// check for unknown arguments (strict-mode).75self.unknownArguments = function(argv, aliases) {76var descriptions = usage.getDescriptions(),77demanded = yargs.getDemanded(),78unknown = [],79aliasLookup = {};8081Object.keys(aliases).forEach(function (key) {82aliases[key].forEach(function (alias) {83aliasLookup[alias] = key;84});85});8687Object.keys(argv).forEach(function (key) {88if (key !== "$0" && key !== "_" &&89!descriptions.hasOwnProperty(key) &&90!demanded.hasOwnProperty(key) &&91!aliasLookup.hasOwnProperty(key)) {92unknown.push(key);93}94});9596if (unknown.length == 1) {97usage.fail("Unknown argument: " + unknown[0]);98}99else if (unknown.length > 1) {100usage.fail("Unknown arguments: " + unknown.join(", "));101}102};103104// custom checks, added using the `check` option on yargs.105var checks = [];106self.check = function (f) {107checks.push(f);108};109110self.customChecks = function(argv, aliases) {111checks.forEach(function (f) {112try {113var result = f(argv, aliases);114if (!result) {115usage.fail('Argument check failed: ' + f.toString());116} else if (typeof result === 'string') {117usage.fail(result);118}119}120catch (err) {121usage.fail(err)122}123});124};125126// check implications, argument foo implies => argument bar.127var implied = {};128self.implies = function (key, value) {129if (typeof key === 'object') {130Object.keys(key).forEach(function (k) {131self.implies(k, key[k]);132});133} else {134implied[key] = value;135}136};137self.getImplied = function() {138return implied;139}140141self.implications = function(argv) {142var implyFail = [];143144Object.keys(implied).forEach(function (key) {145var num, origKey = key, value = implied[key];146147// convert string '1' to number 1148var num = Number(key);149key = isNaN(num) ? key : num;150151if (typeof key === 'number') {152// check length of argv._153key = argv._.length >= key;154} else if (key.match(/^--no-.+/)) {155// check if key doesn't exist156key = key.match(/^--no-(.+)/)[1];157key = !argv[key];158} else {159// check if key exists160key = argv[key];161}162163num = Number(value);164value = isNaN(num) ? value : num;165166if (typeof value === 'number') {167value = argv._.length >= value;168} else if (value.match(/^--no-.+/)) {169value = value.match(/^--no-(.+)/)[1];170value = !argv[value];171} else {172value = argv[value];173}174175if (key && !value) {176implyFail.push(origKey);177}178});179180if (implyFail.length) {181var msg = 'Implications failed:\n';182183implyFail.forEach(function (key) {184msg += (' ' + key + ' -> ' + implied[key]);185});186187usage.fail(msg);188}189}190191return self;192}193194195