UNPKG

3.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const errors_1 = require("@oclif/errors");
4const errors_2 = require("./errors");
5function validate(parse) {
6 function validateArgs() {
7 const maxArgs = parse.input.args.length;
8 if (parse.input.strict && parse.output.argv.length > maxArgs) {
9 const extras = parse.output.argv.slice(maxArgs);
10 throw new errors_2.UnexpectedArgsError({ parse, args: extras });
11 }
12 const missingRequiredArgs = [];
13 let hasOptional = false;
14 parse.input.args.forEach((arg, index) => {
15 if (!arg.required) {
16 hasOptional = true;
17 }
18 else if (hasOptional) {
19 // (required arg) check whether an optional has occurred before
20 // optionals should follow required, not before
21 throw new errors_2.InvalidArgsSpecError({ parse, args: parse.input.args });
22 }
23 if (arg.required) {
24 if (!parse.output.argv[index] && parse.output.argv[index] !== 0) {
25 missingRequiredArgs.push(arg);
26 }
27 }
28 });
29 if (missingRequiredArgs.length > 0) {
30 throw new errors_2.RequiredArgsError({ parse, args: missingRequiredArgs });
31 }
32 }
33 function validateAcrossFlags(flag) {
34 const intersection = Object.entries(parse.input.flags)
35 .map(entry => entry[0]) // array of flag names
36 .filter(flagName => parse.output.flags[flagName] !== undefined) // with values
37 .filter(flagName => flag.exactlyOne && flag.exactlyOne.includes(flagName)); // and in the exactlyOne list
38 if (intersection.length === 0) {
39 // the command's exactlyOne may or may not include itself, so we'll use Set to add + de-dupe
40 throw new errors_1.CLIError(`Exactly one of the following must be provided: ${[
41 ...new Set(...flag.exactlyOne || [], flag.name),
42 ].join(',')}`);
43 }
44 }
45 function validateFlags() {
46 for (const [name, flag] of Object.entries(parse.input.flags)) {
47 if (parse.output.flags[name] !== undefined) {
48 for (const also of flag.dependsOn || []) {
49 if (!parse.output.flags[also]) {
50 throw new errors_1.CLIError(`--${also}= must also be provided when using --${name}=`);
51 }
52 }
53 for (const also of flag.exclusive || []) {
54 // do not enforce exclusivity for flags that were defaulted
55 if (parse.output.metadata.flags[also] &&
56 parse.output.metadata.flags[also].setFromDefault)
57 continue;
58 if (parse.output.metadata.flags[name] &&
59 parse.output.metadata.flags[name].setFromDefault)
60 continue;
61 if (parse.output.flags[also]) {
62 throw new errors_1.CLIError(`--${also}= cannot also be provided when using --${name}=`);
63 }
64 }
65 for (const also of flag.exactlyOne || []) {
66 if (also !== name && parse.output.flags[also]) {
67 throw new errors_1.CLIError(`--${also}= cannot also be provided when using --${name}=`);
68 }
69 }
70 }
71 else if (flag.required) {
72 throw new errors_2.RequiredFlagError({ parse, flag });
73 }
74 else if (flag.exactlyOne && flag.exactlyOne.length > 0) {
75 validateAcrossFlags(flag);
76 }
77 }
78 }
79 validateArgs();
80 validateFlags();
81}
82exports.validate = validate;