@fairyhunter13/opentui-core 0.1.112 → 0.1.114

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 (591) hide show
  1. package/dev/keypress-debug-renderer.ts +148 -0
  2. package/dev/keypress-debug.ts +43 -0
  3. package/dev/print-env-vars.ts +32 -0
  4. package/dev/test-tmux-graphics-334.sh +68 -0
  5. package/dev/thai-debug-test.ts +68 -0
  6. package/docs/development.md +144 -0
  7. package/package.json +63 -51
  8. package/scripts/build.ts +400 -0
  9. package/scripts/publish.ts +60 -0
  10. package/src/3d/SpriteResourceManager.ts +286 -0
  11. package/src/3d/SpriteUtils.ts +70 -0
  12. package/src/3d/TextureUtils.ts +196 -0
  13. package/src/3d/ThreeRenderable.ts +197 -0
  14. package/src/3d/WGPURenderer.ts +294 -0
  15. package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
  16. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
  17. package/src/3d/animation/SpriteAnimator.ts +633 -0
  18. package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
  19. package/src/3d/canvas.ts +464 -0
  20. package/src/3d/index.ts +12 -0
  21. package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
  22. package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
  23. package/src/3d/physics/physics-interface.ts +31 -0
  24. package/src/3d/shaders/supersampling.wgsl +201 -0
  25. package/src/3d.ts +3 -0
  26. package/src/NativeSpanFeed.ts +300 -0
  27. package/src/Renderable.ts +1704 -0
  28. package/src/__snapshots__/buffer.test.ts.snap +28 -0
  29. package/src/animation/Timeline.test.ts +2709 -0
  30. package/src/animation/Timeline.ts +598 -0
  31. package/src/ansi.ts +18 -0
  32. package/src/benchmark/attenuation-benchmark.ts +81 -0
  33. package/src/benchmark/colormatrix-benchmark.ts +128 -0
  34. package/src/benchmark/gain-benchmark.ts +80 -0
  35. package/src/benchmark/latest-all-bench-run.json +707 -0
  36. package/src/benchmark/latest-async-bench-run.json +336 -0
  37. package/src/benchmark/latest-default-bench-run.json +657 -0
  38. package/src/benchmark/latest-large-bench-run.json +707 -0
  39. package/src/benchmark/latest-quick-bench-run.json +207 -0
  40. package/src/benchmark/markdown-benchmark.ts +1796 -0
  41. package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
  42. package/src/benchmark/native-span-feed-benchmark.md +56 -0
  43. package/src/benchmark/native-span-feed-benchmark.ts +596 -0
  44. package/src/benchmark/native-span-feed-compare.ts +280 -0
  45. package/src/benchmark/renderer-benchmark.ts +754 -0
  46. package/src/benchmark/text-table-benchmark.ts +948 -0
  47. package/src/buffer.test.ts +291 -0
  48. package/src/buffer.ts +554 -0
  49. package/src/console.test.ts +612 -0
  50. package/src/console.ts +1254 -0
  51. package/src/edit-buffer.test.ts +1769 -0
  52. package/src/edit-buffer.ts +411 -0
  53. package/src/editor-view.test.ts +1032 -0
  54. package/src/editor-view.ts +284 -0
  55. package/src/examples/ascii-font-selection-demo.ts +245 -0
  56. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  57. package/src/examples/assets/concrete.png +0 -0
  58. package/src/examples/assets/crate.png +0 -0
  59. package/src/examples/assets/crate_emissive.png +0 -0
  60. package/src/examples/assets/forrest_background.png +0 -0
  61. package/src/examples/assets/hast-example.json +1018 -0
  62. package/src/examples/assets/heart.png +0 -0
  63. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  64. package/src/examples/assets/main_char_idle.png +0 -0
  65. package/src/examples/assets/main_char_jump_end.png +0 -0
  66. package/src/examples/assets/main_char_jump_landing.png +0 -0
  67. package/src/examples/assets/main_char_jump_start.png +0 -0
  68. package/src/examples/assets/main_char_run_loop.png +0 -0
  69. package/src/examples/assets/roughness_map.jpg +0 -0
  70. package/src/examples/build.ts +115 -0
  71. package/src/examples/code-demo.ts +924 -0
  72. package/src/examples/console-demo.ts +358 -0
  73. package/src/examples/core-plugin-slots-demo.ts +759 -0
  74. package/src/examples/diff-demo.ts +701 -0
  75. package/src/examples/draggable-three-demo.ts +259 -0
  76. package/src/examples/editor-demo.ts +322 -0
  77. package/src/examples/extmarks-demo.ts +196 -0
  78. package/src/examples/focus-restore-demo.ts +310 -0
  79. package/src/examples/fonts.ts +245 -0
  80. package/src/examples/fractal-shader-demo.ts +268 -0
  81. package/src/examples/framebuffer-demo.ts +674 -0
  82. package/src/examples/full-unicode-demo.ts +241 -0
  83. package/src/examples/golden-star-demo.ts +933 -0
  84. package/src/examples/grayscale-buffer-demo.ts +249 -0
  85. package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
  86. package/src/examples/index.ts +926 -0
  87. package/src/examples/input-demo.ts +377 -0
  88. package/src/examples/input-select-layout-demo.ts +425 -0
  89. package/src/examples/install.sh +143 -0
  90. package/src/examples/keypress-debug-demo.ts +452 -0
  91. package/src/examples/lib/HexList.ts +122 -0
  92. package/src/examples/lib/PaletteGrid.ts +125 -0
  93. package/src/examples/lib/standalone-keys.ts +25 -0
  94. package/src/examples/lib/tab-controller.ts +243 -0
  95. package/src/examples/lights-phong-demo.ts +290 -0
  96. package/src/examples/link-demo.ts +220 -0
  97. package/src/examples/live-state-demo.ts +480 -0
  98. package/src/examples/markdown-demo.ts +725 -0
  99. package/src/examples/mouse-interaction-demo.ts +428 -0
  100. package/src/examples/nested-zindex-demo.ts +357 -0
  101. package/src/examples/opacity-example.ts +235 -0
  102. package/src/examples/opentui-demo.ts +1057 -0
  103. package/src/examples/physx-planck-2d-demo.ts +623 -0
  104. package/src/examples/physx-rapier-2d-demo.ts +655 -0
  105. package/src/examples/relative-positioning-demo.ts +323 -0
  106. package/src/examples/scroll-example.ts +214 -0
  107. package/src/examples/scrollbox-mouse-test.ts +112 -0
  108. package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
  109. package/src/examples/select-demo.ts +237 -0
  110. package/src/examples/shader-cube-demo.ts +1015 -0
  111. package/src/examples/simple-layout-example.ts +591 -0
  112. package/src/examples/slider-demo.ts +617 -0
  113. package/src/examples/split-mode-demo.ts +453 -0
  114. package/src/examples/sprite-animation-demo.ts +443 -0
  115. package/src/examples/sprite-particle-generator-demo.ts +486 -0
  116. package/src/examples/static-sprite-demo.ts +193 -0
  117. package/src/examples/sticky-scroll-example.ts +308 -0
  118. package/src/examples/styled-text-demo.ts +282 -0
  119. package/src/examples/tab-select-demo.ts +219 -0
  120. package/src/examples/terminal-title.ts +29 -0
  121. package/src/examples/terminal.ts +305 -0
  122. package/src/examples/text-node-demo.ts +416 -0
  123. package/src/examples/text-selection-demo.ts +377 -0
  124. package/src/examples/text-table-demo.ts +503 -0
  125. package/src/examples/text-truncation-demo.ts +481 -0
  126. package/src/examples/text-wrap.ts +757 -0
  127. package/src/examples/texture-loading-demo.ts +259 -0
  128. package/src/examples/timeline-example.ts +670 -0
  129. package/src/examples/transparency-demo.ts +400 -0
  130. package/src/examples/vnode-composition-demo.ts +404 -0
  131. package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
  132. package/src/index.ts +24 -0
  133. package/src/lib/KeyHandler.integration.test.ts +292 -0
  134. package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
  135. package/src/lib/KeyHandler.test.ts +662 -0
  136. package/src/lib/KeyHandler.ts +222 -0
  137. package/src/lib/RGBA.test.ts +984 -0
  138. package/src/lib/RGBA.ts +204 -0
  139. package/src/lib/ascii.font.ts +330 -0
  140. package/src/lib/border.test.ts +83 -0
  141. package/src/lib/border.ts +170 -0
  142. package/src/lib/bunfs.test.ts +27 -0
  143. package/src/lib/bunfs.ts +18 -0
  144. package/src/lib/clipboard.test.ts +41 -0
  145. package/src/lib/clipboard.ts +47 -0
  146. package/src/lib/clock.ts +35 -0
  147. package/src/lib/data-paths.test.ts +133 -0
  148. package/src/lib/data-paths.ts +109 -0
  149. package/src/lib/debounce.ts +106 -0
  150. package/src/lib/detect-links.test.ts +98 -0
  151. package/src/lib/detect-links.ts +56 -0
  152. package/src/lib/env.test.ts +228 -0
  153. package/src/lib/env.ts +209 -0
  154. package/src/lib/extmarks-history.ts +51 -0
  155. package/src/lib/extmarks-multiwidth.test.ts +322 -0
  156. package/src/lib/extmarks.test.ts +3457 -0
  157. package/src/lib/extmarks.ts +843 -0
  158. package/src/lib/fonts/block.json +405 -0
  159. package/src/lib/fonts/grid.json +265 -0
  160. package/src/lib/fonts/huge.json +741 -0
  161. package/src/lib/fonts/pallet.json +314 -0
  162. package/src/lib/fonts/shade.json +591 -0
  163. package/src/lib/fonts/slick.json +321 -0
  164. package/src/lib/fonts/tiny.json +69 -0
  165. package/src/lib/hast-styled-text.ts +59 -0
  166. package/src/lib/index.ts +21 -0
  167. package/src/lib/keymapping.test.ts +317 -0
  168. package/src/lib/keymapping.ts +115 -0
  169. package/src/lib/objects-in-viewport.test.ts +787 -0
  170. package/src/lib/objects-in-viewport.ts +153 -0
  171. package/src/lib/output.capture.ts +58 -0
  172. package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
  173. package/src/lib/parse.keypress-kitty.test.ts +663 -0
  174. package/src/lib/parse.keypress-kitty.ts +439 -0
  175. package/src/lib/parse.keypress.test.ts +1849 -0
  176. package/src/lib/parse.keypress.ts +397 -0
  177. package/src/lib/parse.mouse.test.ts +552 -0
  178. package/src/lib/parse.mouse.ts +232 -0
  179. package/src/lib/paste.ts +16 -0
  180. package/src/lib/queue.ts +65 -0
  181. package/src/lib/renderable.validations.test.ts +87 -0
  182. package/src/lib/renderable.validations.ts +83 -0
  183. package/src/lib/scroll-acceleration.ts +98 -0
  184. package/src/lib/selection.ts +240 -0
  185. package/src/lib/singleton.ts +28 -0
  186. package/src/lib/stdin-parser.test.ts +2290 -0
  187. package/src/lib/stdin-parser.ts +1810 -0
  188. package/src/lib/styled-text.ts +178 -0
  189. package/src/lib/terminal-capability-detection.test.ts +202 -0
  190. package/src/lib/terminal-capability-detection.ts +79 -0
  191. package/src/lib/terminal-palette.test.ts +878 -0
  192. package/src/lib/terminal-palette.ts +383 -0
  193. package/src/lib/tree-sitter/assets/README.md +118 -0
  194. package/src/lib/tree-sitter/assets/update.ts +334 -0
  195. package/src/lib/tree-sitter/assets.d.ts +9 -0
  196. package/src/lib/tree-sitter/cache.test.ts +273 -0
  197. package/src/lib/tree-sitter/client.test.ts +1165 -0
  198. package/src/lib/tree-sitter/client.ts +607 -0
  199. package/src/lib/tree-sitter/default-parsers.ts +86 -0
  200. package/src/lib/tree-sitter/download-utils.ts +148 -0
  201. package/src/lib/tree-sitter/index.ts +28 -0
  202. package/src/lib/tree-sitter/parser.worker.ts +1042 -0
  203. package/src/lib/tree-sitter/parsers-config.ts +81 -0
  204. package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
  205. package/src/lib/tree-sitter/resolve-ft.ts +189 -0
  206. package/src/lib/tree-sitter/types.ts +82 -0
  207. package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
  208. package/src/lib/tree-sitter-styled-text.ts +306 -0
  209. package/src/lib/validate-dir-name.ts +55 -0
  210. package/src/lib/yoga.options.test.ts +628 -0
  211. package/src/lib/yoga.options.ts +346 -0
  212. package/src/plugins/core-slot.ts +579 -0
  213. package/src/plugins/registry.ts +402 -0
  214. package/src/plugins/types.ts +46 -0
  215. package/src/post/effects.ts +930 -0
  216. package/src/post/filters.ts +489 -0
  217. package/src/post/matrices.ts +288 -0
  218. package/src/renderables/ASCIIFont.ts +219 -0
  219. package/src/renderables/Box.test.ts +205 -0
  220. package/src/renderables/Box.ts +326 -0
  221. package/src/renderables/Code.test.ts +2062 -0
  222. package/src/renderables/Code.ts +357 -0
  223. package/src/renderables/Diff.regression.test.ts +226 -0
  224. package/src/renderables/Diff.test.ts +3101 -0
  225. package/src/renderables/Diff.ts +1211 -0
  226. package/src/renderables/EditBufferRenderable.test.ts +288 -0
  227. package/src/renderables/EditBufferRenderable.ts +1166 -0
  228. package/src/renderables/FrameBuffer.ts +47 -0
  229. package/src/renderables/Input.test.ts +1228 -0
  230. package/src/renderables/Input.ts +247 -0
  231. package/src/renderables/LineNumberRenderable.ts +724 -0
  232. package/src/renderables/Markdown.ts +1393 -0
  233. package/src/renderables/ScrollBar.ts +422 -0
  234. package/src/renderables/ScrollBox.ts +883 -0
  235. package/src/renderables/Select.test.ts +1033 -0
  236. package/src/renderables/Select.ts +524 -0
  237. package/src/renderables/Slider.test.ts +456 -0
  238. package/src/renderables/Slider.ts +342 -0
  239. package/src/renderables/TabSelect.test.ts +197 -0
  240. package/src/renderables/TabSelect.ts +455 -0
  241. package/src/renderables/Text.selection-buffer.test.ts +123 -0
  242. package/src/renderables/Text.test.ts +2660 -0
  243. package/src/renderables/Text.ts +147 -0
  244. package/src/renderables/TextBufferRenderable.ts +518 -0
  245. package/src/renderables/TextNode.test.ts +1058 -0
  246. package/src/renderables/TextNode.ts +325 -0
  247. package/src/renderables/TextTable.test.ts +1421 -0
  248. package/src/renderables/TextTable.ts +1344 -0
  249. package/src/renderables/Textarea.ts +430 -0
  250. package/src/renderables/TimeToFirstDraw.ts +89 -0
  251. package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
  252. package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
  253. package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
  254. package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
  255. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
  256. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
  257. package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
  258. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
  259. package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
  260. package/src/renderables/__tests__/Markdown.test.ts +2518 -0
  261. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
  262. package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
  263. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
  264. package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
  265. package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
  266. package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
  267. package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
  268. package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
  269. package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
  270. package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
  271. package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
  272. package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
  273. package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
  274. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
  275. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
  276. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
  277. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
  278. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
  279. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
  280. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
  281. package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
  282. package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
  283. package/src/renderables/composition/README.md +8 -0
  284. package/src/renderables/composition/VRenderable.ts +32 -0
  285. package/src/renderables/composition/constructs.ts +127 -0
  286. package/src/renderables/composition/vnode.ts +289 -0
  287. package/src/renderables/index.ts +23 -0
  288. package/src/renderables/markdown-parser.ts +66 -0
  289. package/src/renderer.ts +2681 -0
  290. package/src/runtime-plugin-support.ts +39 -0
  291. package/src/runtime-plugin.ts +615 -0
  292. package/src/syntax-style.test.ts +841 -0
  293. package/src/syntax-style.ts +257 -0
  294. package/src/testing/README.md +210 -0
  295. package/src/testing/capture-spans.test.ts +194 -0
  296. package/src/testing/integration.test.ts +276 -0
  297. package/src/testing/manual-clock.ts +117 -0
  298. package/src/testing/mock-keys.test.ts +1378 -0
  299. package/src/testing/mock-keys.ts +457 -0
  300. package/src/testing/mock-mouse.test.ts +218 -0
  301. package/src/testing/mock-mouse.ts +247 -0
  302. package/src/testing/mock-tree-sitter-client.ts +73 -0
  303. package/src/testing/spy.ts +13 -0
  304. package/src/testing/test-recorder.test.ts +415 -0
  305. package/src/testing/test-recorder.ts +145 -0
  306. package/src/testing/test-renderer.ts +132 -0
  307. package/src/testing.ts +7 -0
  308. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
  309. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
  310. package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
  311. package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
  312. package/src/tests/allocator-stats.test.ts +38 -0
  313. package/src/tests/destroy-during-render.test.ts +200 -0
  314. package/src/tests/destroy-on-exit.fixture.ts +36 -0
  315. package/src/tests/destroy-on-exit.test.ts +41 -0
  316. package/src/tests/hover-cursor.test.ts +98 -0
  317. package/src/tests/native-span-feed-async.test.ts +173 -0
  318. package/src/tests/native-span-feed-close.test.ts +120 -0
  319. package/src/tests/native-span-feed-coverage.test.ts +227 -0
  320. package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
  321. package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
  322. package/src/tests/opacity.test.ts +123 -0
  323. package/src/tests/renderable.snapshot.test.ts +524 -0
  324. package/src/tests/renderable.test.ts +1281 -0
  325. package/src/tests/renderer.clock.test.ts +158 -0
  326. package/src/tests/renderer.console-startup.test.ts +185 -0
  327. package/src/tests/renderer.control.test.ts +425 -0
  328. package/src/tests/renderer.core-slot-binding.test.ts +952 -0
  329. package/src/tests/renderer.cursor.test.ts +26 -0
  330. package/src/tests/renderer.destroy-during-render.test.ts +147 -0
  331. package/src/tests/renderer.focus-restore.test.ts +257 -0
  332. package/src/tests/renderer.focus.test.ts +294 -0
  333. package/src/tests/renderer.idle.test.ts +219 -0
  334. package/src/tests/renderer.input.test.ts +2237 -0
  335. package/src/tests/renderer.kitty-flags.test.ts +195 -0
  336. package/src/tests/renderer.mouse.test.ts +1274 -0
  337. package/src/tests/renderer.palette.test.ts +629 -0
  338. package/src/tests/renderer.selection.test.ts +49 -0
  339. package/src/tests/renderer.slot-registry.test.ts +684 -0
  340. package/src/tests/renderer.useMouse.test.ts +47 -0
  341. package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
  342. package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
  343. package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
  344. package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
  345. package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
  346. package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
  347. package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
  348. package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
  349. package/src/tests/runtime-plugin-support.fixture.ts +11 -0
  350. package/src/tests/runtime-plugin-support.test.ts +19 -0
  351. package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
  352. package/src/tests/runtime-plugin.fixture.ts +40 -0
  353. package/src/tests/runtime-plugin.test.ts +354 -0
  354. package/src/tests/scrollbox-culling-bug.test.ts +114 -0
  355. package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
  356. package/src/tests/scrollbox-hitgrid.test.ts +909 -0
  357. package/src/tests/scrollbox.test.ts +1530 -0
  358. package/src/tests/wrap-resize-perf.test.ts +276 -0
  359. package/src/tests/yoga-setters.test.ts +921 -0
  360. package/src/text-buffer-view.test.ts +705 -0
  361. package/src/text-buffer-view.ts +189 -0
  362. package/src/text-buffer.test.ts +347 -0
  363. package/src/text-buffer.ts +250 -0
  364. package/src/types.ts +161 -0
  365. package/src/utils.ts +88 -0
  366. package/src/zig/ansi.zig +268 -0
  367. package/src/zig/bench/README.md +50 -0
  368. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
  369. package/src/zig/bench/edit-buffer_bench.zig +476 -0
  370. package/src/zig/bench/native-span-feed_bench.zig +100 -0
  371. package/src/zig/bench/rope-markers_bench.zig +713 -0
  372. package/src/zig/bench/rope_bench.zig +514 -0
  373. package/src/zig/bench/styled-text_bench.zig +470 -0
  374. package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
  375. package/src/zig/bench/text-buffer-view_bench.zig +459 -0
  376. package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
  377. package/src/zig/bench/utf8_bench.zig +799 -0
  378. package/src/zig/bench-utils.zig +431 -0
  379. package/src/zig/bench.zig +217 -0
  380. package/src/zig/buffer-methods.zig +211 -0
  381. package/src/zig/buffer.zig +2281 -0
  382. package/src/zig/build.zig +289 -0
  383. package/src/zig/build.zig.zon +16 -0
  384. package/src/zig/edit-buffer.zig +825 -0
  385. package/src/zig/editor-view.zig +802 -0
  386. package/src/zig/event-bus.zig +13 -0
  387. package/src/zig/event-emitter.zig +65 -0
  388. package/src/zig/file-logger.zig +92 -0
  389. package/src/zig/grapheme.zig +599 -0
  390. package/src/zig/lib.zig +1854 -0
  391. package/src/zig/link.zig +333 -0
  392. package/src/zig/logger.zig +43 -0
  393. package/src/zig/mem-registry.zig +125 -0
  394. package/src/zig/native-span-feed-bench-lib.zig +7 -0
  395. package/src/zig/native-span-feed.zig +708 -0
  396. package/src/zig/renderer.zig +1393 -0
  397. package/src/zig/rope.zig +1220 -0
  398. package/src/zig/syntax-style.zig +161 -0
  399. package/src/zig/terminal.zig +987 -0
  400. package/src/zig/test.zig +72 -0
  401. package/src/zig/tests/README.md +18 -0
  402. package/src/zig/tests/buffer-methods_test.zig +1109 -0
  403. package/src/zig/tests/buffer_test.zig +2557 -0
  404. package/src/zig/tests/edit-buffer-history_test.zig +271 -0
  405. package/src/zig/tests/edit-buffer_test.zig +1689 -0
  406. package/src/zig/tests/editor-view_test.zig +3299 -0
  407. package/src/zig/tests/event-emitter_test.zig +249 -0
  408. package/src/zig/tests/grapheme_test.zig +1304 -0
  409. package/src/zig/tests/link_test.zig +190 -0
  410. package/src/zig/tests/mem-registry_test.zig +473 -0
  411. package/src/zig/tests/memory_leak_regression_test.zig +159 -0
  412. package/src/zig/tests/native-span-feed_test.zig +1264 -0
  413. package/src/zig/tests/renderer_test.zig +1017 -0
  414. package/src/zig/tests/rope-nested_test.zig +712 -0
  415. package/src/zig/tests/rope_fuzz_test.zig +238 -0
  416. package/src/zig/tests/rope_test.zig +2362 -0
  417. package/src/zig/tests/segment-merge.test.zig +148 -0
  418. package/src/zig/tests/syntax-style_test.zig +557 -0
  419. package/src/zig/tests/terminal_test.zig +754 -0
  420. package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
  421. package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
  422. package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
  423. package/src/zig/tests/text-buffer-segment_test.zig +320 -0
  424. package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
  425. package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
  426. package/src/zig/tests/text-buffer-view_test.zig +3649 -0
  427. package/src/zig/tests/text-buffer_test.zig +2191 -0
  428. package/src/zig/tests/unicode-width-map.zon +3909 -0
  429. package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
  430. package/src/zig/tests/utf8_test.zig +4057 -0
  431. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
  432. package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
  433. package/src/zig/tests/word-wrap-editing_test.zig +498 -0
  434. package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
  435. package/src/zig/text-buffer-iterators.zig +499 -0
  436. package/src/zig/text-buffer-segment.zig +404 -0
  437. package/src/zig/text-buffer-view.zig +1371 -0
  438. package/src/zig/text-buffer.zig +1180 -0
  439. package/src/zig/utf8.zig +1948 -0
  440. package/src/zig/utils.zig +9 -0
  441. package/src/zig-structs.ts +261 -0
  442. package/src/zig.ts +3884 -0
  443. package/tsconfig.build.json +24 -0
  444. package/tsconfig.json +27 -0
  445. package/3d/SpriteResourceManager.d.ts +0 -74
  446. package/3d/SpriteUtils.d.ts +0 -13
  447. package/3d/TextureUtils.d.ts +0 -24
  448. package/3d/ThreeRenderable.d.ts +0 -40
  449. package/3d/WGPURenderer.d.ts +0 -61
  450. package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
  451. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
  452. package/3d/animation/SpriteAnimator.d.ts +0 -124
  453. package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
  454. package/3d/canvas.d.ts +0 -44
  455. package/3d/index.d.ts +0 -12
  456. package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
  457. package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
  458. package/3d/physics/physics-interface.d.ts +0 -27
  459. package/3d.d.ts +0 -2
  460. package/3d.js +0 -34041
  461. package/3d.js.map +0 -155
  462. package/LICENSE +0 -21
  463. package/NativeSpanFeed.d.ts +0 -41
  464. package/Renderable.d.ts +0 -334
  465. package/animation/Timeline.d.ts +0 -126
  466. package/ansi.d.ts +0 -13
  467. package/buffer.d.ts +0 -111
  468. package/console.d.ts +0 -144
  469. package/edit-buffer.d.ts +0 -98
  470. package/editor-view.d.ts +0 -73
  471. package/index-8fks7yv1.js +0 -411
  472. package/index-8fks7yv1.js.map +0 -10
  473. package/index-egy5e2rs.js +0 -12267
  474. package/index-egy5e2rs.js.map +0 -42
  475. package/index-tse8gzh0.js +0 -20614
  476. package/index-tse8gzh0.js.map +0 -67
  477. package/index.d.ts +0 -23
  478. package/index.js +0 -478
  479. package/index.js.map +0 -9
  480. package/lib/KeyHandler.d.ts +0 -61
  481. package/lib/RGBA.d.ts +0 -25
  482. package/lib/ascii.font.d.ts +0 -508
  483. package/lib/border.d.ts +0 -51
  484. package/lib/bunfs.d.ts +0 -7
  485. package/lib/clipboard.d.ts +0 -17
  486. package/lib/clock.d.ts +0 -15
  487. package/lib/data-paths.d.ts +0 -26
  488. package/lib/debounce.d.ts +0 -42
  489. package/lib/detect-links.d.ts +0 -6
  490. package/lib/env.d.ts +0 -42
  491. package/lib/extmarks-history.d.ts +0 -17
  492. package/lib/extmarks.d.ts +0 -89
  493. package/lib/hast-styled-text.d.ts +0 -17
  494. package/lib/index.d.ts +0 -21
  495. package/lib/keymapping.d.ts +0 -25
  496. package/lib/objects-in-viewport.d.ts +0 -24
  497. package/lib/output.capture.d.ts +0 -24
  498. package/lib/parse.keypress-kitty.d.ts +0 -2
  499. package/lib/parse.keypress.d.ts +0 -26
  500. package/lib/parse.mouse.d.ts +0 -30
  501. package/lib/paste.d.ts +0 -7
  502. package/lib/queue.d.ts +0 -15
  503. package/lib/renderable.validations.d.ts +0 -12
  504. package/lib/scroll-acceleration.d.ts +0 -43
  505. package/lib/selection.d.ts +0 -63
  506. package/lib/singleton.d.ts +0 -7
  507. package/lib/stdin-parser.d.ts +0 -87
  508. package/lib/styled-text.d.ts +0 -63
  509. package/lib/terminal-capability-detection.d.ts +0 -30
  510. package/lib/terminal-palette.d.ts +0 -50
  511. package/lib/tree-sitter/assets/update.d.ts +0 -11
  512. package/lib/tree-sitter/client.d.ts +0 -47
  513. package/lib/tree-sitter/default-parsers.d.ts +0 -2
  514. package/lib/tree-sitter/download-utils.d.ts +0 -21
  515. package/lib/tree-sitter/index.d.ts +0 -8
  516. package/lib/tree-sitter/parser.worker.d.ts +0 -1
  517. package/lib/tree-sitter/parsers-config.d.ts +0 -53
  518. package/lib/tree-sitter/resolve-ft.d.ts +0 -5
  519. package/lib/tree-sitter/types.d.ts +0 -82
  520. package/lib/tree-sitter-styled-text.d.ts +0 -14
  521. package/lib/validate-dir-name.d.ts +0 -1
  522. package/lib/yoga.options.d.ts +0 -32
  523. package/parser.worker.js +0 -899
  524. package/parser.worker.js.map +0 -12
  525. package/plugins/core-slot.d.ts +0 -72
  526. package/plugins/registry.d.ts +0 -42
  527. package/plugins/types.d.ts +0 -34
  528. package/post/effects.d.ts +0 -147
  529. package/post/filters.d.ts +0 -65
  530. package/post/matrices.d.ts +0 -20
  531. package/renderables/ASCIIFont.d.ts +0 -52
  532. package/renderables/Box.d.ts +0 -81
  533. package/renderables/Code.d.ts +0 -78
  534. package/renderables/Diff.d.ts +0 -142
  535. package/renderables/EditBufferRenderable.d.ts +0 -237
  536. package/renderables/FrameBuffer.d.ts +0 -16
  537. package/renderables/Input.d.ts +0 -67
  538. package/renderables/LineNumberRenderable.d.ts +0 -78
  539. package/renderables/Markdown.d.ts +0 -185
  540. package/renderables/ScrollBar.d.ts +0 -77
  541. package/renderables/ScrollBox.d.ts +0 -124
  542. package/renderables/Select.d.ts +0 -115
  543. package/renderables/Slider.d.ts +0 -47
  544. package/renderables/TabSelect.d.ts +0 -96
  545. package/renderables/Text.d.ts +0 -36
  546. package/renderables/TextBufferRenderable.d.ts +0 -105
  547. package/renderables/TextNode.d.ts +0 -91
  548. package/renderables/TextTable.d.ts +0 -140
  549. package/renderables/Textarea.d.ts +0 -63
  550. package/renderables/TimeToFirstDraw.d.ts +0 -24
  551. package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
  552. package/renderables/composition/VRenderable.d.ts +0 -16
  553. package/renderables/composition/constructs.d.ts +0 -35
  554. package/renderables/composition/vnode.d.ts +0 -46
  555. package/renderables/index.d.ts +0 -23
  556. package/renderables/markdown-parser.d.ts +0 -10
  557. package/renderer.d.ts +0 -419
  558. package/runtime-plugin-support.d.ts +0 -3
  559. package/runtime-plugin-support.js +0 -29
  560. package/runtime-plugin-support.js.map +0 -10
  561. package/runtime-plugin.d.ts +0 -16
  562. package/runtime-plugin.js +0 -16
  563. package/runtime-plugin.js.map +0 -9
  564. package/syntax-style.d.ts +0 -54
  565. package/testing/manual-clock.d.ts +0 -17
  566. package/testing/mock-keys.d.ts +0 -81
  567. package/testing/mock-mouse.d.ts +0 -38
  568. package/testing/mock-tree-sitter-client.d.ts +0 -23
  569. package/testing/spy.d.ts +0 -7
  570. package/testing/test-recorder.d.ts +0 -61
  571. package/testing/test-renderer.d.ts +0 -23
  572. package/testing.d.ts +0 -6
  573. package/testing.js +0 -697
  574. package/testing.js.map +0 -15
  575. package/text-buffer-view.d.ts +0 -42
  576. package/text-buffer.d.ts +0 -67
  577. package/types.d.ts +0 -139
  578. package/utils.d.ts +0 -14
  579. package/zig-structs.d.ts +0 -155
  580. package/zig.d.ts +0 -353
  581. /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
  582. /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
  583. /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
  584. /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
  585. /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
  586. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
  587. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  588. /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
  589. /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
  590. /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
  591. /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
