@cdktn/provider-generator 0.24.0-pre.9 → 0.24.0-pre.91

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 (124) hide show
  1. package/.spec.swcrc +22 -0
  2. package/LICENSE +355 -0
  3. package/README.md +1 -1
  4. package/build/__tests__/edge-provider-schema/builder.d.ts +9 -3
  5. package/build/__tests__/edge-provider-schema/builder.js +6 -3
  6. package/build/__tests__/edge-provider-schema/cli.js +8 -3
  7. package/build/__tests__/edge-provider-schema/index.js +119 -1
  8. package/build/__tests__/provider.test.js +4 -1
  9. package/build/get/__tests__/generator/ephemeral-resources.test.d.ts +2 -0
  10. package/build/get/__tests__/generator/ephemeral-resources.test.js +49 -0
  11. package/build/get/__tests__/generator/module-generator.test.js +12 -12
  12. package/build/get/__tests__/generator/provider-functions.test.d.ts +2 -0
  13. package/build/get/__tests__/generator/provider-functions.test.js +176 -0
  14. package/build/get/__tests__/generator/provider-source-matching.test.d.ts +2 -0
  15. package/build/get/__tests__/generator/provider-source-matching.test.js +45 -0
  16. package/build/get/__tests__/generator/provider.test.js +9 -1
  17. package/build/get/__tests__/generator/supported-stored-classes.test.d.ts +2 -0
  18. package/build/get/__tests__/generator/supported-stored-classes.test.js +137 -0
  19. package/build/get/__tests__/generator/types.test.js +44 -1
  20. package/build/get/__tests__/generator/write-only.test.d.ts +2 -0
  21. package/build/get/__tests__/generator/write-only.test.js +65 -0
  22. package/build/get/__tests__/target-versions.test.d.ts +2 -0
  23. package/build/get/__tests__/target-versions.test.js +171 -0
  24. package/build/get/constructs-maker.d.ts +8 -1
  25. package/build/get/constructs-maker.js +46 -10
  26. package/build/get/generator/emitter/attributes-emitter.d.ts +13 -2
  27. package/build/get/generator/emitter/attributes-emitter.js +71 -5
  28. package/build/get/generator/emitter/index.d.ts +1 -0
  29. package/build/get/generator/emitter/index.js +2 -1
  30. package/build/get/generator/emitter/provider-functions-emitter.d.ts +11 -0
  31. package/build/get/generator/emitter/provider-functions-emitter.js +94 -0
  32. package/build/get/generator/emitter/resource-emitter.d.ts +5 -1
  33. package/build/get/generator/emitter/resource-emitter.js +83 -7
  34. package/build/get/generator/emitter/struct-emitter.js +10 -10
  35. package/build/get/generator/models/attribute-model.d.ts +4 -0
  36. package/build/get/generator/models/attribute-model.js +50 -4
  37. package/build/get/generator/models/attribute-type-model.d.ts +24 -0
  38. package/build/get/generator/models/attribute-type-model.js +91 -5
  39. package/build/get/generator/models/index.d.ts +1 -0
  40. package/build/get/generator/models/index.js +2 -1
  41. package/build/get/generator/models/provider-function-model.d.ts +102 -0
  42. package/build/get/generator/models/provider-function-model.js +667 -0
  43. package/build/get/generator/models/resource-model.d.ts +3 -0
  44. package/build/get/generator/models/resource-model.js +13 -4
  45. package/build/get/generator/models/struct.d.ts +2 -0
  46. package/build/get/generator/models/struct.js +6 -2
  47. package/build/get/generator/models/supported-stored-classes.d.ts +5 -0
  48. package/build/get/generator/models/supported-stored-classes.js +86 -0
  49. package/build/get/generator/module-generator.js +3 -3
  50. package/build/get/generator/provider-generator.d.ts +2 -0
  51. package/build/get/generator/provider-generator.js +41 -6
  52. package/build/get/generator/resource-parser.js +3 -1
  53. package/jest.config.js +16 -9
  54. package/package.json +28 -27
  55. package/package.sh +1 -1
  56. package/src/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +4 -0
  57. package/src/__tests__/__snapshots__/provider.test.ts.snap +2828 -2828
  58. package/src/__tests__/edge-provider-schema/builder.ts +201 -0
  59. package/src/__tests__/edge-provider-schema/cli.ts +51 -0
  60. package/src/__tests__/edge-provider-schema/index.ts +284 -0
  61. package/src/__tests__/edge-provider-schema.test.ts +24 -0
  62. package/src/__tests__/provider.test.ts +183 -0
  63. package/src/get/__tests__/constructs-maker.test.ts +118 -0
  64. package/src/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +5 -5
  65. package/src/get/__tests__/generator/__snapshots__/ephemeral-resources.test.ts.snap +524 -0
  66. package/src/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +3310 -3310
  67. package/src/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +355 -355
  68. package/src/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +8 -8
  69. package/src/get/__tests__/generator/__snapshots__/provider-functions.test.ts.snap +444 -0
  70. package/src/get/__tests__/generator/__snapshots__/provider.test.ts.snap +8 -8
  71. package/src/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +126 -126
  72. package/src/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +17 -17
  73. package/src/get/__tests__/generator/__snapshots__/types.test.ts.snap +201 -52
  74. package/src/get/__tests__/generator/__snapshots__/write-only.test.ts.snap +262 -0
  75. package/src/get/__tests__/generator/complex-computed-types.test.ts +28 -0
  76. package/src/get/__tests__/generator/deep-nested-attributes.test.ts +56 -0
  77. package/src/get/__tests__/generator/description-escaping.test.ts +84 -0
  78. package/src/get/__tests__/generator/empty-provider-resources.test.ts +26 -0
  79. package/src/get/__tests__/generator/ephemeral-resources.test.ts +46 -0
  80. package/src/get/__tests__/generator/export-sharding.test.ts +169 -0
  81. package/src/get/__tests__/generator/fixtures/deeply-nested-collections.test.fixture.json +129 -0
  82. package/src/get/__tests__/generator/fixtures/ephemeral-resources.test.fixture.json +160 -0
  83. package/src/get/__tests__/generator/fixtures/provider-functions-collision.test.fixture.json +31 -0
  84. package/src/get/__tests__/generator/fixtures/provider-functions-synthetic.test.fixture.json +192 -0
  85. package/src/get/__tests__/generator/fixtures/provider-functions.test.fixture.json +170 -0
  86. package/src/get/__tests__/generator/fixtures/write-only.test.fixture.json +58 -0
  87. package/src/get/__tests__/generator/import-style.test.ts +129 -0
  88. package/src/get/__tests__/generator/module-generator.test.ts +528 -0
  89. package/src/get/__tests__/generator/nested-types.test.ts +54 -0
  90. package/src/get/__tests__/generator/provider-functions.test.ts +262 -0
  91. package/src/get/__tests__/generator/provider-source-matching.test.ts +84 -0
  92. package/src/get/__tests__/generator/provider.test.ts +59 -0
  93. package/src/get/__tests__/generator/resource-types.test.ts +118 -0
  94. package/src/get/__tests__/generator/skipped-attributes.test.ts +72 -0
  95. package/src/get/__tests__/generator/supported-stored-classes.test.ts +147 -0
  96. package/src/get/__tests__/generator/types.test.ts +686 -0
  97. package/src/get/__tests__/generator/versions-file.test.ts +72 -0
  98. package/src/get/__tests__/generator/write-only.test.ts +71 -0
  99. package/src/get/__tests__/target-versions.test.ts +206 -0
  100. package/src/get/__tests__/util.ts +75 -0
  101. package/src/get/constructs-maker.ts +885 -0
  102. package/src/get/generator/custom-defaults.ts +493 -0
  103. package/src/get/generator/emitter/attributes-emitter.ts +316 -0
  104. package/src/get/generator/emitter/index.ts +6 -0
  105. package/src/get/generator/emitter/provider-functions-emitter.ts +117 -0
  106. package/src/get/generator/emitter/resource-emitter.ts +330 -0
  107. package/src/get/generator/emitter/struct-emitter.ts +683 -0
  108. package/src/get/generator/loop-detection.ts +81 -0
  109. package/src/get/generator/models/attribute-model.ts +273 -0
  110. package/src/get/generator/models/attribute-type-model.ts +560 -0
  111. package/src/get/generator/models/index.ts +8 -0
  112. package/src/get/generator/models/provider-function-model.ts +872 -0
  113. package/src/get/generator/models/resource-model.ts +183 -0
  114. package/src/get/generator/models/scope.ts +54 -0
  115. package/src/get/generator/models/struct.ts +124 -0
  116. package/src/get/generator/models/supported-stored-classes.ts +88 -0
  117. package/src/get/generator/module-generator.ts +234 -0
  118. package/src/get/generator/provider-generator.ts +428 -0
  119. package/src/get/generator/resource-parser.ts +764 -0
  120. package/src/get/generator/sanitized-comments.ts +49 -0
  121. package/src/get/generator/skipped-attributes.ts +27 -0
  122. package/src/index.ts +40 -0
  123. package/src/util.ts +26 -0
  124. package/tsconfig.json +1 -2
