@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.
@@ -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
+ }