@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.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 (291) hide show
  1. package/.jsii +54846 -26661
  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 +342 -0
  117. package/lib/azure-policyassignment/lib/policy-assignment.js +228 -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 +260 -0
  129. package/lib/azure-policydefinition/lib/policy-definition.js +199 -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 +596 -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 +178 -26
  266. package/lib/core-azure/lib/azapi/azapi-resource.js +328 -90
  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,36 @@ 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
+ * Resolves location using template method pattern
415
+ * Priority: props.location > parent location > default location > validation
416
+ */
417
+ protected resolveLocation(props: AzapiResourceProps): string | undefined;
418
+ /**
419
+ * Resolves the name for this resource
420
+ *
421
+ * This method centralizes name resolution logic. By default, it uses the
422
+ * provided name or falls back to the construct ID.
423
+ *
424
+ * @param props - The resource properties
425
+ * @returns The resolved resource name
426
+ */
427
+ protected resolveName(props: AzapiResourceProps): string;
335
428
  /**
336
429
  * Helper method for standard schema resolution
337
430
  *
@@ -371,18 +464,10 @@ export declare abstract class AzapiResource extends Construct {
371
464
  * @returns Detailed migration analysis results
372
465
  */
373
466
  analyzeMigrationTo(targetVersion: string): MigrationAnalysis;
374
- /**
375
- * Resolves the API version to use for this resource instance
376
- */
377
- private _resolveApiVersion;
378
467
  /**
379
468
  * Processes properties through the framework pipeline
380
469
  */
381
470
  private _processProperties;
382
- /**
383
- * Validates properties against the schema
384
- */
385
- private _validateProperties;
386
471
  /**
387
472
  * Performs migration analysis for the current version
388
473
  */
@@ -391,6 +476,23 @@ export declare abstract class AzapiResource extends Construct {
391
476
  * Creates the underlying Azure resource
392
477
  */
393
478
  private _createAzureResource;
479
+ /**
480
+ * Finds the parent AzapiResource construct if the parentId references a resource
481
+ * Returns undefined if parentId is a static string or parent not found
482
+ * @private
483
+ */
484
+ private _findParentAzapiResource;
485
+ /**
486
+ * Finds the root of the construct tree
487
+ * @private
488
+ */
489
+ private _findRoot;
490
+ /**
491
+ * Recursively searches for a parent resource by matching parentId patterns
492
+ * Enhanced to better handle Terraform interpolation syntax
493
+ * @private
494
+ */
495
+ private _findParentResource;
394
496
  /**
395
497
  * Resolves the parent resource ID for this resource.
396
498
  *
@@ -405,8 +507,12 @@ export declare abstract class AzapiResource extends Construct {
405
507
  /**
406
508
  * Determines the parent ID for the resource (internal implementation)
407
509
  *
408
- * This method provides the default parent ID resolution logic for most resources.
409
- * Child resources should override resolveParentId() instead of this method.
510
+ * This method provides the default parent ID resolution logic.
511
+ * Resource-specific logic should be implemented in the overrideable resolveParentId() method.
512
+ *
513
+ * Default behavior:
514
+ * - If resourceGroupId is provided in props, use it
515
+ * - Otherwise, default to subscription scope
410
516
  */
411
517
  private _determineParentId;
412
518
  /**
@@ -427,13 +533,16 @@ export declare abstract class AzapiResource extends Construct {
427
533
  /**
428
534
  * Creates the underlying AZAPI Terraform resource using the generated provider classes
429
535
  *
430
- * @param properties - The properties object to send to the Azure API
536
+ * @param properties - The properties object to send to the Azure API (should include location if needed)
431
537
  * @param parentId - The parent resource ID (e.g., subscription or resource group)
432
538
  * @param name - The name of the resource
433
- * @param location - The location of the resource (optional, can be in properties)
539
+ * @param location - The location of the resource (optional, only for top-level resources without location in body)
540
+ * @param parentResource - The parent resource for dependency tracking
541
+ * @param dependsOn - Explicit dependencies for this resource
542
+ * @param tags - Tags to apply to the resource (passed separately from body for proper idempotency)
434
543
  * @returns The created AZAPI resource
435
544
  */
436
- protected createAzapiResource(properties: Record<string, any>, parentId: string, name: string, location?: string): cdktf.TerraformResource;
545
+ protected createAzapiResource(properties: Record<string, any>, parentId: string, name: string, location?: string, parentResource?: AzapiResource, dependsOn?: cdktf.ITerraformDependable[], tags?: Record<string, string>): cdktf.TerraformResource;
437
546
  /**
438
547
  * Creates an AZAPI data source for reading existing resources
439
548
  *
@@ -451,6 +560,11 @@ export declare abstract class AzapiResource extends Construct {
451
560
  * Gets the full resource ID
452
561
  */
453
562
  get resourceId(): string;
563
+ /**
564
+ * Gets the underlying Terraform resource for use in dependency declarations
565
+ * This allows explicit dependency management between resources
566
+ */
567
+ get resource(): cdktf.TerraformResource;
454
568
  /**
455
569
  * Gets the resource as a Terraform output value
456
570
  */
@@ -464,6 +578,44 @@ export declare abstract class AzapiResource extends Construct {
464
578
  * @param roleDefinitionName - The name of the Azure RBAC role to be assigned
465
579
  */
466
580
  addAccess(objectId: string, roleDefinitionName: string): void;
581
+ /**
582
+ * Adds a tag to this resource. The tag will be included in the Azure resource.
583
+ *
584
+ * This method provides proper immutability by storing tags separately from props.
585
+ * Tags added via this method are combined with tags from props and included in
586
+ * the deployed Azure resource.
587
+ *
588
+ * **Important:** In CDK for Terraform, tags should ideally be set during resource
589
+ * construction via props. While this method allows adding tags after construction,
590
+ * those tags are only included if added before the Terraform configuration is
591
+ * synthesized. For best results, add all tags via props or call addTag() in the
592
+ * same scope where the resource is created.
593
+ *
594
+ * @param key - The tag key
595
+ * @param value - The tag value
596
+ */
597
+ addTag(key: string, value: string): void;
598
+ /**
599
+ * All tags on this resource (readonly view)
600
+ *
601
+ * This getter provides convenient access to all tags including those from props
602
+ * and those added dynamically via addTag(). Returns a copy to maintain immutability.
603
+ */
604
+ get tags(): {
605
+ [key: string]: string;
606
+ };
607
+ /**
608
+ * Protected method to retrieve all tags for use in createResourceBody implementations
609
+ *
610
+ * Subclasses should use this method when creating resource bodies to ensure
611
+ * all tags (from props and addTag()) are included in the Azure resource.
612
+ * Uses a non-getter name to avoid JSII conflicts with the tags property.
613
+ *
614
+ * @returns Object containing all tags
615
+ */
616
+ protected allTags(): {
617
+ [key: string]: string;
618
+ };
467
619
  }
468
620
  /**
469
621
  * Properties for AZAPI role assignment