@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,19 @@
1
+ /**
2
+ * Azure Public DNS Zone Records module
3
+ *
4
+ * This module exports all Public DNS Zone record types and their schemas.
5
+ *
6
+ * Supported Record Types:
7
+ * - DnsARecord (A records with IPv4 addresses)
8
+ * - DnsAaaaRecord (AAAA records with IPv6 addresses)
9
+ * - DnsCaaRecord (CAA records - PUBLIC DNS ONLY)
10
+ * - DnsCnameRecord (CNAME records)
11
+ * - DnsMxRecord (MX records)
12
+ * - DnsNsRecord (NS records - PUBLIC DNS ONLY)
13
+ * - DnsPtrRecord (PTR records)
14
+ * - DnsSoaRecord (SOA records)
15
+ * - DnsSrvRecord (SRV records)
16
+ * - DnsTxtRecord (TXT records)
17
+ */
18
+ export * from "./dns-record-schemas";
19
+ export * from "./dns-records";
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Azure Public DNS Zone Records module
4
+ *
5
+ * This module exports all Public DNS Zone record types and their schemas.
6
+ *
7
+ * Supported Record Types:
8
+ * - DnsARecord (A records with IPv4 addresses)
9
+ * - DnsAaaaRecord (AAAA records with IPv6 addresses)
10
+ * - DnsCaaRecord (CAA records - PUBLIC DNS ONLY)
11
+ * - DnsCnameRecord (CNAME records)
12
+ * - DnsMxRecord (MX records)
13
+ * - DnsNsRecord (NS records - PUBLIC DNS ONLY)
14
+ * - DnsPtrRecord (PTR records)
15
+ * - DnsSoaRecord (SOA records)
16
+ * - DnsSrvRecord (SRV records)
17
+ * - DnsTxtRecord (TXT records)
18
+ */
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
31
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ // Export schemas
35
+ __exportStar(require("./dns-record-schemas"), exports);
36
+ // Export record implementations
37
+ __exportStar(require("./dns-records"), exports);
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXp1cmUtZG5zem9uZS9saWIvcmVjb3Jkcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxpQkFBaUI7QUFDakIsdURBQXFDO0FBRXJDLGdDQUFnQztBQUNoQyxnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF6dXJlIFB1YmxpYyBETlMgWm9uZSBSZWNvcmRzIG1vZHVsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgYWxsIFB1YmxpYyBETlMgWm9uZSByZWNvcmQgdHlwZXMgYW5kIHRoZWlyIHNjaGVtYXMuXG4gKlxuICogU3VwcG9ydGVkIFJlY29yZCBUeXBlczpcbiAqIC0gRG5zQVJlY29yZCAoQSByZWNvcmRzIHdpdGggSVB2NCBhZGRyZXNzZXMpXG4gKiAtIERuc0FhYWFSZWNvcmQgKEFBQUEgcmVjb3JkcyB3aXRoIElQdjYgYWRkcmVzc2VzKVxuICogLSBEbnNDYWFSZWNvcmQgKENBQSByZWNvcmRzIC0gUFVCTElDIEROUyBPTkxZKVxuICogLSBEbnNDbmFtZVJlY29yZCAoQ05BTUUgcmVjb3JkcylcbiAqIC0gRG5zTXhSZWNvcmQgKE1YIHJlY29yZHMpXG4gKiAtIERuc05zUmVjb3JkIChOUyByZWNvcmRzIC0gUFVCTElDIEROUyBPTkxZKVxuICogLSBEbnNQdHJSZWNvcmQgKFBUUiByZWNvcmRzKVxuICogLSBEbnNTb2FSZWNvcmQgKFNPQSByZWNvcmRzKVxuICogLSBEbnNTcnZSZWNvcmQgKFNSViByZWNvcmRzKVxuICogLSBEbnNUeHRSZWNvcmQgKFRYVCByZWNvcmRzKVxuICovXG5cbi8vIEV4cG9ydCBzY2hlbWFzXG5leHBvcnQgKiBmcm9tIFwiLi9kbnMtcmVjb3JkLXNjaGVtYXNcIjtcblxuLy8gRXhwb3J0IHJlY29yZCBpbXBsZW1lbnRhdGlvbnNcbmV4cG9ydCAqIGZyb20gXCIuL2Rucy1yZWNvcmRzXCI7XG4iXX0=
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Integration test for Azure Public DNS Zone Records
3
+ *
4
+ * This test demonstrates usage of all Public DNS record types
5
+ * and validates deployment, idempotency, and cleanup for child resources.
6
+ *
7
+ * Supported Record Types:
8
+ * - A record (IPv4 addresses, including alias records)
9
+ * - AAAA record (IPv6 addresses, including alias records)
10
+ * - CAA record (Certificate Authority Authorization - PUBLIC ONLY)
11
+ * - CNAME record (including alias records)
12
+ * - MX record
13
+ * - NS record (Name Server - PUBLIC ONLY)
14
+ * - PTR record
15
+ * - SRV record
16
+ * - TXT record
17
+ * - (SOA is managed by Azure automatically)
18
+ *
19
+ * Run with: npm run integration:nostream
20
+ */
21
+ import "cdktf/lib/testing/adapters/jest";
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ /**
3
+ * Integration test for Azure Public DNS Zone Records
4
+ *
5
+ * This test demonstrates usage of all Public DNS record types
6
+ * and validates deployment, idempotency, and cleanup for child resources.
7
+ *
8
+ * Supported Record Types:
9
+ * - A record (IPv4 addresses, including alias records)
10
+ * - AAAA record (IPv6 addresses, including alias records)
11
+ * - CAA record (Certificate Authority Authorization - PUBLIC ONLY)
12
+ * - CNAME record (including alias records)
13
+ * - MX record
14
+ * - NS record (Name Server - PUBLIC ONLY)
15
+ * - PTR record
16
+ * - SRV record
17
+ * - TXT record
18
+ * - (SOA is managed by Azure automatically)
19
+ *
20
+ * Run with: npm run integration:nostream
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const cdktf_1 = require("cdktf");
24
+ require("cdktf/lib/testing/adapters/jest");
25
+ const resource_group_1 = require("../../azure-resourcegroup/lib/resource-group");
26
+ const provider_1 = require("../../core-azure/lib/azapi/providers-azapi/provider");
27
+ const testing_1 = require("../../testing");
28
+ const metadata_1 = require("../../testing/lib/metadata");
29
+ const dns_zone_1 = require("../lib/dns-zone");
30
+ const records_1 = require("../lib/records");
31
+ // Generate unique test run metadata for this test suite
32
+ const testMetadata = new metadata_1.TestRunMetadata("dnsrec-integration", {
33
+ maxAgeHours: 4,
34
+ });
35
+ /**
36
+ * Example stack demonstrating Public DNS Records usage
37
+ *
38
+ * Creates a Public DNS Zone and various record types within it.
39
+ */
40
+ class DnsRecordsExampleStack extends testing_1.BaseTestStack {
41
+ constructor(scope, id) {
42
+ super(scope, id, {
43
+ testRunOptions: {
44
+ maxAgeHours: testMetadata.maxAgeHours,
45
+ autoCleanup: testMetadata.autoCleanup,
46
+ cleanupPolicy: testMetadata.cleanupPolicy,
47
+ },
48
+ });
49
+ // Configure AZAPI provider
50
+ new provider_1.AzapiProvider(this, "azapi", {});
51
+ // Generate unique names
52
+ const resourceGroupName = this.generateResourceName("Microsoft.Resources/resourceGroups", "dnsrec");
53
+ // Create resource group for the DNS zone and records
54
+ const resourceGroup = new resource_group_1.ResourceGroup(this, "test-rg", {
55
+ name: resourceGroupName,
56
+ location: "eastus2",
57
+ tags: {
58
+ ...this.systemTags(),
59
+ purpose: "public-dns-records-testing",
60
+ },
61
+ });
62
+ // Create Public DNS Zone - using a unique zone name
63
+ // Note: Public DNS zones require globally unique names
64
+ const zoneName = this.generateResourceName("Microsoft.Network/dnsZones", "rec");
65
+ const zone = new dns_zone_1.DnsZone(this, "public-dns-zone", {
66
+ name: `${zoneName}.com`,
67
+ location: "global",
68
+ resourceGroupId: resourceGroup.id,
69
+ tags: {
70
+ ...this.systemTags(),
71
+ purpose: "dns-records-testing",
72
+ },
73
+ });
74
+ // =========================================================================
75
+ // A Record - Single IP
76
+ // =========================================================================
77
+ new records_1.DnsARecord(this, "a-record-single", {
78
+ name: "web",
79
+ dnsZoneId: zone.id,
80
+ ttl: 300,
81
+ records: [{ ipv4Address: "20.30.40.50" }],
82
+ metadata: {
83
+ purpose: "web-server",
84
+ },
85
+ });
86
+ // =========================================================================
87
+ // A Record - Multiple IPs (load balancing)
88
+ // =========================================================================
89
+ new records_1.DnsARecord(this, "a-record-multi", {
90
+ name: "api",
91
+ dnsZoneId: zone.id,
92
+ ttl: 300,
93
+ records: [
94
+ { ipv4Address: "20.30.40.51" },
95
+ { ipv4Address: "20.30.40.52" },
96
+ { ipv4Address: "20.30.40.53" },
97
+ ],
98
+ metadata: {
99
+ purpose: "api-servers-loadbalanced",
100
+ },
101
+ });
102
+ // =========================================================================
103
+ // AAAA Record - IPv6 addresses
104
+ // =========================================================================
105
+ new records_1.DnsAaaaRecord(this, "aaaa-record", {
106
+ name: "ipv6host",
107
+ dnsZoneId: zone.id,
108
+ ttl: 300,
109
+ records: [
110
+ { ipv6Address: "2001:db8:85a3::8a2e:370:7334" },
111
+ { ipv6Address: "2001:db8:85a3::8a2e:370:7335" },
112
+ ],
113
+ metadata: {
114
+ purpose: "ipv6-servers",
115
+ },
116
+ });
117
+ // =========================================================================
118
+ // CAA Record - Certificate Authority Authorization (PUBLIC DNS ONLY)
119
+ // Specifies which CAs are allowed to issue certificates for this domain
120
+ // =========================================================================
121
+ new records_1.DnsCaaRecord(this, "caa-record", {
122
+ name: "@",
123
+ dnsZoneId: zone.id,
124
+ ttl: 3600,
125
+ records: [
126
+ { flags: 0, tag: "issue", value: "letsencrypt.org" },
127
+ { flags: 0, tag: "issue", value: "digicert.com" },
128
+ { flags: 0, tag: "issuewild", value: "letsencrypt.org" },
129
+ { flags: 0, tag: "iodef", value: "mailto:security@example.com" },
130
+ ],
131
+ metadata: {
132
+ purpose: "certificate-authority-authorization",
133
+ },
134
+ });
135
+ // =========================================================================
136
+ // CNAME Record - Alias
137
+ // =========================================================================
138
+ new records_1.DnsCnameRecord(this, "cname-record", {
139
+ name: "www",
140
+ dnsZoneId: zone.id,
141
+ ttl: 3600,
142
+ cname: `web.${zoneName}.com`,
143
+ metadata: {
144
+ purpose: "alias-to-web",
145
+ },
146
+ });
147
+ // =========================================================================
148
+ // MX Record - Mail exchange servers
149
+ // =========================================================================
150
+ new records_1.DnsMxRecord(this, "mx-record", {
151
+ name: "@",
152
+ dnsZoneId: zone.id,
153
+ ttl: 3600,
154
+ records: [
155
+ { preference: 10, exchange: `mail1.${zoneName}.com` },
156
+ { preference: 20, exchange: `mail2.${zoneName}.com` },
157
+ { preference: 30, exchange: "mail.backup-provider.com" },
158
+ ],
159
+ metadata: {
160
+ purpose: "mail-servers",
161
+ },
162
+ });
163
+ // =========================================================================
164
+ // NS Record - Name server delegation (PUBLIC DNS ONLY)
165
+ // Used for delegating a subdomain to different name servers
166
+ // =========================================================================
167
+ new records_1.DnsNsRecord(this, "ns-record", {
168
+ name: "subdomain",
169
+ dnsZoneId: zone.id,
170
+ ttl: 3600,
171
+ records: [
172
+ { nsdname: "ns1.subdomain-provider.com" },
173
+ { nsdname: "ns2.subdomain-provider.com" },
174
+ ],
175
+ metadata: {
176
+ purpose: "subdomain-delegation",
177
+ },
178
+ });
179
+ // =========================================================================
180
+ // PTR Record - Reverse DNS
181
+ // Note: In practice, PTR records are created in reverse DNS zones
182
+ // managed by IP address providers. This demonstrates the record structure.
183
+ // =========================================================================
184
+ new records_1.DnsPtrRecord(this, "ptr-record", {
185
+ name: "ptr",
186
+ dnsZoneId: zone.id,
187
+ ttl: 3600,
188
+ records: [{ ptrdname: `server1.${zoneName}.com` }],
189
+ metadata: {
190
+ purpose: "reverse-dns-example",
191
+ },
192
+ });
193
+ // =========================================================================
194
+ // SRV Record - Service location
195
+ // Format: _service._protocol (e.g., _sip._tcp)
196
+ // =========================================================================
197
+ new records_1.DnsSrvRecord(this, "srv-record-sip", {
198
+ name: "_sip._tcp",
199
+ dnsZoneId: zone.id,
200
+ ttl: 3600,
201
+ records: [
202
+ {
203
+ priority: 10,
204
+ weight: 60,
205
+ port: 5060,
206
+ target: `sipserver1.${zoneName}.com`,
207
+ },
208
+ {
209
+ priority: 10,
210
+ weight: 40,
211
+ port: 5060,
212
+ target: `sipserver2.${zoneName}.com`,
213
+ },
214
+ ],
215
+ metadata: {
216
+ purpose: "sip-service-discovery",
217
+ },
218
+ });
219
+ // =========================================================================
220
+ // SRV Record - Microsoft 365 Autodiscover
221
+ // =========================================================================
222
+ new records_1.DnsSrvRecord(this, "srv-record-autodiscover", {
223
+ name: "_autodiscover._tcp",
224
+ dnsZoneId: zone.id,
225
+ ttl: 3600,
226
+ records: [
227
+ {
228
+ priority: 0,
229
+ weight: 1,
230
+ port: 443,
231
+ target: "autodiscover.outlook.com",
232
+ },
233
+ ],
234
+ metadata: {
235
+ purpose: "outlook-autodiscover",
236
+ },
237
+ });
238
+ // =========================================================================
239
+ // TXT Record - Root domain TXT records (SPF + Domain Verification)
240
+ // Note: In Azure DNS, all TXT records for the same name must be in a single record set.
241
+ // Each TXT record in the set can have multiple string values.
242
+ // =========================================================================
243
+ new records_1.DnsTxtRecord(this, "txt-record-root", {
244
+ name: "@",
245
+ dnsZoneId: zone.id,
246
+ ttl: 3600,
247
+ records: [
248
+ {
249
+ value: [
250
+ "v=spf1 include:spf.protection.outlook.com include:_spf.google.com ~all",
251
+ ],
252
+ },
253
+ { value: ["MS=ms12345678"] },
254
+ ],
255
+ metadata: {
256
+ purpose: "root-txt-records",
257
+ },
258
+ });
259
+ // =========================================================================
260
+ // TXT Record - DKIM record
261
+ // =========================================================================
262
+ new records_1.DnsTxtRecord(this, "txt-record-dkim", {
263
+ name: "selector1._domainkey",
264
+ dnsZoneId: zone.id,
265
+ ttl: 3600,
266
+ records: [
267
+ {
268
+ value: [
269
+ "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...",
270
+ ],
271
+ },
272
+ ],
273
+ metadata: {
274
+ purpose: "dkim-record",
275
+ },
276
+ });
277
+ // =========================================================================
278
+ // TXT Record - DMARC record
279
+ // =========================================================================
280
+ new records_1.DnsTxtRecord(this, "txt-record-dmarc", {
281
+ name: "_dmarc",
282
+ dnsZoneId: zone.id,
283
+ ttl: 3600,
284
+ records: [
285
+ {
286
+ value: [
287
+ "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; pct=100",
288
+ ],
289
+ },
290
+ ],
291
+ metadata: {
292
+ purpose: "dmarc-policy",
293
+ },
294
+ });
295
+ // =========================================================================
296
+ // Additional A Record - subdomain
297
+ // =========================================================================
298
+ new records_1.DnsARecord(this, "a-record-subdomain", {
299
+ name: "blog",
300
+ dnsZoneId: zone.id,
301
+ ttl: 300,
302
+ records: [{ ipv4Address: "20.30.40.100" }],
303
+ metadata: {
304
+ purpose: "blog-server",
305
+ },
306
+ });
307
+ }
308
+ }
309
+ describe("DnsRecords Integration Test", () => {
310
+ it("should deploy, validate idempotency, and cleanup resources", () => {
311
+ const app = cdktf_1.Testing.app();
312
+ const stack = new DnsRecordsExampleStack(app, "test-dnsrecords");
313
+ const synthesized = cdktf_1.Testing.fullSynth(stack);
314
+ // This will:
315
+ // 1. Run terraform apply to deploy resources (including parent-child relationships)
316
+ // 2. Run terraform plan to check idempotency (no changes expected)
317
+ // 3. Run terraform destroy to cleanup resources (child resources cleanup before parent)
318
+ (0, testing_1.TerraformApplyCheckAndDestroy)(synthesized, { verifyCleanup: true });
319
+ }, 600000); // 10 minute timeout for deployment and cleanup
320
+ });
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zLXJlY29yZHMuaW50ZWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtZG5zem9uZS90ZXN0L2Rucy1yZWNvcmRzLmludGVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7QUFFSCxpQ0FBZ0M7QUFFaEMsMkNBQXlDO0FBQ3pDLGlGQUE2RTtBQUM3RSxrRkFBb0Y7QUFDcEYsMkNBQTZFO0FBQzdFLHlEQUE2RDtBQUM3RCw4Q0FBMEM7QUFDMUMsNENBVXdCO0FBRXhCLHdEQUF3RDtBQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLDBCQUFlLENBQUMsb0JBQW9CLEVBQUU7SUFDN0QsV0FBVyxFQUFFLENBQUM7Q0FDZixDQUFDLENBQUM7QUFFSDs7OztHQUlHO0FBQ0gsTUFBTSxzQkFBdUIsU0FBUSx1QkFBYTtJQUNoRCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLGNBQWMsRUFBRTtnQkFDZCxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVc7Z0JBQ3JDLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztnQkFDckMsYUFBYSxFQUFFLFlBQVksQ0FBQyxhQUFhO2FBQzFDO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksd0JBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLHdCQUF3QjtRQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FDakQsb0NBQW9DLEVBQ3BDLFFBQVEsQ0FDVCxDQUFDO1FBRUYscURBQXFEO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUksOEJBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3ZELElBQUksRUFBRSxpQkFBaUI7WUFDdkIsUUFBUSxFQUFFLFNBQVM7WUFDbkIsSUFBSSxFQUFF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QUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLCtDQUErQztBQUM3RCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZWdyYXRpb24gdGVzdCBmb3IgQXp1cmUgUHVibGljIEROUyBab25lIFJlY29yZHNcbiAqXG4gKiBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIHVzYWdlIG9mIGFsbCBQdWJsaWMgRE5TIHJlY29yZCB0eXBlc1xuICogYW5kIHZhbGlkYXRlcyBkZXBsb3ltZW50LCBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXAgZm9yIGNoaWxkIHJlc291cmNlcy5cbiAqXG4gKiBTdXBwb3J0ZWQgUmVjb3JkIFR5cGVzOlxuICogLSBBIHJlY29yZCAoSVB2NCBhZGRyZXNzZXMsIGluY2x1ZGluZyBhbGlhcyByZWNvcmRzKVxuICogLSBBQUFBIHJlY29yZCAoSVB2NiBhZGRyZXNzZXMsIGluY2x1ZGluZyBhbGlhcyByZWNvcmRzKVxuICogLSBDQUEgcmVjb3JkIChDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgQXV0aG9yaXphdGlvbiAtIFBVQkxJQyBPTkxZKVxuICogLSBDTkFNRSByZWNvcmQgKGluY2x1ZGluZyBhbGlhcyByZWNvcmRzKVxuICogLSBNWCByZWNvcmRcbiAqIC0gTlMgcmVjb3JkIChOYW1lIFNlcnZlciAtIFBVQkxJQyBPTkxZKVxuICogLSBQVFIgcmVjb3JkXG4gKiAtIFNSViByZWNvcmRcbiAqIC0gVFhUIHJlY29yZFxuICogLSAoU09BIGlzIG1hbmFnZWQgYnkgQXp1cmUgYXV0b21hdGljYWxseSlcbiAqXG4gKiBSdW4gd2l0aDogbnBtIHJ1biBpbnRlZ3JhdGlvbjpub3N0cmVhbVxuICovXG5cbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgXCJjZGt0Zi9saWIvdGVzdGluZy9hZGFwdGVycy9qZXN0XCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyb3VwIH0gZnJvbSBcIi4uLy4uL2F6dXJlLXJlc291cmNlZ3JvdXAvbGliL3Jlc291cmNlLWdyb3VwXCI7XG5pbXBvcnQgeyBBemFwaVByb3ZpZGVyIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL2F6YXBpL3Byb3ZpZGVycy1hemFwaS9wcm92aWRlclwiO1xuaW1wb3J0IHsgQmFzZVRlc3RTdGFjaywgVGVycmFmb3JtQXBwbHlDaGVja0FuZERlc3Ryb3kgfSBmcm9tIFwiLi4vLi4vdGVzdGluZ1wiO1xuaW1wb3J0IHsgVGVzdFJ1bk1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uL3Rlc3RpbmcvbGliL21ldGFkYXRhXCI7XG5pbXBvcnQgeyBEbnNab25lIH0gZnJvbSBcIi4uL2xpYi9kbnMtem9uZVwiO1xuaW1wb3J0IHtcbiAgRG5zQVJlY29yZCxcbiAgRG5zQWFhYVJlY29yZCxcbiAgRG5zQ2FhUmVjb3JkLFxuICBEbnNDbmFtZVJlY29yZCxcbiAgRG5zTXhSZWNvcmQsXG4gIERuc05zUmVjb3JkLFxuICBEbnNQdHJSZWNvcmQsXG4gIERuc1NydlJlY29yZCxcbiAgRG5zVHh0UmVjb3JkLFxufSBmcm9tIFwiLi4vbGliL3JlY29yZHNcIjtcblxuLy8gR2VuZXJhdGUgdW5pcXVlIHRlc3QgcnVuIG1ldGFkYXRhIGZvciB0aGlzIHRlc3Qgc3VpdGVcbmNvbnN0IHRlc3RNZXRhZGF0YSA9IG5ldyBUZXN0UnVuTWV0YWRhdGEoXCJkbnNyZWMtaW50ZWdyYXRpb25cIiwge1xuICBtYXhBZ2VIb3VyczogNCxcbn0pO1xuXG4vKipcbiAqIEV4YW1wbGUgc3RhY2sgZGVtb25zdHJhdGluZyBQdWJsaWMgRE5TIFJlY29yZHMgdXNhZ2VcbiAqXG4gKiBDcmVhdGVzIGEgUHVibGljIEROUyBab25lIGFuZCB2YXJpb3VzIHJlY29yZCB0eXBlcyB3aXRoaW4gaXQuXG4gKi9cbmNsYXNzIERuc1JlY29yZHNFeGFtcGxlU3RhY2sgZXh0ZW5kcyBCYXNlVGVzdFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVzdFJ1bk9wdGlvbnM6IHtcbiAgICAgICAgbWF4QWdlSG91cnM6IHRlc3RNZXRhZGF0YS5tYXhBZ2VIb3VycyxcbiAgICAgICAgYXV0b0NsZWFudXA6IHRlc3RNZXRhZGF0YS5hdXRvQ2xlYW51cCxcbiAgICAgICAgY2xlYW51cFBvbGljeTogdGVzdE1ldGFkYXRhLmNsZWFudXBQb2xpY3ksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQ29uZmlndXJlIEFaQVBJIHByb3ZpZGVyXG4gICAgbmV3IEF6YXBpUHJvdmlkZXIodGhpcywgXCJhemFwaVwiLCB7fSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgbmFtZXNcbiAgICBjb25zdCByZXNvdXJjZUdyb3VwTmFtZSA9IHRoaXMuZ2VuZXJhdGVSZXNvdXJjZU5hbWUoXG4gICAgICBcIk1pY3Jvc29mdC5SZXNvdXJjZXMvcmVzb3VyY2VHcm91cHNcIixcbiAgICAgIFwiZG5zcmVjXCIsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSByZXNvdXJjZSBncm91cCBmb3IgdGhlIEROUyB6b25lIGFuZCByZWNvcmRzXG4gICAgY29uc3QgcmVzb3VyY2VHcm91cCA9IG5ldyBSZXNvdXJjZUdyb3VwKHRoaXMsIFwidGVzdC1yZ1wiLCB7XG4gICAgICBuYW1lOiByZXNvdXJjZUdyb3VwTmFtZSxcbiAgICAgIGxvY2F0aW9uOiBcImVhc3R1czJcIixcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICAgIHB1cnBvc2U6IFwicHVibGljLWRucy1yZWNvcmRzLXRlc3RpbmdcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgUHVibGljIEROUyBab25lIC0gdXNpbmcgYSB1bmlxdWUgem9uZSBuYW1lXG4gICAgLy8gTm90ZTogUHVibGljIEROUyB6b25lcyByZXF1aXJlIGdsb2JhbGx5IHVuaXF1ZSBuYW1lc1xuICAgIGNvbnN0IHpvbmVOYW1lID0gdGhpcy5nZW5lcmF0ZVJlc291cmNlTmFtZShcbiAgICAgIFwiTWljcm9zb2Z0Lk5ldHdvcmsvZG5zWm9uZXNcIixcbiAgICAgIFwicmVjXCIsXG4gICAgKTtcbiAgICBjb25zdCB6b25lID0gbmV3IERuc1pvbmUodGhpcywgXCJwdWJsaWMtZG5zLXpvbmVcIiwge1xuICAgICAgbmFtZTogYCR7em9uZU5hbWV9LmNvbWAsXG4gICAgICBsb2NhdGlvbjogXCJnbG9iYWxcIixcbiAgICAgIHJlc291cmNlR3JvdXBJZDogcmVzb3VyY2VHcm91cC5pZCxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgLi4udGhpcy5zeXN0ZW1UYWdzKCksXG4gICAgICAgIHB1cnBvc2U6IFwiZG5zLXJlY29yZHMtdGVzdGluZ1wiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBBIFJlY29yZCAtIFNpbmdsZSBJUFxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQVJlY29yZCh0aGlzLCBcImEtcmVjb3JkLXNpbmdsZVwiLCB7XG4gICAgICBuYW1lOiBcIndlYlwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzMDAsXG4gICAgICByZWNvcmRzOiBbeyBpcHY0QWRkcmVzczogXCIyMC4zMC40MC41MFwiIH1dLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJ3ZWItc2VydmVyXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEEgUmVjb3JkIC0gTXVsdGlwbGUgSVBzIChsb2FkIGJhbGFuY2luZylcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc0FSZWNvcmQodGhpcywgXCJhLXJlY29yZC1tdWx0aVwiLCB7XG4gICAgICBuYW1lOiBcImFwaVwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzMDAsXG4gICAgICByZWNvcmRzOiBbXG4gICAgICAgIHsgaXB2NEFkZHJlc3M6IFwiMjAuMzAuNDAuNTFcIiB9LFxuICAgICAgICB7IGlwdjRBZGRyZXNzOiBcIjIwLjMwLjQwLjUyXCIgfSxcbiAgICAgICAgeyBpcHY0QWRkcmVzczogXCIyMC4zMC40MC41M1wiIH0sXG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJhcGktc2VydmVycy1sb2FkYmFsYW5jZWRcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQUFBQSBSZWNvcmQgLSBJUHY2IGFkZHJlc3Nlc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQWFhYVJlY29yZCh0aGlzLCBcImFhYWEtcmVjb3JkXCIsIHtcbiAgICAgIG5hbWU6IFwiaXB2Nmhvc3RcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzAwLFxuICAgICAgcmVjb3JkczogW1xuICAgICAgICB7IGlwdjZBZGRyZXNzOiBcIjIwMDE6ZGI4Ojg1YTM6OjhhMmU6MzcwOjczMzRcIiB9LFxuICAgICAgICB7IGlwdjZBZGRyZXNzOiBcIjIwMDE6ZGI4Ojg1YTM6OjhhMmU6MzcwOjczMzVcIiB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwiaXB2Ni1zZXJ2ZXJzXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIENBQSBSZWNvcmQgLSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgQXV0aG9yaXphdGlvbiAoUFVCTElDIEROUyBPTkxZKVxuICAgIC8vIFNwZWNpZmllcyB3aGljaCBDQXMgYXJlIGFsbG93ZWQgdG8gaXNzdWUgY2VydGlmaWNhdGVzIGZvciB0aGlzIGRvbWFpblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQ2FhUmVjb3JkKHRoaXMsIFwiY2FhLXJlY29yZFwiLCB7XG4gICAgICBuYW1lOiBcIkBcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAgeyBmbGFnczogMCwgdGFnOiBcImlzc3VlXCIsIHZhbHVlOiBcImxldHNlbmNyeXB0Lm9yZ1wiIH0sXG4gICAgICAgIHsgZmxhZ3M6IDAsIHRhZzogXCJpc3N1ZVwiLCB2YWx1ZTogXCJkaWdpY2VydC5jb21cIiB9LFxuICAgICAgICB7IGZsYWdzOiAwLCB0YWc6IFwiaXNzdWV3aWxkXCIsIHZhbHVlOiBcImxldHNlbmNyeXB0Lm9yZ1wiIH0sXG4gICAgICAgIHsgZmxhZ3M6IDAsIHRhZzogXCJpb2RlZlwiLCB2YWx1ZTogXCJtYWlsdG86c2VjdXJpdHlAZXhhbXBsZS5jb21cIiB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwiY2VydGlmaWNhdGUtYXV0aG9yaXR5LWF1dGhvcml6YXRpb25cIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQ05BTUUgUmVjb3JkIC0gQWxpYXNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc0NuYW1lUmVjb3JkKHRoaXMsIFwiY25hbWUtcmVjb3JkXCIsIHtcbiAgICAgIG5hbWU6IFwid3d3XCIsXG4gICAgICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gICAgICB0dGw6IDM2MDAsXG4gICAgICBjbmFtZTogYHdlYi4ke3pvbmVOYW1lfS5jb21gLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJhbGlhcy10by13ZWJcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTVggUmVjb3JkIC0gTWFpbCBleGNoYW5nZSBzZXJ2ZXJzXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIG5ldyBEbnNNeFJlY29yZCh0aGlzLCBcIm14LXJlY29yZFwiLCB7XG4gICAgICBuYW1lOiBcIkBcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAgeyBwcmVmZXJlbmNlOiAxMCwgZXhjaGFuZ2U6IGBtYWlsMS4ke3pvbmVOYW1lfS5jb21gIH0sXG4gICAgICAgIHsgcHJlZmVyZW5jZTogMjAsIGV4Y2hhbmdlOiBgbWFpbDIuJHt6b25lTmFtZX0uY29tYCB9LFxuICAgICAgICB7IHByZWZlcmVuY2U6IDMwLCBleGNoYW5nZTogXCJtYWlsLmJhY2t1cC1wcm92aWRlci5jb21cIiB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwibWFpbC1zZXJ2ZXJzXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5TIFJlY29yZCAtIE5hbWUgc2VydmVyIGRlbGVnYXRpb24gKFBVQkxJQyBETlMgT05MWSlcbiAgICAvLyBVc2VkIGZvciBkZWxlZ2F0aW5nIGEgc3ViZG9tYWluIHRvIGRpZmZlcmVudCBuYW1lIHNlcnZlcnNcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc05zUmVjb3JkKHRoaXMsIFwibnMtcmVjb3JkXCIsIHtcbiAgICAgIG5hbWU6IFwic3ViZG9tYWluXCIsXG4gICAgICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gICAgICB0dGw6IDM2MDAsXG4gICAgICByZWNvcmRzOiBbXG4gICAgICAgIHsgbnNkbmFtZTogXCJuczEuc3ViZG9tYWluLXByb3ZpZGVyLmNvbVwiIH0sXG4gICAgICAgIHsgbnNkbmFtZTogXCJuczIuc3ViZG9tYWluLXByb3ZpZGVyLmNvbVwiIH0sXG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJzdWJkb21haW4tZGVsZWdhdGlvblwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBQVFIgUmVjb3JkIC0gUmV2ZXJzZSBETlNcbiAgICAvLyBOb3RlOiBJbiBwcmFjdGljZSwgUFRSIHJlY29yZHMgYXJlIGNyZWF0ZWQgaW4gcmV2ZXJzZSBETlMgem9uZXNcbiAgICAvLyBtYW5hZ2VkIGJ5IElQIGFkZHJlc3MgcHJvdmlkZXJzLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgcmVjb3JkIHN0cnVjdHVyZS5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc1B0clJlY29yZCh0aGlzLCBcInB0ci1yZWNvcmRcIiwge1xuICAgICAgbmFtZTogXCJwdHJcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFt7IHB0cmRuYW1lOiBgc2VydmVyMS4ke3pvbmVOYW1lfS5jb21gIH1dLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJyZXZlcnNlLWRucy1leGFtcGxlXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFNSViBSZWNvcmQgLSBTZXJ2aWNlIGxvY2F0aW9uXG4gICAgLy8gRm9ybWF0OiBfc2VydmljZS5fcHJvdG9jb2wgKGUuZy4sIF9zaXAuX3RjcClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc1NydlJlY29yZCh0aGlzLCBcInNydi1yZWNvcmQtc2lwXCIsIHtcbiAgICAgIG5hbWU6IFwiX3NpcC5fdGNwXCIsXG4gICAgICBkbnNab25lSWQ6IHpvbmUuaWQsXG4gICAgICB0dGw6IDM2MDAsXG4gICAgICByZWNvcmRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcmlvcml0eTogMTAsXG4gICAgICAgICAgd2VpZ2h0OiA2MCxcbiAgICAgICAgICBwb3J0OiA1MDYwLFxuICAgICAgICAgIHRhcmdldDogYHNpcHNlcnZlcjEuJHt6b25lTmFtZX0uY29tYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByaW9yaXR5OiAxMCxcbiAgICAgICAgICB3ZWlnaHQ6IDQwLFxuICAgICAgICAgIHBvcnQ6IDUwNjAsXG4gICAgICAgICAgdGFyZ2V0OiBgc2lwc2VydmVyMi4ke3pvbmVOYW1lfS5jb21gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwic2lwLXNlcnZpY2UtZGlzY292ZXJ5XCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFNSViBSZWNvcmQgLSBNaWNyb3NvZnQgMzY1IEF1dG9kaXNjb3ZlclxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zU3J2UmVjb3JkKHRoaXMsIFwic3J2LXJlY29yZC1hdXRvZGlzY292ZXJcIiwge1xuICAgICAgbmFtZTogXCJfYXV0b2Rpc2NvdmVyLl90Y3BcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByaW9yaXR5OiAwLFxuICAgICAgICAgIHdlaWdodDogMSxcbiAgICAgICAgICBwb3J0OiA0NDMsXG4gICAgICAgICAgdGFyZ2V0OiBcImF1dG9kaXNjb3Zlci5vdXRsb29rLmNvbVwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHB1cnBvc2U6IFwib3V0bG9vay1hdXRvZGlzY292ZXJcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVFhUIFJlY29yZCAtIFJvb3QgZG9tYWluIFRYVCByZWNvcmRzIChTUEYgKyBEb21haW4gVmVyaWZpY2F0aW9uKVxuICAgIC8vIE5vdGU6IEluIEF6dXJlIEROUywgYWxsIFRYVCByZWNvcmRzIGZvciB0aGUgc2FtZSBuYW1lIG11c3QgYmUgaW4gYSBzaW5nbGUgcmVjb3JkIHNldC5cbiAgICAvLyBFYWNoIFRYVCByZWNvcmQgaW4gdGhlIHNldCBjYW4gaGF2ZSBtdWx0aXBsZSBzdHJpbmcgdmFsdWVzLlxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zVHh0UmVjb3JkKHRoaXMsIFwidHh0LXJlY29yZC1yb290XCIsIHtcbiAgICAgIG5hbWU6IFwiQFwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzNjAwLFxuICAgICAgcmVjb3JkczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgIFwidj1zcGYxIGluY2x1ZGU6c3BmLnByb3RlY3Rpb24ub3V0bG9vay5jb20gaW5jbHVkZTpfc3BmLmdvb2dsZS5jb20gfmFsbFwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgdmFsdWU6IFtcIk1TPW1zMTIzNDU2NzhcIl0gfSxcbiAgICAgIF0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwdXJwb3NlOiBcInJvb3QtdHh0LXJlY29yZHNcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVFhUIFJlY29yZCAtIERLSU0gcmVjb3JkXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIG5ldyBEbnNUeHRSZWNvcmQodGhpcywgXCJ0eHQtcmVjb3JkLWRraW1cIiwge1xuICAgICAgbmFtZTogXCJzZWxlY3RvcjEuX2RvbWFpbmtleVwiLFxuICAgICAgZG5zWm9uZUlkOiB6b25lLmlkLFxuICAgICAgdHRsOiAzNjAwLFxuICAgICAgcmVjb3JkczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IFtcbiAgICAgICAgICAgIFwidj1ES0lNMTsgaz1yc2E7IHA9TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDLi4uXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwdXJwb3NlOiBcImRraW0tcmVjb3JkXCIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFRYVCBSZWNvcmQgLSBETUFSQyByZWNvcmRcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbmV3IERuc1R4dFJlY29yZCh0aGlzLCBcInR4dC1yZWNvcmQtZG1hcmNcIiwge1xuICAgICAgbmFtZTogXCJfZG1hcmNcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzYwMCxcbiAgICAgIHJlY29yZHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiBbXG4gICAgICAgICAgICBcInY9RE1BUkMxOyBwPXF1YXJhbnRpbmU7IHJ1YT1tYWlsdG86ZG1hcmMtcmVwb3J0c0BleGFtcGxlLmNvbTsgcGN0PTEwMFwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcHVycG9zZTogXCJkbWFyYy1wb2xpY3lcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQWRkaXRpb25hbCBBIFJlY29yZCAtIHN1YmRvbWFpblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBuZXcgRG5zQVJlY29yZCh0aGlzLCBcImEtcmVjb3JkLXN1YmRvbWFpblwiLCB7XG4gICAgICBuYW1lOiBcImJsb2dcIixcbiAgICAgIGRuc1pvbmVJZDogem9uZS5pZCxcbiAgICAgIHR0bDogMzAwLFxuICAgICAgcmVjb3JkczogW3sgaXB2NEFkZHJlc3M6IFwiMjAuMzAuNDAuMTAwXCIgfV0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwdXJwb3NlOiBcImJsb2ctc2VydmVyXCIsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbmRlc2NyaWJlKFwiRG5zUmVjb3JkcyBJbnRlZ3JhdGlvbiBUZXN0XCIsICgpID0+IHtcbiAgaXQoXCJzaG91bGQgZGVwbG95LCB2YWxpZGF0ZSBpZGVtcG90ZW5jeSwgYW5kIGNsZWFudXAgcmVzb3VyY2VzXCIsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IERuc1JlY29yZHNFeGFtcGxlU3RhY2soYXBwLCBcInRlc3QtZG5zcmVjb3Jkc1wiKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3RpbmcuZnVsbFN5bnRoKHN0YWNrKTtcblxuICAgIC8vIFRoaXMgd2lsbDpcbiAgICAvLyAxLiBSdW4gdGVycmFmb3JtIGFwcGx5IHRvIGRlcGxveSByZXNvdXJjZXMgKGluY2x1ZGluZyBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcylcbiAgICAvLyAyLiBSdW4gdGVycmFmb3JtIHBsYW4gdG8gY2hlY2sgaWRlbXBvdGVuY3kgKG5vIGNoYW5nZXMgZXhwZWN0ZWQpXG4gICAgLy8gMy4gUnVuIHRlcnJhZm9ybSBkZXN0cm95IHRvIGNsZWFudXAgcmVzb3VyY2VzIChjaGlsZCByZXNvdXJjZXMgY2xlYW51cCBiZWZvcmUgcGFyZW50KVxuICAgIFRlcnJhZm9ybUFwcGx5Q2hlY2tBbmREZXN0cm95KHN5bnRoZXNpemVkLCB7IHZlcmlmeUNsZWFudXA6IHRydWUgfSk7XG4gIH0sIDYwMDAwMCk7IC8vIDEwIG1pbnV0ZSB0aW1lb3V0IGZvciBkZXBsb3ltZW50IGFuZCBjbGVhbnVwXG59KTtcbiJdfQ==
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Unit tests for Azure Public DNS Zone Record implementations
3
+ *
4
+ * This test suite validates all 10 Public DNS record types:
5
+ * - DnsARecord
6
+ * - DnsAaaaRecord
7
+ * - DnsCaaRecord (Public DNS only)
8
+ * - DnsCnameRecord
9
+ * - DnsMxRecord
10
+ * - DnsNsRecord (Public DNS only)
11
+ * - DnsPtrRecord
12
+ * - DnsSoaRecord
13
+ * - DnsSrvRecord
14
+ * - DnsTxtRecord
15
+ *
16
+ * Tests verify basic creation, correct resource types, API versions,
17
+ * parent ID resolution, resource body structure, TTL handling,
18
+ * record-specific properties, metadata handling, and alias record support.
19
+ */
20
+ export {};