@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.1

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 (291) hide show
  1. package/.jsii +54630 -26185
  2. package/API.md +72091 -23784
  3. package/lib/azure-actiongroup/index.d.ts +0 -10
  4. package/lib/azure-actiongroup/index.js +1 -11
  5. package/lib/azure-actiongroup/lib/action-group.d.ts +0 -10
  6. package/lib/azure-actiongroup/lib/action-group.js +6 -32
  7. package/lib/azure-actiongroup/lib/index.d.ts +1 -4
  8. package/lib/azure-actiongroup/lib/index.js +2 -5
  9. package/lib/azure-activitylogalert/index.d.ts +0 -10
  10. package/lib/azure-activitylogalert/index.js +1 -11
  11. package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +0 -10
  12. package/lib/azure-activitylogalert/lib/activity-log-alert.js +6 -32
  13. package/lib/azure-activitylogalert/lib/index.d.ts +1 -4
  14. package/lib/azure-activitylogalert/lib/index.js +2 -5
  15. package/lib/azure-aks/index.d.ts +0 -8
  16. package/lib/azure-aks/index.js +1 -11
  17. package/lib/azure-aks/lib/aks-cluster.d.ts +4 -13
  18. package/lib/azure-aks/lib/aks-cluster.js +13 -36
  19. package/lib/azure-aks/lib/index.d.ts +1 -10
  20. package/lib/azure-aks/lib/index.js +2 -21
  21. package/lib/azure-diagnosticsettings/index.d.ts +0 -6
  22. package/lib/azure-diagnosticsettings/index.js +1 -7
  23. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +0 -10
  24. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +6 -32
  25. package/lib/azure-diagnosticsettings/lib/index.d.ts +1 -7
  26. package/lib/azure-diagnosticsettings/lib/index.js +2 -8
  27. package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
  28. package/lib/azure-dnsforwardingruleset/index.js +18 -0
  29. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
  30. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
  31. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
  32. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
  33. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
  34. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
  35. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
  36. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
  37. package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
  38. package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
  39. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
  40. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
  41. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
  42. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
  43. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
  44. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
  45. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
  46. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
  47. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
  48. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
  49. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
  50. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
  51. package/lib/azure-dnsresolver/index.d.ts +1 -0
  52. package/lib/azure-dnsresolver/index.js +18 -0
  53. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
  54. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
  55. package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
  56. package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
  57. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
  58. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
  59. package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
  60. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
  61. package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
  62. package/lib/azure-dnsresolver/lib/index.js +23 -0
  63. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
  64. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
  65. package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
  66. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
  67. package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
  68. package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
  69. package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
  70. package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
  71. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
  72. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
  73. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
  74. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
  75. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
  76. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
  77. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
  78. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
  79. package/lib/azure-dnszone/index.d.ts +1 -0
  80. package/lib/azure-dnszone/index.js +18 -0
  81. package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
  82. package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
  83. package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
  84. package/lib/azure-dnszone/lib/dns-zone.js +228 -0
  85. package/lib/azure-dnszone/lib/index.d.ts +2 -0
  86. package/lib/azure-dnszone/lib/index.js +19 -0
  87. package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
  88. package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
  89. package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
  90. package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
  91. package/lib/azure-metricalert/index.d.ts +0 -10
  92. package/lib/azure-metricalert/index.js +1 -11
  93. package/lib/azure-metricalert/lib/index.d.ts +1 -4
  94. package/lib/azure-metricalert/lib/index.js +2 -5
  95. package/lib/azure-metricalert/lib/metric-alert.d.ts +0 -10
  96. package/lib/azure-metricalert/lib/metric-alert.js +6 -32
  97. package/lib/azure-networkinterface/index.d.ts +0 -3
  98. package/lib/azure-networkinterface/index.js +1 -4
  99. package/lib/azure-networkinterface/lib/index.d.ts +1 -5
  100. package/lib/azure-networkinterface/lib/index.js +2 -5
  101. package/lib/azure-networkinterface/lib/network-interface.d.ts +4 -9
  102. package/lib/azure-networkinterface/lib/network-interface.js +14 -29
  103. package/lib/azure-networkinterface/test/network-interface.integ.js +20 -6
  104. package/lib/azure-networksecuritygroup/index.d.ts +0 -5
  105. package/lib/azure-networksecuritygroup/index.js +1 -6
  106. package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -5
  107. package/lib/azure-networksecuritygroup/lib/index.js +17 -14
  108. package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +4 -13
  109. package/lib/azure-networksecuritygroup/lib/network-security-group.js +14 -36
  110. package/lib/azure-policyassignment/index.d.ts +1 -0
  111. package/lib/azure-policyassignment/index.js +18 -0
  112. package/lib/azure-policyassignment/lib/index.d.ts +2 -0
  113. package/lib/azure-policyassignment/lib/index.js +19 -0
  114. package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
  115. package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
  116. package/lib/azure-policyassignment/lib/policy-assignment.d.ts +349 -0
  117. package/lib/azure-policyassignment/lib/policy-assignment.js +237 -0
  118. package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
  119. package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
  120. package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
  121. package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
  122. package/lib/azure-policydefinition/index.d.ts +1 -0
  123. package/lib/azure-policydefinition/index.js +18 -0
  124. package/lib/azure-policydefinition/lib/index.d.ts +2 -0
  125. package/lib/azure-policydefinition/lib/index.js +19 -0
  126. package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
  127. package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
  128. package/lib/azure-policydefinition/lib/policy-definition.d.ts +281 -0
  129. package/lib/azure-policydefinition/lib/policy-definition.js +236 -0
  130. package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
  131. package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
  132. package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
  133. package/lib/azure-policydefinition/test/policy-definition.spec.js +806 -0
  134. package/lib/azure-privatednszone/index.d.ts +1 -0
  135. package/lib/azure-privatednszone/index.js +18 -0
  136. package/lib/azure-privatednszone/lib/index.d.ts +2 -0
  137. package/lib/azure-privatednszone/lib/index.js +19 -0
  138. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
  139. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
  140. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
  141. package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
  142. package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
  143. package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
  144. package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
  145. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
  146. package/lib/azure-privatednszonelink/index.d.ts +1 -0
  147. package/lib/azure-privatednszonelink/index.js +18 -0
  148. package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
  149. package/lib/azure-privatednszonelink/lib/index.js +19 -0
  150. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
  151. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
  152. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
  153. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
  154. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
  155. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
  156. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
  157. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
  158. package/lib/azure-publicipaddress/index.d.ts +0 -5
  159. package/lib/azure-publicipaddress/index.js +1 -6
  160. package/lib/azure-publicipaddress/lib/index.d.ts +2 -9
  161. package/lib/azure-publicipaddress/lib/index.js +17 -17
  162. package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +4 -13
  163. package/lib/azure-publicipaddress/lib/public-ip-address.js +14 -36
  164. package/lib/azure-resourcegroup/index.d.ts +0 -37
  165. package/lib/azure-resourcegroup/index.js +1 -39
  166. package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
  167. package/lib/azure-resourcegroup/lib/index.js +2 -43
  168. package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
  169. package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
  170. package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
  171. package/lib/azure-roleassignment/index.d.ts +1 -0
  172. package/lib/azure-roleassignment/index.js +18 -0
  173. package/lib/azure-roleassignment/lib/index.d.ts +2 -0
  174. package/lib/azure-roleassignment/lib/index.js +19 -0
  175. package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
  176. package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
  177. package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
  178. package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
  179. package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
  180. package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
  181. package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
  182. package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
  183. package/lib/azure-roledefinition/index.d.ts +1 -0
  184. package/lib/azure-roledefinition/index.js +18 -0
  185. package/lib/azure-roledefinition/lib/index.d.ts +2 -0
  186. package/lib/azure-roledefinition/lib/index.js +19 -0
  187. package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
  188. package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
  189. package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
  190. package/lib/azure-roledefinition/lib/role-definition.js +192 -0
  191. package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
  192. package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
  193. package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
  194. package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
  195. package/lib/azure-storageaccount/index.d.ts +0 -19
  196. package/lib/azure-storageaccount/index.js +1 -20
  197. package/lib/azure-storageaccount/lib/index.d.ts +1 -7
  198. package/lib/azure-storageaccount/lib/index.js +2 -8
  199. package/lib/azure-storageaccount/lib/storage-account.d.ts +4 -9
  200. package/lib/azure-storageaccount/lib/storage-account.js +15 -29
  201. package/lib/azure-subnet/index.d.ts +0 -3
  202. package/lib/azure-subnet/index.js +1 -4
  203. package/lib/azure-subnet/lib/index.d.ts +1 -4
  204. package/lib/azure-subnet/lib/index.js +2 -5
  205. package/lib/azure-subnet/lib/subnet.d.ts +3 -14
  206. package/lib/azure-subnet/lib/subnet.js +28 -47
  207. package/lib/azure-subnet/test/subnet.integ.js +19 -7
  208. package/lib/azure-subnet/test/subnet.spec.js +1 -2
  209. package/lib/azure-virtualmachine/index.d.ts +0 -6
  210. package/lib/azure-virtualmachine/index.js +1 -7
  211. package/lib/azure-virtualmachine/lib/index.d.ts +1 -10
  212. package/lib/azure-virtualmachine/lib/index.js +2 -21
  213. package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +4 -13
  214. package/lib/azure-virtualmachine/lib/virtual-machine.js +15 -36
  215. package/lib/azure-virtualnetwork/index.d.ts +0 -9
  216. package/lib/azure-virtualnetwork/index.js +1 -11
  217. package/lib/azure-virtualnetwork/lib/index.d.ts +2 -9
  218. package/lib/azure-virtualnetwork/lib/index.js +17 -20
  219. package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +4 -13
  220. package/lib/azure-virtualnetwork/lib/virtual-network.js +15 -36
  221. package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
  222. package/lib/azure-virtualnetworkmanager/index.js +18 -0
  223. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
  224. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
  225. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
  226. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
  227. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
  228. package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
  229. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
  230. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
  231. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
  232. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
  233. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
  234. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
  235. package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
  236. package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
  237. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
  238. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
  239. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
  240. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
  241. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
  242. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
  243. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
  244. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
  245. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
  246. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
  247. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
  248. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
  249. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
  250. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
  251. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
  252. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
  253. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
  254. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
  255. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
  256. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
  257. package/lib/azure-vmss/index.d.ts +0 -5
  258. package/lib/azure-vmss/index.js +1 -6
  259. package/lib/azure-vmss/lib/index.d.ts +0 -7
  260. package/lib/azure-vmss/lib/index.js +1 -21
  261. package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +5 -13
  262. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +29 -53
  263. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
  264. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
  265. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +206 -26
  266. package/lib/core-azure/lib/azapi/azapi-resource.js +379 -91
  267. package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
  268. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  269. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  270. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +5 -3
  271. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  272. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  273. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  274. package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
  275. package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
  276. package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
  277. package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
  278. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +11 -6
  279. package/lib/core-azure/lib/index.d.ts +2 -2
  280. package/lib/core-azure/lib/index.js +5 -5
  281. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  282. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  283. package/lib/index.d.ts +19 -0
  284. package/lib/index.js +21 -2
  285. package/lib/testing/index.js +2 -2
  286. package/lib/testing/lib/cleanup.d.ts +1 -0
  287. package/lib/testing/lib/cleanup.js +19 -12
  288. package/lib/testing/lib/metadata.js +19 -16
  289. package/package.json +1 -1
  290. package/scripts/cleanup-test-resources.ts +22 -4
  291. package/scripts/generate-index.js +25 -8
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for the AzapiResource tag management functionality
4
+ *
5
+ * These tests verify that the immutability pattern for tags works correctly:
6
+ * - Tags from props are stored separately from the readonly props
7
+ * - Tags added via addTag() are combined with props tags
8
+ * - The tags getter returns all tags (props + added)
9
+ * - The allTags() method used in createResourceBody includes all tags
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const cdktf_1 = require("cdktf");
13
+ const cdktf = require("cdktf");
14
+ const resource_group_1 = require("../../../azure-resourcegroup/lib/resource-group");
15
+ describe("AzapiResource - Tag Management", () => {
16
+ let app;
17
+ let stack;
18
+ beforeEach(() => {
19
+ app = cdktf_1.Testing.app();
20
+ stack = new cdktf.TerraformStack(app, "TestStack");
21
+ });
22
+ describe("Tag Immutability", () => {
23
+ it("should store tags separately from readonly props", () => {
24
+ const props = {
25
+ name: "test-rg",
26
+ location: "eastus",
27
+ tags: { initial: "value" },
28
+ };
29
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", props);
30
+ // Original props should remain unchanged
31
+ expect(props.tags).toEqual({ initial: "value" });
32
+ // Tags should be accessible via getter
33
+ expect(rg.tags).toEqual({ initial: "value" });
34
+ });
35
+ it("should not mutate props when adding tags", () => {
36
+ const props = {
37
+ name: "test-rg",
38
+ location: "eastus",
39
+ tags: { initial: "value" },
40
+ };
41
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", props);
42
+ // Add a tag
43
+ rg.addTag("added", "dynamically");
44
+ // Original props should remain unchanged
45
+ expect(props.tags).toEqual({ initial: "value" });
46
+ expect(props.tags.added).toBeUndefined();
47
+ // Tags getter should include both
48
+ expect(rg.tags).toEqual({
49
+ initial: "value",
50
+ added: "dynamically",
51
+ });
52
+ });
53
+ it("should handle tags when no initial tags are provided", () => {
54
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
55
+ name: "test-rg",
56
+ location: "eastus",
57
+ });
58
+ // Should start with empty tags
59
+ expect(rg.tags).toEqual({});
60
+ // Add tags
61
+ rg.addTag("tag1", "value1");
62
+ rg.addTag("tag2", "value2");
63
+ // Should have the added tags
64
+ expect(rg.tags).toEqual({
65
+ tag1: "value1",
66
+ tag2: "value2",
67
+ });
68
+ });
69
+ });
70
+ describe("Tag Combination", () => {
71
+ it("should combine props tags with dynamically added tags", () => {
72
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
73
+ name: "test-rg",
74
+ location: "eastus",
75
+ tags: {
76
+ environment: "test",
77
+ project: "cdktf",
78
+ },
79
+ });
80
+ // Add more tags
81
+ rg.addTag("owner", "team@example.com");
82
+ rg.addTag("cost-center", "engineering");
83
+ // All tags should be accessible
84
+ expect(rg.tags).toEqual({
85
+ environment: "test",
86
+ project: "cdktf",
87
+ owner: "team@example.com",
88
+ "cost-center": "engineering",
89
+ });
90
+ });
91
+ it("should allow overwriting tags via addTag", () => {
92
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
93
+ name: "test-rg",
94
+ location: "eastus",
95
+ tags: { environment: "dev" },
96
+ });
97
+ // Overwrite existing tag
98
+ rg.addTag("environment", "production");
99
+ // Should have the new value
100
+ expect(rg.tags.environment).toBe("production");
101
+ });
102
+ it("should return a copy from tags getter to maintain immutability", () => {
103
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
104
+ name: "test-rg",
105
+ location: "eastus",
106
+ tags: { initial: "value" },
107
+ });
108
+ // Get tags reference
109
+ const tags1 = rg.tags;
110
+ const tags2 = rg.tags;
111
+ // Should be different objects (copies)
112
+ expect(tags1).not.toBe(tags2);
113
+ // But with same content
114
+ expect(tags1).toEqual(tags2);
115
+ // Modifying the returned object should not affect the resource
116
+ tags1.modified = "externally";
117
+ expect(rg.tags.modified).toBeUndefined();
118
+ });
119
+ });
120
+ describe("Multiple Tag Operations", () => {
121
+ it("should handle multiple addTag calls", () => {
122
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
123
+ name: "test-rg",
124
+ location: "eastus",
125
+ });
126
+ // Add multiple tags
127
+ for (let i = 0; i < 10; i++) {
128
+ rg.addTag(`tag${i}`, `value${i}`);
129
+ }
130
+ // All tags should be present
131
+ const tags = rg.tags;
132
+ expect(Object.keys(tags)).toHaveLength(10);
133
+ for (let i = 0; i < 10; i++) {
134
+ expect(tags[`tag${i}`]).toBe(`value${i}`);
135
+ }
136
+ });
137
+ it("should handle special characters in tag keys and values", () => {
138
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
139
+ name: "test-rg",
140
+ location: "eastus",
141
+ });
142
+ rg.addTag("tag-with-dash", "value-with-dash");
143
+ rg.addTag("tag:with:colon", "value:with:colon");
144
+ rg.addTag("tag.with.dot", "value.with.dot");
145
+ const tags = rg.tags;
146
+ expect(tags["tag-with-dash"]).toBe("value-with-dash");
147
+ expect(tags["tag:with:colon"]).toBe("value:with:colon");
148
+ expect(tags["tag.with.dot"]).toBe("value.with.dot");
149
+ });
150
+ });
151
+ describe("Resource Body Integration", () => {
152
+ it("should include all tags in synthesized Terraform configuration when added before synthesis", () => {
153
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
154
+ name: "test-rg",
155
+ location: "eastus",
156
+ tags: { initial: "tag" },
157
+ });
158
+ // Tags are set during construction via props
159
+ // Verify they're accessible
160
+ expect(rg.tags).toEqual({ initial: "tag" });
161
+ // Synthesize the stack
162
+ const synthesized = cdktf_1.Testing.synth(stack);
163
+ const stackConfig = JSON.parse(synthesized);
164
+ // The azapi_resource should exist
165
+ expect(stackConfig.resource).toBeDefined();
166
+ expect(stackConfig.resource.azapi_resource).toBeDefined();
167
+ // Find the resource (name may vary based on construct ID generation)
168
+ const resources = Object.values(stackConfig.resource.azapi_resource);
169
+ expect(resources.length).toBeGreaterThan(0);
170
+ const resource = resources[0];
171
+ // Tags should be at the resource level, not in the body
172
+ // The createAzapiResource method extracts tags from body and places them at top level
173
+ expect(resource.tags).toEqual({
174
+ initial: "tag",
175
+ });
176
+ });
177
+ it("should make tags added via addTag accessible via tags getter", () => {
178
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
179
+ name: "test-rg",
180
+ location: "eastus",
181
+ tags: { initial: "tag" },
182
+ });
183
+ // Add tag after construction
184
+ rg.addTag("added", "later");
185
+ // Verify tags are accessible via getter
186
+ expect(rg.tags).toEqual({
187
+ initial: "tag",
188
+ added: "later",
189
+ });
190
+ });
191
+ });
192
+ describe("JSII Compliance", () => {
193
+ it("should have JSII-compliant addTag method", () => {
194
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
195
+ name: "test-rg",
196
+ location: "eastus",
197
+ });
198
+ // Should be a function
199
+ expect(typeof rg.addTag).toBe("function");
200
+ // Should work with standard parameters
201
+ expect(() => {
202
+ rg.addTag("key", "value");
203
+ }).not.toThrow();
204
+ });
205
+ it("should have JSII-compliant tags getter", () => {
206
+ const rg = new resource_group_1.ResourceGroup(stack, "TestRG", {
207
+ name: "test-rg",
208
+ location: "eastus",
209
+ tags: { test: "tag" },
210
+ });
211
+ // Should return an object
212
+ expect(typeof rg.tags).toBe("object");
213
+ // Should be serializable
214
+ expect(() => JSON.stringify(rg.tags)).not.toThrow();
215
+ });
216
+ });
217
+ });
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXphcGktcmVzb3VyY2UtdGFncy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUtYXp1cmUvbGliL2F6YXBpL2F6YXBpLXJlc291cmNlLXRhZ3Muc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7O0FBRUgsaUNBQWdDO0FBQ2hDLCtCQUErQjtBQUMvQixvRkFBZ0Y7QUFFaEYsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRTtJQUM5QyxJQUFJLEdBQWMsQ0FBQztJQUNuQixJQUFJLEtBQTJCLENBQUM7SUFFaEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEdBQUcsR0FBRyxlQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLEVBQUUsQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7WUFDMUQsTUFBTSxLQUFLLEdBQUc7Z0JBQ1osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7YUFDM0IsQ0FBQztZQUVGLE1BQU0sRUFBRSxHQUFHLElBQUksOEJBQWEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXJELHlDQUF5QztZQUN6QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRWpELHVDQUF1QztZQUN2QyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxP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QUcsRUFBRTtZQUNsRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDhCQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDNUMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDO1lBRUgsdUJBQXVCO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFMUMsdUNBQXVDO1lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxNQUFNLEVBQUUsR0FBRyxJQUFJLDhCQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDNUMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsMEJBQTBCO1lBQzFCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdEMseUJBQXlCO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlc3RzIGZvciB0aGUgQXphcGlSZXNvdXJjZSB0YWcgbWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5XG4gKlxuICogVGhlc2UgdGVzdHMgdmVyaWZ5IHRoYXQgdGhlIGltbXV0YWJpbGl0eSBwYXR0ZXJuIGZvciB0YWdzIHdvcmtzIGNvcnJlY3RseTpcbiAqIC0gVGFncyBmcm9tIHByb3BzIGFyZSBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIHRoZSByZWFkb25seSBwcm9wc1xuICogLSBUYWdzIGFkZGVkIHZpYSBhZGRUYWcoKSBhcmUgY29tYmluZWQgd2l0aCBwcm9wcyB0YWdzXG4gKiAtIFRoZSB0YWdzIGdldHRlciByZXR1cm5zIGFsbCB0YWdzIChwcm9wcyArIGFkZGVkKVxuICogLSBUaGUgYWxsVGFncygpIG1ldGhvZCB1c2VkIGluIGNyZWF0ZVJlc291cmNlQm9keSBpbmNsdWRlcyBhbGwgdGFnc1xuICovXG5cbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcm91cCB9IGZyb20gXCIuLi8uLi8uLi9henVyZS1yZXNvdXJjZWdyb3VwL2xpYi9yZXNvdXJjZS1ncm91cFwiO1xuXG5kZXNjcmliZShcIkF6YXBpUmVzb3VyY2UgLSBUYWcgTWFuYWdlbWVudFwiLCAoKSA9PiB7XG4gIGxldCBhcHA6IGNka3RmLkFwcDtcbiAgbGV0IHN0YWNrOiBjZGt0Zi5UZXJyYWZvcm1TdGFjaztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIHN0YWNrID0gbmV3IGNka3RmLlRlcnJhZm9ybVN0YWNrKGFwcCwgXCJUZXN0U3RhY2tcIik7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiVGFnIEltbXV0YWJpbGl0eVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgc3RvcmUgdGFncyBzZXBhcmF0ZWx5IGZyb20gcmVhZG9ubHkgcHJvcHNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBpbml0aWFsOiBcInZhbHVlXCIgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJnID0gbmV3IFJlc291cmNlR3JvdXAoc3RhY2ssIFwiVGVzdFJHXCIsIHByb3BzKTtcblxuICAgICAgLy8gT3JpZ2luYWwgcHJvcHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWRcbiAgICAgIGV4cGVjdChwcm9wcy50YWdzKS50b0VxdWFsKHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0pO1xuXG4gICAgICAvLyBUYWdzIHNob3VsZCBiZSBhY2Nlc3NpYmxlIHZpYSBnZXR0ZXJcbiAgICAgIGV4cGVjdChyZy50YWdzKS50b0VxdWFsKHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgbm90IG11dGF0ZSBwcm9wcyB3aGVuIGFkZGluZyB0YWdzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtcmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIHRhZ3M6IHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCBwcm9wcyk7XG5cbiAgICAgIC8vIEFkZCBhIHRhZ1xuICAgICAgcmcuYWRkVGFnKFwiYWRkZWRcIiwgXCJkeW5hbWljYWxseVwiKTtcblxuICAgICAgLy8gT3JpZ2luYWwgcHJvcHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWRcbiAgICAgIGV4cGVjdChwcm9wcy50YWdzKS50b0VxdWFsKHsgaW5pdGlhbDogXCJ2YWx1ZVwiIH0pO1xuICAgICAgZXhwZWN0KChwcm9wcy50YWdzIGFzIGFueSkuYWRkZWQpLnRvQmVVbmRlZmluZWQoKTtcblxuICAgICAgLy8gVGFncyBnZXR0ZXIgc2hvdWxkIGluY2x1ZGUgYm90aFxuICAgICAgZXhwZWN0KHJnLnRhZ3MpLnRvRXF1YWwoe1xuICAgICAgICBpbml0aWFsOiBcInZhbHVlXCIsXG4gICAgICAgIGFkZGVkOiBcImR5bmFtaWNhbGx5XCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSB0YWdzIHdoZW4gbm8gaW5pdGlhbCB0YWdzIGFyZSBwcm92aWRlZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaG91bGQgc3RhcnQgd2l0aCBlbXB0eSB0YWdzXG4gICAgICBleHBlY3QocmcudGFncykudG9FcXVhbCh7fSk7XG5cbiAgICAgIC8vIEFkZCB0YWdzXG4gICAgICByZy5hZGRUYWcoXCJ0YWcxXCIsIFwidmFsdWUxXCIpO1xuICAgICAgcmcuYWRkVGFnKFwidGFnMlwiLCBcInZhbHVlMlwiKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgdGhlIGFkZGVkIHRhZ3NcbiAgICAgIGV4cGVjdChyZy50YWdzKS50b0VxdWFsKHtcbiAgICAgICAgdGFnMTogXCJ2YWx1ZTFcIixcbiAgICAgICAgdGFnMjogXCJ2YWx1ZTJcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIlRhZyBDb21iaW5hdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY29tYmluZSBwcm9wcyB0YWdzIHdpdGggZHluYW1pY2FsbHkgYWRkZWQgdGFnc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIGVudmlyb25tZW50OiBcInRlc3RcIixcbiAgICAgICAgICBwcm9qZWN0OiBcImNka3RmXCIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIG1vcmUgdGFnc1xuICAgICAgcmcuYWRkVGFnKFwib3duZXJcIiwgXCJ0ZWFtQGV4YW1wbGUuY29tXCIpO1xuICAgICAgcmcuYWRkVGFnKFwiY29zdC1jZW50ZXJcIiwgXCJlbmdpbmVlcmluZ1wiKTtcblxuICAgICAgLy8gQWxsIHRhZ3Mgc2hvdWxkIGJlIGFjY2Vzc2libGVcbiAgICAgIGV4cGVjdChyZy50YWdzKS50b0VxdWFsKHtcbiAgICAgICAgZW52aXJvbm1lbnQ6IFwidGVzdFwiLFxuICAgICAgICBwcm9qZWN0OiBcImNka3RmXCIsXG4gICAgICAgIG93bmVyOiBcInRlYW1AZXhhbXBsZS5jb21cIixcbiAgICAgICAgXCJjb3N0LWNlbnRlclwiOiBcImVuZ2luZWVyaW5nXCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGFsbG93IG92ZXJ3cml0aW5nIHRhZ3MgdmlhIGFkZFRhZ1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBlbnZpcm9ubWVudDogXCJkZXZcIiB9LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE92ZXJ3cml0ZSBleGlzdGluZyB0YWdcbiAgICAgIHJnLmFkZFRhZyhcImVudmlyb25tZW50XCIsIFwicHJvZHVjdGlvblwiKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgdGhlIG5ldyB2YWx1ZVxuICAgICAgZXhwZWN0KHJnLnRhZ3MuZW52aXJvbm1lbnQpLnRvQmUoXCJwcm9kdWN0aW9uXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgcmV0dXJuIGEgY29weSBmcm9tIHRhZ3MgZ2V0dGVyIHRvIG1haW50YWluIGltbXV0YWJpbGl0eVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBpbml0aWFsOiBcInZhbHVlXCIgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGFncyByZWZlcmVuY2VcbiAgICAgIGNvbnN0IHRhZ3MxID0gcmcudGFncztcbiAgICAgIGNvbnN0IHRhZ3MyID0gcmcudGFncztcblxuICAgICAgLy8gU2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzIChjb3BpZXMpXG4gICAgICBleHBlY3QodGFnczEpLm5vdC50b0JlKHRhZ3MyKTtcblxuICAgICAgLy8gQnV0IHdpdGggc2FtZSBjb250ZW50XG4gICAgICBleHBlY3QodGFnczEpLnRvRXF1YWwodGFnczIpO1xuXG4gICAgICAvLyBNb2RpZnlpbmcgdGhlIHJldHVybmVkIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCB0aGUgcmVzb3VyY2VcbiAgICAgIHRhZ3MxLm1vZGlmaWVkID0gXCJleHRlcm5hbGx5XCI7XG4gICAgICBleHBlY3QocmcudGFncy5tb2RpZmllZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIk11bHRpcGxlIFRhZyBPcGVyYXRpb25zXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBoYW5kbGUgbXVsdGlwbGUgYWRkVGFnIGNhbGxzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJnID0gbmV3IFJlc291cmNlR3JvdXAoc3RhY2ssIFwiVGVzdFJHXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJnXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFkZCBtdWx0aXBsZSB0YWdzXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgcmcuYWRkVGFnKGB0YWcke2l9YCwgYHZhbHVlJHtpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBBbGwgdGFncyBzaG91bGQgYmUgcHJlc2VudFxuICAgICAgY29uc3QgdGFncyA9IHJnLnRhZ3M7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXModGFncykpLnRvSGF2ZUxlbmd0aCgxMCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgZXhwZWN0KHRhZ3NbYHRhZyR7aX1gXSkudG9CZShgdmFsdWUke2l9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRhZyBrZXlzIGFuZCB2YWx1ZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmcgPSBuZXcgUmVzb3VyY2VHcm91cChzdGFjaywgXCJUZXN0UkdcIiwge1xuICAgICAgICBuYW1lOiBcInRlc3QtcmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICB9KTtcblxuICAgICAgcmcuYWRkVGFnKFwidGFnLXdpdGgtZGFzaFwiLCBcInZhbHVlLXdpdGgtZGFzaFwiKTtcbiAgICAgIHJnLmFkZFRhZyhcInRhZzp3aXRoOmNvbG9uXCIsIFwidmFsdWU6d2l0aDpjb2xvblwiKTtcbiAgICAgIHJnLmFkZFRhZyhcInRhZy53aXRoLmRvdFwiLCBcInZhbHVlLndpdGguZG90XCIpO1xuXG4gICAgICBjb25zdCB0YWdzID0gcmcudGFncztcbiAgICAgIGV4cGVjdCh0YWdzW1widGFnLXdpdGgtZGFzaFwiXSkudG9CZShcInZhbHVlLXdpdGgtZGFzaFwiKTtcbiAgICAgIGV4cGVjdCh0YWdzW1widGFnOndpdGg6Y29sb25cIl0pLnRvQmUoXCJ2YWx1ZTp3aXRoOmNvbG9uXCIpO1xuICAgICAgZXhwZWN0KHRhZ3NbXCJ0YWcud2l0aC5kb3RcIl0pLnRvQmUoXCJ2YWx1ZS53aXRoLmRvdFwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJSZXNvdXJjZSBCb2R5IEludGVncmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBpbmNsdWRlIGFsbCB0YWdzIGluIHN5bnRoZXNpemVkIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uIHdoZW4gYWRkZWQgYmVmb3JlIHN5bnRoZXNpc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyBpbml0aWFsOiBcInRhZ1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gVGFncyBhcmUgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24gdmlhIHByb3BzXG4gICAgICAvLyBWZXJpZnkgdGhleSdyZSBhY2Nlc3NpYmxlXG4gICAgICBleHBlY3QocmcudGFncykudG9FcXVhbCh7IGluaXRpYWw6IFwidGFnXCIgfSk7XG5cbiAgICAgIC8vIFN5bnRoZXNpemUgdGhlIHN0YWNrXG4gICAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3Rpbmcuc3ludGgoc3RhY2spO1xuICAgICAgY29uc3Qgc3RhY2tDb25maWcgPSBKU09OLnBhcnNlKHN5bnRoZXNpemVkKTtcblxuICAgICAgLy8gVGhlIGF6YXBpX3Jlc291cmNlIHNob3VsZCBleGlzdFxuICAgICAgZXhwZWN0KHN0YWNrQ29uZmlnLnJlc291cmNlKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YWNrQ29uZmlnLnJlc291cmNlLmF6YXBpX3Jlc291cmNlKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgICAvLyBGaW5kIHRoZSByZXNvdXJjZSAobmFtZSBtYXkgdmFyeSBiYXNlZCBvbiBjb25zdHJ1Y3QgSUQgZ2VuZXJhdGlvbilcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC52YWx1ZXMoc3RhY2tDb25maWcucmVzb3VyY2UuYXphcGlfcmVzb3VyY2UpO1xuICAgICAgZXhwZWN0KHJlc291cmNlcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcblxuICAgICAgY29uc3QgcmVzb3VyY2U6IGFueSA9IHJlc291cmNlc1swXTtcblxuICAgICAgLy8gVGFncyBzaG91bGQgYmUgYXQgdGhlIHJlc291cmNlIGxldmVsLCBub3QgaW4gdGhlIGJvZHlcbiAgICAgIC8vIFRoZSBjcmVhdGVBemFwaVJlc291cmNlIG1ldGhvZCBleHRyYWN0cyB0YWdzIGZyb20gYm9keSBhbmQgcGxhY2VzIHRoZW0gYXQgdG9wIGxldmVsXG4gICAgICBleHBlY3QocmVzb3VyY2UudGFncykudG9FcXVhbCh7XG4gICAgICAgIGluaXRpYWw6IFwidGFnXCIsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIG1ha2UgdGFncyBhZGRlZCB2aWEgYWRkVGFnIGFjY2Vzc2libGUgdmlhIHRhZ3MgZ2V0dGVyXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJnID0gbmV3IFJlc291cmNlR3JvdXAoc3RhY2ssIFwiVGVzdFJHXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJnXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICB0YWdzOiB7IGluaXRpYWw6IFwidGFnXCIgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgdGFnIGFmdGVyIGNvbnN0cnVjdGlvblxuICAgICAgcmcuYWRkVGFnKFwiYWRkZWRcIiwgXCJsYXRlclwiKTtcblxuICAgICAgLy8gVmVyaWZ5IHRhZ3MgYXJlIGFjY2Vzc2libGUgdmlhIGdldHRlclxuICAgICAgZXhwZWN0KHJnLnRhZ3MpLnRvRXF1YWwoe1xuICAgICAgICBpbml0aWFsOiBcInRhZ1wiLFxuICAgICAgICBhZGRlZDogXCJsYXRlclwiLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiSlNJSSBDb21wbGlhbmNlXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBoYXZlIEpTSUktY29tcGxpYW50IGFkZFRhZyBtZXRob2RcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmcgPSBuZXcgUmVzb3VyY2VHcm91cChzdGFjaywgXCJUZXN0UkdcIiwge1xuICAgICAgICBuYW1lOiBcInRlc3QtcmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2hvdWxkIGJlIGEgZnVuY3Rpb25cbiAgICAgIGV4cGVjdCh0eXBlb2YgcmcuYWRkVGFnKS50b0JlKFwiZnVuY3Rpb25cIik7XG5cbiAgICAgIC8vIFNob3VsZCB3b3JrIHdpdGggc3RhbmRhcmQgcGFyYW1ldGVyc1xuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgcmcuYWRkVGFnKFwia2V5XCIsIFwidmFsdWVcIik7XG4gICAgICB9KS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGF2ZSBKU0lJLWNvbXBsaWFudCB0YWdzIGdldHRlclwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByZyA9IG5ldyBSZXNvdXJjZUdyb3VwKHN0YWNrLCBcIlRlc3RSR1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yZ1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgdGFnczogeyB0ZXN0OiBcInRhZ1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gU2hvdWxkIHJldHVybiBhbiBvYmplY3RcbiAgICAgIGV4cGVjdCh0eXBlb2YgcmcudGFncykudG9CZShcIm9iamVjdFwiKTtcblxuICAgICAgLy8gU2hvdWxkIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgZXhwZWN0KCgpID0+IEpTT04uc3RyaW5naWZ5KHJnLnRhZ3MpKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -92,13 +92,36 @@ export interface MonitoringConfig {
92
92
  * Combines base resource properties with version management capabilities
93
93
  * and advanced configuration options for the unified framework.
94
94
  */
95
- export interface AzapiResourceProps {
95
+ export interface AzapiResourceProps extends cdktf.TerraformMetaArguments {
96
96
  /**
97
97
  * The name of the resource
98
98
  */
99
99
  readonly name?: string;
100
100
  /**
101
101
  * The location where the resource should be created
102
+ *
103
+ * @remarks
104
+ * Location handling varies by resource type:
105
+ * - **Top-level resources**: Most require an explicit location (e.g., "eastus", "westus")
106
+ * - **Global resources**: Some use "global" as location (e.g., Private DNS Zones)
107
+ * - **Child resources**: Inherit location from parent and should NOT set this property
108
+ *
109
+ * Each resource type may provide its own default through the `resolveLocation()` method.
110
+ * If no location is specified and no default exists, resource creation may fail.
111
+ *
112
+ * @example
113
+ * // Explicit location for most resources
114
+ * location: "eastus"
115
+ *
116
+ * @example
117
+ * // Global resource (Private DNS Zone)
118
+ * location: "global"
119
+ *
120
+ * @example
121
+ * // Child resource (Subnet) - do not set location
122
+ * // location: undefined (inherited from parent Virtual Network)
123
+ *
124
+ * @defaultValue Varies by resource type - see specific resource documentation
102
125
  */
103
126
  readonly location?: string;
104
127
  /**
@@ -214,15 +237,35 @@ export interface AzapiResourceProps {
214
237
  * @stability stable
215
238
  */
216
239
  export declare abstract class AzapiResource extends Construct {
240
+ /**
241
+ * Static helper for child classes to register their schemas in static initializers
242
+ *
243
+ * This method should be called in a static initializer block of each child class
244
+ * to register all supported API versions and their schemas with the ApiVersionManager.
245
+ * The static block runs once when the class is first loaded, ensuring schemas are
246
+ * registered before any instances are created.
247
+ *
248
+ * @param resourceType - The Azure resource type (e.g., "Microsoft.Network/virtualNetworks")
249
+ * @param versions - Array of version configurations containing schemas
250
+ *
251
+ * @example
252
+ * static {
253
+ * AzapiResource.registerSchemas(
254
+ * "Microsoft.Network/virtualNetworks",
255
+ * ALL_VIRTUAL_NETWORK_VERSIONS
256
+ * );
257
+ * }
258
+ */
259
+ protected static registerSchemas(resourceType: string, versions: VersionConfig[]): void;
217
260
  /**
218
261
  * The Azure resource type (e.g., "Microsoft.Resources/resourceGroups")
219
262
  * @internal
220
263
  */
221
- protected readonly _resourceType: string;
264
+ protected _resourceType: string;
222
265
  /**
223
266
  * The API version to use for this resource
224
267
  */
225
- protected readonly apiVersion: string;
268
+ protected apiVersion: string;
226
269
  /**
227
270
  * The underlying AZAPI Terraform resource
228
271
  */
@@ -232,13 +275,17 @@ export declare abstract class AzapiResource extends Construct {
232
275
  */
233
276
  readonly name: string;
234
277
  /**
235
- * The location of the resource
278
+ * The location of the resource (optional - not all resources have a location)
279
+ * Child resources typically inherit location from their parent
236
280
  */
237
- readonly location: string;
281
+ readonly location?: string;
238
282
  /**
239
- * The resource ID (abstract - must be implemented by subclasses)
283
+ * The Azure resource ID
284
+ *
285
+ * This property is automatically derived from the underlying Terraform resource.
286
+ * Child classes no longer need to implement this property.
240
287
  */
241
- abstract readonly id: string;
288
+ get id(): string;
242
289
  /**
243
290
  * The resolved API version being used for this resource instance
244
291
  *
@@ -246,37 +293,43 @@ export declare abstract class AzapiResource extends Construct {
246
293
  * either explicitly specified in props or automatically resolved to
247
294
  * the latest active version.
248
295
  */
249
- readonly resolvedApiVersion: string;
296
+ resolvedApiVersion: string;
250
297
  /**
251
298
  * The API schema for the resolved version
252
299
  *
253
300
  * Contains the complete schema definition including properties, validation
254
301
  * rules, and transformation mappings for the resolved API version.
255
302
  */
256
- readonly schema: ApiSchema;
303
+ schema: ApiSchema;
257
304
  /**
258
305
  * The version configuration for the resolved version
259
306
  *
260
307
  * Contains lifecycle information, breaking changes, and migration metadata
261
308
  * for the resolved API version.
262
309
  */
263
- readonly versionConfig: VersionConfig;
310
+ versionConfig: VersionConfig;
264
311
  /**
265
312
  * Validation results for the resource properties
266
313
  *
267
314
  * Available after construction if validation is enabled. Contains detailed
268
315
  * information about any validation errors or warnings.
269
316
  */
270
- readonly validationResult?: ValidationResult;
317
+ validationResult?: ValidationResult;
271
318
  /**
272
319
  * Migration analysis results
273
320
  *
274
321
  * Available after construction if migration analysis is enabled and a
275
322
  * previous version can be determined for comparison.
276
323
  */
277
- readonly migrationAnalysis?: MigrationAnalysis;
324
+ migrationAnalysis?: MigrationAnalysis;
278
325
  private readonly _apiVersionManager;
279
- private readonly _schemaMapper;
326
+ private _versionManager;
327
+ private _schemaValidator;
328
+ /**
329
+ * Internal mutable tags storage separate from input props
330
+ * Combines props.tags with dynamically added tags via addTag()
331
+ */
332
+ private _tags;
280
333
  protected readonly monitoringActionGroups: Construct[];
281
334
  protected readonly monitoringMetricAlerts: Construct[];
282
335
  protected readonly monitoringActivityLogAlerts: Construct[];
@@ -292,6 +345,16 @@ export declare abstract class AzapiResource extends Construct {
292
345
  * @param props - Configuration properties for the resource
293
346
  */
294
347
  constructor(scope: Construct, id: string, props?: AzapiResourceProps);
348
+ /**
349
+ * Protected initialization method called after the constructor completes
350
+ *
351
+ * This method is called at the end of the constructor to perform initialization
352
+ * that requires calling abstract methods. Child classes can override this method
353
+ * if they need to extend initialization logic, but they MUST call super.initialize(props).
354
+ *
355
+ * @param props - Configuration properties for the resource
356
+ */
357
+ protected initialize(props: AzapiResourceProps): void;
295
358
  /**
296
359
  * Gets the default API version to use when no explicit version is specified
297
360
  *
@@ -332,6 +395,42 @@ export declare abstract class AzapiResource extends Construct {
332
395
  * @returns The resource body object to send to Azure API
333
396
  */
334
397
  protected abstract createResourceBody(props: any): any;
398
+ /**
399
+ * Override in child classes to provide default location
400
+ * @returns Default location or undefined
401
+ */
402
+ protected defaultLocation(): string | undefined;
403
+ /**
404
+ * Override in child classes to indicate if location is required
405
+ * @returns true if location is mandatory for this resource type
406
+ */
407
+ protected requiresLocation(): boolean;
408
+ /**
409
+ * Override in child classes to specify parent resource for location inheritance
410
+ * @returns Parent resource or undefined
411
+ */
412
+ protected parentResourceForLocation(): AzapiResource | undefined;
413
+ /**
414
+ * Override in child classes to indicate if the resource type supports tags
415
+ * Some Azure resources (e.g., Policy Definitions, Policy Assignments) do not support tags
416
+ * @returns true if the resource supports tags (default), false otherwise
417
+ */
418
+ protected supportsTags(): boolean;
419
+ /**
420
+ * Resolves location using template method pattern
421
+ * Priority: props.location > parent location > default location > validation
422
+ */
423
+ protected resolveLocation(props: AzapiResourceProps): string | undefined;
424
+ /**
425
+ * Resolves the name for this resource
426
+ *
427
+ * This method centralizes name resolution logic. By default, it uses the
428
+ * provided name or falls back to the construct ID.
429
+ *
430
+ * @param props - The resource properties
431
+ * @returns The resolved resource name
432
+ */
433
+ protected resolveName(props: AzapiResourceProps): string;
335
434
  /**
336
435
  * Helper method for standard schema resolution
337
436
  *
@@ -371,18 +470,10 @@ export declare abstract class AzapiResource extends Construct {
371
470
  * @returns Detailed migration analysis results
372
471
  */
373
472
  analyzeMigrationTo(targetVersion: string): MigrationAnalysis;
374
- /**
375
- * Resolves the API version to use for this resource instance
376
- */
377
- private _resolveApiVersion;
378
473
  /**
379
474
  * Processes properties through the framework pipeline
380
475
  */
381
476
  private _processProperties;
382
- /**
383
- * Validates properties against the schema
384
- */
385
- private _validateProperties;
386
477
  /**
387
478
  * Performs migration analysis for the current version
388
479
  */
@@ -391,6 +482,23 @@ export declare abstract class AzapiResource extends Construct {
391
482
  * Creates the underlying Azure resource
392
483
  */
393
484
  private _createAzureResource;
485
+ /**
486
+ * Finds the parent AzapiResource construct if the parentId references a resource
487
+ * Returns undefined if parentId is a static string or parent not found
488
+ * @private
489
+ */
490
+ private _findParentAzapiResource;
491
+ /**
492
+ * Finds the root of the construct tree
493
+ * @private
494
+ */
495
+ private _findRoot;
496
+ /**
497
+ * Recursively searches for a parent resource by matching parentId patterns
498
+ * Enhanced to better handle Terraform interpolation syntax
499
+ * @private
500
+ */
501
+ private _findParentResource;
394
502
  /**
395
503
  * Resolves the parent resource ID for this resource.
396
504
  *
@@ -405,8 +513,12 @@ export declare abstract class AzapiResource extends Construct {
405
513
  /**
406
514
  * Determines the parent ID for the resource (internal implementation)
407
515
  *
408
- * This method provides the default parent ID resolution logic for most resources.
409
- * Child resources should override resolveParentId() instead of this method.
516
+ * This method provides the default parent ID resolution logic.
517
+ * Resource-specific logic should be implemented in the overrideable resolveParentId() method.
518
+ *
519
+ * Default behavior:
520
+ * - If resourceGroupId is provided in props, use it
521
+ * - Otherwise, default to subscription scope
410
522
  */
411
523
  private _determineParentId;
412
524
  /**
@@ -424,16 +536,40 @@ export declare abstract class AzapiResource extends Construct {
424
536
  * @param config - The monitoring configuration from props
425
537
  */
426
538
  protected createMonitoringResources(config: MonitoringConfig): Promise<void>;
539
+ /**
540
+ * Allows child classes to customize the ResourceConfig before resource creation
541
+ *
542
+ * Override this method to add resource-specific configuration like:
543
+ * - schemaValidationEnabled: false (for resources with complex nested structures)
544
+ * - ignoreMissingProperty: true (for resources with dynamic/unknown properties)
545
+ * - ignoreNullProperty: true (for resources that should skip null values)
546
+ *
547
+ * @param config - The base ResourceConfig that will be used to create the resource
548
+ * @returns The potentially modified ResourceConfig
549
+ *
550
+ * @example
551
+ * protected customizeResourceConfig(config: ResourceConfig): ResourceConfig {
552
+ * return {
553
+ * ...config,
554
+ * schemaValidationEnabled: false,
555
+ * ignoreMissingProperty: true,
556
+ * };
557
+ * }
558
+ */
559
+ protected customizeResourceConfig(config: any): any;
427
560
  /**
428
561
  * Creates the underlying AZAPI Terraform resource using the generated provider classes
429
562
  *
430
- * @param properties - The properties object to send to the Azure API
563
+ * @param properties - The properties object to send to the Azure API (should include location if needed)
431
564
  * @param parentId - The parent resource ID (e.g., subscription or resource group)
432
565
  * @param name - The name of the resource
433
- * @param location - The location of the resource (optional, can be in properties)
566
+ * @param location - The location of the resource (optional, only for top-level resources without location in body)
567
+ * @param parentResource - The parent resource for dependency tracking
568
+ * @param dependsOn - Explicit dependencies for this resource
569
+ * @param tags - Tags to apply to the resource (passed separately from body for proper idempotency)
434
570
  * @returns The created AZAPI resource
435
571
  */
436
- protected createAzapiResource(properties: Record<string, any>, parentId: string, name: string, location?: string): cdktf.TerraformResource;
572
+ protected createAzapiResource(properties: Record<string, any>, parentId: string, name: string, location?: string, parentResource?: AzapiResource, dependsOn?: cdktf.ITerraformDependable[], tags?: Record<string, string>): cdktf.TerraformResource;
437
573
  /**
438
574
  * Creates an AZAPI data source for reading existing resources
439
575
  *
@@ -451,6 +587,11 @@ export declare abstract class AzapiResource extends Construct {
451
587
  * Gets the full resource ID
452
588
  */
453
589
  get resourceId(): string;
590
+ /**
591
+ * Gets the underlying Terraform resource for use in dependency declarations
592
+ * This allows explicit dependency management between resources
593
+ */
594
+ get resource(): cdktf.TerraformResource;
454
595
  /**
455
596
  * Gets the resource as a Terraform output value
456
597
  */
@@ -464,6 +605,45 @@ export declare abstract class AzapiResource extends Construct {
464
605
  * @param roleDefinitionName - The name of the Azure RBAC role to be assigned
465
606
  */
466
607
  addAccess(objectId: string, roleDefinitionName: string): void;
608
+ /**
609
+ * Adds a tag to this resource. The tag will be included in the Azure resource.
610
+ *
611
+ * This method provides proper immutability by storing tags separately from props.
612
+ * Tags added via this method are combined with tags from props and included in
613
+ * the deployed Azure resource.
614
+ *
615
+ * **Important:** In CDK for Terraform, tags should ideally be set during resource
616
+ * construction via props. While this method allows adding tags after construction,
617
+ * those tags are only included if added before the Terraform configuration is
618
+ * synthesized. For best results, add all tags via props or call addTag() in the
619
+ * same scope where the resource is created.
620
+ *
621
+ * @param key - The tag key
622
+ * @param value - The tag value
623
+ * @throws Error if the resource type does not support tags
624
+ */
625
+ addTag(key: string, value: string): void;
626
+ /**
627
+ * All tags on this resource (readonly view)
628
+ *
629
+ * This getter provides convenient access to all tags including those from props
630
+ * and those added dynamically via addTag(). Returns a copy to maintain immutability.
631
+ */
632
+ get tags(): {
633
+ [key: string]: string;
634
+ };
635
+ /**
636
+ * Protected method to retrieve all tags for use in createResourceBody implementations
637
+ *
638
+ * Subclasses should use this method when creating resource bodies to ensure
639
+ * all tags (from props and addTag()) are included in the Azure resource.
640
+ * Uses a non-getter name to avoid JSII conflicts with the tags property.
641
+ *
642
+ * @returns Object containing all tags
643
+ */
644
+ protected allTags(): {
645
+ [key: string]: string;
646
+ };
467
647
  }
468
648
  /**
469
649
  * Properties for AZAPI role assignment