@cdktn/hcl2cdk 0.22.0-pre.2

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 (61) hide show
  1. package/README.md +95 -0
  2. package/ambient.d.ts +14 -0
  3. package/jest.config.js +16 -0
  4. package/lib/__tests__/coerceType.test.d.ts +2 -0
  5. package/lib/__tests__/coerceType.test.js +165 -0
  6. package/lib/__tests__/expressionToTs.test.d.ts +6 -0
  7. package/lib/__tests__/expressionToTs.test.js +693 -0
  8. package/lib/__tests__/expressions.test.d.ts +4 -0
  9. package/lib/__tests__/expressions.test.js +415 -0
  10. package/lib/__tests__/findExpressionType.test.d.ts +6 -0
  11. package/lib/__tests__/findExpressionType.test.js +105 -0
  12. package/lib/__tests__/functions.test.d.ts +6 -0
  13. package/lib/__tests__/functions.test.js +605 -0
  14. package/lib/__tests__/generation.test.d.ts +6 -0
  15. package/lib/__tests__/generation.test.js +45 -0
  16. package/lib/__tests__/jsii-rosetta-workarounds.test.d.ts +2 -0
  17. package/lib/__tests__/jsii-rosetta-workarounds.test.js +86 -0
  18. package/lib/__tests__/partialCode.test.d.ts +6 -0
  19. package/lib/__tests__/partialCode.test.js +390 -0
  20. package/lib/__tests__/terraformSchema.test.d.ts +6 -0
  21. package/lib/__tests__/terraformSchema.test.js +105 -0
  22. package/lib/__tests__/testHelpers.d.ts +7 -0
  23. package/lib/__tests__/testHelpers.js +16 -0
  24. package/lib/coerceType.d.ts +7 -0
  25. package/lib/coerceType.js +240 -0
  26. package/lib/dynamic-blocks.d.ts +8 -0
  27. package/lib/dynamic-blocks.js +44 -0
  28. package/lib/expressions.d.ts +9 -0
  29. package/lib/expressions.js +634 -0
  30. package/lib/function-bindings/functions.d.ts +31 -0
  31. package/lib/function-bindings/functions.generated.d.ts +806 -0
  32. package/lib/function-bindings/functions.generated.js +1142 -0
  33. package/lib/function-bindings/functions.js +73 -0
  34. package/lib/generation.d.ts +26 -0
  35. package/lib/generation.js +676 -0
  36. package/lib/index.d.ts +136 -0
  37. package/lib/index.js +364 -0
  38. package/lib/iteration.d.ts +23 -0
  39. package/lib/iteration.js +87 -0
  40. package/lib/jsii-rosetta-workarounds.d.ts +5 -0
  41. package/lib/jsii-rosetta-workarounds.js +126 -0
  42. package/lib/partialCode.d.ts +11 -0
  43. package/lib/partialCode.js +116 -0
  44. package/lib/provider.d.ts +8 -0
  45. package/lib/provider.js +40 -0
  46. package/lib/references.d.ts +11 -0
  47. package/lib/references.js +141 -0
  48. package/lib/schema.d.ts +297 -0
  49. package/lib/schema.js +81 -0
  50. package/lib/telemetryAllowList.json +24 -0
  51. package/lib/terraformSchema.d.ts +6 -0
  52. package/lib/terraformSchema.js +136 -0
  53. package/lib/types.d.ts +50 -0
  54. package/lib/types.js +3 -0
  55. package/lib/utils.d.ts +6 -0
  56. package/lib/utils.js +25 -0
  57. package/lib/variables.d.ts +10 -0
  58. package/lib/variables.js +172 -0
  59. package/package.json +71 -0
  60. package/package.sh +9 -0
  61. package/tsconfig.json +42 -0
