@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
@@ -1,14 +1,7 @@
1
- import "@alloy-js/core/testing";
2
1
  import { d } from "@alloy-js/core/testing";
3
2
  import { describe, expect, it } from "vitest";
4
3
  import { For } from "../../src/components/For.jsx";
5
- import {
6
- onCleanup,
7
- printTree,
8
- reactive,
9
- ref,
10
- renderTree,
11
- } from "../../src/index.js";
4
+ import { onCleanup, reactive, ref } from "../../src/index.js";
12
5
  import { flushJobs } from "../../src/scheduler.js";
13
6
 
14
7
  it("works", () => {
@@ -103,14 +96,18 @@ it("doesn't rerender mappers", () => {
103
96
  const messages = reactive(["hi", "bye"]);
104
97
  let count = 0;
105
98
  const template = <For each={messages}>{() => <>item {count++}</>}</For>;
106
- const tree = renderTree(template);
99
+ const tree = <>{template}</>;
100
+ expect(tree).toRenderTo(`
101
+ item 0
102
+ item 1
103
+ `);
107
104
  expect(count).toBe(2);
108
105
 
109
106
  messages.push("maybe");
110
107
  flushJobs();
111
108
 
112
109
  expect(count).toBe(3);
113
- expect(printTree(tree)).toBe(d`
110
+ expect(tree).toRenderTo(`
114
111
  item 0
115
112
  item 1
116
113
  item 2
@@ -121,13 +118,17 @@ it("doesn't rerender mappers with sets", () => {
121
118
  const messages = reactive(new Set(["hi", "bye"]));
122
119
  let count = 0;
123
120
  const template = <For each={messages}>{() => <>item {count++}</>}</For>;
124
- const tree = renderTree(template);
121
+ const tree = <>{template}</>;
122
+ expect(tree).toRenderTo(`
123
+ item 0
124
+ item 1
125
+ `);
125
126
  expect(count).toBe(2);
126
127
 
127
128
  messages.add("maybe");
128
129
  flushJobs();
129
130
  expect(count).toBe(3);
130
- expect(printTree(tree)).toBe(d`
131
+ expect(tree).toRenderTo(`
131
132
  item 0
132
133
  item 1
133
134
  item 2
@@ -144,13 +145,17 @@ it("doesn't rerender mappers with maps", () => {
144
145
 
145
146
  let count = 0;
146
147
  const template = <For each={messages}>{() => <>item {count++}</>}</For>;
147
- const tree = renderTree(template);
148
+ const tree = <>{template}</>;
149
+ expect(tree).toRenderTo(`
150
+ item 0
151
+ item 1
152
+ `);
148
153
  expect(count).toBe(2);
149
154
 
150
155
  messages.set("maybe", "three");
151
156
  flushJobs();
152
157
  expect(count).toBe(3);
153
- expect(printTree(tree)).toBe(d`
158
+ expect(tree).toRenderTo(`
154
159
  item 0
155
160
  item 1
156
161
  item 2
@@ -167,7 +172,12 @@ it("doesn't rerender mappers (with splice)", () => {
167
172
  }}
168
173
  </For>
169
174
  );
170
- const tree = renderTree(template);
175
+ const tree = <>{template}</>;
176
+ expect(tree).toRenderTo(`
177
+ item 0
178
+ item 1
179
+ item 2
180
+ `);
171
181
  expect(count).toBe(3);
172
182
  messages.splice(1, 1);
173
183
  flushJobs();
@@ -175,7 +185,7 @@ it("doesn't rerender mappers (with splice)", () => {
175
185
  // but for now we re-render everything after the splice point.
176
186
  expect(count).toBe(4);
177
187
 
178
- expect(printTree(tree)).toBe(d`
188
+ expect(tree).toRenderTo(`
179
189
  item 0
180
190
  item 3
181
191
  `);
@@ -196,10 +206,10 @@ it("cleans up things which end up removed (with push)", () => {
196
206
 
197
207
  const template = <For each={items}>{(item) => <Letter letter={item} />}</For>;
198
208
 
199
- const tree = renderTree(template);
209
+ const tree = <>{template}</>;
200
210
 
201
211
  expect(cleanups).toEqual([]);
202
- expect(printTree(tree)).toBe(d`
212
+ expect(tree).toRenderTo(`
203
213
  Letter a
204
214
  Letter b
205
215
  `);
@@ -207,14 +217,14 @@ it("cleans up things which end up removed (with push)", () => {
207
217
  items.pop();
208
218
  flushJobs();
209
219
  expect(cleanups).toEqual(["b"]);
210
- expect(printTree(tree)).toBe(d`
220
+ expect(tree).toRenderTo(`
211
221
  Letter a
212
222
  `);
213
223
 
214
224
  items.pop();
215
225
  flushJobs();
216
226
  expect(cleanups).toEqual(["b", "a"]);
217
- expect(printTree(tree)).toBe("");
227
+ expect(tree).toRenderTo("");
218
228
  });
219
229
 
220
230
  it("cleans up things which end up removed (with splice)", () => {
@@ -232,10 +242,10 @@ it("cleans up things which end up removed (with splice)", () => {
232
242
 
233
243
  const template = <For each={items}>{(item) => <Letter letter={item} />}</For>;
234
244
 
235
- const tree = renderTree(template);
245
+ const tree = <>{template}</>;
236
246
 
237
247
  expect(cleanups).toEqual([]);
238
- expect(printTree(tree)).toBe(d`
248
+ expect(tree).toRenderTo(`
239
249
  Letter a
240
250
  Letter b
241
251
  Letter c
@@ -246,7 +256,7 @@ it("cleans up things which end up removed (with splice)", () => {
246
256
  // A sufficiently smart mapJoin would be able to handle this case...
247
257
  // but for now we re-render everything after the splice point.
248
258
  expect(cleanups).toEqual(["b", "c"]);
249
- expect(printTree(tree)).toBe(d`
259
+ expect(tree).toRenderTo(`
250
260
  Letter a
251
261
  Letter c
252
262
  `);
@@ -254,10 +264,8 @@ it("cleans up things which end up removed (with splice)", () => {
254
264
 
255
265
  it("doesn't render empty content", () => {
256
266
  const items = [1, 2, 3];
257
- const tree = renderTree(
258
- <For each={items}>{(item) => (item > 2 ? item : null)}</For>,
259
- );
260
- expect(printTree(tree)).toBe(`3`);
267
+ const tree = <For each={items}>{(item) => (item > 2 ? item : null)}</For>;
268
+ expect(tree).toRenderTo("3");
261
269
  });
262
270
 
263
271
  it("updates joiners appropriately when items get/lose content", () => {
@@ -267,16 +275,16 @@ it("updates joiners appropriately when items get/lose content", () => {
267
275
  { content: ref("hello") },
268
276
  ];
269
277
 
270
- const tree = renderTree(
278
+ const tree = (
271
279
  <For each={items} joiner=", ">
272
280
  {(item) => {
273
281
  return item.content;
274
282
  }}
275
- </For>,
283
+ </For>
276
284
  );
277
285
 
278
- expect(printTree(tree)).toBe(`hello`);
286
+ expect(tree).toRenderTo("hello");
279
287
  items[1].content.value = "hi";
280
288
  flushJobs();
281
- expect(printTree(tree)).toBe(`hi, hello`);
289
+ expect(tree).toRenderTo("hi, hello");
282
290
  });
@@ -1,8 +1,6 @@
1
- import "@alloy-js/core/testing";
2
1
  import { ref } from "@vue/reactivity";
3
2
  import { expect, it } from "vitest";
4
3
  import { Match, Switch } from "../../src/components/Switch.jsx";
5
- import { printTree, renderTree } from "../../src/render.js";
6
4
 
7
5
  it("selects the true branch", () => {
8
6
  const template = (
@@ -40,10 +38,10 @@ it("works with reactivity", () => {
40
38
  <Match else>odd</Match>
41
39
  </Switch>
42
40
  );
43
- const tree = renderTree(template);
44
- expect(printTree(tree)).toBe(`even`);
41
+ const tree = template;
42
+ expect(tree).toRenderTo("even");
45
43
  count.value++;
46
- expect(printTree(tree)).toBe(`odd`);
44
+ expect(tree).toRenderTo("odd");
47
45
  count.value++;
48
- expect(printTree(tree)).toBe(`even`);
46
+ expect(tree).toRenderTo("even");
49
47
  });
@@ -1,8 +1,6 @@
1
- import "@alloy-js/core/testing";
2
1
  import { ref } from "@vue/reactivity";
3
2
  import { expect, it } from "vitest";
4
3
  import { Show } from "../../src/components/Show.jsx";
5
- import { printTree, renderTree } from "../../src/render.js";
6
4
 
7
5
  it("selects the true branch", () => {
8
6
  const template = <Show when={true}>true</Show>;
@@ -16,10 +14,9 @@ it("works with reactivity", () => {
16
14
  even
17
15
  </Show>
18
16
  );
19
- const tree = renderTree(template);
20
- expect(printTree(tree)).toBe(`even`);
17
+ expect(template).toRenderTo("even");
21
18
  count.value++;
22
- expect(printTree(tree)).toBe(`odd`);
19
+ expect(template).toRenderTo("odd");
23
20
  count.value++;
24
- expect(printTree(tree)).toBe(`even`);
21
+ expect(template).toRenderTo("even");
25
22
  });
@@ -3,10 +3,8 @@ import { describe, expect, it } from "vitest";
3
3
  import { Show } from "../src/components/Show.jsx";
4
4
  import { createContentSlot } from "../src/content-slot.jsx";
5
5
  import { Context, ensureIsEmpty, getContext } from "../src/reactivity.js";
6
- import { printTree, renderTree } from "../src/render.js";
7
- import "../testing/extend-expect.js";
8
6
 
9
- describe("lazy isEmpty / _lastEmpty", () => {
7
+ describe("lazy isEmpty", () => {
10
8
  it("context starts without isEmpty ref allocated", () => {
11
9
  let ctx: Context | null = null;
12
10
 
@@ -15,12 +13,12 @@ describe("lazy isEmpty / _lastEmpty", () => {
15
13
  return "content";
16
14
  }
17
15
 
18
- renderTree(<Capture />);
16
+ expect(<Capture />).toRenderTo("content");
19
17
 
20
18
  // The isEmpty ref should NOT be allocated unless someone observes it.
21
19
  expect(ctx).not.toBeNull();
22
20
  expect(ctx!.isEmpty).toBeUndefined();
23
- expect(ctx!._lastEmpty).toBe(false);
21
+ expect(ctx!.childrenWithContent).toBe(1);
24
22
  });
25
23
 
26
24
  it("ensureIsEmpty lazily allocates the isEmpty ref", () => {
@@ -31,7 +29,7 @@ describe("lazy isEmpty / _lastEmpty", () => {
31
29
  return "content";
32
30
  }
33
31
 
34
- renderTree(<Capture />);
32
+ expect(<Capture />).toRenderTo("content");
35
33
 
36
34
  expect(ctx!.isEmpty).toBeUndefined();
37
35
  const isEmptyRef = ensureIsEmpty(ctx!);
@@ -39,7 +37,7 @@ describe("lazy isEmpty / _lastEmpty", () => {
39
37
  expect(isEmptyRef).toBe(ctx!.isEmpty);
40
38
  });
41
39
 
42
- it("_lastEmpty is true for empty component, false for non-empty", () => {
40
+ it("tracks content count for empty and non-empty components", () => {
43
41
  let emptyCtx: Context | null = null;
44
42
  let fullCtx: Context | null = null;
45
43
 
@@ -53,54 +51,54 @@ describe("lazy isEmpty / _lastEmpty", () => {
53
51
  return "has content";
54
52
  }
55
53
 
56
- renderTree(
54
+ expect(
57
55
  <>
58
56
  <EmptyCapture />
59
57
  <FullCapture />
60
58
  </>,
61
- );
59
+ ).toRenderTo("has content");
62
60
 
63
- expect(emptyCtx!._lastEmpty).toBe(true);
64
- expect(fullCtx!._lastEmpty).toBe(false);
61
+ expect(emptyCtx!.childrenWithContent).toBe(0);
62
+ expect(fullCtx!.childrenWithContent).toBe(1);
65
63
  });
66
64
 
67
65
  it("ContentSlot triggers ensureIsEmpty and tracks reactively", () => {
68
66
  const ContentSlot = createContentSlot();
69
67
  const showContent = ref(false);
70
68
 
71
- const tree = renderTree(
69
+ const tree = (
72
70
  <>
73
71
  {ContentSlot.isEmpty && "empty"}
74
72
  <ContentSlot>
75
73
  <Show when={showContent.value}>content</Show>
76
74
  </ContentSlot>
77
- </>,
75
+ </>
78
76
  );
79
77
 
80
- expect(printTree(tree)).toBe("empty");
78
+ expect(tree).toRenderTo("empty");
81
79
 
82
80
  showContent.value = true;
83
- expect(printTree(tree)).toBe("content");
81
+ expect(tree).toRenderTo("content");
84
82
  });
85
83
 
86
84
  it("propagates empty state up through parent contexts", () => {
87
85
  const OuterSlot = createContentSlot();
88
86
  const showContent = ref(false);
89
87
 
90
- const tree = renderTree(
88
+ const tree = (
91
89
  <>
92
90
  {OuterSlot.isEmpty && "outer-empty"}
93
91
  <OuterSlot>
94
92
  <Show when={showContent.value}>content</Show>
95
93
  </OuterSlot>
96
- </>,
94
+ </>
97
95
  );
98
96
 
99
97
  // Outer should be empty initially.
100
- expect(printTree(tree)).toBe("outer-empty");
98
+ expect(tree).toRenderTo("outer-empty");
101
99
 
102
100
  // Show content — outer should become non-empty.
103
101
  showContent.value = true;
104
- expect(printTree(tree)).toBe("content");
102
+ expect(tree).toRenderTo("content");
105
103
  });
106
104
  });
@@ -1,6 +1,5 @@
1
1
  import { createNamePolicy, Output, useNamePolicy } from "@alloy-js/core";
2
2
  import { expect, it } from "vitest";
3
- import "../testing/extend-expect.js";
4
3
 
5
4
  it("is applied by output", () => {
6
5
  const policy = createNamePolicy((name) => {
@@ -0,0 +1,90 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ createElement,
4
+ createFragment,
5
+ createTextNode,
6
+ } from "../src/render/index.js";
7
+ import { textContent } from "./tree-test-utils.js";
8
+
9
+ describe("Node tree", () => {
10
+ it("append/prepend/before/after build linked list correctly", () => {
11
+ const root = createElement("group");
12
+ const b = createTextNode("B");
13
+ const c = createTextNode("C");
14
+ root.append(b, c);
15
+ const a = createTextNode("A");
16
+ root.prepend(a);
17
+ const d = createTextNode("D");
18
+ c.after(d);
19
+ const between = createTextNode("X");
20
+ c.before(between);
21
+
22
+ expect(textContent(root)).toBe("ABXCD");
23
+ expect(root.firstChild).toBe(a);
24
+ expect(root.lastChild).toBe(d);
25
+ expect(a.nextSibling).toBe(b);
26
+ expect(d.previousSibling).toBe(c);
27
+ });
28
+
29
+ it("replaceWith / remove maintain links", () => {
30
+ const root = createElement("group");
31
+ const a = createTextNode("A");
32
+ const b = createTextNode("B");
33
+ const c = createTextNode("C");
34
+ root.append(a, b, c);
35
+ const x = createTextNode("X");
36
+ const y = createTextNode("Y");
37
+ b.replaceWith(x, y);
38
+ expect(textContent(root)).toBe("AXYC");
39
+ expect(b.parentNode).toBeNull();
40
+ a.remove();
41
+ expect(textContent(root)).toBe("XYC");
42
+ expect(root.firstChild).toBe(x);
43
+ });
44
+
45
+ it("Fragment splices children on insert and self-empties", () => {
46
+ const root = createElement("group");
47
+ const f = createFragment();
48
+ f.append("hello", " ", "world");
49
+ expect(f.firstChild).not.toBeNull();
50
+ root.append(f);
51
+ expect(f.firstChild).toBeNull();
52
+ expect(f.parentNode).toBeNull();
53
+ expect(textContent(root)).toBe("hello world");
54
+ });
55
+
56
+ it("indent element preserves nested text in tree order", () => {
57
+ const root = createElement("group");
58
+ const indent = createElement("indent");
59
+ indent.append("first\nsecond\nthird");
60
+ root.append("top\n", indent);
61
+ expect(textContent(root)).toBe("top\nfirst\nsecond\nthird");
62
+ expect(root.lastChild).toBe(indent);
63
+ });
64
+
65
+ it("moveBefore atomically relocates without disconnecting subtree", () => {
66
+ const root = createElement("group");
67
+ const a = createElement("group");
68
+ const b = createElement("group");
69
+ a.append("A-content");
70
+ b.append("B-content");
71
+ root.append(a, b);
72
+ expect(textContent(root)).toBe("A-contentB-content");
73
+ // Move a after b.
74
+ root.moveBefore(a, null);
75
+ expect(textContent(root)).toBe("B-contentA-content");
76
+ // Subtree of `a` is untouched.
77
+ expect(a.firstChild).not.toBeNull();
78
+ });
79
+
80
+ it("moveBefore is a no-op when already at target position", () => {
81
+ const root = createElement("group");
82
+ const a = createTextNode("A");
83
+ const b = createTextNode("B");
84
+ root.append(a, b);
85
+ const aPrev = a.previousSibling;
86
+ root.moveBefore(a, b);
87
+ expect(a.previousSibling).toBe(aPrev);
88
+ expect(textContent(root)).toBe("AB");
89
+ });
90
+ });
@@ -0,0 +1,198 @@
1
+ /**
2
+ * End-to-end test of the entry point: compile JSX through the babel
3
+ * preset (alloy preset), evaluate against the runtime, and run through
4
+ * `renderAsync` to produce an `OutputDirectory`.
5
+ *
6
+ * Validates:
7
+ * - Output → SourceDirectory → SourceFile composition.
8
+ * - File contents are produced via Alloy's direct printer.
9
+ * - Nested directories accumulate paths correctly.
10
+ * - `For` works under the runtime emitting multiple files.
11
+ */
12
+
13
+ // @ts-expect-error — @babel/core has no bundled types in this workspace
14
+ import { transformSync } from "@babel/core";
15
+ // @ts-expect-error — preset has no types
16
+ import alloyPreset from "@alloy-js/babel-preset";
17
+ // @ts-expect-error — preset-typescript has no types
18
+ import typescriptPreset from "@babel/preset-typescript";
19
+ import { beforeAll, describe, expect, it } from "vitest";
20
+ import type {
21
+ ContentOutputFile,
22
+ OutputDirectory,
23
+ } from "../src/output-types.js";
24
+
25
+ // Prime the runtime + core module imports once. Without this, the first
26
+ // test in the suite pays the full module-init cost of `@alloy-js/core`
27
+ // inside its 5s timeout window, which is flaky on slower machines.
28
+ let runtimeMod: any;
29
+ let coreMod: any;
30
+ beforeAll(async () => {
31
+ runtimeMod = await import("../src/runtime/index.js");
32
+ coreMod = await import("../src/index.js");
33
+ });
34
+
35
+ function compile(src: string): string {
36
+ const result = transformSync(src, {
37
+ filename: "test.tsx",
38
+ presets: [typescriptPreset, [alloyPreset]],
39
+ });
40
+ if (!result?.code) throw new Error("compile failed");
41
+ return result.code;
42
+ }
43
+
44
+ async function evalCompiled(src: string, exportName: string): Promise<unknown> {
45
+ const code = compile(src);
46
+ const runtimeStub = `const __rt = arguments[0]; const __core = arguments[1];`;
47
+ const importRegex =
48
+ /import\s*\{\s*([^}]+)\s*\}\s*from\s*"@alloy-js\/core\/jsx-runtime";?/g;
49
+ const destructures: string[] = [];
50
+ let body = code.replace(importRegex, (_match, names: string) => {
51
+ const dn = names.replace(/(\w+)\s+as\s+(\w+)/g, "$1: $2");
52
+ destructures.push(`const {${dn}} = __rt;`);
53
+ return "";
54
+ });
55
+ const coreImportRegex =
56
+ /import\s*\{\s*([^}]+)\s*\}\s*from\s*"@alloy-js\/core";?/g;
57
+ body = body.replace(coreImportRegex, (_match, names: string) => {
58
+ const dn = names.replace(/(\w+)\s+as\s+(\w+)/g, "$1: $2");
59
+ destructures.push(`const {${dn}} = { ...__core, ...__rt };`);
60
+ return "";
61
+ });
62
+ body = body.replace(
63
+ /export\s*\{\s*([^}]+)\s*\}\s*;?/g,
64
+ (_, names: string) => {
65
+ const list = names.split(",").map((s) => s.trim());
66
+ return `return { ${list.join(",")} };`;
67
+ },
68
+ );
69
+ body = body.replace(/import\.meta\.url/g, '"test://test.tsx"');
70
+ const wrapped = `${runtimeStub}\n${destructures.join("\n")}\n${body}`;
71
+ const fn = new Function(wrapped);
72
+ return fn(runtimeMod, coreMod)[exportName];
73
+ }
74
+
75
+ function findFile(
76
+ dir: OutputDirectory,
77
+ path: string,
78
+ ): ContentOutputFile | undefined {
79
+ for (const c of dir.contents) {
80
+ if (c.kind === "file" && "contents" in c && c.path === path) return c;
81
+ if (c.kind === "directory") {
82
+ const found = findFile(c, path);
83
+ if (found) return found;
84
+ }
85
+ }
86
+ return undefined;
87
+ }
88
+
89
+ describe("renderAsync — end-to-end output structure", () => {
90
+ it("produces a single SourceFile under Output > SourceDirectory", async () => {
91
+ const src = `
92
+ import { Output, SourceDirectory, SourceFile } from "@alloy-js/core";
93
+ const App = () => (
94
+ <Output>
95
+ <SourceDirectory path="src">
96
+ <SourceFile path="hello.txt" filetype="text/plain">
97
+ <group>hello, world</group>
98
+ </SourceFile>
99
+ </SourceDirectory>
100
+ </Output>
101
+ );
102
+ export { App };
103
+ `;
104
+ const App = (await evalCompiled(src, "App")) as () => unknown;
105
+ const { renderAsync } = runtimeMod;
106
+ // App() returns a ComponentCreator (top-level <Output>); pass the
107
+ // thunk directly as Children — renderAsync's insert handles it.
108
+ const out = await renderAsync(App() as any);
109
+ const f = findFile(out, "src/hello.txt");
110
+ expect(f).toBeDefined();
111
+ expect(f!.contents).toBe("hello, world\n");
112
+ expect(f!.filetype).toBe("text/plain");
113
+ });
114
+
115
+ it("nested SourceDirectory paths accumulate", async () => {
116
+ const src = `
117
+ import { Output, SourceDirectory, SourceFile } from "@alloy-js/core";
118
+ const App = () => (
119
+ <Output>
120
+ <SourceDirectory path="src">
121
+ <SourceDirectory path="lib">
122
+ <SourceFile path="x.txt" filetype="text/plain">x</SourceFile>
123
+ </SourceDirectory>
124
+ </SourceDirectory>
125
+ </Output>
126
+ );
127
+ export { App };
128
+ `;
129
+ const App = (await evalCompiled(src, "App")) as () => unknown;
130
+ const { renderAsync } = runtimeMod;
131
+ const out = await renderAsync(App() as any);
132
+ expect(findFile(out, "src/lib/x.txt")?.contents).toBe("x\n");
133
+ });
134
+
135
+ it("For emits multiple files", async () => {
136
+ const src = `
137
+ import { For, Output, SourceDirectory, SourceFile } from "@alloy-js/core";
138
+ const App = (props) => (
139
+ <Output>
140
+ <SourceDirectory path="src">
141
+ <For each={props.specs}>
142
+ {(spec) => (
143
+ <SourceFile path={spec.path} filetype="text/plain">
144
+ <group>{spec.body}</group>
145
+ </SourceFile>
146
+ )}
147
+ </For>
148
+ </SourceDirectory>
149
+ </Output>
150
+ );
151
+ export { App };
152
+ `;
153
+ const App = (await evalCompiled(src, "App")) as (props: any) => unknown;
154
+ const { renderAsync } = runtimeMod;
155
+ const specs = [
156
+ { path: "a.txt", body: "alpha" },
157
+ { path: "b.txt", body: "beta" },
158
+ { path: "c.txt", body: "gamma" },
159
+ ];
160
+ const out = await renderAsync(App({ specs }) as any);
161
+ expect(findFile(out, "src/a.txt")?.contents).toBe("alpha\n");
162
+ expect(findFile(out, "src/b.txt")?.contents).toBe("beta\n");
163
+ expect(findFile(out, "src/c.txt")?.contents).toBe("gamma\n");
164
+ });
165
+
166
+ it("direct printer formatting — group breaks at printWidth", async () => {
167
+ const src = `
168
+ import { Output, SourceDirectory, SourceFile } from "@alloy-js/core";
169
+ const App = () => (
170
+ <Output>
171
+ <SourceDirectory path=".">
172
+ <SourceFile path="t.txt" filetype="text/plain">
173
+ <group>
174
+ {"["}
175
+ <indent>
176
+ <line />
177
+ {"aaaaaaaaaaaaaaaaaaaa,"}
178
+ <line />
179
+ {"bbbbbbbbbbbbbbbbbbbb"}
180
+ </indent>
181
+ <line />
182
+ {"]"}
183
+ </group>
184
+ </SourceFile>
185
+ </SourceDirectory>
186
+ </Output>
187
+ );
188
+ export { App };
189
+ `;
190
+ const App = (await evalCompiled(src, "App")) as () => unknown;
191
+ const { renderAsync } = runtimeMod;
192
+ const out = await renderAsync(App() as any, { printWidth: 30 });
193
+ const f = findFile(out, "t.txt");
194
+ expect(f!.contents).toBe(
195
+ "[\n aaaaaaaaaaaaaaaaaaaa,\n bbbbbbbbbbbbbbbbbbbb\n]\n",
196
+ );
197
+ });
198
+ });
@@ -1,8 +1,6 @@
1
1
  import { shallowReactive } from "@vue/reactivity";
2
2
  import { expect, it } from "vitest";
3
3
  import { For } from "../../src/index.js";
4
- import { printTree, renderTree } from "../../src/render.js";
5
- import { d } from "../../testing/render.js";
6
4
 
7
5
  it("it should work with circular reactives", () => {
8
6
  const items: string[] = shallowReactive([]);
@@ -23,9 +21,10 @@ it("it should work with circular reactives", () => {
23
21
  </For>
24
22
  </>
25
23
  );
26
- const tree = renderTree(template);
24
+ const tree = template;
25
+ expect(tree).toRenderTo("");
27
26
  items.push("item start");
28
- expect(printTree(tree)).toBe(d`
27
+ expect(tree).toRenderTo(`
29
28
  item start
30
29
  item 1
31
30
  `);
@@ -43,9 +42,10 @@ it("should work with immediately recursive reactives", () => {
43
42
  </For>
44
43
  </>
45
44
  );
46
- const tree = renderTree(template);
45
+ const tree = template;
46
+ expect(tree).toRenderTo("");
47
47
  items.add("item start");
48
- expect(printTree(tree)).toBe(d`
48
+ expect(tree).toRenderTo(`
49
49
  item start
50
50
  item 1
51
51
  `);