@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,170 @@
1
+ {
2
+ "provider_schemas": {
3
+ "registry.terraform.io/hashicorp/time": {
4
+ "provider": {
5
+ "version": 0,
6
+ "block": {
7
+ "description": "Use Terraform to trigger actions and generate time based data. Currently supports outputting time or ranges of time from a supplied timestamp, as well as basic date manipulation, encoding into RFC3339, and describing durations.\n\nThis provider is intended to be used in Terraform configurations that require basic date/time functionality where existing time-related data does not exist. Since this provider does not use any external APIs, it does not require any configuration and is used to fill in gaps where the Terraform configuration language itself does not yet support certain functionality.",
8
+ "description_kind": "markdown"
9
+ }
10
+ },
11
+ "resource_schemas": {
12
+ "time_static": {
13
+ "version": 0,
14
+ "block": {
15
+ "attributes": {
16
+ "day": {
17
+ "type": "number",
18
+ "description": "Number day of timestamp.",
19
+ "description_kind": "plain",
20
+ "computed": true
21
+ },
22
+ "hour": {
23
+ "type": "number",
24
+ "description": "Number hour of timestamp.",
25
+ "description_kind": "plain",
26
+ "computed": true
27
+ },
28
+ "id": {
29
+ "type": "string",
30
+ "description": "RFC3339 format of the offset timestamp, e.g. `2020-02-12T06:36:13Z`.",
31
+ "description_kind": "plain",
32
+ "computed": true
33
+ },
34
+ "minute": {
35
+ "type": "number",
36
+ "description": "Number minute of timestamp.",
37
+ "description_kind": "plain",
38
+ "computed": true
39
+ },
40
+ "month": {
41
+ "type": "number",
42
+ "description": "Number month of timestamp.",
43
+ "description_kind": "plain",
44
+ "computed": true
45
+ },
46
+ "rfc3339": {
47
+ "type": "string",
48
+ "description": "Base timestamp in [RFC3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.8) format (see [RFC3339 time string](https://tools.ietf.org/html/rfc3339#section-5.8) e.g., `YYYY-MM-DDTHH:MM:SSZ`). Defaults to the current time.",
49
+ "description_kind": "plain",
50
+ "optional": true,
51
+ "computed": true
52
+ },
53
+ "second": {
54
+ "type": "number",
55
+ "description": "Number second of timestamp.",
56
+ "description_kind": "plain",
57
+ "computed": true
58
+ },
59
+ "triggers": {
60
+ "type": [
61
+ "map",
62
+ "string"
63
+ ],
64
+ "description": "Arbitrary map of values that, when changed, will trigger a new base timestamp value to be saved. See [the main provider documentation](../index.md) for more information.",
65
+ "description_kind": "plain",
66
+ "optional": true
67
+ },
68
+ "unix": {
69
+ "type": "number",
70
+ "description": "Number of seconds since epoch time, e.g. `1581489373`.",
71
+ "description_kind": "plain",
72
+ "computed": true
73
+ },
74
+ "year": {
75
+ "type": "number",
76
+ "description": "Number year of timestamp.",
77
+ "description_kind": "plain",
78
+ "computed": true
79
+ }
80
+ },
81
+ "description": "Manages a static time resource, which keeps a locally sourced UTC timestamp stored in the Terraform state. This prevents perpetual differences caused by using the [`timestamp()` function](https://www.terraform.io/docs/configuration/functions/timestamp.html).",
82
+ "description_kind": "plain"
83
+ }
84
+ }
85
+ },
86
+ "functions": {
87
+ "duration_parse": {
88
+ "description": "Given a [Go duration string](https://pkg.go.dev/time#ParseDuration), will parse and return an object representation of that duration.",
89
+ "summary": "Parse a [Go duration string](https://pkg.go.dev/time#ParseDuration) into an object",
90
+ "return_type": [
91
+ "object",
92
+ {
93
+ "hours": "number",
94
+ "microseconds": "number",
95
+ "milliseconds": "number",
96
+ "minutes": "number",
97
+ "nanoseconds": "number",
98
+ "seconds": "number"
99
+ }
100
+ ],
101
+ "parameters": [
102
+ {
103
+ "name": "duration",
104
+ "description": "Go time package duration string to parse",
105
+ "type": "string"
106
+ }
107
+ ]
108
+ },
109
+ "rfc3339_parse": {
110
+ "description": "Given an RFC3339 timestamp string, will parse and return an object representation of that date and time.",
111
+ "summary": "Parse an RFC3339 timestamp string into an object",
112
+ "return_type": [
113
+ "object",
114
+ {
115
+ "day": "number",
116
+ "hour": "number",
117
+ "iso_week": "number",
118
+ "iso_year": "number",
119
+ "minute": "number",
120
+ "month": "number",
121
+ "month_name": "string",
122
+ "second": "number",
123
+ "unix": "number",
124
+ "weekday": "number",
125
+ "weekday_name": "string",
126
+ "year": "number",
127
+ "year_day": "number"
128
+ }
129
+ ],
130
+ "parameters": [
131
+ {
132
+ "name": "timestamp",
133
+ "description": "RFC3339 timestamp string to parse",
134
+ "type": "string"
135
+ }
136
+ ]
137
+ },
138
+ "unix_timestamp_parse": {
139
+ "description": "Given a unix timestamp integer, will parse and return an object representation of that date and time. A unix timestamp is the number of seconds elapsed since January 1, 1970 UTC.",
140
+ "summary": "Parse a unix timestamp integer into an object",
141
+ "return_type": [
142
+ "object",
143
+ {
144
+ "day": "number",
145
+ "hour": "number",
146
+ "iso_week": "number",
147
+ "iso_year": "number",
148
+ "minute": "number",
149
+ "month": "number",
150
+ "month_name": "string",
151
+ "rfc3339": "string",
152
+ "second": "number",
153
+ "weekday": "number",
154
+ "weekday_name": "string",
155
+ "year": "number",
156
+ "year_day": "number"
157
+ }
158
+ ],
159
+ "parameters": [
160
+ {
161
+ "name": "unix_timestamp",
162
+ "description": "Unix Timestamp integer to parse",
163
+ "type": "number"
164
+ }
165
+ ]
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "provider_schemas": {
3
+ "registry.terraform.io/hashicorp/vault": {
4
+ "resource_schemas": {
5
+ "vault_alicloud_secret_backend": {
6
+ "version": 0,
7
+ "block": {
8
+ "attributes": {
9
+ "access_key": {
10
+ "type": "string",
11
+ "description": "The AliCloud Access Key ID to use when generating new credentials.",
12
+ "description_kind": "markdown",
13
+ "required": true,
14
+ "sensitive": true
15
+ },
16
+ "mount": {
17
+ "type": "string",
18
+ "description": "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.",
19
+ "description_kind": "markdown",
20
+ "required": true
21
+ },
22
+ "namespace": {
23
+ "type": "string",
24
+ "description": "Target namespace. (requires Enterprise)",
25
+ "description_kind": "markdown",
26
+ "optional": true
27
+ },
28
+ "secret_key_wo": {
29
+ "type": "string",
30
+ "description": "Write-only AliCloud Secret Access Key. This value will never be read back from Vault.",
31
+ "description_kind": "markdown",
32
+ "required": true,
33
+ "sensitive": true,
34
+ "write_only": true
35
+ },
36
+ "secondary_secret_key_wo": {
37
+ "type": "string",
38
+ "description": "Optional write-only secondary AliCloud Secret Access Key. This value will never be read back from Vault.",
39
+ "description_kind": "markdown",
40
+ "optional": true,
41
+ "sensitive": true,
42
+ "write_only": true
43
+ },
44
+ "secret_key_wo_version": {
45
+ "type": "number",
46
+ "description": "A version counter for the write-only `secret_key_wo` field. Incrementing this value will trigger an update to the secret key in Vault.",
47
+ "description_kind": "markdown",
48
+ "required": true
49
+ }
50
+ },
51
+ "description": "Configures the AliCloud secrets engine credentials. The mount itself must be created first using a `vault_mount` resource with `type = \"alicloud\"`. Use `vault_mount.alicloud.id` as `mount_id` on ephemeral resources to guarantee deferral.",
52
+ "description_kind": "markdown"
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,129 @@
1
+ // Copyright (c) HashiCorp, Inc
2
+ // SPDX-License-Identifier: MPL-2.0
3
+ import * as fs from "fs";
4
+ import * as os from "os";
5
+ import * as path from "path";
6
+ import { CodeMaker } from "codemaker";
7
+ import {
8
+ TerraformProviderGenerator,
9
+ type TerraformProviderGeneratorOptions,
10
+ } from "../../generator/provider-generator";
11
+
12
+ const fixture = JSON.parse(
13
+ fs.readFileSync(
14
+ path.join(__dirname, "fixtures", "aws_wafv2_web_acl.test.fixture.json"),
15
+ "utf-8",
16
+ ),
17
+ );
18
+
19
+ async function generate(options: TerraformProviderGeneratorOptions = {}) {
20
+ const code = new CodeMaker();
21
+ const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "import-style.test"));
22
+ new TerraformProviderGenerator(code, fixture, options).generateAll();
23
+ await code.save(workdir);
24
+ return workdir;
25
+ }
26
+
27
+ const RESOURCE_INDEX = "providers/test/wafv2-web-acl/index.ts";
28
+ const STRUCTS_INDEX = "providers/test/wafv2-web-acl/index-structs/index.ts";
29
+ const STRUCTS_DIR = "providers/test/wafv2-web-acl/index-structs";
30
+ const PROVIDER_INDEX = "providers/test/index.ts";
31
+
32
+ function readAllShards(workdir: string): string {
33
+ return fs
34
+ .readdirSync(path.join(workdir, STRUCTS_DIR))
35
+ .filter((f) => /^structs\d+\.ts$/.test(f))
36
+ .map((f) => fs.readFileSync(path.join(workdir, STRUCTS_DIR, f), "utf-8"))
37
+ .join("\n");
38
+ }
39
+
40
+ test("default (no importExtension): emits explicit /index for folders, bare for files", async () => {
41
+ const workdir = await generate();
42
+
43
+ const resource = fs.readFileSync(path.join(workdir, RESOURCE_INDEX), "utf-8");
44
+ expect(resource).toContain(`} from './index-structs/index'`);
45
+ expect(resource).toContain(`export * from './index-structs/index'`);
46
+ expect(resource).not.toMatch(/from '\.\/[^']*\.(js|ts)'/);
47
+
48
+ const structsIndex = fs.readFileSync(
49
+ path.join(workdir, STRUCTS_INDEX),
50
+ "utf-8",
51
+ );
52
+ expect(structsIndex).toContain(`export * from './structs0'`);
53
+ expect(structsIndex).not.toMatch(/from '\.\/[^']*\.(js|ts)'/);
54
+
55
+ const providerIndex = fs.readFileSync(
56
+ path.join(workdir, PROVIDER_INDEX),
57
+ "utf-8",
58
+ );
59
+ expect(providerIndex).toMatch(/from '\.\/[^']+\/index';/);
60
+ });
61
+
62
+ test("importExtension '.js': emits fully-qualified ./<folder>/index.js and ./<file>.js", async () => {
63
+ const workdir = await generate({ importExtension: ".js" });
64
+
65
+ const resource = fs.readFileSync(path.join(workdir, RESOURCE_INDEX), "utf-8");
66
+ expect(resource).toContain(`} from './index-structs/index.js'`);
67
+ expect(resource).toContain(`export * from './index-structs/index.js'`);
68
+
69
+ const structsIndex = fs.readFileSync(
70
+ path.join(workdir, STRUCTS_INDEX),
71
+ "utf-8",
72
+ );
73
+ expect(structsIndex).toContain(`export * from './structs0.js'`);
74
+
75
+ const allShards = readAllShards(workdir);
76
+ expect(allShards).toMatch(/from '\.\/structs\d+\.js'/);
77
+
78
+ const providerIndex = fs.readFileSync(
79
+ path.join(workdir, PROVIDER_INDEX),
80
+ "utf-8",
81
+ );
82
+ expect(providerIndex).toMatch(/from '\.\/[^']+\/index\.js';/);
83
+ });
84
+
85
+ test("importExtension '.ts': emits fully-qualified ./<folder>/index.ts and ./<file>.ts", async () => {
86
+ const workdir = await generate({ importExtension: ".ts" });
87
+
88
+ const resource = fs.readFileSync(path.join(workdir, RESOURCE_INDEX), "utf-8");
89
+ expect(resource).toContain(`} from './index-structs/index.ts'`);
90
+ expect(resource).toContain(`export * from './index-structs/index.ts'`);
91
+
92
+ const structsIndex = fs.readFileSync(
93
+ path.join(workdir, STRUCTS_INDEX),
94
+ "utf-8",
95
+ );
96
+ expect(structsIndex).toContain(`export * from './structs0.ts'`);
97
+
98
+ const allShards = readAllShards(workdir);
99
+ expect(allShards).toMatch(/from '\.\/structs\d+\.ts'/);
100
+
101
+ const providerIndex = fs.readFileSync(
102
+ path.join(workdir, PROVIDER_INDEX),
103
+ "utf-8",
104
+ );
105
+ expect(providerIndex).toMatch(/from '\.\/[^']+\/index\.ts';/);
106
+ });
107
+
108
+ test("importExtension '': emits explicit /index for folders, bare for files", async () => {
109
+ const workdir = await generate({ importExtension: "" });
110
+
111
+ const resource = fs.readFileSync(path.join(workdir, RESOURCE_INDEX), "utf-8");
112
+ expect(resource).toContain(`} from './index-structs/index'`);
113
+ expect(resource).toContain(`export * from './index-structs/index'`);
114
+ expect(resource).not.toMatch(/from '\.\/[^']*\.(js|ts)'/);
115
+
116
+ const structsIndex = fs.readFileSync(
117
+ path.join(workdir, STRUCTS_INDEX),
118
+ "utf-8",
119
+ );
120
+ // file targets get the (empty) extension, so they stay bare
121
+ expect(structsIndex).toContain(`export * from './structs0'`);
122
+ expect(structsIndex).not.toMatch(/from '\.\/[^']*\.(js|ts)'/);
123
+
124
+ const providerIndex = fs.readFileSync(
125
+ path.join(workdir, PROVIDER_INDEX),
126
+ "utf-8",
127
+ );
128
+ expect(providerIndex).toMatch(/from '\.\/[^']+\/index';/);
129
+ });