@alloy-js/core 0.23.0-dev.9 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (943) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/api-extractor.json +1 -8
  3. package/api-extractor.testing.json +19 -0
  4. package/dist/dev/src/binder.js +595 -0
  5. package/dist/dev/src/binder.js.map +1 -0
  6. package/dist/dev/src/code.js +181 -0
  7. package/dist/dev/src/code.js.map +1 -0
  8. package/dist/dev/src/components/AccessExpression.js +230 -0
  9. package/dist/dev/src/components/AccessExpression.js.map +1 -0
  10. package/dist/dev/src/components/AccessExpression.test.js +237 -0
  11. package/dist/dev/src/components/AccessExpression.test.js.map +1 -0
  12. package/dist/dev/src/components/AppendFile.js +246 -0
  13. package/dist/dev/src/components/AppendFile.js.map +1 -0
  14. package/dist/dev/src/components/Block.js +78 -0
  15. package/dist/dev/src/components/Block.js.map +1 -0
  16. package/dist/dev/src/components/CopyFile.js +16 -0
  17. package/dist/dev/src/components/CopyFile.js.map +1 -0
  18. package/dist/dev/src/components/Declaration.js +70 -0
  19. package/dist/dev/src/components/Declaration.js.map +1 -0
  20. package/dist/dev/src/components/For.js +40 -0
  21. package/dist/dev/src/components/For.js.map +1 -0
  22. package/dist/dev/src/components/Indent.js +37 -0
  23. package/dist/dev/src/components/Indent.js.map +1 -0
  24. package/dist/dev/src/components/List.js +29 -0
  25. package/dist/dev/src/components/List.js.map +1 -0
  26. package/dist/dev/src/components/MemberDeclaration.js +70 -0
  27. package/dist/dev/src/components/MemberDeclaration.js.map +1 -0
  28. package/dist/dev/src/components/MemberName.js +18 -0
  29. package/dist/dev/src/components/MemberName.js.map +1 -0
  30. package/dist/dev/src/components/MemberScope.js +62 -0
  31. package/dist/dev/src/components/MemberScope.js.map +1 -0
  32. package/dist/dev/src/components/Name.js +11 -0
  33. package/dist/dev/src/components/Name.js.map +1 -0
  34. package/dist/dev/src/components/Output.js +72 -0
  35. package/dist/dev/src/components/Output.js.map +1 -0
  36. package/dist/dev/src/components/Prose.js +32 -0
  37. package/dist/dev/src/components/Prose.js.map +1 -0
  38. package/dist/dev/src/components/ReferenceOrContent.js +12 -0
  39. package/dist/dev/src/components/ReferenceOrContent.js.map +1 -0
  40. package/dist/dev/src/components/Scope.js +56 -0
  41. package/dist/dev/src/components/Scope.js.map +1 -0
  42. package/dist/dev/src/components/Show.js +4 -0
  43. package/dist/dev/src/components/Show.js.map +1 -0
  44. package/dist/dev/src/components/SourceDirectory.js +41 -0
  45. package/dist/dev/src/components/SourceDirectory.js.map +1 -0
  46. package/dist/dev/src/components/SourceFile.js +52 -0
  47. package/dist/dev/src/components/SourceFile.js.map +1 -0
  48. package/dist/dev/src/components/StatementList.js +20 -0
  49. package/dist/dev/src/components/StatementList.js.map +1 -0
  50. package/dist/dev/src/components/Switch.js +42 -0
  51. package/dist/dev/src/components/Switch.js.map +1 -0
  52. package/dist/dev/src/components/TemplateFile.js +153 -0
  53. package/dist/dev/src/components/TemplateFile.js.map +1 -0
  54. package/dist/dev/src/components/UpdateFile.js +71 -0
  55. package/dist/dev/src/components/UpdateFile.js.map +1 -0
  56. package/dist/dev/src/components/Wrap.js +18 -0
  57. package/dist/dev/src/components/Wrap.js.map +1 -0
  58. package/dist/dev/src/components/index.js +25 -0
  59. package/dist/dev/src/components/index.js.map +1 -0
  60. package/dist/dev/src/components/stc/index.js +27 -0
  61. package/dist/dev/src/components/stc/index.js.map +1 -0
  62. package/dist/dev/src/components/stc/sti.js +10 -0
  63. package/dist/dev/src/components/stc/sti.js.map +1 -0
  64. package/dist/dev/src/content-slot.js +78 -0
  65. package/dist/dev/src/content-slot.js.map +1 -0
  66. package/dist/dev/src/content-slot.test.js +89 -0
  67. package/dist/dev/src/content-slot.test.js.map +1 -0
  68. package/dist/dev/src/context/assignment.js +46 -0
  69. package/dist/dev/src/context/assignment.js.map +1 -0
  70. package/dist/dev/src/context/binder.js +17 -0
  71. package/dist/dev/src/context/binder.js.map +1 -0
  72. package/dist/dev/src/context/declaration.js +3 -0
  73. package/dist/dev/src/context/declaration.js.map +1 -0
  74. package/dist/dev/src/context/format-options.js +45 -0
  75. package/dist/dev/src/context/format-options.js.map +1 -0
  76. package/dist/dev/src/context/index.js +11 -0
  77. package/dist/dev/src/context/index.js.map +1 -0
  78. package/dist/dev/src/context/member-declaration.js +11 -0
  79. package/dist/dev/src/context/member-declaration.js.map +1 -0
  80. package/dist/dev/src/context/member-scope.js +12 -0
  81. package/dist/dev/src/context/member-scope.js.map +1 -0
  82. package/dist/dev/src/context/name-policy.js +13 -0
  83. package/dist/dev/src/context/name-policy.js.map +1 -0
  84. package/dist/dev/src/context/scope.js +18 -0
  85. package/dist/dev/src/context/scope.js.map +1 -0
  86. package/dist/dev/src/context/source-directory.js +12 -0
  87. package/dist/dev/src/context/source-directory.js.map +1 -0
  88. package/dist/dev/src/context/source-file.js +3 -0
  89. package/dist/dev/src/context/source-file.js.map +1 -0
  90. package/dist/dev/src/context.js +47 -0
  91. package/dist/dev/src/context.js.map +1 -0
  92. package/dist/dev/src/debug/cli.js +164 -0
  93. package/dist/dev/src/debug/cli.js.map +1 -0
  94. package/dist/dev/src/debug/diagnostics-broadcast.test.js +100 -0
  95. package/dist/dev/src/debug/diagnostics-broadcast.test.js.map +1 -0
  96. package/dist/dev/src/debug/diagnostics.test.js +50 -0
  97. package/dist/dev/src/debug/diagnostics.test.js.map +1 -0
  98. package/dist/dev/src/debug/effects.js +293 -0
  99. package/dist/dev/src/debug/effects.js.map +1 -0
  100. package/dist/dev/src/debug/effects.test.js +280 -0
  101. package/dist/dev/src/debug/effects.test.js.map +1 -0
  102. package/dist/dev/src/debug/files.js +29 -0
  103. package/dist/dev/src/debug/files.js.map +1 -0
  104. package/dist/dev/src/debug/files.test.js +78 -0
  105. package/dist/dev/src/debug/files.test.js.map +1 -0
  106. package/dist/dev/src/debug/index.js +71 -0
  107. package/dist/dev/src/debug/index.js.map +1 -0
  108. package/dist/dev/src/debug/message-format.test.js +836 -0
  109. package/dist/dev/src/debug/message-format.test.js.map +1 -0
  110. package/dist/dev/src/debug/render-tree-orphans.test.js +365 -0
  111. package/dist/dev/src/debug/render-tree-orphans.test.js.map +1 -0
  112. package/dist/dev/src/debug/render.js +479 -0
  113. package/dist/dev/src/debug/render.js.map +1 -0
  114. package/dist/dev/src/debug/render.test.js +363 -0
  115. package/dist/dev/src/debug/render.test.js.map +1 -0
  116. package/dist/dev/src/debug/serialize.js +70 -0
  117. package/dist/dev/src/debug/serialize.js.map +1 -0
  118. package/dist/dev/src/debug/source-map.browser.js +24 -0
  119. package/dist/dev/src/debug/source-map.browser.js.map +1 -0
  120. package/dist/dev/src/debug/source-map.js +111 -0
  121. package/dist/dev/src/debug/source-map.js.map +1 -0
  122. package/dist/dev/src/debug/symbols.js +196 -0
  123. package/dist/dev/src/debug/symbols.js.map +1 -0
  124. package/dist/dev/src/debug/symbols.test.js +93 -0
  125. package/dist/dev/src/debug/symbols.test.js.map +1 -0
  126. package/dist/dev/src/debug/trace-writer.js +674 -0
  127. package/dist/dev/src/debug/trace-writer.js.map +1 -0
  128. package/dist/dev/src/debug/trace.js +460 -0
  129. package/dist/dev/src/debug/trace.js.map +1 -0
  130. package/dist/dev/src/devtools/devtools-protocol.js +2 -0
  131. package/dist/dev/src/devtools/devtools-protocol.js.map +1 -0
  132. package/dist/dev/src/devtools/devtools-server.browser.js +36 -0
  133. package/dist/dev/src/devtools/devtools-server.browser.js.map +1 -0
  134. package/dist/dev/src/devtools/devtools-server.js +458 -0
  135. package/dist/dev/src/devtools/devtools-server.js.map +1 -0
  136. package/dist/dev/src/devtools/devtools-transport.js +114 -0
  137. package/dist/dev/src/devtools/devtools-transport.js.map +1 -0
  138. package/dist/dev/src/devtools-entry.browser.js +2 -0
  139. package/dist/dev/src/devtools-entry.browser.js.map +1 -0
  140. package/dist/dev/src/devtools-entry.js +2 -0
  141. package/dist/dev/src/devtools-entry.js.map +1 -0
  142. package/dist/dev/src/diagnostics.js +97 -0
  143. package/dist/dev/src/diagnostics.js.map +1 -0
  144. package/dist/dev/src/host/alloy-host.browser.js +32 -0
  145. package/dist/dev/src/host/alloy-host.browser.js.map +1 -0
  146. package/dist/dev/src/host/alloy-host.js +144 -0
  147. package/dist/dev/src/host/alloy-host.js.map +1 -0
  148. package/dist/dev/src/host/interface.js +2 -0
  149. package/dist/dev/src/host/interface.js.map +1 -0
  150. package/dist/dev/src/host/node-host.browser.js +21 -0
  151. package/dist/dev/src/host/node-host.browser.js.map +1 -0
  152. package/dist/dev/src/host/node-host.js +20 -0
  153. package/dist/dev/src/host/node-host.js.map +1 -0
  154. package/dist/dev/src/index.browser.js +3 -0
  155. package/dist/dev/src/index.browser.js.map +1 -0
  156. package/dist/dev/src/index.js +27 -0
  157. package/dist/dev/src/index.js.map +1 -0
  158. package/dist/dev/src/inspect.browser.js +6 -0
  159. package/dist/dev/src/inspect.browser.js.map +1 -0
  160. package/dist/dev/src/inspect.js +2 -0
  161. package/dist/dev/src/inspect.js.map +1 -0
  162. package/dist/dev/src/jsx-runtime.js +17 -0
  163. package/dist/dev/src/jsx-runtime.js.map +1 -0
  164. package/dist/dev/src/library-symbol-reference.js +59 -0
  165. package/dist/dev/src/library-symbol-reference.js.map +1 -0
  166. package/dist/dev/src/name-policy.js +51 -0
  167. package/dist/dev/src/name-policy.js.map +1 -0
  168. package/dist/dev/src/pretty-string/pretty-string.js +100 -0
  169. package/dist/dev/src/pretty-string/pretty-string.js.map +1 -0
  170. package/dist/dev/src/pretty-string/pretty-string.test.js +38 -0
  171. package/dist/dev/src/pretty-string/pretty-string.test.js.map +1 -0
  172. package/dist/dev/src/print-hook.js +10 -0
  173. package/dist/dev/src/print-hook.js.map +1 -0
  174. package/dist/dev/src/props-combinators.js +109 -0
  175. package/dist/dev/src/props-combinators.js.map +1 -0
  176. package/dist/dev/src/reactive-union-set.js +213 -0
  177. package/dist/dev/src/reactive-union-set.js.map +1 -0
  178. package/dist/dev/src/reactivity.js +452 -0
  179. package/dist/dev/src/reactivity.js.map +1 -0
  180. package/dist/dev/src/refkey.js +167 -0
  181. package/dist/dev/src/refkey.js.map +1 -0
  182. package/dist/dev/src/render-stack.js +252 -0
  183. package/dist/dev/src/render-stack.js.map +1 -0
  184. package/dist/dev/src/render.js +872 -0
  185. package/dist/dev/src/render.js.map +1 -0
  186. package/dist/dev/src/resource.js +124 -0
  187. package/dist/dev/src/resource.js.map +1 -0
  188. package/dist/dev/src/runtime/component.js +41 -0
  189. package/dist/dev/src/runtime/component.js.map +1 -0
  190. package/dist/dev/src/runtime/intrinsic.js +12 -0
  191. package/dist/dev/src/runtime/intrinsic.js.map +1 -0
  192. package/dist/dev/src/scheduler.js +217 -0
  193. package/dist/dev/src/scheduler.js.map +1 -0
  194. package/dist/dev/src/stc.js +40 -0
  195. package/dist/dev/src/stc.js.map +1 -0
  196. package/dist/dev/src/sti.js +31 -0
  197. package/dist/dev/src/sti.js.map +1 -0
  198. package/dist/dev/src/symbols/basic-scope.js +21 -0
  199. package/dist/dev/src/symbols/basic-scope.js.map +1 -0
  200. package/dist/dev/src/symbols/basic-symbol.js +34 -0
  201. package/dist/dev/src/symbols/basic-symbol.js.map +1 -0
  202. package/dist/dev/src/symbols/decl.js +26 -0
  203. package/dist/dev/src/symbols/decl.js.map +1 -0
  204. package/dist/dev/src/symbols/index.js +10 -0
  205. package/dist/dev/src/symbols/index.js.map +1 -0
  206. package/dist/dev/src/symbols/output-scope.js +235 -0
  207. package/dist/dev/src/symbols/output-scope.js.map +1 -0
  208. package/dist/dev/src/symbols/output-space.js +51 -0
  209. package/dist/dev/src/symbols/output-space.js.map +1 -0
  210. package/dist/dev/src/symbols/output-symbol.js +644 -0
  211. package/dist/dev/src/symbols/output-symbol.js.map +1 -0
  212. package/dist/dev/src/symbols/symbol-flow.js +106 -0
  213. package/dist/dev/src/symbols/symbol-flow.js.map +1 -0
  214. package/dist/dev/src/symbols/symbol-slot.js +75 -0
  215. package/dist/dev/src/symbols/symbol-slot.js.map +1 -0
  216. package/dist/dev/src/symbols/symbol-slot.test.js +68 -0
  217. package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -0
  218. package/dist/dev/src/symbols/symbol-table.js +103 -0
  219. package/dist/dev/src/symbols/symbol-table.js.map +1 -0
  220. package/dist/dev/src/tap.js +109 -0
  221. package/dist/dev/src/tap.js.map +1 -0
  222. package/dist/dev/src/trace.js +2 -0
  223. package/dist/dev/src/trace.js.map +1 -0
  224. package/dist/dev/src/tracer.js +180 -0
  225. package/dist/dev/src/tracer.js.map +1 -0
  226. package/dist/dev/src/utils.js +487 -0
  227. package/dist/dev/src/utils.js.map +1 -0
  228. package/dist/dev/src/write-output.js +48 -0
  229. package/dist/dev/src/write-output.js.map +1 -0
  230. package/dist/dev/test/browser-build.test.js +85 -0
  231. package/dist/dev/test/browser-build.test.js.map +1 -0
  232. package/dist/dev/test/children.test.js +44 -0
  233. package/dist/dev/test/children.test.js.map +1 -0
  234. package/dist/dev/test/components/append-file.test.js +394 -0
  235. package/dist/dev/test/components/append-file.test.js.map +1 -0
  236. package/dist/dev/test/components/block.test.js +83 -0
  237. package/dist/dev/test/components/block.test.js.map +1 -0
  238. package/dist/dev/test/components/copy-file.test.js +119 -0
  239. package/dist/dev/test/components/copy-file.test.js.map +1 -0
  240. package/dist/dev/test/components/declaration.test.js +40 -0
  241. package/dist/dev/test/components/declaration.test.js.map +1 -0
  242. package/dist/dev/test/components/list.test.js +250 -0
  243. package/dist/dev/test/components/list.test.js.map +1 -0
  244. package/dist/dev/test/components/prose.test.js +42 -0
  245. package/dist/dev/test/components/prose.test.js.map +1 -0
  246. package/dist/dev/test/components/reference-or-content.test.js +246 -0
  247. package/dist/dev/test/components/reference-or-content.test.js.map +1 -0
  248. package/dist/dev/test/components/source-file.test.js +271 -0
  249. package/dist/dev/test/components/source-file.test.js.map +1 -0
  250. package/dist/dev/test/components/template-file.test.js +200 -0
  251. package/dist/dev/test/components/template-file.test.js.map +1 -0
  252. package/dist/dev/test/components/update-file.test.js +210 -0
  253. package/dist/dev/test/components/update-file.test.js.map +1 -0
  254. package/dist/dev/test/components/wrap.test.js +48 -0
  255. package/dist/dev/test/components/wrap.test.js.map +1 -0
  256. package/dist/dev/test/control-flow/for.test.js +318 -0
  257. package/dist/dev/test/control-flow/for.test.js.map +1 -0
  258. package/dist/dev/test/control-flow/match.test.js +112 -0
  259. package/dist/dev/test/control-flow/match.test.js.map +1 -0
  260. package/dist/dev/test/control-flow/show.test.js +38 -0
  261. package/dist/dev/test/control-flow/show.test.js.map +1 -0
  262. package/dist/dev/test/lazy-isempty.test.js +121 -0
  263. package/dist/dev/test/lazy-isempty.test.js.map +1 -0
  264. package/dist/dev/test/name-policy.test.js +28 -0
  265. package/dist/dev/test/name-policy.test.js.map +1 -0
  266. package/dist/dev/test/props-with-defaults.test.js +94 -0
  267. package/dist/dev/test/props-with-defaults.test.js.map +1 -0
  268. package/dist/dev/test/reactive-union-set-disposers.test.js +98 -0
  269. package/dist/dev/test/reactive-union-set-disposers.test.js.map +1 -0
  270. package/dist/dev/test/reactive-union-set.test.js +171 -0
  271. package/dist/dev/test/reactive-union-set.test.js.map +1 -0
  272. package/dist/dev/test/reactivity/circular-reactives.test.js +62 -0
  273. package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -0
  274. package/dist/dev/test/reactivity/cleanup.test.js +96 -0
  275. package/dist/dev/test/reactivity/cleanup.test.js.map +1 -0
  276. package/dist/dev/test/reactivity/memo.test.js +17 -0
  277. package/dist/dev/test/reactivity/memo.test.js.map +1 -0
  278. package/dist/dev/test/reactivity/ref-rendering.test.js +38 -0
  279. package/dist/dev/test/reactivity/ref-rendering.test.js.map +1 -0
  280. package/dist/dev/test/reactivity/shallow-reactive.test.js +56 -0
  281. package/dist/dev/test/reactivity/shallow-reactive.test.js.map +1 -0
  282. package/dist/dev/test/reactivity/test.test.js +74 -0
  283. package/dist/dev/test/reactivity/test.test.js.map +1 -0
  284. package/dist/dev/test/reactivity/untrack.test.js +27 -0
  285. package/dist/dev/test/reactivity/untrack.test.js.map +1 -0
  286. package/dist/dev/test/refkey.test.js +36 -0
  287. package/dist/dev/test/refkey.test.js.map +1 -0
  288. package/dist/dev/test/rendering/basic.test.js +194 -0
  289. package/dist/dev/test/rendering/basic.test.js.map +1 -0
  290. package/dist/dev/test/rendering/code.test.js +64 -0
  291. package/dist/dev/test/rendering/code.test.js.map +1 -0
  292. package/dist/dev/test/rendering/formatting.test.js +797 -0
  293. package/dist/dev/test/rendering/formatting.test.js.map +1 -0
  294. package/dist/dev/test/rendering/indent.test.js +183 -0
  295. package/dist/dev/test/rendering/indent.test.js.map +1 -0
  296. package/dist/dev/test/rendering/memoization.test.js +37 -0
  297. package/dist/dev/test/rendering/memoization.test.js.map +1 -0
  298. package/dist/dev/test/rendering/print-render-stack.test.js +287 -0
  299. package/dist/dev/test/rendering/print-render-stack.test.js.map +1 -0
  300. package/dist/dev/test/rendering/refkeys.test.js +37 -0
  301. package/dist/dev/test/rendering/refkeys.test.js.map +1 -0
  302. package/dist/dev/test/scheduler-extended.test.js +96 -0
  303. package/dist/dev/test/scheduler-extended.test.js.map +1 -0
  304. package/dist/dev/test/scheduler.test.js +46 -0
  305. package/dist/dev/test/scheduler.test.js.map +1 -0
  306. package/dist/dev/test/split-props.test.js +78 -0
  307. package/dist/dev/test/split-props.test.js.map +1 -0
  308. package/dist/dev/test/stc.test.js +35 -0
  309. package/dist/dev/test/stc.test.js.map +1 -0
  310. package/dist/dev/test/symbols/deconflicted-name.test.js +120 -0
  311. package/dist/dev/test/symbols/deconflicted-name.test.js.map +1 -0
  312. package/dist/dev/test/symbols/output-scope.test.js +221 -0
  313. package/dist/dev/test/symbols/output-scope.test.js.map +1 -0
  314. package/dist/dev/test/symbols/output-symbol.test.js +202 -0
  315. package/dist/dev/test/symbols/output-symbol.test.js.map +1 -0
  316. package/dist/dev/test/symbols/resolution.test.js +487 -0
  317. package/dist/dev/test/symbols/resolution.test.js.map +1 -0
  318. package/dist/dev/test/symbols/symbol-table.test.js +15 -0
  319. package/dist/dev/test/symbols/symbol-table.test.js.map +1 -0
  320. package/dist/dev/test/symbols/utils.js +26 -0
  321. package/dist/dev/test/symbols/utils.js.map +1 -0
  322. package/dist/dev/test/utils.test.js +317 -0
  323. package/dist/dev/test/utils.test.js.map +1 -0
  324. package/dist/dev/testing/create-test-wrapper.js +130 -0
  325. package/dist/dev/testing/create-test-wrapper.js.map +1 -0
  326. package/dist/dev/testing/devtools-utils.js +162 -0
  327. package/dist/dev/testing/devtools-utils.js.map +1 -0
  328. package/dist/dev/testing/extend-expect.js +187 -0
  329. package/dist/dev/testing/extend-expect.js.map +1 -0
  330. package/dist/dev/testing/extend-expect.test.js +234 -0
  331. package/dist/dev/testing/extend-expect.test.js.map +1 -0
  332. package/dist/dev/testing/index.js +4 -0
  333. package/dist/dev/testing/index.js.map +1 -0
  334. package/dist/dev/testing/render.js +34 -0
  335. package/dist/dev/testing/render.js.map +1 -0
  336. package/dist/dev/testing/vitest.d.js +14 -0
  337. package/dist/dev/testing/vitest.d.js.map +1 -0
  338. package/dist/devtools/index.html +29 -17
  339. package/dist/src/binder.d.ts +107 -3
  340. package/dist/src/binder.d.ts.map +1 -1
  341. package/dist/src/binder.js +113 -1
  342. package/dist/src/binder.js.map +1 -1
  343. package/dist/src/components/AccessExpression.d.ts +78 -0
  344. package/dist/src/components/AccessExpression.d.ts.map +1 -0
  345. package/dist/src/components/AccessExpression.js +218 -0
  346. package/dist/src/components/AccessExpression.js.map +1 -0
  347. package/dist/src/components/AccessExpression.test.d.ts +2 -0
  348. package/dist/src/components/AccessExpression.test.d.ts.map +1 -0
  349. package/dist/src/components/AccessExpression.test.js +137 -0
  350. package/dist/src/components/AccessExpression.test.js.map +1 -0
  351. package/dist/src/components/Block.d.ts +12 -0
  352. package/dist/src/components/Block.d.ts.map +1 -1
  353. package/dist/src/components/Block.js +12 -0
  354. package/dist/src/components/Block.js.map +1 -1
  355. package/dist/src/components/For.d.ts.map +1 -1
  356. package/dist/src/components/For.js +1 -1
  357. package/dist/src/components/For.js.map +1 -1
  358. package/dist/src/components/List.d.ts +11 -1
  359. package/dist/src/components/List.d.ts.map +1 -1
  360. package/dist/src/components/List.js +1 -1
  361. package/dist/src/components/List.js.map +1 -1
  362. package/dist/src/components/MemberDeclaration.d.ts +6 -6
  363. package/dist/src/components/MemberDeclaration.js +6 -6
  364. package/dist/src/components/MemberName.d.ts +6 -0
  365. package/dist/src/components/MemberName.d.ts.map +1 -1
  366. package/dist/src/components/MemberName.js +7 -0
  367. package/dist/src/components/MemberName.js.map +1 -1
  368. package/dist/src/components/MemberScope.d.ts +5 -0
  369. package/dist/src/components/MemberScope.d.ts.map +1 -1
  370. package/dist/src/components/MemberScope.js +5 -0
  371. package/dist/src/components/MemberScope.js.map +1 -1
  372. package/dist/src/components/Output.d.ts +4 -2
  373. package/dist/src/components/Output.d.ts.map +1 -1
  374. package/dist/src/components/Output.js.map +1 -1
  375. package/dist/src/components/Scope.d.ts +6 -0
  376. package/dist/src/components/Scope.d.ts.map +1 -1
  377. package/dist/src/components/Scope.js +6 -0
  378. package/dist/src/components/Scope.js.map +1 -1
  379. package/dist/src/components/SourceFile.d.ts +22 -2
  380. package/dist/src/components/SourceFile.d.ts.map +1 -1
  381. package/dist/src/components/SourceFile.js.map +1 -1
  382. package/dist/src/components/Switch.d.ts.map +1 -1
  383. package/dist/src/components/Switch.js +1 -1
  384. package/dist/src/components/Switch.js.map +1 -1
  385. package/dist/src/components/index.d.ts +1 -0
  386. package/dist/src/components/index.d.ts.map +1 -1
  387. package/dist/src/components/index.js +1 -0
  388. package/dist/src/components/index.js.map +1 -1
  389. package/dist/src/context/binder.d.ts +4 -0
  390. package/dist/src/context/binder.d.ts.map +1 -1
  391. package/dist/src/context/binder.js +5 -0
  392. package/dist/src/context/binder.js.map +1 -1
  393. package/dist/src/context/format-options.d.ts +14 -1
  394. package/dist/src/context/format-options.d.ts.map +1 -1
  395. package/dist/src/context/format-options.js +14 -1
  396. package/dist/src/context/format-options.js.map +1 -1
  397. package/dist/src/context/scope.d.ts +4 -0
  398. package/dist/src/context/scope.d.ts.map +1 -1
  399. package/dist/src/context/scope.js +5 -0
  400. package/dist/src/context/scope.js.map +1 -1
  401. package/dist/src/context/source-directory.d.ts +9 -0
  402. package/dist/src/context/source-directory.d.ts.map +1 -1
  403. package/dist/src/context/source-directory.js +9 -0
  404. package/dist/src/context/source-directory.js.map +1 -1
  405. package/dist/src/debug/cli.d.ts.map +1 -1
  406. package/dist/src/debug/cli.js +3 -2
  407. package/dist/src/debug/cli.js.map +1 -1
  408. package/dist/src/debug/diagnostics-broadcast.test.d.ts +2 -0
  409. package/dist/src/debug/diagnostics-broadcast.test.d.ts.map +1 -0
  410. package/dist/src/debug/diagnostics-broadcast.test.js +100 -0
  411. package/dist/src/debug/diagnostics-broadcast.test.js.map +1 -0
  412. package/dist/src/debug/diagnostics.test.js +3 -2
  413. package/dist/src/debug/diagnostics.test.js.map +1 -1
  414. package/dist/src/debug/effects.d.ts +12 -4
  415. package/dist/src/debug/effects.d.ts.map +1 -1
  416. package/dist/src/debug/effects.js +119 -54
  417. package/dist/src/debug/effects.js.map +1 -1
  418. package/dist/src/debug/effects.test.js +213 -41
  419. package/dist/src/debug/effects.test.js.map +1 -1
  420. package/dist/src/debug/files.d.ts.map +1 -1
  421. package/dist/src/debug/files.js +7 -18
  422. package/dist/src/debug/files.js.map +1 -1
  423. package/dist/src/debug/files.test.js +13 -36
  424. package/dist/src/debug/files.test.js.map +1 -1
  425. package/dist/src/debug/index.d.ts +4 -2
  426. package/dist/src/debug/index.d.ts.map +1 -1
  427. package/dist/src/debug/index.js +4 -2
  428. package/dist/src/debug/index.js.map +1 -1
  429. package/dist/src/debug/message-format.test.d.ts +2 -0
  430. package/dist/src/debug/message-format.test.d.ts.map +1 -0
  431. package/dist/src/debug/message-format.test.js +700 -0
  432. package/dist/src/debug/message-format.test.js.map +1 -0
  433. package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
  434. package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
  435. package/dist/src/debug/render-tree-orphans.test.js +297 -0
  436. package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
  437. package/dist/src/debug/render.d.ts.map +1 -1
  438. package/dist/src/debug/render.js +91 -131
  439. package/dist/src/debug/render.js.map +1 -1
  440. package/dist/src/debug/render.test.js +91 -128
  441. package/dist/src/debug/render.test.js.map +1 -1
  442. package/dist/src/debug/source-map.browser.d.ts +16 -0
  443. package/dist/src/debug/source-map.browser.d.ts.map +1 -0
  444. package/dist/src/debug/source-map.browser.js +24 -0
  445. package/dist/src/debug/source-map.browser.js.map +1 -0
  446. package/dist/src/debug/source-map.d.ts +22 -0
  447. package/dist/src/debug/source-map.d.ts.map +1 -0
  448. package/dist/src/debug/source-map.js +111 -0
  449. package/dist/src/debug/source-map.js.map +1 -0
  450. package/dist/src/debug/symbols.d.ts +6 -5
  451. package/dist/src/debug/symbols.d.ts.map +1 -1
  452. package/dist/src/debug/symbols.js +46 -23
  453. package/dist/src/debug/symbols.js.map +1 -1
  454. package/dist/src/debug/symbols.test.js +15 -26
  455. package/dist/src/debug/symbols.test.js.map +1 -1
  456. package/dist/src/debug/trace-writer.d.ts +56 -0
  457. package/dist/src/debug/trace-writer.d.ts.map +1 -0
  458. package/dist/src/debug/trace-writer.js +674 -0
  459. package/dist/src/debug/trace-writer.js.map +1 -0
  460. package/dist/src/debug/trace.d.ts +10 -10
  461. package/dist/src/debug/trace.d.ts.map +1 -1
  462. package/dist/src/debug/trace.js +41 -24
  463. package/dist/src/debug/trace.js.map +1 -1
  464. package/dist/src/devtools/devtools-protocol.d.ts +318 -161
  465. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  466. package/dist/src/devtools/devtools-server.browser.d.ts +1 -5
  467. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
  468. package/dist/src/devtools/devtools-server.browser.js +3 -3
  469. package/dist/src/devtools/devtools-server.browser.js.map +1 -1
  470. package/dist/src/devtools/devtools-server.d.ts +5 -6
  471. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  472. package/dist/src/devtools/devtools-server.js +227 -25
  473. package/dist/src/devtools/devtools-server.js.map +1 -1
  474. package/dist/src/devtools/devtools-transport.d.ts +2 -2
  475. package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
  476. package/dist/src/devtools/devtools-transport.js +2 -2
  477. package/dist/src/devtools/devtools-transport.js.map +1 -1
  478. package/dist/src/devtools-entry.browser.d.ts +1 -1
  479. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  480. package/dist/src/devtools-entry.browser.js.map +1 -1
  481. package/dist/src/devtools-entry.d.ts +1 -1
  482. package/dist/src/devtools-entry.d.ts.map +1 -1
  483. package/dist/src/devtools-entry.js.map +1 -1
  484. package/dist/src/diagnostics.d.ts +1 -1
  485. package/dist/src/diagnostics.d.ts.map +1 -1
  486. package/dist/src/diagnostics.js +27 -19
  487. package/dist/src/diagnostics.js.map +1 -1
  488. package/dist/src/host/node-host.browser.d.ts +11 -0
  489. package/dist/src/host/node-host.browser.d.ts.map +1 -0
  490. package/dist/src/host/node-host.browser.js +21 -0
  491. package/dist/src/host/node-host.browser.js.map +1 -0
  492. package/dist/src/host/node-host.d.ts +11 -0
  493. package/dist/src/host/node-host.d.ts.map +1 -0
  494. package/dist/src/host/node-host.js +20 -0
  495. package/dist/src/host/node-host.js.map +1 -0
  496. package/dist/src/library-symbol-reference.d.ts +52 -0
  497. package/dist/src/library-symbol-reference.d.ts.map +1 -1
  498. package/dist/src/library-symbol-reference.js +54 -0
  499. package/dist/src/library-symbol-reference.js.map +1 -1
  500. package/dist/src/name-policy.d.ts +30 -3
  501. package/dist/src/name-policy.d.ts.map +1 -1
  502. package/dist/src/name-policy.js +27 -0
  503. package/dist/src/name-policy.js.map +1 -1
  504. package/dist/src/reactivity.d.ts +28 -2
  505. package/dist/src/reactivity.d.ts.map +1 -1
  506. package/dist/src/reactivity.js +154 -45
  507. package/dist/src/reactivity.js.map +1 -1
  508. package/dist/src/render-stack.d.ts.map +1 -1
  509. package/dist/src/render-stack.js +4 -3
  510. package/dist/src/render-stack.js.map +1 -1
  511. package/dist/src/render.d.ts +2 -0
  512. package/dist/src/render.d.ts.map +1 -1
  513. package/dist/src/render.js +84 -30
  514. package/dist/src/render.js.map +1 -1
  515. package/dist/src/scheduler.d.ts +5 -0
  516. package/dist/src/scheduler.d.ts.map +1 -1
  517. package/dist/src/scheduler.js +94 -23
  518. package/dist/src/scheduler.js.map +1 -1
  519. package/dist/src/symbols/output-scope.d.ts +33 -1
  520. package/dist/src/symbols/output-scope.d.ts.map +1 -1
  521. package/dist/src/symbols/output-scope.js +34 -1
  522. package/dist/src/symbols/output-scope.js.map +1 -1
  523. package/dist/src/symbols/output-space.d.ts +12 -0
  524. package/dist/src/symbols/output-space.d.ts.map +1 -1
  525. package/dist/src/symbols/output-space.js +15 -0
  526. package/dist/src/symbols/output-space.js.map +1 -1
  527. package/dist/src/symbols/output-symbol.d.ts +128 -12
  528. package/dist/src/symbols/output-symbol.d.ts.map +1 -1
  529. package/dist/src/symbols/output-symbol.js +158 -18
  530. package/dist/src/symbols/output-symbol.js.map +1 -1
  531. package/dist/src/symbols/symbol-slot.d.ts.map +1 -1
  532. package/dist/src/symbols/symbol-slot.js +7 -0
  533. package/dist/src/symbols/symbol-slot.js.map +1 -1
  534. package/dist/src/symbols/symbol-slot.test.js +18 -1
  535. package/dist/src/symbols/symbol-slot.test.js.map +1 -1
  536. package/dist/src/symbols/symbol-table.d.ts.map +1 -1
  537. package/dist/src/symbols/symbol-table.js +13 -3
  538. package/dist/src/symbols/symbol-table.js.map +1 -1
  539. package/dist/src/utils.d.ts.map +1 -1
  540. package/dist/src/utils.js +11 -5
  541. package/dist/src/utils.js.map +1 -1
  542. package/dist/src/write-output.d.ts.map +1 -1
  543. package/dist/src/write-output.js +6 -5
  544. package/dist/src/write-output.js.map +1 -1
  545. package/dist/test/browser-build.test.js +66 -67
  546. package/dist/test/browser-build.test.js.map +1 -1
  547. package/dist/test/reactivity/shallow-reactive.test.js +4 -0
  548. package/dist/test/reactivity/shallow-reactive.test.js.map +1 -1
  549. package/dist/test/symbols/deconflicted-name.test.d.ts +2 -0
  550. package/dist/test/symbols/deconflicted-name.test.d.ts.map +1 -0
  551. package/dist/test/symbols/deconflicted-name.test.js +120 -0
  552. package/dist/test/symbols/deconflicted-name.test.js.map +1 -0
  553. package/dist/test/symbols/output-scope.test.js +41 -0
  554. package/dist/test/symbols/output-scope.test.js.map +1 -1
  555. package/dist/testing/create-test-wrapper.d.ts +75 -2
  556. package/dist/testing/create-test-wrapper.d.ts.map +1 -1
  557. package/dist/testing/create-test-wrapper.js +55 -1
  558. package/dist/testing/create-test-wrapper.js.map +1 -1
  559. package/dist/testing/devtools-utils.d.ts +12 -3
  560. package/dist/testing/devtools-utils.d.ts.map +1 -1
  561. package/dist/testing/devtools-utils.js +26 -4
  562. package/dist/testing/devtools-utils.js.map +1 -1
  563. package/dist/testing/extend-expect.d.ts +26 -0
  564. package/dist/testing/extend-expect.d.ts.map +1 -1
  565. package/dist/testing/extend-expect.js +20 -0
  566. package/dist/testing/extend-expect.js.map +1 -1
  567. package/dist/testing/index.d.ts +1 -1
  568. package/dist/testing/index.d.ts.map +1 -1
  569. package/dist/testing/index.js +1 -1
  570. package/dist/testing/index.js.map +1 -1
  571. package/dist/testing/render.d.ts +9 -0
  572. package/dist/testing/render.d.ts.map +1 -1
  573. package/dist/testing/render.js +11 -0
  574. package/dist/testing/render.js.map +1 -1
  575. package/dist/testing/vitest.d.js +12 -0
  576. package/dist/testing/vitest.d.js.map +1 -1
  577. package/dist/tsconfig.tsbuildinfo +1 -1
  578. package/docs/api/components/AppendRegion.md +83 -0
  579. package/docs/api/components/Block.md +49 -0
  580. package/docs/api/components/CopyFile.md +26 -0
  581. package/docs/api/components/Declaration.md +85 -0
  582. package/docs/api/components/For.md +91 -0
  583. package/docs/api/components/Indent.md +40 -0
  584. package/docs/api/components/List.md +68 -0
  585. package/docs/api/components/MemberDeclaration.md +89 -0
  586. package/docs/api/components/MemberName.md +21 -0
  587. package/docs/api/components/MemberScope.md +81 -0
  588. package/docs/api/components/Name.md +19 -0
  589. package/docs/api/components/Output.md +62 -0
  590. package/docs/api/components/Prose.md +29 -0
  591. package/docs/api/components/ReferenceOrContent.md +28 -0
  592. package/docs/api/components/Scope.md +83 -0
  593. package/docs/api/components/Show.md +32 -0
  594. package/docs/api/components/SourceDirectory.md +28 -0
  595. package/docs/api/components/SourceFile.md +60 -0
  596. package/docs/api/components/StatementList.md +29 -0
  597. package/docs/api/components/Switch.md +42 -0
  598. package/docs/api/components/TemplateFile.md +71 -0
  599. package/docs/api/components/TemplateVariable.md +57 -0
  600. package/docs/api/components/UpdateFile.md +56 -0
  601. package/docs/api/components/Wrap.md +40 -0
  602. package/docs/api/components/createAccessExpression.md +55 -0
  603. package/docs/api/components/index.md +27 -0
  604. package/docs/api/contexts/Assignment-context.md +43 -0
  605. package/docs/api/contexts/Binder-context.md +22 -0
  606. package/docs/api/contexts/Declaration-context.md +15 -0
  607. package/docs/api/contexts/Member-context.md +17 -0
  608. package/docs/api/contexts/MemberDeclaration-context.md +24 -0
  609. package/docs/api/contexts/NamePolicy-context.md +18 -0
  610. package/docs/api/contexts/Scope-context.md +20 -0
  611. package/docs/api/contexts/SourceDirectory-context.md +26 -0
  612. package/docs/api/contexts/SourceFile-context.md +19 -0
  613. package/docs/api/contexts/index.md +11 -0
  614. package/docs/api/functions/attachDiagnosticsCollector.md +18 -0
  615. package/docs/api/functions/baseListPropsToMapJoinArgs.md +20 -0
  616. package/docs/api/functions/children.md +27 -0
  617. package/docs/api/functions/childrenArray.md +25 -0
  618. package/docs/api/functions/code.md +25 -0
  619. package/docs/api/functions/computed.md +18 -0
  620. package/docs/api/functions/createComponent.md +20 -0
  621. package/docs/api/functions/createContentSlot.md +33 -0
  622. package/docs/api/functions/createContext.md +19 -0
  623. package/docs/api/functions/createCustomContext.md +18 -0
  624. package/docs/api/functions/createDeclarationTap.md +20 -0
  625. package/docs/api/functions/createFileResource.md +35 -0
  626. package/docs/api/functions/createFormatOptionsContextFor.md +28 -0
  627. package/docs/api/functions/createIntrinsic.md +19 -0
  628. package/docs/api/functions/createMemberTap.md +20 -0
  629. package/docs/api/functions/createNamePolicy.md +37 -0
  630. package/docs/api/functions/createNamedContext.md +19 -0
  631. package/docs/api/functions/createOutputBinder.md +24 -0
  632. package/docs/api/functions/createRenderTreeHook.md +19 -0
  633. package/docs/api/functions/createResource.md +77 -0
  634. package/docs/api/functions/createScope.md +35 -0
  635. package/docs/api/functions/createScopeTap.md +20 -0
  636. package/docs/api/functions/createSourceFileTap.md +20 -0
  637. package/docs/api/functions/createSymbol.md +25 -0
  638. package/docs/api/functions/createSymbolSlot.md +19 -0
  639. package/docs/api/functions/createTap.md +55 -0
  640. package/docs/api/functions/decl.md +20 -0
  641. package/docs/api/functions/defaultProps.md +21 -0
  642. package/docs/api/functions/effect.md +26 -0
  643. package/docs/api/functions/emitDiagnostic.md +18 -0
  644. package/docs/api/functions/emitSymbol.md +18 -0
  645. package/docs/api/functions/ensureIsEmpty.md +20 -0
  646. package/docs/api/functions/findCurrentEffectId.md +19 -0
  647. package/docs/api/functions/findKeyedChild.md +19 -0
  648. package/docs/api/functions/findKeyedChildren.md +19 -0
  649. package/docs/api/functions/findUnkeyedChildren.md +18 -0
  650. package/docs/api/functions/formatReactivePropertyLabel.md +21 -0
  651. package/docs/api/functions/getAssignmentSymbol.md +19 -0
  652. package/docs/api/functions/getContext.md +17 -0
  653. package/docs/api/functions/getContextForRenderNode.md +18 -0
  654. package/docs/api/functions/getDiagnosticsForTree.md +18 -0
  655. package/docs/api/functions/getEffectDebugId.md +18 -0
  656. package/docs/api/functions/getElementCache.md +17 -0
  657. package/docs/api/functions/getReactiveCreationLocation.md +18 -0
  658. package/docs/api/functions/getSymbolCreator.md +18 -0
  659. package/docs/api/functions/getSymbolCreatorSymbol.md +17 -0
  660. package/docs/api/functions/index.md +105 -0
  661. package/docs/api/functions/inspectRefkey.md +18 -0
  662. package/docs/api/functions/instantiateTakenMembersTo.md +20 -0
  663. package/docs/api/functions/isComponentCreator.md +19 -0
  664. package/docs/api/functions/isCustomContext.md +18 -0
  665. package/docs/api/functions/isIntrinsicElement.md +18 -0
  666. package/docs/api/functions/isKeyedChild.md +18 -0
  667. package/docs/api/functions/isLibrarySymbolReference.md +18 -0
  668. package/docs/api/functions/isMemberRefkey.md +18 -0
  669. package/docs/api/functions/isNamekey.md +18 -0
  670. package/docs/api/functions/isPrintHook.md +18 -0
  671. package/docs/api/functions/isRefkey.md +18 -0
  672. package/docs/api/functions/isRefkeyable.md +18 -0
  673. package/docs/api/functions/isRenderableObject.md +20 -0
  674. package/docs/api/functions/isSymbolRefkey.md +18 -0
  675. package/docs/api/functions/join.md +33 -0
  676. package/docs/api/functions/mapJoin.md +106 -0
  677. package/docs/api/functions/memberRefkey.md +27 -0
  678. package/docs/api/functions/memo.md +29 -0
  679. package/docs/api/functions/mergeProps.md +64 -0
  680. package/docs/api/functions/moveTakenMembersTo.md +18 -0
  681. package/docs/api/functions/namekey.md +41 -0
  682. package/docs/api/functions/nextReactiveId.md +19 -0
  683. package/docs/api/functions/notifyContentState.md +17 -0
  684. package/docs/api/functions/onCleanup.md +26 -0
  685. package/docs/api/functions/printTree.md +31 -0
  686. package/docs/api/functions/reactivePropertyRefId.md +21 -0
  687. package/docs/api/functions/ref.md +21 -0
  688. package/docs/api/functions/refId.md +18 -0
  689. package/docs/api/functions/refkey.md +24 -0
  690. package/docs/api/functions/render.md +31 -0
  691. package/docs/api/functions/renderAsync.md +31 -0
  692. package/docs/api/functions/renderTree.md +18 -0
  693. package/docs/api/functions/reportDiagnostics.md +18 -0
  694. package/docs/api/functions/resetRefIdCounter.md +17 -0
  695. package/docs/api/functions/resolve.md +31 -0
  696. package/docs/api/functions/root.md +25 -0
  697. package/docs/api/functions/shallowReactive.md +18 -0
  698. package/docs/api/functions/shallowRef.md +21 -0
  699. package/docs/api/functions/sourceFilesForTree.md +31 -0
  700. package/docs/api/functions/splitProps.md +19 -0
  701. package/docs/api/functions/stc.md +18 -0
  702. package/docs/api/functions/sti.md +18 -0
  703. package/docs/api/functions/symbolForRefkey.md +24 -0
  704. package/docs/api/functions/taggedComponent.md +19 -0
  705. package/docs/api/functions/takeSymbols.md +18 -0
  706. package/docs/api/functions/text.md +19 -0
  707. package/docs/api/functions/toRef.md +20 -0
  708. package/docs/api/functions/toRefkey.md +18 -0
  709. package/docs/api/functions/toRefs.md +20 -0
  710. package/docs/api/functions/traverseOutput.md +21 -0
  711. package/docs/api/functions/unresolvedRefkey.md +18 -0
  712. package/docs/api/functions/untrack.md +18 -0
  713. package/docs/api/functions/useContext.md +18 -0
  714. package/docs/api/functions/useFormatOptions.md +18 -0
  715. package/docs/api/functions/useMemberContext.md +17 -0
  716. package/docs/api/functions/useMemberScope.md +17 -0
  717. package/docs/api/functions/writeOutput.md +21 -0
  718. package/docs/api/index.md +9 -0
  719. package/docs/api/testing/functions/createTestWrapper.md +70 -0
  720. package/docs/api/testing/functions/d.md +21 -0
  721. package/docs/api/testing/functions/dedent.md +18 -0
  722. package/docs/api/testing/functions/index.md +6 -0
  723. package/docs/api/testing/functions/renderToString.md +20 -0
  724. package/docs/api/testing/index.md +4 -0
  725. package/docs/api/testing/types/TestWrapper.md +10 -0
  726. package/docs/api/testing/types/ToRenderToOptions.md +24 -0
  727. package/docs/api/testing/types/index.md +4 -0
  728. package/docs/api/types/AlignIntrinsicElement.md +5 -0
  729. package/docs/api/types/AppendRegionProps.md +5 -0
  730. package/docs/api/types/BaseListProps.md +21 -0
  731. package/docs/api/types/BasePartProps.md +10 -0
  732. package/docs/api/types/BasicScope.md +15 -0
  733. package/docs/api/types/BasicSymbol.md +18 -0
  734. package/docs/api/types/Binder.md +18 -0
  735. package/docs/api/types/BinderOptions.md +7 -0
  736. package/docs/api/types/BrIntrinsicElement.md +5 -0
  737. package/docs/api/types/BreakParentIntrinsicElement.md +5 -0
  738. package/docs/api/types/Child.md +5 -0
  739. package/docs/api/types/Children.md +5 -0
  740. package/docs/api/types/ChildrenOptions.md +7 -0
  741. package/docs/api/types/CommonFormatOptions.md +8 -0
  742. package/docs/api/types/Component.md +8 -0
  743. package/docs/api/types/ComponentContext.md +11 -0
  744. package/docs/api/types/ComponentCreator.md +11 -0
  745. package/docs/api/types/ComponentDefinition.md +7 -0
  746. package/docs/api/types/ContentOutputFile.md +10 -0
  747. package/docs/api/types/ContentSlot.md +12 -0
  748. package/docs/api/types/Context.md +19 -0
  749. package/docs/api/types/ContextProviderProps.md +8 -0
  750. package/docs/api/types/CopyFileContext.md +8 -0
  751. package/docs/api/types/CopyOutputFile.md +9 -0
  752. package/docs/api/types/CustomContext.md +10 -0
  753. package/docs/api/types/CustomContextChildrenCallback.md +5 -0
  754. package/docs/api/types/DeclarationProps.md +5 -0
  755. package/docs/api/types/DedentIntrinsicElement.md +5 -0
  756. package/docs/api/types/DedentToRootIntrinsicElement.md +5 -0
  757. package/docs/api/types/Diagnostic.md +11 -0
  758. package/docs/api/types/DiagnosticHandle.md +7 -0
  759. package/docs/api/types/DiagnosticInput.md +10 -0
  760. package/docs/api/types/DiagnosticSeverity.md +5 -0
  761. package/docs/api/types/DiagnosticStackEntry.md +9 -0
  762. package/docs/api/types/DiagnosticsCollector.md +8 -0
  763. package/docs/api/types/Disposable_2.md +7 -0
  764. package/docs/api/types/EffectDebugOptions.md +8 -0
  765. package/docs/api/types/EffectOptions.md +7 -0
  766. package/docs/api/types/ElementCache.md +5 -0
  767. package/docs/api/types/ElementCacheKey.md +5 -0
  768. package/docs/api/types/FillIntrinsicElement.md +5 -0
  769. package/docs/api/types/ForCallbackArgs.md +5 -0
  770. package/docs/api/types/ForSupportedCollections.md +5 -0
  771. package/docs/api/types/GroupIntrinsicElement.md +5 -0
  772. package/docs/api/types/HardlineIntrinsicElement.md +5 -0
  773. package/docs/api/types/HbrIntrinsicElement.md +5 -0
  774. package/docs/api/types/IfBreakIntrinsicElement.md +5 -0
  775. package/docs/api/types/IndentIfBreakIntrinsicElement.md +5 -0
  776. package/docs/api/types/IndentIntrinsicElement.md +5 -0
  777. package/docs/api/types/IntrinsicElement.md +5 -0
  778. package/docs/api/types/IntrinsicElementBase.md +9 -0
  779. package/docs/api/types/IntrinsicElements.md +26 -0
  780. package/docs/api/types/JoinOptions.md +9 -0
  781. package/docs/api/types/LbrIntrinsicElement.md +5 -0
  782. package/docs/api/types/LibrarySymbolReference.md +13 -0
  783. package/docs/api/types/LineIntrinsicElement.md +5 -0
  784. package/docs/api/types/LineSuffixBoundaryIntrinsicElement.md +5 -0
  785. package/docs/api/types/LineSuffixIntrinsicElement.md +5 -0
  786. package/docs/api/types/LiterallineIntrinsicElement.md +5 -0
  787. package/docs/api/types/MakeChildrenOptional.md +7 -0
  788. package/docs/api/types/MarkAsRootIntrinsicElement.md +5 -0
  789. package/docs/api/types/MatchProps.md +9 -0
  790. package/docs/api/types/MemberDeclarationProps.md +5 -0
  791. package/docs/api/types/MemberDescriptor.md +10 -0
  792. package/docs/api/types/MemberRefkey.md +10 -0
  793. package/docs/api/types/MemberResolutionContext.md +10 -0
  794. package/docs/api/types/MemberResolver.md +32 -0
  795. package/docs/api/types/MemberScopeProps.md +5 -0
  796. package/docs/api/types/Metadata.md +5 -0
  797. package/docs/api/types/NameConflictResolver.md +27 -0
  798. package/docs/api/types/NamePolicy.md +8 -0
  799. package/docs/api/types/NamePolicyGetter.md +9 -0
  800. package/docs/api/types/Namekey.md +10 -0
  801. package/docs/api/types/NamekeyOptions.md +8 -0
  802. package/docs/api/types/OnReactiveSetAddCallback.md +5 -0
  803. package/docs/api/types/OnReactiveSetDeleteCallback.md +5 -0
  804. package/docs/api/types/OutputDeclarationSpace.md +13 -0
  805. package/docs/api/types/OutputDirectory.md +59 -0
  806. package/docs/api/types/OutputFile.md +5 -0
  807. package/docs/api/types/OutputFileBase.md +8 -0
  808. package/docs/api/types/OutputMemberSpace.md +13 -0
  809. package/docs/api/types/OutputScope.md +33 -0
  810. package/docs/api/types/OutputScopeOptions.md +9 -0
  811. package/docs/api/types/OutputSpace.md +7 -0
  812. package/docs/api/types/OutputSymbol.md +78 -0
  813. package/docs/api/types/OutputSymbolOptions.md +16 -0
  814. package/docs/api/types/OutputVisitor.md +10 -0
  815. package/docs/api/types/PrintHook.md +10 -0
  816. package/docs/api/types/PrintTreeOptions.md +11 -0
  817. package/docs/api/types/Props.md +5 -0
  818. package/docs/api/types/ReactiveUnionSet.md +20 -0
  819. package/docs/api/types/ReactiveUnionSetOptions.md +8 -0
  820. package/docs/api/types/Refkey.md +5 -0
  821. package/docs/api/types/Refkeyable.md +5 -0
  822. package/docs/api/types/RefkeyableObject.md +7 -0
  823. package/docs/api/types/RenderableObject.md +9 -0
  824. package/docs/api/types/RenderedTextTree.md +5 -0
  825. package/docs/api/types/ResolutionResult.md +39 -0
  826. package/docs/api/types/ResolveDeclarationByKeyOptions.md +7 -0
  827. package/docs/api/types/Resource.md +11 -0
  828. package/docs/api/types/RootOptions.md +7 -0
  829. package/docs/api/types/SbrIntrinsicElement.md +5 -0
  830. package/docs/api/types/ScopeProps.md +5 -0
  831. package/docs/api/types/SoftlineIntrinsicElement.md +5 -0
  832. package/docs/api/types/SourceLocation.md +9 -0
  833. package/docs/api/types/SplitProps.md +12 -0
  834. package/docs/api/types/StcComponentCreator.md +9 -0
  835. package/docs/api/types/StcSignature.md +5 -0
  836. package/docs/api/types/StiComponentCreator.md +9 -0
  837. package/docs/api/types/StiSignature.md +7 -0
  838. package/docs/api/types/SymbolCreator.md +15 -0
  839. package/docs/api/types/SymbolRefkey.md +9 -0
  840. package/docs/api/types/SymbolSlot.md +12 -0
  841. package/docs/api/types/SymbolTable.md +15 -0
  842. package/docs/api/types/TakeSymbolCallback.md +7 -0
  843. package/docs/api/types/TakeSymbolsCallback.md +7 -0
  844. package/docs/api/types/Tap.md +11 -0
  845. package/docs/api/types/TapHandler.md +9 -0
  846. package/docs/api/types/Tapper.md +9 -0
  847. package/docs/api/types/TemplateVariableProps.md +5 -0
  848. package/docs/api/types/index.md +122 -0
  849. package/docs/api/variables/FormatOptions.md +5 -0
  850. package/docs/api/variables/Match.md +7 -0
  851. package/docs/api/variables/REFKEYABLE.md +5 -0
  852. package/docs/api/variables/RENDERABLE.md +5 -0
  853. package/docs/api/variables/TO_SYMBOL.md +39 -0
  854. package/docs/api/variables/contextsByKey.md +5 -0
  855. package/docs/api/variables/index.md +11 -0
  856. package/docs/api/variables/intrinsicElementKey.md +5 -0
  857. package/docs/api/variables/matchTag.md +5 -0
  858. package/docs/api/variables/printHookTag.md +7 -0
  859. package/docs/components.md +97 -0
  860. package/docs/context.md +67 -0
  861. package/docs/control-flow.md +5 -0
  862. package/docs/debugging.md +105 -0
  863. package/docs/formatting.md +99 -0
  864. package/docs/guides/language-package-guide.md +593 -0
  865. package/docs/guides/references-and-refkeys.md +210 -0
  866. package/docs/guides/style-guide.md +244 -0
  867. package/docs/index.md +22 -0
  868. package/docs/reactivity.md +68 -0
  869. package/docs/rendering.md +41 -0
  870. package/docs/symbols-and-scopes.md +180 -0
  871. package/package.json +16 -6
  872. package/src/binder.ts +154 -41
  873. package/src/components/AccessExpression.test.tsx +132 -0
  874. package/src/components/AccessExpression.tsx +344 -0
  875. package/src/components/Block.tsx +12 -0
  876. package/src/components/For.tsx +14 -10
  877. package/src/components/List.tsx +18 -5
  878. package/src/components/MemberDeclaration.tsx +6 -6
  879. package/src/components/MemberName.tsx +6 -0
  880. package/src/components/MemberScope.tsx +5 -0
  881. package/src/components/Output.tsx +4 -1
  882. package/src/components/Scope.tsx +6 -0
  883. package/src/components/SourceFile.tsx +22 -2
  884. package/src/components/Switch.tsx +11 -7
  885. package/src/components/index.tsx +1 -0
  886. package/src/context/binder.ts +4 -0
  887. package/src/context/format-options.ts +14 -1
  888. package/src/context/scope.ts +4 -0
  889. package/src/context/source-directory.ts +9 -0
  890. package/src/debug/cli.ts +3 -2
  891. package/src/debug/diagnostics-broadcast.test.tsx +98 -0
  892. package/src/debug/diagnostics.test.tsx +3 -2
  893. package/src/debug/effects.test.tsx +248 -36
  894. package/src/debug/effects.ts +198 -64
  895. package/src/debug/files.test.tsx +15 -35
  896. package/src/debug/files.ts +11 -11
  897. package/src/debug/index.ts +4 -0
  898. package/src/debug/message-format.test.tsx +759 -0
  899. package/src/debug/render-tree-orphans.test.tsx +344 -0
  900. package/src/debug/render.test.tsx +96 -118
  901. package/src/debug/render.ts +196 -125
  902. package/src/debug/source-map.browser.ts +30 -0
  903. package/src/debug/source-map.ts +135 -0
  904. package/src/debug/symbols.test.tsx +19 -20
  905. package/src/debug/symbols.ts +106 -23
  906. package/src/debug/trace-writer.ts +984 -0
  907. package/src/debug/trace.ts +46 -32
  908. package/src/devtools/devtools-protocol.ts +361 -176
  909. package/src/devtools/devtools-server.browser.ts +4 -9
  910. package/src/devtools/devtools-server.ts +226 -33
  911. package/src/devtools/devtools-transport.ts +4 -4
  912. package/src/devtools-entry.browser.ts +11 -15
  913. package/src/devtools-entry.ts +9 -15
  914. package/src/diagnostics.ts +44 -22
  915. package/src/host/node-host.browser.ts +23 -0
  916. package/src/host/node-host.ts +22 -0
  917. package/src/library-symbol-reference.ts +52 -0
  918. package/src/name-policy.ts +30 -3
  919. package/src/reactivity.ts +179 -55
  920. package/src/render-stack.ts +4 -3
  921. package/src/render.ts +106 -30
  922. package/src/scheduler.ts +145 -26
  923. package/src/symbols/output-scope.ts +33 -1
  924. package/src/symbols/output-space.ts +13 -0
  925. package/src/symbols/output-symbol.ts +185 -22
  926. package/src/symbols/symbol-slot.test.tsx +28 -1
  927. package/src/symbols/symbol-slot.tsx +8 -0
  928. package/src/symbols/symbol-table.ts +13 -3
  929. package/src/utils.tsx +7 -4
  930. package/src/write-output.ts +6 -5
  931. package/temp/api-testing.json +673 -0
  932. package/temp/api.json +895 -73
  933. package/test/browser-build.test.ts +71 -78
  934. package/test/reactivity/shallow-reactive.test.tsx +4 -0
  935. package/test/symbols/deconflicted-name.test.ts +120 -0
  936. package/test/symbols/output-scope.test.ts +38 -0
  937. package/testing/create-test-wrapper.tsx +81 -2
  938. package/testing/devtools-utils.ts +46 -4
  939. package/testing/extend-expect.ts +22 -1
  940. package/testing/index.ts +1 -1
  941. package/testing/render.ts +9 -0
  942. package/testing/vitest.d.ts +18 -3
  943. package/vitest.config.ts +8 -0
