UNPKG

7.32 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const errors_1 = require("../core/errors");
4const errors_list_1 = require("../core/errors-list");
5class ArgumentsParser {
6 static paramNameToCLA(paramName) {
7 return (ArgumentsParser.PARAM_PREFIX +
8 paramName
9 .split(/(?=[A-Z])/g)
10 .map((s) => s.toLowerCase())
11 .join("-"));
12 }
13 static cLAToParamName(cLA) {
14 if (cLA.toLowerCase() !== cLA) {
15 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.PARAM_NAME_INVALID_CASING, {
16 param: cLA,
17 });
18 }
19 const parts = cLA.slice(ArgumentsParser.PARAM_PREFIX.length).split("-");
20 return (parts[0] +
21 parts
22 .slice(1)
23 .map((s) => s[0].toUpperCase() + s.slice(1))
24 .join(""));
25 }
26 parseBuidlerArguments(buidlerParamDefinitions, envVariableArguments, rawCLAs) {
27 const buidlerArguments = {};
28 let taskName;
29 const unparsedCLAs = [];
30 for (let i = 0; i < rawCLAs.length; i++) {
31 const arg = rawCLAs[i];
32 if (taskName === undefined) {
33 if (!this._hasCLAParamNameFormat(arg)) {
34 taskName = arg;
35 continue;
36 }
37 if (!this._isCLAParamName(arg, buidlerParamDefinitions)) {
38 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.UNRECOGNIZED_COMMAND_LINE_ARG, { argument: arg });
39 }
40 i = this._parseArgumentAt(rawCLAs, i, buidlerParamDefinitions, buidlerArguments);
41 }
42 else {
43 if (!this._isCLAParamName(arg, buidlerParamDefinitions)) {
44 unparsedCLAs.push(arg);
45 continue;
46 }
47 i = this._parseArgumentAt(rawCLAs, i, buidlerParamDefinitions, buidlerArguments);
48 }
49 }
50 return {
51 buidlerArguments: this._addBuidlerDefaultArguments(buidlerParamDefinitions, envVariableArguments, buidlerArguments),
52 taskName,
53 unparsedCLAs,
54 };
55 }
56 parseTaskArguments(taskDefinition, rawCLAs) {
57 const { paramArguments, rawPositionalArguments, } = this._parseTaskParamArguments(taskDefinition, rawCLAs);
58 const positionalArguments = this._parsePositionalParamArgs(rawPositionalArguments, taskDefinition.positionalParamDefinitions);
59 return Object.assign(Object.assign({}, paramArguments), positionalArguments);
60 }
61 _parseTaskParamArguments(taskDefinition, rawCLAs) {
62 const paramArguments = {};
63 const rawPositionalArguments = [];
64 for (let i = 0; i < rawCLAs.length; i++) {
65 const arg = rawCLAs[i];
66 if (!this._hasCLAParamNameFormat(arg)) {
67 rawPositionalArguments.push(arg);
68 continue;
69 }
70 if (!this._isCLAParamName(arg, taskDefinition.paramDefinitions)) {
71 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.UNRECOGNIZED_PARAM_NAME, {
72 param: arg,
73 });
74 }
75 i = this._parseArgumentAt(rawCLAs, i, taskDefinition.paramDefinitions, paramArguments);
76 }
77 this._addTaskDefaultArguments(taskDefinition, paramArguments);
78 return { paramArguments, rawPositionalArguments };
79 }
80 _addBuidlerDefaultArguments(buidlerParamDefinitions, envVariableArguments, buidlerArguments) {
81 return Object.assign(Object.assign({}, envVariableArguments), buidlerArguments);
82 }
83 _addTaskDefaultArguments(taskDefinition, taskArguments) {
84 for (const paramName of Object.keys(taskDefinition.paramDefinitions)) {
85 const definition = taskDefinition.paramDefinitions[paramName];
86 if (taskArguments[paramName] !== undefined) {
87 continue;
88 }
89 if (!definition.isOptional) {
90 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.MISSING_TASK_ARGUMENT, {
91 param: ArgumentsParser.paramNameToCLA(paramName),
92 });
93 }
94 taskArguments[paramName] = definition.defaultValue;
95 }
96 }
97 _isCLAParamName(str, paramDefinitions) {
98 if (!this._hasCLAParamNameFormat(str)) {
99 return false;
100 }
101 const name = ArgumentsParser.cLAToParamName(str);
102 return paramDefinitions[name] !== undefined;
103 }
104 _hasCLAParamNameFormat(str) {
105 return str.startsWith(ArgumentsParser.PARAM_PREFIX);
106 }
107 _parseArgumentAt(rawCLAs, index, paramDefinitions, parsedArguments) {
108 const claArg = rawCLAs[index];
109 const paramName = ArgumentsParser.cLAToParamName(claArg);
110 const definition = paramDefinitions[paramName];
111 if (parsedArguments[paramName] !== undefined) {
112 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.REPEATED_PARAM, {
113 param: claArg,
114 });
115 }
116 if (definition.isFlag) {
117 parsedArguments[paramName] = true;
118 }
119 else {
120 index++;
121 const value = rawCLAs[index];
122 if (value === undefined) {
123 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.MISSING_TASK_ARGUMENT, {
124 param: ArgumentsParser.paramNameToCLA(paramName),
125 });
126 }
127 parsedArguments[paramName] = definition.type.parse(paramName, value);
128 }
129 return index;
130 }
131 _parsePositionalParamArgs(rawPositionalParamArgs, positionalParamDefinitions) {
132 const args = {};
133 for (let i = 0; i < positionalParamDefinitions.length; i++) {
134 const definition = positionalParamDefinitions[i];
135 const rawArg = rawPositionalParamArgs[i];
136 if (rawArg === undefined) {
137 if (!definition.isOptional) {
138 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.MISSING_POSITIONAL_ARG, {
139 param: definition.name,
140 });
141 }
142 args[definition.name] = definition.defaultValue;
143 }
144 else if (!definition.isVariadic) {
145 args[definition.name] = definition.type.parse(definition.name, rawArg);
146 }
147 else {
148 args[definition.name] = rawPositionalParamArgs
149 .slice(i)
150 .map((raw) => definition.type.parse(definition.name, raw));
151 }
152 }
153 const lastDefinition = positionalParamDefinitions[positionalParamDefinitions.length - 1];
154 const hasVariadicParam = lastDefinition !== undefined && lastDefinition.isVariadic;
155 if (!hasVariadicParam &&
156 rawPositionalParamArgs.length > positionalParamDefinitions.length) {
157 throw new errors_1.BuidlerError(errors_list_1.ERRORS.ARGUMENTS.UNRECOGNIZED_POSITIONAL_ARG, {
158 argument: rawPositionalParamArgs[positionalParamDefinitions.length],
159 });
160 }
161 return args;
162 }
163}
164exports.ArgumentsParser = ArgumentsParser;
165ArgumentsParser.PARAM_PREFIX = "--";
166//# sourceMappingURL=ArgumentsParser.js.map
\No newline at end of file