@fairyhunter13/opentui-core 0.1.88 → 0.1.90

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 (570) 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 +141 -0
  7. package/docs/env-vars.md +140 -0
  8. package/docs/getting-started.md +353 -0
  9. package/docs/renderables-vs-constructs.md +159 -0
  10. package/docs/tree-sitter.md +311 -0
  11. package/package.json +61 -52
  12. package/scripts/build.ts +400 -0
  13. package/scripts/publish.ts +60 -0
  14. package/src/3d/SpriteResourceManager.ts +286 -0
  15. package/src/3d/SpriteUtils.ts +71 -0
  16. package/src/3d/TextureUtils.ts +196 -0
  17. package/src/3d/ThreeRenderable.ts +197 -0
  18. package/src/3d/WGPURenderer.ts +294 -0
  19. package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
  20. package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
  21. package/src/3d/animation/SpriteAnimator.ts +633 -0
  22. package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
  23. package/src/3d/canvas.ts +464 -0
  24. package/src/3d/index.ts +12 -0
  25. package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
  26. package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
  27. package/src/3d/physics/physics-interface.ts +31 -0
  28. package/src/3d/shaders/supersampling.wgsl +201 -0
  29. package/src/3d.ts +3 -0
  30. package/src/NativeSpanFeed.ts +300 -0
  31. package/src/Renderable.ts +1698 -0
  32. package/src/__snapshots__/buffer.test.ts.snap +28 -0
  33. package/src/animation/Timeline.test.ts +2709 -0
  34. package/src/animation/Timeline.ts +598 -0
  35. package/src/ansi.ts +18 -0
  36. package/src/benchmark/latest-all-bench-run.json +707 -0
  37. package/src/benchmark/latest-async-bench-run.json +336 -0
  38. package/src/benchmark/latest-default-bench-run.json +657 -0
  39. package/src/benchmark/latest-large-bench-run.json +707 -0
  40. package/src/benchmark/latest-quick-bench-run.json +207 -0
  41. package/src/benchmark/markdown-benchmark.ts +1804 -0
  42. package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
  43. package/src/benchmark/native-span-feed-benchmark.md +56 -0
  44. package/src/benchmark/native-span-feed-benchmark.ts +596 -0
  45. package/src/benchmark/native-span-feed-compare.ts +280 -0
  46. package/src/benchmark/renderer-benchmark.ts +754 -0
  47. package/src/benchmark/text-table-benchmark.ts +947 -0
  48. package/src/buffer.test.ts +291 -0
  49. package/src/buffer.ts +519 -0
  50. package/src/console.test.ts +612 -0
  51. package/src/console.ts +1255 -0
  52. package/src/edit-buffer.test.ts +1769 -0
  53. package/src/edit-buffer.ts +411 -0
  54. package/src/editor-view.test.ts +1032 -0
  55. package/src/editor-view.ts +284 -0
  56. package/src/examples/ascii-font-selection-demo.ts +245 -0
  57. package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
  58. package/src/examples/assets/concrete.png +0 -0
  59. package/src/examples/assets/crate.png +0 -0
  60. package/src/examples/assets/crate_emissive.png +0 -0
  61. package/src/examples/assets/forrest_background.png +0 -0
  62. package/src/examples/assets/hast-example.json +1018 -0
  63. package/src/examples/assets/heart.png +0 -0
  64. package/src/examples/assets/main_char_heavy_attack.png +0 -0
  65. package/src/examples/assets/main_char_idle.png +0 -0
  66. package/src/examples/assets/main_char_jump_end.png +0 -0
  67. package/src/examples/assets/main_char_jump_landing.png +0 -0
  68. package/src/examples/assets/main_char_jump_start.png +0 -0
  69. package/src/examples/assets/main_char_run_loop.png +0 -0
  70. package/src/examples/assets/roughness_map.jpg +0 -0
  71. package/src/examples/build.ts +115 -0
  72. package/src/examples/code-demo.ts +584 -0
  73. package/src/examples/console-demo.ts +358 -0
  74. package/src/examples/core-plugin-slots-demo.ts +759 -0
  75. package/src/examples/diff-demo.ts +699 -0
  76. package/src/examples/draggable-three-demo.ts +259 -0
  77. package/src/examples/editor-demo.ts +322 -0
  78. package/src/examples/extmarks-demo.ts +204 -0
  79. package/src/examples/focus-restore-demo.ts +310 -0
  80. package/src/examples/fonts.ts +245 -0
  81. package/src/examples/fractal-shader-demo.ts +268 -0
  82. package/src/examples/framebuffer-demo.ts +674 -0
  83. package/src/examples/full-unicode-demo.ts +181 -0
  84. package/src/examples/golden-star-demo.ts +933 -0
  85. package/src/examples/grayscale-buffer-demo.ts +249 -0
  86. package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
  87. package/src/examples/index.ts +925 -0
  88. package/src/examples/input-demo.ts +377 -0
  89. package/src/examples/input-select-layout-demo.ts +425 -0
  90. package/src/examples/install.sh +143 -0
  91. package/src/examples/keypress-debug-demo.ts +452 -0
  92. package/src/examples/lib/HexList.ts +122 -0
  93. package/src/examples/lib/PaletteGrid.ts +125 -0
  94. package/src/examples/lib/standalone-keys.ts +25 -0
  95. package/src/examples/lib/tab-controller.ts +243 -0
  96. package/src/examples/lights-phong-demo.ts +290 -0
  97. package/src/examples/link-demo.ts +220 -0
  98. package/src/examples/live-state-demo.ts +480 -0
  99. package/src/examples/markdown-demo.ts +620 -0
  100. package/src/examples/mouse-interaction-demo.ts +428 -0
  101. package/src/examples/nested-zindex-demo.ts +357 -0
  102. package/src/examples/opacity-example.ts +235 -0
  103. package/src/examples/opentui-demo.ts +1057 -0
  104. package/src/examples/physx-planck-2d-demo.ts +507 -0
  105. package/src/examples/physx-rapier-2d-demo.ts +526 -0
  106. package/src/examples/relative-positioning-demo.ts +323 -0
  107. package/src/examples/scroll-example.ts +214 -0
  108. package/src/examples/scrollbox-mouse-test.ts +112 -0
  109. package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
  110. package/src/examples/select-demo.ts +237 -0
  111. package/src/examples/shader-cube-demo.ts +772 -0
  112. package/src/examples/simple-layout-example.ts +591 -0
  113. package/src/examples/slider-demo.ts +617 -0
  114. package/src/examples/split-mode-demo.ts +445 -0
  115. package/src/examples/sprite-animation-demo.ts +443 -0
  116. package/src/examples/sprite-particle-generator-demo.ts +486 -0
  117. package/src/examples/static-sprite-demo.ts +193 -0
  118. package/src/examples/sticky-scroll-example.ts +308 -0
  119. package/src/examples/styled-text-demo.ts +282 -0
  120. package/src/examples/tab-select-demo.ts +219 -0
  121. package/src/examples/terminal-title.ts +29 -0
  122. package/src/examples/terminal.ts +305 -0
  123. package/src/examples/text-node-demo.ts +416 -0
  124. package/src/examples/text-selection-demo.ts +377 -0
  125. package/src/examples/text-table-demo.ts +503 -0
  126. package/src/examples/text-truncation-demo.ts +481 -0
  127. package/src/examples/text-wrap.ts +757 -0
  128. package/src/examples/texture-loading-demo.ts +259 -0
  129. package/src/examples/timeline-example.ts +670 -0
  130. package/src/examples/transparency-demo.ts +241 -0
  131. package/src/examples/vnode-composition-demo.ts +404 -0
  132. package/src/index.ts +22 -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 +168 -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 +31 -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 +280 -0
  168. package/src/lib/keymapping.ts +87 -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 +1676 -0
  187. package/src/lib/stdin-parser.ts +1248 -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 +331 -0
  195. package/src/lib/tree-sitter/assets.d.ts +9 -0
  196. package/src/lib/tree-sitter/cache.test.ts +270 -0
  197. package/src/lib/tree-sitter/client.test.ts +1061 -0
  198. package/src/lib/tree-sitter/client.ts +615 -0
  199. package/src/lib/tree-sitter/default-parsers.ts +80 -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 +1001 -0
  203. package/src/lib/tree-sitter/parsers-config.ts +75 -0
  204. package/src/lib/tree-sitter/resolve-ft.ts +62 -0
  205. package/src/lib/tree-sitter/types.ts +81 -0
  206. package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
  207. package/src/lib/tree-sitter-styled-text.ts +306 -0
  208. package/src/lib/validate-dir-name.ts +55 -0
  209. package/src/lib/yoga.options.test.ts +628 -0
  210. package/src/lib/yoga.options.ts +346 -0
  211. package/src/plugins/core-slot.ts +579 -0
  212. package/src/plugins/registry.ts +377 -0
  213. package/src/plugins/types.ts +46 -0
  214. package/src/post/filters.ts +888 -0
  215. package/src/renderables/ASCIIFont.ts +219 -0
  216. package/src/renderables/Box.test.ts +160 -0
  217. package/src/renderables/Box.ts +295 -0
  218. package/src/renderables/Code.test.ts +2062 -0
  219. package/src/renderables/Code.ts +357 -0
  220. package/src/renderables/Diff.regression.test.ts +226 -0
  221. package/src/renderables/Diff.test.ts +3027 -0
  222. package/src/renderables/Diff.ts +1209 -0
  223. package/src/renderables/EditBufferRenderable.ts +764 -0
  224. package/src/renderables/FrameBuffer.ts +47 -0
  225. package/src/renderables/Input.test.ts +1228 -0
  226. package/src/renderables/Input.ts +245 -0
  227. package/src/renderables/LineNumberRenderable.ts +675 -0
  228. package/src/renderables/Markdown.ts +1106 -0
  229. package/src/renderables/ScrollBar.ts +422 -0
  230. package/src/renderables/ScrollBox.ts +883 -0
  231. package/src/renderables/Select.test.ts +1010 -0
  232. package/src/renderables/Select.ts +523 -0
  233. package/src/renderables/Slider.test.ts +456 -0
  234. package/src/renderables/Slider.ts +347 -0
  235. package/src/renderables/TabSelect.test.ts +197 -0
  236. package/src/renderables/TabSelect.ts +455 -0
  237. package/src/renderables/Text.selection-buffer.test.ts +123 -0
  238. package/src/renderables/Text.test.ts +2660 -0
  239. package/src/renderables/Text.ts +147 -0
  240. package/src/renderables/TextBufferRenderable.ts +518 -0
  241. package/src/renderables/TextNode.test.ts +1058 -0
  242. package/src/renderables/TextNode.ts +325 -0
  243. package/src/renderables/TextTable.test.ts +1421 -0
  244. package/src/renderables/TextTable.ts +1344 -0
  245. package/src/renderables/Textarea.ts +732 -0
  246. package/src/renderables/TimeToFirstDraw.ts +89 -0
  247. package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
  248. package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
  249. package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
  250. package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
  251. package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
  252. package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
  253. package/src/renderables/__tests__/LineNumberRenderable.test.ts +1787 -0
  254. package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
  255. package/src/renderables/__tests__/Markdown.test.ts +2287 -0
  256. package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
  257. package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
  258. package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
  259. package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
  260. package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
  261. package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
  262. package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
  263. package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
  264. package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
  265. package/src/renderables/__tests__/Textarea.rendering.test.ts +1864 -0
  266. package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
  267. package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
  268. package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
  269. package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
  270. package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
  271. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
  272. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
  273. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
  274. package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
  275. package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
  276. package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
  277. package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
  278. package/src/renderables/composition/README.md +8 -0
  279. package/src/renderables/composition/VRenderable.ts +32 -0
  280. package/src/renderables/composition/constructs.ts +127 -0
  281. package/src/renderables/composition/vnode.ts +289 -0
  282. package/src/renderables/index.ts +22 -0
  283. package/src/renderables/markdown-parser.ts +66 -0
  284. package/src/renderer.ts +2363 -0
  285. package/src/runtime-plugin-support.ts +39 -0
  286. package/src/runtime-plugin.ts +144 -0
  287. package/src/syntax-style.test.ts +841 -0
  288. package/src/syntax-style.ts +264 -0
  289. package/src/testing/README.md +210 -0
  290. package/src/testing/capture-spans.test.ts +194 -0
  291. package/src/testing/integration.test.ts +276 -0
  292. package/src/testing/manual-clock.ts +106 -0
  293. package/src/testing/mock-keys.test.ts +1356 -0
  294. package/src/testing/mock-keys.ts +449 -0
  295. package/src/testing/mock-mouse.test.ts +218 -0
  296. package/src/testing/mock-mouse.ts +247 -0
  297. package/src/testing/mock-tree-sitter-client.ts +73 -0
  298. package/src/testing/spy.ts +13 -0
  299. package/src/testing/test-recorder.test.ts +415 -0
  300. package/src/testing/test-recorder.ts +145 -0
  301. package/src/testing/test-renderer.ts +116 -0
  302. package/src/testing.ts +7 -0
  303. package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
  304. package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
  305. package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
  306. package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
  307. package/src/tests/allocator-stats.test.ts +38 -0
  308. package/src/tests/destroy-during-render.test.ts +200 -0
  309. package/src/tests/hover-cursor.test.ts +98 -0
  310. package/src/tests/native-span-feed-async.test.ts +173 -0
  311. package/src/tests/native-span-feed-close.test.ts +120 -0
  312. package/src/tests/native-span-feed-coverage.test.ts +227 -0
  313. package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
  314. package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
  315. package/src/tests/opacity.test.ts +123 -0
  316. package/src/tests/renderable.snapshot.test.ts +524 -0
  317. package/src/tests/renderable.test.ts +1281 -0
  318. package/src/tests/renderer.console-startup.test.ts +65 -0
  319. package/src/tests/renderer.control.test.ts +364 -0
  320. package/src/tests/renderer.core-slot-binding.test.ts +952 -0
  321. package/src/tests/renderer.cursor.test.ts +26 -0
  322. package/src/tests/renderer.destroy-during-render.test.ts +110 -0
  323. package/src/tests/renderer.focus-restore.test.ts +228 -0
  324. package/src/tests/renderer.focus.test.ts +251 -0
  325. package/src/tests/renderer.idle.test.ts +219 -0
  326. package/src/tests/renderer.input.test.ts +2145 -0
  327. package/src/tests/renderer.kitty-flags.test.ts +195 -0
  328. package/src/tests/renderer.mouse.test.ts +1269 -0
  329. package/src/tests/renderer.palette.test.ts +629 -0
  330. package/src/tests/renderer.selection.test.ts +49 -0
  331. package/src/tests/renderer.slot-registry.test.ts +649 -0
  332. package/src/tests/renderer.useMouse.test.ts +50 -0
  333. package/src/tests/runtime-plugin-support.fixture.ts +11 -0
  334. package/src/tests/runtime-plugin-support.test.ts +28 -0
  335. package/src/tests/runtime-plugin.fixture.ts +40 -0
  336. package/src/tests/runtime-plugin.test.ts +190 -0
  337. package/src/tests/scrollbox-culling-bug.test.ts +114 -0
  338. package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
  339. package/src/tests/scrollbox-hitgrid.test.ts +909 -0
  340. package/src/tests/scrollbox.test.ts +1530 -0
  341. package/src/tests/wrap-resize-perf.test.ts +229 -0
  342. package/src/tests/yoga-setters.test.ts +921 -0
  343. package/src/text-buffer-view.test.ts +705 -0
  344. package/src/text-buffer-view.ts +189 -0
  345. package/src/text-buffer.test.ts +347 -0
  346. package/src/text-buffer.ts +250 -0
  347. package/src/types.ts +152 -0
  348. package/src/utils.ts +88 -0
  349. package/src/zig/ansi.zig +268 -0
  350. package/src/zig/bench/README.md +50 -0
  351. package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
  352. package/src/zig/bench/edit-buffer_bench.zig +476 -0
  353. package/src/zig/bench/native-span-feed_bench.zig +100 -0
  354. package/src/zig/bench/rope-markers_bench.zig +713 -0
  355. package/src/zig/bench/rope_bench.zig +514 -0
  356. package/src/zig/bench/styled-text_bench.zig +470 -0
  357. package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
  358. package/src/zig/bench/text-buffer-view_bench.zig +459 -0
  359. package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
  360. package/src/zig/bench/utf8_bench.zig +799 -0
  361. package/src/zig/bench-utils.zig +431 -0
  362. package/src/zig/bench.zig +217 -0
  363. package/src/zig/buffer.zig +2223 -0
  364. package/src/zig/build.zig +289 -0
  365. package/src/zig/build.zig.zon +16 -0
  366. package/src/zig/edit-buffer.zig +825 -0
  367. package/src/zig/editor-view.zig +802 -0
  368. package/src/zig/event-bus.zig +13 -0
  369. package/src/zig/event-emitter.zig +65 -0
  370. package/src/zig/file-logger.zig +92 -0
  371. package/src/zig/grapheme.zig +599 -0
  372. package/src/zig/lib.zig +1834 -0
  373. package/src/zig/link.zig +333 -0
  374. package/src/zig/logger.zig +43 -0
  375. package/src/zig/mem-registry.zig +125 -0
  376. package/src/zig/native-span-feed-bench-lib.zig +7 -0
  377. package/src/zig/native-span-feed.zig +708 -0
  378. package/src/zig/renderer.zig +1386 -0
  379. package/src/zig/rope.zig +1220 -0
  380. package/src/zig/syntax-style.zig +161 -0
  381. package/src/zig/terminal.zig +975 -0
  382. package/src/zig/test.zig +70 -0
  383. package/src/zig/tests/README.md +18 -0
  384. package/src/zig/tests/buffer_test.zig +2526 -0
  385. package/src/zig/tests/edit-buffer-history_test.zig +271 -0
  386. package/src/zig/tests/edit-buffer_test.zig +1689 -0
  387. package/src/zig/tests/editor-view_test.zig +3299 -0
  388. package/src/zig/tests/event-emitter_test.zig +249 -0
  389. package/src/zig/tests/grapheme_test.zig +1304 -0
  390. package/src/zig/tests/link_test.zig +190 -0
  391. package/src/zig/tests/mem-registry_test.zig +473 -0
  392. package/src/zig/tests/memory_leak_regression_test.zig +159 -0
  393. package/src/zig/tests/native-span-feed_test.zig +1264 -0
  394. package/src/zig/tests/renderer_test.zig +1010 -0
  395. package/src/zig/tests/rope-nested_test.zig +712 -0
  396. package/src/zig/tests/rope_fuzz_test.zig +238 -0
  397. package/src/zig/tests/rope_test.zig +2362 -0
  398. package/src/zig/tests/segment-merge.test.zig +148 -0
  399. package/src/zig/tests/syntax-style_test.zig +557 -0
  400. package/src/zig/tests/terminal_test.zig +719 -0
  401. package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
  402. package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
  403. package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
  404. package/src/zig/tests/text-buffer-segment_test.zig +320 -0
  405. package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
  406. package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
  407. package/src/zig/tests/text-buffer-view_test.zig +3649 -0
  408. package/src/zig/tests/text-buffer_test.zig +2191 -0
  409. package/src/zig/tests/unicode-width-map.zon +3909 -0
  410. package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
  411. package/src/zig/tests/utf8_test.zig +4057 -0
  412. package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
  413. package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
  414. package/src/zig/tests/word-wrap-editing_test.zig +498 -0
  415. package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
  416. package/src/zig/text-buffer-iterators.zig +499 -0
  417. package/src/zig/text-buffer-segment.zig +404 -0
  418. package/src/zig/text-buffer-view.zig +1371 -0
  419. package/src/zig/text-buffer.zig +1180 -0
  420. package/src/zig/utf8.zig +1948 -0
  421. package/src/zig/utils.zig +9 -0
  422. package/src/zig-structs.ts +261 -0
  423. package/src/zig.ts +3843 -0
  424. package/tsconfig.build.json +22 -0
  425. package/tsconfig.json +28 -0
  426. package/3d/SpriteResourceManager.d.ts +0 -74
  427. package/3d/SpriteUtils.d.ts +0 -13
  428. package/3d/TextureUtils.d.ts +0 -24
  429. package/3d/ThreeRenderable.d.ts +0 -40
  430. package/3d/WGPURenderer.d.ts +0 -61
  431. package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
  432. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
  433. package/3d/animation/SpriteAnimator.d.ts +0 -124
  434. package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
  435. package/3d/canvas.d.ts +0 -44
  436. package/3d/index.d.ts +0 -12
  437. package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
  438. package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
  439. package/3d/physics/physics-interface.d.ts +0 -27
  440. package/3d.d.ts +0 -2
  441. package/3d.js +0 -34042
  442. package/3d.js.map +0 -155
  443. package/LICENSE +0 -21
  444. package/NativeSpanFeed.d.ts +0 -41
  445. package/Renderable.d.ts +0 -334
  446. package/animation/Timeline.d.ts +0 -126
  447. package/ansi.d.ts +0 -13
  448. package/buffer.d.ts +0 -107
  449. package/console.d.ts +0 -143
  450. package/edit-buffer.d.ts +0 -98
  451. package/editor-view.d.ts +0 -73
  452. package/index-e4hzc2j2.js +0 -113
  453. package/index-e4hzc2j2.js.map +0 -10
  454. package/index-nkrr8a4c.js +0 -18415
  455. package/index-nkrr8a4c.js.map +0 -64
  456. package/index-nyw5p3ep.js +0 -12619
  457. package/index-nyw5p3ep.js.map +0 -43
  458. package/index.d.ts +0 -21
  459. package/index.js +0 -430
  460. package/index.js.map +0 -9
  461. package/lib/KeyHandler.d.ts +0 -61
  462. package/lib/RGBA.d.ts +0 -25
  463. package/lib/ascii.font.d.ts +0 -508
  464. package/lib/border.d.ts +0 -49
  465. package/lib/bunfs.d.ts +0 -7
  466. package/lib/clipboard.d.ts +0 -17
  467. package/lib/clock.d.ts +0 -15
  468. package/lib/data-paths.d.ts +0 -26
  469. package/lib/debounce.d.ts +0 -42
  470. package/lib/detect-links.d.ts +0 -6
  471. package/lib/env.d.ts +0 -42
  472. package/lib/extmarks-history.d.ts +0 -17
  473. package/lib/extmarks.d.ts +0 -89
  474. package/lib/hast-styled-text.d.ts +0 -17
  475. package/lib/index.d.ts +0 -21
  476. package/lib/keymapping.d.ts +0 -25
  477. package/lib/objects-in-viewport.d.ts +0 -24
  478. package/lib/output.capture.d.ts +0 -24
  479. package/lib/parse.keypress-kitty.d.ts +0 -2
  480. package/lib/parse.keypress.d.ts +0 -26
  481. package/lib/parse.mouse.d.ts +0 -30
  482. package/lib/paste.d.ts +0 -7
  483. package/lib/queue.d.ts +0 -15
  484. package/lib/renderable.validations.d.ts +0 -12
  485. package/lib/scroll-acceleration.d.ts +0 -43
  486. package/lib/selection.d.ts +0 -63
  487. package/lib/singleton.d.ts +0 -7
  488. package/lib/stdin-parser.d.ts +0 -76
  489. package/lib/styled-text.d.ts +0 -63
  490. package/lib/terminal-capability-detection.d.ts +0 -30
  491. package/lib/terminal-palette.d.ts +0 -50
  492. package/lib/tree-sitter/assets/update.d.ts +0 -11
  493. package/lib/tree-sitter/client.d.ts +0 -47
  494. package/lib/tree-sitter/default-parsers.d.ts +0 -2
  495. package/lib/tree-sitter/download-utils.d.ts +0 -21
  496. package/lib/tree-sitter/index.d.ts +0 -8
  497. package/lib/tree-sitter/parser.worker.d.ts +0 -1
  498. package/lib/tree-sitter/parsers-config.d.ts +0 -38
  499. package/lib/tree-sitter/resolve-ft.d.ts +0 -2
  500. package/lib/tree-sitter/types.d.ts +0 -81
  501. package/lib/tree-sitter-styled-text.d.ts +0 -14
  502. package/lib/validate-dir-name.d.ts +0 -1
  503. package/lib/yoga.options.d.ts +0 -32
  504. package/parser.worker.js +0 -869
  505. package/parser.worker.js.map +0 -12
  506. package/plugins/core-slot.d.ts +0 -72
  507. package/plugins/registry.d.ts +0 -38
  508. package/plugins/types.d.ts +0 -34
  509. package/post/filters.d.ts +0 -105
  510. package/renderables/ASCIIFont.d.ts +0 -52
  511. package/renderables/Box.d.ts +0 -72
  512. package/renderables/Code.d.ts +0 -78
  513. package/renderables/Diff.d.ts +0 -142
  514. package/renderables/EditBufferRenderable.d.ts +0 -162
  515. package/renderables/FrameBuffer.d.ts +0 -16
  516. package/renderables/Input.d.ts +0 -67
  517. package/renderables/LineNumberRenderable.d.ts +0 -74
  518. package/renderables/Markdown.d.ts +0 -173
  519. package/renderables/ScrollBar.d.ts +0 -77
  520. package/renderables/ScrollBox.d.ts +0 -124
  521. package/renderables/Select.d.ts +0 -115
  522. package/renderables/Slider.d.ts +0 -44
  523. package/renderables/TabSelect.d.ts +0 -96
  524. package/renderables/Text.d.ts +0 -36
  525. package/renderables/TextBufferRenderable.d.ts +0 -105
  526. package/renderables/TextNode.d.ts +0 -91
  527. package/renderables/TextTable.d.ts +0 -140
  528. package/renderables/Textarea.d.ts +0 -114
  529. package/renderables/TimeToFirstDraw.d.ts +0 -24
  530. package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
  531. package/renderables/composition/VRenderable.d.ts +0 -16
  532. package/renderables/composition/constructs.d.ts +0 -35
  533. package/renderables/composition/vnode.d.ts +0 -46
  534. package/renderables/index.d.ts +0 -22
  535. package/renderables/markdown-parser.d.ts +0 -10
  536. package/renderer.d.ts +0 -388
  537. package/runtime-plugin-support.d.ts +0 -3
  538. package/runtime-plugin-support.js +0 -29
  539. package/runtime-plugin-support.js.map +0 -10
  540. package/runtime-plugin.d.ts +0 -11
  541. package/runtime-plugin.js +0 -16
  542. package/runtime-plugin.js.map +0 -9
  543. package/syntax-style.d.ts +0 -54
  544. package/testing/manual-clock.d.ts +0 -16
  545. package/testing/mock-keys.d.ts +0 -81
  546. package/testing/mock-mouse.d.ts +0 -38
  547. package/testing/mock-tree-sitter-client.d.ts +0 -23
  548. package/testing/spy.d.ts +0 -7
  549. package/testing/test-recorder.d.ts +0 -61
  550. package/testing/test-renderer.d.ts +0 -23
  551. package/testing.d.ts +0 -6
  552. package/testing.js +0 -675
  553. package/testing.js.map +0 -15
  554. package/text-buffer-view.d.ts +0 -42
  555. package/text-buffer.d.ts +0 -67
  556. package/types.d.ts +0 -131
  557. package/utils.d.ts +0 -14
  558. package/zig-structs.d.ts +0 -155
  559. package/zig.d.ts +0 -351
  560. /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
  561. /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
  562. /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
  563. /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
  564. /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
  565. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
  566. /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  567. /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
  568. /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
  569. /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
  570. /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