@@ -0,0 +1,262 @@
1
+ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
+
3
+ exports[`generate a vault_alicloud_secret_backend resource with a write-only attribute 1`] = `
4
+ "// https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend
5
+ // generated from terraform resource schema
6
+
7
+ import { Construct } from 'constructs';
8
+ import * as cdktn from 'cdktn';
9
+
10
+ // Configuration
11
+
12
+ export interface AlicloudSecretBackendConfig extends cdktn.TerraformMetaArguments {
13
+ /**
14
+ * The AliCloud Access Key ID to use when generating new credentials.
15
+ *
16
+ * Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#access_key AlicloudSecretBackend#access_key}
17
+ */
18
+ readonly accessKey: string;
19
+ /**
20
+ * Path of the AliCloud secrets engine mount. Must match the \`path\` of a \`vault_mount\` resource with \`type = "alicloud"\`. Use \`vault_mount.alicloud.path\` here.
21
+ *
22
+ * Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#mount AlicloudSecretBackend#mount}
23
+ */
24
+ readonly mount: string;
25
+ /**
26
+ * Target namespace. (requires Enterprise)
27
+ *
28
+ * Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#namespace AlicloudSecretBackend#namespace}
29
+ */
30
+ readonly namespace?: string;
31
+ /**
32
+ * Write-only AliCloud Secret Access Key. This value will never be read back from Vault.
33
+ *
34
+ * Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#secret_key_wo AlicloudSecretBackend#secret_key_wo}
35
+ */
36
+ readonly secretKeyWo: string;
37
+ /**
38
+ * Optional write-only secondary AliCloud Secret Access Key. This value will never be read back from Vault.
39
+ *
40
+ * Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#secondary_secret_key_wo AlicloudSecretBackend#secondary_secret_key_wo}
41
+ */
42
+ readonly secondarySecretKeyWo?: string;
43
+ /**
44
+ * A version counter for the write-only \`secret_key_wo\` field. Incrementing this value will trigger an update to the secret key in Vault.
45
+ *
46
+ * Docs at Terraform Registry: {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#secret_key_wo_version AlicloudSecretBackend#secret_key_wo_version}
47
+ */
48
+ readonly secretKeyWoVersion: number;
49
+ }
50
+
51
+ /**
52
+ * Represents a {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend vault_alicloud_secret_backend}
53
+ */
54
+ export class AlicloudSecretBackend extends cdktn.TerraformResource {
55
+
56
+ // =================
57
+ // STATIC PROPERTIES
58
+ // =================
59
+ public static readonly tfResourceType = "vault_alicloud_secret_backend";
60
+
61
+ // ==============
62
+ // STATIC Methods
63
+ // ==============
64
+ /**
65
+ * Generates CDKTN code for importing a AlicloudSecretBackend resource upon running "cdktn plan <stack-name>"
66
+ * @param scope The scope in which to define this construct
67
+ * @param importToId The construct id used in the generated config for the AlicloudSecretBackend to import
68
+ * @param importFromId The id of the existing AlicloudSecretBackend that should be imported. Refer to the {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend#import import section} in the documentation of this resource for the id to use
69
+ * @param provider? Optional instance of the provider where the AlicloudSecretBackend to import is found
70
+ */
71
+ public static generateConfigForImport(scope: Construct, importToId: string, importFromId: string, provider?: cdktn.TerraformProvider) {
72
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "vault_alicloud_secret_backend", importId: importFromId, provider });
73
+ }
74
+
75
+ // ===========
76
+ // INITIALIZER
77
+ // ===========
78
+
79
+ /**
80
+ * Create a new {@link https://registry.terraform.io/providers/hashicorp/vault/latest/docs/resources/alicloud_secret_backend vault_alicloud_secret_backend} Resource
81
+ *
82
+ * @param scope The scope in which to define this construct
83
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
84
+ * @param options AlicloudSecretBackendConfig
85
+ */
86
+ public constructor(scope: Construct, id: string, config: AlicloudSecretBackendConfig) {
87
+ super(scope, id, {
88
+ terraformResourceType: 'vault_alicloud_secret_backend',
89
+ terraformGeneratorMetadata: {
90
+ providerName: 'vault'
91
+ },
92
+ provider: config.provider,
93
+ dependsOn: config.dependsOn,
94
+ count: config.count,
95
+ lifecycle: config.lifecycle,
96
+ provisioners: config.provisioners,
97
+ connection: config.connection,
98
+ forEach: config.forEach
99
+ });
100
+ this._accessKey = config.accessKey;
101
+ this._mount = config.mount;
102
+ this._namespace = config.namespace;
103
+ this._secretKeyWo = config.secretKeyWo;
104
+ this._secondarySecretKeyWo = config.secondarySecretKeyWo;
105
+ this._secretKeyWoVersion = config.secretKeyWoVersion;
106
+ }
107
+
108
+ // ==========
109
+ // ATTRIBUTES
110
+ // ==========
111
+
112
+ // access_key - computed: false, optional: false, required: true
113
+ private _accessKey?: string;
114
+ public get accessKey() {
115
+ return this.getStringAttribute('access_key');
116
+ }
117
+ public set accessKey(value: string) {
118
+ this._accessKey = value;
119
+ }
120
+ // Temporarily expose input value. Use with caution.
121
+ public get accessKeyInput() {
122
+ return this._accessKey;
123
+ }
124
+
125
+ // mount - computed: false, optional: false, required: true
126
+ private _mount?: string;
127
+ public get mount() {
128
+ return this.getStringAttribute('mount');
129
+ }
130
+ public set mount(value: string) {
131
+ this._mount = value;
132
+ }
133
+ // Temporarily expose input value. Use with caution.
134
+ public get mountInput() {
135
+ return this._mount;
136
+ }
137
+
138
+ // namespace - computed: false, optional: true, required: false
139
+ private _namespace?: string;
140
+ public get namespace() {
141
+ return this.getStringAttribute('namespace');
142
+ }
143
+ public set namespace(value: string) {
144
+ this._namespace = value;
145
+ }
146
+ public resetNamespace() {
147
+ this._namespace = undefined;
148
+ }
149
+ // Temporarily expose input value. Use with caution.
150
+ public get namespaceInput() {
151
+ return this._namespace;
152
+ }
153
+
154
+ // secret_key_wo - computed: false, optional: false, required: true
155
+ private _secretKeyWo?: string;
156
+ /**
157
+ * @deprecated Write-only: the provider never returns this value; reading it always yields null by protocol contract. The getter remains for compatibility and will be removed in a future prebuilt-provider major.
158
+ */
159
+ public get secretKeyWo() {
160
+ return this.getStringAttribute('secret_key_wo');
161
+ }
162
+ public set secretKeyWo(value: string) {
163
+ this._secretKeyWo = value;
164
+ }
165
+ // Temporarily expose input value. Use with caution.
166
+ public get secretKeyWoInput() {
167
+ return this._secretKeyWo;
168
+ }
169
+
170
+ // secondary_secret_key_wo - computed: false, optional: true, required: false
171
+ private _secondarySecretKeyWo?: string;
172
+ /**
173
+ * @deprecated Write-only: the provider never returns this value; reading it always yields null by protocol contract. The getter remains for compatibility and will be removed in a future prebuilt-provider major.
174
+ */
175
+ public get secondarySecretKeyWo() {
176
+ return this.getStringAttribute('secondary_secret_key_wo');
177
+ }
178
+ public set secondarySecretKeyWo(value: string) {
179
+ this._secondarySecretKeyWo = value;
180
+ }
181
+ public resetSecondarySecretKeyWo() {
182
+ this._secondarySecretKeyWo = undefined;
183
+ }
184
+ // Temporarily expose input value. Use with caution.
185
+ public get secondarySecretKeyWoInput() {
186
+ return this._secondarySecretKeyWo;
187
+ }
188
+
189
+ // secret_key_wo_version - computed: false, optional: false, required: true
190
+ private _secretKeyWoVersion?: number;
191
+ public get secretKeyWoVersion() {
192
+ return this.getNumberAttribute('secret_key_wo_version');
193
+ }
194
+ public set secretKeyWoVersion(value: number) {
195
+ this._secretKeyWoVersion = value;
196
+ }
197
+ // Temporarily expose input value. Use with caution.
198
+ public get secretKeyWoVersionInput() {
199
+ return this._secretKeyWoVersion;
200
+ }
201
+
202
+ // =========
203
+ // SYNTHESIS
204
+ // =========
205
+
206
+ protected synthesizeAttributes(): { [name: string]: any } {
207
+ return {
208
+ access_key: cdktn.stringToTerraform(this._accessKey),
209
+ mount: cdktn.stringToTerraform(this._mount),
210
+ namespace: cdktn.stringToTerraform(this._namespace),
211
+ secret_key_wo: this.markWriteOnlyAttribute(cdktn.stringToTerraform(this._secretKeyWo)),
212
+ secondary_secret_key_wo: this.markWriteOnlyAttribute(cdktn.stringToTerraform(this._secondarySecretKeyWo)),
213
+ secret_key_wo_version: cdktn.numberToTerraform(this._secretKeyWoVersion),
214
+ };
215
+ }
216
+
217
+ protected synthesizeHclAttributes(): { [name: string]: any } {
218
+ const attrs = {
219
+ access_key: {
220
+ value: cdktn.stringToHclTerraform(this._accessKey),
221
+ isBlock: false,
222
+ type: "simple",
223
+ storageClassType: "string",
224
+ },
225
+ mount: {
226
+ value: cdktn.stringToHclTerraform(this._mount),
227
+ isBlock: false,
228
+ type: "simple",
229
+ storageClassType: "string",
230
+ },
231
+ namespace: {
232
+ value: cdktn.stringToHclTerraform(this._namespace),
233
+ isBlock: false,
234
+ type: "simple",
235
+ storageClassType: "string",
236
+ },
237
+ secret_key_wo: {
238
+ value: this.markWriteOnlyAttribute(cdktn.stringToHclTerraform(this._secretKeyWo)),
239
+ isBlock: false,
240
+ type: "simple",
241
+ storageClassType: "string",
242
+ },
243
+ secondary_secret_key_wo: {
244
+ value: this.markWriteOnlyAttribute(cdktn.stringToHclTerraform(this._secondarySecretKeyWo)),
245
+ isBlock: false,
246
+ type: "simple",
247
+ storageClassType: "string",
248
+ },
249
+ secret_key_wo_version: {
250
+ value: cdktn.numberToHclTerraform(this._secretKeyWoVersion),
251
+ isBlock: false,
252
+ type: "simple",
253
+ storageClassType: "number",
254
+ },
255
+ };
256
+
257
+ // remove undefined attributes
258
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined ))
259
+ }
260
+ }
261
+ "
262
+ `;
@@ -0,0 +1,28 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
6
+ import { CodeMaker } from "codemaker";
7
+ import { createTmpHelper } from "../util";
8
+
9
+ const tmp = createTmpHelper();
10
+
11
+ test("generate an acm certifacte resource with complex computed types", async () => {
12
+ const code = new CodeMaker();
13
+ const workdir = tmp("complex-computed-types.test");
14
+ const spec = JSON.parse(
15
+ fs.readFileSync(
16
+ path.join(__dirname, "fixtures", "aws_acm_certificate.test.fixture.json"),
17
+ "utf-8",
18
+ ),
19
+ );
20
+ new TerraformProviderGenerator(code, spec).generateAll();
21
+ await code.save(workdir);
22
+
23
+ const output = fs.readFileSync(
24
+ path.join(workdir, "providers/aws/acm-certificate/index.ts"),
25
+ "utf-8",
26
+ );
27
+ expect(output).toMatchSnapshot(`acm-certificate`);
28
+ });
@@ -0,0 +1,56 @@
1
+ // Copyright (c) HashiCorp, Inc // SPDX-License-Identifier: MPL-2.0
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
5
+ import { CodeMaker } from "codemaker";
6
+ import { createTmpHelper } from "../util";
7
+
8
+ const tmp = createTmpHelper();
9
+
10
+ test("generate a resource with attribute that's a list of a map of an object", async () => {
11
+ const code = new CodeMaker();
12
+ const workdir = tmp("deep-nested-attributes.test");
13
+ const spec = JSON.parse(
14
+ fs.readFileSync(
15
+ path.join(__dirname, "fixtures", "stripe-schema.test.fixture.json"),
16
+ "utf-8",
17
+ ),
18
+ );
19
+ new TerraformProviderGenerator(code, spec).generateAll();
20
+ await code.save(workdir);
21
+
22
+ const output = fs.readFileSync(
23
+ path.join(workdir, "providers/stripe/invoiceitems/index.ts"),
24
+ "utf-8",
25
+ );
26
+
27
+ expect(output).toEqual(
28
+ expect.stringContaining(
29
+ `export class InvoiceitemsDiscountsMapList extends cdktn.MapList {`,
30
+ ),
31
+ );
32
+ });
33
+
34
+ test("generate a resource with attribute that's a map of a list of an object", async () => {
35
+ const code = new CodeMaker();
36
+ const workdir = tmp("deep-nested-attributes-list.test");
37
+ const spec = JSON.parse(
38
+ fs.readFileSync(
39
+ path.join(__dirname, "fixtures", "deep-attributes.test.fixture.json"),
40
+ "utf-8",
41
+ ),
42
+ );
43
+ new TerraformProviderGenerator(code, spec).generateAll();
44
+ await code.save(workdir);
45
+
46
+ const output = fs.readFileSync(
47
+ path.join(workdir, "providers/stripe/invoiceitems/index.ts"),
48
+ "utf-8",
49
+ );
50
+
51
+ expect(output).toEqual(
52
+ expect.stringContaining(
53
+ `export class InvoiceitemsDiscountsListMap extends cdktn.ComplexMap {`,
54
+ ),
55
+ );
56
+ });
@@ -0,0 +1,84 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
6
+ import { CodeMaker } from "codemaker";
7
+ import { createTmpHelper } from "../util";
8
+
9
+ const tmp = createTmpHelper();
10
+
11
+ test("broken attribute description comments", async () => {
12
+ const code = new CodeMaker();
13
+ const workdir = tmp("description-escaping.test");
14
+ const spec = JSON.parse(
15
+ fs.readFileSync(
16
+ path.join(
17
+ __dirname,
18
+ "fixtures",
19
+ "description-escaping.test.fixture.json",
20
+ ),
21
+ "utf-8",
22
+ ),
23
+ );
24
+ new TerraformProviderGenerator(code, spec).generateAll();
25
+ await code.save(workdir);
26
+
27
+ const output = fs.readFileSync(
28
+ path.join(workdir, "providers/google/description-escaping/index.ts"),
29
+ "utf-8",
30
+ );
31
+ expect(output).toMatchSnapshot();
32
+ });
33
+
34
+ // That popped up in the google-beta provider which transforms markdown fenced
35
+ // code blocks from the actual markdown docs to the provider schema (``` => ''')
36
+ // see
37
+ // - https://raw.githubusercontent.com/hashicorp/terraform-provider-google-beta/4094e3bdd530ca853a046a6d938807f8a131c7c7/website/docs/r/iam_workload_identity_pool_provider.html.markdown
38
+ // - https://github.com/hashicorp/terraform-provider-google-beta/blob/4094e3bdd530ca853a046a6d938807f8a131c7c7/google-beta/resource_iam_beta_workload_identity_pool_provider.go
39
+
40
+ test("malformed code blocks which break in python rst", async () => {
41
+ const code = new CodeMaker();
42
+ const workdir = tmp("markdown-description-with-code-blocks.test");
43
+ const spec = JSON.parse(
44
+ fs.readFileSync(
45
+ path.join(
46
+ __dirname,
47
+ "fixtures",
48
+ "markdown-description-with-code-blocks.test.fixture.json",
49
+ ),
50
+ "utf-8",
51
+ ),
52
+ );
53
+ new TerraformProviderGenerator(code, spec).generateAll();
54
+ await code.save(workdir);
55
+
56
+ const output = fs.readFileSync(
57
+ path.join(workdir, "providers/aws/code-blocks/index.ts"),
58
+ "utf-8",
59
+ );
60
+ expect(output).toMatchSnapshot();
61
+ });
62
+
63
+ test("comment ending sequence in comment", async () => {
64
+ const code = new CodeMaker();
65
+ const workdir = tmp("comment-ending-sequence.test");
66
+ const spec = JSON.parse(
67
+ fs.readFileSync(
68
+ path.join(
69
+ __dirname,
70
+ "fixtures",
71
+ "comment-ending-sequence.test.fixture.json",
72
+ ),
73
+ "utf-8",
74
+ ),
75
+ );
76
+ new TerraformProviderGenerator(code, spec).generateAll();
77
+ await code.save(workdir);
78
+
79
+ const output = fs.readFileSync(
80
+ path.join(workdir, "providers/aws/code-blocks/index.ts"),
81
+ "utf-8",
82
+ );
83
+ expect(output).toMatchSnapshot();
84
+ });
@@ -0,0 +1,26 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
6
+ import { CodeMaker } from "codemaker";
7
+ import { createTmpHelper } from "../util";
8
+
9
+ const tmp = createTmpHelper();
10
+
11
+ test("provider with no resources", async () => {
12
+ const code = new CodeMaker();
13
+ const workdir = tmp("empty-provider-resources.test");
14
+ const spec = JSON.parse(
15
+ fs.readFileSync(
16
+ path.join(
17
+ __dirname,
18
+ "fixtures",
19
+ "empty-provider-resources.test.fixture.json",
20
+ ),
21
+ "utf-8",
22
+ ),
23
+ );
24
+ new TerraformProviderGenerator(code, spec).generateAll();
25
+ await code.save(workdir);
26
+ });
@@ -0,0 +1,46 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
6
+ import { CodeMaker } from "codemaker";
7
+ import { createTmpHelper } from "../util";
8
+
9
+ const tmp = createTmpHelper();
10
+
11
+ test("generate an ephemeral random_password resource alongside a regular random_uuid resource", async () => {
12
+ const code = new CodeMaker();
13
+ const workdir = tmp("ephemeral.test");
14
+ const spec = JSON.parse(
15
+ fs.readFileSync(
16
+ path.join(__dirname, "fixtures", "ephemeral-resources.test.fixture.json"),
17
+ "utf-8",
18
+ ),
19
+ );
20
+ new TerraformProviderGenerator(code, spec).generateAll();
21
+ await code.save(workdir);
22
+
23
+ const ephemeralOutput = fs.readFileSync(
24
+ path.join(workdir, "providers/random/ephemeral-random-password/index.ts"),
25
+ "utf-8",
26
+ );
27
+ expect(ephemeralOutput).toMatchSnapshot("ephemeral-random-password");
28
+
29
+ const resourceOutput = fs.readFileSync(
30
+ path.join(workdir, "providers/random/uuid/index.ts"),
31
+ "utf-8",
32
+ );
33
+ expect(resourceOutput).toMatchSnapshot("random-uuid");
34
+
35
+ const providerIndex = fs.readFileSync(
36
+ path.join(workdir, "providers/random/index.ts"),
37
+ "utf-8",
38
+ );
39
+ expect(providerIndex).toMatchSnapshot("provider-index");
40
+
41
+ const providerLazyIndex = fs.readFileSync(
42
+ path.join(workdir, "providers/random/lazy-index.ts"),
43
+ "utf-8",
44
+ );
45
+ expect(providerLazyIndex).toMatchSnapshot("provider-lazy-index");
46
+ });
@@ -0,0 +1,169 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { TerraformProviderGenerator } from "../../generator/provider-generator";
6
+ import { CodeMaker } from "codemaker";
7
+ import { createTmpHelper } from "../util";
8
+
9
+ const tmp = createTmpHelper();
10
+
11
+ // this is a workaround for a bug introduced in TS 3.9.x and seems to be unlikely to get fixed.
12
+ // Since jsii relies on TS < 4 at the moment we can't use newer TS versions which have this fixed (^4.1).
13
+ // see https://github.com/hashicorp/terraform-cdk/pull/1248 for more context
14
+ test("shard exports across multiple files to avoid generating files with more than a 1000 exports", async () => {
15
+ const code = new CodeMaker();
16
+ const workdir = tmp("export-sharding.test");
17
+
18
+ const spec = JSON.parse(
19
+ fs.readFileSync(
20
+ path.join(__dirname, "fixtures", "aws_wafv2_web_acl.test.fixture.json"),
21
+ "utf-8",
22
+ ),
23
+ );
24
+ new TerraformProviderGenerator(code, spec).generateAll();
25
+ await code.save(workdir);
26
+
27
+ const output = fs.readFileSync(
28
+ path.join(workdir, "providers/test/wafv2-web-acl/index.ts"),
29
+ "utf-8",
30
+ );
31
+ expect(output).toMatchSnapshot(`wafv2-web-acl-resource`);
32
+
33
+ const outputStructsIndex = fs.readFileSync(
34
+ path.join(workdir, "providers/test/wafv2-web-acl/index-structs/index.ts"),
35
+ "utf-8",
36
+ );
37
+ expect(outputStructsIndex).toMatchSnapshot(`structs-index`);
38
+
39
+ const outputStructs0 = fs.readFileSync(
40
+ path.join(
41
+ workdir,
42
+ "providers/test/wafv2-web-acl/index-structs/structs0.ts",
43
+ ),
44
+ "utf-8",
45
+ );
46
+ expect(outputStructs0).toMatchSnapshot(`structs0`);
47
+
48
+ const outputStructs400 = fs.readFileSync(
49
+ path.join(
50
+ workdir,
51
+ "providers/test/wafv2-web-acl/index-structs/structs400.ts",
52
+ ),
53
+ "utf-8",
54
+ );
55
+ expect(outputStructs400).toMatchSnapshot(`structs400`);
56
+
57
+ const outputStructs800 = fs.readFileSync(
58
+ path.join(
59
+ workdir,
60
+ "providers/test/wafv2-web-acl/index-structs/structs800.ts",
61
+ ),
62
+ "utf-8",
63
+ );
64
+ expect(outputStructs800).toMatchSnapshot(`structs800`);
65
+
66
+ const outputStructs1200 = fs.readFileSync(
67
+ path.join(
68
+ workdir,
69
+ "providers/test/wafv2-web-acl/index-structs/structs1200.ts",
70
+ ),
71
+ "utf-8",
72
+ );
73
+ expect(outputStructs1200).toMatchSnapshot(`structs1200`);
74
+
75
+ const outputStructs1600 = fs.readFileSync(
76
+ path.join(
77
+ workdir,
78
+ "providers/test/wafv2-web-acl/index-structs/structs1600.ts",
79
+ ),
80
+ "utf-8",
81
+ );
82
+ expect(outputStructs1600).toMatchSnapshot(`structs1600`);
83
+
84
+ const outputStructs2000 = fs.readFileSync(
85
+ path.join(
86
+ workdir,
87
+ "providers/test/wafv2-web-acl/index-structs/structs2000.ts",
88
+ ),
89
+ "utf-8",
90
+ );
91
+ expect(outputStructs2000).toMatchSnapshot(`structs2000`);
92
+
93
+ const outputStructs2400 = fs.readFileSync(
94
+ path.join(
95
+ workdir,
96
+ "providers/test/wafv2-web-acl/index-structs/structs2400.ts",
97
+ ),
98
+ "utf-8",
99
+ );
100
+ expect(outputStructs2400).toMatchSnapshot(`structs2400`);
101
+
102
+ const outputStructs2800 = fs.readFileSync(
103
+ path.join(
104
+ workdir,
105
+ "providers/test/wafv2-web-acl/index-structs/structs2800.ts",
106
+ ),
107
+ "utf-8",
108
+ );
109
+ expect(outputStructs2800).toMatchSnapshot(`structs2800`);
110
+
111
+ const outputStructs3200 = fs.readFileSync(
112
+ path.join(
113
+ workdir,
114
+ "providers/test/wafv2-web-acl/index-structs/structs3200.ts",
115
+ ),
116
+ "utf-8",
117
+ );
118
+ expect(outputStructs3200).toMatchSnapshot(`structs3200`);
119
+
120
+ const outputStructs3600 = fs.readFileSync(
121
+ path.join(
122
+ workdir,
123
+ "providers/test/wafv2-web-acl/index-structs/structs3600.ts",
124
+ ),
125
+ "utf-8",
126
+ );
127
+ expect(outputStructs3600).toMatchSnapshot(`structs3600`);
128
+ });
129
+
130
+ test("shard exports across multiple files to avoid generating files with more than a 1000 exports in a provider without namespaces", async () => {
131
+ const code = new CodeMaker();
132
+ const workdir = tmp("export-sharding-no-namespace.test");
133
+
134
+ const spec = JSON.parse(
135
+ fs.readFileSync(
136
+ path.join(__dirname, "fixtures", "datadog_dashboard.test.fixture.json"),
137
+ "utf-8",
138
+ ),
139
+ );
140
+ new TerraformProviderGenerator(code, spec).generateAll();
141
+ await code.save(workdir);
142
+
143
+ const output = fs.readFileSync(
144
+ path.join(workdir, "providers/datadog/dashboard/index.ts"),
145
+ "utf-8",
146
+ );
147
+ expect(output).toMatchSnapshot(`dashboard-resource`);
148
+
149
+ const outputStructsIndex = fs.readFileSync(
150
+ path.join(workdir, "providers/datadog/dashboard/index-structs/index.ts"),
151
+ "utf-8",
152
+ );
153
+ expect(outputStructsIndex).toMatchSnapshot(`structs-index`);
154
+
155
+ const outputStructs0 = fs.readFileSync(
156
+ path.join(workdir, "providers/datadog/dashboard/index-structs/structs0.ts"),
157
+ "utf-8",
158
+ );
159
+ expect(outputStructs0).toMatchSnapshot(`structs0`);
160
+
161
+ const outputStructs400 = fs.readFileSync(
162
+ path.join(
163
+ workdir,
164
+ "providers/datadog/dashboard/index-structs/structs400.ts",
165
+ ),
166
+ "utf-8",
167
+ );
168
+ expect(outputStructs400).toMatchSnapshot(`structs400`);
169
+ });