Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80759 views
1
// validation-type-stuff, missing params,
2
// bad implications, custom checks.
3
module.exports = function (yargs, usage) {
4
var self = {};
5
6
// validate appropriate # of non-option
7
// arguments were provided, i.e., '_'.
8
self.nonOptionCount = function(argv) {
9
var demanded = yargs.getDemanded();
10
11
if (demanded._ && argv._.length < demanded._.count) {
12
if (demanded._.msg !== undefined) {
13
usage.fail(demanded._.msg);
14
} else {
15
usage.fail('Not enough non-option arguments: got '
16
+ argv._.length + ', need at least ' + demanded._.count
17
);
18
}
19
}
20
};
21
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
27
if (options.requiresArg.length > 0) {
28
var missingRequiredArgs = [];
29
30
options.requiresArg.forEach(function(key) {
31
var value = argv[key];
32
33
// parser sets --foo value to true / --no-foo to false
34
if (value === true || value === false) {
35
missingRequiredArgs.push(key);
36
}
37
});
38
39
if (missingRequiredArgs.length == 1) {
40
usage.fail("Missing argument value: " + missingRequiredArgs[0]);
41
}
42
else if (missingRequiredArgs.length > 1) {
43
var message = "Missing argument values: " + missingRequiredArgs.join(", ");
44
usage.fail(message);
45
}
46
}
47
};
48
49
// make sure all the required arguments are present.
50
self.requiredArguments = function(argv) {
51
var demanded = yargs.getDemanded(),
52
missing = null;
53
54
Object.keys(demanded).forEach(function (key) {
55
if (!argv.hasOwnProperty(key)) {
56
missing = missing || {};
57
missing[key] = demanded[key];
58
}
59
});
60
61
if (missing) {
62
var customMsgs = [];
63
Object.keys(missing).forEach(function(key) {
64
var msg = missing[key].msg;
65
if (msg && customMsgs.indexOf(msg) < 0) {
66
customMsgs.push(msg);
67
}
68
});
69
var customMsg = customMsgs.length ? '\n' + customMsgs.join('\n') : '';
70
71
usage.fail('Missing required arguments: ' + Object.keys(missing).join(', ') + customMsg);
72
}
73
};
74
75
// check for unknown arguments (strict-mode).
76
self.unknownArguments = function(argv, aliases) {
77
var descriptions = usage.getDescriptions(),
78
demanded = yargs.getDemanded(),
79
unknown = [],
80
aliasLookup = {};
81
82
Object.keys(aliases).forEach(function (key) {
83
aliases[key].forEach(function (alias) {
84
aliasLookup[alias] = key;
85
});
86
});
87
88
Object.keys(argv).forEach(function (key) {
89
if (key !== "$0" && key !== "_" &&
90
!descriptions.hasOwnProperty(key) &&
91
!demanded.hasOwnProperty(key) &&
92
!aliasLookup.hasOwnProperty(key)) {
93
unknown.push(key);
94
}
95
});
96
97
if (unknown.length == 1) {
98
usage.fail("Unknown argument: " + unknown[0]);
99
}
100
else if (unknown.length > 1) {
101
usage.fail("Unknown arguments: " + unknown.join(", "));
102
}
103
};
104
105
// custom checks, added using the `check` option on yargs.
106
var checks = [];
107
self.check = function (f) {
108
checks.push(f);
109
};
110
111
self.customChecks = function(argv, aliases) {
112
checks.forEach(function (f) {
113
try {
114
var result = f(argv, aliases);
115
if (!result) {
116
usage.fail('Argument check failed: ' + f.toString());
117
} else if (typeof result === 'string') {
118
usage.fail(result);
119
}
120
}
121
catch (err) {
122
usage.fail(err)
123
}
124
});
125
};
126
127
// check implications, argument foo implies => argument bar.
128
var implied = {};
129
self.implies = function (key, value) {
130
if (typeof key === 'object') {
131
Object.keys(key).forEach(function (k) {
132
self.implies(k, key[k]);
133
});
134
} else {
135
implied[key] = value;
136
}
137
};
138
self.getImplied = function() {
139
return implied;
140
}
141
142
self.implications = function(argv) {
143
var implyFail = [];
144
145
Object.keys(implied).forEach(function (key) {
146
var num, origKey = key, value = implied[key];
147
148
// convert string '1' to number 1
149
var num = Number(key);
150
key = isNaN(num) ? key : num;
151
152
if (typeof key === 'number') {
153
// check length of argv._
154
key = argv._.length >= key;
155
} else if (key.match(/^--no-.+/)) {
156
// check if key doesn't exist
157
key = key.match(/^--no-(.+)/)[1];
158
key = !argv[key];
159
} else {
160
// check if key exists
161
key = argv[key];
162
}
163
164
num = Number(value);
165
value = isNaN(num) ? value : num;
166
167
if (typeof value === 'number') {
168
value = argv._.length >= value;
169
} else if (value.match(/^--no-.+/)) {
170
value = value.match(/^--no-(.+)/)[1];
171
value = !argv[value];
172
} else {
173
value = argv[value];
174
}
175
176
if (key && !value) {
177
implyFail.push(origKey);
178
}
179
});
180
181
if (implyFail.length) {
182
var msg = 'Implications failed:\n';
183
184
implyFail.forEach(function (key) {
185
msg += (' ' + key + ' -> ' + implied[key]);
186
});
187
188
usage.fail(msg);
189
}
190
}
191
192
return self;
193
}
194
195