package/parser.worker.js DELETED
@@ -1,869 +0,0 @@
1
- // @bun
2
- var __require = import.meta.require;
3
-
4
- // src/lib/tree-sitter/parser.worker.ts
5
- import { mkdir as mkdir2 } from "fs/promises";
6
- import * as path2 from "path";
7
-
8
- // src/lib/tree-sitter/download-utils.ts
9
- import { mkdir, readFile, writeFile } from "fs/promises";
10
- import * as path from "path";
11
-
12
- class DownloadUtils {
13
- static hashUrl(url) {
14
- let hash = 0;
15
- for (let i = 0;i < url.length; i++) {
16
- const char = url.charCodeAt(i);
17
- hash = (hash << 5) - hash + char;
18
- hash = hash & hash;
19
- }
20
- return Math.abs(hash).toString(16);
21
- }
22
- static async downloadOrLoad(source, cacheDir, cacheSubdir, fileExtension, useHashForCache = true, filetype) {
23
- const isUrl = source.startsWith("http://") || source.startsWith("https://");
24
- if (isUrl) {
25
- let cacheFileName;
26
- if (useHashForCache) {
27
- const hash = this.hashUrl(source);
28
- cacheFileName = filetype ? `${filetype}-${hash}${fileExtension}` : `${hash}${fileExtension}`;
29
- } else {
30
- cacheFileName = path.basename(source);
31
- }
32
- const cacheFile = path.join(cacheDir, cacheSubdir, cacheFileName);
33
- await mkdir(path.dirname(cacheFile), { recursive: true });
34
- try {
35
- const cachedContent = await readFile(cacheFile);
36
- if (cachedContent.byteLength > 0) {
37
- console.log(`Loaded from cache: ${cacheFile} (${source})`);
38
- return { content: cachedContent, filePath: cacheFile };
39
- }
40
- } catch (error) {}
41
- try {
42
- console.log(`Downloading from URL: ${source}`);
43
- const response = await fetch(source);
44
- if (!response.ok) {
45
- return { error: `Failed to fetch from ${source}: ${response.statusText}` };
46
- }
47
- const content = Buffer.from(await response.arrayBuffer());
48
- try {
49
- await writeFile(cacheFile, Buffer.from(content));
50
- console.log(`Cached: ${source}`);
51
- } catch (cacheError) {
52
- console.warn(`Failed to cache: ${cacheError}`);
53
- }
54
- return { content, filePath: cacheFile };
55
- } catch (error) {
56
- return { error: `Error downloading from ${source}: ${error}` };
57
- }
58
- } else {
59
- try {
60
- console.log(`Loading from local path: ${source}`);
61
- const content = await readFile(source);
62
- return { content, filePath: source };
63
- } catch (error) {
64
- return { error: `Error loading from local path ${source}: ${error}` };
65
- }
66
- }
67
- }
68
- static async downloadToPath(source, targetPath) {
69
- const isUrl = source.startsWith("http://") || source.startsWith("https://");
70
- await mkdir(path.dirname(targetPath), { recursive: true });
71
- if (isUrl) {
72
- try {
73
- console.log(`Downloading from URL: ${source}`);
74
- const response = await fetch(source);
75
- if (!response.ok) {
76
- return { error: `Failed to fetch from ${source}: ${response.statusText}` };
77
- }
78
- const content = Buffer.from(await response.arrayBuffer());
79
- await writeFile(targetPath, Buffer.from(content));
80
- console.log(`Downloaded: ${source} -> ${targetPath}`);
81
- return { content, filePath: targetPath };
82
- } catch (error) {
83
- return { error: `Error downloading from ${source}: ${error}` };
84
- }
85
- } else {
86
- try {
87
- console.log(`Copying from local path: ${source}`);
88
- const content = await readFile(source);
89
- await writeFile(targetPath, Buffer.from(content));
90
- return { content, filePath: targetPath };
91
- } catch (error) {
92
- return { error: `Error copying from local path ${source}: ${error}` };
93
- }
94
- }
95
- }
96
- static async fetchHighlightQueries(sources, cacheDir, filetype) {
97
- const queryPromises = sources.map((source) => this.fetchHighlightQuery(source, cacheDir, filetype));
98
- const queryResults = await Promise.all(queryPromises);
99
- const validQueries = queryResults.filter((query) => query.trim().length > 0);
100
- return validQueries.join(`
101
- `);
102
- }
103
- static async fetchHighlightQuery(source, cacheDir, filetype) {
104
- const result = await this.downloadOrLoad(source, cacheDir, "queries", ".scm", true, filetype);
105
- if (result.error) {
106
- console.error(`Error fetching highlight query from ${source}:`, result.error);
107
- return "";
108
- }
109
- if (result.content) {
110
- return new TextDecoder().decode(result.content);
111
- }
112
- return "";
113
- }
114
- }
115
-
116
- // src/lib/tree-sitter/parser.worker.ts
117
- import { isMainThread } from "worker_threads";
118
-
119
- // src/lib/bunfs.ts
120
- import { basename as basename2, join as join2 } from "path";
121
- function isBunfsPath(path2) {
122
- return path2.includes("$bunfs") || /^B:[\\/]~BUN/i.test(path2);
123
- }
124
- function getBunfsRootPath() {
125
- return process.platform === "win32" ? "B:\\~BUN\\root" : "/$bunfs/root";
126
- }
127
- function normalizeBunfsPath(fileName) {
128
- return join2(getBunfsRootPath(), basename2(fileName));
129
- }
130
-
131
- // src/lib/tree-sitter/parser.worker.ts
132
- var TreeSitter;
133
- var self = globalThis;
134
-
135
- class ParserWorker {
136
- bufferParsers = new Map;
137
- filetypeParserOptions = new Map;
138
- filetypeParsers = new Map;
139
- filetypeParserPromises = new Map;
140
- reusableParsers = new Map;
141
- reusableParserPromises = new Map;
142
- initializePromise;
143
- performance;
144
- dataPath;
145
- tsDataPath;
146
- initialized = false;
147
- constructor() {
148
- this.performance = {
149
- averageParseTime: 0,
150
- parseTimes: [],
151
- averageQueryTime: 0,
152
- queryTimes: []
153
- };
154
- }
155
- async fetchQueries(sources, filetype) {
156
- if (!this.tsDataPath) {
157
- return "";
158
- }
159
- return DownloadUtils.fetchHighlightQueries(sources, this.tsDataPath, filetype);
160
- }
161
- async initialize({ dataPath }) {
162
- if (this.initializePromise) {
163
- return this.initializePromise;
164
- }
165
- this.initializePromise = new Promise(async (resolve, reject) => {
166
- this.dataPath = dataPath;
167
- this.tsDataPath = path2.join(dataPath, "tree-sitter");
168
- try {
169
- await mkdir2(path2.join(this.tsDataPath, "languages"), { recursive: true });
170
- await mkdir2(path2.join(this.tsDataPath, "queries"), { recursive: true });
171
- const mod = await import("web-tree-sitter");
172
- const P = mod.default ?? mod;
173
- TreeSitter = {
174
- Parser: P,
175
- Query: P.Query,
176
- Language: P.Language
177
- };
178
- let { default: treeWasm } = await import("web-tree-sitter/tree-sitter.wasm", {
179
- with: { type: "wasm" }
180
- });
181
- if (isBunfsPath(treeWasm)) {
182
- treeWasm = normalizeBunfsPath(path2.parse(treeWasm).base);
183
- }
184
- await TreeSitter.Parser.init({
185
- locateFile() {
186
- return treeWasm;
187
- }
188
- });
189
- this.initialized = true;
190
- resolve();
191
- } catch (error) {
192
- reject(error);
193
- }
194
- });
195
- return this.initializePromise;
196
- }
197
- addFiletypeParser(filetypeParser) {
198
- this.filetypeParserOptions.set(filetypeParser.filetype, filetypeParser);
199
- }
200
- async createQueries(filetypeParser, language) {
201
- try {
202
- const highlightQueryContent = await this.fetchQueries(filetypeParser.queries.highlights, filetypeParser.filetype);
203
- if (!highlightQueryContent) {
204
- console.error("Failed to fetch highlight queries for:", filetypeParser.filetype);
205
- return;
206
- }
207
- const highlightsQuery = new TreeSitter.Query(language, highlightQueryContent);
208
- const result = {
209
- highlights: highlightsQuery
210
- };
211
- if (filetypeParser.queries.injections && filetypeParser.queries.injections.length > 0) {
212
- const injectionQueryContent = await this.fetchQueries(filetypeParser.queries.injections, filetypeParser.filetype);
213
- if (injectionQueryContent) {
214
- result.injections = new TreeSitter.Query(language, injectionQueryContent);
215
- }
216
- }
217
- return result;
218
- } catch (error) {
219
- console.error("Error creating queries for", filetypeParser.filetype, filetypeParser.queries);
220
- console.error(error);
221
- return;
222
- }
223
- }
224
- async loadLanguage(languageSource) {
225
- if (!this.initialized || !this.tsDataPath) {
226
- return;
227
- }
228
- const result = await DownloadUtils.downloadOrLoad(languageSource, this.tsDataPath, "languages", ".wasm", false);
229
- if (result.error) {
230
- console.error(`Error loading language ${languageSource}:`, result.error);
231
- return;
232
- }
233
- if (!result.filePath) {
234
- return;
235
- }
236
- const normalizedPath = result.filePath.replaceAll("\\", "/");
237
- try {
238
- const language = await TreeSitter.Language.load(normalizedPath);
239
- return language;
240
- } catch (error) {
241
- console.error(`Error loading language from ${normalizedPath}:`, error);
242
- return;
243
- }
244
- }
245
- async resolveFiletypeParser(filetype) {
246
- if (this.filetypeParsers.has(filetype)) {
247
- return this.filetypeParsers.get(filetype);
248
- }
249
- if (this.filetypeParserPromises.has(filetype)) {
250
- return this.filetypeParserPromises.get(filetype);
251
- }
252
- const loadingPromise = this.loadFiletypeParser(filetype);
253
- this.filetypeParserPromises.set(filetype, loadingPromise);
254
- try {
255
- const result = await loadingPromise;
256
- if (result) {
257
- this.filetypeParsers.set(filetype, result);
258
- }
259
- return result;
260
- } finally {
261
- this.filetypeParserPromises.delete(filetype);
262
- }
263
- }
264
- async loadFiletypeParser(filetype) {
265
- const filetypeParserOptions = this.filetypeParserOptions.get(filetype);
266
- if (!filetypeParserOptions) {
267
- return;
268
- }
269
- const language = await this.loadLanguage(filetypeParserOptions.wasm);
270
- if (!language) {
271
- return;
272
- }
273
- const queries = await this.createQueries(filetypeParserOptions, language);
274
- if (!queries) {
275
- console.error("Failed to create queries for:", filetype);
276
- return;
277
- }
278
- const filetypeParser = {
279
- ...filetypeParserOptions,
280
- queries,
281
- language
282
- };
283
- return filetypeParser;
284
- }
285
- async preloadParser(filetype) {
286
- return this.resolveFiletypeParser(filetype);
287
- }
288
- async getReusableParser(filetype) {
289
- if (this.reusableParsers.has(filetype)) {
290
- return this.reusableParsers.get(filetype);
291
- }
292
- if (this.reusableParserPromises.has(filetype)) {
293
- return this.reusableParserPromises.get(filetype);
294
- }
295
- const creationPromise = this.createReusableParser(filetype);
296
- this.reusableParserPromises.set(filetype, creationPromise);
297
- try {
298
- const result = await creationPromise;
299
- if (result) {
300
- this.reusableParsers.set(filetype, result);
301
- }
302
- return result;
303
- } finally {
304
- this.reusableParserPromises.delete(filetype);
305
- }
306
- }
307
- async createReusableParser(filetype) {
308
- const filetypeParser = await this.resolveFiletypeParser(filetype);
309
- if (!filetypeParser) {
310
- return;
311
- }
312
- const parser = new TreeSitter.Parser;
313
- parser.setLanguage(filetypeParser.language);
314
- const reusableState = {
315
- parser,
316
- filetypeParser,
317
- queries: filetypeParser.queries
318
- };
319
- return reusableState;
320
- }
321
- async handleInitializeParser(bufferId, version, content, filetype, messageId) {
322
- const filetypeParser = await this.resolveFiletypeParser(filetype);
323
- if (!filetypeParser) {
324
- self.postMessage({
325
- type: "PARSER_INIT_RESPONSE",
326
- bufferId,
327
- messageId,
328
- hasParser: false,
329
- warning: `No parser available for filetype ${filetype}`
330
- });
331
- return;
332
- }
333
- const parser = new TreeSitter.Parser;
334
- parser.setLanguage(filetypeParser.language);
335
- const tree = parser.parse(content);
336
- if (!tree) {
337
- self.postMessage({
338
- type: "PARSER_INIT_RESPONSE",
339
- bufferId,
340
- messageId,
341
- hasParser: false,
342
- error: "Failed to parse buffer"
343
- });
344
- return;
345
- }
346
- const parserState = {
347
- parser,
348
- tree,
349
- queries: filetypeParser.queries,
350
- filetype,
351
- content,
352
- injectionMapping: filetypeParser.injectionMapping
353
- };
354
- this.bufferParsers.set(bufferId, parserState);
355
- self.postMessage({
356
- type: "PARSER_INIT_RESPONSE",
357
- bufferId,
358
- messageId,
359
- hasParser: true
360
- });
361
- const highlights = await this.initialQuery(parserState);
362
- self.postMessage({
363
- type: "HIGHLIGHT_RESPONSE",
364
- bufferId,
365
- version,
366
- ...highlights
367
- });
368
- }
369
- async initialQuery(parserState) {
370
- const query = parserState.queries.highlights;
371
- const matches = query.captures(parserState.tree.rootNode);
372
- let injectionRanges = new Map;
373
- if (parserState.queries.injections) {
374
- const injectionResult = await this.processInjections(parserState);
375
- matches.push(...injectionResult.captures);
376
- injectionRanges = injectionResult.injectionRanges;
377
- }
378
- return this.getHighlights(parserState, matches, injectionRanges);
379
- }
380
- getNodeText(node, content) {
381
- return content.substring(node.startIndex, node.endIndex);
382
- }
383
- async processInjections(parserState) {
384
- const injectionMatches = [];
385
- const injectionRanges = new Map;
386
- if (!parserState.queries.injections) {
387
- return { captures: injectionMatches, injectionRanges };
388
- }
389
- const content = parserState.content;
390
- const injectionCaptures = parserState.queries.injections.captures(parserState.tree.rootNode);
391
- const languageGroups = new Map;
392
- const injectionMapping = parserState.injectionMapping;
393
- for (const capture of injectionCaptures) {
394
- const captureName = capture.name;
395
- if (captureName === "injection.content" || captureName.includes("injection")) {
396
- const nodeType = capture.node.type;
397
- let targetLanguage;
398
- if (injectionMapping?.nodeTypes && injectionMapping.nodeTypes[nodeType]) {
399
- targetLanguage = injectionMapping.nodeTypes[nodeType];
400
- } else if (nodeType === "code_fence_content") {
401
- const parent = capture.node.parent;
402
- if (parent) {
403
- const infoString = parent.children.find((child) => child.type === "info_string");
404
- if (infoString) {
405
- const languageNode = infoString.children.find((child) => child.type === "language");
406
- if (languageNode) {
407
- const languageName = this.getNodeText(languageNode, content);
408
- if (injectionMapping?.infoStringMap && injectionMapping.infoStringMap[languageName]) {
409
- targetLanguage = injectionMapping.infoStringMap[languageName];
410
- } else {
411
- targetLanguage = languageName;
412
- }
413
- }
414
- }
415
- }
416
- }
417
- if (targetLanguage) {
418
- if (!languageGroups.has(targetLanguage)) {
419
- languageGroups.set(targetLanguage, []);
420
- }
421
- languageGroups.get(targetLanguage).push({ node: capture.node, name: capture.name });
422
- }
423
- }
424
- }
425
- for (const [language, captures] of languageGroups.entries()) {
426
- const injectedParser = await this.getReusableParser(language);
427
- if (!injectedParser) {
428
- console.warn(`No parser found for injection language: ${language}`);
429
- continue;
430
- }
431
- if (!injectionRanges.has(language)) {
432
- injectionRanges.set(language, []);
433
- }
434
- const parser = injectedParser.parser;
435
- for (const { node: injectionNode } of captures) {
436
- try {
437
- injectionRanges.get(language).push({
438
- start: injectionNode.startIndex,
439
- end: injectionNode.endIndex
440
- });
441
- const injectionContent = this.getNodeText(injectionNode, content);
442
- const tree = parser.parse(injectionContent);
443
- if (tree) {
444
- const matches = injectedParser.queries.highlights.captures(tree.rootNode);
445
- for (const match of matches) {
446
- const offsetCapture = {
447
- name: match.name,
448
- patternIndex: match.patternIndex,
449
- _injectedQuery: injectedParser.queries.highlights,
450
- node: {
451
- ...match.node,
452
- startPosition: {
453
- row: match.node.startPosition.row + injectionNode.startPosition.row,
454
- column: match.node.startPosition.row === 0 ? match.node.startPosition.column + injectionNode.startPosition.column : match.node.startPosition.column
455
- },
456
- endPosition: {
457
- row: match.node.endPosition.row + injectionNode.startPosition.row,
458
- column: match.node.endPosition.row === 0 ? match.node.endPosition.column + injectionNode.startPosition.column : match.node.endPosition.column
459
- },
460
- startIndex: match.node.startIndex + injectionNode.startIndex,
461
- endIndex: match.node.endIndex + injectionNode.startIndex
462
- }
463
- };
464
- injectionMatches.push(offsetCapture);
465
- }
466
- tree.delete();
467
- }
468
- } catch (error) {
469
- console.error(`Error processing injection for language ${language}:`, error);
470
- }
471
- }
472
- }
473
- return { captures: injectionMatches, injectionRanges };
474
- }
475
- editToRange(edit) {
476
- return {
477
- startPosition: {
478
- column: edit.startPosition.column,
479
- row: edit.startPosition.row
480
- },
481
- endPosition: {
482
- column: edit.newEndPosition.column,
483
- row: edit.newEndPosition.row
484
- },
485
- startIndex: edit.startIndex,
486
- endIndex: edit.newEndIndex
487
- };
488
- }
489
- async handleEdits(bufferId, content, edits) {
490
- const parserState = this.bufferParsers.get(bufferId);
491
- if (!parserState) {
492
- return { warning: "No parser state found for buffer" };
493
- }
494
- parserState.content = content;
495
- for (const edit of edits) {
496
- parserState.tree.edit(edit);
497
- }
498
- const startParse = performance.now();
499
- const newTree = parserState.parser.parse(content, parserState.tree);
500
- const endParse = performance.now();
501
- const parseTime = endParse - startParse;
502
- this.performance.parseTimes.push(parseTime);
503
- if (this.performance.parseTimes.length > 10) {
504
- this.performance.parseTimes.shift();
505
- }
506
- this.performance.averageParseTime = this.performance.parseTimes.reduce((acc, time) => acc + time, 0) / this.performance.parseTimes.length;
507
- if (!newTree) {
508
- return { error: "Failed to parse buffer" };
509
- }
510
- const changedRanges = parserState.tree.getChangedRanges(newTree);
511
- parserState.tree = newTree;
512
- const startQuery = performance.now();
513
- const matches = [];
514
- if (changedRanges.length === 0) {
515
- edits.forEach((edit) => {
516
- const range = this.editToRange(edit);
517
- changedRanges.push(range);
518
- });
519
- }
520
- for (const range of changedRanges) {
521
- let node = parserState.tree.rootNode.descendantForPosition(range.startPosition, range.endPosition);
522
- if (!node) {
523
- continue;
524
- }
525
- if (node.equals(parserState.tree.rootNode)) {
526
- const rangeCaptures = parserState.queries.highlights.captures(node, {
527
- startIndex: range.startIndex - 100,
528
- endIndex: range.endIndex + 1000
529
- });
530
- matches.push(...rangeCaptures);
531
- continue;
532
- }
533
- while (node && !this.nodeContainsRange(node, range)) {
534
- node = node.parent;
535
- }
536
- if (!node) {
537
- node = parserState.tree.rootNode;
538
- }
539
- const nodeCaptures = parserState.queries.highlights.captures(node);
540
- matches.push(...nodeCaptures);
541
- }
542
- let injectionRanges = new Map;
543
- if (parserState.queries.injections) {
544
- const injectionResult = await this.processInjections(parserState);
545
- matches.push(...injectionResult.captures);
546
- injectionRanges = injectionResult.injectionRanges;
547
- }
548
- const endQuery = performance.now();
549
- const queryTime = endQuery - startQuery;
550
- this.performance.queryTimes.push(queryTime);
551
- if (this.performance.queryTimes.length > 10) {
552
- this.performance.queryTimes.shift();
553
- }
554
- this.performance.averageQueryTime = this.performance.queryTimes.reduce((acc, time) => acc + time, 0) / this.performance.queryTimes.length;
555
- return this.getHighlights(parserState, matches, injectionRanges);
556
- }
557
- nodeContainsRange(node, range) {
558
- return node.startPosition.row <= range.startPosition.row && node.endPosition.row >= range.endPosition.row && (node.startPosition.row < range.startPosition.row || node.startPosition.column <= range.startPosition.column) && (node.endPosition.row > range.endPosition.row || node.endPosition.column >= range.endPosition.column);
559
- }
560
- getHighlights(parserState, matches, injectionRanges) {
561
- const lineHighlights = new Map;
562
- const droppedHighlights = new Map;
563
- for (const match of matches) {
564
- const node = match.node;
565
- const startLine = node.startPosition.row;
566
- const endLine = node.endPosition.row;
567
- const highlight = {
568
- startCol: node.startPosition.column,
569
- endCol: node.endPosition.column,
570
- group: match.name
571
- };
572
- if (!lineHighlights.has(startLine)) {
573
- lineHighlights.set(startLine, new Map);
574
- droppedHighlights.set(startLine, new Map);
575
- }
576
- if (lineHighlights.get(startLine)?.has(node.id)) {
577
- droppedHighlights.get(startLine)?.set(node.id, lineHighlights.get(startLine)?.get(node.id));
578
- }
579
- lineHighlights.get(startLine)?.set(node.id, highlight);
580
- if (startLine !== endLine) {
581
- for (let line = startLine + 1;line <= endLine; line++) {
582
- if (!lineHighlights.has(line)) {
583
- lineHighlights.set(line, new Map);
584
- }
585
- const hl = {
586
- startCol: 0,
587
- endCol: node.endPosition.column,
588
- group: match.name
589
- };
590
- lineHighlights.get(line)?.set(node.id, hl);
591
- }
592
- }
593
- }
594
- return {
595
- highlights: Array.from(lineHighlights.entries()).map(([line, lineHighlights2]) => ({
596
- line,
597
- highlights: Array.from(lineHighlights2.values()),
598
- droppedHighlights: droppedHighlights.get(line) ? Array.from(droppedHighlights.get(line).values()) : []
599
- }))
600
- };
601
- }
602
- getSimpleHighlights(matches, injectionRanges) {
603
- const highlights = [];
604
- const flatInjectionRanges = [];
605
- for (const [lang, ranges] of injectionRanges.entries()) {
606
- for (const range of ranges) {
607
- flatInjectionRanges.push({ ...range, lang });
608
- }
609
- }
610
- for (const match of matches) {
611
- const node = match.node;
612
- let isInjection = false;
613
- let injectionLang;
614
- let containsInjection = false;
615
- for (const injRange of flatInjectionRanges) {
616
- if (node.startIndex >= injRange.start && node.endIndex <= injRange.end) {
617
- isInjection = true;
618
- injectionLang = injRange.lang;
619
- break;
620
- } else if (node.startIndex <= injRange.start && node.endIndex >= injRange.end) {
621
- containsInjection = true;
622
- break;
623
- }
624
- }
625
- const matchQuery = match._injectedQuery;
626
- const patternProperties = matchQuery?.setProperties?.[match.patternIndex];
627
- const concealValue = patternProperties?.conceal ?? match.setProperties?.conceal;
628
- const concealLines = patternProperties?.conceal_lines ?? match.setProperties?.conceal_lines;
629
- const meta = {};
630
- if (isInjection && injectionLang) {
631
- meta.isInjection = true;
632
- meta.injectionLang = injectionLang;
633
- }
634
- if (containsInjection) {
635
- meta.containsInjection = true;
636
- }
637
- if (concealValue !== undefined) {
638
- meta.conceal = concealValue;
639
- }
640
- if (concealLines !== undefined) {
641
- meta.concealLines = concealLines;
642
- }
643
- if (Object.keys(meta).length > 0) {
644
- highlights.push([node.startIndex, node.endIndex, match.name, meta]);
645
- } else {
646
- highlights.push([node.startIndex, node.endIndex, match.name]);
647
- }
648
- }
649
- highlights.sort((a, b) => a[0] - b[0]);
650
- return highlights;
651
- }
652
- async handleResetBuffer(bufferId, version, content) {
653
- const parserState = this.bufferParsers.get(bufferId);
654
- if (!parserState) {
655
- return { warning: "No parser state found for buffer" };
656
- }
657
- parserState.content = content;
658
- const newTree = parserState.parser.parse(content);
659
- if (!newTree) {
660
- return { error: "Failed to parse buffer during reset" };
661
- }
662
- parserState.tree = newTree;
663
- const matches = parserState.queries.highlights.captures(parserState.tree.rootNode);
664
- let injectionRanges = new Map;
665
- if (parserState.queries.injections) {
666
- const injectionResult = await this.processInjections(parserState);
667
- matches.push(...injectionResult.captures);
668
- injectionRanges = injectionResult.injectionRanges;
669
- }
670
- return this.getHighlights(parserState, matches, injectionRanges);
671
- }
672
- disposeBuffer(bufferId) {
673
- const parserState = this.bufferParsers.get(bufferId);
674
- if (!parserState) {
675
- return;
676
- }
677
- parserState.tree.delete();
678
- parserState.parser.delete();
679
- this.bufferParsers.delete(bufferId);
680
- }
681
- async handleOneShotHighlight(content, filetype, messageId) {
682
- const reusableState = await this.getReusableParser(filetype);
683
- if (!reusableState) {
684
- self.postMessage({
685
- type: "ONESHOT_HIGHLIGHT_RESPONSE",
686
- messageId,
687
- hasParser: false,
688
- warning: `No parser available for filetype ${filetype}`
689
- });
690
- return;
691
- }
692
- const parseContent = filetype === "markdown" && content.endsWith("```") ? content + `
693
- ` : content;
694
- const tree = reusableState.parser.parse(parseContent);
695
- if (!tree) {
696
- self.postMessage({
697
- type: "ONESHOT_HIGHLIGHT_RESPONSE",
698
- messageId,
699
- hasParser: false,
700
- error: "Failed to parse content"
701
- });
702
- return;
703
- }
704
- try {
705
- const matches = reusableState.filetypeParser.queries.highlights.captures(tree.rootNode);
706
- let injectionRanges = new Map;
707
- if (reusableState.filetypeParser.queries.injections) {
708
- const parserState = {
709
- parser: reusableState.parser,
710
- tree,
711
- queries: reusableState.filetypeParser.queries,
712
- filetype,
713
- content,
714
- injectionMapping: reusableState.filetypeParser.injectionMapping
715
- };
716
- const injectionResult = await this.processInjections(parserState);
717
- matches.push(...injectionResult.captures);
718
- injectionRanges = injectionResult.injectionRanges;
719
- }
720
- const highlights = this.getSimpleHighlights(matches, injectionRanges);
721
- self.postMessage({
722
- type: "ONESHOT_HIGHLIGHT_RESPONSE",
723
- messageId,
724
- hasParser: true,
725
- highlights
726
- });
727
- } finally {
728
- tree.delete();
729
- }
730
- }
731
- async updateDataPath(dataPath) {
732
- this.dataPath = dataPath;
733
- this.tsDataPath = path2.join(dataPath, "tree-sitter");
734
- try {
735
- await mkdir2(path2.join(this.tsDataPath, "languages"), { recursive: true });
736
- await mkdir2(path2.join(this.tsDataPath, "queries"), { recursive: true });
737
- } catch (error) {
738
- throw new Error(`Failed to update data path: ${error}`);
739
- }
740
- }
741
- async clearCache() {
742
- if (!this.dataPath || !this.tsDataPath) {
743
- throw new Error("No data path configured");
744
- }
745
- const { rm } = await import("fs/promises");
746
- try {
747
- const treeSitterPath = path2.join(this.dataPath, "tree-sitter");
748
- await rm(treeSitterPath, { recursive: true, force: true });
749
- await mkdir2(path2.join(treeSitterPath, "languages"), { recursive: true });
750
- await mkdir2(path2.join(treeSitterPath, "queries"), { recursive: true });
751
- this.filetypeParsers.clear();
752
- this.filetypeParserPromises.clear();
753
- this.reusableParsers.clear();
754
- this.reusableParserPromises.clear();
755
- } catch (error) {
756
- throw new Error(`Failed to clear cache: ${error}`);
757
- }
758
- }
759
- }
760
- if (!isMainThread) {
761
- let logMessage = function(type, ...args) {
762
- self.postMessage({
763
- type: "WORKER_LOG",
764
- logType: type,
765
- data: args
766
- });
767
- };
768
- const worker = new ParserWorker;
769
- console.log = (...args) => logMessage("log", ...args);
770
- console.error = (...args) => logMessage("error", ...args);
771
- console.warn = (...args) => logMessage("warn", ...args);
772
- self.onmessage = async (e) => {
773
- const { type, bufferId, version, content, filetype, edits, filetypeParser, messageId, dataPath } = e.data;
774
- try {
775
- switch (type) {
776
- case "INIT":
777
- try {
778
- await worker.initialize({ dataPath });
779
- self.postMessage({ type: "INIT_RESPONSE" });
780
- } catch (error) {
781
- self.postMessage({
782
- type: "INIT_RESPONSE",
783
- error: error instanceof Error ? error.stack || error.message : String(error)
784
- });
785
- }
786
- break;
787
- case "ADD_FILETYPE_PARSER":
788
- worker.addFiletypeParser(filetypeParser);
789
- break;
790
- case "PRELOAD_PARSER":
791
- const maybeParser = await worker.preloadParser(filetype);
792
- self.postMessage({ type: "PRELOAD_PARSER_RESPONSE", messageId, hasParser: !!maybeParser });
793
- break;
794
- case "INITIALIZE_PARSER":
795
- await worker.handleInitializeParser(bufferId, version, content, filetype, messageId);
796
- break;
797
- case "HANDLE_EDITS":
798
- const response = await worker.handleEdits(bufferId, content, edits);
799
- if (response.highlights && response.highlights.length > 0) {
800
- self.postMessage({ type: "HIGHLIGHT_RESPONSE", bufferId, version, ...response });
801
- } else if (response.warning) {
802
- self.postMessage({ type: "WARNING", bufferId, warning: response.warning });
803
- } else if (response.error) {
804
- self.postMessage({ type: "ERROR", bufferId, error: response.error });
805
- }
806
- break;
807
- case "GET_PERFORMANCE":
808
- self.postMessage({ type: "PERFORMANCE_RESPONSE", performance: worker.performance, messageId });
809
- break;
810
- case "RESET_BUFFER":
811
- const resetResponse = await worker.handleResetBuffer(bufferId, version, content);
812
- if (resetResponse.highlights && resetResponse.highlights.length > 0) {
813
- self.postMessage({ type: "HIGHLIGHT_RESPONSE", bufferId, version, ...resetResponse });
814
- } else if (resetResponse.warning) {
815
- self.postMessage({ type: "WARNING", bufferId, warning: resetResponse.warning });
816
- } else if (resetResponse.error) {
817
- self.postMessage({ type: "ERROR", bufferId, error: resetResponse.error });
818
- }
819
- break;
820
- case "DISPOSE_BUFFER":
821
- worker.disposeBuffer(bufferId);
822
- self.postMessage({ type: "BUFFER_DISPOSED", bufferId });
823
- break;
824
- case "ONESHOT_HIGHLIGHT":
825
- await worker.handleOneShotHighlight(content, filetype, messageId);
826
- break;
827
- case "UPDATE_DATA_PATH":
828
- try {
829
- await worker.updateDataPath(dataPath);
830
- self.postMessage({ type: "UPDATE_DATA_PATH_RESPONSE", messageId });
831
- } catch (error) {
832
- self.postMessage({
833
- type: "UPDATE_DATA_PATH_RESPONSE",
834
- messageId,
835
- error: error instanceof Error ? error.message : String(error)
836
- });
837
- }
838
- break;
839
- case "CLEAR_CACHE":
840
- try {
841
- await worker.clearCache();
842
- self.postMessage({ type: "CLEAR_CACHE_RESPONSE", messageId });
843
- } catch (error) {
844
- self.postMessage({
845
- type: "CLEAR_CACHE_RESPONSE",
846
- messageId,
847
- error: error instanceof Error ? error.message : String(error)
848
- });
849
- }
850
- break;
851
- default:
852
- self.postMessage({
853
- type: "ERROR",
854
- bufferId,
855
- error: `Unknown message type: ${type}`
856
- });
857
- }
858
- } catch (error) {
859
- self.postMessage({
860
- type: "ERROR",
861
- bufferId,
862
- error: error instanceof Error ? error.stack || error.message : String(error)
863
- });
864
- }
865
- };
866
- }
867
-
868
- //# debugId=03CCCB805103888F64756E2164756E21
869
- //# sourceMappingURL=parser.worker.js.map