@alloy-js/core 0.24.0-dev.2 → 0.24.0-dev.7

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 (656) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/dev/src/components/AccessExpression.test.js +30 -38
  3. package/dist/dev/src/components/AccessExpression.test.js.map +1 -1
  4. package/dist/dev/src/components/Output.js +3 -2
  5. package/dist/dev/src/components/Output.js.map +1 -1
  6. package/dist/dev/src/components/SourceFile.js.map +1 -1
  7. package/dist/dev/src/content-slot.test.js +16 -18
  8. package/dist/dev/src/content-slot.test.js.map +1 -1
  9. package/dist/dev/src/context.js +30 -3
  10. package/dist/dev/src/context.js.map +1 -1
  11. package/dist/dev/src/debug/diagnostics.test.js +1 -1
  12. package/dist/dev/src/debug/diagnostics.test.js.map +1 -1
  13. package/dist/dev/src/debug/effects.test.js +1 -1
  14. package/dist/dev/src/debug/effects.test.js.map +1 -1
  15. package/dist/dev/src/debug/file-streaming.js +103 -0
  16. package/dist/dev/src/debug/file-streaming.js.map +1 -0
  17. package/dist/dev/src/debug/files.test.js +4 -5
  18. package/dist/dev/src/debug/files.test.js.map +1 -1
  19. package/dist/dev/src/debug/index.js +4 -6
  20. package/dist/dev/src/debug/index.js.map +1 -1
  21. package/dist/dev/src/debug/message-format.test.js +50 -52
  22. package/dist/dev/src/debug/message-format.test.js.map +1 -1
  23. package/dist/dev/src/debug/render-tree-orphans.test.js +13 -23
  24. package/dist/dev/src/debug/render-tree-orphans.test.js.map +1 -1
  25. package/dist/dev/src/debug/render.js +529 -352
  26. package/dist/dev/src/debug/render.js.map +1 -1
  27. package/dist/dev/src/debug/render.test.js +171 -92
  28. package/dist/dev/src/debug/render.test.js.map +1 -1
  29. package/dist/dev/src/debug/trace-writer.js +127 -15
  30. package/dist/dev/src/debug/trace-writer.js.map +1 -1
  31. package/dist/dev/src/debug/trace.js +0 -36
  32. package/dist/dev/src/debug/trace.js.map +1 -1
  33. package/dist/dev/src/devtools/devtools-server.js +55 -32
  34. package/dist/dev/src/devtools/devtools-server.js.map +1 -1
  35. package/dist/dev/src/devtools-entry.browser.js.map +1 -1
  36. package/dist/dev/src/devtools-entry.js.map +1 -1
  37. package/dist/dev/src/diagnostics.js +19 -1
  38. package/dist/dev/src/diagnostics.js.map +1 -1
  39. package/dist/dev/src/index.js +5 -2
  40. package/dist/dev/src/index.js.map +1 -1
  41. package/dist/dev/src/jsx-runtime.js +14 -8
  42. package/dist/dev/src/jsx-runtime.js.map +1 -1
  43. package/dist/dev/src/output-types.js +2 -0
  44. package/dist/dev/src/output-types.js.map +1 -0
  45. package/dist/dev/src/reactivity.js +155 -13
  46. package/dist/dev/src/reactivity.js.map +1 -1
  47. package/dist/dev/src/render/get-string-width.js +61 -0
  48. package/dist/dev/src/render/get-string-width.js.map +1 -0
  49. package/dist/dev/src/render/index.js +2 -0
  50. package/dist/dev/src/render/index.js.map +1 -0
  51. package/dist/dev/src/render/node-context.js +7 -0
  52. package/dist/dev/src/render/node-context.js.map +1 -0
  53. package/dist/dev/src/render/node.js +386 -0
  54. package/dist/dev/src/render/node.js.map +1 -0
  55. package/dist/dev/src/render/printer-support.js +180 -0
  56. package/dist/dev/src/render/printer-support.js.map +1 -0
  57. package/dist/dev/src/render/printer.js +797 -0
  58. package/dist/dev/src/render/printer.js.map +1 -0
  59. package/dist/dev/src/render-error.js +79 -0
  60. package/dist/dev/src/render-error.js.map +1 -0
  61. package/dist/dev/src/render-output.js +209 -0
  62. package/dist/dev/src/render-output.js.map +1 -0
  63. package/dist/dev/src/runtime/create-intrinsic.js +53 -0
  64. package/dist/dev/src/runtime/create-intrinsic.js.map +1 -0
  65. package/dist/dev/src/runtime/fragment.js +21 -0
  66. package/dist/dev/src/runtime/fragment.js.map +1 -0
  67. package/dist/dev/src/runtime/index.js +13 -0
  68. package/dist/dev/src/runtime/index.js.map +1 -0
  69. package/dist/dev/src/runtime/insert.js +453 -0
  70. package/dist/dev/src/runtime/insert.js.map +1 -0
  71. package/dist/dev/src/runtime/intrinsic.js +1 -11
  72. package/dist/dev/src/runtime/intrinsic.js.map +1 -1
  73. package/dist/dev/src/scheduler.js +38 -14
  74. package/dist/dev/src/scheduler.js.map +1 -1
  75. package/dist/dev/src/stc.js +2 -0
  76. package/dist/dev/src/stc.js.map +1 -1
  77. package/dist/dev/src/sti.js +1 -1
  78. package/dist/dev/src/sti.js.map +1 -1
  79. package/dist/dev/src/symbols/symbol-slot.test.js +5 -5
  80. package/dist/dev/src/symbols/symbol-slot.test.js.map +1 -1
  81. package/dist/dev/src/test-render.js +78 -0
  82. package/dist/dev/src/test-render.js.map +1 -0
  83. package/dist/dev/src/utils.js +47 -35
  84. package/dist/dev/src/utils.js.map +1 -1
  85. package/dist/dev/test/babel-e2e.test.js +218 -0
  86. package/dist/dev/test/babel-e2e.test.js.map +1 -0
  87. package/dist/dev/test/children.test.js +9 -11
  88. package/dist/dev/test/children.test.js.map +1 -1
  89. package/dist/dev/test/components/append-file.test.js +26 -27
  90. package/dist/dev/test/components/append-file.test.js.map +1 -1
  91. package/dist/dev/test/components/block.test.js +9 -11
  92. package/dist/dev/test/components/block.test.js.map +1 -1
  93. package/dist/dev/test/components/copy-file.test.js +1 -2
  94. package/dist/dev/test/components/copy-file.test.js.map +1 -1
  95. package/dist/dev/test/components/declaration.test.js +2 -2
  96. package/dist/dev/test/components/declaration.test.js.map +1 -1
  97. package/dist/dev/test/components/list.test.js +41 -43
  98. package/dist/dev/test/components/list.test.js.map +1 -1
  99. package/dist/dev/test/components/prose.test.js +4 -5
  100. package/dist/dev/test/components/prose.test.js.map +1 -1
  101. package/dist/dev/test/components/reference-or-content.test.js +32 -33
  102. package/dist/dev/test/components/reference-or-content.test.js.map +1 -1
  103. package/dist/dev/test/components/source-file.test.js +8 -7
  104. package/dist/dev/test/components/source-file.test.js.map +1 -1
  105. package/dist/dev/test/components/template-file.test.js +16 -17
  106. package/dist/dev/test/components/template-file.test.js.map +1 -1
  107. package/dist/dev/test/components/update-file.test.js +11 -12
  108. package/dist/dev/test/components/update-file.test.js.map +1 -1
  109. package/dist/dev/test/components/wrap.test.js +6 -8
  110. package/dist/dev/test/components/wrap.test.js.map +1 -1
  111. package/dist/dev/test/control-flow/for.test.js +58 -42
  112. package/dist/dev/test/control-flow/for.test.js.map +1 -1
  113. package/dist/dev/test/control-flow/match.test.js +15 -17
  114. package/dist/dev/test/control-flow/match.test.js.map +1 -1
  115. package/dist/dev/test/control-flow/show.test.js +5 -8
  116. package/dist/dev/test/control-flow/show.test.js.map +1 -1
  117. package/dist/dev/test/lazy-isempty.test.js +29 -31
  118. package/dist/dev/test/lazy-isempty.test.js.map +1 -1
  119. package/dist/dev/test/name-policy.test.js +2 -3
  120. package/dist/dev/test/name-policy.test.js.map +1 -1
  121. package/dist/dev/test/node.test.js +80 -0
  122. package/dist/dev/test/node.test.js.map +1 -0
  123. package/dist/dev/test/output-e2e.test.js +194 -0
  124. package/dist/dev/test/output-e2e.test.js.map +1 -0
  125. package/dist/dev/test/reactivity/circular-reactives.test.js +9 -9
  126. package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -1
  127. package/dist/dev/test/reactivity/cleanup.test.js +5 -6
  128. package/dist/dev/test/reactivity/cleanup.test.js.map +1 -1
  129. package/dist/dev/test/reactivity/ref-rendering.test.js +15 -15
  130. package/dist/dev/test/reactivity/ref-rendering.test.js.map +1 -1
  131. package/dist/dev/test/reactivity/test.test.js +18 -18
  132. package/dist/dev/test/reactivity/test.test.js.map +1 -1
  133. package/dist/dev/test/rendering/basic.test.js +18 -19
  134. package/dist/dev/test/rendering/basic.test.js.map +1 -1
  135. package/dist/dev/test/rendering/code.test.js +2 -3
  136. package/dist/dev/test/rendering/code.test.js.map +1 -1
  137. package/dist/dev/test/rendering/formatting.test.js +115 -121
  138. package/dist/dev/test/rendering/formatting.test.js.map +1 -1
  139. package/dist/dev/test/rendering/indent.test.js +23 -24
  140. package/dist/dev/test/rendering/indent.test.js.map +1 -1
  141. package/dist/dev/test/rendering/memoization.test.js +9 -5
  142. package/dist/dev/test/rendering/memoization.test.js.map +1 -1
  143. package/dist/dev/test/rendering/print-render-stack.test.js +20 -21
  144. package/dist/dev/test/rendering/print-render-stack.test.js.map +1 -1
  145. package/dist/dev/test/rendering/refkeys.test.js +1 -2
  146. package/dist/dev/test/rendering/refkeys.test.js.map +1 -1
  147. package/dist/dev/test/rendering/render-output-diagnostics.test.js +102 -0
  148. package/dist/dev/test/rendering/render-output-diagnostics.test.js.map +1 -0
  149. package/dist/dev/test/runtime.test.js +385 -0
  150. package/dist/dev/test/runtime.test.js.map +1 -0
  151. package/dist/dev/test/stc.test.js +0 -1
  152. package/dist/dev/test/stc.test.js.map +1 -1
  153. package/dist/dev/test/tree-test-utils.js +16 -0
  154. package/dist/dev/test/tree-test-utils.js.map +1 -0
  155. package/dist/dev/test/utils.test.js +34 -33
  156. package/dist/dev/test/utils.test.js.map +1 -1
  157. package/dist/dev/test/vitest.setup.js +2 -0
  158. package/dist/dev/test/vitest.setup.js.map +1 -0
  159. package/dist/dev/testing/devtools-utils.js +1 -1
  160. package/dist/dev/testing/devtools-utils.js.map +1 -1
  161. package/dist/dev/testing/extend-expect.js +30 -34
  162. package/dist/dev/testing/extend-expect.js.map +1 -1
  163. package/dist/dev/testing/render.js +7 -17
  164. package/dist/dev/testing/render.js.map +1 -1
  165. package/dist/devtools/index.html +17 -17
  166. package/dist/src/components/AccessExpression.test.d.ts +1 -1
  167. package/dist/src/components/AccessExpression.test.d.ts.map +1 -1
  168. package/dist/src/components/AccessExpression.test.js +5 -13
  169. package/dist/src/components/AccessExpression.test.js.map +1 -1
  170. package/dist/src/components/Output.d.ts +1 -1
  171. package/dist/src/components/Output.d.ts.map +1 -1
  172. package/dist/src/components/Output.js +2 -1
  173. package/dist/src/components/Output.js.map +1 -1
  174. package/dist/src/components/ReferenceOrContent.d.ts +1 -1
  175. package/dist/src/components/ReferenceOrContent.d.ts.map +1 -1
  176. package/dist/src/components/SourceFile.d.ts +1 -1
  177. package/dist/src/components/SourceFile.d.ts.map +1 -1
  178. package/dist/src/components/SourceFile.js.map +1 -1
  179. package/dist/src/content-slot.test.d.ts +1 -1
  180. package/dist/src/content-slot.test.d.ts.map +1 -1
  181. package/dist/src/content-slot.test.js +8 -10
  182. package/dist/src/content-slot.test.js.map +1 -1
  183. package/dist/src/context/format-options.d.ts +1 -1
  184. package/dist/src/context/format-options.d.ts.map +1 -1
  185. package/dist/src/context.d.ts +9 -1
  186. package/dist/src/context.d.ts.map +1 -1
  187. package/dist/src/context.js +30 -3
  188. package/dist/src/context.js.map +1 -1
  189. package/dist/src/debug/diagnostics.test.js +1 -1
  190. package/dist/src/debug/diagnostics.test.js.map +1 -1
  191. package/dist/src/debug/effects.test.js +1 -1
  192. package/dist/src/debug/effects.test.js.map +1 -1
  193. package/dist/src/debug/file-streaming.d.ts +22 -0
  194. package/dist/src/debug/file-streaming.d.ts.map +1 -0
  195. package/dist/src/debug/file-streaming.js +103 -0
  196. package/dist/src/debug/file-streaming.js.map +1 -0
  197. package/dist/src/debug/files.test.js +4 -5
  198. package/dist/src/debug/files.test.js.map +1 -1
  199. package/dist/src/debug/index.d.ts +5 -7
  200. package/dist/src/debug/index.d.ts.map +1 -1
  201. package/dist/src/debug/index.js +4 -6
  202. package/dist/src/debug/index.js.map +1 -1
  203. package/dist/src/debug/message-format.test.js +16 -18
  204. package/dist/src/debug/message-format.test.js.map +1 -1
  205. package/dist/src/debug/render-tree-orphans.test.js +8 -18
  206. package/dist/src/debug/render-tree-orphans.test.js.map +1 -1
  207. package/dist/src/debug/render.d.ts +71 -21
  208. package/dist/src/debug/render.d.ts.map +1 -1
  209. package/dist/src/debug/render.js +529 -352
  210. package/dist/src/debug/render.js.map +1 -1
  211. package/dist/src/debug/render.test.js +137 -74
  212. package/dist/src/debug/render.test.js.map +1 -1
  213. package/dist/src/debug/trace-writer.d.ts +6 -1
  214. package/dist/src/debug/trace-writer.d.ts.map +1 -1
  215. package/dist/src/debug/trace-writer.js +127 -15
  216. package/dist/src/debug/trace-writer.js.map +1 -1
  217. package/dist/src/debug/trace.d.ts +0 -36
  218. package/dist/src/debug/trace.d.ts.map +1 -1
  219. package/dist/src/debug/trace.js +0 -36
  220. package/dist/src/debug/trace.js.map +1 -1
  221. package/dist/src/devtools/devtools-protocol.d.ts +34 -1
  222. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  223. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  224. package/dist/src/devtools/devtools-server.js +55 -32
  225. package/dist/src/devtools/devtools-server.js.map +1 -1
  226. package/dist/src/devtools-entry.browser.d.ts +1 -1
  227. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  228. package/dist/src/devtools-entry.browser.js.map +1 -1
  229. package/dist/src/devtools-entry.d.ts +1 -1
  230. package/dist/src/devtools-entry.d.ts.map +1 -1
  231. package/dist/src/devtools-entry.js.map +1 -1
  232. package/dist/src/diagnostics.d.ts +4 -0
  233. package/dist/src/diagnostics.d.ts.map +1 -1
  234. package/dist/src/diagnostics.js +19 -1
  235. package/dist/src/diagnostics.js.map +1 -1
  236. package/dist/src/index.d.ts +5 -2
  237. package/dist/src/index.d.ts.map +1 -1
  238. package/dist/src/index.js +5 -2
  239. package/dist/src/index.js.map +1 -1
  240. package/dist/src/jsx-runtime.d.ts +13 -4
  241. package/dist/src/jsx-runtime.d.ts.map +1 -1
  242. package/dist/src/jsx-runtime.js +14 -8
  243. package/dist/src/jsx-runtime.js.map +1 -1
  244. package/dist/src/output-types.d.ts +40 -0
  245. package/dist/src/output-types.d.ts.map +1 -0
  246. package/dist/src/output-types.js +2 -0
  247. package/dist/src/output-types.js.map +1 -0
  248. package/dist/src/reactivity.d.ts +49 -18
  249. package/dist/src/reactivity.d.ts.map +1 -1
  250. package/dist/src/reactivity.js +155 -13
  251. package/dist/src/reactivity.js.map +1 -1
  252. package/dist/src/render/get-string-width.d.ts +19 -0
  253. package/dist/src/render/get-string-width.d.ts.map +1 -0
  254. package/dist/src/render/get-string-width.js +61 -0
  255. package/dist/src/render/get-string-width.js.map +1 -0
  256. package/dist/src/render/index.d.ts +2 -0
  257. package/dist/src/render/index.d.ts.map +1 -0
  258. package/dist/src/render/index.js +2 -0
  259. package/dist/src/render/index.js.map +1 -0
  260. package/dist/src/render/node-context.d.ts +5 -0
  261. package/dist/src/render/node-context.d.ts.map +1 -0
  262. package/dist/src/render/node-context.js +7 -0
  263. package/dist/src/render/node-context.js.map +1 -0
  264. package/dist/src/render/node.d.ts +146 -0
  265. package/dist/src/render/node.d.ts.map +1 -0
  266. package/dist/src/render/node.js +386 -0
  267. package/dist/src/render/node.js.map +1 -0
  268. package/dist/src/render/printer-support.d.ts +50 -0
  269. package/dist/src/render/printer-support.d.ts.map +1 -0
  270. package/dist/src/render/printer-support.js +180 -0
  271. package/dist/src/render/printer-support.js.map +1 -0
  272. package/dist/src/render/printer.d.ts +35 -0
  273. package/dist/src/render/printer.d.ts.map +1 -0
  274. package/dist/src/render/printer.js +797 -0
  275. package/dist/src/render/printer.js.map +1 -0
  276. package/dist/src/render-error.d.ts +4 -0
  277. package/dist/src/render-error.d.ts.map +1 -0
  278. package/dist/src/render-error.js +79 -0
  279. package/dist/src/render-error.js.map +1 -0
  280. package/dist/src/render-output.d.ts +42 -0
  281. package/dist/src/render-output.d.ts.map +1 -0
  282. package/dist/src/render-output.js +209 -0
  283. package/dist/src/render-output.js.map +1 -0
  284. package/dist/src/runtime/component.d.ts +2 -2
  285. package/dist/src/runtime/component.d.ts.map +1 -1
  286. package/dist/src/runtime/create-intrinsic.d.ts +28 -0
  287. package/dist/src/runtime/create-intrinsic.d.ts.map +1 -0
  288. package/dist/src/runtime/create-intrinsic.js +53 -0
  289. package/dist/src/runtime/create-intrinsic.js.map +1 -0
  290. package/dist/src/runtime/fragment.d.ts +16 -0
  291. package/dist/src/runtime/fragment.d.ts.map +1 -0
  292. package/dist/src/runtime/fragment.js +21 -0
  293. package/dist/src/runtime/fragment.js.map +1 -0
  294. package/dist/src/runtime/index.d.ts +12 -0
  295. package/dist/src/runtime/index.d.ts.map +1 -0
  296. package/dist/src/runtime/index.js +13 -0
  297. package/dist/src/runtime/index.js.map +1 -0
  298. package/dist/src/runtime/insert.d.ts +29 -0
  299. package/dist/src/runtime/insert.d.ts.map +1 -0
  300. package/dist/src/runtime/insert.js +453 -0
  301. package/dist/src/runtime/insert.js.map +1 -0
  302. package/dist/src/runtime/intrinsic.d.ts +12 -29
  303. package/dist/src/runtime/intrinsic.d.ts.map +1 -1
  304. package/dist/src/runtime/intrinsic.js +1 -11
  305. package/dist/src/runtime/intrinsic.js.map +1 -1
  306. package/dist/src/scheduler.d.ts.map +1 -1
  307. package/dist/src/scheduler.js +38 -14
  308. package/dist/src/scheduler.js.map +1 -1
  309. package/dist/src/stc.d.ts.map +1 -1
  310. package/dist/src/stc.js +2 -0
  311. package/dist/src/stc.js.map +1 -1
  312. package/dist/src/sti.d.ts +7 -6
  313. package/dist/src/sti.d.ts.map +1 -1
  314. package/dist/src/sti.js +1 -1
  315. package/dist/src/sti.js.map +1 -1
  316. package/dist/src/symbols/symbol-slot.test.js +5 -5
  317. package/dist/src/symbols/symbol-slot.test.js.map +1 -1
  318. package/dist/src/test-render.d.ts +31 -0
  319. package/dist/src/test-render.d.ts.map +1 -0
  320. package/dist/src/test-render.js +78 -0
  321. package/dist/src/test-render.js.map +1 -0
  322. package/dist/src/utils.d.ts +1 -1
  323. package/dist/src/utils.d.ts.map +1 -1
  324. package/dist/src/utils.js +40 -28
  325. package/dist/src/utils.js.map +1 -1
  326. package/dist/src/write-output.d.ts +1 -1
  327. package/dist/src/write-output.d.ts.map +1 -1
  328. package/dist/test/babel-e2e.test.d.ts +13 -0
  329. package/dist/test/babel-e2e.test.d.ts.map +1 -0
  330. package/dist/test/babel-e2e.test.js +218 -0
  331. package/dist/test/babel-e2e.test.js.map +1 -0
  332. package/dist/test/children.test.js +5 -7
  333. package/dist/test/children.test.js.map +1 -1
  334. package/dist/test/components/append-file.test.d.ts +1 -1
  335. package/dist/test/components/append-file.test.d.ts.map +1 -1
  336. package/dist/test/components/append-file.test.js +0 -1
  337. package/dist/test/components/append-file.test.js.map +1 -1
  338. package/dist/test/components/block.test.d.ts +1 -1
  339. package/dist/test/components/block.test.d.ts.map +1 -1
  340. package/dist/test/components/block.test.js +4 -6
  341. package/dist/test/components/block.test.js.map +1 -1
  342. package/dist/test/components/copy-file.test.d.ts +1 -1
  343. package/dist/test/components/copy-file.test.d.ts.map +1 -1
  344. package/dist/test/components/copy-file.test.js +1 -2
  345. package/dist/test/components/copy-file.test.js.map +1 -1
  346. package/dist/test/components/declaration.test.js +2 -2
  347. package/dist/test/components/declaration.test.js.map +1 -1
  348. package/dist/test/components/list.test.d.ts +1 -1
  349. package/dist/test/components/list.test.d.ts.map +1 -1
  350. package/dist/test/components/list.test.js +20 -22
  351. package/dist/test/components/list.test.js.map +1 -1
  352. package/dist/test/components/prose.test.d.ts +1 -1
  353. package/dist/test/components/prose.test.d.ts.map +1 -1
  354. package/dist/test/components/prose.test.js +0 -1
  355. package/dist/test/components/prose.test.js.map +1 -1
  356. package/dist/test/components/reference-or-content.test.js +8 -9
  357. package/dist/test/components/reference-or-content.test.js.map +1 -1
  358. package/dist/test/components/source-file.test.d.ts +1 -1
  359. package/dist/test/components/source-file.test.d.ts.map +1 -1
  360. package/dist/test/components/source-file.test.js +5 -4
  361. package/dist/test/components/source-file.test.js.map +1 -1
  362. package/dist/test/components/template-file.test.d.ts +1 -1
  363. package/dist/test/components/template-file.test.d.ts.map +1 -1
  364. package/dist/test/components/template-file.test.js +0 -1
  365. package/dist/test/components/template-file.test.js.map +1 -1
  366. package/dist/test/components/update-file.test.d.ts +1 -1
  367. package/dist/test/components/update-file.test.d.ts.map +1 -1
  368. package/dist/test/components/update-file.test.js +1 -2
  369. package/dist/test/components/update-file.test.js.map +1 -1
  370. package/dist/test/components/wrap.test.d.ts +1 -1
  371. package/dist/test/components/wrap.test.d.ts.map +1 -1
  372. package/dist/test/components/wrap.test.js +3 -5
  373. package/dist/test/components/wrap.test.js.map +1 -1
  374. package/dist/test/control-flow/for.test.d.ts +1 -1
  375. package/dist/test/control-flow/for.test.d.ts.map +1 -1
  376. package/dist/test/control-flow/for.test.js +40 -24
  377. package/dist/test/control-flow/for.test.js.map +1 -1
  378. package/dist/test/control-flow/match.test.d.ts +1 -1
  379. package/dist/test/control-flow/match.test.d.ts.map +1 -1
  380. package/dist/test/control-flow/match.test.js +4 -6
  381. package/dist/test/control-flow/match.test.js.map +1 -1
  382. package/dist/test/control-flow/show.test.d.ts +1 -1
  383. package/dist/test/control-flow/show.test.d.ts.map +1 -1
  384. package/dist/test/control-flow/show.test.js +3 -6
  385. package/dist/test/control-flow/show.test.js.map +1 -1
  386. package/dist/test/lazy-isempty.test.d.ts +1 -1
  387. package/dist/test/lazy-isempty.test.d.ts.map +1 -1
  388. package/dist/test/lazy-isempty.test.js +16 -18
  389. package/dist/test/lazy-isempty.test.js.map +1 -1
  390. package/dist/test/name-policy.test.d.ts +1 -1
  391. package/dist/test/name-policy.test.d.ts.map +1 -1
  392. package/dist/test/name-policy.test.js +0 -1
  393. package/dist/test/name-policy.test.js.map +1 -1
  394. package/dist/test/node.test.d.ts +2 -0
  395. package/dist/test/node.test.d.ts.map +1 -0
  396. package/dist/test/node.test.js +80 -0
  397. package/dist/test/node.test.js.map +1 -0
  398. package/dist/test/output-e2e.test.d.ts +13 -0
  399. package/dist/test/output-e2e.test.d.ts.map +1 -0
  400. package/dist/test/output-e2e.test.js +194 -0
  401. package/dist/test/output-e2e.test.js.map +1 -0
  402. package/dist/test/reactivity/circular-reactives.test.js +6 -6
  403. package/dist/test/reactivity/circular-reactives.test.js.map +1 -1
  404. package/dist/test/reactivity/cleanup.test.js +2 -3
  405. package/dist/test/reactivity/cleanup.test.js.map +1 -1
  406. package/dist/test/reactivity/ref-rendering.test.js +15 -15
  407. package/dist/test/reactivity/ref-rendering.test.js.map +1 -1
  408. package/dist/test/reactivity/test.test.js +15 -15
  409. package/dist/test/reactivity/test.test.js.map +1 -1
  410. package/dist/test/rendering/basic.test.d.ts +1 -1
  411. package/dist/test/rendering/basic.test.d.ts.map +1 -1
  412. package/dist/test/rendering/basic.test.js +0 -1
  413. package/dist/test/rendering/basic.test.js.map +1 -1
  414. package/dist/test/rendering/code.test.d.ts +1 -1
  415. package/dist/test/rendering/code.test.d.ts.map +1 -1
  416. package/dist/test/rendering/code.test.js +0 -1
  417. package/dist/test/rendering/code.test.js.map +1 -1
  418. package/dist/test/rendering/formatting.test.d.ts +1 -1
  419. package/dist/test/rendering/formatting.test.d.ts.map +1 -1
  420. package/dist/test/rendering/formatting.test.js +17 -23
  421. package/dist/test/rendering/formatting.test.js.map +1 -1
  422. package/dist/test/rendering/indent.test.d.ts +1 -1
  423. package/dist/test/rendering/indent.test.d.ts.map +1 -1
  424. package/dist/test/rendering/indent.test.js +0 -1
  425. package/dist/test/rendering/indent.test.js.map +1 -1
  426. package/dist/test/rendering/memoization.test.js +7 -3
  427. package/dist/test/rendering/memoization.test.js.map +1 -1
  428. package/dist/test/rendering/print-render-stack.test.d.ts +1 -1
  429. package/dist/test/rendering/print-render-stack.test.d.ts.map +1 -1
  430. package/dist/test/rendering/print-render-stack.test.js +0 -1
  431. package/dist/test/rendering/print-render-stack.test.js.map +1 -1
  432. package/dist/test/rendering/refkeys.test.d.ts +1 -1
  433. package/dist/test/rendering/refkeys.test.d.ts.map +1 -1
  434. package/dist/test/rendering/refkeys.test.js +0 -1
  435. package/dist/test/rendering/refkeys.test.js.map +1 -1
  436. package/dist/test/rendering/render-output-diagnostics.test.d.ts +2 -0
  437. package/dist/test/rendering/render-output-diagnostics.test.d.ts.map +1 -0
  438. package/dist/test/rendering/render-output-diagnostics.test.js +82 -0
  439. package/dist/test/rendering/render-output-diagnostics.test.js.map +1 -0
  440. package/dist/test/runtime.test.d.ts +11 -0
  441. package/dist/test/runtime.test.d.ts.map +1 -0
  442. package/dist/test/runtime.test.js +385 -0
  443. package/dist/test/runtime.test.js.map +1 -0
  444. package/dist/test/stc.test.d.ts +1 -1
  445. package/dist/test/stc.test.d.ts.map +1 -1
  446. package/dist/test/stc.test.js +0 -1
  447. package/dist/test/stc.test.js.map +1 -1
  448. package/dist/test/tree-test-utils.d.ts +3 -0
  449. package/dist/test/tree-test-utils.d.ts.map +1 -0
  450. package/dist/test/tree-test-utils.js +16 -0
  451. package/dist/test/tree-test-utils.js.map +1 -0
  452. package/dist/test/utils.test.d.ts +1 -1
  453. package/dist/test/utils.test.d.ts.map +1 -1
  454. package/dist/test/utils.test.js +12 -11
  455. package/dist/test/utils.test.js.map +1 -1
  456. package/dist/test/vitest.setup.d.ts +2 -0
  457. package/dist/test/vitest.setup.d.ts.map +1 -0
  458. package/dist/test/vitest.setup.js +2 -0
  459. package/dist/test/vitest.setup.js.map +1 -0
  460. package/dist/testing/devtools-utils.d.ts.map +1 -1
  461. package/dist/testing/devtools-utils.js +1 -1
  462. package/dist/testing/devtools-utils.js.map +1 -1
  463. package/dist/testing/extend-expect.d.ts.map +1 -1
  464. package/dist/testing/extend-expect.js +30 -34
  465. package/dist/testing/extend-expect.js.map +1 -1
  466. package/dist/testing/render.d.ts +7 -9
  467. package/dist/testing/render.d.ts.map +1 -1
  468. package/dist/testing/render.js +7 -17
  469. package/dist/testing/render.js.map +1 -1
  470. package/dist/tsconfig.tsbuildinfo +1 -1
  471. package/docs/api/components/Output.md +0 -3
  472. package/docs/api/components/SourceFile.md +0 -3
  473. package/docs/api/functions/createComment.md +18 -0
  474. package/docs/api/functions/createElement.md +19 -0
  475. package/docs/api/functions/createFragment.md +17 -0
  476. package/docs/api/functions/createTextNode.md +18 -0
  477. package/docs/api/functions/emitDiagnosticForTree.md +19 -0
  478. package/docs/api/functions/ensureIsEmpty.md +1 -1
  479. package/docs/api/functions/getContextForNode.md +18 -0
  480. package/docs/api/functions/getContextForRenderNode.md +4 -4
  481. package/docs/api/functions/getDiagnosticsForTree.md +7 -5
  482. package/docs/api/functions/getRegisteredDiagnosticsForTree.md +18 -0
  483. package/docs/api/functions/index.md +17 -12
  484. package/docs/api/functions/isCustomContext.md +4 -4
  485. package/docs/api/functions/notifyContentState.md +6 -0
  486. package/docs/api/functions/printTree.md +6 -16
  487. package/docs/api/functions/registerDiagnosticsForTree.md +19 -0
  488. package/docs/api/functions/render.md +1 -2
  489. package/docs/api/functions/renderAsync.md +1 -2
  490. package/docs/api/functions/renderTree.md +8 -5
  491. package/docs/api/functions/reportDiagnosticsForTree.md +18 -0
  492. package/docs/api/functions/runInContext.md +28 -0
  493. package/docs/api/functions/sourceFilesForTree.md +6 -16
  494. package/docs/api/index.md +3 -3
  495. package/docs/api/testing/functions/index.md +1 -1
  496. package/docs/api/testing/functions/renderToString.md +1 -1
  497. package/docs/api/types/AlloyNode.md +22 -0
  498. package/docs/api/types/Child.md +1 -1
  499. package/docs/api/types/CommentNode.md +15 -0
  500. package/docs/api/types/Context.md +13 -15
  501. package/docs/api/types/ElementNode.md +18 -0
  502. package/docs/api/types/FragmentNode.md +12 -0
  503. package/docs/api/types/Insertable.md +7 -0
  504. package/docs/api/types/NodeType.md +5 -0
  505. package/docs/api/types/OutputDirectory.md +0 -50
  506. package/docs/api/types/PrintTreeOptions.md +0 -1
  507. package/docs/api/types/RenderTreeOptions.md +7 -0
  508. package/docs/api/types/StiComponentCreator.md +4 -4
  509. package/docs/api/types/StiSignature.md +1 -1
  510. package/docs/api/types/TextNode.md +16 -0
  511. package/docs/api/types/index.md +10 -28
  512. package/docs/api/variables/COMMENT_NODE.md +5 -0
  513. package/docs/api/variables/ELEMENT_NODE.md +11 -0
  514. package/docs/api/variables/FRAGMENT_NODE.md +5 -0
  515. package/docs/api/variables/TEXT_NODE.md +5 -0
  516. package/docs/api/variables/index.md +4 -2
  517. package/docs/formatting.md +1 -1
  518. package/docs/rendering.md +4 -4
  519. package/package.json +6 -6
  520. package/src/components/AccessExpression.test.tsx +5 -13
  521. package/src/components/Output.tsx +2 -1
  522. package/src/components/SourceFile.tsx +1 -1
  523. package/src/content-slot.test.tsx +8 -10
  524. package/src/context/format-options.ts +1 -1
  525. package/src/context.ts +37 -4
  526. package/src/debug/diagnostics.test.tsx +1 -1
  527. package/src/debug/effects.test.tsx +1 -1
  528. package/src/debug/file-streaming.ts +115 -0
  529. package/src/debug/files.test.tsx +15 -11
  530. package/src/debug/index.ts +11 -11
  531. package/src/debug/message-format.test.tsx +32 -19
  532. package/src/debug/render-tree-orphans.test.tsx +10 -19
  533. package/src/debug/render.test.tsx +206 -78
  534. package/src/debug/render.ts +642 -495
  535. package/src/debug/trace-writer.ts +168 -14
  536. package/src/debug/trace.ts +0 -20
  537. package/src/devtools/devtools-protocol.ts +43 -0
  538. package/src/devtools/devtools-server.ts +57 -32
  539. package/src/devtools-entry.browser.ts +5 -0
  540. package/src/devtools-entry.ts +5 -0
  541. package/src/diagnostics.ts +31 -0
  542. package/src/index.ts +66 -2
  543. package/src/jsx-runtime.ts +16 -14
  544. package/src/output-types.ts +47 -0
  545. package/src/reactivity.ts +186 -40
  546. package/src/render/get-string-width.ts +201 -0
  547. package/src/render/index.ts +1 -0
  548. package/src/render/node-context.ts +14 -0
  549. package/src/render/node.ts +442 -0
  550. package/src/render/printer-support.ts +209 -0
  551. package/src/render/printer.ts +817 -0
  552. package/src/render-error.ts +98 -0
  553. package/src/render-output.ts +243 -0
  554. package/src/runtime/component.ts +2 -2
  555. package/src/runtime/create-intrinsic.ts +56 -0
  556. package/src/runtime/fragment.ts +22 -0
  557. package/src/runtime/index.ts +12 -0
  558. package/src/runtime/insert.ts +569 -0
  559. package/src/runtime/intrinsic.ts +14 -70
  560. package/src/scheduler.ts +40 -25
  561. package/src/stc.ts +3 -0
  562. package/src/sti.ts +17 -20
  563. package/src/symbols/symbol-slot.test.tsx +5 -5
  564. package/src/test-render.ts +103 -0
  565. package/src/utils.tsx +55 -37
  566. package/src/write-output.ts +1 -1
  567. package/temp/api-testing.json +390 -14
  568. package/temp/api.json +4320 -4144
  569. package/test/babel-e2e.test.ts +224 -0
  570. package/test/children.test.tsx +4 -7
  571. package/test/components/append-file.test.tsx +0 -1
  572. package/test/components/block.test.tsx +4 -6
  573. package/test/components/copy-file.test.tsx +2 -2
  574. package/test/components/declaration.test.tsx +2 -2
  575. package/test/components/list.test.tsx +20 -29
  576. package/test/components/prose.test.tsx +0 -1
  577. package/test/components/reference-or-content.test.tsx +8 -9
  578. package/test/components/source-file.test.tsx +4 -4
  579. package/test/components/template-file.test.tsx +0 -1
  580. package/test/components/update-file.test.tsx +1 -2
  581. package/test/components/wrap.test.tsx +3 -5
  582. package/test/control-flow/for.test.tsx +39 -31
  583. package/test/control-flow/match.test.tsx +4 -6
  584. package/test/control-flow/show.test.tsx +3 -6
  585. package/test/lazy-isempty.test.tsx +17 -19
  586. package/test/name-policy.test.tsx +0 -1
  587. package/test/node.test.ts +90 -0
  588. package/test/output-e2e.test.ts +198 -0
  589. package/test/reactivity/circular-reactives.test.tsx +6 -6
  590. package/test/reactivity/cleanup.test.tsx +2 -3
  591. package/test/reactivity/ref-rendering.test.tsx +15 -15
  592. package/test/reactivity/test.test.tsx +14 -14
  593. package/test/rendering/basic.test.tsx +0 -1
  594. package/test/rendering/code.test.tsx +0 -1
  595. package/test/rendering/formatting.test.tsx +21 -29
  596. package/test/rendering/indent.test.tsx +0 -1
  597. package/test/rendering/memoization.test.tsx +7 -3
  598. package/test/rendering/print-render-stack.test.tsx +0 -1
  599. package/test/rendering/refkeys.test.tsx +0 -1
  600. package/test/rendering/render-output-diagnostics.test.tsx +120 -0
  601. package/test/runtime.test.ts +448 -0
  602. package/test/stc.test.tsx +0 -1
  603. package/test/tree-test-utils.ts +23 -0
  604. package/test/utils.test.tsx +10 -9
  605. package/test/vitest.setup.ts +1 -0
  606. package/testing/devtools-utils.ts +2 -0
  607. package/testing/extend-expect.ts +32 -47
  608. package/testing/render.ts +17 -21
  609. package/vitest.config.ts +3 -0
  610. package/dist/dev/src/print-hook.js +0 -10
  611. package/dist/dev/src/print-hook.js.map +0 -1
  612. package/dist/dev/src/render.js +0 -872
  613. package/dist/dev/src/render.js.map +0 -1
  614. package/dist/src/print-hook.d.ts +0 -14
  615. package/dist/src/print-hook.d.ts.map +0 -1
  616. package/dist/src/print-hook.js +0 -10
  617. package/dist/src/print-hook.js.map +0 -1
  618. package/dist/src/render.d.ts +0 -155
  619. package/dist/src/render.d.ts.map +0 -1
  620. package/dist/src/render.js +0 -872
  621. package/dist/src/render.js.map +0 -1
  622. package/docs/api/functions/createIntrinsic.md +0 -19
  623. package/docs/api/functions/createRenderTreeHook.md +0 -19
  624. package/docs/api/functions/getElementCache.md +0 -17
  625. package/docs/api/functions/isIntrinsicElement.md +0 -18
  626. package/docs/api/functions/isPrintHook.md +0 -18
  627. package/docs/api/types/AlignIntrinsicElement.md +0 -5
  628. package/docs/api/types/BrIntrinsicElement.md +0 -5
  629. package/docs/api/types/BreakParentIntrinsicElement.md +0 -5
  630. package/docs/api/types/DedentIntrinsicElement.md +0 -5
  631. package/docs/api/types/DedentToRootIntrinsicElement.md +0 -5
  632. package/docs/api/types/ElementCache.md +0 -5
  633. package/docs/api/types/ElementCacheKey.md +0 -5
  634. package/docs/api/types/FillIntrinsicElement.md +0 -5
  635. package/docs/api/types/GroupIntrinsicElement.md +0 -5
  636. package/docs/api/types/HardlineIntrinsicElement.md +0 -5
  637. package/docs/api/types/HbrIntrinsicElement.md +0 -5
  638. package/docs/api/types/IfBreakIntrinsicElement.md +0 -5
  639. package/docs/api/types/IndentIfBreakIntrinsicElement.md +0 -5
  640. package/docs/api/types/IndentIntrinsicElement.md +0 -5
  641. package/docs/api/types/IntrinsicElement.md +0 -5
  642. package/docs/api/types/IntrinsicElementBase.md +0 -9
  643. package/docs/api/types/LbrIntrinsicElement.md +0 -5
  644. package/docs/api/types/LineIntrinsicElement.md +0 -5
  645. package/docs/api/types/LineSuffixBoundaryIntrinsicElement.md +0 -5
  646. package/docs/api/types/LineSuffixIntrinsicElement.md +0 -5
  647. package/docs/api/types/LiterallineIntrinsicElement.md +0 -5
  648. package/docs/api/types/MarkAsRootIntrinsicElement.md +0 -5
  649. package/docs/api/types/PrintHook.md +0 -10
  650. package/docs/api/types/RenderedTextTree.md +0 -5
  651. package/docs/api/types/SbrIntrinsicElement.md +0 -5
  652. package/docs/api/types/SoftlineIntrinsicElement.md +0 -5
  653. package/docs/api/variables/intrinsicElementKey.md +0 -5
  654. package/docs/api/variables/printHookTag.md +0 -7
  655. package/src/print-hook.ts +0 -22
  656. package/src/render.ts +0 -1154
