1 // validation-type-stuff, missing params,
2 // bad implications, custom checks.
3 module.exports = function (yargs, usage) {
6 // validate appropriate # of non-option
7 // arguments were provided, i.e., '_'.
8 self.nonOptionCount = function (argv) {
9 var demanded = yargs.getDemanded()
11 if (demanded._ && argv._.length < demanded._.count) {
12 if (demanded._.msg !== undefined) {
13 usage.fail(demanded._.msg)
15 usage.fail('Not enough non-option arguments: got '
16 + argv._.length + ', need at least ' + demanded._.count
22 // make sure that any args that require an
23 // value (--foo=bar), have a value.
24 self.missingArgumentValue = function (argv) {
25 var options = yargs.getOptions(),
26 defaultValues = [true, false, '']
28 if (options.requiresArg.length > 0) {
29 var missingRequiredArgs = []
31 options.requiresArg.forEach(function (key) {
34 // if a value is explicitly requested,
35 // flag argument as missing if it does not
36 // look like foo=bar was entered.
37 if (~defaultValues.indexOf(value)
38 || (Array.isArray(value) && !value.length)) {
39 missingRequiredArgs.push(key)
43 if (missingRequiredArgs.length === 1) {
44 usage.fail('Missing argument value: ' + missingRequiredArgs[0])
45 } else if (missingRequiredArgs.length > 1) {
46 var message = 'Missing argument values: ' + missingRequiredArgs.join(', ')
52 // make sure all the required arguments are present.
53 self.requiredArguments = function (argv) {
54 var demanded = yargs.getDemanded(),
57 Object.keys(demanded).forEach(function (key) {
58 if (!argv.hasOwnProperty(key)) {
59 missing = missing || {}
60 missing[key] = demanded[key]
66 Object.keys(missing).forEach(function (key) {
67 var msg = missing[key].msg
68 if (msg && customMsgs.indexOf(msg) < 0) {
73 var customMsg = customMsgs.length ? '\n' + customMsgs.join('\n') : ''
74 usage.fail('Missing required arguments: ' + Object.keys(missing).join(', ') + customMsg)
78 // check for unknown arguments (strict-mode).
79 self.unknownArguments = function (argv, aliases) {
80 var descriptions = usage.getDescriptions(),
81 demanded = yargs.getDemanded(),
85 Object.keys(aliases).forEach(function (key) {
86 aliases[key].forEach(function (alias) {
87 aliasLookup[alias] = key
91 Object.keys(argv).forEach(function (key) {
92 if (key !== '$0' && key !== '_' &&
93 !descriptions.hasOwnProperty(key) &&
94 !demanded.hasOwnProperty(key) &&
95 !aliasLookup.hasOwnProperty(key)) {
100 if (unknown.length === 1) {
101 usage.fail('Unknown argument: ' + unknown[0])
102 } else if (unknown.length > 1) {
103 usage.fail('Unknown arguments: ' + unknown.join(', '))
107 // custom checks, added using the `check` option on yargs.
109 self.check = function (f) {
113 self.customChecks = function (argv, aliases) {
114 checks.forEach(function (f) {
116 var result = f(argv, aliases)
118 usage.fail('Argument check failed: ' + f.toString())
119 } else if (typeof result === 'string') {
123 usage.fail(err.message ? err.message : err)
128 // check implications, argument foo implies => argument bar.
130 self.implies = function (key, value) {
131 if (typeof key === 'object') {
132 Object.keys(key).forEach(function (k) {
133 self.implies(k, key[k])
139 self.getImplied = function () {
143 self.implications = function (argv) {
146 Object.keys(implied).forEach(function (key) {
151 // convert string '1' to number 1
153 key = isNaN(num) ? key : num
155 if (typeof key === 'number') {
156 // check length of argv._
157 key = argv._.length >= key
158 } else if (key.match(/^--no-.+/)) {
159 // check if key doesn't exist
160 key = key.match(/^--no-(.+)/)[1]
163 // check if key exists
168 value = isNaN(num) ? value : num
170 if (typeof value === 'number') {
171 value = argv._.length >= value
172 } else if (value.match(/^--no-.+/)) {
173 value = value.match(/^--no-(.+)/)[1]
180 implyFail.push(origKey)
184 if (implyFail.length) {
185 var msg = 'Implications failed:\n'
187 implyFail.forEach(function (key) {
188 msg += (' ' + key + ' -> ' + implied[key])