@alloy-js/core 0.23.0-dev.8 → 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 (992) 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/Prose.js +2 -2
  376. package/dist/src/components/Prose.js.map +1 -1
  377. package/dist/src/components/Scope.d.ts +6 -0
  378. package/dist/src/components/Scope.d.ts.map +1 -1
  379. package/dist/src/components/Scope.js +8 -0
  380. package/dist/src/components/Scope.js.map +1 -1
  381. package/dist/src/components/SourceDirectory.d.ts.map +1 -1
  382. package/dist/src/components/SourceDirectory.js +1 -2
  383. package/dist/src/components/SourceDirectory.js.map +1 -1
  384. package/dist/src/components/SourceFile.d.ts +22 -2
  385. package/dist/src/components/SourceFile.d.ts.map +1 -1
  386. package/dist/src/components/SourceFile.js.map +1 -1
  387. package/dist/src/components/Switch.d.ts.map +1 -1
  388. package/dist/src/components/Switch.js +1 -1
  389. package/dist/src/components/Switch.js.map +1 -1
  390. package/dist/src/components/index.d.ts +1 -0
  391. package/dist/src/components/index.d.ts.map +1 -1
  392. package/dist/src/components/index.js +1 -0
  393. package/dist/src/components/index.js.map +1 -1
  394. package/dist/src/content-slot.js +2 -2
  395. package/dist/src/content-slot.js.map +1 -1
  396. package/dist/src/context/binder.d.ts +4 -0
  397. package/dist/src/context/binder.d.ts.map +1 -1
  398. package/dist/src/context/binder.js +5 -0
  399. package/dist/src/context/binder.js.map +1 -1
  400. package/dist/src/context/format-options.d.ts +14 -1
  401. package/dist/src/context/format-options.d.ts.map +1 -1
  402. package/dist/src/context/format-options.js +14 -1
  403. package/dist/src/context/format-options.js.map +1 -1
  404. package/dist/src/context/scope.d.ts +4 -0
  405. package/dist/src/context/scope.d.ts.map +1 -1
  406. package/dist/src/context/scope.js +5 -0
  407. package/dist/src/context/scope.js.map +1 -1
  408. package/dist/src/context/source-directory.d.ts +9 -0
  409. package/dist/src/context/source-directory.d.ts.map +1 -1
  410. package/dist/src/context/source-directory.js +9 -0
  411. package/dist/src/context/source-directory.js.map +1 -1
  412. package/dist/src/context.js +2 -2
  413. package/dist/src/context.js.map +1 -1
  414. package/dist/src/debug/cli.d.ts.map +1 -1
  415. package/dist/src/debug/cli.js +3 -2
  416. package/dist/src/debug/cli.js.map +1 -1
  417. package/dist/src/debug/diagnostics-broadcast.test.d.ts +2 -0
  418. package/dist/src/debug/diagnostics-broadcast.test.d.ts.map +1 -0
  419. package/dist/src/debug/diagnostics-broadcast.test.js +100 -0
  420. package/dist/src/debug/diagnostics-broadcast.test.js.map +1 -0
  421. package/dist/src/debug/diagnostics.test.js +3 -2
  422. package/dist/src/debug/diagnostics.test.js.map +1 -1
  423. package/dist/src/debug/effects.d.ts +16 -4
  424. package/dist/src/debug/effects.d.ts.map +1 -1
  425. package/dist/src/debug/effects.js +119 -54
  426. package/dist/src/debug/effects.js.map +1 -1
  427. package/dist/src/debug/effects.test.js +206 -36
  428. package/dist/src/debug/effects.test.js.map +1 -1
  429. package/dist/src/debug/files.d.ts.map +1 -1
  430. package/dist/src/debug/files.js +7 -18
  431. package/dist/src/debug/files.js.map +1 -1
  432. package/dist/src/debug/files.test.js +13 -36
  433. package/dist/src/debug/files.test.js.map +1 -1
  434. package/dist/src/debug/index.d.ts +6 -3
  435. package/dist/src/debug/index.d.ts.map +1 -1
  436. package/dist/src/debug/index.js +6 -3
  437. package/dist/src/debug/index.js.map +1 -1
  438. package/dist/src/debug/message-format.test.d.ts +2 -0
  439. package/dist/src/debug/message-format.test.d.ts.map +1 -0
  440. package/dist/src/debug/message-format.test.js +700 -0
  441. package/dist/src/debug/message-format.test.js.map +1 -0
  442. package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
  443. package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
  444. package/dist/src/debug/render-tree-orphans.test.js +297 -0
  445. package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
  446. package/dist/src/debug/render.d.ts.map +1 -1
  447. package/dist/src/debug/render.js +91 -131
  448. package/dist/src/debug/render.js.map +1 -1
  449. package/dist/src/debug/render.test.js +91 -128
  450. package/dist/src/debug/render.test.js.map +1 -1
  451. package/dist/src/debug/source-map.browser.d.ts +16 -0
  452. package/dist/src/debug/source-map.browser.d.ts.map +1 -0
  453. package/dist/src/debug/source-map.browser.js +24 -0
  454. package/dist/src/debug/source-map.browser.js.map +1 -0
  455. package/dist/src/debug/source-map.d.ts +22 -0
  456. package/dist/src/debug/source-map.d.ts.map +1 -0
  457. package/dist/src/debug/source-map.js +111 -0
  458. package/dist/src/debug/source-map.js.map +1 -0
  459. package/dist/src/debug/symbols.d.ts +7 -0
  460. package/dist/src/debug/symbols.d.ts.map +1 -1
  461. package/dist/src/debug/symbols.js +46 -14
  462. package/dist/src/debug/symbols.js.map +1 -1
  463. package/dist/src/debug/symbols.test.js +15 -26
  464. package/dist/src/debug/symbols.test.js.map +1 -1
  465. package/dist/src/debug/trace-writer.d.ts +56 -0
  466. package/dist/src/debug/trace-writer.d.ts.map +1 -0
  467. package/dist/src/debug/trace-writer.js +674 -0
  468. package/dist/src/debug/trace-writer.js.map +1 -0
  469. package/dist/src/debug/trace.d.ts +10 -10
  470. package/dist/src/debug/trace.d.ts.map +1 -1
  471. package/dist/src/debug/trace.js +41 -24
  472. package/dist/src/debug/trace.js.map +1 -1
  473. package/dist/src/devtools/devtools-protocol.d.ts +318 -161
  474. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  475. package/dist/src/devtools/devtools-server.browser.d.ts +1 -5
  476. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
  477. package/dist/src/devtools/devtools-server.browser.js +3 -3
  478. package/dist/src/devtools/devtools-server.browser.js.map +1 -1
  479. package/dist/src/devtools/devtools-server.d.ts +5 -6
  480. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  481. package/dist/src/devtools/devtools-server.js +227 -25
  482. package/dist/src/devtools/devtools-server.js.map +1 -1
  483. package/dist/src/devtools/devtools-transport.d.ts +2 -2
  484. package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
  485. package/dist/src/devtools/devtools-transport.js +2 -2
  486. package/dist/src/devtools/devtools-transport.js.map +1 -1
  487. package/dist/src/devtools-entry.browser.d.ts +1 -1
  488. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  489. package/dist/src/devtools-entry.browser.js.map +1 -1
  490. package/dist/src/devtools-entry.d.ts +1 -1
  491. package/dist/src/devtools-entry.d.ts.map +1 -1
  492. package/dist/src/devtools-entry.js.map +1 -1
  493. package/dist/src/diagnostics.d.ts +1 -1
  494. package/dist/src/diagnostics.d.ts.map +1 -1
  495. package/dist/src/diagnostics.js +27 -19
  496. package/dist/src/diagnostics.js.map +1 -1
  497. package/dist/src/host/node-host.browser.d.ts +11 -0
  498. package/dist/src/host/node-host.browser.d.ts.map +1 -0
  499. package/dist/src/host/node-host.browser.js +21 -0
  500. package/dist/src/host/node-host.browser.js.map +1 -0
  501. package/dist/src/host/node-host.d.ts +11 -0
  502. package/dist/src/host/node-host.d.ts.map +1 -0
  503. package/dist/src/host/node-host.js +20 -0
  504. package/dist/src/host/node-host.js.map +1 -0
  505. package/dist/src/index.d.ts +1 -1
  506. package/dist/src/index.d.ts.map +1 -1
  507. package/dist/src/index.js +1 -1
  508. package/dist/src/index.js.map +1 -1
  509. package/dist/src/library-symbol-reference.d.ts +52 -0
  510. package/dist/src/library-symbol-reference.d.ts.map +1 -1
  511. package/dist/src/library-symbol-reference.js +54 -0
  512. package/dist/src/library-symbol-reference.js.map +1 -1
  513. package/dist/src/name-policy.d.ts +30 -3
  514. package/dist/src/name-policy.d.ts.map +1 -1
  515. package/dist/src/name-policy.js +27 -0
  516. package/dist/src/name-policy.js.map +1 -1
  517. package/dist/src/reactive-union-set.d.ts.map +1 -1
  518. package/dist/src/reactive-union-set.js +13 -3
  519. package/dist/src/reactive-union-set.js.map +1 -1
  520. package/dist/src/reactivity.d.ts +60 -6
  521. package/dist/src/reactivity.d.ts.map +1 -1
  522. package/dist/src/reactivity.js +302 -155
  523. package/dist/src/reactivity.js.map +1 -1
  524. package/dist/src/render-stack.d.ts +1 -0
  525. package/dist/src/render-stack.d.ts.map +1 -1
  526. package/dist/src/render-stack.js +8 -3
  527. package/dist/src/render-stack.js.map +1 -1
  528. package/dist/src/render.d.ts +2 -0
  529. package/dist/src/render.d.ts.map +1 -1
  530. package/dist/src/render.js +90 -34
  531. package/dist/src/render.js.map +1 -1
  532. package/dist/src/scheduler.d.ts +10 -0
  533. package/dist/src/scheduler.d.ts.map +1 -1
  534. package/dist/src/scheduler.js +115 -21
  535. package/dist/src/scheduler.js.map +1 -1
  536. package/dist/src/symbols/output-scope.d.ts +33 -1
  537. package/dist/src/symbols/output-scope.d.ts.map +1 -1
  538. package/dist/src/symbols/output-scope.js +36 -3
  539. package/dist/src/symbols/output-scope.js.map +1 -1
  540. package/dist/src/symbols/output-space.d.ts +12 -0
  541. package/dist/src/symbols/output-space.d.ts.map +1 -1
  542. package/dist/src/symbols/output-space.js +15 -0
  543. package/dist/src/symbols/output-space.js.map +1 -1
  544. package/dist/src/symbols/output-symbol.d.ts +128 -12
  545. package/dist/src/symbols/output-symbol.d.ts.map +1 -1
  546. package/dist/src/symbols/output-symbol.js +160 -20
  547. package/dist/src/symbols/output-symbol.js.map +1 -1
  548. package/dist/src/symbols/symbol-flow.d.ts.map +1 -1
  549. package/dist/src/symbols/symbol-flow.js +2 -2
  550. package/dist/src/symbols/symbol-flow.js.map +1 -1
  551. package/dist/src/symbols/symbol-slot.d.ts.map +1 -1
  552. package/dist/src/symbols/symbol-slot.js +7 -0
  553. package/dist/src/symbols/symbol-slot.js.map +1 -1
  554. package/dist/src/symbols/symbol-slot.test.js +18 -1
  555. package/dist/src/symbols/symbol-slot.test.js.map +1 -1
  556. package/dist/src/symbols/symbol-table.d.ts.map +1 -1
  557. package/dist/src/symbols/symbol-table.js +13 -3
  558. package/dist/src/symbols/symbol-table.js.map +1 -1
  559. package/dist/src/utils.d.ts.map +1 -1
  560. package/dist/src/utils.js +12 -9
  561. package/dist/src/utils.js.map +1 -1
  562. package/dist/src/write-output.d.ts.map +1 -1
  563. package/dist/src/write-output.js +6 -5
  564. package/dist/src/write-output.js.map +1 -1
  565. package/dist/test/browser-build.test.js +66 -67
  566. package/dist/test/browser-build.test.js.map +1 -1
  567. package/dist/test/lazy-isempty.test.d.ts +2 -0
  568. package/dist/test/lazy-isempty.test.d.ts.map +1 -0
  569. package/dist/test/lazy-isempty.test.js +89 -0
  570. package/dist/test/lazy-isempty.test.js.map +1 -0
  571. package/dist/test/reactive-union-set-disposers.test.d.ts +2 -0
  572. package/dist/test/reactive-union-set-disposers.test.d.ts.map +1 -0
  573. package/dist/test/reactive-union-set-disposers.test.js +98 -0
  574. package/dist/test/reactive-union-set-disposers.test.js.map +1 -0
  575. package/dist/test/reactivity/shallow-reactive.test.d.ts +2 -0
  576. package/dist/test/reactivity/shallow-reactive.test.d.ts.map +1 -0
  577. package/dist/test/reactivity/shallow-reactive.test.js +56 -0
  578. package/dist/test/reactivity/shallow-reactive.test.js.map +1 -0
  579. package/dist/test/scheduler-extended.test.d.ts +2 -0
  580. package/dist/test/scheduler-extended.test.d.ts.map +1 -0
  581. package/dist/test/scheduler-extended.test.js +96 -0
  582. package/dist/test/scheduler-extended.test.js.map +1 -0
  583. package/dist/test/scheduler.test.d.ts +2 -0
  584. package/dist/test/scheduler.test.d.ts.map +1 -0
  585. package/dist/test/scheduler.test.js +46 -0
  586. package/dist/test/scheduler.test.js.map +1 -0
  587. package/dist/test/symbols/deconflicted-name.test.d.ts +2 -0
  588. package/dist/test/symbols/deconflicted-name.test.d.ts.map +1 -0
  589. package/dist/test/symbols/deconflicted-name.test.js +120 -0
  590. package/dist/test/symbols/deconflicted-name.test.js.map +1 -0
  591. package/dist/test/symbols/output-scope.test.js +41 -0
  592. package/dist/test/symbols/output-scope.test.js.map +1 -1
  593. package/dist/testing/create-test-wrapper.d.ts +75 -2
  594. package/dist/testing/create-test-wrapper.d.ts.map +1 -1
  595. package/dist/testing/create-test-wrapper.js +55 -1
  596. package/dist/testing/create-test-wrapper.js.map +1 -1
  597. package/dist/testing/devtools-utils.d.ts +12 -3
  598. package/dist/testing/devtools-utils.d.ts.map +1 -1
  599. package/dist/testing/devtools-utils.js +26 -4
  600. package/dist/testing/devtools-utils.js.map +1 -1
  601. package/dist/testing/extend-expect.d.ts +26 -0
  602. package/dist/testing/extend-expect.d.ts.map +1 -1
  603. package/dist/testing/extend-expect.js +20 -0
  604. package/dist/testing/extend-expect.js.map +1 -1
  605. package/dist/testing/index.d.ts +1 -1
  606. package/dist/testing/index.d.ts.map +1 -1
  607. package/dist/testing/index.js +1 -1
  608. package/dist/testing/index.js.map +1 -1
  609. package/dist/testing/render.d.ts +9 -0
  610. package/dist/testing/render.d.ts.map +1 -1
  611. package/dist/testing/render.js +11 -0
  612. package/dist/testing/render.js.map +1 -1
  613. package/dist/testing/vitest.d.js +12 -0
  614. package/dist/testing/vitest.d.js.map +1 -1
  615. package/dist/tsconfig.tsbuildinfo +1 -1
  616. package/docs/api/components/AppendRegion.md +83 -0
  617. package/docs/api/components/Block.md +49 -0
  618. package/docs/api/components/CopyFile.md +26 -0
  619. package/docs/api/components/Declaration.md +85 -0
  620. package/docs/api/components/For.md +91 -0
  621. package/docs/api/components/Indent.md +40 -0
  622. package/docs/api/components/List.md +68 -0
  623. package/docs/api/components/MemberDeclaration.md +89 -0
  624. package/docs/api/components/MemberName.md +21 -0
  625. package/docs/api/components/MemberScope.md +81 -0
  626. package/docs/api/components/Name.md +19 -0
  627. package/docs/api/components/Output.md +62 -0
  628. package/docs/api/components/Prose.md +29 -0
  629. package/docs/api/components/ReferenceOrContent.md +28 -0
  630. package/docs/api/components/Scope.md +83 -0
  631. package/docs/api/components/Show.md +32 -0
  632. package/docs/api/components/SourceDirectory.md +28 -0
  633. package/docs/api/components/SourceFile.md +60 -0
  634. package/docs/api/components/StatementList.md +29 -0
  635. package/docs/api/components/Switch.md +42 -0
  636. package/docs/api/components/TemplateFile.md +71 -0
  637. package/docs/api/components/TemplateVariable.md +57 -0
  638. package/docs/api/components/UpdateFile.md +56 -0
  639. package/docs/api/components/Wrap.md +40 -0
  640. package/docs/api/components/createAccessExpression.md +55 -0
  641. package/docs/api/components/index.md +27 -0
  642. package/docs/api/contexts/Assignment-context.md +43 -0
  643. package/docs/api/contexts/Binder-context.md +22 -0
  644. package/docs/api/contexts/Declaration-context.md +15 -0
  645. package/docs/api/contexts/Member-context.md +17 -0
  646. package/docs/api/contexts/MemberDeclaration-context.md +24 -0
  647. package/docs/api/contexts/NamePolicy-context.md +18 -0
  648. package/docs/api/contexts/Scope-context.md +20 -0
  649. package/docs/api/contexts/SourceDirectory-context.md +26 -0
  650. package/docs/api/contexts/SourceFile-context.md +19 -0
  651. package/docs/api/contexts/index.md +11 -0
  652. package/docs/api/functions/attachDiagnosticsCollector.md +18 -0
  653. package/docs/api/functions/baseListPropsToMapJoinArgs.md +20 -0
  654. package/docs/api/functions/children.md +27 -0
  655. package/docs/api/functions/childrenArray.md +25 -0
  656. package/docs/api/functions/code.md +25 -0
  657. package/docs/api/functions/computed.md +18 -0
  658. package/docs/api/functions/createComponent.md +20 -0
  659. package/docs/api/functions/createContentSlot.md +33 -0
  660. package/docs/api/functions/createContext.md +19 -0
  661. package/docs/api/functions/createCustomContext.md +18 -0
  662. package/docs/api/functions/createDeclarationTap.md +20 -0
  663. package/docs/api/functions/createFileResource.md +35 -0
  664. package/docs/api/functions/createFormatOptionsContextFor.md +28 -0
  665. package/docs/api/functions/createIntrinsic.md +19 -0
  666. package/docs/api/functions/createMemberTap.md +20 -0
  667. package/docs/api/functions/createNamePolicy.md +37 -0
  668. package/docs/api/functions/createNamedContext.md +19 -0
  669. package/docs/api/functions/createOutputBinder.md +24 -0
  670. package/docs/api/functions/createRenderTreeHook.md +19 -0
  671. package/docs/api/functions/createResource.md +77 -0
  672. package/docs/api/functions/createScope.md +35 -0
  673. package/docs/api/functions/createScopeTap.md +20 -0
  674. package/docs/api/functions/createSourceFileTap.md +20 -0
  675. package/docs/api/functions/createSymbol.md +25 -0
  676. package/docs/api/functions/createSymbolSlot.md +19 -0
  677. package/docs/api/functions/createTap.md +55 -0
  678. package/docs/api/functions/decl.md +20 -0
  679. package/docs/api/functions/defaultProps.md +21 -0
  680. package/docs/api/functions/effect.md +26 -0
  681. package/docs/api/functions/emitDiagnostic.md +18 -0
  682. package/docs/api/functions/emitSymbol.md +18 -0
  683. package/docs/api/functions/ensureIsEmpty.md +20 -0
  684. package/docs/api/functions/findCurrentEffectId.md +19 -0
  685. package/docs/api/functions/findKeyedChild.md +19 -0
  686. package/docs/api/functions/findKeyedChildren.md +19 -0
  687. package/docs/api/functions/findUnkeyedChildren.md +18 -0
  688. package/docs/api/functions/formatReactivePropertyLabel.md +21 -0
  689. package/docs/api/functions/getAssignmentSymbol.md +19 -0
  690. package/docs/api/functions/getContext.md +17 -0
  691. package/docs/api/functions/getContextForRenderNode.md +18 -0
  692. package/docs/api/functions/getDiagnosticsForTree.md +18 -0
  693. package/docs/api/functions/getEffectDebugId.md +18 -0
  694. package/docs/api/functions/getElementCache.md +17 -0
  695. package/docs/api/functions/getReactiveCreationLocation.md +18 -0
  696. package/docs/api/functions/getSymbolCreator.md +18 -0
  697. package/docs/api/functions/getSymbolCreatorSymbol.md +17 -0
  698. package/docs/api/functions/index.md +105 -0
  699. package/docs/api/functions/inspectRefkey.md +18 -0
  700. package/docs/api/functions/instantiateTakenMembersTo.md +20 -0
  701. package/docs/api/functions/isComponentCreator.md +19 -0
  702. package/docs/api/functions/isCustomContext.md +18 -0
  703. package/docs/api/functions/isIntrinsicElement.md +18 -0
  704. package/docs/api/functions/isKeyedChild.md +18 -0
  705. package/docs/api/functions/isLibrarySymbolReference.md +18 -0
  706. package/docs/api/functions/isMemberRefkey.md +18 -0
  707. package/docs/api/functions/isNamekey.md +18 -0
  708. package/docs/api/functions/isPrintHook.md +18 -0
  709. package/docs/api/functions/isRefkey.md +18 -0
  710. package/docs/api/functions/isRefkeyable.md +18 -0
  711. package/docs/api/functions/isRenderableObject.md +20 -0
  712. package/docs/api/functions/isSymbolRefkey.md +18 -0
  713. package/docs/api/functions/join.md +33 -0
  714. package/docs/api/functions/mapJoin.md +106 -0
  715. package/docs/api/functions/memberRefkey.md +27 -0
  716. package/docs/api/functions/memo.md +29 -0
  717. package/docs/api/functions/mergeProps.md +64 -0
  718. package/docs/api/functions/moveTakenMembersTo.md +18 -0
  719. package/docs/api/functions/namekey.md +41 -0
  720. package/docs/api/functions/nextReactiveId.md +19 -0
  721. package/docs/api/functions/notifyContentState.md +17 -0
  722. package/docs/api/functions/onCleanup.md +26 -0
  723. package/docs/api/functions/printTree.md +31 -0
  724. package/docs/api/functions/reactivePropertyRefId.md +21 -0
  725. package/docs/api/functions/ref.md +21 -0
  726. package/docs/api/functions/refId.md +18 -0
  727. package/docs/api/functions/refkey.md +24 -0
  728. package/docs/api/functions/render.md +31 -0
  729. package/docs/api/functions/renderAsync.md +31 -0
  730. package/docs/api/functions/renderTree.md +18 -0
  731. package/docs/api/functions/reportDiagnostics.md +18 -0
  732. package/docs/api/functions/resetRefIdCounter.md +17 -0
  733. package/docs/api/functions/resolve.md +31 -0
  734. package/docs/api/functions/root.md +25 -0
  735. package/docs/api/functions/shallowReactive.md +18 -0
  736. package/docs/api/functions/shallowRef.md +21 -0
  737. package/docs/api/functions/sourceFilesForTree.md +31 -0
  738. package/docs/api/functions/splitProps.md +19 -0
  739. package/docs/api/functions/stc.md +18 -0
  740. package/docs/api/functions/sti.md +18 -0
  741. package/docs/api/functions/symbolForRefkey.md +24 -0
  742. package/docs/api/functions/taggedComponent.md +19 -0
  743. package/docs/api/functions/takeSymbols.md +18 -0
  744. package/docs/api/functions/text.md +19 -0
  745. package/docs/api/functions/toRef.md +20 -0
  746. package/docs/api/functions/toRefkey.md +18 -0
  747. package/docs/api/functions/toRefs.md +20 -0
  748. package/docs/api/functions/traverseOutput.md +21 -0
  749. package/docs/api/functions/unresolvedRefkey.md +18 -0
  750. package/docs/api/functions/untrack.md +18 -0
  751. package/docs/api/functions/useContext.md +18 -0
  752. package/docs/api/functions/useFormatOptions.md +18 -0
  753. package/docs/api/functions/useMemberContext.md +17 -0
  754. package/docs/api/functions/useMemberScope.md +17 -0
  755. package/docs/api/functions/writeOutput.md +21 -0
  756. package/docs/api/index.md +9 -0
  757. package/docs/api/testing/functions/createTestWrapper.md +70 -0
  758. package/docs/api/testing/functions/d.md +21 -0
  759. package/docs/api/testing/functions/dedent.md +18 -0
  760. package/docs/api/testing/functions/index.md +6 -0
  761. package/docs/api/testing/functions/renderToString.md +20 -0
  762. package/docs/api/testing/index.md +4 -0
  763. package/docs/api/testing/types/TestWrapper.md +10 -0
  764. package/docs/api/testing/types/ToRenderToOptions.md +24 -0
  765. package/docs/api/testing/types/index.md +4 -0
  766. package/docs/api/types/AlignIntrinsicElement.md +5 -0
  767. package/docs/api/types/AppendRegionProps.md +5 -0
  768. package/docs/api/types/BaseListProps.md +21 -0
  769. package/docs/api/types/BasePartProps.md +10 -0
  770. package/docs/api/types/BasicScope.md +15 -0
  771. package/docs/api/types/BasicSymbol.md +18 -0
  772. package/docs/api/types/Binder.md +18 -0
  773. package/docs/api/types/BinderOptions.md +7 -0
  774. package/docs/api/types/BrIntrinsicElement.md +5 -0
  775. package/docs/api/types/BreakParentIntrinsicElement.md +5 -0
  776. package/docs/api/types/Child.md +5 -0
  777. package/docs/api/types/Children.md +5 -0
  778. package/docs/api/types/ChildrenOptions.md +7 -0
  779. package/docs/api/types/CommonFormatOptions.md +8 -0
  780. package/docs/api/types/Component.md +8 -0
  781. package/docs/api/types/ComponentContext.md +11 -0
  782. package/docs/api/types/ComponentCreator.md +11 -0
  783. package/docs/api/types/ComponentDefinition.md +7 -0
  784. package/docs/api/types/ContentOutputFile.md +10 -0
  785. package/docs/api/types/ContentSlot.md +12 -0
  786. package/docs/api/types/Context.md +19 -0
  787. package/docs/api/types/ContextProviderProps.md +8 -0
  788. package/docs/api/types/CopyFileContext.md +8 -0
  789. package/docs/api/types/CopyOutputFile.md +9 -0
  790. package/docs/api/types/CustomContext.md +10 -0
  791. package/docs/api/types/CustomContextChildrenCallback.md +5 -0
  792. package/docs/api/types/DeclarationProps.md +5 -0
  793. package/docs/api/types/DedentIntrinsicElement.md +5 -0
  794. package/docs/api/types/DedentToRootIntrinsicElement.md +5 -0
  795. package/docs/api/types/Diagnostic.md +11 -0
  796. package/docs/api/types/DiagnosticHandle.md +7 -0
  797. package/docs/api/types/DiagnosticInput.md +10 -0
  798. package/docs/api/types/DiagnosticSeverity.md +5 -0
  799. package/docs/api/types/DiagnosticStackEntry.md +9 -0
  800. package/docs/api/types/DiagnosticsCollector.md +8 -0
  801. package/docs/api/types/Disposable_2.md +7 -0
  802. package/docs/api/types/EffectDebugOptions.md +8 -0
  803. package/docs/api/types/EffectOptions.md +7 -0
  804. package/docs/api/types/ElementCache.md +5 -0
  805. package/docs/api/types/ElementCacheKey.md +5 -0
  806. package/docs/api/types/FillIntrinsicElement.md +5 -0
  807. package/docs/api/types/ForCallbackArgs.md +5 -0
  808. package/docs/api/types/ForSupportedCollections.md +5 -0
  809. package/docs/api/types/GroupIntrinsicElement.md +5 -0
  810. package/docs/api/types/HardlineIntrinsicElement.md +5 -0
  811. package/docs/api/types/HbrIntrinsicElement.md +5 -0
  812. package/docs/api/types/IfBreakIntrinsicElement.md +5 -0
  813. package/docs/api/types/IndentIfBreakIntrinsicElement.md +5 -0
  814. package/docs/api/types/IndentIntrinsicElement.md +5 -0
  815. package/docs/api/types/IntrinsicElement.md +5 -0
  816. package/docs/api/types/IntrinsicElementBase.md +9 -0
  817. package/docs/api/types/IntrinsicElements.md +26 -0
  818. package/docs/api/types/JoinOptions.md +9 -0
  819. package/docs/api/types/LbrIntrinsicElement.md +5 -0
  820. package/docs/api/types/LibrarySymbolReference.md +13 -0
  821. package/docs/api/types/LineIntrinsicElement.md +5 -0
  822. package/docs/api/types/LineSuffixBoundaryIntrinsicElement.md +5 -0
  823. package/docs/api/types/LineSuffixIntrinsicElement.md +5 -0
  824. package/docs/api/types/LiterallineIntrinsicElement.md +5 -0
  825. package/docs/api/types/MakeChildrenOptional.md +7 -0
  826. package/docs/api/types/MarkAsRootIntrinsicElement.md +5 -0
  827. package/docs/api/types/MatchProps.md +9 -0
  828. package/docs/api/types/MemberDeclarationProps.md +5 -0
  829. package/docs/api/types/MemberDescriptor.md +10 -0
  830. package/docs/api/types/MemberRefkey.md +10 -0
  831. package/docs/api/types/MemberResolutionContext.md +10 -0
  832. package/docs/api/types/MemberResolver.md +32 -0
  833. package/docs/api/types/MemberScopeProps.md +5 -0
  834. package/docs/api/types/Metadata.md +5 -0
  835. package/docs/api/types/NameConflictResolver.md +27 -0
  836. package/docs/api/types/NamePolicy.md +8 -0
  837. package/docs/api/types/NamePolicyGetter.md +9 -0
  838. package/docs/api/types/Namekey.md +10 -0
  839. package/docs/api/types/NamekeyOptions.md +8 -0
  840. package/docs/api/types/OnReactiveSetAddCallback.md +5 -0
  841. package/docs/api/types/OnReactiveSetDeleteCallback.md +5 -0
  842. package/docs/api/types/OutputDeclarationSpace.md +13 -0
  843. package/docs/api/types/OutputDirectory.md +59 -0
  844. package/docs/api/types/OutputFile.md +5 -0
  845. package/docs/api/types/OutputFileBase.md +8 -0
  846. package/docs/api/types/OutputMemberSpace.md +13 -0
  847. package/docs/api/types/OutputScope.md +33 -0
  848. package/docs/api/types/OutputScopeOptions.md +9 -0
  849. package/docs/api/types/OutputSpace.md +7 -0
  850. package/docs/api/types/OutputSymbol.md +78 -0
  851. package/docs/api/types/OutputSymbolOptions.md +16 -0
  852. package/docs/api/types/OutputVisitor.md +10 -0
  853. package/docs/api/types/PrintHook.md +10 -0
  854. package/docs/api/types/PrintTreeOptions.md +11 -0
  855. package/docs/api/types/Props.md +5 -0
  856. package/docs/api/types/ReactiveUnionSet.md +20 -0
  857. package/docs/api/types/ReactiveUnionSetOptions.md +8 -0
  858. package/docs/api/types/Refkey.md +5 -0
  859. package/docs/api/types/Refkeyable.md +5 -0
  860. package/docs/api/types/RefkeyableObject.md +7 -0
  861. package/docs/api/types/RenderableObject.md +9 -0
  862. package/docs/api/types/RenderedTextTree.md +5 -0
  863. package/docs/api/types/ResolutionResult.md +39 -0
  864. package/docs/api/types/ResolveDeclarationByKeyOptions.md +7 -0
  865. package/docs/api/types/Resource.md +11 -0
  866. package/docs/api/types/RootOptions.md +7 -0
  867. package/docs/api/types/SbrIntrinsicElement.md +5 -0
  868. package/docs/api/types/ScopeProps.md +5 -0
  869. package/docs/api/types/SoftlineIntrinsicElement.md +5 -0
  870. package/docs/api/types/SourceLocation.md +9 -0
  871. package/docs/api/types/SplitProps.md +12 -0
  872. package/docs/api/types/StcComponentCreator.md +9 -0
  873. package/docs/api/types/StcSignature.md +5 -0
  874. package/docs/api/types/StiComponentCreator.md +9 -0
  875. package/docs/api/types/StiSignature.md +7 -0
  876. package/docs/api/types/SymbolCreator.md +15 -0
  877. package/docs/api/types/SymbolRefkey.md +9 -0
  878. package/docs/api/types/SymbolSlot.md +12 -0
  879. package/docs/api/types/SymbolTable.md +15 -0
  880. package/docs/api/types/TakeSymbolCallback.md +7 -0
  881. package/docs/api/types/TakeSymbolsCallback.md +7 -0
  882. package/docs/api/types/Tap.md +11 -0
  883. package/docs/api/types/TapHandler.md +9 -0
  884. package/docs/api/types/Tapper.md +9 -0
  885. package/docs/api/types/TemplateVariableProps.md +5 -0
  886. package/docs/api/types/index.md +122 -0
  887. package/docs/api/variables/FormatOptions.md +5 -0
  888. package/docs/api/variables/Match.md +7 -0
  889. package/docs/api/variables/REFKEYABLE.md +5 -0
  890. package/docs/api/variables/RENDERABLE.md +5 -0
  891. package/docs/api/variables/TO_SYMBOL.md +39 -0
  892. package/docs/api/variables/contextsByKey.md +5 -0
  893. package/docs/api/variables/index.md +11 -0
  894. package/docs/api/variables/intrinsicElementKey.md +5 -0
  895. package/docs/api/variables/matchTag.md +5 -0
  896. package/docs/api/variables/printHookTag.md +7 -0
  897. package/docs/components.md +97 -0
  898. package/docs/context.md +67 -0
  899. package/docs/control-flow.md +5 -0
  900. package/docs/debugging.md +105 -0
  901. package/docs/formatting.md +99 -0
  902. package/docs/guides/language-package-guide.md +593 -0
  903. package/docs/guides/references-and-refkeys.md +210 -0
  904. package/docs/guides/style-guide.md +244 -0
  905. package/docs/index.md +22 -0
  906. package/docs/reactivity.md +68 -0
  907. package/docs/rendering.md +41 -0
  908. package/docs/symbols-and-scopes.md +180 -0
  909. package/package.json +16 -6
  910. package/src/binder.ts +154 -41
  911. package/src/components/AccessExpression.test.tsx +132 -0
  912. package/src/components/AccessExpression.tsx +344 -0
  913. package/src/components/Block.tsx +12 -0
  914. package/src/components/For.tsx +14 -10
  915. package/src/components/List.tsx +18 -5
  916. package/src/components/MemberDeclaration.tsx +6 -6
  917. package/src/components/MemberName.tsx +6 -0
  918. package/src/components/MemberScope.tsx +5 -0
  919. package/src/components/Output.tsx +4 -1
  920. package/src/components/Prose.tsx +1 -1
  921. package/src/components/Scope.tsx +8 -0
  922. package/src/components/SourceDirectory.tsx +1 -2
  923. package/src/components/SourceFile.tsx +22 -2
  924. package/src/components/Switch.tsx +11 -7
  925. package/src/components/index.tsx +1 -0
  926. package/src/content-slot.tsx +2 -2
  927. package/src/context/binder.ts +4 -0
  928. package/src/context/format-options.ts +14 -1
  929. package/src/context/scope.ts +4 -0
  930. package/src/context/source-directory.ts +9 -0
  931. package/src/context.ts +3 -3
  932. package/src/debug/cli.ts +3 -2
  933. package/src/debug/diagnostics-broadcast.test.tsx +98 -0
  934. package/src/debug/diagnostics.test.tsx +3 -2
  935. package/src/debug/effects.test.tsx +241 -36
  936. package/src/debug/effects.ts +202 -64
  937. package/src/debug/files.test.tsx +15 -35
  938. package/src/debug/files.ts +11 -11
  939. package/src/debug/index.ts +6 -0
  940. package/src/debug/message-format.test.tsx +759 -0
  941. package/src/debug/render-tree-orphans.test.tsx +344 -0
  942. package/src/debug/render.test.tsx +96 -118
  943. package/src/debug/render.ts +196 -125
  944. package/src/debug/source-map.browser.ts +30 -0
  945. package/src/debug/source-map.ts +135 -0
  946. package/src/debug/symbols.test.tsx +19 -20
  947. package/src/debug/symbols.ts +107 -15
  948. package/src/debug/trace-writer.ts +984 -0
  949. package/src/debug/trace.ts +46 -32
  950. package/src/devtools/devtools-protocol.ts +361 -176
  951. package/src/devtools/devtools-server.browser.ts +4 -9
  952. package/src/devtools/devtools-server.ts +226 -33
  953. package/src/devtools/devtools-transport.ts +4 -4
  954. package/src/devtools-entry.browser.ts +11 -15
  955. package/src/devtools-entry.ts +9 -15
  956. package/src/diagnostics.ts +44 -22
  957. package/src/host/node-host.browser.ts +23 -0
  958. package/src/host/node-host.ts +22 -0
  959. package/src/index.ts +0 -1
  960. package/src/library-symbol-reference.ts +52 -0
  961. package/src/name-policy.ts +30 -3
  962. package/src/reactive-union-set.ts +14 -3
  963. package/src/reactivity.ts +354 -171
  964. package/src/render-stack.ts +9 -3
  965. package/src/render.ts +116 -38
  966. package/src/scheduler.ts +167 -24
  967. package/src/symbols/output-scope.ts +34 -3
  968. package/src/symbols/output-space.ts +13 -0
  969. package/src/symbols/output-symbol.ts +186 -24
  970. package/src/symbols/symbol-flow.ts +8 -2
  971. package/src/symbols/symbol-slot.test.tsx +28 -1
  972. package/src/symbols/symbol-slot.tsx +8 -0
  973. package/src/symbols/symbol-table.ts +13 -3
  974. package/src/utils.tsx +9 -8
  975. package/src/write-output.ts +6 -5
  976. package/temp/api-testing.json +673 -0
  977. package/temp/api.json +1333 -100
  978. package/test/browser-build.test.ts +71 -78
  979. package/test/lazy-isempty.test.tsx +106 -0
  980. package/test/reactive-union-set-disposers.test.tsx +112 -0
  981. package/test/reactivity/shallow-reactive.test.tsx +60 -0
  982. package/test/scheduler-extended.test.tsx +122 -0
  983. package/test/scheduler.test.tsx +50 -0
  984. package/test/symbols/deconflicted-name.test.ts +120 -0
  985. package/test/symbols/output-scope.test.ts +38 -0
  986. package/testing/create-test-wrapper.tsx +81 -2
  987. package/testing/devtools-utils.ts +46 -4
  988. package/testing/extend-expect.ts +22 -1
  989. package/testing/index.ts +1 -1
  990. package/testing/render.ts +9 -0
  991. package/testing/vitest.d.ts +18 -3
  992. package/vitest.config.ts +8 -0
