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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (964) hide show
  1. package/CHANGELOG.md +42 -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.browser.js +14 -0
  93. package/dist/dev/src/debug/cli.browser.js.map +1 -0
  94. package/dist/dev/src/debug/cli.js +164 -0
  95. package/dist/dev/src/debug/cli.js.map +1 -0
  96. package/dist/dev/src/debug/diagnostics-broadcast.test.js +100 -0
  97. package/dist/dev/src/debug/diagnostics-broadcast.test.js.map +1 -0
  98. package/dist/dev/src/debug/diagnostics.test.js +50 -0
  99. package/dist/dev/src/debug/diagnostics.test.js.map +1 -0
  100. package/dist/dev/src/debug/effects.js +293 -0
  101. package/dist/dev/src/debug/effects.js.map +1 -0
  102. package/dist/dev/src/debug/effects.test.js +280 -0
  103. package/dist/dev/src/debug/effects.test.js.map +1 -0
  104. package/dist/dev/src/debug/files.js +29 -0
  105. package/dist/dev/src/debug/files.js.map +1 -0
  106. package/dist/dev/src/debug/files.test.js +78 -0
  107. package/dist/dev/src/debug/files.test.js.map +1 -0
  108. package/dist/dev/src/debug/index.js +71 -0
  109. package/dist/dev/src/debug/index.js.map +1 -0
  110. package/dist/dev/src/debug/message-format.test.js +836 -0
  111. package/dist/dev/src/debug/message-format.test.js.map +1 -0
  112. package/dist/dev/src/debug/render-tree-orphans.test.js +365 -0
  113. package/dist/dev/src/debug/render-tree-orphans.test.js.map +1 -0
  114. package/dist/dev/src/debug/render.js +479 -0
  115. package/dist/dev/src/debug/render.js.map +1 -0
  116. package/dist/dev/src/debug/render.test.js +363 -0
  117. package/dist/dev/src/debug/render.test.js.map +1 -0
  118. package/dist/dev/src/debug/serialize.js +70 -0
  119. package/dist/dev/src/debug/serialize.js.map +1 -0
  120. package/dist/dev/src/debug/source-map.browser.js +24 -0
  121. package/dist/dev/src/debug/source-map.browser.js.map +1 -0
  122. package/dist/dev/src/debug/source-map.js +111 -0
  123. package/dist/dev/src/debug/source-map.js.map +1 -0
  124. package/dist/dev/src/debug/symbols.js +196 -0
  125. package/dist/dev/src/debug/symbols.js.map +1 -0
  126. package/dist/dev/src/debug/symbols.test.js +93 -0
  127. package/dist/dev/src/debug/symbols.test.js.map +1 -0
  128. package/dist/dev/src/debug/trace-db.browser.js +11 -0
  129. package/dist/dev/src/debug/trace-db.browser.js.map +1 -0
  130. package/dist/dev/src/debug/trace-db.js +40 -0
  131. package/dist/dev/src/debug/trace-db.js.map +1 -0
  132. package/dist/dev/src/debug/trace-writer.js +653 -0
  133. package/dist/dev/src/debug/trace-writer.js.map +1 -0
  134. package/dist/dev/src/debug/trace.js +460 -0
  135. package/dist/dev/src/debug/trace.js.map +1 -0
  136. package/dist/dev/src/devtools/devtools-protocol.js +2 -0
  137. package/dist/dev/src/devtools/devtools-protocol.js.map +1 -0
  138. package/dist/dev/src/devtools/devtools-server.browser.js +36 -0
  139. package/dist/dev/src/devtools/devtools-server.browser.js.map +1 -0
  140. package/dist/dev/src/devtools/devtools-server.js +458 -0
  141. package/dist/dev/src/devtools/devtools-server.js.map +1 -0
  142. package/dist/dev/src/devtools/devtools-transport.js +114 -0
  143. package/dist/dev/src/devtools/devtools-transport.js.map +1 -0
  144. package/dist/dev/src/devtools-entry.browser.js +2 -0
  145. package/dist/dev/src/devtools-entry.browser.js.map +1 -0
  146. package/dist/dev/src/devtools-entry.js +2 -0
  147. package/dist/dev/src/devtools-entry.js.map +1 -0
  148. package/dist/dev/src/diagnostics.js +97 -0
  149. package/dist/dev/src/diagnostics.js.map +1 -0
  150. package/dist/dev/src/host/alloy-host.browser.js +32 -0
  151. package/dist/dev/src/host/alloy-host.browser.js.map +1 -0
  152. package/dist/dev/src/host/alloy-host.js +144 -0
  153. package/dist/dev/src/host/alloy-host.js.map +1 -0
  154. package/dist/dev/src/host/interface.js +2 -0
  155. package/dist/dev/src/host/interface.js.map +1 -0
  156. package/dist/dev/src/host/node-host.browser.js +21 -0
  157. package/dist/dev/src/host/node-host.browser.js.map +1 -0
  158. package/dist/dev/src/host/node-host.js +20 -0
  159. package/dist/dev/src/host/node-host.js.map +1 -0
  160. package/dist/dev/src/index.browser.js +3 -0
  161. package/dist/dev/src/index.browser.js.map +1 -0
  162. package/dist/dev/src/index.js +27 -0
  163. package/dist/dev/src/index.js.map +1 -0
  164. package/dist/dev/src/inspect.browser.js +6 -0
  165. package/dist/dev/src/inspect.browser.js.map +1 -0
  166. package/dist/dev/src/inspect.js +2 -0
  167. package/dist/dev/src/inspect.js.map +1 -0
  168. package/dist/dev/src/jsx-runtime.js +17 -0
  169. package/dist/dev/src/jsx-runtime.js.map +1 -0
  170. package/dist/dev/src/library-symbol-reference.js +59 -0
  171. package/dist/dev/src/library-symbol-reference.js.map +1 -0
  172. package/dist/dev/src/name-policy.js +51 -0
  173. package/dist/dev/src/name-policy.js.map +1 -0
  174. package/dist/dev/src/pretty-string/pretty-string.js +100 -0
  175. package/dist/dev/src/pretty-string/pretty-string.js.map +1 -0
  176. package/dist/dev/src/pretty-string/pretty-string.test.js +38 -0
  177. package/dist/dev/src/pretty-string/pretty-string.test.js.map +1 -0
  178. package/dist/dev/src/print-hook.js +10 -0
  179. package/dist/dev/src/print-hook.js.map +1 -0
  180. package/dist/dev/src/props-combinators.js +109 -0
  181. package/dist/dev/src/props-combinators.js.map +1 -0
  182. package/dist/dev/src/reactive-union-set.js +213 -0
  183. package/dist/dev/src/reactive-union-set.js.map +1 -0
  184. package/dist/dev/src/reactivity.js +452 -0
  185. package/dist/dev/src/reactivity.js.map +1 -0
  186. package/dist/dev/src/refkey.js +167 -0
  187. package/dist/dev/src/refkey.js.map +1 -0
  188. package/dist/dev/src/render-stack.js +252 -0
  189. package/dist/dev/src/render-stack.js.map +1 -0
  190. package/dist/dev/src/render.js +872 -0
  191. package/dist/dev/src/render.js.map +1 -0
  192. package/dist/dev/src/resource.js +124 -0
  193. package/dist/dev/src/resource.js.map +1 -0
  194. package/dist/dev/src/runtime/component.js +41 -0
  195. package/dist/dev/src/runtime/component.js.map +1 -0
  196. package/dist/dev/src/runtime/intrinsic.js +12 -0
  197. package/dist/dev/src/runtime/intrinsic.js.map +1 -0
  198. package/dist/dev/src/scheduler.js +217 -0
  199. package/dist/dev/src/scheduler.js.map +1 -0
  200. package/dist/dev/src/stc.js +40 -0
  201. package/dist/dev/src/stc.js.map +1 -0
  202. package/dist/dev/src/sti.js +31 -0
  203. package/dist/dev/src/sti.js.map +1 -0
  204. package/dist/dev/src/symbols/basic-scope.js +21 -0
  205. package/dist/dev/src/symbols/basic-scope.js.map +1 -0
  206. package/dist/dev/src/symbols/basic-symbol.js +34 -0
  207. package/dist/dev/src/symbols/basic-symbol.js.map +1 -0
  208. package/dist/dev/src/symbols/decl.js +26 -0
  209. package/dist/dev/src/symbols/decl.js.map +1 -0
  210. package/dist/dev/src/symbols/index.js +10 -0
  211. package/dist/dev/src/symbols/index.js.map +1 -0
  212. package/dist/dev/src/symbols/output-scope.js +235 -0
  213. package/dist/dev/src/symbols/output-scope.js.map +1 -0
  214. package/dist/dev/src/symbols/output-space.js +51 -0
  215. package/dist/dev/src/symbols/output-space.js.map +1 -0
  216. package/dist/dev/src/symbols/output-symbol.js +644 -0
  217. package/dist/dev/src/symbols/output-symbol.js.map +1 -0
  218. package/dist/dev/src/symbols/symbol-flow.js +106 -0
  219. package/dist/dev/src/symbols/symbol-flow.js.map +1 -0
  220. package/dist/dev/src/symbols/symbol-slot.js +75 -0
  221. package/dist/dev/src/symbols/symbol-slot.js.map +1 -0
  222. package/dist/dev/src/symbols/symbol-slot.test.js +68 -0
  223. package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -0
  224. package/dist/dev/src/symbols/symbol-table.js +103 -0
  225. package/dist/dev/src/symbols/symbol-table.js.map +1 -0
  226. package/dist/dev/src/tap.js +109 -0
  227. package/dist/dev/src/tap.js.map +1 -0
  228. package/dist/dev/src/trace.js +2 -0
  229. package/dist/dev/src/trace.js.map +1 -0
  230. package/dist/dev/src/tracer.js +180 -0
  231. package/dist/dev/src/tracer.js.map +1 -0
  232. package/dist/dev/src/utils.js +487 -0
  233. package/dist/dev/src/utils.js.map +1 -0
  234. package/dist/dev/src/write-output.js +48 -0
  235. package/dist/dev/src/write-output.js.map +1 -0
  236. package/dist/dev/test/browser-build.test.js +146 -0
  237. package/dist/dev/test/browser-build.test.js.map +1 -0
  238. package/dist/dev/test/children.test.js +44 -0
  239. package/dist/dev/test/children.test.js.map +1 -0
  240. package/dist/dev/test/components/append-file.test.js +394 -0
  241. package/dist/dev/test/components/append-file.test.js.map +1 -0
  242. package/dist/dev/test/components/block.test.js +83 -0
  243. package/dist/dev/test/components/block.test.js.map +1 -0
  244. package/dist/dev/test/components/copy-file.test.js +119 -0
  245. package/dist/dev/test/components/copy-file.test.js.map +1 -0
  246. package/dist/dev/test/components/declaration.test.js +40 -0
  247. package/dist/dev/test/components/declaration.test.js.map +1 -0
  248. package/dist/dev/test/components/list.test.js +250 -0
  249. package/dist/dev/test/components/list.test.js.map +1 -0
  250. package/dist/dev/test/components/prose.test.js +42 -0
  251. package/dist/dev/test/components/prose.test.js.map +1 -0
  252. package/dist/dev/test/components/reference-or-content.test.js +246 -0
  253. package/dist/dev/test/components/reference-or-content.test.js.map +1 -0
  254. package/dist/dev/test/components/source-file.test.js +271 -0
  255. package/dist/dev/test/components/source-file.test.js.map +1 -0
  256. package/dist/dev/test/components/template-file.test.js +200 -0
  257. package/dist/dev/test/components/template-file.test.js.map +1 -0
  258. package/dist/dev/test/components/update-file.test.js +210 -0
  259. package/dist/dev/test/components/update-file.test.js.map +1 -0
  260. package/dist/dev/test/components/wrap.test.js +48 -0
  261. package/dist/dev/test/components/wrap.test.js.map +1 -0
  262. package/dist/dev/test/control-flow/for.test.js +318 -0
  263. package/dist/dev/test/control-flow/for.test.js.map +1 -0
  264. package/dist/dev/test/control-flow/match.test.js +112 -0
  265. package/dist/dev/test/control-flow/match.test.js.map +1 -0
  266. package/dist/dev/test/control-flow/show.test.js +38 -0
  267. package/dist/dev/test/control-flow/show.test.js.map +1 -0
  268. package/dist/dev/test/lazy-isempty.test.js +121 -0
  269. package/dist/dev/test/lazy-isempty.test.js.map +1 -0
  270. package/dist/dev/test/name-policy.test.js +28 -0
  271. package/dist/dev/test/name-policy.test.js.map +1 -0
  272. package/dist/dev/test/props-with-defaults.test.js +94 -0
  273. package/dist/dev/test/props-with-defaults.test.js.map +1 -0
  274. package/dist/dev/test/reactive-union-set-disposers.test.js +98 -0
  275. package/dist/dev/test/reactive-union-set-disposers.test.js.map +1 -0
  276. package/dist/dev/test/reactive-union-set.test.js +171 -0
  277. package/dist/dev/test/reactive-union-set.test.js.map +1 -0
  278. package/dist/dev/test/reactivity/circular-reactives.test.js +62 -0
  279. package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -0
  280. package/dist/dev/test/reactivity/cleanup.test.js +96 -0
  281. package/dist/dev/test/reactivity/cleanup.test.js.map +1 -0
  282. package/dist/dev/test/reactivity/memo.test.js +17 -0
  283. package/dist/dev/test/reactivity/memo.test.js.map +1 -0
  284. package/dist/dev/test/reactivity/ref-rendering.test.js +38 -0
  285. package/dist/dev/test/reactivity/ref-rendering.test.js.map +1 -0
  286. package/dist/dev/test/reactivity/shallow-reactive.test.js +56 -0
  287. package/dist/dev/test/reactivity/shallow-reactive.test.js.map +1 -0
  288. package/dist/dev/test/reactivity/test.test.js +74 -0
  289. package/dist/dev/test/reactivity/test.test.js.map +1 -0
  290. package/dist/dev/test/reactivity/untrack.test.js +27 -0
  291. package/dist/dev/test/reactivity/untrack.test.js.map +1 -0
  292. package/dist/dev/test/refkey.test.js +36 -0
  293. package/dist/dev/test/refkey.test.js.map +1 -0
  294. package/dist/dev/test/rendering/basic.test.js +194 -0
  295. package/dist/dev/test/rendering/basic.test.js.map +1 -0
  296. package/dist/dev/test/rendering/code.test.js +64 -0
  297. package/dist/dev/test/rendering/code.test.js.map +1 -0
  298. package/dist/dev/test/rendering/formatting.test.js +797 -0
  299. package/dist/dev/test/rendering/formatting.test.js.map +1 -0
  300. package/dist/dev/test/rendering/indent.test.js +183 -0
  301. package/dist/dev/test/rendering/indent.test.js.map +1 -0
  302. package/dist/dev/test/rendering/memoization.test.js +37 -0
  303. package/dist/dev/test/rendering/memoization.test.js.map +1 -0
  304. package/dist/dev/test/rendering/print-render-stack.test.js +287 -0
  305. package/dist/dev/test/rendering/print-render-stack.test.js.map +1 -0
  306. package/dist/dev/test/rendering/refkeys.test.js +37 -0
  307. package/dist/dev/test/rendering/refkeys.test.js.map +1 -0
  308. package/dist/dev/test/scheduler-extended.test.js +96 -0
  309. package/dist/dev/test/scheduler-extended.test.js.map +1 -0
  310. package/dist/dev/test/scheduler.test.js +46 -0
  311. package/dist/dev/test/scheduler.test.js.map +1 -0
  312. package/dist/dev/test/split-props.test.js +78 -0
  313. package/dist/dev/test/split-props.test.js.map +1 -0
  314. package/dist/dev/test/stc.test.js +35 -0
  315. package/dist/dev/test/stc.test.js.map +1 -0
  316. package/dist/dev/test/symbols/deconflicted-name.test.js +120 -0
  317. package/dist/dev/test/symbols/deconflicted-name.test.js.map +1 -0
  318. package/dist/dev/test/symbols/output-scope.test.js +221 -0
  319. package/dist/dev/test/symbols/output-scope.test.js.map +1 -0
  320. package/dist/dev/test/symbols/output-symbol.test.js +202 -0
  321. package/dist/dev/test/symbols/output-symbol.test.js.map +1 -0
  322. package/dist/dev/test/symbols/resolution.test.js +487 -0
  323. package/dist/dev/test/symbols/resolution.test.js.map +1 -0
  324. package/dist/dev/test/symbols/symbol-table.test.js +15 -0
  325. package/dist/dev/test/symbols/symbol-table.test.js.map +1 -0
  326. package/dist/dev/test/symbols/utils.js +26 -0
  327. package/dist/dev/test/symbols/utils.js.map +1 -0
  328. package/dist/dev/test/utils.test.js +317 -0
  329. package/dist/dev/test/utils.test.js.map +1 -0
  330. package/dist/dev/testing/create-test-wrapper.js +130 -0
  331. package/dist/dev/testing/create-test-wrapper.js.map +1 -0
  332. package/dist/dev/testing/devtools-utils.js +162 -0
  333. package/dist/dev/testing/devtools-utils.js.map +1 -0
  334. package/dist/dev/testing/extend-expect.js +187 -0
  335. package/dist/dev/testing/extend-expect.js.map +1 -0
  336. package/dist/dev/testing/extend-expect.test.js +234 -0
  337. package/dist/dev/testing/extend-expect.test.js.map +1 -0
  338. package/dist/dev/testing/index.js +4 -0
  339. package/dist/dev/testing/index.js.map +1 -0
  340. package/dist/dev/testing/render.js +34 -0
  341. package/dist/dev/testing/render.js.map +1 -0
  342. package/dist/dev/testing/vitest.d.js +14 -0
  343. package/dist/dev/testing/vitest.d.js.map +1 -0
  344. package/dist/devtools/index.html +29 -17
  345. package/dist/src/binder.d.ts +107 -3
  346. package/dist/src/binder.d.ts.map +1 -1
  347. package/dist/src/binder.js +113 -1
  348. package/dist/src/binder.js.map +1 -1
  349. package/dist/src/components/AccessExpression.d.ts +78 -0
  350. package/dist/src/components/AccessExpression.d.ts.map +1 -0
  351. package/dist/src/components/AccessExpression.js +218 -0
  352. package/dist/src/components/AccessExpression.js.map +1 -0
  353. package/dist/src/components/AccessExpression.test.d.ts +2 -0
  354. package/dist/src/components/AccessExpression.test.d.ts.map +1 -0
  355. package/dist/src/components/AccessExpression.test.js +137 -0
  356. package/dist/src/components/AccessExpression.test.js.map +1 -0
  357. package/dist/src/components/Block.d.ts +12 -0
  358. package/dist/src/components/Block.d.ts.map +1 -1
  359. package/dist/src/components/Block.js +12 -0
  360. package/dist/src/components/Block.js.map +1 -1
  361. package/dist/src/components/For.d.ts.map +1 -1
  362. package/dist/src/components/For.js +1 -1
  363. package/dist/src/components/For.js.map +1 -1
  364. package/dist/src/components/List.d.ts +11 -1
  365. package/dist/src/components/List.d.ts.map +1 -1
  366. package/dist/src/components/List.js +1 -1
  367. package/dist/src/components/List.js.map +1 -1
  368. package/dist/src/components/MemberDeclaration.d.ts +6 -6
  369. package/dist/src/components/MemberDeclaration.js +6 -6
  370. package/dist/src/components/MemberName.d.ts +6 -0
  371. package/dist/src/components/MemberName.d.ts.map +1 -1
  372. package/dist/src/components/MemberName.js +7 -0
  373. package/dist/src/components/MemberName.js.map +1 -1
  374. package/dist/src/components/MemberScope.d.ts +5 -0
  375. package/dist/src/components/MemberScope.d.ts.map +1 -1
  376. package/dist/src/components/MemberScope.js +5 -0
  377. package/dist/src/components/MemberScope.js.map +1 -1
  378. package/dist/src/components/Output.d.ts +4 -2
  379. package/dist/src/components/Output.d.ts.map +1 -1
  380. package/dist/src/components/Output.js.map +1 -1
  381. package/dist/src/components/Scope.d.ts +6 -0
  382. package/dist/src/components/Scope.d.ts.map +1 -1
  383. package/dist/src/components/Scope.js +6 -0
  384. package/dist/src/components/Scope.js.map +1 -1
  385. package/dist/src/components/SourceFile.d.ts +22 -2
  386. package/dist/src/components/SourceFile.d.ts.map +1 -1
  387. package/dist/src/components/SourceFile.js.map +1 -1
  388. package/dist/src/components/Switch.d.ts.map +1 -1
  389. package/dist/src/components/Switch.js +1 -1
  390. package/dist/src/components/Switch.js.map +1 -1
  391. package/dist/src/components/index.d.ts +1 -0
  392. package/dist/src/components/index.d.ts.map +1 -1
  393. package/dist/src/components/index.js +1 -0
  394. package/dist/src/components/index.js.map +1 -1
  395. package/dist/src/context/binder.d.ts +4 -0
  396. package/dist/src/context/binder.d.ts.map +1 -1
  397. package/dist/src/context/binder.js +5 -0
  398. package/dist/src/context/binder.js.map +1 -1
  399. package/dist/src/context/format-options.d.ts +14 -1
  400. package/dist/src/context/format-options.d.ts.map +1 -1
  401. package/dist/src/context/format-options.js +14 -1
  402. package/dist/src/context/format-options.js.map +1 -1
  403. package/dist/src/context/scope.d.ts +4 -0
  404. package/dist/src/context/scope.d.ts.map +1 -1
  405. package/dist/src/context/scope.js +5 -0
  406. package/dist/src/context/scope.js.map +1 -1
  407. package/dist/src/context/source-directory.d.ts +9 -0
  408. package/dist/src/context/source-directory.d.ts.map +1 -1
  409. package/dist/src/context/source-directory.js +9 -0
  410. package/dist/src/context/source-directory.js.map +1 -1
  411. package/dist/src/debug/cli.browser.d.ts +13 -0
  412. package/dist/src/debug/cli.browser.d.ts.map +1 -0
  413. package/dist/src/debug/cli.browser.js +14 -0
  414. package/dist/src/debug/cli.browser.js.map +1 -0
  415. package/dist/src/debug/cli.d.ts.map +1 -1
  416. package/dist/src/debug/cli.js +3 -2
  417. package/dist/src/debug/cli.js.map +1 -1
  418. package/dist/src/debug/diagnostics-broadcast.test.d.ts +2 -0
  419. package/dist/src/debug/diagnostics-broadcast.test.d.ts.map +1 -0
  420. package/dist/src/debug/diagnostics-broadcast.test.js +100 -0
  421. package/dist/src/debug/diagnostics-broadcast.test.js.map +1 -0
  422. package/dist/src/debug/diagnostics.test.js +3 -2
  423. package/dist/src/debug/diagnostics.test.js.map +1 -1
  424. package/dist/src/debug/effects.d.ts +12 -4
  425. package/dist/src/debug/effects.d.ts.map +1 -1
  426. package/dist/src/debug/effects.js +119 -54
  427. package/dist/src/debug/effects.js.map +1 -1
  428. package/dist/src/debug/effects.test.js +213 -41
  429. package/dist/src/debug/effects.test.js.map +1 -1
  430. package/dist/src/debug/files.d.ts.map +1 -1
  431. package/dist/src/debug/files.js +7 -18
  432. package/dist/src/debug/files.js.map +1 -1
  433. package/dist/src/debug/files.test.js +13 -36
  434. package/dist/src/debug/files.test.js.map +1 -1
  435. package/dist/src/debug/index.d.ts +4 -2
  436. package/dist/src/debug/index.d.ts.map +1 -1
  437. package/dist/src/debug/index.js +4 -2
  438. package/dist/src/debug/index.js.map +1 -1
  439. package/dist/src/debug/message-format.test.d.ts +2 -0
  440. package/dist/src/debug/message-format.test.d.ts.map +1 -0
  441. package/dist/src/debug/message-format.test.js +700 -0
  442. package/dist/src/debug/message-format.test.js.map +1 -0
  443. package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
  444. package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
  445. package/dist/src/debug/render-tree-orphans.test.js +297 -0
  446. package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
  447. package/dist/src/debug/render.d.ts.map +1 -1
  448. package/dist/src/debug/render.js +91 -131
  449. package/dist/src/debug/render.js.map +1 -1
  450. package/dist/src/debug/render.test.js +91 -128
  451. package/dist/src/debug/render.test.js.map +1 -1
  452. package/dist/src/debug/source-map.browser.d.ts +16 -0
  453. package/dist/src/debug/source-map.browser.d.ts.map +1 -0
  454. package/dist/src/debug/source-map.browser.js +24 -0
  455. package/dist/src/debug/source-map.browser.js.map +1 -0
  456. package/dist/src/debug/source-map.d.ts +22 -0
  457. package/dist/src/debug/source-map.d.ts.map +1 -0
  458. package/dist/src/debug/source-map.js +111 -0
  459. package/dist/src/debug/source-map.js.map +1 -0
  460. package/dist/src/debug/symbols.d.ts +6 -5
  461. package/dist/src/debug/symbols.d.ts.map +1 -1
  462. package/dist/src/debug/symbols.js +46 -23
  463. package/dist/src/debug/symbols.js.map +1 -1
  464. package/dist/src/debug/symbols.test.js +15 -26
  465. package/dist/src/debug/symbols.test.js.map +1 -1
  466. package/dist/src/debug/trace-db.browser.d.ts +9 -0
  467. package/dist/src/debug/trace-db.browser.d.ts.map +1 -0
  468. package/dist/src/debug/trace-db.browser.js +11 -0
  469. package/dist/src/debug/trace-db.browser.js.map +1 -0
  470. package/dist/src/debug/trace-db.d.ts +16 -0
  471. package/dist/src/debug/trace-db.d.ts.map +1 -0
  472. package/dist/src/debug/trace-db.js +40 -0
  473. package/dist/src/debug/trace-db.js.map +1 -0
  474. package/dist/src/debug/trace-writer.d.ts +56 -0
  475. package/dist/src/debug/trace-writer.d.ts.map +1 -0
  476. package/dist/src/debug/trace-writer.js +653 -0
  477. package/dist/src/debug/trace-writer.js.map +1 -0
  478. package/dist/src/debug/trace.d.ts +10 -10
  479. package/dist/src/debug/trace.d.ts.map +1 -1
  480. package/dist/src/debug/trace.js +41 -24
  481. package/dist/src/debug/trace.js.map +1 -1
  482. package/dist/src/devtools/devtools-protocol.d.ts +318 -161
  483. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  484. package/dist/src/devtools/devtools-server.browser.d.ts +1 -5
  485. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
  486. package/dist/src/devtools/devtools-server.browser.js +3 -3
  487. package/dist/src/devtools/devtools-server.browser.js.map +1 -1
  488. package/dist/src/devtools/devtools-server.d.ts +5 -6
  489. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  490. package/dist/src/devtools/devtools-server.js +227 -25
  491. package/dist/src/devtools/devtools-server.js.map +1 -1
  492. package/dist/src/devtools/devtools-transport.d.ts +2 -2
  493. package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
  494. package/dist/src/devtools/devtools-transport.js +2 -2
  495. package/dist/src/devtools/devtools-transport.js.map +1 -1
  496. package/dist/src/devtools-entry.browser.d.ts +1 -1
  497. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  498. package/dist/src/devtools-entry.browser.js.map +1 -1
  499. package/dist/src/devtools-entry.d.ts +1 -1
  500. package/dist/src/devtools-entry.d.ts.map +1 -1
  501. package/dist/src/devtools-entry.js.map +1 -1
  502. package/dist/src/diagnostics.d.ts +1 -1
  503. package/dist/src/diagnostics.d.ts.map +1 -1
  504. package/dist/src/diagnostics.js +27 -19
  505. package/dist/src/diagnostics.js.map +1 -1
  506. package/dist/src/host/node-host.browser.d.ts +11 -0
  507. package/dist/src/host/node-host.browser.d.ts.map +1 -0
  508. package/dist/src/host/node-host.browser.js +21 -0
  509. package/dist/src/host/node-host.browser.js.map +1 -0
  510. package/dist/src/host/node-host.d.ts +11 -0
  511. package/dist/src/host/node-host.d.ts.map +1 -0
  512. package/dist/src/host/node-host.js +20 -0
  513. package/dist/src/host/node-host.js.map +1 -0
  514. package/dist/src/library-symbol-reference.d.ts +52 -0
  515. package/dist/src/library-symbol-reference.d.ts.map +1 -1
  516. package/dist/src/library-symbol-reference.js +54 -0
  517. package/dist/src/library-symbol-reference.js.map +1 -1
  518. package/dist/src/name-policy.d.ts +30 -3
  519. package/dist/src/name-policy.d.ts.map +1 -1
  520. package/dist/src/name-policy.js +27 -0
  521. package/dist/src/name-policy.js.map +1 -1
  522. package/dist/src/reactivity.d.ts +28 -2
  523. package/dist/src/reactivity.d.ts.map +1 -1
  524. package/dist/src/reactivity.js +154 -45
  525. package/dist/src/reactivity.js.map +1 -1
  526. package/dist/src/render-stack.d.ts.map +1 -1
  527. package/dist/src/render-stack.js +4 -3
  528. package/dist/src/render-stack.js.map +1 -1
  529. package/dist/src/render.d.ts +2 -0
  530. package/dist/src/render.d.ts.map +1 -1
  531. package/dist/src/render.js +84 -30
  532. package/dist/src/render.js.map +1 -1
  533. package/dist/src/scheduler.d.ts +5 -0
  534. package/dist/src/scheduler.d.ts.map +1 -1
  535. package/dist/src/scheduler.js +94 -23
  536. package/dist/src/scheduler.js.map +1 -1
  537. package/dist/src/symbols/output-scope.d.ts +33 -1
  538. package/dist/src/symbols/output-scope.d.ts.map +1 -1
  539. package/dist/src/symbols/output-scope.js +34 -1
  540. package/dist/src/symbols/output-scope.js.map +1 -1
  541. package/dist/src/symbols/output-space.d.ts +12 -0
  542. package/dist/src/symbols/output-space.d.ts.map +1 -1
  543. package/dist/src/symbols/output-space.js +15 -0
  544. package/dist/src/symbols/output-space.js.map +1 -1
  545. package/dist/src/symbols/output-symbol.d.ts +128 -12
  546. package/dist/src/symbols/output-symbol.d.ts.map +1 -1
  547. package/dist/src/symbols/output-symbol.js +158 -18
  548. package/dist/src/symbols/output-symbol.js.map +1 -1
  549. package/dist/src/symbols/symbol-slot.d.ts.map +1 -1
  550. package/dist/src/symbols/symbol-slot.js +7 -0
  551. package/dist/src/symbols/symbol-slot.js.map +1 -1
  552. package/dist/src/symbols/symbol-slot.test.js +18 -1
  553. package/dist/src/symbols/symbol-slot.test.js.map +1 -1
  554. package/dist/src/symbols/symbol-table.d.ts.map +1 -1
  555. package/dist/src/symbols/symbol-table.js +13 -3
  556. package/dist/src/symbols/symbol-table.js.map +1 -1
  557. package/dist/src/utils.d.ts.map +1 -1
  558. package/dist/src/utils.js +11 -5
  559. package/dist/src/utils.js.map +1 -1
  560. package/dist/src/write-output.d.ts.map +1 -1
  561. package/dist/src/write-output.js +6 -5
  562. package/dist/src/write-output.js.map +1 -1
  563. package/dist/test/browser-build.test.js +128 -68
  564. package/dist/test/browser-build.test.js.map +1 -1
  565. package/dist/test/reactivity/shallow-reactive.test.js +4 -0
  566. package/dist/test/reactivity/shallow-reactive.test.js.map +1 -1
  567. package/dist/test/symbols/deconflicted-name.test.d.ts +2 -0
  568. package/dist/test/symbols/deconflicted-name.test.d.ts.map +1 -0
  569. package/dist/test/symbols/deconflicted-name.test.js +120 -0
  570. package/dist/test/symbols/deconflicted-name.test.js.map +1 -0
  571. package/dist/test/symbols/output-scope.test.js +41 -0
  572. package/dist/test/symbols/output-scope.test.js.map +1 -1
  573. package/dist/testing/create-test-wrapper.d.ts +75 -2
  574. package/dist/testing/create-test-wrapper.d.ts.map +1 -1
  575. package/dist/testing/create-test-wrapper.js +55 -1
  576. package/dist/testing/create-test-wrapper.js.map +1 -1
  577. package/dist/testing/devtools-utils.d.ts +12 -3
  578. package/dist/testing/devtools-utils.d.ts.map +1 -1
  579. package/dist/testing/devtools-utils.js +26 -4
  580. package/dist/testing/devtools-utils.js.map +1 -1
  581. package/dist/testing/extend-expect.d.ts +26 -0
  582. package/dist/testing/extend-expect.d.ts.map +1 -1
  583. package/dist/testing/extend-expect.js +20 -0
  584. package/dist/testing/extend-expect.js.map +1 -1
  585. package/dist/testing/index.d.ts +1 -1
  586. package/dist/testing/index.d.ts.map +1 -1
  587. package/dist/testing/index.js +1 -1
  588. package/dist/testing/index.js.map +1 -1
  589. package/dist/testing/render.d.ts +9 -0
  590. package/dist/testing/render.d.ts.map +1 -1
  591. package/dist/testing/render.js +11 -0
  592. package/dist/testing/render.js.map +1 -1
  593. package/dist/testing/vitest.d.js +12 -0
  594. package/dist/testing/vitest.d.js.map +1 -1
  595. package/dist/tsconfig.tsbuildinfo +1 -1
  596. package/docs/api/components/AppendRegion.md +83 -0
  597. package/docs/api/components/Block.md +49 -0
  598. package/docs/api/components/CopyFile.md +26 -0
  599. package/docs/api/components/Declaration.md +85 -0
  600. package/docs/api/components/For.md +91 -0
  601. package/docs/api/components/Indent.md +40 -0
  602. package/docs/api/components/List.md +68 -0
  603. package/docs/api/components/MemberDeclaration.md +89 -0
  604. package/docs/api/components/MemberName.md +21 -0
  605. package/docs/api/components/MemberScope.md +81 -0
  606. package/docs/api/components/Name.md +19 -0
  607. package/docs/api/components/Output.md +62 -0
  608. package/docs/api/components/Prose.md +29 -0
  609. package/docs/api/components/ReferenceOrContent.md +28 -0
  610. package/docs/api/components/Scope.md +83 -0
  611. package/docs/api/components/Show.md +32 -0
  612. package/docs/api/components/SourceDirectory.md +28 -0
  613. package/docs/api/components/SourceFile.md +60 -0
  614. package/docs/api/components/StatementList.md +29 -0
  615. package/docs/api/components/Switch.md +42 -0
  616. package/docs/api/components/TemplateFile.md +71 -0
  617. package/docs/api/components/TemplateVariable.md +57 -0
  618. package/docs/api/components/UpdateFile.md +56 -0
  619. package/docs/api/components/Wrap.md +40 -0
  620. package/docs/api/components/createAccessExpression.md +55 -0
  621. package/docs/api/components/index.md +27 -0
  622. package/docs/api/contexts/Assignment-context.md +43 -0
  623. package/docs/api/contexts/Binder-context.md +22 -0
  624. package/docs/api/contexts/Declaration-context.md +15 -0
  625. package/docs/api/contexts/Member-context.md +17 -0
  626. package/docs/api/contexts/MemberDeclaration-context.md +24 -0
  627. package/docs/api/contexts/NamePolicy-context.md +18 -0
  628. package/docs/api/contexts/Scope-context.md +20 -0
  629. package/docs/api/contexts/SourceDirectory-context.md +26 -0
  630. package/docs/api/contexts/SourceFile-context.md +19 -0
  631. package/docs/api/contexts/index.md +11 -0
  632. package/docs/api/functions/attachDiagnosticsCollector.md +18 -0
  633. package/docs/api/functions/baseListPropsToMapJoinArgs.md +20 -0
  634. package/docs/api/functions/children.md +27 -0
  635. package/docs/api/functions/childrenArray.md +25 -0
  636. package/docs/api/functions/code.md +25 -0
  637. package/docs/api/functions/computed.md +18 -0
  638. package/docs/api/functions/createComponent.md +20 -0
  639. package/docs/api/functions/createContentSlot.md +33 -0
  640. package/docs/api/functions/createContext.md +19 -0
  641. package/docs/api/functions/createCustomContext.md +18 -0
  642. package/docs/api/functions/createDeclarationTap.md +20 -0
  643. package/docs/api/functions/createFileResource.md +35 -0
  644. package/docs/api/functions/createFormatOptionsContextFor.md +28 -0
  645. package/docs/api/functions/createIntrinsic.md +19 -0
  646. package/docs/api/functions/createMemberTap.md +20 -0
  647. package/docs/api/functions/createNamePolicy.md +37 -0
  648. package/docs/api/functions/createNamedContext.md +19 -0
  649. package/docs/api/functions/createOutputBinder.md +24 -0
  650. package/docs/api/functions/createRenderTreeHook.md +19 -0
  651. package/docs/api/functions/createResource.md +77 -0
  652. package/docs/api/functions/createScope.md +35 -0
  653. package/docs/api/functions/createScopeTap.md +20 -0
  654. package/docs/api/functions/createSourceFileTap.md +20 -0
  655. package/docs/api/functions/createSymbol.md +25 -0
  656. package/docs/api/functions/createSymbolSlot.md +19 -0
  657. package/docs/api/functions/createTap.md +55 -0
  658. package/docs/api/functions/decl.md +20 -0
  659. package/docs/api/functions/defaultProps.md +21 -0
  660. package/docs/api/functions/effect.md +26 -0
  661. package/docs/api/functions/emitDiagnostic.md +18 -0
  662. package/docs/api/functions/emitSymbol.md +18 -0
  663. package/docs/api/functions/ensureIsEmpty.md +20 -0
  664. package/docs/api/functions/findCurrentEffectId.md +19 -0
  665. package/docs/api/functions/findKeyedChild.md +19 -0
  666. package/docs/api/functions/findKeyedChildren.md +19 -0
  667. package/docs/api/functions/findUnkeyedChildren.md +18 -0
  668. package/docs/api/functions/formatReactivePropertyLabel.md +21 -0
  669. package/docs/api/functions/getAssignmentSymbol.md +19 -0
  670. package/docs/api/functions/getContext.md +17 -0
  671. package/docs/api/functions/getContextForRenderNode.md +18 -0
  672. package/docs/api/functions/getDiagnosticsForTree.md +18 -0
  673. package/docs/api/functions/getEffectDebugId.md +18 -0
  674. package/docs/api/functions/getElementCache.md +17 -0
  675. package/docs/api/functions/getReactiveCreationLocation.md +18 -0
  676. package/docs/api/functions/getSymbolCreator.md +18 -0
  677. package/docs/api/functions/getSymbolCreatorSymbol.md +17 -0
  678. package/docs/api/functions/index.md +105 -0
  679. package/docs/api/functions/inspectRefkey.md +18 -0
  680. package/docs/api/functions/instantiateTakenMembersTo.md +20 -0
  681. package/docs/api/functions/isComponentCreator.md +19 -0
  682. package/docs/api/functions/isCustomContext.md +18 -0
  683. package/docs/api/functions/isIntrinsicElement.md +18 -0
  684. package/docs/api/functions/isKeyedChild.md +18 -0
  685. package/docs/api/functions/isLibrarySymbolReference.md +18 -0
  686. package/docs/api/functions/isMemberRefkey.md +18 -0
  687. package/docs/api/functions/isNamekey.md +18 -0
  688. package/docs/api/functions/isPrintHook.md +18 -0
  689. package/docs/api/functions/isRefkey.md +18 -0
  690. package/docs/api/functions/isRefkeyable.md +18 -0
  691. package/docs/api/functions/isRenderableObject.md +20 -0
  692. package/docs/api/functions/isSymbolRefkey.md +18 -0
  693. package/docs/api/functions/join.md +33 -0
  694. package/docs/api/functions/mapJoin.md +106 -0
  695. package/docs/api/functions/memberRefkey.md +27 -0
  696. package/docs/api/functions/memo.md +29 -0
  697. package/docs/api/functions/mergeProps.md +64 -0
  698. package/docs/api/functions/moveTakenMembersTo.md +18 -0
  699. package/docs/api/functions/namekey.md +41 -0
  700. package/docs/api/functions/nextReactiveId.md +19 -0
  701. package/docs/api/functions/notifyContentState.md +17 -0
  702. package/docs/api/functions/onCleanup.md +26 -0
  703. package/docs/api/functions/printTree.md +31 -0
  704. package/docs/api/functions/reactivePropertyRefId.md +21 -0
  705. package/docs/api/functions/ref.md +21 -0
  706. package/docs/api/functions/refId.md +18 -0
  707. package/docs/api/functions/refkey.md +24 -0
  708. package/docs/api/functions/render.md +31 -0
  709. package/docs/api/functions/renderAsync.md +31 -0
  710. package/docs/api/functions/renderTree.md +18 -0
  711. package/docs/api/functions/reportDiagnostics.md +18 -0
  712. package/docs/api/functions/resetRefIdCounter.md +17 -0
  713. package/docs/api/functions/resolve.md +31 -0
  714. package/docs/api/functions/root.md +25 -0
  715. package/docs/api/functions/shallowReactive.md +18 -0
  716. package/docs/api/functions/shallowRef.md +21 -0
  717. package/docs/api/functions/sourceFilesForTree.md +31 -0
  718. package/docs/api/functions/splitProps.md +19 -0
  719. package/docs/api/functions/stc.md +18 -0
  720. package/docs/api/functions/sti.md +18 -0
  721. package/docs/api/functions/symbolForRefkey.md +24 -0
  722. package/docs/api/functions/taggedComponent.md +19 -0
  723. package/docs/api/functions/takeSymbols.md +18 -0
  724. package/docs/api/functions/text.md +19 -0
  725. package/docs/api/functions/toRef.md +20 -0
  726. package/docs/api/functions/toRefkey.md +18 -0
  727. package/docs/api/functions/toRefs.md +20 -0
  728. package/docs/api/functions/traverseOutput.md +21 -0
  729. package/docs/api/functions/unresolvedRefkey.md +18 -0
  730. package/docs/api/functions/untrack.md +18 -0
  731. package/docs/api/functions/useContext.md +18 -0
  732. package/docs/api/functions/useFormatOptions.md +18 -0
  733. package/docs/api/functions/useMemberContext.md +17 -0
  734. package/docs/api/functions/useMemberScope.md +17 -0
  735. package/docs/api/functions/writeOutput.md +21 -0
  736. package/docs/api/index.md +9 -0
  737. package/docs/api/testing/functions/createTestWrapper.md +70 -0
  738. package/docs/api/testing/functions/d.md +21 -0
  739. package/docs/api/testing/functions/dedent.md +18 -0
  740. package/docs/api/testing/functions/index.md +6 -0
  741. package/docs/api/testing/functions/renderToString.md +20 -0
  742. package/docs/api/testing/index.md +4 -0
  743. package/docs/api/testing/types/TestWrapper.md +10 -0
  744. package/docs/api/testing/types/ToRenderToOptions.md +24 -0
  745. package/docs/api/testing/types/index.md +4 -0
  746. package/docs/api/types/AlignIntrinsicElement.md +5 -0
  747. package/docs/api/types/AppendRegionProps.md +5 -0
  748. package/docs/api/types/BaseListProps.md +21 -0
  749. package/docs/api/types/BasePartProps.md +10 -0
  750. package/docs/api/types/BasicScope.md +15 -0
  751. package/docs/api/types/BasicSymbol.md +18 -0
  752. package/docs/api/types/Binder.md +18 -0
  753. package/docs/api/types/BinderOptions.md +7 -0
  754. package/docs/api/types/BrIntrinsicElement.md +5 -0
  755. package/docs/api/types/BreakParentIntrinsicElement.md +5 -0
  756. package/docs/api/types/Child.md +5 -0
  757. package/docs/api/types/Children.md +5 -0
  758. package/docs/api/types/ChildrenOptions.md +7 -0
  759. package/docs/api/types/CommonFormatOptions.md +8 -0
  760. package/docs/api/types/Component.md +8 -0
  761. package/docs/api/types/ComponentContext.md +11 -0
  762. package/docs/api/types/ComponentCreator.md +11 -0
  763. package/docs/api/types/ComponentDefinition.md +7 -0
  764. package/docs/api/types/ContentOutputFile.md +10 -0
  765. package/docs/api/types/ContentSlot.md +12 -0
  766. package/docs/api/types/Context.md +19 -0
  767. package/docs/api/types/ContextProviderProps.md +8 -0
  768. package/docs/api/types/CopyFileContext.md +8 -0
  769. package/docs/api/types/CopyOutputFile.md +9 -0
  770. package/docs/api/types/CustomContext.md +10 -0
  771. package/docs/api/types/CustomContextChildrenCallback.md +5 -0
  772. package/docs/api/types/DeclarationProps.md +5 -0
  773. package/docs/api/types/DedentIntrinsicElement.md +5 -0
  774. package/docs/api/types/DedentToRootIntrinsicElement.md +5 -0
  775. package/docs/api/types/Diagnostic.md +11 -0
  776. package/docs/api/types/DiagnosticHandle.md +7 -0
  777. package/docs/api/types/DiagnosticInput.md +10 -0
  778. package/docs/api/types/DiagnosticSeverity.md +5 -0
  779. package/docs/api/types/DiagnosticStackEntry.md +9 -0
  780. package/docs/api/types/DiagnosticsCollector.md +8 -0
  781. package/docs/api/types/Disposable_2.md +7 -0
  782. package/docs/api/types/EffectDebugOptions.md +8 -0
  783. package/docs/api/types/EffectOptions.md +7 -0
  784. package/docs/api/types/ElementCache.md +5 -0
  785. package/docs/api/types/ElementCacheKey.md +5 -0
  786. package/docs/api/types/FillIntrinsicElement.md +5 -0
  787. package/docs/api/types/ForCallbackArgs.md +5 -0
  788. package/docs/api/types/ForSupportedCollections.md +5 -0
  789. package/docs/api/types/GroupIntrinsicElement.md +5 -0
  790. package/docs/api/types/HardlineIntrinsicElement.md +5 -0
  791. package/docs/api/types/HbrIntrinsicElement.md +5 -0
  792. package/docs/api/types/IfBreakIntrinsicElement.md +5 -0
  793. package/docs/api/types/IndentIfBreakIntrinsicElement.md +5 -0
  794. package/docs/api/types/IndentIntrinsicElement.md +5 -0
  795. package/docs/api/types/IntrinsicElement.md +5 -0
  796. package/docs/api/types/IntrinsicElementBase.md +9 -0
  797. package/docs/api/types/IntrinsicElements.md +26 -0
  798. package/docs/api/types/JoinOptions.md +9 -0
  799. package/docs/api/types/LbrIntrinsicElement.md +5 -0
  800. package/docs/api/types/LibrarySymbolReference.md +13 -0
  801. package/docs/api/types/LineIntrinsicElement.md +5 -0
  802. package/docs/api/types/LineSuffixBoundaryIntrinsicElement.md +5 -0
  803. package/docs/api/types/LineSuffixIntrinsicElement.md +5 -0
  804. package/docs/api/types/LiterallineIntrinsicElement.md +5 -0
  805. package/docs/api/types/MakeChildrenOptional.md +7 -0
  806. package/docs/api/types/MarkAsRootIntrinsicElement.md +5 -0
  807. package/docs/api/types/MatchProps.md +9 -0
  808. package/docs/api/types/MemberDeclarationProps.md +5 -0
  809. package/docs/api/types/MemberDescriptor.md +10 -0
  810. package/docs/api/types/MemberRefkey.md +10 -0
  811. package/docs/api/types/MemberResolutionContext.md +10 -0
  812. package/docs/api/types/MemberResolver.md +32 -0
  813. package/docs/api/types/MemberScopeProps.md +5 -0
  814. package/docs/api/types/Metadata.md +5 -0
  815. package/docs/api/types/NameConflictResolver.md +27 -0
  816. package/docs/api/types/NamePolicy.md +8 -0
  817. package/docs/api/types/NamePolicyGetter.md +9 -0
  818. package/docs/api/types/Namekey.md +10 -0
  819. package/docs/api/types/NamekeyOptions.md +8 -0
  820. package/docs/api/types/OnReactiveSetAddCallback.md +5 -0
  821. package/docs/api/types/OnReactiveSetDeleteCallback.md +5 -0
  822. package/docs/api/types/OutputDeclarationSpace.md +13 -0
  823. package/docs/api/types/OutputDirectory.md +59 -0
  824. package/docs/api/types/OutputFile.md +5 -0
  825. package/docs/api/types/OutputFileBase.md +8 -0
  826. package/docs/api/types/OutputMemberSpace.md +13 -0
  827. package/docs/api/types/OutputScope.md +33 -0
  828. package/docs/api/types/OutputScopeOptions.md +9 -0
  829. package/docs/api/types/OutputSpace.md +7 -0
  830. package/docs/api/types/OutputSymbol.md +78 -0
  831. package/docs/api/types/OutputSymbolOptions.md +16 -0
  832. package/docs/api/types/OutputVisitor.md +10 -0
  833. package/docs/api/types/PrintHook.md +10 -0
  834. package/docs/api/types/PrintTreeOptions.md +11 -0
  835. package/docs/api/types/Props.md +5 -0
  836. package/docs/api/types/ReactiveUnionSet.md +20 -0
  837. package/docs/api/types/ReactiveUnionSetOptions.md +8 -0
  838. package/docs/api/types/Refkey.md +5 -0
  839. package/docs/api/types/Refkeyable.md +5 -0
  840. package/docs/api/types/RefkeyableObject.md +7 -0
  841. package/docs/api/types/RenderableObject.md +9 -0
  842. package/docs/api/types/RenderedTextTree.md +5 -0
  843. package/docs/api/types/ResolutionResult.md +39 -0
  844. package/docs/api/types/ResolveDeclarationByKeyOptions.md +7 -0
  845. package/docs/api/types/Resource.md +11 -0
  846. package/docs/api/types/RootOptions.md +7 -0
  847. package/docs/api/types/SbrIntrinsicElement.md +5 -0
  848. package/docs/api/types/ScopeProps.md +5 -0
  849. package/docs/api/types/SoftlineIntrinsicElement.md +5 -0
  850. package/docs/api/types/SourceLocation.md +9 -0
  851. package/docs/api/types/SplitProps.md +12 -0
  852. package/docs/api/types/StcComponentCreator.md +9 -0
  853. package/docs/api/types/StcSignature.md +5 -0
  854. package/docs/api/types/StiComponentCreator.md +9 -0
  855. package/docs/api/types/StiSignature.md +7 -0
  856. package/docs/api/types/SymbolCreator.md +15 -0
  857. package/docs/api/types/SymbolRefkey.md +9 -0
  858. package/docs/api/types/SymbolSlot.md +12 -0
  859. package/docs/api/types/SymbolTable.md +15 -0
  860. package/docs/api/types/TakeSymbolCallback.md +7 -0
  861. package/docs/api/types/TakeSymbolsCallback.md +7 -0
  862. package/docs/api/types/Tap.md +11 -0
  863. package/docs/api/types/TapHandler.md +9 -0
  864. package/docs/api/types/Tapper.md +9 -0
  865. package/docs/api/types/TemplateVariableProps.md +5 -0
  866. package/docs/api/types/index.md +122 -0
  867. package/docs/api/variables/FormatOptions.md +5 -0
  868. package/docs/api/variables/Match.md +7 -0
  869. package/docs/api/variables/REFKEYABLE.md +5 -0
  870. package/docs/api/variables/RENDERABLE.md +5 -0
  871. package/docs/api/variables/TO_SYMBOL.md +39 -0
  872. package/docs/api/variables/contextsByKey.md +5 -0
  873. package/docs/api/variables/index.md +11 -0
  874. package/docs/api/variables/intrinsicElementKey.md +5 -0
  875. package/docs/api/variables/matchTag.md +5 -0
  876. package/docs/api/variables/printHookTag.md +7 -0
  877. package/docs/components.md +97 -0
  878. package/docs/context.md +67 -0
  879. package/docs/control-flow.md +5 -0
  880. package/docs/debugging.md +105 -0
  881. package/docs/formatting.md +99 -0
  882. package/docs/guides/language-package-guide.md +593 -0
  883. package/docs/guides/references-and-refkeys.md +210 -0
  884. package/docs/guides/style-guide.md +244 -0
  885. package/docs/index.md +22 -0
  886. package/docs/reactivity.md +68 -0
  887. package/docs/rendering.md +41 -0
  888. package/docs/symbols-and-scopes.md +180 -0
  889. package/package.json +21 -7
  890. package/src/binder.ts +154 -41
  891. package/src/components/AccessExpression.test.tsx +132 -0
  892. package/src/components/AccessExpression.tsx +344 -0
  893. package/src/components/Block.tsx +12 -0
  894. package/src/components/For.tsx +14 -10
  895. package/src/components/List.tsx +18 -5
  896. package/src/components/MemberDeclaration.tsx +6 -6
  897. package/src/components/MemberName.tsx +6 -0
  898. package/src/components/MemberScope.tsx +5 -0
  899. package/src/components/Output.tsx +4 -1
  900. package/src/components/Scope.tsx +6 -0
  901. package/src/components/SourceFile.tsx +22 -2
  902. package/src/components/Switch.tsx +11 -7
  903. package/src/components/index.tsx +1 -0
  904. package/src/context/binder.ts +4 -0
  905. package/src/context/format-options.ts +14 -1
  906. package/src/context/scope.ts +4 -0
  907. package/src/context/source-directory.ts +9 -0
  908. package/src/debug/cli.browser.ts +17 -0
  909. package/src/debug/cli.ts +3 -2
  910. package/src/debug/diagnostics-broadcast.test.tsx +98 -0
  911. package/src/debug/diagnostics.test.tsx +3 -2
  912. package/src/debug/effects.test.tsx +248 -36
  913. package/src/debug/effects.ts +198 -64
  914. package/src/debug/files.test.tsx +15 -35
  915. package/src/debug/files.ts +11 -11
  916. package/src/debug/index.ts +4 -0
  917. package/src/debug/message-format.test.tsx +759 -0
  918. package/src/debug/render-tree-orphans.test.tsx +344 -0
  919. package/src/debug/render.test.tsx +96 -118
  920. package/src/debug/render.ts +196 -125
  921. package/src/debug/source-map.browser.ts +30 -0
  922. package/src/debug/source-map.ts +135 -0
  923. package/src/debug/symbols.test.tsx +19 -20
  924. package/src/debug/symbols.ts +106 -23
  925. package/src/debug/trace-db.browser.ts +12 -0
  926. package/src/debug/trace-db.ts +42 -0
  927. package/src/debug/trace-writer.ts +962 -0
  928. package/src/debug/trace.ts +46 -32
  929. package/src/devtools/devtools-protocol.ts +361 -176
  930. package/src/devtools/devtools-server.browser.ts +4 -9
  931. package/src/devtools/devtools-server.ts +226 -33
  932. package/src/devtools/devtools-transport.ts +4 -4
  933. package/src/devtools-entry.browser.ts +11 -15
  934. package/src/devtools-entry.ts +9 -15
  935. package/src/diagnostics.ts +44 -22
  936. package/src/host/node-host.browser.ts +23 -0
  937. package/src/host/node-host.ts +22 -0
  938. package/src/library-symbol-reference.ts +52 -0
  939. package/src/name-policy.ts +30 -3
  940. package/src/reactivity.ts +179 -55
  941. package/src/render-stack.ts +4 -3
  942. package/src/render.ts +106 -30
  943. package/src/scheduler.ts +145 -26
  944. package/src/symbols/output-scope.ts +33 -1
  945. package/src/symbols/output-space.ts +13 -0
  946. package/src/symbols/output-symbol.ts +185 -22
  947. package/src/symbols/symbol-slot.test.tsx +28 -1
  948. package/src/symbols/symbol-slot.tsx +8 -0
  949. package/src/symbols/symbol-table.ts +13 -3
  950. package/src/utils.tsx +7 -4
  951. package/src/write-output.ts +6 -5
  952. package/temp/api-testing.json +673 -0
  953. package/temp/api.json +895 -73
  954. package/test/browser-build.test.ts +141 -76
  955. package/test/reactivity/shallow-reactive.test.tsx +4 -0
  956. package/test/symbols/deconflicted-name.test.ts +120 -0
  957. package/test/symbols/output-scope.test.ts +38 -0
  958. package/testing/create-test-wrapper.tsx +81 -2
  959. package/testing/devtools-utils.ts +46 -4
  960. package/testing/extend-expect.ts +22 -1
  961. package/testing/index.ts +1 -1
  962. package/testing/render.ts +9 -0
  963. package/testing/vitest.d.ts +18 -3
  964. package/vitest.config.ts +8 -0
