@cdktn/hcl2cdk 0.23.0-pre.7 → 0.23.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 (85) hide show
  1. package/ambient.d.ts +0 -1
  2. package/build/__tests__/coerceType.test.js +165 -0
  3. package/build/__tests__/expressionToTs.test.js +693 -0
  4. package/build/__tests__/expressions.test.js +415 -0
  5. package/build/__tests__/findExpressionType.test.js +105 -0
  6. package/build/__tests__/functions.test.js +605 -0
  7. package/build/__tests__/generation.test.js +45 -0
  8. package/build/__tests__/jsii-rosetta-workarounds.test.js +86 -0
  9. package/build/__tests__/partialCode.test.js +390 -0
  10. package/build/__tests__/terraformSchema.test.js +105 -0
  11. package/build/__tests__/testHelpers.js +16 -0
  12. package/build/coerceType.js +240 -0
  13. package/build/dynamic-blocks.js +44 -0
  14. package/build/expressions.js +633 -0
  15. package/build/function-bindings/functions.generated.js +1142 -0
  16. package/build/function-bindings/functions.js +73 -0
  17. package/{lib → build}/generation.js +4 -4
  18. package/{lib → build}/index.d.ts +2 -2
  19. package/build/index.js +364 -0
  20. package/build/iteration.js +87 -0
  21. package/build/jsii-rosetta-workarounds.js +126 -0
  22. package/build/partialCode.js +116 -0
  23. package/build/provider.js +40 -0
  24. package/build/references.js +141 -0
  25. package/build/schema.js +81 -0
  26. package/build/telemetryAllowList.json +24 -0
  27. package/build/terraformSchema.js +136 -0
  28. package/build/types.js +3 -0
  29. package/build/utils.js +25 -0
  30. package/build/variables.js +172 -0
  31. package/package.json +13 -14
  32. package/tsconfig.json +4 -2
  33. package/lib/__tests__/coerceType.test.js +0 -165
  34. package/lib/__tests__/expressionToTs.test.js +0 -693
  35. package/lib/__tests__/expressions.test.js +0 -415
  36. package/lib/__tests__/findExpressionType.test.js +0 -105
  37. package/lib/__tests__/functions.test.js +0 -605
  38. package/lib/__tests__/generation.test.js +0 -45
  39. package/lib/__tests__/jsii-rosetta-workarounds.test.js +0 -86
  40. package/lib/__tests__/partialCode.test.js +0 -390
  41. package/lib/__tests__/terraformSchema.test.js +0 -105
  42. package/lib/__tests__/testHelpers.js +0 -16
  43. package/lib/coerceType.js +0 -240
  44. package/lib/dynamic-blocks.js +0 -44
  45. package/lib/expressions.js +0 -634
  46. package/lib/function-bindings/functions.generated.js +0 -1142
  47. package/lib/function-bindings/functions.js +0 -73
  48. package/lib/index.js +0 -364
  49. package/lib/iteration.js +0 -87
  50. package/lib/jsii-rosetta-workarounds.js +0 -126
  51. package/lib/partialCode.js +0 -116
  52. package/lib/provider.js +0 -40
  53. package/lib/references.js +0 -141
  54. package/lib/schema.js +0 -81
  55. package/lib/terraformSchema.js +0 -136
  56. package/lib/types.js +0 -3
  57. package/lib/utils.js +0 -25
  58. package/lib/variables.js +0 -172
  59. /package/{lib → build}/__tests__/coerceType.test.d.ts +0 -0
  60. /package/{lib → build}/__tests__/expressionToTs.test.d.ts +0 -0
  61. /package/{lib → build}/__tests__/expressions.test.d.ts +0 -0
  62. /package/{lib → build}/__tests__/findExpressionType.test.d.ts +0 -0
  63. /package/{lib → build}/__tests__/functions.test.d.ts +0 -0
  64. /package/{lib → build}/__tests__/generation.test.d.ts +0 -0
  65. /package/{lib → build}/__tests__/jsii-rosetta-workarounds.test.d.ts +0 -0
  66. /package/{lib → build}/__tests__/partialCode.test.d.ts +0 -0
  67. /package/{lib → build}/__tests__/terraformSchema.test.d.ts +0 -0
  68. /package/{lib → build}/__tests__/testHelpers.d.ts +0 -0
  69. /package/{lib → build}/coerceType.d.ts +0 -0
  70. /package/{lib → build}/dynamic-blocks.d.ts +0 -0
  71. /package/{lib → build}/expressions.d.ts +0 -0
  72. /package/{lib → build}/function-bindings/functions.d.ts +0 -0
  73. /package/{lib → build}/function-bindings/functions.generated.d.ts +0 -0
  74. /package/{lib → build}/generation.d.ts +0 -0
  75. /package/{lib → build}/iteration.d.ts +0 -0
  76. /package/{lib → build}/jsii-rosetta-workarounds.d.ts +0 -0
  77. /package/{lib → build}/partialCode.d.ts +0 -0
  78. /package/{lib → build}/provider.d.ts +0 -0
  79. /package/{lib → build}/references.d.ts +0 -0
  80. /package/{lib → build}/schema.d.ts +0 -0
  81. /package/{lib → build}/terraformSchema.d.ts +0 -0
  82. /package/{lib → build}/types.d.ts +0 -0
  83. /package/{lib → build}/utils.d.ts +0 -0
  84. /package/{lib → build}/variables.d.ts +0 -0
  85. /package/{lib → src}/telemetryAllowList.json +0 -0