@@ -2,6 +2,7 @@ import pc from "picocolors";
2
2
  import { contextsByKey } from "./context.js";
3
3
  import { SourceDirectoryContext } from "./context/source-directory.js";
4
4
  import { SourceFileContext } from "./context/source-file.js";
5
+ import { cwd } from "./host/node-host.js";
5
6
  import { Context, getContext } from "./reactivity.js";
6
7
  import { Component, Props, SourceLocation } from "./runtime/component.js";
7
8
 
@@ -33,6 +34,11 @@ export function popStack() {
33
34
  renderStack.pop();
34
35
  }
35
36
 
37
+ export function currentComponentName(): string | undefined {
38
+ const entry = renderStack[renderStack.length - 1];
39
+ return entry?.component.name || undefined;
40
+ }
41
+
36
42
  export function clearRenderStack() {
37
43
  renderStack.length = 0;
38
44
  }
@@ -120,12 +126,12 @@ function formatValue(value: unknown): string {
120
126
  }
121
127
 
122
128
  function formatSourceLocation(source: SourceLocation): string {
123
- const cwd = process.cwd();
129
+ const currentCwd = cwd();
124
130
  let filePath = source.fileName;
125
131
 
126
132
  // Convert to relative path if under cwd
127
- if (filePath.startsWith(cwd)) {
128
- filePath = filePath.slice(cwd.length + 1); // +1 to remove leading slash
133
+ if (currentCwd && filePath.startsWith(currentCwd)) {
134
+ filePath = filePath.slice(currentCwd.length + 1); // +1 to remove leading slash
129
135
  }
130
136
 
131
137
  return `${filePath}:${source.lineNumber}:${source.columnNumber}`;
package/src/render.ts CHANGED
@@ -6,10 +6,17 @@ import { SourceFileContext } from "./context/source-file.js";
6
6
  import {
7
7
  debug,
8
8
  getRenderNodeId,
9
+ isDevtoolsConnected,
9
10
  isDevtoolsEnabled,
10
11
  type RenderTreeNodeInfo,
11
12
  } from "./debug/index.js";
12
- import { broadcastDevtoolsMessage } from "./devtools/devtools-server.js";
13
+ import {
14
+ beginTransaction,
15
+ closeTrace,
16
+ commitTransaction,
17
+ notifyDiagnosticsReport,
18
+ } from "./debug/trace-writer.js";
19
+ import { isTraceEnabled } from "./debug/trace.js";
13
20
  import {
14
21
  attachDiagnosticsCollector,
15
22
  DiagnosticsCollector,
@@ -52,6 +59,43 @@ import { IntrinsicElement, isIntrinsicElement } from "./runtime/intrinsic.js";
52
59
  import { flushJobs, flushJobsAsync, waitForSignal } from "./scheduler.js";
53
60
 
54
61
  const notifiedErrors = new WeakSet<object>();
62
+
63
+ // ─────────────────────────────────────────────────────────────────────────────
64
+ // Deferred file printing: mark files dirty during render, print once at end
65
+ // ─────────────────────────────────────────────────────────────────────────────
66
+ interface DirtyFileEntry {
67
+ renderNode: RenderedTextTree;
68
+ printOptions: {
69
+ printWidth?: number;
70
+ tabWidth?: number;
71
+ useTabs?: boolean;
72
+ insertFinalNewLine?: boolean;
73
+ };
74
+ path: string;
75
+ filetype: string;
76
+ }
77
+ const dirtyFiles = new Map<string, DirtyFileEntry>();
78
+ const lastFlushTimeByFile = new Map<string, number>();
79
+ const DEVTOOLS_FLUSH_INTERVAL_MS = 1000;
80
+
81
+ function flushDirtyFile(path: string): void {
82
+ const entry = dirtyFiles.get(path);
83
+ if (!entry) return;
84
+ dirtyFiles.delete(path);
85
+ const contents = printTree(entry.renderNode, {
86
+ ...entry.printOptions,
87
+ insertFinalNewLine: entry.printOptions.insertFinalNewLine ?? true,
88
+ noFlush: true,
89
+ });
90
+ debug.files.updated({ path: entry.path, filetype: entry.filetype, contents });
91
+ }
92
+
93
+ function flushDirtyFiles(): void {
94
+ for (const path of [...dirtyFiles.keys()]) {
95
+ flushDirtyFile(path);
96
+ }
97
+ }
98
+
55
99
  let lastRenderError: {
56
100
  error: { name: string; message: string; stack?: string };
57
101
  componentStack: Array<{
@@ -238,12 +282,14 @@ const {
238
282
 
239
283
  export interface OutputDirectory {
240
284
  kind: "directory";
285
+ /** Full path from the output root, e.g. `"generated-client/src"`. Do not prepend parent directory paths when walking the tree. */
241
286
  path: string;
242
287
  contents: (OutputDirectory | OutputFile)[];
243
288
  }
244
289
 
245
290
  export interface OutputFileBase {
246
291
  kind: "file";
292
+ /** Full path from the output root, e.g. `"generated-client/src/models.ext"`. Do not prepend parent directory paths when walking the tree. */
247
293
  path: string;
248
294
  }
249
295
 
@@ -275,10 +321,7 @@ function reportDiagnosticsForTree(tree: RenderedTextTree) {
275
321
  const entries = diagnostics.getDiagnostics();
276
322
  if (entries.length === 0) return;
277
323
  reportDiagnostics(diagnostics);
278
- void broadcastDevtoolsMessage({
279
- type: "diagnostics:report",
280
- diagnostics: entries,
281
- });
324
+ notifyDiagnosticsReport(entries);
282
325
  }
283
326
 
284
327
  // Re-export from print-hook.ts to maintain backwards compatibility
@@ -313,9 +356,13 @@ export function render(
313
356
  const tree = renderTree(children);
314
357
  flushJobs();
315
358
  const output = sourceFilesForTree(tree, options);
359
+ flushDirtyFiles();
316
360
  reportDiagnosticsForTree(tree);
317
361
  reportLastRenderError();
318
362
  debug.render.complete();
363
+ // Only close the trace DB when devtools is NOT running. When devtools is
364
+ // active the DB must remain open for post-render reactive updates.
365
+ if (isTraceEnabled() && !isDevtoolsEnabled()) closeTrace();
319
366
  if (isDevtoolsEnabled()) {
320
367
  void waitForSignal();
321
368
  }
@@ -335,9 +382,13 @@ export async function renderAsync(
335
382
  // Ensure all reactive updates are flushed before printing.
336
383
  await flushJobsAsync();
337
384
  const output = sourceFilesForTree(tree, options);
385
+ flushDirtyFiles();
338
386
  reportDiagnosticsForTree(tree);
339
387
  reportLastRenderError();
340
388
  debug.render.complete();
389
+ // Only close the trace DB when devtools is NOT running. When devtools is
390
+ // active the DB must remain open for post-render reactive updates.
391
+ if (isTraceEnabled() && !isDevtoolsEnabled()) closeTrace();
341
392
 
342
393
  return output;
343
394
  }
@@ -449,17 +500,23 @@ export function renderTree(children: Children) {
449
500
  debug.effect.reset();
450
501
  debug.symbols.reset();
451
502
  debug.files.reset();
503
+ dirtyFiles.clear();
504
+ lastFlushTimeByFile.clear();
452
505
  debug.render.initialize(rootElem);
506
+ if (isTraceEnabled()) beginTransaction();
453
507
  try {
454
508
  root(() => {
455
509
  attachDiagnosticsCollector(diagnostics);
456
510
  renderWorker(rootElem, children);
457
511
  });
458
512
  } catch (e) {
513
+ if (isTraceEnabled()) commitTransaction();
514
+ flushDirtyFiles();
459
515
  notifyRenderError(e);
460
516
  reportLastRenderError();
461
517
  throw e;
462
518
  }
519
+ if (isTraceEnabled()) commitTransaction();
463
520
 
464
521
  diagnosticsByTree.set(rootElem, diagnostics);
465
522
 
@@ -498,11 +555,12 @@ export function notifyContentState() {
498
555
  const startContext = getContext()!;
499
556
 
500
557
  if (startContext.childrenWithContent === 0) {
501
- if (startContext.isEmpty!.value === true) {
558
+ if (startContext._lastEmpty) {
502
559
  // it was already empty, no work to do.
503
560
  return;
504
561
  }
505
562
 
563
+ startContext._lastEmpty = true;
506
564
  if (startContext.isEmpty) {
507
565
  startContext.isEmpty.value = true;
508
566
  }
@@ -518,18 +576,20 @@ export function notifyContentState() {
518
576
  // This isn't the last content so we have no work to do
519
577
  break;
520
578
  }
579
+ current._lastEmpty = true;
521
580
  if (current.isEmpty) {
522
581
  current.isEmpty.value = true;
523
582
  }
524
583
  current = current.owner;
525
584
  }
526
585
  } else {
527
- if (startContext.isEmpty!.value === false) {
586
+ if (!startContext._lastEmpty) {
528
587
  // it was already non-empty, no work to do.
529
588
  return;
530
589
  }
531
590
 
532
- if (startContext.isEmpty && startContext.isEmpty.value) {
591
+ startContext._lastEmpty = false;
592
+ if (startContext.isEmpty) {
533
593
  startContext.isEmpty.value = false;
534
594
  }
535
595
 
@@ -542,7 +602,8 @@ export function notifyContentState() {
542
602
  break;
543
603
  }
544
604
 
545
- if (current.isEmpty && current.isEmpty.value) {
605
+ current._lastEmpty = false;
606
+ if (current.isEmpty) {
546
607
  current.isEmpty.value = false;
547
608
  }
548
609
 
@@ -757,16 +818,19 @@ function appendChild(node: RenderedTextTree, rawChild: Child) {
757
818
  }
758
819
  } else if (isComponentCreator(child)) {
759
820
  const index = node.length;
760
- const rerenderToken = ref(0);
761
- const breakNext = ref(false);
821
+ const rerenderToken =
822
+ isDevtoolsEnabled() ? ref(0, { isInfrastructure: true }) : undefined;
823
+ const breakNext =
824
+ isDevtoolsEnabled() ?
825
+ ref(false, { isInfrastructure: true })
826
+ : undefined;
762
827
  // todo: remove this effect (only needed for context, not needed for anything else)
763
828
  effect(
764
829
  () => {
765
830
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
766
- rerenderToken.value;
831
+ rerenderToken?.value;
767
832
  const context = getContext();
768
833
  context!.childrenWithContent = 0;
769
- context!.isEmpty ??= ref(true);
770
834
 
771
835
  if (context) context.componentOwner = child;
772
836
  const existing = node[index];
@@ -786,15 +850,21 @@ function appendChild(node: RenderedTextTree, rawChild: Child) {
786
850
  source: child.source,
787
851
  isExisting: Array.isArray(existing),
788
852
  actions: {
789
- rerender: () => {
790
- lastRenderError = null;
791
- rerenderToken.value++;
792
- },
793
- rerenderAndBreak: () => {
794
- lastRenderError = null;
795
- breakNext.value = true;
796
- rerenderToken.value++;
797
- },
853
+ rerender:
854
+ rerenderToken ?
855
+ () => {
856
+ lastRenderError = null;
857
+ rerenderToken.value++;
858
+ }
859
+ : () => {},
860
+ rerenderAndBreak:
861
+ breakNext && rerenderToken ?
862
+ () => {
863
+ lastRenderError = null;
864
+ breakNext.value = true;
865
+ rerenderToken.value++;
866
+ }
867
+ : () => {},
798
868
  },
799
869
  });
800
870
  if (Array.isArray(existing)) {
@@ -806,9 +876,9 @@ function appendChild(node: RenderedTextTree, rawChild: Child) {
806
876
  let childResult: Children | undefined;
807
877
  try {
808
878
  childResult = untrack(() => {
809
- const shouldBreak = breakNext.value;
879
+ const shouldBreak = breakNext?.value ?? false;
810
880
  if (shouldBreak) {
811
- breakNext.value = false;
881
+ breakNext!.value = false;
812
882
  // eslint-disable-next-line no-debugger
813
883
  debugger;
814
884
  }
@@ -880,7 +950,6 @@ function appendChild(node: RenderedTextTree, rawChild: Child) {
880
950
  }
881
951
  const context = getContext();
882
952
  context!.childrenWithContent = 0;
883
- context!.isEmpty ??= ref(true);
884
953
 
885
954
  const existing = node[index];
886
955
  const memoNode: RenderedTextTree =
@@ -925,29 +994,38 @@ function findSourceFileContext(node: RenderedTextTree) {
925
994
  }
926
995
 
927
996
  function notifyFileUpdateForNode(node: RenderedTextTree) {
928
- // Only do the expensive printTree when devtools are actually enabled
929
- if (!isDevtoolsEnabled()) return;
997
+ // Only track when devtools or trace are actually enabled
998
+ if (!isDevtoolsEnabled() && !isTraceEnabled()) return;
930
999
  const context = findSourceFileContext(node);
931
1000
  if (!context?.meta?.sourceFile) return;
932
1001
  if (context.meta.sourceFileReady === false) return;
933
1002
  const sourceFile = context.meta.sourceFile;
934
1003
  const renderNode: RenderedTextTree =
935
1004
  (context.meta.renderNode as RenderedTextTree | undefined) ?? node;
936
- // Pass noFlush here since it flushes jobs and can re-enter rendering
937
- // during effect setup, triggering premature cleanup.
938
- const contents = printTree(renderNode, {
939
- printWidth: context.meta?.printOptions?.printWidth,
940
- tabWidth: context.meta?.printOptions?.tabWidth,
941
- useTabs: context.meta?.printOptions?.useTabs,
942
- insertFinalNewLine: context.meta?.printOptions?.insertFinalNewLine ?? true,
943
- noFlush: true,
944
- });
945
1005
 
946
- debug.files.updated({
1006
+ // Mark this file as dirty — defer the expensive printTree to end of render
1007
+ dirtyFiles.set(sourceFile.path, {
1008
+ renderNode,
1009
+ printOptions: {
1010
+ printWidth: context.meta?.printOptions?.printWidth,
1011
+ tabWidth: context.meta?.printOptions?.tabWidth,
1012
+ useTabs: context.meta?.printOptions?.useTabs,
1013
+ insertFinalNewLine: context.meta?.printOptions?.insertFinalNewLine,
1014
+ },
947
1015
  path: sourceFile.path,
948
1016
  filetype: sourceFile.filetype,
949
- contents,
950
1017
  });
1018
+
1019
+ // When a devtools client is connected, throttle file flushing to ~1s per file
1020
+ // so the user can watch content build up during rendering.
1021
+ if (isDevtoolsConnected()) {
1022
+ const now = Date.now();
1023
+ const lastFlush = lastFlushTimeByFile.get(sourceFile.path) ?? 0;
1024
+ if (now - lastFlush >= DEVTOOLS_FLUSH_INTERVAL_MS) {
1025
+ lastFlushTimeByFile.set(sourceFile.path, now);
1026
+ flushDirtyFile(sourceFile.path);
1027
+ }
1028
+ }
951
1029
  }
952
1030
 
953
1031
  type NormalizedChildren = NormalizedChild | NormalizedChildren[];
package/src/scheduler.ts CHANGED
@@ -1,22 +1,61 @@
1
1
  import { ReactiveEffect } from "@vue/reactivity";
2
2
  import { debug } from "./debug/index.js";
3
+ import {
4
+ beginTransaction,
5
+ commitTransaction,
6
+ insertEffectLifecycle,
7
+ insertSchedulerFlush,
8
+ insertSchedulerJob,
9
+ } from "./debug/trace-writer.js";
10
+ import { isTraceEnabled } from "./debug/trace.js";
11
+ import { getEffectDebugId } from "./reactivity.js";
3
12
 
4
13
  export interface QueueJob {
5
14
  run(): void;
6
15
  }
7
16
  const immediateQueue = new Set<QueueJob>();
8
17
  const queue = new Set<QueueJob>();
18
+
19
+ function isJobActive(job: QueueJob): boolean {
20
+ // ReactiveEffect uses bit 0 (flags & 1) as the ACTIVE flag.
21
+ // Skip effects that were stopped after being queued.
22
+ const flags = (job as any).flags;
23
+ return flags === undefined || (flags & 1) !== 0;
24
+ }
9
25
  const pendingPromises = new Set<Promise<any>>();
10
26
  let waitForSignalPromise: Promise<void> | null = null;
11
27
  let resolveWaitForSignal: (() => void) | null = null;
12
28
  let jobSignalPromise: Promise<void> | null = null;
13
29
  let resolveJobSignal: (() => void) | null = null;
14
30
 
31
+ // Maps effect debug IDs to the ref that most recently triggered them.
32
+ // Intentionally overwrites on repeated triggers for the same effect before flush —
33
+ // we only need the last trigger ref for lifecycle recording, not all intermediate ones.
34
+ const lastTriggerRef = new Map<number, number>();
35
+
36
+ /**
37
+ * Record which ref triggered an effect re-run.
38
+ * Called from the onTrigger debug hook before the effect is scheduled.
39
+ *
40
+ * Note: if an effect is triggered multiple times before flush, only the last
41
+ * trigger ref is retained. This is intentional — we care about the most
42
+ * recent cause, and tracking all triggers would add overhead with minimal
43
+ * diagnostic value since only the last mutation actually caused the re-run.
44
+ */
45
+ export function setLastTriggerRef(effectDebugId: number, refId: number): void {
46
+ lastTriggerRef.set(effectDebugId, refId);
47
+ }
48
+
15
49
  export function scheduler(immediate = false) {
50
+ if (!immediate) return defaultScheduler;
16
51
  return function (this: ReactiveEffect) {
17
- queueJob(this, immediate);
52
+ queueJob(this, true);
18
53
  };
19
54
  }
55
+
56
+ const defaultScheduler = function (this: ReactiveEffect) {
57
+ queueJob(this, false);
58
+ };
20
59
  export function queueJob(job: QueueJob | (() => void), immediate = false) {
21
60
  // if we have an immediate job, we don't need to queue the normal job.
22
61
  // the set is serving an important purpose here in deduping the effects we run
@@ -30,6 +69,18 @@ export function queueJob(job: QueueJob | (() => void), immediate = false) {
30
69
  queue.add(job);
31
70
  }
32
71
 
72
+ if (isTraceEnabled()) {
73
+ const effectId = getEffectDebugId(job as object);
74
+ if (effectId !== undefined) {
75
+ insertSchedulerJob(
76
+ "queue",
77
+ effectId,
78
+ immediate,
79
+ immediateQueue.size + queue.size,
80
+ );
81
+ }
82
+ }
83
+
33
84
  if (resolveJobSignal) {
34
85
  resolveJobSignal();
35
86
  resolveJobSignal = null;
@@ -50,18 +101,69 @@ export function trackPromise(promise: Promise<any>) {
50
101
 
51
102
  export function flushJobs() {
52
103
  // First, run all synchronous jobs
104
+ if (isTraceEnabled()) beginTransaction();
53
105
  let job;
106
+ let jobCount = 0;
54
107
  while ((job = takeJob()) !== null) {
108
+ if (isTraceEnabled()) {
109
+ const effectId = getEffectDebugId(job as object);
110
+ if (effectId !== undefined) {
111
+ insertSchedulerJob(
112
+ "run",
113
+ effectId,
114
+ false,
115
+ immediateQueue.size + queue.size,
116
+ );
117
+ }
118
+ }
119
+ if (!isJobActive(job)) {
120
+ if (isTraceEnabled()) {
121
+ const effectId = getEffectDebugId(job as object);
122
+ if (effectId !== undefined) {
123
+ insertEffectLifecycle(
124
+ effectId,
125
+ "skipped",
126
+ undefined,
127
+ undefined,
128
+ undefined,
129
+ undefined,
130
+ );
131
+ }
132
+ }
133
+ continue;
134
+ }
135
+ if (isTraceEnabled()) {
136
+ const effectId = getEffectDebugId(job as object);
137
+ if (effectId !== undefined) {
138
+ const triggerRefId = lastTriggerRef.get(effectId);
139
+ lastTriggerRef.delete(effectId);
140
+ insertEffectLifecycle(
141
+ effectId,
142
+ "ran",
143
+ triggerRefId,
144
+ undefined,
145
+ undefined,
146
+ undefined,
147
+ );
148
+ }
149
+ }
55
150
  job.run();
151
+ jobCount++;
56
152
  }
57
153
 
58
154
  // If there are no pending promises, we're done
59
155
  if (pendingPromises.size > 0) {
156
+ if (isTraceEnabled()) commitTransaction();
60
157
  throw new Error(
61
158
  "Asynchronous jobs were found but render was called synchronously. Use `renderAsync` instead.",
62
159
  );
63
160
  }
64
161
 
162
+ if (isTraceEnabled()) {
163
+ insertSchedulerFlush(jobCount);
164
+ commitTransaction();
165
+ }
166
+
65
167
  debug.render.flushJobsComplete();
66
168
  }
67
169
 
@@ -92,33 +194,74 @@ export function isWaitingForSignal() {
92
194
 
93
195
  export async function flushJobsAsync() {
94
196
  // Keep running jobs until both the queues are empty and all promises are resolved
95
- while (true) {
96
- // First, run all synchronous jobs
97
- let job;
98
- while ((job = takeJob()) !== null) {
99
- job.run();
100
- }
197
+ if (isTraceEnabled()) beginTransaction();
198
+ try {
199
+ while (true) {
200
+ // First, run all synchronous jobs
201
+ let job;
202
+ while ((job = takeJob()) !== null) {
203
+ if (!isJobActive(job)) {
204
+ if (isTraceEnabled()) {
205
+ const effectId = getEffectDebugId(job as object);
206
+ if (effectId !== undefined) {
207
+ insertEffectLifecycle(
208
+ effectId,
209
+ "skipped",
210
+ undefined,
211
+ undefined,
212
+ undefined,
213
+ undefined,
214
+ );
215
+ }
216
+ }
217
+ continue;
218
+ }
219
+ if (isTraceEnabled()) {
220
+ const effectId = getEffectDebugId(job as object);
221
+ if (effectId !== undefined) {
222
+ const triggerRefId = lastTriggerRef.get(effectId);
223
+ lastTriggerRef.delete(effectId);
224
+ insertEffectLifecycle(
225
+ effectId,
226
+ "ran",
227
+ triggerRefId,
228
+ undefined,
229
+ undefined,
230
+ undefined,
231
+ );
232
+ }
233
+ }
234
+ job.run();
235
+ }
101
236
 
102
- // If there are no pending promises, we're done
103
- if (pendingPromises.size === 0) {
104
- break;
105
- }
237
+ // If there are no pending promises, we're done
238
+ if (pendingPromises.size === 0) {
239
+ break;
240
+ }
106
241
 
107
- if (!jobSignalPromise) {
108
- jobSignalPromise = new Promise<void>((resolve) => {
109
- resolveJobSignal = resolve;
110
- });
111
- }
242
+ // Commit before awaiting so writes are visible, then re-open after
243
+ if (isTraceEnabled()) commitTransaction();
112
244
 
113
- // Wait for either pending promises to complete or new jobs to arrive
114
- await Promise.race([
115
- Promise.allSettled(Array.from(pendingPromises)),
116
- jobSignalPromise,
117
- ]);
245
+ if (!jobSignalPromise) {
246
+ jobSignalPromise = new Promise<void>((resolve) => {
247
+ resolveJobSignal = resolve;
248
+ });
249
+ }
118
250
 
119
- // Clear the job signal after each iteration so we create a new one next time
120
- jobSignalPromise = null;
121
- resolveJobSignal = null;
251
+ // Wait for either pending promises to complete or new jobs to arrive
252
+ await Promise.race([
253
+ Promise.allSettled(Array.from(pendingPromises)),
254
+ jobSignalPromise,
255
+ ]);
256
+
257
+ // Clear the job signal after each iteration so we create a new one next time
258
+ jobSignalPromise = null;
259
+ resolveJobSignal = null;
260
+
261
+ if (isTraceEnabled()) beginTransaction();
262
+ }
263
+ } finally {
264
+ if (isTraceEnabled()) commitTransaction();
122
265
  }
123
266
 
124
267
  debug.render.flushJobsComplete();
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  reactive,
3
3
  ReactiveFlags,
4
- shallowReactive,
5
4
  track,
6
5
  TrackOpTypes,
7
6
  trigger,
@@ -10,7 +9,7 @@ import {
10
9
  import type { Binder } from "../binder.js";
11
10
  import { useBinder } from "../context/binder.js";
12
11
  import { inspect } from "../inspect.js";
13
- import { effect, untrack } from "../reactivity.js";
12
+ import { effect, shallowReactive, untrack } from "../reactivity.js";
14
13
  import { OutputDeclarationSpace, OutputSpace } from "./output-space.js";
15
14
  import { OutputSymbol } from "./output-symbol.js";
16
15
 
@@ -55,6 +54,11 @@ export interface OutputScopeOptions {
55
54
  * within a reactive context.
56
55
  */
57
56
  export abstract class OutputScope {
57
+ /**
58
+ * The declaration space keys for this scope type. Subclasses override this
59
+ * to declare which declaration spaces are created on construction (e.g.,
60
+ * `["types", "values"]`).
61
+ */
58
62
  static readonly declarationSpaces: Readonly<string[]> = [] as const;
59
63
 
60
64
  #name: string;
@@ -126,7 +130,8 @@ export abstract class OutputScope {
126
130
  #spaces: Record<string, OutputDeclarationSpace>;
127
131
 
128
132
  /**
129
- * Get the declaration space for the given key.
133
+ * Get the declaration space for the given key (e.g., `"types"`, `"values"`).
134
+ * Returns `undefined` when no space with that key exists on this scope.
130
135
  */
131
136
  spaceFor(key: string): OutputSpace | undefined {
132
137
  return this.#spaces[key];
@@ -154,6 +159,32 @@ export abstract class OutputScope {
154
159
 
155
160
  [ReactiveFlags.SKIP] = true;
156
161
 
162
+ /**
163
+ * Subclasses must forward all three positional arguments to `super`. See
164
+ * {@link createScope} for the preferred instantiation path.
165
+ *
166
+ * @param name - A descriptive name for this scope (used in debugging and
167
+ * diagnostics).
168
+ * @param parentScope - The parent scope in the scope tree, or `undefined`
169
+ * for root scopes. Inside a component, obtain this via `useScope()`.
170
+ * @param options - Additional scope options; see {@link OutputScopeOptions}.
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * class MyScope extends OutputScope {
175
+ * constructor(
176
+ * name: string,
177
+ * parent: OutputScope | undefined,
178
+ * options?: OutputScopeOptions,
179
+ * ) {
180
+ * super(name, parent, options);
181
+ * }
182
+ * }
183
+ *
184
+ * // Inside a component:
185
+ * const scope = createScope(MyScope, "my-scope", useScope());
186
+ * ```
187
+ */
157
188
  constructor(
158
189
  name: string,
159
190
  parentScope: OutputScope | undefined,
@@ -5,7 +5,16 @@ import { OutputScope } from "./output-scope.js";
5
5
  import { OutputSymbol } from "./output-symbol.js";
6
6
  import { SymbolTable } from "./symbol-table.js";
7
7
 
8
+ /**
9
+ * A symbol table that belongs to either a scope (declaration space) or a symbol
10
+ * (member space).
11
+ */
8
12
  export type OutputSpace = OutputDeclarationSpace | OutputMemberSpace;
13
+
14
+ /**
15
+ * A symbol table attached to an {@link OutputScope}. Holds lexical declarations
16
+ * visible within that scope (e.g., "types" or "values" in a TypeScript module).
17
+ */
9
18
  export class OutputDeclarationSpace extends SymbolTable {
10
19
  constructor(scope: OutputScope, key: string, binder?: Binder) {
11
20
  super(key, binder);
@@ -27,6 +36,10 @@ export class OutputDeclarationSpace extends SymbolTable {
27
36
  }
28
37
  }
29
38
 
39
+ /**
40
+ * A symbol table attached to an {@link OutputSymbol}. Holds member declarations
41
+ * belonging to that symbol (e.g., "static" or "instance" members of a class).
42
+ */
30
43
  export class OutputMemberSpace extends SymbolTable {
31
44
  constructor(symbol: OutputSymbol, key: string, binder?: Binder) {
32
45
  super(key, binder);