@robhan-cdk-lib/aws_mwaa 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +7679 -0
- package/API.md +3319 -0
- package/LICENSE +19 -0
- package/README.md +54 -0
- package/lib/environment-base.d.ts +462 -0
- package/lib/environment-base.js +53 -0
- package/lib/environment.d.ts +533 -0
- package/lib/environment.js +230 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +19 -0
- package/lib/validation/environment-base.d.ts +18 -0
- package/lib/validation/environment-base.js +350 -0
- package/package.json +155 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateName = validateName;
|
|
4
|
+
exports.validateAirflowConfigurationOptions = validateAirflowConfigurationOptions;
|
|
5
|
+
exports.validateLoggingConfiguration = validateLoggingConfiguration;
|
|
6
|
+
exports.validateNetworkConfiguration = validateNetworkConfiguration;
|
|
7
|
+
exports.validateDagS3Path = validateDagS3Path;
|
|
8
|
+
exports.validateMaxWebservers = validateMaxWebservers;
|
|
9
|
+
exports.validateMaxWorkers = validateMaxWorkers;
|
|
10
|
+
exports.validateMinWebservers = validateMinWebservers;
|
|
11
|
+
exports.validateMinWorkers = validateMinWorkers;
|
|
12
|
+
exports.validatePluginsS3ObjectVersion = validatePluginsS3ObjectVersion;
|
|
13
|
+
exports.validatePluginsS3Path = validatePluginsS3Path;
|
|
14
|
+
exports.validateRequirementsS3ObjectVersion = validateRequirementsS3ObjectVersion;
|
|
15
|
+
exports.validateRequirementsS3Path = validateRequirementsS3Path;
|
|
16
|
+
exports.validateSchedulers = validateSchedulers;
|
|
17
|
+
exports.validateStartupScriptS3ObjectVersion = validateStartupScriptS3ObjectVersion;
|
|
18
|
+
exports.validateStartupScriptS3Path = validateStartupScriptS3Path;
|
|
19
|
+
exports.validateWeeklyMaintenanceWindowStart = validateWeeklyMaintenanceWindowStart;
|
|
20
|
+
const utils_1 = require("@robhan-cdk-lib/utils");
|
|
21
|
+
const environment_base_1 = require("../environment-base");
|
|
22
|
+
function validateName(name) {
|
|
23
|
+
const errors = [];
|
|
24
|
+
if (typeof name !== 'string') {
|
|
25
|
+
errors.push('must be a string');
|
|
26
|
+
return errors; // No need to check further if not a string
|
|
27
|
+
}
|
|
28
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
29
|
+
value: name,
|
|
30
|
+
min: 1,
|
|
31
|
+
max: 80,
|
|
32
|
+
}));
|
|
33
|
+
errors.push(...(0, utils_1.validateRegExp)({
|
|
34
|
+
regExp: /^[a-zA-Z][0-9a-zA-Z-_]*$/,
|
|
35
|
+
value: name,
|
|
36
|
+
}));
|
|
37
|
+
return errors;
|
|
38
|
+
}
|
|
39
|
+
function validateAirflowConfigurationOptions(airflowConfigurationOptions) {
|
|
40
|
+
const errors = [];
|
|
41
|
+
if (typeof airflowConfigurationOptions !== 'object') {
|
|
42
|
+
errors.push('must be an object');
|
|
43
|
+
return errors; // No need to check further if not an object
|
|
44
|
+
}
|
|
45
|
+
for (const [key, value] of Object.entries(airflowConfigurationOptions)) {
|
|
46
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
47
|
+
value: key,
|
|
48
|
+
min: 1,
|
|
49
|
+
max: 64,
|
|
50
|
+
message: `key "${key}" must be between 1 and 64 characters long`,
|
|
51
|
+
}));
|
|
52
|
+
errors.push(...(0, utils_1.validateRegExp)({
|
|
53
|
+
regExp: /^[a-z]+([a-z0-9._]*[a-z0-9_]+)?$/,
|
|
54
|
+
value: key,
|
|
55
|
+
messagePrefix: `key "${key}" `,
|
|
56
|
+
}));
|
|
57
|
+
if (typeof value !== 'string') {
|
|
58
|
+
errors.push(`value for key "${key}" must be a string`);
|
|
59
|
+
continue; // No need to check further if not a string
|
|
60
|
+
}
|
|
61
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
62
|
+
value: value,
|
|
63
|
+
min: 1,
|
|
64
|
+
max: 65536,
|
|
65
|
+
message: `value for key "${key}" must be between 1 and 65536 characters long`,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
return errors;
|
|
69
|
+
}
|
|
70
|
+
function validateModuleLoggingConfiguration(moduleLoggingConfiguration) {
|
|
71
|
+
const errors = [];
|
|
72
|
+
if (typeof moduleLoggingConfiguration !== 'object') {
|
|
73
|
+
errors.push('must be an object');
|
|
74
|
+
return errors; // No need to check further if not an object
|
|
75
|
+
}
|
|
76
|
+
const moduleLoggingConfigurationObject = moduleLoggingConfiguration;
|
|
77
|
+
errors.push(...(0, utils_1.validateObjectAttributes)({
|
|
78
|
+
inputObject: moduleLoggingConfigurationObject,
|
|
79
|
+
mandatoryAttributes: [],
|
|
80
|
+
optionalAttributes: ['cloudWatchLogGroup', 'enabled', 'logLevel'],
|
|
81
|
+
}));
|
|
82
|
+
if (moduleLoggingConfigurationObject.enabled !== undefined) {
|
|
83
|
+
if (typeof moduleLoggingConfigurationObject.enabled !== 'boolean') {
|
|
84
|
+
errors.push('enabled: must be a boolean');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return errors;
|
|
88
|
+
}
|
|
89
|
+
function validateLoggingConfiguration(loggingConfiguration) {
|
|
90
|
+
const errors = [];
|
|
91
|
+
if (typeof loggingConfiguration !== 'object') {
|
|
92
|
+
errors.push('must be an object');
|
|
93
|
+
return errors; // No need to check further if not an object
|
|
94
|
+
}
|
|
95
|
+
const loggingConfigurationObject = loggingConfiguration;
|
|
96
|
+
errors.push(...(0, utils_1.validateObjectAttributes)({
|
|
97
|
+
inputObject: loggingConfigurationObject,
|
|
98
|
+
mandatoryAttributes: [],
|
|
99
|
+
optionalAttributes: ['dagProcessingLogs', 'schedulerLogs', 'taskLogs', 'webServerLogs', 'workerLogs'],
|
|
100
|
+
}));
|
|
101
|
+
if (loggingConfigurationObject.dagProcessingLogs !== undefined) {
|
|
102
|
+
errors.push(...validateModuleLoggingConfiguration(loggingConfigurationObject.dagProcessingLogs).map(error => `dagProcessingLogs: ${error}`));
|
|
103
|
+
}
|
|
104
|
+
if (loggingConfigurationObject.schedulerLogs !== undefined) {
|
|
105
|
+
errors.push(...validateModuleLoggingConfiguration(loggingConfigurationObject.schedulerLogs).map(error => `schedulerLogs: ${error}`));
|
|
106
|
+
}
|
|
107
|
+
if (loggingConfigurationObject.taskLogs !== undefined) {
|
|
108
|
+
errors.push(...validateModuleLoggingConfiguration(loggingConfigurationObject.taskLogs).map(error => `taskLogs: ${error}`));
|
|
109
|
+
}
|
|
110
|
+
if (loggingConfigurationObject.webServerLogs !== undefined) {
|
|
111
|
+
errors.push(...validateModuleLoggingConfiguration(loggingConfigurationObject.webServerLogs).map(error => `webServerLogs: ${error}`));
|
|
112
|
+
}
|
|
113
|
+
if (loggingConfigurationObject.workerLogs !== undefined) {
|
|
114
|
+
errors.push(...validateModuleLoggingConfiguration(loggingConfigurationObject.workerLogs).map(error => `workerLogs: ${error}`));
|
|
115
|
+
}
|
|
116
|
+
return errors;
|
|
117
|
+
}
|
|
118
|
+
function validateNetworkConfiguration(networkConfiguration) {
|
|
119
|
+
const errors = [];
|
|
120
|
+
if (typeof networkConfiguration !== 'object') {
|
|
121
|
+
errors.push('must be an object');
|
|
122
|
+
return errors; // No need to check further if not an object
|
|
123
|
+
}
|
|
124
|
+
const networkConfigurationObject = networkConfiguration;
|
|
125
|
+
errors.push(...(0, utils_1.validateObjectAttributes)({
|
|
126
|
+
inputObject: networkConfigurationObject,
|
|
127
|
+
mandatoryAttributes: [],
|
|
128
|
+
optionalAttributes: ['securityGroups', 'subnets'],
|
|
129
|
+
}));
|
|
130
|
+
if (networkConfigurationObject.securityGroups !== undefined) {
|
|
131
|
+
if (!Array.isArray(networkConfigurationObject.securityGroups)) {
|
|
132
|
+
errors.push('securityGroups: must be an array');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
errors.push(...(0, utils_1.validateArrayLength)({
|
|
136
|
+
value: networkConfigurationObject.securityGroups,
|
|
137
|
+
min: 1,
|
|
138
|
+
max: 5,
|
|
139
|
+
messagePrefix: 'securityGroups: ',
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (networkConfigurationObject.subnets !== undefined) {
|
|
144
|
+
if (!Array.isArray(networkConfigurationObject.subnets)) {
|
|
145
|
+
errors.push('subnets: must be an array');
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
errors.push(...(0, utils_1.validateArrayLength)({
|
|
149
|
+
value: networkConfigurationObject.subnets,
|
|
150
|
+
min: 2,
|
|
151
|
+
max: 2,
|
|
152
|
+
messagePrefix: 'subnets: ',
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return errors;
|
|
157
|
+
}
|
|
158
|
+
function validateDagS3Path(dagS3Path) {
|
|
159
|
+
const errors = [];
|
|
160
|
+
if (typeof dagS3Path !== 'string') {
|
|
161
|
+
errors.push('must be a string');
|
|
162
|
+
return errors; // No need to check further if not a string
|
|
163
|
+
}
|
|
164
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
165
|
+
value: dagS3Path,
|
|
166
|
+
min: 1,
|
|
167
|
+
max: 1024,
|
|
168
|
+
}));
|
|
169
|
+
return errors;
|
|
170
|
+
}
|
|
171
|
+
function validateMaxWebservers(props) {
|
|
172
|
+
const errors = [];
|
|
173
|
+
if (props.maxWebservers !== undefined) {
|
|
174
|
+
if (typeof props.maxWebservers !== 'number') {
|
|
175
|
+
return ['must be a number'];
|
|
176
|
+
}
|
|
177
|
+
if (props.environmentClass) {
|
|
178
|
+
if (props.environmentClass === environment_base_1.EnvironmentClass.MW1_MICRO) {
|
|
179
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
180
|
+
value: props.maxWebservers,
|
|
181
|
+
min: 1,
|
|
182
|
+
max: 1,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
187
|
+
value: props.maxWebservers,
|
|
188
|
+
min: 2,
|
|
189
|
+
max: 5,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return errors;
|
|
195
|
+
}
|
|
196
|
+
function validateMaxWorkers(maxWorkers) {
|
|
197
|
+
const errors = [];
|
|
198
|
+
if (typeof maxWorkers !== 'number') {
|
|
199
|
+
return ['must be a number'];
|
|
200
|
+
}
|
|
201
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
202
|
+
value: maxWorkers,
|
|
203
|
+
min: 1,
|
|
204
|
+
}));
|
|
205
|
+
return errors;
|
|
206
|
+
}
|
|
207
|
+
function validateMinWebservers(props) {
|
|
208
|
+
const errors = [];
|
|
209
|
+
if (props.minWebservers !== undefined) {
|
|
210
|
+
if (typeof props.minWebservers !== 'number') {
|
|
211
|
+
return ['must be a number'];
|
|
212
|
+
}
|
|
213
|
+
if (props.environmentClass) {
|
|
214
|
+
if (props.environmentClass === environment_base_1.EnvironmentClass.MW1_MICRO) {
|
|
215
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
216
|
+
value: props.minWebservers,
|
|
217
|
+
min: 1,
|
|
218
|
+
max: 1,
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
223
|
+
value: props.minWebservers,
|
|
224
|
+
min: 2,
|
|
225
|
+
max: 5,
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return errors;
|
|
231
|
+
}
|
|
232
|
+
function validateMinWorkers(minWorkers) {
|
|
233
|
+
const errors = [];
|
|
234
|
+
if (typeof minWorkers !== 'number') {
|
|
235
|
+
return ['must be a number'];
|
|
236
|
+
}
|
|
237
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
238
|
+
value: minWorkers,
|
|
239
|
+
min: 1,
|
|
240
|
+
}));
|
|
241
|
+
return errors;
|
|
242
|
+
}
|
|
243
|
+
function validatePluginsS3ObjectVersion(pluginsS3ObjectVersion) {
|
|
244
|
+
const errors = [];
|
|
245
|
+
if (typeof pluginsS3ObjectVersion !== 'string') {
|
|
246
|
+
errors.push('must be a string');
|
|
247
|
+
return errors; // No need to check further if not a string
|
|
248
|
+
}
|
|
249
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
250
|
+
value: pluginsS3ObjectVersion,
|
|
251
|
+
min: 1,
|
|
252
|
+
max: 1024,
|
|
253
|
+
}));
|
|
254
|
+
return errors;
|
|
255
|
+
}
|
|
256
|
+
function validatePluginsS3Path(pluginsS3Path) {
|
|
257
|
+
const errors = [];
|
|
258
|
+
if (typeof pluginsS3Path !== 'string') {
|
|
259
|
+
errors.push('must be a string');
|
|
260
|
+
return errors; // No need to check further if not a string
|
|
261
|
+
}
|
|
262
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
263
|
+
value: pluginsS3Path,
|
|
264
|
+
min: 1,
|
|
265
|
+
max: 1024,
|
|
266
|
+
}));
|
|
267
|
+
return errors;
|
|
268
|
+
}
|
|
269
|
+
function validateRequirementsS3ObjectVersion(requirementsS3ObjectVersion) {
|
|
270
|
+
const errors = [];
|
|
271
|
+
if (typeof requirementsS3ObjectVersion !== 'string') {
|
|
272
|
+
errors.push('must be a string');
|
|
273
|
+
return errors; // No need to check further if not a string
|
|
274
|
+
}
|
|
275
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
276
|
+
value: requirementsS3ObjectVersion,
|
|
277
|
+
min: 1,
|
|
278
|
+
max: 1024,
|
|
279
|
+
}));
|
|
280
|
+
return errors;
|
|
281
|
+
}
|
|
282
|
+
function validateRequirementsS3Path(requirementsS3Path) {
|
|
283
|
+
const errors = [];
|
|
284
|
+
if (typeof requirementsS3Path !== 'string') {
|
|
285
|
+
errors.push('must be a string');
|
|
286
|
+
return errors; // No need to check further if not a string
|
|
287
|
+
}
|
|
288
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
289
|
+
value: requirementsS3Path,
|
|
290
|
+
min: 1,
|
|
291
|
+
max: 1024,
|
|
292
|
+
}));
|
|
293
|
+
return errors;
|
|
294
|
+
}
|
|
295
|
+
function validateSchedulers(schedulers) {
|
|
296
|
+
const errors = [];
|
|
297
|
+
if (typeof schedulers !== 'number') {
|
|
298
|
+
return ['must be a number'];
|
|
299
|
+
}
|
|
300
|
+
errors.push(...(0, utils_1.validateNumberRange)({
|
|
301
|
+
value: schedulers,
|
|
302
|
+
min: 1,
|
|
303
|
+
max: 5,
|
|
304
|
+
}));
|
|
305
|
+
return errors;
|
|
306
|
+
}
|
|
307
|
+
function validateStartupScriptS3ObjectVersion(startupScriptS3ObjectVersion) {
|
|
308
|
+
const errors = [];
|
|
309
|
+
if (typeof startupScriptS3ObjectVersion !== 'string') {
|
|
310
|
+
errors.push('must be a string');
|
|
311
|
+
return errors; // No need to check further if not a string
|
|
312
|
+
}
|
|
313
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
314
|
+
value: startupScriptS3ObjectVersion,
|
|
315
|
+
min: 1,
|
|
316
|
+
max: 1024,
|
|
317
|
+
}));
|
|
318
|
+
return errors;
|
|
319
|
+
}
|
|
320
|
+
function validateStartupScriptS3Path(startupScriptS3Path) {
|
|
321
|
+
const errors = [];
|
|
322
|
+
if (typeof startupScriptS3Path !== 'string') {
|
|
323
|
+
errors.push('must be a string');
|
|
324
|
+
return errors; // No need to check further if not a string
|
|
325
|
+
}
|
|
326
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
327
|
+
value: startupScriptS3Path,
|
|
328
|
+
min: 1,
|
|
329
|
+
max: 1024,
|
|
330
|
+
}));
|
|
331
|
+
return errors;
|
|
332
|
+
}
|
|
333
|
+
function validateWeeklyMaintenanceWindowStart(weeklyMaintenanceWindowStart) {
|
|
334
|
+
const errors = [];
|
|
335
|
+
if (typeof weeklyMaintenanceWindowStart !== 'string') {
|
|
336
|
+
errors.push('must be a string');
|
|
337
|
+
return errors; // No need to check further if not a string
|
|
338
|
+
}
|
|
339
|
+
errors.push(...(0, utils_1.validateStringLength)({
|
|
340
|
+
value: weeklyMaintenanceWindowStart,
|
|
341
|
+
min: 1,
|
|
342
|
+
max: 9,
|
|
343
|
+
}));
|
|
344
|
+
errors.push(...(0, utils_1.validateRegExp)({
|
|
345
|
+
value: weeklyMaintenanceWindowStart,
|
|
346
|
+
regExp: /^.*(MON|TUE|WED|THU|FRI|SAT|SUN):([01]\d|2[0-3]):(00|30).*$/,
|
|
347
|
+
}));
|
|
348
|
+
return errors;
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2Vudmlyb25tZW50LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxvQ0FvQkM7QUFFRCxrRkFvQ0M7QUEwQkQsb0VBb0NDO0FBRUQsb0VBMENDO0FBRUQsOENBZUM7QUFFRCxzREEwQkM7QUFFRCxnREFlQztBQUVELHNEQTBCQztBQUVELGdEQWVDO0FBRUQsd0VBZUM7QUFFRCxzREFlQztBQUVELGtGQWVDO0FBRUQsZ0VBZUM7QUFFRCxnREFnQkM7QUFFRCxvRkFlQztBQUVELGtFQWVDO0FBRUQsb0ZBcUJDO0FBbGFELGlEQUFpSjtBQUVqSiwwREFBK0g7QUFFL0gsU0FBZ0IsWUFBWSxDQUFDLElBQVM7SUFDcEMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBRTVCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sTUFBTSxDQUFDLENBQUMsMkNBQTJDO0lBQzVELENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBQSw0QkFBb0IsRUFBQztRQUNsQyxLQUFLLEVBQUUsSUFBSTtRQUNYLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLEVBQUU7S0FDUixDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFBLHNCQUFjLEVBQUM7UUFDNUIsTUFBTSxFQUFFLDBCQUEwQjtRQUNsQyxLQUFLLEVBQUUsSUFBSTtLQUNaLENBQUMsQ0FBQyxDQUFDO0lBRUosT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1DQUFtQyxDQUFDLDJCQUFnQztJQUNsRixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFFNUIsSUFBSSxPQUFPLDJCQUEyQixL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UUFDNUIsS0FBSyxFQUFFLDRCQUE0QjtRQUNuQyxNQUFNLEVBQUUsNkRBQTZEO0tBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBR0osT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHZhbGlkYXRlQXJyYXlMZW5ndGgsIHZhbGlkYXRlTnVtYmVyUmFuZ2UsIHZhbGlkYXRlT2JqZWN0QXR0cmlidXRlcywgdmFsaWRhdGVSZWdFeHAsIHZhbGlkYXRlU3RyaW5nTGVuZ3RoIH0gZnJvbSAnQHJvYmhhbi1jZGstbGliL3V0aWxzJztcbmltcG9ydCB7IEVudmlyb25tZW50UHJvcHMgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudENsYXNzLCBMb2dnaW5nQ29uZmlndXJhdGlvbiwgTW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIE5ldHdvcmtDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQtYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5hbWUobmFtZTogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgcmV0dXJuIGVycm9yczsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhIHN0cmluZ1xuICB9XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdMZW5ndGgoe1xuICAgIHZhbHVlOiBuYW1lLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDgwLFxuICB9KSk7XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSZWdFeHAoe1xuICAgIHJlZ0V4cDogL15bYS16QS1aXVswLTlhLXpBLVotX10qJC8sXG4gICAgdmFsdWU6IG5hbWUsXG4gIH0pKTtcblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBaXJmbG93Q29uZmlndXJhdGlvbk9wdGlvbnMoYWlyZmxvd0NvbmZpZ3VyYXRpb25PcHRpb25zOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAodHlwZW9mIGFpcmZsb3dDb25maWd1cmF0aW9uT3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgaWYgbm90IGFuIG9iamVjdFxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWlyZmxvd0NvbmZpZ3VyYXRpb25PcHRpb25zKSkge1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICBtaW46IDEsXG4gICAgICBtYXg6IDY0LFxuICAgICAgbWVzc2FnZTogYGtleSBcIiR7a2V5fVwiIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzIGxvbmdgLFxuICAgIH0pKTtcblxuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmVnRXhwKHtcbiAgICAgIHJlZ0V4cDogL15bYS16XSsoW2EtejAtOS5fXSpbYS16MC05X10rKT8kLyxcbiAgICAgIHZhbHVlOiBrZXksXG4gICAgICBtZXNzYWdlUHJlZml4OiBga2V5IFwiJHtrZXl9XCIgYCxcbiAgICB9KSk7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JzLnB1c2goYHZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gICAgICBjb250aW51ZTsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhIHN0cmluZ1xuICAgIH1cblxuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIG1pbjogMSxcbiAgICAgIG1heDogNjU1MzYsXG4gICAgICBtZXNzYWdlOiBgdmFsdWUgZm9yIGtleSBcIiR7a2V5fVwiIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NTUzNiBjaGFyYWN0ZXJzIGxvbmdgLFxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24obW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb246IGFueSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmICh0eXBlb2YgbW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24gIT09ICdvYmplY3QnKSB7XG4gICAgZXJyb3JzLnB1c2goJ211c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgcmV0dXJuIGVycm9yczsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhbiBvYmplY3RcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZUxvZ2dpbmdDb25maWd1cmF0aW9uT2JqZWN0ID0gbW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24gYXMgTW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb247XG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlT2JqZWN0QXR0cmlidXRlcyh7XG4gICAgaW5wdXRPYmplY3Q6IG1vZHVsZUxvZ2dpbmdDb25maWd1cmF0aW9uT2JqZWN0LFxuICAgIG1hbmRhdG9yeUF0dHJpYnV0ZXM6IFtdLFxuICAgIG9wdGlvbmFsQXR0cmlidXRlczogWydjbG91ZFdhdGNoTG9nR3JvdXAnLCAnZW5hYmxlZCcsICdsb2dMZXZlbCddLFxuICB9KSk7XG5cbiAgaWYgKG1vZHVsZUxvZ2dpbmdDb25maWd1cmF0aW9uT2JqZWN0LmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3QuZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBlcnJvcnMucHVzaCgnZW5hYmxlZDogbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMb2dnaW5nQ29uZmlndXJhdGlvbihsb2dnaW5nQ29uZmlndXJhdGlvbjogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiBsb2dnaW5nQ29uZmlndXJhdGlvbiAhPT0gJ29iamVjdCcpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgaWYgbm90IGFuIG9iamVjdFxuICB9XG5cbiAgY29uc3QgbG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3QgPSBsb2dnaW5nQ29uZmlndXJhdGlvbiBhcyBMb2dnaW5nQ29uZmlndXJhdGlvbjtcbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVPYmplY3RBdHRyaWJ1dGVzKHtcbiAgICBpbnB1dE9iamVjdDogbG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3QsXG4gICAgbWFuZGF0b3J5QXR0cmlidXRlczogW10sXG4gICAgb3B0aW9uYWxBdHRyaWJ1dGVzOiBbJ2RhZ1Byb2Nlc3NpbmdMb2dzJywgJ3NjaGVkdWxlckxvZ3MnLCAndGFza0xvZ3MnLCAnd2ViU2VydmVyTG9ncycsICd3b3JrZXJMb2dzJ10sXG4gIH0pKTtcblxuICBpZiAobG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3QuZGFnUHJvY2Vzc2luZ0xvZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24obG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3QuZGFnUHJvY2Vzc2luZ0xvZ3MpLm1hcChlcnJvciA9PiBgZGFnUHJvY2Vzc2luZ0xvZ3M6ICR7ZXJyb3J9YCkpO1xuICB9XG5cbiAgaWYgKGxvZ2dpbmdDb25maWd1cmF0aW9uT2JqZWN0LnNjaGVkdWxlckxvZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24obG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3Quc2NoZWR1bGVyTG9ncykubWFwKGVycm9yID0+IGBzY2hlZHVsZXJMb2dzOiAke2Vycm9yfWApKTtcbiAgfVxuXG4gIGlmIChsb2dnaW5nQ29uZmlndXJhdGlvbk9iamVjdC50YXNrTG9ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVNb2R1bGVMb2dnaW5nQ29uZmlndXJhdGlvbihsb2dnaW5nQ29uZmlndXJhdGlvbk9iamVjdC50YXNrTG9ncykubWFwKGVycm9yID0+IGB0YXNrTG9nczogJHtlcnJvcn1gKSk7XG4gIH1cblxuICBpZiAobG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3Qud2ViU2VydmVyTG9ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVNb2R1bGVMb2dnaW5nQ29uZmlndXJhdGlvbihsb2dnaW5nQ29uZmlndXJhdGlvbk9iamVjdC53ZWJTZXJ2ZXJMb2dzKS5tYXAoZXJyb3IgPT4gYHdlYlNlcnZlckxvZ3M6ICR7ZXJyb3J9YCkpO1xuICB9XG5cbiAgaWYgKGxvZ2dpbmdDb25maWd1cmF0aW9uT2JqZWN0LndvcmtlckxvZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTW9kdWxlTG9nZ2luZ0NvbmZpZ3VyYXRpb24obG9nZ2luZ0NvbmZpZ3VyYXRpb25PYmplY3Qud29ya2VyTG9ncykubWFwKGVycm9yID0+IGB3b3JrZXJMb2dzOiAke2Vycm9yfWApKTtcbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5ldHdvcmtDb25maWd1cmF0aW9uKG5ldHdvcmtDb25maWd1cmF0aW9uOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAodHlwZW9mIG5ldHdvcmtDb25maWd1cmF0aW9uICE9PSAnb2JqZWN0Jykge1xuICAgIGVycm9ycy5wdXNoKCdtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIHJldHVybiBlcnJvcnM7IC8vIE5vIG5lZWQgdG8gY2hlY2sgZnVydGhlciBpZiBub3QgYW4gb2JqZWN0XG4gIH1cblxuICBjb25zdCBuZXR3b3JrQ29uZmlndXJhdGlvbk9iamVjdCA9IG5ldHdvcmtDb25maWd1cmF0aW9uIGFzIE5ldHdvcmtDb25maWd1cmF0aW9uO1xuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZU9iamVjdEF0dHJpYnV0ZXMoe1xuICAgIGlucHV0T2JqZWN0OiBuZXR3b3JrQ29uZmlndXJhdGlvbk9iamVjdCxcbiAgICBtYW5kYXRvcnlBdHRyaWJ1dGVzOiBbXSxcbiAgICBvcHRpb25hbEF0dHJpYnV0ZXM6IFsnc2VjdXJpdHlHcm91cHMnLCAnc3VibmV0cyddLFxuICB9KSk7XG5cbiAgaWYgKG5ldHdvcmtDb25maWd1cmF0aW9uT2JqZWN0LnNlY3VyaXR5R3JvdXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV0d29ya0NvbmZpZ3VyYXRpb25PYmplY3Quc2VjdXJpdHlHcm91cHMpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnc2VjdXJpdHlHcm91cHM6IG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVBcnJheUxlbmd0aCh7XG4gICAgICAgIHZhbHVlOiBuZXR3b3JrQ29uZmlndXJhdGlvbk9iamVjdC5zZWN1cml0eUdyb3VwcyxcbiAgICAgICAgbWluOiAxLFxuICAgICAgICBtYXg6IDUsXG4gICAgICAgIG1lc3NhZ2VQcmVmaXg6ICdzZWN1cml0eUdyb3VwczogJyxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBpZiAobmV0d29ya0NvbmZpZ3VyYXRpb25PYmplY3Quc3VibmV0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ldHdvcmtDb25maWd1cmF0aW9uT2JqZWN0LnN1Ym5ldHMpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnc3VibmV0czogbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUFycmF5TGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IG5ldHdvcmtDb25maWd1cmF0aW9uT2JqZWN0LnN1Ym5ldHMsXG4gICAgICAgIG1pbjogMixcbiAgICAgICAgbWF4OiAyLFxuICAgICAgICBtZXNzYWdlUHJlZml4OiAnc3VibmV0czogJyxcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVEYWdTM1BhdGgoZGFnUzNQYXRoOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAodHlwZW9mIGRhZ1MzUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIHJldHVybiBlcnJvcnM7IC8vIE5vIG5lZWQgdG8gY2hlY2sgZnVydGhlciBpZiBub3QgYSBzdHJpbmdcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICB2YWx1ZTogZGFnUzNQYXRoLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDEwMjQsXG4gIH0pKTtcblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYXhXZWJzZXJ2ZXJzKHByb3BzOiBFbnZpcm9ubWVudFByb3BzKTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHByb3BzLm1heFdlYnNlcnZlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgcHJvcHMubWF4V2Vic2VydmVycyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBbJ211c3QgYmUgYSBudW1iZXInXTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZW52aXJvbm1lbnRDbGFzcykge1xuICAgICAgaWYgKHByb3BzLmVudmlyb25tZW50Q2xhc3MgPT09IEVudmlyb25tZW50Q2xhc3MuTVcxX01JQ1JPKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTnVtYmVyUmFuZ2Uoe1xuICAgICAgICAgIHZhbHVlOiBwcm9wcy5tYXhXZWJzZXJ2ZXJzLFxuICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTnVtYmVyUmFuZ2Uoe1xuICAgICAgICAgIHZhbHVlOiBwcm9wcy5tYXhXZWJzZXJ2ZXJzLFxuICAgICAgICAgIG1pbjogMixcbiAgICAgICAgICBtYXg6IDUsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNYXhXb3JrZXJzKG1heFdvcmtlcnM6IGFueSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChcbiAgICB0eXBlb2YgbWF4V29ya2VycyAhPT0gJ251bWJlcidcbiAgKSB7XG4gICAgcmV0dXJuIFsnbXVzdCBiZSBhIG51bWJlciddO1xuICB9XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVOdW1iZXJSYW5nZSh7XG4gICAgdmFsdWU6IG1heFdvcmtlcnMsXG4gICAgbWluOiAxLFxuICB9KSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWluV2Vic2VydmVycyhwcm9wczogRW52aXJvbm1lbnRQcm9wcyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChwcm9wcy5taW5XZWJzZXJ2ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIHByb3BzLm1pbldlYnNlcnZlcnMgIT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gWydtdXN0IGJlIGEgbnVtYmVyJ107XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmVudmlyb25tZW50Q2xhc3MpIHtcbiAgICAgIGlmIChwcm9wcy5lbnZpcm9ubWVudENsYXNzID09PSBFbnZpcm9ubWVudENsYXNzLk1XMV9NSUNSTykge1xuICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZU51bWJlclJhbmdlKHtcbiAgICAgICAgICB2YWx1ZTogcHJvcHMubWluV2Vic2VydmVycyxcbiAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgbWF4OiAxLFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZU51bWJlclJhbmdlKHtcbiAgICAgICAgICB2YWx1ZTogcHJvcHMubWluV2Vic2VydmVycyxcbiAgICAgICAgICBtaW46IDIsXG4gICAgICAgICAgbWF4OiA1LFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWluV29ya2VycyhtaW5Xb3JrZXJzOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoXG4gICAgdHlwZW9mIG1pbldvcmtlcnMgIT09ICdudW1iZXInXG4gICkge1xuICAgIHJldHVybiBbJ211c3QgYmUgYSBudW1iZXInXTtcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTnVtYmVyUmFuZ2Uoe1xuICAgIHZhbHVlOiBtaW5Xb3JrZXJzLFxuICAgIG1pbjogMSxcbiAgfSkpO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBsdWdpbnNTM09iamVjdFZlcnNpb24ocGx1Z2luc1MzT2JqZWN0VmVyc2lvbjogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiBwbHVnaW5zUzNPYmplY3RWZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgcmV0dXJuIGVycm9yczsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhIHN0cmluZ1xuICB9XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdMZW5ndGgoe1xuICAgIHZhbHVlOiBwbHVnaW5zUzNPYmplY3RWZXJzaW9uLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDEwMjQsXG4gIH0pKTtcblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5zUzNQYXRoKHBsdWdpbnNTM1BhdGg6IGFueSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmICh0eXBlb2YgcGx1Z2luc1MzUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIHJldHVybiBlcnJvcnM7IC8vIE5vIG5lZWQgdG8gY2hlY2sgZnVydGhlciBpZiBub3QgYSBzdHJpbmdcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICB2YWx1ZTogcGx1Z2luc1MzUGF0aCxcbiAgICBtaW46IDEsXG4gICAgbWF4OiAxMDI0LFxuICB9KSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZW1lbnRzUzNPYmplY3RWZXJzaW9uKHJlcXVpcmVtZW50c1MzT2JqZWN0VmVyc2lvbjogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiByZXF1aXJlbWVudHNTM09iamVjdFZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ211c3QgYmUgYSBzdHJpbmcnKTtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgaWYgbm90IGEgc3RyaW5nXG4gIH1cblxuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gICAgdmFsdWU6IHJlcXVpcmVtZW50c1MzT2JqZWN0VmVyc2lvbixcbiAgICBtaW46IDEsXG4gICAgbWF4OiAxMDI0LFxuICB9KSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZW1lbnRzUzNQYXRoKHJlcXVpcmVtZW50c1MzUGF0aDogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiByZXF1aXJlbWVudHNTM1BhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ211c3QgYmUgYSBzdHJpbmcnKTtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgaWYgbm90IGEgc3RyaW5nXG4gIH1cblxuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gICAgdmFsdWU6IHJlcXVpcmVtZW50c1MzUGF0aCxcbiAgICBtaW46IDEsXG4gICAgbWF4OiAxMDI0LFxuICB9KSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2NoZWR1bGVycyhzY2hlZHVsZXJzOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoXG4gICAgdHlwZW9mIHNjaGVkdWxlcnMgIT09ICdudW1iZXInXG4gICkge1xuICAgIHJldHVybiBbJ211c3QgYmUgYSBudW1iZXInXTtcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlTnVtYmVyUmFuZ2Uoe1xuICAgIHZhbHVlOiBzY2hlZHVsZXJzLFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDUsXG4gIH0pKTtcblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTdGFydHVwU2NyaXB0UzNPYmplY3RWZXJzaW9uKHN0YXJ0dXBTY3JpcHRTM09iamVjdFZlcnNpb246IGFueSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmICh0eXBlb2Ygc3RhcnR1cFNjcmlwdFMzT2JqZWN0VmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICBlcnJvcnMucHVzaCgnbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIHJldHVybiBlcnJvcnM7IC8vIE5vIG5lZWQgdG8gY2hlY2sgZnVydGhlciBpZiBub3QgYSBzdHJpbmdcbiAgfVxuXG4gIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nTGVuZ3RoKHtcbiAgICB2YWx1ZTogc3RhcnR1cFNjcmlwdFMzT2JqZWN0VmVyc2lvbixcbiAgICBtaW46IDEsXG4gICAgbWF4OiAxMDI0LFxuICB9KSk7XG5cbiAgcmV0dXJuIGVycm9ycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3RhcnR1cFNjcmlwdFMzUGF0aChzdGFydHVwU2NyaXB0UzNQYXRoOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAodHlwZW9mIHN0YXJ0dXBTY3JpcHRTM1BhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgZXJyb3JzLnB1c2goJ211c3QgYmUgYSBzdHJpbmcnKTtcbiAgICByZXR1cm4gZXJyb3JzOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgaWYgbm90IGEgc3RyaW5nXG4gIH1cblxuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0xlbmd0aCh7XG4gICAgdmFsdWU6IHN0YXJ0dXBTY3JpcHRTM1BhdGgsXG4gICAgbWluOiAxLFxuICAgIG1heDogMTAyNCxcbiAgfSkpO1xuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVdlZWtseU1haW50ZW5hbmNlV2luZG93U3RhcnQod2Vla2x5TWFpbnRlbmFuY2VXaW5kb3dTdGFydDogYW55KTogc3RyaW5nW10ge1xuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKHR5cGVvZiB3ZWVrbHlNYWludGVuYW5jZVdpbmRvd1N0YXJ0ICE9PSAnc3RyaW5nJykge1xuICAgIGVycm9ycy5wdXNoKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgcmV0dXJuIGVycm9yczsgLy8gTm8gbmVlZCB0byBjaGVjayBmdXJ0aGVyIGlmIG5vdCBhIHN0cmluZ1xuICB9XG5cbiAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdMZW5ndGgoe1xuICAgIHZhbHVlOiB3ZWVrbHlNYWludGVuYW5jZVdpbmRvd1N0YXJ0LFxuICAgIG1pbjogMSxcbiAgICBtYXg6IDksXG4gIH0pKTtcblxuICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJlZ0V4cCh7XG4gICAgdmFsdWU6IHdlZWtseU1haW50ZW5hbmNlV2luZG93U3RhcnQsXG4gICAgcmVnRXhwOiAvXi4qKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTik6KFswMV1cXGR8MlswLTNdKTooMDB8MzApLiokLyxcbiAgfSkpO1xuXG5cbiAgcmV0dXJuIGVycm9ycztcbn0iXX0=
|
package/package.json
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@robhan-cdk-lib/aws_mwaa",
|
|
3
|
+
"description": "AWS CDK Construct Library for Amazon Managed Workflows for Apache Airflow",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/robert-hanuschke/cdk-aws_mwaa.git"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "npx projen build",
|
|
10
|
+
"bump": "npx projen bump",
|
|
11
|
+
"clobber": "npx projen clobber",
|
|
12
|
+
"compat": "npx projen compat",
|
|
13
|
+
"compile": "npx projen compile",
|
|
14
|
+
"default": "npx projen default",
|
|
15
|
+
"docgen": "npx projen docgen",
|
|
16
|
+
"eject": "npx projen eject",
|
|
17
|
+
"eslint": "npx projen eslint",
|
|
18
|
+
"package": "npx projen package",
|
|
19
|
+
"package-all": "npx projen package-all",
|
|
20
|
+
"package:dotnet": "npx projen package:dotnet",
|
|
21
|
+
"package:go": "npx projen package:go",
|
|
22
|
+
"package:java": "npx projen package:java",
|
|
23
|
+
"package:js": "npx projen package:js",
|
|
24
|
+
"package:python": "npx projen package:python",
|
|
25
|
+
"post-compile": "npx projen post-compile",
|
|
26
|
+
"post-upgrade": "npx projen post-upgrade",
|
|
27
|
+
"pre-compile": "npx projen pre-compile",
|
|
28
|
+
"release": "npx projen release",
|
|
29
|
+
"test": "npx projen test",
|
|
30
|
+
"test:watch": "npx projen test:watch",
|
|
31
|
+
"unbump": "npx projen unbump",
|
|
32
|
+
"upgrade": "npx projen upgrade",
|
|
33
|
+
"watch": "npx projen watch",
|
|
34
|
+
"projen": "npx projen"
|
|
35
|
+
},
|
|
36
|
+
"author": {
|
|
37
|
+
"name": "Robert Hanuschke",
|
|
38
|
+
"email": "robhan-cdk-lib@hanuschke.eu",
|
|
39
|
+
"organization": false
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@stylistic/eslint-plugin": "^2",
|
|
43
|
+
"@types/jest": "^30.0.0",
|
|
44
|
+
"@types/node": "^24.10.0",
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^8",
|
|
46
|
+
"@typescript-eslint/parser": "^8",
|
|
47
|
+
"aws-cdk-lib": "2.221.0",
|
|
48
|
+
"commit-and-tag-version": "^12",
|
|
49
|
+
"constructs": "10.0.5",
|
|
50
|
+
"eslint": "^9",
|
|
51
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
52
|
+
"eslint-plugin-import": "^2.32.0",
|
|
53
|
+
"jest": "^30.2.0",
|
|
54
|
+
"jest-junit": "^16",
|
|
55
|
+
"jsii": "~5.8.0",
|
|
56
|
+
"jsii-diff": "^1.118.0",
|
|
57
|
+
"jsii-docgen": "^10.5.0",
|
|
58
|
+
"jsii-pacmak": "^1.118.0",
|
|
59
|
+
"jsii-rosetta": "~5.8.0",
|
|
60
|
+
"projen": "^0.98.10",
|
|
61
|
+
"ts-jest": "^29.4.5",
|
|
62
|
+
"ts-node": "^10.9.2",
|
|
63
|
+
"typescript": "^5.9.3"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"aws-cdk-lib": "^2.221.0",
|
|
67
|
+
"constructs": "^10.0.5"
|
|
68
|
+
},
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@robhan-cdk-lib/utils": "^0.0.90"
|
|
71
|
+
},
|
|
72
|
+
"keywords": [
|
|
73
|
+
"Airflow",
|
|
74
|
+
"Amazon Managed Workflows for Apache Airflow",
|
|
75
|
+
"cdk"
|
|
76
|
+
],
|
|
77
|
+
"main": "lib/index.js",
|
|
78
|
+
"license": "MIT",
|
|
79
|
+
"version": "0.0.0",
|
|
80
|
+
"jest": {
|
|
81
|
+
"coverageProvider": "v8",
|
|
82
|
+
"testMatch": [
|
|
83
|
+
"<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
|
|
84
|
+
"<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
|
|
85
|
+
"<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
|
|
86
|
+
"<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
|
|
87
|
+
],
|
|
88
|
+
"clearMocks": true,
|
|
89
|
+
"collectCoverage": true,
|
|
90
|
+
"coverageReporters": [
|
|
91
|
+
"json",
|
|
92
|
+
"lcov",
|
|
93
|
+
"clover",
|
|
94
|
+
"cobertura",
|
|
95
|
+
"text"
|
|
96
|
+
],
|
|
97
|
+
"coverageDirectory": "coverage",
|
|
98
|
+
"coveragePathIgnorePatterns": [
|
|
99
|
+
"/node_modules/"
|
|
100
|
+
],
|
|
101
|
+
"testPathIgnorePatterns": [
|
|
102
|
+
"/node_modules/"
|
|
103
|
+
],
|
|
104
|
+
"watchPathIgnorePatterns": [
|
|
105
|
+
"/node_modules/"
|
|
106
|
+
],
|
|
107
|
+
"reporters": [
|
|
108
|
+
"default",
|
|
109
|
+
[
|
|
110
|
+
"jest-junit",
|
|
111
|
+
{
|
|
112
|
+
"outputDirectory": "test-reports"
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
],
|
|
116
|
+
"transform": {
|
|
117
|
+
"^.+\\.[t]sx?$": [
|
|
118
|
+
"ts-jest",
|
|
119
|
+
{
|
|
120
|
+
"tsconfig": "tsconfig.dev.json"
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"types": "lib/index.d.ts",
|
|
126
|
+
"stability": "stable",
|
|
127
|
+
"jsii": {
|
|
128
|
+
"outdir": "dist",
|
|
129
|
+
"targets": {
|
|
130
|
+
"java": {
|
|
131
|
+
"package": "io.github.roberthanuschke.cdk.aws.mwaa",
|
|
132
|
+
"maven": {
|
|
133
|
+
"groupId": "io.github.robert-hanuschke",
|
|
134
|
+
"artifactId": "cdk-aws-mwaa"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"python": {
|
|
138
|
+
"distName": "robhan_cdk_lib.aws_mwaa",
|
|
139
|
+
"module": "robhan_cdk_lib.aws_mwaa"
|
|
140
|
+
},
|
|
141
|
+
"dotnet": {
|
|
142
|
+
"namespace": "Robhan.CdkLib",
|
|
143
|
+
"packageId": "Robhan.CdkLib.AwsMwaa"
|
|
144
|
+
},
|
|
145
|
+
"go": {
|
|
146
|
+
"moduleName": "github.com/robert-hanuschke/robhan-cdk-lib-aws-mwaa"
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
"tsc": {
|
|
150
|
+
"outDir": "lib",
|
|
151
|
+
"rootDir": "src"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
|
|
155
|
+
}
|