@@ -0,0 +1,415 @@
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.referenceToAst = void 0;
30
+ // Copyright (c) HashiCorp, Inc
31
+ // SPDX-License-Identifier: MPL-2.0
32
+ const generator_1 = __importDefault(require("@babel/generator"));
33
+ const t = __importStar(require("@babel/types"));
34
+ const expressions_1 = require("../expressions");
35
+ const references_1 = require("../references");
36
+ const hcl2json_1 = require("@cdktn/hcl2json");
37
+ const utils_1 = require("../utils");
38
+ const nodeIds = [
39
+ "var.input",
40
+ "module.vpc",
41
+ "data.aws_s3_bucket.examplebucket",
42
+ "aws_s3_bucket.examplebucket",
43
+ "aws_s3_bucket.otherbucket",
44
+ "var.users",
45
+ "aws_kms_key.key",
46
+ "local.service_name",
47
+ ];
48
+ // Transforms a path with segments into literals describing the path
49
+ function getPropertyAccessPath(input) {
50
+ return input
51
+ .split(/(\[|\]|\.)/g)
52
+ .filter((p) => p.length > 0 && p !== "." && p !== "[" && p !== "]")
53
+ .map((p) => (p.startsWith(`"`) && p.endsWith(`"`) ? p.slice(1, -1) : p));
54
+ }
55
+ function referenceToAst(scope, ref) {
56
+ const [resource, , ...selector] = ref.referencee.full.split(".");
57
+ const variableReference = t.identifier((0, utils_1.camelCase)((0, references_1.referenceToVariableName)(scope, ref)));
58
+ if (resource === "data") {
59
+ selector.shift(); // remove the data part so that the name is not used in the selector
60
+ }
61
+ const accessor = selector.reduce((carry, member, index) => t.memberExpression(carry, t.identifier(index === 0 && resource === "module"
62
+ ? (0, utils_1.camelCase)(member + "Output")
63
+ : (0, utils_1.camelCase)(member))), variableReference);
64
+ if (ref.useFqn) {
65
+ return t.memberExpression(accessor, t.identifier("fqn"));
66
+ }
67
+ if (ref.isVariable) {
68
+ return t.memberExpression(accessor, t.identifier("value"));
69
+ }
70
+ return accessor;
71
+ }
72
+ exports.referenceToAst = referenceToAst;
73
+ describe("expressions", () => {
74
+ describe("#extractReferencesFromExpression", () => {
75
+ it("finds no references in literals", () => {
76
+ return expect((0, references_1.extractReferencesFromExpression)("nothingtobeseen", nodeIds)).resolves.toEqual([]);
77
+ });
78
+ it("finds no references in literals with functions", () => {
79
+ return expect((0, references_1.extractReferencesFromExpression)("${foo(nothingtobeseen)}", nodeIds)).resolves.toEqual([]);
80
+ });
81
+ it("finds no references in literals with functions and artihmetics", () => {
82
+ return expect((0, references_1.extractReferencesFromExpression)("${foo(nothingtobeseen - 2) + 3}", nodeIds)).resolves.toEqual([]);
83
+ });
84
+ it("finds plain var reference", () => {
85
+ return expect((0, references_1.extractReferencesFromExpression)("${var.input}", nodeIds)).resolves.toEqual([
86
+ {
87
+ referencee: { id: "var.input", full: "var.input" },
88
+ useFqn: false,
89
+ isVariable: true,
90
+ start: 2,
91
+ end: 11,
92
+ },
93
+ ]);
94
+ });
95
+ it("finds plain module reference", () => {
96
+ return expect((0, references_1.extractReferencesFromExpression)("${module.vpc.public_subnets}", nodeIds)).resolves.toEqual([
97
+ {
98
+ referencee: {
99
+ id: "module.vpc",
100
+ full: "module.vpc.public_subnets",
101
+ },
102
+ useFqn: false,
103
+ isVariable: false,
104
+ start: 2,
105
+ end: 27,
106
+ },
107
+ ]);
108
+ });
109
+ it("finds plain data reference", () => {
110
+ return expect((0, references_1.extractReferencesFromExpression)("${data.aws_s3_bucket.examplebucket.arn}", nodeIds)).resolves.toEqual([
111
+ {
112
+ referencee: {
113
+ id: "data.aws_s3_bucket.examplebucket",
114
+ full: "data.aws_s3_bucket.examplebucket.arn",
115
+ },
116
+ useFqn: false,
117
+ isVariable: false,
118
+ start: 2,
119
+ end: 38,
120
+ },
121
+ ]);
122
+ });
123
+ it("finds plain local reference", () => {
124
+ return expect((0, references_1.extractReferencesFromExpression)("${local.service_name}", nodeIds)).resolves.toEqual([
125
+ {
126
+ referencee: {
127
+ id: "local.service_name",
128
+ full: "local.service_name",
129
+ },
130
+ useFqn: false,
131
+ isVariable: false,
132
+ start: 2,
133
+ end: 20,
134
+ },
135
+ ]);
136
+ });
137
+ it("finds plain resource reference", () => {
138
+ return expect((0, references_1.extractReferencesFromExpression)("${aws_s3_bucket.examplebucket.id}", nodeIds)).resolves.toEqual([
139
+ {
140
+ referencee: {
141
+ id: "aws_s3_bucket.examplebucket",
142
+ full: "aws_s3_bucket.examplebucket.id",
143
+ },
144
+ useFqn: false,
145
+ isVariable: false,
146
+ start: 2,
147
+ end: 32,
148
+ },
149
+ ]);
150
+ });
151
+ it("finds plain resource references in artihmetics", () => {
152
+ return expect((0, references_1.extractReferencesFromExpression)("${aws_s3_bucket.examplebucket.count + aws_s3_bucket.otherbucket.count }", nodeIds)).resolves.toEqual([
153
+ {
154
+ referencee: {
155
+ id: "aws_s3_bucket.examplebucket",
156
+ full: "aws_s3_bucket.examplebucket.count",
157
+ },
158
+ useFqn: false,
159
+ isVariable: false,
160
+ start: 2,
161
+ end: 35,
162
+ },
163
+ {
164
+ referencee: {
165
+ id: "aws_s3_bucket.otherbucket",
166
+ full: "aws_s3_bucket.otherbucket.count",
167
+ },
168
+ useFqn: false,
169
+ isVariable: false,
170
+ start: 38,
171
+ end: 69,
172
+ },
173
+ ]);
174
+ });
175
+ it("use fqn for splat reference", () => {
176
+ return expect((0, references_1.extractReferencesFromExpression)("${aws_s3_bucket.examplebucket.*.id}", nodeIds)).resolves.toEqual([
177
+ {
178
+ referencee: {
179
+ id: "aws_s3_bucket.examplebucket",
180
+ full: "aws_s3_bucket.examplebucket",
181
+ },
182
+ useFqn: true,
183
+ isVariable: false,
184
+ start: 2,
185
+ end: 29,
186
+ },
187
+ ]);
188
+ });
189
+ it("use no fqn if property is present on numeric access", () => {
190
+ return expect((0, references_1.extractReferencesFromExpression)("${aws_s3_bucket.examplebucket.network_interface.0.access_config.0.assigned_nat_ip}", nodeIds)).resolves.toEqual([
191
+ {
192
+ referencee: {
193
+ id: "aws_s3_bucket.examplebucket",
194
+ full: "aws_s3_bucket.examplebucket",
195
+ },
196
+ useFqn: true,
197
+ isVariable: false,
198
+ start: 2,
199
+ end: 81,
200
+ },
201
+ ]);
202
+ });
203
+ it("detect splat reference within function", () => {
204
+ return expect((0, references_1.extractReferencesFromExpression)("${toset(aws_s3_bucket.examplebucket.*)}", nodeIds)).resolves.toEqual([
205
+ {
206
+ referencee: {
207
+ id: "aws_s3_bucket.examplebucket",
208
+ full: "aws_s3_bucket.examplebucket",
209
+ },
210
+ useFqn: true,
211
+ isVariable: false,
212
+ start: 8,
213
+ end: 35,
214
+ },
215
+ ]);
216
+ });
217
+ it("finds all resources in conditional", () => {
218
+ return expect((0, references_1.extractReferencesFromExpression)("${aws_kms_key.key.deletion_window_in_days > 3 ? aws_s3_bucket.examplebucket.id : []}", nodeIds)).resolves.toEqual([
219
+ {
220
+ referencee: {
221
+ id: "aws_kms_key.key",
222
+ full: "aws_kms_key.key.deletion_window_in_days",
223
+ },
224
+ useFqn: false,
225
+ isVariable: false,
226
+ start: 2,
227
+ end: 41,
228
+ },
229
+ {
230
+ referencee: {
231
+ id: "aws_s3_bucket.examplebucket",
232
+ full: "aws_s3_bucket.examplebucket.id",
233
+ },
234
+ useFqn: false,
235
+ isVariable: false,
236
+ start: 48,
237
+ end: 78,
238
+ },
239
+ ]);
240
+ });
241
+ it("finds all resources in functions", () => {
242
+ return expect((0, references_1.extractReferencesFromExpression)("${element(aws_s3_bucket.examplebucket, 0).id}", nodeIds)).resolves.toEqual([
243
+ {
244
+ referencee: {
245
+ id: "aws_s3_bucket.examplebucket",
246
+ full: "aws_s3_bucket.examplebucket",
247
+ },
248
+ useFqn: false,
249
+ isVariable: false,
250
+ start: 10,
251
+ end: 37,
252
+ },
253
+ ]);
254
+ });
255
+ it("finds all resources in functions with splat", () => {
256
+ return expect((0, references_1.extractReferencesFromExpression)("${element(aws_s3_bucket.examplebucket.*.id, 0)}", nodeIds)).resolves.toEqual([
257
+ {
258
+ referencee: {
259
+ id: "aws_s3_bucket.examplebucket",
260
+ full: "aws_s3_bucket.examplebucket",
261
+ },
262
+ useFqn: true,
263
+ isVariable: false,
264
+ start: 10,
265
+ end: 37,
266
+ },
267
+ ]);
268
+ });
269
+ it("finds all resources in for loops", () => {
270
+ return expect((0, references_1.extractReferencesFromExpression)("${{ for name, user in var.users : user.role => name...}}", nodeIds)).resolves.toEqual([
271
+ {
272
+ referencee: { id: "var.users", full: "var.users" },
273
+ useFqn: false,
274
+ isVariable: true,
275
+ start: 22,
276
+ end: 31,
277
+ },
278
+ ]);
279
+ });
280
+ it("finds resources with property access", () => {
281
+ return expect((0, references_1.extractReferencesFromExpression)("${aws_s3_bucket.examplebucket[0].id}", nodeIds)).resolves.toEqual([
282
+ {
283
+ referencee: {
284
+ id: "aws_s3_bucket.examplebucket",
285
+ full: "aws_s3_bucket.examplebucket",
286
+ },
287
+ useFqn: true,
288
+ isVariable: false,
289
+ start: 2,
290
+ end: 35,
291
+ },
292
+ ]);
293
+ });
294
+ it("finds references within functions that use arrays and comments", () => {
295
+ return expect((0, references_1.extractReferencesFromExpression)(`\${compact([
296
+ # The example "bucket"
297
+ aws_s3_bucket.examplebucket,
298
+
299
+ # The "Learn" single page application. This is not configured in all environments.
300
+ var.input,
301
+ ])}`, nodeIds)).resolves.toEqual([
302
+ {
303
+ referencee: {
304
+ id: "aws_s3_bucket.examplebucket",
305
+ full: "aws_s3_bucket.examplebucket",
306
+ },
307
+ useFqn: false,
308
+ isVariable: false,
309
+ start: 59,
310
+ end: 86,
311
+ },
312
+ {
313
+ referencee: {
314
+ id: "var.input",
315
+ full: "var.input",
316
+ },
317
+ useFqn: false,
318
+ isVariable: true,
319
+ start: 204,
320
+ end: 213,
321
+ },
322
+ ]);
323
+ });
324
+ it("finds references for same referencees", () => {
325
+ return expect((0, references_1.extractReferencesFromExpression)(`\${var.input == "test" ? "azure-ad-int" : "azure-ad-\${var.input}"}`, nodeIds)).resolves.toEqual([
326
+ {
327
+ referencee: {
328
+ id: "var.input",
329
+ full: "var.input",
330
+ },
331
+ useFqn: false,
332
+ isVariable: true,
333
+ start: 2,
334
+ end: 11,
335
+ },
336
+ {
337
+ referencee: {
338
+ id: "var.input",
339
+ full: "var.input",
340
+ },
341
+ useFqn: false,
342
+ isVariable: true,
343
+ start: 53,
344
+ end: 62,
345
+ },
346
+ ]);
347
+ });
348
+ });
349
+ describe("#referenceToAst", () => {
350
+ it("property access", () => {
351
+ const scope = {
352
+ providerSchema: { format_version: "0.1" },
353
+ providerGenerator: {},
354
+ constructs: new Set(),
355
+ variables: {},
356
+ hasTokenBasedTypeCoercion: false,
357
+ nodeIds: [],
358
+ importables: [],
359
+ topLevelConfig: {},
360
+ };
361
+ expect((0, generator_1.default)(t.program([
362
+ t.expressionStatement(referenceToAst(scope, {
363
+ start: 0,
364
+ end: 0,
365
+ useFqn: false,
366
+ isVariable: false,
367
+ referencee: {
368
+ id: "aws_kms_key.key",
369
+ full: "aws_kms_key.key.deletion_window_in_days",
370
+ },
371
+ })),
372
+ ])).code).toMatchInlineSnapshot(`"key.deletionWindowInDays;"`);
373
+ });
374
+ });
375
+ describe("#iteratorVariableToAst", () => {
376
+ async function run(value) {
377
+ const scope = {
378
+ providerSchema: { format_version: "0.1" },
379
+ providerGenerator: {},
380
+ constructs: new Set(),
381
+ variables: {},
382
+ hasTokenBasedTypeCoercion: false,
383
+ nodeIds: [],
384
+ importables: [],
385
+ topLevelConfig: {},
386
+ };
387
+ const ast = await (0, hcl2json_1.getExpressionAst)("main.tf", value);
388
+ return (0, generator_1.default)(t.program([
389
+ t.expressionStatement((0, expressions_1.dynamicVariableToAst)(scope, ast.children[0], "myIterator")),
390
+ ])).code;
391
+ }
392
+ it("should convert iterator key accessor", async () => {
393
+ expect(await run('"${each.key}"')).toMatchInlineSnapshot(`"myIterator.key;"`);
394
+ });
395
+ it("should convert iterator value accessor", async () => {
396
+ expect(await run('"${each.value}"')).toMatchInlineSnapshot(`"myIterator.value;"`);
397
+ });
398
+ it("should convert iterator value deep accessor", async () => {
399
+ expect(await run('"${each.value.list.map.name}"')).toMatchInlineSnapshot(`"Fn.lookupNested(myIterator.value, ["list", "map", "name"]);"`);
400
+ });
401
+ it("should convert iterator value with map access", async () => {
402
+ expect(await run('"${each.value[0]["map"]["name"]}"')).toMatchInlineSnapshot(`"Fn.lookupNested(myIterator.value, ["[0]", "[\\"map\\"]", "[\\"name\\"]"]);"`);
403
+ });
404
+ });
405
+ describe("#getPropertyAccessPath", () => {
406
+ it.each([
407
+ [".list.map.name", ["list", "map", "name"]],
408
+ [`[0]["map"]["name"]`, ["0", "map", "name"]],
409
+ [`[0].map["name"]`, ["0", "map", "name"]],
410
+ ])("should return the correct path for %s", (input, expected) => {
411
+ expect(getPropertyAccessPath(input)).toEqual(expected);
412
+ });
413
+ });
414
+ });
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc2lvbnMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vZXhwcmVzc2lvbnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsaUVBQXdDO0FBQ3hDLGdEQUFrQztBQUNsQyxnREFBc0Q7QUFFdEQsOENBR3VCO0FBQ3ZCLDhDQUFtRDtBQUVuRCxvQ0FBcUM7QUFFckMsTUFBTSxPQUFPLEdBQUc7SUFDZCxXQUFXO0lBQ1gsWUFBWTtJQUNaLGtDQUFrQztJQUNsQyw2QkFBNkI7SUFDN0IsMkJBQTJCO0lBQzNCLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsb0JBQW9CO0NBQ3JCLENBQUM7QUFFRixvRUFBb0U7QUFDcEUsU0FBUyxxQkFBcUIsQ0FBQyxLQUFhO0lBQzFDLE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxhQUFhLENBQUM7U0FDcEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQztTQUNsRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsS0FBbUIsRUFBRSxHQUFjO0lBQ2hFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQUFBRCxFQUFHLEdBQUcs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QUU7WUFDM0QsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FDdEUsK0RBQStELENBQ2hFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM3RCxNQUFNLENBQ0osTUFBTSxHQUFHLENBQUMsbUNBQW1DLENBQUMsQ0FDL0MsQ0FBQyxxQkFBcUIsQ0FDckIsOEVBQThFLENBQy9FLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtRQUN0QyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ04sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDMUMsQ0FBQyxDQUFDLHVDQUF1QyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQzlELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0IGdlbmVyYXRlIGZyb20gXCJAYmFiZWwvZ2VuZXJhdG9yXCI7XG5pbXBvcnQgKiBhcyB0IGZyb20gXCJAYmFiZWwvdHlwZXNcIjtcbmltcG9ydCB7IGR5bmFtaWNWYXJpYWJsZVRvQXN0IH0gZnJvbSBcIi4uL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBQcm9ncmFtU2NvcGUsIFJlZmVyZW5jZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbixcbiAgcmVmZXJlbmNlVG9WYXJpYWJsZU5hbWUsXG59IGZyb20gXCIuLi9yZWZlcmVuY2VzXCI7XG5pbXBvcnQgeyBnZXRFeHByZXNzaW9uQXN0IH0gZnJvbSBcIkBjZGt0bi9oY2wyanNvblwiO1xuaW1wb3J0IHsgVEZFeHByZXNzaW9uU3ludGF4VHJlZSBhcyB0ZXggfSBmcm9tIFwiQGNka3RuL2hjbDJqc29uXCI7XG5pbXBvcnQgeyBjYW1lbENhc2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuY29uc3Qgbm9kZUlkcyA9IFtcbiAgXCJ2YXIuaW5wdXRcIixcbiAgXCJtb2R1bGUudnBjXCIsXG4gIFwiZGF0YS5hd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgXCJhd3NfczNfYnVja2V0Lm90aGVyYnVja2V0XCIsXG4gIFwidmFyLnVzZXJzXCIsXG4gIFwiYXdzX2ttc19rZXkua2V5XCIsXG4gIFwibG9jYWwuc2VydmljZV9uYW1lXCIsXG5dO1xuXG4vLyBUcmFuc2Zvcm1zIGEgcGF0aCB3aXRoIHNlZ21lbnRzIGludG8gbGl0ZXJhbHMgZGVzY3JpYmluZyB0aGUgcGF0aFxuZnVuY3Rpb24gZ2V0UHJvcGVydHlBY2Nlc3NQYXRoKGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBpbnB1dFxuICAgIC5zcGxpdCgvKFxcW3xcXF18XFwuKS9nKVxuICAgIC5maWx0ZXIoKHApID0+IHAubGVuZ3RoID4gMCAmJiBwICE9PSBcIi5cIiAmJiBwICE9PSBcIltcIiAmJiBwICE9PSBcIl1cIilcbiAgICAubWFwKChwKSA9PiAocC5zdGFydHNXaXRoKGBcImApICYmIHAuZW5kc1dpdGgoYFwiYCkgPyBwLnNsaWNlKDEsIC0xKSA6IHApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZVRvQXN0KHNjb3BlOiBQcm9ncmFtU2NvcGUsIHJlZjogUmVmZXJlbmNlKSB7XG4gIGNvbnN0IFtyZXNvdXJjZSwgLCAuLi5zZWxlY3Rvcl0gPSByZWYucmVmZXJlbmNlZS5mdWxsLnNwbGl0KFwiLlwiKTtcblxuICBjb25zdCB2YXJpYWJsZVJlZmVyZW5jZSA9IHQuaWRlbnRpZmllcihcbiAgICBjYW1lbENhc2UocmVmZXJlbmNlVG9WYXJpYWJsZU5hbWUoc2NvcGUsIHJlZikpLFxuICApO1xuXG4gIGlmIChyZXNvdXJjZSA9PT0gXCJkYXRhXCIpIHtcbiAgICBzZWxlY3Rvci5zaGlmdCgpOyAvLyByZW1vdmUgdGhlIGRhdGEgcGFydCBzbyB0aGF0IHRoZSBuYW1lIGlzIG5vdCB1c2VkIGluIHRoZSBzZWxlY3RvclxuICB9XG5cbiAgY29uc3QgYWNjZXNzb3IgPSBzZWxlY3Rvci5yZWR1Y2UoXG4gICAgKGNhcnJ5LCBtZW1iZXIsIGluZGV4KSA9PlxuICAgICAgdC5tZW1iZXJFeHByZXNzaW9uKFxuICAgICAgICBjYXJyeSxcbiAgICAgICAgdC5pZGVudGlmaWVyKFxuICAgICAgICAgIGluZGV4ID09PSAwICYmIHJlc291cmNlID09PSBcIm1vZHVsZVwiXG4gICAgICAgICAgICA/IGNhbWVsQ2FzZShtZW1iZXIgKyBcIk91dHB1dFwiKVxuICAgICAgICAgICAgOiBjYW1lbENhc2UobWVtYmVyKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgdmFyaWFibGVSZWZlcmVuY2UgYXMgdC5FeHByZXNzaW9uLFxuICApO1xuXG4gIGlmIChyZWYudXNlRnFuKSB7XG4gICAgcmV0dXJuIHQubWVtYmVyRXhwcmVzc2lvbihhY2Nlc3NvciwgdC5pZGVudGlmaWVyKFwiZnFuXCIpKTtcbiAgfVxuXG4gIGlmIChyZWYuaXNWYXJpYWJsZSkge1xuICAgIHJldHVybiB0Lm1lbWJlckV4cHJlc3Npb24oYWNjZXNzb3IsIHQuaWRlbnRpZmllcihcInZhbHVlXCIpKTtcbiAgfVxuICByZXR1cm4gYWNjZXNzb3I7XG59XG5cbmRlc2NyaWJlKFwiZXhwcmVzc2lvbnNcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcIiNleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uXCIsICgpID0+IHtcbiAgICBpdChcImZpbmRzIG5vIHJlZmVyZW5jZXMgaW4gbGl0ZXJhbHNcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcIm5vdGhpbmd0b2Jlc2VlblwiLCBub2RlSWRzKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIG5vIHJlZmVyZW5jZXMgaW4gbGl0ZXJhbHMgd2l0aCBmdW5jdGlvbnNcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcIiR7Zm9vKG5vdGhpbmd0b2Jlc2Vlbil9XCIsIG5vZGVJZHMpLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgbm8gcmVmZXJlbmNlcyBpbiBsaXRlcmFscyB3aXRoIGZ1bmN0aW9ucyBhbmQgYXJ0aWhtZXRpY3NcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7Zm9vKG5vdGhpbmd0b2Jlc2VlbiAtIDIpICsgM31cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcGxhaW4gdmFyIHJlZmVyZW5jZVwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFwiJHt2YXIuaW5wdXR9XCIsIG5vZGVJZHMpLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHsgaWQ6IFwidmFyLmlucHV0XCIsIGZ1bGw6IFwidmFyLmlucHV0XCIgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IHRydWUsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAxMSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBwbGFpbiBtb2R1bGUgcmVmZXJlbmNlXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke21vZHVsZS52cGMucHVibGljX3N1Ym5ldHN9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJtb2R1bGUudnBjXCIsXG4gICAgICAgICAgICBmdWxsOiBcIm1vZHVsZS52cGMucHVibGljX3N1Ym5ldHNcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAyNyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBwbGFpbiBkYXRhIHJlZmVyZW5jZVwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHtkYXRhLmF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5hcm59XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJkYXRhLmF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJkYXRhLmF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5hcm5cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAzOCxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBwbGFpbiBsb2NhbCByZWZlcmVuY2VcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcIiR7bG9jYWwuc2VydmljZV9uYW1lfVwiLCBub2RlSWRzKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJsb2NhbC5zZXJ2aWNlX25hbWVcIixcbiAgICAgICAgICAgIGZ1bGw6IFwibG9jYWwuc2VydmljZV9uYW1lXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogMjAsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcGxhaW4gcmVzb3VyY2UgcmVmZXJlbmNlXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke2F3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5pZH1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuaWRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAzMixcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBwbGFpbiByZXNvdXJjZSByZWZlcmVuY2VzIGluIGFydGlobWV0aWNzXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke2F3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5jb3VudCArIGF3c19zM19idWNrZXQub3RoZXJidWNrZXQuY291bnQgfVwiLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgICBmdWxsOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5jb3VudFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDM1LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX3MzX2J1Y2tldC5vdGhlcmJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0Lm90aGVyYnVja2V0LmNvdW50XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAzOCxcbiAgICAgICAgICBlbmQ6IDY5LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcInVzZSBmcW4gZm9yIHNwbGF0IHJlZmVyZW5jZVwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHthd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuKi5pZH1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogdHJ1ZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDI5LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcInVzZSBubyBmcW4gaWYgcHJvcGVydHkgaXMgcHJlc2VudCBvbiBudW1lcmljIGFjY2Vzc1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHthd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQubmV0d29ya19pbnRlcmZhY2UuMC5hY2Nlc3NfY29uZmlnLjAuYXNzaWduZWRfbmF0X2lwfVwiLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgICBmdWxsOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiB0cnVlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogODEsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZGV0ZWN0IHNwbGF0IHJlZmVyZW5jZSB3aXRoaW4gZnVuY3Rpb25cIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7dG9zZXQoYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LiopfVwiLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgICBmdWxsOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiB0cnVlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiA4LFxuICAgICAgICAgIGVuZDogMzUsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgYWxsIHJlc291cmNlcyBpbiBjb25kaXRpb25hbFwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHthd3Nfa21zX2tleS5rZXkuZGVsZXRpb25fd2luZG93X2luX2RheXMgPiAzID8gYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LmlkIDogW119XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3Nfa21zX2tleS5rZXlcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX2ttc19rZXkua2V5LmRlbGV0aW9uX3dpbmRvd19pbl9kYXlzXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogNDEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LmlkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiA0OCxcbiAgICAgICAgICBlbmQ6IDc4LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIGFsbCByZXNvdXJjZXMgaW4gZnVuY3Rpb25zXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke2VsZW1lbnQoYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LCAwKS5pZH1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDEwLFxuICAgICAgICAgIGVuZDogMzcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgYWxsIHJlc291cmNlcyBpbiBmdW5jdGlvbnMgd2l0aCBzcGxhdFwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHtlbGVtZW50KGF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC4qLmlkLCAwKX1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogdHJ1ZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMTAsXG4gICAgICAgICAgZW5kOiAzNyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBhbGwgcmVzb3VyY2VzIGluIGZvciBsb29wc1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHt7IGZvciBuYW1lLCB1c2VyIGluIHZhci51c2VycyA6IHVzZXIucm9sZSA9PiBuYW1lLi4ufX1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHsgaWQ6IFwidmFyLnVzZXJzXCIsIGZ1bGw6IFwidmFyLnVzZXJzXCIgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IHRydWUsXG4gICAgICAgICAgc3RhcnQ6IDIyLFxuICAgICAgICAgIGVuZDogMzEsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcmVzb3VyY2VzIHdpdGggcHJvcGVydHkgYWNjZXNzXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke2F3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFswXS5pZH1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogdHJ1ZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDM1LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIHJlZmVyZW5jZXMgd2l0aGluIGZ1bmN0aW9ucyB0aGF0IHVzZSBhcnJheXMgYW5kIGNvbW1lbnRzXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgYFxcJHtjb21wYWN0KFtcbiAgICAgICAgICAgICMgVGhlIGV4YW1wbGUgXCJidWNrZXRcIlxuICAgICAgICAgICAgYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LFxuICAgICAgICBcbiAgICAgICAgICAgICMgVGhlIFwiTGVhcm5cIiBzaW5nbGUgcGFnZSBhcHBsaWNhdGlvbi4gVGhpcyBpcyBub3QgY29uZmlndXJlZCBpbiBhbGwgZW52aXJvbm1lbnRzLlxuICAgICAgICAgICAgdmFyLmlucHV0LFxuICAgICAgICAgIF0pfWAsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiA1OSxcbiAgICAgICAgICBlbmQ6IDg2LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwidmFyLmlucHV0XCIsXG4gICAgICAgICAgICBmdWxsOiBcInZhci5pbnB1dFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiB0cnVlLFxuICAgICAgICAgIHN0YXJ0OiAyMDQsXG4gICAgICAgICAgZW5kOiAyMTMsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcmVmZXJlbmNlcyBmb3Igc2FtZSByZWZlcmVuY2Vlc1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIGBcXCR7dmFyLmlucHV0ID09IFwidGVzdFwiID8gXCJhenVyZS1hZC1pbnRcIiA6IFwiYXp1cmUtYWQtXFwke3Zhci5pbnB1dH1cIn1gLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwidmFyLmlucHV0XCIsXG4gICAgICAgICAgICBmdWxsOiBcInZhci5pbnB1dFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiB0cnVlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogMTEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJ2YXIuaW5wdXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwidmFyLmlucHV0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IHRydWUsXG4gICAgICAgICAgc3RhcnQ6IDUzLFxuICAgICAgICAgIGVuZDogNjIsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCIjcmVmZXJlbmNlVG9Bc3RcIiwgKCkgPT4ge1xuICAgIGl0KFwicHJvcGVydHkgYWNjZXNzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlOiBQcm9ncmFtU2NvcGUgPSB7XG4gICAgICAgIHByb3ZpZGVyU2NoZW1hOiB7IGZvcm1hdF92ZXJzaW9uOiBcIjAuMVwiIH0sXG4gICAgICAgIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgICAgICAgY29uc3RydWN0czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICAgIGhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb246IGZhbHNlLFxuICAgICAgICBub2RlSWRzOiBbXSxcbiAgICAgICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgICAgICB0b3BMZXZlbENvbmZpZzoge30sXG4gICAgICB9O1xuICAgICAgZXhwZWN0KFxuICAgICAgICBnZW5lcmF0ZShcbiAgICAgICAgICB0LnByb2dyYW0oW1xuICAgICAgICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICAgICAgICByZWZlcmVuY2VUb0FzdChzY29wZSwge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiAwLFxuICAgICAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgICAgICAgIGlkOiBcImF3c19rbXNfa2V5LmtleVwiLFxuICAgICAgICAgICAgICAgICAgZnVsbDogXCJhd3Nfa21zX2tleS5rZXkuZGVsZXRpb25fd2luZG93X2luX2RheXNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSkgYXMgYW55LFxuICAgICAgICApLmNvZGUsXG4gICAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXCJrZXkuZGVsZXRpb25XaW5kb3dJbkRheXM7XCJgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCIjaXRlcmF0b3JWYXJpYWJsZVRvQXN0XCIsICgpID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBydW4odmFsdWU6IHN0cmluZykge1xuICAgICAgY29uc3Qgc2NvcGU6IFByb2dyYW1TY29wZSA9IHtcbiAgICAgICAgcHJvdmlkZXJTY2hlbWE6IHsgZm9ybWF0X3ZlcnNpb246IFwiMC4xXCIgfSxcbiAgICAgICAgcHJvdmlkZXJHZW5lcmF0b3I6IHt9LFxuICAgICAgICBjb25zdHJ1Y3RzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgICAgaGFzVG9rZW5CYXNlZFR5cGVDb2VyY2lvbjogZmFsc2UsXG4gICAgICAgIG5vZGVJZHM6IFtdLFxuICAgICAgICBpbXBvcnRhYmxlczogW10sXG4gICAgICAgIHRvcExldmVsQ29uZmlnOiB7fSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhc3QgPSBhd2FpdCBnZXRFeHByZXNzaW9uQXN0KFwibWFpbi50ZlwiLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gZ2VuZXJhdGUoXG4gICAgICAgIHQucHJvZ3JhbShbXG4gICAgICAgICAgdC5leHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgICAgICAgZHluYW1pY1ZhcmlhYmxlVG9Bc3QoXG4gICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICBhc3QhLmNoaWxkcmVuWzBdIGFzIHRleC5TY29wZVRyYXZlcnNhbEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgIFwibXlJdGVyYXRvclwiLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICBdKSBhcyBhbnksXG4gICAgICApLmNvZGU7XG4gICAgfVxuXG4gICAgaXQoXCJzaG91bGQgY29udmVydCBpdGVyYXRvciBrZXkgYWNjZXNzb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KGF3YWl0IHJ1bignXCIke2VhY2gua2V5fVwiJykpLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgICAgYFwibXlJdGVyYXRvci5rZXk7XCJgLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNvbnZlcnQgaXRlcmF0b3IgdmFsdWUgYWNjZXNzb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KGF3YWl0IHJ1bignXCIke2VhY2gudmFsdWV9XCInKSkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJteUl0ZXJhdG9yLnZhbHVlO1wiYCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjb252ZXJ0IGl0ZXJhdG9yIHZhbHVlIGRlZXAgYWNjZXNzb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgZXhwZWN0KGF3YWl0IHJ1bignXCIke2VhY2gudmFsdWUubGlzdC5tYXAubmFtZX1cIicpKS50b01hdGNoSW5saW5lU25hcHNob3QoXG4gICAgICAgIGBcIkZuLmxvb2t1cE5lc3RlZChteUl0ZXJhdG9yLnZhbHVlLCBbXCJsaXN0XCIsIFwibWFwXCIsIFwibmFtZVwiXSk7XCJgLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNvbnZlcnQgaXRlcmF0b3IgdmFsdWUgd2l0aCBtYXAgYWNjZXNzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgYXdhaXQgcnVuKCdcIiR7ZWFjaC52YWx1ZVswXVtcIm1hcFwiXVtcIm5hbWVcIl19XCInKSxcbiAgICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJGbi5sb29rdXBOZXN0ZWQobXlJdGVyYXRvci52YWx1ZSwgW1wiWzBdXCIsIFwiW1xcXFxcIm1hcFxcXFxcIl1cIiwgXCJbXFxcXFwibmFtZVxcXFxcIl1cIl0pO1wiYCxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiI2dldFByb3BlcnR5QWNjZXNzUGF0aFwiLCAoKSA9PiB7XG4gICAgaXQuZWFjaChbXG4gICAgICBbXCIubGlzdC5tYXAubmFtZVwiLCBbXCJsaXN0XCIsIFwibWFwXCIsIFwibmFtZVwiXV0sXG4gICAgICBbYFswXVtcIm1hcFwiXVtcIm5hbWVcIl1gLCBbXCIwXCIsIFwibWFwXCIsIFwibmFtZVwiXV0sXG4gICAgICBbYFswXS5tYXBbXCJuYW1lXCJdYCwgW1wiMFwiLCBcIm1hcFwiLCBcIm5hbWVcIl1dLFxuICAgIF0pKFwic2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBwYXRoIGZvciAlc1wiLCAoaW5wdXQsIGV4cGVjdGVkKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0UHJvcGVydHlBY2Nlc3NQYXRoKGlucHV0KSkudG9FcXVhbChleHBlY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) HashiCorp, Inc.
4
+ * SPDX-License-Identifier: MPL-2.0
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const expressions_1 = require("../expressions");
8
+ const coerceType_1 = require("../coerceType");
9
+ const s3BucketSchema = {
10
+ format_version: "1.0",
11
+ provider_schemas: {
12
+ "registry.terraform.io/hashicorp/aws": {
13
+ provider: {},
14
+ resource_schemas: {
15
+ aws_s3_bucket: {
16
+ version: 0,
17
+ block: {
18
+ attributes: {
19
+ bucket: {
20
+ type: "string",
21
+ description_kind: "plain",
22
+ optional: true,
23
+ computed: true,
24
+ },
25
+ id: {
26
+ type: "string",
27
+ description_kind: "plain",
28
+ optional: true,
29
+ computed: true,
30
+ },
31
+ tags: {
32
+ type: ["map", "string"],
33
+ description_kind: "plain",
34
+ optional: true,
35
+ },
36
+ website_domain: {
37
+ type: "string",
38
+ description_kind: "plain",
39
+ deprecated: true,
40
+ computed: true,
41
+ },
42
+ website_endpoint: {
43
+ type: "string",
44
+ description_kind: "plain",
45
+ deprecated: true,
46
+ computed: true,
47
+ },
48
+ },
49
+ block_types: {
50
+ cors_rule: {
51
+ nesting_mode: "list",
52
+ block: {
53
+ attributes: {
54
+ allowed_headers: {
55
+ type: ["list", "string"],
56
+ description_kind: "plain",
57
+ optional: true,
58
+ },
59
+ },
60
+ description_kind: "plain",
61
+ deprecated: true,
62
+ },
63
+ },
64
+ },
65
+ },
66
+ },
67
+ },
68
+ data_source_schemas: {},
69
+ },
70
+ },
71
+ };
72
+ const variable = (fullName) => {
73
+ const [resource, variableName] = fullName.split(".");
74
+ return {
75
+ [variableName]: {
76
+ resource,
77
+ variableName,
78
+ },
79
+ };
80
+ };
81
+ const variables = {
82
+ ...variable("var.test"),
83
+ ...variable("aws_s3_bucket.examplebucket"),
84
+ };
85
+ describe("findExpressionType", () => {
86
+ it.each([
87
+ ['"${each.key}"', "string"],
88
+ ['"${each.value}"', "string"],
89
+ ['"${var.test}"', "dynamic"],
90
+ ['"${var.test}"', "dynamic"],
91
+ ["22", "number"],
92
+ ["true", "bool"],
93
+ ['"hello"', "string"],
94
+ ['"${aws_s3_bucket.examplebucket.bucket}"', "string"],
95
+ ])("finds type for %s as %s", async (input, expected) => {
96
+ const scope = {
97
+ variables,
98
+ providerSchema: s3BucketSchema,
99
+ };
100
+ const ast = await (0, expressions_1.convertTerraformExpressionToTs)(scope, input, () => "dynamic");
101
+ const result = (0, coerceType_1.findExpressionType)(scope, ast);
102
+ expect(result).toEqual(expected);
103
+ });
104
+ });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZEV4cHJlc3Npb25UeXBlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX190ZXN0c19fL2ZpbmRFeHByZXNzaW9uVHlwZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7O0FBRUgsZ0RBQWdFO0FBQ2hFLDhDQUFtRDtBQUVuRCxNQUFNLGNBQWMsR0FBRztJQUNyQixjQUFjLEVBQUUsS0FBSztJQUNyQixnQkFBZ0IsRUFBRTtRQUNoQixxQ0FBcUMsRUFBRTtZQUNyQyxRQUFRLEVBQUUsRUFBRTtZQUNaLGdCQUFnQixFQUFFO2dCQUNoQixhQUFhLEVBQUU7b0JBQ2IsT0FBTyxFQUFFLENBQUM7b0JBQ1YsS0FBSyxFQUFFO3dCQUNMLFVBQVUsRUFBRTs0QkFDVixNQUFNLEVBQUU7Z0NBQ04sSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsZ0JBQWdCLEVBQUUsT0FBTztnQ0FDekIsUUFBUSxFQUFFLElBQUk7Z0NBQ2QsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7NEJBQ0QsRUFBRSxFQUFFO2dDQUNGLElBQUksRUFBRSxRQUFRO2dDQUNkLGdCQUFnQixFQUFFLE9BQU87Z0NBQ3pCLFFBQVEsRUFBRSxJQUFJO2dDQUNkLFFBQVEsRUFBRSxJQUFJOzZCQUNmOzRCQUNELElBQUksRUFBRTtnQ0FDSixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO2dDQUN2QixnQkFBZ0IsRUFBRSxPQUFPO2dDQUN6QixRQUFRLEVBQUUsSUFBSTs2QkFDZjs0QkFDRCxjQUFjLEVBQUU7Z0NBQ2QsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsZ0JBQWdCLEVBQUUsT0FBTztnQ0FDekIsVUFBVSxFQUFFLElBQUk7Z0NBQ2hCLFFBQVEsRUFBRSxJQUFJOzZCQUNmOzRCQUNELGdCQUFnQixFQUFFO2dDQUNoQixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxnQkFBZ0IsRUFBRSxPQUFPO2dDQUN6QixVQUFVLEVBQUUsSUFBSTtnQ0FDaEIsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7eUJBQ0Y7d0JBQ0QsV0FBVyxFQUFFOzRCQUNYLFNBQVMsRUFBRTtnQ0FDVCxZQUFZLEVBQUUsTUFBTTtnQ0FDcEIsS0FBSyxFQUFFO29DQUNMLFVBQVUsRUFBRTt3Q0FDVixlQUFlLEVBQUU7NENBQ2YsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQzs0Q0FDeEIsZ0JBQWdCLEVBQUUsT0FBTzs0Q0FDekIsUUFBUSxFQUFFLElBQUk7eUNBQ2Y7cUNBQ0Y7b0NBQ0QsZ0JBQWdCLEVBQUUsT0FBTztvQ0FDekIsVUFBVSxFQUFFLElBQUk7aUNBQ2pCOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7WUFDRCxtQkFBbUIsRUFBRSxFQUFFO1NBQ3hCO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDcEMsTUFBTSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELE9BQU87UUFDTCxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2QsUUFBUTtZQUNSLFlBQVk7U0FDYjtLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRztJQUNoQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7SUFDdkIsR0FBRyxRQUFRLENBQUMsNkJBQTZCLENBQUM7Q0FDM0MsQ0FBQztBQUVGLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNOLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQztRQUMzQixDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQztRQUM3QixDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUM7UUFDNUIsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDO1FBQzVCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUNoQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDaEIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO1FBQ3JCLENBQUMseUNBQXlDLEVBQUUsUUFBUSxDQUFDO0tBQ3RELENBQUMsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3RELE1BQU0sS0FBSyxHQUFHO1lBQ1osU0FBUztZQUNULGNBQWMsRUFBRSxjQUFjO1NBQy9CLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEsNENBQThCLEVBQzlDLEtBQVksRUFDWixLQUFLLEVBQ0wsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUNoQixDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBQSwrQkFBa0IsRUFBQyxLQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG5pbXBvcnQgeyBjb252ZXJ0VGVycmFmb3JtRXhwcmVzc2lvblRvVHMgfSBmcm9tIFwiLi4vZXhwcmVzc2lvbnNcIjtcbmltcG9ydCB7IGZpbmRFeHByZXNzaW9uVHlwZSB9IGZyb20gXCIuLi9jb2VyY2VUeXBlXCI7XG5cbmNvbnN0IHMzQnVja2V0U2NoZW1hID0ge1xuICBmb3JtYXRfdmVyc2lvbjogXCIxLjBcIixcbiAgcHJvdmlkZXJfc2NoZW1hczoge1xuICAgIFwicmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NcIjoge1xuICAgICAgcHJvdmlkZXI6IHt9LFxuICAgICAgcmVzb3VyY2Vfc2NoZW1hczoge1xuICAgICAgICBhd3NfczNfYnVja2V0OiB7XG4gICAgICAgICAgdmVyc2lvbjogMCxcbiAgICAgICAgICBibG9jazoge1xuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBidWNrZXQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2tpbmQ6IFwicGxhaW5cIixcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2tpbmQ6IFwicGxhaW5cIixcbiAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGFnczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFtcIm1hcFwiLCBcInN0cmluZ1wiXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9raW5kOiBcInBsYWluXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdlYnNpdGVfZG9tYWluOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9raW5kOiBcInBsYWluXCIsXG4gICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgd2Vic2l0ZV9lbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fa2luZDogXCJwbGFpblwiLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvY2tfdHlwZXM6IHtcbiAgICAgICAgICAgICAgY29yc19ydWxlOiB7XG4gICAgICAgICAgICAgICAgbmVzdGluZ19tb2RlOiBcImxpc3RcIixcbiAgICAgICAgICAgICAgICBibG9jazoge1xuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkX2hlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBbXCJsaXN0XCIsIFwic3RyaW5nXCJdLFxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2tpbmQ6IFwicGxhaW5cIixcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9raW5kOiBcInBsYWluXCIsXG4gICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGF0YV9zb3VyY2Vfc2NoZW1hczoge30sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHZhcmlhYmxlID0gKGZ1bGxOYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW3Jlc291cmNlLCB2YXJpYWJsZU5hbWVdID0gZnVsbE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4ge1xuICAgIFt2YXJpYWJsZU5hbWVdOiB7XG4gICAgICByZXNvdXJjZSxcbiAgICAgIHZhcmlhYmxlTmFtZSxcbiAgICB9LFxuICB9O1xufTtcblxuY29uc3QgdmFyaWFibGVzID0ge1xuICAuLi52YXJpYWJsZShcInZhci50ZXN0XCIpLFxuICAuLi52YXJpYWJsZShcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiKSxcbn07XG5cbmRlc2NyaWJlKFwiZmluZEV4cHJlc3Npb25UeXBlXCIsICgpID0+IHtcbiAgaXQuZWFjaChbXG4gICAgWydcIiR7ZWFjaC5rZXl9XCInLCBcInN0cmluZ1wiXSxcbiAgICBbJ1wiJHtlYWNoLnZhbHVlfVwiJywgXCJzdHJpbmdcIl0sXG4gICAgWydcIiR7dmFyLnRlc3R9XCInLCBcImR5bmFtaWNcIl0sXG4gICAgWydcIiR7dmFyLnRlc3R9XCInLCBcImR5bmFtaWNcIl0sXG4gICAgW1wiMjJcIiwgXCJudW1iZXJcIl0sXG4gICAgW1widHJ1ZVwiLCBcImJvb2xcIl0sXG4gICAgWydcImhlbGxvXCInLCBcInN0cmluZ1wiXSxcbiAgICBbJ1wiJHthd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuYnVja2V0fVwiJywgXCJzdHJpbmdcIl0sXG4gIF0pKFwiZmluZHMgdHlwZSBmb3IgJXMgYXMgJXNcIiwgYXN5bmMgKGlucHV0LCBleHBlY3RlZCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0ge1xuICAgICAgdmFyaWFibGVzLFxuICAgICAgcHJvdmlkZXJTY2hlbWE6IHMzQnVja2V0U2NoZW1hLFxuICAgIH07XG4gICAgY29uc3QgYXN0ID0gYXdhaXQgY29udmVydFRlcnJhZm9ybUV4cHJlc3Npb25Ub1RzKFxuICAgICAgc2NvcGUgYXMgYW55LFxuICAgICAgaW5wdXQsXG4gICAgICAoKSA9PiBcImR5bmFtaWNcIixcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZpbmRFeHByZXNzaW9uVHlwZShzY29wZSBhcyBhbnksIGFzdCk7XG5cbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcbiJdfQ==