@azure/provisioning-core 1.0.0-beta.1 → 1.0.0-beta.2

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 (571) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +49 -10
  3. package/dist/browser/constructs/built-in-resources/resource-group.d.ts +7 -1
  4. package/dist/browser/constructs/built-in-resources/resource-group.d.ts.map +1 -1
  5. package/dist/browser/constructs/built-in-resources/resource-group.js +26 -6
  6. package/dist/browser/constructs/built-in-resources/resource-group.js.map +1 -1
  7. package/dist/browser/constructs/output.d.ts +1 -1
  8. package/dist/browser/constructs/output.d.ts.map +1 -1
  9. package/dist/browser/constructs/output.js.map +1 -1
  10. package/dist/browser/constructs/parameter.d.ts +1 -1
  11. package/dist/browser/constructs/parameter.d.ts.map +1 -1
  12. package/dist/browser/constructs/parameter.js.map +1 -1
  13. package/dist/browser/constructs/resource/resource-query.d.ts +3 -1
  14. package/dist/browser/constructs/resource/resource-query.d.ts.map +1 -1
  15. package/dist/browser/constructs/resource/resource-query.js +10 -0
  16. package/dist/browser/constructs/resource/resource-query.js.map +1 -1
  17. package/dist/browser/constructs/resource/resource-relationships.d.ts +9 -0
  18. package/dist/browser/constructs/resource/resource-relationships.d.ts.map +1 -0
  19. package/dist/browser/constructs/resource/resource-relationships.js +35 -0
  20. package/dist/browser/constructs/resource/resource-relationships.js.map +1 -0
  21. package/dist/browser/constructs/resource/resource.d.ts +11 -17
  22. package/dist/browser/constructs/resource/resource.d.ts.map +1 -1
  23. package/dist/browser/constructs/resource/resource.js +70 -28
  24. package/dist/browser/constructs/resource/resource.js.map +1 -1
  25. package/dist/browser/constructs/stack.d.ts +2 -16
  26. package/dist/browser/constructs/stack.d.ts.map +1 -1
  27. package/dist/browser/constructs/stack.js +1 -15
  28. package/dist/browser/constructs/stack.js.map +1 -1
  29. package/dist/browser/expression/ast-nodes.d.ts +1 -1
  30. package/dist/browser/expression/ast-nodes.d.ts.map +1 -1
  31. package/dist/browser/expression/ast-nodes.js.map +1 -1
  32. package/dist/browser/expression/expressions.d.ts +2 -9
  33. package/dist/browser/expression/expressions.d.ts.map +1 -1
  34. package/dist/browser/expression/expressions.js +2 -9
  35. package/dist/browser/expression/expressions.js.map +1 -1
  36. package/dist/browser/expression/utils.d.ts +5 -0
  37. package/dist/browser/expression/utils.d.ts.map +1 -0
  38. package/dist/browser/expression/utils.js +25 -0
  39. package/dist/browser/expression/utils.js.map +1 -0
  40. package/dist/browser/index.d.ts +4 -4
  41. package/dist/browser/index.d.ts.map +1 -1
  42. package/dist/browser/index.js.map +1 -1
  43. package/dist/browser/internal.d.ts +2 -5
  44. package/dist/browser/internal.d.ts.map +1 -1
  45. package/dist/browser/internal.js +1 -3
  46. package/dist/browser/internal.js.map +1 -1
  47. package/dist/browser/naming/name-validation.d.ts +15 -0
  48. package/dist/browser/naming/name-validation.d.ts.map +1 -0
  49. package/dist/browser/naming/name-validation.js +82 -0
  50. package/dist/browser/naming/name-validation.js.map +1 -0
  51. package/dist/browser/naming/naming-policy.d.ts +7 -7
  52. package/dist/browser/naming/naming-policy.d.ts.map +1 -1
  53. package/dist/browser/naming/naming-policy.js +166 -33
  54. package/dist/browser/naming/naming-policy.js.map +1 -1
  55. package/dist/browser/naming/naming-rules.d.ts +12 -11
  56. package/dist/browser/naming/naming-rules.d.ts.map +1 -1
  57. package/dist/browser/naming/naming-rules.js +2 -9
  58. package/dist/browser/naming/naming-rules.js.map +1 -1
  59. package/dist/browser/package.json +1 -1
  60. package/dist/{esm/serialization/json/lower.d.ts → browser/serialization/arm-object-conversion.d.ts} +11 -11
  61. package/dist/browser/serialization/arm-object-conversion.d.ts.map +1 -0
  62. package/dist/{esm/serialization/json/lower.js → browser/serialization/arm-object-conversion.js} +20 -20
  63. package/dist/browser/serialization/arm-object-conversion.js.map +1 -0
  64. package/dist/browser/serialization/ast/declaration-builder.d.ts +10 -0
  65. package/dist/browser/serialization/ast/declaration-builder.d.ts.map +1 -0
  66. package/dist/browser/serialization/ast/declaration-builder.js +265 -0
  67. package/dist/browser/serialization/ast/declaration-builder.js.map +1 -0
  68. package/dist/browser/serialization/ast/declaration-dependencies.d.ts +18 -0
  69. package/dist/browser/serialization/ast/declaration-dependencies.d.ts.map +1 -0
  70. package/dist/browser/serialization/ast/declaration-dependencies.js +96 -0
  71. package/dist/browser/serialization/ast/declaration-dependencies.js.map +1 -0
  72. package/dist/browser/serialization/ast/expression-builder.d.ts +14 -0
  73. package/dist/browser/serialization/ast/expression-builder.d.ts.map +1 -0
  74. package/dist/browser/serialization/ast/expression-builder.js +313 -0
  75. package/dist/browser/serialization/ast/expression-builder.js.map +1 -0
  76. package/dist/browser/serialization/ast/expression-restorer.d.ts +8 -0
  77. package/dist/browser/serialization/ast/expression-restorer.d.ts.map +1 -0
  78. package/dist/browser/serialization/ast/expression-restorer.js +162 -0
  79. package/dist/browser/serialization/ast/expression-restorer.js.map +1 -0
  80. package/dist/browser/serialization/ast/expression-rewriter.d.ts +29 -0
  81. package/dist/browser/serialization/ast/expression-rewriter.d.ts.map +1 -0
  82. package/dist/browser/serialization/ast/expression-rewriter.js +257 -0
  83. package/dist/browser/serialization/ast/expression-rewriter.js.map +1 -0
  84. package/dist/browser/serialization/ast/expression-walker.d.ts +16 -0
  85. package/dist/browser/serialization/ast/expression-walker.d.ts.map +1 -0
  86. package/dist/browser/serialization/ast/expression-walker.js +154 -0
  87. package/dist/browser/serialization/ast/expression-walker.js.map +1 -0
  88. package/dist/browser/serialization/ast/generated/ast.d.ts.map +1 -0
  89. package/dist/browser/serialization/ast/generated/ast.js.map +1 -0
  90. package/dist/browser/serialization/ast/index.d.ts +7 -0
  91. package/dist/browser/serialization/ast/index.d.ts.map +1 -0
  92. package/dist/browser/serialization/ast/index.js.map +1 -0
  93. package/dist/browser/serialization/ast/resource-utils.d.ts +10 -0
  94. package/dist/browser/serialization/ast/resource-utils.d.ts.map +1 -0
  95. package/dist/browser/serialization/ast/resource-utils.js +52 -0
  96. package/dist/browser/serialization/ast/resource-utils.js.map +1 -0
  97. package/dist/browser/serialization/bicep/file-layout/authored-context.d.ts +12 -0
  98. package/dist/browser/serialization/bicep/file-layout/authored-context.d.ts.map +1 -0
  99. package/dist/browser/serialization/bicep/file-layout/authored-context.js +57 -0
  100. package/dist/browser/serialization/bicep/file-layout/authored-context.js.map +1 -0
  101. package/dist/browser/serialization/bicep/file-layout/bicep-namer.d.ts +11 -0
  102. package/dist/browser/serialization/bicep/file-layout/bicep-namer.d.ts.map +1 -0
  103. package/dist/browser/serialization/bicep/file-layout/bicep-namer.js +100 -0
  104. package/dist/browser/serialization/bicep/file-layout/bicep-namer.js.map +1 -0
  105. package/dist/browser/serialization/bicep/file-layout/build-bicep-files.d.ts +7 -0
  106. package/dist/browser/serialization/bicep/file-layout/build-bicep-files.d.ts.map +1 -0
  107. package/dist/browser/serialization/bicep/file-layout/build-bicep-files.js +46 -0
  108. package/dist/browser/serialization/bicep/file-layout/build-bicep-files.js.map +1 -0
  109. package/dist/browser/serialization/bicep/file-layout/deployment-planning.d.ts +19 -0
  110. package/dist/browser/serialization/bicep/file-layout/deployment-planning.d.ts.map +1 -0
  111. package/dist/browser/serialization/bicep/file-layout/deployment-planning.js +68 -0
  112. package/dist/browser/serialization/bicep/file-layout/deployment-planning.js.map +1 -0
  113. package/dist/browser/serialization/bicep/file-layout/deployment-resource-utils.d.ts +8 -0
  114. package/dist/browser/serialization/bicep/file-layout/deployment-resource-utils.d.ts.map +1 -0
  115. package/dist/browser/serialization/bicep/file-layout/deployment-resource-utils.js +67 -0
  116. package/dist/browser/serialization/bicep/file-layout/deployment-resource-utils.js.map +1 -0
  117. package/dist/browser/serialization/bicep/file-layout/file-dependencies.d.ts +4 -0
  118. package/dist/browser/serialization/bicep/file-layout/file-dependencies.d.ts.map +1 -0
  119. package/dist/browser/serialization/bicep/file-layout/file-dependencies.js +32 -0
  120. package/dist/browser/serialization/bicep/file-layout/file-dependencies.js.map +1 -0
  121. package/dist/browser/serialization/bicep/file-layout/file-paths.d.ts +3 -0
  122. package/dist/browser/serialization/bicep/file-layout/file-paths.d.ts.map +1 -0
  123. package/dist/browser/serialization/bicep/file-layout/file-paths.js +46 -0
  124. package/dist/browser/serialization/bicep/file-layout/file-paths.js.map +1 -0
  125. package/dist/browser/serialization/bicep/file-layout/file-preparation.d.ts +34 -0
  126. package/dist/browser/serialization/bicep/file-layout/file-preparation.d.ts.map +1 -0
  127. package/dist/browser/serialization/bicep/file-layout/file-preparation.js +140 -0
  128. package/dist/browser/serialization/bicep/file-layout/file-preparation.js.map +1 -0
  129. package/dist/browser/serialization/bicep/file-layout/reference-wiring.d.ts +3 -0
  130. package/dist/browser/serialization/bicep/file-layout/reference-wiring.d.ts.map +1 -0
  131. package/dist/browser/serialization/bicep/file-layout/reference-wiring.js +225 -0
  132. package/dist/browser/serialization/bicep/file-layout/reference-wiring.js.map +1 -0
  133. package/dist/browser/serialization/bicep/index.d.ts +2 -0
  134. package/dist/browser/serialization/bicep/index.d.ts.map +1 -0
  135. package/dist/browser/serialization/bicep/index.js +4 -0
  136. package/dist/browser/serialization/bicep/index.js.map +1 -0
  137. package/dist/browser/serialization/bicep/render.d.ts +11 -0
  138. package/dist/browser/serialization/bicep/render.d.ts.map +1 -0
  139. package/dist/browser/serialization/bicep/render.js +293 -0
  140. package/dist/browser/serialization/bicep/render.js.map +1 -0
  141. package/dist/browser/serialization/{json/encoding.d.ts → encoding.d.ts} +1 -1
  142. package/dist/browser/serialization/encoding.d.ts.map +1 -0
  143. package/dist/browser/serialization/{json/encoding.js → encoding.js} +2 -12
  144. package/dist/browser/serialization/encoding.js.map +1 -0
  145. package/dist/browser/serialization/{json/util.d.ts → identifiers.d.ts} +1 -1
  146. package/dist/browser/serialization/identifiers.d.ts.map +1 -0
  147. package/dist/browser/serialization/{json/util.js → identifiers.js} +1 -1
  148. package/dist/browser/serialization/identifiers.js.map +1 -0
  149. package/dist/browser/serialization/index.d.ts +1 -1
  150. package/dist/browser/serialization/index.d.ts.map +1 -1
  151. package/dist/browser/serialization/index.js.map +1 -1
  152. package/dist/browser/serialization/json/deserialize.d.ts.map +1 -1
  153. package/dist/browser/serialization/json/deserialize.js +131 -39
  154. package/dist/browser/serialization/json/deserialize.js.map +1 -1
  155. package/dist/browser/serialization/json/serialize.d.ts +1 -1
  156. package/dist/browser/serialization/json/serialize.d.ts.map +1 -1
  157. package/dist/browser/serialization/json/serialize.js +5 -360
  158. package/dist/browser/serialization/json/serialize.js.map +1 -1
  159. package/dist/browser/serialization/pluralize-config.d.ts.map +1 -0
  160. package/dist/browser/serialization/pluralize-config.js.map +1 -0
  161. package/dist/browser/serialization/symbol-map.d.ts +10 -0
  162. package/dist/browser/serialization/symbol-map.d.ts.map +1 -0
  163. package/dist/browser/serialization/symbol-map.js +40 -0
  164. package/dist/browser/serialization/symbol-map.js.map +1 -0
  165. package/dist/browser/shape/shape.d.ts +4 -4
  166. package/dist/browser/shape/shape.js +2 -2
  167. package/dist/browser/shape/shape.js.map +1 -1
  168. package/dist/commonjs/constructs/built-in-resources/resource-group.d.ts +7 -1
  169. package/dist/commonjs/constructs/built-in-resources/resource-group.d.ts.map +1 -1
  170. package/dist/commonjs/constructs/built-in-resources/resource-group.js +27 -6
  171. package/dist/commonjs/constructs/built-in-resources/resource-group.js.map +2 -2
  172. package/dist/commonjs/constructs/output.d.ts +1 -1
  173. package/dist/commonjs/constructs/output.d.ts.map +1 -1
  174. package/dist/commonjs/constructs/output.js.map +1 -1
  175. package/dist/commonjs/constructs/parameter.d.ts +1 -1
  176. package/dist/commonjs/constructs/parameter.d.ts.map +1 -1
  177. package/dist/commonjs/constructs/parameter.js.map +1 -1
  178. package/dist/commonjs/constructs/resource/resource-query.d.ts +3 -1
  179. package/dist/commonjs/constructs/resource/resource-query.d.ts.map +1 -1
  180. package/dist/commonjs/constructs/resource/resource-query.js +11 -0
  181. package/dist/commonjs/constructs/resource/resource-query.js.map +2 -2
  182. package/dist/commonjs/constructs/resource/resource-relationships.d.ts +9 -0
  183. package/dist/commonjs/constructs/resource/resource-relationships.d.ts.map +1 -0
  184. package/dist/commonjs/constructs/resource/resource-relationships.js +59 -0
  185. package/dist/commonjs/constructs/resource/resource-relationships.js.map +7 -0
  186. package/dist/commonjs/constructs/resource/resource.d.ts +11 -17
  187. package/dist/commonjs/constructs/resource/resource.d.ts.map +1 -1
  188. package/dist/commonjs/constructs/resource/resource.js +57 -35
  189. package/dist/commonjs/constructs/resource/resource.js.map +2 -2
  190. package/dist/commonjs/constructs/stack.d.ts +2 -16
  191. package/dist/commonjs/constructs/stack.d.ts.map +1 -1
  192. package/dist/commonjs/constructs/stack.js.map +2 -2
  193. package/dist/commonjs/expression/ast-nodes.d.ts +1 -1
  194. package/dist/commonjs/expression/ast-nodes.d.ts.map +1 -1
  195. package/dist/commonjs/expression/ast-nodes.js.map +1 -1
  196. package/dist/commonjs/expression/expressions.d.ts +2 -9
  197. package/dist/commonjs/expression/expressions.d.ts.map +1 -1
  198. package/dist/commonjs/expression/expressions.js.map +2 -2
  199. package/dist/commonjs/expression/utils.d.ts +5 -0
  200. package/dist/commonjs/expression/utils.d.ts.map +1 -0
  201. package/dist/commonjs/expression/utils.js +43 -0
  202. package/dist/commonjs/expression/utils.js.map +7 -0
  203. package/dist/commonjs/index.d.ts +4 -4
  204. package/dist/commonjs/index.d.ts.map +1 -1
  205. package/dist/commonjs/index.js.map +2 -2
  206. package/dist/commonjs/internal.d.ts +2 -5
  207. package/dist/commonjs/internal.d.ts.map +1 -1
  208. package/dist/commonjs/internal.js +3 -9
  209. package/dist/commonjs/internal.js.map +2 -2
  210. package/dist/commonjs/naming/name-validation.d.ts +15 -0
  211. package/dist/commonjs/naming/name-validation.d.ts.map +1 -0
  212. package/dist/commonjs/naming/name-validation.js +74 -0
  213. package/dist/commonjs/naming/name-validation.js.map +7 -0
  214. package/dist/commonjs/naming/naming-policy.d.ts +7 -7
  215. package/dist/commonjs/naming/naming-policy.d.ts.map +1 -1
  216. package/dist/commonjs/naming/naming-policy.js +136 -26
  217. package/dist/commonjs/naming/naming-policy.js.map +2 -2
  218. package/dist/commonjs/naming/naming-rules.d.ts +12 -11
  219. package/dist/commonjs/naming/naming-rules.d.ts.map +1 -1
  220. package/dist/commonjs/naming/naming-rules.js +4 -11
  221. package/dist/commonjs/naming/naming-rules.js.map +2 -2
  222. package/dist/commonjs/package.json +1 -1
  223. package/dist/{browser/serialization/json/lower.d.ts → commonjs/serialization/arm-object-conversion.d.ts} +11 -11
  224. package/dist/commonjs/serialization/arm-object-conversion.d.ts.map +1 -0
  225. package/dist/commonjs/serialization/{json/lower.js → arm-object-conversion.js} +15 -15
  226. package/dist/commonjs/serialization/arm-object-conversion.js.map +7 -0
  227. package/dist/commonjs/serialization/ast/declaration-builder.d.ts +10 -0
  228. package/dist/commonjs/serialization/ast/declaration-builder.d.ts.map +1 -0
  229. package/dist/commonjs/serialization/ast/declaration-builder.js +274 -0
  230. package/dist/commonjs/serialization/ast/declaration-builder.js.map +7 -0
  231. package/dist/commonjs/serialization/ast/declaration-dependencies.d.ts +18 -0
  232. package/dist/commonjs/serialization/ast/declaration-dependencies.d.ts.map +1 -0
  233. package/dist/commonjs/serialization/ast/declaration-dependencies.js +109 -0
  234. package/dist/commonjs/serialization/ast/declaration-dependencies.js.map +7 -0
  235. package/dist/commonjs/serialization/ast/expression-builder.d.ts +14 -0
  236. package/dist/commonjs/serialization/ast/expression-builder.d.ts.map +1 -0
  237. package/dist/commonjs/serialization/ast/expression-builder.js +316 -0
  238. package/dist/commonjs/serialization/ast/expression-builder.js.map +7 -0
  239. package/dist/commonjs/serialization/ast/expression-restorer.d.ts +8 -0
  240. package/dist/commonjs/serialization/ast/expression-restorer.d.ts.map +1 -0
  241. package/dist/commonjs/serialization/ast/expression-restorer.js +193 -0
  242. package/dist/commonjs/serialization/ast/expression-restorer.js.map +7 -0
  243. package/dist/commonjs/serialization/ast/expression-rewriter.d.ts +29 -0
  244. package/dist/commonjs/serialization/ast/expression-rewriter.d.ts.map +1 -0
  245. package/dist/commonjs/serialization/ast/expression-rewriter.js +270 -0
  246. package/dist/commonjs/serialization/ast/expression-rewriter.js.map +7 -0
  247. package/dist/commonjs/serialization/ast/expression-walker.d.ts +16 -0
  248. package/dist/commonjs/serialization/ast/expression-walker.d.ts.map +1 -0
  249. package/dist/commonjs/serialization/ast/expression-walker.js +165 -0
  250. package/dist/commonjs/serialization/ast/expression-walker.js.map +7 -0
  251. package/dist/commonjs/serialization/ast/generated/ast.d.ts.map +1 -0
  252. package/dist/commonjs/serialization/{contract → ast}/generated/ast.js.map +1 -1
  253. package/dist/commonjs/serialization/ast/index.d.ts +7 -0
  254. package/dist/commonjs/serialization/ast/index.d.ts.map +1 -0
  255. package/dist/commonjs/serialization/{contract → ast}/index.js +3 -3
  256. package/dist/commonjs/serialization/ast/index.js.map +7 -0
  257. package/dist/commonjs/serialization/ast/resource-utils.d.ts +10 -0
  258. package/dist/commonjs/serialization/ast/resource-utils.d.ts.map +1 -0
  259. package/dist/commonjs/serialization/ast/resource-utils.js +71 -0
  260. package/dist/commonjs/serialization/ast/resource-utils.js.map +7 -0
  261. package/dist/commonjs/serialization/bicep/file-layout/authored-context.d.ts +12 -0
  262. package/dist/commonjs/serialization/bicep/file-layout/authored-context.d.ts.map +1 -0
  263. package/dist/commonjs/serialization/bicep/file-layout/authored-context.js +74 -0
  264. package/dist/commonjs/serialization/bicep/file-layout/authored-context.js.map +7 -0
  265. package/dist/commonjs/serialization/bicep/file-layout/bicep-namer.d.ts +11 -0
  266. package/dist/commonjs/serialization/bicep/file-layout/bicep-namer.d.ts.map +1 -0
  267. package/dist/commonjs/serialization/bicep/file-layout/bicep-namer.js +130 -0
  268. package/dist/commonjs/serialization/bicep/file-layout/bicep-namer.js.map +7 -0
  269. package/dist/commonjs/serialization/bicep/file-layout/build-bicep-files.d.ts +7 -0
  270. package/dist/commonjs/serialization/bicep/file-layout/build-bicep-files.d.ts.map +1 -0
  271. package/dist/commonjs/serialization/bicep/file-layout/build-bicep-files.js +71 -0
  272. package/dist/commonjs/serialization/bicep/file-layout/build-bicep-files.js.map +7 -0
  273. package/dist/commonjs/serialization/bicep/file-layout/deployment-planning.d.ts +19 -0
  274. package/dist/commonjs/serialization/bicep/file-layout/deployment-planning.d.ts.map +1 -0
  275. package/dist/commonjs/serialization/bicep/file-layout/deployment-planning.js +80 -0
  276. package/dist/commonjs/serialization/bicep/file-layout/deployment-planning.js.map +7 -0
  277. package/dist/commonjs/serialization/bicep/file-layout/deployment-resource-utils.d.ts +8 -0
  278. package/dist/commonjs/serialization/bicep/file-layout/deployment-resource-utils.d.ts.map +1 -0
  279. package/dist/commonjs/serialization/bicep/file-layout/deployment-resource-utils.js +91 -0
  280. package/dist/commonjs/serialization/bicep/file-layout/deployment-resource-utils.js.map +7 -0
  281. package/dist/commonjs/serialization/bicep/file-layout/file-dependencies.d.ts +4 -0
  282. package/dist/commonjs/serialization/bicep/file-layout/file-dependencies.d.ts.map +1 -0
  283. package/dist/commonjs/serialization/bicep/file-layout/file-dependencies.js +57 -0
  284. package/dist/commonjs/serialization/bicep/file-layout/file-dependencies.js.map +7 -0
  285. package/dist/commonjs/serialization/bicep/file-layout/file-paths.d.ts +3 -0
  286. package/dist/commonjs/serialization/bicep/file-layout/file-paths.d.ts.map +1 -0
  287. package/dist/commonjs/serialization/bicep/file-layout/file-paths.js +70 -0
  288. package/dist/commonjs/serialization/bicep/file-layout/file-paths.js.map +7 -0
  289. package/dist/commonjs/serialization/bicep/file-layout/file-preparation.d.ts +34 -0
  290. package/dist/commonjs/serialization/bicep/file-layout/file-preparation.d.ts.map +1 -0
  291. package/dist/commonjs/serialization/bicep/file-layout/file-preparation.js +190 -0
  292. package/dist/commonjs/serialization/bicep/file-layout/file-preparation.js.map +7 -0
  293. package/dist/commonjs/serialization/bicep/file-layout/reference-wiring.d.ts +3 -0
  294. package/dist/commonjs/serialization/bicep/file-layout/reference-wiring.d.ts.map +1 -0
  295. package/dist/commonjs/serialization/bicep/file-layout/reference-wiring.js +241 -0
  296. package/dist/commonjs/serialization/bicep/file-layout/reference-wiring.js.map +7 -0
  297. package/dist/commonjs/serialization/bicep/index.d.ts +2 -0
  298. package/dist/commonjs/serialization/bicep/index.d.ts.map +1 -0
  299. package/dist/commonjs/serialization/bicep/index.js +28 -0
  300. package/dist/commonjs/serialization/bicep/index.js.map +7 -0
  301. package/dist/commonjs/serialization/bicep/render.d.ts +11 -0
  302. package/dist/commonjs/serialization/bicep/render.d.ts.map +1 -0
  303. package/dist/commonjs/serialization/bicep/render.js +312 -0
  304. package/dist/commonjs/serialization/bicep/render.js.map +7 -0
  305. package/dist/commonjs/serialization/{json/encoding.d.ts → encoding.d.ts} +1 -1
  306. package/dist/commonjs/serialization/encoding.d.ts.map +1 -0
  307. package/dist/commonjs/serialization/{json/encoding.js → encoding.js} +2 -12
  308. package/dist/commonjs/serialization/encoding.js.map +7 -0
  309. package/dist/commonjs/serialization/{json/util.d.ts → identifiers.d.ts} +1 -1
  310. package/dist/commonjs/serialization/identifiers.d.ts.map +1 -0
  311. package/dist/commonjs/serialization/{json/util.js → identifiers.js} +4 -4
  312. package/dist/commonjs/serialization/{json/util.js.map → identifiers.js.map} +1 -1
  313. package/dist/commonjs/serialization/index.d.ts +1 -1
  314. package/dist/commonjs/serialization/index.d.ts.map +1 -1
  315. package/dist/commonjs/serialization/index.js.map +1 -1
  316. package/dist/commonjs/serialization/json/deserialize.d.ts.map +1 -1
  317. package/dist/commonjs/serialization/json/deserialize.js +115 -44
  318. package/dist/commonjs/serialization/json/deserialize.js.map +2 -2
  319. package/dist/commonjs/serialization/json/serialize.d.ts +1 -1
  320. package/dist/commonjs/serialization/json/serialize.d.ts.map +1 -1
  321. package/dist/commonjs/serialization/json/serialize.js +6 -308
  322. package/dist/commonjs/serialization/json/serialize.js.map +3 -3
  323. package/dist/commonjs/serialization/pluralize-config.d.ts.map +1 -0
  324. package/dist/commonjs/serialization/{json/pluralize-config.js.map → pluralize-config.js.map} +1 -1
  325. package/dist/commonjs/serialization/symbol-map.d.ts +10 -0
  326. package/dist/commonjs/serialization/symbol-map.d.ts.map +1 -0
  327. package/dist/commonjs/serialization/symbol-map.js +72 -0
  328. package/dist/commonjs/serialization/symbol-map.js.map +7 -0
  329. package/dist/commonjs/shape/shape.d.ts +4 -4
  330. package/dist/commonjs/shape/shape.js.map +1 -1
  331. package/dist/commonjs/tsdoc-metadata.json +1 -1
  332. package/dist/esm/constructs/built-in-resources/resource-group.d.ts +7 -1
  333. package/dist/esm/constructs/built-in-resources/resource-group.d.ts.map +1 -1
  334. package/dist/esm/constructs/built-in-resources/resource-group.js +26 -6
  335. package/dist/esm/constructs/built-in-resources/resource-group.js.map +1 -1
  336. package/dist/esm/constructs/output.d.ts +1 -1
  337. package/dist/esm/constructs/output.d.ts.map +1 -1
  338. package/dist/esm/constructs/output.js.map +1 -1
  339. package/dist/esm/constructs/parameter.d.ts +1 -1
  340. package/dist/esm/constructs/parameter.d.ts.map +1 -1
  341. package/dist/esm/constructs/parameter.js.map +1 -1
  342. package/dist/esm/constructs/resource/resource-query.d.ts +3 -1
  343. package/dist/esm/constructs/resource/resource-query.d.ts.map +1 -1
  344. package/dist/esm/constructs/resource/resource-query.js +10 -0
  345. package/dist/esm/constructs/resource/resource-query.js.map +1 -1
  346. package/dist/esm/constructs/resource/resource-relationships.d.ts +9 -0
  347. package/dist/esm/constructs/resource/resource-relationships.d.ts.map +1 -0
  348. package/dist/esm/constructs/resource/resource-relationships.js +35 -0
  349. package/dist/esm/constructs/resource/resource-relationships.js.map +1 -0
  350. package/dist/esm/constructs/resource/resource.d.ts +11 -17
  351. package/dist/esm/constructs/resource/resource.d.ts.map +1 -1
  352. package/dist/esm/constructs/resource/resource.js +70 -28
  353. package/dist/esm/constructs/resource/resource.js.map +1 -1
  354. package/dist/esm/constructs/stack.d.ts +2 -16
  355. package/dist/esm/constructs/stack.d.ts.map +1 -1
  356. package/dist/esm/constructs/stack.js +1 -15
  357. package/dist/esm/constructs/stack.js.map +1 -1
  358. package/dist/esm/expression/ast-nodes.d.ts +1 -1
  359. package/dist/esm/expression/ast-nodes.d.ts.map +1 -1
  360. package/dist/esm/expression/ast-nodes.js.map +1 -1
  361. package/dist/esm/expression/expressions.d.ts +2 -9
  362. package/dist/esm/expression/expressions.d.ts.map +1 -1
  363. package/dist/esm/expression/expressions.js +2 -9
  364. package/dist/esm/expression/expressions.js.map +1 -1
  365. package/dist/esm/expression/utils.d.ts +5 -0
  366. package/dist/esm/expression/utils.d.ts.map +1 -0
  367. package/dist/esm/expression/utils.js +25 -0
  368. package/dist/esm/expression/utils.js.map +1 -0
  369. package/dist/esm/index.d.ts +4 -4
  370. package/dist/esm/index.d.ts.map +1 -1
  371. package/dist/esm/index.js.map +1 -1
  372. package/dist/esm/internal.d.ts +2 -5
  373. package/dist/esm/internal.d.ts.map +1 -1
  374. package/dist/esm/internal.js +1 -3
  375. package/dist/esm/internal.js.map +1 -1
  376. package/dist/esm/naming/name-validation.d.ts +15 -0
  377. package/dist/esm/naming/name-validation.d.ts.map +1 -0
  378. package/dist/esm/naming/name-validation.js +82 -0
  379. package/dist/esm/naming/name-validation.js.map +1 -0
  380. package/dist/esm/naming/naming-policy.d.ts +7 -7
  381. package/dist/esm/naming/naming-policy.d.ts.map +1 -1
  382. package/dist/esm/naming/naming-policy.js +166 -33
  383. package/dist/esm/naming/naming-policy.js.map +1 -1
  384. package/dist/esm/naming/naming-rules.d.ts +12 -11
  385. package/dist/esm/naming/naming-rules.d.ts.map +1 -1
  386. package/dist/esm/naming/naming-rules.js +2 -9
  387. package/dist/esm/naming/naming-rules.js.map +1 -1
  388. package/dist/esm/package.json +1 -1
  389. package/dist/{commonjs/serialization/json/lower.d.ts → esm/serialization/arm-object-conversion.d.ts} +11 -11
  390. package/dist/esm/serialization/arm-object-conversion.d.ts.map +1 -0
  391. package/dist/{browser/serialization/json/lower.js → esm/serialization/arm-object-conversion.js} +20 -20
  392. package/dist/esm/serialization/arm-object-conversion.js.map +1 -0
  393. package/dist/esm/serialization/ast/declaration-builder.d.ts +10 -0
  394. package/dist/esm/serialization/ast/declaration-builder.d.ts.map +1 -0
  395. package/dist/esm/serialization/ast/declaration-builder.js +265 -0
  396. package/dist/esm/serialization/ast/declaration-builder.js.map +1 -0
  397. package/dist/esm/serialization/ast/declaration-dependencies.d.ts +18 -0
  398. package/dist/esm/serialization/ast/declaration-dependencies.d.ts.map +1 -0
  399. package/dist/esm/serialization/ast/declaration-dependencies.js +96 -0
  400. package/dist/esm/serialization/ast/declaration-dependencies.js.map +1 -0
  401. package/dist/esm/serialization/ast/expression-builder.d.ts +14 -0
  402. package/dist/esm/serialization/ast/expression-builder.d.ts.map +1 -0
  403. package/dist/esm/serialization/ast/expression-builder.js +313 -0
  404. package/dist/esm/serialization/ast/expression-builder.js.map +1 -0
  405. package/dist/esm/serialization/ast/expression-restorer.d.ts +8 -0
  406. package/dist/esm/serialization/ast/expression-restorer.d.ts.map +1 -0
  407. package/dist/esm/serialization/ast/expression-restorer.js +162 -0
  408. package/dist/esm/serialization/ast/expression-restorer.js.map +1 -0
  409. package/dist/esm/serialization/ast/expression-rewriter.d.ts +29 -0
  410. package/dist/esm/serialization/ast/expression-rewriter.d.ts.map +1 -0
  411. package/dist/esm/serialization/ast/expression-rewriter.js +257 -0
  412. package/dist/esm/serialization/ast/expression-rewriter.js.map +1 -0
  413. package/dist/esm/serialization/ast/expression-walker.d.ts +16 -0
  414. package/dist/esm/serialization/ast/expression-walker.d.ts.map +1 -0
  415. package/dist/esm/serialization/ast/expression-walker.js +154 -0
  416. package/dist/esm/serialization/ast/expression-walker.js.map +1 -0
  417. package/dist/esm/serialization/ast/generated/ast.d.ts.map +1 -0
  418. package/dist/esm/serialization/ast/generated/ast.js.map +1 -0
  419. package/dist/esm/serialization/ast/index.d.ts +7 -0
  420. package/dist/esm/serialization/ast/index.d.ts.map +1 -0
  421. package/dist/esm/serialization/ast/index.js.map +1 -0
  422. package/dist/esm/serialization/ast/resource-utils.d.ts +10 -0
  423. package/dist/esm/serialization/ast/resource-utils.d.ts.map +1 -0
  424. package/dist/esm/serialization/ast/resource-utils.js +52 -0
  425. package/dist/esm/serialization/ast/resource-utils.js.map +1 -0
  426. package/dist/esm/serialization/bicep/file-layout/authored-context.d.ts +12 -0
  427. package/dist/esm/serialization/bicep/file-layout/authored-context.d.ts.map +1 -0
  428. package/dist/esm/serialization/bicep/file-layout/authored-context.js +57 -0
  429. package/dist/esm/serialization/bicep/file-layout/authored-context.js.map +1 -0
  430. package/dist/esm/serialization/bicep/file-layout/bicep-namer.d.ts +11 -0
  431. package/dist/esm/serialization/bicep/file-layout/bicep-namer.d.ts.map +1 -0
  432. package/dist/esm/serialization/bicep/file-layout/bicep-namer.js +100 -0
  433. package/dist/esm/serialization/bicep/file-layout/bicep-namer.js.map +1 -0
  434. package/dist/esm/serialization/bicep/file-layout/build-bicep-files.d.ts +7 -0
  435. package/dist/esm/serialization/bicep/file-layout/build-bicep-files.d.ts.map +1 -0
  436. package/dist/esm/serialization/bicep/file-layout/build-bicep-files.js +46 -0
  437. package/dist/esm/serialization/bicep/file-layout/build-bicep-files.js.map +1 -0
  438. package/dist/esm/serialization/bicep/file-layout/deployment-planning.d.ts +19 -0
  439. package/dist/esm/serialization/bicep/file-layout/deployment-planning.d.ts.map +1 -0
  440. package/dist/esm/serialization/bicep/file-layout/deployment-planning.js +68 -0
  441. package/dist/esm/serialization/bicep/file-layout/deployment-planning.js.map +1 -0
  442. package/dist/esm/serialization/bicep/file-layout/deployment-resource-utils.d.ts +8 -0
  443. package/dist/esm/serialization/bicep/file-layout/deployment-resource-utils.d.ts.map +1 -0
  444. package/dist/esm/serialization/bicep/file-layout/deployment-resource-utils.js +67 -0
  445. package/dist/esm/serialization/bicep/file-layout/deployment-resource-utils.js.map +1 -0
  446. package/dist/esm/serialization/bicep/file-layout/file-dependencies.d.ts +4 -0
  447. package/dist/esm/serialization/bicep/file-layout/file-dependencies.d.ts.map +1 -0
  448. package/dist/esm/serialization/bicep/file-layout/file-dependencies.js +32 -0
  449. package/dist/esm/serialization/bicep/file-layout/file-dependencies.js.map +1 -0
  450. package/dist/esm/serialization/bicep/file-layout/file-paths.d.ts +3 -0
  451. package/dist/esm/serialization/bicep/file-layout/file-paths.d.ts.map +1 -0
  452. package/dist/esm/serialization/bicep/file-layout/file-paths.js +46 -0
  453. package/dist/esm/serialization/bicep/file-layout/file-paths.js.map +1 -0
  454. package/dist/esm/serialization/bicep/file-layout/file-preparation.d.ts +34 -0
  455. package/dist/esm/serialization/bicep/file-layout/file-preparation.d.ts.map +1 -0
  456. package/dist/esm/serialization/bicep/file-layout/file-preparation.js +140 -0
  457. package/dist/esm/serialization/bicep/file-layout/file-preparation.js.map +1 -0
  458. package/dist/esm/serialization/bicep/file-layout/reference-wiring.d.ts +3 -0
  459. package/dist/esm/serialization/bicep/file-layout/reference-wiring.d.ts.map +1 -0
  460. package/dist/esm/serialization/bicep/file-layout/reference-wiring.js +225 -0
  461. package/dist/esm/serialization/bicep/file-layout/reference-wiring.js.map +1 -0
  462. package/dist/esm/serialization/bicep/index.d.ts +2 -0
  463. package/dist/esm/serialization/bicep/index.d.ts.map +1 -0
  464. package/dist/esm/serialization/bicep/index.js +4 -0
  465. package/dist/esm/serialization/bicep/index.js.map +1 -0
  466. package/dist/esm/serialization/bicep/render.d.ts +11 -0
  467. package/dist/esm/serialization/bicep/render.d.ts.map +1 -0
  468. package/dist/esm/serialization/bicep/render.js +293 -0
  469. package/dist/esm/serialization/bicep/render.js.map +1 -0
  470. package/dist/esm/serialization/{json/encoding.d.ts → encoding.d.ts} +1 -1
  471. package/dist/esm/serialization/encoding.d.ts.map +1 -0
  472. package/dist/esm/serialization/{json/encoding.js → encoding.js} +2 -12
  473. package/dist/esm/serialization/encoding.js.map +1 -0
  474. package/dist/esm/serialization/{json/util.d.ts → identifiers.d.ts} +1 -1
  475. package/dist/esm/serialization/identifiers.d.ts.map +1 -0
  476. package/dist/esm/serialization/{json/util.js → identifiers.js} +1 -1
  477. package/dist/esm/serialization/identifiers.js.map +1 -0
  478. package/dist/esm/serialization/index.d.ts +1 -1
  479. package/dist/esm/serialization/index.d.ts.map +1 -1
  480. package/dist/esm/serialization/index.js.map +1 -1
  481. package/dist/esm/serialization/json/deserialize.d.ts.map +1 -1
  482. package/dist/esm/serialization/json/deserialize.js +131 -39
  483. package/dist/esm/serialization/json/deserialize.js.map +1 -1
  484. package/dist/esm/serialization/json/serialize.d.ts +1 -1
  485. package/dist/esm/serialization/json/serialize.d.ts.map +1 -1
  486. package/dist/esm/serialization/json/serialize.js +5 -360
  487. package/dist/esm/serialization/json/serialize.js.map +1 -1
  488. package/dist/esm/serialization/pluralize-config.d.ts.map +1 -0
  489. package/dist/esm/serialization/pluralize-config.js.map +1 -0
  490. package/dist/esm/serialization/symbol-map.d.ts +10 -0
  491. package/dist/esm/serialization/symbol-map.d.ts.map +1 -0
  492. package/dist/esm/serialization/symbol-map.js +40 -0
  493. package/dist/esm/serialization/symbol-map.js.map +1 -0
  494. package/dist/esm/shape/shape.d.ts +4 -4
  495. package/dist/esm/shape/shape.js +2 -2
  496. package/dist/esm/shape/shape.js.map +1 -1
  497. package/package.json +3 -2
  498. package/dist/browser/serialization/contract/generated/ast.d.ts.map +0 -1
  499. package/dist/browser/serialization/contract/generated/ast.js.map +0 -1
  500. package/dist/browser/serialization/contract/index.d.ts +0 -2
  501. package/dist/browser/serialization/contract/index.d.ts.map +0 -1
  502. package/dist/browser/serialization/contract/index.js.map +0 -1
  503. package/dist/browser/serialization/json/encoding.d.ts.map +0 -1
  504. package/dist/browser/serialization/json/encoding.js.map +0 -1
  505. package/dist/browser/serialization/json/expression.d.ts +0 -32
  506. package/dist/browser/serialization/json/expression.d.ts.map +0 -1
  507. package/dist/browser/serialization/json/expression.js +0 -494
  508. package/dist/browser/serialization/json/expression.js.map +0 -1
  509. package/dist/browser/serialization/json/lower.d.ts.map +0 -1
  510. package/dist/browser/serialization/json/lower.js.map +0 -1
  511. package/dist/browser/serialization/json/pluralize-config.d.ts.map +0 -1
  512. package/dist/browser/serialization/json/pluralize-config.js.map +0 -1
  513. package/dist/browser/serialization/json/util.d.ts.map +0 -1
  514. package/dist/browser/serialization/json/util.js.map +0 -1
  515. package/dist/browser/serialization/utils.d.ts +0 -3
  516. package/dist/browser/serialization/utils.d.ts.map +0 -1
  517. package/dist/browser/serialization/utils.js +0 -146
  518. package/dist/browser/serialization/utils.js.map +0 -1
  519. package/dist/commonjs/serialization/contract/generated/ast.d.ts.map +0 -1
  520. package/dist/commonjs/serialization/contract/index.d.ts +0 -2
  521. package/dist/commonjs/serialization/contract/index.d.ts.map +0 -1
  522. package/dist/commonjs/serialization/contract/index.js.map +0 -7
  523. package/dist/commonjs/serialization/json/encoding.d.ts.map +0 -1
  524. package/dist/commonjs/serialization/json/encoding.js.map +0 -7
  525. package/dist/commonjs/serialization/json/expression.d.ts +0 -32
  526. package/dist/commonjs/serialization/json/expression.d.ts.map +0 -1
  527. package/dist/commonjs/serialization/json/expression.js +0 -509
  528. package/dist/commonjs/serialization/json/expression.js.map +0 -7
  529. package/dist/commonjs/serialization/json/lower.d.ts.map +0 -1
  530. package/dist/commonjs/serialization/json/lower.js.map +0 -7
  531. package/dist/commonjs/serialization/json/pluralize-config.d.ts.map +0 -1
  532. package/dist/commonjs/serialization/json/util.d.ts.map +0 -1
  533. package/dist/commonjs/serialization/utils.d.ts +0 -3
  534. package/dist/commonjs/serialization/utils.d.ts.map +0 -1
  535. package/dist/commonjs/serialization/utils.js +0 -169
  536. package/dist/commonjs/serialization/utils.js.map +0 -7
  537. package/dist/esm/serialization/contract/generated/ast.d.ts.map +0 -1
  538. package/dist/esm/serialization/contract/generated/ast.js.map +0 -1
  539. package/dist/esm/serialization/contract/index.d.ts +0 -2
  540. package/dist/esm/serialization/contract/index.d.ts.map +0 -1
  541. package/dist/esm/serialization/contract/index.js.map +0 -1
  542. package/dist/esm/serialization/json/encoding.d.ts.map +0 -1
  543. package/dist/esm/serialization/json/encoding.js.map +0 -1
  544. package/dist/esm/serialization/json/expression.d.ts +0 -32
  545. package/dist/esm/serialization/json/expression.d.ts.map +0 -1
  546. package/dist/esm/serialization/json/expression.js +0 -494
  547. package/dist/esm/serialization/json/expression.js.map +0 -1
  548. package/dist/esm/serialization/json/lower.d.ts.map +0 -1
  549. package/dist/esm/serialization/json/lower.js.map +0 -1
  550. package/dist/esm/serialization/json/pluralize-config.d.ts.map +0 -1
  551. package/dist/esm/serialization/json/pluralize-config.js.map +0 -1
  552. package/dist/esm/serialization/json/util.d.ts.map +0 -1
  553. package/dist/esm/serialization/json/util.js.map +0 -1
  554. package/dist/esm/serialization/utils.d.ts +0 -3
  555. package/dist/esm/serialization/utils.d.ts.map +0 -1
  556. package/dist/esm/serialization/utils.js +0 -146
  557. package/dist/esm/serialization/utils.js.map +0 -1
  558. /package/dist/browser/serialization/{contract → ast}/generated/ast.d.ts +0 -0
  559. /package/dist/browser/serialization/{contract → ast}/generated/ast.js +0 -0
  560. /package/dist/browser/serialization/{contract → ast}/index.js +0 -0
  561. /package/dist/browser/serialization/{json/pluralize-config.d.ts → pluralize-config.d.ts} +0 -0
  562. /package/dist/browser/serialization/{json/pluralize-config.js → pluralize-config.js} +0 -0
  563. /package/dist/commonjs/serialization/{contract → ast}/generated/ast.d.ts +0 -0
  564. /package/dist/commonjs/serialization/{contract → ast}/generated/ast.js +0 -0
  565. /package/dist/commonjs/serialization/{json/pluralize-config.d.ts → pluralize-config.d.ts} +0 -0
  566. /package/dist/commonjs/serialization/{json/pluralize-config.js → pluralize-config.js} +0 -0
  567. /package/dist/esm/serialization/{contract → ast}/generated/ast.d.ts +0 -0
  568. /package/dist/esm/serialization/{contract → ast}/generated/ast.js +0 -0
  569. /package/dist/esm/serialization/{contract → ast}/index.js +0 -0
  570. /package/dist/esm/serialization/{json/pluralize-config.d.ts → pluralize-config.d.ts} +0 -0
  571. /package/dist/esm/serialization/{json/pluralize-config.js → pluralize-config.js} +0 -0
