import { assert, it } from "@effect/vitest"; import * as Schema from "effect/Schema"; import * as Effect from "effect/Effect"; import { KeybindingsConfig, KeybindingRule, ResolvedKeybindingRule, ResolvedKeybindingsConfig, } from "./keybindings.ts"; const decode = ( schema: S, input: unknown, ): Effect.Effect, Schema.SchemaError, never> => Schema.decodeUnknownEffect(schema as never)(input) as Effect.Effect< Schema.Schema.Type, Schema.SchemaError, never >; const decodeResolvedRule = Schema.decodeUnknownEffect(ResolvedKeybindingRule as never); it.effect("parses keybinding rules", () => Effect.gen(function* () { const parsed = yield* decode(KeybindingRule, { key: "mod+j", command: "terminal.toggle", }); assert.strictEqual(parsed.command, "terminal.toggle"); const parsedRightPanelToggle = yield* decode(KeybindingRule, { key: "mod+alt+b", command: "rightPanel.toggle", }); assert.strictEqual(parsedRightPanelToggle.command, "rightPanel.toggle"); const parsedClose = yield* decode(KeybindingRule, { key: "mod+w", command: "terminal.close", }); assert.strictEqual(parsedClose.command, "terminal.close"); const parsedDiffToggle = yield* decode(KeybindingRule, { key: "mod+d", command: "diff.toggle", }); assert.strictEqual(parsedDiffToggle.command, "diff.toggle"); const parsedCommandPalette = yield* decode(KeybindingRule, { key: "mod+k", command: "commandPalette.toggle", }); assert.strictEqual(parsedCommandPalette.command, "commandPalette.toggle"); const parsedLocal = yield* decode(KeybindingRule, { key: "mod+shift+n", command: "chat.newLocal", }); assert.strictEqual(parsedLocal.command, "chat.newLocal"); const parsedModelPickerToggle = yield* decode(KeybindingRule, { key: "mod+shift+m", command: "modelPicker.toggle", }); assert.strictEqual(parsedModelPickerToggle.command, "modelPicker.toggle"); const parsedModelPickerJump = yield* decode(KeybindingRule, { key: "mod+1", command: "modelPicker.jump.1", }); assert.strictEqual(parsedModelPickerJump.command, "modelPicker.jump.1"); const parsedThreadPrevious = yield* decode(KeybindingRule, { key: "mod+shift+[", command: "thread.previous", }); assert.strictEqual(parsedThreadPrevious.command, "thread.previous"); }), ); it.effect("rejects invalid command values", () => Effect.gen(function* () { const result = yield* Effect.exit( decode(KeybindingRule, { key: "mod+j", command: "script.Test.run", }), ); assert.strictEqual(result._tag, "Failure"); }), ); it.effect("accepts dynamic script run commands", () => Effect.gen(function* () { const parsed = yield* decode(KeybindingRule, { key: "mod+r", command: "script.setup.run", }); assert.strictEqual(parsed.command, "script.setup.run"); }), ); it.effect("parses keybindings array payload", () => Effect.gen(function* () { const parsed = yield* decode(KeybindingsConfig, [ { key: "mod+j", command: "terminal.toggle" }, { key: "mod+d", command: "terminal.split", when: "terminalFocus" }, { key: "mod+shift+d", command: "terminal.splitVertical", when: "terminalFocus" }, ]); assert.lengthOf(parsed, 3); }), ); it.effect("parses resolved keybinding rules", () => Effect.gen(function* () { const parsed = yield* decode(ResolvedKeybindingRule, { command: "terminal.split", shortcut: { key: "d", metaKey: false, ctrlKey: false, shiftKey: false, altKey: false, modKey: true, }, whenAst: { type: "and", left: { type: "identifier", name: "terminalOpen" }, right: { type: "not", node: { type: "identifier", name: "terminalFocus" }, }, }, }); assert.strictEqual(parsed.shortcut.key, "d"); }), ); it.effect("parses resolved keybindings arrays", () => Effect.gen(function* () { const parsed = yield* decode(ResolvedKeybindingsConfig, [ { command: "terminal.toggle", shortcut: { key: "j", metaKey: false, ctrlKey: false, shiftKey: false, altKey: false, modKey: true, }, }, { command: "thread.jump.3", shortcut: { key: "3", metaKey: false, ctrlKey: false, shiftKey: false, altKey: false, modKey: true, }, }, ]); assert.lengthOf(parsed, 2); }), ); it.effect("drops unknown fields in resolved keybinding rules", () => decodeResolvedRule({ command: "terminal.toggle", shortcut: { key: "j", metaKey: false, ctrlKey: false, shiftKey: false, altKey: false, modKey: true, }, key: "mod+j", }).pipe( Effect.map((parsed) => { const view = parsed as Record; assert.strictEqual("key" in view, false); assert.strictEqual(view.command, "terminal.toggle"); }), ), );