@@ -0,0 +1,579 @@
1
+ import { BaseRenderable, Renderable, type RenderableOptions } from "../Renderable.js"
2
+ import type { CliRenderer } from "../renderer.js"
3
+ import type { RenderContext } from "../types.js"
4
+ import { createSlotRegistry, SlotRegistry, type SlotRegistryOptions } from "./registry.js"
5
+ import type { Plugin, PluginContext, PluginErrorEvent, SlotMode } from "./types.js"
6
+
7
+ export type CoreSlotMode = SlotMode
8
+
9
+ type CoreSlotProps<TSlotName extends string, TData extends object> = {
10
+ [K in TSlotName]: TData
11
+ }
12
+
13
+ export type CoreSlotRegistry<
14
+ TSlotName extends string,
15
+ TContext extends PluginContext = PluginContext,
16
+ TData extends object = Record<string, unknown>,
17
+ > = SlotRegistry<BaseRenderable, CoreSlotProps<TSlotName, TData>, TContext>
18
+
19
+ export type CoreSlotRenderer<
20
+ TContext extends PluginContext = PluginContext,
21
+ TData extends object = Record<string, unknown>,
22
+ > = (ctx: Readonly<TContext>, data: TData) => BaseRenderable
23
+
24
+ export interface CoreManagedSlot<
25
+ TContext extends PluginContext = PluginContext,
26
+ TData extends object = Record<string, unknown>,
27
+ > {
28
+ render: CoreSlotRenderer<TContext, TData>
29
+ onActivate?: (ctx: Readonly<TContext>) => void
30
+ onDeactivate?: (ctx: Readonly<TContext>) => void
31
+ onDispose?: (ctx: Readonly<TContext>) => void
32
+ }
33
+
34
+ export type CoreSlotContribution<
35
+ TContext extends PluginContext = PluginContext,
36
+ TData extends object = Record<string, unknown>,
37
+ > = CoreSlotRenderer<TContext, TData> | CoreManagedSlot<TContext, TData>
38
+
39
+ export interface CorePlugin<
40
+ TSlotName extends string,
41
+ TContext extends PluginContext = PluginContext,
42
+ TData extends object = Record<string, unknown>,
43
+ > {
44
+ id: string
45
+ order?: number
46
+ setup?: (ctx: Readonly<TContext>, renderer: CliRenderer) => void
47
+ dispose?: () => void
48
+ slots: Partial<Record<TSlotName, CoreSlotContribution<TContext, TData>>>
49
+ }
50
+
51
+ export interface CoreResolvedSlotRenderer<
52
+ TContext extends PluginContext = PluginContext,
53
+ TData extends object = Record<string, unknown>,
54
+ > {
55
+ id: string
56
+ renderer: CoreSlotRenderer<TContext, TData>
57
+ }
58
+
59
+ type FallbackNodes = BaseRenderable | BaseRenderable[] | undefined
60
+
61
+ export type CoreSlotFailurePlaceholder<TContext extends PluginContext = PluginContext> = (
62
+ failure: PluginErrorEvent,
63
+ ctx: Readonly<TContext>,
64
+ ) => FallbackNodes
65
+
66
+ type CoreSlotOwnership = "host" | "plugin"
67
+
68
+ type WrappedCoreSlotRenderer<
69
+ TContext extends PluginContext = PluginContext,
70
+ TData extends object = Record<string, unknown>,
71
+ > = ((ctx: Readonly<TContext>, props: TData) => BaseRenderable) & {
72
+ __coreSlotOwnership?: CoreSlotOwnership
73
+ __coreManagedSlot?: CoreManagedSlot<TContext, TData>
74
+ }
75
+
76
+ interface ResolvedCoreSlotEntry<
77
+ TContext extends PluginContext = PluginContext,
78
+ TData extends object = Record<string, unknown>,
79
+ > extends CoreResolvedSlotRenderer<TContext, TData> {
80
+ ownership: CoreSlotOwnership
81
+ managedSlot?: CoreManagedSlot<TContext, TData>
82
+ }
83
+
84
+ interface SlotNodeState<
85
+ TContext extends PluginContext = PluginContext,
86
+ TData extends object = Record<string, unknown>,
87
+ > {
88
+ nodes: BaseRenderable[]
89
+ ownership: CoreSlotOwnership
90
+ managedSlot?: CoreManagedSlot<TContext, TData>
91
+ dataRef: TData
92
+ }
93
+
94
+ function isCoreManagedSlot<
95
+ TContext extends PluginContext = PluginContext,
96
+ TData extends object = Record<string, unknown>,
97
+ >(contribution: CoreSlotContribution<TContext, TData>): contribution is CoreManagedSlot<TContext, TData> {
98
+ return typeof contribution === "object" && contribution !== null && "render" in contribution
99
+ }
100
+
101
+ function toCorePlugin<
102
+ TSlotName extends string,
103
+ TContext extends PluginContext = PluginContext,
104
+ TData extends object = Record<string, unknown>,
105
+ >(plugin: CorePlugin<TSlotName, TContext, TData>): Plugin<BaseRenderable, CoreSlotProps<TSlotName, TData>, TContext> {
106
+ const slots: Partial<Record<TSlotName, WrappedCoreSlotRenderer<TContext, TData>>> = {}
107
+
108
+ for (const [slotName, contribution] of Object.entries(plugin.slots) as Array<
109
+ [TSlotName, CoreSlotContribution<TContext, TData>]
110
+ >) {
111
+ const wrappedRenderer: WrappedCoreSlotRenderer<TContext, TData> = (ctx: Readonly<TContext>, data: TData) => {
112
+ if (isCoreManagedSlot(contribution)) {
113
+ return contribution.render(ctx, data)
114
+ }
115
+
116
+ return contribution(ctx, data)
117
+ }
118
+
119
+ if (isCoreManagedSlot(contribution)) {
120
+ wrappedRenderer.__coreSlotOwnership = "plugin"
121
+ wrappedRenderer.__coreManagedSlot = contribution
122
+ } else {
123
+ wrappedRenderer.__coreSlotOwnership = "host"
124
+ }
125
+
126
+ slots[slotName] = wrappedRenderer
127
+ }
128
+
129
+ return {
130
+ id: plugin.id,
131
+ order: plugin.order,
132
+ setup: plugin.setup,
133
+ dispose: plugin.dispose,
134
+ slots,
135
+ }
136
+ }
137
+
138
+ function asArray(value: FallbackNodes): BaseRenderable[] {
139
+ if (!value) {
140
+ return []
141
+ }
142
+
143
+ return Array.isArray(value) ? [...value] : [value]
144
+ }
145
+
146
+ function ensureValidNode(node: unknown, pluginId: string, mount: BaseRenderable): asserts node is BaseRenderable {
147
+ if (!node) {
148
+ throw new Error(`Plugin "${pluginId}" did not return a renderable node`)
149
+ }
150
+
151
+ if (typeof (node as { then?: unknown }).then === "function") {
152
+ throw new Error(`Plugin "${pluginId}" returned an async value. Core slots require synchronous renderers.`)
153
+ }
154
+
155
+ if (!(node instanceof BaseRenderable)) {
156
+ throw new Error(`Plugin "${pluginId}" must return a BaseRenderable`)
157
+ }
158
+
159
+ if (node === mount) {
160
+ throw new Error(`Plugin "${pluginId}" returned the slot mount container as its node`)
161
+ }
162
+
163
+ if (node.parent && node.parent !== mount) {
164
+ throw new Error(`Plugin "${pluginId}" returned a renderable already attached to another parent`)
165
+ }
166
+ }
167
+
168
+ export function createCoreSlotRegistry<
169
+ TSlotName extends string,
170
+ TContext extends PluginContext = PluginContext,
171
+ TData extends object = Record<string, unknown>,
172
+ >(
173
+ renderer: CliRenderer,
174
+ context: TContext,
175
+ options: SlotRegistryOptions = {},
176
+ ): CoreSlotRegistry<TSlotName, TContext, TData> {
177
+ return createSlotRegistry<BaseRenderable, CoreSlotProps<TSlotName, TData>, TContext>(
178
+ renderer,
179
+ "core:slot-registry",
180
+ context,
181
+ options,
182
+ )
183
+ }
184
+
185
+ export function registerCorePlugin<
186
+ TSlotName extends string,
187
+ TContext extends PluginContext = PluginContext,
188
+ TData extends object = Record<string, unknown>,
189
+ >(registry: CoreSlotRegistry<TSlotName, TContext, TData>, plugin: CorePlugin<TSlotName, TContext, TData>): () => void {
190
+ return registry.register(toCorePlugin(plugin))
191
+ }
192
+
193
+ export function resolveCoreSlot<
194
+ TSlotName extends string,
195
+ K extends TSlotName,
196
+ TContext extends PluginContext = PluginContext,
197
+ TData extends object = Record<string, unknown>,
198
+ >(registry: CoreSlotRegistry<TSlotName, TContext, TData>, slot: K): Array<CoreResolvedSlotRenderer<TContext, TData>> {
199
+ return resolveCoreSlotEntries(registry, slot).map((entry) => {
200
+ return {
201
+ id: entry.id,
202
+ renderer: entry.renderer,
203
+ }
204
+ })
205
+ }
206
+
207
+ function resolveCoreSlotEntries<
208
+ TSlotName extends string,
209
+ K extends TSlotName,
210
+ TContext extends PluginContext = PluginContext,
211
+ TData extends object = Record<string, unknown>,
212
+ >(registry: CoreSlotRegistry<TSlotName, TContext, TData>, slot: K): Array<ResolvedCoreSlotEntry<TContext, TData>> {
213
+ return registry.resolveEntries(slot).map((entry) => {
214
+ const wrappedRenderer = entry.renderer as WrappedCoreSlotRenderer<TContext, TData>
215
+
216
+ return {
217
+ id: entry.id,
218
+ renderer: (ctx: Readonly<TContext>, data: TData) => wrappedRenderer(ctx, data),
219
+ ownership: wrappedRenderer.__coreSlotOwnership ?? "host",
220
+ managedSlot: wrappedRenderer.__coreManagedSlot,
221
+ }
222
+ })
223
+ }
224
+
225
+ // -- SlotRenderable ---------------------------------------------------------
226
+
227
+ export interface SlotRenderableOptions<
228
+ TSlotName extends string,
229
+ K extends TSlotName,
230
+ TContext extends PluginContext = PluginContext,
231
+ TData extends object = Record<string, unknown>,
232
+ > extends RenderableOptions {
233
+ registry: CoreSlotRegistry<TSlotName, TContext, TData>
234
+ name: K
235
+ data?: TData
236
+ mode?: CoreSlotMode
237
+ fallback?: FallbackNodes | (() => FallbackNodes)
238
+ pluginFailurePlaceholder?: CoreSlotFailurePlaceholder<TContext>
239
+ }
240
+
241
+ export class SlotRenderable<
242
+ TSlotName extends string = string,
243
+ TContext extends PluginContext = PluginContext,
244
+ TData extends object = Record<string, unknown>,
245
+ > extends Renderable {
246
+ private _mode: CoreSlotMode
247
+ private _slotRegistry: CoreSlotRegistry<TSlotName, TContext, TData>
248
+ private _slotName: TSlotName
249
+ private _data: TData
250
+ private _fallbackOption: FallbackNodes | (() => FallbackNodes)
251
+ private _pluginFailurePlaceholder?: CoreSlotFailurePlaceholder<TContext>
252
+ private _disposed = false
253
+ private _mountedNodes: BaseRenderable[] = []
254
+ private _pluginNodes = new Map<string, SlotNodeState<TContext, TData>>()
255
+ private _activePluginIds = new Set<string>()
256
+ private _fallbackNodes: BaseRenderable[] | null = null
257
+ private _unsubscribe: (() => void) | null = null
258
+
259
+ constructor(ctx: RenderContext, options: SlotRenderableOptions<TSlotName, TSlotName, TContext, TData>) {
260
+ super(ctx, options)
261
+
262
+ this._slotRegistry = options.registry
263
+ this._slotName = options.name
264
+ this._data = options.data ?? ({} as TData)
265
+ this._mode = options.mode ?? "append"
266
+ this._fallbackOption = options.fallback
267
+ this._pluginFailurePlaceholder = options.pluginFailurePlaceholder
268
+
269
+ this._unsubscribe = this._slotRegistry.subscribe(() => this.refresh())
270
+
271
+ try {
272
+ this.refresh()
273
+ } catch (error) {
274
+ this._cleanupAll()
275
+ throw error
276
+ }
277
+ }
278
+
279
+ public get mode(): CoreSlotMode {
280
+ return this._mode
281
+ }
282
+
283
+ public set mode(value: CoreSlotMode) {
284
+ this._mode = value
285
+ this.refresh()
286
+ }
287
+
288
+ public get data(): TData {
289
+ return this._data
290
+ }
291
+
292
+ public set data(value: TData) {
293
+ this._data = value
294
+ this.refresh()
295
+ }
296
+
297
+ public refresh(): void {
298
+ if (this._disposed) {
299
+ return
300
+ }
301
+
302
+ const allEntries = resolveCoreSlotEntries(this._slotRegistry, this._slotName)
303
+ const activeEntries = this._mode === "single_winner" && allEntries.length > 0 ? [allEntries[0]] : allEntries
304
+ const nextActivePluginIds = new Set(activeEntries.map((entry) => entry.id))
305
+ const registeredPluginIds = new Set(allEntries.map((entry) => entry.id))
306
+
307
+ this._cleanupInactivePluginNodes(nextActivePluginIds, registeredPluginIds)
308
+
309
+ for (const entry of activeEntries) {
310
+ let state = this._pluginNodes.get(entry.id)
311
+ const shouldRender =
312
+ !state || (state.ownership === "plugin" && state.nodes.length === 0) || state.dataRef !== this._data
313
+
314
+ if (shouldRender) {
315
+ const previousState = state
316
+
317
+ try {
318
+ const node = entry.renderer(this._slotRegistry.context, this._data)
319
+ ensureValidNode(node, entry.id, this)
320
+ state = {
321
+ nodes: [node],
322
+ ownership: entry.ownership,
323
+ managedSlot: entry.managedSlot ?? state?.managedSlot,
324
+ dataRef: this._data,
325
+ }
326
+ } catch (error) {
327
+ const failure = this._slotRegistry.reportPluginError({
328
+ pluginId: entry.id,
329
+ slot: String(this._slotName),
330
+ phase: "render",
331
+ source: "core",
332
+ error,
333
+ })
334
+
335
+ state = {
336
+ nodes: this._resolvePluginFailurePlaceholder(failure),
337
+ ownership: "host",
338
+ managedSlot: entry.managedSlot ?? state?.managedSlot,
339
+ dataRef: this._data,
340
+ }
341
+ }
342
+
343
+ if (previousState) {
344
+ this._cleanupReplacedPluginNodes(previousState, state.nodes)
345
+ }
346
+
347
+ this._pluginNodes.set(entry.id, state)
348
+ }
349
+
350
+ if (!this._activePluginIds.has(entry.id)) {
351
+ const activeState = this._pluginNodes.get(entry.id)
352
+ if (activeState) {
353
+ this._callManagedHook(entry.id, activeState.managedSlot, "onActivate", "setup")
354
+ }
355
+ }
356
+ }
357
+
358
+ const desiredNodes: BaseRenderable[] = []
359
+
360
+ if (this._mode === "append" || activeEntries.length === 0) {
361
+ desiredNodes.push(...this._ensureFallbackNodes())
362
+ }
363
+
364
+ for (const entry of activeEntries) {
365
+ const state = this._pluginNodes.get(entry.id)
366
+ if (state) {
367
+ desiredNodes.push(...state.nodes)
368
+ }
369
+ }
370
+
371
+ if (this._mode !== "append" && desiredNodes.length === 0) {
372
+ desiredNodes.push(...this._ensureFallbackNodes())
373
+ }
374
+
375
+ this._reconcileMountedNodes(desiredNodes)
376
+ this._activePluginIds = nextActivePluginIds
377
+ }
378
+
379
+ protected override destroySelf(): void {
380
+ this._cleanupAll()
381
+ }
382
+
383
+ private _cleanupAll(): void {
384
+ if (this._disposed) {
385
+ return
386
+ }
387
+ this._disposed = true
388
+
389
+ this._unsubscribe?.()
390
+ this._unsubscribe = null
391
+
392
+ for (const [pluginId, state] of this._pluginNodes) {
393
+ if (this._activePluginIds.has(pluginId)) {
394
+ this._callManagedHook(pluginId, state.managedSlot, "onDeactivate", "dispose")
395
+ }
396
+
397
+ this._callManagedHook(pluginId, state.managedSlot, "onDispose", "dispose")
398
+
399
+ for (const node of state.nodes) {
400
+ this._detachNodeFromMount(node)
401
+ }
402
+
403
+ if (state.ownership === "host") {
404
+ for (const node of state.nodes) {
405
+ node.destroyRecursively()
406
+ }
407
+ }
408
+ }
409
+
410
+ this._pluginNodes.clear()
411
+ this._activePluginIds = new Set()
412
+
413
+ if (this._fallbackNodes) {
414
+ for (const node of this._fallbackNodes) {
415
+ node.destroyRecursively()
416
+ }
417
+ this._fallbackNodes = null
418
+ }
419
+
420
+ this._mountedNodes = []
421
+ }
422
+
423
+ private _ensureFallbackNodes(): BaseRenderable[] {
424
+ if (this._fallbackNodes !== null) {
425
+ return this._fallbackNodes
426
+ }
427
+
428
+ const source = typeof this._fallbackOption === "function" ? this._fallbackOption() : this._fallbackOption
429
+ const nodes = asArray(source)
430
+ for (const node of nodes) {
431
+ ensureValidNode(node, "fallback", this)
432
+ }
433
+
434
+ this._fallbackNodes = nodes
435
+ return this._fallbackNodes
436
+ }
437
+
438
+ private _callManagedHook(
439
+ pluginId: string,
440
+ managedSlot: CoreManagedSlot<TContext, TData> | undefined,
441
+ hook: "onActivate" | "onDeactivate" | "onDispose",
442
+ phase: "setup" | "dispose",
443
+ ): void {
444
+ const callback = managedSlot?.[hook]
445
+ if (!callback) {
446
+ return
447
+ }
448
+
449
+ try {
450
+ callback(this._slotRegistry.context)
451
+ } catch (error) {
452
+ this._slotRegistry.reportPluginError({
453
+ pluginId,
454
+ slot: String(this._slotName),
455
+ phase,
456
+ source: "core",
457
+ error,
458
+ })
459
+ }
460
+ }
461
+
462
+ private _detachNodeFromMount(node: BaseRenderable): void {
463
+ if (node.parent === this) {
464
+ this.remove(node.id)
465
+ }
466
+ }
467
+
468
+ private _cleanupInactivePluginNodes(nextActivePluginIds: Set<string>, registeredPluginIds: Set<string>): void {
469
+ for (const [pluginId, state] of this._pluginNodes) {
470
+ if (nextActivePluginIds.has(pluginId)) {
471
+ continue
472
+ }
473
+
474
+ if (this._activePluginIds.has(pluginId)) {
475
+ this._callManagedHook(pluginId, state.managedSlot, "onDeactivate", "dispose")
476
+ }
477
+
478
+ for (const node of state.nodes) {
479
+ this._detachNodeFromMount(node)
480
+ }
481
+
482
+ if (!registeredPluginIds.has(pluginId)) {
483
+ this._callManagedHook(pluginId, state.managedSlot, "onDispose", "dispose")
484
+
485
+ if (state.ownership === "host") {
486
+ for (const node of state.nodes) {
487
+ node.destroyRecursively()
488
+ }
489
+ }
490
+
491
+ this._pluginNodes.delete(pluginId)
492
+ continue
493
+ }
494
+
495
+ if (state.ownership === "host") {
496
+ for (const node of state.nodes) {
497
+ node.destroyRecursively()
498
+ }
499
+ this._pluginNodes.delete(pluginId)
500
+ continue
501
+ }
502
+
503
+ state.nodes = []
504
+ }
505
+ }
506
+
507
+ private _cleanupReplacedPluginNodes(
508
+ previousState: SlotNodeState<TContext, TData>,
509
+ nextNodes: BaseRenderable[],
510
+ ): void {
511
+ const retainedNodes = new Set(nextNodes)
512
+
513
+ for (const node of previousState.nodes) {
514
+ if (retainedNodes.has(node)) {
515
+ continue
516
+ }
517
+
518
+ this._detachNodeFromMount(node)
519
+
520
+ if (previousState.ownership === "host") {
521
+ node.destroyRecursively()
522
+ }
523
+ }
524
+ }
525
+
526
+ private _resolvePluginFailurePlaceholder(failure: PluginErrorEvent): BaseRenderable[] {
527
+ if (!this._pluginFailurePlaceholder) {
528
+ return []
529
+ }
530
+
531
+ try {
532
+ const placeholderSource = this._pluginFailurePlaceholder(failure, this._slotRegistry.context)
533
+ const placeholderNodes = asArray(placeholderSource)
534
+
535
+ for (const node of placeholderNodes) {
536
+ ensureValidNode(node, `${failure.pluginId}:error-placeholder`, this)
537
+ }
538
+
539
+ return placeholderNodes
540
+ } catch (placeholderError) {
541
+ this._slotRegistry.reportPluginError({
542
+ pluginId: failure.pluginId,
543
+ slot: String(this._slotName),
544
+ phase: "error_placeholder",
545
+ source: "core",
546
+ error: placeholderError,
547
+ })
548
+ return []
549
+ }
550
+ }
551
+
552
+ private _reconcileMountedNodes(desiredNodes: BaseRenderable[]): void {
553
+ const desiredNodeSet = new Set(desiredNodes)
554
+
555
+ for (const node of this._mountedNodes) {
556
+ if (!desiredNodeSet.has(node)) {
557
+ if (node.parent === this) {
558
+ this.remove(node.id)
559
+ }
560
+ }
561
+ }
562
+
563
+ for (let index = 0; index < desiredNodes.length; index++) {
564
+ const node = desiredNodes[index]
565
+
566
+ if (node.parent !== this) {
567
+ this.add(node, index)
568
+ continue
569
+ }
570
+
571
+ const childAtIndex = this.getChildren()[index]
572
+ if (childAtIndex?.id !== node.id) {
573
+ this.add(node, index)
574
+ }
575
+ }
576
+
577
+ this._mountedNodes = [...desiredNodes]
578
+ }
579
+ }