@@ -0,0 +1,313 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { accessExpressionNode, isExpressionNode, } from "../../expression/ast-nodes.js";
4
+ import { isExpression, unwrapExpression } from "../../expression/expressions.js";
5
+ // ---------------------------------------------------------------------------
6
+ // ARM property path expansion
7
+ // ---------------------------------------------------------------------------
8
+ /**
9
+ * Expands armPath stamps along a core property-access chain, replacing each
10
+ * stamped property with its ARM path relative to the expanded base. Empty
11
+ * paths fall back to the original property name. Generated accesses carry
12
+ * no stamps; unchanged nodes retain their identity.
13
+ *
14
+ * Recursion stops at non-property-access nodes and leaves their children
15
+ * untouched. buildExpression traverses those children and invokes this
16
+ * helper as it reaches them.
17
+ */
18
+ function expandArmPropertyPaths(node) {
19
+ if (node.kind !== "property-access")
20
+ return node;
21
+ const expandedBase = expandArmPropertyPaths(node.base);
22
+ if (node.armPath !== undefined) {
23
+ const path = node.armPath.length > 0 ? node.armPath : [node.property];
24
+ let current = expandedBase;
25
+ for (const segment of path) {
26
+ // A flattened optional property may be absent at any wire-path segment.
27
+ current = accessExpressionNode(current, segment, {
28
+ nullish: node.nullish,
29
+ });
30
+ }
31
+ return current;
32
+ }
33
+ if (expandedBase === node.base)
34
+ return node;
35
+ return { ...node, base: expandedBase };
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Expression building: CDK value -> AST
39
+ // ---------------------------------------------------------------------------
40
+ function splitSymbolicPath(path) {
41
+ const parts = [];
42
+ let current = "";
43
+ let depth = 0;
44
+ for (const character of path) {
45
+ if (character === "." && depth === 0) {
46
+ if (current.length > 0) {
47
+ parts.push(current);
48
+ current = "";
49
+ }
50
+ continue;
51
+ }
52
+ if (character === "(") {
53
+ depth += 1;
54
+ }
55
+ else if (character === ")") {
56
+ depth -= 1;
57
+ }
58
+ current += character;
59
+ }
60
+ if (current.length > 0) {
61
+ parts.push(current);
62
+ }
63
+ return parts;
64
+ }
65
+ function buildSymbolicPath(path) {
66
+ const parts = splitSymbolicPath(path);
67
+ let current;
68
+ for (const part of parts) {
69
+ if (part.endsWith("()")) {
70
+ const target = part.slice(0, -2);
71
+ const callNode = {
72
+ kind: "function-call",
73
+ target,
74
+ args: [],
75
+ };
76
+ current =
77
+ current === undefined
78
+ ? callNode
79
+ : {
80
+ kind: "instance-function-call",
81
+ base: current,
82
+ name: target,
83
+ args: [],
84
+ };
85
+ continue;
86
+ }
87
+ current =
88
+ current === undefined
89
+ ? {
90
+ kind: "identifier",
91
+ id: part,
92
+ }
93
+ : {
94
+ kind: "property-access",
95
+ base: current,
96
+ property: part,
97
+ nullish: false,
98
+ };
99
+ }
100
+ if (current === undefined) {
101
+ throw new Error(`Cannot serialize empty symbolic path.`);
102
+ }
103
+ return current;
104
+ }
105
+ function buildPlainObject(value, symbolMap) {
106
+ return {
107
+ kind: "object",
108
+ value: buildExpressionProperties(value, symbolMap),
109
+ };
110
+ }
111
+ /** Builds a property map of expression nodes, omitting undefined values. */
112
+ export function buildExpressionProperties(value, symbolMap) {
113
+ return Object.fromEntries(Object.entries(value).flatMap(([key, propertyValue]) => propertyValue === undefined ? [] : [[key, buildExpression(propertyValue, symbolMap)]]));
114
+ }
115
+ function buildArray(value, symbolMap) {
116
+ return {
117
+ kind: "array",
118
+ items: value.map((item) => buildExpression(item, symbolMap)),
119
+ };
120
+ }
121
+ function isSerializableObject(value) {
122
+ return typeof value === "object" && value !== null && !Array.isArray(value);
123
+ }
124
+ function buildIdentifierExpression(value, symbolMap) {
125
+ if (typeof value.id === "string") {
126
+ return {
127
+ kind: "identifier",
128
+ id: value.id,
129
+ };
130
+ }
131
+ const identifier = symbolMap.get(value.id);
132
+ if (identifier === undefined) {
133
+ throw new Error(`Missing synthesized symbol for referenced resource type ${value.id.type}.`);
134
+ }
135
+ return {
136
+ kind: "identifier",
137
+ id: identifier,
138
+ };
139
+ }
140
+ function isBicepIdentifierSegment(segment) {
141
+ return /^[A-Za-z_][A-Za-z0-9_]*$/u.test(segment);
142
+ }
143
+ function buildMemberAccessExpression(value, symbolMap) {
144
+ const base = buildExpression(value.base, symbolMap);
145
+ if (value.kind === "property-access") {
146
+ return {
147
+ kind: "property-access",
148
+ base,
149
+ property: value.property,
150
+ nullish: value.nullish,
151
+ };
152
+ }
153
+ if (typeof value.index === "number") {
154
+ return {
155
+ kind: "array-access",
156
+ base,
157
+ index: {
158
+ kind: "integer",
159
+ value: String(value.index),
160
+ },
161
+ nullish: value.nullish,
162
+ fromEnd: value.fromEnd,
163
+ };
164
+ }
165
+ if (typeof value.index === "string") {
166
+ if (value.fromEnd) {
167
+ throw new Error("Reverse indexing requires an integer index, not a string.");
168
+ }
169
+ return isBicepIdentifierSegment(value.index)
170
+ ? {
171
+ kind: "property-access",
172
+ base,
173
+ property: value.index,
174
+ nullish: value.nullish,
175
+ }
176
+ : {
177
+ kind: "array-access",
178
+ base,
179
+ index: {
180
+ kind: "string",
181
+ value: value.index,
182
+ },
183
+ nullish: value.nullish,
184
+ fromEnd: value.fromEnd,
185
+ };
186
+ }
187
+ // Expression-shaped index (e.g. a loop's `.index` symbolic value or any
188
+ // `Expression<number>` proxy). Recursively serialize into the wire
189
+ // array-access's `index` slot.
190
+ return {
191
+ kind: "array-access",
192
+ base,
193
+ index: buildExpression(value.index, symbolMap),
194
+ nullish: value.nullish,
195
+ fromEnd: value.fromEnd,
196
+ };
197
+ }
198
+ export function moduleOutputExpression(moduleName, outputName) {
199
+ return {
200
+ kind: "property-access",
201
+ base: {
202
+ kind: "property-access",
203
+ base: { kind: "identifier", id: moduleName },
204
+ property: "outputs",
205
+ nullish: false,
206
+ },
207
+ property: outputName,
208
+ nullish: false,
209
+ };
210
+ }
211
+ export function buildExpression(value, symbolMap = new Map()) {
212
+ if (isExpression(value)) {
213
+ return buildExpression(unwrapExpression(value), symbolMap);
214
+ }
215
+ // Expand the current property paths; recursion below visits other expressions.
216
+ if (value !== null && typeof value === "object" && isExpressionNode(value)) {
217
+ const expanded = expandArmPropertyPaths(value);
218
+ if (expanded !== value) {
219
+ return buildExpression(expanded, symbolMap);
220
+ }
221
+ }
222
+ if (typeof value === "string") {
223
+ return {
224
+ kind: "string",
225
+ value,
226
+ };
227
+ }
228
+ if (typeof value === "number") {
229
+ if (!Number.isInteger(value)) {
230
+ throw new Error(`Bicep serialization currently only supports integer numbers.`);
231
+ }
232
+ if (!Number.isSafeInteger(value)) {
233
+ throw new Error(`Bicep serialization currently only supports safe integer numbers.`);
234
+ }
235
+ return {
236
+ kind: "integer",
237
+ value: String(value),
238
+ };
239
+ }
240
+ if (typeof value === "boolean") {
241
+ return {
242
+ kind: "boolean",
243
+ value,
244
+ };
245
+ }
246
+ if (value === null) {
247
+ return {
248
+ kind: "null",
249
+ value: null,
250
+ };
251
+ }
252
+ if (Array.isArray(value)) {
253
+ return buildArray(value, symbolMap);
254
+ }
255
+ if (isExpressionNode(value)) {
256
+ switch (value.kind) {
257
+ case "binary":
258
+ return {
259
+ kind: "binary-operation",
260
+ operator: value.operator,
261
+ left: buildExpression(value.left, symbolMap),
262
+ right: buildExpression(value.right, symbolMap),
263
+ };
264
+ case "unary":
265
+ return {
266
+ kind: "unary-operation",
267
+ operator: value.operator,
268
+ argument: buildExpression(value.argument, symbolMap),
269
+ };
270
+ case "ternary":
271
+ return {
272
+ kind: "ternary-operation",
273
+ condition: buildExpression(value.condition, symbolMap),
274
+ trueValue: buildExpression(value.trueValue, symbolMap),
275
+ falseValue: buildExpression(value.falseValue, symbolMap),
276
+ };
277
+ case "fn-call":
278
+ return {
279
+ kind: "function-call",
280
+ target: value.operator,
281
+ args: value.args.map((argument) => buildExpression(argument, symbolMap)),
282
+ };
283
+ case "instance-function-call":
284
+ return {
285
+ kind: "instance-function-call",
286
+ base: buildExpression(value.base, symbolMap),
287
+ name: value.name,
288
+ args: value.args.map((argument) => buildExpression(argument, symbolMap)),
289
+ };
290
+ case "interpolated-string":
291
+ return {
292
+ kind: "interpolated-string",
293
+ segments: value.segments.map((segment) => buildExpression(segment, symbolMap)),
294
+ };
295
+ case "identifier":
296
+ return buildIdentifierExpression(value, symbolMap);
297
+ case "property-access":
298
+ case "array-access":
299
+ return buildMemberAccessExpression(value, symbolMap);
300
+ case "symbolic-value": {
301
+ const identifier = symbolMap.get(value);
302
+ return identifier === undefined
303
+ ? buildSymbolicPath(value.path)
304
+ : { kind: "identifier", id: identifier };
305
+ }
306
+ }
307
+ }
308
+ if (isSerializableObject(value)) {
309
+ return buildPlainObject(value, symbolMap);
310
+ }
311
+ throw new Error(`Unsupported serialization input.`);
312
+ }
313
+ //# sourceMappingURL=expression-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-builder.js","sourceRoot":"","sources":["../../../../src/serialization/ast/expression-builder.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAKjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAmB,MAAM,iCAAiC,CAAC;AAgBlG,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,SAAS,sBAAsB,CAAC,IAAwB;IACtD,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,OAAO,GAAuB,YAAY,CAAC;QAC/C,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,wEAAwE;YACxE,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE;gBAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,YAAY,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;QAED,OAAO,IAAI,SAAS,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,OAAmC,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,QAAQ,GAA2B;gBACvC,IAAI,EAAE,eAAe;gBACrB,MAAM;gBACN,IAAI,EAAE,EAAE;aACT,CAAC;YAEF,OAAO;gBACL,OAAO,KAAK,SAAS;oBACnB,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC;wBACE,IAAI,EAAE,wBAAwB;wBAC9B,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,EAAE;qBACT,CAAC;YACR,SAAS;QACX,CAAC;QAED,OAAO;YACL,OAAO,KAAK,SAAS;gBACnB,CAAC,CAAC;oBACE,IAAI,EAAE,YAAY;oBAClB,EAAE,EAAE,IAAI;iBACT;gBACH,CAAC,CAAC;oBACE,IAAI,EAAE,iBAAiB;oBACvB,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,KAAK;iBACf,CAAC;IACV,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAkE,EAClE,SAA+B;IAE/B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,yBAAyB,CAAC,KAAK,EAAE,SAAS,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,yBAAyB,CACvC,KAAkE,EAClE,SAA+B;IAE/B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,EAAE,CACrD,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CACtF,CACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,KAAqC,EACrC,SAA+B;IAE/B,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAA0B;IAE1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,yBAAyB,CAChC,KAA+B,EAC/B,SAA+B;IAE/B,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,KAAK,CAAC,EAAE;SACb,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE3C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2DAA2D,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/F,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,EAAE,EAAE,UAAU;KACf,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,OAAO,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,2BAA2B,CAClC,KAA+D,EAC/D,SAA+B;IAE/B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,iBAAiB;YACvB,IAAI;YACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,IAAI;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;aAC3B;YACD,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,CAAC,CAAC;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI;gBACJ,QAAQ,EAAE,KAAK,CAAC,KAAK;gBACrB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,cAAc;gBACpB,IAAI;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,KAAK,CAAC,KAAK;iBACnB;gBACD,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;IACR,CAAC;IAED,wEAAwE;IACxE,mEAAmE;IACnE,+BAA+B;IAC/B,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,IAAI;QACJ,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAA4B,EAAE,SAAS,CAAC;QACrE,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,UAAkB;IAC3E,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE;YACJ,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE;YAC5C,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,KAAK;SACf;QACD,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAA0B,EAC1B,YAAkC,IAAI,GAAG,EAAE;IAE3C,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAwB,EAAE,SAAS,CAAC,CAAC;IACpF,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAA2B,CAAC,CAAC;QACrE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,OAAO,eAAe,CAAC,QAA+B,EAAE,SAAS,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK;SACN,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QAED,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,KAAK;SACN,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO;oBACL,IAAI,EAAE,kBAAkB;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,IAA2B,EAAE,SAAS,CAAC;oBACnE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAA4B,EAAE,SAAS,CAAC;iBACtE,CAAC;YAEJ,KAAK,OAAO;gBACV,OAAO;oBACL,IAAI,EAAE,iBAAiB;oBACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,QAA+B,EAAE,SAAS,CAAC;iBAC5E,CAAC;YAEJ,KAAK,SAAS;gBACZ,OAAO;oBACL,IAAI,EAAE,mBAAmB;oBACzB,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,SAAgC,EAAE,SAAS,CAAC;oBAC7E,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,SAAgC,EAAE,SAAS,CAAC;oBAC7E,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,UAAiC,EAAE,SAAS,CAAC;iBAChF,CAAC;YAEJ,KAAK,SAAS;gBACZ,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,MAAM,EAAE,KAAK,CAAC,QAAQ;oBACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChC,eAAe,CAAC,QAA+B,EAAE,SAAS,CAAC,CAC5D;iBACF,CAAC;YAEJ,KAAK,wBAAwB;gBAC3B,OAAO;oBACL,IAAI,EAAE,wBAAwB;oBAC9B,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,IAA2B,EAAE,SAAS,CAAC;oBACnE,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChC,eAAe,CAAC,QAA+B,EAAE,SAAS,CAAC,CAC5D;iBACF,CAAC;YAEJ,KAAK,qBAAqB;gBACxB,OAAO;oBACL,IAAI,EAAE,qBAAqB;oBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACvC,eAAe,CAAC,OAA8B,EAAE,SAAS,CAAC,CAC3D;iBACF,CAAC;YAEJ,KAAK,YAAY;gBACf,OAAO,yBAAyB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAErD,KAAK,iBAAiB,CAAC;YACvB,KAAK,cAAc;gBACjB,OAAO,2BAA2B,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAEvD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxC,OAAO,UAAU,KAAK,SAAS;oBAC7B,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n accessExpressionNode,\n isExpressionNode,\n type ArrayAccessExpressionNode,\n type ExpressionNode as CoreExpressionNode,\n type IdentifierExpressionNode,\n type PropertyAccessExpressionNode,\n} from \"../../expression/ast-nodes.js\";\nimport { isExpression, unwrapExpression, type Expression } from \"../../expression/expressions.js\";\nimport type { DeclarationSymbolMap } from \"../symbol-map.js\";\nimport type { ArrayValue, ExpressionNode, FunctionCallExpression, ObjectValue } from \"./index.js\";\n\nexport type ExpressionNodeInput =\n | CoreExpressionNode\n | Expression<unknown>\n | string\n | number\n | boolean\n | null\n | readonly ExpressionNodeInput[]\n | {\n readonly [key: string]: ExpressionNodeInput | undefined;\n };\n\n// ---------------------------------------------------------------------------\n// ARM property path expansion\n// ---------------------------------------------------------------------------\n\n/**\n * Expands armPath stamps along a core property-access chain, replacing each\n * stamped property with its ARM path relative to the expanded base. Empty\n * paths fall back to the original property name. Generated accesses carry\n * no stamps; unchanged nodes retain their identity.\n *\n * Recursion stops at non-property-access nodes and leaves their children\n * untouched. buildExpression traverses those children and invokes this\n * helper as it reaches them.\n */\nfunction expandArmPropertyPaths(node: CoreExpressionNode): CoreExpressionNode {\n if (node.kind !== \"property-access\") return node;\n\n const expandedBase = expandArmPropertyPaths(node.base);\n if (node.armPath !== undefined) {\n const path = node.armPath.length > 0 ? node.armPath : [node.property];\n let current: CoreExpressionNode = expandedBase;\n for (const segment of path) {\n // A flattened optional property may be absent at any wire-path segment.\n current = accessExpressionNode(current, segment, {\n nullish: node.nullish,\n });\n }\n return current;\n }\n if (expandedBase === node.base) return node;\n return { ...node, base: expandedBase };\n}\n\n// ---------------------------------------------------------------------------\n// Expression building: CDK value -> AST\n// ---------------------------------------------------------------------------\n\nfunction splitSymbolicPath(path: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let depth = 0;\n\n for (const character of path) {\n if (character === \".\" && depth === 0) {\n if (current.length > 0) {\n parts.push(current);\n current = \"\";\n }\n continue;\n }\n\n if (character === \"(\") {\n depth += 1;\n } else if (character === \")\") {\n depth -= 1;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n parts.push(current);\n }\n\n return parts;\n}\n\nfunction buildSymbolicPath(path: string): ExpressionNode {\n const parts = splitSymbolicPath(path);\n let current: ExpressionNode | undefined;\n\n for (const part of parts) {\n if (part.endsWith(\"()\")) {\n const target = part.slice(0, -2);\n const callNode: FunctionCallExpression = {\n kind: \"function-call\",\n target,\n args: [],\n };\n\n current =\n current === undefined\n ? callNode\n : {\n kind: \"instance-function-call\",\n base: current,\n name: target,\n args: [],\n };\n continue;\n }\n\n current =\n current === undefined\n ? {\n kind: \"identifier\",\n id: part,\n }\n : {\n kind: \"property-access\",\n base: current,\n property: part,\n nullish: false,\n };\n }\n\n if (current === undefined) {\n throw new Error(`Cannot serialize empty symbolic path.`);\n }\n\n return current;\n}\n\nfunction buildPlainObject(\n value: { readonly [key: string]: ExpressionNodeInput | undefined },\n symbolMap: DeclarationSymbolMap,\n): ObjectValue {\n return {\n kind: \"object\",\n value: buildExpressionProperties(value, symbolMap),\n };\n}\n\n/** Builds a property map of expression nodes, omitting undefined values. */\nexport function buildExpressionProperties(\n value: { readonly [key: string]: ExpressionNodeInput | undefined },\n symbolMap: DeclarationSymbolMap,\n): Record<string, ExpressionNode> {\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, propertyValue]) =>\n propertyValue === undefined ? [] : [[key, buildExpression(propertyValue, symbolMap)]],\n ),\n );\n}\n\nfunction buildArray(\n value: readonly ExpressionNodeInput[],\n symbolMap: DeclarationSymbolMap,\n): ArrayValue {\n return {\n kind: \"array\",\n items: value.map((item) => buildExpression(item, symbolMap)),\n };\n}\n\nfunction isSerializableObject(\n value: ExpressionNodeInput,\n): value is { readonly [key: string]: ExpressionNodeInput | undefined } {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction buildIdentifierExpression(\n value: IdentifierExpressionNode,\n symbolMap: DeclarationSymbolMap,\n): ExpressionNode {\n if (typeof value.id === \"string\") {\n return {\n kind: \"identifier\",\n id: value.id,\n };\n }\n\n const identifier = symbolMap.get(value.id);\n\n if (identifier === undefined) {\n throw new Error(`Missing synthesized symbol for referenced resource type ${value.id.type}.`);\n }\n\n return {\n kind: \"identifier\",\n id: identifier,\n };\n}\n\nfunction isBicepIdentifierSegment(segment: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/u.test(segment);\n}\n\nfunction buildMemberAccessExpression(\n value: PropertyAccessExpressionNode | ArrayAccessExpressionNode,\n symbolMap: DeclarationSymbolMap,\n): ExpressionNode {\n const base = buildExpression(value.base, symbolMap);\n\n if (value.kind === \"property-access\") {\n return {\n kind: \"property-access\",\n base,\n property: value.property,\n nullish: value.nullish,\n };\n }\n\n if (typeof value.index === \"number\") {\n return {\n kind: \"array-access\",\n base,\n index: {\n kind: \"integer\",\n value: String(value.index),\n },\n nullish: value.nullish,\n fromEnd: value.fromEnd,\n };\n }\n\n if (typeof value.index === \"string\") {\n if (value.fromEnd) {\n throw new Error(\"Reverse indexing requires an integer index, not a string.\");\n }\n return isBicepIdentifierSegment(value.index)\n ? {\n kind: \"property-access\",\n base,\n property: value.index,\n nullish: value.nullish,\n }\n : {\n kind: \"array-access\",\n base,\n index: {\n kind: \"string\",\n value: value.index,\n },\n nullish: value.nullish,\n fromEnd: value.fromEnd,\n };\n }\n\n // Expression-shaped index (e.g. a loop's `.index` symbolic value or any\n // `Expression<number>` proxy). Recursively serialize into the wire\n // array-access's `index` slot.\n return {\n kind: \"array-access\",\n base,\n index: buildExpression(value.index as ExpressionNodeInput, symbolMap),\n nullish: value.nullish,\n fromEnd: value.fromEnd,\n };\n}\n\nexport function moduleOutputExpression(moduleName: string, outputName: string): ExpressionNode {\n return {\n kind: \"property-access\",\n base: {\n kind: \"property-access\",\n base: { kind: \"identifier\", id: moduleName },\n property: \"outputs\",\n nullish: false,\n },\n property: outputName,\n nullish: false,\n };\n}\n\nexport function buildExpression(\n value: ExpressionNodeInput,\n symbolMap: DeclarationSymbolMap = new Map(),\n): ExpressionNode {\n if (isExpression(value)) {\n return buildExpression(unwrapExpression(value) as ExpressionNodeInput, symbolMap);\n }\n\n // Expand the current property paths; recursion below visits other expressions.\n if (value !== null && typeof value === \"object\" && isExpressionNode(value)) {\n const expanded = expandArmPropertyPaths(value as CoreExpressionNode);\n if (expanded !== value) {\n return buildExpression(expanded as ExpressionNodeInput, symbolMap);\n }\n }\n\n if (typeof value === \"string\") {\n return {\n kind: \"string\",\n value,\n };\n }\n\n if (typeof value === \"number\") {\n if (!Number.isInteger(value)) {\n throw new Error(`Bicep serialization currently only supports integer numbers.`);\n }\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Bicep serialization currently only supports safe integer numbers.`);\n }\n\n return {\n kind: \"integer\",\n value: String(value),\n };\n }\n\n if (typeof value === \"boolean\") {\n return {\n kind: \"boolean\",\n value,\n };\n }\n\n if (value === null) {\n return {\n kind: \"null\",\n value: null,\n };\n }\n\n if (Array.isArray(value)) {\n return buildArray(value, symbolMap);\n }\n\n if (isExpressionNode(value)) {\n switch (value.kind) {\n case \"binary\":\n return {\n kind: \"binary-operation\",\n operator: value.operator,\n left: buildExpression(value.left as ExpressionNodeInput, symbolMap),\n right: buildExpression(value.right as ExpressionNodeInput, symbolMap),\n };\n\n case \"unary\":\n return {\n kind: \"unary-operation\",\n operator: value.operator,\n argument: buildExpression(value.argument as ExpressionNodeInput, symbolMap),\n };\n\n case \"ternary\":\n return {\n kind: \"ternary-operation\",\n condition: buildExpression(value.condition as ExpressionNodeInput, symbolMap),\n trueValue: buildExpression(value.trueValue as ExpressionNodeInput, symbolMap),\n falseValue: buildExpression(value.falseValue as ExpressionNodeInput, symbolMap),\n };\n\n case \"fn-call\":\n return {\n kind: \"function-call\",\n target: value.operator,\n args: value.args.map((argument) =>\n buildExpression(argument as ExpressionNodeInput, symbolMap),\n ),\n };\n\n case \"instance-function-call\":\n return {\n kind: \"instance-function-call\",\n base: buildExpression(value.base as ExpressionNodeInput, symbolMap),\n name: value.name,\n args: value.args.map((argument) =>\n buildExpression(argument as ExpressionNodeInput, symbolMap),\n ),\n };\n\n case \"interpolated-string\":\n return {\n kind: \"interpolated-string\",\n segments: value.segments.map((segment) =>\n buildExpression(segment as ExpressionNodeInput, symbolMap),\n ),\n };\n\n case \"identifier\":\n return buildIdentifierExpression(value, symbolMap);\n\n case \"property-access\":\n case \"array-access\":\n return buildMemberAccessExpression(value, symbolMap);\n\n case \"symbolic-value\": {\n const identifier = symbolMap.get(value);\n return identifier === undefined\n ? buildSymbolicPath(value.path)\n : { kind: \"identifier\", id: identifier };\n }\n }\n }\n\n if (isSerializableObject(value)) {\n return buildPlainObject(value, symbolMap);\n }\n\n throw new Error(`Unsupported serialization input.`);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { type Expression } from "../../expression/expressions.js";
2
+ import type { LoopedResource, Resource } from "../../constructs/resource/resource.js";
3
+ import type { ExpressionNode } from "./index.js";
4
+ type SymbolValue = Expression<unknown> | Resource | LoopedResource<Resource>;
5
+ export type DeclarationReferenceMap = Map<string, SymbolValue>;
6
+ export declare function restoreExpression(node: ExpressionNode, symbols: DeclarationReferenceMap): unknown;
7
+ export {};
8
+ //# sourceMappingURL=expression-restorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-restorer.d.ts","sourceRoot":"","sources":["../../../../src/serialization/ast/expression-restorer.ts"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,KAAK,EAEV,cAAc,EAGf,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;AAC7E,MAAM,MAAM,uBAAuB,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAM/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,uBAAuB,GAAG,OAAO,CA0LjG"}
@@ -0,0 +1,162 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+ import { arrayAccessExpressionNode, functionCallExpressionNode, identifierExpressionNode, instanceFunctionCallExpressionNode, propertyAccessExpressionNode, } from "../../expression/ast-nodes.js";
4
+ import { isExpression, unwrapExpression, wrapExpression, } from "../../expression/expressions.js";
5
+ import { isResource, isLoopedResource } from "../../constructs/resource/resource-utils.js";
6
+ // ---------------------------------------------------------------------------
7
+ // Expression restoration: AST -> CDK value
8
+ // ---------------------------------------------------------------------------
9
+ export function restoreExpression(node, symbols) {
10
+ switch (node.kind) {
11
+ case "string":
12
+ return node.value;
13
+ case "integer": {
14
+ const value = parseInt(node.value, 10);
15
+ if (!Number.isSafeInteger(value)) {
16
+ throw new Error(`Cannot deserialize unsafe integer literal "${node.value}".`);
17
+ }
18
+ return value;
19
+ }
20
+ case "boolean":
21
+ return node.value;
22
+ case "null":
23
+ return null;
24
+ case "identifier": {
25
+ const sym = symbols.get(node.id);
26
+ if (sym !== undefined)
27
+ return sym;
28
+ return wrapExpression(identifierExpressionNode(node.id));
29
+ }
30
+ case "function-call":
31
+ if (typeof node.target !== "string") {
32
+ throw new Error("Cannot deserialize function call with an expression target.");
33
+ }
34
+ return wrapExpression(functionCallExpressionNode(node.target, node.args.map((a) => restoreExpression(a, symbols))));
35
+ case "instance-function-call": {
36
+ const base = restoreExpression(node.base, symbols);
37
+ const baseNode = isExpression(base)
38
+ ? unwrapExpression(base)
39
+ : identifierExpressionNode(isResource(base) ? base : String(base));
40
+ return wrapExpression(instanceFunctionCallExpressionNode(baseNode, node.name, node.args.map((a) => restoreExpression(a, symbols))));
41
+ }
42
+ case "property-access": {
43
+ const base = restoreExpression(node.base, symbols);
44
+ if (isResource(base)) {
45
+ if (node.nullish) {
46
+ return wrapExpression(propertyAccessExpressionNode(identifierExpressionNode(base), node.property, {
47
+ nullish: node.nullish,
48
+ }));
49
+ }
50
+ return base[node.property];
51
+ }
52
+ if (isExpression(base)) {
53
+ const inner = unwrapExpression(base);
54
+ return wrapExpression(propertyAccessExpressionNode(inner, node.property, {
55
+ nullish: node.nullish,
56
+ }));
57
+ }
58
+ return wrapExpression(propertyAccessExpressionNode(identifierExpressionNode(String(base)), node.property, {
59
+ nullish: node.nullish,
60
+ }));
61
+ }
62
+ case "array-access": {
63
+ const base = restoreExpression(node.base, symbols);
64
+ // Preserve non-literal indexes as expressions so `sym[<expr>]` round-
65
+ // trips faithfully. Literal integer/string indexes lower to native
66
+ // JS number/string values as before.
67
+ let idx;
68
+ if (node.index.kind === "integer") {
69
+ idx = parseInt(node.index.value, 10);
70
+ }
71
+ else if (node.index.kind === "string") {
72
+ idx = node.index.value;
73
+ }
74
+ else {
75
+ const deserializedIndex = restoreExpression(node.index, symbols);
76
+ idx = isExpression(deserializedIndex)
77
+ ? unwrapExpression(deserializedIndex)
78
+ : deserializedIndex;
79
+ }
80
+ if (isResource(base)) {
81
+ if (node.nullish || node.fromEnd) {
82
+ return wrapExpression(arrayAccessExpressionNode(identifierExpressionNode(base), idx, {
83
+ nullish: node.nullish,
84
+ fromEnd: node.fromEnd,
85
+ }));
86
+ }
87
+ return base[String(idx)];
88
+ }
89
+ if (isLoopedResource(base)) {
90
+ // `sym[idx]` on a looped declaration. Carry the handle itself as the
91
+ // identifier id (not `String(base)`, which would stringify to
92
+ // "[object Object]") so re-serialize maps it back to the resource's
93
+ // symbol. The resulting expression proxy lets an outer `.prop` chain
94
+ // (e.g. `looped.at(0).id`) render as `sym[idx].prop`.
95
+ return wrapExpression(arrayAccessExpressionNode(identifierExpressionNode(base), idx, {
96
+ nullish: node.nullish,
97
+ fromEnd: node.fromEnd,
98
+ }));
99
+ }
100
+ if (isExpression(base)) {
101
+ const inner = unwrapExpression(base);
102
+ return wrapExpression(arrayAccessExpressionNode(inner, idx, {
103
+ nullish: node.nullish,
104
+ fromEnd: node.fromEnd,
105
+ }));
106
+ }
107
+ return wrapExpression(arrayAccessExpressionNode(identifierExpressionNode(String(base)), idx, {
108
+ nullish: node.nullish,
109
+ fromEnd: node.fromEnd,
110
+ }));
111
+ }
112
+ case "object": {
113
+ const obj = Object.create(null);
114
+ for (const [key, value] of Object.entries(node.value)) {
115
+ Object.defineProperty(obj, key, {
116
+ value: restoreExpression(value, symbols),
117
+ enumerable: true,
118
+ configurable: true,
119
+ writable: true,
120
+ });
121
+ }
122
+ return obj;
123
+ }
124
+ case "array":
125
+ return node.items.map((item) => restoreExpression(item, symbols));
126
+ case "binary-operation": {
127
+ const operation = node;
128
+ return wrapExpression({
129
+ kind: "binary",
130
+ operator: operation.operator,
131
+ left: restoreExpression(operation.left, symbols),
132
+ right: restoreExpression(operation.right, symbols),
133
+ });
134
+ }
135
+ case "unary-operation": {
136
+ const operation = node;
137
+ return wrapExpression({
138
+ kind: "unary",
139
+ operator: operation.operator,
140
+ argument: restoreExpression(operation.argument, symbols),
141
+ });
142
+ }
143
+ case "ternary-operation": {
144
+ const operation = node;
145
+ return wrapExpression({
146
+ kind: "ternary",
147
+ condition: restoreExpression(operation.condition, symbols),
148
+ trueValue: restoreExpression(operation.trueValue, symbols),
149
+ falseValue: restoreExpression(operation.falseValue, symbols),
150
+ });
151
+ }
152
+ case "interpolated-string": {
153
+ return wrapExpression({
154
+ kind: "interpolated-string",
155
+ segments: node.segments.map((segment) => restoreExpression(segment, symbols)),
156
+ });
157
+ }
158
+ default:
159
+ throw new Error(`Unsupported expression node kind: ${node.kind}`);
160
+ }
161
+ }
162
+ //# sourceMappingURL=expression-restorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-restorer.js","sourceRoot":"","sources":["../../../../src/serialization/ast/expression-restorer.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport {\n arrayAccessExpressionNode,\n functionCallExpressionNode,\n identifierExpressionNode,\n instanceFunctionCallExpressionNode,\n propertyAccessExpressionNode,\n type ArrayAccessIndex,\n type BinaryExpressionNode,\n type ExpressionNode as CoreExpressionNode,\n type TernaryExpressionNode,\n type UnaryExpressionNode,\n} from \"../../expression/ast-nodes.js\";\nimport {\n isExpression,\n unwrapExpression,\n wrapExpression,\n type Expression,\n} from \"../../expression/expressions.js\";\nimport { isResource, isLoopedResource } from \"../../constructs/resource/resource-utils.js\";\nimport type { LoopedResource, Resource } from \"../../constructs/resource/resource.js\";\nimport type {\n BinaryOperationExpression,\n ExpressionNode,\n TernaryOperationExpression,\n UnaryOperationExpression,\n} from \"./index.js\";\n\ntype SymbolValue = Expression<unknown> | Resource | LoopedResource<Resource>;\nexport type DeclarationReferenceMap = Map<string, SymbolValue>;\n\n// ---------------------------------------------------------------------------\n// Expression restoration: AST -> CDK value\n// ---------------------------------------------------------------------------\n\nexport function restoreExpression(node: ExpressionNode, symbols: DeclarationReferenceMap): unknown {\n switch (node.kind) {\n case \"string\":\n return node.value;\n case \"integer\": {\n const value = parseInt(node.value, 10);\n if (!Number.isSafeInteger(value)) {\n throw new Error(`Cannot deserialize unsafe integer literal \"${node.value}\".`);\n }\n return value;\n }\n case \"boolean\":\n return node.value;\n case \"null\":\n return null;\n\n case \"identifier\": {\n const sym = symbols.get(node.id);\n if (sym !== undefined) return sym;\n return wrapExpression(identifierExpressionNode(node.id));\n }\n\n case \"function-call\":\n if (typeof node.target !== \"string\") {\n throw new Error(\"Cannot deserialize function call with an expression target.\");\n }\n return wrapExpression(\n functionCallExpressionNode(\n node.target,\n node.args.map((a) => restoreExpression(a, symbols)),\n ),\n );\n\n case \"instance-function-call\": {\n const base = restoreExpression(node.base, symbols);\n const baseNode = isExpression(base)\n ? unwrapExpression(base as Expression<unknown>)\n : identifierExpressionNode(isResource(base) ? base : String(base));\n return wrapExpression(\n instanceFunctionCallExpressionNode(\n baseNode,\n node.name,\n node.args.map((a) => restoreExpression(a, symbols)),\n ),\n );\n }\n\n case \"property-access\": {\n const base = restoreExpression(node.base, symbols);\n if (isResource(base)) {\n if (node.nullish) {\n return wrapExpression(\n propertyAccessExpressionNode(identifierExpressionNode(base), node.property, {\n nullish: node.nullish,\n }),\n );\n }\n return (base as unknown as Record<string, unknown>)[node.property];\n }\n if (isExpression(base)) {\n const inner = unwrapExpression(base as Expression<unknown>);\n return wrapExpression(\n propertyAccessExpressionNode(inner, node.property, {\n nullish: node.nullish,\n }),\n );\n }\n return wrapExpression(\n propertyAccessExpressionNode(identifierExpressionNode(String(base)), node.property, {\n nullish: node.nullish,\n }),\n );\n }\n\n case \"array-access\": {\n const base = restoreExpression(node.base, symbols);\n // Preserve non-literal indexes as expressions so `sym[<expr>]` round-\n // trips faithfully. Literal integer/string indexes lower to native\n // JS number/string values as before.\n let idx: ArrayAccessIndex;\n if (node.index.kind === \"integer\") {\n idx = parseInt(node.index.value, 10);\n } else if (node.index.kind === \"string\") {\n idx = node.index.value;\n } else {\n const deserializedIndex = restoreExpression(node.index, symbols);\n idx = isExpression(deserializedIndex)\n ? unwrapExpression(deserializedIndex as Expression<unknown>)\n : (deserializedIndex as ArrayAccessIndex);\n }\n if (isResource(base)) {\n if (node.nullish || node.fromEnd) {\n return wrapExpression(\n arrayAccessExpressionNode(identifierExpressionNode(base), idx, {\n nullish: node.nullish,\n fromEnd: node.fromEnd,\n }),\n );\n }\n return (base as unknown as Record<string, unknown>)[String(idx)];\n }\n if (isLoopedResource(base)) {\n // `sym[idx]` on a looped declaration. Carry the handle itself as the\n // identifier id (not `String(base)`, which would stringify to\n // \"[object Object]\") so re-serialize maps it back to the resource's\n // symbol. The resulting expression proxy lets an outer `.prop` chain\n // (e.g. `looped.at(0).id`) render as `sym[idx].prop`.\n return wrapExpression(\n arrayAccessExpressionNode(identifierExpressionNode(base as unknown as Resource), idx, {\n nullish: node.nullish,\n fromEnd: node.fromEnd,\n }),\n );\n }\n if (isExpression(base)) {\n const inner = unwrapExpression(base as Expression<unknown>);\n return wrapExpression(\n arrayAccessExpressionNode(inner, idx, {\n nullish: node.nullish,\n fromEnd: node.fromEnd,\n }),\n );\n }\n return wrapExpression(\n arrayAccessExpressionNode(identifierExpressionNode(String(base)), idx, {\n nullish: node.nullish,\n fromEnd: node.fromEnd,\n }),\n );\n }\n\n case \"object\": {\n const obj: Record<string, unknown> = Object.create(null);\n for (const [key, value] of Object.entries(node.value)) {\n Object.defineProperty(obj, key, {\n value: restoreExpression(value, symbols),\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n return obj;\n }\n\n case \"array\":\n return node.items.map((item) => restoreExpression(item, symbols));\n\n case \"binary-operation\": {\n const operation = node as BinaryOperationExpression;\n return wrapExpression({\n kind: \"binary\",\n operator: operation.operator,\n left: restoreExpression(operation.left, symbols),\n right: restoreExpression(operation.right, symbols),\n } as BinaryExpressionNode as CoreExpressionNode);\n }\n\n case \"unary-operation\": {\n const operation = node as UnaryOperationExpression;\n return wrapExpression({\n kind: \"unary\",\n operator: operation.operator,\n argument: restoreExpression(operation.argument, symbols),\n } as UnaryExpressionNode as CoreExpressionNode);\n }\n\n case \"ternary-operation\": {\n const operation = node as TernaryOperationExpression;\n return wrapExpression({\n kind: \"ternary\",\n condition: restoreExpression(operation.condition, symbols),\n trueValue: restoreExpression(operation.trueValue, symbols),\n falseValue: restoreExpression(operation.falseValue, symbols),\n } as TernaryExpressionNode as CoreExpressionNode);\n }\n\n case \"interpolated-string\": {\n return wrapExpression({\n kind: \"interpolated-string\",\n segments: node.segments.map((segment) => restoreExpression(segment, symbols)),\n } as CoreExpressionNode);\n }\n\n default:\n throw new Error(`Unsupported expression node kind: ${node.kind}`);\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import type { DeclarableBodyNode, DeclarationNode, ExpressionNode, ModuleDeclarationNode, OutputDeclarationNode, ParameterDeclarationNode, ResourceDeclarationNode, VariableDeclarationNode } from "./index.js";
2
+ /** An identifier-rooted access chain with its static path and original AST node. */
3
+ export interface ExpressionReference {
4
+ readonly identifier: string;
5
+ readonly path: readonly (string | number)[];
6
+ readonly expression: ExpressionNode;
7
+ }
8
+ export type ExpressionReferenceResolver = (reference: ExpressionReference) => ExpressionNode | undefined;
9
+ /**
10
+ * Replaces identifier access chains, preserving unchanged branches and ignoring
11
+ * loop-local references. The resolver receives the original expression.
12
+ */
13
+ export declare function rewriteExpressionReferences(expression: DeclarableBodyNode, resolve: ExpressionReferenceResolver): DeclarableBodyNode;
14
+ export declare function rewriteExpressionReferences(expression: ExpressionNode, resolve: ExpressionReferenceResolver): ExpressionNode;
15
+ type ExpressionRewriter = (expression: ExpressionNode) => ExpressionNode;
16
+ /**
17
+ * Applies an expression transformation to a declaration's value, default,
18
+ * decorators, and nested type decorators. The callback rewrites each complete
19
+ * expression subtree; recursive expression traversal is its responsibility.
20
+ * Unchanged branches are shared, and the input declaration is not mutated.
21
+ */
22
+ export declare function rewriteDeclarationExpressions(node: ResourceDeclarationNode, rewriteExpression: ExpressionRewriter): ResourceDeclarationNode;
23
+ export declare function rewriteDeclarationExpressions(node: ModuleDeclarationNode, rewriteExpression: ExpressionRewriter): ModuleDeclarationNode;
24
+ export declare function rewriteDeclarationExpressions(node: OutputDeclarationNode, rewriteExpression: ExpressionRewriter): OutputDeclarationNode;
25
+ export declare function rewriteDeclarationExpressions(node: ParameterDeclarationNode, rewriteExpression: ExpressionRewriter): ParameterDeclarationNode;
26
+ export declare function rewriteDeclarationExpressions(node: VariableDeclarationNode, rewriteExpression: ExpressionRewriter): VariableDeclarationNode;
27
+ export declare function rewriteDeclarationExpressions(node: DeclarationNode, rewriteExpression: ExpressionRewriter): DeclarationNode;
28
+ export {};
29
+ //# sourceMappingURL=expression-rewriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-rewriter.d.ts","sourceRoot":"","sources":["../../../../src/serialization/ast/expression-rewriter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAEf,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EAEvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;CACrC;AAED,MAAM,MAAM,2BAA2B,GAAG,CACxC,SAAS,EAAE,mBAAmB,KAC3B,cAAc,GAAG,SAAS,CAAC;AA2BhC;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,kBAAkB,EAC9B,OAAO,EAAE,2BAA2B,GACnC,kBAAkB,CAAC;AACtB,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,2BAA2B,GACnC,cAAc,CAAC;AAgHlB,KAAK,kBAAkB,GAAG,CAAC,UAAU,EAAE,cAAc,KAAK,cAAc,CAAC;AA+GzE;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,uBAAuB,EAC7B,iBAAiB,EAAE,kBAAkB,GACpC,uBAAuB,CAAC;AAC3B,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,qBAAqB,EAC3B,iBAAiB,EAAE,kBAAkB,GACpC,qBAAqB,CAAC;AACzB,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,qBAAqB,EAC3B,iBAAiB,EAAE,kBAAkB,GACpC,qBAAqB,CAAC;AACzB,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,wBAAwB,EAC9B,iBAAiB,EAAE,kBAAkB,GACpC,wBAAwB,CAAC;AAC5B,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,uBAAuB,EAC7B,iBAAiB,EAAE,kBAAkB,GACpC,uBAAuB,CAAC;AAC3B,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,eAAe,EACrB,iBAAiB,EAAE,kBAAkB,GACpC,eAAe,CAAC"}