@fairyhunter13/opentui-core 0.1.114 → 0.1.115
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/3d/SpriteResourceManager.d.ts +74 -0
- package/3d/SpriteUtils.d.ts +13 -0
- package/3d/TextureUtils.d.ts +24 -0
- package/3d/ThreeRenderable.d.ts +40 -0
- package/3d/WGPURenderer.d.ts +61 -0
- package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
- package/3d/animation/SpriteAnimator.d.ts +124 -0
- package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
- package/3d/canvas.d.ts +44 -0
- package/3d/index.d.ts +12 -0
- package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
- package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
- package/3d/physics/physics-interface.d.ts +27 -0
- package/3d.d.ts +2 -0
- package/3d.js +34041 -0
- package/3d.js.map +155 -0
- package/LICENSE +21 -0
- package/NativeSpanFeed.d.ts +41 -0
- package/Renderable.d.ts +334 -0
- package/animation/Timeline.d.ts +126 -0
- package/ansi.d.ts +13 -0
- package/buffer.d.ts +111 -0
- package/console.d.ts +144 -0
- package/edit-buffer.d.ts +98 -0
- package/editor-view.d.ts +73 -0
- package/index-j4m38kjn.js +411 -0
- package/index-j4m38kjn.js.map +10 -0
- package/index-tse8gzh0.js +20614 -0
- package/index-tse8gzh0.js.map +67 -0
- package/index-vv2jcd4r.js +12299 -0
- package/index-vv2jcd4r.js.map +42 -0
- package/index.d.ts +23 -0
- package/index.js +478 -0
- package/index.js.map +9 -0
- package/lib/KeyHandler.d.ts +61 -0
- package/lib/RGBA.d.ts +25 -0
- package/lib/ascii.font.d.ts +508 -0
- package/lib/border.d.ts +51 -0
- package/lib/bunfs.d.ts +7 -0
- package/lib/clipboard.d.ts +17 -0
- package/lib/clock.d.ts +15 -0
- package/lib/data-paths.d.ts +26 -0
- package/lib/debounce.d.ts +42 -0
- package/lib/detect-links.d.ts +6 -0
- package/lib/env.d.ts +42 -0
- package/lib/extmarks-history.d.ts +17 -0
- package/lib/extmarks.d.ts +89 -0
- package/lib/hast-styled-text.d.ts +17 -0
- package/lib/index.d.ts +21 -0
- package/lib/keymapping.d.ts +25 -0
- package/lib/objects-in-viewport.d.ts +24 -0
- package/lib/output.capture.d.ts +24 -0
- package/lib/parse.keypress-kitty.d.ts +2 -0
- package/lib/parse.keypress.d.ts +26 -0
- package/lib/parse.mouse.d.ts +30 -0
- package/lib/paste.d.ts +7 -0
- package/lib/queue.d.ts +15 -0
- package/lib/renderable.validations.d.ts +12 -0
- package/lib/scroll-acceleration.d.ts +43 -0
- package/lib/selection.d.ts +63 -0
- package/lib/singleton.d.ts +7 -0
- package/lib/stdin-parser.d.ts +87 -0
- package/lib/styled-text.d.ts +63 -0
- package/lib/terminal-capability-detection.d.ts +30 -0
- package/lib/terminal-palette.d.ts +50 -0
- package/lib/tree-sitter/assets/update.d.ts +11 -0
- package/lib/tree-sitter/client.d.ts +47 -0
- package/lib/tree-sitter/default-parsers.d.ts +2 -0
- package/lib/tree-sitter/download-utils.d.ts +21 -0
- package/lib/tree-sitter/index.d.ts +8 -0
- package/lib/tree-sitter/parser.worker.d.ts +1 -0
- package/lib/tree-sitter/parsers-config.d.ts +53 -0
- package/lib/tree-sitter/resolve-ft.d.ts +5 -0
- package/lib/tree-sitter/types.d.ts +82 -0
- package/lib/tree-sitter-styled-text.d.ts +14 -0
- package/lib/validate-dir-name.d.ts +1 -0
- package/lib/yoga.options.d.ts +32 -0
- package/package.json +50 -62
- package/parser.worker.js +899 -0
- package/parser.worker.js.map +12 -0
- package/plugins/core-slot.d.ts +72 -0
- package/plugins/registry.d.ts +42 -0
- package/plugins/types.d.ts +34 -0
- package/post/effects.d.ts +147 -0
- package/post/filters.d.ts +65 -0
- package/post/matrices.d.ts +20 -0
- package/renderables/ASCIIFont.d.ts +52 -0
- package/renderables/Box.d.ts +81 -0
- package/renderables/Code.d.ts +78 -0
- package/renderables/Diff.d.ts +142 -0
- package/renderables/EditBufferRenderable.d.ts +237 -0
- package/renderables/FrameBuffer.d.ts +16 -0
- package/renderables/Input.d.ts +67 -0
- package/renderables/LineNumberRenderable.d.ts +78 -0
- package/renderables/Markdown.d.ts +185 -0
- package/renderables/ScrollBar.d.ts +77 -0
- package/renderables/ScrollBox.d.ts +124 -0
- package/renderables/Select.d.ts +115 -0
- package/renderables/Slider.d.ts +47 -0
- package/renderables/TabSelect.d.ts +96 -0
- package/renderables/Text.d.ts +36 -0
- package/renderables/TextBufferRenderable.d.ts +105 -0
- package/renderables/TextNode.d.ts +91 -0
- package/renderables/TextTable.d.ts +140 -0
- package/renderables/Textarea.d.ts +63 -0
- package/renderables/TimeToFirstDraw.d.ts +24 -0
- package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
- package/renderables/composition/VRenderable.d.ts +16 -0
- package/renderables/composition/constructs.d.ts +35 -0
- package/renderables/composition/vnode.d.ts +46 -0
- package/renderables/index.d.ts +23 -0
- package/renderables/markdown-parser.d.ts +10 -0
- package/renderer.d.ts +419 -0
- package/runtime-plugin-support.d.ts +3 -0
- package/runtime-plugin-support.js +29 -0
- package/runtime-plugin-support.js.map +10 -0
- package/runtime-plugin.d.ts +16 -0
- package/runtime-plugin.js +16 -0
- package/runtime-plugin.js.map +9 -0
- package/syntax-style.d.ts +54 -0
- package/testing/manual-clock.d.ts +17 -0
- package/testing/mock-keys.d.ts +81 -0
- package/testing/mock-mouse.d.ts +38 -0
- package/testing/mock-tree-sitter-client.d.ts +23 -0
- package/testing/spy.d.ts +7 -0
- package/testing/test-recorder.d.ts +61 -0
- package/testing/test-renderer.d.ts +23 -0
- package/testing.d.ts +6 -0
- package/testing.js +697 -0
- package/testing.js.map +15 -0
- package/text-buffer-view.d.ts +42 -0
- package/text-buffer.d.ts +67 -0
- package/types.d.ts +139 -0
- package/utils.d.ts +14 -0
- package/zig-structs.d.ts +155 -0
- package/zig.d.ts +353 -0
- package/dev/keypress-debug-renderer.ts +0 -148
- package/dev/keypress-debug.ts +0 -43
- package/dev/print-env-vars.ts +0 -32
- package/dev/test-tmux-graphics-334.sh +0 -68
- package/dev/thai-debug-test.ts +0 -68
- package/docs/development.md +0 -144
- package/scripts/build.ts +0 -400
- package/scripts/publish.ts +0 -60
- package/src/3d/SpriteResourceManager.ts +0 -286
- package/src/3d/SpriteUtils.ts +0 -70
- package/src/3d/TextureUtils.ts +0 -196
- package/src/3d/ThreeRenderable.ts +0 -197
- package/src/3d/WGPURenderer.ts +0 -294
- package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
- package/src/3d/animation/SpriteAnimator.ts +0 -633
- package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
- package/src/3d/canvas.ts +0 -464
- package/src/3d/index.ts +0 -12
- package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
- package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
- package/src/3d/physics/physics-interface.ts +0 -31
- package/src/3d/shaders/supersampling.wgsl +0 -201
- package/src/3d.ts +0 -3
- package/src/NativeSpanFeed.ts +0 -300
- package/src/Renderable.ts +0 -1704
- package/src/__snapshots__/buffer.test.ts.snap +0 -28
- package/src/animation/Timeline.test.ts +0 -2709
- package/src/animation/Timeline.ts +0 -598
- package/src/ansi.ts +0 -18
- package/src/benchmark/attenuation-benchmark.ts +0 -81
- package/src/benchmark/colormatrix-benchmark.ts +0 -128
- package/src/benchmark/gain-benchmark.ts +0 -80
- package/src/benchmark/latest-all-bench-run.json +0 -707
- package/src/benchmark/latest-async-bench-run.json +0 -336
- package/src/benchmark/latest-default-bench-run.json +0 -657
- package/src/benchmark/latest-large-bench-run.json +0 -707
- package/src/benchmark/latest-quick-bench-run.json +0 -207
- package/src/benchmark/markdown-benchmark.ts +0 -1796
- package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
- package/src/benchmark/native-span-feed-benchmark.md +0 -56
- package/src/benchmark/native-span-feed-benchmark.ts +0 -596
- package/src/benchmark/native-span-feed-compare.ts +0 -280
- package/src/benchmark/renderer-benchmark.ts +0 -754
- package/src/benchmark/text-table-benchmark.ts +0 -948
- package/src/buffer.test.ts +0 -291
- package/src/buffer.ts +0 -554
- package/src/console.test.ts +0 -612
- package/src/console.ts +0 -1254
- package/src/edit-buffer.test.ts +0 -1769
- package/src/edit-buffer.ts +0 -411
- package/src/editor-view.test.ts +0 -1032
- package/src/editor-view.ts +0 -284
- package/src/examples/ascii-font-selection-demo.ts +0 -245
- 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 +0 -1018
- 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 +0 -115
- package/src/examples/code-demo.ts +0 -924
- package/src/examples/console-demo.ts +0 -358
- package/src/examples/core-plugin-slots-demo.ts +0 -759
- package/src/examples/diff-demo.ts +0 -701
- package/src/examples/draggable-three-demo.ts +0 -259
- package/src/examples/editor-demo.ts +0 -322
- package/src/examples/extmarks-demo.ts +0 -196
- package/src/examples/focus-restore-demo.ts +0 -310
- package/src/examples/fonts.ts +0 -245
- package/src/examples/fractal-shader-demo.ts +0 -268
- package/src/examples/framebuffer-demo.ts +0 -674
- package/src/examples/full-unicode-demo.ts +0 -241
- package/src/examples/golden-star-demo.ts +0 -933
- package/src/examples/grayscale-buffer-demo.ts +0 -249
- package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
- package/src/examples/index.ts +0 -926
- package/src/examples/input-demo.ts +0 -377
- package/src/examples/input-select-layout-demo.ts +0 -425
- package/src/examples/install.sh +0 -143
- package/src/examples/keypress-debug-demo.ts +0 -452
- package/src/examples/lib/HexList.ts +0 -122
- package/src/examples/lib/PaletteGrid.ts +0 -125
- package/src/examples/lib/standalone-keys.ts +0 -25
- package/src/examples/lib/tab-controller.ts +0 -243
- package/src/examples/lights-phong-demo.ts +0 -290
- package/src/examples/link-demo.ts +0 -220
- package/src/examples/live-state-demo.ts +0 -480
- package/src/examples/markdown-demo.ts +0 -725
- package/src/examples/mouse-interaction-demo.ts +0 -428
- package/src/examples/nested-zindex-demo.ts +0 -357
- package/src/examples/opacity-example.ts +0 -235
- package/src/examples/opentui-demo.ts +0 -1057
- package/src/examples/physx-planck-2d-demo.ts +0 -623
- package/src/examples/physx-rapier-2d-demo.ts +0 -655
- package/src/examples/relative-positioning-demo.ts +0 -323
- package/src/examples/scroll-example.ts +0 -214
- package/src/examples/scrollbox-mouse-test.ts +0 -112
- package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
- package/src/examples/select-demo.ts +0 -237
- package/src/examples/shader-cube-demo.ts +0 -1015
- package/src/examples/simple-layout-example.ts +0 -591
- package/src/examples/slider-demo.ts +0 -617
- package/src/examples/split-mode-demo.ts +0 -453
- package/src/examples/sprite-animation-demo.ts +0 -443
- package/src/examples/sprite-particle-generator-demo.ts +0 -486
- package/src/examples/static-sprite-demo.ts +0 -193
- package/src/examples/sticky-scroll-example.ts +0 -308
- package/src/examples/styled-text-demo.ts +0 -282
- package/src/examples/tab-select-demo.ts +0 -219
- package/src/examples/terminal-title.ts +0 -29
- package/src/examples/terminal.ts +0 -305
- package/src/examples/text-node-demo.ts +0 -416
- package/src/examples/text-selection-demo.ts +0 -377
- package/src/examples/text-table-demo.ts +0 -503
- package/src/examples/text-truncation-demo.ts +0 -481
- package/src/examples/text-wrap.ts +0 -757
- package/src/examples/texture-loading-demo.ts +0 -259
- package/src/examples/timeline-example.ts +0 -670
- package/src/examples/transparency-demo.ts +0 -400
- package/src/examples/vnode-composition-demo.ts +0 -404
- package/src/examples/wide-grapheme-overlay-demo.ts +0 -280
- package/src/index.ts +0 -24
- package/src/lib/KeyHandler.integration.test.ts +0 -292
- package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
- package/src/lib/KeyHandler.test.ts +0 -662
- package/src/lib/KeyHandler.ts +0 -222
- package/src/lib/RGBA.test.ts +0 -984
- package/src/lib/RGBA.ts +0 -204
- package/src/lib/ascii.font.ts +0 -330
- package/src/lib/border.test.ts +0 -83
- package/src/lib/border.ts +0 -170
- package/src/lib/bunfs.test.ts +0 -27
- package/src/lib/bunfs.ts +0 -18
- package/src/lib/clipboard.test.ts +0 -41
- package/src/lib/clipboard.ts +0 -47
- package/src/lib/clock.ts +0 -35
- package/src/lib/data-paths.test.ts +0 -133
- package/src/lib/data-paths.ts +0 -109
- package/src/lib/debounce.ts +0 -106
- package/src/lib/detect-links.test.ts +0 -98
- package/src/lib/detect-links.ts +0 -56
- package/src/lib/env.test.ts +0 -228
- package/src/lib/env.ts +0 -209
- package/src/lib/extmarks-history.ts +0 -51
- package/src/lib/extmarks-multiwidth.test.ts +0 -322
- package/src/lib/extmarks.test.ts +0 -3457
- package/src/lib/extmarks.ts +0 -843
- package/src/lib/fonts/block.json +0 -405
- package/src/lib/fonts/grid.json +0 -265
- package/src/lib/fonts/huge.json +0 -741
- package/src/lib/fonts/pallet.json +0 -314
- package/src/lib/fonts/shade.json +0 -591
- package/src/lib/fonts/slick.json +0 -321
- package/src/lib/fonts/tiny.json +0 -69
- package/src/lib/hast-styled-text.ts +0 -59
- package/src/lib/index.ts +0 -21
- package/src/lib/keymapping.test.ts +0 -317
- package/src/lib/keymapping.ts +0 -115
- package/src/lib/objects-in-viewport.test.ts +0 -787
- package/src/lib/objects-in-viewport.ts +0 -153
- package/src/lib/output.capture.ts +0 -58
- package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
- package/src/lib/parse.keypress-kitty.test.ts +0 -663
- package/src/lib/parse.keypress-kitty.ts +0 -439
- package/src/lib/parse.keypress.test.ts +0 -1849
- package/src/lib/parse.keypress.ts +0 -397
- package/src/lib/parse.mouse.test.ts +0 -552
- package/src/lib/parse.mouse.ts +0 -232
- package/src/lib/paste.ts +0 -16
- package/src/lib/queue.ts +0 -65
- package/src/lib/renderable.validations.test.ts +0 -87
- package/src/lib/renderable.validations.ts +0 -83
- package/src/lib/scroll-acceleration.ts +0 -98
- package/src/lib/selection.ts +0 -240
- package/src/lib/singleton.ts +0 -28
- package/src/lib/stdin-parser.test.ts +0 -2290
- package/src/lib/stdin-parser.ts +0 -1810
- package/src/lib/styled-text.ts +0 -178
- package/src/lib/terminal-capability-detection.test.ts +0 -202
- package/src/lib/terminal-capability-detection.ts +0 -79
- package/src/lib/terminal-palette.test.ts +0 -878
- package/src/lib/terminal-palette.ts +0 -383
- package/src/lib/tree-sitter/assets/README.md +0 -118
- package/src/lib/tree-sitter/assets/update.ts +0 -334
- package/src/lib/tree-sitter/assets.d.ts +0 -9
- package/src/lib/tree-sitter/cache.test.ts +0 -273
- package/src/lib/tree-sitter/client.test.ts +0 -1165
- package/src/lib/tree-sitter/client.ts +0 -607
- package/src/lib/tree-sitter/default-parsers.ts +0 -86
- package/src/lib/tree-sitter/download-utils.ts +0 -148
- package/src/lib/tree-sitter/index.ts +0 -28
- package/src/lib/tree-sitter/parser.worker.ts +0 -1042
- package/src/lib/tree-sitter/parsers-config.ts +0 -81
- package/src/lib/tree-sitter/resolve-ft.test.ts +0 -55
- package/src/lib/tree-sitter/resolve-ft.ts +0 -189
- package/src/lib/tree-sitter/types.ts +0 -82
- package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
- package/src/lib/tree-sitter-styled-text.ts +0 -306
- package/src/lib/validate-dir-name.ts +0 -55
- package/src/lib/yoga.options.test.ts +0 -628
- package/src/lib/yoga.options.ts +0 -346
- package/src/plugins/core-slot.ts +0 -579
- package/src/plugins/registry.ts +0 -402
- package/src/plugins/types.ts +0 -46
- package/src/post/effects.ts +0 -930
- package/src/post/filters.ts +0 -489
- package/src/post/matrices.ts +0 -288
- package/src/renderables/ASCIIFont.ts +0 -219
- package/src/renderables/Box.test.ts +0 -205
- package/src/renderables/Box.ts +0 -326
- package/src/renderables/Code.test.ts +0 -2062
- package/src/renderables/Code.ts +0 -357
- package/src/renderables/Diff.regression.test.ts +0 -226
- package/src/renderables/Diff.test.ts +0 -3101
- package/src/renderables/Diff.ts +0 -1211
- package/src/renderables/EditBufferRenderable.test.ts +0 -288
- package/src/renderables/EditBufferRenderable.ts +0 -1166
- package/src/renderables/FrameBuffer.ts +0 -47
- package/src/renderables/Input.test.ts +0 -1228
- package/src/renderables/Input.ts +0 -247
- package/src/renderables/LineNumberRenderable.ts +0 -724
- package/src/renderables/Markdown.ts +0 -1393
- package/src/renderables/ScrollBar.ts +0 -422
- package/src/renderables/ScrollBox.ts +0 -883
- package/src/renderables/Select.test.ts +0 -1033
- package/src/renderables/Select.ts +0 -524
- package/src/renderables/Slider.test.ts +0 -456
- package/src/renderables/Slider.ts +0 -342
- package/src/renderables/TabSelect.test.ts +0 -197
- package/src/renderables/TabSelect.ts +0 -455
- package/src/renderables/Text.selection-buffer.test.ts +0 -123
- package/src/renderables/Text.test.ts +0 -2660
- package/src/renderables/Text.ts +0 -147
- package/src/renderables/TextBufferRenderable.ts +0 -518
- package/src/renderables/TextNode.test.ts +0 -1058
- package/src/renderables/TextNode.ts +0 -325
- package/src/renderables/TextTable.test.ts +0 -1421
- package/src/renderables/TextTable.ts +0 -1344
- package/src/renderables/Textarea.ts +0 -430
- package/src/renderables/TimeToFirstDraw.ts +0 -89
- package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
- package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
- package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1865
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +0 -242
- package/src/renderables/__tests__/Markdown.test.ts +0 -2518
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
- package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
- package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
- package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
- package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
- package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
- package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1866
- package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
- package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
- package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
- package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
- package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
- package/src/renderables/composition/README.md +0 -8
- package/src/renderables/composition/VRenderable.ts +0 -32
- package/src/renderables/composition/constructs.ts +0 -127
- package/src/renderables/composition/vnode.ts +0 -289
- package/src/renderables/index.ts +0 -23
- package/src/renderables/markdown-parser.ts +0 -66
- package/src/renderer.ts +0 -2681
- package/src/runtime-plugin-support.ts +0 -39
- package/src/runtime-plugin.ts +0 -615
- package/src/syntax-style.test.ts +0 -841
- package/src/syntax-style.ts +0 -257
- package/src/testing/README.md +0 -210
- package/src/testing/capture-spans.test.ts +0 -194
- package/src/testing/integration.test.ts +0 -276
- package/src/testing/manual-clock.ts +0 -117
- package/src/testing/mock-keys.test.ts +0 -1378
- package/src/testing/mock-keys.ts +0 -457
- package/src/testing/mock-mouse.test.ts +0 -218
- package/src/testing/mock-mouse.ts +0 -247
- package/src/testing/mock-tree-sitter-client.ts +0 -73
- package/src/testing/spy.ts +0 -13
- package/src/testing/test-recorder.test.ts +0 -415
- package/src/testing/test-recorder.ts +0 -145
- package/src/testing/test-renderer.ts +0 -132
- package/src/testing.ts +0 -7
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
- package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
- package/src/tests/allocator-stats.test.ts +0 -38
- package/src/tests/destroy-during-render.test.ts +0 -200
- package/src/tests/destroy-on-exit.fixture.ts +0 -36
- package/src/tests/destroy-on-exit.test.ts +0 -41
- package/src/tests/hover-cursor.test.ts +0 -98
- package/src/tests/native-span-feed-async.test.ts +0 -173
- package/src/tests/native-span-feed-close.test.ts +0 -120
- package/src/tests/native-span-feed-coverage.test.ts +0 -227
- package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
- package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
- package/src/tests/opacity.test.ts +0 -123
- package/src/tests/renderable.snapshot.test.ts +0 -524
- package/src/tests/renderable.test.ts +0 -1281
- package/src/tests/renderer.clock.test.ts +0 -158
- package/src/tests/renderer.console-startup.test.ts +0 -185
- package/src/tests/renderer.control.test.ts +0 -425
- package/src/tests/renderer.core-slot-binding.test.ts +0 -952
- package/src/tests/renderer.cursor.test.ts +0 -26
- package/src/tests/renderer.destroy-during-render.test.ts +0 -147
- package/src/tests/renderer.focus-restore.test.ts +0 -257
- package/src/tests/renderer.focus.test.ts +0 -294
- package/src/tests/renderer.idle.test.ts +0 -219
- package/src/tests/renderer.input.test.ts +0 -2237
- package/src/tests/renderer.kitty-flags.test.ts +0 -195
- package/src/tests/renderer.mouse.test.ts +0 -1274
- package/src/tests/renderer.palette.test.ts +0 -629
- package/src/tests/renderer.selection.test.ts +0 -49
- package/src/tests/renderer.slot-registry.test.ts +0 -684
- package/src/tests/renderer.useMouse.test.ts +0 -47
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +0 -76
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +0 -43
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +0 -67
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +0 -72
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +0 -44
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +0 -85
- package/src/tests/runtime-plugin-path-alias.fixture.ts +0 -43
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +0 -65
- package/src/tests/runtime-plugin-support.fixture.ts +0 -11
- package/src/tests/runtime-plugin-support.test.ts +0 -19
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +0 -30
- package/src/tests/runtime-plugin.fixture.ts +0 -40
- package/src/tests/runtime-plugin.test.ts +0 -354
- package/src/tests/scrollbox-culling-bug.test.ts +0 -114
- package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
- package/src/tests/scrollbox-hitgrid.test.ts +0 -909
- package/src/tests/scrollbox.test.ts +0 -1530
- package/src/tests/wrap-resize-perf.test.ts +0 -276
- package/src/tests/yoga-setters.test.ts +0 -921
- package/src/text-buffer-view.test.ts +0 -705
- package/src/text-buffer-view.ts +0 -189
- package/src/text-buffer.test.ts +0 -347
- package/src/text-buffer.ts +0 -250
- package/src/types.ts +0 -161
- package/src/utils.ts +0 -88
- package/src/zig/ansi.zig +0 -268
- package/src/zig/bench/README.md +0 -50
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
- package/src/zig/bench/edit-buffer_bench.zig +0 -476
- package/src/zig/bench/native-span-feed_bench.zig +0 -100
- package/src/zig/bench/rope-markers_bench.zig +0 -713
- package/src/zig/bench/rope_bench.zig +0 -514
- package/src/zig/bench/styled-text_bench.zig +0 -470
- package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
- package/src/zig/bench/text-buffer-view_bench.zig +0 -459
- package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
- package/src/zig/bench/utf8_bench.zig +0 -799
- package/src/zig/bench-utils.zig +0 -431
- package/src/zig/bench.zig +0 -217
- package/src/zig/buffer-methods.zig +0 -211
- package/src/zig/buffer.zig +0 -2281
- package/src/zig/build.zig +0 -289
- package/src/zig/build.zig.zon +0 -16
- package/src/zig/edit-buffer.zig +0 -825
- package/src/zig/editor-view.zig +0 -802
- package/src/zig/event-bus.zig +0 -13
- package/src/zig/event-emitter.zig +0 -65
- package/src/zig/file-logger.zig +0 -92
- package/src/zig/grapheme.zig +0 -599
- package/src/zig/lib.zig +0 -1854
- package/src/zig/link.zig +0 -333
- package/src/zig/logger.zig +0 -43
- package/src/zig/mem-registry.zig +0 -125
- package/src/zig/native-span-feed-bench-lib.zig +0 -7
- package/src/zig/native-span-feed.zig +0 -708
- package/src/zig/renderer.zig +0 -1393
- package/src/zig/rope.zig +0 -1220
- package/src/zig/syntax-style.zig +0 -161
- package/src/zig/terminal.zig +0 -987
- package/src/zig/test.zig +0 -72
- package/src/zig/tests/README.md +0 -18
- package/src/zig/tests/buffer-methods_test.zig +0 -1109
- package/src/zig/tests/buffer_test.zig +0 -2557
- package/src/zig/tests/edit-buffer-history_test.zig +0 -271
- package/src/zig/tests/edit-buffer_test.zig +0 -1689
- package/src/zig/tests/editor-view_test.zig +0 -3299
- package/src/zig/tests/event-emitter_test.zig +0 -249
- package/src/zig/tests/grapheme_test.zig +0 -1304
- package/src/zig/tests/link_test.zig +0 -190
- package/src/zig/tests/mem-registry_test.zig +0 -473
- package/src/zig/tests/memory_leak_regression_test.zig +0 -159
- package/src/zig/tests/native-span-feed_test.zig +0 -1264
- package/src/zig/tests/renderer_test.zig +0 -1017
- package/src/zig/tests/rope-nested_test.zig +0 -712
- package/src/zig/tests/rope_fuzz_test.zig +0 -238
- package/src/zig/tests/rope_test.zig +0 -2362
- package/src/zig/tests/segment-merge.test.zig +0 -148
- package/src/zig/tests/syntax-style_test.zig +0 -557
- package/src/zig/tests/terminal_test.zig +0 -754
- package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
- package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
- package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
- package/src/zig/tests/text-buffer-segment_test.zig +0 -320
- package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
- package/src/zig/tests/text-buffer-view_test.zig +0 -3649
- package/src/zig/tests/text-buffer_test.zig +0 -2191
- package/src/zig/tests/unicode-width-map.zon +0 -3909
- package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
- package/src/zig/tests/utf8_test.zig +0 -4057
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
- package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
- package/src/zig/tests/word-wrap-editing_test.zig +0 -498
- package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
- package/src/zig/text-buffer-iterators.zig +0 -499
- package/src/zig/text-buffer-segment.zig +0 -404
- package/src/zig/text-buffer-view.zig +0 -1371
- package/src/zig/text-buffer.zig +0 -1180
- package/src/zig/utf8.zig +0 -1948
- package/src/zig/utils.zig +0 -9
- package/src/zig-structs.ts +0 -261
- package/src/zig.ts +0 -3884
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -27
- /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
|
@@ -1,675 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, beforeEach, afterEach } from "bun:test"
|
|
2
|
-
import { createTestRenderer, type TestRenderer, type MockInput } from "../../testing/test-renderer.js"
|
|
3
|
-
import { createTextareaRenderable } from "./renderable-test-utils.js"
|
|
4
|
-
|
|
5
|
-
let currentRenderer: TestRenderer
|
|
6
|
-
let renderOnce: () => Promise<void>
|
|
7
|
-
let currentMockInput: MockInput
|
|
8
|
-
|
|
9
|
-
describe("Textarea - Destroyed Renderable Event Tests", () => {
|
|
10
|
-
beforeEach(async () => {
|
|
11
|
-
;({
|
|
12
|
-
renderer: currentRenderer,
|
|
13
|
-
renderOnce,
|
|
14
|
-
mockInput: currentMockInput,
|
|
15
|
-
} = await createTestRenderer({
|
|
16
|
-
width: 80,
|
|
17
|
-
height: 24,
|
|
18
|
-
}))
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
currentRenderer.destroy()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
describe("Keypress events on destroyed renderable", () => {
|
|
26
|
-
it("should not trigger handleKeyPress after destroy is called", async () => {
|
|
27
|
-
let keypressCalled = false
|
|
28
|
-
let handleKeyPressCalled = false
|
|
29
|
-
|
|
30
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
31
|
-
initialValue: "Test",
|
|
32
|
-
width: 40,
|
|
33
|
-
height: 10,
|
|
34
|
-
onKeyDown: () => {
|
|
35
|
-
keypressCalled = true
|
|
36
|
-
},
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Override handleKeyPress to track calls
|
|
40
|
-
const originalHandleKeyPress = editor.handleKeyPress.bind(editor)
|
|
41
|
-
editor.handleKeyPress = (key) => {
|
|
42
|
-
handleKeyPressCalled = true
|
|
43
|
-
return originalHandleKeyPress(key)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
editor.focus()
|
|
47
|
-
await renderOnce()
|
|
48
|
-
|
|
49
|
-
// Destroy the renderable
|
|
50
|
-
editor.destroy()
|
|
51
|
-
|
|
52
|
-
// Reset flags
|
|
53
|
-
keypressCalled = false
|
|
54
|
-
handleKeyPressCalled = false
|
|
55
|
-
|
|
56
|
-
// Try to send a key event after destruction
|
|
57
|
-
currentMockInput.pressKey("A")
|
|
58
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
59
|
-
|
|
60
|
-
expect(keypressCalled).toBe(false)
|
|
61
|
-
expect(handleKeyPressCalled).toBe(false)
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it("should not trigger handleKeyPress when destroyed before blur", async () => {
|
|
65
|
-
let keypressCalled = false
|
|
66
|
-
|
|
67
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
68
|
-
initialValue: "Test",
|
|
69
|
-
width: 40,
|
|
70
|
-
height: 10,
|
|
71
|
-
onKeyDown: () => {
|
|
72
|
-
keypressCalled = true
|
|
73
|
-
},
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
editor.focus()
|
|
77
|
-
await renderOnce()
|
|
78
|
-
|
|
79
|
-
// Destroy without explicitly blurring first (destroy should handle this)
|
|
80
|
-
editor.destroy()
|
|
81
|
-
|
|
82
|
-
keypressCalled = false
|
|
83
|
-
|
|
84
|
-
currentMockInput.pressKey("B")
|
|
85
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
86
|
-
|
|
87
|
-
expect(keypressCalled).toBe(false)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it("should not trigger keypress during async operations after destroy", async () => {
|
|
91
|
-
let keypressCount = 0
|
|
92
|
-
|
|
93
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
94
|
-
initialValue: "Test",
|
|
95
|
-
width: 40,
|
|
96
|
-
height: 10,
|
|
97
|
-
onKeyDown: () => {
|
|
98
|
-
keypressCount++
|
|
99
|
-
},
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
editor.focus()
|
|
103
|
-
|
|
104
|
-
// Queue multiple key presses
|
|
105
|
-
currentMockInput.pressKey("A")
|
|
106
|
-
currentMockInput.pressKey("B")
|
|
107
|
-
|
|
108
|
-
// Destroy while events might still be processing
|
|
109
|
-
editor.destroy()
|
|
110
|
-
|
|
111
|
-
// Queue more events after destroy
|
|
112
|
-
currentMockInput.pressKey("C")
|
|
113
|
-
currentMockInput.pressKey("D")
|
|
114
|
-
|
|
115
|
-
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
116
|
-
|
|
117
|
-
// At most the first couple events should have been processed before destroy
|
|
118
|
-
// After destroy, no new events should be processed
|
|
119
|
-
expect(keypressCount).toBeLessThanOrEqual(2)
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
it("should handle rapid focus/destroy/keypress cycles", async () => {
|
|
123
|
-
let errors: Error[] = []
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
127
|
-
initialValue: "Test",
|
|
128
|
-
width: 40,
|
|
129
|
-
height: 10,
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
editor.focus()
|
|
133
|
-
currentMockInput.pressKey("A")
|
|
134
|
-
editor.destroy()
|
|
135
|
-
currentMockInput.pressKey("B")
|
|
136
|
-
|
|
137
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
138
|
-
|
|
139
|
-
// Create and destroy another
|
|
140
|
-
const { textarea: editor2 } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
141
|
-
initialValue: "Test2",
|
|
142
|
-
width: 40,
|
|
143
|
-
height: 10,
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
editor2.focus()
|
|
147
|
-
currentMockInput.pressKey("C")
|
|
148
|
-
editor2.destroy()
|
|
149
|
-
currentMockInput.pressKey("D")
|
|
150
|
-
|
|
151
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
152
|
-
} catch (error) {
|
|
153
|
-
if (error instanceof Error) {
|
|
154
|
-
errors.push(error)
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
expect(errors.length).toBe(0)
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
it("should not crash when keypressHandler fires after editBuffer is destroyed", async () => {
|
|
162
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
163
|
-
initialValue: "Test",
|
|
164
|
-
width: 40,
|
|
165
|
-
height: 10,
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
editor.focus()
|
|
169
|
-
await renderOnce()
|
|
170
|
-
|
|
171
|
-
// Destroy the whole textarea properly (not just editBuffer)
|
|
172
|
-
// Destroying only editBuffer while textarea is alive is undefined behavior
|
|
173
|
-
editor.destroy()
|
|
174
|
-
|
|
175
|
-
// Try pressing key after destroy - should be safely ignored
|
|
176
|
-
currentMockInput.pressKey("X")
|
|
177
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
178
|
-
|
|
179
|
-
// Should not crash
|
|
180
|
-
expect(editor.isDestroyed).toBe(true)
|
|
181
|
-
})
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
describe("Paste events on destroyed renderable", () => {
|
|
185
|
-
it("should not trigger handlePaste after destroy is called", async () => {
|
|
186
|
-
let pasteCalled = false
|
|
187
|
-
|
|
188
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
189
|
-
initialValue: "Test",
|
|
190
|
-
width: 40,
|
|
191
|
-
height: 10,
|
|
192
|
-
onPaste: () => {
|
|
193
|
-
pasteCalled = true
|
|
194
|
-
},
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
editor.focus()
|
|
198
|
-
await renderOnce()
|
|
199
|
-
|
|
200
|
-
editor.destroy()
|
|
201
|
-
pasteCalled = false
|
|
202
|
-
|
|
203
|
-
await currentMockInput.pasteBracketedText("PastedText")
|
|
204
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
205
|
-
|
|
206
|
-
expect(pasteCalled).toBe(false)
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
it("should not trigger paste during async operations after destroy", async () => {
|
|
210
|
-
let pasteCount = 0
|
|
211
|
-
|
|
212
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
213
|
-
initialValue: "Test",
|
|
214
|
-
width: 40,
|
|
215
|
-
height: 10,
|
|
216
|
-
onPaste: () => {
|
|
217
|
-
pasteCount++
|
|
218
|
-
},
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
editor.focus()
|
|
222
|
-
|
|
223
|
-
// Queue paste operation
|
|
224
|
-
const pastePromise = currentMockInput.pasteBracketedText("Text1")
|
|
225
|
-
|
|
226
|
-
// Destroy while paste might still be processing
|
|
227
|
-
editor.destroy()
|
|
228
|
-
|
|
229
|
-
// Try another paste after destroy
|
|
230
|
-
await currentMockInput.pasteBracketedText("Text2")
|
|
231
|
-
|
|
232
|
-
await pastePromise
|
|
233
|
-
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
234
|
-
|
|
235
|
-
// At most the first paste should have been processed
|
|
236
|
-
expect(pasteCount).toBeLessThanOrEqual(1)
|
|
237
|
-
})
|
|
238
|
-
})
|
|
239
|
-
|
|
240
|
-
describe("Event handlers cleanup on destroy", () => {
|
|
241
|
-
it("should remove keypress handler from internal key input on destroy", async () => {
|
|
242
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
243
|
-
initialValue: "Test",
|
|
244
|
-
width: 40,
|
|
245
|
-
height: 10,
|
|
246
|
-
})
|
|
247
|
-
|
|
248
|
-
editor.focus()
|
|
249
|
-
await renderOnce()
|
|
250
|
-
|
|
251
|
-
// Check that handlers are set up
|
|
252
|
-
expect(editor.focused).toBe(true)
|
|
253
|
-
|
|
254
|
-
editor.destroy()
|
|
255
|
-
|
|
256
|
-
// After destroy, focused should be false and handlers should be removed
|
|
257
|
-
expect(editor.focused).toBe(false)
|
|
258
|
-
|
|
259
|
-
// Verify isDestroyed is true
|
|
260
|
-
expect(editor.isDestroyed).toBe(true)
|
|
261
|
-
})
|
|
262
|
-
|
|
263
|
-
it("should not trigger events when destroyed renderable is still in tree", async () => {
|
|
264
|
-
let keypressCount = 0
|
|
265
|
-
|
|
266
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
267
|
-
initialValue: "Test",
|
|
268
|
-
width: 40,
|
|
269
|
-
height: 10,
|
|
270
|
-
onKeyDown: () => {
|
|
271
|
-
keypressCount++
|
|
272
|
-
},
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
editor.focus()
|
|
276
|
-
await renderOnce()
|
|
277
|
-
|
|
278
|
-
// Destroy the renderable (this should remove it from parent and clean up handlers)
|
|
279
|
-
editor.destroy()
|
|
280
|
-
|
|
281
|
-
expect(editor.isDestroyed).toBe(true)
|
|
282
|
-
keypressCount = 0
|
|
283
|
-
|
|
284
|
-
// Try to send events
|
|
285
|
-
currentMockInput.pressKey("A")
|
|
286
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
287
|
-
|
|
288
|
-
expect(keypressCount).toBe(0)
|
|
289
|
-
})
|
|
290
|
-
|
|
291
|
-
it("should handle destroy called multiple times", async () => {
|
|
292
|
-
let errorOccurred = false
|
|
293
|
-
|
|
294
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
295
|
-
initialValue: "Test",
|
|
296
|
-
width: 40,
|
|
297
|
-
height: 10,
|
|
298
|
-
})
|
|
299
|
-
|
|
300
|
-
editor.focus()
|
|
301
|
-
|
|
302
|
-
try {
|
|
303
|
-
editor.destroy()
|
|
304
|
-
editor.destroy()
|
|
305
|
-
editor.destroy()
|
|
306
|
-
} catch (error) {
|
|
307
|
-
errorOccurred = true
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
expect(errorOccurred).toBe(false)
|
|
311
|
-
})
|
|
312
|
-
|
|
313
|
-
it("should clean up event listeners when destroyed while handling an event", async () => {
|
|
314
|
-
let handlerCallCount = 0
|
|
315
|
-
let shouldDestroy = false
|
|
316
|
-
let errorThrown = false
|
|
317
|
-
|
|
318
|
-
// Capture console.error to check for error logs
|
|
319
|
-
const originalConsoleError = console.error
|
|
320
|
-
console.error = (...args: any[]) => {
|
|
321
|
-
if (args[0]?.includes?.("[KeyHandler] Error in renderable")) {
|
|
322
|
-
errorThrown = true
|
|
323
|
-
}
|
|
324
|
-
originalConsoleError(...args)
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
try {
|
|
328
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
329
|
-
initialValue: "Test",
|
|
330
|
-
width: 40,
|
|
331
|
-
height: 10,
|
|
332
|
-
onKeyDown: () => {
|
|
333
|
-
handlerCallCount++
|
|
334
|
-
if (shouldDestroy) {
|
|
335
|
-
editor.destroy()
|
|
336
|
-
}
|
|
337
|
-
},
|
|
338
|
-
})
|
|
339
|
-
|
|
340
|
-
editor.focus()
|
|
341
|
-
|
|
342
|
-
// First keypress should work
|
|
343
|
-
currentMockInput.pressKey("A")
|
|
344
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
345
|
-
expect(handlerCallCount).toBe(1)
|
|
346
|
-
|
|
347
|
-
// Second keypress destroys the renderable
|
|
348
|
-
shouldDestroy = true
|
|
349
|
-
currentMockInput.pressKey("B")
|
|
350
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
351
|
-
expect(handlerCallCount).toBe(2)
|
|
352
|
-
|
|
353
|
-
// Third keypress should not trigger anything
|
|
354
|
-
currentMockInput.pressKey("C")
|
|
355
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
356
|
-
expect(handlerCallCount).toBe(2)
|
|
357
|
-
|
|
358
|
-
// CRITICAL: No error should be thrown when destroying during callback
|
|
359
|
-
expect(errorThrown).toBe(false)
|
|
360
|
-
} finally {
|
|
361
|
-
console.error = originalConsoleError
|
|
362
|
-
}
|
|
363
|
-
})
|
|
364
|
-
})
|
|
365
|
-
|
|
366
|
-
describe("Destroyed renderable with queued operations", () => {
|
|
367
|
-
it("should not process insertText after destroy", async () => {
|
|
368
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
369
|
-
initialValue: "Initial",
|
|
370
|
-
width: 40,
|
|
371
|
-
height: 10,
|
|
372
|
-
})
|
|
373
|
-
|
|
374
|
-
editor.focus()
|
|
375
|
-
|
|
376
|
-
editor.destroy()
|
|
377
|
-
|
|
378
|
-
// Try to call methods on destroyed renderable
|
|
379
|
-
try {
|
|
380
|
-
editor.insertText("New Text")
|
|
381
|
-
} catch (error) {
|
|
382
|
-
// Expected: operations might throw after destroy
|
|
383
|
-
expect(error).toBeDefined()
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
387
|
-
|
|
388
|
-
// Either the operation threw an error or it was safely ignored
|
|
389
|
-
expect(true).toBe(true)
|
|
390
|
-
})
|
|
391
|
-
|
|
392
|
-
it("should handle events arriving between destroy and cleanup", async () => {
|
|
393
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
394
|
-
initialValue: "Test",
|
|
395
|
-
width: 40,
|
|
396
|
-
height: 10,
|
|
397
|
-
})
|
|
398
|
-
|
|
399
|
-
editor.focus()
|
|
400
|
-
|
|
401
|
-
// Queue several key events
|
|
402
|
-
currentMockInput.pressKey("A")
|
|
403
|
-
currentMockInput.pressKey("B")
|
|
404
|
-
currentMockInput.pressKey("C")
|
|
405
|
-
|
|
406
|
-
// Destroy immediately without waiting for events to process
|
|
407
|
-
editor.destroy()
|
|
408
|
-
|
|
409
|
-
// Events might still be in the queue
|
|
410
|
-
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
411
|
-
|
|
412
|
-
// No crashes should occur
|
|
413
|
-
expect(editor.isDestroyed).toBe(true)
|
|
414
|
-
})
|
|
415
|
-
|
|
416
|
-
it("should safely handle focus after destroy", async () => {
|
|
417
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
418
|
-
initialValue: "Test",
|
|
419
|
-
width: 40,
|
|
420
|
-
height: 10,
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
editor.focus()
|
|
424
|
-
expect(editor.focused).toBe(true)
|
|
425
|
-
|
|
426
|
-
editor.destroy()
|
|
427
|
-
|
|
428
|
-
// Try to focus again after destroy (should be no-op or throw)
|
|
429
|
-
try {
|
|
430
|
-
editor.focus()
|
|
431
|
-
} catch (error) {
|
|
432
|
-
// May throw, that's fine
|
|
433
|
-
expect(error).toBeDefined()
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// Whether it throws or not, it shouldn't crash
|
|
437
|
-
expect(editor.focused).toBe(false)
|
|
438
|
-
})
|
|
439
|
-
})
|
|
440
|
-
|
|
441
|
-
describe("EditorView and EditBuffer destroyed state", () => {
|
|
442
|
-
it("should check if editBuffer guard prevents operations after destroy", async () => {
|
|
443
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
444
|
-
initialValue: "Test",
|
|
445
|
-
width: 40,
|
|
446
|
-
height: 10,
|
|
447
|
-
})
|
|
448
|
-
|
|
449
|
-
editor.focus()
|
|
450
|
-
|
|
451
|
-
// Destroy the textarea (which should destroy editBuffer and editorView)
|
|
452
|
-
editor.destroy()
|
|
453
|
-
|
|
454
|
-
// Try to access editBuffer methods that should throw if destroyed
|
|
455
|
-
let errorThrown = false
|
|
456
|
-
try {
|
|
457
|
-
editor.editBuffer.getText()
|
|
458
|
-
} catch (error) {
|
|
459
|
-
errorThrown = true
|
|
460
|
-
expect((error as Error).message).toContain("destroyed")
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
expect(errorThrown).toBe(true)
|
|
464
|
-
})
|
|
465
|
-
|
|
466
|
-
it("should check if editorView guard prevents operations after destroy", async () => {
|
|
467
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
468
|
-
initialValue: "Test",
|
|
469
|
-
width: 40,
|
|
470
|
-
height: 10,
|
|
471
|
-
})
|
|
472
|
-
|
|
473
|
-
editor.focus()
|
|
474
|
-
|
|
475
|
-
// Destroy the textarea
|
|
476
|
-
editor.destroy()
|
|
477
|
-
|
|
478
|
-
// Try to access editorView methods that should throw if destroyed
|
|
479
|
-
let errorThrown = false
|
|
480
|
-
try {
|
|
481
|
-
editor.editorView.getCursor()
|
|
482
|
-
} catch (error) {
|
|
483
|
-
errorThrown = true
|
|
484
|
-
expect((error as Error).message).toContain("destroyed")
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
expect(errorThrown).toBe(true)
|
|
488
|
-
})
|
|
489
|
-
|
|
490
|
-
it("should not allow keypress after proper destroy", async () => {
|
|
491
|
-
let keypressFired = false
|
|
492
|
-
|
|
493
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
494
|
-
initialValue: "Test",
|
|
495
|
-
width: 40,
|
|
496
|
-
height: 10,
|
|
497
|
-
onKeyDown: () => {
|
|
498
|
-
keypressFired = true
|
|
499
|
-
},
|
|
500
|
-
})
|
|
501
|
-
|
|
502
|
-
editor.focus()
|
|
503
|
-
await renderOnce()
|
|
504
|
-
|
|
505
|
-
// Properly destroy the whole textarea
|
|
506
|
-
editor.destroy()
|
|
507
|
-
|
|
508
|
-
// Try to trigger a keypress after destroy
|
|
509
|
-
currentMockInput.pressKey("A")
|
|
510
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
511
|
-
|
|
512
|
-
// Keypress handler should not have fired
|
|
513
|
-
expect(keypressFired).toBe(false)
|
|
514
|
-
expect(editor.isDestroyed).toBe(true)
|
|
515
|
-
})
|
|
516
|
-
})
|
|
517
|
-
|
|
518
|
-
describe("Multiple renderables and event routing", () => {
|
|
519
|
-
it("should not route events to destroyed renderable when multiple exist", async () => {
|
|
520
|
-
let editor1KeypressCount = 0
|
|
521
|
-
let editor2KeypressCount = 0
|
|
522
|
-
|
|
523
|
-
const { textarea: editor1 } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
524
|
-
initialValue: "Editor 1",
|
|
525
|
-
width: 40,
|
|
526
|
-
height: 10,
|
|
527
|
-
onKeyDown: () => {
|
|
528
|
-
editor1KeypressCount++
|
|
529
|
-
},
|
|
530
|
-
})
|
|
531
|
-
|
|
532
|
-
const { textarea: editor2 } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
533
|
-
initialValue: "Editor 2",
|
|
534
|
-
width: 40,
|
|
535
|
-
height: 10,
|
|
536
|
-
top: 10,
|
|
537
|
-
onKeyDown: () => {
|
|
538
|
-
editor2KeypressCount++
|
|
539
|
-
},
|
|
540
|
-
})
|
|
541
|
-
|
|
542
|
-
// Focus first editor
|
|
543
|
-
editor1.focus()
|
|
544
|
-
currentMockInput.pressKey("A")
|
|
545
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
546
|
-
|
|
547
|
-
expect(editor1KeypressCount).toBe(1)
|
|
548
|
-
expect(editor2KeypressCount).toBe(0)
|
|
549
|
-
|
|
550
|
-
// Destroy first editor and focus second
|
|
551
|
-
editor1.destroy()
|
|
552
|
-
editor2.focus()
|
|
553
|
-
|
|
554
|
-
editor1KeypressCount = 0
|
|
555
|
-
editor2KeypressCount = 0
|
|
556
|
-
|
|
557
|
-
currentMockInput.pressKey("B")
|
|
558
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
559
|
-
|
|
560
|
-
expect(editor1KeypressCount).toBe(0)
|
|
561
|
-
expect(editor2KeypressCount).toBe(1)
|
|
562
|
-
|
|
563
|
-
editor2.destroy()
|
|
564
|
-
})
|
|
565
|
-
|
|
566
|
-
it("should handle switching focus between renderables rapidly", async () => {
|
|
567
|
-
const { textarea: editor1 } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
568
|
-
initialValue: "Editor 1",
|
|
569
|
-
width: 40,
|
|
570
|
-
height: 10,
|
|
571
|
-
})
|
|
572
|
-
|
|
573
|
-
const { textarea: editor2 } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
574
|
-
initialValue: "Editor 2",
|
|
575
|
-
width: 40,
|
|
576
|
-
height: 10,
|
|
577
|
-
top: 10,
|
|
578
|
-
})
|
|
579
|
-
|
|
580
|
-
// Rapidly switch focus and destroy
|
|
581
|
-
editor1.focus()
|
|
582
|
-
editor2.focus()
|
|
583
|
-
editor1.destroy()
|
|
584
|
-
editor2.blur()
|
|
585
|
-
editor2.focus()
|
|
586
|
-
editor2.destroy()
|
|
587
|
-
|
|
588
|
-
// Send events after all destroyed
|
|
589
|
-
currentMockInput.pressKey("X")
|
|
590
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
591
|
-
|
|
592
|
-
// Should not crash
|
|
593
|
-
expect(true).toBe(true)
|
|
594
|
-
})
|
|
595
|
-
})
|
|
596
|
-
|
|
597
|
-
describe("Renderable destroyed flag checks", () => {
|
|
598
|
-
it("should prevent handleKeyPress execution when isDestroyed is true", async () => {
|
|
599
|
-
let callCount = 0
|
|
600
|
-
|
|
601
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
602
|
-
initialValue: "Test",
|
|
603
|
-
width: 40,
|
|
604
|
-
height: 10,
|
|
605
|
-
})
|
|
606
|
-
|
|
607
|
-
// Wrap handleKeyPress to track calls
|
|
608
|
-
const originalHandleKeyPress = editor.handleKeyPress.bind(editor)
|
|
609
|
-
editor.handleKeyPress = (key) => {
|
|
610
|
-
callCount++
|
|
611
|
-
if (editor.isDestroyed) {
|
|
612
|
-
// Should not execute when destroyed
|
|
613
|
-
throw new Error("handleKeyPress called on destroyed renderable")
|
|
614
|
-
}
|
|
615
|
-
return originalHandleKeyPress(key)
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
editor.focus()
|
|
619
|
-
currentMockInput.pressKey("A")
|
|
620
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
621
|
-
|
|
622
|
-
expect(callCount).toBe(1)
|
|
623
|
-
|
|
624
|
-
// Destroy and try again
|
|
625
|
-
editor.destroy()
|
|
626
|
-
callCount = 0
|
|
627
|
-
|
|
628
|
-
let errorThrown = false
|
|
629
|
-
try {
|
|
630
|
-
currentMockInput.pressKey("B")
|
|
631
|
-
await new Promise((resolve) => setTimeout(resolve, 20))
|
|
632
|
-
} catch (error) {
|
|
633
|
-
errorThrown = true
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
// Should not have called handleKeyPress after destroy
|
|
637
|
-
expect(callCount).toBe(0)
|
|
638
|
-
expect(errorThrown).toBe(false)
|
|
639
|
-
})
|
|
640
|
-
|
|
641
|
-
it("should check isDestroyed in event handler methods", async () => {
|
|
642
|
-
const { textarea: editor } = await createTextareaRenderable(currentRenderer, renderOnce, {
|
|
643
|
-
initialValue: "Test",
|
|
644
|
-
width: 40,
|
|
645
|
-
height: 10,
|
|
646
|
-
})
|
|
647
|
-
|
|
648
|
-
expect(editor.isDestroyed).toBe(false)
|
|
649
|
-
|
|
650
|
-
editor.focus()
|
|
651
|
-
expect(editor.isDestroyed).toBe(false)
|
|
652
|
-
|
|
653
|
-
editor.destroy()
|
|
654
|
-
expect(editor.isDestroyed).toBe(true)
|
|
655
|
-
|
|
656
|
-
// After destroy, operations should either fail or be no-ops
|
|
657
|
-
let errorCount = 0
|
|
658
|
-
try {
|
|
659
|
-
editor.focus()
|
|
660
|
-
} catch {
|
|
661
|
-
errorCount++
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
try {
|
|
665
|
-
editor.blur()
|
|
666
|
-
} catch {
|
|
667
|
-
errorCount++
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
// Operations after destroy should either throw or be ignored
|
|
671
|
-
// The important thing is we should be able to detect destroyed state
|
|
672
|
-
expect(editor.isDestroyed).toBe(true)
|
|
673
|
-
})
|
|
674
|
-
})
|
|
675
|
-
})
|