@cdktn/hcl2cdk 0.23.0-pre.4 → 0.23.0-pre.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient.d.ts +0 -1
- package/build/__tests__/coerceType.test.js +165 -0
- package/build/__tests__/expressionToTs.test.js +693 -0
- package/build/__tests__/expressions.test.js +415 -0
- package/build/__tests__/findExpressionType.test.js +105 -0
- package/build/__tests__/functions.test.js +605 -0
- package/build/__tests__/generation.test.js +45 -0
- package/build/__tests__/jsii-rosetta-workarounds.test.js +86 -0
- package/build/__tests__/partialCode.test.js +390 -0
- package/build/__tests__/terraformSchema.test.js +105 -0
- package/build/__tests__/testHelpers.js +16 -0
- package/build/coerceType.js +240 -0
- package/build/dynamic-blocks.js +44 -0
- package/build/expressions.js +633 -0
- package/build/function-bindings/functions.generated.js +1142 -0
- package/build/function-bindings/functions.js +73 -0
- package/build/generation.js +676 -0
- package/{lib → build}/index.d.ts +2 -2
- package/build/index.js +364 -0
- package/build/iteration.js +87 -0
- package/build/jsii-rosetta-workarounds.js +126 -0
- package/build/partialCode.js +116 -0
- package/build/provider.js +40 -0
- package/build/references.js +141 -0
- package/build/schema.js +81 -0
- package/build/telemetryAllowList.json +24 -0
- package/build/terraformSchema.js +136 -0
- package/build/types.js +3 -0
- package/build/utils.js +25 -0
- package/build/variables.js +172 -0
- package/package.json +19 -19
- package/tsconfig.json +4 -2
- package/lib/__tests__/coerceType.test.js +0 -165
- package/lib/__tests__/expressionToTs.test.js +0 -693
- package/lib/__tests__/expressions.test.js +0 -415
- package/lib/__tests__/findExpressionType.test.js +0 -105
- package/lib/__tests__/functions.test.js +0 -605
- package/lib/__tests__/generation.test.js +0 -45
- package/lib/__tests__/jsii-rosetta-workarounds.test.js +0 -86
- package/lib/__tests__/partialCode.test.js +0 -390
- package/lib/__tests__/terraformSchema.test.js +0 -105
- package/lib/__tests__/testHelpers.js +0 -16
- package/lib/coerceType.js +0 -240
- package/lib/dynamic-blocks.js +0 -44
- package/lib/expressions.js +0 -634
- package/lib/function-bindings/functions.generated.js +0 -1142
- package/lib/function-bindings/functions.js +0 -73
- package/lib/generation.js +0 -676
- package/lib/index.js +0 -364
- package/lib/iteration.js +0 -87
- package/lib/jsii-rosetta-workarounds.js +0 -126
- package/lib/partialCode.js +0 -116
- package/lib/provider.js +0 -40
- package/lib/references.js +0 -141
- package/lib/schema.js +0 -81
- package/lib/terraformSchema.js +0 -136
- package/lib/types.js +0 -3
- package/lib/utils.js +0 -25
- package/lib/variables.js +0 -172
- /package/{lib → build}/__tests__/coerceType.test.d.ts +0 -0
- /package/{lib → build}/__tests__/expressionToTs.test.d.ts +0 -0
- /package/{lib → build}/__tests__/expressions.test.d.ts +0 -0
- /package/{lib → build}/__tests__/findExpressionType.test.d.ts +0 -0
- /package/{lib → build}/__tests__/functions.test.d.ts +0 -0
- /package/{lib → build}/__tests__/generation.test.d.ts +0 -0
- /package/{lib → build}/__tests__/jsii-rosetta-workarounds.test.d.ts +0 -0
- /package/{lib → build}/__tests__/partialCode.test.d.ts +0 -0
- /package/{lib → build}/__tests__/terraformSchema.test.d.ts +0 -0
- /package/{lib → build}/__tests__/testHelpers.d.ts +0 -0
- /package/{lib → build}/coerceType.d.ts +0 -0
- /package/{lib → build}/dynamic-blocks.d.ts +0 -0
- /package/{lib → build}/expressions.d.ts +0 -0
- /package/{lib → build}/function-bindings/functions.d.ts +0 -0
- /package/{lib → build}/function-bindings/functions.generated.d.ts +0 -0
- /package/{lib → build}/generation.d.ts +0 -0
- /package/{lib → build}/iteration.d.ts +0 -0
- /package/{lib → build}/jsii-rosetta-workarounds.d.ts +0 -0
- /package/{lib → build}/partialCode.d.ts +0 -0
- /package/{lib → build}/provider.d.ts +0 -0
- /package/{lib → build}/references.d.ts +0 -0
- /package/{lib → build}/schema.d.ts +0 -0
- /package/{lib → build}/terraformSchema.d.ts +0 -0
- /package/{lib → build}/types.d.ts +0 -0
- /package/{lib → build}/utils.d.ts +0 -0
- /package/{lib → build}/variables.d.ts +0 -0
- /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==
|