@@ -23,6 +23,11 @@ let stmtInsertRenderNode: StatementSync;
23
23
  let stmtUpdateRenderNode: StatementSync;
24
24
  let stmtUpdateRenderNodeContext: StatementSync;
25
25
  let stmtDeleteRenderNode: StatementSync;
26
+ let stmtInsertComponentInstance: StatementSync;
27
+ let stmtUpdateComponentInstanceProps: StatementSync;
28
+ let stmtDeleteComponentInstance: StatementSync;
29
+ let stmtInsertComponentRoot: StatementSync;
30
+ let stmtDeleteComponentRoot: StatementSync;
26
31
  let stmtInsertSymbol: StatementSync;
27
32
  let stmtUpdateSymbol: StatementSync;
28
33
  let stmtDeleteSymbol: StatementSync;
@@ -47,9 +52,7 @@ export function nextSeq(): number {
47
52
  return seq++;
48
53
  }
49
54
 
50
- // ─────────────────────────────────────────────────────────────────────────────
51
- // Change notification bus — streams SQLite changes to devtools WS server
52
- // ─────────────────────────────────────────────────────────────────────────────
55
+ // #region Change notification bus
53
56
 
54
57
  export type ChangeChannel =
55
58
  | "render"
@@ -63,7 +66,9 @@ export type ChangeChannel =
63
66
  | "diagnostics"
