@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,560 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import { Struct } from "./struct";
4
+ import { uppercaseFirst, downcaseFirst } from "../../../util";
5
+ import { resolveStoredClassName } from "./supported-stored-classes";
6
+
7
+ export interface AttributeTypeModel {
8
+ readonly struct?: Struct; // complex object type contained within the type
9
+ readonly isComplex: boolean; // basically the same as having a struct
10
+ getStoredClassInitializer(name: string): string; // initializer for keeping class needed to keep track of reference access
11
+ readonly storedClassType: string; // used mainly by collection types to generate their stored class initializer
12
+ readonly inputTypeDefinition: string; // this is the type used for inputting values
13
+ getAttributeAccessFunction(name: string): string; // this is for getting reference for simple types
14
+ readonly toTerraformFunction: string; // this is for converting input values to Terraform syntax
15
+ readonly toHclTerraformFunction: string; // this is for converting input values to Terraform syntax in HCL
16
+ readonly typeModelType: string; // so we don't need to use instanceof
17
+ readonly hasReferenceClass: boolean; // used to determine if a stored_class getter should be used
18
+ readonly isTokenizable: boolean; // can the type be represented by a token type
19
+ readonly isStoredClassUnavailable: boolean; // true when no "cdktn.<Name>" stored class (not even a collapsed nearest-Any wrapper) is available for this type
20
+ }
21
+
22
+ // Describes the Terraform type of an attribute as its `list(...)`/`set(...)`/`map(...)`
23
+ // composed notation (matching how Terraform itself describes nested collection types),
24
+ // for use in generated JSDoc. Used only for collapsed/fallback getters (see
25
+ // AttributesEmitter) so it never needs to be exhaustive/perfectly stable for every shape.
26
+ export function describeTerraformType(model: AttributeTypeModel): string {
27
+ switch (model.typeModelType) {
28
+ case "list":
29
+ return `list(${describeTerraformType(
30
+ (model as CollectionAttributeTypeModel).elementType,
31
+ )})`;
32
+ case "set":
33
+ return `set(${describeTerraformType(
34
+ (model as CollectionAttributeTypeModel).elementType,
35
+ )})`;
36
+ case "map":
37
+ return `map(${describeTerraformType(
38
+ (model as CollectionAttributeTypeModel).elementType,
39
+ )})`;
40
+ case "struct":
41
+ return "object";
42
+ default:
43
+ // Covers both SimpleAttributeTypeModel (storedClassType is the Terraform primitive
44
+ // name, e.g. "string" | "number" | "boolean" | "any") and SkippedAttributeTypeModel
45
+ // (storedClassType is always "any").
46
+ return model.storedClassType === "boolean"
47
+ ? "bool"
48
+ : model.storedClassType;
49
+ }
50
+ }
51
+
52
+ export class SkippedAttributeTypeModel implements AttributeTypeModel {
53
+ constructor() {}
54
+
55
+ get typeModelType() {
56
+ return "simple";
57
+ }
58
+
59
+ get struct() {
60
+ return undefined;
61
+ }
62
+
63
+ get isComplex() {
64
+ return false;
65
+ }
66
+
67
+ getStoredClassInitializer(_name: string) {
68
+ // not used
69
+ return "";
70
+ }
71
+
72
+ get storedClassType() {
73
+ return "any";
74
+ }
75
+
76
+ get inputTypeDefinition() {
77
+ return "any";
78
+ }
79
+
80
+ getAttributeAccessFunction(name: string) {
81
+ return `this.interpolationForAttribute('${name}')`;
82
+ }
83
+
84
+ get toTerraformFunction() {
85
+ return `cdktn.anyToTerraform`;
86
+ }
87
+
88
+ get toHclTerraformFunction() {
89
+ return `cdktn.anyToHclTerraform`;
90
+ }
91
+
92
+ get hasReferenceClass() {
93
+ return false;
94
+ }
95
+
96
+ get isTokenizable() {
97
+ return false;
98
+ }
99
+
100
+ get isStoredClassUnavailable() {
101
+ return false;
102
+ }
103
+ }
104
+
105
+ export class SimpleAttributeTypeModel implements AttributeTypeModel {
106
+ constructor(public readonly type: string) {}
107
+
108
+ get typeModelType() {
109
+ return "simple";
110
+ }
111
+
112
+ get struct() {
113
+ return undefined;
114
+ }
115
+
116
+ get isComplex() {
117
+ return false;
118
+ }
119
+
120
+ getStoredClassInitializer(_name: string) {
121
+ // not used
122
+ return "";
123
+ }
124
+
125
+ get storedClassType() {
126
+ return this.type;
127
+ }
128
+
129
+ get inputTypeDefinition() {
130
+ if (this.type === "boolean") {
131
+ return "boolean | cdktn.IResolvable";
132
+ } else {
133
+ return this.type;
134
+ }
135
+ }
136
+
137
+ getAttributeAccessFunction(name: string) {
138
+ return `this.get${uppercaseFirst(this.type)}Attribute('${name}')`;
139
+ }
140
+
141
+ get toTerraformFunction() {
142
+ return `cdktn.${this.type}ToTerraform`;
143
+ }
144
+
145
+ get toHclTerraformFunction() {
146
+ return `cdktn.${this.type}ToHclTerraform`;
147
+ }
148
+
149
+ get hasReferenceClass() {
150
+ return false;
151
+ }
152
+
153
+ get isTokenizable() {
154
+ return true;
155
+ }
156
+
157
+ get isStoredClassUnavailable() {
158
+ return false;
159
+ }
160
+ }
161
+
162
+ export class StructAttributeTypeModel implements AttributeTypeModel {
163
+ constructor(public readonly struct: Struct) {}
164
+
165
+ get typeModelType() {
166
+ return "struct";
167
+ }
168
+
169
+ get isComplex() {
170
+ return true;
171
+ }
172
+
173
+ getStoredClassInitializer(name: string) {
174
+ return `new ${this.struct.outputReferenceName}(this, "${name}")`;
175
+ }
176
+
177
+ get storedClassType() {
178
+ return this.struct.name;
179
+ }
180
+
181
+ get inputTypeDefinition() {
182
+ return this.struct.name;
183
+ }
184
+
185
+ getAttributeAccessFunction(name: string) {
186
+ // This shouln't actually be called
187
+ return `this.interpolationForAttribute('${name}')`;
188
+ }
189
+
190
+ get toTerraformFunction() {
191
+ return `${downcaseFirst(this.struct.name)}ToTerraform`;
192
+ }
193
+
194
+ get toHclTerraformFunction() {
195
+ return `${downcaseFirst(this.struct.name)}ToHclTerraform`;
196
+ }
197
+
198
+ get hasReferenceClass() {
199
+ return true;
200
+ }
201
+
202
+ get isTokenizable() {
203
+ return false;
204
+ }
205
+
206
+ get isStoredClassUnavailable() {
207
+ return false;
208
+ }
209
+ }
210
+
211
+ export interface CollectionAttributeTypeModel extends AttributeTypeModel {
212
+ elementType: AttributeTypeModel;
213
+ // Resolves the "cdktn.<name>" stored class to instantiate for this (non-complex)
214
+ // collection type, and whether that resolution collapsed a deeper, unsupported nesting
215
+ // into the nearest typed "Any"-wrapper. undefined only defensively - see
216
+ // resolveStoredClassName in supported-stored-classes.ts.
217
+ readonly resolvedStoredClass:
218
+ | { name: string; collapsed: boolean }
219
+ | undefined;
220
+ }
221
+
222
+ export class ListAttributeTypeModel implements CollectionAttributeTypeModel {
223
+ constructor(
224
+ public readonly elementType: AttributeTypeModel,
225
+ public readonly isSingleItem: boolean,
226
+ private readonly isBlock: boolean,
227
+ ) {
228
+ if (this.struct) {
229
+ this.struct.isSingleItem = this.isSingleItem || false;
230
+ }
231
+ }
232
+
233
+ get typeModelType() {
234
+ return "list";
235
+ }
236
+
237
+ get struct() {
238
+ return this.elementType.struct;
239
+ }
240
+
241
+ get isComplex() {
242
+ return this.elementType.isComplex;
243
+ }
244
+
245
+ getStoredClassInitializer(name: string) {
246
+ if (this.isSingleItem) {
247
+ return `new ${this.elementType.storedClassType}OutputReference(this, "${name}")`;
248
+ } else {
249
+ if (this.isComplex) {
250
+ return `new ${this.storedClassType}(this, "${name}", false)`;
251
+ } else {
252
+ return `new cdktn.${this.resolvedStoredClass!.name}(this, "${name}", false)`;
253
+ }
254
+ }
255
+ }
256
+
257
+ get storedClassType() {
258
+ return `${this.elementType.storedClassType}List`;
259
+ }
260
+
261
+ get resolvedStoredClass() {
262
+ return resolveStoredClassName(
263
+ this.storedClassType,
264
+ this.elementType.typeModelType,
265
+ );
266
+ }
267
+
268
+ get inputTypeDefinition() {
269
+ if (this.isSingleItem) {
270
+ return this.elementType.inputTypeDefinition;
271
+ } else if (this.elementType.storedClassType === "boolean") {
272
+ return "Array<boolean | cdktn.IResolvable> | cdktn.IResolvable";
273
+ } else if (this.isComplex) {
274
+ return `${this.elementType.storedClassType}[] | cdktn.IResolvable`;
275
+ } else if (this.elementType.typeModelType !== "simple") {
276
+ return `${this.elementType.inputTypeDefinition}[] | cdktn.IResolvable`;
277
+ } else {
278
+ return `${this.elementType.inputTypeDefinition}[]`;
279
+ }
280
+ }
281
+
282
+ getAttributeAccessFunction(name: string) {
283
+ switch (this.elementType.storedClassType) {
284
+ case "string":
285
+ return `this.getListAttribute('${name}')`;
286
+ case "number":
287
+ return `this.getNumberListAttribute('${name}')`;
288
+ }
289
+
290
+ return `this.interpolationForAttribute('${name}')`;
291
+ }
292
+
293
+ get toTerraformFunction() {
294
+ if (this.isSingleItem) {
295
+ return this.elementType.toTerraformFunction;
296
+ }
297
+ return `cdktn.listMapper(${this.elementType.toTerraformFunction}, ${this.isBlock})`;
298
+ }
299
+
300
+ get toHclTerraformFunction() {
301
+ if (this.isSingleItem) {
302
+ return this.elementType.toHclTerraformFunction;
303
+ }
304
+
305
+ return `cdktn.listMapperHcl(${this.elementType.toHclTerraformFunction}, ${this.isBlock})`;
306
+ }
307
+
308
+ get hasReferenceClass() {
309
+ return this.isSingleItem || this.isComplex;
310
+ }
311
+
312
+ get isTokenizable() {
313
+ switch (this.elementType.storedClassType) {
314
+ case "string":
315
+ return true;
316
+ case "number":
317
+ return true;
318
+ default:
319
+ return false;
320
+ }
321
+ }
322
+
323
+ // Complex (struct) elements generate their own class in the provider output, so they
324
+ // are always fine. Otherwise a stored class is only emitted if resolvedStoredClass
325
+ // finds one - see getStoredClassInitializer above. Note: hasReferenceClass (which
326
+ // triggers a stored_class getter) is only ever true here when isSingleItem or isComplex
327
+ // is true, and isSingleItem is only set for struct/block nesting (which is also
328
+ // isComplex), so this check only needs to guard the non-complex, non-single-item case.
329
+ //
330
+ // storedClassType is itself built up recursively (elementType.storedClassType is
331
+ // composed the same way for nested collections), so it already fully encodes the
332
+ // entire nested chain in one string (e.g. map(map(list(string))) composes all the way
333
+ // up to "stringListMapMap"). resolvedStoredClass first checks this type's own composed
334
+ // name (e.g. "StringListMapMap") against the fixed set of hand-written core classes; if
335
+ // that name doesn't exist, it falls back to the nearest typed "Any"-wrapper that still
336
+ // encodes this type's own layer and its element's layer (e.g. "AnyMapMap"), collapsing
337
+ // only the unsupported inner shape while preserving typed navigation for the outer
338
+ // layers; only if neither exists does it fall through to the plain, untyped getter (see
339
+ // AttributeModel.getterType). It must NOT also OR in
340
+ // elementType.isStoredClassUnavailable, since an inner element's un-composed name (e.g.
341
+ // "StringList" for a plain list(string) nested inside a map) is never separately
342
+ // instantiated and is irrelevant on its own; ORing it in would produce false positives
343
+ // that regress supported nestings such as map(list(string)) => cdktn.StringListMap.
344
+ get isStoredClassUnavailable() {
345
+ if (this.isComplex) {
346
+ return false;
347
+ }
348
+ return this.resolvedStoredClass === undefined;
349
+ }
350
+ }
351
+
352
+ export class SetAttributeTypeModel implements CollectionAttributeTypeModel {
353
+ constructor(
354
+ public readonly elementType: AttributeTypeModel,
355
+ public readonly isSingleItem: boolean,
356
+ private readonly isBlock: boolean,
357
+ ) {
358
+ if (this.struct) {
359
+ this.struct.isSingleItem = this.isSingleItem || false;
360
+ }
361
+ }
362
+
363
+ get typeModelType() {
364
+ return "set";
365
+ }
366
+
367
+ get struct() {
368
+ return this.elementType.struct;
369
+ }
370
+
371
+ get isComplex() {
372
+ return this.elementType.isComplex;
373
+ }
374
+
375
+ getStoredClassInitializer(name: string) {
376
+ if (this.isSingleItem) {
377
+ return `new ${this.elementType.storedClassType}OutputReference(this, "${name}")`;
378
+ } else {
379
+ if (this.isComplex) {
380
+ return `new ${this.storedClassType}(this, "${name}", true)`;
381
+ } else {
382
+ return `new cdktn.${this.resolvedStoredClass!.name}(this, "${name}", true)`;
383
+ }
384
+ }
385
+ }
386
+
387
+ get storedClassType() {
388
+ return `${this.elementType.storedClassType}List`;
389
+ }
390
+
391
+ get resolvedStoredClass() {
392
+ return resolveStoredClassName(
393
+ this.storedClassType,
394
+ this.elementType.typeModelType,
395
+ );
396
+ }
397
+
398
+ get inputTypeDefinition() {
399
+ if (this.isSingleItem) {
400
+ return this.elementType.inputTypeDefinition;
401
+ } else if (this.elementType.storedClassType === "boolean") {
402
+ return "Array<boolean | cdktn.IResolvable> | cdktn.IResolvable";
403
+ } else if (this.isComplex) {
404
+ return `${this.elementType.storedClassType}[] | cdktn.IResolvable`;
405
+ } else if (this.elementType.typeModelType !== "simple") {
406
+ return `${this.elementType.inputTypeDefinition}[] | cdktn.IResolvable`;
407
+ } else {
408
+ return `${this.elementType.inputTypeDefinition}[]`;
409
+ }
410
+ }
411
+
412
+ getAttributeAccessFunction(name: string) {
413
+ switch (this.elementType.storedClassType) {
414
+ case "string":
415
+ return `cdktn.Fn.tolist(this.getListAttribute('${name}'))`;
416
+ case "number":
417
+ return `cdktn.Token.asNumberList(cdktn.Fn.tolist(this.getNumberListAttribute('${name}')))`;
418
+ }
419
+
420
+ // Token.asAny is required because tolist returns an Array encoded token which the listMapper
421
+ // would try to map over when this is passed to another resource. With Token.asAny() it is left
422
+ // as is by the listMapper and is later properly resolved to a reference
423
+ // (this only works in TypeScript currently, same as for referencing lists
424
+ // [see "interpolationForAttribute(...)" further below])
425
+ return `cdktn.Token.asAny(cdktn.Fn.tolist(this.interpolationForAttribute('${name}')))`;
426
+ }
427
+
428
+ get toTerraformFunction() {
429
+ if (this.isSingleItem) {
430
+ return this.elementType.toTerraformFunction;
431
+ } else {
432
+ return `cdktn.listMapper(${this.elementType.toTerraformFunction}, ${this.isBlock})`;
433
+ }
434
+ }
435
+
436
+ get toHclTerraformFunction() {
437
+ if (this.isSingleItem) {
438
+ return this.elementType.toHclTerraformFunction;
439
+ }
440
+ return `cdktn.listMapperHcl(${this.elementType.toHclTerraformFunction}, ${this.isBlock})`;
441
+ }
442
+
443
+ get hasReferenceClass() {
444
+ return this.isSingleItem || this.isComplex;
445
+ }
446
+
447
+ get isTokenizable() {
448
+ switch (this.elementType.storedClassType) {
449
+ case "string":
450
+ return true;
451
+ case "number":
452
+ return true;
453
+ default:
454
+ return false;
455
+ }
456
+ }
457
+
458
+ // See comment on ListAttributeTypeModel.isStoredClassUnavailable above - same
459
+ // reasoning applies here.
460
+ get isStoredClassUnavailable() {
461
+ if (this.isComplex) {
462
+ return false;
463
+ }
464
+ return this.resolvedStoredClass === undefined;
465
+ }
466
+ }
467
+
468
+ export class MapAttributeTypeModel implements CollectionAttributeTypeModel {
469
+ constructor(public readonly elementType: AttributeTypeModel) {}
470
+
471
+ get typeModelType() {
472
+ return "map";
473
+ }
474
+
475
+ get struct() {
476
+ return this.elementType.struct;
477
+ }
478
+
479
+ get isComplex() {
480
+ return this.elementType.isComplex;
481
+ }
482
+
483
+ getStoredClassInitializer(name: string) {
484
+ if (this.isComplex) {
485
+ return `new ${this.storedClassType}(this, "${name}")`;
486
+ } else {
487
+ return `new cdktn.${this.resolvedStoredClass!.name}(this, "${name}")`;
488
+ }
489
+ }
490
+
491
+ get storedClassType() {
492
+ return `${this.elementType.storedClassType}Map`;
493
+ }
494
+
495
+ get resolvedStoredClass() {
496
+ return resolveStoredClassName(
497
+ this.storedClassType,
498
+ this.elementType.typeModelType,
499
+ );
500
+ }
501
+
502
+ get inputTypeDefinition() {
503
+ // map of booleans has token support, but booleans don't
504
+ if (this.elementType.storedClassType === "boolean") {
505
+ return `{ [key: string]: (${this.elementType.storedClassType} | cdktn.IResolvable) }`;
506
+ } else if (this.isComplex) {
507
+ return `{ [key: string]: ${this.elementType.storedClassType} } | cdktn.IResolvable`;
508
+ } else if (this.elementType.typeModelType !== "simple") {
509
+ return `{ [key: string]: ${this.elementType.inputTypeDefinition} } | cdktn.IResolvable`;
510
+ } else {
511
+ return `{ [key: string]: ${this.elementType.storedClassType} }`;
512
+ }
513
+ }
514
+
515
+ getAttributeAccessFunction(name: string) {
516
+ if (!this.isComplex && this.elementType.typeModelType !== "simple") {
517
+ return `this.interpolationForAttribute('${name}')`;
518
+ }
519
+
520
+ return `this.get${uppercaseFirst(
521
+ this.storedClassType,
522
+ )}Attribute('${name}')`;
523
+ }
524
+
525
+ get toTerraformFunction() {
526
+ return `cdktn.hashMapper(${this.elementType.toTerraformFunction})`;
527
+ }
528
+
529
+ get toHclTerraformFunction() {
530
+ return `cdktn.hashMapperHcl(${this.elementType.toHclTerraformFunction})`;
531
+ }
532
+
533
+ get hasReferenceClass() {
534
+ return this.isComplex;
535
+ }
536
+
537
+ get isTokenizable() {
538
+ switch (this.elementType.storedClassType) {
539
+ case "string":
540
+ return true;
541
+ case "number":
542
+ return true;
543
+ case "boolean":
544
+ return true;
545
+ case "any":
546
+ return true;
547
+ default:
548
+ return false;
549
+ }
550
+ }
551
+
552
+ // See comment on ListAttributeTypeModel.isStoredClassUnavailable above - same
553
+ // reasoning applies here (MapAttributeTypeModel.hasReferenceClass is just isComplex).
554
+ get isStoredClassUnavailable() {
555
+ if (this.isComplex) {
556
+ return false;
557
+ }
558
+ return this.resolvedStoredClass === undefined;
559
+ }
560
+ }
@@ -0,0 +1,8 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ export * from "./attribute-model";
4
+ export * from "./attribute-type-model";
5
+ export * from "./provider-function-model";
6
+ export * from "./resource-model";
7
+ export * from "./scope";
8
+ export * from "./struct";