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

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 (506) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/dev/src/components/AccessExpression.test.js +1 -1
  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 +1 -1
  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 +1 -1
  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/components/block.test.js +1 -1
  88. package/dist/dev/test/components/block.test.js.map +1 -1
  89. package/dist/dev/test/components/copy-file.test.js +7 -7
  90. package/dist/dev/test/components/copy-file.test.js.map +1 -1
  91. package/dist/dev/test/components/update-file.test.js +1 -1
  92. package/dist/dev/test/components/update-file.test.js.map +1 -1
  93. package/dist/dev/test/components/wrap.test.js +1 -1
  94. package/dist/dev/test/components/wrap.test.js.map +1 -1
  95. package/dist/dev/test/control-flow/match.test.js +1 -1
  96. package/dist/dev/test/control-flow/match.test.js.map +1 -1
  97. package/dist/dev/test/control-flow/show.test.js +1 -1
  98. package/dist/dev/test/control-flow/show.test.js.map +1 -1
  99. package/dist/dev/test/lazy-isempty.test.js +6 -6
  100. package/dist/dev/test/lazy-isempty.test.js.map +1 -1
  101. package/dist/dev/test/node.test.js +80 -0
  102. package/dist/dev/test/node.test.js.map +1 -0
  103. package/dist/dev/test/output-e2e.test.js +194 -0
  104. package/dist/dev/test/output-e2e.test.js.map +1 -0
  105. package/dist/dev/test/reactivity/circular-reactives.test.js +1 -1
  106. package/dist/dev/test/reactivity/circular-reactives.test.js.map +1 -1
  107. package/dist/dev/test/reactivity/cleanup.test.js +1 -1
  108. package/dist/dev/test/reactivity/cleanup.test.js.map +1 -1
  109. package/dist/dev/test/rendering/memoization.test.js +6 -1
  110. package/dist/dev/test/rendering/memoization.test.js.map +1 -1
  111. package/dist/dev/test/rendering/render-output-diagnostics.test.js +102 -0
  112. package/dist/dev/test/rendering/render-output-diagnostics.test.js.map +1 -0
  113. package/dist/dev/test/runtime.test.js +385 -0
  114. package/dist/dev/test/runtime.test.js.map +1 -0
  115. package/dist/dev/test/tree-test-utils.js +16 -0
  116. package/dist/dev/test/tree-test-utils.js.map +1 -0
  117. package/dist/dev/test/utils.test.js +1 -1
  118. package/dist/dev/test/utils.test.js.map +1 -1
  119. package/dist/dev/testing/devtools-utils.js +1 -1
  120. package/dist/dev/testing/devtools-utils.js.map +1 -1
  121. package/dist/dev/testing/extend-expect.js +7 -33
  122. package/dist/dev/testing/extend-expect.js.map +1 -1
  123. package/dist/dev/testing/render.js +7 -17
  124. package/dist/dev/testing/render.js.map +1 -1
  125. package/dist/devtools/index.html +17 -17
  126. package/dist/src/components/AccessExpression.test.js +1 -1
  127. package/dist/src/components/AccessExpression.test.js.map +1 -1
  128. package/dist/src/components/Output.d.ts +1 -1
  129. package/dist/src/components/Output.d.ts.map +1 -1
  130. package/dist/src/components/Output.js +2 -1
  131. package/dist/src/components/Output.js.map +1 -1
  132. package/dist/src/components/ReferenceOrContent.d.ts +1 -1
  133. package/dist/src/components/ReferenceOrContent.d.ts.map +1 -1
  134. package/dist/src/components/SourceFile.d.ts +1 -1
  135. package/dist/src/components/SourceFile.d.ts.map +1 -1
  136. package/dist/src/components/SourceFile.js.map +1 -1
  137. package/dist/src/content-slot.test.js +1 -1
  138. package/dist/src/content-slot.test.js.map +1 -1
  139. package/dist/src/context/format-options.d.ts +1 -1
  140. package/dist/src/context/format-options.d.ts.map +1 -1
  141. package/dist/src/context.d.ts +9 -1
  142. package/dist/src/context.d.ts.map +1 -1
  143. package/dist/src/context.js +30 -3
  144. package/dist/src/context.js.map +1 -1
  145. package/dist/src/debug/diagnostics.test.js +1 -1
  146. package/dist/src/debug/diagnostics.test.js.map +1 -1
  147. package/dist/src/debug/effects.test.js +1 -1
  148. package/dist/src/debug/effects.test.js.map +1 -1
  149. package/dist/src/debug/file-streaming.d.ts +22 -0
  150. package/dist/src/debug/file-streaming.d.ts.map +1 -0
  151. package/dist/src/debug/file-streaming.js +103 -0
  152. package/dist/src/debug/file-streaming.js.map +1 -0
  153. package/dist/src/debug/files.test.js +4 -5
  154. package/dist/src/debug/files.test.js.map +1 -1
  155. package/dist/src/debug/index.d.ts +5 -7
  156. package/dist/src/debug/index.d.ts.map +1 -1
  157. package/dist/src/debug/index.js +4 -6
  158. package/dist/src/debug/index.js.map +1 -1
  159. package/dist/src/debug/message-format.test.js +16 -18
  160. package/dist/src/debug/message-format.test.js.map +1 -1
  161. package/dist/src/debug/render-tree-orphans.test.js +8 -18
  162. package/dist/src/debug/render-tree-orphans.test.js.map +1 -1
  163. package/dist/src/debug/render.d.ts +71 -21
  164. package/dist/src/debug/render.d.ts.map +1 -1
  165. package/dist/src/debug/render.js +529 -352
  166. package/dist/src/debug/render.js.map +1 -1
  167. package/dist/src/debug/render.test.js +137 -74
  168. package/dist/src/debug/render.test.js.map +1 -1
  169. package/dist/src/debug/trace-writer.d.ts +6 -1
  170. package/dist/src/debug/trace-writer.d.ts.map +1 -1
  171. package/dist/src/debug/trace-writer.js +127 -15
  172. package/dist/src/debug/trace-writer.js.map +1 -1
  173. package/dist/src/debug/trace.d.ts +0 -36
  174. package/dist/src/debug/trace.d.ts.map +1 -1
  175. package/dist/src/debug/trace.js +0 -36
  176. package/dist/src/debug/trace.js.map +1 -1
  177. package/dist/src/devtools/devtools-protocol.d.ts +34 -1
  178. package/dist/src/devtools/devtools-protocol.d.ts.map +1 -1
  179. package/dist/src/devtools/devtools-server.d.ts.map +1 -1
  180. package/dist/src/devtools/devtools-server.js +55 -32
  181. package/dist/src/devtools/devtools-server.js.map +1 -1
  182. package/dist/src/devtools-entry.browser.d.ts +1 -1
  183. package/dist/src/devtools-entry.browser.d.ts.map +1 -1
  184. package/dist/src/devtools-entry.browser.js.map +1 -1
  185. package/dist/src/devtools-entry.d.ts +1 -1
  186. package/dist/src/devtools-entry.d.ts.map +1 -1
  187. package/dist/src/devtools-entry.js.map +1 -1
  188. package/dist/src/diagnostics.d.ts +4 -0
  189. package/dist/src/diagnostics.d.ts.map +1 -1
  190. package/dist/src/diagnostics.js +19 -1
  191. package/dist/src/diagnostics.js.map +1 -1
  192. package/dist/src/index.d.ts +5 -2
  193. package/dist/src/index.d.ts.map +1 -1
  194. package/dist/src/index.js +5 -2
  195. package/dist/src/index.js.map +1 -1
  196. package/dist/src/jsx-runtime.d.ts +13 -4
  197. package/dist/src/jsx-runtime.d.ts.map +1 -1
  198. package/dist/src/jsx-runtime.js +14 -8
  199. package/dist/src/jsx-runtime.js.map +1 -1
  200. package/dist/src/output-types.d.ts +40 -0
  201. package/dist/src/output-types.d.ts.map +1 -0
  202. package/dist/src/output-types.js +2 -0
  203. package/dist/src/output-types.js.map +1 -0
  204. package/dist/src/reactivity.d.ts +49 -18
  205. package/dist/src/reactivity.d.ts.map +1 -1
  206. package/dist/src/reactivity.js +155 -13
  207. package/dist/src/reactivity.js.map +1 -1
  208. package/dist/src/render/get-string-width.d.ts +19 -0
  209. package/dist/src/render/get-string-width.d.ts.map +1 -0
  210. package/dist/src/render/get-string-width.js +61 -0
  211. package/dist/src/render/get-string-width.js.map +1 -0
  212. package/dist/src/render/index.d.ts +2 -0
  213. package/dist/src/render/index.d.ts.map +1 -0
  214. package/dist/src/render/index.js +2 -0
  215. package/dist/src/render/index.js.map +1 -0
  216. package/dist/src/render/node-context.d.ts +5 -0
  217. package/dist/src/render/node-context.d.ts.map +1 -0
  218. package/dist/src/render/node-context.js +7 -0
  219. package/dist/src/render/node-context.js.map +1 -0
  220. package/dist/src/render/node.d.ts +146 -0
  221. package/dist/src/render/node.d.ts.map +1 -0
  222. package/dist/src/render/node.js +386 -0
  223. package/dist/src/render/node.js.map +1 -0
  224. package/dist/src/render/printer-support.d.ts +50 -0
  225. package/dist/src/render/printer-support.d.ts.map +1 -0
  226. package/dist/src/render/printer-support.js +180 -0
  227. package/dist/src/render/printer-support.js.map +1 -0
  228. package/dist/src/render/printer.d.ts +35 -0
  229. package/dist/src/render/printer.d.ts.map +1 -0
  230. package/dist/src/render/printer.js +797 -0
  231. package/dist/src/render/printer.js.map +1 -0
  232. package/dist/src/render-error.d.ts +4 -0
  233. package/dist/src/render-error.d.ts.map +1 -0
  234. package/dist/src/render-error.js +79 -0
  235. package/dist/src/render-error.js.map +1 -0
  236. package/dist/src/render-output.d.ts +42 -0
  237. package/dist/src/render-output.d.ts.map +1 -0
  238. package/dist/src/render-output.js +209 -0
  239. package/dist/src/render-output.js.map +1 -0
  240. package/dist/src/runtime/component.d.ts +2 -2
  241. package/dist/src/runtime/component.d.ts.map +1 -1
  242. package/dist/src/runtime/create-intrinsic.d.ts +28 -0
  243. package/dist/src/runtime/create-intrinsic.d.ts.map +1 -0
  244. package/dist/src/runtime/create-intrinsic.js +53 -0
  245. package/dist/src/runtime/create-intrinsic.js.map +1 -0
  246. package/dist/src/runtime/fragment.d.ts +16 -0
  247. package/dist/src/runtime/fragment.d.ts.map +1 -0
  248. package/dist/src/runtime/fragment.js +21 -0
  249. package/dist/src/runtime/fragment.js.map +1 -0
  250. package/dist/src/runtime/index.d.ts +12 -0
  251. package/dist/src/runtime/index.d.ts.map +1 -0
  252. package/dist/src/runtime/index.js +13 -0
  253. package/dist/src/runtime/index.js.map +1 -0
  254. package/dist/src/runtime/insert.d.ts +29 -0
  255. package/dist/src/runtime/insert.d.ts.map +1 -0
  256. package/dist/src/runtime/insert.js +453 -0
  257. package/dist/src/runtime/insert.js.map +1 -0
  258. package/dist/src/runtime/intrinsic.d.ts +12 -29
  259. package/dist/src/runtime/intrinsic.d.ts.map +1 -1
  260. package/dist/src/runtime/intrinsic.js +1 -11
  261. package/dist/src/runtime/intrinsic.js.map +1 -1
  262. package/dist/src/scheduler.d.ts.map +1 -1
  263. package/dist/src/scheduler.js +38 -14
  264. package/dist/src/scheduler.js.map +1 -1
  265. package/dist/src/stc.d.ts.map +1 -1
  266. package/dist/src/stc.js +2 -0
  267. package/dist/src/stc.js.map +1 -1
  268. package/dist/src/sti.d.ts +7 -6
  269. package/dist/src/sti.d.ts.map +1 -1
  270. package/dist/src/sti.js +1 -1
  271. package/dist/src/sti.js.map +1 -1
  272. package/dist/src/symbols/symbol-slot.test.js +1 -1
  273. package/dist/src/symbols/symbol-slot.test.js.map +1 -1
  274. package/dist/src/test-render.d.ts +31 -0
  275. package/dist/src/test-render.d.ts.map +1 -0
  276. package/dist/src/test-render.js +78 -0
  277. package/dist/src/test-render.js.map +1 -0
  278. package/dist/src/utils.d.ts +1 -1
  279. package/dist/src/utils.d.ts.map +1 -1
  280. package/dist/src/utils.js +40 -28
  281. package/dist/src/utils.js.map +1 -1
  282. package/dist/src/write-output.d.ts +1 -1
  283. package/dist/src/write-output.d.ts.map +1 -1
  284. package/dist/test/babel-e2e.test.d.ts +13 -0
  285. package/dist/test/babel-e2e.test.d.ts.map +1 -0
  286. package/dist/test/babel-e2e.test.js +218 -0
  287. package/dist/test/babel-e2e.test.js.map +1 -0
  288. package/dist/test/components/block.test.js +1 -1
  289. package/dist/test/components/block.test.js.map +1 -1
  290. package/dist/test/components/copy-file.test.d.ts.map +1 -1
  291. package/dist/test/components/copy-file.test.js +1 -1
  292. package/dist/test/components/copy-file.test.js.map +1 -1
  293. package/dist/test/components/update-file.test.js +1 -1
  294. package/dist/test/components/update-file.test.js.map +1 -1
  295. package/dist/test/components/wrap.test.js +1 -1
  296. package/dist/test/components/wrap.test.js.map +1 -1
  297. package/dist/test/control-flow/match.test.js +1 -1
  298. package/dist/test/control-flow/match.test.js.map +1 -1
  299. package/dist/test/control-flow/show.test.js +1 -1
  300. package/dist/test/control-flow/show.test.js.map +1 -1
  301. package/dist/test/lazy-isempty.test.js +6 -6
  302. package/dist/test/lazy-isempty.test.js.map +1 -1
  303. package/dist/test/node.test.d.ts +2 -0
  304. package/dist/test/node.test.d.ts.map +1 -0
  305. package/dist/test/node.test.js +80 -0
  306. package/dist/test/node.test.js.map +1 -0
  307. package/dist/test/output-e2e.test.d.ts +13 -0
  308. package/dist/test/output-e2e.test.d.ts.map +1 -0
  309. package/dist/test/output-e2e.test.js +194 -0
  310. package/dist/test/output-e2e.test.js.map +1 -0
  311. package/dist/test/reactivity/circular-reactives.test.js +1 -1
  312. package/dist/test/reactivity/circular-reactives.test.js.map +1 -1
  313. package/dist/test/reactivity/cleanup.test.js +1 -1
  314. package/dist/test/reactivity/cleanup.test.js.map +1 -1
  315. package/dist/test/rendering/memoization.test.js +6 -1
  316. package/dist/test/rendering/memoization.test.js.map +1 -1
  317. package/dist/test/rendering/render-output-diagnostics.test.d.ts +2 -0
  318. package/dist/test/rendering/render-output-diagnostics.test.d.ts.map +1 -0
  319. package/dist/test/rendering/render-output-diagnostics.test.js +82 -0
  320. package/dist/test/rendering/render-output-diagnostics.test.js.map +1 -0
  321. package/dist/test/runtime.test.d.ts +11 -0
  322. package/dist/test/runtime.test.d.ts.map +1 -0
  323. package/dist/test/runtime.test.js +385 -0
  324. package/dist/test/runtime.test.js.map +1 -0
  325. package/dist/test/tree-test-utils.d.ts +3 -0
  326. package/dist/test/tree-test-utils.d.ts.map +1 -0
  327. package/dist/test/tree-test-utils.js +16 -0
  328. package/dist/test/tree-test-utils.js.map +1 -0
  329. package/dist/test/utils.test.js +1 -1
  330. package/dist/test/utils.test.js.map +1 -1
  331. package/dist/testing/devtools-utils.d.ts.map +1 -1
  332. package/dist/testing/devtools-utils.js +1 -1
  333. package/dist/testing/devtools-utils.js.map +1 -1
  334. package/dist/testing/extend-expect.d.ts.map +1 -1
  335. package/dist/testing/extend-expect.js +7 -33
  336. package/dist/testing/extend-expect.js.map +1 -1
  337. package/dist/testing/render.d.ts +7 -9
  338. package/dist/testing/render.d.ts.map +1 -1
  339. package/dist/testing/render.js +7 -17
  340. package/dist/testing/render.js.map +1 -1
  341. package/dist/tsconfig.tsbuildinfo +1 -1
  342. package/docs/api/components/Output.md +0 -3
  343. package/docs/api/components/SourceFile.md +0 -3
  344. package/docs/api/functions/createComment.md +18 -0
  345. package/docs/api/functions/createElement.md +19 -0
  346. package/docs/api/functions/createFragment.md +17 -0
  347. package/docs/api/functions/createTextNode.md +18 -0
  348. package/docs/api/functions/emitDiagnosticForTree.md +19 -0
  349. package/docs/api/functions/ensureIsEmpty.md +1 -1
  350. package/docs/api/functions/getContextForNode.md +18 -0
  351. package/docs/api/functions/getContextForRenderNode.md +4 -4
  352. package/docs/api/functions/getDiagnosticsForTree.md +7 -5
  353. package/docs/api/functions/getRegisteredDiagnosticsForTree.md +18 -0
  354. package/docs/api/functions/index.md +17 -12
  355. package/docs/api/functions/isCustomContext.md +4 -4
  356. package/docs/api/functions/notifyContentState.md +6 -0
  357. package/docs/api/functions/printTree.md +6 -16
  358. package/docs/api/functions/registerDiagnosticsForTree.md +19 -0
  359. package/docs/api/functions/render.md +1 -2
  360. package/docs/api/functions/renderAsync.md +1 -2
  361. package/docs/api/functions/renderTree.md +8 -5
  362. package/docs/api/functions/reportDiagnosticsForTree.md +18 -0
  363. package/docs/api/functions/runInContext.md +28 -0
  364. package/docs/api/functions/sourceFilesForTree.md +6 -16
  365. package/docs/api/index.md +3 -3
  366. package/docs/api/testing/functions/index.md +1 -1
  367. package/docs/api/testing/functions/renderToString.md +1 -1
  368. package/docs/api/types/AlloyNode.md +22 -0
  369. package/docs/api/types/Child.md +1 -1
  370. package/docs/api/types/CommentNode.md +15 -0
  371. package/docs/api/types/Context.md +13 -15
  372. package/docs/api/types/ElementNode.md +18 -0
  373. package/docs/api/types/FragmentNode.md +12 -0
  374. package/docs/api/types/Insertable.md +7 -0
  375. package/docs/api/types/NodeType.md +5 -0
  376. package/docs/api/types/OutputDirectory.md +0 -50
  377. package/docs/api/types/PrintTreeOptions.md +0 -1
  378. package/docs/api/types/RenderTreeOptions.md +7 -0
  379. package/docs/api/types/StiComponentCreator.md +4 -4
  380. package/docs/api/types/StiSignature.md +1 -1
  381. package/docs/api/types/TextNode.md +16 -0
  382. package/docs/api/types/index.md +10 -28
  383. package/docs/api/variables/COMMENT_NODE.md +5 -0
  384. package/docs/api/variables/ELEMENT_NODE.md +11 -0
  385. package/docs/api/variables/FRAGMENT_NODE.md +5 -0
  386. package/docs/api/variables/TEXT_NODE.md +5 -0
  387. package/docs/api/variables/index.md +4 -2
  388. package/docs/formatting.md +1 -1
  389. package/docs/rendering.md +4 -4
  390. package/package.json +6 -6
  391. package/src/components/AccessExpression.test.tsx +1 -1
  392. package/src/components/Output.tsx +2 -1
  393. package/src/components/SourceFile.tsx +1 -1
  394. package/src/content-slot.test.tsx +1 -1
  395. package/src/context/format-options.ts +1 -1
  396. package/src/context.ts +37 -4
  397. package/src/debug/diagnostics.test.tsx +1 -1
  398. package/src/debug/effects.test.tsx +1 -1
  399. package/src/debug/file-streaming.ts +115 -0
  400. package/src/debug/files.test.tsx +15 -11
  401. package/src/debug/index.ts +11 -11
  402. package/src/debug/message-format.test.tsx +32 -19
  403. package/src/debug/render-tree-orphans.test.tsx +10 -19
  404. package/src/debug/render.test.tsx +206 -78
  405. package/src/debug/render.ts +642 -495
  406. package/src/debug/trace-writer.ts +168 -14
  407. package/src/debug/trace.ts +0 -20
  408. package/src/devtools/devtools-protocol.ts +43 -0
  409. package/src/devtools/devtools-server.ts +57 -32
  410. package/src/devtools-entry.browser.ts +5 -0
  411. package/src/devtools-entry.ts +5 -0
  412. package/src/diagnostics.ts +31 -0
  413. package/src/index.ts +66 -2
  414. package/src/jsx-runtime.ts +16 -14
  415. package/src/output-types.ts +47 -0
  416. package/src/reactivity.ts +186 -40
  417. package/src/render/get-string-width.ts +201 -0
  418. package/src/render/index.ts +1 -0
  419. package/src/render/node-context.ts +14 -0
  420. package/src/render/node.ts +442 -0
  421. package/src/render/printer-support.ts +209 -0
  422. package/src/render/printer.ts +817 -0
  423. package/src/render-error.ts +98 -0
  424. package/src/render-output.ts +243 -0
  425. package/src/runtime/component.ts +2 -2
  426. package/src/runtime/create-intrinsic.ts +56 -0
  427. package/src/runtime/fragment.ts +22 -0
  428. package/src/runtime/index.ts +12 -0
  429. package/src/runtime/insert.ts +569 -0
  430. package/src/runtime/intrinsic.ts +14 -70
  431. package/src/scheduler.ts +40 -25
  432. package/src/stc.ts +3 -0
  433. package/src/sti.ts +17 -20
  434. package/src/symbols/symbol-slot.test.tsx +1 -1
  435. package/src/test-render.ts +103 -0
  436. package/src/utils.tsx +55 -37
  437. package/src/write-output.ts +1 -1
  438. package/temp/api-testing.json +390 -14
  439. package/temp/api.json +4320 -4144
  440. package/test/babel-e2e.test.ts +224 -0
  441. package/test/components/block.test.tsx +1 -1
  442. package/test/components/copy-file.test.tsx +2 -1
  443. package/test/components/update-file.test.tsx +1 -1
  444. package/test/components/wrap.test.tsx +1 -1
  445. package/test/control-flow/match.test.tsx +1 -1
  446. package/test/control-flow/show.test.tsx +1 -1
  447. package/test/lazy-isempty.test.tsx +6 -6
  448. package/test/node.test.ts +90 -0
  449. package/test/output-e2e.test.ts +198 -0
  450. package/test/reactivity/circular-reactives.test.tsx +1 -1
  451. package/test/reactivity/cleanup.test.tsx +1 -1
  452. package/test/rendering/memoization.test.tsx +6 -1
  453. package/test/rendering/render-output-diagnostics.test.tsx +120 -0
  454. package/test/runtime.test.ts +448 -0
  455. package/test/tree-test-utils.ts +23 -0
  456. package/test/utils.test.tsx +1 -1
  457. package/testing/devtools-utils.ts +2 -0
  458. package/testing/extend-expect.ts +8 -46
  459. package/testing/render.ts +17 -21
  460. package/dist/dev/src/print-hook.js +0 -10
  461. package/dist/dev/src/print-hook.js.map +0 -1
  462. package/dist/dev/src/render.js +0 -872
  463. package/dist/dev/src/render.js.map +0 -1
  464. package/dist/src/print-hook.d.ts +0 -14
  465. package/dist/src/print-hook.d.ts.map +0 -1
  466. package/dist/src/print-hook.js +0 -10
  467. package/dist/src/print-hook.js.map +0 -1
  468. package/dist/src/render.d.ts +0 -155
  469. package/dist/src/render.d.ts.map +0 -1
  470. package/dist/src/render.js +0 -872
  471. package/dist/src/render.js.map +0 -1
  472. package/docs/api/functions/createIntrinsic.md +0 -19
  473. package/docs/api/functions/createRenderTreeHook.md +0 -19
  474. package/docs/api/functions/getElementCache.md +0 -17
  475. package/docs/api/functions/isIntrinsicElement.md +0 -18
  476. package/docs/api/functions/isPrintHook.md +0 -18
  477. package/docs/api/types/AlignIntrinsicElement.md +0 -5
  478. package/docs/api/types/BrIntrinsicElement.md +0 -5
  479. package/docs/api/types/BreakParentIntrinsicElement.md +0 -5
  480. package/docs/api/types/DedentIntrinsicElement.md +0 -5
  481. package/docs/api/types/DedentToRootIntrinsicElement.md +0 -5
  482. package/docs/api/types/ElementCache.md +0 -5
  483. package/docs/api/types/ElementCacheKey.md +0 -5
  484. package/docs/api/types/FillIntrinsicElement.md +0 -5
  485. package/docs/api/types/GroupIntrinsicElement.md +0 -5
  486. package/docs/api/types/HardlineIntrinsicElement.md +0 -5
  487. package/docs/api/types/HbrIntrinsicElement.md +0 -5
  488. package/docs/api/types/IfBreakIntrinsicElement.md +0 -5
  489. package/docs/api/types/IndentIfBreakIntrinsicElement.md +0 -5
  490. package/docs/api/types/IndentIntrinsicElement.md +0 -5
  491. package/docs/api/types/IntrinsicElement.md +0 -5
  492. package/docs/api/types/IntrinsicElementBase.md +0 -9
  493. package/docs/api/types/LbrIntrinsicElement.md +0 -5
  494. package/docs/api/types/LineIntrinsicElement.md +0 -5
  495. package/docs/api/types/LineSuffixBoundaryIntrinsicElement.md +0 -5
  496. package/docs/api/types/LineSuffixIntrinsicElement.md +0 -5
  497. package/docs/api/types/LiterallineIntrinsicElement.md +0 -5
  498. package/docs/api/types/MarkAsRootIntrinsicElement.md +0 -5
  499. package/docs/api/types/PrintHook.md +0 -10
  500. package/docs/api/types/RenderedTextTree.md +0 -5
  501. package/docs/api/types/SbrIntrinsicElement.md +0 -5
  502. package/docs/api/types/SoftlineIntrinsicElement.md +0 -5
  503. package/docs/api/variables/intrinsicElementKey.md +0 -5
  504. package/docs/api/variables/printHookTag.md +0 -7
  505. package/src/print-hook.ts +0 -22
  506. package/src/render.ts +0 -1154
