@microsoft/terraform-cdk-constructs 1.7.1 → 1.9.0

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 (121) hide show
  1. package/.jsii +46476 -27231
  2. package/API.md +68443 -28286
  3. package/lib/azure-actiongroup/lib/action-group.js +1 -1
  4. package/lib/azure-activitylogalert/lib/activity-log-alert.js +1 -1
  5. package/lib/azure-aks/lib/aks-cluster.js +1 -1
  6. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +1 -1
  7. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +1 -1
  8. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +1 -1
  9. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +1 -1
  10. package/lib/azure-dnsresolver/lib/dns-resolver.js +1 -1
  11. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +1 -1
  12. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +1 -1
  13. package/lib/azure-dnszone/lib/dns-zone.js +1 -1
  14. package/lib/azure-dnszone/lib/index.d.ts +1 -0
  15. package/lib/azure-dnszone/lib/index.js +2 -1
  16. package/lib/azure-dnszone/lib/records/dns-record-schemas.d.ts +68 -0
  17. package/lib/azure-dnszone/lib/records/dns-record-schemas.js +813 -0
  18. package/lib/azure-dnszone/lib/records/dns-records.d.ts +688 -0
  19. package/lib/azure-dnszone/lib/records/dns-records.js +924 -0
  20. package/lib/azure-dnszone/lib/records/index.d.ts +19 -0
  21. package/lib/azure-dnszone/lib/records/index.js +38 -0
  22. package/lib/azure-dnszone/test/dns-records.integ.d.ts +21 -0
  23. package/lib/azure-dnszone/test/dns-records.integ.js +321 -0
  24. package/lib/azure-dnszone/test/dns-records.spec.d.ts +20 -0
  25. package/lib/azure-dnszone/test/dns-records.spec.js +950 -0
  26. package/lib/azure-loganalyticsworkspace/index.d.ts +6 -0
  27. package/lib/azure-loganalyticsworkspace/index.js +23 -0
  28. package/lib/azure-loganalyticsworkspace/lib/index.d.ts +5 -0
  29. package/lib/azure-loganalyticsworkspace/lib/index.js +22 -0
  30. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.d.ts +51 -0
  31. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace-schemas.js +255 -0
  32. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.d.ts +301 -0
  33. package/lib/azure-loganalyticsworkspace/lib/log-analytics-workspace.js +213 -0
  34. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.d.ts +9 -0
  35. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.integ.js +71 -0
  36. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.d.ts +8 -0
  37. package/lib/azure-loganalyticsworkspace/test/log-analytics-workspace.spec.js +504 -0
  38. package/lib/azure-metricalert/lib/metric-alert.js +1 -1
  39. package/lib/azure-networkinterface/lib/network-interface.js +1 -1
  40. package/lib/azure-networksecuritygroup/lib/network-security-group.js +1 -1
  41. package/lib/azure-networkwatcher/index.d.ts +14 -0
  42. package/lib/azure-networkwatcher/index.js +31 -0
  43. package/lib/azure-networkwatcher/lib/index.d.ts +5 -0
  44. package/lib/azure-networkwatcher/lib/index.js +22 -0
  45. package/lib/azure-networkwatcher/lib/network-watcher-schemas.d.ts +47 -0
  46. package/lib/azure-networkwatcher/lib/network-watcher-schemas.js +167 -0
  47. package/lib/azure-networkwatcher/lib/network-watcher.d.ts +181 -0
  48. package/lib/azure-networkwatcher/lib/network-watcher.js +187 -0
  49. package/lib/azure-networkwatcher/test/network-watcher.integ.d.ts +12 -0
  50. package/lib/azure-networkwatcher/test/network-watcher.integ.js +84 -0
  51. package/lib/azure-networkwatcher/test/network-watcher.spec.d.ts +8 -0
  52. package/lib/azure-networkwatcher/test/network-watcher.spec.js +312 -0
  53. package/lib/azure-policyassignment/lib/policy-assignment.js +1 -1
  54. package/lib/azure-policydefinition/lib/policy-definition.js +1 -1
  55. package/lib/azure-policysetdefinition/index.d.ts +10 -0
  56. package/lib/azure-policysetdefinition/index.js +27 -0
  57. package/lib/azure-policysetdefinition/lib/index.d.ts +5 -0
  58. package/lib/azure-policysetdefinition/lib/index.js +22 -0
  59. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.d.ts +50 -0
  60. package/lib/azure-policysetdefinition/lib/policy-set-definition-schemas.js +255 -0
  61. package/lib/azure-policysetdefinition/lib/policy-set-definition.d.ts +426 -0
  62. package/lib/azure-policysetdefinition/lib/policy-set-definition.js +255 -0
  63. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.d.ts +9 -0
  64. package/lib/azure-policysetdefinition/test/policy-set-definition.integ.js +56 -0
  65. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.d.ts +8 -0
  66. package/lib/azure-policysetdefinition/test/policy-set-definition.spec.js +745 -0
  67. package/lib/azure-privatednszone/lib/index.d.ts +1 -0
  68. package/lib/azure-privatednszone/lib/index.js +2 -1
  69. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +0 -2
  70. package/lib/azure-privatednszone/lib/private-dns-zone.js +6 -13
  71. package/lib/azure-privatednszone/lib/records/index.d.ts +7 -0
  72. package/lib/azure-privatednszone/lib/records/index.js +26 -0
  73. package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.d.ts +52 -0
  74. package/lib/azure-privatednszone/lib/records/private-dns-record-schemas.js +683 -0
  75. package/lib/azure-privatednszone/lib/records/private-dns-records.d.ts +523 -0
  76. package/lib/azure-privatednszone/lib/records/private-dns-records.js +739 -0
  77. package/lib/azure-privatednszone/test/private-dns-records.integ.d.ts +19 -0
  78. package/lib/azure-privatednszone/test/private-dns-records.integ.js +245 -0
  79. package/lib/azure-privatednszone/test/private-dns-records.spec.d.ts +18 -0
  80. package/lib/azure-privatednszone/test/private-dns-records.spec.js +756 -0
  81. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +5 -5
  82. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +1 -1
  83. package/lib/azure-publicipaddress/lib/public-ip-address.js +1 -1
  84. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  85. package/lib/azure-roleassignment/lib/role-assignment.js +1 -1
  86. package/lib/azure-roledefinition/lib/role-definition.js +1 -1
  87. package/lib/azure-storageaccount/lib/storage-account.js +1 -1
  88. package/lib/azure-subnet/lib/subnet.js +1 -1
  89. package/lib/azure-virtualmachine/lib/virtual-machine.js +1 -1
  90. package/lib/azure-virtualnetwork/lib/virtual-network.js +1 -1
  91. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway-schemas.js +2 -2
  92. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.d.ts +4 -2
  93. package/lib/azure-virtualnetworkgateway/lib/virtual-network-gateway.js +8 -5
  94. package/lib/azure-virtualnetworkgateway/test/virtual-network-gateway.spec.js +109 -1
  95. package/lib/azure-virtualnetworkgatewayconnection/lib/virtual-network-gateway-connection.js +1 -1
  96. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +1 -1
  97. package/lib/azure-virtualnetworkmanager/lib/ipam-pool-static-cidr.js +1 -1
  98. package/lib/azure-virtualnetworkmanager/lib/ipam-pool.js +1 -1
  99. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +1 -1
  100. package/lib/azure-virtualnetworkmanager/lib/network-group.js +1 -1
  101. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +1 -1
  102. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +1 -1
  103. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +1 -1
  104. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +1 -1
  105. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +1 -1
  106. package/lib/core-azure/lib/azapi/azapi-resource.js +4 -4
  107. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  108. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  109. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +1 -1
  110. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  111. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  112. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  113. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +1 -1
  114. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  115. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  116. package/lib/index.d.ts +23 -0
  117. package/lib/index.js +25 -2
  118. package/lib/testing/index.js +2 -2
  119. package/lib/testing/lib/cleanup.js +1 -1
  120. package/lib/testing/lib/metadata.js +1 -1
  121. package/package.json +1 -1
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive tests for the NetworkWatcher implementation
4
+ *
5
+ * This test suite validates the NetworkWatcher class using the AzapiResource framework.
6
+ * Tests cover automatic version resolution, explicit version pinning, schema validation,
7
+ * property configurations, and resource creation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const cdktf_1 = require("cdktf");
11
+ const cdktf = require("cdktf");
12
+ const network_watcher_1 = require("../lib/network-watcher");
13
+ describe("NetworkWatcher - Implementation", () => {
14
+ let app;
15
+ let stack;
16
+ beforeEach(() => {
17
+ app = cdktf_1.Testing.app();
18
+ stack = new cdktf.TerraformStack(app, "TestStack");
19
+ });
20
+ // =============================================================================
21
+ // Constructor and Basic Properties
22
+ // =============================================================================
23
+ describe("Constructor and Basic Properties", () => {
24
+ it("should create a Network Watcher with minimal configuration", () => {
25
+ const props = {
26
+ name: "test-network-watcher",
27
+ location: "eastus",
28
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
29
+ };
30
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "TestNetworkWatcher", props);
31
+ expect(networkWatcher).toBeInstanceOf(network_watcher_1.NetworkWatcher);
32
+ expect(networkWatcher.props).toBe(props);
33
+ expect(networkWatcher.props.name).toBe("test-network-watcher");
34
+ expect(networkWatcher.props.location).toBe("eastus");
35
+ });
36
+ it("should create a Network Watcher with tags", () => {
37
+ const props = {
38
+ name: "tagged-network-watcher",
39
+ location: "westus2",
40
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
41
+ tags: {
42
+ environment: "production",
43
+ team: "networking",
44
+ },
45
+ };
46
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "TaggedNetworkWatcher", props);
47
+ expect(networkWatcher.props.tags).toEqual({
48
+ environment: "production",
49
+ team: "networking",
50
+ });
51
+ });
52
+ it("should create a Network Watcher with conventional naming", () => {
53
+ const props = {
54
+ name: "NetworkWatcher_eastus",
55
+ location: "eastus",
56
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/NetworkWatcherRG",
57
+ };
58
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "ConventionalNetworkWatcher", props);
59
+ expect(networkWatcher.props.name).toBe("NetworkWatcher_eastus");
60
+ });
61
+ });
62
+ // =============================================================================
63
+ // Version Resolution
64
+ // =============================================================================
65
+ describe("Version Resolution", () => {
66
+ it("should use latest version 2024-01-01 when no version specified", () => {
67
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "DefaultVersion", {
68
+ name: "default-version-nw",
69
+ location: "eastus",
70
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
71
+ });
72
+ expect(networkWatcher.resolvedApiVersion).toBe("2024-01-01");
73
+ });
74
+ it("should use explicit version when specified", () => {
75
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "PinnedVersion", {
76
+ name: "pinned-version-nw",
77
+ location: "eastus",
78
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
79
+ apiVersion: "2023-11-01",
80
+ });
81
+ expect(networkWatcher.resolvedApiVersion).toBe("2023-11-01");
82
+ });
83
+ it("should use latest version 2024-01-01 when explicitly specified", () => {
84
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "LatestVersion", {
85
+ name: "latest-version-nw",
86
+ location: "eastus",
87
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
88
+ apiVersion: "2024-01-01",
89
+ });
90
+ expect(networkWatcher.resolvedApiVersion).toBe("2024-01-01");
91
+ });
92
+ });
93
+ // =============================================================================
94
+ // Property Transformation
95
+ // =============================================================================
96
+ describe("Property Transformation", () => {
97
+ it("should generate correct Azure API format via createResourceBody", () => {
98
+ const props = {
99
+ name: "transform-test",
100
+ location: "eastus",
101
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
102
+ };
103
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "TransformTest", props);
104
+ // Access the protected createResourceBody method
105
+ const resourceBody = networkWatcher.createResourceBody(props);
106
+ expect(resourceBody).toHaveProperty("properties");
107
+ expect(resourceBody.properties).toEqual({});
108
+ });
109
+ it("should have empty properties block for Network Watcher", () => {
110
+ const props = {
111
+ name: "empty-props-test",
112
+ location: "eastus",
113
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
114
+ tags: {
115
+ test: "value",
116
+ },
117
+ };
118
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "EmptyPropsTest", props);
119
+ const resourceBody = networkWatcher.createResourceBody(props);
120
+ // Network Watcher properties should be empty - tags are handled at resource level
121
+ expect(Object.keys(resourceBody.properties).length).toBe(0);
122
+ });
123
+ });
124
+ // =============================================================================
125
+ // Integration with Base Class
126
+ // =============================================================================
127
+ describe("Integration with Base Class", () => {
128
+ it("should inherit from AzapiResource", () => {
129
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "InheritanceTest", {
130
+ name: "inheritance-test",
131
+ location: "eastus",
132
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
133
+ });
134
+ // Verify it has AzapiResource properties
135
+ expect(networkWatcher).toHaveProperty("terraformResource");
136
+ expect(networkWatcher).toHaveProperty("resolvedApiVersion");
137
+ });
138
+ it("should have correct resourceType", () => {
139
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "ResourceTypeTest", {
140
+ name: "resource-type-test",
141
+ location: "eastus",
142
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
143
+ });
144
+ // Access the protected resourceType method
145
+ const resourceType = networkWatcher.resourceType();
146
+ expect(resourceType).toBe("Microsoft.Network/networkWatchers");
147
+ });
148
+ it("should resolve parent ID correctly", () => {
149
+ const resourceGroupId = "/subscriptions/test-sub/resourceGroups/test-rg";
150
+ const props = {
151
+ name: "parent-id-test",
152
+ location: "eastus",
153
+ resourceGroupId,
154
+ };
155
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "ParentIdTest", props);
156
+ // Access the protected resolveParentId method
157
+ const parentId = networkWatcher.resolveParentId(props);
158
+ expect(parentId).toBe(resourceGroupId);
159
+ });
160
+ it("should generate resource outputs", () => {
161
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "OutputsTest", {
162
+ name: "outputs-test",
163
+ location: "eastus",
164
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
165
+ });
166
+ expect(networkWatcher.idOutput).toBeInstanceOf(cdktf.TerraformOutput);
167
+ expect(networkWatcher.nameOutput).toBeInstanceOf(cdktf.TerraformOutput);
168
+ expect(networkWatcher.locationOutput).toBeInstanceOf(cdktf.TerraformOutput);
169
+ expect(networkWatcher.provisioningStateOutput).toBeInstanceOf(cdktf.TerraformOutput);
170
+ expect(networkWatcher.id).toMatch(/^\$\{.*\.id\}$/);
171
+ });
172
+ });
173
+ // =============================================================================
174
+ // CDK Terraform Integration
175
+ // =============================================================================
176
+ describe("CDK Terraform Integration", () => {
177
+ it("should synthesize to valid Terraform configuration", () => {
178
+ new network_watcher_1.NetworkWatcher(stack, "SynthTest", {
179
+ name: "synth-test",
180
+ location: "eastus",
181
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
182
+ });
183
+ const synthesized = cdktf_1.Testing.synth(stack);
184
+ expect(synthesized).toBeDefined();
185
+ const stackConfig = JSON.parse(synthesized);
186
+ expect(stackConfig.resource).toBeDefined();
187
+ });
188
+ it("should handle multiple Network Watchers in the same stack (different regions)", () => {
189
+ // Note: In practice, Azure only allows one Network Watcher per region per subscription
190
+ // but CDK can synthesize multiple in the same stack for different regions
191
+ const nw1 = new network_watcher_1.NetworkWatcher(stack, "NetworkWatcher1", {
192
+ name: "nw-eastus",
193
+ location: "eastus",
194
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
195
+ });
196
+ const nw2 = new network_watcher_1.NetworkWatcher(stack, "NetworkWatcher2", {
197
+ name: "nw-westus2",
198
+ location: "westus2",
199
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
200
+ apiVersion: "2023-11-01",
201
+ });
202
+ expect(nw1.resolvedApiVersion).toBe("2024-01-01");
203
+ expect(nw2.resolvedApiVersion).toBe("2023-11-01");
204
+ expect(nw1.props.location).toBe("eastus");
205
+ expect(nw2.props.location).toBe("westus2");
206
+ const synthesized = cdktf_1.Testing.synth(stack);
207
+ expect(synthesized).toBeDefined();
208
+ });
209
+ });
210
+ // =============================================================================
211
+ // Location Requirement
212
+ // =============================================================================
213
+ describe("Location Requirement", () => {
214
+ it("should require location for Network Watcher", () => {
215
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "LocationTest", {
216
+ name: "location-test",
217
+ location: "centralus",
218
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
219
+ });
220
+ // Access the protected requiresLocation method
221
+ const requiresLocation = networkWatcher.requiresLocation();
222
+ expect(requiresLocation).toBe(true);
223
+ });
224
+ it("should accept various Azure regions", () => {
225
+ const regions = [
226
+ "eastus",
227
+ "westus2",
228
+ "northeurope",
229
+ "southeastasia",
230
+ "brazilsouth",
231
+ ];
232
+ regions.forEach((region, index) => {
233
+ const props = {
234
+ name: `nw-${region}`,
235
+ location: region,
236
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
237
+ };
238
+ expect(() => {
239
+ new network_watcher_1.NetworkWatcher(stack, `RegionTest${index}`, props);
240
+ }).not.toThrow();
241
+ });
242
+ });
243
+ });
244
+ // =============================================================================
245
+ // Naming Conventions
246
+ // =============================================================================
247
+ describe("Naming Conventions", () => {
248
+ it("should accept Azure default Network Watcher naming convention", () => {
249
+ // Azure typically creates Network Watchers with names like "NetworkWatcher_<region>"
250
+ const props = {
251
+ name: "NetworkWatcher_eastus",
252
+ location: "eastus",
253
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/NetworkWatcherRG",
254
+ };
255
+ expect(() => {
256
+ new network_watcher_1.NetworkWatcher(stack, "AzureDefaultNaming", props);
257
+ }).not.toThrow();
258
+ });
259
+ it("should accept custom naming with hyphens", () => {
260
+ const props = {
261
+ name: "my-custom-network-watcher",
262
+ location: "eastus",
263
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
264
+ };
265
+ expect(() => {
266
+ new network_watcher_1.NetworkWatcher(stack, "CustomNaming", props);
267
+ }).not.toThrow();
268
+ });
269
+ it("should accept naming with periods", () => {
270
+ const props = {
271
+ name: "nw.prod.eastus",
272
+ location: "eastus",
273
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
274
+ };
275
+ expect(() => {
276
+ new network_watcher_1.NetworkWatcher(stack, "PeriodNaming", props);
277
+ }).not.toThrow();
278
+ });
279
+ });
280
+ // =============================================================================
281
+ // Complete Example Configuration
282
+ // =============================================================================
283
+ describe("Complete Example Configuration", () => {
284
+ it("should handle comprehensive Network Watcher configuration", () => {
285
+ const props = {
286
+ name: "comprehensive-network-watcher",
287
+ location: "eastus",
288
+ resourceGroupId: "/subscriptions/test-sub/resourceGroups/test-rg",
289
+ apiVersion: "2024-01-01",
290
+ tags: {
291
+ environment: "production",
292
+ team: "platform",
293
+ "cost-center": "networking",
294
+ "managed-by": "terraform-cdk",
295
+ },
296
+ };
297
+ const networkWatcher = new network_watcher_1.NetworkWatcher(stack, "ComprehensiveConfig", props);
298
+ expect(networkWatcher.props.name).toBe("comprehensive-network-watcher");
299
+ expect(networkWatcher.props.location).toBe("eastus");
300
+ expect(networkWatcher.resolvedApiVersion).toBe("2024-01-01");
301
+ expect(networkWatcher.props.tags).toEqual({
302
+ environment: "production",
303
+ team: "platform",
304
+ "cost-center": "networking",
305
+ "managed-by": "terraform-cdk",
306
+ });
307
+ const resourceBody = networkWatcher.createResourceBody(props);
308
+ expect(resourceBody.properties).toEqual({});
309
+ });
310
+ });
311
+ });
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay13YXRjaGVyLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtbmV0d29ya3dhdGNoZXIvdGVzdC9uZXR3b3JrLXdhdGNoZXIuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOztBQUVILGlDQUFnQztBQUNoQywrQkFBK0I7QUFDL0IsNERBQTZFO0FBRTdFLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7SUFDL0MsSUFBSSxHQUFjLENBQUM7SUFDbkIsSUFBSSxLQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxHQUFHLEdBQUcsZUFBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0ZBQWdGO0lBQ2hGLG1DQUFtQztJQUNuQyxnRkFBZ0Y7SUFFaEYsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxFQUFFLENBQUMsNERBQTRELEVBQUUsR0FBRyxFQUFFO1lBQ3BFLE1BQU0sS0FBSyxHQUF3QjtnQkFDakMsSUFBSSxFQUFFLHNCQUFzQjtnQkFDNUIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLGVBQWUsRUFBRSxnREFBZ0Q7YUFDbEUsQ0FBQztZQUVGLE1BQU0sY0FBYyxHQUFHLElBQUksZ0NBQWMsQ0FDdkMsS0FBSyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLENBQ04sQ0FBQztZQUVGLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsZ0NBQWMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFD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LENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDeEMsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLElBQUksRUFBRSxVQUFVO2dCQUNoQixhQUFhLEVBQUUsWUFBWTtnQkFDM0IsWUFBWSxFQUFFLGVBQWU7YUFDOUIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxZQUFZLEdBQUksY0FBc0IsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RSxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXByZWhlbnNpdmUgdGVzdHMgZm9yIHRoZSBOZXR3b3JrV2F0Y2hlciBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgdGVzdCBzdWl0ZSB2YWxpZGF0ZXMgdGhlIE5ldHdvcmtXYXRjaGVyIGNsYXNzIHVzaW5nIHRoZSBBemFwaVJlc291cmNlIGZyYW1ld29yay5cbiAqIFRlc3RzIGNvdmVyIGF1dG9tYXRpYyB2ZXJzaW9uIHJlc29sdXRpb24sIGV4cGxpY2l0IHZlcnNpb24gcGlubmluZywgc2NoZW1hIHZhbGlkYXRpb24sXG4gKiBwcm9wZXJ0eSBjb25maWd1cmF0aW9ucywgYW5kIHJlc291cmNlIGNyZWF0aW9uLlxuICovXG5cbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgTmV0d29ya1dhdGNoZXIsIE5ldHdvcmtXYXRjaGVyUHJvcHMgfSBmcm9tIFwiLi4vbGliL25ldHdvcmstd2F0Y2hlclwiO1xuXG5kZXNjcmliZShcIk5ldHdvcmtXYXRjaGVyIC0gSW1wbGVtZW50YXRpb25cIiwgKCkgPT4ge1xuICBsZXQgYXBwOiBjZGt0Zi5BcHA7XG4gIGxldCBzdGFjazogY2RrdGYuVGVycmFmb3JtU3RhY2s7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgYXBwID0gVGVzdGluZy5hcHAoKTtcbiAgICBzdGFjayA9IG5ldyBjZGt0Zi5UZXJyYWZvcm1TdGFjayhhcHAsIFwiVGVzdFN0YWNrXCIpO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb25zdHJ1Y3RvciBhbmQgQmFzaWMgUHJvcGVydGllc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGRlc2NyaWJlKFwiQ29uc3RydWN0b3IgYW5kIEJhc2ljIFByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBhIE5ldHdvcmsgV2F0Y2hlciB3aXRoIG1pbmltYWwgY29uZmlndXJhdGlvblwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogTmV0d29ya1dhdGNoZXJQcm9wcyA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LW5ldHdvcmstd2F0Y2hlclwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJUZXN0TmV0d29ya1dhdGNoZXJcIixcbiAgICAgICAgcHJvcHMsXG4gICAgICApO1xuXG4gICAgICBleHBlY3QobmV0d29ya1dhdGNoZXIpLnRvQmVJbnN0YW5jZU9mKE5ldHdvcmtXYXRjaGVyKTtcbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5wcm9wcykudG9CZShwcm9wcyk7XG4gICAgICBleHBlY3QobmV0d29ya1dhdGNoZXIucHJvcHMubmFtZSkudG9CZShcInRlc3QtbmV0d29yay13YXRjaGVyXCIpO1xuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyLnByb3BzLmxvY2F0aW9uKS50b0JlKFwiZWFzdHVzXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgTmV0d29yayBXYXRjaGVyIHdpdGggdGFnc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogTmV0d29ya1dhdGNoZXJQcm9wcyA9IHtcbiAgICAgICAgbmFtZTogXCJ0YWdnZWQtbmV0d29yay13YXRjaGVyXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcIndlc3R1czJcIixcbiAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIGVudmlyb25tZW50OiBcInByb2R1Y3Rpb25cIixcbiAgICAgICAgICB0ZWFtOiBcIm5ldHdvcmtpbmdcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJUYWdnZWROZXR3b3JrV2F0Y2hlclwiLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5wcm9wcy50YWdzKS50b0VxdWFsKHtcbiAgICAgICAgZW52aXJvbm1lbnQ6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICB0ZWFtOiBcIm5ldHdvcmtpbmdcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgTmV0d29yayBXYXRjaGVyIHdpdGggY29udmVudGlvbmFsIG5hbWluZ1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogTmV0d29ya1dhdGNoZXJQcm9wcyA9IHtcbiAgICAgICAgbmFtZTogXCJOZXR3b3JrV2F0Y2hlcl9lYXN0dXNcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZDpcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL05ldHdvcmtXYXRjaGVyUkdcIixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJDb252ZW50aW9uYWxOZXR3b3JrV2F0Y2hlclwiLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5wcm9wcy5uYW1lKS50b0JlKFwiTmV0d29ya1dhdGNoZXJfZWFzdHVzXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWZXJzaW9uIFJlc29sdXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBkZXNjcmliZShcIlZlcnNpb24gUmVzb2x1dGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgdXNlIGxhdGVzdCB2ZXJzaW9uIDIwMjQtMDEtMDEgd2hlbiBubyB2ZXJzaW9uIHNwZWNpZmllZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXR3b3JrV2F0Y2hlciA9IG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJEZWZhdWx0VmVyc2lvblwiLCB7XG4gICAgICAgIG5hbWU6IFwiZGVmYXVsdC12ZXJzaW9uLW53XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC1zdWIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDI0LTAxLTAxXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgdXNlIGV4cGxpY2l0IHZlcnNpb24gd2hlbiBzcGVjaWZpZWRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmV0d29ya1dhdGNoZXIgPSBuZXcgTmV0d29ya1dhdGNoZXIoc3RhY2ssIFwiUGlubmVkVmVyc2lvblwiLCB7XG4gICAgICAgIG5hbWU6IFwicGlubmVkLXZlcnNpb24tbndcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0LXN1Yi9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnXCIsXG4gICAgICAgIGFwaVZlcnNpb246IFwiMjAyMy0xMS0wMVwiLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDIzLTExLTAxXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgdXNlIGxhdGVzdCB2ZXJzaW9uIDIwMjQtMDEtMDEgd2hlbiBleHBsaWNpdGx5IHNwZWNpZmllZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXR3b3JrV2F0Y2hlciA9IG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJMYXRlc3RWZXJzaW9uXCIsIHtcbiAgICAgICAgbmFtZTogXCJsYXRlc3QtdmVyc2lvbi1ud1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgICAgYXBpVmVyc2lvbjogXCIyMDI0LTAxLTAxXCIsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyLnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjQtMDEtMDFcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByb3BlcnR5IFRyYW5zZm9ybWF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoXCJQcm9wZXJ0eSBUcmFuc2Zvcm1hdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgZ2VuZXJhdGUgY29ycmVjdCBBenVyZSBBUEkgZm9ybWF0IHZpYSBjcmVhdGVSZXNvdXJjZUJvZHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IE5ldHdvcmtXYXRjaGVyUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwidHJhbnNmb3JtLXRlc3RcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0LXN1Yi9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnXCIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuZXR3b3JrV2F0Y2hlciA9IG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJUcmFuc2Zvcm1UZXN0XCIsIHByb3BzKTtcblxuICAgICAgLy8gQWNjZXNzIHRoZSBwcm90ZWN0ZWQgY3JlYXRlUmVzb3VyY2VCb2R5IG1ldGhvZFxuICAgICAgY29uc3QgcmVzb3VyY2VCb2R5ID0gKG5ldHdvcmtXYXRjaGVyIGFzIGFueSkuY3JlYXRlUmVzb3VyY2VCb2R5KHByb3BzKTtcblxuICAgICAgZXhwZWN0KHJlc291cmNlQm9keSkudG9IYXZlUHJvcGVydHkoXCJwcm9wZXJ0aWVzXCIpO1xuICAgICAgZXhwZWN0KHJlc291cmNlQm9keS5wcm9wZXJ0aWVzKS50b0VxdWFsKHt9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhdmUgZW1wdHkgcHJvcGVydGllcyBibG9jayBmb3IgTmV0d29yayBXYXRjaGVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBOZXR3b3JrV2F0Y2hlclByb3BzID0ge1xuICAgICAgICBuYW1lOiBcImVtcHR5LXByb3BzLXRlc3RcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0LXN1Yi9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnXCIsXG4gICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICB0ZXN0OiBcInZhbHVlXCIsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuZXR3b3JrV2F0Y2hlciA9IG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJFbXB0eVByb3BzVGVzdFwiLCBwcm9wcyk7XG4gICAgICBjb25zdCByZXNvdXJjZUJvZHkgPSAobmV0d29ya1dhdGNoZXIgYXMgYW55KS5jcmVhdGVSZXNvdXJjZUJvZHkocHJvcHMpO1xuXG4gICAgICAvLyBOZXR3b3JrIFdhdGNoZXIgcHJvcGVydGllcyBzaG91bGQgYmUgZW1wdHkgLSB0YWdzIGFyZSBoYW5kbGVkIGF0IHJlc291cmNlIGxldmVsXG4gICAgICBleHBlY3QoT2JqZWN0LmtleXMocmVzb3VyY2VCb2R5LnByb3BlcnRpZXMpLmxlbmd0aCkudG9CZSgwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW50ZWdyYXRpb24gd2l0aCBCYXNlIENsYXNzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoXCJJbnRlZ3JhdGlvbiB3aXRoIEJhc2UgQ2xhc3NcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGluaGVyaXQgZnJvbSBBemFwaVJlc291cmNlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKHN0YWNrLCBcIkluaGVyaXRhbmNlVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwiaW5oZXJpdGFuY2UtdGVzdFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBWZXJpZnkgaXQgaGFzIEF6YXBpUmVzb3VyY2UgcHJvcGVydGllc1xuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyKS50b0hhdmVQcm9wZXJ0eShcInRlcnJhZm9ybVJlc291cmNlXCIpO1xuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyKS50b0hhdmVQcm9wZXJ0eShcInJlc29sdmVkQXBpVmVyc2lvblwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhdmUgY29ycmVjdCByZXNvdXJjZVR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmV0d29ya1dhdGNoZXIgPSBuZXcgTmV0d29ya1dhdGNoZXIoc3RhY2ssIFwiUmVzb3VyY2VUeXBlVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwicmVzb3VyY2UtdHlwZS10ZXN0XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC1zdWIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFjY2VzcyB0aGUgcHJvdGVjdGVkIHJlc291cmNlVHlwZSBtZXRob2RcbiAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IChuZXR3b3JrV2F0Y2hlciBhcyBhbnkpLnJlc291cmNlVHlwZSgpO1xuICAgICAgZXhwZWN0KHJlc291cmNlVHlwZSkudG9CZShcIk1pY3Jvc29mdC5OZXR3b3JrL25ldHdvcmtXYXRjaGVyc1wiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHJlc29sdmUgcGFyZW50IElEIGNvcnJlY3RseVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZUdyb3VwSWQgPSBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIjtcblxuICAgICAgY29uc3QgcHJvcHM6IE5ldHdvcmtXYXRjaGVyUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwicGFyZW50LWlkLXRlc3RcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKHN0YWNrLCBcIlBhcmVudElkVGVzdFwiLCBwcm9wcyk7XG5cbiAgICAgIC8vIEFjY2VzcyB0aGUgcHJvdGVjdGVkIHJlc29sdmVQYXJlbnRJZCBtZXRob2RcbiAgICAgIGNvbnN0IHBhcmVudElkID0gKG5ldHdvcmtXYXRjaGVyIGFzIGFueSkucmVzb2x2ZVBhcmVudElkKHByb3BzKTtcbiAgICAgIGV4cGVjdChwYXJlbnRJZCkudG9CZShyZXNvdXJjZUdyb3VwSWQpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgZ2VuZXJhdGUgcmVzb3VyY2Ugb3V0cHV0c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXR3b3JrV2F0Y2hlciA9IG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJPdXRwdXRzVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwib3V0cHV0cy10ZXN0XCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC1zdWIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5pZE91dHB1dCkudG9CZUluc3RhbmNlT2YoY2RrdGYuVGVycmFmb3JtT3V0cHV0KTtcbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5uYW1lT3V0cHV0KS50b0JlSW5zdGFuY2VPZihjZGt0Zi5UZXJyYWZvcm1PdXRwdXQpO1xuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyLmxvY2F0aW9uT3V0cHV0KS50b0JlSW5zdGFuY2VPZihcbiAgICAgICAgY2RrdGYuVGVycmFmb3JtT3V0cHV0LFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5wcm92aXNpb25pbmdTdGF0ZU91dHB1dCkudG9CZUluc3RhbmNlT2YoXG4gICAgICAgIGNka3RmLlRlcnJhZm9ybU91dHB1dCxcbiAgICAgICk7XG4gICAgICBleHBlY3QobmV0d29ya1dhdGNoZXIuaWQpLnRvTWF0Y2goL15cXCRcXHsuKlxcLmlkXFx9JC8pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDREsgVGVycmFmb3JtIEludGVncmF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoXCJDREsgVGVycmFmb3JtIEludGVncmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBzeW50aGVzaXplIHRvIHZhbGlkIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uXCIsICgpID0+IHtcbiAgICAgIG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJTeW50aFRlc3RcIiwge1xuICAgICAgICBuYW1lOiBcInN5bnRoLXRlc3RcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0LXN1Yi9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnXCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3Qgc3RhY2tDb25maWcgPSBKU09OLnBhcnNlKHN5bnRoZXNpemVkKTtcbiAgICAgIGV4cGVjdChzdGFja0NvbmZpZy5yZXNvdXJjZSkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBOZXR3b3JrIFdhdGNoZXJzIGluIHRoZSBzYW1lIHN0YWNrIChkaWZmZXJlbnQgcmVnaW9ucylcIiwgKCkgPT4ge1xuICAgICAgLy8gTm90ZTogSW4gcHJhY3RpY2UsIEF6dXJlIG9ubHkgYWxsb3dzIG9uZSBOZXR3b3JrIFdhdGNoZXIgcGVyIHJlZ2lvbiBwZXIgc3Vic2NyaXB0aW9uXG4gICAgICAvLyBidXQgQ0RLIGNhbiBzeW50aGVzaXplIG11bHRpcGxlIGluIHRoZSBzYW1lIHN0YWNrIGZvciBkaWZmZXJlbnQgcmVnaW9uc1xuICAgICAgY29uc3QgbncxID0gbmV3IE5ldHdvcmtXYXRjaGVyKHN0YWNrLCBcIk5ldHdvcmtXYXRjaGVyMVwiLCB7XG4gICAgICAgIG5hbWU6IFwibnctZWFzdHVzXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC1zdWIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG53MiA9IG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJOZXR3b3JrV2F0Y2hlcjJcIiwge1xuICAgICAgICBuYW1lOiBcIm53LXdlc3R1czJcIixcbiAgICAgICAgbG9jYXRpb246IFwid2VzdHVzMlwiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC1zdWIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgICBhcGlWZXJzaW9uOiBcIjIwMjMtMTEtMDFcIixcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobncxLnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjQtMDEtMDFcIik7XG4gICAgICBleHBlY3QobncyLnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjMtMTEtMDFcIik7XG4gICAgICBleHBlY3QobncxLnByb3BzLmxvY2F0aW9uKS50b0JlKFwiZWFzdHVzXCIpO1xuICAgICAgZXhwZWN0KG53Mi5wcm9wcy5sb2NhdGlvbikudG9CZShcIndlc3R1czJcIik7XG5cbiAgICAgIGNvbnN0IHN5bnRoZXNpemVkID0gVGVzdGluZy5zeW50aChzdGFjayk7XG4gICAgICBleHBlY3Qoc3ludGhlc2l6ZWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExvY2F0aW9uIFJlcXVpcmVtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoXCJMb2NhdGlvbiBSZXF1aXJlbWVudFwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgcmVxdWlyZSBsb2NhdGlvbiBmb3IgTmV0d29yayBXYXRjaGVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKHN0YWNrLCBcIkxvY2F0aW9uVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwibG9jYXRpb24tdGVzdFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJjZW50cmFsdXNcIixcbiAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBY2Nlc3MgdGhlIHByb3RlY3RlZCByZXF1aXJlc0xvY2F0aW9uIG1ldGhvZFxuICAgICAgY29uc3QgcmVxdWlyZXNMb2NhdGlvbiA9IChuZXR3b3JrV2F0Y2hlciBhcyBhbnkpLnJlcXVpcmVzTG9jYXRpb24oKTtcbiAgICAgIGV4cGVjdChyZXF1aXJlc0xvY2F0aW9uKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgYWNjZXB0IHZhcmlvdXMgQXp1cmUgcmVnaW9uc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWdpb25zID0gW1xuICAgICAgICBcImVhc3R1c1wiLFxuICAgICAgICBcIndlc3R1czJcIixcbiAgICAgICAgXCJub3J0aGV1cm9wZVwiLFxuICAgICAgICBcInNvdXRoZWFzdGFzaWFcIixcbiAgICAgICAgXCJicmF6aWxzb3V0aFwiLFxuICAgICAgXTtcblxuICAgICAgcmVnaW9ucy5mb3JFYWNoKChyZWdpb24sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BzOiBOZXR3b3JrV2F0Y2hlclByb3BzID0ge1xuICAgICAgICAgIG5hbWU6IGBudy0ke3JlZ2lvbn1gLFxuICAgICAgICAgIGxvY2F0aW9uOiByZWdpb24sXG4gICAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgICAgfTtcblxuICAgICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICAgIG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgYFJlZ2lvblRlc3Qke2luZGV4fWAsIHByb3BzKTtcbiAgICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOYW1pbmcgQ29udmVudGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBkZXNjcmliZShcIk5hbWluZyBDb252ZW50aW9uc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgYWNjZXB0IEF6dXJlIGRlZmF1bHQgTmV0d29yayBXYXRjaGVyIG5hbWluZyBjb252ZW50aW9uXCIsICgpID0+IHtcbiAgICAgIC8vIEF6dXJlIHR5cGljYWxseSBjcmVhdGVzIE5ldHdvcmsgV2F0Y2hlcnMgd2l0aCBuYW1lcyBsaWtlIFwiTmV0d29ya1dhdGNoZXJfPHJlZ2lvbj5cIlxuICAgICAgY29uc3QgcHJvcHM6IE5ldHdvcmtXYXRjaGVyUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwiTmV0d29ya1dhdGNoZXJfZWFzdHVzXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6XG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy90ZXN0LXN1Yi9yZXNvdXJjZUdyb3Vwcy9OZXR3b3JrV2F0Y2hlclJHXCIsXG4gICAgICB9O1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgTmV0d29ya1dhdGNoZXIoc3RhY2ssIFwiQXp1cmVEZWZhdWx0TmFtaW5nXCIsIHByb3BzKTtcbiAgICAgIH0pLm5vdC50b1Rocm93KCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBhY2NlcHQgY3VzdG9tIG5hbWluZyB3aXRoIGh5cGhlbnNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IE5ldHdvcmtXYXRjaGVyUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwibXktY3VzdG9tLW5ldHdvcmstd2F0Y2hlclwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgcmVzb3VyY2VHcm91cElkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qtc3ViL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBOZXR3b3JrV2F0Y2hlcihzdGFjaywgXCJDdXN0b21OYW1pbmdcIiwgcHJvcHMpO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGFjY2VwdCBuYW1pbmcgd2l0aCBwZXJpb2RzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBOZXR3b3JrV2F0Y2hlclByb3BzID0ge1xuICAgICAgICBuYW1lOiBcIm53LnByb2QuZWFzdHVzXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICByZXNvdXJjZUdyb3VwSWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC1zdWIvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgfTtcblxuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IE5ldHdvcmtXYXRjaGVyKHN0YWNrLCBcIlBlcmlvZE5hbWluZ1wiLCBwcm9wcyk7XG4gICAgICB9KS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb21wbGV0ZSBFeGFtcGxlIENvbmZpZ3VyYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBkZXNjcmliZShcIkNvbXBsZXRlIEV4YW1wbGUgQ29uZmlndXJhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGFuZGxlIGNvbXByZWhlbnNpdmUgTmV0d29yayBXYXRjaGVyIGNvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IE5ldHdvcmtXYXRjaGVyUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwiY29tcHJlaGVuc2l2ZS1uZXR3b3JrLXdhdGNoZXJcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHJlc291cmNlR3JvdXBJZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0LXN1Yi9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnXCIsXG4gICAgICAgIGFwaVZlcnNpb246IFwiMjAyNC0wMS0wMVwiLFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgZW52aXJvbm1lbnQ6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICAgIHRlYW06IFwicGxhdGZvcm1cIixcbiAgICAgICAgICBcImNvc3QtY2VudGVyXCI6IFwibmV0d29ya2luZ1wiLFxuICAgICAgICAgIFwibWFuYWdlZC1ieVwiOiBcInRlcnJhZm9ybS1jZGtcIixcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5ldHdvcmtXYXRjaGVyID0gbmV3IE5ldHdvcmtXYXRjaGVyKFxuICAgICAgICBzdGFjayxcbiAgICAgICAgXCJDb21wcmVoZW5zaXZlQ29uZmlnXCIsXG4gICAgICAgIHByb3BzLFxuICAgICAgKTtcblxuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyLnByb3BzLm5hbWUpLnRvQmUoXCJjb21wcmVoZW5zaXZlLW5ldHdvcmstd2F0Y2hlclwiKTtcbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5wcm9wcy5sb2NhdGlvbikudG9CZShcImVhc3R1c1wiKTtcbiAgICAgIGV4cGVjdChuZXR3b3JrV2F0Y2hlci5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDI0LTAxLTAxXCIpO1xuICAgICAgZXhwZWN0KG5ldHdvcmtXYXRjaGVyLnByb3BzLnRhZ3MpLnRvRXF1YWwoe1xuICAgICAgICBlbnZpcm9ubWVudDogXCJwcm9kdWN0aW9uXCIsXG4gICAgICAgIHRlYW06IFwicGxhdGZvcm1cIixcbiAgICAgICAgXCJjb3N0LWNlbnRlclwiOiBcIm5ldHdvcmtpbmdcIixcbiAgICAgICAgXCJtYW5hZ2VkLWJ5XCI6IFwidGVycmFmb3JtLWNka1wiLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc291cmNlQm9keSA9IChuZXR3b3JrV2F0Y2hlciBhcyBhbnkpLmNyZWF0ZVJlc291cmNlQm9keShwcm9wcyk7XG4gICAgICBleHBlY3QocmVzb3VyY2VCb2R5LnByb3BlcnRpZXMpLnRvRXF1YWwoe30pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -236,7 +236,7 @@ class PolicyAssignment extends azapi_resource_1.AzapiResource {
236
236
  }
