@alloy-js/core 0.23.0-dev.10 → 0.23.0-dev.12

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 (464) hide show
  1. package/dist/dev/src/binder.js +488 -0
  2. package/dist/dev/src/binder.js.map +1 -0
  3. package/dist/dev/src/code.js +181 -0
  4. package/dist/dev/src/code.js.map +1 -0
  5. package/dist/dev/src/components/AccessExpression.js +230 -0
  6. package/dist/dev/src/components/AccessExpression.js.map +1 -0
  7. package/dist/dev/src/components/AccessExpression.test.js +237 -0
  8. package/dist/dev/src/components/AccessExpression.test.js.map +1 -0
  9. package/dist/dev/src/components/AppendFile.js +246 -0
  10. package/dist/dev/src/components/AppendFile.js.map +1 -0
  11. package/dist/dev/src/components/Block.js +66 -0
  12. package/dist/dev/src/components/Block.js.map +1 -0
  13. package/dist/dev/src/components/CopyFile.js +16 -0
  14. package/dist/dev/src/components/CopyFile.js.map +1 -0
  15. package/dist/dev/src/components/Declaration.js +70 -0
  16. package/dist/dev/src/components/Declaration.js.map +1 -0
  17. package/dist/dev/src/components/For.js +40 -0
  18. package/dist/dev/src/components/For.js.map +1 -0
  19. package/dist/dev/src/components/Indent.js +37 -0
  20. package/dist/dev/src/components/Indent.js.map +1 -0
  21. package/dist/dev/src/components/List.js +29 -0
  22. package/dist/dev/src/components/List.js.map +1 -0
  23. package/dist/dev/src/components/MemberDeclaration.js +70 -0
  24. package/dist/dev/src/components/MemberDeclaration.js.map +1 -0
  25. package/dist/dev/src/components/MemberName.js +11 -0
  26. package/dist/dev/src/components/MemberName.js.map +1 -0
  27. package/dist/dev/src/components/MemberScope.js +57 -0
  28. package/dist/dev/src/components/MemberScope.js.map +1 -0
  29. package/dist/dev/src/components/Name.js +11 -0
  30. package/dist/dev/src/components/Name.js.map +1 -0
  31. package/dist/dev/src/components/Output.js +72 -0
  32. package/dist/dev/src/components/Output.js.map +1 -0
  33. package/dist/dev/src/components/Prose.js +32 -0
  34. package/dist/dev/src/components/Prose.js.map +1 -0
  35. package/dist/dev/src/components/ReferenceOrContent.js +12 -0
  36. package/dist/dev/src/components/ReferenceOrContent.js.map +1 -0
  37. package/dist/dev/src/components/Scope.js +50 -0
  38. package/dist/dev/src/components/Scope.js.map +1 -0
  39. package/dist/dev/src/components/Show.js +4 -0
  40. package/dist/dev/src/components/Show.js.map +1 -0
  41. package/dist/dev/src/components/SourceDirectory.js +41 -0
  42. package/dist/dev/src/components/SourceDirectory.js.map +1 -0
  43. package/dist/dev/src/components/SourceFile.js +52 -0
  44. package/dist/dev/src/components/SourceFile.js.map +1 -0
  45. package/dist/dev/src/components/StatementList.js +20 -0
  46. package/dist/dev/src/components/StatementList.js.map +1 -0
  47. package/dist/dev/src/components/Switch.js +42 -0
  48. package/dist/dev/src/components/Switch.js.map +1 -0
  49. package/dist/dev/src/components/TemplateFile.js +153 -0
  50. package/dist/dev/src/components/TemplateFile.js.map +1 -0
  51. package/dist/dev/src/components/UpdateFile.js +71 -0
  52. package/dist/dev/src/components/UpdateFile.js.map +1 -0
  53. package/dist/dev/src/components/Wrap.js +18 -0
  54. package/dist/dev/src/components/Wrap.js.map +1 -0
  55. package/dist/dev/src/components/index.js +25 -0
  56. package/dist/dev/src/components/index.js.map +1 -0
  57. package/dist/dev/src/components/stc/index.js +27 -0
  58. package/dist/dev/src/components/stc/index.js.map +1 -0
  59. package/dist/dev/src/components/stc/sti.js +10 -0
  60. package/dist/dev/src/components/stc/sti.js.map +1 -0
  61. package/dist/dev/src/content-slot.js +78 -0
  62. package/dist/dev/src/content-slot.js.map +1 -0
  63. package/dist/dev/src/content-slot.test.js +89 -0
  64. package/dist/dev/src/content-slot.test.js.map +1 -0
  65. package/dist/dev/src/context/assignment.js +46 -0
  66. package/dist/dev/src/context/assignment.js.map +1 -0
  67. package/dist/dev/src/context/binder.js +12 -0
  68. package/dist/dev/src/context/binder.js.map +1 -0
  69. package/dist/dev/src/context/declaration.js +3 -0
  70. package/dist/dev/src/context/declaration.js.map +1 -0
  71. package/dist/dev/src/context/format-options.js +32 -0
  72. package/dist/dev/src/context/format-options.js.map +1 -0
  73. package/dist/dev/src/context/index.js +11 -0
  74. package/dist/dev/src/context/index.js.map +1 -0
  75. package/dist/dev/src/context/member-declaration.js +11 -0
  76. package/dist/dev/src/context/member-declaration.js.map +1 -0
  77. package/dist/dev/src/context/member-scope.js +12 -0
  78. package/dist/dev/src/context/member-scope.js.map +1 -0
  79. package/dist/dev/src/context/name-policy.js +13 -0
  80. package/dist/dev/src/context/name-policy.js.map +1 -0
  81. package/dist/dev/src/context/scope.js +13 -0
  82. package/dist/dev/src/context/scope.js.map +1 -0
  83. package/dist/dev/src/context/source-directory.js +3 -0
  84. package/dist/dev/src/context/source-directory.js.map +1 -0
  85. package/dist/dev/src/context/source-file.js +3 -0
  86. package/dist/dev/src/context/source-file.js.map +1 -0
  87. package/dist/dev/src/context.js +47 -0
  88. package/dist/dev/src/context.js.map +1 -0
  89. package/dist/dev/src/debug/cli.js +163 -0
  90. package/dist/dev/src/debug/cli.js.map +1 -0
  91. package/dist/dev/src/debug/diagnostics.test.js +50 -0
  92. package/dist/dev/src/debug/diagnostics.test.js.map +1 -0
  93. package/dist/dev/src/debug/effects.js +293 -0
  94. package/dist/dev/src/debug/effects.js.map +1 -0
  95. package/dist/dev/src/debug/effects.test.js +280 -0
  96. package/dist/dev/src/debug/effects.test.js.map +1 -0
  97. package/dist/dev/src/debug/files.js +29 -0
  98. package/dist/dev/src/debug/files.js.map +1 -0
  99. package/dist/dev/src/debug/files.test.js +78 -0
  100. package/dist/dev/src/debug/files.test.js.map +1 -0
  101. package/dist/dev/src/debug/index.js +71 -0
  102. package/dist/dev/src/debug/index.js.map +1 -0
  103. package/dist/dev/src/debug/message-format.test.js +836 -0
  104. package/dist/dev/src/debug/message-format.test.js.map +1 -0
  105. package/dist/dev/src/debug/render-tree-orphans.test.js +365 -0
  106. package/dist/dev/src/debug/render-tree-orphans.test.js.map +1 -0
  107. package/dist/dev/src/debug/render.js +479 -0
  108. package/dist/dev/src/debug/render.js.map +1 -0
  109. package/dist/dev/src/debug/render.test.js +363 -0
  110. package/dist/dev/src/debug/render.test.js.map +1 -0
  111. package/dist/dev/src/debug/serialize.js +70 -0
  112. package/dist/dev/src/debug/serialize.js.map +1 -0
  113. package/dist/dev/src/debug/source-map.js +111 -0
  114. package/dist/dev/src/debug/source-map.js.map +1 -0
  115. package/dist/dev/src/debug/symbols.js +196 -0
  116. package/dist/dev/src/debug/symbols.js.map +1 -0
  117. package/dist/dev/src/debug/symbols.test.js +93 -0
  118. package/dist/dev/src/debug/symbols.test.js.map +1 -0
  119. package/dist/dev/src/debug/trace-writer.js +658 -0
  120. package/dist/dev/src/debug/trace-writer.js.map +1 -0
  121. package/dist/dev/src/debug/trace.js +459 -0
  122. package/dist/dev/src/debug/trace.js.map +1 -0
  123. package/dist/dev/src/devtools/devtools-protocol.js +2 -0
  124. package/dist/dev/src/devtools/devtools-protocol.js.map +1 -0
  125. package/dist/dev/src/devtools/devtools-server.browser.js +33 -0
  126. package/dist/dev/src/devtools/devtools-server.browser.js.map +1 -0
  127. package/dist/dev/src/devtools/devtools-server.js +444 -0
  128. package/dist/dev/src/devtools/devtools-server.js.map +1 -0
  129. package/dist/dev/src/devtools/devtools-transport.js +114 -0
  130. package/dist/dev/src/devtools/devtools-transport.js.map +1 -0
  131. package/dist/dev/src/devtools-entry.browser.js +2 -0
  132. package/dist/dev/src/devtools-entry.browser.js.map +1 -0
  133. package/dist/dev/src/devtools-entry.js +2 -0
  134. package/dist/dev/src/devtools-entry.js.map +1 -0
  135. package/dist/dev/src/diagnostics.js +89 -0
  136. package/dist/dev/src/diagnostics.js.map +1 -0
  137. package/dist/dev/src/host/alloy-host.browser.js +32 -0
  138. package/dist/dev/src/host/alloy-host.browser.js.map +1 -0
  139. package/dist/dev/src/host/alloy-host.js +144 -0
  140. package/dist/dev/src/host/alloy-host.js.map +1 -0
  141. package/dist/dev/src/host/interface.js +2 -0
  142. package/dist/dev/src/host/interface.js.map +1 -0
  143. package/dist/dev/src/index.browser.js +3 -0
  144. package/dist/dev/src/index.browser.js.map +1 -0
  145. package/dist/dev/src/index.js +27 -0
  146. package/dist/dev/src/index.js.map +1 -0
  147. package/dist/dev/src/inspect.browser.js +6 -0
  148. package/dist/dev/src/inspect.browser.js.map +1 -0
  149. package/dist/dev/src/inspect.js +2 -0
  150. package/dist/dev/src/inspect.js.map +1 -0
  151. package/dist/dev/src/jsx-runtime.js +17 -0
  152. package/dist/dev/src/jsx-runtime.js.map +1 -0
  153. package/dist/dev/src/library-symbol-reference.js +5 -0
  154. package/dist/dev/src/library-symbol-reference.js.map +1 -0
  155. package/dist/dev/src/name-policy.js +24 -0
  156. package/dist/dev/src/name-policy.js.map +1 -0
  157. package/dist/dev/src/pretty-string/pretty-string.js +100 -0
  158. package/dist/dev/src/pretty-string/pretty-string.js.map +1 -0
  159. package/dist/dev/src/pretty-string/pretty-string.test.js +38 -0
  160. package/dist/dev/src/pretty-string/pretty-string.test.js.map +1 -0
  161. package/dist/dev/src/print-hook.js +10 -0
  162. package/dist/dev/src/print-hook.js.map +1 -0
  163. package/dist/dev/src/props-combinators.js +109 -0
  164. package/dist/dev/src/props-combinators.js.map +1 -0
  165. package/dist/dev/src/reactive-union-set.js +213 -0
  166. package/dist/dev/src/reactive-union-set.js.map +1 -0
  167. package/dist/dev/src/reactivity.js +426 -0
  168. package/dist/dev/src/reactivity.js.map +1 -0
  169. package/dist/dev/src/refkey.js +167 -0
  170. package/dist/dev/src/refkey.js.map +1 -0
  171. package/dist/dev/src/render-stack.js +251 -0
  172. package/dist/dev/src/render-stack.js.map +1 -0
  173. package/dist/dev/src/render.js +872 -0
  174. package/dist/dev/src/render.js.map +1 -0
  175. package/dist/dev/src/resource.js +124 -0
  176. package/dist/dev/src/resource.js.map +1 -0
  177. package/dist/dev/src/runtime/component.js +41 -0
  178. package/dist/dev/src/runtime/component.js.map +1 -0
  179. package/dist/dev/src/runtime/intrinsic.js +12 -0
  180. package/dist/dev/src/runtime/intrinsic.js.map +1 -0
  181. package/dist/dev/src/scheduler.js +217 -0
  182. package/dist/dev/src/scheduler.js.map +1 -0
  183. package/dist/dev/src/stc.js +40 -0
  184. package/dist/dev/src/stc.js.map +1 -0
  185. package/dist/dev/src/sti.js +31 -0
  186. package/dist/dev/src/sti.js.map +1 -0
  187. package/dist/dev/src/symbols/basic-scope.js +21 -0
  188. package/dist/dev/src/symbols/basic-scope.js.map +1 -0
  189. package/dist/dev/src/symbols/basic-symbol.js +34 -0
  190. package/dist/dev/src/symbols/basic-symbol.js.map +1 -0
  191. package/dist/dev/src/symbols/decl.js +26 -0
  192. package/dist/dev/src/symbols/decl.js.map +1 -0
  193. package/dist/dev/src/symbols/index.js +10 -0
  194. package/dist/dev/src/symbols/index.js.map +1 -0
  195. package/dist/dev/src/symbols/output-scope.js +202 -0
  196. package/dist/dev/src/symbols/output-scope.js.map +1 -0
  197. package/dist/dev/src/symbols/output-space.js +36 -0
  198. package/dist/dev/src/symbols/output-space.js.map +1 -0
  199. package/dist/dev/src/symbols/output-symbol.js +504 -0
  200. package/dist/dev/src/symbols/output-symbol.js.map +1 -0
  201. package/dist/dev/src/symbols/symbol-flow.js +106 -0
  202. package/dist/dev/src/symbols/symbol-flow.js.map +1 -0
  203. package/dist/dev/src/symbols/symbol-slot.js +68 -0
  204. package/dist/dev/src/symbols/symbol-slot.js.map +1 -0
  205. package/dist/dev/src/symbols/symbol-slot.test.js +43 -0
  206. package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -0
  207. package/dist/dev/src/symbols/symbol-table.js +93 -0
  208. package/dist/dev/src/symbols/symbol-table.js.map +1 -0
  209. package/dist/dev/src/tap.js +109 -0
  210. package/dist/dev/src/tap.js.map +1 -0
  211. package/dist/dev/src/trace.js +2 -0
  212. package/dist/dev/src/trace.js.map +1 -0
  213. package/dist/dev/src/tracer.js +180 -0
  214. package/dist/dev/src/tracer.js.map +1 -0
  215. package/dist/dev/src/utils.js +487 -0
  216. package/dist/dev/src/utils.js.map +1 -0
  217. package/dist/dev/src/write-output.js +47 -0
  218. package/dist/dev/src/write-output.js.map +1 -0
  219. package/dist/dev/test/browser-build.test.js +86 -0
  220. package/dist/dev/test/browser-build.test.js.map +1 -0
  221. package/dist/dev/test/children.test.js +44 -0
  222. package/dist/dev/test/children.test.js.map +1 -0
  223. package/dist/dev/test/components/append-file.test.js +394 -0
  224. package/dist/dev/test/components/append-file.test.js.map +1 -0
  225. package/dist/dev/test/components/block.test.js +83 -0
  226. package/dist/dev/test/components/block.test.js.map +1 -0
  227. package/dist/dev/test/components/copy-file.test.js +119 -0
  228. package/dist/dev/test/components/copy-file.test.js.map +1 -0
  229. package/dist/dev/test/components/declaration.test.js +40 -0
  230. package/dist/dev/test/components/declaration.test.js.map +1 -0
  231. package/dist/dev/test/components/list.test.js +250 -0
  232. package/dist/dev/test/components/list.test.js.map +1 -0
  233. package/dist/dev/test/components/prose.test.js +42 -0
  234. package/dist/dev/test/components/prose.test.js.map +1 -0
  235. package/dist/dev/test/components/reference-or-content.test.js +246 -0
  236. package/dist/dev/test/components/reference-or-content.test.js.map +1 -0
  237. package/dist/dev/test/components/source-file.test.js +271 -0
  238. package/dist/dev/test/components/source-file.test.js.map +1 -0
  239. package/dist/dev/test/components/template-file.test.js +200 -0
  240. package/dist/dev/test/components/template-file.test.js.map +1 -0
  241. package/dist/dev/test/components/update-file.test.js +210 -0
  242. package/dist/dev/test/components/update-file.test.js.map +1 -0
  243. package/dist/dev/test/components/wrap.test.js +48 -0
  244. package/dist/dev/test/components/wrap.test.js.map +1 -0
  245. package/dist/dev/test/control-flow/for.test.js +318 -0
  246. package/dist/dev/test/control-flow/for.test.js.map +1 -0
  247. package/dist/dev/test/control-flow/match.test.js +112 -0
  248. package/dist/dev/test/control-flow/match.test.js.map +1 -0
  249. package/dist/dev/test/control-flow/show.test.js +38 -0
  250. package/dist/dev/test/control-flow/show.test.js.map +1 -0
  251. package/dist/dev/test/lazy-isempty.test.js +121 -0
  252. package/dist/dev/test/lazy-isempty.test.js.map +1 -0
  253. package/dist/dev/test/name-policy.test.js +28 -0
  254. package/dist/dev/test/name-policy.test.js.map +1 -0
  255. package/dist/dev/test/props-with-defaults.test.js +94 -0
  256. package/dist/dev/test/props-with-defaults.test.js.map +1 -0
  257. package/dist/dev/test/reactive-union-set-disposers.test.js +98 -0
  258. package/dist/dev/test/reactive-union-set-disposers.test.js.map +1 -0
  259. package/dist/dev/test/reactive-union-set.test.js +171 -0
  260. package/dist/dev/test/reactive-union-set.test.js.map +1 -0
  261. package/dist/dev/test/reactivity/circular-reactives.test.js +62 -0
  262. package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -0
  263. package/dist/dev/test/reactivity/cleanup.test.js +96 -0
  264. package/dist/dev/test/reactivity/cleanup.test.js.map +1 -0
  265. package/dist/dev/test/reactivity/memo.test.js +17 -0
  266. package/dist/dev/test/reactivity/memo.test.js.map +1 -0
  267. package/dist/dev/test/reactivity/ref-rendering.test.js +38 -0
  268. package/dist/dev/test/reactivity/ref-rendering.test.js.map +1 -0
  269. package/dist/dev/test/reactivity/shallow-reactive.test.js +52 -0
  270. package/dist/dev/test/reactivity/shallow-reactive.test.js.map +1 -0
  271. package/dist/dev/test/reactivity/test.test.js +74 -0
  272. package/dist/dev/test/reactivity/test.test.js.map +1 -0
  273. package/dist/dev/test/reactivity/untrack.test.js +27 -0
  274. package/dist/dev/test/reactivity/untrack.test.js.map +1 -0
  275. package/dist/dev/test/refkey.test.js +36 -0
  276. package/dist/dev/test/refkey.test.js.map +1 -0
  277. package/dist/dev/test/rendering/basic.test.js +194 -0
  278. package/dist/dev/test/rendering/basic.test.js.map +1 -0
  279. package/dist/dev/test/rendering/code.test.js +64 -0
  280. package/dist/dev/test/rendering/code.test.js.map +1 -0
  281. package/dist/dev/test/rendering/formatting.test.js +797 -0
  282. package/dist/dev/test/rendering/formatting.test.js.map +1 -0
  283. package/dist/dev/test/rendering/indent.test.js +183 -0
  284. package/dist/dev/test/rendering/indent.test.js.map +1 -0
  285. package/dist/dev/test/rendering/memoization.test.js +37 -0
  286. package/dist/dev/test/rendering/memoization.test.js.map +1 -0
  287. package/dist/dev/test/rendering/print-render-stack.test.js +287 -0
  288. package/dist/dev/test/rendering/print-render-stack.test.js.map +1 -0
  289. package/dist/dev/test/rendering/refkeys.test.js +37 -0
  290. package/dist/dev/test/rendering/refkeys.test.js.map +1 -0
  291. package/dist/dev/test/scheduler-extended.test.js +96 -0
  292. package/dist/dev/test/scheduler-extended.test.js.map +1 -0
  293. package/dist/dev/test/scheduler.test.js +46 -0
  294. package/dist/dev/test/scheduler.test.js.map +1 -0
  295. package/dist/dev/test/split-props.test.js +78 -0
  296. package/dist/dev/test/split-props.test.js.map +1 -0
  297. package/dist/dev/test/stc.test.js +35 -0
  298. package/dist/dev/test/stc.test.js.map +1 -0
  299. package/dist/dev/test/symbols/output-scope.test.js +180 -0
  300. package/dist/dev/test/symbols/output-scope.test.js.map +1 -0
  301. package/dist/dev/test/symbols/output-symbol.test.js +202 -0
  302. package/dist/dev/test/symbols/output-symbol.test.js.map +1 -0
  303. package/dist/dev/test/symbols/resolution.test.js +487 -0
  304. package/dist/dev/test/symbols/resolution.test.js.map +1 -0
  305. package/dist/dev/test/symbols/symbol-table.test.js +15 -0
  306. package/dist/dev/test/symbols/symbol-table.test.js.map +1 -0
  307. package/dist/dev/test/symbols/utils.js +26 -0
  308. package/dist/dev/test/symbols/utils.js.map +1 -0
  309. package/dist/dev/test/utils.test.js +317 -0
  310. package/dist/dev/test/utils.test.js.map +1 -0
  311. package/dist/dev/testing/create-test-wrapper.js +76 -0
  312. package/dist/dev/testing/create-test-wrapper.js.map +1 -0
  313. package/dist/dev/testing/devtools-utils.js +162 -0
  314. package/dist/dev/testing/devtools-utils.js.map +1 -0
  315. package/dist/dev/testing/extend-expect.js +167 -0
  316. package/dist/dev/testing/extend-expect.js.map +1 -0
  317. package/dist/dev/testing/extend-expect.test.js +234 -0
  318. package/dist/dev/testing/extend-expect.test.js.map +1 -0
  319. package/dist/dev/testing/index.js +4 -0
  320. package/dist/dev/testing/index.js.map +1 -0
  321. package/dist/dev/testing/render.js +23 -0
  322. package/dist/dev/testing/render.js.map +1 -0
  323. package/dist/dev/testing/vitest.d.js +2 -0
  324. package/dist/dev/testing/vitest.d.js.map +1 -0
  325. package/dist/devtools/index.html +29 -17
  326. package/dist/src/binder.d.ts.map +1 -1
  327. package/dist/src/binder.js +5 -0
  328. package/dist/src/binder.js.map +1 -1
  329. package/dist/src/components/For.d.ts.map +1 -1
  330. package/dist/src/components/For.js +1 -1
  331. package/dist/src/components/For.js.map +1 -1
  332. package/dist/src/components/List.d.ts.map +1 -1
  333. package/dist/src/components/List.js +1 -1
  334. package/dist/src/components/List.js.map +1 -1
  335. package/dist/src/components/Switch.d.ts.map +1 -1
  336. package/dist/src/components/Switch.js +1 -1
  337. package/dist/src/components/Switch.js.map +1 -1
  338. package/dist/src/debug/diagnostics.test.js +3 -2
  339. package/dist/src/debug/diagnostics.test.js.map +1 -1
  340. package/dist/src/debug/effects.d.ts +12 -4
  341. package/dist/src/debug/effects.d.ts.map +1 -1
  342. package/dist/src/debug/effects.js +119 -54
  343. package/dist/src/debug/effects.js.map +1 -1
  344. package/dist/src/debug/effects.test.js +213 -41
  345. package/dist/src/debug/effects.test.js.map +1 -1
  346. package/dist/src/debug/files.d.ts.map +1 -1
  347. package/dist/src/debug/files.js +7 -18
  348. package/dist/src/debug/files.js.map +1 -1
  349. package/dist/src/debug/files.test.js +13 -36
  350. package/dist/src/debug/files.test.js.map +1 -1
  351. package/dist/src/debug/index.d.ts +4 -2
  352. package/dist/src/debug/index.d.ts.map +1 -1
  353. package/dist/src/debug/index.js +4 -2
  354. package/dist/src/debug/index.js.map +1 -1
  355. package/dist/src/debug/message-format.test.d.ts +2 -0
  356. package/dist/src/debug/message-format.test.d.ts.map +1 -0
  357. package/dist/src/debug/message-format.test.js +700 -0
  358. package/dist/src/debug/message-format.test.js.map +1 -0
  359. package/dist/src/debug/render-tree-orphans.test.d.ts +2 -0
  360. package/dist/src/debug/render-tree-orphans.test.d.ts.map +1 -0
  361. package/dist/src/debug/render-tree-orphans.test.js +297 -0
  362. package/dist/src/debug/render-tree-orphans.test.js.map +1 -0
  363. package/dist/src/debug/render.d.ts.map +1 -1
  364. package/dist/src/debug/render.js +91 -131
  365. package/dist/src/debug/render.js.map +1 -1
  366. package/dist/src/debug/render.test.js +91 -128
  367. package/dist/src/debug/render.test.js.map +1 -1
  368. package/dist/src/debug/source-map.d.ts +22 -0
  369. package/dist/src/debug/source-map.d.ts.map +1 -0
  370. package/dist/src/debug/source-map.js +111 -0
  371. package/dist/src/debug/source-map.js.map +1 -0
  372. package/dist/src/debug/symbols.d.ts +6 -5
  373. package/dist/src/debug/symbols.d.ts.map +1 -1
  374. package/dist/src/debug/symbols.js +46 -23
  375. package/dist/src/debug/symbols.js.map +1 -1
  376. package/dist/src/debug/symbols.test.js +15 -26
  377. package/dist/src/debug/symbols.test.js.map +1 -1
  378. package/dist/src/debug/trace-writer.d.ts +55 -0
  379. package/dist/src/debug/trace-writer.d.ts.map +1 -0
  380. package/dist/src/debug/trace-writer.js +658 -0
  381. package/dist/src/debug/trace-writer.js.map +1 -0
  382. package/dist/src/debug/trace.d.ts +10 -10
  383. package/dist/src/debug/trace.d.ts.map +1 -1
  384. package/dist/src/debug/trace.js +36 -20
  385. package/dist/src/debug/trace.js.map +1 -1
  386. package/dist/src/devtools/devtools-protocol.d.ts +318 -161
  387. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  388. package/dist/src/devtools/devtools-server.browser.d.ts +0 -5
  389. package/dist/src/devtools/devtools-server.browser.d.ts.map +1 -1
  390. package/dist/src/devtools/devtools-server.browser.js +0 -3
  391. package/dist/src/devtools/devtools-server.browser.js.map +1 -1
  392. package/dist/src/devtools/devtools-server.d.ts +0 -6
  393. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  394. package/dist/src/devtools/devtools-server.js +212 -24
  395. package/dist/src/devtools/devtools-server.js.map +1 -1
  396. package/dist/src/devtools/devtools-transport.d.ts +2 -2
  397. package/dist/src/devtools/devtools-transport.d.ts.map +1 -1
  398. package/dist/src/devtools/devtools-transport.js +2 -2
  399. package/dist/src/devtools/devtools-transport.js.map +1 -1
  400. package/dist/src/devtools-entry.browser.d.ts +1 -1
  401. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  402. package/dist/src/devtools-entry.browser.js.map +1 -1
  403. package/dist/src/devtools-entry.d.ts +1 -1
  404. package/dist/src/devtools-entry.d.ts.map +1 -1
  405. package/dist/src/devtools-entry.js.map +1 -1
  406. package/dist/src/diagnostics.d.ts.map +1 -1
  407. package/dist/src/diagnostics.js +5 -5
  408. package/dist/src/diagnostics.js.map +1 -1
  409. package/dist/src/reactivity.d.ts +13 -2
  410. package/dist/src/reactivity.d.ts.map +1 -1
  411. package/dist/src/reactivity.js +96 -13
  412. package/dist/src/reactivity.js.map +1 -1
  413. package/dist/src/render.d.ts.map +1 -1
  414. package/dist/src/render.js +84 -30
  415. package/dist/src/render.js.map +1 -1
  416. package/dist/src/scheduler.d.ts +5 -0
  417. package/dist/src/scheduler.d.ts.map +1 -1
  418. package/dist/src/scheduler.js +94 -23
  419. package/dist/src/scheduler.js.map +1 -1
  420. package/dist/src/utils.d.ts.map +1 -1
  421. package/dist/src/utils.js +11 -5
  422. package/dist/src/utils.js.map +1 -1
  423. package/dist/test/browser-build.test.js +1 -1
  424. package/dist/test/browser-build.test.js.map +1 -1
  425. package/dist/testing/devtools-utils.d.ts +12 -3
  426. package/dist/testing/devtools-utils.d.ts.map +1 -1
  427. package/dist/testing/devtools-utils.js +26 -4
  428. package/dist/testing/devtools-utils.js.map +1 -1
  429. package/dist/tsconfig.tsbuildinfo +1 -1
  430. package/package.json +9 -3
  431. package/src/binder.ts +47 -38
  432. package/src/components/For.tsx +14 -10
  433. package/src/components/List.tsx +7 -4
  434. package/src/components/Switch.tsx +11 -7
  435. package/src/debug/diagnostics.test.tsx +3 -2
  436. package/src/debug/effects.test.tsx +248 -36
  437. package/src/debug/effects.ts +198 -64
  438. package/src/debug/files.test.tsx +15 -35
  439. package/src/debug/files.ts +11 -11
  440. package/src/debug/index.ts +4 -0
  441. package/src/debug/message-format.test.tsx +759 -0
  442. package/src/debug/render-tree-orphans.test.tsx +344 -0
  443. package/src/debug/render.test.tsx +96 -118
  444. package/src/debug/render.ts +196 -125
  445. package/src/debug/source-map.ts +135 -0
  446. package/src/debug/symbols.test.tsx +19 -20
  447. package/src/debug/symbols.ts +106 -23
  448. package/src/debug/trace-writer.ts +969 -0
  449. package/src/debug/trace.ts +41 -28
  450. package/src/devtools/devtools-protocol.ts +361 -176
  451. package/src/devtools/devtools-server.browser.ts +0 -9
  452. package/src/devtools/devtools-server.ts +210 -32
  453. package/src/devtools/devtools-transport.ts +4 -4
  454. package/src/devtools-entry.browser.ts +11 -15
  455. package/src/devtools-entry.ts +9 -15
  456. package/src/diagnostics.ts +14 -5
  457. package/src/reactivity.ts +113 -17
  458. package/src/render.ts +104 -30
  459. package/src/scheduler.ts +145 -26
  460. package/src/utils.tsx +7 -4
  461. package/temp/api.json +142 -20
  462. package/test/browser-build.test.ts +1 -1
  463. package/testing/devtools-utils.ts +46 -4
  464. package/vitest.config.ts +8 -0
