@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
package/src/testing/mock-keys.ts
DELETED
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
import { Buffer } from "node:buffer"
|
|
2
|
-
import type { CliRenderer } from "../renderer.js"
|
|
3
|
-
import { ANSI } from "../ansi.js"
|
|
4
|
-
|
|
5
|
-
export function pasteBytes(text: string): Uint8Array {
|
|
6
|
-
return Uint8Array.from(Buffer.from(text))
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export const KeyCodes = {
|
|
10
|
-
// Control keys
|
|
11
|
-
RETURN: "\r",
|
|
12
|
-
LINEFEED: "\n",
|
|
13
|
-
TAB: "\t",
|
|
14
|
-
BACKSPACE: "\b",
|
|
15
|
-
// NOTE: This may depend on the platform and terminals
|
|
16
|
-
DELETE: "\x1b[3~",
|
|
17
|
-
HOME: "\x1b[H",
|
|
18
|
-
END: "\x1b[F",
|
|
19
|
-
ESCAPE: "\x1b",
|
|
20
|
-
|
|
21
|
-
// Arrow keys
|
|
22
|
-
ARROW_UP: "\x1b[A",
|
|
23
|
-
ARROW_DOWN: "\x1b[B",
|
|
24
|
-
ARROW_RIGHT: "\x1b[C",
|
|
25
|
-
ARROW_LEFT: "\x1b[D",
|
|
26
|
-
|
|
27
|
-
// Function keys
|
|
28
|
-
F1: "\x1bOP",
|
|
29
|
-
F2: "\x1bOQ",
|
|
30
|
-
F3: "\x1bOR",
|
|
31
|
-
F4: "\x1bOS",
|
|
32
|
-
F5: "\x1b[15~",
|
|
33
|
-
F6: "\x1b[17~",
|
|
34
|
-
F7: "\x1b[18~",
|
|
35
|
-
F8: "\x1b[19~",
|
|
36
|
-
F9: "\x1b[20~",
|
|
37
|
-
F10: "\x1b[21~",
|
|
38
|
-
F11: "\x1b[23~",
|
|
39
|
-
F12: "\x1b[24~",
|
|
40
|
-
} as const
|
|
41
|
-
|
|
42
|
-
export type KeyInput = string | keyof typeof KeyCodes
|
|
43
|
-
|
|
44
|
-
export interface MockKeysOptions {
|
|
45
|
-
kittyKeyboard?: boolean
|
|
46
|
-
otherModifiersMode?: boolean
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Kitty keyboard protocol key mappings
|
|
50
|
-
const kittyKeyCodeMap: Record<string, number> = {
|
|
51
|
-
escape: 27,
|
|
52
|
-
tab: 9,
|
|
53
|
-
return: 13,
|
|
54
|
-
backspace: 127,
|
|
55
|
-
insert: 57348,
|
|
56
|
-
delete: 57349,
|
|
57
|
-
left: 57350,
|
|
58
|
-
right: 57351,
|
|
59
|
-
up: 57352,
|
|
60
|
-
down: 57353,
|
|
61
|
-
pageup: 57354,
|
|
62
|
-
pagedown: 57355,
|
|
63
|
-
home: 57356,
|
|
64
|
-
end: 57357,
|
|
65
|
-
f1: 57364,
|
|
66
|
-
f2: 57365,
|
|
67
|
-
f3: 57366,
|
|
68
|
-
f4: 57367,
|
|
69
|
-
f5: 57368,
|
|
70
|
-
f6: 57369,
|
|
71
|
-
f7: 57370,
|
|
72
|
-
f8: 57371,
|
|
73
|
-
f9: 57372,
|
|
74
|
-
f10: 57373,
|
|
75
|
-
f11: 57374,
|
|
76
|
-
f12: 57375,
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function encodeKittySequence(
|
|
80
|
-
codepoint: number,
|
|
81
|
-
modifiers?: { shift?: boolean; ctrl?: boolean; meta?: boolean; super?: boolean; hyper?: boolean },
|
|
82
|
-
): string {
|
|
83
|
-
// Kitty keyboard protocol: CSI unicode-key-code ; modifiers u
|
|
84
|
-
// Modifier encoding: shift=1, alt=2, ctrl=4, super=8, hyper=16, meta=32, caps=64, num=128
|
|
85
|
-
let modMask = 0
|
|
86
|
-
if (modifiers?.shift) modMask |= 1
|
|
87
|
-
if (modifiers?.meta) modMask |= 2 // alt/meta
|
|
88
|
-
if (modifiers?.ctrl) modMask |= 4
|
|
89
|
-
if (modifiers?.super) modMask |= 8
|
|
90
|
-
if (modifiers?.hyper) modMask |= 16
|
|
91
|
-
|
|
92
|
-
if (modMask === 0) {
|
|
93
|
-
// No modifiers
|
|
94
|
-
return `\x1b[${codepoint}u`
|
|
95
|
-
} else {
|
|
96
|
-
// With modifiers (kitty uses 1-based, so add 1)
|
|
97
|
-
return `\x1b[${codepoint};${modMask + 1}u`
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function encodeModifyOtherKeysSequence(
|
|
102
|
-
charCode: number,
|
|
103
|
-
modifiers?: { shift?: boolean; ctrl?: boolean; meta?: boolean; super?: boolean; hyper?: boolean },
|
|
104
|
-
): string {
|
|
105
|
-
// modifyOtherKeys protocol: CSI 27 ; modifier ; code ~
|
|
106
|
-
// This is the format used by xterm, iTerm2, Ghostty with modifyOtherKeys enabled
|
|
107
|
-
// Modifier encoding: shift=1, alt/option=2, ctrl=4, super=8, hyper=16 (1-based, so add 1)
|
|
108
|
-
let modMask = 0
|
|
109
|
-
if (modifiers?.shift) modMask |= 1
|
|
110
|
-
if (modifiers?.meta) modMask |= 2 // alt/option/meta
|
|
111
|
-
if (modifiers?.ctrl) modMask |= 4
|
|
112
|
-
if (modifiers?.super) modMask |= 8
|
|
113
|
-
if (modifiers?.hyper) modMask |= 16
|
|
114
|
-
|
|
115
|
-
// modifyOtherKeys is only used when modifiers are present
|
|
116
|
-
// Without modifiers, use the standard key sequence
|
|
117
|
-
if (modMask === 0) {
|
|
118
|
-
return String.fromCharCode(charCode)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// With modifiers, use CSI 27 ; modifier ; code ~
|
|
122
|
-
return `\x1b[27;${modMask + 1};${charCode}~`
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
interface ResolvedKey {
|
|
126
|
-
keyValue: string
|
|
127
|
-
keyName: string | undefined
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function resolveKeyInput(key: KeyInput): ResolvedKey {
|
|
131
|
-
let keyValue: string
|
|
132
|
-
let keyName: string | undefined
|
|
133
|
-
|
|
134
|
-
if (typeof key === "string") {
|
|
135
|
-
if (key in KeyCodes) {
|
|
136
|
-
// It's a KeyCode name like "BACKSPACE", "ARROW_UP", etc.
|
|
137
|
-
keyValue = KeyCodes[key as keyof typeof KeyCodes]
|
|
138
|
-
keyName = key.toLowerCase()
|
|
139
|
-
} else {
|
|
140
|
-
// It's a regular character
|
|
141
|
-
keyValue = key
|
|
142
|
-
keyName = undefined
|
|
143
|
-
}
|
|
144
|
-
} else {
|
|
145
|
-
// It's already a keycode enum value
|
|
146
|
-
keyValue = KeyCodes[key]
|
|
147
|
-
if (!keyValue) {
|
|
148
|
-
throw new Error(`Unknown key: ${key}`)
|
|
149
|
-
}
|
|
150
|
-
keyName = String(key).toLowerCase()
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return { keyValue, keyName }
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export function createMockKeys(renderer: CliRenderer, options?: MockKeysOptions) {
|
|
157
|
-
const useKittyKeyboard = options?.kittyKeyboard ?? false
|
|
158
|
-
const useOtherModifiersMode = options?.otherModifiersMode ?? false
|
|
159
|
-
|
|
160
|
-
// Kitty keyboard takes precedence over otherModifiersMode
|
|
161
|
-
const effectiveOtherModifiersMode = useOtherModifiersMode && !useKittyKeyboard
|
|
162
|
-
|
|
163
|
-
const pressKeys = async (keys: KeyInput[], delayMs: number = 0): Promise<void> => {
|
|
164
|
-
for (const key of keys) {
|
|
165
|
-
const { keyValue: keyCode } = resolveKeyInput(key)
|
|
166
|
-
|
|
167
|
-
renderer.stdin.emit("data", Buffer.from(keyCode))
|
|
168
|
-
|
|
169
|
-
if (delayMs > 0) {
|
|
170
|
-
await new Promise((resolve) => setTimeout(resolve, delayMs))
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const pressKey = (
|
|
176
|
-
key: KeyInput,
|
|
177
|
-
modifiers?: { shift?: boolean; ctrl?: boolean; meta?: boolean; super?: boolean; hyper?: boolean },
|
|
178
|
-
): void => {
|
|
179
|
-
// Handle Kitty keyboard protocol mode
|
|
180
|
-
if (useKittyKeyboard) {
|
|
181
|
-
// Resolve the key to its string representation or keycode value
|
|
182
|
-
let { keyValue, keyName } = resolveKeyInput(key)
|
|
183
|
-
|
|
184
|
-
// Map control characters and escape sequences to their kitty key names
|
|
185
|
-
const valueToKeyNameMap: Record<string, string> = {
|
|
186
|
-
"\b": "backspace",
|
|
187
|
-
"\r": "return",
|
|
188
|
-
"\n": "return",
|
|
189
|
-
"\t": "tab",
|
|
190
|
-
"\x1b": "escape",
|
|
191
|
-
"\x1b[A": "up",
|
|
192
|
-
"\x1b[B": "down",
|
|
193
|
-
"\x1b[C": "right",
|
|
194
|
-
"\x1b[D": "left",
|
|
195
|
-
"\x1b[H": "home",
|
|
196
|
-
"\x1b[F": "end",
|
|
197
|
-
"\x1b[3~": "delete",
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Check value mapping
|
|
201
|
-
if (keyValue && valueToKeyNameMap[keyValue]) {
|
|
202
|
-
keyName = valueToKeyNameMap[keyValue]
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Also check for ARROW_ prefix
|
|
206
|
-
if (keyName && keyName.startsWith("arrow_")) {
|
|
207
|
-
keyName = keyName.substring(6) // Remove "arrow_" prefix
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Check if we have a direct kitty code mapping
|
|
211
|
-
if (keyName && kittyKeyCodeMap[keyName]) {
|
|
212
|
-
const kittyCode = kittyKeyCodeMap[keyName]
|
|
213
|
-
const sequence = encodeKittySequence(kittyCode, modifiers)
|
|
214
|
-
renderer.stdin.emit("data", Buffer.from(sequence))
|
|
215
|
-
return
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// For regular characters, get the codepoint
|
|
219
|
-
if (keyValue && keyValue.length === 1 && !keyValue.startsWith("\x1b")) {
|
|
220
|
-
const codepoint = keyValue.codePointAt(0)
|
|
221
|
-
if (codepoint) {
|
|
222
|
-
const sequence = encodeKittySequence(codepoint, modifiers)
|
|
223
|
-
renderer.stdin.emit("data", Buffer.from(sequence))
|
|
224
|
-
return
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// Fall through to regular mode for unknown keys
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Handle modifyOtherKeys mode (CSI u protocol variant)
|
|
232
|
-
// Used by xterm, iTerm2, Ghostty with modifyOtherKeys enabled
|
|
233
|
-
if (effectiveOtherModifiersMode && modifiers) {
|
|
234
|
-
// Resolve the key to its string representation or keycode value
|
|
235
|
-
let { keyValue, keyName } = resolveKeyInput(key)
|
|
236
|
-
|
|
237
|
-
// Map control characters and escape sequences to their char codes
|
|
238
|
-
const valueToCharCodeMap: Record<string, number> = {
|
|
239
|
-
"\b": 127, // backspace (or 8, but 127 is more common)
|
|
240
|
-
"\r": 13, // return
|
|
241
|
-
"\n": 13, // linefeed -> return
|
|
242
|
-
"\t": 9, // tab
|
|
243
|
-
"\x1b": 27, // escape
|
|
244
|
-
" ": 32, // space
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Check if we have a control character that needs modifyOtherKeys encoding
|
|
248
|
-
let charCode: number | undefined
|
|
249
|
-
|
|
250
|
-
if (keyValue && valueToCharCodeMap[keyValue] !== undefined) {
|
|
251
|
-
charCode = valueToCharCodeMap[keyValue]
|
|
252
|
-
} else if (keyValue && keyValue.length === 1 && !keyValue.startsWith("\x1b")) {
|
|
253
|
-
// For regular single characters
|
|
254
|
-
charCode = keyValue.charCodeAt(0)
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// If we have a char code and modifiers, use modifyOtherKeys format
|
|
258
|
-
if (charCode !== undefined) {
|
|
259
|
-
const sequence = encodeModifyOtherKeysSequence(charCode, modifiers)
|
|
260
|
-
renderer.stdin.emit("data", Buffer.from(sequence))
|
|
261
|
-
return
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// For other keys (like arrow keys with modifiers), fall through to regular mode
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Regular (non-Kitty, non-modifyOtherKeys) mode
|
|
268
|
-
let keyCode = resolveKeyInput(key).keyValue
|
|
269
|
-
|
|
270
|
-
// Apply modifiers if present
|
|
271
|
-
if (modifiers) {
|
|
272
|
-
// For arrow keys and special keys, modify the escape sequence
|
|
273
|
-
if (keyCode.startsWith("\x1b[") && keyCode.length > 2) {
|
|
274
|
-
// Arrow keys: \x1b[A, \x1b[B, \x1b[C, \x1b[D
|
|
275
|
-
// With shift modifier: \x1b[1;2A, \x1b[1;2B, \x1b[1;2C, \x1b[1;2D
|
|
276
|
-
// Special keys like delete: \x1b[3~ becomes \x1b[3;2~ with meta
|
|
277
|
-
const modifier =
|
|
278
|
-
1 +
|
|
279
|
-
(modifiers.shift ? 1 : 0) +
|
|
280
|
-
(modifiers.meta ? 2 : 0) +
|
|
281
|
-
(modifiers.ctrl ? 4 : 0) +
|
|
282
|
-
(modifiers.super ? 8 : 0) +
|
|
283
|
-
(modifiers.hyper ? 16 : 0)
|
|
284
|
-
if (modifier > 1) {
|
|
285
|
-
// Check if it's a sequence like \x1b[3~ (delete, insert, pageup, etc.)
|
|
286
|
-
const tildeMatch = keyCode.match(/^\x1b\[(\d+)~$/)
|
|
287
|
-
if (tildeMatch) {
|
|
288
|
-
// Format: \x1b[number;modifier~
|
|
289
|
-
keyCode = `\x1b[${tildeMatch[1]};${modifier}~`
|
|
290
|
-
} else {
|
|
291
|
-
// Arrow keys and other single-letter endings
|
|
292
|
-
// Insert modifier into sequence
|
|
293
|
-
const ending = keyCode.slice(-1)
|
|
294
|
-
keyCode = `\x1b[1;${modifier}${ending}`
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
} else if (keyCode.length === 1) {
|
|
298
|
-
// For regular characters and single-char control codes with modifiers
|
|
299
|
-
let char = keyCode
|
|
300
|
-
|
|
301
|
-
// Shift+Tab produces the back-tab escape sequence \x1b[Z in standard ANSI terminals
|
|
302
|
-
if (char === "\t" && modifiers.shift) {
|
|
303
|
-
// Build the base as \x1b[Z, then apply meta prefix if also pressed
|
|
304
|
-
keyCode = modifiers.meta ? "\x1b\x1b[Z" : "\x1b[Z"
|
|
305
|
-
renderer.stdin.emit("data", Buffer.from(keyCode))
|
|
306
|
-
return
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// Special handling for backspace with modifiers - use modifyOtherKeys format
|
|
310
|
-
// Terminals send Ctrl+Backspace as CSI 27;5;127~ (or CSI 27;5;8~)
|
|
311
|
-
// Only use modifyOtherKeys for ctrl, super, or hyper (not shift or meta alone)
|
|
312
|
-
if (char === "\b" && (modifiers.ctrl || modifiers.super || modifiers.hyper)) {
|
|
313
|
-
const modifier =
|
|
314
|
-
1 +
|
|
315
|
-
(modifiers.shift ? 1 : 0) +
|
|
316
|
-
(modifiers.meta ? 2 : 0) +
|
|
317
|
-
(modifiers.ctrl ? 4 : 0) +
|
|
318
|
-
(modifiers.super ? 8 : 0) +
|
|
319
|
-
(modifiers.hyper ? 16 : 0)
|
|
320
|
-
// Use charcode 127 for backspace (DEL)
|
|
321
|
-
keyCode = `\x1b[27;${modifier};127~`
|
|
322
|
-
} else if (modifiers.ctrl) {
|
|
323
|
-
// Handle ctrl modifier for characters
|
|
324
|
-
// Ctrl+letter produces control codes (0x01-0x1a for a-z)
|
|
325
|
-
if (char >= "a" && char <= "z") {
|
|
326
|
-
keyCode = String.fromCharCode(char.charCodeAt(0) - 96)
|
|
327
|
-
} else if (char >= "A" && char <= "Z") {
|
|
328
|
-
keyCode = String.fromCharCode(char.charCodeAt(0) - 64)
|
|
329
|
-
} else {
|
|
330
|
-
// Handle special characters with ctrl modifier
|
|
331
|
-
// These produce ASCII control codes
|
|
332
|
-
const specialCtrlMap: Record<string, string> = {
|
|
333
|
-
"[": "\x1b", // Ctrl+[ = ESC (ASCII 27)
|
|
334
|
-
"\\": "\x1c", // Ctrl+\ = FS (ASCII 28)
|
|
335
|
-
"]": "\x1d", // Ctrl+] = GS (ASCII 29)
|
|
336
|
-
"^": "\x1e", // Ctrl+^ = RS (ASCII 30)
|
|
337
|
-
_: "\x1f", // Ctrl+_ = US (ASCII 31)
|
|
338
|
-
"?": "\x7f", // Ctrl+? = DEL (ASCII 127)
|
|
339
|
-
// Common aliases
|
|
340
|
-
"/": "\x1f", // Ctrl+/ = US (ASCII 31, same as Ctrl+_)
|
|
341
|
-
"-": "\x1f", // Ctrl+- = US (ASCII 31, same as Ctrl+_)
|
|
342
|
-
".": "\x1e", // Ctrl+. = RS (ASCII 30, same as Ctrl+^)
|
|
343
|
-
",": "\x1c", // Ctrl+, = FS (ASCII 28, same as Ctrl+\)
|
|
344
|
-
"@": "\x00", // Ctrl+@ = NUL (ASCII 0)
|
|
345
|
-
" ": "\x00", // Ctrl+Space = NUL (ASCII 0)
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (char in specialCtrlMap) {
|
|
349
|
-
keyCode = specialCtrlMap[char]
|
|
350
|
-
}
|
|
351
|
-
// If no mapping found, keep the original character
|
|
352
|
-
}
|
|
353
|
-
// If meta is also pressed, prefix with escape
|
|
354
|
-
if (modifiers.meta) {
|
|
355
|
-
keyCode = `\x1b${keyCode}`
|
|
356
|
-
}
|
|
357
|
-
} else {
|
|
358
|
-
// Handle shift+meta or just meta
|
|
359
|
-
if (modifiers.shift && char >= "a" && char <= "z") {
|
|
360
|
-
char = char.toUpperCase()
|
|
361
|
-
}
|
|
362
|
-
if (modifiers.meta) {
|
|
363
|
-
// For meta+character (including control codes), prefix with escape
|
|
364
|
-
keyCode = `\x1b${char}`
|
|
365
|
-
} else {
|
|
366
|
-
keyCode = char
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
} else if (modifiers.meta && !keyCode.startsWith("\x1b")) {
|
|
370
|
-
// For multi-char sequences that aren't escape sequences (like simple control codes)
|
|
371
|
-
// just prefix with escape for meta
|
|
372
|
-
keyCode = `\x1b${keyCode}`
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
renderer.stdin.emit("data", Buffer.from(keyCode))
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
const typeText = async (text: string, delayMs: number = 0): Promise<void> => {
|
|
380
|
-
const keys = text.split("")
|
|
381
|
-
await pressKeys(keys, delayMs)
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const pressReturn = (modifiers?: {
|
|
385
|
-
shift?: boolean
|
|
386
|
-
ctrl?: boolean
|
|
387
|
-
meta?: boolean
|
|
388
|
-
super?: boolean
|
|
389
|
-
hyper?: boolean
|
|
390
|
-
}): void => {
|
|
391
|
-
pressKey(KeyCodes.RETURN, modifiers)
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
const pressEscape = (modifiers?: {
|
|
395
|
-
shift?: boolean
|
|
396
|
-
ctrl?: boolean
|
|
397
|
-
meta?: boolean
|
|
398
|
-
super?: boolean
|
|
399
|
-
hyper?: boolean
|
|
400
|
-
}): void => {
|
|
401
|
-
pressKey(KeyCodes.ESCAPE, modifiers)
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
const pressTab = (modifiers?: {
|
|
405
|
-
shift?: boolean
|
|
406
|
-
ctrl?: boolean
|
|
407
|
-
meta?: boolean
|
|
408
|
-
super?: boolean
|
|
409
|
-
hyper?: boolean
|
|
410
|
-
}): void => {
|
|
411
|
-
pressKey(KeyCodes.TAB, modifiers)
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
const pressBackspace = (modifiers?: {
|
|
415
|
-
shift?: boolean
|
|
416
|
-
ctrl?: boolean
|
|
417
|
-
meta?: boolean
|
|
418
|
-
super?: boolean
|
|
419
|
-
hyper?: boolean
|
|
420
|
-
}): void => {
|
|
421
|
-
pressKey(KeyCodes.BACKSPACE, modifiers)
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
const pressArrow = (
|
|
425
|
-
direction: "up" | "down" | "left" | "right",
|
|
426
|
-
modifiers?: { shift?: boolean; ctrl?: boolean; meta?: boolean; super?: boolean; hyper?: boolean },
|
|
427
|
-
): void => {
|
|
428
|
-
const keyMap = {
|
|
429
|
-
up: KeyCodes.ARROW_UP,
|
|
430
|
-
down: KeyCodes.ARROW_DOWN,
|
|
431
|
-
left: KeyCodes.ARROW_LEFT,
|
|
432
|
-
right: KeyCodes.ARROW_RIGHT,
|
|
433
|
-
}
|
|
434
|
-
pressKey(keyMap[direction], modifiers)
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
const pressCtrlC = (): void => {
|
|
438
|
-
pressKey("c", { ctrl: true })
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
const pasteBracketedText = (text: string): Promise<void> => {
|
|
442
|
-
return pressKeys([ANSI.bracketedPasteStart, text, ANSI.bracketedPasteEnd])
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
return {
|
|
446
|
-
pressKeys,
|
|
447
|
-
pressKey,
|
|
448
|
-
typeText,
|
|
449
|
-
pressEnter: pressReturn,
|
|
450
|
-
pressEscape,
|
|
451
|
-
pressTab,
|
|
452
|
-
pressBackspace,
|
|
453
|
-
pressArrow,
|
|
454
|
-
pressCtrlC,
|
|
455
|
-
pasteBracketedText,
|
|
456
|
-
}
|
|
457
|
-
}
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from "bun:test"
|
|
2
|
-
import { createMockMouse, MouseButtons } from "./mock-mouse.js"
|
|
3
|
-
import { PassThrough } from "stream"
|
|
4
|
-
|
|
5
|
-
class MockRenderer {
|
|
6
|
-
public stdin: PassThrough
|
|
7
|
-
public emittedData: Buffer[] = []
|
|
8
|
-
|
|
9
|
-
constructor() {
|
|
10
|
-
this.stdin = new PassThrough()
|
|
11
|
-
|
|
12
|
-
this.stdin.on("data", (chunk: Buffer) => {
|
|
13
|
-
this.emittedData.push(chunk)
|
|
14
|
-
})
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
getEmittedData(): string {
|
|
18
|
-
return Buffer.concat(this.emittedData).toString()
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
getLastEmittedData(): string {
|
|
22
|
-
return this.emittedData.length > 0 ? this.emittedData[this.emittedData.length - 1].toString() : ""
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
describe("mock-mouse", () => {
|
|
27
|
-
test("click generates correct mouse events", async () => {
|
|
28
|
-
const mockRenderer = new MockRenderer()
|
|
29
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
30
|
-
|
|
31
|
-
await mockMouse.click(10, 5)
|
|
32
|
-
|
|
33
|
-
expect(mockRenderer.emittedData).toHaveLength(2)
|
|
34
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<0;11;6M") // down event
|
|
35
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<0;11;6m") // up event
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
test("click with different button", async () => {
|
|
39
|
-
const mockRenderer = new MockRenderer()
|
|
40
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
41
|
-
|
|
42
|
-
await mockMouse.click(10, 5, MouseButtons.RIGHT)
|
|
43
|
-
|
|
44
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<2;11;6M") // right button down
|
|
45
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<2;11;6m") // right button up
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
test("click with modifiers", async () => {
|
|
49
|
-
const mockRenderer = new MockRenderer()
|
|
50
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
51
|
-
|
|
52
|
-
await mockMouse.click(10, 5, MouseButtons.LEFT, { modifiers: { ctrl: true, shift: true } })
|
|
53
|
-
|
|
54
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<20;11;6M") // 0 + 16 (ctrl) + 4 (shift) = 20
|
|
55
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<20;11;6m")
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
test("moveTo generates move event", async () => {
|
|
59
|
-
const mockRenderer = new MockRenderer()
|
|
60
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
61
|
-
|
|
62
|
-
await mockMouse.moveTo(15, 8)
|
|
63
|
-
|
|
64
|
-
expect(mockRenderer.getEmittedData()).toBe("\x1b[<35;16;9m") // 32 (motion) + 3 (button 3 for move) = 35
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
test("moveTo with modifiers", async () => {
|
|
68
|
-
const mockRenderer = new MockRenderer()
|
|
69
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
70
|
-
|
|
71
|
-
await mockMouse.moveTo(15, 8, { modifiers: { alt: true } })
|
|
72
|
-
|
|
73
|
-
expect(mockRenderer.getEmittedData()).toBe("\x1b[<43;16;9m") // 32 + 3 + 8 (alt) = 43
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
test("doubleClick generates four events", async () => {
|
|
77
|
-
const mockRenderer = new MockRenderer()
|
|
78
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
79
|
-
|
|
80
|
-
await mockMouse.doubleClick(10, 5)
|
|
81
|
-
|
|
82
|
-
expect(mockRenderer.emittedData).toHaveLength(4)
|
|
83
|
-
// Two down events and two up events
|
|
84
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<0;11;6M")
|
|
85
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<0;11;6m")
|
|
86
|
-
expect(mockRenderer.emittedData[2].toString()).toBe("\x1b[<0;11;6M")
|
|
87
|
-
expect(mockRenderer.emittedData[3].toString()).toBe("\x1b[<0;11;6m")
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
test("pressDown and release work separately", async () => {
|
|
91
|
-
const mockRenderer = new MockRenderer()
|
|
92
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
93
|
-
|
|
94
|
-
await mockMouse.pressDown(10, 5, MouseButtons.MIDDLE)
|
|
95
|
-
await mockMouse.release(10, 5, MouseButtons.MIDDLE)
|
|
96
|
-
|
|
97
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<1;11;6M") // middle button down
|
|
98
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<1;11;6m") // middle button up
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
test("drag generates drag events", async () => {
|
|
102
|
-
const mockRenderer = new MockRenderer()
|
|
103
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
104
|
-
|
|
105
|
-
await mockMouse.drag(10, 5, 20, 10)
|
|
106
|
-
|
|
107
|
-
// Should have: down, several drag events, up
|
|
108
|
-
expect(mockRenderer.emittedData.length).toBeGreaterThan(3)
|
|
109
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<0;11;6M") // initial down
|
|
110
|
-
|
|
111
|
-
// Check that drag events have the motion flag (32)
|
|
112
|
-
for (let i = 1; i < mockRenderer.emittedData.length - 1; i++) {
|
|
113
|
-
const event = mockRenderer.emittedData[i].toString()
|
|
114
|
-
expect(event).toMatch(/\x1b\[<32;\d+;\d+m/) // Should have motion flag (32) and release (m)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const lastEvent = mockRenderer.emittedData[mockRenderer.emittedData.length - 1].toString()
|
|
118
|
-
expect(lastEvent).toBe("\x1b[<0;21;11m") // final up
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
test("scroll events work", async () => {
|
|
122
|
-
const mockRenderer = new MockRenderer()
|
|
123
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
124
|
-
|
|
125
|
-
await mockMouse.scroll(10, 5, "up")
|
|
126
|
-
await mockMouse.scroll(10, 5, "down")
|
|
127
|
-
|
|
128
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<64;11;6M") // wheel up (64 = scroll flag)
|
|
129
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<65;11;6M") // wheel down (64 + 1)
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
test("scroll with modifiers", async () => {
|
|
133
|
-
const mockRenderer = new MockRenderer()
|
|
134
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
135
|
-
|
|
136
|
-
await mockMouse.scroll(10, 5, "left", { modifiers: { shift: true } })
|
|
137
|
-
|
|
138
|
-
expect(mockRenderer.getEmittedData()).toBe("\x1b[<70;11;6M") // 66 (wheel left) + 4 (shift) = 70
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
test("moveTo becomes drag when button is pressed", async () => {
|
|
142
|
-
const mockRenderer = new MockRenderer()
|
|
143
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
144
|
-
|
|
145
|
-
await mockMouse.pressDown(5, 5)
|
|
146
|
-
await mockMouse.moveTo(15, 8)
|
|
147
|
-
|
|
148
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<0;6;6M") // down
|
|
149
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<32;16;9m") // drag (32 = motion flag, no button 3)
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
test("getCurrentPosition tracks position", async () => {
|
|
153
|
-
const mockRenderer = new MockRenderer()
|
|
154
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
155
|
-
|
|
156
|
-
expect(mockMouse.getCurrentPosition()).toEqual({ x: 0, y: 0 })
|
|
157
|
-
|
|
158
|
-
await mockMouse.moveTo(10, 5)
|
|
159
|
-
expect(mockMouse.getCurrentPosition()).toEqual({ x: 10, y: 5 })
|
|
160
|
-
|
|
161
|
-
await mockMouse.click(15, 8)
|
|
162
|
-
expect(mockMouse.getCurrentPosition()).toEqual({ x: 15, y: 8 })
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
test("getPressedButtons tracks button state", async () => {
|
|
166
|
-
const mockRenderer = new MockRenderer()
|
|
167
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
168
|
-
|
|
169
|
-
expect(mockMouse.getPressedButtons()).toEqual([])
|
|
170
|
-
|
|
171
|
-
await mockMouse.pressDown(10, 5, MouseButtons.LEFT)
|
|
172
|
-
expect(mockMouse.getPressedButtons()).toEqual([MouseButtons.LEFT])
|
|
173
|
-
|
|
174
|
-
await mockMouse.pressDown(10, 5, MouseButtons.RIGHT)
|
|
175
|
-
expect(mockMouse.getPressedButtons()).toEqual([MouseButtons.LEFT, MouseButtons.RIGHT])
|
|
176
|
-
|
|
177
|
-
await mockMouse.release(10, 5, MouseButtons.LEFT)
|
|
178
|
-
expect(mockMouse.getPressedButtons()).toEqual([MouseButtons.RIGHT])
|
|
179
|
-
|
|
180
|
-
await mockMouse.release(10, 5, MouseButtons.RIGHT)
|
|
181
|
-
expect(mockMouse.getPressedButtons()).toEqual([])
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
test("delay works correctly", async () => {
|
|
185
|
-
const mockRenderer = new MockRenderer()
|
|
186
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
187
|
-
|
|
188
|
-
const startTime = Date.now()
|
|
189
|
-
await mockMouse.click(10, 5, MouseButtons.LEFT, { delayMs: 20 })
|
|
190
|
-
|
|
191
|
-
expect(Date.now() - startTime).toBeGreaterThanOrEqual(15) // Allow some tolerance
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
test("coordinates are 1-based in ANSI output", async () => {
|
|
195
|
-
const mockRenderer = new MockRenderer()
|
|
196
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
197
|
-
|
|
198
|
-
await mockMouse.click(0, 0) // 0-based coordinates
|
|
199
|
-
|
|
200
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<0;1;1M") // 1-based in ANSI
|
|
201
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<0;1;1m")
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
test("all scroll directions work", async () => {
|
|
205
|
-
const mockRenderer = new MockRenderer()
|
|
206
|
-
const mockMouse = createMockMouse(mockRenderer as any)
|
|
207
|
-
|
|
208
|
-
await mockMouse.scroll(10, 5, "up")
|
|
209
|
-
await mockMouse.scroll(10, 5, "down")
|
|
210
|
-
await mockMouse.scroll(10, 5, "left")
|
|
211
|
-
await mockMouse.scroll(10, 5, "right")
|
|
212
|
-
|
|
213
|
-
expect(mockRenderer.emittedData[0].toString()).toBe("\x1b[<64;11;6M") // up
|
|
214
|
-
expect(mockRenderer.emittedData[1].toString()).toBe("\x1b[<65;11;6M") // down
|
|
215
|
-
expect(mockRenderer.emittedData[2].toString()).toBe("\x1b[<66;11;6M") // left
|
|
216
|
-
expect(mockRenderer.emittedData[3].toString()).toBe("\x1b[<67;11;6M") // right
|
|
217
|
-
})
|
|
218
|
-
})
|