@@ -0,0 +1,797 @@
1
+ /**
2
+ * Direct AlloyNode tree printer.
3
+ *
4
+ * The printer walks the DOM-like AlloyNode tree directly, dispatching on
5
+ * element `localName` and node type. Work items on the command stack carry
6
+ * AlloyNode references or small synthetic frames for constructs that have no
7
+ * node counterpart, such as fill continuation state, `ifBreak` alternate
8
+ * branches, and split text segments.
9
+ *
10
+ * Correctness invariants:
11
+ *
12
+ * - `fits` is continuation-aware (passes `restCommands`).
13
+ * - `breakParent` propagation runs as a prepass over the AlloyNode
14
+ * tree, including into `lineSuffix` content and both branches of
15
+ * `ifBreak` (matching Prettier's `traverseDoc`). Hardline / hbr /
16
+ * literalline / lbr / breakParent / TextNode-with-newline all
17
+ * trigger the propagation.
18
+ * - `lineSuffix` collects deferred `{ind, mode, frame}` commands.
19
+ * - `groupModeMap` carries forward-ref semantics: in `fits`,
20
+ * unknown groupId behaves as flat; during printing, unknown
21
+ * groupId yields no branch on `if-break` / `indent-if-break`.
22
+ * - `fill` uses `mustBeFlat=true` and a separate
23
+ * `firstAndSecondContentFits` measurement; comments are skipped
24
+ * when collecting the parts list.
25
+ * - `trim` rolls back trailing spaces / tabs from the `out` buffer.
26
+ * - String width is Prettier's CJK / east-asian / emoji-aware
27
+ * `getStringWidth` (vendored in `get-string-width.ts`).
28
+ */
29
+
30
+ import { COMMENT_NODE, FRAGMENT_NODE, TEXT_NODE } from "./node.js";
31
+ import { CURSOR_PLACEHOLDER, getStringWidth, joinOut, makeAlign, makeIndent, MODE_BREAK, MODE_FLAT, rootIndent, textHasNewline, textWidth, trimOut } from "./printer-support.js";
32
+
33
+ // #region Frame types
34
+
35
+ const SYNTH = Symbol("alloy:synthetic-frame");
36
+ // #endregion
37
+
38
+ // #region Group broken predicate
39
+
40
+ /**
41
+ * O(1) replacement for Prettier's `propagateBreaks` prepass — the
42
+ * `_breakCount` field on `ElementNode` is maintained eagerly during
43
+ * insertion (see `propagateBreakDelta` in `node.ts`), so deciding
44
+ * whether a `group` is broken is just a field read plus the
45
+ * `shouldBreak` data flag.
46
+ */
47
+ function isGroupBroken(el) {
48
+ if (el._breakCount > 0) return true;
49
+ const data = el.data;
50
+ return data?.shouldBreak === true;
51
+ }
52
+
53
+ // #endregion
54
+
55
+ // #region fits
56
+
57
+ function fits(next, restCommands, width, hasLineSuffix, groupModeMap, mustBeFlat) {
58
+ if (width === Number.POSITIVE_INFINITY) return true;
59
+ let restIdx = restCommands.length;
60
+ const cmds = [next];
61
+ const out = [];
62
+ const dummyInd = next.ind;
63
+ while (width >= 0) {
64
+ if (cmds.length === 0) {
65
+ if (restIdx === 0) return true;
66
+ cmds.push(restCommands[--restIdx]);
67
+ continue;
68
+ }
69
+ const cmd = cmds.pop();
70
+ const mode = cmd.mode;
71
+ const frame = cmd.frame;
72
+ if (typeof frame === "string") {
73
+ out.push(frame);
74
+ width -= getStringWidth(frame);
75
+ continue;
76
+ }
77
+ if (isSynth(frame)) {
78
+ switch (frame.kind) {
79
+ case "fill":
80
+ {
81
+ const parts = collectChildren(frame.node);
82
+ for (let i = parts.length - 1; i >= frame.offset; i--) {
83
+ cmds.push({
84
+ ind: cmd.ind,
85
+ mode,
86
+ frame: parts[i]
87
+ });
88
+ }
89
+ break;
90
+ }
91
+ case "list":
92
+ {
93
+ for (let i = frame.items.length - 1; i >= 0; i--) {
94
+ cmds.push({
95
+ ind: cmd.ind,
96
+ mode,
97
+ frame: frame.items[i]
98
+ });
99
+ }
100
+ break;
101
+ }
102
+ case "line":
103
+ {
104
+ if (mode === MODE_BREAK || frame.hard) return true;
105
+ if (!frame.soft) {
106
+ out.push(" ");
107
+ width--;
108
+ }
109
+ break;
110
+ }
111
+ case "indent":
112
+ {
113
+ // Synthesized indent wrapper — same effect on width as
114
+ // descending into the wrapped node's children.
115
+ for (let c = frame.node.lastChild; c !== null; c = c.previousSibling) {
116
+ if (c.nodeType === COMMENT_NODE) continue;
117
+ cmds.push({
118
+ ind: cmd.ind,
119
+ mode,
120
+ frame: c
121
+ });
122
+ }
123
+ break;
124
+ }
125
+ }
126
+ continue;
127
+ }
128
+
129
+ // AlloyNode
130
+ const node = frame;
131
+ const nt = node.nodeType;
132
+ if (nt === TEXT_NODE) {
133
+ const tn = node;
134
+ const text = tn.data;
135
+ if (text === "") continue;
136
+ if (!textHasNewline(tn)) {
137
+ out.push(text);
138
+ width -= textWidth(tn);
139
+ continue;
140
+ }
141
+ // Multi-line text: on the first newline encountered (in MODE_FLAT
142
+ // we treat it as forcing break — fits returns true if mode is
143
+ // BREAK, since reaching a hard line means content fits in the
144
+ // remaining buffer).
145
+ // Push reversed segments.
146
+ const items = expandMultilineText(text);
147
+ for (let i = items.length - 1; i >= 0; i--) {
148
+ cmds.push({
149
+ ind: cmd.ind,
150
+ mode,
151
+ frame: items[i]
152
+ });
153
+ }
154
+ continue;
155
+ }
156
+ if (nt === COMMENT_NODE) continue;
157
+ if (nt === FRAGMENT_NODE) {
158
+ for (let c = node.lastChild; c !== null; c = c.previousSibling) {
159
+ if (c.nodeType === COMMENT_NODE) continue;
160
+ cmds.push({
161
+ ind: cmd.ind,
162
+ mode,
163
+ frame: c
164
+ });
165
+ }
166
+ continue;
167
+ }
168
+ // ELEMENT_NODE
169
+ const el = node;
170
+ const ln = el.localName;
171
+ switch (ln) {
172
+ case "line":
173
+ case "br":
174
+ if (mode === MODE_BREAK) return true;
175
+ out.push(" ");
176
+ width--;
177
+ break;
178
+ case "softline":
179
+ case "sbr":
180
+ if (mode === MODE_BREAK) return true;
181
+ break;
182
+ case "hardline":
183
+ case "hbr":
184
+ case "literalline":
185
+ case "lbr":
186
+ return true;
187
+ case "breakParent":
188
+ break;
189
+ case "trim":
190
+ width += trimOut(out);
191
+ break;
192
+ case "lineSuffix":
193
+ hasLineSuffix = true;
194
+ break;
195
+ case "lineSuffixBoundary":
196
+ if (hasLineSuffix) return false;
197
+ break;
198
+ case "cursor":
199
+ // Width-neutral marker.
200
+ break;
201
+ case "group":
202
+ {
203
+ const broken = isGroupBroken(el);
204
+ if (mustBeFlat && broken) return false;
205
+ const groupMode = broken ? MODE_BREAK : mode;
206
+ // alloy doesn't use expandedStates — descend into children.
207
+ for (let c = el.lastChild; c !== null; c = c.previousSibling) {
208
+ if (c.nodeType === COMMENT_NODE) continue;
209
+ cmds.push({
210
+ ind: cmd.ind,
211
+ mode: groupMode,
212
+ frame: c
213
+ });
214
+ }
215
+ break;
216
+ }
217
+ case "ifBreak":
218
+ {
219
+ const data = el.data;
220
+ const groupMode = data?.groupId ? groupModeMap[data.groupId] || MODE_FLAT : mode;
221
+ if (groupMode === MODE_BREAK) {
222
+ for (let c = el.lastChild; c !== null; c = c.previousSibling) {
223
+ if (c.nodeType === COMMENT_NODE) continue;
224
+ cmds.push({
225
+ ind: cmd.ind,
226
+ mode,
227
+ frame: c
228
+ });
229
+ }
230
+ } else {
231
+ if (data?.flatNode !== undefined) {
232
+ cmds.push({
233
+ ind: cmd.ind,
234
+ mode,
235
+ frame: data.flatNode
236
+ });
237
+ } else if (data?.flatText !== undefined && data.flatText !== "") {
238
+ cmds.push({
239
+ ind: cmd.ind,
240
+ mode,
241
+ frame: data.flatText
242
+ });
243
+ }
244
+ }
245
+ break;
246
+ }
247
+ case "indentIfBreak":
248
+ {
249
+ const data = el.data;
250
+ const groupMode = data?.groupId ? groupModeMap[data.groupId] || MODE_FLAT : mode;
251
+ // For width measurement, indent vs no-indent doesn't matter (no
252
+ // newlines emitted in the candidate group while measuring flat,
253
+ // and on hardline we return true). Just descend.
254
+ for (let c = el.lastChild; c !== null; c = c.previousSibling) {
255
+ if (c.nodeType === COMMENT_NODE) continue;
256
+ cmds.push({
257
+ ind: cmd.ind,
258
+ mode,
259
+ frame: c
260
+ });
261
+ }
262
+ // Suppress unused warning in case the linter complains.
263
+ void groupMode;
264
+ break;
265
+ }
266
+ case "fill":
267
+ case "indent":
268
+ case "align":
269
+ case "dedent":
270
+ case "dedentToRoot":
271
+ case "markAsRoot":
272
+ case "label":
273
+ default:
274
+ // Transparent for fits: descend into children.
275
+ for (let c = el.lastChild; c !== null; c = c.previousSibling) {
276
+ if (c.nodeType === COMMENT_NODE) continue;
277
+ cmds.push({
278
+ ind: cmd.ind,
279
+ mode,
280
+ frame: c
281
+ });
282
+ }
283
+ break;
284
+ }
285
+ }
286
+ void dummyInd;
287
+ return false;
288
+ }
289
+
290
+ // #endregion
291
+
292
+ // #region Helpers
293
+
294
+ function isSynth(f) {
295
+ return typeof f === "object" && f !== null && f[SYNTH] === true;
296
+ }
297
+
298
+ /**
299
+ * Collect the non-comment children of an element into an array
300
+ * (in order). Used for `fill` part indexing — `fill` requires random
301
+ * access on the parts list (offset, length), which a linked list
302
+ * doesn't provide cheaply. Cached per ElementNode to amortize across
303
+ * the multiple fits-measurements `fill` performs.
304
+ */
305
+ const fillPartsCache = new WeakMap();
306
+ function collectChildren(el) {
307
+ const cached = fillPartsCache.get(el);
308
+ if (cached !== undefined) return cached;
309
+ const out = [];
310
+ for (let c = el.firstChild; c !== null; c = c.nextSibling) {
311
+ if (c.nodeType === COMMENT_NODE) continue;
312
+ out.push(c);
313
+ }
314
+ fillPartsCache.set(el, out);
315
+ return out;
316
+ }
317
+
318
+ /**
319
+ * Expand a TextNode's `data` containing newlines into a flat list of
320
+ * frames matching `convertText` in `to-doc.ts` — segment strings
321
+ * separated by synthetic hardlines. Empty segments are dropped, just
322
+ * like Prettier's `[hardline, "x", hardline, "y"]` (no empty strings).
323
+ */
324
+ function expandMultilineText(text) {
325
+ const parts = text.split(/\r?\n/);
326
+ const out = [];
327
+ const synthHardline = {
328
+ [SYNTH]: true,
329
+ kind: "line",
330
+ hard: true
331
+ };
332
+ for (let i = 0; i < parts.length; i++) {
333
+ if (i > 0) out.push(synthHardline);
334
+ if (parts[i] !== "") out.push(parts[i]);
335
+ }
336
+ return out;
337
+ }
338
+
339
+ // #endregion
340
+
341
+ // #region Main entry point
342
+
343
+ export function printNodeToString(root, options) {
344
+ // Group "broken" status is maintained eagerly during render via
345
+ // `propagateBreakDelta` in node.ts (which keeps `el._breakCount`
346
+ // accurate). The `isGroupBroken` helper below reads it in O(1) so we
347
+ // no longer need the per-print `propagateBreaks` walk over the tree.
348
+
349
+ const groupModeMap = {};
350
+ const width = options.printWidth;
351
+ const newLine = "\n";
352
+ let pos = 0;
353
+ const cmds = [{
354
+ ind: rootIndent(),
355
+ mode: MODE_BREAK,
356
+ frame: root
357
+ }];
358
+ const out = [];
359
+ let shouldRemeasure = false;
360
+ const lineSuffix = [];
361
+ while (cmds.length > 0) {
362
+ const cmd = cmds.pop();
363
+ const ind = cmd.ind;
364
+ const mode = cmd.mode;
365
+ const frame = cmd.frame;
366
+
367
+ // ---- string ----
368
+ if (typeof frame === "string") {
369
+ out.push(frame);
370
+ if (cmds.length > 0) pos += getStringWidth(frame);
371
+ continue;
372
+ }
373
+
374
+ // ---- synthetic ----
375
+ if (isSynth(frame)) {
376
+ switch (frame.kind) {
377
+ case "fill":
378
+ handleFill(frame.node, frame.offset, ind, mode);
379
+ break;
380
+ case "list":
381
+ {
382
+ for (let i = frame.items.length - 1; i >= 0; i--) {
383
+ cmds.push({
384
+ ind,
385
+ mode,
386
+ frame: frame.items[i]
387
+ });
388
+ }
389
+ break;
390
+ }
391
+ case "line":
392
+ handleLine(!!frame.hard, !!frame.soft, !!frame.literal, ind, mode);
393
+ break;
394
+ case "indent":
395
+ cmds.push({
396
+ ind: makeIndent(ind, options),
397
+ mode,
398
+ frame: {
399
+ [SYNTH]: true,
400
+ kind: "list",
401
+ items: collectChildren(frame.node)
402
+ }
403
+ });
404
+ break;
405
+ }
406
+ // After-pop line-suffix flush check.
407
+ if (cmds.length === 0 && lineSuffix.length > 0) {
408
+ cmds.push(...lineSuffix.reverse());
409
+ lineSuffix.length = 0;
410
+ }
411
+ continue;
412
+ }
413
+
414
+ // ---- AlloyNode ----
415
+ const node = frame;
416
+ const nt = node.nodeType;
417
+ if (nt === TEXT_NODE) {
418
+ const tn = node;
419
+ const text = tn.data;
420
+ if (text === "") {
421
+ // empty text: nothing
422
+ } else if (!textHasNewline(tn)) {
423
+ out.push(text);
424
+ if (cmds.length > 0) pos += textWidth(tn);
425
+ } else {
426
+ // multiline: expand into segments + synthetic hardlines.
427
+ const items = expandMultilineText(text);
428
+ for (let i = items.length - 1; i >= 0; i--) {
429
+ cmds.push({
430
+ ind,
431
+ mode,
432
+ frame: items[i]
433
+ });
434
+ }
435
+ }
436
+ } else if (nt === COMMENT_NODE) {
437
+ // skip
438
+ } else if (nt === FRAGMENT_NODE) {
439
+ for (let c = node.lastChild; c !== null; c = c.previousSibling) {
440
+ if (c.nodeType === COMMENT_NODE) continue;
441
+ cmds.push({
442
+ ind,
443
+ mode,
444
+ frame: c
445
+ });
446
+ }
447
+ } else {
448
+ // ELEMENT_NODE
449
+ const el = node;
450
+ handleElement(el, ind, mode);
451
+ }
452
+ if (cmds.length === 0 && lineSuffix.length > 0) {
453
+ cmds.push(...lineSuffix.reverse());
454
+ lineSuffix.length = 0;
455
+ }
456
+ }
457
+ return {
458
+ formatted: joinOut(out)
459
+ };
460
+
461
+ // #region Closures
462
+
463
+ function pushChildrenReversed(el, ind, mode) {
464
+ for (let c = el.lastChild; c !== null; c = c.previousSibling) {
465
+ if (c.nodeType === COMMENT_NODE) continue;
466
+ cmds.push({
467
+ ind,
468
+ mode,
469
+ frame: c
470
+ });
471
+ }
472
+ }
473
+ function handleElement(el, ind, mode) {
474
+ const ln = el.localName;
475
+ switch (ln) {
476
+ case "line":
477
+ case "br":
478
+ handleLine(false, false, false, ind, mode);
479
+ return;
480
+ case "softline":
481
+ case "sbr":
482
+ handleLine(false, true, false, ind, mode);
483
+ return;
484
+ case "hardline":
485
+ case "hbr":
486
+ handleLine(true, false, false, ind, mode);
487
+ return;
488
+ case "literalline":
489
+ case "lbr":
490
+ handleLine(true, false, true, ind, mode);
491
+ return;
492
+ case "breakParent":
493
+ return;
494
+ case "trim":
495
+ pos -= trimOut(out);
496
+ return;
497
+ case "cursor":
498
+ out.push(CURSOR_PLACEHOLDER);
499
+ return;
500
+ case "indent":
501
+ pushChildrenReversed(el, makeIndent(ind, options), mode);
502
+ return;
503
+ case "dedent":
504
+ pushChildrenReversed(el, makeAlign(ind, -1, options), mode);
505
+ return;
506
+ case "dedentToRoot":
507
+ pushChildrenReversed(el, makeAlign(ind, Number.NEGATIVE_INFINITY, options), mode);
508
+ return;
509
+ case "markAsRoot":
510
+ pushChildrenReversed(el, makeAlign(ind, {
511
+ type: "root"
512
+ }, options), mode);
513
+ return;
514
+ case "align":
515
+ {
516
+ const data = el.data;
517
+ const widthOrString = data?.count ?? data?.width ?? data?.string ?? 0;
518
+ pushChildrenReversed(el, makeAlign(ind, widthOrString, options), mode);
519
+ return;
520
+ }
521
+ case "label":
522
+ pushChildrenReversed(el, ind, mode);
523
+ return;
524
+ case "lineSuffix":
525
+ {
526
+ // Defer contents as a single list frame; capture current ind and mode.
527
+ lineSuffix.push({
528
+ ind,
529
+ mode,
530
+ frame: {
531
+ [SYNTH]: true,
532
+ kind: "list",
533
+ items: collectChildren(el)
534
+ }
535
+ });
536
+ return;
537
+ }
538
+ case "lineSuffixBoundary":
539
+ if (lineSuffix.length > 0) {
540
+ // Synthesize hardlineWithoutBreakParent.
541
+ cmds.push({
542
+ ind,
543
+ mode,
544
+ frame: {
545
+ [SYNTH]: true,
546
+ kind: "line",
547
+ hard: true
548
+ }
549
+ });
550
+ }
551
+ return;
552
+ case "group":
553
+ handleGroup(el, ind, mode);
554
+ return;
555
+ case "ifBreak":
556
+ handleIfBreak(el, ind, mode);
557
+ return;
558
+ case "indentIfBreak":
559
+ handleIndentIfBreak(el, ind, mode);
560
+ return;
561
+ case "fill":
562
+ handleFillElement(el, ind, mode);
563
+ return;
564
+ default:
565
+ // Unknown: transparent container.
566
+ pushChildrenReversed(el, ind, mode);
567
+ return;
568
+ }
569
+ }
570
+ function handleGroup(el, ind, mode) {
571
+ const data = el.data;
572
+ const broken = isGroupBroken(el);
573
+ const groupId = data?.id;
574
+ switch (mode) {
575
+ case MODE_FLAT:
576
+ {
577
+ if (!shouldRemeasure) {
578
+ // Stay flat (or step into break if shouldBreak).
579
+ const m = broken ? MODE_BREAK : MODE_FLAT;
580
+ pushChildrenReversedAtMode(el, ind, m);
581
+ break;
582
+ }
583
+ }
584
+ // fallthrough
585
+ // eslint-disable-next-line no-fallthrough
586
+ case MODE_BREAK:
587
+ {
588
+ shouldRemeasure = false;
589
+ // Build a "candidate" cmd that pushes the group's children flat.
590
+ // We measure via fits using a synthetic single frame: the
591
+ // element itself with mode=FLAT. But fits descends into children
592
+ // since group dispatches to them. To match prettier semantics
593
+ // exactly (fits treats group as: if mustBeFlat&&broken→false,
594
+ // else descend into contents at groupMode), passing the group
595
+ // itself works.
596
+ const next = {
597
+ ind,
598
+ mode: MODE_FLAT,
599
+ frame: el
600
+ };
601
+ const rem = width - pos;
602
+ const hasLS = lineSuffix.length > 0;
603
+ if (!broken && fits(next, cmds, rem, hasLS, groupModeMap, false)) {
604
+ // Push children flat.
605
+ pushChildrenReversedAtMode(el, ind, MODE_FLAT);
606
+ } else {
607
+ // Push children broken.
608
+ pushChildrenReversedAtMode(el, ind, MODE_BREAK);
609
+ }
610
+ break;
611
+ }
612
+ }
613
+ if (groupId) {
614
+ groupModeMap[groupId] = cmds.length > 0 ? cmds[cmds.length - 1].mode : mode;
615
+ }
616
+ }
617
+ function pushChildrenReversedAtMode(el, ind, mode) {
618
+ for (let c = el.lastChild; c !== null; c = c.previousSibling) {
619
+ if (c.nodeType === COMMENT_NODE) continue;
620
+ cmds.push({
621
+ ind,
622
+ mode,
623
+ frame: c
624
+ });
625
+ }
626
+ }
627
+ function handleIfBreak(el, ind, mode) {
628
+ const data = el.data;
629
+ const groupMode = data?.groupId ? groupModeMap[data.groupId] : mode;
630
+ if (groupMode === MODE_BREAK) {
631
+ // Push children (the breakContents).
632
+ pushChildrenReversed(el, ind, mode);
633
+ } else if (groupMode === MODE_FLAT) {
634
+ if (data?.flatNode !== undefined) {
635
+ cmds.push({
636
+ ind,
637
+ mode,
638
+ frame: data.flatNode
639
+ });
640
+ } else if (data?.flatText !== undefined && data.flatText !== "") {
641
+ cmds.push({
642
+ ind,
643
+ mode,
644
+ frame: data.flatText
645
+ });
646
+ }
647
+ }
648
+ // groupMode === undefined: emit nothing (matches prettier).
649
+ }
650
+ function handleIndentIfBreak(el, ind, mode) {
651
+ const data = el.data;
652
+ const groupMode = data?.groupId ? groupModeMap[data.groupId] : mode;
653
+ const negate = !!data?.negate;
654
+ if (groupMode === MODE_BREAK) {
655
+ if (negate) {
656
+ // breakContents = original children (no indent).
657
+ pushChildrenReversed(el, ind, mode);
658
+ } else {
659
+ // breakContents = indent(children).
660
+ pushChildrenReversed(el, makeIndent(ind, options), mode);
661
+ }
662
+ } else if (groupMode === MODE_FLAT) {
663
+ if (negate) {
664
+ // flatContents = indent(children).
665
+ pushChildrenReversed(el, makeIndent(ind, options), mode);
666
+ } else {
667
+ // flatContents = original children.
668
+ pushChildrenReversed(el, ind, mode);
669
+ }
670
+ }
671
+ }
672
+ function handleFillElement(el, ind, mode) {
673
+ handleFill(el, 0, ind, mode);
674
+ }
675
+ function handleFill(el, offset, indArg, modeArg) {
676
+ const ind = indArg ?? rootIndent();
677
+ const mode = modeArg ?? MODE_BREAK;
678
+ const parts = collectChildren(el);
679
+ const rem = width - pos;
680
+ const length = parts.length - offset;
681
+ if (length === 0) return;
682
+ const content = parts[offset + 0];
683
+ const whitespace = parts[offset + 1];
684
+ const contentFlatCmd = {
685
+ ind,
686
+ mode: MODE_FLAT,
687
+ frame: content
688
+ };
689
+ const contentBreakCmd = {
690
+ ind,
691
+ mode: MODE_BREAK,
692
+ frame: content
693
+ };
694
+ const contentFits = fits(contentFlatCmd, [], rem, lineSuffix.length > 0, groupModeMap, true);
695
+ if (length === 1) {
696
+ if (contentFits) cmds.push(contentFlatCmd);else cmds.push(contentBreakCmd);
697
+ return;
698
+ }
699
+ const whitespaceFlatCmd = {
700
+ ind,
701
+ mode: MODE_FLAT,
702
+ frame: whitespace
703
+ };
704
+ const whitespaceBreakCmd = {
705
+ ind,
706
+ mode: MODE_BREAK,
707
+ frame: whitespace
708
+ };
709
+ if (length === 2) {
710
+ if (contentFits) cmds.push(whitespaceFlatCmd, contentFlatCmd);else cmds.push(whitespaceBreakCmd, contentBreakCmd);
711
+ return;
712
+ }
713
+ const secondContent = parts[offset + 2];
714
+ const remainingCmd = {
715
+ ind,
716
+ mode,
717
+ frame: {
718
+ [SYNTH]: true,
719
+ kind: "fill",
720
+ node: el,
721
+ offset: offset + 2
722
+ }
723
+ };
724
+ const firstAndSecondListFrame = {
725
+ [SYNTH]: true,
726
+ kind: "list",
727
+ items: [content, whitespace, secondContent]
728
+ };
729
+ const firstAndSecondContentFits = fits({
730
+ ind,
731
+ mode: MODE_FLAT,
732
+ frame: firstAndSecondListFrame
733
+ }, [], rem, lineSuffix.length > 0, groupModeMap, true);
734
+ if (firstAndSecondContentFits) {
735
+ cmds.push(remainingCmd, whitespaceFlatCmd, contentFlatCmd);
736
+ } else if (contentFits) {
737
+ cmds.push(remainingCmd, whitespaceBreakCmd, contentFlatCmd);
738
+ } else {
739
+ cmds.push(remainingCmd, whitespaceBreakCmd, contentBreakCmd);
740
+ }
741
+ }
742
+ function handleLine(hard, soft, literal, ind, mode) {
743
+ switch (mode) {
744
+ case MODE_FLAT:
745
+ if (!hard) {
746
+ if (!soft) {
747
+ out.push(" ");
748
+ pos += 1;
749
+ }
750
+ break;
751
+ } else {
752
+ shouldRemeasure = true;
753
+ }
754
+ // fallthrough
755
+ // eslint-disable-next-line no-fallthrough
756
+ case MODE_BREAK:
757
+ if (lineSuffix.length > 0) {
758
+ // Re-push the line as a synthetic frame and then the suffix.
759
+ cmds.push({
760
+ ind,
761
+ mode,
762
+ frame: {
763
+ [SYNTH]: true,
764
+ kind: "line",
765
+ hard,
766
+ soft,
767
+ literal
768
+ }
769
+ });
770
+ for (let i = lineSuffix.length - 1; i >= 0; i--) {
771
+ cmds.push(lineSuffix[i]);
772
+ }
773
+ lineSuffix.length = 0;
774
+ break;
775
+ }
776
+ if (literal) {
777
+ if (ind.root) {
778
+ out.push(newLine, ind.root.value);
779
+ pos = ind.root.length;
780
+ } else {
781
+ out.push(newLine);
782
+ pos = 0;
783
+ }
784
+ } else {
785
+ pos -= trimOut(out);
786
+ out.push(newLine + ind.value);
787
+ pos = ind.length;
788
+ }
789
+ break;
790
+ }
791
+ }
792
+
793
+ // #endregion
794
+ }
795
+
796
+ // #endregion
797
+ //# sourceMappingURL=printer.js.map