@@ -1,91 +1,84 @@
1
- import { execSync } from "child_process";
2
1
  import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
3
2
  import { join } from "path";
3
+ import { build, type Rolldown } from "vite";
4
4
  import { afterAll, beforeAll, describe, expect, it } from "vitest";
5
5
 
6
- const testDir = join(__dirname, ".temp", "vite-test-project");
6
+ const tempDir = join(__dirname, ".temp", "browser-build-test");
7
+ const entryFile = join(tempDir, "entry.js");
7
8
 
8
- describe("Browser Build Test", () => {
9
- beforeAll(() => {
10
- // Cleanup previous runs
11
- if (existsSync(testDir)) {
12
- rmSync(testDir, { recursive: true, force: true });
13
- }
14
-
15
- // Create a temporary Vite project
16
- mkdirSync(testDir, { recursive: true });
17
-
18
- execSync("npm init -y", { cwd: testDir });
19
- execSync("npm install vite", { cwd: testDir });
20
- execSync("npm install ../../..", { cwd: testDir });
21
-
22
- // Create a minimal Vite app
23
- writeFileSync(
24
- join(testDir, "index.js"),
25
- `
26
- import { writeOutput } from "@alloy-js/core";
27
- console.log("Alloy-js core imported successfully!", writeOutput);
28
- `,
29
- );
30
-
31
- writeFileSync(
32
- join(testDir, "vite.config.js"),
33
- `
34
- import { defineConfig } from "vite";
35
-
36
- export default defineConfig({
37
- build: {
38
- outDir: "dist",
39
- target: "esnext",
40
- }
41
- });
42
- `,
43
- );
44
-
45
- // Create an index.html file
46
- writeFileSync(
47
- join(testDir, "index.html"),
48
- `
49
- <!DOCTYPE html>
50
- <html lang="en">
51
- <head>
52
- <meta charset="UTF-8">
53
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
54
- <title>Vite Test</title>
55
- </head>
56
- <body>
57
- <script type="module" src="/index.js"></script>
58
- </body>
59
- </html>
60
- `,
61
- );
62
-
63
- writeFileSync(
64
- join(testDir, "package.json"),
65
- JSON.stringify(
66
- {
67
- type: "module",
68
- scripts: {
69
- build: "vite build",
70
- },
9
+ /**
10
+ * Bundles `@alloy-js/core` for the browser using Vite and returns
11
+ * the concatenated output code.
12
+ *
13
+ * Uses the `browser` export condition from the package exports map,
14
+ * which resolves to the compiled browser entry. This requires the
15
+ * package to be built first (the CI pipeline and `pnpm build` handle
16
+ * this automatically).
17
+ */
18
+ async function bundleForBrowser(): Promise<string> {
19
+ const result = await build({
20
+ configFile: false,
21
+ logLevel: "silent",
22
+ resolve: {
23
+ conditions: ["browser", "import"],
24
+ },
25
+ // Disable automatic process.env replacement so we can detect leaks
26
+ define: {},
27
+ build: {
28
+ write: false,
29
+ minify: false,
30
+ rollupOptions: {
31
+ input: entryFile,
32
+ output: { format: "es" },
33
+ // Disable tree-shaking so we catch process.* references in ANY
34
+ // code path, even if it would be removed in a production build.
35
+ treeshake: false,
36
+ external: (id) => {
37
+ // Bundle @alloy-js packages — these are what we're validating
38
+ if (id.startsWith("@alloy-js/")) return false;
39
+ // Bundle relative/absolute imports (intra-package)
40
+ if (id.startsWith(".") || id.startsWith("/")) return false;
41
+ // Externalize third-party deps (vue, pathe, picocolors, …)
42
+ return true;
71
43
  },
72
- null,
73
- 2,
74
- ),
75
- );
76
- }, 30_000);
44
+ },
45
+ },
46
+ });
47
+
48
+ const output = (
49
+ Array.isArray(result) ?
50
+ result[0]
51
+ : result) as Rolldown.RolldownOutput;
52
+ const chunks = output.output.filter(
53
+ (o): o is Rolldown.OutputChunk => o.type === "chunk",
54
+ );
55
+ return chunks.map((c) => c.code).join("\n");
56
+ }
77
57
 
78
- it("Vite should build successfully", () => {
79
- // Run Vite build process and wait for completion
80
- expect(() => {
81
- execSync("npm run build", { cwd: testDir, stdio: "inherit" });
82
- }).not.toThrow();
58
+ describe("browser build", () => {
59
+ beforeAll(() => {
60
+ if (existsSync(tempDir)) {
61
+ rmSync(tempDir, { recursive: true, force: true });
62
+ }
63
+ mkdirSync(tempDir, { recursive: true });
64
+ writeFileSync(entryFile, 'export * from "@alloy-js/core";\n');
83
65
  });
84
66
 
85
67
  afterAll(() => {
86
- // Ensure testDir exists before attempting to remove it
87
- if (existsSync(testDir)) {
88
- rmSync(testDir, { recursive: true, force: true });
68
+ if (existsSync(tempDir)) {
69
+ rmSync(tempDir, { recursive: true, force: true });
89
70
  }
90
71
  });
72
+
73
+ it("should bundle for browser without Node.js polyfills", async () => {
74
+ const code = await bundleForBrowser();
75
+
76
+ // The browser bundle must not reference the Node.js `process` global.
77
+ // If this fails, a file is using process.env / process.cwd / etc.
78
+ // without going through host/node-host.ts (or another browser-overridden module).
79
+ expect(code).not.toMatch(/\bprocess\./);
80
+
81
+ // Should not contain static require("node:…") calls
82
+ expect(code).not.toMatch(/require\(\s*["']node:/);
83
+ }, 30_000);
91
84
  });
@@ -1,4 +1,5 @@
1
1
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import { refreshDebugState } from "../../src/devtools/devtools-server.js";
2
3
  import {
3
4
  getReactiveCreationLocation,
4
5
  shallowReactive,
@@ -10,6 +11,7 @@ describe("shallowReactive creation location", () => {
10
11
  beforeEach(() => {
11
12
  origDebug = process.env.ALLOY_DEBUG;
12
13
  process.env.ALLOY_DEBUG = "1";
14
+ refreshDebugState();
13
15
  });
14
16
 
15
17
  afterEach(() => {
@@ -18,6 +20,7 @@ describe("shallowReactive creation location", () => {
18
20
  } else {
19
21
  process.env.ALLOY_DEBUG = origDebug;
20
22
  }
23
+ refreshDebugState();
21
24
  });
22
25
 
23
26
  it("stores creation location keyed by raw target when debug enabled", () => {
@@ -31,6 +34,7 @@ describe("shallowReactive creation location", () => {
31
34
 
32
35
  it("does not store location when debug is disabled", () => {
33
36
  delete process.env.ALLOY_DEBUG;
37
+ refreshDebugState();
34
38
  const raw = { y: 2 };
35
39
  shallowReactive(raw);
36
40
 
@@ -0,0 +1,120 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Binder, createOutputBinder } from "../../src/binder.js";
3
+ import { flushJobs } from "../../src/scheduler.js";
4
+ import { BasicScope } from "../../src/symbols/basic-scope.js";
5
+ import { BasicSymbol } from "../../src/symbols/basic-symbol.js";
6
+ import type { OutputSymbol } from "../../src/symbols/output-symbol.js";
7
+
8
+ function setup(
9
+ nameConflictResolver?: (name: string, syms: OutputSymbol[]) => void,
10
+ ) {
11
+ const binder: Binder = createOutputBinder({ nameConflictResolver });
12
+ const scope = new BasicScope("root", undefined, { binder });
13
+ return { binder, scope };
14
+ }
15
+
16
+ describe("deconflictedName", () => {
17
+ it("default resolver renames losers via deconflictedName and reverts on removal", () => {
18
+ const { scope } = setup();
19
+ const a = new BasicSymbol("foo", scope.symbols, {});
20
+ const b = new BasicSymbol("foo", scope.symbols, {});
21
+ flushJobs();
22
+ expect(a.name).toBe("foo");
23
+ expect(b.name).toBe("foo_2");
24
+ expect(a.deconflictedName).toBeUndefined();
25
+ expect(b.deconflictedName).toBe("foo_2");
26
+
27
+ b.delete();
28
+ flushJobs();
29
+ expect(a.name).toBe("foo");
30
+ expect(a.deconflictedName).toBeUndefined();
31
+ });
32
+
33
+ it("works with a custom rename scheme that doesn't match the default _N pattern", () => {
34
+ // Resolver uses a `$foo` prefix instead of `foo_N` suffix — the old
35
+ // isAutoAlias regex would never match this.
36
+ const customResolver = (_: string, symbols: OutputSymbol[]) => {
37
+ if (symbols.length === 0) return;
38
+ symbols[0].deconflictedName = undefined;
39
+ for (let i = 1; i < symbols.length; i++) {
40
+ symbols[i].deconflictedName = "$" + symbols[i].originalName;
41
+ }
42
+ };
43
+ const { scope } = setup(customResolver);
44
+
45
+ const a = new BasicSymbol("foo", scope.symbols, {});
46
+ const b = new BasicSymbol("foo", scope.symbols, {});
47
+ flushJobs();
48
+ expect(a.name).toBe("foo");
49
+ expect(b.name).toBe("$foo");
50
+
51
+ b.delete();
52
+ flushJobs();
53
+ // Survivor reverts to the original name regardless of scheme.
54
+ expect(a.name).toBe("foo");
55
+ expect(a.deconflictedName).toBeUndefined();
56
+ });
57
+
58
+ it("direct .name assignment does not clear an active deconflictedName", () => {
59
+ const { scope } = setup();
60
+ const a = new BasicSymbol("foo", scope.symbols, {});
61
+ const b = new BasicSymbol("foo", scope.symbols, {});
62
+ flushJobs();
63
+ expect(b.name).toBe("foo_2");
64
+
65
+ // User-assigns the name while a conflict rename is active.
66
+ b.name = "bar";
67
+ // Effective name still shows the deconflict rename (resolver wins while active).
68
+ expect(b.name).toBe("foo_2");
69
+
70
+ // Once the collision clears, the user-assigned name takes effect.
71
+ a.delete();
72
+ flushJobs();
73
+ expect(b.deconflictedName).toBeUndefined();
74
+ expect(b.name).toBe("bar");
75
+ });
76
+
77
+ it("detects conflict when different original names normalize to the same policy name", () => {
78
+ // Mirrors PR #394: under camelCase, `foo_bar` and `fooBar` both become
79
+ // `fooBar` — they collide on the rendered name and should be deconflicted.
80
+ const toCamel = (n: string) =>
81
+ n.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
82
+ const { scope } = setup();
83
+
84
+ const a = new BasicSymbol("foo_bar", scope.symbols, {
85
+ namePolicy: toCamel,
86
+ });
87
+ const b = new BasicSymbol("fooBar", scope.symbols, {
88
+ namePolicy: toCamel,
89
+ });
90
+ flushJobs();
91
+
92
+ expect(a.name).toBe("fooBar");
93
+ // Without canonical-name grouping, `b` would keep its original `fooBar`
94
+ // and silently collide with `a`'s policy-applied name.
95
+ expect(b.name).not.toBe("fooBar");
96
+ expect(b.name).toMatch(/^fooBar/);
97
+ });
98
+
99
+ it("survivor reverts when the winner is removed (canonical-name cohort lookup)", () => {
100
+ // After `a` is removed, the delete hook must find `b` as a member of the
101
+ // same canonical-name cohort so it can clear its deconflictedName.
102
+ const toCamel = (n: string) =>
103
+ n.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
104
+ const { scope } = setup();
105
+
106
+ const a = new BasicSymbol("foo_bar", scope.symbols, {
107
+ namePolicy: toCamel,
108
+ });
109
+ const b = new BasicSymbol("fooBar", scope.symbols, {
110
+ namePolicy: toCamel,
111
+ });
112
+ flushJobs();
113
+ expect(b.deconflictedName).toBeDefined();
114
+
115
+ a.delete();
116
+ flushJobs();
117
+ expect(b.deconflictedName).toBeUndefined();
118
+ expect(b.name).toBe("fooBar");
119
+ });
120
+ });
@@ -206,3 +206,41 @@ describe("OutputScope#children", () => {
206
206
  expect(child2.parent).toBe(parentScope);
207
207
  });
208
208
  });
209
+
210
+ describe("symbol name deduplication with name policy", () => {
211
+ it("deduplicates symbols whose names collide after name policy", () => {
212
+ const scope = createScope("scope");
213
+ const policy = (name: string) => name.toUpperCase();
214
+ const [s1] = createSymbol("foo", scope, { namePolicy: policy });
215
+ const [s2] = createSymbol("FOO", scope, { namePolicy: policy });
216
+
217
+ flushJobs();
218
+
219
+ expect(s1.name).toBe("FOO");
220
+ expect(s2.name).toBe("FOO_2");
221
+ });
222
+
223
+ it("deduplicates symbols when policy adds a prefix", () => {
224
+ const scope = createScope("scope");
225
+ const policy = (name: string) => (name === "reserved" ? `@${name}` : name);
226
+ const [s1] = createSymbol("reserved", scope, { namePolicy: policy });
227
+ const [s2] = createSymbol("reserved", scope, { namePolicy: policy });
228
+
229
+ flushJobs();
230
+
231
+ expect(s1.name).toBe("@reserved");
232
+ expect(s2.name).toBe("reserved_2");
233
+ });
234
+
235
+ it("does not deduplicates symbols with different names after policy", () => {
236
+ const scope = createScope("scope");
237
+ const policy = (name: string) => `prefix_${name}`;
238
+ const [s1] = createSymbol("foo", scope, { namePolicy: policy });
239
+ const [s2] = createSymbol("bar", scope, { namePolicy: policy });
240
+
241
+ flushJobs();
242
+
243
+ expect(s1.name).toBe("prefix_foo");
244
+ expect(s2.name).toBe("prefix_bar");
245
+ });
246
+ });
@@ -2,20 +2,94 @@ import {
2
2
  Children,
3
3
  Declaration,
4
4
  For,
5
+ NameConflictResolver,
5
6
  Namekey,
6
7
  namekey,
8
+ NamePolicy,
7
9
  Output,
8
10
  OutputSymbol,
9
11
  shallowReactive,
10
12
  } from "../src/index.js";
11
13
 
14
+ /**
15
+ * Test harness returned by {@link createTestWrapper}.
16
+ */
12
17
  export interface TestWrapper {
18
+ /**
19
+ * JSX wrapper providing Output + a file-level component + language scope context.
20
+ * Name policy is applied only when `namePolicy`/`nameConflictResolver` are
21
+ * passed to {@link createTestWrapper}. Pre-declares all namekeys created by
22
+ * {@link TestWrapper.defkey} before rendering children.
23
+ */
13
24
  Wrapper: (props: { children: Children }) => Children;
25
+
26
+ /**
27
+ * Creates a stable `Namekey` and schedules a pre-declaration inside
28
+ * {@link TestWrapper.Wrapper}.
29
+ *
30
+ * @remarks
31
+ * Call `defkey(name)` before rendering. `Wrapper` renders
32
+ * `<Declaration symbol={...} />` for this name so `<Reference>` to the
33
+ * returned namekey resolves without requiring an explicit `<Declaration>`
34
+ * in the test body.
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * const { Wrapper, defkey } = createTestWrapper(...);
39
+ * const fooKey = defkey("foo");
40
+ * expect(
41
+ * <Wrapper><MyComponent refkey={fooKey} /></Wrapper>
42
+ * ).toRenderTo(`foo`);
43
+ * ```
44
+ */
14
45
  defkey: (name: string) => Namekey;
15
46
  }
16
47
 
17
48
  /**
18
- * Generic test wrapper creator.
49
+ * Create a reusable test harness for a language package. Returns a `Wrapper`
50
+ * component (wraps content in `<Output>` + `<SourceFile>`) and a `defkey`
51
+ * helper that creates stable namekeys for pre-declaring symbols.
52
+ *
53
+ * @remarks
54
+ *
55
+ * Downstream consumers import and call this from the language package's
56
+ * `testing/` entrypoint. The `Wrapper` automatically declares symbols
57
+ * created by `defkey` before rendering children, so tests can reference
58
+ * symbols without explicit `<Declaration>` boilerplate.
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * // In your language package's testing/ entrypoint:
63
+ * import { FileComponent } from "./components/index.js"; // your language package's top-level file component
64
+ * import { createTestWrapper, type TestWrapper } from "@alloy-js/core/testing";
65
+ *
66
+ * export function createMyLangTestWrapper(): TestWrapper {
67
+ * return createTestWrapper({
68
+ * filePath: "test.ext",
69
+ * useScope: useMyLangScope,
70
+ * makeSymbol: (nk, scope) => new MyOutputSymbol(nk, scope),
71
+ * SourceFile: FileComponent,
72
+ * });
73
+ * }
74
+ * ```
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * // Extend your language test factory to accept and forward namePolicy:
79
+ * export function createMyLangTestWrapper(namePolicy?: NamePolicy<string>): TestWrapper {
80
+ * return createTestWrapper({ ...langOpts, namePolicy });
81
+ * }
82
+ *
83
+ * // In a name-policy test:
84
+ * const { Wrapper } = createMyLangTestWrapper(myNamePolicy);
85
+ * const fooKey = namekey("foo"); // namekey(), not defkey — name policy applies
86
+ * // namekey() schedules no pre-declaration; the test body must declare the symbol.
87
+ * expect(
88
+ * <Wrapper>
89
+ * <MyDeclaration refkey={fooKey} name="foo" />
90
+ * </Wrapper>
91
+ * ).toRenderTo("FOO");
92
+ * ```
19
93
  */
20
94
  export function createTestWrapper<
21
95
  SymbolT extends OutputSymbol,
@@ -25,6 +99,8 @@ export function createTestWrapper<
25
99
  useScope: () => ScopeT | undefined;
26
100
  makeSymbol: (nk: Namekey, scope: ScopeT) => SymbolT;
27
101
  SourceFile: (props: { path: string; children: Children }) => any;
102
+ namePolicy?: NamePolicy<string>;
103
+ nameConflictResolver?: NameConflictResolver;
28
104
  }): TestWrapper {
29
105
  const seen = shallowReactive(new Map<string, Namekey>());
30
106
  const created = new Map<Namekey, SymbolT>();
@@ -55,7 +131,10 @@ export function createTestWrapper<
55
131
  function Wrapper(props: { children: Children }) {
56
132
  const SF = opts.SourceFile;
57
133
  return (
58
- <Output>
134
+ <Output
135
+ namePolicy={opts.namePolicy}
136
+ nameConflictResolver={opts.nameConflictResolver}
137
+ >
59
138
  <SF path={opts.filePath}>
60
139
  <For each={[...seen.values()]} joiner="">
61
140
  {(nk) => <Declaration symbol={createSymbol(nk)} />}
@@ -5,11 +5,43 @@ export interface DevtoolsMessage {
5
5
  [key: string]: unknown;
6
6
  }
7
7
 
8
+ const ALL_CHANNELS = [
9
+ "render",
10
+ "effects",
11
+ "refs",
12
+ "edges",
13
+ "symbols",
14
+ "scopes",
15
+ "files",
16
+ "directories",
17
+ "scheduler",
18
+ "diagnostics",
19
+ "errors",
20
+ "lifecycle",
21
+ ];
22
+
23
+ /** Subscribe to all channels on the given socket. */
24
+ export function subscribeAll(socket: WebSocket): void {
25
+ socket.send(JSON.stringify({ type: "subscribe", channels: ALL_CHANNELS }));
26
+ }
27
+
8
28
  /**
9
29
  * Creates a message collector that accumulates messages and provides utilities
10
30
  * for waiting on conditions. Useful for tests with reactive updates.
31
+ *
32
+ * Returns a Promise because it waits for the subscription to be processed by
33
+ * the server before the caller starts rendering.
34
+ *
35
+ * @param channels - Optional list of channels to subscribe to. Defaults to all channels.
11
36
  */
12
- export function createMessageCollector(socket: WebSocket) {
37
+ export async function createMessageCollector(
38
+ socket: WebSocket,
39
+ channels?: string[],
40
+ ) {
41
+ socket.send(
42
+ JSON.stringify({ type: "subscribe", channels: channels ?? ALL_CHANNELS }),
43
+ );
44
+ await new Promise((resolve) => setTimeout(resolve, 50));
13
45
  let renderBuffer: DevtoolsMessage[] = [];
14
46
  let flushBuffer: DevtoolsMessage[] = [];
15
47
  const completedRenderBatches: DevtoolsMessage[][] = [];
@@ -186,18 +218,28 @@ export function createMessageCollector(socket: WebSocket) {
186
218
 
187
219
  /**
188
220
  * Filter messages to only include render tree messages (those starting with "render:")
221
+ * Excludes trace messages (those with triggerIds).
189
222
  */
190
223
  export function filterRenderTreeMessages(
191
224
  messages: DevtoolsMessage[],
192
225
  ): DevtoolsMessage[] {
193
- return messages.filter((m) => m.type.startsWith("render"));
226
+ return messages.filter(
227
+ (m) => m.type.startsWith("render") && !("triggerIds" in m),
228
+ );
194
229
  }
195
230
 
196
231
  /**
197
- * Filter messages to only include effect debug messages (those starting with "effect:")
232
+ * Filter messages to only include effect/ref/edge debug messages.
233
+ * Excludes trace messages (those with triggerIds).
198
234
  */
199
235
  export function filterEffectsMessages(
200
236
  messages: DevtoolsMessage[],
201
237
  ): DevtoolsMessage[] {
202
- return messages.filter((m) => m.type.startsWith("effect:"));
238
+ return messages.filter(
239
+ (m) =>
240
+ (m.type.startsWith("effect:") ||
241
+ m.type.startsWith("ref:") ||
242
+ m.type.startsWith("edge:")) &&
243
+ !("triggerIds" in m),
244
+ );
203
245
  }
@@ -12,9 +12,30 @@ import { expect } from "vitest";
12
12
  import { flushJobs, flushJobsAsync } from "../src/scheduler.js";
13
13
  import { dedent } from "./render.js";
14
14
 
15
- interface ToRenderToOptions {
15
+ /**
16
+ * Print options passed to `toRenderTo` / `toRenderToAsync`. These override
17
+ * the per-`SourceFile` print settings for the duration of the assertion,
18
+ * which is useful when forcing line-breaking with a narrow `printWidth` in
19
+ * tests without needing extremely long inputs.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * expect(<MyList items={["a", "b", "c"]} />).toRenderTo(
24
+ * `
25
+ * a,
26
+ * b,
27
+ * c
28
+ * `,
29
+ * { printWidth: 10 }
30
+ * );
31
+ * ```
32
+ */
33
+ export interface ToRenderToOptions {
34
+ /** Maximum line width before the formatter wraps output. */
16
35
  printWidth?: number;
36
+ /** Number of spaces per indentation level. */
17
37
  tabWidth?: number;
38
+ /** Use tab characters instead of spaces. */
18
39
  useTabs?: boolean;
19
40
  }
20
41
 
package/testing/index.ts CHANGED
@@ -1,3 +1,3 @@
1
- import "./extend-expect.js";
2
1
  export * from "./create-test-wrapper.jsx";
2
+ export * from "./extend-expect.js";
3
3
  export * from "./render.js";
package/testing/render.ts CHANGED
@@ -2,10 +2,19 @@ import { Children, printTree, renderTree } from "../src/index.js";
2
2
 
3
3
  export { printTree } from "../src/index.js";
4
4
 
5
+ /**
6
+ * Render a JSX element tree to a string. Convenience wrapper combining
7
+ * `renderTree` and `printTree`.
8
+ */
5
9
  export function renderToString(element: Children) {
6
10
  return printTree(renderTree(element));
7
11
  }
8
12
 
13
+ /**
14
+ * Dedented template literal tag. Strips leading/trailing blank lines and
15
+ * removes the common leading whitespace from all lines — useful for
16
+ * multi-line expected output in tests.
17
+ */
9
18
  export function d(strings: TemplateStringsArray, ...values: any[]): string {
10
19
  // Combine the strings and values
11
20
  const result = strings.reduce(
@@ -1,8 +1,23 @@
1
+ /**
2
+ * Vitest matcher type augmentations for alloy testing.
3
+ *
4
+ * Consumers load these types via `"types": ["@alloy-js/core/testing/matchers"]`
5
+ * in their tsconfig.json. This file is resolved directly from the source tree
6
+ * (not from dist/), so it **must remain self-contained** — do NOT add imports
7
+ * that resolve to .ts source files (e.g. `./extend-expect.js`). Doing so pulls
8
+ * the entire src/ tree into the consumer's compilation, creating a dual-module
9
+ * identity conflict between src/ types and dist/ types that produces TS errors.
10
+ *
11
+ * If matcher signatures change, update the inlined types here to match.
12
+ */
1
13
  import "vitest";
2
14
 
3
- interface ToRenderToRenderOptions {
15
+ interface ToRenderToOptions {
16
+ /** Maximum line width before the formatter wraps output. */
4
17
  printWidth?: number;
18
+ /** Number of spaces per indentation level. */
5
19
  tabWidth?: number;
20
+ /** Use tab characters instead of spaces. */
6
21
  useTabs?: boolean;
7
22
  }
8
23
 
@@ -14,11 +29,11 @@ interface ExpectedDiagnostic {
14
29
  interface CustomMatchers<R = unknown> {
15
30
  toRenderTo: (
16
31
  str: string | Record<string, string>,
17
- options?: ToRenderToRenderOptions,
32
+ options?: ToRenderToOptions,
18
33
  ) => R;
19
34
  toRenderToAsync: (
20
35
  str: string | Record<string, string>,
21
- options?: ToRenderToRenderOptions,
36
+ options?: ToRenderToOptions,
22
37
  ) => Promise<R>;
23
38
  toHaveDiagnostics: (expectedDiagnostics: ExpectedDiagnostic[]) => R;
24
39
  toHaveDiagnosticsAsync: (
package/vitest.config.ts CHANGED
@@ -2,6 +2,14 @@ import alloyPlugin from "@alloy-js/rollup-plugin";
2
2
  import { defineConfig } from "vitest/config";
3
3
 
4
4
  export default defineConfig({
5
+ resolve: {
6
+ conditions: ["source"],
7
+ },
8
+ ssr: {
9
+ resolve: {
10
+ conditions: ["source"],
11
+ },
12
+ },
5
13
  esbuild: {
6
14
  jsx: "preserve",
7
15
  sourcemap: "both",