@opentui/keymap 0.2.2 → 0.2.3
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/README.md +56 -32
- package/chunks/index-frk6sdcd.js +409 -0
- package/chunks/index-frk6sdcd.js.map +14 -0
- package/package.json +17 -7
- package/src/addons/index.js +511 -4870
- package/src/addons/index.js.map +25 -0
- package/src/addons/opentui/edit-buffer-bindings.d.ts +6 -2
- package/src/addons/opentui/index.d.ts +2 -2
- package/src/addons/opentui/index.js +101 -5515
- package/src/addons/opentui/index.js.map +12 -0
- package/src/addons/universal/dead-bindings.d.ts +1 -1
- package/src/addons/universal/default-parser.d.ts +2 -2
- package/src/addons/universal/ex-commands.d.ts +11 -8
- package/src/addons/universal/index.d.ts +2 -1
- package/src/addons/universal/leader.d.ts +1 -1
- package/src/addons/universal/metadata.d.ts +2 -2
- package/src/addons/universal/mod-bindings.d.ts +6 -0
- package/src/addons/universal/unresolved-commands.d.ts +1 -1
- package/src/extras/binding-sections.d.ts +4 -4
- package/src/extras/command-bindings.d.ts +2 -2
- package/src/extras/formatting.d.ts +3 -0
- package/src/extras/graph.d.ts +9 -0
- package/src/extras/graph.js +373 -0
- package/src/extras/graph.js.map +11 -0
- package/src/extras/index.js +13 -0
- package/src/extras/index.js.map +12 -0
- package/src/extras/lib/graph-snapshot.d.ts +14 -0
- package/src/extras/lib/graph-types.d.ts +83 -0
- package/src/html.d.ts +3 -3
- package/src/html.js +47 -4992
- package/src/html.js.map +10 -0
- package/src/index.d.ts +3 -1
- package/src/index.js +2688 -2807
- package/src/index.js.map +34 -0
- package/src/keymap.d.ts +17 -33
- package/src/lib/emitter.d.ts +1 -2
- package/src/lib/registry.d.ts +2 -2
- package/src/lib/runtime-utils.d.ts +34 -0
- package/src/opentui.d.ts +1 -3
- package/src/opentui.js +40 -4994
- package/src/opentui.js.map +10 -0
- package/src/react/index.d.ts +5 -19
- package/src/react/index.js +3 -0
- package/src/react/index.js.map +10 -0
- package/src/runtime-modules.d.ts +2 -0
- package/src/runtime-modules.js +5 -0
- package/src/runtime-modules.js.map +10 -0
- package/src/services/activation.d.ts +7 -33
- package/src/services/active-key-cache.d.ts +29 -0
- package/src/services/command-catalog.d.ts +27 -52
- package/src/services/command-executor.d.ts +6 -12
- package/src/services/compiler.d.ts +4 -12
- package/src/services/conditions.d.ts +4 -16
- package/src/services/dispatch-decisions.d.ts +21 -0
- package/src/services/dispatch-patterns.d.ts +5 -0
- package/src/services/dispatch.d.ts +6 -42
- package/src/services/environment.d.ts +6 -24
- package/src/services/extension-context.d.ts +16 -0
- package/src/services/layer-diagnostics.d.ts +10 -0
- package/src/services/layers.d.ts +15 -24
- package/src/services/notify.d.ts +6 -8
- package/src/services/pending-sequence.d.ts +4 -0
- package/src/services/primitives/active-layers.d.ts +2 -3
- package/src/services/primitives/bindings.d.ts +4 -0
- package/src/services/primitives/field-invariants.d.ts +16 -1
- package/src/services/primitives/pending-captures.d.ts +5 -0
- package/src/services/runtime-view.d.ts +5 -0
- package/src/services/runtime.d.ts +2 -7
- package/src/services/sequence-index.d.ts +24 -0
- package/src/services/state.d.ts +46 -92
- package/src/solid/index.d.ts +5 -19
- package/src/solid/index.js +3 -0
- package/src/solid/index.js.map +10 -0
- package/src/testing/index.d.ts +90 -0
- package/src/testing/index.js +276 -0
- package/src/testing/index.js.map +10 -0
- package/src/types.d.ts +180 -128
- package/src/services/primitives/binding-inputs.d.ts +0 -4
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/addons/opentui/index.ts", "../src/addons/opentui/base-layout.ts", "../src/addons/opentui/edit-buffer-bindings.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export * from \"@opentui/keymap/addons\"\nexport { registerBaseLayoutFallback } from \"./base-layout.js\"\nexport {\n createTextareaBindings,\n registerEditBufferCommands,\n registerManagedTextareaLayer,\n registerTextareaMappingSuspension,\n} from \"./edit-buffer-bindings.js\"\nexport type { EditBufferCommandName, EditBufferCommandOptions, EditBufferFineGroup } from \"./edit-buffer-bindings.js\"\n",
|
|
6
|
+
"import type { KeyEvent, Renderable } from \"@opentui/core\"\nimport type { Keymap } from \"../../index.js\"\n\nconst BASE_LAYOUT_FALLBACK_RESOURCE = Symbol(\"keymap:base-layout-fallback\")\n\nfunction getBaseLayoutKeyName(baseCode: number | undefined): string | undefined {\n if (baseCode === undefined || baseCode < 32 || baseCode === 127) {\n return undefined\n }\n\n try {\n const name = String.fromCodePoint(baseCode)\n\n if (name.length === 1 && name >= \"A\" && name <= \"Z\") {\n return name.toLowerCase()\n }\n\n return name\n } catch {\n return undefined\n }\n}\n\n/**\n * Falls back to the event's base layout code so bindings can ignore active\n * keyboard layout changes.\n */\nexport function registerBaseLayoutFallback(keymap: Keymap<Renderable, KeyEvent>): () => void {\n return keymap.acquireResource(BASE_LAYOUT_FALLBACK_RESOURCE, () => {\n return keymap.appendEventMatchResolver((event, ctx) => {\n const name = getBaseLayoutKeyName(event.baseCode)\n if (!name) {\n return undefined\n }\n\n return [\n ctx.resolveKey({\n name,\n ctrl: event.ctrl,\n shift: event.shift,\n meta: event.meta,\n super: event.super ?? false,\n hyper: event.hyper || undefined,\n }),\n ]\n })\n })\n}\n",
|
|
7
|
+
"import {\n CliRenderEvents,\n InputRenderable,\n TextareaRenderable,\n defaultTextareaKeyBindings,\n type CliRenderer,\n type EditBufferRenderable,\n type KeyEvent,\n type Renderable,\n type TextareaAction,\n} from \"@opentui/core\"\nimport type { Binding, Bindings, Command, Keymap, Layer } from \"../../index.js\"\n\ninterface KeyBindingLike {\n name: string\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n}\n\nfunction keyBindingToString(binding: KeyBindingLike): string {\n const parts: string[] = []\n\n if (binding.ctrl) parts.push(\"ctrl\")\n if (binding.shift) parts.push(\"shift\")\n if (binding.meta) parts.push(\"meta\")\n if (binding.super) parts.push(\"super\")\n\n parts.push(binding.name)\n\n return parts.join(\"+\")\n}\n\nconst editBufferActions = [\n \"move-left\",\n \"move-right\",\n \"move-up\",\n \"move-down\",\n \"select-left\",\n \"select-right\",\n \"select-up\",\n \"select-down\",\n \"line-home\",\n \"line-end\",\n \"select-line-home\",\n \"select-line-end\",\n \"visual-line-home\",\n \"visual-line-end\",\n \"select-visual-line-home\",\n \"select-visual-line-end\",\n \"buffer-home\",\n \"buffer-end\",\n \"select-buffer-home\",\n \"select-buffer-end\",\n \"delete-line\",\n \"delete-to-line-end\",\n \"delete-to-line-start\",\n \"backspace\",\n \"delete\",\n \"newline\",\n \"undo\",\n \"redo\",\n \"word-forward\",\n \"word-backward\",\n \"select-word-forward\",\n \"select-word-backward\",\n \"delete-word-forward\",\n \"delete-word-backward\",\n \"select-all\",\n \"submit\",\n] as const satisfies readonly TextareaAction[]\n\nexport type EditBufferCommandName = (typeof editBufferActions)[number]\n\nexport type EditBufferFineGroup = \"Cursor\" | \"Selection\" | \"Delete\" | \"History\" | \"Insert\" | \"Submit\"\n\nconst DEFAULT_EDIT_BUFFER_METADATA_GROUP = \"Text Editing\"\n\nconst editBufferCommandNames = {\n \"move-left\": \"input.move.left\",\n \"move-right\": \"input.move.right\",\n \"move-up\": \"input.move.up\",\n \"move-down\": \"input.move.down\",\n \"select-left\": \"input.select.left\",\n \"select-right\": \"input.select.right\",\n \"select-up\": \"input.select.up\",\n \"select-down\": \"input.select.down\",\n \"line-home\": \"input.line.home\",\n \"line-end\": \"input.line.end\",\n \"select-line-home\": \"input.select.line.home\",\n \"select-line-end\": \"input.select.line.end\",\n \"visual-line-home\": \"input.visual.line.home\",\n \"visual-line-end\": \"input.visual.line.end\",\n \"select-visual-line-home\": \"input.select.visual.line.home\",\n \"select-visual-line-end\": \"input.select.visual.line.end\",\n \"buffer-home\": \"input.buffer.home\",\n \"buffer-end\": \"input.buffer.end\",\n \"select-buffer-home\": \"input.select.buffer.home\",\n \"select-buffer-end\": \"input.select.buffer.end\",\n \"delete-line\": \"input.delete.line\",\n \"delete-to-line-end\": \"input.delete.to.line.end\",\n \"delete-to-line-start\": \"input.delete.to.line.start\",\n backspace: \"input.backspace\",\n delete: \"input.delete\",\n newline: \"input.newline\",\n undo: \"input.undo\",\n redo: \"input.redo\",\n \"word-forward\": \"input.word.forward\",\n \"word-backward\": \"input.word.backward\",\n \"select-word-forward\": \"input.select.word.forward\",\n \"select-word-backward\": \"input.select.word.backward\",\n \"delete-word-forward\": \"input.delete.word.forward\",\n \"delete-word-backward\": \"input.delete.word.backward\",\n \"select-all\": \"input.select.all\",\n submit: \"input.submit\",\n} as const satisfies Record<EditBufferCommandName, string>\n\nconst editBufferCommandDescriptions = {\n \"move-left\": \"Cursor left\",\n \"move-right\": \"Cursor right\",\n \"move-up\": \"Cursor up\",\n \"move-down\": \"Cursor down\",\n \"select-left\": \"Select left\",\n \"select-right\": \"Select right\",\n \"select-up\": \"Select up\",\n \"select-down\": \"Select down\",\n \"line-home\": \"Line start\",\n \"line-end\": \"Line end\",\n \"select-line-home\": \"Select to line start\",\n \"select-line-end\": \"Select to line end\",\n \"visual-line-home\": \"Visual line start\",\n \"visual-line-end\": \"Visual line end\",\n \"select-visual-line-home\": \"Select to visual line start\",\n \"select-visual-line-end\": \"Select to visual line end\",\n \"buffer-home\": \"Buffer start\",\n \"buffer-end\": \"Buffer end\",\n \"select-buffer-home\": \"Select to buffer start\",\n \"select-buffer-end\": \"Select to buffer end\",\n \"delete-line\": \"Delete line\",\n \"delete-to-line-end\": \"Delete to line end\",\n \"delete-to-line-start\": \"Delete to line start\",\n backspace: \"Delete backward\",\n delete: \"Delete forward\",\n newline: \"New line\",\n undo: \"Undo\",\n redo: \"Redo\",\n \"word-forward\": \"Next word\",\n \"word-backward\": \"Previous word\",\n \"select-word-forward\": \"Select next word\",\n \"select-word-backward\": \"Select previous word\",\n \"delete-word-forward\": \"Delete next word\",\n \"delete-word-backward\": \"Delete previous word\",\n \"select-all\": \"Select all\",\n submit: \"Submit\",\n} as const satisfies Record<EditBufferCommandName, string>\n\nconst editBufferFineGroups = {\n \"move-left\": \"Cursor\",\n \"move-right\": \"Cursor\",\n \"move-up\": \"Cursor\",\n \"move-down\": \"Cursor\",\n \"select-left\": \"Selection\",\n \"select-right\": \"Selection\",\n \"select-up\": \"Selection\",\n \"select-down\": \"Selection\",\n \"line-home\": \"Cursor\",\n \"line-end\": \"Cursor\",\n \"select-line-home\": \"Selection\",\n \"select-line-end\": \"Selection\",\n \"visual-line-home\": \"Cursor\",\n \"visual-line-end\": \"Cursor\",\n \"select-visual-line-home\": \"Selection\",\n \"select-visual-line-end\": \"Selection\",\n \"buffer-home\": \"Cursor\",\n \"buffer-end\": \"Cursor\",\n \"select-buffer-home\": \"Selection\",\n \"select-buffer-end\": \"Selection\",\n \"delete-line\": \"Delete\",\n \"delete-to-line-end\": \"Delete\",\n \"delete-to-line-start\": \"Delete\",\n backspace: \"Delete\",\n delete: \"Delete\",\n newline: \"Insert\",\n undo: \"History\",\n redo: \"History\",\n \"word-forward\": \"Cursor\",\n \"word-backward\": \"Cursor\",\n \"select-word-forward\": \"Selection\",\n \"select-word-backward\": \"Selection\",\n \"delete-word-forward\": \"Delete\",\n \"delete-word-backward\": \"Delete\",\n \"select-all\": \"Selection\",\n submit: \"Submit\",\n} as const satisfies Record<EditBufferCommandName, EditBufferFineGroup>\n\ninterface EditBufferMetadataOptions {\n category: string\n group: string\n includeFineGroup: boolean\n}\n\nexport interface EditBufferCommandOptions {\n category?: string\n group?: string\n includeFineGroup?: boolean\n commandNames?: Partial<Record<EditBufferCommandName, string>>\n descriptions?: Partial<Record<EditBufferCommandName, string>>\n}\n\nconst EDIT_BUFFER_COMMANDS_RESOURCE = Symbol(\"keymap:edit-buffer-commands\")\nconst TEXTAREA_MAPPING_SUSPENSION_RESOURCE = Symbol(\"keymap:textarea-mapping-suspension\")\n\nexport type ManagedTextareaLayer = Omit<Layer<Renderable, KeyEvent>, \"bindings\" | \"target\" | \"targetMode\"> & {\n bindings?: Bindings<Renderable, KeyEvent>\n target?: never\n targetMode?: never\n}\n\nfunction isManagedTextarea(editor: EditBufferRenderable | null): editor is TextareaRenderable {\n return editor instanceof TextareaRenderable && !(editor instanceof InputRenderable)\n}\n\nfunction resolveEditBufferCommandDescriptions(\n options?: EditBufferCommandOptions,\n): Record<EditBufferCommandName, string> {\n const descriptions: Record<EditBufferCommandName, string> = { ...editBufferCommandDescriptions }\n const overrides = options?.descriptions\n if (!overrides) {\n return descriptions\n }\n\n for (const name of editBufferActions) {\n const override = overrides[name]\n if (override === undefined) {\n continue\n }\n\n const normalized = override.trim()\n if (!normalized) {\n throw new Error(`Edit buffer command description for \"${name}\" cannot be empty`)\n }\n\n descriptions[name] = normalized\n }\n\n return descriptions\n}\n\nfunction normalizeEditBufferMetadataField(fieldName: \"category\" | \"group\", value: string | undefined): string {\n const normalized = (value ?? DEFAULT_EDIT_BUFFER_METADATA_GROUP).trim()\n if (!normalized) {\n throw new Error(`Edit buffer metadata field \"${fieldName}\" cannot be empty`)\n }\n\n return normalized\n}\n\nfunction resolveEditBufferMetadataOptions(options?: EditBufferCommandOptions): EditBufferMetadataOptions {\n return {\n category: normalizeEditBufferMetadataField(\"category\", options?.category),\n group: normalizeEditBufferMetadataField(\"group\", options?.group),\n includeFineGroup: options?.includeFineGroup === true,\n }\n}\n\nfunction resolveEditBufferCommandNames(options?: EditBufferCommandOptions): Record<EditBufferCommandName, string> {\n const commandNames: Record<EditBufferCommandName, string> = { ...editBufferCommandNames }\n const overrides = options?.commandNames\n\n if (overrides) {\n for (const action of editBufferActions) {\n const override = overrides[action]\n if (override === undefined) {\n continue\n }\n\n const normalized = override.trim()\n if (!normalized) {\n throw new Error(`Edit buffer command name for \"${action}\" cannot be empty`)\n }\n\n commandNames[action] = normalized\n }\n }\n\n const seenNames = new Map<string, EditBufferCommandName>()\n\n for (const action of editBufferActions) {\n const commandName = commandNames[action]\n const existingAction = seenNames.get(commandName)\n if (existingAction !== undefined) {\n throw new Error(\n `Edit buffer command name \"${commandName}\" is assigned to both \"${existingAction}\" and \"${action}\"`,\n )\n }\n\n seenNames.set(commandName, action)\n }\n\n return commandNames\n}\n\nfunction setTextareaSuspend(editor: TextareaRenderable, suspended: boolean): void {\n const nextTraits = { ...editor.traits }\n if (suspended) {\n nextTraits.suspend = true\n } else {\n delete nextTraits.suspend\n }\n\n editor.traits = nextTraits\n}\n\nfunction createDefaultTextareaBindings(\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Binding[] {\n return defaultTextareaKeyBindings.map((binding) => {\n const generated: Binding = {\n key: keyBindingToString(binding),\n cmd: commandNames[binding.action],\n desc: descriptions[binding.action],\n group: metadata.group,\n }\n\n if (metadata.includeFineGroup) {\n generated.fineGroup = editBufferFineGroups[binding.action]\n }\n\n return generated\n })\n}\n\n/**\n * Returns the default textarea bindings with any overrides prepended so they\n * take precedence. Prefer `registerManagedTextareaLayer` unless you are\n * composing a custom textarea integration.\n */\nexport function createTextareaBindings(overrides?: readonly Binding[], options?: EditBufferCommandOptions): Binding[] {\n return createTextareaBindingsWithResolvedOptions(\n overrides,\n resolveEditBufferCommandNames(options),\n resolveEditBufferCommandDescriptions(options),\n resolveEditBufferMetadataOptions(options),\n )\n}\n\nfunction createTextareaBindingsWithResolvedOptions(\n overrides: readonly Binding[] | undefined,\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Binding[] {\n const overrideBindings = overrides ?? []\n return [...overrideBindings, ...createDefaultTextareaBindings(commandNames, descriptions, metadata)]\n}\n\nfunction getLiveRenderer(renderer: CliRenderer): CliRenderer {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot use a keymap after its renderer was destroyed\")\n }\n\n return renderer\n}\n\n/**\n * Suspends a focused `TextareaRenderable`'s own key handling so keymap\n * bindings can take over, restoring the previous suspend state on cleanup or\n * focus change. Reference-counted per `Keymap`; prefer\n * `registerManagedTextareaLayer` unless you need this separately.\n */\nexport function registerTextareaMappingSuspension(\n keymap: Keymap<Renderable, KeyEvent>,\n renderer: CliRenderer,\n): () => void {\n return keymap.acquireResource(TEXTAREA_MAPPING_SUSPENSION_RESOURCE, () => {\n const previousSuspendStates = new WeakMap<TextareaRenderable, boolean>()\n let suspendedEditor: TextareaRenderable | null = null\n\n const suspendEditor = (editor: EditBufferRenderable | null): void => {\n if (!isManagedTextarea(editor) || editor.isDestroyed) {\n suspendedEditor = null\n return\n }\n\n if (!previousSuspendStates.has(editor)) {\n previousSuspendStates.set(editor, editor.traits.suspend === true)\n }\n\n setTextareaSuspend(editor, true)\n suspendedEditor = editor\n }\n\n const restoreEditor = (editor: EditBufferRenderable | null): void => {\n if (!isManagedTextarea(editor)) {\n return\n }\n\n const previousSuspend = previousSuspendStates.get(editor)\n if (previousSuspend === undefined) {\n return\n }\n\n previousSuspendStates.delete(editor)\n if (!editor.isDestroyed) {\n setTextareaSuspend(editor, previousSuspend)\n }\n\n if (suspendedEditor === editor) {\n suspendedEditor = null\n }\n }\n\n const onFocusedEditor = (current: EditBufferRenderable | null, previous: EditBufferRenderable | null): void => {\n restoreEditor(previous)\n suspendEditor(current)\n }\n\n const liveRenderer = getLiveRenderer(renderer)\n\n liveRenderer.on(CliRenderEvents.FOCUSED_EDITOR, onFocusedEditor)\n suspendEditor(liveRenderer.currentFocusedEditor)\n\n return () => {\n liveRenderer.off(CliRenderEvents.FOCUSED_EDITOR, onFocusedEditor)\n restoreEditor(suspendedEditor)\n }\n })\n}\n\nfunction withFocusedEditor(renderer: CliRenderer, run: (editor: EditBufferRenderable) => boolean): boolean {\n const editor = getLiveRenderer(renderer).currentFocusedEditor\n if (!editor || editor.isDestroyed) {\n return false\n }\n\n return run(editor)\n}\n\nfunction hasSubmit(editor: EditBufferRenderable): editor is EditBufferRenderable & { submit: () => boolean } {\n return typeof (editor as { submit?: unknown }).submit === \"function\"\n}\n\nconst editBufferCommandHandlers = {\n \"move-left\": (editor: EditBufferRenderable) => editor.moveCursorLeft(),\n \"move-right\": (editor: EditBufferRenderable) => editor.moveCursorRight(),\n \"move-up\": (editor: EditBufferRenderable) => editor.moveCursorUp(),\n \"move-down\": (editor: EditBufferRenderable) => editor.moveCursorDown(),\n \"select-left\": (editor: EditBufferRenderable) => editor.moveCursorLeft({ select: true }),\n \"select-right\": (editor: EditBufferRenderable) => editor.moveCursorRight({ select: true }),\n \"select-up\": (editor: EditBufferRenderable) => editor.moveCursorUp({ select: true }),\n \"select-down\": (editor: EditBufferRenderable) => editor.moveCursorDown({ select: true }),\n \"line-home\": (editor: EditBufferRenderable) => editor.gotoLineHome(),\n \"line-end\": (editor: EditBufferRenderable) => editor.gotoLineEnd(),\n \"select-line-home\": (editor: EditBufferRenderable) => editor.gotoLineHome({ select: true }),\n \"select-line-end\": (editor: EditBufferRenderable) => editor.gotoLineEnd({ select: true }),\n \"visual-line-home\": (editor: EditBufferRenderable) => editor.gotoVisualLineHome(),\n \"visual-line-end\": (editor: EditBufferRenderable) => editor.gotoVisualLineEnd(),\n \"select-visual-line-home\": (editor: EditBufferRenderable) => editor.gotoVisualLineHome({ select: true }),\n \"select-visual-line-end\": (editor: EditBufferRenderable) => editor.gotoVisualLineEnd({ select: true }),\n \"buffer-home\": (editor: EditBufferRenderable) => editor.gotoBufferHome(),\n \"buffer-end\": (editor: EditBufferRenderable) => editor.gotoBufferEnd(),\n \"select-buffer-home\": (editor: EditBufferRenderable) => editor.gotoBufferHome({ select: true }),\n \"select-buffer-end\": (editor: EditBufferRenderable) => editor.gotoBufferEnd({ select: true }),\n \"delete-line\": (editor: EditBufferRenderable) => editor.deleteLine(),\n \"delete-to-line-end\": (editor: EditBufferRenderable) => editor.deleteToLineEnd(),\n \"delete-to-line-start\": (editor: EditBufferRenderable) => editor.deleteToLineStart(),\n backspace: (editor: EditBufferRenderable) => editor.deleteCharBackward(),\n delete: (editor: EditBufferRenderable) => editor.deleteChar(),\n newline: (editor: EditBufferRenderable) => editor.newLine(),\n undo: (editor: EditBufferRenderable) => editor.undo(),\n redo: (editor: EditBufferRenderable) => editor.redo(),\n \"word-forward\": (editor: EditBufferRenderable) => editor.moveWordForward(),\n \"word-backward\": (editor: EditBufferRenderable) => editor.moveWordBackward(),\n \"select-word-forward\": (editor: EditBufferRenderable) => editor.moveWordForward({ select: true }),\n \"select-word-backward\": (editor: EditBufferRenderable) => editor.moveWordBackward({ select: true }),\n \"delete-word-forward\": (editor: EditBufferRenderable) => editor.deleteWordForward(),\n \"delete-word-backward\": (editor: EditBufferRenderable) => editor.deleteWordBackward(),\n \"select-all\": (editor: EditBufferRenderable) => editor.selectAll(),\n submit: (editor: EditBufferRenderable) => {\n if (!hasSubmit(editor)) {\n return false\n }\n\n return editor.submit()\n },\n} as const satisfies Record<EditBufferCommandName, (editor: EditBufferRenderable) => boolean>\n\nfunction createEditBufferCommand(\n renderer: CliRenderer,\n action: EditBufferCommandName,\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n run: (editor: EditBufferRenderable) => boolean,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Command<Renderable, KeyEvent> {\n return {\n name: commandNames[action],\n desc: descriptions[action],\n category: metadata.category,\n run() {\n return withFocusedEditor(renderer, run)\n },\n }\n}\n\nfunction createEditBufferCommands(\n renderer: CliRenderer,\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Command<Renderable, KeyEvent>[] {\n return editBufferActions.map((action) =>\n createEditBufferCommand(renderer, action, commandNames, editBufferCommandHandlers[action], descriptions, metadata),\n )\n}\n\n/**\n * Registers the standard edit-buffer commands against\n * `renderer.currentFocusedEditor`. Reference-counted per `Keymap`; prefer\n * `registerManagedTextareaLayer` unless you need the commands without the\n * default bindings or textarea suspension.\n */\nexport function registerEditBufferCommands(\n keymap: Keymap<Renderable, KeyEvent>,\n renderer: CliRenderer,\n options?: EditBufferCommandOptions,\n): () => void {\n const commandNames = resolveEditBufferCommandNames(options)\n const descriptions = resolveEditBufferCommandDescriptions(options)\n const metadata = resolveEditBufferMetadataOptions(options)\n\n return keymap.acquireResource(EDIT_BUFFER_COMMANDS_RESOURCE, () => {\n return keymap.registerLayer({\n commands: createEditBufferCommands(renderer, commandNames, descriptions, metadata),\n })\n })\n}\n\n/**\n * High-level global textarea integration: registers the edit-buffer commands,\n * suspends the textarea's built-in key handling while focused, and installs\n * the layer with default bindings plus overrides. Safe to combine with the\n * lower-level helpers because they are reference-counted.\n */\nexport function registerManagedTextareaLayer(\n keymap: Keymap<Renderable, KeyEvent>,\n renderer: CliRenderer,\n layer: ManagedTextareaLayer,\n options?: EditBufferCommandOptions,\n): () => void {\n const commandNames = resolveEditBufferCommandNames(options)\n const descriptions = resolveEditBufferCommandDescriptions(options)\n const metadata = resolveEditBufferMetadataOptions(options)\n const offCommands = registerEditBufferCommands(keymap, renderer, options)\n const offSuspension = registerTextareaMappingSuspension(keymap, renderer)\n\n try {\n const { bindings, target: _ignoredTarget, targetMode: _ignoredTargetMode, ...rest } = layer\n const offLayer = keymap.registerLayer({\n ...rest,\n bindings: createTextareaBindingsWithResolvedOptions(bindings, commandNames, descriptions, metadata),\n })\n\n return () => {\n offLayer()\n offSuspension()\n offCommands()\n }\n } catch (error) {\n offSuspension()\n offCommands()\n throw error\n }\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "41E23EFAAC69B76764756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
|
@@ -2,8 +2,8 @@ import type { BindingParser, EventMatchResolver, Keymap, KeymapEvent } from "../
|
|
|
2
2
|
export declare const defaultBindingParser: BindingParser;
|
|
3
3
|
export declare const defaultEventMatchResolver: EventMatchResolver<KeymapEvent>;
|
|
4
4
|
/**
|
|
5
|
-
* Parses the built-in string binding syntax, including modifiers
|
|
6
|
-
* `<token>` segments.
|
|
5
|
+
* Parses the built-in string binding syntax, including modifiers,
|
|
6
|
+
* `<token>` aliases, and `{pattern}` dynamic sequence segments.
|
|
7
7
|
*/
|
|
8
8
|
export declare function registerDefaultBindingParser<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
|
|
9
9
|
/**
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import type { CommandContext, Keymap, KeymapEvent } from "../../index.js";
|
|
1
|
+
import type { CommandContext, CommandResult, Keymap, KeymapEvent } from "../../index.js";
|
|
2
|
+
export interface ExCommandPayload {
|
|
3
|
+
raw: string;
|
|
4
|
+
args: readonly string[];
|
|
5
|
+
payload?: unknown;
|
|
6
|
+
}
|
|
2
7
|
export interface ExCommand<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
|
|
3
8
|
name: string;
|
|
4
9
|
aliases?: string[];
|
|
5
10
|
nargs?: "0" | "1" | "?" | "*" | "+";
|
|
6
|
-
run: (ctx: CommandContext<TTarget, TEvent>
|
|
7
|
-
raw: string;
|
|
8
|
-
args: string[];
|
|
9
|
-
}) => void | Promise<void>;
|
|
11
|
+
run: (ctx: CommandContext<TTarget, TEvent, ExCommandPayload>) => CommandResult<TTarget, TEvent>;
|
|
10
12
|
[key: string]: unknown;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
+
* Installs Ex command support. Ex commands are registered through normal
|
|
16
|
+
* keymap layers by using a colon-prefixed command name or
|
|
17
|
+
* `namespace: "excommands"`.
|
|
15
18
|
*/
|
|
16
|
-
export declare function registerExCommands<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent
|
|
19
|
+
export declare function registerExCommands<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
|
|
@@ -10,6 +10,7 @@ export { registerEmacsBindings } from "./emacs-bindings.js";
|
|
|
10
10
|
export { registerExCommands } from "./ex-commands.js";
|
|
11
11
|
export { registerLeader } from "./leader.js";
|
|
12
12
|
export { registerMetadataFields } from "./metadata.js";
|
|
13
|
+
export { registerModBindings } from "./mod-bindings.js";
|
|
13
14
|
export { registerNeovimDisambiguation } from "./neovim-disambiguation.js";
|
|
14
15
|
export { registerTimedLeader } from "./timed-leader.js";
|
|
15
16
|
export { registerUnresolvedCommandWarnings } from "./unresolved-commands.js";
|
|
@@ -17,7 +18,7 @@ export type { Aliases } from "./aliases.js";
|
|
|
17
18
|
export type { BackspacePopsPendingSequenceOptions } from "./backspace-pops-pending-sequence.js";
|
|
18
19
|
export type { EscapeClearsPendingSequenceOptions } from "./escape-clears-pending-sequence.js";
|
|
19
20
|
export type { Enabled } from "./enabled.js";
|
|
20
|
-
export type { ExCommand } from "./ex-commands.js";
|
|
21
|
+
export type { ExCommand, ExCommandPayload } from "./ex-commands.js";
|
|
21
22
|
export type { LeaderOptions } from "./leader.js";
|
|
22
23
|
export type { NeovimDisambiguationOptions } from "./neovim-disambiguation.js";
|
|
23
24
|
export type { TimedLeaderOptions } from "./timed-leader.js";
|
|
@@ -4,6 +4,6 @@ export interface LeaderOptions {
|
|
|
4
4
|
name?: string;
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
* Defines a token such as
|
|
7
|
+
* Defines a token such as `leader` that the default parser can reference as `<leader>`.
|
|
8
8
|
*/
|
|
9
9
|
export declare function registerLeader<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, options: LeaderOptions): () => void;
|
|
@@ -3,7 +3,7 @@ import type { Keymap, KeymapEvent } from "../../index.js";
|
|
|
3
3
|
* Maps `desc`, `group`, `title`, and `category` fields into binding and
|
|
4
4
|
* command attrs.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* This addon only registers binding and command field compilers. Apps can
|
|
7
|
+
* register layer metadata fields directly with `registerLayerFields`.
|
|
8
8
|
*/
|
|
9
9
|
export declare function registerMetadataFields<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Keymap, KeymapEvent } from "../../index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Adds a platform-aware `mod+...` modifier alias. `mod` resolves to the host's
|
|
4
|
+
* primary modifier, with `ctrl` as the fallback when the host is unknown.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerModBindings<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export type BindingSectionItem<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = KeyLike |
|
|
1
|
+
import type { Binding, KeyLike, KeymapEvent } from "../types.js";
|
|
2
|
+
export type BindingSectionItem<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = KeyLike | Binding<TTarget, TEvent>;
|
|
3
3
|
export type BindingValue<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = false | "none" | BindingSectionItem<TTarget, TEvent> | readonly BindingSectionItem<TTarget, TEvent>[];
|
|
4
4
|
export type BindingSectionConfig<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = Readonly<Record<string, BindingValue<TTarget, TEvent>>>;
|
|
5
5
|
export type BindingSectionsConfig<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = Readonly<Record<string, BindingSectionConfig<TTarget, TEvent>>>;
|
|
6
6
|
type LiteralStringKeys<T> = string extends Extract<keyof T, string> ? never : Extract<keyof T, string>;
|
|
7
7
|
export interface ResolvedBindingSections<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent, TSection extends string = string> {
|
|
8
|
-
sections: Record<TSection,
|
|
9
|
-
get(section: string, cmd: string): readonly
|
|
8
|
+
sections: Record<TSection, Binding<TTarget, TEvent>[]>;
|
|
9
|
+
get(section: string, cmd: string): readonly Binding<TTarget, TEvent>[] | undefined;
|
|
10
10
|
}
|
|
11
11
|
export interface ResolveBindingSectionsOptions<TSection extends string = string> {
|
|
12
12
|
sections?: readonly TSection[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Binding, KeyLike, KeymapEvent } from "../types.js";
|
|
2
2
|
export type CommandBindingMap = Record<string, KeyLike>;
|
|
3
3
|
export interface CommandBindingsOverrideWarning {
|
|
4
4
|
code: "command-binding-override";
|
|
@@ -16,4 +16,4 @@ export interface CommandBindingsOptions {
|
|
|
16
16
|
onWarning?: (warning: CommandBindingsOverrideWarning) => void;
|
|
17
17
|
onError?: (error: CommandBindingsError) => void;
|
|
18
18
|
}
|
|
19
|
-
export declare function commandBindings<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent>(bindings: Readonly<CommandBindingMap>, options?: CommandBindingsOptions):
|
|
19
|
+
export declare function commandBindings<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent>(bindings: Readonly<CommandBindingMap>, options?: CommandBindingsOptions): Binding<TTarget, TEvent>[];
|
|
@@ -5,10 +5,13 @@ export interface KeySequenceFormatPart {
|
|
|
5
5
|
display: string;
|
|
6
6
|
match?: KeySequencePart["match"];
|
|
7
7
|
tokenName?: string;
|
|
8
|
+
patternName?: string;
|
|
8
9
|
}
|
|
9
10
|
export type TokenDisplayResolver = Readonly<Record<string, string>> | ((tokenName: string, part: KeySequenceFormatPart) => string | undefined);
|
|
11
|
+
export type PatternDisplayResolver = Readonly<Record<string, string>> | ((patternName: string, part: KeySequenceFormatPart) => string | undefined);
|
|
10
12
|
export interface FormatKeySequenceOptions {
|
|
11
13
|
tokenDisplay?: TokenDisplayResolver;
|
|
14
|
+
patternDisplay?: PatternDisplayResolver;
|
|
12
15
|
keyNameAliases?: Readonly<Record<string, string>>;
|
|
13
16
|
modifierAliases?: Partial<Record<KeyModifierName, string>>;
|
|
14
17
|
separator?: string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type KeymapExtensionProvider } from "../services/extension-context.js";
|
|
2
|
+
import type { KeymapEvent } from "../types.js";
|
|
3
|
+
import type { GraphSnapshot, GraphSnapshotOptions } from "./lib/graph-types.js";
|
|
4
|
+
export type { GraphBinding, GraphCommand, GraphInactiveReason, GraphLayer, GraphSequenceNode, GraphSnapshot, GraphSnapshotOptions, } from "./lib/graph-types.js";
|
|
5
|
+
export interface KeymapGraphExtra<TTarget extends object, TEvent extends KeymapEvent> {
|
|
6
|
+
getGraphSnapshot(options?: GraphSnapshotOptions<TTarget>): GraphSnapshot<TTarget, TEvent>;
|
|
7
|
+
}
|
|
8
|
+
export declare function getGraphSnapshot<TTarget extends object, TEvent extends KeymapEvent>(keymap: KeymapExtensionProvider<TTarget, TEvent>, options?: GraphSnapshotOptions<TTarget>): GraphSnapshot<TTarget, TEvent>;
|
|
9
|
+
export declare function createGraphExtra<TTarget extends object, TEvent extends KeymapEvent>(keymap: KeymapExtensionProvider<TTarget, TEvent>): KeymapGraphExtra<TTarget, TEvent>;
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
KEYMAP_EXTENSION_CONTEXT,
|
|
4
|
+
childNodes,
|
|
5
|
+
cloneKeySequence,
|
|
6
|
+
cloneKeyStroke,
|
|
7
|
+
getActivationPath,
|
|
8
|
+
getCaptureNode,
|
|
9
|
+
getFocusedTargetIfAvailable,
|
|
10
|
+
getNodePresentation,
|
|
11
|
+
getNodeSequence,
|
|
12
|
+
getSortedLayers,
|
|
13
|
+
isLayerActiveForFocused
|
|
14
|
+
} from "../../chunks/index-frk6sdcd.js";
|
|
15
|
+
|
|
16
|
+
// src/extras/lib/graph-snapshot.ts
|
|
17
|
+
function hasOwnFocused(options) {
|
|
18
|
+
return !!options && Object.prototype.hasOwnProperty.call(options, "focused");
|
|
19
|
+
}
|
|
20
|
+
function layerId(layer) {
|
|
21
|
+
return `layer:${layer.order}`;
|
|
22
|
+
}
|
|
23
|
+
function bindingId(layer, index) {
|
|
24
|
+
return `binding:${layer.order}:${index}`;
|
|
25
|
+
}
|
|
26
|
+
function commandId(layer, index) {
|
|
27
|
+
return `command:${layer.order}:${index}`;
|
|
28
|
+
}
|
|
29
|
+
function nodeId(layer, index) {
|
|
30
|
+
return `node:${layer.order}:${index}`;
|
|
31
|
+
}
|
|
32
|
+
function getSequenceMatches(sequence) {
|
|
33
|
+
return sequence.map((part) => part.match);
|
|
34
|
+
}
|
|
35
|
+
function isPrefix(left, right) {
|
|
36
|
+
if (left.length > right.length) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
for (let index = 0;index < left.length; index += 1) {
|
|
40
|
+
if (left[index] !== right[index]) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
function collectPendingNodes(pending, layerIds, nodeIds, roots) {
|
|
47
|
+
const pendingIds = new Set;
|
|
48
|
+
const pendingPathIds = new Set;
|
|
49
|
+
if (!pending) {
|
|
50
|
+
return { pending: pendingIds, pendingPath: pendingPathIds };
|
|
51
|
+
}
|
|
52
|
+
for (const capture of pending.captures) {
|
|
53
|
+
const layerGraphId = layerIds.get(capture.layer);
|
|
54
|
+
if (!layerGraphId) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const root = roots.get(capture.layer);
|
|
58
|
+
if (!root) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
let current = getCaptureNode(root, capture) ?? null;
|
|
62
|
+
const capturedNodeId = current ? nodeIds.get(current) : undefined;
|
|
63
|
+
if (capturedNodeId) {
|
|
64
|
+
pendingIds.add(capturedNodeId);
|
|
65
|
+
}
|
|
66
|
+
while (current) {
|
|
67
|
+
const currentNodeId = nodeIds.get(current);
|
|
68
|
+
if (currentNodeId) {
|
|
69
|
+
pendingPathIds.add(currentNodeId);
|
|
70
|
+
}
|
|
71
|
+
current = current.parent;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { pending: pendingIds, pendingPath: pendingPathIds };
|
|
75
|
+
}
|
|
76
|
+
function createGraphSnapshot(options) {
|
|
77
|
+
const { state, host, conditions, catalog, activation, snapshotOptions } = options;
|
|
78
|
+
const includeTargets = snapshotOptions?.includeTargets !== false;
|
|
79
|
+
const currentFocused = getFocusedTargetIfAvailable(host);
|
|
80
|
+
const focused = hasOwnFocused(snapshotOptions) ? snapshotOptions.focused ?? null : currentFocused;
|
|
81
|
+
const activeView = catalog.getActiveCommandView(focused);
|
|
82
|
+
const activeCommandStates = new Set(activeView.entries.map((entry) => entry.commandState));
|
|
83
|
+
const reachableCommandStates = new Set(activeView.reachable.map((entry) => entry.commandState));
|
|
84
|
+
const activationPath = getActivationPath(host, focused);
|
|
85
|
+
const sortedLayers = getSortedLayers(state.layers);
|
|
86
|
+
const layerStates = new Map;
|
|
87
|
+
const commandStates = new Map;
|
|
88
|
+
const bindingStates = new Map;
|
|
89
|
+
const commandIdsByCommand = new Map;
|
|
90
|
+
const commandIdsByName = new Map;
|
|
91
|
+
const nodeIds = new Map;
|
|
92
|
+
const layerIds = new Map;
|
|
93
|
+
const layerRoots = new Map;
|
|
94
|
+
const bindingNodeIds = new Map;
|
|
95
|
+
const sequenceNodes = [];
|
|
96
|
+
for (const layer of sortedLayers) {
|
|
97
|
+
layerRoots.set(layer, layer.root);
|
|
98
|
+
}
|
|
99
|
+
for (const layer of sortedLayers) {
|
|
100
|
+
const currentLayerId = layerId(layer);
|
|
101
|
+
const targetDestroyed = layer.target ? host.isTargetDestroyed(layer.target) : false;
|
|
102
|
+
const focusActive = isLayerActiveForFocused(host, layer, focused, activationPath);
|
|
103
|
+
const enabled = conditions.matchesConditions(layer);
|
|
104
|
+
const inactiveReasons = [];
|
|
105
|
+
if (targetDestroyed)
|
|
106
|
+
inactiveReasons.push("target-destroyed");
|
|
107
|
+
if (!focusActive)
|
|
108
|
+
inactiveReasons.push("focus");
|
|
109
|
+
if (!enabled)
|
|
110
|
+
inactiveReasons.push("layer-disabled");
|
|
111
|
+
layerIds.set(layer, currentLayerId);
|
|
112
|
+
layerStates.set(layer, {
|
|
113
|
+
layer,
|
|
114
|
+
id: currentLayerId,
|
|
115
|
+
focusActive,
|
|
116
|
+
enabled,
|
|
117
|
+
active: !targetDestroyed && focusActive && enabled,
|
|
118
|
+
inactiveReasons
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
for (const layer of sortedLayers) {
|
|
122
|
+
const currentLayerId = layerIds.get(layer);
|
|
123
|
+
for (const [index, command] of layer.commands.entries()) {
|
|
124
|
+
const currentCommandId = commandId(layer, index);
|
|
125
|
+
const idsByCommand = commandIdsByCommand.get(command.command);
|
|
126
|
+
if (idsByCommand) {
|
|
127
|
+
idsByCommand.push(currentCommandId);
|
|
128
|
+
} else {
|
|
129
|
+
commandIdsByCommand.set(command.command, [currentCommandId]);
|
|
130
|
+
}
|
|
131
|
+
const idsByName = commandIdsByName.get(command.command.name);
|
|
132
|
+
if (idsByName) {
|
|
133
|
+
idsByName.push(currentCommandId);
|
|
134
|
+
} else {
|
|
135
|
+
commandIdsByName.set(command.command.name, [currentCommandId]);
|
|
136
|
+
}
|
|
137
|
+
const layerState = layerStates.get(layer);
|
|
138
|
+
const enabled = conditions.matchesConditions(command);
|
|
139
|
+
const active = activeCommandStates.has(command);
|
|
140
|
+
const reachable = reachableCommandStates.has(command);
|
|
141
|
+
const inactiveReasons = [...layerState.inactiveReasons];
|
|
142
|
+
if (!enabled) {
|
|
143
|
+
inactiveReasons.push("command-disabled");
|
|
144
|
+
}
|
|
145
|
+
if (active && !reachable) {
|
|
146
|
+
inactiveReasons.push("shadowed");
|
|
147
|
+
}
|
|
148
|
+
commandStates.set(command, {
|
|
149
|
+
command,
|
|
150
|
+
id: currentCommandId,
|
|
151
|
+
layerState,
|
|
152
|
+
active,
|
|
153
|
+
reachable,
|
|
154
|
+
enabled,
|
|
155
|
+
inactiveReasons
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
let nextNodeIndex = 0;
|
|
159
|
+
const visitNode = (node, parentId) => {
|
|
160
|
+
const currentNodeId = nodeId(layer, nextNodeIndex);
|
|
161
|
+
nextNodeIndex += 1;
|
|
162
|
+
nodeIds.set(node, currentNodeId);
|
|
163
|
+
for (const binding of node.bindings) {
|
|
164
|
+
bindingNodeIds.set(binding, currentNodeId);
|
|
165
|
+
}
|
|
166
|
+
for (const child of childNodes(node)) {
|
|
167
|
+
visitNode(child, currentNodeId);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const root = layerRoots.get(layer);
|
|
171
|
+
visitNode(root, null);
|
|
172
|
+
if (!nodeIds.has(root)) {
|
|
173
|
+
nodeIds.set(root, `${currentLayerId}:root`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const stoppedSequences = [];
|
|
177
|
+
for (const layer of sortedLayers) {
|
|
178
|
+
const layerState = layerStates.get(layer);
|
|
179
|
+
for (const [index, binding] of layer.bindings.entries()) {
|
|
180
|
+
const enabled = conditions.matchesConditions(binding);
|
|
181
|
+
const commandResolved = catalog.isBindingVisible(binding, focused, activeView);
|
|
182
|
+
const active = layerState.active && enabled && commandResolved;
|
|
183
|
+
const matches = getSequenceMatches(binding.sequence);
|
|
184
|
+
const shadowed = active && stoppedSequences.some((stop) => stop.event === binding.event && isPrefix(stop.matches, matches));
|
|
185
|
+
const inactiveReasons = [...layerState.inactiveReasons];
|
|
186
|
+
if (!enabled) {
|
|
187
|
+
inactiveReasons.push("binding-disabled");
|
|
188
|
+
}
|
|
189
|
+
if (!commandResolved) {
|
|
190
|
+
const unavailable = typeof binding.command === "string" ? catalog.getDispatchUnavailableCommandState(binding.command, focused, false) : undefined;
|
|
191
|
+
if (unavailable?.reason === "disabled") {
|
|
192
|
+
inactiveReasons.push("command-disabled");
|
|
193
|
+
} else if (unavailable?.reason === "inactive") {
|
|
194
|
+
inactiveReasons.push("command-inactive");
|
|
195
|
+
} else {
|
|
196
|
+
inactiveReasons.push("command-unresolved");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
if (shadowed) {
|
|
200
|
+
inactiveReasons.push("shadowed");
|
|
201
|
+
}
|
|
202
|
+
const currentBindingState = {
|
|
203
|
+
binding,
|
|
204
|
+
id: bindingId(layer, index),
|
|
205
|
+
layerState,
|
|
206
|
+
commandIds: [],
|
|
207
|
+
enabled,
|
|
208
|
+
commandResolved,
|
|
209
|
+
active,
|
|
210
|
+
reachable: active && !shadowed,
|
|
211
|
+
shadowed,
|
|
212
|
+
inactiveReasons
|
|
213
|
+
};
|
|
214
|
+
bindingStates.set(binding, currentBindingState);
|
|
215
|
+
if (active && binding.command !== undefined && !binding.fallthrough) {
|
|
216
|
+
stoppedSequences.push({ event: binding.event, matches });
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
for (const state2 of bindingStates.values()) {
|
|
221
|
+
if (typeof state2.binding.command !== "string") {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const ids = new Set(commandIdsByName.get(state2.binding.command) ?? []);
|
|
225
|
+
const chain = catalog.getResolvedCommandChain(state2.binding.command, focused).entries;
|
|
226
|
+
for (const entry of chain ?? []) {
|
|
227
|
+
for (const id of commandIdsByCommand.get(entry.command) ?? []) {
|
|
228
|
+
ids.add(id);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
state2.commandIds = [...ids];
|
|
232
|
+
}
|
|
233
|
+
const pending = focused === currentFocused ? activation.ensureValidPendingSequence() : undefined;
|
|
234
|
+
const pendingNodes = collectPendingNodes(pending ?? null, layerIds, nodeIds, layerRoots);
|
|
235
|
+
for (const layer of sortedLayers) {
|
|
236
|
+
const currentLayerId = layerIds.get(layer);
|
|
237
|
+
const visitNode = (node, parentId) => {
|
|
238
|
+
const currentNodeId = nodeIds.get(node);
|
|
239
|
+
const childIds = childNodes(node).map((child) => nodeIds.get(child)).filter(Boolean);
|
|
240
|
+
const bindingIds = node.bindings.map((binding) => bindingStates.get(binding)?.id).filter((id) => !!id);
|
|
241
|
+
const reachableBindingIds = node.reachableBindings.map((binding) => bindingStates.get(binding)?.id).filter((id) => !!id);
|
|
242
|
+
const sequence = getNodeSequence(node);
|
|
243
|
+
const presentation = getNodePresentation(node);
|
|
244
|
+
const active = node.reachableBindings.some((binding) => bindingStates.get(binding)?.active === true);
|
|
245
|
+
const reachable = node.reachableBindings.some((binding) => bindingStates.get(binding)?.reachable === true);
|
|
246
|
+
for (let index = 0;index < sequence.length; index += 1) {
|
|
247
|
+
const sourcePart = node.reachableBindings[0]?.sequence[index];
|
|
248
|
+
if (sourcePart) {
|
|
249
|
+
sequence[index] = { ...sourcePart, stroke: cloneKeyStroke(sourcePart.stroke) };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
sequenceNodes.push({
|
|
253
|
+
id: currentNodeId,
|
|
254
|
+
layerId: currentLayerId,
|
|
255
|
+
parentId,
|
|
256
|
+
childIds,
|
|
257
|
+
bindingIds,
|
|
258
|
+
reachableBindingIds,
|
|
259
|
+
depth: node.depth,
|
|
260
|
+
sequence,
|
|
261
|
+
stroke: node.stroke ? cloneKeyStroke(node.stroke) : null,
|
|
262
|
+
match: node.match,
|
|
263
|
+
display: presentation.display,
|
|
264
|
+
tokenName: presentation.tokenName,
|
|
265
|
+
active,
|
|
266
|
+
reachable,
|
|
267
|
+
pending: pendingNodes.pending.has(currentNodeId),
|
|
268
|
+
pendingPath: pendingNodes.pendingPath.has(currentNodeId)
|
|
269
|
+
});
|
|
270
|
+
for (const child of childNodes(node)) {
|
|
271
|
+
visitNode(child, currentNodeId);
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
visitNode(layerRoots.get(layer), null);
|
|
275
|
+
}
|
|
276
|
+
const layers = sortedLayers.map((layer) => {
|
|
277
|
+
const state2 = layerStates.get(layer);
|
|
278
|
+
return {
|
|
279
|
+
id: state2.id,
|
|
280
|
+
order: layer.order,
|
|
281
|
+
priority: layer.priority,
|
|
282
|
+
target: includeTargets ? layer.target : undefined,
|
|
283
|
+
targetMode: layer.targetMode,
|
|
284
|
+
fields: layer.fields ?? {},
|
|
285
|
+
attrs: layer.attrs,
|
|
286
|
+
active: state2.active,
|
|
287
|
+
focusActive: state2.focusActive,
|
|
288
|
+
enabled: state2.enabled,
|
|
289
|
+
inactiveReasons: state2.inactiveReasons,
|
|
290
|
+
rootNodeId: nodeIds.get(layerRoots.get(layer)),
|
|
291
|
+
bindingIds: layer.bindings.map((binding) => bindingStates.get(binding).id),
|
|
292
|
+
commandIds: layer.commands.map((command) => commandStates.get(command).id)
|
|
293
|
+
};
|
|
294
|
+
});
|
|
295
|
+
const commands = [];
|
|
296
|
+
for (const state2 of commandStates.values()) {
|
|
297
|
+
commands.push({
|
|
298
|
+
id: state2.id,
|
|
299
|
+
layerId: state2.layerState.id,
|
|
300
|
+
name: state2.command.command.name,
|
|
301
|
+
command: state2.command.command,
|
|
302
|
+
fields: state2.command.fields,
|
|
303
|
+
attrs: state2.command.attrs,
|
|
304
|
+
target: includeTargets ? state2.layerState.layer.target : undefined,
|
|
305
|
+
active: state2.active,
|
|
306
|
+
reachable: state2.reachable,
|
|
307
|
+
enabled: state2.enabled,
|
|
308
|
+
inactiveReasons: state2.inactiveReasons
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
const bindings = [];
|
|
312
|
+
for (const state2 of bindingStates.values()) {
|
|
313
|
+
const binding = state2.binding;
|
|
314
|
+
bindings.push({
|
|
315
|
+
id: state2.id,
|
|
316
|
+
layerId: state2.layerState.id,
|
|
317
|
+
sourceLayerOrder: binding.sourceLayerOrder,
|
|
318
|
+
bindingIndex: binding.bindingIndex,
|
|
319
|
+
nodeId: bindingNodeIds.get(binding),
|
|
320
|
+
commandIds: state2.commandIds,
|
|
321
|
+
sequence: cloneKeySequence(binding.sequence),
|
|
322
|
+
command: binding.command,
|
|
323
|
+
commandAttrs: catalog.getBindingCommandAttrs(binding, focused, activeView),
|
|
324
|
+
attrs: binding.attrs,
|
|
325
|
+
event: binding.event,
|
|
326
|
+
preventDefault: binding.preventDefault,
|
|
327
|
+
fallthrough: binding.fallthrough,
|
|
328
|
+
active: state2.active,
|
|
329
|
+
reachable: state2.reachable,
|
|
330
|
+
enabled: state2.enabled,
|
|
331
|
+
commandResolved: state2.commandResolved,
|
|
332
|
+
shadowed: state2.shadowed,
|
|
333
|
+
inactiveReasons: state2.inactiveReasons
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
const activeKeys = activation.getActiveKeysForFocused(focused, { includeBindings: true, includeMetadata: true });
|
|
337
|
+
return {
|
|
338
|
+
focused: includeTargets ? focused : undefined,
|
|
339
|
+
pendingSequence: focused === currentFocused ? activation.getPendingSequence() : [],
|
|
340
|
+
activeKeys,
|
|
341
|
+
layers,
|
|
342
|
+
commands,
|
|
343
|
+
bindings,
|
|
344
|
+
sequenceNodes
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// src/extras/graph.ts
|
|
349
|
+
function getGraphSnapshot(keymap, options) {
|
|
350
|
+
const context = keymap[KEYMAP_EXTENSION_CONTEXT]();
|
|
351
|
+
return createGraphSnapshot({
|
|
352
|
+
state: context.state,
|
|
353
|
+
host: context.host,
|
|
354
|
+
conditions: context.conditions,
|
|
355
|
+
catalog: context.catalog,
|
|
356
|
+
activation: context.activation,
|
|
357
|
+
snapshotOptions: options
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
function createGraphExtra(keymap) {
|
|
361
|
+
return {
|
|
362
|
+
getGraphSnapshot(options) {
|
|
363
|
+
return getGraphSnapshot(keymap, options);
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
export {
|
|
368
|
+
getGraphSnapshot,
|
|
369
|
+
createGraphExtra
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
//# debugId=68A22ECA1358D66B64756E2164756E21
|
|
373
|
+
//# sourceMappingURL=graph.js.map
|