@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.
- package/.spec.swcrc +22 -0
- package/LICENSE +355 -0
- package/README.md +1 -1
- package/build/__tests__/edge-provider-schema/builder.d.ts +9 -3
- package/build/__tests__/edge-provider-schema/builder.js +6 -3
- package/build/__tests__/edge-provider-schema/cli.js +8 -3
- package/build/__tests__/edge-provider-schema/index.js +119 -1
- package/build/__tests__/provider.test.js +4 -1
- package/build/get/__tests__/generator/ephemeral-resources.test.d.ts +2 -0
- package/build/get/__tests__/generator/ephemeral-resources.test.js +49 -0
- package/build/get/__tests__/generator/module-generator.test.js +12 -12
- package/build/get/__tests__/generator/provider-functions.test.d.ts +2 -0
- package/build/get/__tests__/generator/provider-functions.test.js +176 -0
- package/build/get/__tests__/generator/provider-source-matching.test.d.ts +2 -0
- package/build/get/__tests__/generator/provider-source-matching.test.js +45 -0
- package/build/get/__tests__/generator/provider.test.js +9 -1
- package/build/get/__tests__/generator/supported-stored-classes.test.d.ts +2 -0
- package/build/get/__tests__/generator/supported-stored-classes.test.js +137 -0
- package/build/get/__tests__/generator/types.test.js +44 -1
- package/build/get/__tests__/generator/write-only.test.d.ts +2 -0
- package/build/get/__tests__/generator/write-only.test.js +65 -0
- package/build/get/__tests__/target-versions.test.d.ts +2 -0
- package/build/get/__tests__/target-versions.test.js +171 -0
- package/build/get/constructs-maker.d.ts +8 -1
- package/build/get/constructs-maker.js +46 -10
- package/build/get/generator/emitter/attributes-emitter.d.ts +13 -2
- package/build/get/generator/emitter/attributes-emitter.js +71 -5
- package/build/get/generator/emitter/index.d.ts +1 -0
- package/build/get/generator/emitter/index.js +2 -1
- package/build/get/generator/emitter/provider-functions-emitter.d.ts +11 -0
- package/build/get/generator/emitter/provider-functions-emitter.js +94 -0
- package/build/get/generator/emitter/resource-emitter.d.ts +5 -1
- package/build/get/generator/emitter/resource-emitter.js +83 -7
- package/build/get/generator/emitter/struct-emitter.js +10 -10
- package/build/get/generator/models/attribute-model.d.ts +4 -0
- package/build/get/generator/models/attribute-model.js +50 -4
- package/build/get/generator/models/attribute-type-model.d.ts +24 -0
- package/build/get/generator/models/attribute-type-model.js +91 -5
- package/build/get/generator/models/index.d.ts +1 -0
- package/build/get/generator/models/index.js +2 -1
- package/build/get/generator/models/provider-function-model.d.ts +102 -0
- package/build/get/generator/models/provider-function-model.js +667 -0
- package/build/get/generator/models/resource-model.d.ts +3 -0
- package/build/get/generator/models/resource-model.js +13 -4
- package/build/get/generator/models/struct.d.ts +2 -0
- package/build/get/generator/models/struct.js +6 -2
- package/build/get/generator/models/supported-stored-classes.d.ts +5 -0
- package/build/get/generator/models/supported-stored-classes.js +86 -0
- package/build/get/generator/module-generator.js +3 -3
- package/build/get/generator/provider-generator.d.ts +2 -0
- package/build/get/generator/provider-generator.js +41 -6
- package/build/get/generator/resource-parser.js +3 -1
- package/jest.config.js +16 -9
- package/package.json +28 -27
- package/package.sh +1 -1
- package/src/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +4 -0
- package/src/__tests__/__snapshots__/provider.test.ts.snap +2828 -2828
- package/src/__tests__/edge-provider-schema/builder.ts +201 -0
- package/src/__tests__/edge-provider-schema/cli.ts +51 -0
- package/src/__tests__/edge-provider-schema/index.ts +284 -0
- package/src/__tests__/edge-provider-schema.test.ts +24 -0
- package/src/__tests__/provider.test.ts +183 -0
- package/src/get/__tests__/constructs-maker.test.ts +118 -0
- package/src/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +5 -5
- package/src/get/__tests__/generator/__snapshots__/ephemeral-resources.test.ts.snap +524 -0
- package/src/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +3310 -3310
- package/src/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +355 -355
- package/src/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +8 -8
- package/src/get/__tests__/generator/__snapshots__/provider-functions.test.ts.snap +444 -0
- package/src/get/__tests__/generator/__snapshots__/provider.test.ts.snap +8 -8
- package/src/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +126 -126
- package/src/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +17 -17
- package/src/get/__tests__/generator/__snapshots__/types.test.ts.snap +201 -52
- package/src/get/__tests__/generator/__snapshots__/write-only.test.ts.snap +262 -0
- package/src/get/__tests__/generator/complex-computed-types.test.ts +28 -0
- package/src/get/__tests__/generator/deep-nested-attributes.test.ts +56 -0
- package/src/get/__tests__/generator/description-escaping.test.ts +84 -0
- package/src/get/__tests__/generator/empty-provider-resources.test.ts +26 -0
- package/src/get/__tests__/generator/ephemeral-resources.test.ts +46 -0
- package/src/get/__tests__/generator/export-sharding.test.ts +169 -0
- package/src/get/__tests__/generator/fixtures/deeply-nested-collections.test.fixture.json +129 -0
- package/src/get/__tests__/generator/fixtures/ephemeral-resources.test.fixture.json +160 -0
- package/src/get/__tests__/generator/fixtures/provider-functions-collision.test.fixture.json +31 -0
- package/src/get/__tests__/generator/fixtures/provider-functions-synthetic.test.fixture.json +192 -0
- package/src/get/__tests__/generator/fixtures/provider-functions.test.fixture.json +170 -0
- package/src/get/__tests__/generator/fixtures/write-only.test.fixture.json +58 -0
- package/src/get/__tests__/generator/import-style.test.ts +129 -0
- package/src/get/__tests__/generator/module-generator.test.ts +528 -0
- package/src/get/__tests__/generator/nested-types.test.ts +54 -0
- package/src/get/__tests__/generator/provider-functions.test.ts +262 -0
- package/src/get/__tests__/generator/provider-source-matching.test.ts +84 -0
- package/src/get/__tests__/generator/provider.test.ts +59 -0
- package/src/get/__tests__/generator/resource-types.test.ts +118 -0
- package/src/get/__tests__/generator/skipped-attributes.test.ts +72 -0
- package/src/get/__tests__/generator/supported-stored-classes.test.ts +147 -0
- package/src/get/__tests__/generator/types.test.ts +686 -0
- package/src/get/__tests__/generator/versions-file.test.ts +72 -0
- package/src/get/__tests__/generator/write-only.test.ts +71 -0
- package/src/get/__tests__/target-versions.test.ts +206 -0
- package/src/get/__tests__/util.ts +75 -0
- package/src/get/constructs-maker.ts +885 -0
- package/src/get/generator/custom-defaults.ts +493 -0
- package/src/get/generator/emitter/attributes-emitter.ts +316 -0
- package/src/get/generator/emitter/index.ts +6 -0
- package/src/get/generator/emitter/provider-functions-emitter.ts +117 -0
- package/src/get/generator/emitter/resource-emitter.ts +330 -0
- package/src/get/generator/emitter/struct-emitter.ts +683 -0
- package/src/get/generator/loop-detection.ts +81 -0
- package/src/get/generator/models/attribute-model.ts +273 -0
- package/src/get/generator/models/attribute-type-model.ts +560 -0
- package/src/get/generator/models/index.ts +8 -0
- package/src/get/generator/models/provider-function-model.ts +872 -0
- package/src/get/generator/models/resource-model.ts +183 -0
- package/src/get/generator/models/scope.ts +54 -0
- package/src/get/generator/models/struct.ts +124 -0
- package/src/get/generator/models/supported-stored-classes.ts +88 -0
- package/src/get/generator/module-generator.ts +234 -0
- package/src/get/generator/provider-generator.ts +428 -0
- package/src/get/generator/resource-parser.ts +764 -0
- package/src/get/generator/sanitized-comments.ts +49 -0
- package/src/get/generator/skipped-attributes.ts +27 -0
- package/src/index.ts +40 -0
- package/src/util.ts +26 -0
- 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";
|