@cdktn/provider-generator 0.24.0-pre.87 → 0.24.0-pre.89

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 (66) hide show
  1. package/build/__tests__/edge-provider-schema/builder.d.ts +9 -3
  2. package/build/__tests__/edge-provider-schema/builder.js +6 -3
  3. package/build/__tests__/edge-provider-schema/index.js +119 -1
  4. package/build/__tests__/provider.test.js +4 -1
  5. package/build/get/__tests__/generator/ephemeral-resources.test.d.ts +2 -0
  6. package/build/get/__tests__/generator/ephemeral-resources.test.js +49 -0
  7. package/build/get/__tests__/generator/provider-functions.test.d.ts +2 -0
  8. package/build/get/__tests__/generator/provider-functions.test.js +176 -0
  9. package/build/get/__tests__/generator/provider.test.js +9 -1
  10. package/build/get/__tests__/generator/write-only.test.d.ts +2 -0
  11. package/build/get/__tests__/generator/write-only.test.js +65 -0
  12. package/build/get/__tests__/target-versions.test.d.ts +2 -0
  13. package/build/get/__tests__/target-versions.test.js +171 -0
  14. package/build/get/constructs-maker.d.ts +8 -1
  15. package/build/get/constructs-maker.js +13 -4
  16. package/build/get/generator/emitter/attributes-emitter.d.ts +12 -2
  17. package/build/get/generator/emitter/attributes-emitter.js +47 -5
  18. package/build/get/generator/emitter/index.d.ts +1 -0
  19. package/build/get/generator/emitter/index.js +2 -1
  20. package/build/get/generator/emitter/provider-functions-emitter.d.ts +11 -0
  21. package/build/get/generator/emitter/provider-functions-emitter.js +94 -0
  22. package/build/get/generator/emitter/resource-emitter.d.ts +5 -1
  23. package/build/get/generator/emitter/resource-emitter.js +83 -7
  24. package/build/get/generator/models/attribute-model.d.ts +2 -0
  25. package/build/get/generator/models/attribute-model.js +2 -1
  26. package/build/get/generator/models/index.d.ts +1 -0
  27. package/build/get/generator/models/index.js +2 -1
  28. package/build/get/generator/models/provider-function-model.d.ts +102 -0
  29. package/build/get/generator/models/provider-function-model.js +667 -0
  30. package/build/get/generator/models/resource-model.d.ts +3 -0
  31. package/build/get/generator/models/resource-model.js +13 -4
  32. package/build/get/generator/models/struct.d.ts +2 -0
  33. package/build/get/generator/models/struct.js +6 -2
  34. package/build/get/generator/provider-generator.d.ts +2 -0
  35. package/build/get/generator/provider-generator.js +31 -3
  36. package/build/get/generator/resource-parser.js +3 -1
  37. package/package.json +5 -5
  38. package/src/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +4 -0
  39. package/src/__tests__/edge-provider-schema/builder.ts +17 -1
  40. package/src/__tests__/edge-provider-schema/index.ts +124 -1
  41. package/src/__tests__/provider.test.ts +3 -0
  42. package/src/get/__tests__/generator/__snapshots__/ephemeral-resources.test.ts.snap +524 -0
  43. package/src/get/__tests__/generator/__snapshots__/provider-functions.test.ts.snap +444 -0
  44. package/src/get/__tests__/generator/__snapshots__/write-only.test.ts.snap +262 -0
  45. package/src/get/__tests__/generator/ephemeral-resources.test.ts +46 -0
  46. package/src/get/__tests__/generator/fixtures/ephemeral-resources.test.fixture.json +160 -0
  47. package/src/get/__tests__/generator/fixtures/provider-functions-collision.test.fixture.json +31 -0
  48. package/src/get/__tests__/generator/fixtures/provider-functions-synthetic.test.fixture.json +192 -0
  49. package/src/get/__tests__/generator/fixtures/provider-functions.test.fixture.json +170 -0
  50. package/src/get/__tests__/generator/fixtures/write-only.test.fixture.json +58 -0
  51. package/src/get/__tests__/generator/provider-functions.test.ts +262 -0
  52. package/src/get/__tests__/generator/provider.test.ts +8 -0
  53. package/src/get/__tests__/generator/write-only.test.ts +71 -0
  54. package/src/get/__tests__/target-versions.test.ts +206 -0
  55. package/src/get/constructs-maker.ts +43 -3
  56. package/src/get/generator/emitter/attributes-emitter.ts +61 -6
  57. package/src/get/generator/emitter/index.ts +1 -0
  58. package/src/get/generator/emitter/provider-functions-emitter.ts +117 -0
  59. package/src/get/generator/emitter/resource-emitter.ts +110 -6
  60. package/src/get/generator/models/attribute-model.ts +3 -0
  61. package/src/get/generator/models/index.ts +1 -0
  62. package/src/get/generator/models/provider-function-model.ts +872 -0
  63. package/src/get/generator/models/resource-model.ts +25 -3
  64. package/src/get/generator/models/struct.ts +9 -1
  65. package/src/get/generator/provider-generator.ts +70 -4
  66. package/src/get/generator/resource-parser.ts +2 -0
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ // Copyright (c) HashiCorp, Inc
27
+ // SPDX-License-Identifier: MPL-2.0
28
+ const fs = __importStar(require("fs"));
29
+ const path = __importStar(require("path"));
30
+ const provider_generator_1 = require("../../generator/provider-generator");
31
+ const provider_function_model_1 = require("../../generator/models/provider-function-model");
32
+ const codemaker_1 = require("codemaker");
33
+ const util_1 = require("../util");
34
+ const tmp = (0, util_1.createTmpHelper)();
35
+ test("generate provider functions for the time provider (real terraform 1.15.6 schema fragment)", async () => {
36
+ const code = new codemaker_1.CodeMaker();
37
+ const workdir = tmp("provider-functions.test");
38
+ const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "provider-functions.test.fixture.json"), "utf-8"));
39
+ new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll();
40
+ await code.save(workdir);
41
+ const providerFunctionsOutput = fs.readFileSync(path.join(workdir, "providers/time/provider-functions/index.ts"), "utf-8");
42
+ expect(providerFunctionsOutput).toMatchSnapshot("time-provider-functions");
43
+ const providerOutput = fs.readFileSync(path.join(workdir, "providers/time/provider/index.ts"), "utf-8");
44
+ expect(providerOutput).toMatchSnapshot("time-provider");
45
+ const providerIndex = fs.readFileSync(path.join(workdir, "providers/time/index.ts"), "utf-8");
46
+ expect(providerIndex).toMatchSnapshot("provider-index");
47
+ const providerLazyIndex = fs.readFileSync(path.join(workdir, "providers/time/lazy-index.ts"), "utf-8");
48
+ expect(providerLazyIndex).toMatchSnapshot("provider-lazy-index");
49
+ });
50
+ describe("generate provider functions covering variadic parameters, primitive/list returns, and a 'default' parameter name", () => {
51
+ let providerFunctionsOutput;
52
+ let providerIndex;
53
+ let providerLazyIndex;
54
+ beforeAll(async () => {
55
+ const code = new codemaker_1.CodeMaker();
56
+ const workdir = tmp("provider-functions-synthetic.test");
57
+ const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "provider-functions-synthetic.test.fixture.json"), "utf-8"));
58
+ new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll();
59
+ await code.save(workdir);
60
+ providerFunctionsOutput = fs.readFileSync(path.join(workdir, "providers/example/provider-functions/index.ts"), "utf-8");
61
+ providerIndex = fs.readFileSync(path.join(workdir, "providers/example/index.ts"), "utf-8");
62
+ providerLazyIndex = fs.readFileSync(path.join(workdir, "providers/example/lazy-index.ts"), "utf-8");
63
+ });
64
+ test("matches the snapshot", () => {
65
+ expect(providerFunctionsOutput).toMatchSnapshot("example-provider-functions");
66
+ expect(providerIndex).toMatchSnapshot("provider-index");
67
+ expect(providerLazyIndex).toMatchSnapshot("provider-lazy-index");
68
+ });
69
+ test("nested collection docstrings use the compact recursive Array/Set notation", () => {
70
+ // list(set(string)): notation carries the structure; a plain Terraform
71
+ // list needs no prose note.
72
+ expect(providerFunctionsOutput).toContain("@param {Array<Set<string>>} nameGroups");
73
+ expect(providerFunctionsOutput).toContain("@returns {Array<Set<string>>}");
74
+ // set(list(string)): Set<...> notation plus the set-semantics prose note
75
+ // (the jsii type is still an array - the note keeps a reader from
76
+ // literally passing a JS Set).
77
+ expect(providerFunctionsOutput).toContain("@param {Set<Array<string>>} nameLists - Terraform set; ordering is not guaranteed and duplicate values are removed.");
78
+ expect(providerFunctionsOutput).toContain("@returns {Set<Array<string>>} Terraform set; ordering is not guaranteed and duplicate values are removed.");
79
+ });
80
+ // This package has no TypeScript-compiling harness
81
+ // for generated output (no fixture/test anywhere generates a snippet and
82
+ // feeds it through `tsc`/`ts.transpileModule`, and `cdktn` itself isn't a
83
+ // dependency of this package to typecheck against), so these are
84
+ // structural assertions on the emitted declaration text rather than an
85
+ // actual compile - see also the runtime-level proof in
86
+ // packages/cdktn/test/provider-functions.test.ts, which exercises the
87
+ // same union/token mechanics these signatures rely on.
88
+ describe("composition: a function's return type is directly assignable to another function's parameter of the 'same' Terraform type", () => {
89
+ test("flagsForSeed()'s set(bool) return type (cdktn.IResolvable) is one of the exact union members flagSet()'s set(bool) parameter declares", () => {
90
+ expect(providerFunctionsOutput).toContain("public flagsForSeed(seed: string): cdktn.IResolvable {");
91
+ expect(providerFunctionsOutput).toContain("public flagSet(flags: Array<boolean | cdktn.IResolvable> | cdktn.IResolvable): cdktn.IResolvable {");
92
+ });
93
+ test("defaultTags()'s map(string) return type is textually identical to tagMap()'s map(string) parameter type", () => {
94
+ expect(providerFunctionsOutput).toContain("public defaultTags(prefix: string): { [key: string]: string } {");
95
+ expect(providerFunctionsOutput).toContain("public tagMap(tags: { [key: string]: string }): string {");
96
+ });
97
+ });
98
+ test("a list(bool) parameter (not just set(bool)) also accepts a whole-collection token", () => {
99
+ expect(providerFunctionsOutput).toContain("public flagsOrdered(flags: Array<boolean | cdktn.IResolvable> | cdktn.IResolvable): cdktn.IResolvable {");
100
+ });
101
+ test("a list(object) parameter widens to any[] | cdktn.IResolvable (whole-collection token accepted)", () => {
102
+ expect(providerFunctionsOutput).toContain("public describeConfigs(configs: any[] | cdktn.IResolvable): string {");
103
+ });
104
+ });
105
+ test("buildProviderFunctionsModel throws when two function names collapse to the same generated method name", () => {
106
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
107
+ foo_bar: { return_type: "string", parameters: [] },
108
+ foo__bar: { return_type: "string", parameters: [] },
109
+ })).toThrow(/foo_bar/);
110
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
111
+ foo_bar: { return_type: "string", parameters: [] },
112
+ foo__bar: { return_type: "string", parameters: [] },
113
+ })).toThrow(/foo__bar/);
114
+ });
115
+ test("buildProviderFunctionsModel throws when two parameter names collapse within one function", () => {
116
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
117
+ my_function: {
118
+ return_type: "string",
119
+ parameters: [
120
+ { name: "some_value", type: "string" },
121
+ { name: "some__value", type: "string" },
122
+ ],
123
+ },
124
+ })).toThrow(/some_value/);
125
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
126
+ my_function: {
127
+ return_type: "string",
128
+ parameters: [
129
+ { name: "some_value", type: "string" },
130
+ { name: "some__value", type: "string" },
131
+ ],
132
+ },
133
+ })).toThrow(/some__value/);
134
+ });
135
+ // Both of these assert the model-level throw happens before any file is
136
+ // generated: buildProviderFunctionsModel is called directly, with no
137
+ // CodeMaker/generator involved, so there is no emission step to reach.
138
+ test("buildProviderFunctionsModel throws when a function name sanitizes to 'constructor'", () => {
139
+ // The nested signature literal is cast to `FunctionSignature` (rather than
140
+ // relying on contextual typing from the surrounding index signature)
141
+ // because TypeScript special-cases a property literally named
142
+ // "constructor" - contextually typing it against `Function` (from
143
+ // `Object.prototype`) instead of the index signature's `FunctionSignature`,
144
+ // and spuriously flagging `return_type: "string"` as an error. See
145
+ // https://github.com/microsoft/TypeScript/issues/40776.
146
+ const signature = {
147
+ return_type: "string",
148
+ parameters: [],
149
+ };
150
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
151
+ constructor: signature,
152
+ })).toThrow(/constructor/);
153
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
154
+ constructor: signature,
155
+ })).toThrow(/example/);
156
+ });
157
+ test("buildProviderFunctionsModel throws when a function name sanitizes to 'providerLocalName'", () => {
158
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
159
+ provider_local_name: { return_type: "string", parameters: [] },
160
+ })).toThrow(/provider_local_name/);
161
+ expect(() => (0, provider_function_model_1.buildProviderFunctionsModel)("example", {
162
+ provider_local_name: { return_type: "string", parameters: [] },
163
+ })).toThrow(/providerLocalName/);
164
+ });
165
+ test("assertNoFunctionsGetterCollision throws when the provider's own config schema would generate a 'functions' property", () => {
166
+ expect(() => (0, provider_function_model_1.assertNoFunctionsGetterCollision)("example", ["alias", "functions"])).toThrow(/"functions"/);
167
+ });
168
+ test("assertNoFunctionsGetterCollision does not throw when there is no colliding attribute", () => {
169
+ expect(() => (0, provider_function_model_1.assertNoFunctionsGetterCollision)("example", ["alias"])).not.toThrow();
170
+ });
171
+ test("generation throws when a provider's config attribute collides with the generated 'functions' getter", async () => {
172
+ const code = new codemaker_1.CodeMaker();
173
+ const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "provider-functions-collision.test.fixture.json"), "utf-8"));
174
+ expect(() => new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll()).toThrow(/"functions"/);
175
+ });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZnVuY3Rpb25zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L19fdGVzdHNfXy9nZW5lcmF0b3IvcHJvdmlkZXItZnVuY3Rpb25zLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwyRUFBZ0Y7QUFDaEYsNEZBR3dEO0FBQ3hELHlDQUFzQztBQUV0QyxrQ0FBMEM7QUFFMUMsTUFBTSxHQUFHLEdBQUcsSUFBQSxzQkFBZSxHQUFFLENBQUM7QUFFOUIsSUFBSSxDQUFDLDJGQUEyRixFQUFFLEtBQUssSUFBSSxFQUFFO0lBQzNHLE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3JCLEVBQUUsQ0FBQyxZQUFZLENBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLHNDQUFzQyxDQUFDLEVBQ3hFLE9BQU8sQ0FDUixDQUNGLENBQUM7SUFDRixJQUFJLCtDQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6RCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFekIsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSw0Q0FBNEMsQ0FBQyxFQUNoRSxPQUFPLENBQ1IsQ0FBQztJQUNGLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRTNFLE1BQU0sY0FB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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IgfSBmcm9tIFwiLi4vLi4vZ2VuZXJhdG9yL3Byb3ZpZGVyLWdlbmVyYXRvclwiO1xuaW1wb3J0IHtcbiAgYXNzZXJ0Tm9GdW5jdGlvbnNHZXR0ZXJDb2xsaXNpb24sXG4gIGJ1aWxkUHJvdmlkZXJGdW5jdGlvbnNNb2RlbCxcbn0gZnJvbSBcIi4uLy4uL2dlbmVyYXRvci9tb2RlbHMvcHJvdmlkZXItZnVuY3Rpb24tbW9kZWxcIjtcbmltcG9ydCB7IENvZGVNYWtlciB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7IEZ1bmN0aW9uU2lnbmF0dXJlIH0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyBjcmVhdGVUbXBIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG5jb25zdCB0bXAgPSBjcmVhdGVUbXBIZWxwZXIoKTtcblxudGVzdChcImdlbmVyYXRlIHByb3ZpZGVyIGZ1bmN0aW9ucyBmb3IgdGhlIHRpbWUgcHJvdmlkZXIgKHJlYWwgdGVycmFmb3JtIDEuMTUuNiBzY2hlbWEgZnJhZ21lbnQpXCIsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgY29kZSA9IG5ldyBDb2RlTWFrZXIoKTtcbiAgY29uc3Qgd29ya2RpciA9IHRtcChcInByb3ZpZGVyLWZ1bmN0aW9ucy50ZXN0XCIpO1xuICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImZpeHR1cmVzXCIsIFwicHJvdmlkZXItZnVuY3Rpb25zLnRlc3QuZml4dHVyZS5qc29uXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICksXG4gICk7XG4gIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICBhd2FpdCBjb2RlLnNhdmUod29ya2Rpcik7XG5cbiAgY29uc3QgcHJvdmlkZXJGdW5jdGlvbnNPdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKHdvcmtkaXIsIFwicHJvdmlkZXJzL3RpbWUvcHJvdmlkZXItZnVuY3Rpb25zL2luZGV4LnRzXCIpLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgZXhwZWN0KHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0KS50b01hdGNoU25hcHNob3QoXCJ0aW1lLXByb3ZpZGVyLWZ1bmN0aW9uc1wiKTtcblxuICBjb25zdCBwcm92aWRlck91dHB1dCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICBwYXRoLmpvaW4od29ya2RpciwgXCJwcm92aWRlcnMvdGltZS9wcm92aWRlci9pbmRleC50c1wiKSxcbiAgICBcInV0Zi04XCIsXG4gICk7XG4gIGV4cGVjdChwcm92aWRlck91dHB1dCkudG9NYXRjaFNuYXBzaG90KFwidGltZS1wcm92aWRlclwiKTtcblxuICBjb25zdCBwcm92aWRlckluZGV4ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy90aW1lL2luZGV4LnRzXCIpLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgZXhwZWN0KHByb3ZpZGVySW5kZXgpLnRvTWF0Y2hTbmFwc2hvdChcInByb3ZpZGVyLWluZGV4XCIpO1xuXG4gIGNvbnN0IHByb3ZpZGVyTGF6eUluZGV4ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy90aW1lL2xhenktaW5kZXgudHNcIiksXG4gICAgXCJ1dGYtOFwiLFxuICApO1xuICBleHBlY3QocHJvdmlkZXJMYXp5SW5kZXgpLnRvTWF0Y2hTbmFwc2hvdChcInByb3ZpZGVyLWxhenktaW5kZXhcIik7XG59KTtcblxuZGVzY3JpYmUoXCJnZW5lcmF0ZSBwcm92aWRlciBmdW5jdGlvbnMgY292ZXJpbmcgdmFyaWFkaWMgcGFyYW1ldGVycywgcHJpbWl0aXZlL2xpc3QgcmV0dXJucywgYW5kIGEgJ2RlZmF1bHQnIHBhcmFtZXRlciBuYW1lXCIsICgpID0+IHtcbiAgbGV0IHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0OiBzdHJpbmc7XG4gIGxldCBwcm92aWRlckluZGV4OiBzdHJpbmc7XG4gIGxldCBwcm92aWRlckxhenlJbmRleDogc3RyaW5nO1xuXG4gIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY29kZSA9IG5ldyBDb2RlTWFrZXIoKTtcbiAgICBjb25zdCB3b3JrZGlyID0gdG1wKFwicHJvdmlkZXItZnVuY3Rpb25zLXN5bnRoZXRpYy50ZXN0XCIpO1xuICAgIGNvbnN0IHNwZWMgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICAgIFwiZml4dHVyZXNcIixcbiAgICAgICAgICBcInByb3ZpZGVyLWZ1bmN0aW9ucy1zeW50aGV0aWMudGVzdC5maXh0dXJlLmpzb25cIixcbiAgICAgICAgKSxcbiAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICAgIGF3YWl0IGNvZGUuc2F2ZSh3b3JrZGlyKTtcblxuICAgIHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKHdvcmtkaXIsIFwicHJvdmlkZXJzL2V4YW1wbGUvcHJvdmlkZXItZnVuY3Rpb25zL2luZGV4LnRzXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICk7XG4gICAgcHJvdmlkZXJJbmRleCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy9leGFtcGxlL2luZGV4LnRzXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICk7XG4gICAgcHJvdmlkZXJMYXp5SW5kZXggPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4od29ya2RpciwgXCJwcm92aWRlcnMvZXhhbXBsZS9sYXp5LWluZGV4LnRzXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoXCJtYXRjaGVzIHRoZSBzbmFwc2hvdFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0KS50b01hdGNoU25hcHNob3QoXG4gICAgICBcImV4YW1wbGUtcHJvdmlkZXItZnVuY3Rpb25zXCIsXG4gICAgKTtcbiAgICBleHBlY3QocHJvdmlkZXJJbmRleCkudG9NYXRjaFNuYXBzaG90KFwicHJvdmlkZXItaW5kZXhcIik7XG4gICAgZXhwZWN0KHByb3ZpZGVyTGF6eUluZGV4KS50b01hdGNoU25hcHNob3QoXCJwcm92aWRlci1sYXp5LWluZGV4XCIpO1xuICB9KTtcblxuICB0ZXN0KFwibmVzdGVkIGNvbGxlY3Rpb24gZG9jc3RyaW5ncyB1c2UgdGhlIGNvbXBhY3QgcmVjdXJzaXZlIEFycmF5L1NldCBub3RhdGlvblwiLCAoKSA9PiB7XG4gICAgLy8gbGlzdChzZXQoc3RyaW5nKSk6IG5vdGF0aW9uIGNhcnJpZXMgdGhlIHN0cnVjdHVyZTsgYSBwbGFpbiBUZXJyYWZvcm1cbiAgICAvLyBsaXN0IG5lZWRzIG5vIHByb3NlIG5vdGUuXG4gICAgZXhwZWN0KHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0KS50b0NvbnRhaW4oXG4gICAgICBcIkBwYXJhbSB7QXJyYXk8U2V0PHN0cmluZz4+fSBuYW1lR3JvdXBzXCIsXG4gICAgKTtcbiAgICBleHBlY3QocHJvdmlkZXJGdW5jdGlvbnNPdXRwdXQpLnRvQ29udGFpbihcIkByZXR1cm5zIHtBcnJheTxTZXQ8c3RyaW5nPj59XCIpO1xuICAgIC8vIHNldChsaXN0KHN0cmluZykpOiBTZXQ8Li4uPiBub3RhdGlvbiBwbHVzIHRoZSBzZXQtc2VtYW50aWNzIHByb3NlIG5vdGVcbiAgICAvLyAodGhlIGpzaWkgdHlwZSBpcyBzdGlsbCBhbiBhcnJheSAtIHRoZSBub3RlIGtlZXBzIGEgcmVhZGVyIGZyb21cbiAgICAvLyBsaXRlcmFsbHkgcGFzc2luZyBhIEpTIFNldCkuXG4gICAgZXhwZWN0KHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0KS50b0NvbnRhaW4oXG4gICAgICBcIkBwYXJhbSB7U2V0PEFycmF5PHN0cmluZz4+fSBuYW1lTGlzdHMgLSBUZXJyYWZvcm0gc2V0OyBvcmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCBhbmQgZHVwbGljYXRlIHZhbHVlcyBhcmUgcmVtb3ZlZC5cIixcbiAgICApO1xuICAgIGV4cGVjdChwcm92aWRlckZ1bmN0aW9uc091dHB1dCkudG9Db250YWluKFxuICAgICAgXCJAcmV0dXJucyB7U2V0PEFycmF5PHN0cmluZz4+fSBUZXJyYWZvcm0gc2V0OyBvcmRlcmluZyBpcyBub3QgZ3VhcmFudGVlZCBhbmQgZHVwbGljYXRlIHZhbHVlcyBhcmUgcmVtb3ZlZC5cIixcbiAgICApO1xuICB9KTtcblxuICAvLyBUaGlzIHBhY2thZ2UgaGFzIG5vIFR5cGVTY3JpcHQtY29tcGlsaW5nIGhhcm5lc3NcbiAgLy8gZm9yIGdlbmVyYXRlZCBvdXRwdXQgKG5vIGZpeHR1cmUvdGVzdCBhbnl3aGVyZSBnZW5lcmF0ZXMgYSBzbmlwcGV0IGFuZFxuICAvLyBmZWVkcyBpdCB0aHJvdWdoIGB0c2NgL2B0cy50cmFuc3BpbGVNb2R1bGVgLCBhbmQgYGNka3RuYCBpdHNlbGYgaXNuJ3QgYVxuICAvLyBkZXBlbmRlbmN5IG9mIHRoaXMgcGFja2FnZSB0byB0eXBlY2hlY2sgYWdhaW5zdCksIHNvIHRoZXNlIGFyZVxuICAvLyBzdHJ1Y3R1cmFsIGFzc2VydGlvbnMgb24gdGhlIGVtaXR0ZWQgZGVjbGFyYXRpb24gdGV4dCByYXRoZXIgdGhhbiBhblxuICAvLyBhY3R1YWwgY29tcGlsZSAtIHNlZSBhbHNvIHRoZSBydW50aW1lLWxldmVsIHByb29mIGluXG4gIC8vIHBhY2thZ2VzL2Nka3RuL3Rlc3QvcHJvdmlkZXItZnVuY3Rpb25zLnRlc3QudHMsIHdoaWNoIGV4ZXJjaXNlcyB0aGVcbiAgLy8gc2FtZSB1bmlvbi90b2tlbiBtZWNoYW5pY3MgdGhlc2Ugc2lnbmF0dXJlcyByZWx5IG9uLlxuICBkZXNjcmliZShcImNvbXBvc2l0aW9uOiBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgaXMgZGlyZWN0bHkgYXNzaWduYWJsZSB0byBhbm90aGVyIGZ1bmN0aW9uJ3MgcGFyYW1ldGVyIG9mIHRoZSAnc2FtZScgVGVycmFmb3JtIHR5cGVcIiwgKCkgPT4ge1xuICAgIHRlc3QoXCJmbGFnc0ZvclNlZWQoKSdzIHNldChib29sKSByZXR1cm4gdHlwZSAoY2RrdG4uSVJlc29sdmFibGUpIGlzIG9uZSBvZiB0aGUgZXhhY3QgdW5pb24gbWVtYmVycyBmbGFnU2V0KCkncyBzZXQoYm9vbCkgcGFyYW1ldGVyIGRlY2xhcmVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChwcm92aWRlckZ1bmN0aW9uc091dHB1dCkudG9Db250YWluKFxuICAgICAgICBcInB1YmxpYyBmbGFnc0ZvclNlZWQoc2VlZDogc3RyaW5nKTogY2RrdG4uSVJlc29sdmFibGUge1wiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChwcm92aWRlckZ1bmN0aW9uc091dHB1dCkudG9Db250YWluKFxuICAgICAgICBcInB1YmxpYyBmbGFnU2V0KGZsYWdzOiBBcnJheTxib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU+IHwgY2RrdG4uSVJlc29sdmFibGUpOiBjZGt0bi5JUmVzb2x2YWJsZSB7XCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGVzdChcImRlZmF1bHRUYWdzKCkncyBtYXAoc3RyaW5nKSByZXR1cm4gdHlwZSBpcyB0ZXh0dWFsbHkgaWRlbnRpY2FsIHRvIHRhZ01hcCgpJ3MgbWFwKHN0cmluZykgcGFyYW1ldGVyIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0KS50b0NvbnRhaW4oXG4gICAgICAgIFwicHVibGljIGRlZmF1bHRUYWdzKHByZWZpeDogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHByb3ZpZGVyRnVuY3Rpb25zT3V0cHV0KS50b0NvbnRhaW4oXG4gICAgICAgIFwicHVibGljIHRhZ01hcCh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogc3RyaW5nIHtcIixcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoXCJhIGxpc3QoYm9vbCkgcGFyYW1ldGVyIChub3QganVzdCBzZXQoYm9vbCkpIGFsc28gYWNjZXB0cyBhIHdob2xlLWNvbGxlY3Rpb24gdG9rZW5cIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcm92aWRlckZ1bmN0aW9uc091dHB1dCkudG9Db250YWluKFxuICAgICAgXCJwdWJsaWMgZmxhZ3NPcmRlcmVkKGZsYWdzOiBBcnJheTxib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU+IHwgY2RrdG4uSVJlc29sdmFibGUpOiBjZGt0bi5JUmVzb2x2YWJsZSB7XCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgdGVzdChcImEgbGlzdChvYmplY3QpIHBhcmFtZXRlciB3aWRlbnMgdG8gYW55W10gfCBjZGt0bi5JUmVzb2x2YWJsZSAod2hvbGUtY29sbGVjdGlvbiB0b2tlbiBhY2NlcHRlZClcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcm92aWRlckZ1bmN0aW9uc091dHB1dCkudG9Db250YWluKFxuICAgICAgXCJwdWJsaWMgZGVzY3JpYmVDb25maWdzKGNvbmZpZ3M6IGFueVtdIHwgY2RrdG4uSVJlc29sdmFibGUpOiBzdHJpbmcge1wiLFxuICAgICk7XG4gIH0pO1xufSk7XG5cbnRlc3QoXCJidWlsZFByb3ZpZGVyRnVuY3Rpb25zTW9kZWwgdGhyb3dzIHdoZW4gdHdvIGZ1bmN0aW9uIG5hbWVzIGNvbGxhcHNlIHRvIHRoZSBzYW1lIGdlbmVyYXRlZCBtZXRob2QgbmFtZVwiLCAoKSA9PiB7XG4gIGV4cGVjdCgoKSA9PlxuICAgIGJ1aWxkUHJvdmlkZXJGdW5jdGlvbnNNb2RlbChcImV4YW1wbGVcIiwge1xuICAgICAgZm9vX2JhcjogeyByZXR1cm5fdHlwZTogXCJzdHJpbmdcIiwgcGFyYW1ldGVyczogW10gfSxcbiAgICAgIGZvb19fYmFyOiB7IHJldHVybl90eXBlOiBcInN0cmluZ1wiLCBwYXJhbWV0ZXJzOiBbXSB9LFxuICAgIH0pLFxuICApLnRvVGhyb3coL2Zvb19iYXIvKTtcbiAgZXhwZWN0KCgpID0+XG4gICAgYnVpbGRQcm92aWRlckZ1bmN0aW9uc01vZGVsKFwiZXhhbXBsZVwiLCB7XG4gICAgICBmb29fYmFyOiB7IHJldHVybl90eXBlOiBcInN0cmluZ1wiLCBwYXJhbWV0ZXJzOiBbXSB9LFxuICAgICAgZm9vX19iYXI6IHsgcmV0dXJuX3R5cGU6IFwic3RyaW5nXCIsIHBhcmFtZXRlcnM6IFtdIH0sXG4gICAgfSksXG4gICkudG9UaHJvdygvZm9vX19iYXIvKTtcbn0pO1xuXG50ZXN0KFwiYnVpbGRQcm92aWRlckZ1bmN0aW9uc01vZGVsIHRocm93cyB3aGVuIHR3byBwYXJhbWV0ZXIgbmFtZXMgY29sbGFwc2Ugd2l0aGluIG9uZSBmdW5jdGlvblwiLCAoKSA9PiB7XG4gIGV4cGVjdCgoKSA9PlxuICAgIGJ1aWxkUHJvdmlkZXJGdW5jdGlvbnNNb2RlbChcImV4YW1wbGVcIiwge1xuICAgICAgbXlfZnVuY3Rpb246IHtcbiAgICAgICAgcmV0dXJuX3R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICB7IG5hbWU6IFwic29tZV92YWx1ZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgICAgeyBuYW1lOiBcInNvbWVfX3ZhbHVlXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSksXG4gICkudG9UaHJvdygvc29tZV92YWx1ZS8pO1xuICBleHBlY3QoKCkgPT5cbiAgICBidWlsZFByb3ZpZGVyRnVuY3Rpb25zTW9kZWwoXCJleGFtcGxlXCIsIHtcbiAgICAgIG15X2Z1bmN0aW9uOiB7XG4gICAgICAgIHJldHVybl90eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgeyBuYW1lOiBcInNvbWVfdmFsdWVcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgICAgIHsgbmFtZTogXCJzb21lX192YWx1ZVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pLFxuICApLnRvVGhyb3coL3NvbWVfX3ZhbHVlLyk7XG59KTtcblxuLy8gQm90aCBvZiB0aGVzZSBhc3NlcnQgdGhlIG1vZGVsLWxldmVsIHRocm93IGhhcHBlbnMgYmVmb3JlIGFueSBmaWxlIGlzXG4vLyBnZW5lcmF0ZWQ6IGJ1aWxkUHJvdmlkZXJGdW5jdGlvbnNNb2RlbCBpcyBjYWxsZWQgZGlyZWN0bHksIHdpdGggbm9cbi8vIENvZGVNYWtlci9nZW5lcmF0b3IgaW52b2x2ZWQsIHNvIHRoZXJlIGlzIG5vIGVtaXNzaW9uIHN0ZXAgdG8gcmVhY2guXG50ZXN0KFwiYnVpbGRQcm92aWRlckZ1bmN0aW9uc01vZGVsIHRocm93cyB3aGVuIGEgZnVuY3Rpb24gbmFtZSBzYW5pdGl6ZXMgdG8gJ2NvbnN0cnVjdG9yJ1wiLCAoKSA9PiB7XG4gIC8vIFRoZSBuZXN0ZWQgc2lnbmF0dXJlIGxpdGVyYWwgaXMgY2FzdCB0byBgRnVuY3Rpb25TaWduYXR1cmVgIChyYXRoZXIgdGhhblxuICAvLyByZWx5aW5nIG9uIGNvbnRleHR1YWwgdHlwaW5nIGZyb20gdGhlIHN1cnJvdW5kaW5nIGluZGV4IHNpZ25hdHVyZSlcbiAgLy8gYmVjYXVzZSBUeXBlU2NyaXB0IHNwZWNpYWwtY2FzZXMgYSBwcm9wZXJ0eSBsaXRlcmFsbHkgbmFtZWRcbiAgLy8gXCJjb25zdHJ1Y3RvclwiIC0gY29udGV4dHVhbGx5IHR5cGluZyBpdCBhZ2FpbnN0IGBGdW5jdGlvbmAgKGZyb21cbiAgLy8gYE9iamVjdC5wcm90b3R5cGVgKSBpbnN0ZWFkIG9mIHRoZSBpbmRleCBzaWduYXR1cmUncyBgRnVuY3Rpb25TaWduYXR1cmVgLFxuICAvLyBhbmQgc3B1cmlvdXNseSBmbGFnZ2luZyBgcmV0dXJuX3R5cGU6IFwic3RyaW5nXCJgIGFzIGFuIGVycm9yLiBTZWVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80MDc3Ni5cbiAgY29uc3Qgc2lnbmF0dXJlOiBGdW5jdGlvblNpZ25hdHVyZSA9IHtcbiAgICByZXR1cm5fdHlwZTogXCJzdHJpbmdcIixcbiAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgfTtcbiAgZXhwZWN0KCgpID0+XG4gICAgYnVpbGRQcm92aWRlckZ1bmN0aW9uc01vZGVsKFwiZXhhbXBsZVwiLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjogc2lnbmF0dXJlLFxuICAgIH0pLFxuICApLnRvVGhyb3coL2NvbnN0cnVjdG9yLyk7XG4gIGV4cGVjdCgoKSA9PlxuICAgIGJ1aWxkUHJvdmlkZXJGdW5jdGlvbnNNb2RlbChcImV4YW1wbGVcIiwge1xuICAgICAgY29uc3RydWN0b3I6IHNpZ25hdHVyZSxcbiAgICB9KSxcbiAgKS50b1Rocm93KC9leGFtcGxlLyk7XG59KTtcblxudGVzdChcImJ1aWxkUHJvdmlkZXJGdW5jdGlvbnNNb2RlbCB0aHJvd3Mgd2hlbiBhIGZ1bmN0aW9uIG5hbWUgc2FuaXRpemVzIHRvICdwcm92aWRlckxvY2FsTmFtZSdcIiwgKCkgPT4ge1xuICBleHBlY3QoKCkgPT5cbiAgICBidWlsZFByb3ZpZGVyRnVuY3Rpb25zTW9kZWwoXCJleGFtcGxlXCIsIHtcbiAgICAgIHByb3ZpZGVyX2xvY2FsX25hbWU6IHsgcmV0dXJuX3R5cGU6IFwic3RyaW5nXCIsIHBhcmFtZXRlcnM6IFtdIH0sXG4gICAgfSksXG4gICkudG9UaHJvdygvcHJvdmlkZXJfbG9jYWxfbmFtZS8pO1xuICBleHBlY3QoKCkgPT5cbiAgICBidWlsZFByb3ZpZGVyRnVuY3Rpb25zTW9kZWwoXCJleGFtcGxlXCIsIHtcbiAgICAgIHByb3ZpZGVyX2xvY2FsX25hbWU6IHsgcmV0dXJuX3R5cGU6IFwic3RyaW5nXCIsIHBhcmFtZXRlcnM6IFtdIH0sXG4gICAgfSksXG4gICkudG9UaHJvdygvcHJvdmlkZXJMb2NhbE5hbWUvKTtcbn0pO1xuXG50ZXN0KFwiYXNzZXJ0Tm9GdW5jdGlvbnNHZXR0ZXJDb2xsaXNpb24gdGhyb3dzIHdoZW4gdGhlIHByb3ZpZGVyJ3Mgb3duIGNvbmZpZyBzY2hlbWEgd291bGQgZ2VuZXJhdGUgYSAnZnVuY3Rpb25zJyBwcm9wZXJ0eVwiLCAoKSA9PiB7XG4gIGV4cGVjdCgoKSA9PlxuICAgIGFzc2VydE5vRnVuY3Rpb25zR2V0dGVyQ29sbGlzaW9uKFwiZXhhbXBsZVwiLCBbXCJhbGlhc1wiLCBcImZ1bmN0aW9uc1wiXSksXG4gICkudG9UaHJvdygvXCJmdW5jdGlvbnNcIi8pO1xufSk7XG5cbnRlc3QoXCJhc3NlcnROb0Z1bmN0aW9uc0dldHRlckNvbGxpc2lvbiBkb2VzIG5vdCB0aHJvdyB3aGVuIHRoZXJlIGlzIG5vIGNvbGxpZGluZyBhdHRyaWJ1dGVcIiwgKCkgPT4ge1xuICBleHBlY3QoKCkgPT5cbiAgICBhc3NlcnROb0Z1bmN0aW9uc0dldHRlckNvbGxpc2lvbihcImV4YW1wbGVcIiwgW1wiYWxpYXNcIl0pLFxuICApLm5vdC50b1Rocm93KCk7XG59KTtcblxudGVzdChcImdlbmVyYXRpb24gdGhyb3dzIHdoZW4gYSBwcm92aWRlcidzIGNvbmZpZyBhdHRyaWJ1dGUgY29sbGlkZXMgd2l0aCB0aGUgZ2VuZXJhdGVkICdmdW5jdGlvbnMnIGdldHRlclwiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBuZXcgQ29kZU1ha2VyKCk7XG4gIGNvbnN0IHNwZWMgPSBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBcImZpeHR1cmVzXCIsXG4gICAgICAgIFwicHJvdmlkZXItZnVuY3Rpb25zLWNvbGxpc2lvbi50ZXN0LmZpeHR1cmUuanNvblwiLFxuICAgICAgKSxcbiAgICAgIFwidXRmLThcIixcbiAgICApLFxuICApO1xuICBleHBlY3QoKCkgPT5cbiAgICBuZXcgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IoY29kZSwgc3BlYykuZ2VuZXJhdGVBbGwoKSxcbiAgKS50b1Rocm93KC9cImZ1bmN0aW9uc1wiLyk7XG59KTtcbiJdfQ==
@@ -39,6 +39,10 @@ test("generate provider", async () => {
39
39
  await code.save(workdir);
40
40
  const output = fs.readFileSync(path.join(workdir, "providers/aws/provider/index.ts"), "utf-8");
41
41
  expect(output).toMatchSnapshot();
42
+ // aws has no provider-defined functions in this fixture - no getter, no
43
+ // cross-directory import should be emitted.
44
+ expect(output).not.toContain("public get functions()");
45
+ expect(output).not.toContain("provider-functions");
42
46
  });
