diff --git a/.changeset/complete-synthetic-key-events.md b/.changeset/complete-synthetic-key-events.md new file mode 100644 index 000000000..e9c53bfb0 --- /dev/null +++ b/.changeset/complete-synthetic-key-events.md @@ -0,0 +1,5 @@ +--- +"hunkdiff": patch +--- + +Provide complete key event data to command matchers and programmatically invoked handlers. diff --git a/src/lib/commandKeys.test.ts b/src/lib/commandKeys.test.ts index 121d849f0..5ca3b68bb 100644 --- a/src/lib/commandKeys.test.ts +++ b/src/lib/commandKeys.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from "bun:test"; +import { KeyEvent } from "@opentui/core"; import { matchesKeyChord, parseKeyChord, synthesizeKeyEvent, toKeyChordList } from "./commandKeys"; /** @@ -23,6 +24,25 @@ describe("synthesizeKeyEvent", () => { expect(matchesKeyChord(parsed(chord), synthesizeKeyEvent(parsed(chord)))).toBe(true); } }); + + test("returns a complete key event", () => { + const event = synthesizeKeyEvent(parsed("ctrl+r")); + + expect(event).toBeInstanceOf(KeyEvent); + expect({ eventType: event.eventType, source: event.source }).toEqual({ + eventType: "press", + source: "raw", + }); + event.preventDefault(); + event.stopPropagation(); + expect({ + defaultPrevented: event.defaultPrevented, + propagationStopped: event.propagationStopped, + }).toEqual({ + defaultPrevented: true, + propagationStopped: true, + }); + }); }); describe("toKeyChordList", () => { diff --git a/src/lib/commandKeys.ts b/src/lib/commandKeys.ts index 65c9143f7..f01665651 100644 --- a/src/lib/commandKeys.ts +++ b/src/lib/commandKeys.ts @@ -1,4 +1,4 @@ -import type { KeyEvent } from "@opentui/core"; +import { KeyEvent } from "@opentui/core"; import { matchesKeyChord, parseKeyChord, type ParsedKeyChord } from "../extension-api/keys"; /** @@ -39,7 +39,7 @@ export function synthesizeKeyEvent(parsed: ParsedKeyChord): KeyEvent { ? parsed.base.toUpperCase() : parsed.base; - return { + return new KeyEvent({ name: isNamed || isLetter ? parsed.base : sequence, sequence, raw: sequence, @@ -48,9 +48,9 @@ export function synthesizeKeyEvent(parsed: ParsedKeyChord): KeyEvent { option: parsed.option, shift: parsed.shift, number: false, - preventDefault: () => {}, - stopPropagation: () => {}, - } as unknown as KeyEvent; + eventType: "press", + source: "raw", + }); } /**