@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
@@ -1,36 +1,45 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
+ import { RegExpParser } from "@eslint-community/regexpp";
4
+ import { isExpression, unwrapExpression } from "../expression/expressions.js";
3
5
  import { concat, subscription, toLower, uniqueString } from "../fn.js";
4
- import { MOST_RESTRICTIVE } from "./naming-rules.js";
6
+ import { DEFAULT_NAMING_RULES } from "./naming-rules.js";
7
+ import { assertValidResourceName } from "./name-validation.js";
5
8
  /**
6
9
  * Default workload-based naming policy.
7
10
  *
8
11
  * Generates names by composing the resource type abbreviation, workload,
9
12
  * environment, region, label, and an ordinal suffix for repeated types.
10
13
  * Global-scope resources get a `uniqueString(subscription().subscriptionId)`
11
- * suffix to ensure uniqueness.
14
+ * suffix to reduce name collisions; Azure name availability is not checked.
12
15
  */
13
16
  export class DefaultNamingPolicy {
14
17
  #options;
15
18
  #ordinals = new Map();
19
+ #names = new Map();
16
20
  constructor(options) {
17
21
  this.#options = options;
18
22
  }
19
23
  generateName(context) {
20
- const ordinal = this.#ordinals.get(context.type) ?? 0;
21
- this.#ordinals.set(context.type, ordinal + 1);
22
24
  const rules = context.rules;
23
- const sep = rules.validCharacters.hyphens ? "-" : "";
25
+ const nameSegments = context.nameSegments ?? rules.nameSegments ?? 1;
26
+ if (!Number.isSafeInteger(nameSegments) || nameSegments < 1) {
27
+ throw new Error("Resource naming segment count must be a positive safe integer.");
28
+ }
29
+ if (nameSegments > 1) {
30
+ throw new Error(`Resource '${context.type}' requires an explicit ${nameSegments}-segment name including its undeclared ancestors.`);
31
+ }
32
+ const ordinal = this.#ordinals.get(context.type) ?? 0;
33
+ const alphabet = getNamingAlphabet(rules);
34
+ const sep = rules.separator ?? (alphabet.includes("-") ? "-" : "");
35
+ if ([...sep].some((character) => !alphabet.includes(character))) {
36
+ throw new Error(`Cannot generate a compliant name for '${context.type}': separator '${sep}' is incompatible with its naming rules.`);
37
+ }
24
38
  const sanitize = (segment) => {
25
- let value = segment;
26
- if (!rules.validCharacters.hyphens)
27
- value = value.replace(/-/gu, "");
28
- if (!rules.validCharacters.underscores)
29
- value = value.replace(/_/gu, "");
30
- if (!rules.validCharacters.periods)
31
- value = value.replace(/\./gu, "");
32
- value = value.replace(/[^A-Za-z0-9._-]/gu, "");
33
- return rules.validCharacters.uppercase ? value : value.toLowerCase();
39
+ return [...segment]
40
+ .map((character) => (alphabet.includes(character) ? character : character.toLowerCase()))
41
+ .filter((character) => alphabet.includes(character))
42
+ .join("");
34
43
  };
35
44
  const segments = [];
36
45
  if (rules.abbreviation) {
@@ -47,23 +56,61 @@ export class DefaultNamingPolicy {
47
56
  segments.push(sanitize(context.label));
48
57
  }
49
58
  const ordinalSuffix = ordinal > 0 ? String(ordinal + 1) : "";
50
- const base = segments.filter(Boolean).join(sep);
59
+ let base = segments.filter(Boolean).join(sep);
60
+ const startingAlphabet = getNamingAlphabet(rules, "start");
61
+ const endingAlphabet = getNamingAlphabet(rules, "end");
62
+ const padding = startingAlphabet[0];
63
+ if (padding === undefined || endingAlphabet.length === 0) {
64
+ throw new Error(`Cannot generate a compliant name for '${context.type}': no supported generation alphabet. Provide an explicit name.`);
65
+ }
66
+ if (base.length > 0 && !startingAlphabet.includes(base[0])) {
67
+ base = padding + base;
68
+ }
69
+ // This is a convention budget when TypeSpec supplies no maximum, not a
70
+ // constraint imposed on explicit names.
71
+ const maxLength = rules.maxLength ?? Math.max(24, rules.minLength ?? 0);
72
+ const minLength = rules.minLength ?? 1;
51
73
  const truncateWithOrdinal = (available) => {
52
74
  const ordinalPrefix = ordinalSuffix ? sep : "";
53
- const baseLimit = Math.max(0, available - ordinalPrefix.length - ordinalSuffix.length);
75
+ const baseLimit = available - ordinalPrefix.length - ordinalSuffix.length;
76
+ if (baseLimit < 1) {
77
+ throw new Error(`Cannot generate a compliant name for '${context.type}': maximum length ${maxLength} cannot accommodate the required suffixes. Provide an explicit name.`);
78
+ }
54
79
  return `${base.slice(0, baseLimit)}${ordinalPrefix}${ordinalSuffix}`;
55
80
  };
81
+ let name;
56
82
  if (rules.scope === "global") {
57
83
  // Bicep uniqueString() always returns 13 characters. Reserve that suffix
58
84
  // and the ordinal before truncating so repeated resources stay unique.
59
85
  const uniqueSuffixLength = 13;
60
- const prefix = truncateWithOrdinal(rules.maxLength - sep.length - uniqueSuffixLength);
61
- const full = concat(prefix + sep, uniqueString(subscription().subscriptionId));
62
- return rules.validCharacters.uppercase ? full : toLower(full);
86
+ const prefixBudget = maxLength - sep.length - uniqueSuffixLength;
87
+ base = base.padEnd(Math.max(1, minLength - sep.length - uniqueSuffixLength), padding);
88
+ let prefix = truncateWithOrdinal(prefixBudget);
89
+ if (sep && prefix.endsWith(sep)) {
90
+ prefix = prefix.slice(0, -sep.length).padEnd(1, padding);
91
+ }
92
+ prefix = prefix.padEnd(Math.max(1, minLength - sep.length - uniqueSuffixLength), padding);
93
+ name = concat(prefix + sep, uniqueString(subscription().subscriptionId));
94
+ if (!alphabet.includes("A"))
95
+ name = toLower(name);
96
+ }
97
+ else {
98
+ base = base.padEnd(minLength, padding);
99
+ let truncated = truncateWithOrdinal(maxLength);
100
+ if (!endingAlphabet.includes(truncated.at(-1))) {
101
+ truncated = truncated.slice(0, -1) + endingAlphabet[0];
102
+ }
103
+ name = truncated;
63
104
  }
64
- // Non-global scope: no uniqueString needed, plain string is fine
65
- const truncated = truncateWithOrdinal(rules.maxLength);
66
- return rules.validCharacters.uppercase ? truncated : truncated.toLowerCase();
105
+ const key = JSON.stringify(name, (_key, value) => isExpression(value) ? unwrapExpression(value) : value);
106
+ const names = this.#names.get(context.type) ?? new Set();
107
+ if (names.has(key)) {
108
+ throw new Error(`Cannot generate a distinct name for '${context.type}' within its naming rules. Provide an explicit name.`);
109
+ }
110
+ names.add(key);
111
+ this.#names.set(context.type, names);
112
+ this.#ordinals.set(context.type, ordinal + 1);
113
+ return name;
67
114
  }
68
115
  }
69
116
  /**
@@ -79,19 +126,105 @@ export const namingRequiredPolicy = {
79
126
  },
80
127
  };
81
128
  /**
82
- * Resolves the Azure resource name for a resource instance.
83
- *
84
- * - If `name` is explicitly provided (string or expression), it is used
85
- * as-is — the naming policy does not transform it.
86
- * - Otherwise, the active naming policy generates a name.
129
+ * Generates and validates a name at the resource construction boundary.
130
+ * Explicit constructor names are validated before declaration registration.
87
131
  */
88
- export function resolveResourceName(policy, name, type, namingRules) {
89
- if (name !== undefined) {
90
- return name;
91
- }
92
- return policy.generateName({
132
+ export function generateResourceName(policy, type, namingRules, nameSegments) {
133
+ const rules = namingRules ?? DEFAULT_NAMING_RULES;
134
+ const generated = policy.generateName({
93
135
  type,
94
- rules: namingRules ?? MOST_RESTRICTIVE,
136
+ rules,
137
+ nameSegments: nameSegments ?? rules.nameSegments,
138
+ });
139
+ assertValidResourceName(generated, type, rules, {
140
+ generated: true,
95
141
  });
142
+ return generated;
143
+ }
144
+ const NAME_ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._";
145
+ const patternParser = new RegExpParser();
146
+ /**
147
+ * Selects generation tokens from a parsed regex AST. Shapes outside the
148
+ * workload-based convention remain usable for literal-name validation.
149
+ */
150
+ function getPatternTokens(regex) {
151
+ const pattern = patternParser.parsePattern(regex);
152
+ if (pattern.alternatives.length !== 1)
153
+ return undefined;
154
+ const elements = pattern.alternatives[0].elements;
155
+ const start = elements[0];
156
+ const end = elements.at(-1);
157
+ if (start?.type !== "Assertion" || start.kind !== "start")
158
+ return undefined;
159
+ const anchored = end?.type === "Assertion" && end.kind === "end";
160
+ const body = elements.slice(1, anchored ? -1 : undefined);
161
+ const [head, tail] = body;
162
+ // Prefer the separator-free sublanguage of repeated hyphen-separated classes.
163
+ if (body.length === 2 &&
164
+ head?.type === "Quantifier" &&
165
+ head.min === 1 &&
166
+ head.max === Infinity &&
167
+ head.element.type === "CharacterClass" &&
168
+ tail?.type === "Quantifier" &&
169
+ tail.min === 0 &&
170
+ tail.max === Infinity &&
171
+ (tail.element.type === "Group" || tail.element.type === "CapturingGroup") &&
172
+ tail.element.alternatives.length === 1) {
173
+ const repeated = tail.element.alternatives[0].elements;
174
+ const [separator, part] = repeated;
175
+ if (repeated.length === 2 &&
176
+ separator?.type === "Character" &&
177
+ separator.value === 45 &&
178
+ part?.type === "Quantifier" &&
179
+ part.min === 1 &&
180
+ part.max === Infinity &&
181
+ part.element.raw === head.element.raw) {
182
+ return [
183
+ { characters: new RegExp(`^(?:${head.element.raw})$`), min: 1 },
184
+ ...(anchored ? [] : [{ characters: /^.$/, min: 0 }]),
185
+ ];
186
+ }
187
+ }
188
+ if (!anchored)
189
+ return undefined;
190
+ const tokens = [];
191
+ for (const element of body) {
192
+ if (element.type === "Quantifier" && element.max === 0)
193
+ continue;
194
+ const atom = element.type === "Quantifier" ? element.element : element;
195
+ if (atom.type !== "Character" &&
196
+ atom.type !== "CharacterClass" &&
197
+ atom.type !== "CharacterSet") {
198
+ return undefined;
199
+ }
200
+ tokens.push({
201
+ characters: new RegExp(`^(?:${atom.raw})$`),
202
+ min: element.type === "Quantifier" ? element.min : 1,
203
+ });
204
+ if (tokens.length > 128)
205
+ return undefined;
206
+ }
207
+ return tokens;
208
+ }
209
+ /**
210
+ * Selects candidate characters for sanitization, padding, and boundary repair.
211
+ * Candidates are not a validity guarantee; the complete name is still checked.
212
+ */
213
+ function getNamingAlphabet(rules, boundary) {
214
+ const alphabet = rules.pattern !== undefined
215
+ ? NAME_ALPHABET
216
+ : "abcdefghijklmnopqrstuvwxyz0123456789" + (rules.separator ?? "");
217
+ if (rules.pattern === undefined || rules.pattern.regex === "") {
218
+ return alphabet;
219
+ }
220
+ const tokens = getPatternTokens(rules.pattern.regex);
221
+ if (tokens === undefined)
222
+ return alphabet.replace(/[A-Z._-]/g, "");
223
+ const ordered = boundary === "end" ? [...tokens].reverse() : tokens;
224
+ const firstRequired = ordered.findIndex((token) => token.min > 0);
225
+ const candidates = boundary === undefined || firstRequired < 0 ? ordered : ordered.slice(0, firstRequired + 1);
226
+ return [...alphabet]
227
+ .filter((character) => candidates.some((token) => token.characters.test(character)))
228
+ .join("");
96
229
  }
97
230
  //# sourceMappingURL=naming-policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming-policy.js","sourceRoot":"","sources":["../../../src/naming/naming-policy.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAA4B,MAAM,mBAAmB,CAAC;AA8B/E;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAmB;IACrB,QAAQ,CAAsB;IAC9B,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C,YAAY,OAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,YAAY,CAAC,OAAsB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAE9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAErD,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAU,EAAE;YAC3C,IAAI,KAAK,GAAG,OAAO,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO;gBAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW;gBAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO;gBAAE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvE,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,aAAa,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEhD,MAAM,mBAAmB,GAAG,CAAC,SAAiB,EAAU,EAAE;YACxD,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACvF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;QACvE,CAAC,CAAC;QAEF,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC7B,yEAAyE;YACzE,uEAAuE;YACvE,MAAM,kBAAkB,GAAG,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/E,OAAO,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QAED,iEAAiE;QACjE,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IAC/E,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAiB;IAChD,YAAY,CAAC,OAAsB;QACjC,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,CAAC,IAAI,gCAAgC;YAC/D,0CAA0C,CAC7C,CAAC;IACJ,CAAC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAoB,EACpB,IAA2C,EAC3C,IAAY,EACZ,WAA4C;IAE5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,YAAY,CAAC;QACzB,IAAI;QACJ,KAAK,EAAE,WAAW,IAAI,gBAAgB;KACvC,CAAC,CAAC;AACL,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ExpressionOrValue } from \"../expression/expressions.js\";\nimport { concat, subscription, toLower, uniqueString } from \"../fn.js\";\nimport { MOST_RESTRICTIVE, type ResourceNamingRules } from \"./naming-rules.js\";\n\nexport interface NamingContext {\n readonly type: string;\n readonly rules: ResourceNamingRules;\n readonly label?: string | undefined;\n}\n\n/**\n * Strategy for generating Azure resource names when a resource is created\n * without an explicit `name`.\n *\n * Implement this interface to provide a custom naming convention. Two\n * built-in implementations are provided:\n *\n * - {@link DefaultNamingPolicy} — workload-based names with abbreviations,\n * ordinals, and `uniqueString()` for globally-scoped resources.\n * - {@link namingRequiredPolicy} — a singleton that throws if a resource\n * doesn't provide an explicit `name`.\n */\nexport interface NamingPolicy {\n generateName(context: NamingContext): ExpressionOrValue<string>;\n}\n\nexport interface NamingPolicyOptions {\n readonly workload: string;\n readonly environment?: string | undefined;\n readonly region?: string | undefined;\n}\n\n/**\n * Default workload-based naming policy.\n *\n * Generates names by composing the resource type abbreviation, workload,\n * environment, region, label, and an ordinal suffix for repeated types.\n * Global-scope resources get a `uniqueString(subscription().subscriptionId)`\n * suffix to ensure uniqueness.\n */\nexport class DefaultNamingPolicy implements NamingPolicy {\n readonly #options: NamingPolicyOptions;\n readonly #ordinals = new Map<string, number>();\n\n constructor(options: NamingPolicyOptions) {\n this.#options = options;\n }\n\n generateName(context: NamingContext): ExpressionOrValue<string> {\n const ordinal = this.#ordinals.get(context.type) ?? 0;\n this.#ordinals.set(context.type, ordinal + 1);\n\n const rules = context.rules;\n const sep = rules.validCharacters.hyphens ? \"-\" : \"\";\n\n const sanitize = (segment: string): string => {\n let value = segment;\n if (!rules.validCharacters.hyphens) value = value.replace(/-/gu, \"\");\n if (!rules.validCharacters.underscores) value = value.replace(/_/gu, \"\");\n if (!rules.validCharacters.periods) value = value.replace(/\\./gu, \"\");\n value = value.replace(/[^A-Za-z0-9._-]/gu, \"\");\n return rules.validCharacters.uppercase ? value : value.toLowerCase();\n };\n\n const segments: string[] = [];\n if (rules.abbreviation) {\n segments.push(sanitize(rules.abbreviation));\n }\n segments.push(sanitize(this.#options.workload));\n if (this.#options.environment) {\n segments.push(sanitize(this.#options.environment));\n }\n if (this.#options.region) {\n segments.push(sanitize(this.#options.region));\n }\n if (context.label) {\n segments.push(sanitize(context.label));\n }\n const ordinalSuffix = ordinal > 0 ? String(ordinal + 1) : \"\";\n const base = segments.filter(Boolean).join(sep);\n\n const truncateWithOrdinal = (available: number): string => {\n const ordinalPrefix = ordinalSuffix ? sep : \"\";\n const baseLimit = Math.max(0, available - ordinalPrefix.length - ordinalSuffix.length);\n return `${base.slice(0, baseLimit)}${ordinalPrefix}${ordinalSuffix}`;\n };\n\n if (rules.scope === \"global\") {\n // Bicep uniqueString() always returns 13 characters. Reserve that suffix\n // and the ordinal before truncating so repeated resources stay unique.\n const uniqueSuffixLength = 13;\n const prefix = truncateWithOrdinal(rules.maxLength - sep.length - uniqueSuffixLength);\n const full = concat(prefix + sep, uniqueString(subscription().subscriptionId));\n return rules.validCharacters.uppercase ? full : toLower(full);\n }\n\n // Non-global scope: no uniqueString needed, plain string is fine\n const truncated = truncateWithOrdinal(rules.maxLength);\n return rules.validCharacters.uppercase ? truncated : truncated.toLowerCase();\n }\n}\n\n/**\n * Naming policy that requires every resource to provide an explicit `name`.\n *\n * Throws an error when asked to generate a name. Use this on a stack to\n * disable auto-naming entirely.\n */\nexport const namingRequiredPolicy: NamingPolicy = {\n generateName(context: NamingContext): ExpressionOrValue<string> {\n throw new Error(\n `Resource of type '${context.type}' requires an explicit 'name' ` +\n `(the stack uses 'namingRequiredPolicy').`,\n );\n },\n};\n\n/**\n * Resolves the Azure resource name for a resource instance.\n *\n * - If `name` is explicitly provided (string or expression), it is used\n * as-is — the naming policy does not transform it.\n * - Otherwise, the active naming policy generates a name.\n */\nexport function resolveResourceName(\n policy: NamingPolicy,\n name: ExpressionOrValue<string> | undefined,\n type: string,\n namingRules: ResourceNamingRules | undefined,\n): ExpressionOrValue<string> {\n if (name !== undefined) {\n return name;\n }\n return policy.generateName({\n type,\n rules: namingRules ?? MOST_RESTRICTIVE,\n });\n}\n"]}
1
+ {"version":3,"file":"naming-policy.js","sourceRoot":"","sources":["../../../src/naming/naming-policy.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { RegExpParser } from \"@eslint-community/regexpp\";\nimport type { ExpressionOrValue } from \"../expression/expressions.js\";\nimport { isExpression, unwrapExpression } from \"../expression/expressions.js\";\nimport { concat, subscription, toLower, uniqueString } from \"../fn.js\";\nimport { DEFAULT_NAMING_RULES, type ResourceNamingRules } from \"./naming-rules.js\";\nimport { assertValidResourceName } from \"./name-validation.js\";\n\nexport interface NamingContext {\n readonly type: string;\n readonly rules: ResourceNamingRules;\n /** Required name segments relative to the actual declaration parent. */\n readonly nameSegments?: number | undefined;\n readonly label?: string | undefined;\n}\n\n/**\n * Strategy for generating Azure resource names when a resource is created\n * without an explicit `name`.\n *\n * Implement this interface to provide a custom naming convention. Two\n * built-in implementations are provided:\n *\n * - {@link DefaultNamingPolicy} — workload-based names with abbreviations,\n * ordinals, and `uniqueString()` for globally-scoped resources.\n * - {@link namingRequiredPolicy} — a singleton that throws if a resource\n * doesn't provide an explicit `name`.\n */\nexport interface NamingPolicy {\n /** Produces a candidate; resource construction validates the returned name. */\n generateName(context: NamingContext): ExpressionOrValue<string>;\n}\n\nexport interface NamingPolicyOptions {\n readonly workload: string;\n readonly environment?: string | undefined;\n readonly region?: string | undefined;\n}\n\n/**\n * Default workload-based naming policy.\n *\n * Generates names by composing the resource type abbreviation, workload,\n * environment, region, label, and an ordinal suffix for repeated types.\n * Global-scope resources get a `uniqueString(subscription().subscriptionId)`\n * suffix to reduce name collisions; Azure name availability is not checked.\n */\nexport class DefaultNamingPolicy implements NamingPolicy {\n readonly #options: NamingPolicyOptions;\n readonly #ordinals = new Map<string, number>();\n readonly #names = new Map<string, Set<string>>();\n\n constructor(options: NamingPolicyOptions) {\n this.#options = options;\n }\n\n generateName(context: NamingContext): ExpressionOrValue<string> {\n const rules = context.rules;\n const nameSegments = context.nameSegments ?? rules.nameSegments ?? 1;\n if (!Number.isSafeInteger(nameSegments) || nameSegments < 1) {\n throw new Error(\"Resource naming segment count must be a positive safe integer.\");\n }\n if (nameSegments > 1) {\n throw new Error(\n `Resource '${context.type}' requires an explicit ${nameSegments}-segment name including its undeclared ancestors.`,\n );\n }\n const ordinal = this.#ordinals.get(context.type) ?? 0;\n const alphabet = getNamingAlphabet(rules);\n const sep = rules.separator ?? (alphabet.includes(\"-\") ? \"-\" : \"\");\n if ([...sep].some((character) => !alphabet.includes(character))) {\n throw new Error(\n `Cannot generate a compliant name for '${context.type}': separator '${sep}' is incompatible with its naming rules.`,\n );\n }\n const sanitize = (segment: string): string => {\n return [...segment]\n .map((character) => (alphabet.includes(character) ? character : character.toLowerCase()))\n .filter((character) => alphabet.includes(character))\n .join(\"\");\n };\n\n const segments: string[] = [];\n if (rules.abbreviation) {\n segments.push(sanitize(rules.abbreviation));\n }\n segments.push(sanitize(this.#options.workload));\n if (this.#options.environment) {\n segments.push(sanitize(this.#options.environment));\n }\n if (this.#options.region) {\n segments.push(sanitize(this.#options.region));\n }\n if (context.label) {\n segments.push(sanitize(context.label));\n }\n const ordinalSuffix = ordinal > 0 ? String(ordinal + 1) : \"\";\n let base = segments.filter(Boolean).join(sep);\n const startingAlphabet = getNamingAlphabet(rules, \"start\");\n const endingAlphabet = getNamingAlphabet(rules, \"end\");\n const padding = startingAlphabet[0];\n if (padding === undefined || endingAlphabet.length === 0) {\n throw new Error(\n `Cannot generate a compliant name for '${context.type}': no supported generation alphabet. Provide an explicit name.`,\n );\n }\n if (base.length > 0 && !startingAlphabet.includes(base[0]!)) {\n base = padding + base;\n }\n // This is a convention budget when TypeSpec supplies no maximum, not a\n // constraint imposed on explicit names.\n const maxLength = rules.maxLength ?? Math.max(24, rules.minLength ?? 0);\n const minLength = rules.minLength ?? 1;\n\n const truncateWithOrdinal = (available: number): string => {\n const ordinalPrefix = ordinalSuffix ? sep : \"\";\n const baseLimit = available - ordinalPrefix.length - ordinalSuffix.length;\n if (baseLimit < 1) {\n throw new Error(\n `Cannot generate a compliant name for '${context.type}': maximum length ${maxLength} cannot accommodate the required suffixes. Provide an explicit name.`,\n );\n }\n return `${base.slice(0, baseLimit)}${ordinalPrefix}${ordinalSuffix}`;\n };\n\n let name: ExpressionOrValue<string>;\n if (rules.scope === \"global\") {\n // Bicep uniqueString() always returns 13 characters. Reserve that suffix\n // and the ordinal before truncating so repeated resources stay unique.\n const uniqueSuffixLength = 13;\n const prefixBudget = maxLength - sep.length - uniqueSuffixLength;\n base = base.padEnd(Math.max(1, minLength - sep.length - uniqueSuffixLength), padding);\n let prefix = truncateWithOrdinal(prefixBudget);\n if (sep && prefix.endsWith(sep)) {\n prefix = prefix.slice(0, -sep.length).padEnd(1, padding);\n }\n prefix = prefix.padEnd(Math.max(1, minLength - sep.length - uniqueSuffixLength), padding);\n name = concat(prefix + sep, uniqueString(subscription().subscriptionId));\n if (!alphabet.includes(\"A\")) name = toLower(name);\n } else {\n base = base.padEnd(minLength, padding);\n let truncated = truncateWithOrdinal(maxLength);\n if (!endingAlphabet.includes(truncated.at(-1)!)) {\n truncated = truncated.slice(0, -1) + endingAlphabet[0]!;\n }\n name = truncated;\n }\n\n const key = JSON.stringify(name, (_key, value: unknown) =>\n isExpression(value) ? unwrapExpression(value) : value,\n );\n const names = this.#names.get(context.type) ?? new Set<string>();\n if (names.has(key)) {\n throw new Error(\n `Cannot generate a distinct name for '${context.type}' within its naming rules. Provide an explicit name.`,\n );\n }\n names.add(key);\n this.#names.set(context.type, names);\n this.#ordinals.set(context.type, ordinal + 1);\n return name;\n }\n}\n\n/**\n * Naming policy that requires every resource to provide an explicit `name`.\n *\n * Throws an error when asked to generate a name. Use this on a stack to\n * disable auto-naming entirely.\n */\nexport const namingRequiredPolicy: NamingPolicy = {\n generateName(context: NamingContext): ExpressionOrValue<string> {\n throw new Error(\n `Resource of type '${context.type}' requires an explicit 'name' ` +\n `(the stack uses 'namingRequiredPolicy').`,\n );\n },\n};\n\n/**\n * Generates and validates a name at the resource construction boundary.\n * Explicit constructor names are validated before declaration registration.\n */\nexport function generateResourceName(\n policy: NamingPolicy,\n type: string,\n namingRules: ResourceNamingRules | undefined,\n nameSegments: number | undefined,\n): ExpressionOrValue<string> {\n const rules = namingRules ?? DEFAULT_NAMING_RULES;\n const generated = policy.generateName({\n type,\n rules,\n nameSegments: nameSegments ?? rules.nameSegments,\n });\n assertValidResourceName(generated, type, rules, {\n generated: true,\n });\n return generated;\n}\n\n/** A candidate character atom and its minimum repetition count. */\ninterface PatternToken {\n readonly characters: RegExp;\n readonly min: number;\n}\n\nconst NAME_ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._\";\nconst patternParser = new RegExpParser();\n\n/**\n * Selects generation tokens from a parsed regex AST. Shapes outside the\n * workload-based convention remain usable for literal-name validation.\n */\nfunction getPatternTokens(regex: string): readonly PatternToken[] | undefined {\n const pattern = patternParser.parsePattern(regex);\n if (pattern.alternatives.length !== 1) return undefined;\n const elements = pattern.alternatives[0]!.elements;\n const start = elements[0];\n const end = elements.at(-1);\n if (start?.type !== \"Assertion\" || start.kind !== \"start\") return undefined;\n const anchored = end?.type === \"Assertion\" && end.kind === \"end\";\n const body = elements.slice(1, anchored ? -1 : undefined);\n const [head, tail] = body;\n // Prefer the separator-free sublanguage of repeated hyphen-separated classes.\n if (\n body.length === 2 &&\n head?.type === \"Quantifier\" &&\n head.min === 1 &&\n head.max === Infinity &&\n head.element.type === \"CharacterClass\" &&\n tail?.type === \"Quantifier\" &&\n tail.min === 0 &&\n tail.max === Infinity &&\n (tail.element.type === \"Group\" || tail.element.type === \"CapturingGroup\") &&\n tail.element.alternatives.length === 1\n ) {\n const repeated = tail.element.alternatives[0]!.elements;\n const [separator, part] = repeated;\n if (\n repeated.length === 2 &&\n separator?.type === \"Character\" &&\n separator.value === 45 &&\n part?.type === \"Quantifier\" &&\n part.min === 1 &&\n part.max === Infinity &&\n part.element.raw === head.element.raw\n ) {\n return [\n { characters: new RegExp(`^(?:${head.element.raw})$`), min: 1 },\n ...(anchored ? [] : [{ characters: /^.$/, min: 0 }]),\n ];\n }\n }\n if (!anchored) return undefined;\n const tokens: PatternToken[] = [];\n for (const element of body) {\n if (element.type === \"Quantifier\" && element.max === 0) continue;\n const atom = element.type === \"Quantifier\" ? element.element : element;\n if (\n atom.type !== \"Character\" &&\n atom.type !== \"CharacterClass\" &&\n atom.type !== \"CharacterSet\"\n ) {\n return undefined;\n }\n tokens.push({\n characters: new RegExp(`^(?:${atom.raw})$`),\n min: element.type === \"Quantifier\" ? element.min : 1,\n });\n if (tokens.length > 128) return undefined;\n }\n return tokens;\n}\n\n/**\n * Selects candidate characters for sanitization, padding, and boundary repair.\n * Candidates are not a validity guarantee; the complete name is still checked.\n */\nfunction getNamingAlphabet(rules: ResourceNamingRules, boundary?: \"start\" | \"end\"): string {\n const alphabet =\n rules.pattern !== undefined\n ? NAME_ALPHABET\n : \"abcdefghijklmnopqrstuvwxyz0123456789\" + (rules.separator ?? \"\");\n if (rules.pattern === undefined || rules.pattern.regex === \"\") {\n return alphabet;\n }\n const tokens = getPatternTokens(rules.pattern.regex);\n if (tokens === undefined) return alphabet.replace(/[A-Z._-]/g, \"\");\n const ordered = boundary === \"end\" ? [...tokens].reverse() : tokens;\n const firstRequired = ordered.findIndex((token) => token.min > 0);\n const candidates =\n boundary === undefined || firstRequired < 0 ? ordered : ordered.slice(0, firstRequired + 1);\n return [...alphabet]\n .filter((character) => candidates.some((token) => token.characters.test(character)))\n .join(\"\");\n}\n"]}
@@ -1,15 +1,16 @@
1
- export interface ResourceNamingValidCharacters {
2
- readonly uppercase: boolean;
3
- readonly hyphens: boolean;
4
- readonly underscores: boolean;
5
- readonly periods: boolean;
6
- }
7
1
  export interface ResourceNamingRules {
8
2
  readonly abbreviation: string;
9
- readonly minLength: number;
10
- readonly maxLength: number;
11
- readonly validCharacters: ResourceNamingValidCharacters;
12
- readonly scope: "global" | "resourceGroup" | "subscription";
3
+ readonly minLength?: number;
4
+ readonly maxLength?: number;
5
+ readonly pattern?: {
6
+ readonly regex: string;
7
+ readonly message?: string;
8
+ };
9
+ /** Default relative name segments in the generated resource hierarchy. */
10
+ readonly nameSegments?: number;
11
+ readonly separator?: string;
12
+ /** Name uniqueness domain, not deployment scope. */
13
+ readonly scope: "global" | "resourceGroup" | "subscription" | "parent";
13
14
  }
14
- export declare const MOST_RESTRICTIVE: ResourceNamingRules;
15
+ export declare const DEFAULT_NAMING_RULES: ResourceNamingRules;
15
16
  //# sourceMappingURL=naming-rules.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming-rules.d.ts","sourceRoot":"","sources":["../../../src/naming/naming-rules.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,6BAA6B,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,eAAe,GAAG,cAAc,CAAC;CAC7D;AAED,eAAO,MAAM,gBAAgB,EAAE,mBAW9B,CAAC"}
1
+ {"version":3,"file":"naming-rules.d.ts","sourceRoot":"","sources":["../../../src/naming/naming-rules.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,eAAe,GAAG,cAAc,GAAG,QAAQ,CAAC;CACxE;AAED,eAAO,MAAM,oBAAoB,EAAE,mBAIlC,CAAC"}
@@ -1,15 +1,8 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
- export const MOST_RESTRICTIVE = {
3
+ export const DEFAULT_NAMING_RULES = {
4
4
  abbreviation: "",
5
- minLength: 1,
6
- maxLength: 24,
7
- validCharacters: {
8
- uppercase: false,
9
- hyphens: false,
10
- underscores: false,
11
- periods: false,
12
- },
5
+ separator: "",
13
6
  scope: "global",
14
7
  };
15
8
  //# sourceMappingURL=naming-rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"naming-rules.js","sourceRoot":"","sources":["../../../src/naming/naming-rules.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAiBlC,MAAM,CAAC,MAAM,gBAAgB,GAAwB;IACnD,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,EAAE;IACb,eAAe,EAAE;QACf,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,KAAK;KACf;IACD,KAAK,EAAE,QAAQ;CAChB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport interface ResourceNamingValidCharacters {\n readonly uppercase: boolean;\n readonly hyphens: boolean;\n readonly underscores: boolean;\n readonly periods: boolean;\n}\n\nexport interface ResourceNamingRules {\n readonly abbreviation: string;\n readonly minLength: number;\n readonly maxLength: number;\n readonly validCharacters: ResourceNamingValidCharacters;\n readonly scope: \"global\" | \"resourceGroup\" | \"subscription\";\n}\n\nexport const MOST_RESTRICTIVE: ResourceNamingRules = {\n abbreviation: \"\",\n minLength: 1,\n maxLength: 24,\n validCharacters: {\n uppercase: false,\n hyphens: false,\n underscores: false,\n periods: false,\n },\n scope: \"global\",\n};\n"]}
1
+ {"version":3,"file":"naming-rules.js","sourceRoot":"","sources":["../../../src/naming/naming-rules.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAiBlC,MAAM,CAAC,MAAM,oBAAoB,GAAwB;IACvD,YAAY,EAAE,EAAE;IAChB,SAAS,EAAE,EAAE;IACb,KAAK,EAAE,QAAQ;CAChB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport interface ResourceNamingRules {\n readonly abbreviation: string;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly pattern?: {\n readonly regex: string;\n readonly message?: string;\n };\n /** Default relative name segments in the generated resource hierarchy. */\n readonly nameSegments?: number;\n readonly separator?: string;\n /** Name uniqueness domain, not deployment scope. */\n readonly scope: \"global\" | \"resourceGroup\" | \"subscription\" | \"parent\";\n}\n\nexport const DEFAULT_NAMING_RULES: ResourceNamingRules = {\n abbreviation: \"\",\n separator: \"\",\n scope: \"global\",\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure/provisioning-core",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./package.json": "./package.json"
@@ -1,15 +1,15 @@
1
1
  /**
2
- * ARM state-shape conversion.
2
+ * Client/ARM object conversion.
3
3
  *
4
- * lowerState maps JS property names to ARM paths, restores flattened
4
+ * convertToArmObject maps JS property names to ARM paths, restores flattened
5
5
  * nesting, and encodes terminal values using the supplied model shape.
6
- * raiseState performs the inverse conversion for deserialization.
6
+ * convertFromArmObject performs the inverse conversion for deserialization.
7
7
  * Both follow nested model, array, and record shapes and preserve unknown
8
- * keys. Property-access expression lowering lives in expression.ts.
8
+ * keys. Property-access expression lowering lives in the AST expression builder.
9
9
  */
10
- import { type ModelShape } from "../../shape/shape.js";
10
+ import { type ModelShape } from "../shape/shape.js";
11
11
  /**
12
- * Recursively rewrite a raw state object into its ARM wire shape. Keys
12
+ * Recursively convert a client object into its ARM wire shape. Keys
13
13
  * not present in `shape.byJsName` pass through unchanged. Multi-
14
14
  * segment ARM paths (from `@flattenProperty`) re-nest objects; nested
15
15
  * models, arrays-of-models and records-of-models recurse via
@@ -19,9 +19,9 @@ import { type ModelShape } from "../../shape/shape.js";
19
19
  * when both sides are compatible objects; non-object / object collisions
20
20
  * throw.
21
21
  */
22
- export declare function lowerState(state: Record<string, unknown>, shape: ModelShape, visited?: WeakSet<object>): Record<string, unknown>;
22
+ export declare function convertToArmObject(state: Record<string, unknown>, shape: ModelShape, visited?: WeakSet<object>): Record<string, unknown>;
23
23
  /**
24
- * Inverse of `lowerState`: walks a wire-shape state object and lifts
24
+ * Inverse of `convertToArmObject`: walks an ARM object and maps
25
25
  * values at each property entry's `armPath` back onto the flat
26
26
  * `jsName` key. Recurses into nested model / array / record values via
27
27
  * `target`. Empty ARM paths fall back to the JS property name.
@@ -35,7 +35,7 @@ export declare function lowerState(state: Record<string, unknown>, shape: ModelS
35
35
  *
36
36
  * Keys present in the state but not consumed by any property entry
37
37
  * pass through unchanged (preserving the "unknown key" escape hatch
38
- * documented in `lowerState`).
38
+ * documented in `convertToArmObject`).
39
39
  */
40
- export declare function raiseState(state: Record<string, unknown>, shape: ModelShape, visited?: WeakSet<object>): Record<string, unknown>;
41
- //# sourceMappingURL=lower.d.ts.map
40
+ export declare function convertFromArmObject(state: Record<string, unknown>, shape: ModelShape, visited?: WeakSet<object>): Record<string, unknown>;
41
+ //# sourceMappingURL=arm-object-conversion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arm-object-conversion.d.ts","sourceRoot":"","sources":["../../../src/serialization/arm-object-conversion.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,OAAO,EAEL,KAAK,UAAU,EAGhB,MAAM,mBAAmB,CAAC;AAwB3B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,OAAO,CAAC,MAAM,CAAiB,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8BzB;AAmJD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,OAAO,CAAC,MAAM,CAAiB,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8CzB"}
@@ -1,24 +1,24 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
3
  /**
4
- * ARM state-shape conversion.
4
+ * Client/ARM object conversion.
5
5
  *
6
- * lowerState maps JS property names to ARM paths, restores flattened
6
+ * convertToArmObject maps JS property names to ARM paths, restores flattened
7
7
  * nesting, and encodes terminal values using the supplied model shape.
8
- * raiseState performs the inverse conversion for deserialization.
8
+ * convertFromArmObject performs the inverse conversion for deserialization.
9
9
  * Both follow nested model, array, and record shapes and preserve unknown
10
- * keys. Property-access expression lowering lives in expression.ts.
10
+ * keys. Property-access expression lowering lives in the AST expression builder.
11
11
  */
12
- import { isTerminalValueShape, resolveModelShape, } from "../../shape/shape.js";
13
- import { isExpression } from "../../expression/expressions.js";
14
- import { isExpressionNode } from "../../expression/ast-nodes.js";
12
+ import { isTerminalValueShape, resolveModelShape, } from "../shape/shape.js";
13
+ import { isExpression } from "../expression/expressions.js";
14
+ import { isExpressionNode } from "../expression/ast-nodes.js";
15
15
  import { decodeWireValue, encodeWireValue } from "./encoding.js";
16
16
  const MISSING = Symbol("missing");
17
17
  function assertNeverValueShape(shape) {
18
18
  throw new Error(`Unhandled value shape: ${String(shape)}`);
19
19
  }
20
20
  // ---------------------------------------------------------------------------
21
- // State lowering
21
+ // Client object to ARM object
22
22
  // ---------------------------------------------------------------------------
23
23
  function isPlainObject(value) {
24
24
  if (value === null || typeof value !== "object")
@@ -31,7 +31,7 @@ function isPlainObject(value) {
31
31
  return proto === Object.prototype || proto === null;
32
32
  }
33
33
  /**
34
- * Recursively rewrite a raw state object into its ARM wire shape. Keys
34
+ * Recursively convert a client object into its ARM wire shape. Keys
35
35
  * not present in `shape.byJsName` pass through unchanged. Multi-
36
36
  * segment ARM paths (from `@flattenProperty`) re-nest objects; nested
37
37
  * models, arrays-of-models and records-of-models recurse via
@@ -41,7 +41,7 @@ function isPlainObject(value) {
41
41
  * when both sides are compatible objects; non-object / object collisions
42
42
  * throw.
43
43
  */
44
- export function lowerState(state, shape, visited = new WeakSet()) {
44
+ export function convertToArmObject(state, shape, visited = new WeakSet()) {
45
45
  if (visited.has(state)) {
46
46
  throw new Error("Cycle detected while lowering ARM state.");
47
47
  }
@@ -87,9 +87,9 @@ function lowerValue(value, shape, visited, path) {
87
87
  case "deferred":
88
88
  if (!isPlainObject(value))
89
89
  return value;
90
- // `lowerState` resolves the variant itself, per property, using
90
+ // `convertToArmObject` resolves the variant itself, per property, using
91
91
  // `value` as the discriminator source.
92
- return lowerState(value, shape.value(), visited);
92
+ return convertToArmObject(value, shape.value(), visited);
93
93
  case "array":
94
94
  if (!Array.isArray(value))
95
95
  return value;
@@ -179,10 +179,10 @@ function defineOwn(target, key, value) {
179
179
  });
180
180
  }
181
181
  // ---------------------------------------------------------------------------
182
- // State raising (inverse of lowerState)
182
+ // ARM object to client object
183
183
  // ---------------------------------------------------------------------------
184
184
  /**
185
- * Inverse of `lowerState`: walks a wire-shape state object and lifts
185
+ * Inverse of `convertToArmObject`: walks an ARM object and maps
186
186
  * values at each property entry's `armPath` back onto the flat
187
187
  * `jsName` key. Recurses into nested model / array / record values via
188
188
  * `target`. Empty ARM paths fall back to the JS property name.
@@ -196,9 +196,9 @@ function defineOwn(target, key, value) {
196
196
  *
197
197
  * Keys present in the state but not consumed by any property entry
198
198
  * pass through unchanged (preserving the "unknown key" escape hatch
199
- * documented in `lowerState`).
199
+ * documented in `convertToArmObject`).
200
200
  */
201
- export function raiseState(state, shape, visited = new WeakSet()) {
201
+ export function convertFromArmObject(state, shape, visited = new WeakSet()) {
202
202
  if (visited.has(state)) {
203
203
  throw new Error("Cycle detected while raising ARM state.");
204
204
  }
@@ -262,8 +262,8 @@ function raiseValue(value, shape, visited, path) {
262
262
  case "deferred":
263
263
  if (!isPlainObject(value))
264
264
  return value;
265
- // `raiseState` selects the variant itself, against ARM keys.
266
- return raiseState(value, shape.value(), visited);
265
+ // `convertFromArmObject` selects the variant itself, against ARM keys.
266
+ return convertFromArmObject(value, shape.value(), visited);
267
267
  case "array":
268
268
  if (!Array.isArray(value))
269
269
  return value;
@@ -317,7 +317,7 @@ function extractPath(obj, path) {
317
317
  */
318
318
  function structuredCloneLike(value, seen) {
319
319
  if (seen.has(value)) {
320
- // Preserve the cycle for downstream detection in raiseState.
320
+ // Preserve the cycle for downstream detection in convertFromArmObject.
321
321
  return value;
322
322
  }
323
323
  seen.add(value);
@@ -331,4 +331,4 @@ function structuredCloneLike(value, seen) {
331
331
  }
332
332
  return out;
333
333
  }
334
- //# sourceMappingURL=lower.js.map
334
+ //# sourceMappingURL=arm-object-conversion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arm-object-conversion.js","sourceRoot":"","sources":["../../../src/serialization/arm-object-conversion.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Client/ARM object conversion.\n *\n * convertToArmObject maps JS property names to ARM paths, restores flattened\n * nesting, and encodes terminal values using the supplied model shape.\n * convertFromArmObject performs the inverse conversion for deserialization.\n * Both follow nested model, array, and record shapes and preserve unknown\n * keys. Property-access expression lowering lives in the AST expression builder.\n */\n\nimport {\n isTerminalValueShape,\n type ModelShape,\n type ValueShape,\n resolveModelShape,\n} from \"../shape/shape.js\";\nimport { isExpression } from \"../expression/expressions.js\";\nimport { isExpressionNode } from \"../expression/ast-nodes.js\";\nimport { decodeWireValue, encodeWireValue } from \"./encoding.js\";\n\nconst MISSING = Symbol(\"missing\");\n\nfunction assertNeverValueShape(shape: never): never {\n throw new Error(`Unhandled value shape: ${String(shape)}`);\n}\n\n// ---------------------------------------------------------------------------\n// Client object to ARM object\n// ---------------------------------------------------------------------------\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n // Expression proxies are opaque values (despite a null prototype) — they\n // must not be treated as cloneable plain objects.\n if (isExpression(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Recursively convert a client object into its ARM wire shape. Keys\n * not present in `shape.byJsName` pass through unchanged. Multi-\n * segment ARM paths (from `@flattenProperty`) re-nest objects; nested\n * models, arrays-of-models and records-of-models recurse via\n * `target`. Empty ARM paths fall back to the JS property name.\n *\n * Collisions where two JS-side keys map to overlapping ARM paths merge\n * when both sides are compatible objects; non-object / object collisions\n * throw.\n */\nexport function convertToArmObject(\n state: Record<string, unknown>,\n shape: ModelShape,\n visited: WeakSet<object> = new WeakSet(),\n): Record<string, unknown> {\n if (visited.has(state)) {\n throw new Error(\"Cycle detected while lowering ARM state.\");\n }\n visited.add(state);\n try {\n const out: Record<string, unknown> = Object.create(null);\n // Select the variant once, from the state we're about to lower —\n // every key below is looked up against that one concrete shape.\n const flat = resolveModelShape(shape, state, \"js\");\n\n for (const [jsKey, rawValue] of Object.entries(state)) {\n const propShape = flat?.byJsName[jsKey];\n const path = propShape?.armPath.length ? propShape.armPath : [jsKey];\n const loweredValue = lowerValue(rawValue, propShape?.value, visited, path);\n\n if (!propShape) {\n // Passthrough: key not in shape (e.g. CDK-internal, or emitter\n // didn't include it).\n assignPath(out, [jsKey], loweredValue);\n continue;\n }\n\n assignPath(out, path, loweredValue);\n }\n\n return out;\n } finally {\n visited.delete(state);\n }\n}\n\nfunction lowerValue(\n value: unknown,\n shape: ValueShape | undefined,\n visited: WeakSet<object>,\n path: readonly string[],\n): unknown {\n if (value === null || value === undefined) return value;\n if (isExpression(value) || isExpressionNode(value)) return value;\n\n if (!shape) {\n return value;\n }\n\n if (isTerminalValueShape(shape)) {\n if (\"encoding\" in shape && shape.encoding) {\n return encodeWireValue(value, shape.encoding, path);\n }\n return value;\n }\n\n switch (shape.kind) {\n case \"deferred\":\n if (!isPlainObject(value)) return value;\n // `convertToArmObject` resolves the variant itself, per property, using\n // `value` as the discriminator source.\n return convertToArmObject(value, shape.value(), visited);\n case \"array\":\n if (!Array.isArray(value)) return value;\n return value.map((item, index) =>\n lowerValue(item, shape.element, visited, [...path, String(index)]),\n );\n case \"record\": {\n if (!isPlainObject(value)) return value;\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(value)) {\n defineOwn(out, k, lowerValue(v, shape.value, visited, [...path, k]));\n }\n return out;\n }\n case \"tuple\":\n if (!Array.isArray(value)) return value;\n return value.map((item, index) =>\n lowerValue(item, shape.values[index], visited, [...path, String(index)]),\n );\n default:\n return assertNeverValueShape(shape);\n }\n}\n\n/**\n * Write `value` into `target` at the given ARM path, deep-merging with\n * existing object values. Throws on non-object/object or\n * object/non-object collisions.\n */\nfunction assignPath(\n target: Record<string, unknown>,\n path: readonly string[],\n value: unknown,\n): void {\n if (path.length === 0) return;\n\n let cursor = target;\n for (let i = 0; i < path.length - 1; i++) {\n const seg = path[i]!;\n const existing = Object.prototype.hasOwnProperty.call(cursor, seg) ? cursor[seg] : undefined;\n if (existing === undefined) {\n const next: Record<string, unknown> = Object.create(null);\n defineOwn(cursor, seg, next);\n cursor = next;\n } else if (isPlainObject(existing)) {\n cursor = existing;\n } else {\n throw new Error(\n `ARM path collision at \"${path.slice(0, i + 1).join(\".\")}\": expected object, got ${typeof existing}.`,\n );\n }\n }\n\n const leafKey = path[path.length - 1]!;\n const existingLeaf = Object.prototype.hasOwnProperty.call(cursor, leafKey)\n ? cursor[leafKey]\n : undefined;\n if (existingLeaf === undefined) {\n defineOwn(cursor, leafKey, value);\n return;\n }\n\n if (isPlainObject(existingLeaf) && isPlainObject(value)) {\n defineOwn(\n cursor,\n leafKey,\n deepMerge(existingLeaf as Record<string, unknown>, value as Record<string, unknown>, path),\n );\n return;\n }\n\n throw new Error(\n `ARM path collision at \"${path.join(\".\")}\": cannot merge ${typeof existingLeaf} with ${typeof value}.`,\n );\n}\n\nfunction deepMerge(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n prefix: readonly string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = Object.create(null);\n for (const [key, value] of Object.entries(a)) defineOwn(out, key, value);\n for (const [k, v] of Object.entries(b)) {\n const existing = Object.prototype.hasOwnProperty.call(out, k) ? out[k] : undefined;\n if (existing === undefined) {\n defineOwn(out, k, v);\n continue;\n }\n if (isPlainObject(existing) && isPlainObject(v)) {\n defineOwn(\n out,\n k,\n deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>, [\n ...prefix,\n k,\n ]),\n );\n continue;\n }\n throw new Error(\n `ARM path collision at \"${[...prefix, k].join(\".\")}\": cannot merge ${typeof existing} with ${typeof v}.`,\n );\n }\n return out;\n}\n\nfunction defineOwn(target: Record<string, unknown>, key: string, value: unknown): void {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n}\n\n// ---------------------------------------------------------------------------\n// ARM object to client object\n// ---------------------------------------------------------------------------\n\n/**\n * Inverse of `convertToArmObject`: walks an ARM object and maps\n * values at each property entry's `armPath` back onto the flat\n * `jsName` key. Recurses into nested model / array / record values via\n * `target`. Empty ARM paths fall back to the JS property name.\n *\n * ARM-shape keys that consumed a nested object entirely (single-segment\n * paths carrying a model `target`) pop that segment from the source\n * so leftovers at intermediate nodes don't silently leak into the\n * output. For multi-segment paths (`@flattenProperty`), only the leaf\n * is extracted; intermediate shared objects may survive as their own\n * top-level entries if the shape also declares a jsName for them.\n *\n * Keys present in the state but not consumed by any property entry\n * pass through unchanged (preserving the \"unknown key\" escape hatch\n * documented in `convertToArmObject`).\n */\nexport function convertFromArmObject(\n state: Record<string, unknown>,\n shape: ModelShape,\n visited: WeakSet<object> = new WeakSet(),\n): Record<string, unknown> {\n if (visited.has(state)) {\n throw new Error(\"Cycle detected while raising ARM state.\");\n }\n visited.add(state);\n try {\n // Wire-shaped input, so the variant is selected against ARM keys.\n const flat = resolveModelShape(shape, state, \"arm\");\n if (!flat) return structuredCloneLike(state, new WeakSet());\n\n // Clone into a mutable working copy so we can prune consumed paths.\n const working: Record<string, unknown> = structuredCloneLike(state, new WeakSet());\n const out: Record<string, unknown> = Object.create(null);\n const consumedTopLevel = new Set<string>();\n\n for (const [jsName, propShape] of Object.entries(flat.byJsName)) {\n const path = propShape.armPath.length > 0 ? propShape.armPath : [jsName];\n const extracted = extractPath(working, path);\n if (extracted === MISSING) continue;\n\n const raised = raiseValue(extracted, propShape.value, visited, path);\n defineOwn(out, jsName, raised);\n\n consumedTopLevel.add(path[0]!);\n }\n\n // Passthrough: anything left in `working` that wasn't consumed by a\n // shape-driven extraction and doesn't collide with an already-\n // placed jsName.\n for (const [k, v] of Object.entries(working)) {\n if (consumedTopLevel.has(k)) {\n // Top-level segment was touched by at least one armPath. If\n // residue remains (e.g. sibling properties the shape didn't\n // cover), surface it under the original ARM key so it's not\n // silently dropped.\n if (isPlainObject(v) && Object.keys(v).length === 0) continue;\n if (v === undefined) continue;\n }\n if (Object.prototype.hasOwnProperty.call(out, k)) continue;\n defineOwn(out, k, v);\n }\n\n return out;\n } finally {\n visited.delete(state);\n }\n}\n\nfunction raiseValue(\n value: unknown,\n shape: ValueShape | undefined,\n visited: WeakSet<object>,\n path: readonly string[],\n): unknown {\n if (value === null || value === undefined) return value;\n if (isExpression(value) || isExpressionNode(value)) return value;\n if (!shape) return value;\n\n if (isTerminalValueShape(shape)) {\n if (\"encoding\" in shape && shape.encoding) {\n return decodeWireValue(value, shape.encoding, path);\n }\n return value;\n }\n\n switch (shape.kind) {\n case \"deferred\":\n if (!isPlainObject(value)) return value;\n // `convertFromArmObject` selects the variant itself, against ARM keys.\n return convertFromArmObject(value, shape.value(), visited);\n case \"array\":\n if (!Array.isArray(value)) return value;\n return value.map((item, index) =>\n raiseValue(item, shape.element, visited, [...path, String(index)]),\n );\n case \"record\": {\n if (!isPlainObject(value)) return value;\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(value)) {\n defineOwn(out, k, raiseValue(v, shape.value, visited, [...path, k]));\n }\n return out;\n }\n case \"tuple\":\n if (!Array.isArray(value)) return value;\n return value.map((item, index) =>\n raiseValue(item, shape.values[index], visited, [...path, String(index)]),\n );\n default:\n return assertNeverValueShape(shape);\n }\n}\n\n/**\n * Walk `obj` along `path`, returning the leaf value and pruning it\n * from the tree. Empty intermediate objects are left in place (caller\n * decides how to treat residue).\n *\n * Returns `MISSING` when any segment is absent or not a plain object.\n */\nfunction extractPath(obj: Record<string, unknown>, path: readonly string[]): unknown {\n if (path.length === 0) return obj;\n\n let cursor: Record<string, unknown> = obj;\n for (let i = 0; i < path.length - 1; i++) {\n const seg = path[i]!;\n const next = Object.prototype.hasOwnProperty.call(cursor, seg) ? cursor[seg] : undefined;\n if (!isPlainObject(next)) return MISSING;\n cursor = next;\n }\n\n const leafKey = path[path.length - 1]!;\n if (!Object.prototype.hasOwnProperty.call(cursor, leafKey)) return MISSING;\n const value = cursor[leafKey];\n delete cursor[leafKey];\n return value;\n}\n\n/**\n * Shallow-clone recursively enough to avoid mutating caller state.\n * We only copy plain objects; arrays and other values are shared\n * (raiseValue handles arrays via `.map` so mutation is contained).\n */\nfunction structuredCloneLike(\n value: Record<string, unknown>,\n seen: WeakSet<object>,\n): Record<string, unknown> {\n if (seen.has(value)) {\n // Preserve the cycle for downstream detection in convertFromArmObject.\n return value;\n }\n seen.add(value);\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(value)) {\n defineOwn(\n out,\n k,\n isExpression(v) || isExpressionNode(v)\n ? v\n : isPlainObject(v)\n ? structuredCloneLike(v, seen)\n : v,\n );\n }\n return out;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { Stack } from "../../constructs/stack.js";
2
+ import type { ResourceDeclaration } from "../../constructs/resource/resource.js";
3
+ import type { InfraNode, OutputDeclarationNode, ParameterDeclarationNode, ResourceDeclarationNode, VariableDeclarationNode } from "./index.js";
4
+ import type { DeclarationSymbolMap } from "../symbol-map.js";
5
+ export declare function buildResourceDeclaration(resource: ResourceDeclaration, symbolMap: DeclarationSymbolMap): [string, ResourceDeclarationNode];
6
+ export declare function buildParameterDeclarations(stack: Stack, symbolMap: DeclarationSymbolMap): Record<string, ParameterDeclarationNode> | undefined;
7
+ export declare function buildVariableDeclarations(stack: Stack, symbolMap: DeclarationSymbolMap): Record<string, VariableDeclarationNode> | undefined;
8
+ export declare function buildOutputDeclarations(stack: Stack, symbolMap: DeclarationSymbolMap): Record<string, OutputDeclarationNode> | undefined;
9
+ export declare function buildStackDeclarations(stack: Stack, resources: readonly ResourceDeclaration[], symbols: DeclarationSymbolMap): Pick<InfraNode, "parameters" | "variables" | "resources" | "outputs">;
10
+ //# sourceMappingURL=declaration-builder.d.ts.map