43
47
  test("generate provider with only block_types", async () => {
44
48
  const code = new codemaker_1.CodeMaker();
@@ -48,5 +52,9 @@ test("generate provider with only block_types", async () => {
48
52
  await code.save(workdir);
49
53
  const output = fs.readFileSync(path.join(workdir, "providers/elasticstack/provider/index.ts"), "utf-8");
50
54
  expect(output).toMatchSnapshot();
55
+ // elasticstack has no provider-defined functions in this fixture - no
56
+ // getter, no cross-directory import should be emitted.
57
+ expect(output).not.toContain("public get functions()");
58
+ expect(output).not.toContain("provider-functions");
51
59
  });
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9nZXQvX190ZXN0c19fL2dlbmVyYXRvci9wcm92aWRlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsMkVBQWdGO0FBQ2hGLHlDQUFzQztBQUN0QyxrQ0FBMEM7QUFFMUMsTUFBTSxHQUFHLEdBQUcsSUFBQSxzQkFBZSxHQUFFLENBQUM7QUFFOUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssSUFBSSxFQUFFO0lBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNyQixFQUFFLENBQUMsWUFBWSxDQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQ0FBZ0MsQ0FBQyxFQUNsRSxPQUFPLENBQ1IsQ0FDRixDQUFDO0lBQ0YsSUFBSSwrQ0FBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxDQUFDLEVBQ3JELE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO0lBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNyQixFQUFFLENBQUMsWUFBWSxDQUNiLElBQUksQ0FBQyxJQUFJLENBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVix5Q0FBeUMsQ0FDMUMsRUFDRCxPQUFPLENBQ1IsQ0FDRixDQUFDO0lBQ0YsSUFBSSwrQ0FBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLDBDQUEwQyxDQUFDLEVBQzlELE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IgfSBmcm9tIFwiLi4vLi4vZ2VuZXJhdG9yL3Byb3ZpZGVyLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgQ29kZU1ha2VyIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHsgY3JlYXRlVG1wSGVscGVyIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuY29uc3QgdG1wID0gY3JlYXRlVG1wSGVscGVyKCk7XG5cbnRlc3QoXCJnZW5lcmF0ZSBwcm92aWRlclwiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBuZXcgQ29kZU1ha2VyKCk7XG4gIGNvbnN0IHdvcmtkaXIgPSB0bXAoXCJwcm92aWRlci50ZXN0XCIpO1xuICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImZpeHR1cmVzXCIsIFwiYXdzLXByb3ZpZGVyLnRlc3QuZml4dHVyZS5qc29uXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICksXG4gICk7XG4gIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICBhd2FpdCBjb2RlLnNhdmUod29ya2Rpcik7XG5cbiAgY29uc3Qgb3V0cHV0ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy9hd3MvcHJvdmlkZXIvaW5kZXgudHNcIiksXG4gICAgXCJ1dGYtOFwiLFxuICApO1xuICBleHBlY3Qob3V0cHV0KS50b01hdGNoU25hcHNob3QoKTtcbn0pO1xuXG50ZXN0KFwiZ2VuZXJhdGUgcHJvdmlkZXIgd2l0aCBvbmx5IGJsb2NrX3R5cGVzXCIsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgY29kZSA9IG5ldyBDb2RlTWFrZXIoKTtcbiAgY29uc3Qgd29ya2RpciA9IHRtcChcInByb3ZpZGVyLnRlc3RcIik7XG4gIGNvbnN0IHNwZWMgPSBKU09OLnBhcnNlKFxuICAgIGZzLnJlYWRGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBcImZpeHR1cmVzXCIsXG4gICAgICAgIFwiZWxhc3RpY3N0YWNrLXByb3ZpZGVyLnRlc3QuZml4dHVyZS5qc29uXCIsXG4gICAgICApLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICksXG4gICk7XG4gIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICBhd2FpdCBjb2RlLnNhdmUod29ya2Rpcik7XG5cbiAgY29uc3Qgb3V0cHV0ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy9lbGFzdGljc3RhY2svcHJvdmlkZXIvaW5kZXgudHNcIiksXG4gICAgXCJ1dGYtOFwiLFxuICApO1xuICBleHBlY3Qob3V0cHV0KS50b01hdGNoU25hcHNob3QoKTtcbn0pO1xuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9nZXQvX190ZXN0c19fL2dlbmVyYXRvci9wcm92aWRlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsMkVBQWdGO0FBQ2hGLHlDQUFzQztBQUN0QyxrQ0FBMEM7QUFFMUMsTUFBTSxHQUFHLEdBQUcsSUFBQSxzQkFBZSxHQUFFLENBQUM7QUFFOUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssSUFBSSxFQUFFO0lBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNyQixFQUFFLENBQUMsWUFBWSxDQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQ0FBZ0MsQ0FBQyxFQUNsRSxPQUFPLENBQ1IsQ0FDRixDQUFDO0lBQ0YsSUFBSSwrQ0FBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxDQUFDLEVBQ3JELE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLHdFQUF3RTtJQUN4RSw0Q0FBNEM7SUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLEtBQUssSUFBSSxFQUFFO0lBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNyQixFQUFFLENBQUMsWUFBWSxDQUNiLElBQUksQ0FBQyxJQUFJLENBQ1AsU0FBUyxFQUNULFVBQVUsRUFDVix5Q0FBeUMsQ0FDMUMsRUFDRCxPQUFPLENBQ1IsQ0FDRixDQUFDO0lBQ0YsSUFBSSwrQ0FBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLDBDQUEwQyxDQUFDLEVBQzlELE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLHNFQUFzRTtJQUN0RSx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IgfSBmcm9tIFwiLi4vLi4vZ2VuZXJhdG9yL3Byb3ZpZGVyLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgQ29kZU1ha2VyIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHsgY3JlYXRlVG1wSGVscGVyIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuY29uc3QgdG1wID0gY3JlYXRlVG1wSGVscGVyKCk7XG5cbnRlc3QoXCJnZW5lcmF0ZSBwcm92aWRlclwiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBuZXcgQ29kZU1ha2VyKCk7XG4gIGNvbnN0IHdvcmtkaXIgPSB0bXAoXCJwcm92aWRlci50ZXN0XCIpO1xuICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImZpeHR1cmVzXCIsIFwiYXdzLXByb3ZpZGVyLnRlc3QuZml4dHVyZS5qc29uXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICksXG4gICk7XG4gIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICBhd2FpdCBjb2RlLnNhdmUod29ya2Rpcik7XG5cbiAgY29uc3Qgb3V0cHV0ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy9hd3MvcHJvdmlkZXIvaW5kZXgudHNcIiksXG4gICAgXCJ1dGYtOFwiLFxuICApO1xuICBleHBlY3Qob3V0cHV0KS50b01hdGNoU25hcHNob3QoKTtcbiAgLy8gYXdzIGhhcyBubyBwcm92aWRlci1kZWZpbmVkIGZ1bmN0aW9ucyBpbiB0aGlzIGZpeHR1cmUgLSBubyBnZXR0ZXIsIG5vXG4gIC8vIGNyb3NzLWRpcmVjdG9yeSBpbXBvcnQgc2hvdWxkIGJlIGVtaXR0ZWQuXG4gIGV4cGVjdChvdXRwdXQpLm5vdC50b0NvbnRhaW4oXCJwdWJsaWMgZ2V0IGZ1bmN0aW9ucygpXCIpO1xuICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKFwicHJvdmlkZXItZnVuY3Rpb25zXCIpO1xufSk7XG5cbnRlc3QoXCJnZW5lcmF0ZSBwcm92aWRlciB3aXRoIG9ubHkgYmxvY2tfdHlwZXNcIiwgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjb2RlID0gbmV3IENvZGVNYWtlcigpO1xuICBjb25zdCB3b3JrZGlyID0gdG1wKFwicHJvdmlkZXIudGVzdFwiKTtcbiAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIFwiZml4dHVyZXNcIixcbiAgICAgICAgXCJlbGFzdGljc3RhY2stcHJvdmlkZXIudGVzdC5maXh0dXJlLmpzb25cIixcbiAgICAgICksXG4gICAgICBcInV0Zi04XCIsXG4gICAgKSxcbiAgKTtcbiAgbmV3IFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yKGNvZGUsIHNwZWMpLmdlbmVyYXRlQWxsKCk7XG4gIGF3YWl0IGNvZGUuc2F2ZSh3b3JrZGlyKTtcblxuICBjb25zdCBvdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKHdvcmtkaXIsIFwicHJvdmlkZXJzL2VsYXN0aWNzdGFjay9wcm92aWRlci9pbmRleC50c1wiKSxcbiAgICBcInV0Zi04XCIsXG4gICk7XG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2hTbmFwc2hvdCgpO1xuICAvLyBlbGFzdGljc3RhY2sgaGFzIG5vIHByb3ZpZGVyLWRlZmluZWQgZnVuY3Rpb25zIGluIHRoaXMgZml4dHVyZSAtIG5vXG4gIC8vIGdldHRlciwgbm8gY3Jvc3MtZGlyZWN0b3J5IGltcG9ydCBzaG91bGQgYmUgZW1pdHRlZC5cbiAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbihcInB1YmxpYyBnZXQgZnVuY3Rpb25zKClcIik7XG4gIGV4cGVjdChvdXRwdXQpLm5vdC50b0NvbnRhaW4oXCJwcm92aWRlci1mdW5jdGlvbnNcIik7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=write-only.test.d.ts.map
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ // Copyright (c) HashiCorp, Inc
27
+ // SPDX-License-Identifier: MPL-2.0
28
+ const fs = __importStar(require("fs"));
29
+ const path = __importStar(require("path"));
30
+ const provider_generator_1 = require("../../generator/provider-generator");
31
+ const codemaker_1 = require("codemaker");
32
+ const util_1 = require("../util");
33
+ const tmp = (0, util_1.createTmpHelper)();
34
+ test("generate a vault_alicloud_secret_backend resource with a write-only attribute", async () => {
35
+ const code = new codemaker_1.CodeMaker();
36
+ const workdir = tmp("write-only.test");
37
+ const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "write-only.test.fixture.json"), "utf-8"));
38
+ new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll();
39
+ await code.save(workdir);
40
+ const output = fs.readFileSync(path.join(workdir, "providers/vault/alicloud-secret-backend/index.ts"), "utf-8");
41
+ expect(output).toMatchSnapshot();
42
+ // The write-only attribute's getter is deprecated ...
43
+ expect(output).toMatch(/@deprecated Write-only: the provider never returns this value[\s\S]*?public get secretKeyWo\(\)/);
44
+ // ... its setter is a plain assignment ...
45
+ expect(output).toMatch(/public set secretKeyWo\(value: string\) \{\n\s*this\._secretKeyWo = value;\n\s*\}/);
46
+ // ... and usage registration happens at resolve time, from inside
47
+ // synthesizeAttributes()/synthesizeHclAttributes(), by wrapping the
48
+ // mapped value in markWriteOnlyAttribute() ...
49
+ expect(output).toMatch(/secret_key_wo: this\.markWriteOnlyAttribute\(cdktn\.stringToTerraform\(this\._secretKeyWo\)\),/);
50
+ expect(output).toMatch(/value: this\.markWriteOnlyAttribute\(cdktn\.stringToHclTerraform\(this\._secretKeyWo\)\),/);
51
+ // The required write-only attribute gets no reset method (required
52
+ // attributes never do) ...
53
+ expect(output).not.toMatch(/resetSecretKeyWo\b/);
54
+ // ... but the OPTIONAL write-only sibling does, exercising the reset ->
55
+ // clear -> synth-passes path end to end at the generator level.
56
+ expect(output).toMatch(/public resetSecondarySecretKeyWo\(\) \{\n\s*this\._secondarySecretKeyWo = undefined;\n\s*\}/);
57
+ expect(output).toMatch(/secondary_secret_key_wo: this\.markWriteOnlyAttribute\(cdktn\.stringToTerraform\(this\._secondarySecretKeyWo\)\),/);
58
+ // The non-write-only sibling attribute is untouched: its getter is
59
+ // emitted directly (no @deprecated JSDoc immediately above), its setter
60
+ // has no registration call, and its synthesis isn't wrapped.
61
+ expect(output).toMatch(/private _secretKeyWoVersion\?: number; \n\s*public get secretKeyWoVersion\(\)/);
62
+ expect(output).toMatch(/public set secretKeyWoVersion\(value: number\) \{\n\s*this\._secretKeyWoVersion = value;\n\s*\}/);
63
+ expect(output).toMatch(/secret_key_wo_version: cdktn\.numberToTerraform\(this\._secretKeyWoVersion\),/);
64
+ });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtb25seS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dldC9fX3Rlc3RzX18vZ2VuZXJhdG9yL3dyaXRlLW9ubHkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLDJFQUFnRjtBQUNoRix5Q0FBc0M7QUFDdEMsa0NBQTBDO0FBRTFDLE1BQU0sR0FBRyxHQUFHLElBQUEsc0JBQWUsR0FBRSxDQUFDO0FBRTlCLElBQUksQ0FBQywrRUFBK0UsRUFBRSxLQUFLLElBQUksRUFBRTtJQUMvRixNQUFNLElBQUksR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNyQixFQUFFLENBQUMsWUFBWSxDQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSw4QkFBOEIsQ0FBQyxFQUNoRSxPQUFPLENBQ1IsQ0FDRixDQUFDO0lBQ0YsSUFBSSwrQ0FBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGtEQUFrRCxDQUFDLEVBQ3RFLE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBRWpDLHNEQUFzRDtJQUN0RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUNwQixpR0FBaUcsQ0FDbEcsQ0FBQztJQUNGLDJDQUEyQztJQUMzQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUNwQixtRkFBbUYsQ0FDcEYsQ0FBQztJQUNGLGtFQUFrRTtJQUNsRSxvRUFBb0U7SUFDcEUsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQ3BCLGdHQUFnRyxDQUNqRyxDQUFDO0lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FDcEIsMkZBQTJGLENBQzVGLENBQUM7SUFFRixtRUFBbUU7SUFDbkUsMkJBQTJCO0lBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDakQsd0VBQXdFO0lBQ3hFLGdFQUFnRTtJQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUNwQiw2RkFBNkYsQ0FDOUYsQ0FBQztJQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQ3BCLG1IQUFtSCxDQUNwSCxDQUFDO0lBRUYsbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSw2REFBNkQ7SUFDN0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FDcEIsK0VBQStFLENBQ2hGLENBQUM7SUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUNwQixpR0FBaUcsQ0FDbEcsQ0FBQztJQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQ3BCLCtFQUErRSxDQUNoRixDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvciB9IGZyb20gXCIuLi8uLi9nZW5lcmF0b3IvcHJvdmlkZXItZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tIFwiY29kZW1ha2VyXCI7XG5pbXBvcnQgeyBjcmVhdGVUbXBIZWxwZXIgfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG5jb25zdCB0bXAgPSBjcmVhdGVUbXBIZWxwZXIoKTtcblxudGVzdChcImdlbmVyYXRlIGEgdmF1bHRfYWxpY2xvdWRfc2VjcmV0X2JhY2tlbmQgcmVzb3VyY2Ugd2l0aCBhIHdyaXRlLW9ubHkgYXR0cmlidXRlXCIsIGFzeW5jICgpID0+IHtcbiAgY29uc3QgY29kZSA9IG5ldyBDb2RlTWFrZXIoKTtcbiAgY29uc3Qgd29ya2RpciA9IHRtcChcIndyaXRlLW9ubHkudGVzdFwiKTtcbiAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UoXG4gICAgZnMucmVhZEZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCJmaXh0dXJlc1wiLCBcIndyaXRlLW9ubHkudGVzdC5maXh0dXJlLmpzb25cIiksXG4gICAgICBcInV0Zi04XCIsXG4gICAgKSxcbiAgKTtcbiAgbmV3IFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yKGNvZGUsIHNwZWMpLmdlbmVyYXRlQWxsKCk7XG4gIGF3YWl0IGNvZGUuc2F2ZSh3b3JrZGlyKTtcblxuICBjb25zdCBvdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKHdvcmtkaXIsIFwicHJvdmlkZXJzL3ZhdWx0L2FsaWNsb3VkLXNlY3JldC1iYWNrZW5kL2luZGV4LnRzXCIpLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgZXhwZWN0KG91dHB1dCkudG9NYXRjaFNuYXBzaG90KCk7XG5cbiAgLy8gVGhlIHdyaXRlLW9ubHkgYXR0cmlidXRlJ3MgZ2V0dGVyIGlzIGRlcHJlY2F0ZWQgLi4uXG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2goXG4gICAgL0BkZXByZWNhdGVkIFdyaXRlLW9ubHk6IHRoZSBwcm92aWRlciBuZXZlciByZXR1cm5zIHRoaXMgdmFsdWVbXFxzXFxTXSo/cHVibGljIGdldCBzZWNyZXRLZXlXb1xcKFxcKS8sXG4gICk7XG4gIC8vIC4uLiBpdHMgc2V0dGVyIGlzIGEgcGxhaW4gYXNzaWdubWVudCAuLi5cbiAgZXhwZWN0KG91dHB1dCkudG9NYXRjaChcbiAgICAvcHVibGljIHNldCBzZWNyZXRLZXlXb1xcKHZhbHVlOiBzdHJpbmdcXCkgXFx7XFxuXFxzKnRoaXNcXC5fc2VjcmV0S2V5V28gPSB2YWx1ZTtcXG5cXHMqXFx9LyxcbiAgKTtcbiAgLy8gLi4uIGFuZCB1c2FnZSByZWdpc3RyYXRpb24gaGFwcGVucyBhdCByZXNvbHZlIHRpbWUsIGZyb20gaW5zaWRlXG4gIC8vIHN5bnRoZXNpemVBdHRyaWJ1dGVzKCkvc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKSwgYnkgd3JhcHBpbmcgdGhlXG4gIC8vIG1hcHBlZCB2YWx1ZSBpbiBtYXJrV3JpdGVPbmx5QXR0cmlidXRlKCkgLi4uXG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2goXG4gICAgL3NlY3JldF9rZXlfd286IHRoaXNcXC5tYXJrV3JpdGVPbmx5QXR0cmlidXRlXFwoY2RrdG5cXC5zdHJpbmdUb1RlcnJhZm9ybVxcKHRoaXNcXC5fc2VjcmV0S2V5V29cXClcXCksLyxcbiAgKTtcbiAgZXhwZWN0KG91dHB1dCkudG9NYXRjaChcbiAgICAvdmFsdWU6IHRoaXNcXC5tYXJrV3JpdGVPbmx5QXR0cmlidXRlXFwoY2RrdG5cXC5zdHJpbmdUb0hjbFRlcnJhZm9ybVxcKHRoaXNcXC5fc2VjcmV0S2V5V29cXClcXCksLyxcbiAgKTtcblxuICAvLyBUaGUgcmVxdWlyZWQgd3JpdGUtb25seSBhdHRyaWJ1dGUgZ2V0cyBubyByZXNldCBtZXRob2QgKHJlcXVpcmVkXG4gIC8vIGF0dHJpYnV0ZXMgbmV2ZXIgZG8pIC4uLlxuICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvcmVzZXRTZWNyZXRLZXlXb1xcYi8pO1xuICAvLyAuLi4gYnV0IHRoZSBPUFRJT05BTCB3cml0ZS1vbmx5IHNpYmxpbmcgZG9lcywgZXhlcmNpc2luZyB0aGUgcmVzZXQgLT5cbiAgLy8gY2xlYXIgLT4gc3ludGgtcGFzc2VzIHBhdGggZW5kIHRvIGVuZCBhdCB0aGUgZ2VuZXJhdG9yIGxldmVsLlxuICBleHBlY3Qob3V0cHV0KS50b01hdGNoKFxuICAgIC9wdWJsaWMgcmVzZXRTZWNvbmRhcnlTZWNyZXRLZXlXb1xcKFxcKSBcXHtcXG5cXHMqdGhpc1xcLl9zZWNvbmRhcnlTZWNyZXRLZXlXbyA9IHVuZGVmaW5lZDtcXG5cXHMqXFx9LyxcbiAgKTtcbiAgZXhwZWN0KG91dHB1dCkudG9NYXRjaChcbiAgICAvc2Vjb25kYXJ5X3NlY3JldF9rZXlfd286IHRoaXNcXC5tYXJrV3JpdGVPbmx5QXR0cmlidXRlXFwoY2RrdG5cXC5zdHJpbmdUb1RlcnJhZm9ybVxcKHRoaXNcXC5fc2Vjb25kYXJ5U2VjcmV0S2V5V29cXClcXCksLyxcbiAgKTtcblxuICAvLyBUaGUgbm9uLXdyaXRlLW9ubHkgc2libGluZyBhdHRyaWJ1dGUgaXMgdW50b3VjaGVkOiBpdHMgZ2V0dGVyIGlzXG4gIC8vIGVtaXR0ZWQgZGlyZWN0bHkgKG5vIEBkZXByZWNhdGVkIEpTRG9jIGltbWVkaWF0ZWx5IGFib3ZlKSwgaXRzIHNldHRlclxuICAvLyBoYXMgbm8gcmVnaXN0cmF0aW9uIGNhbGwsIGFuZCBpdHMgc3ludGhlc2lzIGlzbid0IHdyYXBwZWQuXG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2goXG4gICAgL3ByaXZhdGUgX3NlY3JldEtleVdvVmVyc2lvblxcPzogbnVtYmVyOyBcXG5cXHMqcHVibGljIGdldCBzZWNyZXRLZXlXb1ZlcnNpb25cXChcXCkvLFxuICApO1xuICBleHBlY3Qob3V0cHV0KS50b01hdGNoKFxuICAgIC9wdWJsaWMgc2V0IHNlY3JldEtleVdvVmVyc2lvblxcKHZhbHVlOiBudW1iZXJcXCkgXFx7XFxuXFxzKnRoaXNcXC5fc2VjcmV0S2V5V29WZXJzaW9uID0gdmFsdWU7XFxuXFxzKlxcfS8sXG4gICk7XG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2goXG4gICAgL3NlY3JldF9rZXlfd29fdmVyc2lvbjogY2RrdG5cXC5udW1iZXJUb1RlcnJhZm9ybVxcKHRoaXNcXC5fc2VjcmV0S2V5V29WZXJzaW9uXFwpLC8sXG4gICk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=target-versions.test.d.ts.map
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ // Copyright (c) HashiCorp, Inc
27
+ // SPDX-License-Identifier: MPL-2.0
28
+ const fs = __importStar(require("fs-extra"));
29
+ const path = __importStar(require("path"));
30
+ const commons_1 = require("@cdktn/commons");
31
+ const util_1 = require("./util");
32
+ const mockReadSchema = jest.fn();
33
+ jest.mock("@cdktn/provider-schema", () => ({
34
+ readSchema: (...args) => mockReadSchema(...args),
35
+ }));
36
+ // Imported after the mock so ConstructsMaker picks up the mocked readSchema.
37
+ const constructs_maker_1 = require("../constructs-maker");
38
+ const tmp = (0, util_1.createTmpHelper)();
39
+ const constraint = {
40
+ fqn: "hashicorp/random",
41
+ name: "random",
42
+ source: "hashicorp/random",
43
+ version: "3.1.3",
44
+ };
45
+ // Minimal schema - no resources/data sources - so generation stays within
46
+ // pure TypeScript emission (no jsii-pacmak invocation), mirroring the
47
+ // "empty-provider-resources" fixture used elsewhere in this package.
48
+ const fakeSchema = {
49
+ providerSchema: {
50
+ format_version: "0.2",
51
+ provider_schemas: {
52
+ "registry.terraform.io/hashicorp/random": {
53
+ resource_schemas: null,
54
+ data_source_schemas: null,
55
+ },
56
+ },
57
+ provider_versions: {
58
+ "registry.terraform.io/hashicorp/random": "3.1.3",
59
+ },
60
+ cli_name: "terraform",
61
+ cli_version: "1.7.5",
62
+ },
63
+ };
64
+ describe("targetVersions threading through 'cdktn get'", () => {
65
+ beforeEach(() => {
66
+ mockReadSchema.mockReset();
67
+ mockReadSchema.mockResolvedValue(fakeSchema);
68
+ });
69
+ it("passes GetOptions.targetVersions through to readSchema", async () => {
70
+ const workdir = tmp("target-versions-thread.test");
71
+ const targetVersions = { terraform: ">=1.5.7" };
72
+ const options = {
73
+ codeMakerOutput: workdir,
74
+ targetLanguage: commons_1.Language.TYPESCRIPT,
75
+ targetVersions,
76
+ };
77
+ const maker = new constructs_maker_1.ConstructsMaker(options, "/some/cache/path");
78
+ await maker.generate([constraint]);
79
+ expect(mockReadSchema).toHaveBeenCalledWith([constraint], "/some/cache/path", targetVersions);
80
+ });
81
+ it("omits targetVersions from the readSchema call when not configured", async () => {
82
+ const workdir = tmp("target-versions-absent.test");
83
+ const options = {
84
+ codeMakerOutput: workdir,
85
+ targetLanguage: commons_1.Language.TYPESCRIPT,
86
+ };
87
+ const maker = new constructs_maker_1.ConstructsMaker(options);
88
+ await maker.generate([constraint]);
89
+ expect(mockReadSchema).toHaveBeenCalledWith([constraint], undefined, undefined);
90
+ });
91
+ it("stamps constraints.json with targetVersions + cli identity, and older constraints.json files without those fields are still treated as fresh (no forced regeneration)", async () => {
92
+ const workdir = tmp("target-versions-stamp.test");
93
+ const targetVersions = { terraform: ">=1.5.7" };
94
+ const options = {
95
+ codeMakerOutput: workdir,
96
+ targetLanguage: commons_1.Language.TYPESCRIPT,
97
+ targetVersions,
98
+ };
99
+ const maker = new constructs_maker_1.ConstructsMaker(options);
100
+ await maker.generate([constraint]);
101
+ const constraintsFile = JSON.parse(await fs.readFile(path.join(workdir, "constraints.json"), "utf8"));
102
+ expect(constraintsFile.targetVersions).toEqual(targetVersions);
103
+ expect(constraintsFile.cli).toEqual({
104
+ name: "terraform",
105
+ version: "1.7.5",
106
+ });
107
+ // Rewrite constraints.json as it would have looked before this feature
108
+ // landed (no targetVersions/cli fields), keeping the rest identical -
109
+ // this simulates re-running `cdktn get` against an output directory
110
+ // generated by an older cdktn version.
111
+ const { targetVersions: _tv, cli: _cli, ...legacyConstraints } = constraintsFile;
112
+ await fs.writeFile(path.join(workdir, "constraints.json"), JSON.stringify(legacyConstraints, null, 2));
113
+ const maker2 = new constructs_maker_1.ConstructsMaker(options);
114
+ const toGenerate = await maker2.filterAlreadyGenerated([constraint]);
115
+ expect(toGenerate).toEqual([]);
116
+ });
117
+ it("threads a partial targetVersions (single product) through unchanged and stamps it verbatim", async () => {
118
+ const workdir = tmp("target-versions-partial.test");
119
+ const targetVersions = { opentofu: ">=1.11.0" };
120
+ const options = {
121
+ codeMakerOutput: workdir,
122
+ targetLanguage: commons_1.Language.TYPESCRIPT,
123
+ targetVersions,
124
+ };
125
+ const maker = new constructs_maker_1.ConstructsMaker(options);
126
+ await maker.generate([constraint]);
127
+ expect(mockReadSchema).toHaveBeenCalledWith([constraint], undefined, targetVersions);
128
+ // The stamp records exactly what the project declared - no terraform
129
+ // default is injected at get-time (defaulting for the undeclared
130
+ // product happens only at synth-time, in resolveTargetVersions).
131
+ const constraintsFile = JSON.parse(await fs.readFile(path.join(workdir, "constraints.json"), "utf8"));
132
+ expect(constraintsFile.targetVersions).toEqual({ opentofu: ">=1.11.0" });
133
+ });
134
+ it("omits the cli stamp when the fetched schema carries no CLI version metadata", async () => {
135
+ const workdir = tmp("target-versions-no-cli.test");
136
+ const { cli_name: _cliName, cli_version: _cliVersion, ...schemaWithoutCli } = fakeSchema.providerSchema;
137
+ mockReadSchema.mockResolvedValue({ providerSchema: schemaWithoutCli });
138
+ const targetVersions = { terraform: ">=1.5.7" };
139
+ const options = {
140
+ codeMakerOutput: workdir,
141
+ targetLanguage: commons_1.Language.TYPESCRIPT,
142
+ targetVersions,
143
+ };
144
+ const maker = new constructs_maker_1.ConstructsMaker(options);
145
+ await maker.generate([constraint]);
146
+ const constraintsFile = JSON.parse(await fs.readFile(path.join(workdir, "constraints.json"), "utf8"));
147
+ expect(constraintsFile.cli).toBeUndefined();
148
+ expect(constraintsFile.targetVersions).toEqual(targetVersions);
149
+ });
150
+ it("does not force regeneration when targetVersions change between runs", async () => {
151
+ // The stamp is diagnostic-only: per the GetOptions.targetVersions doc,
152
+ // targetVersions never filters codegen (the full schema surface is
153
+ // always generated), so freshness only compares the providers map and
154
+ // the cdktf version.
155
+ const workdir = tmp("target-versions-change.test");
156
+ const options = {
157
+ codeMakerOutput: workdir,
158
+ targetLanguage: commons_1.Language.TYPESCRIPT,
159
+ targetVersions: { terraform: ">=1.5.7" },
160
+ };
161
+ const maker = new constructs_maker_1.ConstructsMaker(options);
162
+ await maker.generate([constraint]);
163
+ const maker2 = new constructs_maker_1.ConstructsMaker({
164
+ ...options,
165
+ targetVersions: { terraform: ">=1.11.0" },
166
+ });
167
+ const toGenerate = await maker2.filterAlreadyGenerated([constraint]);
168
+ expect(toGenerate).toEqual([]);
169
+ });
170
+ });
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LXZlcnNpb25zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2V0L19fdGVzdHNfXy90YXJnZXQtdmVyc2lvbnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyw2Q0FBK0I7QUFDL0IsMkNBQTZCO0FBQzdCLDRDQUl3QjtBQUN4QixpQ0FBeUM7QUFFekMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN6QyxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQzVELENBQUMsQ0FBQyxDQUFDO0FBRUosNkVBQTZFO0FBQzdFLDBEQUFrRTtBQUVsRSxNQUFNLEdBQUcsR0FBRyxJQUFBLHNCQUFlLEdBQUUsQ0FBQztBQUU5QixNQUFNLFVBQVUsR0FBa0M7SUFDaEQsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixJQUFJLEVBQUUsUUFBUTtJQUNkLE1BQU0sRUFBRSxrQkFBa0I7SUFDMUIsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQztBQUVGLDBFQUEwRTtBQUMxRSxzRUFBc0U7QUFDdEUscUVBQXFFO0FBQ3JFLE1BQU0sVUFBVSxHQUFHO0lBQ2pCLGNBQWMsRUFBRTtRQUNkLGNBQWMsRUFBRSxLQUFjO1FBQzlCLGdCQUFnQixFQUFFO1lBQ2hCLHdDQUF3QyxFQUFFO2dCQUN4QyxnQkFBZ0IsRUFBRSxJQUFJO2dCQUN0QixtQkFBbUIsRUFBRSxJQUFJO2FBQzFCO1NBQ0Y7UUFDRCxpQkFBaUIsRUFBRTtZQUNqQix3Q0FBd0MsRUFBRSxPQUFPO1NBQ2xEO1FBQ0QsUUFBUSxFQUFFLFdBQVc7UUFDckIsV0FB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TUFBTSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUVBQXFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbkYsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUscUJBQXFCO1FBQ3JCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFlO1lBQzFCLGVBQWUsRUFBRSxPQUFPO1lBQ3hCLGNBQWMsRUFBRSxrQkFBUSxDQUFDLFVBQVU7WUFDbkMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtTQUN6QyxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsSUFBSSxrQ0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQ0FBZSxDQUFDO1lBQ2pDLEdBQUcsT0FBTztZQUNWLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7U0FDMUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7XG4gIExhbmd1YWdlLFxuICBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludCxcbiAgVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlVG1wSGVscGVyIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5jb25zdCBtb2NrUmVhZFNjaGVtYSA9IGplc3QuZm4oKTtcbmplc3QubW9jayhcIkBjZGt0bi9wcm92aWRlci1zY2hlbWFcIiwgKCkgPT4gKHtcbiAgcmVhZFNjaGVtYTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gbW9ja1JlYWRTY2hlbWEoLi4uYXJncyksXG59KSk7XG5cbi8vIEltcG9ydGVkIGFmdGVyIHRoZSBtb2NrIHNvIENvbnN0cnVjdHNNYWtlciBwaWNrcyB1cCB0aGUgbW9ja2VkIHJlYWRTY2hlbWEuXG5pbXBvcnQgeyBDb25zdHJ1Y3RzTWFrZXIsIEdldE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uc3RydWN0cy1tYWtlclwiO1xuXG5jb25zdCB0bXAgPSBjcmVhdGVUbXBIZWxwZXIoKTtcblxuY29uc3QgY29uc3RyYWludDogVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnQgPSB7XG4gIGZxbjogXCJoYXNoaWNvcnAvcmFuZG9tXCIsXG4gIG5hbWU6IFwicmFuZG9tXCIsXG4gIHNvdXJjZTogXCJoYXNoaWNvcnAvcmFuZG9tXCIsXG4gIHZlcnNpb246IFwiMy4xLjNcIixcbn07XG5cbi8vIE1pbmltYWwgc2NoZW1hIC0gbm8gcmVzb3VyY2VzL2RhdGEgc291cmNlcyAtIHNvIGdlbmVyYXRpb24gc3RheXMgd2l0aGluXG4vLyBwdXJlIFR5cGVTY3JpcHQgZW1pc3Npb24gKG5vIGpzaWktcGFjbWFrIGludm9jYXRpb24pLCBtaXJyb3JpbmcgdGhlXG4vLyBcImVtcHR5LXByb3ZpZGVyLXJlc291cmNlc1wiIGZpeHR1cmUgdXNlZCBlbHNld2hlcmUgaW4gdGhpcyBwYWNrYWdlLlxuY29uc3QgZmFrZVNjaGVtYSA9IHtcbiAgcHJvdmlkZXJTY2hlbWE6IHtcbiAgICBmb3JtYXRfdmVyc2lvbjogXCIwLjJcIiBhcyBjb25zdCxcbiAgICBwcm92aWRlcl9zY2hlbWFzOiB7XG4gICAgICBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvcmFuZG9tXCI6IHtcbiAgICAgICAgcmVzb3VyY2Vfc2NoZW1hczogbnVsbCxcbiAgICAgICAgZGF0YV9zb3VyY2Vfc2NoZW1hczogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwcm92aWRlcl92ZXJzaW9uczoge1xuICAgICAgXCJyZWdpc3RyeS50ZXJyYWZvcm0uaW8vaGFzaGljb3JwL3JhbmRvbVwiOiBcIjMuMS4zXCIsXG4gICAgfSxcbiAgICBjbGlfbmFtZTogXCJ0ZXJyYWZvcm1cIixcbiAgICBjbGlfdmVyc2lvbjogXCIxLjcuNVwiLFxuICB9LFxufTtcblxuZGVzY3JpYmUoXCJ0YXJnZXRWZXJzaW9ucyB0aHJlYWRpbmcgdGhyb3VnaCAnY2RrdG4gZ2V0J1wiLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tSZWFkU2NoZW1hLm1vY2tSZXNldCgpO1xuICAgIG1vY2tSZWFkU2NoZW1hLm1vY2tSZXNvbHZlZFZhbHVlKGZha2VTY2hlbWEpO1xuICB9KTtcblxuICBpdChcInBhc3NlcyBHZXRPcHRpb25zLnRhcmdldFZlcnNpb25zIHRocm91Z2ggdG8gcmVhZFNjaGVtYVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2RpciA9IHRtcChcInRhcmdldC12ZXJzaW9ucy10aHJlYWQudGVzdFwiKTtcbiAgICBjb25zdCB0YXJnZXRWZXJzaW9uczogVGVycmFmb3JtVGFyZ2V0VmVyc2lvbnMgPSB7IHRlcnJhZm9ybTogXCI+PTEuNS43XCIgfTtcbiAgICBjb25zdCBvcHRpb25zOiBHZXRPcHRpb25zID0ge1xuICAgICAgY29kZU1ha2VyT3V0cHV0OiB3b3JrZGlyLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IExhbmd1YWdlLlRZUEVTQ1JJUFQsXG4gICAgICB0YXJnZXRWZXJzaW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgbWFrZXIgPSBuZXcgQ29uc3RydWN0c01ha2VyKG9wdGlvbnMsIFwiL3NvbWUvY2FjaGUvcGF0aFwiKTtcbiAgICBhd2FpdCBtYWtlci5nZW5lcmF0ZShbY29uc3RyYWludF0pO1xuXG4gICAgZXhwZWN0KG1vY2tSZWFkU2NoZW1hKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFtjb25zdHJhaW50XSxcbiAgICAgIFwiL3NvbWUvY2FjaGUvcGF0aFwiLFxuICAgICAgdGFyZ2V0VmVyc2lvbnMsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJvbWl0cyB0YXJnZXRWZXJzaW9ucyBmcm9tIHRoZSByZWFkU2NoZW1hIGNhbGwgd2hlbiBub3QgY29uZmlndXJlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2RpciA9IHRtcChcInRhcmdldC12ZXJzaW9ucy1hYnNlbnQudGVzdFwiKTtcbiAgICBjb25zdCBvcHRpb25zOiBHZXRPcHRpb25zID0ge1xuICAgICAgY29kZU1ha2VyT3V0cHV0OiB3b3JrZGlyLFxuICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IExhbmd1YWdlLlRZUEVTQ1JJUFQsXG4gICAgfTtcblxuICAgIGNvbnN0IG1ha2VyID0gbmV3IENvbnN0cnVjdHNNYWtlcihvcHRpb25zKTtcbiAgICBhd2FpdCBtYWtlci5nZW5lcmF0ZShbY29uc3RyYWludF0pO1xuXG4gICAgZXhwZWN0KG1vY2tSZWFkU2NoZW1hKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFtjb25zdHJhaW50XSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICApO1xuICB9KTtcblxuICBpdChcInN0YW1wcyBjb25zdHJhaW50cy5qc29uIHdpdGggdGFyZ2V0VmVyc2lvbnMgKyBjbGkgaWRlbnRpdHksIGFuZCBvbGRlciBjb25zdHJhaW50cy5qc29uIGZpbGVzIHdpdGhvdXQgdGhvc2UgZmllbGRzIGFyZSBzdGlsbCB0cmVhdGVkIGFzIGZyZXNoIChubyBmb3JjZWQgcmVnZW5lcmF0aW9uKVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2RpciA9IHRtcChcInRhcmdldC12ZXJzaW9ucy1zdGFtcC50ZXN0XCIpO1xuICAgIGNvbnN0IHRhcmdldFZlcnNpb25zOiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyA9IHsgdGVycmFmb3JtOiBcIj49MS41LjdcIiB9O1xuICAgIGNvbnN0IG9wdGlvbnM6IEdldE9wdGlvbnMgPSB7XG4gICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICB0YXJnZXRMYW5ndWFnZTogTGFuZ3VhZ2UuVFlQRVNDUklQVCxcbiAgICAgIHRhcmdldFZlcnNpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCBtYWtlciA9IG5ldyBDb25zdHJ1Y3RzTWFrZXIob3B0aW9ucyk7XG4gICAgYXdhaXQgbWFrZXIuZ2VuZXJhdGUoW2NvbnN0cmFpbnRdKTtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRzRmlsZSA9IEpTT04ucGFyc2UoXG4gICAgICBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2RpciwgXCJjb25zdHJhaW50cy5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBleHBlY3QoY29uc3RyYWludHNGaWxlLnRhcmdldFZlcnNpb25zKS50b0VxdWFsKHRhcmdldFZlcnNpb25zKTtcbiAgICBleHBlY3QoY29uc3RyYWludHNGaWxlLmNsaSkudG9FcXVhbCh7XG4gICAgICBuYW1lOiBcInRlcnJhZm9ybVwiLFxuICAgICAgdmVyc2lvbjogXCIxLjcuNVwiLFxuICAgIH0pO1xuXG4gICAgLy8gUmV3cml0ZSBjb25zdHJhaW50cy5qc29uIGFzIGl0IHdvdWxkIGhhdmUgbG9va2VkIGJlZm9yZSB0aGlzIGZlYXR1cmVcbiAgICAvLyBsYW5kZWQgKG5vIHRhcmdldFZlcnNpb25zL2NsaSBmaWVsZHMpLCBrZWVwaW5nIHRoZSByZXN0IGlkZW50aWNhbCAtXG4gICAgLy8gdGhpcyBzaW11bGF0ZXMgcmUtcnVubmluZyBgY2RrdG4gZ2V0YCBhZ2FpbnN0IGFuIG91dHB1dCBkaXJlY3RvcnlcbiAgICAvLyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgY2RrdG4gdmVyc2lvbi5cbiAgICBjb25zdCB7XG4gICAgICB0YXJnZXRWZXJzaW9uczogX3R2LFxuICAgICAgY2xpOiBfY2xpLFxuICAgICAgLi4ubGVnYWN5Q29uc3RyYWludHNcbiAgICB9ID0gY29uc3RyYWludHNGaWxlO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbih3b3JrZGlyLCBcImNvbnN0cmFpbnRzLmpzb25cIiksXG4gICAgICBKU09OLnN0cmluZ2lmeShsZWdhY3lDb25zdHJhaW50cywgbnVsbCwgMiksXG4gICAgKTtcblxuICAgIGNvbnN0IG1ha2VyMiA9IG5ldyBDb25zdHJ1Y3RzTWFrZXIob3B0aW9ucyk7XG4gICAgY29uc3QgdG9HZW5lcmF0ZSA9IGF3YWl0IG1ha2VyMi5maWx0ZXJBbHJlYWR5R2VuZXJhdGVkKFtjb25zdHJhaW50XSk7XG4gICAgZXhwZWN0KHRvR2VuZXJhdGUpLnRvRXF1YWwoW10pO1xuICB9KTtcblxuICBpdChcInRocmVhZHMgYSBwYXJ0aWFsIHRhcmdldFZlcnNpb25zIChzaW5nbGUgcHJvZHVjdCkgdGhyb3VnaCB1bmNoYW5nZWQgYW5kIHN0YW1wcyBpdCB2ZXJiYXRpbVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2RpciA9IHRtcChcInRhcmdldC12ZXJzaW9ucy1wYXJ0aWFsLnRlc3RcIik7XG4gICAgY29uc3QgdGFyZ2V0VmVyc2lvbnM6IFRlcnJhZm9ybVRhcmdldFZlcnNpb25zID0geyBvcGVudG9mdTogXCI+PTEuMTEuMFwiIH07XG4gICAgY29uc3Qgb3B0aW9uczogR2V0T3B0aW9ucyA9IHtcbiAgICAgIGNvZGVNYWtlck91dHB1dDogd29ya2RpcixcbiAgICAgIHRhcmdldExhbmd1YWdlOiBMYW5ndWFnZS5UWVBFU0NSSVBULFxuICAgICAgdGFyZ2V0VmVyc2lvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IG1ha2VyID0gbmV3IENvbnN0cnVjdHNNYWtlcihvcHRpb25zKTtcbiAgICBhd2FpdCBtYWtlci5nZW5lcmF0ZShbY29uc3RyYWludF0pO1xuXG4gICAgZXhwZWN0KG1vY2tSZWFkU2NoZW1hKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFtjb25zdHJhaW50XSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhcmdldFZlcnNpb25zLFxuICAgICk7XG5cbiAgICAvLyBUaGUgc3RhbXAgcmVjb3JkcyBleGFjdGx5IHdoYXQgdGhlIHByb2plY3QgZGVjbGFyZWQgLSBubyB0ZXJyYWZvcm1cbiAgICAvLyBkZWZhdWx0IGlzIGluamVjdGVkIGF0IGdldC10aW1lIChkZWZhdWx0aW5nIGZvciB0aGUgdW5kZWNsYXJlZFxuICAgIC8vIHByb2R1Y3QgaGFwcGVucyBvbmx5IGF0IHN5bnRoLXRpbWUsIGluIHJlc29sdmVUYXJnZXRWZXJzaW9ucykuXG4gICAgY29uc3QgY29uc3RyYWludHNGaWxlID0gSlNPTi5wYXJzZShcbiAgICAgIGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbih3b3JrZGlyLCBcImNvbnN0cmFpbnRzLmpzb25cIiksIFwidXRmOFwiKSxcbiAgICApO1xuICAgIGV4cGVjdChjb25zdHJhaW50c0ZpbGUudGFyZ2V0VmVyc2lvbnMpLnRvRXF1YWwoeyBvcGVudG9mdTogXCI+PTEuMTEuMFwiIH0pO1xuICB9KTtcblxuICBpdChcIm9taXRzIHRoZSBjbGkgc3RhbXAgd2hlbiB0aGUgZmV0Y2hlZCBzY2hlbWEgY2FycmllcyBubyBDTEkgdmVyc2lvbiBtZXRhZGF0YVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgd29ya2RpciA9IHRtcChcInRhcmdldC12ZXJzaW9ucy1uby1jbGkudGVzdFwiKTtcbiAgICBjb25zdCB7XG4gICAgICBjbGlfbmFtZTogX2NsaU5hbWUsXG4gICAgICBjbGlfdmVyc2lvbjogX2NsaVZlcnNpb24sXG4gICAgICAuLi5zY2hlbWFXaXRob3V0Q2xpXG4gICAgfSA9IGZha2VTY2hlbWEucHJvdmlkZXJTY2hlbWE7XG4gICAgbW9ja1JlYWRTY2hlbWEubW9ja1Jlc29sdmVkVmFsdWUoeyBwcm92aWRlclNjaGVtYTogc2NoZW1hV2l0aG91dENsaSB9KTtcblxuICAgIGNvbnN0IHRhcmdldFZlcnNpb25zOiBUZXJyYWZvcm1UYXJnZXRWZXJzaW9ucyA9IHsgdGVycmFmb3JtOiBcIj49MS41LjdcIiB9O1xuICAgIGNvbnN0IG9wdGlvbnM6IEdldE9wdGlvbnMgPSB7XG4gICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICB0YXJnZXRMYW5ndWFnZTogTGFuZ3VhZ2UuVFlQRVNDUklQVCxcbiAgICAgIHRhcmdldFZlcnNpb25zLFxuICAgIH07XG5cbiAgICBjb25zdCBtYWtlciA9IG5ldyBDb25zdHJ1Y3RzTWFrZXIob3B0aW9ucyk7XG4gICAgYXdhaXQgbWFrZXIuZ2VuZXJhdGUoW2NvbnN0cmFpbnRdKTtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRzRmlsZSA9IEpTT04ucGFyc2UoXG4gICAgICBhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2RpciwgXCJjb25zdHJhaW50cy5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBleHBlY3QoY29uc3RyYWludHNGaWxlLmNsaSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChjb25zdHJhaW50c0ZpbGUudGFyZ2V0VmVyc2lvbnMpLnRvRXF1YWwodGFyZ2V0VmVyc2lvbnMpO1xuICB9KTtcblxuICBpdChcImRvZXMgbm90IGZvcmNlIHJlZ2VuZXJhdGlvbiB3aGVuIHRhcmdldFZlcnNpb25zIGNoYW5nZSBiZXR3ZWVuIHJ1bnNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoZSBzdGFtcCBpcyBkaWFnbm9zdGljLW9ubHk6IHBlciB0aGUgR2V0T3B0aW9ucy50YXJnZXRWZXJzaW9ucyBkb2MsXG4gICAgLy8gdGFyZ2V0VmVyc2lvbnMgbmV2ZXIgZmlsdGVycyBjb2RlZ2VuICh0aGUgZnVsbCBzY2hlbWEgc3VyZmFjZSBpc1xuICAgIC8vIGFsd2F5cyBnZW5lcmF0ZWQpLCBzbyBmcmVzaG5lc3Mgb25seSBjb21wYXJlcyB0aGUgcHJvdmlkZXJzIG1hcCBhbmRcbiAgICAvLyB0aGUgY2RrdGYgdmVyc2lvbi5cbiAgICBjb25zdCB3b3JrZGlyID0gdG1wKFwidGFyZ2V0LXZlcnNpb25zLWNoYW5nZS50ZXN0XCIpO1xuICAgIGNvbnN0IG9wdGlvbnM6IEdldE9wdGlvbnMgPSB7XG4gICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICB0YXJnZXRMYW5ndWFnZTogTGFuZ3VhZ2UuVFlQRVNDUklQVCxcbiAgICAgIHRhcmdldFZlcnNpb25zOiB7IHRlcnJhZm9ybTogXCI+PTEuNS43XCIgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgbWFrZXIgPSBuZXcgQ29uc3RydWN0c01ha2VyKG9wdGlvbnMpO1xuICAgIGF3YWl0IG1ha2VyLmdlbmVyYXRlKFtjb25zdHJhaW50XSk7XG5cbiAgICBjb25zdCBtYWtlcjIgPSBuZXcgQ29uc3RydWN0c01ha2VyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0YXJnZXRWZXJzaW9uczogeyB0ZXJyYWZvcm06IFwiPj0xLjExLjBcIiB9LFxuICAgIH0pO1xuICAgIGNvbnN0IHRvR2VuZXJhdGUgPSBhd2FpdCBtYWtlcjIuZmlsdGVyQWxyZWFkeUdlbmVyYXRlZChbY29uc3RyYWludF0pO1xuICAgIGV4cGVjdCh0b0dlbmVyYXRlKS50b0VxdWFsKFtdKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { CodeMaker } from "codemaker";
2
- import { TerraformDependencyConstraint, type LanguageOptions } from "@cdktn/commons";
2
+ import { TerraformDependencyConstraint, type LanguageOptions, type TerraformTargetVersions } from "@cdktn/commons";
3
3
  import { Language } from "@cdktn/commons";
4
4
  export interface GenerateJSIIOptions {
5
5
  entrypoint: string;
@@ -55,6 +55,13 @@ export interface GetOptions {
55
55
  * Language-specific code generation options.
56
56
  */
57
57
  readonly languageOptions?: LanguageOptions;
58
+ /**
59
+ * The project's declared targetVersions (cdktf.json). Used to drive the
60
+ * fetch-time emission-gap warning in @cdktn/provider-schema and to stamp
61
+ * the generated constraints.json for diagnostics. Does NOT filter codegen:
62
+ * the full surface is always generated, narrowing happens at synth.
63
+ */
64
+ readonly targetVersions?: TerraformTargetVersions;
58
65
  }
59
66
  export declare class ConstructsMaker {
60
67
  private readonly options;