@@ -0,0 +1,4 @@
1
+ import * as t from "@babel/types";
2
+ import { ProgramScope, Reference } from "../types";
3
+ export declare function referenceToAst(scope: ProgramScope, ref: Reference): t.Expression;
4
+ //# sourceMappingURL=expressions.test.d.ts.map
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc2lvbnMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4cHJlc3Npb25zLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLGlFQUF3QztBQUN4QyxnREFBa0M7QUFDbEMsZ0RBQXNEO0FBRXRELDhDQUd1QjtBQUN2Qiw4Q0FBbUQ7QUFFbkQsb0NBQXFDO0FBRXJDLE1BQU0sT0FBTyxHQUFHO0lBQ2QsV0FBVztJQUNYLFlBQVk7SUFDWixrQ0FBa0M7SUFDbEMsNkJBQTZCO0lBQzdCLDJCQUEyQjtJQUMzQixXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLG9CQUFvQjtDQUNyQixDQUFDO0FBRUYsb0VBQW9FO0FBQ3BFLFNBQVMscUJBQXFCLENBQUMsS0FBYTtJQUMxQyxPQUFPLEtBQUs7U0FDVCxLQUFLLENBQUMsYUFBYSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7U0FDbEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEtBQW1CLEVBQUUsR0FBYztJQUNoRSxNQUFNLENBQUMsUUFBUSxFQUFFLEFBQUQsRUFBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcs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QUFNLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQ3RFLCtEQUErRCxDQUNoRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0QsTUFBTSxDQUNKLE1BQU0sR0FBRyxDQUFDLG1DQUFtQyxDQUFDLENBQy9DLENBQUMscUJBQXFCLENBQ3JCLDhFQUE4RSxDQUMvRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7UUFDdEMsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNOLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzFDLENBQUMsQ0FBQyx1Q0FBdUMsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUM5RCxNQUFNLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCBnZW5lcmF0ZSBmcm9tIFwiQGJhYmVsL2dlbmVyYXRvclwiO1xuaW1wb3J0ICogYXMgdCBmcm9tIFwiQGJhYmVsL3R5cGVzXCI7XG5pbXBvcnQgeyBkeW5hbWljVmFyaWFibGVUb0FzdCB9IGZyb20gXCIuLi9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgUHJvZ3JhbVNjb3BlLCBSZWZlcmVuY2UgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24sXG4gIHJlZmVyZW5jZVRvVmFyaWFibGVOYW1lLFxufSBmcm9tIFwiLi4vcmVmZXJlbmNlc1wiO1xuaW1wb3J0IHsgZ2V0RXhwcmVzc2lvbkFzdCB9IGZyb20gXCJAY2RrdG4vaGNsMmpzb25cIjtcbmltcG9ydCB7IFRGRXhwcmVzc2lvblN5bnRheFRyZWUgYXMgdGV4IH0gZnJvbSBcIkBjZGt0bi9oY2wyanNvblwiO1xuaW1wb3J0IHsgY2FtZWxDYXNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmNvbnN0IG5vZGVJZHMgPSBbXG4gIFwidmFyLmlucHV0XCIsXG4gIFwibW9kdWxlLnZwY1wiLFxuICBcImRhdGEuYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gIFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gIFwiYXdzX3MzX2J1Y2tldC5vdGhlcmJ1Y2tldFwiLFxuICBcInZhci51c2Vyc1wiLFxuICBcImF3c19rbXNfa2V5LmtleVwiLFxuICBcImxvY2FsLnNlcnZpY2VfbmFtZVwiLFxuXTtcblxuLy8gVHJhbnNmb3JtcyBhIHBhdGggd2l0aCBzZWdtZW50cyBpbnRvIGxpdGVyYWxzIGRlc2NyaWJpbmcgdGhlIHBhdGhcbmZ1bmN0aW9uIGdldFByb3BlcnR5QWNjZXNzUGF0aChpbnB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gaW5wdXRcbiAgICAuc3BsaXQoLyhcXFt8XFxdfFxcLikvZylcbiAgICAuZmlsdGVyKChwKSA9PiBwLmxlbmd0aCA+IDAgJiYgcCAhPT0gXCIuXCIgJiYgcCAhPT0gXCJbXCIgJiYgcCAhPT0gXCJdXCIpXG4gICAgLm1hcCgocCkgPT4gKHAuc3RhcnRzV2l0aChgXCJgKSAmJiBwLmVuZHNXaXRoKGBcImApID8gcC5zbGljZSgxLCAtMSkgOiBwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWZlcmVuY2VUb0FzdChzY29wZTogUHJvZ3JhbVNjb3BlLCByZWY6IFJlZmVyZW5jZSkge1xuICBjb25zdCBbcmVzb3VyY2UsICwgLi4uc2VsZWN0b3JdID0gcmVmLnJlZmVyZW5jZWUuZnVsbC5zcGxpdChcIi5cIik7XG5cbiAgY29uc3QgdmFyaWFibGVSZWZlcmVuY2UgPSB0LmlkZW50aWZpZXIoXG4gICAgY2FtZWxDYXNlKHJlZmVyZW5jZVRvVmFyaWFibGVOYW1lKHNjb3BlLCByZWYpKSxcbiAgKTtcblxuICBpZiAocmVzb3VyY2UgPT09IFwiZGF0YVwiKSB7XG4gICAgc2VsZWN0b3Iuc2hpZnQoKTsgLy8gcmVtb3ZlIHRoZSBkYXRhIHBhcnQgc28gdGhhdCB0aGUgbmFtZSBpcyBub3QgdXNlZCBpbiB0aGUgc2VsZWN0b3JcbiAgfVxuXG4gIGNvbnN0IGFjY2Vzc29yID0gc2VsZWN0b3IucmVkdWNlKFxuICAgIChjYXJyeSwgbWVtYmVyLCBpbmRleCkgPT5cbiAgICAgIHQubWVtYmVyRXhwcmVzc2lvbihcbiAgICAgICAgY2FycnksXG4gICAgICAgIHQuaWRlbnRpZmllcihcbiAgICAgICAgICBpbmRleCA9PT0gMCAmJiByZXNvdXJjZSA9PT0gXCJtb2R1bGVcIlxuICAgICAgICAgICAgPyBjYW1lbENhc2UobWVtYmVyICsgXCJPdXRwdXRcIilcbiAgICAgICAgICAgIDogY2FtZWxDYXNlKG1lbWJlciksXG4gICAgICAgICksXG4gICAgICApLFxuICAgIHZhcmlhYmxlUmVmZXJlbmNlIGFzIHQuRXhwcmVzc2lvbixcbiAgKTtcblxuICBpZiAocmVmLnVzZUZxbikge1xuICAgIHJldHVybiB0Lm1lbWJlckV4cHJlc3Npb24oYWNjZXNzb3IsIHQuaWRlbnRpZmllcihcImZxblwiKSk7XG4gIH1cblxuICBpZiAocmVmLmlzVmFyaWFibGUpIHtcbiAgICByZXR1cm4gdC5tZW1iZXJFeHByZXNzaW9uKGFjY2Vzc29yLCB0LmlkZW50aWZpZXIoXCJ2YWx1ZVwiKSk7XG4gIH1cbiAgcmV0dXJuIGFjY2Vzc29yO1xufVxuXG5kZXNjcmliZShcImV4cHJlc3Npb25zXCIsICgpID0+IHtcbiAgZGVzY3JpYmUoXCIjZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJmaW5kcyBubyByZWZlcmVuY2VzIGluIGxpdGVyYWxzXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXCJub3RoaW5ndG9iZXNlZW5cIiwgbm9kZUlkcyksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBubyByZWZlcmVuY2VzIGluIGxpdGVyYWxzIHdpdGggZnVuY3Rpb25zXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXCIke2Zvbyhub3RoaW5ndG9iZXNlZW4pfVwiLCBub2RlSWRzKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIG5vIHJlZmVyZW5jZXMgaW4gbGl0ZXJhbHMgd2l0aCBmdW5jdGlvbnMgYW5kIGFydGlobWV0aWNzXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke2Zvbyhub3RoaW5ndG9iZXNlZW4gLSAyKSArIDN9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIHBsYWluIHZhciByZWZlcmVuY2VcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcIiR7dmFyLmlucHV0fVwiLCBub2RlSWRzKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7IGlkOiBcInZhci5pbnB1dFwiLCBmdWxsOiBcInZhci5pbnB1dFwiIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiB0cnVlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogMTEsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcGxhaW4gbW9kdWxlIHJlZmVyZW5jZVwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHttb2R1bGUudnBjLnB1YmxpY19zdWJuZXRzfVwiLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwibW9kdWxlLnZwY1wiLFxuICAgICAgICAgICAgZnVsbDogXCJtb2R1bGUudnBjLnB1YmxpY19zdWJuZXRzXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogMjcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcGxhaW4gZGF0YSByZWZlcmVuY2VcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7ZGF0YS5hd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuYXJufVwiLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiZGF0YS5hd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiZGF0YS5hd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuYXJuXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogMzgsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcGxhaW4gbG9jYWwgcmVmZXJlbmNlXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXCIke2xvY2FsLnNlcnZpY2VfbmFtZX1cIiwgbm9kZUlkcyksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwibG9jYWwuc2VydmljZV9uYW1lXCIsXG4gICAgICAgICAgICBmdWxsOiBcImxvY2FsLnNlcnZpY2VfbmFtZVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDIwLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIHBsYWluIHJlc291cmNlIHJlZmVyZW5jZVwiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHthd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuaWR9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LmlkXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAyLFxuICAgICAgICAgIGVuZDogMzIsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgcGxhaW4gcmVzb3VyY2UgcmVmZXJlbmNlcyBpbiBhcnRpaG1ldGljc1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHthd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuY291bnQgKyBhd3NfczNfYnVja2V0Lm90aGVyYnVja2V0LmNvdW50IH1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuY291bnRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAzNSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQub3RoZXJidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5vdGhlcmJ1Y2tldC5jb3VudFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMzgsXG4gICAgICAgICAgZW5kOiA2OSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ1c2UgZnFuIGZvciBzcGxhdCByZWZlcmVuY2VcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7YXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LiouaWR9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IHRydWUsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAyOSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ1c2Ugbm8gZnFuIGlmIHByb3BlcnR5IGlzIHByZXNlbnQgb24gbnVtZXJpYyBhY2Nlc3NcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7YXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0Lm5ldHdvcmtfaW50ZXJmYWNlLjAuYWNjZXNzX2NvbmZpZy4wLmFzc2lnbmVkX25hdF9pcH1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogdHJ1ZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDgxLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImRldGVjdCBzcGxhdCByZWZlcmVuY2Ugd2l0aGluIGZ1bmN0aW9uXCIsICgpID0+IHtcbiAgICAgIHJldHVybiBleHBlY3QoXG4gICAgICAgIGV4dHJhY3RSZWZlcmVuY2VzRnJvbUV4cHJlc3Npb24oXG4gICAgICAgICAgXCIke3Rvc2V0KGF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC4qKX1cIixcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgICAgZnVsbDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogdHJ1ZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogOCxcbiAgICAgICAgICBlbmQ6IDM1LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIGFsbCByZXNvdXJjZXMgaW4gY29uZGl0aW9uYWxcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7YXdzX2ttc19rZXkua2V5LmRlbGV0aW9uX3dpbmRvd19pbl9kYXlzID4gMyA/IGF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5pZCA6IFtdfVwiLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX2ttc19rZXkua2V5XCIsXG4gICAgICAgICAgICBmdWxsOiBcImF3c19rbXNfa2V5LmtleS5kZWxldGlvbl93aW5kb3dfaW5fZGF5c1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDQxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgICBmdWxsOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldC5pZFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogNDgsXG4gICAgICAgICAgZW5kOiA3OCxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyBhbGwgcmVzb3VyY2VzIGluIGZ1bmN0aW9uc1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHtlbGVtZW50KGF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldCwgMCkuaWR9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IGZhbHNlLFxuICAgICAgICAgIGlzVmFyaWFibGU6IGZhbHNlLFxuICAgICAgICAgIHN0YXJ0OiAxMCxcbiAgICAgICAgICBlbmQ6IDM3LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIGFsbCByZXNvdXJjZXMgaW4gZnVuY3Rpb25zIHdpdGggc3BsYXRcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7ZWxlbWVudChhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXQuKi5pZCwgMCl9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IHRydWUsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDEwLFxuICAgICAgICAgIGVuZDogMzcsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmluZHMgYWxsIHJlc291cmNlcyBpbiBmb3IgbG9vcHNcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBcIiR7eyBmb3IgbmFtZSwgdXNlciBpbiB2YXIudXNlcnMgOiB1c2VyLnJvbGUgPT4gbmFtZS4uLn19XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7IGlkOiBcInZhci51c2Vyc1wiLCBmdWxsOiBcInZhci51c2Vyc1wiIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiB0cnVlLFxuICAgICAgICAgIHN0YXJ0OiAyMixcbiAgICAgICAgICBlbmQ6IDMxLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIHJlc291cmNlcyB3aXRoIHByb3BlcnR5IGFjY2Vzc1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIFwiJHthd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRbMF0uaWR9XCIsXG4gICAgICAgICAgbm9kZUlkcyxcbiAgICAgICAgKSxcbiAgICAgICkucmVzb2x2ZXMudG9FcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICBpZDogXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIixcbiAgICAgICAgICAgIGZ1bGw6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VGcW46IHRydWUsXG4gICAgICAgICAgaXNWYXJpYWJsZTogZmFsc2UsXG4gICAgICAgICAgc3RhcnQ6IDIsXG4gICAgICAgICAgZW5kOiAzNSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmaW5kcyByZWZlcmVuY2VzIHdpdGhpbiBmdW5jdGlvbnMgdGhhdCB1c2UgYXJyYXlzIGFuZCBjb21tZW50c1wiLCAoKSA9PiB7XG4gICAgICByZXR1cm4gZXhwZWN0KFxuICAgICAgICBleHRyYWN0UmVmZXJlbmNlc0Zyb21FeHByZXNzaW9uKFxuICAgICAgICAgIGBcXCR7Y29tcGFjdChbXG4gICAgICAgICAgICAjIFRoZSBleGFtcGxlIFwiYnVja2V0XCJcbiAgICAgICAgICAgIGF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldCxcbiAgICAgICAgXG4gICAgICAgICAgICAjIFRoZSBcIkxlYXJuXCIgc2luZ2xlIHBhZ2UgYXBwbGljYXRpb24uIFRoaXMgaXMgbm90IGNvbmZpZ3VyZWQgaW4gYWxsIGVudmlyb25tZW50cy5cbiAgICAgICAgICAgIHZhci5pbnB1dCxcbiAgICAgICAgICBdKX1gLFxuICAgICAgICAgIG5vZGVJZHMsXG4gICAgICAgICksXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoW1xuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwiYXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0XCIsXG4gICAgICAgICAgICBmdWxsOiBcImF3c19zM19idWNrZXQuZXhhbXBsZWJ1Y2tldFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICBzdGFydDogNTksXG4gICAgICAgICAgZW5kOiA4NixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcInZhci5pbnB1dFwiLFxuICAgICAgICAgICAgZnVsbDogXCJ2YXIuaW5wdXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogdHJ1ZSxcbiAgICAgICAgICBzdGFydDogMjA0LFxuICAgICAgICAgIGVuZDogMjEzLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdChcImZpbmRzIHJlZmVyZW5jZXMgZm9yIHNhbWUgcmVmZXJlbmNlZXNcIiwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChcbiAgICAgICAgZXh0cmFjdFJlZmVyZW5jZXNGcm9tRXhwcmVzc2lvbihcbiAgICAgICAgICBgXFwke3Zhci5pbnB1dCA9PSBcInRlc3RcIiA/IFwiYXp1cmUtYWQtaW50XCIgOiBcImF6dXJlLWFkLVxcJHt2YXIuaW5wdXR9XCJ9YCxcbiAgICAgICAgICBub2RlSWRzLFxuICAgICAgICApLFxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKFtcbiAgICAgICAge1xuICAgICAgICAgIHJlZmVyZW5jZWU6IHtcbiAgICAgICAgICAgIGlkOiBcInZhci5pbnB1dFwiLFxuICAgICAgICAgICAgZnVsbDogXCJ2YXIuaW5wdXRcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZUZxbjogZmFsc2UsXG4gICAgICAgICAgaXNWYXJpYWJsZTogdHJ1ZSxcbiAgICAgICAgICBzdGFydDogMixcbiAgICAgICAgICBlbmQ6IDExLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcmVmZXJlbmNlZToge1xuICAgICAgICAgICAgaWQ6IFwidmFyLmlucHV0XCIsXG4gICAgICAgICAgICBmdWxsOiBcInZhci5pbnB1dFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICBpc1ZhcmlhYmxlOiB0cnVlLFxuICAgICAgICAgIHN0YXJ0OiA1MyxcbiAgICAgICAgICBlbmQ6IDYyLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiI3JlZmVyZW5jZVRvQXN0XCIsICgpID0+IHtcbiAgICBpdChcInByb3BlcnR5IGFjY2Vzc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzY29wZTogUHJvZ3JhbVNjb3BlID0ge1xuICAgICAgICBwcm92aWRlclNjaGVtYTogeyBmb3JtYXRfdmVyc2lvbjogXCIwLjFcIiB9LFxuICAgICAgICBwcm92aWRlckdlbmVyYXRvcjoge30sXG4gICAgICAgIGNvbnN0cnVjdHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgICB2YXJpYWJsZXM6IHt9LFxuICAgICAgICBoYXNUb2tlbkJhc2VkVHlwZUNvZXJjaW9uOiBmYWxzZSxcbiAgICAgICAgbm9kZUlkczogW10sXG4gICAgICAgIGltcG9ydGFibGVzOiBbXSxcbiAgICAgICAgdG9wTGV2ZWxDb25maWc6IHt9LFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgZ2VuZXJhdGUoXG4gICAgICAgICAgdC5wcm9ncmFtKFtcbiAgICAgICAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgICAgICAgcmVmZXJlbmNlVG9Bc3Qoc2NvcGUsIHtcbiAgICAgICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgICAgICBlbmQ6IDAsXG4gICAgICAgICAgICAgICAgdXNlRnFuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1ZhcmlhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VlOiB7XG4gICAgICAgICAgICAgICAgICBpZDogXCJhd3Nfa21zX2tleS5rZXlcIixcbiAgICAgICAgICAgICAgICAgIGZ1bGw6IFwiYXdzX2ttc19rZXkua2V5LmRlbGV0aW9uX3dpbmRvd19pbl9kYXlzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pIGFzIGFueSxcbiAgICAgICAgKS5jb2RlLFxuICAgICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoYFwia2V5LmRlbGV0aW9uV2luZG93SW5EYXlzO1wiYCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiI2l0ZXJhdG9yVmFyaWFibGVUb0FzdFwiLCAoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gcnVuKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHNjb3BlOiBQcm9ncmFtU2NvcGUgPSB7XG4gICAgICAgIHByb3ZpZGVyU2NoZW1hOiB7IGZvcm1hdF92ZXJzaW9uOiBcIjAuMVwiIH0sXG4gICAgICAgIHByb3ZpZGVyR2VuZXJhdG9yOiB7fSxcbiAgICAgICAgY29uc3RydWN0czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICAgIGhhc1Rva2VuQmFzZWRUeXBlQ29lcmNpb246IGZhbHNlLFxuICAgICAgICBub2RlSWRzOiBbXSxcbiAgICAgICAgaW1wb3J0YWJsZXM6IFtdLFxuICAgICAgICB0b3BMZXZlbENvbmZpZzoge30sXG4gICAgICB9O1xuICAgICAgY29uc3QgYXN0ID0gYXdhaXQgZ2V0RXhwcmVzc2lvbkFzdChcIm1haW4udGZcIiwgdmFsdWUpO1xuICAgICAgcmV0dXJuIGdlbmVyYXRlKFxuICAgICAgICB0LnByb2dyYW0oW1xuICAgICAgICAgIHQuZXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgICAgIGR5bmFtaWNWYXJpYWJsZVRvQXN0KFxuICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgYXN0IS5jaGlsZHJlblswXSBhcyB0ZXguU2NvcGVUcmF2ZXJzYWxFeHByZXNzaW9uLFxuICAgICAgICAgICAgICBcIm15SXRlcmF0b3JcIixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgXSkgYXMgYW55LFxuICAgICAgKS5jb2RlO1xuICAgIH1cblxuICAgIGl0KFwic2hvdWxkIGNvbnZlcnQgaXRlcmF0b3Iga2V5IGFjY2Vzc29yXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGV4cGVjdChhd2FpdCBydW4oJ1wiJHtlYWNoLmtleX1cIicpKS50b01hdGNoSW5saW5lU25hcHNob3QoXG4gICAgICAgIGBcIm15SXRlcmF0b3Iua2V5O1wiYCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjb252ZXJ0IGl0ZXJhdG9yIHZhbHVlIGFjY2Vzc29yXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGV4cGVjdChhd2FpdCBydW4oJ1wiJHtlYWNoLnZhbHVlfVwiJykpLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgICAgYFwibXlJdGVyYXRvci52YWx1ZTtcImAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY29udmVydCBpdGVyYXRvciB2YWx1ZSBkZWVwIGFjY2Vzc29yXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGV4cGVjdChhd2FpdCBydW4oJ1wiJHtlYWNoLnZhbHVlLmxpc3QubWFwLm5hbWV9XCInKSkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgICBgXCJGbi5sb29rdXBOZXN0ZWQobXlJdGVyYXRvci52YWx1ZSwgW1wibGlzdFwiLCBcIm1hcFwiLCBcIm5hbWVcIl0pO1wiYCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjb252ZXJ0IGl0ZXJhdG9yIHZhbHVlIHdpdGggbWFwIGFjY2Vzc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGF3YWl0IHJ1bignXCIke2VhY2gudmFsdWVbMF1bXCJtYXBcIl1bXCJuYW1lXCJdfVwiJyksXG4gICAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgICAgYFwiRm4ubG9va3VwTmVzdGVkKG15SXRlcmF0b3IudmFsdWUsIFtcIlswXVwiLCBcIltcXFxcXCJtYXBcXFxcXCJdXCIsIFwiW1xcXFxcIm5hbWVcXFxcXCJdXCJdKTtcImAsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIiNnZXRQcm9wZXJ0eUFjY2Vzc1BhdGhcIiwgKCkgPT4ge1xuICAgIGl0LmVhY2goW1xuICAgICAgW1wiLmxpc3QubWFwLm5hbWVcIiwgW1wibGlzdFwiLCBcIm1hcFwiLCBcIm5hbWVcIl1dLFxuICAgICAgW2BbMF1bXCJtYXBcIl1bXCJuYW1lXCJdYCwgW1wiMFwiLCBcIm1hcFwiLCBcIm5hbWVcIl1dLFxuICAgICAgW2BbMF0ubWFwW1wibmFtZVwiXWAsIFtcIjBcIiwgXCJtYXBcIiwgXCJuYW1lXCJdXSxcbiAgICBdKShcInNob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgcGF0aCBmb3IgJXNcIiwgKGlucHV0LCBleHBlY3RlZCkgPT4ge1xuICAgICAgZXhwZWN0KGdldFByb3BlcnR5QWNjZXNzUGF0aChpbnB1dCkpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=findExpressionType.test.d.ts.map
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZEV4cHJlc3Npb25UeXBlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaW5kRXhwcmVzc2lvblR5cGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOztBQUVILGdEQUFnRTtBQUNoRSw4Q0FBbUQ7QUFFbkQsTUFBTSxjQUFjLEdBQUc7SUFDckIsY0FBYyxFQUFFLEtBQUs7SUFDckIsZ0JBQWdCLEVBQUU7UUFDaEIscUNBQXFDLEVBQUU7WUFDckMsUUFBUSxFQUFFLEVBQUU7WUFDWixnQkFBZ0IsRUFBRTtnQkFDaEIsYUFBYSxFQUFFO29CQUNiLE9BQU8sRUFBRSxDQUFDO29CQUNWLEtBQUssRUFBRTt3QkFDTCxVQUFVLEVBQUU7NEJBQ1YsTUFBTSxFQUFFO2dDQUNOLElBQUksRUFBRSxRQUFRO2dDQUNkLGdCQUFnQixFQUFFLE9BQU87Z0NBQ3pCLFFBQVEsRUFBRSxJQUFJO2dDQUNkLFFBQVEsRUFBRSxJQUFJOzZCQUNmOzRCQUNELEVBQUUsRUFBRTtnQ0FDRixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxnQkFBZ0IsRUFBRSxPQUFPO2dDQUN6QixRQUFRLEVBQUUsSUFBSTtnQ0FDZCxRQUFRLEVBQUUsSUFBSTs2QkFDZjs0QkFDRCxJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztnQ0FDdkIsZ0JBQWdCLEVBQUUsT0FBTztnQ0FDekIsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7NEJBQ0QsY0FBYyxFQUFFO2dDQUNkLElBQUksRUFBRSxRQUFRO2dDQUNkLGdCQUFnQixFQUFFLE9BQU87Z0NBQ3pCLFVBQVUsRUFBRSxJQUFJO2dDQUNoQixRQUFRLEVBQUUsSUFBSTs2QkFDZjs0QkFDRCxnQkFBZ0IsRUFBRTtnQ0FDaEIsSUFBSSxFQUFFLFFBQVE7Z0NBQ2QsZ0JBQWdCLEVBQUUsT0FBTztnQ0FDekIsVUFBVSxFQUFFLElBQUk7Z0NBQ2hCLFFBQVEsRUFBRSxJQUFJOzZCQUNmO3lCQUNGO3dCQUNELFdBQVcsRUFBRTs0QkFDWCxTQUFTLEVBQUU7Z0NBQ1QsWUFBWSxFQUFFLE1BQU07Z0NBQ3BCLEtBQUssRUFBRTtvQ0FDTCxVQUFVLEVBQUU7d0NBQ1YsZUFBZSxFQUFFOzRDQUNmLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7NENBQ3hCLGdCQUFnQixFQUFFLE9BQU87NENBQ3pCLFFBQVEsRUFBRSxJQUFJO3lDQUNmO3FDQUNGO29DQUNELGdCQUFnQixFQUFFLE9BQU87b0NBQ3pCLFVBQVUsRUFBRSxJQUFJO2lDQUNqQjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1lBQ0QsbUJBQW1CLEVBQUUsRUFBRTtTQUN4QjtLQUNGO0NBQ0YsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFO0lBQ3BDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxPQUFPO1FBQ0wsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNkLFFBQVE7WUFDUixZQUFZO1NBQ2I7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDaEIsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO0lBQ3ZCLEdBQUcsUUFBUSxDQUFDLDZCQUE2QixDQUFDO0NBQzNDLENBQUM7QUFFRixRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO0lBQ2xDLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDTixDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUM7UUFDM0IsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUM7UUFDN0IsQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDO1FBQzVCLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQztRQUM1QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7UUFDaEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQ2hCLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztRQUNyQixDQUFDLHlDQUF5QyxFQUFFLFFBQVEsQ0FBQztLQUN0RCxDQUFDLENBQUMseUJBQXlCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUN0RCxNQUFNLEtBQUssR0FBRztZQUNaLFNBQVM7WUFDVCxjQUFjLEVBQUUsY0FBYztTQUMvQixDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFBLDRDQUE4QixFQUM5QyxLQUFZLEVBQ1osS0FBSyxFQUNMLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FDaEIsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUEsK0JBQWtCLEVBQUMsS0FBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXJELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuaW1wb3J0IHsgY29udmVydFRlcnJhZm9ybUV4cHJlc3Npb25Ub1RzIH0gZnJvbSBcIi4uL2V4cHJlc3Npb25zXCI7XG5pbXBvcnQgeyBmaW5kRXhwcmVzc2lvblR5cGUgfSBmcm9tIFwiLi4vY29lcmNlVHlwZVwiO1xuXG5jb25zdCBzM0J1Y2tldFNjaGVtYSA9IHtcbiAgZm9ybWF0X3ZlcnNpb246IFwiMS4wXCIsXG4gIHByb3ZpZGVyX3NjaGVtYXM6IHtcbiAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvYXdzXCI6IHtcbiAgICAgIHByb3ZpZGVyOiB7fSxcbiAgICAgIHJlc291cmNlX3NjaGVtYXM6IHtcbiAgICAgICAgYXdzX3MzX2J1Y2tldDoge1xuICAgICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9raW5kOiBcInBsYWluXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGlkOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9raW5kOiBcInBsYWluXCIsXG4gICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBbXCJtYXBcIiwgXCJzdHJpbmdcIl0sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fa2luZDogXCJwbGFpblwiLFxuICAgICAgICAgICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3ZWJzaXRlX2RvbWFpbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fa2luZDogXCJwbGFpblwiLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdlYnNpdGVfZW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2tpbmQ6IFwicGxhaW5cIixcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2NrX3R5cGVzOiB7XG4gICAgICAgICAgICAgIGNvcnNfcnVsZToge1xuICAgICAgICAgICAgICAgIG5lc3RpbmdfbW9kZTogXCJsaXN0XCIsXG4gICAgICAgICAgICAgICAgYmxvY2s6IHtcbiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZF9oZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogW1wibGlzdFwiLCBcInN0cmluZ1wiXSxcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbl9raW5kOiBcInBsYWluXCIsXG4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fa2luZDogXCJwbGFpblwiLFxuICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRhdGFfc291cmNlX3NjaGVtYXM6IHt9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB2YXJpYWJsZSA9IChmdWxsTmFtZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IFtyZXNvdXJjZSwgdmFyaWFibGVOYW1lXSA9IGZ1bGxOYW1lLnNwbGl0KFwiLlwiKTtcbiAgcmV0dXJuIHtcbiAgICBbdmFyaWFibGVOYW1lXToge1xuICAgICAgcmVzb3VyY2UsXG4gICAgICB2YXJpYWJsZU5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbmNvbnN0IHZhcmlhYmxlcyA9IHtcbiAgLi4udmFyaWFibGUoXCJ2YXIudGVzdFwiKSxcbiAgLi4udmFyaWFibGUoXCJhd3NfczNfYnVja2V0LmV4YW1wbGVidWNrZXRcIiksXG59O1xuXG5kZXNjcmliZShcImZpbmRFeHByZXNzaW9uVHlwZVwiLCAoKSA9PiB7XG4gIGl0LmVhY2goW1xuICAgIFsnXCIke2VhY2gua2V5fVwiJywgXCJzdHJpbmdcIl0sXG4gICAgWydcIiR7ZWFjaC52YWx1ZX1cIicsIFwic3RyaW5nXCJdLFxuICAgIFsnXCIke3Zhci50ZXN0fVwiJywgXCJkeW5hbWljXCJdLFxuICAgIFsnXCIke3Zhci50ZXN0fVwiJywgXCJkeW5hbWljXCJdLFxuICAgIFtcIjIyXCIsIFwibnVtYmVyXCJdLFxuICAgIFtcInRydWVcIiwgXCJib29sXCJdLFxuICAgIFsnXCJoZWxsb1wiJywgXCJzdHJpbmdcIl0sXG4gICAgWydcIiR7YXdzX3MzX2J1Y2tldC5leGFtcGxlYnVja2V0LmJ1Y2tldH1cIicsIFwic3RyaW5nXCJdLFxuICBdKShcImZpbmRzIHR5cGUgZm9yICVzIGFzICVzXCIsIGFzeW5jIChpbnB1dCwgZXhwZWN0ZWQpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IHtcbiAgICAgIHZhcmlhYmxlcyxcbiAgICAgIHByb3ZpZGVyU2NoZW1hOiBzM0J1Y2tldFNjaGVtYSxcbiAgICB9O1xuICAgIGNvbnN0IGFzdCA9IGF3YWl0IGNvbnZlcnRUZXJyYWZvcm1FeHByZXNzaW9uVG9UcyhcbiAgICAgIHNjb3BlIGFzIGFueSxcbiAgICAgIGlucHV0LFxuICAgICAgKCkgPT4gXCJkeW5hbWljXCIsXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBmaW5kRXhwcmVzc2lvblR5cGUoc2NvcGUgYXMgYW55LCBhc3QpO1xuXG4gICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3RlZCk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) HashiCorp, Inc.
3
+ * SPDX-License-Identifier: MPL-2.0
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=functions.test.d.ts.map