@cdktn/cli-core 0.21.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.
Files changed (154) hide show
  1. package/README.md +3 -0
  2. package/ambient.d.ts +13 -0
  3. package/eslint.config.mjs +82 -0
  4. package/jest.config.js +20 -0
  5. package/package.json +139 -0
  6. package/src/lib/cdktf-config.d.ts +16 -0
  7. package/src/lib/cdktf-config.d.ts.map +1 -0
  8. package/src/lib/cdktf-config.js +108 -0
  9. package/src/lib/cdktf-project-io-handler.d.ts +20 -0
  10. package/src/lib/cdktf-project-io-handler.d.ts.map +1 -0
  11. package/src/lib/cdktf-project-io-handler.js +84 -0
  12. package/src/lib/cdktf-project.d.ts +111 -0
  13. package/src/lib/cdktf-project.d.ts.map +1 -0
  14. package/src/lib/cdktf-project.js +371 -0
  15. package/src/lib/cdktf-stack.d.ts +134 -0
  16. package/src/lib/cdktf-stack.d.ts.map +1 -0
  17. package/src/lib/cdktf-stack.js +386 -0
  18. package/src/lib/convert.d.ts +6 -0
  19. package/src/lib/convert.d.ts.map +1 -0
  20. package/src/lib/convert.js +51 -0
  21. package/src/lib/dependencies/cdktf-config-manager.d.ts +12 -0
  22. package/src/lib/dependencies/cdktf-config-manager.d.ts.map +1 -0
  23. package/src/lib/dependencies/cdktf-config-manager.js +36 -0
  24. package/src/lib/dependencies/dependency-manager.d.ts +95 -0
  25. package/src/lib/dependencies/dependency-manager.d.ts.map +1 -0
  26. package/src/lib/dependencies/dependency-manager.js +393 -0
  27. package/src/lib/dependencies/package-manager.d.ts +18 -0
  28. package/src/lib/dependencies/package-manager.d.ts.map +1 -0
  29. package/src/lib/dependencies/package-manager.js +581 -0
  30. package/src/lib/dependencies/prebuilt-providers.d.ts +23 -0
  31. package/src/lib/dependencies/prebuilt-providers.d.ts.map +1 -0
  32. package/src/lib/dependencies/prebuilt-providers.js +220 -0
  33. package/src/lib/dependencies/registry-api.d.ts +8 -0
  34. package/src/lib/dependencies/registry-api.d.ts.map +1 -0
  35. package/src/lib/dependencies/registry-api.js +77 -0
  36. package/src/lib/dependencies/version-constraints.d.ts +8 -0
  37. package/src/lib/dependencies/version-constraints.d.ts.map +1 -0
  38. package/src/lib/dependencies/version-constraints.js +95 -0
  39. package/src/lib/error-reporting.d.ts +10 -0
  40. package/src/lib/error-reporting.d.ts.map +1 -0
  41. package/src/lib/error-reporting.js +133 -0
  42. package/src/lib/errors.d.ts +6 -0
  43. package/src/lib/errors.d.ts.map +1 -0
  44. package/src/lib/errors.js +10 -0
  45. package/src/lib/execution-logs.d.ts +3 -0
  46. package/src/lib/execution-logs.d.ts.map +1 -0
  47. package/src/lib/execution-logs.js +47 -0
  48. package/src/lib/get.d.ts +25 -0
  49. package/src/lib/get.d.ts.map +1 -0
  50. package/src/lib/get.js +90 -0
  51. package/src/lib/helpers/stack-helpers.d.ts +16 -0
  52. package/src/lib/helpers/stack-helpers.d.ts.map +1 -0
  53. package/src/lib/helpers/stack-helpers.js +155 -0
  54. package/src/lib/index.d.ts +15 -0
  55. package/src/lib/index.d.ts.map +1 -0
  56. package/src/lib/index.js +44 -0
  57. package/src/lib/init.d.ts +37 -0
  58. package/src/lib/init.d.ts.map +1 -0
  59. package/src/lib/init.js +131 -0
  60. package/src/lib/local-provider-constraints.d.ts +28 -0
  61. package/src/lib/local-provider-constraints.d.ts.map +1 -0
  62. package/src/lib/local-provider-constraints.js +95 -0
  63. package/src/lib/local-provider-versions.d.ts +12 -0
  64. package/src/lib/local-provider-versions.d.ts.map +1 -0
  65. package/src/lib/local-provider-versions.js +73 -0
  66. package/src/lib/models/deploy-machine.d.ts +128 -0
  67. package/src/lib/models/deploy-machine.d.ts.map +1 -0
  68. package/src/lib/models/deploy-machine.js +280 -0
  69. package/src/lib/models/pty-process.d.ts +29 -0
  70. package/src/lib/models/pty-process.d.ts.map +1 -0
  71. package/src/lib/models/pty-process.js +132 -0
  72. package/src/lib/models/schema.d.ts +2307 -0
  73. package/src/lib/models/schema.d.ts.map +1 -0
  74. package/src/lib/models/schema.js +181 -0
  75. package/src/lib/models/terraform-cli.d.ts +72 -0
  76. package/src/lib/models/terraform-cli.d.ts.map +1 -0
  77. package/src/lib/models/terraform-cli.js +357 -0
  78. package/src/lib/models/terraform.d.ts +125 -0
  79. package/src/lib/models/terraform.d.ts.map +1 -0
  80. package/src/lib/models/terraform.js +72 -0
  81. package/src/lib/output.d.ts +23 -0
  82. package/src/lib/output.d.ts.map +1 -0
  83. package/src/lib/output.js +211 -0
  84. package/src/lib/provider-add.d.ts +15 -0
  85. package/src/lib/provider-add.d.ts.map +1 -0
  86. package/src/lib/provider-add.js +30 -0
  87. package/src/lib/server/terraform-logs.d.ts +2 -0
  88. package/src/lib/server/terraform-logs.d.ts.map +1 -0
  89. package/src/lib/server/terraform-logs.js +19 -0
  90. package/src/lib/synth-stack.d.ts +29 -0
  91. package/src/lib/synth-stack.d.ts.map +1 -0
  92. package/src/lib/synth-stack.js +251 -0
  93. package/src/lib/synth.d.ts +7 -0
  94. package/src/lib/synth.d.ts.map +1 -0
  95. package/src/lib/synth.js +67 -0
  96. package/src/lib/terraform-json.d.ts +1015 -0
  97. package/src/lib/terraform-json.d.ts.map +1 -0
  98. package/src/lib/terraform-json.js +82 -0
  99. package/src/lib/terraform-provider-lock.d.ts +25 -0
  100. package/src/lib/terraform-provider-lock.d.ts.map +1 -0
  101. package/src/lib/terraform-provider-lock.js +95 -0
  102. package/src/lib/watch.d.ts +16 -0
  103. package/src/lib/watch.d.ts.map +1 -0
  104. package/src/lib/watch.js +155 -0
  105. package/templates/csharp/.hooks.sscaff.js +63 -0
  106. package/templates/csharp/MainStack.cs +15 -0
  107. package/templates/csharp/MyTerraformStack.csproj +13 -0
  108. package/templates/csharp/Program.cs +17 -0
  109. package/templates/csharp/TestProgram.cs +42 -0
  110. package/templates/csharp/cdktf.json +11 -0
  111. package/templates/csharp/help +42 -0
  112. package/templates/csharp/{{}}.gitignore +345 -0
  113. package/templates/go/.hooks.sscaff.js +70 -0
  114. package/templates/go/cdktf.json +12 -0
  115. package/templates/go/go.mod +8 -0
  116. package/templates/go/help +32 -0
  117. package/templates/go/main.go +22 -0
  118. package/templates/go/main_test.go +42 -0
  119. package/templates/go/{{}}.gitignore +21 -0
  120. package/templates/java/.hooks.sscaff.js +64 -0
  121. package/templates/java/build.gradle +55 -0
  122. package/templates/java/cdktf.json +12 -0
  123. package/templates/java/gradle.properties +1 -0
  124. package/templates/java/gradlew +248 -0
  125. package/templates/java/gradlew.bat +92 -0
  126. package/templates/java/help +35 -0
  127. package/templates/java/settings.gradle +5 -0
  128. package/templates/java/src/main/java/com/mycompany/app/Main.java +16 -0
  129. package/templates/java/src/main/java/com/mycompany/app/MainStack.java +14 -0
  130. package/templates/java/src/test/java/com/company/app/MainTest.java +38 -0
  131. package/templates/java/{{}}.gitignore +14 -0
  132. package/templates/python/.hooks.sscaff.js +59 -0
  133. package/templates/python/Pipfile +7 -0
  134. package/templates/python/cdktf.json +12 -0
  135. package/templates/python/help +42 -0
  136. package/templates/python/main-test.py +26 -0
  137. package/templates/python/main.py +16 -0
  138. package/templates/python/{{}}.gitignore +7 -0
  139. package/templates/python-pip/.hooks.sscaff.js +63 -0
  140. package/templates/python-pip/cdktf.json +12 -0
  141. package/templates/python-pip/help +35 -0
  142. package/templates/python-pip/main-test.py +23 -0
  143. package/templates/python-pip/main.py +16 -0
  144. package/templates/python-pip/{{}}.gitignore +7 -0
  145. package/templates/typescript/.hooks.sscaff.js +78 -0
  146. package/templates/typescript/__tests__/main-test.ts +89 -0
  147. package/templates/typescript/cdktf.json +11 -0
  148. package/templates/typescript/help +51 -0
  149. package/templates/typescript/jest.config.js +187 -0
  150. package/templates/typescript/main.ts +14 -0
  151. package/templates/typescript/package.json +22 -0
  152. package/templates/typescript/setup.js +2 -0
  153. package/templates/typescript/tsconfig.json +35 -0
  154. package/templates/typescript/{{}}.gitignore +11 -0
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.SynthStack = exports.StackDependencies = void 0;
30
+ // Copyright (c) HashiCorp, Inc
31
+ // SPDX-License-Identifier: MPL-2.0
32
+ const fs = __importStar(require("fs-extra"));
33
+ const path = __importStar(require("path"));
34
+ const chalk = __importStar(require("chalk"));
35
+ const indent_string_1 = __importDefault(require("indent-string"));
36
+ const cdktn_1 = require("cdktn");
37
+ const perf_hooks_1 = require("perf_hooks");
38
+ const commons_1 = require("@cdktn/commons");
39
+ const cdktf_config_1 = require("./cdktf-config");
40
+ const hcl_tools_1 = require("@cdktn/hcl-tools");
41
+ const chalkColour = new chalk.Instance();
42
+ class StackDependencies {
43
+ constructor(stacks) {
44
+ this.stacks = stacks;
45
+ this.pendingStacks = [];
46
+ this.inflightStacks = [];
47
+ this.deployedStacks = [];
48
+ this.pendingStacks = [...this.stacks];
49
+ }
50
+ startRun(stack) {
51
+ this.pendingStacks = this.pendingStacks.filter((item) => item.name !== stack.name);
52
+ this.inflightStacks.push(stack);
53
+ }
54
+ finishRun(stack) {
55
+ this.inflightStacks = this.inflightStacks.filter((item) => item.name !== stack.name);
56
+ this.deployedStacks.push(stack);
57
+ }
58
+ get pendingDeployableStacks() {
59
+ return this.pendingStacks.filter((pendingStack) => {
60
+ const unmetDependencies = pendingStack.dependencies.filter((dependency) => {
61
+ return !this.deployedStacks.some((deployedStack) => {
62
+ return deployedStack.name === dependency;
63
+ });
64
+ });
65
+ return unmetDependencies.length === 0;
66
+ });
67
+ }
68
+ }
69
+ exports.StackDependencies = StackDependencies;
70
+ class SynthStack {
71
+ static async synth(abortSignal, command, outdir, workingDirectory = process.cwd(), graceful = false, // will not exit the process but rethrow the error instead
72
+ noColor = false, synthOrigin, hcl = false) {
73
+ // start performance timer
74
+ const startTime = perf_hooks_1.performance.now();
75
+ const isDirectory = (source) => fs.lstatSync(source).isDirectory();
76
+ const getDirectories = (source) => {
77
+ if (!fs.existsSync(source))
78
+ return [];
79
+ return fs
80
+ .readdirSync(source)
81
+ .map((name) => path.join(source, name))
82
+ .filter(isDirectory);
83
+ };
84
+ const existingDirectories = getDirectories(path.join(outdir, cdktn_1.Manifest.stacksFolder));
85
+ const env = Object.fromEntries(Object.entries(process.env).filter(
86
+ // We don't want to pass Terraform variables to the synth command since they should only be used at execution time
87
+ ([key]) => !key.startsWith("TF_VAR_")));
88
+ // Increases the default memory available to Node.js when synthesizing a TypeScript CDK project.
89
+ const nodeOptsSwitch = "--max-old-space-size";
90
+ const nodeOptsSetting = `${nodeOptsSwitch}=4096`;
91
+ if (env.NODE_OPTIONS && !env.NODE_OPTIONS.includes(nodeOptsSwitch)) {
92
+ commons_1.logger.warn(`WARNING: Found NODE_OPTIONS environment variable without a setting for ${nodeOptsSwitch}
93
+ The synthesizing step for TypeScript may need an increased amount of memory if multiple large providers
94
+ are used with locally generated bindings. You can ignore this if you don't use CDKTN with TypeScript.
95
+ If not present, the cdktn-cli sets it to NODE_OPTIONS="${nodeOptsSetting}" by default. But as
96
+ your environment already contains a NODE_OPTIONS variable, we won't override it. Hence, the app command
97
+ might fail while synthesizing with an out of memory error.`);
98
+ }
99
+ else if (!env.NODE_OPTIONS) {
100
+ // increase memory to allow ts-node (when using TypeScript) to handle large amounts of generated code in memory
101
+ env.NODE_OPTIONS = `${env.NODE_OPTIONS || ""} ${nodeOptsSetting}`.trim();
102
+ }
103
+ const currentContext = process.env[cdktn_1.CONTEXT_ENV]
104
+ ? JSON.parse(process.env.CDKTF_CONTEXT_JSON)
105
+ : {};
106
+ const relativeModules = getRelativeTerraformModules();
107
+ try {
108
+ await (0, commons_1.shell)(command, [], {
109
+ shell: true,
110
+ env: {
111
+ ...env,
112
+ CDKTF_OUTDIR: outdir,
113
+ CDKTF_CONTINUE_SYNTH_ON_ERROR_ANNOTATIONS: "true", // we want to display the errors ourselves
114
+ [cdktn_1.CONTEXT_ENV]: JSON.stringify({
115
+ ...currentContext,
116
+ cdktfRelativeModules: relativeModules,
117
+ }),
118
+ SYNTH_HCL_OUTPUT: hcl.toString(),
119
+ },
120
+ cwd: workingDirectory,
121
+ signal: abortSignal,
122
+ noColor: noColor,
123
+ });
124
+ }
125
+ catch (e) {
126
+ const errorOutput = chalkColour `{redBright cdktn encountered an error while synthesizing}
127
+
128
+ Synth command: {blue ${command}}
129
+ Error: {redBright ${e.message}}
130
+ ${e.stderr
131
+ ? chalkColour `
132
+ Command output on stderr:
133
+
134
+ {dim ${(0, indent_string_1.default)(e.stderr, 4)}}
135
+ `
136
+ : ""}
137
+ ${e.stdout
138
+ ? chalkColour `
139
+ Command output on stdout:
140
+
141
+ {dim ${(0, indent_string_1.default)(e.stdout, 4)}}
142
+ `
143
+ : ""}`;
144
+ await this.synthErrorTelemetry(synthOrigin);
145
+ if (graceful) {
146
+ e.errorOutput = errorOutput;
147
+ throw e;
148
+ }
149
+ console.error(`ERROR: ${errorOutput}`);
150
+ process.exit(1);
151
+ }
152
+ // Apply formatting to HCL files if hcl output was selected
153
+ if (hcl) {
154
+ await SynthStack.formatHclFiles(outdir);
155
+ }
156
+ // end performance timer
157
+ const endTime = perf_hooks_1.performance.now();
158
+ let stacks = [];
159
+ try {
160
+ stacks = await SynthStack.readSynthesizedStacks(outdir);
161
+ }
162
+ catch (e) {
163
+ const errorMessage = `ERROR: synthesis failed, because app was expected to call 'synth()', but didn't. Thus "${outdir}/${cdktn_1.Manifest.fileName}" was not created: ${e}`;
164
+ if (graceful) {
165
+ throw new Error(errorMessage);
166
+ }
167
+ commons_1.logger.error(errorMessage);
168
+ process.exit(1);
169
+ }
170
+ await this.synthTelemetry(endTime - startTime, stacks, synthOrigin);
171
+ if (stacks.length === 0) {
172
+ commons_1.logger.error("ERROR: No Terraform code synthesized.");
173
+ }
174
+ const stackNames = stacks.map((s) => s.name);
175
+ const orphanedDirectories = existingDirectories.filter((e) => !stackNames.includes(path.basename(e)));
176
+ for (const orphanedDirectory of orphanedDirectories) {
177
+ fs.rmSync(orphanedDirectory, { recursive: true });
178
+ }
179
+ return stacks;
180
+ }
181
+ static async formatHclFiles(outDir) {
182
+ const manifestPath = path.join(outDir, cdktn_1.Manifest.fileName);
183
+ if (!(await fs.pathExists(manifestPath))) {
184
+ throw new Error(`Could not find manifest file at ${manifestPath}. In case --skip-synth was passed, please try again without the flag.`);
185
+ }
186
+ const manifest = JSON.parse(fs.readFileSync(manifestPath).toString());
187
+ for (const stackName in manifest.stacks) {
188
+ const stack = manifest.stacks[stackName];
189
+ const filePath = path.join(outDir, stack.synthesizedStackPath);
190
+ const hclContent = fs.readFileSync(filePath).toString();
191
+ const formattedHcl = await (0, hcl_tools_1.format)(hclContent);
192
+ fs.writeFileSync(filePath, formattedHcl);
193
+ }
194
+ }
195
+ static async readSynthesizedStacks(outdir) {
196
+ const manifestPath = path.join(outdir, cdktn_1.Manifest.fileName);
197
+ if (!(await fs.pathExists(manifestPath))) {
198
+ throw new Error(`Could not find manifest file at ${manifestPath}. In case --skip-synth was passed, please try again without the flag.`);
199
+ }
200
+ const stacks = [];
201
+ const manifest = JSON.parse(fs.readFileSync(manifestPath).toString());
202
+ for (const stackName in manifest.stacks) {
203
+ const stack = manifest.stacks[stackName];
204
+ const filePath = path.join(outdir, stack.synthesizedStackPath);
205
+ let jsonContent = {};
206
+ if (filePath.endsWith(".tf.json")) {
207
+ jsonContent = JSON.parse(fs.readFileSync(filePath).toString());
208
+ }
209
+ else {
210
+ const metadataPath = path.join(outdir, stack.stackMetadataPath);
211
+ jsonContent = JSON.parse(fs.readFileSync(metadataPath).toString());
212
+ }
213
+ stacks.push({
214
+ ...stack,
215
+ workingDirectory: path.join(outdir, stack.workingDirectory),
216
+ content: JSON.stringify(jsonContent, null, 2),
217
+ });
218
+ }
219
+ return stacks;
220
+ }
221
+ static async synthTelemetry(totalTime, stacks, synthOrigin) {
222
+ const config = (0, commons_1.readConfigSync)();
223
+ await (0, commons_1.sendTelemetry)("synth", {
224
+ totalTime: totalTime,
225
+ language: config.language,
226
+ synthOrigin,
227
+ stackMetadata: stacks.map((stack) => JSON.parse(stack.content)["//"].metadata),
228
+ requiredProviders: stacks.map((stack) => JSON.parse(stack.content)["terraform"].required_providers),
229
+ });
230
+ }
231
+ static async synthErrorTelemetry(synthOrigin) {
232
+ await (0, commons_1.sendTelemetry)("synth", { error: true, synthOrigin });
233
+ }
234
+ }
235
+ exports.SynthStack = SynthStack;
236
+ function getRelativeTerraformModules() {
237
+ let cfg;
238
+ try {
239
+ cfg = cdktf_config_1.CdktfConfig.read();
240
+ }
241
+ catch (e) {
242
+ commons_1.logger.trace("Could not read cdktf.json: " + e);
243
+ return [];
244
+ }
245
+ return cfg.terraformModules.filter((mod) => {
246
+ return typeof mod === "string"
247
+ ? mod.startsWith("./") || mod.startsWith("../")
248
+ : mod.source.startsWith("./") || mod.source.startsWith("../");
249
+ });
250
+ }
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGgtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzeW50aC1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUM3Qiw2Q0FBK0I7QUFDL0Isa0VBQXlDO0FBQ3pDLGlDQUtlO0FBQ2YsMkNBQXlDO0FBQ3pDLDRDQUE4RTtBQUM5RSxpREFBNkM7QUFDN0MsZ0RBQTBDO0FBRTFDLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBVXpDLE1BQWEsaUJBQWlCO0lBSzVCLFlBQTZCLE1BQTBCO1FBQTFCLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBSmhELGtCQUFhLEdBQXVCLEVBQUUsQ0FBQztRQUN2QyxtQkFBYyxHQUF1QixFQUFFLENBQUM7UUFDeEMsbUJBQWMsR0FBdUIsRUFBRSxDQUFDO1FBRzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQXVCO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQzVDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQ25DLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQXVCO1FBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQzlDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQ25DLENB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c0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgaW5kZW50U3RyaW5nIGZyb20gXCJpbmRlbnQtc3RyaW5nXCI7XG5pbXBvcnQge1xuICBDT05URVhUX0VOVixcbiAgTWFuaWZlc3QsXG4gIFN0YWNrTWFuaWZlc3QsXG4gIFRlcnJhZm9ybVN0YWNrTWV0YWRhdGEsXG59IGZyb20gXCJjZGt0blwiO1xuaW1wb3J0IHsgcGVyZm9ybWFuY2UgfSBmcm9tIFwicGVyZl9ob29rc1wiO1xuaW1wb3J0IHsgbG9nZ2VyLCByZWFkQ29uZmlnU3luYywgc2VuZFRlbGVtZXRyeSwgc2hlbGwgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IENka3RmQ29uZmlnIH0gZnJvbSBcIi4vY2RrdGYtY29uZmlnXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwiQGNka3RuL2hjbC10b29sc1wiO1xuXG5jb25zdCBjaGFsa0NvbG91ciA9IG5ldyBjaGFsay5JbnN0YW5jZSgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpemVkU3RhY2tNZXRhZGF0YSB7XG4gIFwiLy9cIj86IHsgW2tleTogc3RyaW5nXTogVGVycmFmb3JtU3RhY2tNZXRhZGF0YSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoZXNpemVkU3RhY2sgZXh0ZW5kcyBTdGFja01hbmlmZXN0IHtcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhY2tEZXBlbmRlbmNpZXMge1xuICBwdWJsaWMgcGVuZGluZ1N0YWNrczogU3ludGhlc2l6ZWRTdGFja1tdID0gW107XG4gIHB1YmxpYyBpbmZsaWdodFN0YWNrczogU3ludGhlc2l6ZWRTdGFja1tdID0gW107XG4gIHB1YmxpYyBkZXBsb3llZFN0YWNrczogU3ludGhlc2l6ZWRTdGFja1tdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzdGFja3M6IFN5bnRoZXNpemVkU3RhY2tbXSkge1xuICAgIHRoaXMucGVuZGluZ1N0YWNrcyA9IFsuLi50aGlzLnN0YWNrc107XG4gIH1cblxuICBwdWJsaWMgc3RhcnRSdW4oc3RhY2s6IFN5bnRoZXNpemVkU3RhY2spOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdTdGFja3MgPSB0aGlzLnBlbmRpbmdTdGFja3MuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0ubmFtZSAhPT0gc3RhY2submFtZSxcbiAgICApO1xuICAgIHRoaXMuaW5mbGlnaHRTdGFja3MucHVzaChzdGFjayk7XG4gIH1cblxuICBwdWJsaWMgZmluaXNoUnVuKHN0YWNrOiBTeW50aGVzaXplZFN0YWNrKTogdm9pZCB7XG4gICAgdGhpcy5pbmZsaWdodFN0YWNrcyA9IHRoaXMuaW5mbGlnaHRTdGFja3MuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+IGl0ZW0ubmFtZSAhPT0gc3RhY2submFtZSxcbiAgICApO1xuICAgIHRoaXMuZGVwbG95ZWRTdGFja3MucHVzaChzdGFjayk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmdEZXBsb3lhYmxlU3RhY2tzKCk6IFN5bnRoZXNpemVkU3RhY2tbXSB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ1N0YWNrcy5maWx0ZXIoKHBlbmRpbmdTdGFjaykgPT4ge1xuICAgICAgY29uc3QgdW5tZXREZXBlbmRlbmNpZXMgPSBwZW5kaW5nU3RhY2suZGVwZW5kZW5jaWVzLmZpbHRlcihcbiAgICAgICAgKGRlcGVuZGVuY3kpID0+IHtcbiAgICAgICAgICByZXR1cm4gIXRoaXMuZGVwbG95ZWRTdGFja3Muc29tZSgoZGVwbG95ZWRTdGFjaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRlcGxveWVkU3RhY2submFtZSA9PT0gZGVwZW5kZW5jeTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB1bm1ldERlcGVuZGVuY2llcy5sZW5ndGggPT09IDA7XG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1hbmlmZXN0SnNvbiB7XG4gIHZlcnNpb246IHN0cmluZztcbiAgc3RhY2tzOiBTdGFja01hbmlmZXN0W107XG59XG5cbmV4cG9ydCB0eXBlIFN5bnRoT3JpZ2luID0gXCJ3YXRjaFwiO1xuXG5leHBvcnQgY2xhc3MgU3ludGhTdGFjayB7XG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgc3ludGgoXG4gICAgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsLFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBvdXRkaXI6IHN0cmluZyxcbiAgICB3b3JraW5nRGlyZWN0b3J5ID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBncmFjZWZ1bCA9IGZhbHNlLCAvLyB3aWxsIG5vdCBleGl0IHRoZSBwcm9jZXNzIGJ1dCByZXRocm93IHRoZSBlcnJvciBpbnN0ZWFkXG4gICAgbm9Db2xvciA9IGZhbHNlLFxuICAgIHN5bnRoT3JpZ2luPzogU3ludGhPcmlnaW4sXG4gICAgaGNsID0gZmFsc2UsXG4gICk6IFByb21pc2U8U3ludGhlc2l6ZWRTdGFja1tdPiB7XG4gICAgLy8gc3RhcnQgcGVyZm9ybWFuY2UgdGltZXJcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gKHNvdXJjZTogc3RyaW5nKSA9PiBmcy5sc3RhdFN5bmMoc291cmNlKS5pc0RpcmVjdG9yeSgpO1xuICAgIGNvbnN0IGdldERpcmVjdG9yaWVzID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlKSkgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIGZzXG4gICAgICAgIC5yZWFkZGlyU3luYyhzb3VyY2UpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihzb3VyY2UsIG5hbWUpKVxuICAgICAgICAuZmlsdGVyKGlzRGlyZWN0b3J5KTtcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdEaXJlY3RvcmllcyA9IGdldERpcmVjdG9yaWVzKFxuICAgICAgcGF0aC5qb2luKG91dGRpciwgTWFuaWZlc3Quc3RhY2tzRm9sZGVyKSxcbiAgICApO1xuXG4gICAgY29uc3QgZW52ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpLmZpbHRlcihcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBwYXNzIFRlcnJhZm9ybSB2YXJpYWJsZXMgdG8gdGhlIHN5bnRoIGNvbW1hbmQgc2luY2UgdGhleSBzaG91bGQgb25seSBiZSB1c2VkIGF0IGV4ZWN1dGlvbiB0aW1lXG4gICAgICAgIChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKFwiVEZfVkFSX1wiKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIC8vIEluY3JlYXNlcyB0aGUgZGVmYXVsdCBtZW1vcnkgYXZhaWxhYmxlIHRvIE5vZGUuanMgd2hlbiBzeW50aGVzaXppbmcgYSBUeXBlU2NyaXB0IENESyBwcm9qZWN0LlxuICAgIGNvbnN0IG5vZGVPcHRzU3dpdGNoID0gXCItLW1heC1vbGQtc3BhY2Utc2l6ZVwiO1xuICAgIGNvbnN0IG5vZGVPcHRzU2V0dGluZyA9IGAke25vZGVPcHRzU3dpdGNofT00MDk2YDtcbiAgICBpZiAoZW52Lk5PREVfT1BUSU9OUyAmJiAhZW52Lk5PREVfT1BUSU9OUy5pbmNsdWRlcyhub2RlT3B0c1N3aXRjaCkpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBXQVJOSU5HOiBGb3VuZCBOT0RFX09QVElPTlMgZW52aXJvbm1lbnQgdmFyaWFibGUgd2l0aG91dCBhIHNldHRpbmcgZm9yICR7bm9kZU9wdHNTd2l0Y2h9XG5UaGUgc3ludGhlc2l6aW5nIHN0ZXAgZm9yIFR5cGVTY3JpcHQgbWF5IG5lZWQgYW4gaW5jcmVhc2VkIGFtb3VudCBvZiBtZW1vcnkgaWYgbXVsdGlwbGUgbGFyZ2UgcHJvdmlkZXJzXG5hcmUgdXNlZCB3aXRoIGxvY2FsbHkgZ2VuZXJhdGVkIGJpbmRpbmdzLiBZb3UgY2FuIGlnbm9yZSB0aGlzIGlmIHlvdSBkb24ndCB1c2UgQ0RLVE4gd2l0aCBUeXBlU2NyaXB0LlxuSWYgbm90IHByZXNlbnQsIHRoZSBjZGt0bi1jbGkgc2V0cyBpdCB0byBOT0RFX09QVElPTlM9XCIke25vZGVPcHRzU2V0dGluZ31cIiBieSBkZWZhdWx0LiBCdXQgYXNcbnlvdXIgZW52aXJvbm1lbnQgYWxyZWFkeSBjb250YWlucyBhIE5PREVfT1BUSU9OUyB2YXJpYWJsZSwgd2Ugd29uJ3Qgb3ZlcnJpZGUgaXQuIEhlbmNlLCB0aGUgYXBwIGNvbW1hbmRcbm1pZ2h0IGZhaWwgd2hpbGUgc3ludGhlc2l6aW5nIHdpdGggYW4gb3V0IG9mIG1lbW9yeSBlcnJvci5gKTtcbiAgICB9IGVsc2UgaWYgKCFlbnYuTk9ERV9PUFRJT05TKSB7XG4gICAgICAvLyBpbmNyZWFzZSBtZW1vcnkgdG8gYWxsb3cgdHMtbm9kZSAod2hlbiB1c2luZyBUeXBlU2NyaXB0KSB0byBoYW5kbGUgbGFyZ2UgYW1vdW50cyBvZiBnZW5lcmF0ZWQgY29kZSBpbiBtZW1vcnlcbiAgICAgIGVudi5OT0RFX09QVElPTlMgPSBgJHtlbnYuTk9ERV9PUFRJT05TIHx8IFwiXCJ9ICR7bm9kZU9wdHNTZXR0aW5nfWAudHJpbSgpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gcHJvY2Vzcy5lbnZbQ09OVEVYVF9FTlZdXG4gICAgICA/IEpTT04ucGFyc2UocHJvY2Vzcy5lbnYuQ0RLVEZfQ09OVEVYVF9KU09OKVxuICAgICAgOiB7fTtcbiAgICBjb25zdCByZWxhdGl2ZU1vZHVsZXMgPSBnZXRSZWxhdGl2ZVRlcnJhZm9ybU1vZHVsZXMoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzaGVsbChjb21tYW5kLCBbXSwge1xuICAgICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4uZW52LFxuICAgICAgICAgIENES1RGX09VVERJUjogb3V0ZGlyLFxuICAgICAgICAgIENES1RGX0NPTlRJTlVFX1NZTlRIX09OX0VSUk9SX0FOTk9UQVRJT05TOiBcInRydWVcIiwgLy8gd2Ugd2FudCB0byBkaXNwbGF5IHRoZSBlcnJvcnMgb3Vyc2VsdmVzXG4gICAgICAgICAgW0NPTlRFWFRfRU5WXTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgLi4uY3VycmVudENvbnRleHQsXG4gICAgICAgICAgICBjZGt0ZlJlbGF0aXZlTW9kdWxlczogcmVsYXRpdmVNb2R1bGVzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIFNZTlRIX0hDTF9PVVRQVVQ6IGhjbC50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgICBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksXG4gICAgICAgIHNpZ25hbDogYWJvcnRTaWduYWwsXG4gICAgICAgIG5vQ29sb3I6IG5vQ29sb3IsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IGVycm9yT3V0cHV0ID0gY2hhbGtDb2xvdXJge3JlZEJyaWdodCBjZGt0biBlbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBzeW50aGVzaXppbmd9XG5cblN5bnRoIGNvbW1hbmQ6IHtibHVlICR7Y29tbWFuZH19XG5FcnJvcjogICAgICAgICB7cmVkQnJpZ2h0ICR7ZS5tZXNzYWdlfX1cbiR7XG4gIGUuc3RkZXJyXG4gICAgPyBjaGFsa0NvbG91cmBcbkNvbW1hbmQgb3V0cHV0IG9uIHN0ZGVycjpcblxue2RpbSAke2luZGVudFN0cmluZyhlLnN0ZGVyciwgNCl9fVxuYFxuICAgIDogXCJcIlxufVxuJHtcbiAgZS5zdGRvdXRcbiAgICA/IGNoYWxrQ29sb3VyYFxuQ29tbWFuZCBvdXRwdXQgb24gc3Rkb3V0OlxuXG57ZGltICR7aW5kZW50U3RyaW5nKGUuc3Rkb3V0LCA0KX19XG5gXG4gICAgOiBcIlwiXG59YDtcbiAgICAgIGF3YWl0IHRoaXMuc3ludGhFcnJvclRlbGVtZXRyeShzeW50aE9yaWdpbik7XG4gICAgICBpZiAoZ3JhY2VmdWwpIHtcbiAgICAgICAgZS5lcnJvck91dHB1dCA9IGVycm9yT3V0cHV0O1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihgRVJST1I6ICR7ZXJyb3JPdXRwdXR9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZm9ybWF0dGluZyB0byBIQ0wgZmlsZXMgaWYgaGNsIG91dHB1dCB3YXMgc2VsZWN0ZWRcbiAgICBpZiAoaGNsKSB7XG4gICAgICBhd2FpdCBTeW50aFN0YWNrLmZvcm1hdEhjbEZpbGVzKG91dGRpcik7XG4gICAgfVxuXG4gICAgLy8gZW5kIHBlcmZvcm1hbmNlIHRpbWVyXG4gICAgY29uc3QgZW5kVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgbGV0IHN0YWNrczogU3ludGhlc2l6ZWRTdGFja1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIHN0YWNrcyA9IGF3YWl0IFN5bnRoU3RhY2sucmVhZFN5bnRoZXNpemVkU3RhY2tzKG91dGRpcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgRVJST1I6IHN5bnRoZXNpcyBmYWlsZWQsIGJlY2F1c2UgYXBwIHdhcyBleHBlY3RlZCB0byBjYWxsICdzeW50aCgpJywgYnV0IGRpZG4ndC4gVGh1cyBcIiR7b3V0ZGlyfS8ke01hbmlmZXN0LmZpbGVOYW1lfVwiICB3YXMgbm90IGNyZWF0ZWQ6ICR7ZX1gO1xuICAgICAgaWYgKGdyYWNlZnVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zeW50aFRlbGVtZXRyeShlbmRUaW1lIC0gc3RhcnRUaW1lLCBzdGFja3MsIHN5bnRoT3JpZ2luKTtcblxuICAgIGlmIChzdGFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXCJFUlJPUjogTm8gVGVycmFmb3JtIGNvZGUgc3ludGhlc2l6ZWQuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YWNrTmFtZXMgPSBzdGFja3MubWFwKChzKSA9PiBzLm5hbWUpO1xuICAgIGNvbnN0IG9ycGhhbmVkRGlyZWN0b3JpZXMgPSBleGlzdGluZ0RpcmVjdG9yaWVzLmZpbHRlcihcbiAgICAgIChlKSA9PiAhc3RhY2tOYW1lcy5pbmNsdWRlcyhwYXRoLmJhc2VuYW1lKGUpKSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBvcnBoYW5lZERpcmVjdG9yeSBvZiBvcnBoYW5lZERpcmVjdG9yaWVzKSB7XG4gICAgICBmcy5ybVN5bmMob3JwaGFuZWREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFja3M7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIGZvcm1hdEhjbEZpbGVzKG91dERpcjogc3RyaW5nKSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5qb2luKG91dERpciwgTWFuaWZlc3QuZmlsZU5hbWUpO1xuICAgIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMobWFuaWZlc3RQYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIG1hbmlmZXN0IGZpbGUgYXQgJHttYW5pZmVzdFBhdGh9LiBJbiBjYXNlIC0tc2tpcC1zeW50aCB3YXMgcGFzc2VkLCBwbGVhc2UgdHJ5IGFnYWluIHdpdGhvdXQgdGhlIGZsYWcuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCkudG9TdHJpbmcoKSxcbiAgICApIGFzIE1hbmlmZXN0SnNvbjtcblxuICAgIGZvciAoY29uc3Qgc3RhY2tOYW1lIGluIG1hbmlmZXN0LnN0YWNrcykge1xuICAgICAgY29uc3Qgc3RhY2sgPSBtYW5pZmVzdC5zdGFja3Nbc3RhY2tOYW1lXTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG91dERpciwgc3RhY2suc3ludGhlc2l6ZWRTdGFja1BhdGgpO1xuXG4gICAgICBjb25zdCBoY2xDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkSGNsID0gYXdhaXQgZm9ybWF0KGhjbENvbnRlbnQpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgZm9ybWF0dGVkSGNsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIHJlYWRTeW50aGVzaXplZFN0YWNrcyhcbiAgICBvdXRkaXI6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxTeW50aGVzaXplZFN0YWNrW10+IHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4ob3V0ZGlyLCBNYW5pZmVzdC5maWxlTmFtZSk7XG4gICAgaWYgKCEoYXdhaXQgZnMucGF0aEV4aXN0cyhtYW5pZmVzdFBhdGgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgbWFuaWZlc3QgZmlsZSBhdCAke21hbmlmZXN0UGF0aH0uIEluIGNhc2UgLS1za2lwLXN5bnRoIHdhcyBwYXNzZWQsIHBsZWFzZSB0cnkgYWdhaW4gd2l0aG91dCB0aGUgZmxhZy5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja3M6IFN5bnRoZXNpemVkU3RhY2tbXSA9IFtdO1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgIGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgpLnRvU3RyaW5nKCksXG4gICAgKSBhcyBNYW5pZmVzdEpzb247XG5cbiAgICBmb3IgKGNvbnN0IHN0YWNrTmFtZSBpbiBtYW5pZmVzdC5zdGFja3MpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gbWFuaWZlc3Quc3RhY2tzW3N0YWNrTmFtZV07XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIHN0YWNrLnN5bnRoZXNpemVkU3RhY2tQYXRoKTtcbiAgICAgIGxldCBqc29uQ29udGVudDogU3ludGhlc2l6ZWRTdGFja01ldGFkYXRhID0ge307XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIudGYuanNvblwiKSkge1xuICAgICAgICBqc29uQ29udGVudCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKS50b1N0cmluZygpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhUGF0aCA9IHBhdGguam9pbihvdXRkaXIsIHN0YWNrLnN0YWNrTWV0YWRhdGFQYXRoISk7XG4gICAgICAgIGpzb25Db250ZW50ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YWRhdGFQYXRoKS50b1N0cmluZygpKTtcbiAgICAgIH1cblxuICAgICAgc3RhY2tzLnB1c2goe1xuICAgICAgICAuLi5zdGFjayxcbiAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogcGF0aC5qb2luKG91dGRpciwgc3RhY2sud29ya2luZ0RpcmVjdG9yeSksXG4gICAgICAgIGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KGpzb25Db250ZW50LCBudWxsLCAyKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFja3M7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFzeW5jIHN5bnRoVGVsZW1ldHJ5KFxuICAgIHRvdGFsVGltZTogbnVtYmVyLFxuICAgIHN0YWNrczogU3ludGhlc2l6ZWRTdGFja1tdLFxuICAgIHN5bnRoT3JpZ2luPzogU3ludGhPcmlnaW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlYWRDb25maWdTeW5jKCk7XG5cbiAgICBhd2FpdCBzZW5kVGVsZW1ldHJ5KFwic3ludGhcIiwge1xuICAgICAgdG90YWxUaW1lOiB0b3RhbFRpbWUsXG4gICAgICBsYW5ndWFnZTogY29uZmlnLmxhbmd1YWdlLFxuICAgICAgc3ludGhPcmlnaW4sXG4gICAgICBzdGFja01ldGFkYXRhOiBzdGFja3MubWFwKFxuICAgICAgICAoc3RhY2spID0+IEpTT04ucGFyc2Uoc3RhY2suY29udGVudClbXCIvL1wiXS5tZXRhZGF0YSxcbiAgICAgICksXG4gICAgICByZXF1aXJlZFByb3ZpZGVyczogc3RhY2tzLm1hcChcbiAgICAgICAgKHN0YWNrOiBhbnkpID0+XG4gICAgICAgICAgSlNPTi5wYXJzZShzdGFjay5jb250ZW50KVtcInRlcnJhZm9ybVwiXS5yZXF1aXJlZF9wcm92aWRlcnMsXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBzeW50aEVycm9yVGVsZW1ldHJ5KHN5bnRoT3JpZ2luPzogU3ludGhPcmlnaW4pIHtcbiAgICBhd2FpdCBzZW5kVGVsZW1ldHJ5KFwic3ludGhcIiwgeyBlcnJvcjogdHJ1ZSwgc3ludGhPcmlnaW4gfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVsYXRpdmVUZXJyYWZvcm1Nb2R1bGVzKCkge1xuICBsZXQgY2ZnO1xuXG4gIHRyeSB7XG4gICAgY2ZnID0gQ2RrdGZDb25maWcucmVhZCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLnRyYWNlKFwiQ291bGQgbm90IHJlYWQgY2RrdGYuanNvbjogXCIgKyBlKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gY2ZnLnRlcnJhZm9ybU1vZHVsZXMuZmlsdGVyKChtb2QpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIG1vZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2Quc3RhcnRzV2l0aChcIi4vXCIpIHx8IG1vZC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gICAgICA6IG1vZC5zb3VyY2Uuc3RhcnRzV2l0aChcIi4vXCIpIHx8IG1vZC5zb3VyY2Uuc3RhcnRzV2l0aChcIi4uL1wiKTtcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ import { SynthesizedStack } from "./synth-stack";
2
+ /**
3
+ * prints annotations via console
4
+ * @throws Error if an Annotation with level === ERROR has been encountered
5
+ */
6
+ export declare function printAnnotations(stacks: SynthesizedStack[]): void;
7
+ //# sourceMappingURL=synth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["synth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMjD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QA0C1D"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.printAnnotations = void 0;
27
+ const cdktn_1 = require("cdktn");
28
+ const chalk = __importStar(require("chalk"));
29
+ const chalkColour = new chalk.Instance();
30
+ /**
31
+ * prints annotations via console
32
+ * @throws Error if an Annotation with level === ERROR has been encountered
33
+ */
34
+ function printAnnotations(stacks) {
35
+ let encounteredAnnotationError = false;
36
+ stacks.forEach((stack) => (stack.annotations || []).forEach((annotation) => {
37
+ if (annotation.level === cdktn_1.AnnotationMetadataEntryType.ERROR)
38
+ encounteredAnnotationError = true;
39
+ let color = chalkColour.whiteBright;
40
+ let level = annotation.level;
41
+ switch (annotation.level) {
42
+ case cdktn_1.AnnotationMetadataEntryType.INFO: {
43
+ level = "INFO";
44
+ break;
45
+ }
46
+ case cdktn_1.AnnotationMetadataEntryType.WARN: {
47
+ color = chalkColour.hex("#FFA500"); // orange
48
+ level = "WARN";
49
+ break;
50
+ }
51
+ case cdktn_1.AnnotationMetadataEntryType.ERROR: {
52
+ color = chalkColour.redBright;
53
+ level = "ERROR";
54
+ break;
55
+ }
56
+ }
57
+ console.log(color(`${level} [${annotation.constructPath}]: ${annotation.message}`));
58
+ if (annotation.level === cdktn_1.AnnotationMetadataEntryType.ERROR &&
59
+ annotation.stacktrace)
60
+ console.log(chalkColour.gray(annotation.stacktrace.join("\n")));
61
+ }));
62
+ if (encounteredAnnotationError) {
63
+ throw new Error("While synthesizing one or more error annotations have been encountered. Please check the log output above.");
64
+ }
65
+ }
66
+ exports.printAnnotations = printAnnotations;
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzeW50aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLGlDQUFvRDtBQUNwRCw2Q0FBK0I7QUFFL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFekM7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsTUFBMEI7SUFDekQsSUFBSSwwQkFBMEIsR0FBRyxLQUFLLENBQUM7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3ZCLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUMvQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssbUNBQTJCLENBQUMsS0FBSztZQUN4RCwwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFFcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLEtBQUssR0FBVyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ3JDLFFBQVEsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pCLEtBQUssbUNBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFDZixNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssbUNBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDdEMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO2dCQUM3QyxLQUFLLEdBQUcsTUFBTSxDQUFDO2dCQUNmLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxtQ0FBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztnQkFDOUIsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDaEIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxLQUFLLENBQUMsR0FBRyxLQUFLLEtBQUssVUFBVSxDQUFDLGFBQWEsTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FDdkUsQ0FBQztRQUNGLElBQ0UsVUFBVSxDQUFDLEtBQUssS0FBSyxtQ0FBMkIsQ0FBQyxLQUFLO1lBQ3RELFVBQVUsQ0FBQyxVQUFVO1lBRXJCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUVGLElBQUksMEJBQTBCLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksS0FBSyxDQUNiLDRHQUE0RyxDQUM3RyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUExQ0QsNENBMENDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IFN5bnRoZXNpemVkU3RhY2sgfSBmcm9tIFwiLi9zeW50aC1zdGFja1wiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlIH0gZnJvbSBcImNka3RuXCI7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tIFwiY2hhbGtcIjtcblxuY29uc3QgY2hhbGtDb2xvdXIgPSBuZXcgY2hhbGsuSW5zdGFuY2UoKTtcblxuLyoqXG4gKiBwcmludHMgYW5ub3RhdGlvbnMgdmlhIGNvbnNvbGVcbiAqIEB0aHJvd3MgRXJyb3IgaWYgYW4gQW5ub3RhdGlvbiB3aXRoIGxldmVsID09PSBFUlJPUiBoYXMgYmVlbiBlbmNvdW50ZXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRBbm5vdGF0aW9ucyhzdGFja3M6IFN5bnRoZXNpemVkU3RhY2tbXSkge1xuICBsZXQgZW5jb3VudGVyZWRBbm5vdGF0aW9uRXJyb3IgPSBmYWxzZTtcblxuICBzdGFja3MuZm9yRWFjaCgoc3RhY2spID0+XG4gICAgKHN0YWNrLmFubm90YXRpb25zIHx8IFtdKS5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICBpZiAoYW5ub3RhdGlvbi5sZXZlbCA9PT0gQW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlLkVSUk9SKVxuICAgICAgICBlbmNvdW50ZXJlZEFubm90YXRpb25FcnJvciA9IHRydWU7XG5cbiAgICAgIGxldCBjb2xvciA9IGNoYWxrQ29sb3VyLndoaXRlQnJpZ2h0O1xuICAgICAgbGV0IGxldmVsOiBzdHJpbmcgPSBhbm5vdGF0aW9uLmxldmVsO1xuICAgICAgc3dpdGNoIChhbm5vdGF0aW9uLmxldmVsKSB7XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlLklORk86IHtcbiAgICAgICAgICBsZXZlbCA9IFwiSU5GT1wiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlLldBUk46IHtcbiAgICAgICAgICBjb2xvciA9IGNoYWxrQ29sb3VyLmhleChcIiNGRkE1MDBcIik7IC8vIG9yYW5nZVxuICAgICAgICAgIGxldmVsID0gXCJXQVJOXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUuRVJST1I6IHtcbiAgICAgICAgICBjb2xvciA9IGNoYWxrQ29sb3VyLnJlZEJyaWdodDtcbiAgICAgICAgICBsZXZlbCA9IFwiRVJST1JcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9yKGAke2xldmVsfSBbJHthbm5vdGF0aW9uLmNvbnN0cnVjdFBhdGh9XTogJHthbm5vdGF0aW9uLm1lc3NhZ2V9YCksXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBhbm5vdGF0aW9uLmxldmVsID09PSBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUuRVJST1IgJiZcbiAgICAgICAgYW5ub3RhdGlvbi5zdGFja3RyYWNlXG4gICAgICApXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrQ29sb3VyLmdyYXkoYW5ub3RhdGlvbi5zdGFja3RyYWNlLmpvaW4oXCJcXG5cIikpKTtcbiAgICB9KSxcbiAgKTtcblxuICBpZiAoZW5jb3VudGVyZWRBbm5vdGF0aW9uRXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIldoaWxlIHN5bnRoZXNpemluZyBvbmUgb3IgbW9yZSBlcnJvciBhbm5vdGF0aW9ucyBoYXZlIGJlZW4gZW5jb3VudGVyZWQuIFBsZWFzZSBjaGVjayB0aGUgbG9nIG91dHB1dCBhYm92ZS5cIixcbiAgICApO1xuICB9XG59XG4iXX0=