1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const errors_1 = require("@oclif/errors");
|
4 | const errors_2 = require("./errors");
|
5 | function 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 |
|
20 |
|
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])
|
36 | .filter(flagName => parse.output.flags[flagName] !== undefined)
|
37 | .filter(flagName => flag.exactlyOne && flag.exactlyOne.includes(flagName));
|
38 | if (intersection.length === 0) {
|
39 |
|
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 |
|
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 | }
|
82 | exports.validate = validate;
|