64
67
  | "errors"
65
68
  | "lifecycle"
66
- | "scheduler";
69
+ | "scheduler"
70
+ | "components"
71
+ | "component_roots";
67
72
 
68
73
  export const ALL_CHANNELS: ChangeChannel[] = [
69
74
  "render",
@@ -78,6 +83,8 @@ export const ALL_CHANNELS: ChangeChannel[] = [
78
83
  "errors",
79
84
  "lifecycle",
80
85
  "scheduler",
86
+ "components",
87
+ "component_roots",
81
88
  ];
82
89
 
83
90
  export interface ChangeEvent {
@@ -115,6 +122,8 @@ const channelTableMap: Record<string, string> = {
115
122
  diagnostics: "diagnostics",
116
123
  errors: "render_errors",
117
124
  scheduler: "scheduler_jobs",
125
+ components: "component_instances",
126
+ component_roots: "component_roots",
118
127
  };
119
128
 
120
129
  export function queryChannel(
@@ -124,7 +133,7 @@ export function queryChannel(
124
133
  const table = channelTableMap[channel];
125
134
  if (!table) return [];
126
135
  if (!/^[a-z_]+$/.test(table)) return [];
127
- return db.prepare(`SELECT * FROM ${table}`).all() as Record<
136
+ return db.prepare(`SELECT * FROM ${table} ORDER BY seq`).all() as Record<
128
137
  string,
129
138
  unknown
130
139
  >[];
@@ -215,6 +224,31 @@ function createSchema(): void {
215
224
  CREATE INDEX IF NOT EXISTS idx_render_nodes_parent ON render_nodes(parent_id);
216
225
  CREATE INDEX IF NOT EXISTS idx_render_nodes_context ON render_nodes(context_id);
217
226
 
227
+ CREATE TABLE IF NOT EXISTS component_instances (
228
+ id INTEGER PRIMARY KEY,
229
+ parent_id INTEGER,
230
+ name TEXT NOT NULL,
231
+ props TEXT,
232
+ source_file TEXT,
233
+ source_line INTEGER,
234
+ source_col INTEGER,
235
+ context_id INTEGER,
236
+ seq INTEGER
237
+ );
238
+ CREATE INDEX IF NOT EXISTS idx_component_instances_parent ON component_instances(parent_id);
239
+ CREATE INDEX IF NOT EXISTS idx_component_instances_name ON component_instances(name);
240
+ CREATE INDEX IF NOT EXISTS idx_component_instances_context ON component_instances(context_id);
241
+
242
+ CREATE TABLE IF NOT EXISTS component_roots (
243
+ component_id INTEGER NOT NULL,
244
+ render_node_id INTEGER NOT NULL,
245
+ ordinal INTEGER NOT NULL,
246
+ seq INTEGER,
247
+ PRIMARY KEY (component_id, render_node_id)
248
+ );
249
+ CREATE INDEX IF NOT EXISTS idx_component_roots_component ON component_roots(component_id);
250
+ CREATE INDEX IF NOT EXISTS idx_component_roots_node ON component_roots(render_node_id);
251
+
218
252
  CREATE TABLE IF NOT EXISTS symbols (
219
253
  id INTEGER PRIMARY KEY,
220
254
  name TEXT NOT NULL,
@@ -339,6 +373,23 @@ function prepareStatements(): void {
339
373
  `UPDATE render_nodes SET context_id = ? WHERE id = ?`,
340
374
  );
341
375
  stmtDeleteRenderNode = db!.prepare(`DELETE FROM render_nodes WHERE id = ?`);
376
+ stmtInsertComponentInstance = db!.prepare(
377
+ `INSERT OR REPLACE INTO component_instances (id, parent_id, name, props, source_file, source_line, source_col, context_id, seq)
378
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
379
+ );
380
+ stmtUpdateComponentInstanceProps = db!.prepare(
381
+ `UPDATE component_instances SET props = ? WHERE id = ?`,
382
+ );
383
+ stmtDeleteComponentInstance = db!.prepare(
384
+ `DELETE FROM component_instances WHERE id = ?`,
385
+ );
386
+ stmtInsertComponentRoot = db!.prepare(
387
+ `INSERT OR REPLACE INTO component_roots (component_id, render_node_id, ordinal, seq)
388
+ VALUES (?, ?, ?, ?)`,
389
+ );
390
+ stmtDeleteComponentRoot = db!.prepare(
391
+ `DELETE FROM component_roots WHERE component_id = ? AND render_node_id = ?`,
392
+ );
342
393
  stmtInsertSymbol = db!.prepare(
343
394
  `INSERT OR REPLACE INTO symbols (id, name, original_name, scope_id, owner_symbol_id, render_node_id, is_member, is_transient, is_alias, metadata, seq)
344
395
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
@@ -385,9 +436,9 @@ function prepareStatements(): void {
385
436
  );
386
437
  }
387
438
 
388
- // ─────────────────────────────────────────────────────────────────────────────
389
- // Insert methods
390
- // ─────────────────────────────────────────────────────────────────────────────
439
+ // #endregion
440
+
441
+ // #region Insert methods
391
442
 
392
443
  export function insertEffect(
393
444
  id: number,
@@ -536,6 +587,10 @@ export function insertSchedulerFlush(jobsRun: number): void {
536
587
  stmtInsertSchedulerFlush.run(nextSeq(), jobsRun);
537
588
  }
538
589
 
590
+ // Track live render IDs and parent -> children edges so duplicate removals are
591
+ // ignored and child sets stay consistent with render-layer lifecycle events.
592
+ const renderChildren = new Map<number, Set<number>>();
593
+ const liveRenderIds = new Set<number>();
539
594
  export function insertRenderNode(
540
595
  id: number,
541
596
  parentId: number | null,
@@ -550,6 +605,15 @@ export function insertRenderNode(
550
605
  ): void {
551
606
  if (!db) return;
552
607
  const s = nextSeq();
608
+ if (parentId !== null) {
609
+ let set = renderChildren.get(parentId);
610
+ if (!set) {
611
+ set = new Set();
612
+ renderChildren.set(parentId, set);
613
+ }
614
+ set.add(id);
615
+ }
616
+ liveRenderIds.add(id);
553
617
  stmtInsertRenderNode.run(
554
618
  id,
555
619
  parentId,
@@ -595,10 +659,94 @@ export function updateRenderNodeContext(id: number, contextId: number): void {
595
659
 
596
660
  export function deleteRenderNode(id: number): void {
597
661
  if (!db) return;
662
+ if (!liveRenderIds.has(id)) return;
663
+ liveRenderIds.delete(id);
664
+ // Detach from parent's child set.
665
+ for (const set of renderChildren.values()) set.delete(id);
666
+ renderChildren.delete(id);
598
667
  stmtDeleteRenderNode.run(id);
599
668
  notifyChange("render", "removed", { id });
600
669
  }
601
670
 
671
+ export function insertComponentInstance(
672
+ id: number,
673
+ parentId: number | null,
674
+ name: string,
675
+ props: string | undefined,
676
+ sourceFile: string | undefined,
677
+ sourceLine: number | undefined,
678
+ sourceCol: number | undefined,
679
+ contextId: number | null,
680
+ ): void {
681
+ if (!db) return;
682
+ const s = nextSeq();
683
+ stmtInsertComponentInstance.run(
684
+ id,
685
+ parentId,
686
+ name,
687
+ props ?? null,
688
+ sourceFile ?? null,
689
+ sourceLine ?? null,
690
+ sourceCol ?? null,
691
+ contextId,
692
+ s,
693
+ );
694
+ notifyChange("components", "added", {
695
+ id,
696
+ parent_id: parentId,
697
+ name,
698
+ props: props ?? null,
699
+ source_file: sourceFile ?? null,
700
+ source_line: sourceLine ?? null,
701
+ source_col: sourceCol ?? null,
702
+ context_id: contextId,
703
+ seq: s,
704
+ });
705
+ }
706
+
707
+ export function updateComponentInstanceProps(
708
+ id: number,
709
+ props: string | undefined,
710
+ ): void {
711
+ if (!db) return;
712
+ stmtUpdateComponentInstanceProps.run(props ?? null, id);
713
+ notifyChange("components", "updated", { id, props: props ?? null });
714
+ }
715
+
716
+ export function deleteComponentInstance(id: number): void {
717
+ if (!db) return;
718
+ stmtDeleteComponentInstance.run(id);
719
+ notifyChange("components", "removed", { id });
720
+ }
721
+
722
+ export function insertComponentRoot(
723
+ componentId: number,
724
+ renderNodeId: number,
725
+ ordinal: number,
726
+ ): void {
727
+ if (!db) return;
728
+ const s = nextSeq();
729
+ stmtInsertComponentRoot.run(componentId, renderNodeId, ordinal, s);
730
+ notifyChange("component_roots", "added", {
731
+ component_id: componentId,
732
+ render_node_id: renderNodeId,
733
+ ordinal,
734
+ seq: s,
735
+ });
736
+ }
737
+
738
+ export function deleteComponentRoot(
739
+ componentId: number,
740
+ renderNodeId: number,
741
+ ): void {
742
+ if (!db) return;
743
+ stmtDeleteComponentRoot.run(componentId, renderNodeId);
744
+ notifyChange("component_roots", "removed", {
745
+ component_id: componentId,
746
+ render_node_id: renderNodeId,
747
+ });
748
+ }
749
+
602
750
  export function insertSymbol(
603
751
  id: number,
604
752
  name: string,
@@ -921,9 +1069,9 @@ export function insertSourceMap(
921
1069
  stmtInsertSourceMap.run(outputPath, mapJson, outputText ?? null);
922
1070
  }
923
1071
 
924
- // ─────────────────────────────────────────────────────────────────────────────
925
- // Transaction helpers
926
- // ─────────────────────────────────────────────────────────────────────────────
1072
+ // #endregion
1073
+
1074
+ // #region Transaction helpers
927
1075
 
928
1076
  export function beginTransaction(): void {
929
1077
  if (!db) return;
@@ -939,15 +1087,19 @@ export function closeTrace(): void {
939
1087
  db?.close();
940
1088
  db = null;
941
1089
  stmtDeleteDiagnostic = undefined;
1090
+ renderChildren.clear();
1091
+ liveRenderIds.clear();
942
1092
  }
943
1093
 
944
1094
  export function resetTrace(): void {
945
1095
  seq = 0;
1096
+ renderChildren.clear();
1097
+ liveRenderIds.clear();
946
1098
  }
947
1099
 
948
- // ─────────────────────────────────────────────────────────────────────────────
949
- // Lifecycle signals — broadcast to all WS clients regardless of subscription
950
- // ─────────────────────────────────────────────────────────────────────────────
1100
+ // #endregion
1101
+
1102
+ // #region Lifecycle signals
951
1103
 
952
1104
  export function notifyRenderReset(): void {
953
1105
  notifyChange("render", "reset", { _signal: "render:reset" } as any);
@@ -960,3 +1112,5 @@ export function notifyRenderComplete(): void {
960
1112
  export function notifyFlushComplete(): void {
961
1113
  notifyChange("lifecycle", "added", { _signal: "flushJobs:complete" } as any);
962
1114
  }
1115
+
1116
+ // #endregion
@@ -197,26 +197,6 @@ export const TracePhase = {
197
197
  subarea: "appendChild",
198
198
  bg: { r: 100, g: 50, b: 0 },
199
199
  },
200
- appendTextNode: {
201
- area: "render",
202
- subarea: "appendChild.textNode",
203
- bg: { r: 100, g: 50, b: 0 },
204
- },
205
- appendCachedFragment: {
206
- area: "render",
207
- subarea: "appendChild.cachedFragment",
208
- bg: { r: 100, g: 50, b: 0 },
209
- },
210
- appendCustomContext: {
211
- area: "render",
212
- subarea: "appendChild.customContext",
213
- bg: { r: 100, g: 50, b: 0 },
214
- },
215
- appendPrintHook: {
216
- area: "render",
217
- subarea: "appendChild.printHook",
218
- bg: { r: 100, g: 50, b: 0 },
219
- },
220
200
  appendComponent: {
221
201
  area: "render",
222
202
  subarea: "appendChild.component",
@@ -209,6 +209,44 @@ export interface RenderNodeRemovedMessage {
209
209
  id: number;
210
210
  }
211
211
 
212
+ export interface ComponentAddedMessage {
213
+ type: "component:added";
214
+ id: number;
215
+ parent_id: number | null;
216
+ name: string;
217
+ props?: string;
218
+ source_file?: string;
219
+ source_line?: number;
220
+ source_col?: number;
221
+ context_id?: number | null;
222
+ seq: number;
223
+ }
224
+
225
+ export interface ComponentUpdatedMessage {
226
+ type: "component:updated";
227
+ id: number;
228
+ props?: string;
229
+ }
230
+
231
+ export interface ComponentRemovedMessage {
232
+ type: "component:removed";
233
+ id: number;
234
+ }
235
+
236
+ export interface ComponentRootAddedMessage {
237
+ type: "component:root_added";
238
+ component_id: number;
239
+ render_node_id: number;
240
+ ordinal: number;
241
+ seq: number;
242
+ }
243
+
244
+ export interface ComponentRootRemovedMessage {
245
+ type: "component:root_removed";
246
+ component_id: number;
247
+ render_node_id: number;
248
+ }
249
+
212
250
  export interface RenderErrorMessage {
213
251
  type: "render:error";
214
252
  name?: string;
@@ -443,6 +481,11 @@ export type ServerToClientMessage =
443
481
  | RenderNodeAddedMessage
444
482
  | RenderNodeUpdatedMessage
445
483
  | RenderNodeRemovedMessage
484
+ | ComponentAddedMessage
485
+ | ComponentUpdatedMessage
486
+ | ComponentRemovedMessage
487
+ | ComponentRootAddedMessage
488
+ | ComponentRootRemovedMessage
446
489
  | RenderErrorMessage
447
490
  | RenderCompleteMessage
448
491
  | FlushJobsCompleteMessage
@@ -20,9 +20,7 @@ import {
20
20
  type DevtoolsTransportState,
21
21
  } from "./devtools-transport.js";
22
22
 
23
- // ─────────────────────────────────────────────────────────────────────────────
24
- // Public types
25
- // ─────────────────────────────────────────────────────────────────────────────
23
+ // #region Public types
26
24
 
27
25
  export interface DevtoolsIncomingMessage {
28
26
  type: string;
@@ -39,9 +37,9 @@ export interface EnableDevtoolsOptions {
39
37
  port?: number;
40
38
  }
41
39
 
42
- // ─────────────────────────────────────────────────────────────────────────────
43
- // Session state
44
- // ─────────────────────────────────────────────────────────────────────────────
40
+ // #endregion
41
+
42
+ // #region Session state
45
43
 
46
44
  let transportState: DevtoolsTransportState | null = null;
47
45
  let transportPromise: Promise<DevtoolsTransportState> | null = null;
@@ -55,9 +53,9 @@ let tempDbPath: string | null = null;
55
53
  let subscribedPromise: Promise<void> | null = null;
56
54
  let resolveSubscribed: (() => void) | null = null;
57
55
 
58
- // ─────────────────────────────────────────────────────────────────────────────
59
- // Per-client subscription state
60
- // ─────────────────────────────────────────────────────────────────────────────
56
+ // #endregion
57
+
58
+ // #region Per-client subscription state
61
59
 
62
60
  interface ClientState {
63
61
  subscriptions: Set<ChangeChannel>;
@@ -73,6 +71,15 @@ function eventToMessageType(event: ChangeEvent): string {
73
71
  removed: "render:node_removed",
74
72
  reset: "render:reset",
75
73
  },
74
+ components: {
75
+ added: "component:added",
76
+ updated: "component:updated",
77
+ removed: "component:removed",
78
+ },
79
+ component_roots: {
80
+ added: "component:root_added",
81
+ removed: "component:root_removed",
82
+ },
76
83
  effects: { added: "effect:added", updated: "effect:updated" },
77
84
  refs: { added: "ref:added" },
78
85
  edges: { added: `edge:${(event.data as any).edge_type ?? "track"}` },
@@ -108,6 +115,8 @@ function channelToInitialMessageType(
108
115
  ): string {
109
116
  const map: Record<string, string> = {
110
117
  render: "render:node_added",
118
+ components: "component:added",
119
+ component_roots: "component:root_added",
111
120
  effects: "effect:added",
112
121
  refs: "ref:added",
113
122
  symbols: "symbol:added",
@@ -141,9 +150,9 @@ function sendInitialState(socket: any, channels: ChangeChannel[]): void {
141
150
  }
142
151
  }
143
152
 
144
- // ─────────────────────────────────────────────────────────────────────────────
145
- // Environment helpers
146
- // ─────────────────────────────────────────────────────────────────────────────
153
+ // #endregion
154
+
155
+ // #region Environment helpers
147
156
 
148
157
  function isNodeEnvironment() {
149
158
  return (
@@ -158,12 +167,24 @@ function isNodeEnvironment() {
158
167
  let _envDebugEnabled: boolean =
159
168
  isNodeEnvironment() && Boolean(process.env.ALLOY_DEBUG);
160
169
 
170
+ // Cached value of `devtoolsExplicitlyEnabled || _envDebugEnabled`. This
171
+ // function is called on hot paths (every effect/scheduler tick), so we
172
+ // avoid recomputing the OR + the `isNodeEnvironment` check on every call.
173
+ // The cache is invalidated whenever either underlying flag mutates.
174
+ let _devtoolsEnabledCache: boolean = isNodeEnvironment() && _envDebugEnabled;
175
+
176
+ function refreshDevtoolsEnabledCache(): void {
177
+ _devtoolsEnabledCache =
178
+ isNodeEnvironment() && (devtoolsExplicitlyEnabled || _envDebugEnabled);
179
+ }
180
+
161
181
  /**
162
182
  * Invalidates the cached env-var result for isDevtoolsEnabled(). Call this in
163
183
  * test beforeEach hooks after modifying process.env.ALLOY_DEBUG.
164
184
  */
165
185
  export function refreshDebugState(): void {
166
186
  _envDebugEnabled = isNodeEnvironment() && Boolean(process.env.ALLOY_DEBUG);
187
+ refreshDevtoolsEnabledCache();
167
188
  }
168
189
 
169
190
  function getCwd() {
@@ -183,14 +204,13 @@ function resolveDebugPort() {
183
204
  return parsed;
184
205
  }
185
206
 
186
- // ─────────────────────────────────────────────────────────────────────────────
187
- // Query functions
188
- // ─────────────────────────────────────────────────────────────────────────────
207
+ // #endregion
208
+
209
+ // #region Query functions
189
210
 
190
211
  /** Returns true when devtools are enabled (via env var or explicit call). */
191
212
  export function isDevtoolsEnabled() {
192
- if (!isNodeEnvironment()) return false;
193
- return devtoolsExplicitlyEnabled || _envDebugEnabled;
213
+ return _devtoolsEnabledCache;
194
214
  }
195
215
 
196
216
  /** Returns true when a devtools client is currently connected. */
@@ -204,9 +224,9 @@ export function getDevtoolsServerInfo(): DevtoolsServerInfo | null {
204
224
  return { port: transportState.port, connected: transportState.connected };
205
225
  }
206
226
 
207
- // ─────────────────────────────────────────────────────────────────────────────
208
- // Temp SQLite for devtools
209
- // ─────────────────────────────────────────────────────────────────────────────
227
+ // #endregion
228
+
229
+ // #region Temp SQLite for devtools
210
230
 
211
231
  async function ensureSqliteForDevtools(): Promise<void> {
212
232
  if (isTraceEnabled()) return;
@@ -236,9 +256,9 @@ async function ensureSqliteForDevtools(): Promise<void> {
236
256
  });
237
257
  }
238
258
 
239
- // ─────────────────────────────────────────────────────────────────────────────
240
- // Server lifecycle
241
- // ─────────────────────────────────────────────────────────────────────────────
259
+ // #endregion
260
+
261
+ // #region Server lifecycle
242
262
 
243
263
  async function ensureServer(): Promise<DevtoolsTransportState> {
244
264
  if (transportState) return transportState;
@@ -350,9 +370,9 @@ async function ensureServer(): Promise<DevtoolsTransportState> {
350
370
  return transportPromise;
351
371
  }
352
372
 
353
- // ─────────────────────────────────────────────────────────────────────────────
354
- // Public API
355
- // ─────────────────────────────────────────────────────────────────────────────
373
+ // #endregion
374
+
375
+ // #region Public API
356
376
 
357
377
  /**
358
378
  * Wait for a devtools client to connect before proceeding.
@@ -371,6 +391,7 @@ async function ensureServer(): Promise<DevtoolsTransportState> {
371
391
  */
372
392
  export async function waitForDevtoolsConnection(): Promise<void> {
373
393
  devtoolsExplicitlyEnabled = true;
394
+ refreshDevtoolsEnabledCache();
374
395
  const server = await ensureServer();
375
396
  if (!server.connected) {
376
397
  await server.ready;
@@ -392,6 +413,7 @@ export async function enableDevtools(
392
413
  options?: EnableDevtoolsOptions,
393
414
  ): Promise<DevtoolsServerInfo> {
394
415
  devtoolsExplicitlyEnabled = true;
416
+ refreshDevtoolsEnabledCache();
395
417
  devtoolsInitialized = true;
396
418
  if (options?.port !== undefined) {
397
419
  configuredPort = options.port;
@@ -435,9 +457,9 @@ export async function enableDevtoolsAndConnect(
435
457
  return { port: transportState!.port, connected: true };
436
458
  }
437
459
 
438
- // ─────────────────────────────────────────────────────────────────────────────
439
- // Messaging
440
- // ─────────────────────────────────────────────────────────────────────────────
460
+ // #endregion
461
+
462
+ // #region Messaging
441
463
 
442
464
  /** Register a handler for incoming devtools messages. Returns an unsubscribe function. */
443
465
  export function registerDevtoolsMessageHandler(
@@ -457,9 +479,9 @@ export function assertDevtoolsConnectedForSyncRender() {
457
479
  }
458
480
  }
459
481
 
460
- // ─────────────────────────────────────────────────────────────────────────────
461
- // Test utilities
462
- // ─────────────────────────────────────────────────────────────────────────────
482
+ // #endregion
483
+
484
+ // #region Test utilities
463
485
 
464
486
  /** Reset all devtools state. For use in tests only. */
465
487
  export async function resetDevtoolsServerForTests() {
@@ -471,6 +493,7 @@ export async function resetDevtoolsServerForTests() {
471
493
  transportState = null;
472
494
  transportPromise = null;
473
495
  devtoolsExplicitlyEnabled = false;
496
+ refreshDevtoolsEnabledCache();
474
497
  devtoolsInitialized = false;
475
498
  configuredPort = undefined;
476
499
  loggedDevtoolsLinks = false;
@@ -481,3 +504,5 @@ export async function resetDevtoolsServerForTests() {
481
504
  // Close the trace DB so each test starts fresh
482
505
  closeTrace();
483
506
  }
507
+
508
+ // #endregion
@@ -1,6 +1,11 @@
1
1
  export type {
2
2
  // Individual server→client message types
3
3
  ClientToServerMessage,
4
+ ComponentAddedMessage,
5
+ ComponentRemovedMessage,
6
+ ComponentRootAddedMessage,
7
+ ComponentRootRemovedMessage,
8
+ ComponentUpdatedMessage,
4
9
  DebuggerInfoMessage,
5
10
  DiagnosticRow,
6
11
  DiagnosticsReportMessage,
@@ -1,6 +1,11 @@
1
1
  export type {
2
2
  // Individual server→client message types
3
3
  ClientToServerMessage,
4
+ ComponentAddedMessage,
5
+ ComponentRemovedMessage,
6
+ ComponentRootAddedMessage,
7
+ ComponentRootRemovedMessage,
8
+ ComponentUpdatedMessage,
4
9
  DebuggerInfoMessage,
5
10
  DiagnosticRow,
6
11
  DiagnosticsReportMessage,
@@ -3,6 +3,7 @@ import {
3
3
  deleteDiagnostic,
4
4
  insertDiagnostic,
5
5
  isTraceEnabled,
6
+ notifyDiagnosticsReport,
6
7
  } from "./debug/trace-writer.js";
7
8
  import { getContext } from "./reactivity.js";
8
9
  import { getRenderStackSnapshot } from "./render-stack.js";
@@ -107,6 +108,36 @@ export class DiagnosticsCollector {
107
108
  }
108
109
 
109
110
  const DIAGNOSTICS_META_KEY = "diagnostics";
111
+ const diagnosticsByTree = new WeakMap<object, DiagnosticsCollector>();
112
+
113
+ export function registerDiagnosticsForTree(
114
+ tree: object,
115
+ collector: DiagnosticsCollector,
116
+ ): void {
117
+ diagnosticsByTree.set(tree, collector);
118
+ }
119
+
120
+ export function getRegisteredDiagnosticsForTree(tree: object): Diagnostic[] {
121
+ return diagnosticsByTree.get(tree)?.getDiagnostics() ?? [];
122
+ }
123
+
124
+ export function emitDiagnosticForTree(
125
+ tree: object,
126
+ input: DiagnosticInput,
127
+ ): DiagnosticHandle {
128
+ return diagnosticsByTree.get(tree)?.emit(input) ?? emitDiagnostic(input);
129
+ }
130
+
131
+ export function reportDiagnosticsForTree(tree: object): void {
132
+ const collector = diagnosticsByTree.get(tree);
133
+ if (!collector) return;
134
+
135
+ const diagnostics = collector.getDiagnostics();
136
+ if (diagnostics.length === 0) return;
137
+
138
+ reportDiagnostics(collector);
139
+ notifyDiagnosticsReport(diagnostics);
140
+ }
110
141
 
111
142
  export function attachDiagnosticsCollector(collector: DiagnosticsCollector) {
112
143
  const context = getContext();