@@ -13,11 +13,28 @@ import {
13
13
  type PrintHook,
14
14
  type RenderedTextTree,
15
15
  } from "../print-hook.js";
16
- import { untrack } from "../reactivity.js";
16
+ import { getContext, untrack } from "../reactivity.js";
17
17
  import type { ComponentCreator } from "../runtime/component.js";
18
18
  import { flushJobsAsync } from "../scheduler.js";
19
19
  import { sanitizeRecord } from "./serialize.js";
20
- import { emitDevtoolsMessage } from "./trace.js";
20
+ import { resolveComponentSource } from "./source-map.js";
21
+ import {
22
+ deleteDirectory,
23
+ deleteOutputFile,
24
+ insertDirectory,
25
+ insertOutputFile,
26
+ insertRenderError,
27
+ insertRenderNode,
28
+ isTraceEnabled,
29
+ notifyFlushComplete,
30
+ notifyRenderComplete,
31
+ notifyRenderReset,
32
+ deleteRenderNode as traceDeleteRenderNode,
33
+ updateRenderNodeProps as traceUpdateRenderNodeProps,
34
+ updateEffectComponentByContext,
35
+ updateRenderNodeContext,
36
+ } from "./trace-writer.js";
37
+ import { isDebugEnabled, logDevtoolsMessage } from "./trace.js";
21
38
 
