@fairyhunter13/opentui-core 0.1.113 → 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.
- package/dev/keypress-debug-renderer.ts +148 -0
- package/dev/keypress-debug.ts +43 -0
- package/dev/print-env-vars.ts +32 -0
- package/dev/test-tmux-graphics-334.sh +68 -0
- package/dev/thai-debug-test.ts +68 -0
- package/docs/development.md +144 -0
- package/package.json +62 -53
- package/scripts/build.ts +400 -0
- package/scripts/publish.ts +60 -0
- package/src/3d/SpriteResourceManager.ts +286 -0
- package/src/3d/SpriteUtils.ts +70 -0
- package/src/3d/TextureUtils.ts +196 -0
- package/src/3d/ThreeRenderable.ts +197 -0
- package/src/3d/WGPURenderer.ts +294 -0
- package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
- package/src/3d/animation/SpriteAnimator.ts +633 -0
- package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
- package/src/3d/canvas.ts +464 -0
- package/src/3d/index.ts +12 -0
- package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
- package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
- package/src/3d/physics/physics-interface.ts +31 -0
- package/src/3d/shaders/supersampling.wgsl +201 -0
- package/src/3d.ts +3 -0
- package/src/NativeSpanFeed.ts +300 -0
- package/src/Renderable.ts +1704 -0
- package/src/__snapshots__/buffer.test.ts.snap +28 -0
- package/src/animation/Timeline.test.ts +2709 -0
- package/src/animation/Timeline.ts +598 -0
- package/src/ansi.ts +18 -0
- package/src/benchmark/attenuation-benchmark.ts +81 -0
- package/src/benchmark/colormatrix-benchmark.ts +128 -0
- package/src/benchmark/gain-benchmark.ts +80 -0
- package/src/benchmark/latest-all-bench-run.json +707 -0
- package/src/benchmark/latest-async-bench-run.json +336 -0
- package/src/benchmark/latest-default-bench-run.json +657 -0
- package/src/benchmark/latest-large-bench-run.json +707 -0
- package/src/benchmark/latest-quick-bench-run.json +207 -0
- package/src/benchmark/markdown-benchmark.ts +1796 -0
- package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
- package/src/benchmark/native-span-feed-benchmark.md +56 -0
- package/src/benchmark/native-span-feed-benchmark.ts +596 -0
- package/src/benchmark/native-span-feed-compare.ts +280 -0
- package/src/benchmark/renderer-benchmark.ts +754 -0
- package/src/benchmark/text-table-benchmark.ts +948 -0
- package/src/buffer.test.ts +291 -0
- package/src/buffer.ts +554 -0
- package/src/console.test.ts +612 -0
- package/src/console.ts +1254 -0
- package/src/edit-buffer.test.ts +1769 -0
- package/src/edit-buffer.ts +411 -0
- package/src/editor-view.test.ts +1032 -0
- package/src/editor-view.ts +284 -0
- package/src/examples/ascii-font-selection-demo.ts +245 -0
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +1018 -0
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +115 -0
- package/src/examples/code-demo.ts +924 -0
- package/src/examples/console-demo.ts +358 -0
- package/src/examples/core-plugin-slots-demo.ts +759 -0
- package/src/examples/diff-demo.ts +701 -0
- package/src/examples/draggable-three-demo.ts +259 -0
- package/src/examples/editor-demo.ts +322 -0
- package/src/examples/extmarks-demo.ts +196 -0
- package/src/examples/focus-restore-demo.ts +310 -0
- package/src/examples/fonts.ts +245 -0
- package/src/examples/fractal-shader-demo.ts +268 -0
- package/src/examples/framebuffer-demo.ts +674 -0
- package/src/examples/full-unicode-demo.ts +241 -0
- package/src/examples/golden-star-demo.ts +933 -0
- package/src/examples/grayscale-buffer-demo.ts +249 -0
- package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
- package/src/examples/index.ts +926 -0
- package/src/examples/input-demo.ts +377 -0
- package/src/examples/input-select-layout-demo.ts +425 -0
- package/src/examples/install.sh +143 -0
- package/src/examples/keypress-debug-demo.ts +452 -0
- package/src/examples/lib/HexList.ts +122 -0
- package/src/examples/lib/PaletteGrid.ts +125 -0
- package/src/examples/lib/standalone-keys.ts +25 -0
- package/src/examples/lib/tab-controller.ts +243 -0
- package/src/examples/lights-phong-demo.ts +290 -0
- package/src/examples/link-demo.ts +220 -0
- package/src/examples/live-state-demo.ts +480 -0
- package/src/examples/markdown-demo.ts +725 -0
- package/src/examples/mouse-interaction-demo.ts +428 -0
- package/src/examples/nested-zindex-demo.ts +357 -0
- package/src/examples/opacity-example.ts +235 -0
- package/src/examples/opentui-demo.ts +1057 -0
- package/src/examples/physx-planck-2d-demo.ts +623 -0
- package/src/examples/physx-rapier-2d-demo.ts +655 -0
- package/src/examples/relative-positioning-demo.ts +323 -0
- package/src/examples/scroll-example.ts +214 -0
- package/src/examples/scrollbox-mouse-test.ts +112 -0
- package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
- package/src/examples/select-demo.ts +237 -0
- package/src/examples/shader-cube-demo.ts +1015 -0
- package/src/examples/simple-layout-example.ts +591 -0
- package/src/examples/slider-demo.ts +617 -0
- package/src/examples/split-mode-demo.ts +453 -0
- package/src/examples/sprite-animation-demo.ts +443 -0
- package/src/examples/sprite-particle-generator-demo.ts +486 -0
- package/src/examples/static-sprite-demo.ts +193 -0
- package/src/examples/sticky-scroll-example.ts +308 -0
- package/src/examples/styled-text-demo.ts +282 -0
- package/src/examples/tab-select-demo.ts +219 -0
- package/src/examples/terminal-title.ts +29 -0
- package/src/examples/terminal.ts +305 -0
- package/src/examples/text-node-demo.ts +416 -0
- package/src/examples/text-selection-demo.ts +377 -0
- package/src/examples/text-table-demo.ts +503 -0
- package/src/examples/text-truncation-demo.ts +481 -0
- package/src/examples/text-wrap.ts +757 -0
- package/src/examples/texture-loading-demo.ts +259 -0
- package/src/examples/timeline-example.ts +670 -0
- package/src/examples/transparency-demo.ts +400 -0
- package/src/examples/vnode-composition-demo.ts +404 -0
- package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
- package/src/index.ts +24 -0
- package/src/lib/KeyHandler.integration.test.ts +292 -0
- package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
- package/src/lib/KeyHandler.test.ts +662 -0
- package/src/lib/KeyHandler.ts +222 -0
- package/src/lib/RGBA.test.ts +984 -0
- package/src/lib/RGBA.ts +204 -0
- package/src/lib/ascii.font.ts +330 -0
- package/src/lib/border.test.ts +83 -0
- package/src/lib/border.ts +170 -0
- package/src/lib/bunfs.test.ts +27 -0
- package/src/lib/bunfs.ts +18 -0
- package/src/lib/clipboard.test.ts +41 -0
- package/src/lib/clipboard.ts +47 -0
- package/src/lib/clock.ts +35 -0
- package/src/lib/data-paths.test.ts +133 -0
- package/src/lib/data-paths.ts +109 -0
- package/src/lib/debounce.ts +106 -0
- package/src/lib/detect-links.test.ts +98 -0
- package/src/lib/detect-links.ts +56 -0
- package/src/lib/env.test.ts +228 -0
- package/src/lib/env.ts +209 -0
- package/src/lib/extmarks-history.ts +51 -0
- package/src/lib/extmarks-multiwidth.test.ts +322 -0
- package/src/lib/extmarks.test.ts +3457 -0
- package/src/lib/extmarks.ts +843 -0
- package/src/lib/fonts/block.json +405 -0
- package/src/lib/fonts/grid.json +265 -0
- package/src/lib/fonts/huge.json +741 -0
- package/src/lib/fonts/pallet.json +314 -0
- package/src/lib/fonts/shade.json +591 -0
- package/src/lib/fonts/slick.json +321 -0
- package/src/lib/fonts/tiny.json +69 -0
- package/src/lib/hast-styled-text.ts +59 -0
- package/src/lib/index.ts +21 -0
- package/src/lib/keymapping.test.ts +317 -0
- package/src/lib/keymapping.ts +115 -0
- package/src/lib/objects-in-viewport.test.ts +787 -0
- package/src/lib/objects-in-viewport.ts +153 -0
- package/src/lib/output.capture.ts +58 -0
- package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
- package/src/lib/parse.keypress-kitty.test.ts +663 -0
- package/src/lib/parse.keypress-kitty.ts +439 -0
- package/src/lib/parse.keypress.test.ts +1849 -0
- package/src/lib/parse.keypress.ts +397 -0
- package/src/lib/parse.mouse.test.ts +552 -0
- package/src/lib/parse.mouse.ts +232 -0
- package/src/lib/paste.ts +16 -0
- package/src/lib/queue.ts +65 -0
- package/src/lib/renderable.validations.test.ts +87 -0
- package/src/lib/renderable.validations.ts +83 -0
- package/src/lib/scroll-acceleration.ts +98 -0
- package/src/lib/selection.ts +240 -0
- package/src/lib/singleton.ts +28 -0
- package/src/lib/stdin-parser.test.ts +2290 -0
- package/src/lib/stdin-parser.ts +1810 -0
- package/src/lib/styled-text.ts +178 -0
- package/src/lib/terminal-capability-detection.test.ts +202 -0
- package/src/lib/terminal-capability-detection.ts +79 -0
- package/src/lib/terminal-palette.test.ts +878 -0
- package/src/lib/terminal-palette.ts +383 -0
- package/src/lib/tree-sitter/assets/README.md +118 -0
- package/src/lib/tree-sitter/assets/update.ts +334 -0
- package/src/lib/tree-sitter/assets.d.ts +9 -0
- package/src/lib/tree-sitter/cache.test.ts +273 -0
- package/src/lib/tree-sitter/client.test.ts +1165 -0
- package/src/lib/tree-sitter/client.ts +607 -0
- package/src/lib/tree-sitter/default-parsers.ts +86 -0
- package/src/lib/tree-sitter/download-utils.ts +148 -0
- package/src/lib/tree-sitter/index.ts +28 -0
- package/src/lib/tree-sitter/parser.worker.ts +1042 -0
- package/src/lib/tree-sitter/parsers-config.ts +81 -0
- package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
- package/src/lib/tree-sitter/resolve-ft.ts +189 -0
- package/src/lib/tree-sitter/types.ts +82 -0
- package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
- package/src/lib/tree-sitter-styled-text.ts +306 -0
- package/src/lib/validate-dir-name.ts +55 -0
- package/src/lib/yoga.options.test.ts +628 -0
- package/src/lib/yoga.options.ts +346 -0
- package/src/plugins/core-slot.ts +579 -0
- package/src/plugins/registry.ts +402 -0
- package/src/plugins/types.ts +46 -0
- package/src/post/effects.ts +930 -0
- package/src/post/filters.ts +489 -0
- package/src/post/matrices.ts +288 -0
- package/src/renderables/ASCIIFont.ts +219 -0
- package/src/renderables/Box.test.ts +205 -0
- package/src/renderables/Box.ts +326 -0
- package/src/renderables/Code.test.ts +2062 -0
- package/src/renderables/Code.ts +357 -0
- package/src/renderables/Diff.regression.test.ts +226 -0
- package/src/renderables/Diff.test.ts +3101 -0
- package/src/renderables/Diff.ts +1211 -0
- package/src/renderables/EditBufferRenderable.test.ts +288 -0
- package/src/renderables/EditBufferRenderable.ts +1166 -0
- package/src/renderables/FrameBuffer.ts +47 -0
- package/src/renderables/Input.test.ts +1228 -0
- package/src/renderables/Input.ts +247 -0
- package/src/renderables/LineNumberRenderable.ts +724 -0
- package/src/renderables/Markdown.ts +1393 -0
- package/src/renderables/ScrollBar.ts +422 -0
- package/src/renderables/ScrollBox.ts +883 -0
- package/src/renderables/Select.test.ts +1033 -0
- package/src/renderables/Select.ts +524 -0
- package/src/renderables/Slider.test.ts +456 -0
- package/src/renderables/Slider.ts +342 -0
- package/src/renderables/TabSelect.test.ts +197 -0
- package/src/renderables/TabSelect.ts +455 -0
- package/src/renderables/Text.selection-buffer.test.ts +123 -0
- package/src/renderables/Text.test.ts +2660 -0
- package/src/renderables/Text.ts +147 -0
- package/src/renderables/TextBufferRenderable.ts +518 -0
- package/src/renderables/TextNode.test.ts +1058 -0
- package/src/renderables/TextNode.ts +325 -0
- package/src/renderables/TextTable.test.ts +1421 -0
- package/src/renderables/TextTable.ts +1344 -0
- package/src/renderables/Textarea.ts +430 -0
- package/src/renderables/TimeToFirstDraw.ts +89 -0
- package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
- package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
- package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
- package/src/renderables/__tests__/Markdown.test.ts +2518 -0
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
- package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
- package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
- package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
- package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
- package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
- package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
- package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
- package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
- package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
- package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
- package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
- package/src/renderables/composition/README.md +8 -0
- package/src/renderables/composition/VRenderable.ts +32 -0
- package/src/renderables/composition/constructs.ts +127 -0
- package/src/renderables/composition/vnode.ts +289 -0
- package/src/renderables/index.ts +23 -0
- package/src/renderables/markdown-parser.ts +66 -0
- package/src/renderer.ts +2681 -0
- package/src/runtime-plugin-support.ts +39 -0
- package/src/runtime-plugin.ts +615 -0
- package/src/syntax-style.test.ts +841 -0
- package/src/syntax-style.ts +257 -0
- package/src/testing/README.md +210 -0
- package/src/testing/capture-spans.test.ts +194 -0
- package/src/testing/integration.test.ts +276 -0
- package/src/testing/manual-clock.ts +117 -0
- package/src/testing/mock-keys.test.ts +1378 -0
- package/src/testing/mock-keys.ts +457 -0
- package/src/testing/mock-mouse.test.ts +218 -0
- package/src/testing/mock-mouse.ts +247 -0
- package/src/testing/mock-tree-sitter-client.ts +73 -0
- package/src/testing/spy.ts +13 -0
- package/src/testing/test-recorder.test.ts +415 -0
- package/src/testing/test-recorder.ts +145 -0
- package/src/testing/test-renderer.ts +132 -0
- package/src/testing.ts +7 -0
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
- package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
- package/src/tests/allocator-stats.test.ts +38 -0
- package/src/tests/destroy-during-render.test.ts +200 -0
- package/src/tests/destroy-on-exit.fixture.ts +36 -0
- package/src/tests/destroy-on-exit.test.ts +41 -0
- package/src/tests/hover-cursor.test.ts +98 -0
- package/src/tests/native-span-feed-async.test.ts +173 -0
- package/src/tests/native-span-feed-close.test.ts +120 -0
- package/src/tests/native-span-feed-coverage.test.ts +227 -0
- package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
- package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
- package/src/tests/opacity.test.ts +123 -0
- package/src/tests/renderable.snapshot.test.ts +524 -0
- package/src/tests/renderable.test.ts +1281 -0
- package/src/tests/renderer.clock.test.ts +158 -0
- package/src/tests/renderer.console-startup.test.ts +185 -0
- package/src/tests/renderer.control.test.ts +425 -0
- package/src/tests/renderer.core-slot-binding.test.ts +952 -0
- package/src/tests/renderer.cursor.test.ts +26 -0
- package/src/tests/renderer.destroy-during-render.test.ts +147 -0
- package/src/tests/renderer.focus-restore.test.ts +257 -0
- package/src/tests/renderer.focus.test.ts +294 -0
- package/src/tests/renderer.idle.test.ts +219 -0
- package/src/tests/renderer.input.test.ts +2237 -0
- package/src/tests/renderer.kitty-flags.test.ts +195 -0
- package/src/tests/renderer.mouse.test.ts +1274 -0
- package/src/tests/renderer.palette.test.ts +629 -0
- package/src/tests/renderer.selection.test.ts +49 -0
- package/src/tests/renderer.slot-registry.test.ts +684 -0
- package/src/tests/renderer.useMouse.test.ts +47 -0
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
- package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
- package/src/tests/runtime-plugin-support.fixture.ts +11 -0
- package/src/tests/runtime-plugin-support.test.ts +19 -0
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
- package/src/tests/runtime-plugin.fixture.ts +40 -0
- package/src/tests/runtime-plugin.test.ts +354 -0
- package/src/tests/scrollbox-culling-bug.test.ts +114 -0
- package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
- package/src/tests/scrollbox-hitgrid.test.ts +909 -0
- package/src/tests/scrollbox.test.ts +1530 -0
- package/src/tests/wrap-resize-perf.test.ts +276 -0
- package/src/tests/yoga-setters.test.ts +921 -0
- package/src/text-buffer-view.test.ts +705 -0
- package/src/text-buffer-view.ts +189 -0
- package/src/text-buffer.test.ts +347 -0
- package/src/text-buffer.ts +250 -0
- package/src/types.ts +161 -0
- package/src/utils.ts +88 -0
- package/src/zig/ansi.zig +268 -0
- package/src/zig/bench/README.md +50 -0
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
- package/src/zig/bench/edit-buffer_bench.zig +476 -0
- package/src/zig/bench/native-span-feed_bench.zig +100 -0
- package/src/zig/bench/rope-markers_bench.zig +713 -0
- package/src/zig/bench/rope_bench.zig +514 -0
- package/src/zig/bench/styled-text_bench.zig +470 -0
- package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
- package/src/zig/bench/text-buffer-view_bench.zig +459 -0
- package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
- package/src/zig/bench/utf8_bench.zig +799 -0
- package/src/zig/bench-utils.zig +431 -0
- package/src/zig/bench.zig +217 -0
- package/src/zig/buffer-methods.zig +211 -0
- package/src/zig/buffer.zig +2281 -0
- package/src/zig/build.zig +289 -0
- package/src/zig/build.zig.zon +16 -0
- package/src/zig/edit-buffer.zig +825 -0
- package/src/zig/editor-view.zig +802 -0
- package/src/zig/event-bus.zig +13 -0
- package/src/zig/event-emitter.zig +65 -0
- package/src/zig/file-logger.zig +92 -0
- package/src/zig/grapheme.zig +599 -0
- package/src/zig/lib.zig +1854 -0
- package/src/zig/link.zig +333 -0
- package/src/zig/logger.zig +43 -0
- package/src/zig/mem-registry.zig +125 -0
- package/src/zig/native-span-feed-bench-lib.zig +7 -0
- package/src/zig/native-span-feed.zig +708 -0
- package/src/zig/renderer.zig +1393 -0
- package/src/zig/rope.zig +1220 -0
- package/src/zig/syntax-style.zig +161 -0
- package/src/zig/terminal.zig +987 -0
- package/src/zig/test.zig +72 -0
- package/src/zig/tests/README.md +18 -0
- package/src/zig/tests/buffer-methods_test.zig +1109 -0
- package/src/zig/tests/buffer_test.zig +2557 -0
- package/src/zig/tests/edit-buffer-history_test.zig +271 -0
- package/src/zig/tests/edit-buffer_test.zig +1689 -0
- package/src/zig/tests/editor-view_test.zig +3299 -0
- package/src/zig/tests/event-emitter_test.zig +249 -0
- package/src/zig/tests/grapheme_test.zig +1304 -0
- package/src/zig/tests/link_test.zig +190 -0
- package/src/zig/tests/mem-registry_test.zig +473 -0
- package/src/zig/tests/memory_leak_regression_test.zig +159 -0
- package/src/zig/tests/native-span-feed_test.zig +1264 -0
- package/src/zig/tests/renderer_test.zig +1017 -0
- package/src/zig/tests/rope-nested_test.zig +712 -0
- package/src/zig/tests/rope_fuzz_test.zig +238 -0
- package/src/zig/tests/rope_test.zig +2362 -0
- package/src/zig/tests/segment-merge.test.zig +148 -0
- package/src/zig/tests/syntax-style_test.zig +557 -0
- package/src/zig/tests/terminal_test.zig +754 -0
- package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
- package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
- package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
- package/src/zig/tests/text-buffer-segment_test.zig +320 -0
- package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
- package/src/zig/tests/text-buffer-view_test.zig +3649 -0
- package/src/zig/tests/text-buffer_test.zig +2191 -0
- package/src/zig/tests/unicode-width-map.zon +3909 -0
- package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
- package/src/zig/tests/utf8_test.zig +4057 -0
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
- package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
- package/src/zig/tests/word-wrap-editing_test.zig +498 -0
- package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
- package/src/zig/text-buffer-iterators.zig +499 -0
- package/src/zig/text-buffer-segment.zig +404 -0
- package/src/zig/text-buffer-view.zig +1371 -0
- package/src/zig/text-buffer.zig +1180 -0
- package/src/zig/utf8.zig +1948 -0
- package/src/zig/utils.zig +9 -0
- package/src/zig-structs.ts +261 -0
- package/src/zig.ts +3884 -0
- package/tsconfig.build.json +24 -0
- package/tsconfig.json +27 -0
- package/3d/SpriteResourceManager.d.ts +0 -74
- package/3d/SpriteUtils.d.ts +0 -13
- package/3d/TextureUtils.d.ts +0 -24
- package/3d/ThreeRenderable.d.ts +0 -40
- package/3d/WGPURenderer.d.ts +0 -61
- package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
- package/3d/animation/SpriteAnimator.d.ts +0 -124
- package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
- package/3d/canvas.d.ts +0 -44
- package/3d/index.d.ts +0 -12
- package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
- package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
- package/3d/physics/physics-interface.d.ts +0 -27
- package/3d.d.ts +0 -2
- package/3d.js +0 -34041
- package/3d.js.map +0 -155
- package/LICENSE +0 -21
- package/NativeSpanFeed.d.ts +0 -41
- package/Renderable.d.ts +0 -334
- package/animation/Timeline.d.ts +0 -126
- package/ansi.d.ts +0 -13
- package/buffer.d.ts +0 -111
- package/console.d.ts +0 -144
- package/edit-buffer.d.ts +0 -98
- package/editor-view.d.ts +0 -73
- package/index-9vwc3fg6.js +0 -12260
- package/index-9vwc3fg6.js.map +0 -42
- package/index-dcj62y8t.js +0 -20614
- package/index-dcj62y8t.js.map +0 -67
- package/index-f7n39gpy.js +0 -411
- package/index-f7n39gpy.js.map +0 -10
- package/index.d.ts +0 -23
- package/index.js +0 -478
- package/index.js.map +0 -9
- package/lib/KeyHandler.d.ts +0 -61
- package/lib/RGBA.d.ts +0 -25
- package/lib/ascii.font.d.ts +0 -508
- package/lib/border.d.ts +0 -51
- package/lib/bunfs.d.ts +0 -7
- package/lib/clipboard.d.ts +0 -17
- package/lib/clock.d.ts +0 -15
- package/lib/data-paths.d.ts +0 -26
- package/lib/debounce.d.ts +0 -42
- package/lib/detect-links.d.ts +0 -6
- package/lib/env.d.ts +0 -42
- package/lib/extmarks-history.d.ts +0 -17
- package/lib/extmarks.d.ts +0 -89
- package/lib/hast-styled-text.d.ts +0 -17
- package/lib/index.d.ts +0 -21
- package/lib/keymapping.d.ts +0 -25
- package/lib/objects-in-viewport.d.ts +0 -24
- package/lib/output.capture.d.ts +0 -24
- package/lib/parse.keypress-kitty.d.ts +0 -2
- package/lib/parse.keypress.d.ts +0 -26
- package/lib/parse.mouse.d.ts +0 -30
- package/lib/paste.d.ts +0 -7
- package/lib/queue.d.ts +0 -15
- package/lib/renderable.validations.d.ts +0 -12
- package/lib/scroll-acceleration.d.ts +0 -43
- package/lib/selection.d.ts +0 -63
- package/lib/singleton.d.ts +0 -7
- package/lib/stdin-parser.d.ts +0 -87
- package/lib/styled-text.d.ts +0 -63
- package/lib/terminal-capability-detection.d.ts +0 -30
- package/lib/terminal-palette.d.ts +0 -50
- package/lib/tree-sitter/assets/update.d.ts +0 -11
- package/lib/tree-sitter/client.d.ts +0 -47
- package/lib/tree-sitter/default-parsers.d.ts +0 -2
- package/lib/tree-sitter/download-utils.d.ts +0 -21
- package/lib/tree-sitter/index.d.ts +0 -8
- package/lib/tree-sitter/parser.worker.d.ts +0 -1
- package/lib/tree-sitter/parsers-config.d.ts +0 -53
- package/lib/tree-sitter/resolve-ft.d.ts +0 -5
- package/lib/tree-sitter/types.d.ts +0 -82
- package/lib/tree-sitter-styled-text.d.ts +0 -14
- package/lib/validate-dir-name.d.ts +0 -1
- package/lib/yoga.options.d.ts +0 -32
- package/parser.worker.js +0 -899
- package/parser.worker.js.map +0 -12
- package/plugins/core-slot.d.ts +0 -72
- package/plugins/registry.d.ts +0 -42
- package/plugins/types.d.ts +0 -34
- package/post/effects.d.ts +0 -147
- package/post/filters.d.ts +0 -65
- package/post/matrices.d.ts +0 -20
- package/renderables/ASCIIFont.d.ts +0 -52
- package/renderables/Box.d.ts +0 -81
- package/renderables/Code.d.ts +0 -78
- package/renderables/Diff.d.ts +0 -142
- package/renderables/EditBufferRenderable.d.ts +0 -237
- package/renderables/FrameBuffer.d.ts +0 -16
- package/renderables/Input.d.ts +0 -67
- package/renderables/LineNumberRenderable.d.ts +0 -78
- package/renderables/Markdown.d.ts +0 -185
- package/renderables/ScrollBar.d.ts +0 -77
- package/renderables/ScrollBox.d.ts +0 -124
- package/renderables/Select.d.ts +0 -115
- package/renderables/Slider.d.ts +0 -47
- package/renderables/TabSelect.d.ts +0 -96
- package/renderables/Text.d.ts +0 -36
- package/renderables/TextBufferRenderable.d.ts +0 -105
- package/renderables/TextNode.d.ts +0 -91
- package/renderables/TextTable.d.ts +0 -140
- package/renderables/Textarea.d.ts +0 -63
- package/renderables/TimeToFirstDraw.d.ts +0 -24
- package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
- package/renderables/composition/VRenderable.d.ts +0 -16
- package/renderables/composition/constructs.d.ts +0 -35
- package/renderables/composition/vnode.d.ts +0 -46
- package/renderables/index.d.ts +0 -23
- package/renderables/markdown-parser.d.ts +0 -10
- package/renderer.d.ts +0 -419
- package/runtime-plugin-support.d.ts +0 -3
- package/runtime-plugin-support.js +0 -29
- package/runtime-plugin-support.js.map +0 -10
- package/runtime-plugin.d.ts +0 -16
- package/runtime-plugin.js +0 -16
- package/runtime-plugin.js.map +0 -9
- package/syntax-style.d.ts +0 -54
- package/testing/manual-clock.d.ts +0 -17
- package/testing/mock-keys.d.ts +0 -81
- package/testing/mock-mouse.d.ts +0 -38
- package/testing/mock-tree-sitter-client.d.ts +0 -23
- package/testing/spy.d.ts +0 -7
- package/testing/test-recorder.d.ts +0 -61
- package/testing/test-renderer.d.ts +0 -23
- package/testing.d.ts +0 -6
- package/testing.js +0 -697
- package/testing.js.map +0 -15
- package/text-buffer-view.d.ts +0 -42
- package/text-buffer.d.ts +0 -67
- package/types.d.ts +0 -139
- package/utils.d.ts +0 -14
- package/zig-structs.d.ts +0 -155
- package/zig.d.ts +0 -353
- /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { plugin as registerBunPlugin } from "bun"
|
|
2
|
+
import {
|
|
3
|
+
createRuntimePlugin,
|
|
4
|
+
runtimeModuleIdForSpecifier,
|
|
5
|
+
type CreateRuntimePluginOptions,
|
|
6
|
+
type RuntimeModuleEntry,
|
|
7
|
+
type RuntimeModuleExports,
|
|
8
|
+
type RuntimeModuleLoader,
|
|
9
|
+
} from "./runtime-plugin.js"
|
|
10
|
+
|
|
11
|
+
const runtimePluginSupportInstalledKey = "__opentuiCoreRuntimePluginSupportInstalled__"
|
|
12
|
+
|
|
13
|
+
type RuntimePluginSupportState = typeof globalThis & {
|
|
14
|
+
[runtimePluginSupportInstalledKey]?: boolean
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function ensureRuntimePluginSupport(options: CreateRuntimePluginOptions = {}): boolean {
|
|
18
|
+
const state = globalThis as RuntimePluginSupportState
|
|
19
|
+
|
|
20
|
+
if (state[runtimePluginSupportInstalledKey]) {
|
|
21
|
+
return false
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
registerBunPlugin(createRuntimePlugin(options))
|
|
25
|
+
|
|
26
|
+
state[runtimePluginSupportInstalledKey] = true
|
|
27
|
+
return true
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureRuntimePluginSupport()
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
createRuntimePlugin,
|
|
34
|
+
runtimeModuleIdForSpecifier,
|
|
35
|
+
type CreateRuntimePluginOptions,
|
|
36
|
+
type RuntimeModuleEntry,
|
|
37
|
+
type RuntimeModuleExports,
|
|
38
|
+
type RuntimeModuleLoader,
|
|
39
|
+
}
|
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Exposes runtime-only modules (for example `@opentui/core`, `@opentui/solid`,
|
|
3
|
+
* `solid-js`) to externally loaded plugins by rewriting matching imports to
|
|
4
|
+
* virtual `opentui:runtime-module:*` ids.
|
|
5
|
+
*
|
|
6
|
+
* Why this is exact-path + prescan instead of one broad `onLoad`:
|
|
7
|
+
* - Bun can break CJS/UMD interop if a file is routed through plugin `onLoad`
|
|
8
|
+
* (real repro: `jsonc-parser` resolving to `lib/umd/main.js`;
|
|
9
|
+
* https://github.com/oven-sh/bun/issues/19279,
|
|
10
|
+
* https://github.com/oven-sh/bun/issues/21369), so arbitrary `node_modules`
|
|
11
|
+
* JS cannot be blanket-rewritten.
|
|
12
|
+
* - runtime `onResolve` is sync-only, so package/type/source discovery here is
|
|
13
|
+
* synchronous and cached.
|
|
14
|
+
* - a matched `onLoad` cannot safely fall through, so loaders must be narrow.
|
|
15
|
+
* - Bun may canonicalize paths before `onLoad`, so loaders are registered for
|
|
16
|
+
* both the resolved path spelling and its realpath, then canonical-checked.
|
|
17
|
+
* - Bun may native-load `node_modules` ESM without firing `onResolve` for
|
|
18
|
+
* nested package imports, so `node_modules` ESM is recursively prescanned and
|
|
19
|
+
* only files that actually need runtime rewriting get exact-path loaders.
|
|
20
|
+
*
|
|
21
|
+
* Behavior:
|
|
22
|
+
* - non-`node_modules` source files get a dedicated rewrite loader immediately.
|
|
23
|
+
* - `node_modules` files are rewritten only if they are ESM (`.mjs`, `.mts`,
|
|
24
|
+
* `.ts`, `.tsx`, `.jsx`, or `.js` under `package.json#type="module"`) and
|
|
25
|
+
* directly or transitively need runtime-module rewriting; unrelated CJS stays
|
|
26
|
+
* untouched.
|
|
27
|
+
* - optional bare-specifier rewriting is preserved for sibling files in
|
|
28
|
+
* packages already marked for runtime rewriting.
|
|
29
|
+
*
|
|
30
|
+
* Notes:
|
|
31
|
+
* - import scanning is regex-based, not a full parser.
|
|
32
|
+
* - CJS helper libraries that themselves import runtime modules are still not
|
|
33
|
+
* supported.
|
|
34
|
+
* - `package.json#type` caching is per plugin setup, not module-global, so a
|
|
35
|
+
* later plugin instance in the same process can observe filesystem changes.
|
|
36
|
+
*/
|
|
37
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs"
|
|
38
|
+
import { basename, dirname, isAbsolute, join } from "node:path"
|
|
39
|
+
import { fileURLToPath } from "node:url"
|
|
40
|
+
import { type BunPlugin } from "bun"
|
|
41
|
+
import * as coreRuntime from "./index.js"
|
|
42
|
+
|
|
43
|
+
export type RuntimeModuleExports = Record<string, unknown>
|
|
44
|
+
export type RuntimeModuleLoader = () => RuntimeModuleExports | Promise<RuntimeModuleExports>
|
|
45
|
+
export type RuntimeModuleEntry = RuntimeModuleExports | RuntimeModuleLoader
|
|
46
|
+
|
|
47
|
+
interface SourceAnalysis {
|
|
48
|
+
importSpecifiers: string[]
|
|
49
|
+
needsRuntimeSpecifierRewrite: boolean
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface RuntimePluginRewriteOptions {
|
|
53
|
+
nodeModulesRuntimeSpecifiers?: boolean
|
|
54
|
+
nodeModulesBareSpecifiers?: boolean
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface CreateRuntimePluginOptions {
|
|
58
|
+
core?: RuntimeModuleEntry
|
|
59
|
+
additional?: Record<string, RuntimeModuleEntry>
|
|
60
|
+
rewrite?: RuntimePluginRewriteOptions
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const CORE_RUNTIME_SPECIFIER = "@fairyhunter13/opentui-core"
|
|
64
|
+
const CORE_TESTING_RUNTIME_SPECIFIER = "@fairyhunter13/opentui-core/testing"
|
|
65
|
+
const RUNTIME_MODULE_PREFIX = "opentui:runtime-module:"
|
|
66
|
+
const MAX_RUNTIME_RESOLVE_PARENTS = 64
|
|
67
|
+
const DEFAULT_RUNTIME_PLUGIN_REWRITE_OPTIONS: Required<RuntimePluginRewriteOptions> = {
|
|
68
|
+
nodeModulesRuntimeSpecifiers: true,
|
|
69
|
+
nodeModulesBareSpecifiers: false,
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const DEFAULT_CORE_RUNTIME_MODULE_SPECIFIERS = [CORE_RUNTIME_SPECIFIER, CORE_TESTING_RUNTIME_SPECIFIER] as const
|
|
73
|
+
|
|
74
|
+
const DEFAULT_CORE_RUNTIME_MODULE_SPECIFIER_SET = new Set<string>(DEFAULT_CORE_RUNTIME_MODULE_SPECIFIERS)
|
|
75
|
+
|
|
76
|
+
export const isCoreRuntimeModuleSpecifier = (specifier: string): boolean => {
|
|
77
|
+
return DEFAULT_CORE_RUNTIME_MODULE_SPECIFIER_SET.has(specifier)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const loadCoreTestingRuntimeModule = async (): Promise<RuntimeModuleExports> => {
|
|
81
|
+
return (await import("./testing.js")) as RuntimeModuleExports
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const escapeRegExp = (value: string): string => {
|
|
85
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const exactSpecifierFilter = (specifier: string): RegExp => {
|
|
89
|
+
return new RegExp(`^${escapeRegExp(specifier)}$`)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const exactPathFilter = (paths: string[]): RegExp => {
|
|
93
|
+
const candidates = [...new Set(paths.map(sourcePath))]
|
|
94
|
+
return new RegExp(`^(?:${candidates.map(escapeRegExp).join("|")})(?:[?#].*)?$`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const runtimeModuleIdForSpecifier = (specifier: string): string => {
|
|
98
|
+
return `${RUNTIME_MODULE_PREFIX}${encodeURIComponent(specifier)}`
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const resolveRuntimeModuleExports = async (moduleEntry: RuntimeModuleEntry): Promise<RuntimeModuleExports> => {
|
|
102
|
+
if (typeof moduleEntry === "function") {
|
|
103
|
+
return await moduleEntry()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return moduleEntry
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const sourcePath = (path: string): string => {
|
|
110
|
+
const searchIndex = path.indexOf("?")
|
|
111
|
+
const hashIndex = path.indexOf("#")
|
|
112
|
+
const end = [searchIndex, hashIndex].filter((index) => index >= 0).sort((a, b) => a - b)[0]
|
|
113
|
+
return end === undefined ? path : path.slice(0, end)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const normalizedSourcePathByPath = new Map<string, string>()
|
|
117
|
+
|
|
118
|
+
const normalizeSourcePath = (path: string): string => {
|
|
119
|
+
const cleanPath = sourcePath(path)
|
|
120
|
+
const cachedPath = normalizedSourcePathByPath.get(cleanPath)
|
|
121
|
+
if (cachedPath !== undefined) {
|
|
122
|
+
return cachedPath
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
let normalizedPath = cleanPath
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
normalizedPath = realpathSync(cleanPath)
|
|
129
|
+
} catch {
|
|
130
|
+
normalizedPath = cleanPath
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
normalizedSourcePathByPath.set(cleanPath, normalizedPath)
|
|
134
|
+
return normalizedPath
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const isNodeModulesPath = (path: string): boolean => {
|
|
138
|
+
return /(?:^|[/\\])node_modules(?:[/\\])/.test(path)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const packageTypeForPath = (
|
|
142
|
+
path: string,
|
|
143
|
+
packageTypeByPackageJsonPath: Map<string, "module" | "commonjs">,
|
|
144
|
+
): "module" | "commonjs" => {
|
|
145
|
+
let currentDir = dirname(path)
|
|
146
|
+
|
|
147
|
+
while (true) {
|
|
148
|
+
const packageJsonPath = join(currentDir, "package.json")
|
|
149
|
+
if (existsSync(packageJsonPath)) {
|
|
150
|
+
const cachedPackageType = packageTypeByPackageJsonPath.get(packageJsonPath)
|
|
151
|
+
if (cachedPackageType) {
|
|
152
|
+
return cachedPackageType
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
let packageType: "module" | "commonjs" = "commonjs"
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8")) as { type?: string }
|
|
159
|
+
if (packageJson.type === "module") {
|
|
160
|
+
packageType = "module"
|
|
161
|
+
}
|
|
162
|
+
} catch {
|
|
163
|
+
packageType = "commonjs"
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
packageTypeByPackageJsonPath.set(packageJsonPath, packageType)
|
|
167
|
+
return packageType
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const parentDir = dirname(currentDir)
|
|
171
|
+
if (parentDir === currentDir) {
|
|
172
|
+
return "commonjs"
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
currentDir = parentDir
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const isNodeModulesEsmPath = (
|
|
180
|
+
path: string,
|
|
181
|
+
packageTypeByPackageJsonPath: Map<string, "module" | "commonjs">,
|
|
182
|
+
): boolean => {
|
|
183
|
+
const normalizedPath = normalizeSourcePath(path)
|
|
184
|
+
|
|
185
|
+
if (!isNodeModulesPath(normalizedPath)) {
|
|
186
|
+
return false
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (
|
|
190
|
+
normalizedPath.endsWith(".mjs") ||
|
|
191
|
+
normalizedPath.endsWith(".mts") ||
|
|
192
|
+
normalizedPath.endsWith(".ts") ||
|
|
193
|
+
normalizedPath.endsWith(".tsx") ||
|
|
194
|
+
normalizedPath.endsWith(".jsx")
|
|
195
|
+
) {
|
|
196
|
+
return true
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (normalizedPath.endsWith(".cjs") || normalizedPath.endsWith(".cts") || !normalizedPath.endsWith(".js")) {
|
|
200
|
+
return false
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return packageTypeForPath(normalizedPath, packageTypeByPackageJsonPath) === "module"
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const nodeModulesPackageRootForPath = (path: string): string | null => {
|
|
207
|
+
let currentDir = dirname(path)
|
|
208
|
+
|
|
209
|
+
while (true) {
|
|
210
|
+
const parentDir = dirname(currentDir)
|
|
211
|
+
if (parentDir === currentDir) {
|
|
212
|
+
return null
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (basename(parentDir) === "node_modules") {
|
|
216
|
+
return currentDir
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
if (basename(dirname(parentDir)) === "node_modules" && basename(parentDir).startsWith("@")) {
|
|
220
|
+
return currentDir
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
currentDir = parentDir
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const resolveRuntimePluginRewriteOptions = (
|
|
228
|
+
options: RuntimePluginRewriteOptions | undefined,
|
|
229
|
+
): Required<RuntimePluginRewriteOptions> => {
|
|
230
|
+
return {
|
|
231
|
+
nodeModulesRuntimeSpecifiers:
|
|
232
|
+
options?.nodeModulesRuntimeSpecifiers ?? DEFAULT_RUNTIME_PLUGIN_REWRITE_OPTIONS.nodeModulesRuntimeSpecifiers,
|
|
233
|
+
nodeModulesBareSpecifiers:
|
|
234
|
+
options?.nodeModulesBareSpecifiers ?? DEFAULT_RUNTIME_PLUGIN_REWRITE_OPTIONS.nodeModulesBareSpecifiers,
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const runtimeLoaderForPath = (path: string): "js" | "ts" | "jsx" | "tsx" | null => {
|
|
239
|
+
const cleanPath = sourcePath(path)
|
|
240
|
+
|
|
241
|
+
if (cleanPath.endsWith(".tsx")) {
|
|
242
|
+
return "tsx"
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (cleanPath.endsWith(".jsx")) {
|
|
246
|
+
return "jsx"
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (cleanPath.endsWith(".ts") || cleanPath.endsWith(".mts") || cleanPath.endsWith(".cts")) {
|
|
250
|
+
return "ts"
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if (cleanPath.endsWith(".js") || cleanPath.endsWith(".mjs") || cleanPath.endsWith(".cjs")) {
|
|
254
|
+
return "js"
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return null
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const resolveImportSpecifierPatterns = [
|
|
261
|
+
/(from\s+["'])([^"']+)(["'])/g,
|
|
262
|
+
/(import\s+["'])([^"']+)(["'])/g,
|
|
263
|
+
/(import\s*\(\s*["'])([^"']+)(["']\s*\))/g,
|
|
264
|
+
/(require\s*\(\s*["'])([^"']+)(["']\s*\))/g,
|
|
265
|
+
] as const
|
|
266
|
+
|
|
267
|
+
const isBareSpecifier = (specifier: string): boolean => {
|
|
268
|
+
if (specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith("\\")) {
|
|
269
|
+
return false
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (
|
|
273
|
+
specifier.startsWith("node:") ||
|
|
274
|
+
specifier.startsWith("bun:") ||
|
|
275
|
+
specifier.startsWith("http:") ||
|
|
276
|
+
specifier.startsWith("https:") ||
|
|
277
|
+
specifier.startsWith("file:") ||
|
|
278
|
+
specifier.startsWith("data:")
|
|
279
|
+
) {
|
|
280
|
+
return false
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (specifier.startsWith(RUNTIME_MODULE_PREFIX)) {
|
|
284
|
+
return false
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return true
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const registerResolveParent = (resolveParentsByRecency: string[], resolveParent: string): void => {
|
|
291
|
+
const existingIndex = resolveParentsByRecency.indexOf(resolveParent)
|
|
292
|
+
if (existingIndex >= 0) {
|
|
293
|
+
resolveParentsByRecency.splice(existingIndex, 1)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
resolveParentsByRecency.push(resolveParent)
|
|
297
|
+
|
|
298
|
+
if (resolveParentsByRecency.length > MAX_RUNTIME_RESOLVE_PARENTS) {
|
|
299
|
+
resolveParentsByRecency.shift()
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const rewriteImportSpecifiers = (code: string, resolveReplacement: (specifier: string) => string | null): string => {
|
|
304
|
+
let transformedCode = code
|
|
305
|
+
|
|
306
|
+
for (const pattern of resolveImportSpecifierPatterns) {
|
|
307
|
+
transformedCode = transformedCode.replace(pattern, (fullMatch, prefix, specifier, suffix) => {
|
|
308
|
+
const replacement = resolveReplacement(specifier)
|
|
309
|
+
if (!replacement || replacement === specifier) {
|
|
310
|
+
return fullMatch
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return `${prefix}${replacement}${suffix}`
|
|
314
|
+
})
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return transformedCode
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const collectImportSpecifiers = (code: string): string[] => {
|
|
321
|
+
const specifiers = new Set<string>()
|
|
322
|
+
|
|
323
|
+
for (const pattern of resolveImportSpecifierPatterns) {
|
|
324
|
+
code.replace(pattern, (_fullMatch, _prefix, specifier) => {
|
|
325
|
+
specifiers.add(specifier)
|
|
326
|
+
return _fullMatch
|
|
327
|
+
})
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return [...specifiers]
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const resolveFromParent = (specifier: string, parent: string): string | null => {
|
|
334
|
+
try {
|
|
335
|
+
const resolvedSpecifier = import.meta.resolve(specifier, parent)
|
|
336
|
+
if (
|
|
337
|
+
resolvedSpecifier === specifier ||
|
|
338
|
+
resolvedSpecifier.startsWith("node:") ||
|
|
339
|
+
resolvedSpecifier.startsWith("bun:")
|
|
340
|
+
) {
|
|
341
|
+
return null
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return resolvedSpecifier
|
|
345
|
+
} catch {
|
|
346
|
+
return null
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const resolveSourcePathFromSpecifier = (specifier: string, importer: string): string | null => {
|
|
351
|
+
if (
|
|
352
|
+
specifier.startsWith("node:") ||
|
|
353
|
+
specifier.startsWith("bun:") ||
|
|
354
|
+
specifier.startsWith("http:") ||
|
|
355
|
+
specifier.startsWith("https:") ||
|
|
356
|
+
specifier.startsWith("data:") ||
|
|
357
|
+
specifier.startsWith(RUNTIME_MODULE_PREFIX)
|
|
358
|
+
) {
|
|
359
|
+
return null
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (specifier.startsWith("file:")) {
|
|
363
|
+
return sourcePath(fileURLToPath(specifier))
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (isAbsolute(specifier)) {
|
|
367
|
+
return sourcePath(specifier)
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const resolvedSpecifier = resolveFromParent(specifier, importer)
|
|
371
|
+
if (!resolvedSpecifier) {
|
|
372
|
+
return null
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (resolvedSpecifier.startsWith("file:")) {
|
|
376
|
+
return sourcePath(fileURLToPath(resolvedSpecifier))
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (isAbsolute(resolvedSpecifier)) {
|
|
380
|
+
return sourcePath(resolvedSpecifier)
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return null
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const rewriteImportsFromResolveParents = (code: string, resolveParentsByRecency: string[]): string => {
|
|
387
|
+
if (resolveParentsByRecency.length === 0) {
|
|
388
|
+
return code
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const resolveFromParents = (specifier: string): string | null => {
|
|
392
|
+
if (!isBareSpecifier(specifier)) {
|
|
393
|
+
return null
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
for (let index = resolveParentsByRecency.length - 1; index >= 0; index -= 1) {
|
|
397
|
+
const resolveParent = resolveParentsByRecency[index]
|
|
398
|
+
const resolvedSpecifier = resolveFromParent(specifier, resolveParent)
|
|
399
|
+
if (resolvedSpecifier) {
|
|
400
|
+
return resolvedSpecifier
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return null
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return rewriteImportSpecifiers(code, resolveFromParents)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
const rewriteRuntimeSpecifiers = (code: string, runtimeModuleIdsBySpecifier: Map<string, string>): string => {
|
|
411
|
+
return rewriteImportSpecifiers(code, (specifier) => {
|
|
412
|
+
const runtimeModuleId = runtimeModuleIdsBySpecifier.get(specifier)
|
|
413
|
+
return runtimeModuleId ?? null
|
|
414
|
+
})
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export function createRuntimePlugin(input: CreateRuntimePluginOptions = {}): BunPlugin {
|
|
418
|
+
const runtimeModules = new Map<string, RuntimeModuleEntry>()
|
|
419
|
+
runtimeModules.set(CORE_RUNTIME_SPECIFIER, input.core ?? (coreRuntime as RuntimeModuleExports))
|
|
420
|
+
runtimeModules.set(CORE_TESTING_RUNTIME_SPECIFIER, loadCoreTestingRuntimeModule)
|
|
421
|
+
const rewriteOptions = resolveRuntimePluginRewriteOptions(input.rewrite)
|
|
422
|
+
|
|
423
|
+
for (const [specifier, moduleEntry] of Object.entries(input.additional ?? {})) {
|
|
424
|
+
runtimeModules.set(specifier, moduleEntry)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
const runtimeModuleIdsBySpecifier = new Map<string, string>()
|
|
428
|
+
for (const specifier of runtimeModules.keys()) {
|
|
429
|
+
runtimeModuleIdsBySpecifier.set(specifier, runtimeModuleIdForSpecifier(specifier))
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return {
|
|
433
|
+
name: "bun-plugin-opentui-runtime-modules",
|
|
434
|
+
setup: (build) => {
|
|
435
|
+
const resolveParentsByRecency: string[] = []
|
|
436
|
+
const installedRewriteLoaders = new Set<string>()
|
|
437
|
+
const nodeModulesBareRewritePackageRoots = new Set<string>()
|
|
438
|
+
const packageTypeByPackageJsonPath = new Map<string, "module" | "commonjs">()
|
|
439
|
+
const sourceAnalysisByPath = new Map<string, SourceAnalysis>()
|
|
440
|
+
const nodeModulesRuntimeRewritePathsByPath = new Map<string, string[]>()
|
|
441
|
+
|
|
442
|
+
const installRewriteLoader = (path: string): void => {
|
|
443
|
+
const resolvedTargetPath = sourcePath(path)
|
|
444
|
+
const canonicalTargetPath = normalizeSourcePath(resolvedTargetPath)
|
|
445
|
+
|
|
446
|
+
if (installedRewriteLoaders.has(canonicalTargetPath)) {
|
|
447
|
+
return
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
installedRewriteLoaders.add(canonicalTargetPath)
|
|
451
|
+
|
|
452
|
+
// Register both the resolved path spelling and its canonical realpath so Bun
|
|
453
|
+
// can reach the loader even if it reports the same file through a different alias.
|
|
454
|
+
build.onLoad({ filter: exactPathFilter([resolvedTargetPath, canonicalTargetPath]) }, async (args) => {
|
|
455
|
+
const loadedPath = normalizeSourcePath(args.path)
|
|
456
|
+
if (loadedPath !== canonicalTargetPath) {
|
|
457
|
+
return undefined
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
const nodeModulesPath = isNodeModulesPath(loadedPath)
|
|
461
|
+
const shouldRewriteRuntimeSpecifiers = !nodeModulesPath || rewriteOptions.nodeModulesRuntimeSpecifiers
|
|
462
|
+
const shouldRewriteBareSpecifiers = !nodeModulesPath || rewriteOptions.nodeModulesBareSpecifiers
|
|
463
|
+
const loader = runtimeLoaderForPath(args.path)
|
|
464
|
+
|
|
465
|
+
if (!loader) {
|
|
466
|
+
throw new Error(`Unable to determine runtime loader for path: ${args.path}`)
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
const contents = await Bun.file(loadedPath).text()
|
|
470
|
+
const runtimeRewrittenContents = shouldRewriteRuntimeSpecifiers
|
|
471
|
+
? rewriteRuntimeSpecifiers(contents, runtimeModuleIdsBySpecifier)
|
|
472
|
+
: contents
|
|
473
|
+
|
|
474
|
+
if (runtimeRewrittenContents !== contents && shouldRewriteBareSpecifiers) {
|
|
475
|
+
registerResolveParent(resolveParentsByRecency, loadedPath)
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const transformedContents = shouldRewriteBareSpecifiers
|
|
479
|
+
? rewriteImportsFromResolveParents(runtimeRewrittenContents, resolveParentsByRecency)
|
|
480
|
+
: runtimeRewrittenContents
|
|
481
|
+
|
|
482
|
+
return {
|
|
483
|
+
contents: transformedContents,
|
|
484
|
+
loader,
|
|
485
|
+
}
|
|
486
|
+
})
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
const analyzeSourcePath = (path: string): SourceAnalysis => {
|
|
490
|
+
const normalizedPath = normalizeSourcePath(path)
|
|
491
|
+
const cachedAnalysis = sourceAnalysisByPath.get(normalizedPath)
|
|
492
|
+
if (cachedAnalysis) {
|
|
493
|
+
return cachedAnalysis
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
const contents = readFileSync(normalizedPath, "utf8")
|
|
497
|
+
const importSpecifiers = collectImportSpecifiers(contents)
|
|
498
|
+
const analysis = {
|
|
499
|
+
importSpecifiers,
|
|
500
|
+
needsRuntimeSpecifierRewrite: importSpecifiers.some((specifier) =>
|
|
501
|
+
runtimeModuleIdsBySpecifier.has(specifier),
|
|
502
|
+
),
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
sourceAnalysisByPath.set(normalizedPath, analysis)
|
|
506
|
+
return analysis
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const collectNodeModulesRuntimeRewritePaths = (path: string, visiting = new Set<string>()): string[] => {
|
|
510
|
+
const normalizedPath = normalizeSourcePath(path)
|
|
511
|
+
|
|
512
|
+
if (!isNodeModulesEsmPath(normalizedPath, packageTypeByPackageJsonPath)) {
|
|
513
|
+
return []
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const cachedPaths = nodeModulesRuntimeRewritePathsByPath.get(normalizedPath)
|
|
517
|
+
if (cachedPaths) {
|
|
518
|
+
return cachedPaths
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
if (visiting.has(normalizedPath)) {
|
|
522
|
+
return []
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
visiting.add(normalizedPath)
|
|
526
|
+
|
|
527
|
+
const rewritePaths = new Set<string>()
|
|
528
|
+
const analysis = analyzeSourcePath(normalizedPath)
|
|
529
|
+
|
|
530
|
+
if (analysis.needsRuntimeSpecifierRewrite) {
|
|
531
|
+
rewritePaths.add(normalizedPath)
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
for (const specifier of analysis.importSpecifiers) {
|
|
535
|
+
const resolvedPath = resolveSourcePathFromSpecifier(specifier, normalizedPath)
|
|
536
|
+
if (!resolvedPath || !isNodeModulesEsmPath(resolvedPath, packageTypeByPackageJsonPath)) {
|
|
537
|
+
continue
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
for (const nestedPath of collectNodeModulesRuntimeRewritePaths(resolvedPath, visiting)) {
|
|
541
|
+
rewritePaths.add(nestedPath)
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
visiting.delete(normalizedPath)
|
|
546
|
+
|
|
547
|
+
const resolvedRewritePaths = [...rewritePaths]
|
|
548
|
+
nodeModulesRuntimeRewritePathsByPath.set(normalizedPath, resolvedRewritePaths)
|
|
549
|
+
return resolvedRewritePaths
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
for (const [specifier, moduleEntry] of runtimeModules.entries()) {
|
|
553
|
+
const moduleId = runtimeModuleIdsBySpecifier.get(specifier)
|
|
554
|
+
|
|
555
|
+
if (!moduleId) {
|
|
556
|
+
continue
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
build.module(moduleId, async () => ({
|
|
560
|
+
exports: await resolveRuntimeModuleExports(moduleEntry),
|
|
561
|
+
loader: "object",
|
|
562
|
+
}))
|
|
563
|
+
|
|
564
|
+
build.onResolve({ filter: exactSpecifierFilter(specifier) }, () => ({ path: moduleId }))
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
build.onResolve({ filter: /.*/ }, (args) => {
|
|
568
|
+
if (runtimeModuleIdsBySpecifier.has(args.path) || args.path.startsWith(RUNTIME_MODULE_PREFIX)) {
|
|
569
|
+
return undefined
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
const path = resolveSourcePathFromSpecifier(args.path, args.importer)
|
|
573
|
+
if (!path || !runtimeLoaderForPath(path)) {
|
|
574
|
+
return undefined
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const nodeModulesPath = isNodeModulesPath(path)
|
|
578
|
+
|
|
579
|
+
if (!nodeModulesPath) {
|
|
580
|
+
installRewriteLoader(path)
|
|
581
|
+
return undefined
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
if (!rewriteOptions.nodeModulesRuntimeSpecifiers && !rewriteOptions.nodeModulesBareSpecifiers) {
|
|
585
|
+
return undefined
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
for (const rewritePath of collectNodeModulesRuntimeRewritePaths(path)) {
|
|
589
|
+
installRewriteLoader(rewritePath)
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
const packageRoot = nodeModulesPackageRootForPath(path)
|
|
593
|
+
if (
|
|
594
|
+
rewriteOptions.nodeModulesBareSpecifiers &&
|
|
595
|
+
packageRoot &&
|
|
596
|
+
nodeModulesBareRewritePackageRoots.has(packageRoot)
|
|
597
|
+
) {
|
|
598
|
+
installRewriteLoader(path)
|
|
599
|
+
return undefined
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
if (!rewriteOptions.nodeModulesRuntimeSpecifiers || !analyzeSourcePath(path).needsRuntimeSpecifierRewrite) {
|
|
603
|
+
return undefined
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
if (rewriteOptions.nodeModulesBareSpecifiers && packageRoot) {
|
|
607
|
+
nodeModulesBareRewritePackageRoots.add(packageRoot)
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
installRewriteLoader(path)
|
|
611
|
+
return undefined
|
|
612
|
+
})
|
|
613
|
+
},
|
|
614
|
+
}
|
|
615
|
+
}
|