1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const errors_1 = require("../core/errors");
|
4 | const errors_list_1 = require("../core/errors-list");
|
5 | class 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 | }
|
164 | exports.ArgumentsParser = ArgumentsParser;
|
165 | ArgumentsParser.PARAM_PREFIX = "--";
|
166 |
|
\ | No newline at end of file |