22
39
  /** The kind discriminant for render tree nodes. */
23
40
  export type RenderTreeNodeKind = RenderTreeNode["kind"];
@@ -63,6 +80,10 @@ type TrackedNode = RenderedTextTree | PrintHook;
63
80
  let nodeIds = new WeakMap<TrackedNode, number>();
64
81
  let idToNode = new Map<number, TrackedNode>();
65
82
  let entryIds = new WeakMap<RenderedTextTree, number[]>();
83
+ let nodeKinds = new WeakMap<
84
+ TrackedNode,
85
+ { kind: string; name?: string; source?: RenderTreeNodeInfo["source"] }
86
+ >();
66
87
  let fileNodes = new Map<number, { path: string; filetype: string }>();
67
88
  let directoryNodes = new Map<number, { path: string }>();
68
89
  let nodeProps = new Map<number, string | undefined>();
@@ -94,11 +115,7 @@ function serializeRenderTreeProps(input: Record<string, unknown> | undefined) {
94
115
 
95
116
  function emitNodeRemoved(parentId: number | null, id: number) {
96
117
  clearRenderTreeChildrenForId(id);
97
- emitDevtoolsMessage({
98
- type: "render:nodeRemoved",
99
- parentId,
100
- id,
101
- });
118
+ traceDeleteRenderNode(id);
102
119
 
103
120
  rerenderActions.delete(id);
104
121
  nodeProps.delete(id);
@@ -106,19 +123,13 @@ function emitNodeRemoved(parentId: number | null, id: number) {
106
123
 
107
124
  const fileInfo = fileNodes.get(id);
108
125
  if (fileInfo) {
109
- emitDevtoolsMessage({
110
- type: "files:fileRemoved",
111
- path: fileInfo.path,
112
- });
126
+ deleteOutputFile(fileInfo.path);
113
127
  fileNodes.delete(id);
114
128
  }
115
129
 
116
130
  const dirInfo = directoryNodes.get(id);
117
131
  if (dirInfo) {
118
- emitDevtoolsMessage({
119
- type: "files:directoryRemoved",
120
- path: dirInfo.path,
121
- });
132
+ deleteDirectory(dirInfo.path);
122
133
  directoryNodes.delete(id);
123
134
  }
124
135
  }
@@ -134,7 +145,13 @@ function getEntryList(parent: RenderedTextTree) {
134
145
 
135
146
  function getOrCreateNodeId(node: TrackedNode) {
136
147
  const existing = nodeIds.get(node);
137
- if (existing) return existing;
148
+ if (existing) {
149
+ // Restore reverse mapping — emitNodeRemoved deletes idToNode but nodeIds
150
+ // (WeakMap) survives. Without this, clearRenderTreeChildrenForId can't
151
+ // find the node on the next cleanup, leaving orphaned children in the DB.
152
+ idToNode.set(existing, node);
153
+ return existing;
154
+ }
138
155
  const id = nextId++;
139
156
  nodeIds.set(node, id);
140
157
  idToNode.set(id, node);
@@ -142,7 +159,7 @@ function getOrCreateNodeId(node: TrackedNode) {
142
159
  }
143
160
 
144
161
  export function getRenderNodeId(node: RenderedTextTree | PrintHook) {
145
- if (!isDevtoolsEnabled()) return undefined;
162
+ if (!isDebugEnabled()) return undefined;
146
163
  return getOrCreateNodeId(node);
147
164
  }
148
165
 
@@ -152,33 +169,38 @@ function setEntryId(parent: RenderedTextTree, index: number, id: number) {
152
169
  }
153
170
 
154
171
  export function initialize(root: RenderedTextTree) {
155
- if (!isDevtoolsEnabled()) return;
172
+ if (!isDebugEnabled()) return;
156
173
  ensureDevtoolsHandler();
157
174
  nodeIds = new WeakMap();
158
175
  idToNode = new Map();
159
176
  entryIds = new WeakMap();
177
+ nodeKinds = new WeakMap();
160
178
  fileNodes = new Map();
161
179
  directoryNodes = new Map();
162
180
  nodeProps = new Map();
163
181
  rerenderActions = new Map();
164
182
  nextId = 1;
165
- emitDevtoolsMessage({ type: "render:reset" });
183
+ notifyRenderReset();
166
184
  const rootId = getOrCreateNodeId(root);
167
- emitDevtoolsMessage({
168
- type: "render:nodeAdded",
169
- parentId: null,
170
- node: {
171
- id: rootId,
172
- kind: "root",
173
- },
174
- });
185
+ insertRenderNode(
186
+ rootId,
187
+ null,
188
+ "root",
189
+ undefined,
190
+ undefined,
191
+ undefined,
192
+ undefined,
193
+ undefined,
194
+ null,
195
+ undefined,
196
+ );
175
197
  }
176
198
 
177
199
  export function registerRenderNodeActions(
178
200
  node: RenderedTextTree | PrintHook,
179
201
  actions: RenderNodeActions,
180
202
  ) {
181
- if (!isDevtoolsEnabled()) return;
203
+ if (!isDebugEnabled()) return;
182
204
  const id = getOrCreateNodeId(node);
183
205
  rerenderActions.set(id, actions);
184
206
  }
@@ -186,7 +208,7 @@ export function registerRenderNodeActions(
186
208
  export function unregisterRenderNodeActions(
187
209
  node: RenderedTextTree | PrintHook,
188
210
  ) {
189
- if (!isDevtoolsEnabled()) return;
211
+ if (!isDebugEnabled()) return;
190
212
  const id = nodeIds.get(node);
191
213
  if (id !== undefined) {
192
214
  rerenderActions.delete(id);
@@ -223,18 +245,21 @@ export function recordTextNode(
223
245
  index: number,
224
246
  value: string,
225
247
  ) {
226
- if (!isDevtoolsEnabled()) return;
248
+ if (!isDebugEnabled()) return;
227
249
  const id = nextId++;
228
250
  setEntryId(parent, index, id);
229
- emitDevtoolsMessage({
230
- type: "render:nodeAdded",
231
- parentId: getOrCreateNodeId(parent),
232
- node: {
233
- id,
234
- kind: "text",
235
- value,
236
- },
237
- });
251
+ insertRenderNode(
252
+ id,
253
+ getOrCreateNodeId(parent),
254
+ "text",
255
+ undefined,
256
+ undefined,
257
+ undefined,
258
+ undefined,
259
+ undefined,
260
+ null,
261
+ value,
262
+ );
238
263
  }
239
264
 
240
265
  function recordNodeAdded(
@@ -243,20 +268,30 @@ function recordNodeAdded(
243
268
  node: RenderedTextTree | PrintHook,
244
269
  info: RenderTreeNodeInfo,
245
270
  ) {
246
- if (!isDevtoolsEnabled()) return;
271
+ if (!isDebugEnabled()) return;
247
272
  const id = getOrCreateNodeId(node);
248
273
  if (info.propsSerialized !== undefined) {
249
274
  nodeProps.set(id, info.propsSerialized);
250
275
  }
251
- setEntryId(parent, index, id);
252
- emitDevtoolsMessage({
253
- type: "render:nodeAdded",
254
- parentId: getOrCreateNodeId(parent),
255
- node: {
256
- id,
257
- ...info,
258
- },
276
+ // Remember the kind and source so cached re-adds preserve them
277
+ nodeKinds.set(node, {
278
+ kind: info.kind,
279
+ name: info.name,
280
+ source: info.source,
259
281
  });
282
+ setEntryId(parent, index, id);
283
+ insertRenderNode(
284
+ id,
285
+ getOrCreateNodeId(parent),
286
+ info.kind,
287
+ info.name,
288
+ info.propsSerialized,
289
+ info.source?.fileName,
290
+ info.source?.lineNumber,
291
+ info.source?.columnNumber,
292
+ null,
293
+ undefined,
294
+ );
260
295
  }
261
296
 
262
297
  function recordSubtreeAdded(
@@ -264,25 +299,35 @@ function recordSubtreeAdded(
264
299
  subtree: RenderedTextTree,
265
300
  info: RenderTreeNodeInfo = { kind: "fragment" },
266
301
  ) {
267
- if (!isDevtoolsEnabled()) return;
302
+ if (!isDebugEnabled()) return;
268
303
  const parentId = getOrCreateNodeId(parentNode);
269
304
  // Check if this node was previously rendered (cached) by seeing if it already has an ID
270
305
  const existingId = nodeIds.get(subtree);
271
306
  const isCached = existingId !== undefined;
272
307
  const id = isCached ? existingId : getOrCreateNodeId(subtree);
308
+ // Merge source from previously-saved nodeKinds if the caller didn't provide one
309
+ const savedKind = nodeKinds.get(subtree);
310
+ const source = info.source ?? savedKind?.source;
311
+ // Remember the kind and source so cached re-adds preserve them
312
+ nodeKinds.set(subtree, { kind: info.kind, name: info.name, source });
273
313
  // Track in entryIds so clearRenderTreeChildren can find and remove it
274
314
  if (Array.isArray(parentNode)) {
275
315
  const list = getEntryList(parentNode);
276
316
  list.push(id);
277
317
  }
278
- emitDevtoolsMessage({
279
- type: "render:nodeAdded",
318
+ insertRenderNode(
319
+ id,
280
320
  parentId,
281
- node: {
282
- id,
283
- ...info,
284
- },
285
- });
321
+ info.kind,
322
+ info.name,
323
+ info.propsSerialized,
324
+ source?.fileName,
325
+ source?.lineNumber,
326
+ source?.columnNumber,
327
+ null,
328
+ undefined,
329
+ );
330
+
286
331
  // For cached nodes, we need to recursively re-add all their children since
287
332
  // clearRenderTreeChildren removed them when the parent re-rendered
288
333
  if (isCached) {
@@ -297,9 +342,15 @@ function recordSubtreeAdded(
297
342
  * to be explicitly re-added.
298
343
  */
299
344
  function recordCachedSubtreeChildrenRecursively(node: RenderedTextTree) {
300
- if (!isDevtoolsEnabled()) return;
345
+ if (!isDebugEnabled()) return;
301
346
  const parentId = getOrCreateNodeId(node);
302
347
 
348
+ // Clear any previously-recorded children from the DB before re-adding.
349
+ // The in-memory tree may have changed since the last cached re-add
350
+ // (e.g., a memo inside the cached subtree re-ran), so old DB children
351
+ // that are no longer in the tree would become orphans.
352
+ clearRenderTreeChildren(node);
353
+
303
354
  // Rebuild the entryIds for this node
304
355
  const list = getEntryList(node);
305
356
  list.length = 0;
@@ -312,55 +363,70 @@ function recordCachedSubtreeChildrenRecursively(node: RenderedTextTree) {
312
363
  const id = nextId++;
313
364
  list.push(id);
314
365
  idToNode.set(id, child as unknown as RenderedTextTree);
315
- emitDevtoolsMessage({
316
- type: "render:nodeAdded",
366
+ insertRenderNode(
367
+ id,
317
368
  parentId,
318
- node: {
319
- id,
320
- kind: "text",
321
- value: child,
322
- },
323
- });
369
+ "text",
370
+ undefined,
371
+ undefined,
372
+ undefined,
373
+ undefined,
374
+ undefined,
375
+ null,
376
+ child,
377
+ );
324
378
  }
325
379
  } else if (Array.isArray(child)) {
326
- // Nested RenderedTextTree - record and recurse
380
+ // Nested RenderedTextTree - record and recurse, preserving original kind and source
327
381
  const id = getOrCreateNodeId(child);
328
382
  list.push(id);
329
- emitDevtoolsMessage({
330
- type: "render:nodeAdded",
383
+ const savedKind = nodeKinds.get(child);
384
+ insertRenderNode(
385
+ id,
331
386
  parentId,
332
- node: {
333
- id,
334
- kind: "fragment",
335
- },
336
- });
387
+ savedKind?.kind ?? "fragment",
388
+ savedKind?.name,
389
+ undefined,
390
+ savedKind?.source?.fileName,
391
+ savedKind?.source?.lineNumber,
392
+ savedKind?.source?.columnNumber,
393
+ null,
394
+ undefined,
395
+ );
337
396
  recordCachedSubtreeChildrenRecursively(child);
338
397
  } else if (isPrintHook(child)) {
339
398
  // PrintHook - record and recurse into subtree
340
399
  const id = getOrCreateNodeId(child);
341
400
  list.push(id);
342
- emitDevtoolsMessage({
343
- type: "render:nodeAdded",
401
+ insertRenderNode(
402
+ id,
344
403
  parentId,
345
- node: {
346
- id,
347
- kind: "printHook",
348
- name: (child as { name?: string }).name ?? "hook",
349
- },
350
- });
404
+ "printHook",
405
+ (child as { name?: string }).name ?? "hook",
406
+ undefined,
407
+ undefined,
408
+ undefined,
409
+ undefined,
410
+ null,
411
+ undefined,
412
+ );
351
413
  if (child.subtree) {
352
414
  const subtreeId = getOrCreateNodeId(child.subtree);
353
415
  const hookList = getEntryList(child as unknown as RenderedTextTree);
354
416
  hookList.length = 0;
355
417
  hookList.push(subtreeId);
356
- emitDevtoolsMessage({
357
- type: "render:nodeAdded",
358
- parentId: id,
359
- node: {
360
- id: subtreeId,
361
- kind: "fragment",
362
- },
363
- });
418
+ insertRenderNode(
419
+ subtreeId,
420
+ id,
421
+ "fragment",
422
+ undefined,
423
+ undefined,
424
+ undefined,
425
+ undefined,
426
+ undefined,
427
+ null,
428
+ undefined,
429
+ );
364
430
  recordCachedSubtreeChildrenRecursively(child.subtree);
365
431
  }
366
432
  }
@@ -371,20 +437,16 @@ function recordNodePropsUpdated(
371
437
  node: RenderedTextTree | PrintHook,
372
438
  propsSerialized: string | undefined,
373
439
  ) {
374
- if (!isDevtoolsEnabled()) return;
440
+ if (!isDebugEnabled()) return;
375
441
  const id = getOrCreateNodeId(node);
376
442
  const previous = nodeProps.get(id);
377
443
  if (previous === propsSerialized) return;
378
444
  nodeProps.set(id, propsSerialized);
379
- emitDevtoolsMessage({
380
- type: "render:nodeUpdated",
381
- id,
382
- propsSerialized,
383
- });
445
+ traceUpdateRenderNodeProps(id, propsSerialized);
384
446
  }
385
447
 
386
448
  function clearRenderTreeChildren(parent: RenderedTextTree) {
387
- if (!isDevtoolsEnabled()) return;
449
+ if (!isDebugEnabled()) return;
388
450
  const list = entryIds.get(parent);
389
451
  if (!list || list.length === 0) return;
390
452
  const parentId = getOrCreateNodeId(parent);
@@ -403,9 +465,15 @@ function clearRenderTreeChildrenForId(id: number) {
403
465
  clearRenderTreeChildren(node);
404
466
  return;
405
467
  }
468
+ // For PrintHook nodes: clear the subtree's children, then remove
469
+ // the subtree node itself (which is a child of this hook).
406
470
  const subtree = (node as { subtree?: RenderedTextTree }).subtree;
407
471
  if (subtree && Array.isArray(subtree)) {
408
472
  clearRenderTreeChildren(subtree);
473
+ const subtreeId = nodeIds.get(subtree);
474
+ if (subtreeId !== undefined) {
475
+ emitNodeRemoved(id, subtreeId);
476
+ }
409
477
  }
410
478
  }
411
479
 
@@ -414,14 +482,11 @@ function clearRenderTreeChildrenForId(id: number) {
414
482
  // ─────────────────────────────────────────────────────────────────────────────
415
483
 
416
484
  function recordDirectoryNode(node: RenderedTextTree, path: string) {
417
- if (!isDevtoolsEnabled()) return;
485
+ if (!isDebugEnabled()) return;
418
486
  const id = getOrCreateNodeId(node);
419
487
  if (directoryNodes.has(id)) return;
420
488
  directoryNodes.set(id, { path });
421
- emitDevtoolsMessage({
422
- type: "files:directoryAdded",
423
- path,
424
- });
489
+ insertDirectory(path);
425
490
  }
426
491
 
427
492
  function recordFileNode(
@@ -429,36 +494,25 @@ function recordFileNode(
429
494
  path: string,
430
495
  filetype: string,
431
496
  ) {
432
- if (!isDevtoolsEnabled()) return;
497
+ if (!isDebugEnabled()) return;
433
498
  const id = getOrCreateNodeId(node);
434
499
  if (fileNodes.has(id)) return;
435
500
  fileNodes.set(id, { path, filetype });
436
- emitDevtoolsMessage({
437
- type: "files:fileAdded",
438
- path,
439
- filetype,
440
- renderNodeId: id,
441
- });
501
+ insertOutputFile(path, filetype, id);
442
502
  }
443
503
 
444
504
  function removeFileEntriesForNode(node: RenderedTextTree | PrintHook) {
445
- if (!isDevtoolsEnabled()) return;
505
+ if (!isDebugEnabled()) return;
446
506
  const id = nodeIds.get(node);
447
507
  if (id === undefined) return;
448
508
  const fileInfo = fileNodes.get(id);
449
509
  if (fileInfo) {
450
- emitDevtoolsMessage({
451
- type: "files:fileRemoved",
452
- path: fileInfo.path,
453
- });
510
+ deleteOutputFile(fileInfo.path);
454
511
  fileNodes.delete(id);
455
512
  }
456
513
  const dirInfo = directoryNodes.get(id);
457
514
  if (dirInfo) {
458
- emitDevtoolsMessage({
459
- type: "files:directoryRemoved",
460
- path: dirInfo.path,
461
- });
515
+ deleteDirectory(dirInfo.path);
462
516
  directoryNodes.delete(id);
463
517
  }
464
518
  }
@@ -482,7 +536,7 @@ export function beginComponent(
482
536
  actions,
483
537
  } = options;
484
538
 
485
- if (!isDevtoolsEnabled()) {
539
+ if (!isDebugEnabled()) {
486
540
  return {
487
541
  recordDirectory() {},
488
542
  recordFile() {},
@@ -501,6 +555,7 @@ export function beginComponent(
501
555
  }
502
556
  }
503
557
  const propsSerialized = serializeRenderTreeProps(propsSource);
558
+ const resolvedSource = resolveComponentSource(source);
504
559
  if (isExisting) {
505
560
  clearRenderTreeChildren(node);
506
561
  } else {
@@ -508,9 +563,17 @@ export function beginComponent(
508
563
  kind: "component",
509
564
  name: componentName,
510
565
  propsSerialized,
511
- source,
566
+ source: resolvedSource,
512
567
  });
513
568
  }
569
+
570
+ if (isTraceEnabled()) {
571
+ const ctx = getContext();
572
+ if (ctx) {
573
+ updateRenderNodeContext(getOrCreateNodeId(node), ctx.id);
574
+ updateEffectComponentByContext(ctx.id, componentName);
575
+ }
576
+ }
514
577
  recordNodePropsUpdated(node, propsSerialized);
515
578
  registerRenderNodeActions(node, actions);
516
579
 
@@ -610,7 +673,7 @@ export function error(
610
673
  error: RenderErrorInfo,
611
674
  componentStack: RenderErrorStackEntry[],
612
675
  ) {
613
- if (!isDevtoolsEnabled()) return;
676
+ if (!isDebugEnabled()) return;
614
677
  const serializedStack = untrack(() =>
615
678
  componentStack.map((entry) => ({
616
679
  name: entry.name,
@@ -619,21 +682,29 @@ export function error(
619
682
  source: entry.source,
620
683
  })),
621
684
  );
622
- const message = {
685
+ logDevtoolsMessage({
623
686
  type: "render:error" as const,
624
687
  id: nextErrorId++,
625
688
  name: error.name,
626
689
  message: error.message,
627
690
  stack: error.stack,
628
691
  componentStack: serializedStack,
629
- };
630
- emitDevtoolsMessage(message);
692
+ });
693
+
694
+ insertRenderError(
695
+ error.name,
696
+ error.message,
697
+ error.stack,
698
+ JSON.stringify(serializedStack),
699
+ );
631
700
  }
632
701
 
633
702
  export function complete() {
634
- emitDevtoolsMessage({ type: "render:complete" });
703
+ logDevtoolsMessage({ type: "render:complete" });
704
+ notifyRenderComplete();
635
705
  }
636
706
 
637
707
  export function flushJobsComplete() {
638
- emitDevtoolsMessage({ type: "flushJobs:complete" });
708
+ logDevtoolsMessage({ type: "flushJobs:complete" });
709
+ notifyFlushComplete();
639
710
  }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Shared source-map resolution utilities.
3
+ *
4
+ * Used by both effect source capture (effects.ts) and component source
5
+ * resolution (render.ts) to convert file paths and resolve source maps.
6
+ */
7
+
8
+ import type { SourceLocation } from "../devtools/devtools-protocol.js";
9
+
10
+ // Lazily loaded findSourceMap from node:module
11
+ let findSourceMap:
12
+ | ((path: string) =>
13
+ | {
14
+ findEntry: (
15
+ line: number,
16
+ col: number,
17
+ ) =>
18
+ | {
19
+ originalSource: string;
20
+ originalLine: number;
21
+ originalColumn: number;
22
+ }
23
+ | undefined;
24
+ }
25
+ | undefined)
26
+ | undefined;
27
+ let loaded = false;
28
+ let realpathSync: ((path: string) => string) | undefined;
29
+ let fileURLToPath: ((url: string | URL) => string) | undefined;
30
+ const realpathCache = new Map<string, string>();
31
+
32
+ export function loadSourceMapSupport() {
33
+ if (loaded) return;
34
+ loaded = true;
35
+ try {
36
+ const mod = process.getBuiltinModule?.("node:module") as
37
+ | typeof import("node:module")
38
+ | undefined;
39
+ if (mod && typeof mod.findSourceMap === "function") {
40
+ findSourceMap = mod.findSourceMap as typeof findSourceMap;
41
+ }
42
+ } catch {
43
+ // not available
44
+ }
45
+ try {
46
+ const fs = process.getBuiltinModule?.("node:fs") as
47
+ | typeof import("node:fs")
48
+ | undefined;
49
+ if (fs) {
50
+ realpathSync = fs.realpathSync;
51
+ }
52
+ } catch {
53
+ // not available
54
+ }
55
+ try {
56
+ const url = process.getBuiltinModule?.("node:url") as
57
+ | typeof import("node:url")
58
+ | undefined;
59
+ if (url) {
60
+ fileURLToPath = url.fileURLToPath;
61
+ }
62
+ } catch {
63
+ // not available
64
+ }
65
+ }
66
+
67
+ export function getRealPath(fileName: string): string {
68
+ if (!realpathSync) return fileName;
69
+ let real = realpathCache.get(fileName);
70
+ if (real === undefined) {
71
+ try {
72
+ real = realpathSync(fileName);
73
+ } catch {
74
+ real = fileName;
75
+ }
76
+ realpathCache.set(fileName, real);
77
+ }
78
+ return real;
79
+ }
80
+
81
+ export function resolveSourceMap(
82
+ fileName: string,
83
+ line: number,
84
+ col: number,
85
+ ): { fileName: string; line: number; col: number } {
86
+ if (!findSourceMap) return { fileName, line, col };
87
+ // pnpm uses symlinks; findSourceMap only matches the real path
88
+ const real = getRealPath(fileName);
89
+ const map = findSourceMap(real);
90
+ if (!map) return { fileName, line, col };
91
+ const entry = map.findEntry(line - 1, col - 1);
92
+ if (!entry) return { fileName, line, col };
93
+ return {
94
+ fileName: entry.originalSource,
95
+ line: entry.originalLine + 1,
96
+ col: entry.originalColumn + 1,
97
+ };
98
+ }
99
+
100
+ function stripFileUrl(path: string): string {
101
+ if (!path.startsWith("file://")) return path;
102
+ if (fileURLToPath) return fileURLToPath(path);
103
+ return new URL(path).pathname;
104
+ }
105
+
106
+ /**
107
+ * Resolve a component source location. Handles:
108
+ * - `file://` URLs from import.meta.url (converts to file path)
109
+ * - Source map resolution (maps compiled .js to original .tsx)
110
+ * - Plain absolute paths (legacy format, returned as-is)
111
+ */
112
+ export function resolveComponentSource(
113
+ source: SourceLocation | undefined,
114
+ ): SourceLocation | undefined {
115
+ if (!source?.fileName) return source;
116
+ loadSourceMapSupport();
117
+
118
+ const fileName = stripFileUrl(source.fileName);
119
+
120
+ if (source.lineNumber != null && source.columnNumber != null) {
121
+ // Resolve through source maps to get the original .tsx path
122
+ const resolved = resolveSourceMap(
123
+ fileName,
124
+ source.lineNumber,
125
+ source.columnNumber,
126
+ );
127
+ return {
128
+ fileName: stripFileUrl(resolved.fileName),
129
+ lineNumber: resolved.line,
130
+ columnNumber: resolved.col,
131
+ };
132
+ }
133
+
134
+ return { ...source, fileName };
135
+ }