237
237
  exports.PolicyAssignment = PolicyAssignment;
238
238
  _a = JSII_RTTI_SYMBOL_1;
239
- PolicyAssignment[_a] = { fqn: "@microsoft/terraform-cdk-constructs.PolicyAssignment", version: "1.7.1" };
239
+ PolicyAssignment[_a] = { fqn: "@microsoft/terraform-cdk-constructs.PolicyAssignment", version: "1.9.0" };
240
240
  (() => {
241
241
  azapi_resource_1.AzapiResource.registerSchemas(policy_assignment_schemas_1.POLICY_ASSIGNMENT_TYPE, policy_assignment_schemas_1.ALL_POLICY_ASSIGNMENT_VERSIONS);
242
242
  })();
@@ -260,7 +260,7 @@ class PolicyDefinition extends azapi_resource_1.AzapiResource {
260
260
  }
261
261
  exports.PolicyDefinition = PolicyDefinition;
262
262
  _a = JSII_RTTI_SYMBOL_1;
263
- PolicyDefinition[_a] = { fqn: "@microsoft/terraform-cdk-constructs.PolicyDefinition", version: "1.7.1" };
263
+ PolicyDefinition[_a] = { fqn: "@microsoft/terraform-cdk-constructs.PolicyDefinition", version: "1.9.0" };
264
264
  (() => {
265
265
  azapi_resource_1.AzapiResource.registerSchemas(policy_definition_schemas_1.POLICY_DEFINITION_TYPE, policy_definition_schemas_1.ALL_POLICY_DEFINITION_VERSIONS);
266
266
  })();
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Azure Policy Set Definition (Initiative) module
3
+ *
4
+ * This module provides constructs for creating and managing Azure Policy Set Definitions
5
+ * (also known as Initiatives in Azure Portal).
6
+ *
7
+ * Policy Set Definitions allow you to group multiple policy definitions together
8
+ * and assign them as a single unit for easier governance and compliance management.
9
+ */
10
+ export * from "./lib";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Azure Policy Set Definition (Initiative) module
4
+ *
5
+ * This module provides constructs for creating and managing Azure Policy Set Definitions
6
+ * (also known as Initiatives in Azure Portal).
7
+ *
8
+ * Policy Set Definitions allow you to group multiple policy definitions together
9
+ * and assign them as a single unit for easier governance and compliance management.
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
23
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ __exportStar(require("./lib"), exports);
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXp1cmUtcG9saWN5c2V0ZGVmaW5pdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCx3Q0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF6dXJlIFBvbGljeSBTZXQgRGVmaW5pdGlvbiAoSW5pdGlhdGl2ZSkgbW9kdWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29uc3RydWN0cyBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIEF6dXJlIFBvbGljeSBTZXQgRGVmaW5pdGlvbnNcbiAqIChhbHNvIGtub3duIGFzIEluaXRpYXRpdmVzIGluIEF6dXJlIFBvcnRhbCkuXG4gKlxuICogUG9saWN5IFNldCBEZWZpbml0aW9ucyBhbGxvdyB5b3UgdG8gZ3JvdXAgbXVsdGlwbGUgcG9saWN5IGRlZmluaXRpb25zIHRvZ2V0aGVyXG4gKiBhbmQgYXNzaWduIHRoZW0gYXMgYSBzaW5nbGUgdW5pdCBmb3IgZWFzaWVyIGdvdmVybmFuY2UgYW5kIGNvbXBsaWFuY2UgbWFuYWdlbWVudC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9saWJcIjtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Azure Policy Set Definition (Initiative) construct exports
3
+ */
4
+ export * from "./policy-set-definition-schemas";
5
+ export * from "./policy-set-definition";
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * Azure Policy Set Definition (Initiative) construct exports
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./policy-set-definition-schemas"), exports);
21
+ __exportStar(require("./policy-set-definition"), exports);
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtcG9saWN5c2V0ZGVmaW5pdGlvbi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsa0VBQWdEO0FBQ2hELDBEQUF3QyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXp1cmUgUG9saWN5IFNldCBEZWZpbml0aW9uIChJbml0aWF0aXZlKSBjb25zdHJ1Y3QgZXhwb3J0c1xuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3BvbGljeS1zZXQtZGVmaW5pdGlvbi1zY2hlbWFzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wb2xpY3ktc2V0LWRlZmluaXRpb25cIjtcbiJdfQ==
@@ -0,0 +1,50 @@
1
+ /**
2
+ * API schemas for Azure Policy Set Definition (Initiative) across all supported versions
3
+ *
4
+ * This file defines the complete API schemas for Microsoft.Authorization/policySetDefinitions
5
+ * across all supported API versions. The schemas are used by the AzapiResource
6
+ * framework for validation, transformation, and version management.
7
+ *
8
+ * Policy Set Definitions (also known as Initiatives) are collections of policy definitions
9
+ * that allow you to group policies and assign them together as a single unit.
10
+ */
11
+ import { ApiSchema, VersionConfig } from "../../core-azure/lib/version-manager/interfaces/version-interfaces";
12
+ /**
13
+ * API Schema for Policy Set Definition version 2023-04-01
14
+ *
15
+ * This is the latest stable version for Policy Set Definitions.
16
+ * It includes support for:
17
+ * - Policy definition references with parameters
18
+ * - Policy definition groups for organization
19
+ * - Metadata for categorization
20
+ * - Parameter definitions for the initiative
21
+ */
22
+ export declare const POLICY_SET_DEFINITION_SCHEMA_2023_04_01: ApiSchema;
23
+ /**
24
+ * API Schema for Policy Set Definition version 2021-06-01
25
+ *
26
+ * This is a stable version for backward compatibility.
27
+ * It includes support for:
28
+ * - Policy definition references with parameters
29
+ * - Policy definition groups for organization
30
+ * - Metadata for categorization
31
+ * - Parameter definitions for the initiative
32
+ */
33
+ export declare const POLICY_SET_DEFINITION_SCHEMA_2021_06_01: ApiSchema;
34
+ /**
35
+ * Version configuration for Policy Set Definition 2023-04-01
36
+ */
37
+ export declare const POLICY_SET_DEFINITION_VERSION_2023_04_01: VersionConfig;
38
+ /**
39
+ * Version configuration for Policy Set Definition 2021-06-01
40
+ */
41
+ export declare const POLICY_SET_DEFINITION_VERSION_2021_06_01: VersionConfig;
42
+ /**
43
+ * All supported Policy Set Definition versions for registration
44
+ * Ordered with latest stable version first
45
+ */
46
+ export declare const ALL_POLICY_SET_DEFINITION_VERSIONS: VersionConfig[];
47
+ /**
48
+ * Resource type constant
49
+ */
50
+ export declare const POLICY_SET_DEFINITION_TYPE = "Microsoft.Authorization/policySetDefinitions";