@@ -1,91 +1,156 @@
1
- import { execSync } from "child_process";
2
1
  import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
3
- import { join } from "path";
2
+ import { join, resolve } 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
+ // Absolute path to the compiled browser entry point.
10
+ const corePkgDir = resolve(__dirname, "..");
11
+ const browserEntry = resolve(corePkgDir, "dist/src/index.browser.js");
12
+
13
+ /**
14
+ * Bundles `@alloy-js/core` for the browser using Vite and returns
15
+ * the concatenated output code and any warnings emitted during the build.
16
+ *
17
+ * Uses a custom resolveId plugin to force the browser entry point,
18
+ * because vitest's `resolve.conditions: ["source"]` leaks into the
19
+ * Vite build() call even with `configFile: false`, causing the test
20
+ * to resolve TypeScript source files instead of compiled dist.
21
+ */
22
+ async function bundleForBrowser(): Promise<{
23
+ code: string;
24
+ warnings: string[];
25
+ }> {
26
+ const warnings: string[] = [];
27
+ const result = await build({
28
+ configFile: false,
29
+ logLevel: "silent",
30
+ resolve: {
31
+ conditions: ["browser", "import"],
32
+ mainFields: ["browser", "module", "main"],
33
+ },
34
+ // Disable automatic process.env replacement so we can detect leaks
35
+ define: {},
36
+ plugins: [
37
+ {
38
+ name: "force-browser-entry",
39
+ enforce: "pre",
40
+ resolveId(source) {
41
+ // Force @alloy-js/core to resolve to the compiled browser entry,
42
+ // bypassing vitest's "source" condition that would resolve to TS.
43
+ if (source === "@alloy-js/core") {
44
+ return browserEntry;
45
+ }
46
+ return null;
47
+ },
48
+ },
49
+ {
50
+ name: "capture-warnings",
51
+ enforce: "post",
52
+ buildStart() {
53
+ // Hook into Vite's warning channel via rollup options
54
+ },
55
+ },
56
+ ],
57
+ customLogger: {
58
+ info() {},
59
+ error() {},
60
+ clearScreen() {},
61
+ hasErrorLogged() {
62
+ return false;
63
+ },
64
+ hasWarned: false,
65
+ warnOnce(msg: string) {
66
+ warnings.push(msg);
67
+ },
68
+ warn(msg: string) {
69
+ warnings.push(msg);
70
+ },
71
+ },
72
+ build: {
73
+ write: false,
74
+ minify: false,
75
+ rollupOptions: {
76
+ input: entryFile,
77
+ output: { format: "es" },
78
+ // Disable tree-shaking so we catch process.* references in ANY
79
+ // code path, even if it would be removed in a production build.
80
+ treeshake: false,
81
+ external: (id) => {
82
+ // Bundle @alloy-js packages — these are what we're validating
83
+ if (id.startsWith("@alloy-js/")) return false;
84
+ // Bundle relative/absolute imports (intra-package)
85
+ if (id.startsWith(".") || id.startsWith("/")) return false;
86
+ // Externalize third-party deps (vue, pathe, picocolors, …)
87
+ return true;
88
+ },
89
+ onwarn(warning) {
90
+ warnings.push(
91
+ typeof warning === "string" ? warning : (
92
+ (warning.message ?? String(warning))
93
+ ),
94
+ );
95
+ },
96
+ },
97
+ },
98
+ });
99
+
100
+ const output = (
101
+ Array.isArray(result) ?
102
+ result[0]
103
+ : result) as Rolldown.RolldownOutput;
104
+ const chunks = output.output.filter(
105
+ (o): o is Rolldown.OutputChunk => o.type === "chunk",
106
+ );
107
+ return { code: chunks.map((c) => c.code).join("\n"), warnings };
108
+ }
109
+
110
+ describe("browser build", () => {
9
111
  beforeAll(() => {
10
- // Cleanup previous runs
11
- if (existsSync(testDir)) {
12
- rmSync(testDir, { recursive: true, force: true });
112
+ if (existsSync(tempDir)) {
113
+ rmSync(tempDir, { recursive: true, force: true });
13
114
  }
115
+ mkdirSync(tempDir, { recursive: true });
116
+ writeFileSync(entryFile, 'export * from "@alloy-js/core";\n');
117
+ });
14
118
 
15
- // Create a temporary Vite project
16
- mkdirSync(testDir, { recursive: true });
119
+ afterAll(() => {
120
+ if (existsSync(tempDir)) {
121
+ rmSync(tempDir, { recursive: true, force: true });
122
+ }
123
+ });
17
124
 
18
- execSync("npm init -y", { cwd: testDir });
19
- execSync("npm install vite", { cwd: testDir });
20
- execSync("npm install ../../..", { cwd: testDir });
125
+ it("should bundle for browser without Node.js polyfills", async () => {
126
+ const { code, warnings } = await bundleForBrowser();
21
127
 
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
- );
128
+ // Sanity check: the bundle should not be empty
129
+ expect(code.length).toBeGreaterThan(0);
30
130
 
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
- );
131
+ // The browser bundle must not reference the Node.js `process` global.
132
+ // If this fails, a file is using process.env / process.cwd / etc.
133
+ // without going through host/node-host.ts (or another browser-overridden module).
134
+ expect(code).not.toMatch(/\bprocess\./);
44
135
 
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
- );
136
+ // Should not contain static require("node:…") calls
137
+ expect(code).not.toMatch(/require\(\s*["']node:/);
62
138
 
63
- writeFileSync(
64
- join(testDir, "package.json"),
65
- JSON.stringify(
66
- {
67
- type: "module",
68
- scripts: {
69
- build: "vite build",
70
- },
71
- },
72
- null,
73
- 2,
74
- ),
139
+ // Should not contain dynamic import("node:…") calls — these are the
140
+ // ones esbuild and other browser bundlers reject (e.g. node:sqlite, node:fs).
141
+ expect(code).not.toMatch(/import\(\s*["']node:/);
142
+
143
+ // Vite silently externalizes node:* modules for browser builds via its
144
+ // built-in rolldown:vite-resolve plugin, which hides the issue from the
145
+ // code assertions above. Catch those by checking for externalization warnings.
146
+ const nodeExternalizationWarnings = warnings.filter(
147
+ (w) =>
148
+ w.includes("externalized for browser compatibility") ||
149
+ w.includes("node:"),
75
150
  );
151
+ expect(
152
+ nodeExternalizationWarnings,
153
+ `Node.js modules were externalized for browser compatibility — missing browser shims:\n${nodeExternalizationWarnings.join("\n")}`,
154
+ ).toEqual([]);
76
155
  }, 30_000);
77
-
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();
83
- });
84
-
85
- afterAll(() => {
86
- // Ensure testDir exists before attempting to remove it
87
- if (existsSync(testDir)) {
88
- rmSync(testDir, { recursive: true, force: true });
89
- }
90
- });
91
156
  });
@@ -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(