UNPKG

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