@opentui/keymap 0.2.2 → 0.2.4
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 +16 -7
- 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 +57 -4
- 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
package/src/index.js.map
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/runtime-utils.ts", "../src/services/primitives/bindings.ts", "../src/services/layer-diagnostics.ts", "../src/services/active-key-cache.ts", "../src/services/pending-sequence.ts", "../src/services/activation.ts", "../src/schema.ts", "../src/services/primitives/command-normalization.ts", "../src/services/runtime-view.ts", "../src/services/primitives/field-invariants.ts", "../src/services/values.ts", "../src/services/command-catalog.ts", "../src/services/command-executor.ts", "../src/services/compiler.ts", "../src/services/conditions.ts", "../src/types.ts", "../src/services/dispatch-decisions.ts", "../src/services/dispatch-patterns.ts", "../src/services/dispatch.ts", "../src/services/environment.ts", "../src/services/layers.ts", "../src/services/notify.ts", "../src/services/runtime.ts", "../src/services/state.ts", "../src/keymap.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"export type RuntimeEmitterListener<TValue> = [TValue] extends [void] ? () => void : (value: TValue) => void\n\ntype RuntimeEmitterArgs<TValue> = [TValue] extends [void] ? [] : [TValue]\n\ntype RuntimeEmitterListeners<TEvents extends Record<string, unknown>> = Partial<{\n [TName in keyof TEvents]: readonly RuntimeEmitterListener<TEvents[TName]>[]\n}>\n\nexport interface RuntimeEmitter<TEvents extends Record<string, unknown>> {\n hook<TName extends keyof TEvents>(name: TName, listener: RuntimeEmitterListener<TEvents[TName]>): () => void\n has<TName extends keyof TEvents>(name: TName): boolean\n emit<TName extends keyof TEvents>(name: TName, ...args: RuntimeEmitterArgs<TEvents[TName]>): void\n}\n\nexport function createRuntimeEmitter<TEvents extends Record<string, unknown>>(\n onError: (name: keyof TEvents, error: unknown) => void,\n): RuntimeEmitter<TEvents> {\n let listeners: RuntimeEmitterListeners<TEvents> = Object.create(null) as RuntimeEmitterListeners<TEvents>\n const off = <TName extends keyof TEvents>(name: TName, listener: RuntimeEmitterListener<TEvents[TName]>): void => {\n const current = listeners[name]\n if (!current) return\n const next = current.filter((candidate) => candidate !== listener) as readonly RuntimeEmitterListener<\n TEvents[TName]\n >[]\n if (next.length === 0) delete listeners[name]\n else if (next.length !== current.length) listeners[name] = next\n }\n\n return {\n hook(name, listener) {\n listeners[name] = [...(listeners[name] ?? []), listener] as readonly RuntimeEmitterListener<\n TEvents[typeof name]\n >[]\n return () => off(name, listener)\n },\n has(name) {\n return (listeners[name]?.length ?? 0) > 0\n },\n emit(name, ...args) {\n const current = listeners[name] as readonly RuntimeEmitterListener<TEvents[typeof name]>[] | undefined\n if (!current) return\n for (const listener of current) {\n try {\n if (args.length === 0) (listener as () => void)()\n else (listener as (value: TEvents[typeof name]) => void)(args[0] as TEvents[typeof name])\n } catch (error) {\n onError(name, error)\n }\n }\n },\n }\n}\n\nexport type RuntimePriorityRegistration<TListener, TOptions extends { priority: number }> = Readonly<\n TOptions & { listener: TListener; order: number }\n>\n\nexport interface RuntimeOrderedRegistry<TValue> {\n append(value: TValue): () => void\n prepend(value: TValue): () => void\n values(): readonly TValue[]\n has(): boolean\n clear(): void\n}\n\nexport interface RuntimePriorityRegistry<TListener, TOptions extends { priority: number }> {\n register(listener: TListener, options: TOptions): () => void\n entries(): readonly RuntimePriorityRegistration<TListener, TOptions>[]\n has(): boolean\n clear(): void\n}\n\nfunction createItems<TValue>() {\n let items: readonly TValue[] = []\n return {\n get: () => items,\n set: (next: readonly TValue[]) => {\n items = next\n },\n remove(value: TValue) {\n items = items.filter((candidate) => candidate !== value)\n },\n has: () => items.length > 0,\n clear: () => {\n items = []\n },\n }\n}\n\nexport function createRuntimeOrderedRegistry<TValue>(): RuntimeOrderedRegistry<TValue> {\n const items = createItems<TValue>()\n return {\n append(value) {\n items.set([...items.get(), value])\n return () => items.remove(value)\n },\n prepend(value) {\n items.set([value, ...items.get()])\n return () => items.remove(value)\n },\n values: items.get,\n has: items.has,\n clear: items.clear,\n }\n}\n\nexport function createRuntimePriorityRegistry<\n TListener,\n TOptions extends { priority: number },\n>(): RuntimePriorityRegistry<TListener, TOptions> {\n const items = createItems<RuntimePriorityRegistration<TListener, TOptions>>()\n let order = 0\n return {\n register(listener, options) {\n const registered = { ...options, listener, order: order++ } as RuntimePriorityRegistration<TListener, TOptions>\n items.set(\n [...items.get(), registered].sort((left, right) => {\n const priorityDiff = right.priority - left.priority\n return priorityDiff || left.order - right.order\n }),\n )\n return () => items.remove(registered)\n },\n entries: items.get,\n has: items.has,\n clear: items.clear,\n }\n}\n",
|
|
6
|
+
"import type { Binding, BindingsValidationResult, Bindings, KeymapEvent, ParsedBinding } from \"../../types.js\"\nimport { cloneKeySequence } from \"../keys.js\"\n\nfunction isKeyLike(value: unknown): boolean {\n return typeof value === \"string\" || (!!value && typeof value === \"object\" && !Array.isArray(value))\n}\n\nexport function validateBindings(bindings: unknown): BindingsValidationResult {\n if (!Array.isArray(bindings)) {\n return { ok: false, reason: \"Invalid keymap bindings: expected an array of binding objects\" }\n }\n\n for (const [index, binding] of bindings.entries()) {\n if (!binding || typeof binding !== \"object\" || Array.isArray(binding)) {\n return { ok: false, reason: `Invalid keymap binding at index ${index}: expected a binding object` }\n }\n\n if (!isKeyLike((binding as Binding).key)) {\n return {\n ok: false,\n reason: `Invalid keymap binding at index ${index}: expected \"key\" to be a string or keystroke object`,\n }\n }\n }\n\n return { ok: true }\n}\n\nexport function snapshotBindings<TTarget extends object, TEvent extends KeymapEvent>(\n bindings: Bindings<TTarget, TEvent>,\n): Binding<TTarget, TEvent>[] {\n const validation = validateBindings(bindings)\n if (!validation.ok) {\n throw new Error(validation.reason)\n }\n\n return bindings.map((binding) => ({\n ...binding,\n key: typeof binding.key === \"string\" ? binding.key : { ...binding.key },\n }))\n}\n\nexport function snapshotParsedBinding<TTarget extends object, TEvent extends KeymapEvent>(\n binding: ParsedBinding<TTarget, TEvent>,\n): ParsedBinding<TTarget, TEvent> {\n return {\n ...binding,\n sequence: cloneKeySequence(binding.sequence),\n }\n}\n",
|
|
7
|
+
"import type { CommandCatalogService } from \"./command-catalog.js\"\nimport type { AnalyzeLayerOptions, LayerDiagnostics } from \"./layers.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport { createRuntimeOrderedRegistry } from \"../lib/runtime-utils.js\"\nimport { cloneKeySequence } from \"./keys.js\"\nimport { snapshotParsedBinding } from \"./primitives/bindings.js\"\nimport type { BindingState, KeymapEvent, LayerAnalysisContext, LayerAnalyzer, LayerBindingAnalysis } from \"../types.js\"\n\nexport interface LayerDiagnosticsCore<TTarget extends object, TEvent extends KeymapEvent> extends LayerDiagnostics<\n TTarget,\n TEvent\n> {\n prependLayerAnalyzer(analyzer: LayerAnalyzer<TTarget, TEvent>): () => void\n appendLayerAnalyzer(analyzer: LayerAnalyzer<TTarget, TEvent>): () => void\n clearLayerAnalyzers(): void\n}\n\nexport function createLayerDiagnostics<TTarget extends object, TEvent extends KeymapEvent>(\n notify: NotificationService<TTarget, TEvent>,\n commands: CommandCatalogService<TTarget, TEvent>,\n): LayerDiagnosticsCore<TTarget, TEvent> {\n const analyzers = createRuntimeOrderedRegistry<LayerAnalyzer<TTarget, TEvent>>()\n\n return {\n prependLayerAnalyzer(analyzer) {\n return analyzers.prepend(analyzer)\n },\n appendLayerAnalyzer(analyzer) {\n return analyzers.append(analyzer)\n },\n clearLayerAnalyzers() {\n analyzers.clear()\n },\n analyzeLayer(options) {\n const registeredAnalyzers = analyzers.values()\n if (registeredAnalyzers.length === 0) return\n\n const bindings = buildLayerBindingAnalyses(options.bindings)\n const ctx: LayerAnalysisContext<TTarget, TEvent> = {\n target: options.target,\n order: options.order,\n sourceBindings: options.sourceBindings,\n bindings,\n hasTokenBindings: options.hasTokenBindings,\n checkCommandResolution(command) {\n return commands.getCommandResolutionStatus(command, options.commands)\n },\n warn(code, warning, message) {\n notify.emitWarning(code, warning, message)\n },\n warnOnce(key, code, warning, message) {\n notify.warnOnce(key, code, warning, message)\n },\n error(code, error, message) {\n notify.emitError(code, error, message)\n },\n }\n\n for (const analyzer of registeredAnalyzers) {\n try {\n analyzer(ctx)\n } catch (error) {\n notify.emitError(\"layer-analyzer-error\", error, \"[Keymap] Error in layer analyzer:\")\n }\n }\n },\n }\n}\n\nfunction buildLayerBindingAnalyses<TTarget extends object, TEvent extends KeymapEvent>(\n bindings: readonly BindingState<TTarget, TEvent>[],\n): LayerBindingAnalysis<TTarget, TEvent>[] {\n return bindings.map((binding) => ({\n sequence: cloneKeySequence(binding.sequence),\n command: binding.command,\n attrs: binding.attrs,\n event: binding.event,\n preventDefault: binding.preventDefault,\n fallthrough: binding.fallthrough,\n parsedBinding: snapshotParsedBinding(binding.parsedBinding),\n sourceTarget: binding.sourceTarget,\n sourceLayerOrder: binding.sourceLayerOrder,\n bindingIndex: binding.bindingIndex,\n hasCommandAtSequence: bindings.some((candidate) => {\n return candidate.event === \"press\" && candidate.command !== undefined && sameSequence(candidate, binding)\n }),\n hasContinuations: bindings.some((candidate) => {\n return candidate.event === \"press\" && isPrefix(binding, candidate)\n }),\n }))\n}\n\nfunction sameSequence<TTarget extends object, TEvent extends KeymapEvent>(\n left: BindingState<TTarget, TEvent>,\n right: BindingState<TTarget, TEvent>,\n): boolean {\n return (\n left.sequence.length === right.sequence.length &&\n left.sequence.every((part, index) => part.match === right.sequence[index]?.match)\n )\n}\n\nfunction isPrefix<TTarget extends object, TEvent extends KeymapEvent>(\n left: BindingState<TTarget, TEvent>,\n right: BindingState<TTarget, TEvent>,\n): boolean {\n return (\n left.sequence.length < right.sequence.length &&\n left.sequence.every((part, index) => part.match === right.sequence[index]?.match)\n )\n}\n",
|
|
8
|
+
"import type { ActiveKey, ActiveKeyOptions, KeymapEvent } from \"../types.js\"\n\nexport interface ActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent> {\n version: number\n notifyVersion: number\n focused: TTarget | null | undefined\n value: readonly ActiveKey<TTarget, TEvent>[]\n targets: WeakMap<TTarget, { version: number; value: readonly ActiveKey<TTarget, TEvent>[] }>\n nullTarget?: { version: number; value: readonly ActiveKey<TTarget, TEvent>[] }\n}\n\nexport interface ActiveKeysCaches<TTarget extends object, TEvent extends KeymapEvent> {\n plain: ActiveKeysCache<TTarget, TEvent>\n bindings: ActiveKeysCache<TTarget, TEvent>\n metadata: ActiveKeysCache<TTarget, TEvent>\n bindingsAndMetadata: ActiveKeysCache<TTarget, TEvent>\n}\n\nexport function createActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(): ActiveKeysCache<\n TTarget,\n TEvent\n> {\n return {\n version: -1,\n notifyVersion: -1,\n focused: undefined,\n value: [],\n targets: new WeakMap<TTarget, { version: number; value: readonly ActiveKey<TTarget, TEvent>[] }>(),\n }\n}\n\nexport function createActiveKeysCaches<TTarget extends object, TEvent extends KeymapEvent>(): ActiveKeysCaches<\n TTarget,\n TEvent\n> {\n return {\n plain: createActiveKeysCache(),\n bindings: createActiveKeysCache(),\n metadata: createActiveKeysCache(),\n bindingsAndMetadata: createActiveKeysCache(),\n }\n}\n\nexport function getActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(\n caches: ActiveKeysCaches<TTarget, TEvent>,\n options?: ActiveKeyOptions,\n): ActiveKeysCache<TTarget, TEvent> {\n if (options === undefined) {\n return caches.plain\n }\n\n const includeBindings = options.includeBindings === true\n const includeMetadata = options.includeMetadata === true\n return includeBindings\n ? includeMetadata\n ? caches.bindingsAndMetadata\n : caches.bindings\n : includeMetadata\n ? caches.metadata\n : caches.plain\n}\n\nexport function getFocusedActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(\n cache: ActiveKeysCache<TTarget, TEvent>,\n cacheVersion: number,\n focused: TTarget | null,\n): { version: number; value: readonly ActiveKey<TTarget, TEvent>[] } | undefined {\n const cached = focused ? cache.targets.get(focused) : cache.nullTarget\n return cached?.version === cacheVersion ? cached : undefined\n}\n\nexport function setFocusedActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(\n cache: ActiveKeysCache<TTarget, TEvent>,\n cacheVersion: number,\n focused: TTarget | null,\n value: readonly ActiveKey<TTarget, TEvent>[],\n): void {\n const cached = { version: cacheVersion, value }\n if (focused) {\n cache.targets.set(focused, cached)\n } else {\n cache.nullTarget = cached\n }\n}\n",
|
|
9
|
+
"import type { KeymapEvent, KeySequencePart, PendingSequenceCapture, PendingSequenceState } from \"../types.js\"\nimport { createKeySequencePart, stringifyKeyStroke } from \"./keys.js\"\n\nexport function isSamePendingSequence<TTarget extends object, TEvent extends KeymapEvent>(\n current: PendingSequenceState<TTarget, TEvent> | null,\n next: PendingSequenceState<TTarget, TEvent> | null,\n): boolean {\n if (current === next) {\n return true\n }\n\n if (!current || !next) {\n return false\n }\n\n if (current.captures.length !== next.captures.length) {\n return false\n }\n\n for (let index = 0; index < current.captures.length; index += 1) {\n const left = current.captures[index]\n const right = next.captures[index]\n if (\n !left ||\n !right ||\n left.layer !== right.layer ||\n left.binding !== right.binding ||\n left.index !== right.index ||\n left.parts.length !== right.parts.length\n ) {\n return false\n }\n\n for (let partIndex = 0; partIndex < left.parts.length; partIndex += 1) {\n if (left.parts[partIndex]?.match !== right.parts[partIndex]?.match) {\n return false\n }\n }\n\n const leftPatterns = left.patterns ?? []\n const rightPatterns = right.patterns ?? []\n if (leftPatterns.length !== rightPatterns.length) {\n return false\n }\n\n for (let patternIndex = 0; patternIndex < leftPatterns.length; patternIndex += 1) {\n const leftPattern = leftPatterns[patternIndex]\n const rightPattern = rightPatterns[patternIndex]\n if (!leftPattern || !rightPattern || leftPattern.name !== rightPattern.name) {\n return false\n }\n\n if (leftPattern.values.length !== rightPattern.values.length) {\n return false\n }\n\n for (let valueIndex = 0; valueIndex < leftPattern.values.length; valueIndex += 1) {\n if (!Object.is(leftPattern.values[valueIndex], rightPattern.values[valueIndex])) {\n return false\n }\n }\n }\n }\n\n return true\n}\n\nexport function popCapture<TTarget extends object, TEvent extends KeymapEvent>(\n capture: PendingSequenceCapture<TTarget, TEvent>,\n): PendingSequenceCapture<TTarget, TEvent> | undefined {\n const lastPart = capture.parts.at(-1)\n if (!lastPart || capture.parts.length <= 1) {\n return undefined\n }\n\n let index = capture.index - 1\n let patterns = capture.patterns\n if (lastPart.patternName) {\n const lastPattern = patterns?.at(-1)\n if (lastPattern?.name === lastPart.patternName) {\n if (lastPattern.values.length > 1) {\n index = capture.index\n patterns = [\n ...(patterns ?? []).slice(0, -1),\n {\n ...lastPattern,\n values: lastPattern.values.slice(0, -1),\n parts: lastPattern.parts.slice(0, -1),\n },\n ]\n } else {\n patterns = (patterns ?? []).slice(0, -1)\n }\n }\n }\n\n return {\n layer: capture.layer,\n binding: capture.binding,\n index,\n parts: capture.parts.slice(0, -1),\n patterns,\n }\n}\n\nexport function collectSequencePartsFromPending<TTarget extends object, TEvent extends KeymapEvent>(\n pending: PendingSequenceState<TTarget, TEvent>,\n): KeySequencePart[] {\n const firstCapture = pending.captures[0]\n if (!firstCapture || firstCapture.parts.length === 0) {\n return []\n }\n\n const parts: KeySequencePart[] = []\n for (let index = 0; index < firstCapture.parts.length; index += 1) {\n const firstPart = firstCapture.parts[index]\n if (!firstPart) continue\n let display: string | undefined\n let tokenName: string | undefined\n let hasDisplayConflict = false\n let hasTokenConflict = false\n\n for (const capture of pending.captures) {\n const part = capture.parts[index]\n if (!part) {\n continue\n }\n\n if (display === undefined) {\n display = part.display\n tokenName = part.tokenName\n continue\n }\n\n if (!hasDisplayConflict && display !== part.display) {\n hasDisplayConflict = true\n }\n\n if (!hasTokenConflict && tokenName !== part.tokenName) {\n hasTokenConflict = true\n }\n }\n\n if (display === undefined || hasDisplayConflict) {\n display = stringifyKeyStroke(firstPart.stroke)\n }\n\n if (hasTokenConflict) {\n tokenName = undefined\n }\n\n parts.push(\n createKeySequencePart(firstPart.stroke, {\n display,\n match: firstPart.match,\n tokenName,\n }),\n )\n }\n\n return parts\n}\n",
|
|
10
|
+
"import type { RuntimeEmitter } from \"../lib/runtime-utils.js\"\nimport type {\n ActiveBinding,\n ActiveKey,\n ActiveKeyOptions,\n ActiveKeySelection,\n ActiveKeyState,\n BindingState,\n Hooks,\n KeyMatch,\n KeymapEvent,\n KeymapHost,\n PendingSequenceCapture,\n KeySequencePart,\n NormalizedKeyStroke,\n PendingSequenceState,\n RegisteredLayer,\n SequenceNode,\n} from \"../types.js\"\nimport {\n getActiveLayersForFocused,\n getFocusedTargetIfAvailable as getHostFocusedTargetIfAvailable,\n isLayerActiveForFocused,\n} from \"./primitives/active-layers.js\"\nimport { captureHasContinuations } from \"./primitives/pending-captures.js\"\nimport {\n createActiveKeysCaches,\n getActiveKeysCache,\n getFocusedActiveKeysCache,\n setFocusedActiveKeysCache,\n type ActiveKeysCache,\n} from \"./active-key-cache.js\"\nimport type { CommandCatalogService } from \"./command-catalog.js\"\nimport { cloneKeyStroke, stringifyKeyStroke } from \"./keys.js\"\nimport type { ConditionService } from \"./conditions.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { ActiveCommandView, State } from \"./state.js\"\nimport { activeOptionsForCaptures, type SequenceActiveOption } from \"./sequence-index.js\"\nimport { collectSequencePartsFromPending, isSamePendingSequence, popCapture } from \"./pending-sequence.js\"\n\nfunction getLiveHost<TTarget extends object, TEvent extends KeymapEvent>(\n host: KeymapHost<TTarget, TEvent>,\n): KeymapHost<TTarget, TEvent> {\n if (host.isDestroyed) {\n throw new Error(\"Cannot use a keymap after its host was destroyed\")\n }\n\n return host\n}\n\ninterface ActivationOptions<TTarget extends object, TEvent extends KeymapEvent> {\n onPendingSequenceChanged?: (\n previous: PendingSequenceState<TTarget, TEvent> | null,\n next: PendingSequenceState<TTarget, TEvent> | null,\n ) => void\n}\n\nexport interface ActivationService<TTarget extends object, TEvent extends KeymapEvent> {\n getFocusedTarget(): TTarget | null\n getFocusedTargetIfAvailable(): TTarget | null\n setPendingSequence(next: PendingSequenceState<TTarget, TEvent> | null): void\n ensureValidPendingSequence(): PendingSequenceState<TTarget, TEvent> | undefined\n revalidatePendingSequenceIfNeeded(): void\n hasPendingSequenceState(): boolean\n getPendingSequence(): readonly KeySequencePart[]\n popPendingSequence(): boolean\n getActiveKeys(options?: ActiveKeyOptions): readonly ActiveKey<TTarget, TEvent>[]\n getActiveKeysForCaptures(\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n options?: ActiveKeyOptions,\n ): readonly ActiveKey<TTarget, TEvent>[]\n getActiveKeysForFocused(focused: TTarget | null, options?: ActiveKeyOptions): readonly ActiveKey<TTarget, TEvent>[]\n getActiveLayers(focused: TTarget | null): RegisteredLayer<TTarget, TEvent>[]\n isLayerActiveForFocused(layer: RegisteredLayer<TTarget, TEvent>, focused: TTarget | null): boolean\n collectSequencePartsFromPending(pending: PendingSequenceState<TTarget, TEvent>): KeySequencePart[]\n collectMatchingBindings(\n bindings: readonly BindingState<TTarget, TEvent>[],\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): BindingState<TTarget, TEvent>[]\n collectActiveBindings(\n bindings: readonly BindingState<TTarget, TEvent>[],\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): ActiveBinding<TTarget, TEvent>[]\n}\n\nexport function createActivationService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n host: KeymapHost<TTarget, TEvent>,\n hooks: RuntimeEmitter<Hooks<TTarget, TEvent>>,\n notify: NotificationService<TTarget, TEvent>,\n conditions: ConditionService<TTarget, TEvent>,\n catalog: CommandCatalogService<TTarget, TEvent>,\n options: ActivationOptions<TTarget, TEvent> = {},\n): ActivationService<TTarget, TEvent> {\n const activeKeysCaches = createActiveKeysCaches<TTarget, TEvent>()\n let pendingSequenceCacheVersion = -1\n let pendingSequenceCache: readonly KeySequencePart[] = []\n\n const getFocusedTarget = (): TTarget | null => {\n return getLiveHost(host).getFocusedTarget()\n }\n\n const getFocusedTargetIfAvailable = (): TTarget | null => {\n return getHostFocusedTargetIfAvailable(host)\n }\n\n const setPendingSequence = (next: PendingSequenceState<TTarget, TEvent> | null): void => {\n const previous = state.pending\n if (isSamePendingSequence(previous, next)) {\n return\n }\n\n state.pending = next\n options.onPendingSequenceChanged?.(previous, next)\n notifyPendingSequenceChange()\n notify.queueStateChange()\n }\n\n const ensureValidPendingSequence = (): PendingSequenceState<TTarget, TEvent> | undefined => {\n const pending = state.pending\n if (!pending) {\n return undefined\n }\n\n const focused = getFocusedTarget()\n const activeView = catalog.getActiveCommandView(focused)\n const captures = pending.captures.filter((capture) => {\n return (\n state.layers.has(capture.layer) &&\n isActiveLayerForFocused(capture.layer, focused) &&\n conditions.matchesConditions(capture.layer) &&\n bindingMatchesRuntimeState(capture.binding, focused, activeView) &&\n captureHasContinuations(capture, state.patterns)\n )\n })\n\n if (captures.length === 0) {\n setPendingSequence(null)\n return undefined\n }\n\n if (captures.length !== pending.captures.length) {\n setPendingSequence({ captures })\n }\n\n return state.pending ?? undefined\n }\n\n const revalidatePendingSequenceIfNeeded = (): void => {\n if (host.isDestroyed || !state.pending) {\n return\n }\n\n ensureValidPendingSequence()\n }\n\n const hasPendingSequenceState = (): boolean => {\n return !host.isDestroyed && state.pending !== null\n }\n\n const getPendingSequence = (): readonly KeySequencePart[] => {\n if (pendingSequenceCacheVersion === state.cacheVersion) {\n return pendingSequenceCache\n }\n\n const pending = ensureValidPendingSequence()\n const sequence = pending ? collectSequencePartsFromPending(pending) : []\n if (!pending || allRegisteredLayersCanCacheActiveKeys()) {\n pendingSequenceCacheVersion = state.cacheVersion\n pendingSequenceCache = sequence\n }\n\n return sequence\n }\n\n const popPendingSequence = (): boolean => {\n const pending = ensureValidPendingSequence()\n if (!pending) {\n return false\n }\n\n const firstCapture = pending.captures[0]\n if (!firstCapture || firstCapture.parts.length <= 1) {\n setPendingSequence(null)\n return true\n }\n\n const nextCaptures: PendingSequenceCapture<TTarget, TEvent>[] = []\n\n for (const capture of pending.captures) {\n const nextCapture = popCapture(capture)\n if (!nextCapture) {\n continue\n }\n\n nextCaptures.push(nextCapture)\n }\n\n if (nextCaptures.length === 0) {\n setPendingSequence(null)\n return true\n }\n\n setPendingSequence({ captures: nextCaptures })\n return true\n }\n\n const getActiveKeys = (options?: ActiveKeyOptions): readonly ActiveKey<TTarget, TEvent>[] => {\n const includeBindings = options?.includeBindings === true\n const includeMetadata = options?.includeMetadata === true\n const cache = getActiveKeysCache(activeKeysCaches, options)\n\n if (cache.notifyVersion === state.derivedVersion) {\n return cache.value\n }\n\n return collectActiveKeysForCache(cache, includeBindings, includeMetadata)\n }\n\n const collectActiveKeysForCache = (\n cache: ActiveKeysCache<TTarget, TEvent>,\n includeBindings: boolean,\n includeMetadata: boolean,\n ): readonly ActiveKey<TTarget, TEvent>[] => {\n if (host.isDestroyed) {\n getLiveHost(host)\n }\n\n const focused = getFocusedTarget()\n const cached = getFocusedActiveKeysCache(cache, state.cacheVersion, focused)\n if (cached) {\n cache.notifyVersion = state.derivedVersion\n cache.version = state.cacheVersion\n cache.focused = focused\n cache.value = cached.value\n return cached.value\n }\n\n const activeView = catalog.getActiveCommandView(focused)\n const pending = ensureValidPendingSequence()\n const activeLayers = pending ? [] : getActiveLayers(focused)\n\n const activeKeys = pending\n ? collectActiveKeysFromPending(pending.captures, includeBindings, includeMetadata, focused, activeView)\n : collectActiveKeysAtRoot(activeLayers, includeBindings, includeMetadata, focused, activeView)\n\n const canUseCache = pending ? allRegisteredLayersCanCacheActiveKeys() : activeLayersCanCacheActiveKeys(activeLayers)\n if (canUseCache) {\n cache.version = state.cacheVersion\n cache.notifyVersion = state.derivedVersion\n cache.focused = focused\n cache.value = activeKeys\n setFocusedActiveKeysCache(cache, state.cacheVersion, focused, activeKeys)\n }\n\n return activeKeys\n }\n\n const getActiveKeysForCaptures = (\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n options?: ActiveKeyOptions,\n ): readonly ActiveKey<TTarget, TEvent>[] => {\n const includeBindings = options?.includeBindings === true\n const includeMetadata = options?.includeMetadata === true\n const focused = getFocusedTarget()\n const activeView = catalog.getActiveCommandView(focused)\n\n return collectActiveKeysFromPending(captures, includeBindings, includeMetadata, focused, activeView)\n }\n\n const getActiveKeysForFocused = (\n focused: TTarget | null,\n options?: ActiveKeyOptions,\n ): readonly ActiveKey<TTarget, TEvent>[] => {\n const includeBindings = options?.includeBindings === true\n const includeMetadata = options?.includeMetadata === true\n const currentFocused = getFocusedTargetIfAvailable()\n const pending = focused === currentFocused ? ensureValidPendingSequence() : undefined\n const activeView = catalog.getActiveCommandView(focused)\n\n if (pending) {\n return collectActiveKeysFromPending(pending.captures, includeBindings, includeMetadata, focused, activeView)\n }\n\n return collectActiveKeysAtRoot(getActiveLayers(focused), includeBindings, includeMetadata, focused, activeView)\n }\n\n const getActiveLayers = (focused: TTarget | null): RegisteredLayer<TTarget, TEvent>[] => {\n if (state.activeLayersCacheVersion === state.cacheVersion && state.activeLayersCacheFocused === focused) {\n return state.activeLayersCache\n }\n\n state.activeLayersCacheVersion = state.cacheVersion\n state.activeLayersCacheFocused = focused\n state.activeLayersCache = getActiveLayersForFocused(state.sortedLayers, host, focused) as RegisteredLayer<\n TTarget,\n TEvent\n >[]\n return state.activeLayersCache\n }\n\n const isActiveLayerForFocused = (layer: RegisteredLayer<TTarget, TEvent>, focused: TTarget | null): boolean => {\n return isLayerActiveForFocused(host, layer, focused)\n }\n\n const activeLayersCanCacheActiveKeys = (activeLayers: readonly RegisteredLayer<TTarget, TEvent>[]): boolean => {\n return !state.commandResolvers.has() && state.activeKeyCacheBlockers === 0\n }\n\n const allRegisteredLayersCanCacheActiveKeys = (): boolean => {\n return !state.commandResolvers.has() && state.activeKeyCacheBlockers === 0\n }\n\n const collectMatchingBindings = (\n bindings: readonly BindingState<TTarget, TEvent>[],\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): BindingState<TTarget, TEvent>[] => {\n const matches: BindingState<TTarget, TEvent>[] = []\n\n for (const binding of bindings) {\n if (conditions.matchesConditions(binding) && catalog.isBindingVisible(binding, focused, activeView)) {\n matches.push(binding)\n }\n }\n\n return matches\n }\n\n const bindingMatchesRuntimeState = (\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): boolean => {\n return conditions.matchesConditions(binding) && catalog.isBindingVisible(binding, focused, activeView)\n }\n\n const getPartPresentation = (\n bindings: readonly BindingState<TTarget, TEvent>[],\n partIndex: number,\n ): { display: string; tokenName?: string } => {\n let display: string | undefined\n let tokenName: string | undefined\n let hasDisplayConflict = false\n let hasTokenConflict = false\n\n for (const binding of bindings) {\n const part = binding.sequence[partIndex]\n if (!part) {\n continue\n }\n\n if (display === undefined) {\n display = part.display\n tokenName = part.tokenName\n continue\n }\n\n if (!hasDisplayConflict && display !== part.display) {\n hasDisplayConflict = true\n }\n\n if (!hasTokenConflict && tokenName !== part.tokenName) {\n hasTokenConflict = true\n }\n }\n\n if (display === undefined || hasDisplayConflict) {\n const stroke = bindings[0]?.sequence[partIndex]?.stroke\n display = stroke ? stringifyKeyStroke(stroke) : \"\"\n }\n\n if (hasTokenConflict) {\n tokenName = undefined\n }\n\n return {\n display,\n tokenName,\n }\n }\n\n const toActiveBinding = (\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): ActiveBinding<TTarget, TEvent> => {\n return {\n sequence: binding.sequence,\n command: binding.command,\n commandAttrs: catalog.getBindingCommandAttrs(binding, focused, activeView),\n attrs: binding.attrs,\n event: binding.event,\n preventDefault: binding.preventDefault,\n fallthrough: binding.fallthrough,\n }\n }\n\n const collectActiveBindings = (\n bindings: readonly BindingState<TTarget, TEvent>[],\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): ActiveBinding<TTarget, TEvent>[] => {\n return bindings.map((binding) => toActiveBinding(binding, focused, activeView))\n }\n\n const collectActiveKeysAtRoot = (\n activeLayers: RegisteredLayer<TTarget, TEvent>[],\n includeBindings: boolean,\n includeMetadata: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): readonly ActiveKey<TTarget, TEvent>[] => {\n const activeKeys = new Map<KeyMatch, ActiveKeyState<TTarget, TEvent>>()\n const stopped = new Set<KeyMatch>()\n\n for (const layer of activeLayers) {\n if (\n (layer.root.children.size === 0 && layer.root.patternChildren.length === 0) ||\n !conditions.matchesConditions(layer)\n ) {\n continue\n }\n\n collectActiveKeyNodes(layer.root.children.values(), activeKeys, stopped, includeBindings, focused, activeView)\n collectActiveKeyNodes(layer.root.patternChildren, activeKeys, stopped, includeBindings, focused, activeView)\n }\n\n return materializeActiveKeys(activeKeys, includeBindings, includeMetadata, focused, activeView)\n }\n\n const collectActiveKeyNodes = (\n nodes: Iterable<SequenceNode<TTarget, TEvent>>,\n activeKeys: Map<KeyMatch, ActiveKeyState<TTarget, TEvent>>,\n stopped: Set<KeyMatch>,\n includeBindings: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): void => {\n for (const node of nodes) {\n const bindingKey = node.match\n if (!bindingKey || stopped.has(bindingKey) || !node.stroke) {\n continue\n }\n\n const selection = selectActiveKeyNode(node, includeBindings, focused, activeView)\n if (!selection) {\n continue\n }\n\n const existing = activeKeys.get(bindingKey)\n if (!existing) {\n activeKeys.set(bindingKey, createActiveKeyState(node.stroke, selection, includeBindings))\n } else {\n updateActiveKeyState(existing, selection, includeBindings)\n }\n\n if (selection.stop) {\n stopped.add(bindingKey)\n }\n }\n }\n\n const selectActiveKeyNode = (\n node: SequenceNode<TTarget, TEvent>,\n includeBindings: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): ActiveKeySelection<TTarget, TEvent> | undefined => {\n const continues = node.children.size > 0 || node.patternChildren.length > 0\n if (!continues) {\n const selected = selectActiveBindings(\n nodeExactBindingsNeedPrefilter(node)\n ? collectMatchingBindings(node.bindings, focused, activeView)\n : node.bindings,\n focused,\n activeView,\n )\n if (!selected) {\n return undefined\n }\n\n const presentation = getPartPresentation(selected.bindings, node.depth - 1)\n\n return {\n display: presentation.display,\n tokenName: presentation.tokenName,\n continues: false,\n firstBinding: selected.bindings[0],\n commandBinding: selected.commandBinding,\n bindings: includeBindings ? [...selected.bindings] : undefined,\n stop: selected.stop,\n }\n }\n\n const reachableBindings = collectMatchingBindings(node.reachableBindings, focused, activeView)\n if (reachableBindings.length === 0) {\n return undefined\n }\n\n const selected = selectActiveBindings(node.bindings, focused, activeView)\n const presentation = getPartPresentation(reachableBindings, node.depth - 1)\n\n return {\n display: presentation.display,\n tokenName: presentation.tokenName,\n continues: true,\n firstBinding: selected?.bindings[0],\n commandBinding: selected?.commandBinding,\n bindings: includeBindings && selected ? [...selected.bindings] : undefined,\n stop: true,\n }\n }\n\n const nodeExactBindingsNeedPrefilter = (node: SequenceNode<TTarget, TEvent>): boolean => {\n if (state.commandResolvers.has()) {\n return true\n }\n\n for (const binding of node.bindings) {\n if (binding.matchers.length > 0) {\n return true\n }\n }\n\n return false\n }\n\n const collectActiveKeysFromPending = (\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n includeBindings: boolean,\n includeMetadata: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): readonly ActiveKey<TTarget, TEvent>[] => {\n const activeKeys = new Map<KeyMatch, ActiveKeyState<TTarget, TEvent>>()\n const stopped = new Set<KeyMatch>()\n collectActiveKeyOptions(\n activeOptionsForCaptures(captures, state.patterns),\n activeKeys,\n stopped,\n includeBindings,\n focused,\n activeView,\n )\n\n return materializeActiveKeys(activeKeys, includeBindings, includeMetadata, focused, activeView)\n }\n\n const collectActiveKeyOptions = (\n options: readonly SequenceActiveOption<TTarget, TEvent>[],\n activeKeys: Map<KeyMatch, ActiveKeyState<TTarget, TEvent>>,\n stopped: Set<KeyMatch>,\n includeBindings: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): void => {\n const seen = new Set<KeyMatch>()\n for (const option of options) {\n if (seen.has(option.part.match)) {\n continue\n }\n\n seen.add(option.part.match)\n collectActiveKeyOption(option, options, activeKeys, stopped, includeBindings, focused, activeView)\n }\n }\n\n const collectActiveKeyOption = (\n option: SequenceActiveOption<TTarget, TEvent>,\n siblingOptions: readonly SequenceActiveOption<TTarget, TEvent>[],\n activeKeys: Map<KeyMatch, ActiveKeyState<TTarget, TEvent>>,\n stopped: Set<KeyMatch>,\n includeBindings: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): void => {\n const bindingKey = option.part.match\n if (stopped.has(bindingKey)) {\n return\n }\n\n const selection = selectActiveKeyOption(option, siblingOptions, includeBindings, focused, activeView)\n if (!selection) {\n return\n }\n\n const existing = activeKeys.get(bindingKey)\n if (!existing) {\n activeKeys.set(bindingKey, createActiveKeyState(option.part.stroke, selection, includeBindings))\n } else {\n updateActiveKeyState(existing, selection, includeBindings)\n }\n\n if (selection.stop) {\n stopped.add(bindingKey)\n }\n }\n\n const materializeActiveKeys = (\n activeKeys: ReadonlyMap<KeyMatch, ActiveKeyState<TTarget, TEvent>>,\n includeBindings: boolean,\n includeMetadata: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): readonly ActiveKey<TTarget, TEvent>[] => {\n const materialized: ActiveKey<TTarget, TEvent>[] = []\n for (const state of activeKeys.values()) {\n const activeKey = materializeActiveKey(state, includeBindings, includeMetadata, focused, activeView)\n if (activeKey) {\n materialized.push(activeKey)\n }\n }\n\n return materialized\n }\n\n const selectActiveKeyOption = (\n option: SequenceActiveOption<TTarget, TEvent>,\n siblingOptions: readonly SequenceActiveOption<TTarget, TEvent>[],\n includeBindings: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): ActiveKeySelection<TTarget, TEvent> | undefined => {\n const matchingOptions = siblingOptions.filter((candidate) => candidate.part.match === option.part.match)\n const exactBindings = matchingOptions.filter((candidate) => candidate.exact).map((candidate) => candidate.binding)\n const selected = selectActiveBindings(exactBindings, focused, activeView)\n const continues = matchingOptions.some((candidate) => candidate.continues)\n\n if (!continues && !selected) {\n return undefined\n }\n\n const presentation = getOptionPresentation(matchingOptions)\n\n return {\n display: presentation.display,\n tokenName: presentation.tokenName,\n continues,\n firstBinding: selected?.bindings[0],\n commandBinding: selected?.commandBinding,\n bindings: includeBindings && selected ? [...selected.bindings] : undefined,\n stop: continues || selected?.stop === true,\n }\n }\n\n const getOptionPresentation = (\n options: readonly SequenceActiveOption<TTarget, TEvent>[],\n ): { display: string; tokenName?: string } => {\n let display: string | undefined\n let tokenName: string | undefined\n let hasDisplayConflict = false\n let hasTokenConflict = false\n\n for (const option of options) {\n const part = option.part\n if (display === undefined) {\n display = part.display\n tokenName = part.tokenName\n continue\n }\n\n if (!hasDisplayConflict && display !== part.display) {\n hasDisplayConflict = true\n }\n\n if (!hasTokenConflict && tokenName !== part.tokenName) {\n hasTokenConflict = true\n }\n }\n\n const firstPart = options[0]?.part\n if (display === undefined || hasDisplayConflict) {\n display = firstPart ? stringifyKeyStroke(firstPart.stroke) : \"\"\n }\n\n if (hasTokenConflict) {\n tokenName = undefined\n }\n\n return { display, tokenName }\n }\n\n const selectActiveBindings = (\n bindings: readonly BindingState<TTarget, TEvent>[],\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ):\n | {\n bindings: readonly BindingState<TTarget, TEvent>[]\n commandBinding?: BindingState<TTarget, TEvent>\n stop: boolean\n }\n | undefined => {\n const selected: BindingState<TTarget, TEvent>[] = []\n let commandBinding: BindingState<TTarget, TEvent> | undefined\n\n for (const binding of bindings) {\n if (!conditions.matchesConditions(binding) || !catalog.isBindingVisible(binding, focused, activeView)) {\n continue\n }\n\n selected.push(binding)\n if (binding.command === undefined) {\n continue\n }\n\n commandBinding ??= binding\n if (!binding.fallthrough) {\n return { bindings: selected, commandBinding, stop: true }\n }\n }\n\n if (selected.length === 0) {\n return undefined\n }\n\n return { bindings: selected, commandBinding, stop: false }\n }\n\n const createActiveKeyState = (\n stroke: NormalizedKeyStroke,\n selection: ActiveKeySelection<TTarget, TEvent>,\n includeBindings: boolean,\n ): ActiveKeyState<TTarget, TEvent> => {\n return {\n stroke,\n display: selection.display,\n tokenName: selection.tokenName,\n continues: selection.continues,\n firstBinding: selection.firstBinding,\n commandBinding: selection.commandBinding,\n bindings: includeBindings && selection.bindings ? [...selection.bindings] : undefined,\n }\n }\n\n const updateActiveKeyState = (\n state: ActiveKeyState<TTarget, TEvent>,\n selection: ActiveKeySelection<TTarget, TEvent>,\n includeBindings: boolean,\n ): void => {\n if (!state.firstBinding && selection.firstBinding) {\n state.firstBinding = selection.firstBinding\n }\n\n if (!state.commandBinding && selection.commandBinding) {\n state.commandBinding = selection.commandBinding\n }\n\n if (selection.continues) {\n state.continues = true\n }\n\n if (!includeBindings || !selection.bindings || selection.bindings.length === 0) {\n return\n }\n\n if (!state.bindings) {\n state.bindings = [...selection.bindings]\n return\n }\n\n state.bindings.push(...selection.bindings)\n }\n\n const materializeActiveKey = (\n state: ActiveKeyState<TTarget, TEvent>,\n includeBindings: boolean,\n includeMetadata: boolean,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): ActiveKey<TTarget, TEvent> | undefined => {\n if (!state.commandBinding && !state.continues) {\n return undefined\n }\n\n const activeKey: ActiveKey<TTarget, TEvent> = {\n stroke: cloneKeyStroke(state.stroke),\n display: state.display,\n continues: state.continues,\n }\n\n if (state.tokenName) {\n activeKey.tokenName = state.tokenName\n }\n\n if (state.commandBinding) {\n activeKey.command = state.commandBinding.command\n }\n\n if (includeBindings && state.bindings && state.bindings.length > 0) {\n activeKey.bindings =\n state.bindings.length === 1\n ? [toActiveBinding(state.bindings[0]!, focused, activeView)]\n : collectActiveBindings(state.bindings, focused, activeView)\n }\n\n if (includeMetadata) {\n if (state.firstBinding?.attrs) {\n activeKey.bindingAttrs = state.firstBinding.attrs\n }\n\n const commandAttrs = state.commandBinding\n ? catalog.getBindingCommandAttrs(state.commandBinding, focused, activeView)\n : undefined\n if (commandAttrs) {\n activeKey.commandAttrs = commandAttrs\n }\n }\n\n return activeKey\n }\n\n const notifyPendingSequenceChange = (): void => {\n if (!hooks.has(\"pendingSequence\")) {\n return\n }\n\n hooks.emit(\"pendingSequence\", state.pending ? collectSequencePartsFromPending(state.pending) : [])\n }\n\n return {\n getFocusedTarget,\n getFocusedTargetIfAvailable,\n setPendingSequence,\n ensureValidPendingSequence,\n revalidatePendingSequenceIfNeeded,\n hasPendingSequenceState,\n getPendingSequence,\n popPendingSequence,\n getActiveKeys,\n getActiveKeysForCaptures,\n getActiveKeysForFocused,\n getActiveLayers,\n isLayerActiveForFocused: isActiveLayerForFocused,\n collectSequencePartsFromPending,\n collectMatchingBindings,\n collectActiveBindings,\n }\n}\n",
|
|
11
|
+
"export const RESERVED_COMMAND_FIELDS = new Set([\"name\", \"run\", \"fields\", \"attrs\", \"rejectedResult\"])\n\nexport const RESERVED_BINDING_FIELDS = new Set([\"key\", \"cmd\", \"event\", \"preventDefault\", \"fallthrough\"])\n\nexport const RESERVED_LAYER_FIELDS = new Set([\"target\", \"targetMode\", \"priority\", \"bindings\", \"commands\"])\n",
|
|
12
|
+
"import type { BindingCommand, KeymapEvent } from \"../../types.js\"\n\nexport function normalizeBindingCommand<TTarget extends object, TEvent extends KeymapEvent>(\n command: BindingCommand<TTarget, TEvent> | undefined,\n): BindingCommand<TTarget, TEvent> | undefined {\n if (command === undefined || typeof command === \"function\") {\n return command\n }\n\n const trimmed = command.trim()\n if (!trimmed) {\n throw new Error(\"Invalid keymap command: command cannot be empty\")\n }\n\n return trimmed\n}\n\nexport function normalizeCommandName(name: string): string {\n const trimmed = name.trim()\n if (!trimmed) {\n throw new Error(\"Invalid keymap command name: name cannot be empty\")\n }\n\n if (/\\s/.test(trimmed)) {\n throw new Error(`Invalid keymap command name \"${name}\": command names cannot contain whitespace`)\n }\n\n return trimmed\n}\n",
|
|
13
|
+
"import type { ConditionService } from \"./conditions.js\"\nimport type { ActiveCommandView, CommandView, LayerCommandEntry, State } from \"./state.js\"\nimport type { KeymapEvent, KeymapHost, RegisteredLayer } from \"../types.js\"\nimport { getActiveLayersForFocused } from \"./primitives/active-layers.js\"\n\nfunction pushCommandEntry<TTarget extends object, TEvent extends KeymapEvent>(\n target: Map<string, LayerCommandEntry<TTarget, TEvent>[]>,\n name: string,\n entry: LayerCommandEntry<TTarget, TEvent>,\n): void {\n const existing = target.get(name)\n if (existing) existing.push(entry)\n else target.set(name, [entry])\n}\n\nexport function getRegisteredCommandView<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n): CommandView<TTarget, TEvent> {\n const entries: LayerCommandEntry<TTarget, TEvent>[] = []\n const chainsByName = new Map<string, LayerCommandEntry<TTarget, TEvent>[]>()\n\n for (const layer of state.layers) {\n for (const commandState of layer.commands) {\n const entry: LayerCommandEntry<TTarget, TEvent> = { layer, commandState }\n entries.push(entry)\n pushCommandEntry(chainsByName, commandState.command.name, entry)\n }\n }\n\n return { entries, chainsByName }\n}\n\nfunction collectActiveCommands<TTarget extends object, TEvent extends KeymapEvent>(\n layers: readonly RegisteredLayer<TTarget, TEvent>[],\n conditions: ConditionService<TTarget, TEvent>,\n checkLayerConditions: boolean,\n): ActiveCommandView<TTarget, TEvent> {\n const entries: LayerCommandEntry<TTarget, TEvent>[] = []\n const reachable: LayerCommandEntry<TTarget, TEvent>[] = []\n const reachableByName = new Map<string, LayerCommandEntry<TTarget, TEvent>>()\n const chainsByName = new Map<string, LayerCommandEntry<TTarget, TEvent>[]>()\n\n for (const layer of layers) {\n if (layer.commands.length === 0) continue\n if (checkLayerConditions && !conditions.matchesConditions(layer)) continue\n\n for (const commandState of layer.commands) {\n if (!conditions.matchesConditions(commandState)) continue\n\n const entry: LayerCommandEntry<TTarget, TEvent> = { layer, commandState }\n entries.push(entry)\n pushCommandEntry(chainsByName, commandState.command.name, entry)\n if (!reachableByName.has(commandState.command.name)) {\n reachableByName.set(commandState.command.name, entry)\n reachable.push(entry)\n }\n }\n }\n\n return { layers, entries, reachable, reachableByName, chainsByName }\n}\n\nexport function getActiveCommandView<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n host: KeymapHost<TTarget, TEvent>,\n conditions: ConditionService<TTarget, TEvent>,\n focused: TTarget | null,\n): ActiveCommandView<TTarget, TEvent> {\n if (state.activeLayersCacheVersion !== state.cacheVersion || state.activeLayersCacheFocused !== focused) {\n state.activeLayersCacheVersion = state.cacheVersion\n state.activeLayersCacheFocused = focused\n state.activeLayersCache = getActiveLayersForFocused(state.sortedLayers, host, focused) as RegisteredLayer<\n TTarget,\n TEvent\n >[]\n }\n\n return collectActiveCommands(state.activeLayersCache, conditions, true)\n}\n",
|
|
14
|
+
"import type {\n Attributes,\n BindingFieldContext,\n CommandFieldContext,\n EventData,\n KeymapEvent,\n LayerFieldContext,\n ReactiveMatcher,\n RuntimeMatcher,\n} from \"../../types.js\"\nimport type { ConditionService } from \"../conditions.js\"\n\nexport function mergeRequirement(target: EventData, name: string, value: unknown, source: string): void {\n if (Object.prototype.hasOwnProperty.call(target, name) && !Object.is(target[name], value)) {\n throw new Error(`Conflicting keymap requirement for \"${name}\" from ${source}`)\n }\n\n target[name] = value\n}\n\nexport function mergeAttribute(target: Attributes, name: string, value: unknown, source: string): void {\n if (Object.prototype.hasOwnProperty.call(target, name) && !Object.is(target[name], value)) {\n throw new Error(`Conflicting keymap attribute for \"${name}\" from ${source}`)\n }\n\n target[name] = value\n}\n\ninterface FieldCompilerContextOptions<TTarget extends object, TEvent extends KeymapEvent> {\n fieldName: string\n conditions: ConditionService<TTarget, TEvent>\n requirements: EventData\n matchers: RuntimeMatcher[]\n attrs?: Attributes\n}\n\nexport function createFieldCompilerContext<TTarget extends object, TEvent extends KeymapEvent>(\n options: FieldCompilerContextOptions<TTarget, TEvent> & { attrs: Attributes },\n): BindingFieldContext & CommandFieldContext & LayerFieldContext\nexport function createFieldCompilerContext<TTarget extends object, TEvent extends KeymapEvent>(\n options: FieldCompilerContextOptions<TTarget, TEvent> & { attrs?: undefined },\n): LayerFieldContext\nexport function createFieldCompilerContext<TTarget extends object, TEvent extends KeymapEvent>(\n options: FieldCompilerContextOptions<TTarget, TEvent>,\n): BindingFieldContext & CommandFieldContext & LayerFieldContext {\n const source = `field ${options.fieldName}`\n\n return {\n require(name: string, value: unknown) {\n mergeRequirement(options.requirements, name, value, source)\n },\n attr(name: string, value: unknown) {\n if (!options.attrs) {\n throw new Error(`Keymap ${source} cannot publish attrs`)\n }\n\n mergeAttribute(options.attrs, name, value, source)\n },\n activeWhen(matcher: (() => boolean) | ReactiveMatcher) {\n options.matchers.push(options.conditions.buildRuntimeMatcher(matcher, source))\n },\n }\n}\n",
|
|
15
|
+
"function isPlainObject(value: object): boolean {\n const prototype = Object.getPrototypeOf(value)\n return prototype === Object.prototype || prototype === null\n}\n\nexport function getErrorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error && error.message) {\n return error.message\n }\n\n return fallback\n}\n\nexport function isPromiseLike(value: unknown): value is Promise<unknown> {\n if (!value) {\n return false\n }\n\n if (typeof value !== \"object\" && typeof value !== \"function\") {\n return false\n }\n\n return typeof (value as { then?: unknown }).then === \"function\"\n}\n\nexport function snapshotDataValue(\n value: unknown,\n options?: {\n deep?: boolean\n freeze?: boolean\n preserveNonPlainObjects?: boolean\n },\n): unknown {\n const deep = options?.deep === true\n const freeze = options?.freeze === true\n const preserveNonPlainObjects = options?.preserveNonPlainObjects === true\n\n if (Array.isArray(value)) {\n const cloned = deep ? value.map((entry) => snapshotDataValue(entry, options)) : [...value]\n return freeze ? Object.freeze(cloned) : cloned\n }\n\n if (value && typeof value === \"object\") {\n if (preserveNonPlainObjects && !isPlainObject(value)) {\n return value\n }\n\n const cloned: Record<string, unknown> = {}\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n cloned[key] = deep ? snapshotDataValue(entry, options) : entry\n }\n\n return freeze ? Object.freeze(cloned) : cloned\n }\n\n return value\n}\n",
|
|
16
|
+
"import { RESERVED_COMMAND_FIELDS } from \"../schema.js\"\nimport type {\n ActiveBinding,\n Attributes,\n Command,\n CommandEntry,\n CommandBindingsQuery,\n CommandFieldCompiler,\n CommandResolutionStatus,\n CommandQuery,\n CommandQueryValue,\n CommandResolver,\n CommandResolverContext,\n BindingState,\n EventData,\n KeymapEvent,\n KeymapHost,\n CommandState,\n RuntimeMatcher,\n} from \"../types.js\"\nimport { normalizeCommandName } from \"./primitives/command-normalization.js\"\nimport { getFocusedTargetIfAvailable, isLayerActiveForFocused } from \"./primitives/active-layers.js\"\nimport { getActiveCommandView as createActiveCommandView, getRegisteredCommandView } from \"./runtime-view.js\"\nimport type { ConditionService } from \"./conditions.js\"\nimport { createFieldCompilerContext } from \"./primitives/field-invariants.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { ActiveCommandView, LayerCommandEntry, CommandView, ResolvedCommandEntry, State } from \"./state.js\"\nimport { getErrorMessage } from \"./values.js\"\n\nconst DEFAULT_COMMAND_SEARCH_FIELDS = [\"name\"] as const\n\nconst EMPTY_COMMAND_FIELDS: Readonly<Record<string, unknown>> = Object.freeze({})\nconst commandSearchCache = new WeakMap<CommandState<any, any>, Map<string, string | undefined>>()\n\ninterface NormalizeCommandsOptions<TTarget extends object, TEvent extends KeymapEvent> {\n commands: readonly Command<TTarget, TEvent>[]\n commandFields: ReadonlyMap<string, CommandFieldCompiler>\n conditions: ConditionService<TTarget, TEvent>\n onError(code: string, error: unknown, message: string): void\n}\n\ninterface QueryLayerCommandEntriesOptions<TTarget extends object, TEvent extends KeymapEvent> {\n entries: Iterable<LayerCommandEntry<TTarget, TEvent>>\n query?: CommandQuery<TTarget, TEvent>\n getCommand(command: CommandState<TTarget, TEvent>): Command<TTarget, TEvent>\n onFilterError(error: unknown): void\n}\n\ninterface CommandQueryMatchOptions<TTarget extends object, TEvent extends KeymapEvent> {\n getCommand(command: CommandState<TTarget, TEvent>): Command<TTarget, TEvent>\n onFilterError(error: unknown): void\n}\n\ninterface CommandCatalogOptions {\n onCommandResolversChanged(): void\n}\n\ninterface ResolvedCommandLookup<TTarget extends object, TEvent extends KeymapEvent> {\n resolved?: ResolvedCommandEntry<TTarget, TEvent>\n hadError: boolean\n}\n\ninterface CommandExecutionFields {\n input: string\n payload?: unknown\n}\n\ninterface CommandResolverAttempt<TTarget extends object, TEvent extends KeymapEvent> {\n context: CommandResolverContext<TTarget, TEvent>\n getExecutionFields(): CommandExecutionFields\n}\n\nexport interface CommandCatalogService<TTarget extends object, TEvent extends KeymapEvent> {\n normalizeCommands(commands: readonly Command<TTarget, TEvent>[]): CommandState<TTarget, TEvent>[]\n prependCommandResolver(resolver: CommandResolver<TTarget, TEvent>): () => void\n appendCommandResolver(resolver: CommandResolver<TTarget, TEvent>): () => void\n clearCommandResolvers(): void\n getCommands(query?: CommandQuery<TTarget, TEvent>): readonly Command<TTarget, TEvent>[]\n getCommandEntries(query?: CommandQuery<TTarget, TEvent>): readonly CommandEntry<TTarget, TEvent>[]\n getCommandBindings(\n query: CommandBindingsQuery<TTarget>,\n ): ReadonlyMap<string, readonly ActiveBinding<TTarget, TEvent>[]>\n getResolvedCommandChain(\n command: string,\n focused: TTarget | null,\n execution?: CommandExecutionFields,\n ): { entries?: readonly ResolvedCommandEntry<TTarget, TEvent>[]; hadError: boolean }\n getRegisteredResolvedEntries(command: string): readonly ResolvedCommandEntry<TTarget, TEvent>[] | undefined\n getActiveRegisteredResolvedEntries(\n command: string,\n focused: TTarget | null,\n ): readonly ResolvedCommandEntry<TTarget, TEvent>[] | undefined\n resolveRegisteredResolverFallback(\n command: string,\n execution?: CommandExecutionFields,\n ): ResolvedCommandLookup<TTarget, TEvent>\n resolveActiveResolverFallback(\n command: string,\n focused: TTarget | null,\n execution?: CommandExecutionFields,\n ): ResolvedCommandLookup<TTarget, TEvent>\n getTopCommand(command: string, focused: TTarget | null): Command<TTarget, TEvent> | undefined\n getDispatchUnavailableCommandState(\n command: string,\n focused: TTarget | null,\n includeCommand: boolean,\n ): { reason: \"inactive\" | \"disabled\"; command?: Command<TTarget, TEvent> } | undefined\n getActiveCommandView(focused: TTarget | null): ActiveCommandView<TTarget, TEvent>\n isBindingVisible(\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): boolean\n getBindingCommandAttrs(\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): Readonly<Attributes> | undefined\n getCommandResolutionStatus(\n command: string,\n layerCommands?: readonly CommandState<TTarget, TEvent>[],\n ): CommandResolutionStatus\n}\n\nexport function createCommandCatalogService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n host: KeymapHost<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n conditions: ConditionService<TTarget, TEvent>,\n options: CommandCatalogOptions,\n): CommandCatalogService<TTarget, TEvent> {\n let registeredViewVersion = -1\n let registeredView: CommandView<TTarget, TEvent> | undefined\n let activeViewVersion = -1\n let activeViewFocused: TTarget | null | undefined\n let activeView: ActiveCommandView<TTarget, TEvent> | undefined\n let registeredBindingsCacheVersion = -1\n let registeredBindingsCacheCommands: readonly string[] | undefined\n let registeredBindingsCache: ReadonlyMap<string, readonly ActiveBinding<TTarget, TEvent>[]> | undefined\n let registeredBindingsByCommandVersion = -1\n let registeredBindingsByCommand: ReadonlyMap<string, readonly BindingState<TTarget, TEvent>[]> | undefined\n let registeredResolvedCacheVersion = -1\n let registeredResolvedCache = new Map<string, readonly ResolvedCommandEntry<TTarget, TEvent>[] | null>()\n\n const normalizeLayerCommands = (commands: readonly Command<TTarget, TEvent>[]): CommandState<TTarget, TEvent>[] => {\n return normalizeCommands({\n commands,\n commandFields: state.commandFields,\n conditions: conditions,\n onError: (code, error, message) => {\n notify.emitError(code, error, message)\n },\n })\n }\n\n const prependCommandResolver = (resolver: CommandResolver<TTarget, TEvent>): (() => void) => {\n return mutateCommandResolvers(() => state.commandResolvers.prepend(resolver), resolver)\n }\n\n const appendCommandResolver = (resolver: CommandResolver<TTarget, TEvent>): (() => void) => {\n return mutateCommandResolvers(() => state.commandResolvers.append(resolver), resolver)\n }\n\n const clearCommandResolvers = (): void => {\n if (!state.commandResolvers.has()) {\n return\n }\n\n notify.runWithStateChangeBatch(() => {\n state.commandResolvers.clear()\n options.onCommandResolversChanged()\n notify.queueStateChange()\n })\n }\n\n const getCommands = (query?: CommandQuery<TTarget, TEvent>): readonly Command<TTarget, TEvent>[] => {\n return getFilteredCommandEntries(query).map((entry) => getCommand(entry.commandState))\n }\n\n const getCommandEntries = (query?: CommandQuery<TTarget, TEvent>): readonly CommandEntry<TTarget, TEvent>[] => {\n const context = getCommandQueryContext(query)\n const filteredEntries = getFilteredCommandEntries(query, context)\n if (filteredEntries.length === 0) {\n return []\n }\n\n const grouped = filteredEntries.map((entry) => ({\n entry,\n command: getCommand(entry.commandState),\n commandAttrs: entry.commandState.attrs,\n bindings: [] as ActiveBinding<TTarget, TEvent>[],\n }))\n const indexesByName = new Map<string, number[]>()\n\n for (const [index, item] of grouped.entries()) {\n const existing = indexesByName.get(item.command.name)\n if (existing) {\n existing.push(index)\n } else {\n indexesByName.set(item.command.name, [index])\n }\n }\n\n if (indexesByName.size > 0) {\n collectCommandEntryBindings(grouped, indexesByName, context)\n }\n\n return grouped.map((item) => ({\n command: item.command,\n bindings: item.bindings,\n }))\n }\n\n const getCommandBindings = (\n query: CommandBindingsQuery<TTarget>,\n ): ReadonlyMap<string, readonly ActiveBinding<TTarget, TEvent>[]> => {\n if (\n query.visibility === \"registered\" &&\n registeredBindingsCacheVersion === state.derivedVersion &&\n registeredBindingsCacheCommands === query.commands &&\n registeredBindingsCache\n ) {\n return registeredBindingsCache\n }\n\n const bindingsByCommand = new Map<string, ActiveBinding<TTarget, TEvent>[]>()\n for (const command of query.commands) {\n if (!bindingsByCommand.has(command)) {\n bindingsByCommand.set(command, [])\n }\n }\n\n if (bindingsByCommand.size === 0) {\n return bindingsByCommand\n }\n\n collectCommandBindings(bindingsByCommand, getCommandQueryContext(query))\n if (query.visibility === \"registered\") {\n registeredBindingsCacheVersion = state.derivedVersion\n registeredBindingsCacheCommands = query.commands\n registeredBindingsCache = bindingsByCommand\n }\n\n return bindingsByCommand\n }\n\n const getResolvedCommandChain = (\n command: string,\n focused: TTarget | null,\n execution?: CommandExecutionFields,\n ): { entries?: readonly ResolvedCommandEntry<TTarget, TEvent>[]; hadError: boolean } => {\n const view = getActiveCommandView(focused)\n if (execution) {\n const resolved: ResolvedCommandEntry<TTarget, TEvent>[] = []\n const chain = view.chainsByName.get(command)\n if (chain) {\n for (const entry of chain) {\n resolved.push({\n target: entry.layer.target,\n command: entry.commandState.command,\n attrs: entry.commandState.attrs,\n payload: execution.payload,\n })\n }\n }\n\n const fallback = resolveCommandWithResolversForMode(command, focused, { mode: \"active\", execution })\n if (fallback.resolved) {\n resolved.push(fallback.resolved)\n }\n\n return { entries: resolved.length > 0 ? resolved : undefined, hadError: fallback.hadError }\n }\n\n const resolved: ResolvedCommandEntry<TTarget, TEvent>[] = []\n for (const entry of view.chainsByName.get(command) ?? []) {\n resolved.push({\n target: entry.layer.target,\n command: entry.commandState.command,\n attrs: entry.commandState.attrs,\n })\n }\n\n const fallback = resolveCommandWithResolversForMode(command, focused, { mode: \"active\" })\n if (fallback.resolved) {\n resolved.push(fallback.resolved)\n }\n\n return { entries: resolved.length > 0 ? resolved : undefined, hadError: fallback.hadError }\n }\n\n const getRegisteredResolvedEntries = (\n command: string,\n ): readonly ResolvedCommandEntry<TTarget, TEvent>[] | undefined => {\n if (registeredResolvedCacheVersion !== state.derivedVersion) {\n registeredResolvedCacheVersion = state.derivedVersion\n registeredResolvedCache = new Map<string, readonly ResolvedCommandEntry<TTarget, TEvent>[] | null>()\n }\n\n if (registeredResolvedCache.has(command)) {\n return registeredResolvedCache.get(command) ?? undefined\n }\n\n const resolved = resolveRegisteredEntries(getRegisteredCommandChain(command))\n registeredResolvedCache.set(command, resolved ?? null)\n return resolved\n }\n\n const getActiveRegisteredResolvedEntries = (\n command: string,\n focused: TTarget | null,\n ): readonly ResolvedCommandEntry<TTarget, TEvent>[] | undefined => {\n return resolveRegisteredEntries(getActiveCommandView(focused).chainsByName.get(command))\n }\n\n const resolveRegisteredResolverFallback = (\n command: string,\n execution?: CommandExecutionFields,\n ): ResolvedCommandLookup<TTarget, TEvent> => {\n return resolveCommandWithResolversForMode(command, null, { mode: \"registered\", execution })\n }\n\n const resolveActiveResolverFallback = (\n command: string,\n focused: TTarget | null,\n execution?: CommandExecutionFields,\n ): ResolvedCommandLookup<TTarget, TEvent> => {\n return resolveCommandWithResolversForMode(command, focused, { mode: \"active\", execution })\n }\n\n const getTopCommand = (command: string, focused: TTarget | null): Command<TTarget, TEvent> | undefined => {\n const top = getTopResolvedCommand(command, focused)\n return top?.command\n }\n\n const getCommandByName = (command: string): Command<TTarget, TEvent> | undefined => {\n const top = getCommandEntry(command)\n return top?.commandState.command\n }\n\n const getDispatchUnavailableCommandState = (\n command: string,\n focused: TTarget | null,\n includeCommand: boolean,\n ): { reason: \"inactive\" | \"disabled\"; command?: Command<TTarget, TEvent> } | undefined => {\n const view = getCommandView()\n const chain = view.chainsByName.get(command)\n if (!chain || chain.length === 0) {\n return undefined\n }\n\n let inactiveEntry: LayerCommandEntry<TTarget, TEvent> | undefined\n let disabledEntry: LayerCommandEntry<TTarget, TEvent> | undefined\n\n for (const entry of chain) {\n if (!isLayerActiveForFocused(host, entry.layer, focused)) {\n inactiveEntry ??= entry\n continue\n }\n\n if (!conditions.matchesConditions(entry.layer) || !conditions.matchesConditions(entry.commandState)) {\n disabledEntry ??= entry\n }\n }\n\n const unavailableEntry = disabledEntry ?? inactiveEntry\n if (!unavailableEntry) {\n return undefined\n }\n\n return {\n reason: disabledEntry ? \"disabled\" : \"inactive\",\n command: includeCommand ? unavailableEntry.commandState.command : undefined,\n }\n }\n\n const getActiveCommandView = (focused: TTarget | null): ActiveCommandView<TTarget, TEvent> => {\n if (activeViewVersion === state.derivedVersion && activeViewFocused === focused && activeView) {\n return activeView\n }\n\n const view = createActiveCommandView(state, host, conditions, focused)\n if (activeCommandViewCanCache()) {\n activeViewVersion = state.derivedVersion\n activeViewFocused = focused\n activeView = view\n }\n\n return view\n }\n\n const getCommandView = (): CommandView<TTarget, TEvent> => {\n if (registeredViewVersion === state.derivedVersion && registeredView) {\n return registeredView\n }\n\n registeredViewVersion = state.derivedVersion\n registeredView = getRegisteredCommandView(state)\n return registeredView\n }\n\n const activeCommandViewCanCache = (): boolean => {\n return state.activeCommandViewCacheBlockers === 0\n }\n\n const isBindingVisible = (\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): boolean => {\n if (binding.command === undefined || binding.run) {\n return true\n }\n\n if (typeof binding.command !== \"string\") {\n return false\n }\n\n if (activeView.reachableByName.has(binding.command)) {\n return true\n }\n\n return getFallbackResolvedCommand(binding.command, focused, \"active\") !== undefined\n }\n\n const getBindingCommandAttrs = (\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ActiveCommandView<TTarget, TEvent>,\n ): Readonly<Attributes> | undefined => {\n if (typeof binding.command !== \"string\") {\n return undefined\n }\n\n const active = activeView.reachableByName.get(binding.command)\n if (active) {\n return active.commandState.attrs\n }\n\n const fallback = getFallbackResolvedCommand(binding.command, focused, \"active\")\n return fallback?.attrs\n }\n\n const getCommandResolutionStatus = (\n command: string,\n layerCommands?: readonly CommandState<TTarget, TEvent>[],\n ): CommandResolutionStatus => {\n if (layerCommands?.some((state) => state.command.name === command) || getCommandView().chainsByName.has(command)) {\n return \"resolved\"\n }\n\n const lookup = resolveCommandWithResolversForMode(command, getFocusedTargetIfAvailable(host))\n if (lookup.resolved || lookup.hadError) {\n return lookup.resolved ? \"resolved\" : \"error\"\n }\n\n return \"unresolved\"\n }\n\n const mutateCommandResolvers = (\n register: () => () => void,\n resolver: CommandResolver<TTarget, TEvent>,\n ): (() => void) => {\n return notify.runWithStateChangeBatch(() => {\n const off = register()\n options.onCommandResolversChanged()\n notify.queueStateChange()\n\n return () => {\n notify.runWithStateChangeBatch(() => {\n off()\n if (state.commandResolvers.values().includes(resolver)) {\n return\n }\n\n options.onCommandResolversChanged()\n notify.queueStateChange()\n })\n }\n })\n }\n\n const getTopResolvedCommand = (\n command: string,\n focused: TTarget | null,\n ): ResolvedCommandEntry<TTarget, TEvent> | undefined => {\n const activeView = getActiveCommandView(focused)\n const active = activeView.reachableByName.get(command)\n if (active) {\n return {\n target: active.layer.target,\n command: active.commandState.command,\n attrs: active.commandState.attrs,\n }\n }\n\n return getFallbackResolvedCommand(command, focused, \"active\")\n }\n\n const getCommandEntry = (command: string): LayerCommandEntry<TTarget, TEvent> | undefined => {\n return getRegisteredCommandChain(command)?.[0]\n }\n\n const getRegisteredCommandChain = (command: string): readonly LayerCommandEntry<TTarget, TEvent>[] | undefined => {\n const entries: LayerCommandEntry<TTarget, TEvent>[] = []\n for (const layer of state.sortedLayers) {\n for (const commandState of layer.commands) {\n if (commandState.command.name === command) {\n entries.push({ layer, commandState })\n }\n }\n }\n\n return entries.length > 0 ? entries : undefined\n }\n\n const resolveRegisteredEntries = (\n chain: readonly LayerCommandEntry<TTarget, TEvent>[] | undefined,\n ): readonly ResolvedCommandEntry<TTarget, TEvent>[] | undefined => {\n if (!chain?.length) {\n return undefined\n }\n\n return chain.map((entry) => ({\n target: entry.layer.target,\n command: entry.commandState.command,\n attrs: entry.commandState.attrs,\n }))\n }\n\n const getFallbackResolvedCommand = (\n command: string,\n focused: TTarget | null,\n mode: \"active\" | \"registered\",\n ): ResolvedCommandEntry<TTarget, TEvent> | undefined => {\n const lookup = resolveCommandWithResolversForMode(command, focused, { mode })\n return lookup.resolved\n }\n\n const getRegisteredLayerCommandEntries = (): readonly LayerCommandEntry<TTarget, TEvent>[] => {\n return getCommandView().entries\n }\n\n const getRegisteredBindingsByCommand = (): ReadonlyMap<string, readonly BindingState<TTarget, TEvent>[]> => {\n if (registeredBindingsByCommandVersion === state.derivedVersion && registeredBindingsByCommand) {\n return registeredBindingsByCommand\n }\n\n const bindingsByCommand = new Map<string, BindingState<TTarget, TEvent>[]>()\n for (const layer of state.layers) {\n for (const binding of layer.bindings) {\n if (typeof binding.command !== \"string\") {\n continue\n }\n\n const bindings = bindingsByCommand.get(binding.command)\n if (bindings) {\n bindings.push(binding)\n } else {\n bindingsByCommand.set(binding.command, [binding])\n }\n }\n }\n\n registeredBindingsByCommandVersion = state.derivedVersion\n registeredBindingsByCommand = bindingsByCommand\n return bindingsByCommand\n }\n\n const getCommandQueryContext = (\n query?: CommandQuery<TTarget, TEvent>,\n ): {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n } => {\n const visibility = query?.visibility ?? \"reachable\"\n const focused =\n query && Object.prototype.hasOwnProperty.call(query, \"focused\")\n ? (query.focused ?? null)\n : getFocusedTargetIfAvailable(host)\n\n if (visibility === \"registered\") {\n return { visibility, focused }\n }\n\n return {\n visibility,\n focused,\n activeView: getActiveCommandView(focused),\n }\n }\n\n const getFilteredCommandEntries = (\n query?: CommandQuery<TTarget, TEvent>,\n context: {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n } = getCommandQueryContext(query),\n ): LayerCommandEntry<TTarget, TEvent>[] => {\n let entries: readonly LayerCommandEntry<TTarget, TEvent>[]\n if (context.visibility === \"registered\") {\n entries = getRegisteredLayerCommandEntries()\n } else if (context.visibility === \"active\") {\n entries = context.activeView?.entries ?? []\n } else {\n entries = context.activeView?.reachable ?? []\n }\n\n return queryLayerCommandEntries({\n entries,\n query,\n getCommand: (command) => getCommand(command),\n onFilterError: (error) => {\n notify.emitError(\"command-query-filter-error\", error, \"[Keymap] Error in command query filter:\")\n },\n })\n }\n\n const collectCommandEntryBindings = (\n grouped: Array<{\n entry: LayerCommandEntry<TTarget, TEvent>\n command: Command<TTarget, TEvent>\n commandAttrs: Readonly<Attributes> | undefined\n bindings: ActiveBinding<TTarget, TEvent>[]\n }>,\n indexesByName: ReadonlyMap<string, readonly number[]>,\n context: {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n },\n ): void => {\n visitCommandQueryBindings(context, (binding) => {\n collectBindingForCommandEntries(grouped, indexesByName, binding)\n })\n }\n\n const collectCommandBindings = (\n bindingsByCommand: Map<string, ActiveBinding<TTarget, TEvent>[]>,\n context: {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n },\n ): void => {\n if (context.visibility === \"registered\") {\n const registeredBindings = getRegisteredBindingsByCommand()\n for (const [command, bindings] of bindingsByCommand) {\n const commandAttrs = getCommandView().chainsByName.get(command)?.[0]?.commandState.attrs\n for (const binding of registeredBindings.get(command) ?? []) {\n bindings.push(createActiveBinding(binding, commandAttrs))\n }\n }\n return\n }\n\n visitCommandQueryBindings(context, (binding) => {\n collectBindingForCommandBindings(bindingsByCommand, binding, context)\n })\n }\n\n const visitCommandQueryBindings = (\n context: {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n },\n visit: (binding: BindingState<TTarget, TEvent>) => void,\n ): void => {\n if (context.visibility === \"registered\") {\n for (const layer of state.layers) {\n for (const binding of layer.bindings) visit(binding)\n }\n return\n }\n\n const activeView = context.activeView\n if (!activeView) {\n return\n }\n\n for (const layer of activeView.layers) {\n if (layer.bindings.length === 0 || !conditions.matchesConditions(layer)) {\n continue\n }\n\n for (const binding of layer.bindings) {\n if (conditions.matchesConditions(binding) && isBindingVisible(binding, context.focused, activeView)) {\n visit(binding)\n }\n }\n }\n }\n\n const collectBindingForCommandEntries = (\n grouped: Array<{\n entry: LayerCommandEntry<TTarget, TEvent>\n command: Command<TTarget, TEvent>\n commandAttrs: Readonly<Attributes> | undefined\n bindings: ActiveBinding<TTarget, TEvent>[]\n }>,\n indexesByName: ReadonlyMap<string, readonly number[]>,\n binding: BindingState<TTarget, TEvent>,\n ): void => {\n if (typeof binding.command !== \"string\") {\n return\n }\n\n const indexes = indexesByName.get(binding.command)\n if (!indexes || indexes.length === 0) {\n return\n }\n\n for (const index of indexes) {\n const item = grouped[index]\n if (!item) {\n continue\n }\n\n item.bindings.push(createActiveBinding(binding, item.commandAttrs))\n }\n }\n\n const collectBindingForCommandBindings = (\n bindingsByCommand: Map<string, ActiveBinding<TTarget, TEvent>[]>,\n binding: BindingState<TTarget, TEvent>,\n context: {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n },\n ): void => {\n if (typeof binding.command !== \"string\") {\n return\n }\n\n const bindings = bindingsByCommand.get(binding.command)\n if (!bindings) {\n return\n }\n\n bindings.push(createActiveBinding(binding, getCommandBindingAttrsForQuery(binding, context)))\n }\n\n const createActiveBinding = (\n binding: BindingState<TTarget, TEvent>,\n commandAttrs: Readonly<Attributes> | undefined,\n ): ActiveBinding<TTarget, TEvent> => {\n return {\n sequence: binding.sequence,\n command: binding.command,\n commandAttrs,\n attrs: binding.attrs,\n event: binding.event,\n preventDefault: binding.preventDefault,\n fallthrough: binding.fallthrough,\n }\n }\n\n const getCommandBindingAttrsForQuery = (\n binding: BindingState<TTarget, TEvent>,\n context: {\n visibility: \"reachable\" | \"active\" | \"registered\"\n focused: TTarget | null\n activeView?: ActiveCommandView<TTarget, TEvent>\n },\n ): Readonly<Attributes> | undefined => {\n if (typeof binding.command !== \"string\") {\n return undefined\n }\n\n if (context.visibility === \"registered\") {\n return getCommandView().chainsByName.get(binding.command)?.[0]?.commandState.attrs\n }\n\n const activeView = context.activeView\n if (!activeView) {\n return undefined\n }\n\n return getBindingCommandAttrs(binding, context.focused, activeView)\n }\n\n const resolveCommandWithResolversForMode = (\n command: string,\n focused: TTarget | null,\n options?: { mode?: \"active\" | \"registered\"; execution?: CommandExecutionFields },\n ): ResolvedCommandLookup<TTarget, TEvent> => {\n const mode = options?.mode ?? \"active\"\n const execution = options?.execution ?? { input: command }\n\n const lookup = resolveCommandWithResolvers(\n command,\n state.commandResolvers.values(),\n () => createCommandResolverContext(focused, mode, execution),\n (error) => {\n notify.emitError(\"command-resolver-error\", error, `[Keymap] Error in command resolver for \"${command}\":`)\n },\n )\n let resolved = lookup.resolved\n if (resolved) {\n const entry = getCommandEntryForMode(resolved.command.name, focused, mode)\n if (entry?.commandState.command === resolved.command && resolved.target === undefined) {\n resolved = { ...resolved, target: entry.layer.target }\n lookup.resolved = resolved\n }\n }\n\n if (resolved && !resolved.attrs) {\n const attrs =\n getCommandStateAttrs(resolved.command.name, focused, mode) ?? getResolverCommandAttrs(resolved.command)\n if (attrs) {\n lookup.resolved = { ...resolved, attrs }\n }\n }\n\n return lookup\n }\n\n const getCommandStateAttrs = (\n command: string,\n focused: TTarget | null,\n mode: \"active\" | \"registered\",\n ): Readonly<Attributes> | undefined => {\n if (mode === \"registered\") {\n return getCommandEntry(command)?.commandState.attrs\n }\n\n return getActiveCommandView(focused).reachableByName.get(command)?.commandState.attrs\n }\n\n const getCommandEntryForMode = (\n command: string,\n focused: TTarget | null,\n mode: \"active\" | \"registered\",\n ): LayerCommandEntry<TTarget, TEvent> | undefined => {\n if (mode === \"registered\") {\n return getCommandEntry(command)\n }\n\n return getActiveCommandView(focused).reachableByName.get(command)\n }\n\n const createCommandResolverContext = (\n focused: TTarget | null,\n mode: \"active\" | \"registered\",\n execution: CommandExecutionFields,\n ): CommandResolverAttempt<TTarget, TEvent> => {\n let input = execution.input\n let payload = execution.payload\n\n return {\n context: {\n get input() {\n return input\n },\n get payload() {\n return payload\n },\n setInput(nextInput) {\n input = nextInput\n },\n setPayload(nextPayload) {\n payload = nextPayload\n },\n getCommand: (name: string) => {\n if (mode === \"registered\") {\n return getCommandByName(name)\n }\n\n return getTopCommand(name, focused)\n },\n },\n getExecutionFields() {\n return { input, payload }\n },\n }\n }\n\n return {\n normalizeCommands: normalizeLayerCommands,\n prependCommandResolver,\n appendCommandResolver,\n clearCommandResolvers,\n getCommands,\n getCommandEntries,\n getCommandBindings,\n getResolvedCommandChain,\n getRegisteredResolvedEntries,\n getActiveRegisteredResolvedEntries,\n resolveRegisteredResolverFallback,\n resolveActiveResolverFallback,\n getTopCommand,\n getDispatchUnavailableCommandState,\n getActiveCommandView,\n isBindingVisible,\n getBindingCommandAttrs,\n getCommandResolutionStatus,\n }\n}\n\nexport function getCommand<TTarget extends object, TEvent extends KeymapEvent>(\n state: CommandState<TTarget, TEvent>,\n): Command<TTarget, TEvent> {\n return state.command\n}\n\nfunction normalizeCommands<TTarget extends object, TEvent extends KeymapEvent>(\n options: NormalizeCommandsOptions<TTarget, TEvent>,\n): CommandState<TTarget, TEvent>[] {\n const normalizedCommands: CommandState<TTarget, TEvent>[] = []\n const seen = new Set<string>()\n\n for (const command of options.commands) {\n try {\n const mergedRequires: EventData = {}\n const matchers: RuntimeMatcher[] = []\n const normalizedName = normalizeCommandName(command.name)\n const fields = getCommandFields(command)\n const attrs: Attributes = {}\n\n if (seen.has(normalizedName)) {\n options.onError(\n \"duplicate-command\",\n { command: normalizedName },\n `Duplicate keymap command \"${normalizedName}\" in the same layer`,\n )\n continue\n }\n\n command.name = normalizedName\n\n for (const [fieldName, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue\n }\n\n const compiler = options.commandFields.get(fieldName)\n if (!compiler) {\n continue\n }\n\n compiler(\n value,\n createFieldCompilerContext({\n fieldName,\n conditions: options.conditions,\n requirements: mergedRequires,\n matchers,\n attrs,\n }),\n )\n }\n\n const commandState: CommandState<TTarget, TEvent> = {\n command,\n fields,\n attrs: Object.keys(attrs).length === 0 ? undefined : attrs,\n requires: Object.entries(mergedRequires),\n matchers,\n }\n\n seen.add(commandState.command.name)\n normalizedCommands.push(commandState)\n } catch (error) {\n options.onError(\n \"register-command-failed\",\n error,\n getErrorMessage(error, `Failed to register keymap command \"${String(command.name)}\"`),\n )\n continue\n }\n }\n\n return normalizedCommands\n}\n\nfunction resolveCommandWithResolvers<TTarget extends object, TEvent extends KeymapEvent>(\n command: string,\n resolvers: readonly CommandResolver<TTarget, TEvent>[],\n createContext: () => CommandResolverAttempt<TTarget, TEvent>,\n onResolverError: (error: unknown) => void,\n): ResolvedCommandLookup<TTarget, TEvent> {\n if (resolvers.length === 0) {\n return { hadError: false }\n }\n\n let hadError = false\n\n for (const resolver of resolvers) {\n let resolvedCommand: Command<TTarget, TEvent> | undefined\n const attempt = createContext()\n\n try {\n resolvedCommand = resolver(command, attempt.context)\n } catch (error) {\n hadError = true\n onResolverError(error)\n continue\n }\n\n if (resolvedCommand) {\n return { hadError, resolved: getResolverCommandEntry(resolvedCommand, attempt.getExecutionFields()) }\n }\n }\n\n return { hadError }\n}\n\nfunction isCommandMetadataRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nfunction getCommandFields<TTarget extends object, TEvent extends KeymapEvent>(\n command: Command<TTarget, TEvent>,\n): Readonly<Record<string, unknown>> {\n const fields: Record<string, unknown> = {}\n for (const [name, value] of Object.entries(command)) {\n if (!RESERVED_COMMAND_FIELDS.has(name) && value !== undefined) {\n fields[name] = value\n }\n }\n\n return Object.keys(fields).length === 0 ? EMPTY_COMMAND_FIELDS : fields\n}\n\nfunction getResolverCommandEntry<TTarget extends object, TEvent extends KeymapEvent>(\n command: Command<TTarget, TEvent>,\n execution: CommandExecutionFields,\n): ResolvedCommandEntry<TTarget, TEvent> {\n return {\n command,\n input: execution.input,\n payload: execution.payload,\n }\n}\n\nfunction getResolverCommandAttrs<TTarget extends object, TEvent extends KeymapEvent>(\n command: Command<TTarget, TEvent>,\n): Readonly<Attributes> | undefined {\n const fields = getCommandFields(command)\n return fields === EMPTY_COMMAND_FIELDS ? undefined : fields\n}\n\nfunction queryLayerCommandEntries<TTarget extends object, TEvent extends KeymapEvent>(\n options: QueryLayerCommandEntriesOptions<TTarget, TEvent>,\n): LayerCommandEntry<TTarget, TEvent>[] {\n const namespace = options.query?.namespace\n const limit = normalizeQueryLimit(options.query?.limit)\n if (limit === 0) {\n return []\n }\n\n const normalizedSearch = options.query?.search?.trim().toLowerCase() ?? \"\"\n let searchKeys = DEFAULT_COMMAND_SEARCH_FIELDS as readonly string[]\n if (options.query?.searchIn && options.query.searchIn.length > 0) {\n searchKeys = options.query.searchIn\n }\n\n const filter = options.query?.filter\n let filterEntries: readonly [string, CommandQueryValue<TTarget, TEvent>][] | undefined\n let filterPredicate: ((command: Command<TTarget, TEvent>) => boolean) | undefined\n let exactNameFilter: ReadonlySet<string> | undefined\n\n if (typeof filter === \"function\") {\n filterPredicate = filter\n } else if (filter) {\n const entries = Object.entries(filter)\n const remainingEntries: [string, CommandQueryValue<TTarget, TEvent>][] = []\n for (const [key, matcher] of entries) {\n if (key === \"name\") {\n if (typeof matcher === \"string\") {\n exactNameFilter = new Set([matcher])\n continue\n }\n\n if (Array.isArray(matcher)) {\n const names = new Set<string>()\n for (const value of matcher) {\n if (typeof value === \"string\") {\n names.add(value)\n }\n }\n exactNameFilter = names\n continue\n }\n }\n\n remainingEntries.push([key, matcher])\n }\n filterEntries = remainingEntries.length > 0 ? remainingEntries : undefined\n }\n\n const results: LayerCommandEntry<TTarget, TEvent>[] = []\n for (const entry of options.entries) {\n const commandState = entry.commandState\n\n if (!commandMatchesNamespace(commandState, namespace)) {\n continue\n }\n\n if (!commandMatchesSearch(commandState, normalizedSearch, searchKeys)) {\n continue\n }\n\n if (exactNameFilter && !exactNameFilter.has(commandState.command.name)) {\n continue\n }\n\n if (!commandMatchesFilters(commandState, filterEntries, options)) {\n continue\n }\n\n if (filterPredicate) {\n let matches = false\n\n try {\n matches = filterPredicate(options.getCommand(commandState))\n } catch (error) {\n options.onFilterError(error)\n continue\n }\n\n if (!matches) {\n continue\n }\n }\n\n results.push(entry)\n if (limit !== undefined && results.length >= limit) {\n break\n }\n }\n\n return results\n}\n\nfunction normalizeQueryLimit(value: unknown): number | undefined {\n if (value === undefined) {\n return undefined\n }\n\n const limit = Math.floor(Number(value))\n if (!Number.isFinite(limit) || limit <= 0) {\n return 0\n }\n\n return limit\n}\n\nfunction commandMatchesSearch<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n search: string,\n searchKeys: readonly string[],\n): boolean {\n if (!search) {\n return true\n }\n\n for (const key of searchKeys) {\n if (commandKeyMatchesSearch(commandState, key, search)) {\n return true\n }\n }\n\n return false\n}\n\nfunction commandMatchesNamespace<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n namespace: string | readonly string[] | undefined,\n): boolean {\n if (namespace === undefined) {\n return true\n }\n\n const fields = commandState.fields\n if (!Object.prototype.hasOwnProperty.call(fields, \"namespace\")) {\n return false\n }\n\n return valueMatchesFilter(fields.namespace, namespace)\n}\n\nfunction commandMatchesFilters<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n filters: readonly [string, CommandQueryValue<TTarget, TEvent>][] | undefined,\n options: CommandQueryMatchOptions<TTarget, TEvent>,\n): boolean {\n if (!filters) {\n return true\n }\n\n for (const [key, matcher] of filters) {\n if (!commandKeyMatchesQuery(commandState, key, matcher, options)) {\n return false\n }\n }\n\n return true\n}\n\nfunction commandKeyMatchesSearch<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n key: string,\n search: string,\n): boolean {\n return getCommandSearchText(commandState, key)?.includes(search) === true\n}\n\nfunction getCommandSearchText<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n key: string,\n): string | undefined {\n let cache = commandSearchCache.get(commandState)\n if (!cache) {\n cache = new Map<string, string | undefined>()\n commandSearchCache.set(commandState, cache)\n }\n\n if (cache.has(key)) {\n return cache.get(key)\n }\n\n const fields = commandState.fields\n const attrs = commandState.attrs\n let value: unknown\n if (key === \"name\") {\n value = commandState.command.name\n } else if (Object.prototype.hasOwnProperty.call(fields, key)) {\n value = fields[key]\n } else if (attrs && Object.prototype.hasOwnProperty.call(attrs, key)) {\n value = attrs[key]\n }\n\n const text = toSearchText(value)\n cache.set(key, text)\n return text\n}\n\nfunction toSearchText(value: unknown): string | undefined {\n if (Array.isArray(value)) {\n const parts: string[] = []\n for (const entry of value) {\n const text = toSearchText(entry)\n if (text !== undefined) {\n parts.push(text)\n }\n }\n\n return parts.length > 0 ? parts.join(\"\\0\") : undefined\n }\n\n if (typeof value === \"string\") {\n return value.toLowerCase()\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value).toLowerCase()\n }\n\n return undefined\n}\n\nfunction runCommandQueryPredicate<TTarget extends object, TEvent extends KeymapEvent>(\n matcher: (value: unknown, command: Command<TTarget, TEvent>) => boolean,\n value: unknown,\n command: Command<TTarget, TEvent>,\n onFilterError: (error: unknown) => void,\n): boolean {\n try {\n return matcher(value, command)\n } catch (error) {\n onFilterError(error)\n return false\n }\n}\n\nfunction commandKeyMatchesQuery<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n key: string,\n matcher: CommandQueryValue<TTarget, TEvent>,\n options: CommandQueryMatchOptions<TTarget, TEvent>,\n): boolean {\n if (typeof matcher === \"function\") {\n return commandKeyMatchesPredicate(\n commandState,\n key,\n matcher as (value: unknown, command: Command<TTarget, TEvent>) => boolean,\n options,\n )\n }\n\n return commandKeyMatchesExact(commandState, key, matcher)\n}\n\nfunction commandKeyMatchesPredicate<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n key: string,\n matcher: (value: unknown, command: Command<TTarget, TEvent>) => boolean,\n options: CommandQueryMatchOptions<TTarget, TEvent>,\n): boolean {\n const command = commandState.command\n const fields = commandState.fields\n const attrs = commandState.attrs\n let commandView: Command<TTarget, TEvent> | undefined\n let foundValue = false\n const getCommandView = () => (commandView ??= options.getCommand(commandState))\n\n if (key === \"name\") {\n foundValue = true\n if (runCommandQueryPredicate(matcher, command.name, getCommandView(), options.onFilterError)) {\n return true\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(fields, key)) {\n foundValue = true\n if (runCommandQueryPredicate(matcher, fields[key], getCommandView(), options.onFilterError)) {\n return true\n }\n }\n\n if (attrs && Object.prototype.hasOwnProperty.call(attrs, key)) {\n foundValue = true\n if (runCommandQueryPredicate(matcher, attrs[key], getCommandView(), options.onFilterError)) {\n return true\n }\n }\n\n return !foundValue && runCommandQueryPredicate(matcher, undefined, getCommandView(), options.onFilterError)\n}\n\nfunction commandKeyMatchesExact<TTarget extends object, TEvent extends KeymapEvent>(\n commandState: CommandState<TTarget, TEvent>,\n key: string,\n matcher: unknown | readonly unknown[],\n): boolean {\n const command = commandState.command\n const fields = commandState.fields\n const attrs = commandState.attrs\n\n if (key === \"name\" && valueMatchesFilter(command.name, matcher)) {\n return true\n }\n\n if (Object.prototype.hasOwnProperty.call(fields, key) && valueMatchesFilter(fields[key], matcher)) {\n return true\n }\n\n return !!attrs && Object.prototype.hasOwnProperty.call(attrs, key) && valueMatchesFilter(attrs[key], matcher)\n}\n\nfunction valueMatchesFilter(value: unknown, matcher: unknown | readonly unknown[]): boolean {\n if (Array.isArray(matcher)) {\n return matcher.some((expected) => valueMatchesExact(value, expected))\n }\n\n return valueMatchesExact(value, matcher)\n}\n\nfunction valueMatchesExact(value: unknown, expected: unknown): boolean {\n if (Array.isArray(value)) {\n return value.some((entry) => valueMatchesExact(entry, expected))\n }\n\n return Object.is(value, expected)\n}\n",
|
|
17
|
+
"import type { Keymap } from \"../keymap.js\"\nimport type {\n BindingCommand,\n Command,\n CommandContext,\n CommandHandler,\n CommandResult,\n BindingState,\n KeymapEvent,\n RegisteredLayer,\n RunCommandOptions,\n RunCommandResult,\n} from \"../types.js\"\nimport { normalizeBindingCommand } from \"./primitives/command-normalization.js\"\nimport type { CommandCatalogService } from \"./command-catalog.js\"\nimport type { ActivationService } from \"./activation.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { RuntimeService } from \"./runtime.js\"\nimport { isPromiseLike } from \"./values.js\"\n\ninterface CommandExecutionResult<TTarget extends object, TEvent extends KeymapEvent> {\n status: \"handled\" | \"rejected\" | \"error\"\n result: RunCommandResult<TTarget, TEvent>\n}\n\ninterface CommandExecutorOptions<TTarget extends object, TEvent extends KeymapEvent> {\n keymap: Keymap<TTarget, TEvent>\n createCommandEvent: () => TEvent\n}\n\nexport interface CommandExecutorService<TTarget extends object, TEvent extends KeymapEvent> {\n runCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult<TTarget, TEvent>\n dispatchCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult<TTarget, TEvent>\n runBinding(\n bindingLayer: RegisteredLayer<TTarget, TEvent>,\n binding: BindingState<TTarget, TEvent>,\n event: TEvent,\n focused: TTarget | null,\n payload?: unknown,\n ): boolean\n}\n\nexport function createCommandExecutorService<TTarget extends object, TEvent extends KeymapEvent>(\n notify: NotificationService<TTarget, TEvent>,\n runtime: RuntimeService<TTarget, TEvent>,\n activation: ActivationService<TTarget, TEvent>,\n catalog: CommandCatalogService<TTarget, TEvent>,\n options: CommandExecutorOptions<TTarget, TEvent>,\n): CommandExecutorService<TTarget, TEvent> {\n const createCommandContext = (\n event: TEvent,\n focused: TTarget | null,\n target: TTarget | null,\n data: Readonly<Record<string, unknown>>,\n input: string,\n payload: unknown,\n ): CommandContext<TTarget, TEvent> => {\n return {\n keymap: options.keymap,\n event,\n focused,\n target,\n data,\n input,\n payload,\n }\n }\n\n const executeResolvedCommand = (\n commandName: string,\n command: Command<TTarget, TEvent> | CommandHandler<TTarget, TEvent>,\n context: CommandContext<TTarget, TEvent>,\n includeCommand: boolean,\n ): CommandExecutionResult<TTarget, TEvent> => {\n const commandView = typeof command === \"function\" ? undefined : command\n const run = typeof command === \"function\" ? command : command.run\n const resultCommand = includeCommand ? commandView : undefined\n let result: CommandResult<TTarget, TEvent>\n\n try {\n result = run(commandView ? { ...context, command: commandView } : context)\n } catch (error) {\n notify.emitError(\"command-execution-error\", error, `[Keymap] Error running command \"${commandName}\":`)\n return {\n status: \"error\",\n result: resultCommand ? { ok: false, reason: \"error\", command: resultCommand } : { ok: false, reason: \"error\" },\n }\n }\n\n if (isPromiseLike(result)) {\n result.catch((error) => {\n notify.emitError(\"async-command-error\", error, `[Keymap] Async error in command \"${commandName}\":`)\n })\n\n return {\n status: \"handled\",\n result: resultCommand ? { ok: true, command: resultCommand } : { ok: true },\n }\n }\n\n if (isRunCommandResult(result)) {\n let commandResult: RunCommandResult<TTarget, TEvent> = result\n if (!result.ok && result.reason !== \"not-found\" && includeCommand && commandView && !result.command) {\n commandResult = { ...result, command: commandView }\n } else if (result.ok && includeCommand && commandView && !result.command) {\n commandResult = { ...result, command: commandView }\n }\n\n return {\n status: result.ok ? \"handled\" : \"rejected\",\n result: commandResult,\n }\n }\n\n if (result === false) {\n return {\n status: \"rejected\",\n result: resultCommand\n ? { ok: false, reason: \"rejected\", command: resultCommand }\n : { ok: false, reason: \"rejected\" },\n }\n }\n\n return {\n status: \"handled\",\n result: resultCommand ? { ok: true, command: resultCommand } : { ok: true },\n }\n }\n\n const executeCommandChain = (\n commandName: string,\n chain: readonly { target?: TTarget; command: Command<TTarget, TEvent> }[] | undefined,\n event: TEvent,\n focused: TTarget | null,\n target: TTarget | null | undefined,\n data: Readonly<Record<string, unknown>>,\n payload: unknown,\n includeCommand: boolean,\n ): [RunCommandResult<TTarget, TEvent> | undefined, RunCommandResult<TTarget, TEvent> | undefined] => {\n let rejected: RunCommandResult<TTarget, TEvent> | undefined\n for (const entry of chain ?? []) {\n const executed = executeResolvedCommand(\n commandName,\n entry.command,\n createCommandContext(event, focused, target ?? entry.target ?? null, data, commandName, payload),\n includeCommand,\n )\n\n if (executed.status === \"handled\" || executed.status === \"error\") {\n return [executed.result, rejected]\n }\n\n rejected = executed.result\n }\n\n return [undefined, rejected]\n }\n\n const executeProgrammaticCommand = (\n cmd: string,\n commandOptions: RunCommandOptions<TTarget, TEvent> | undefined,\n mode: \"registered\" | \"active\",\n ): RunCommandResult<TTarget, TEvent> => {\n let normalized: BindingCommand<TTarget, TEvent> | undefined\n\n try {\n normalized = normalizeBindingCommand(cmd)\n } catch {\n return { ok: false, reason: \"invalid-args\" }\n }\n\n if (typeof normalized !== \"string\") {\n return { ok: false, reason: \"not-found\" }\n }\n\n const includeCommand = commandOptions?.includeCommand === true\n const focused = commandOptions?.focused ?? activation.getFocusedTargetIfAvailable()\n const event = commandOptions?.event ?? options.createCommandEvent()\n const data = runtime.getReadonlyData()\n const payload = commandOptions?.payload\n const chain =\n mode === \"registered\"\n ? catalog.getRegisteredResolvedEntries(normalized)\n : catalog.getActiveRegisteredResolvedEntries(normalized, focused)\n const [done, rejected] = executeCommandChain(\n normalized,\n chain,\n event,\n focused,\n commandOptions?.target,\n data,\n payload,\n includeCommand,\n )\n if (done) {\n return done\n }\n\n let rejectedResult = rejected\n const fallback =\n mode === \"registered\"\n ? catalog.resolveRegisteredResolverFallback(normalized, { input: normalized, payload })\n : catalog.resolveActiveResolverFallback(normalized, focused, { input: normalized, payload })\n if (fallback.resolved) {\n const result = executeResolvedCommand(\n normalized,\n fallback.resolved.command,\n createCommandContext(\n event,\n focused,\n commandOptions?.target ?? fallback.resolved.target ?? null,\n data,\n fallback.resolved.input ?? normalized,\n fallback.resolved.payload,\n ),\n includeCommand,\n )\n\n if (result.status === \"handled\" || result.status === \"error\") {\n return result.result\n }\n\n rejectedResult = result.result\n }\n\n if (fallback.hadError) {\n return { ok: false, reason: \"error\" }\n }\n\n if (mode === \"active\") {\n const unavailable = catalog.getDispatchUnavailableCommandState(normalized, focused, includeCommand)\n if (unavailable) {\n return unavailable.command\n ? { ok: false, reason: unavailable.reason, command: unavailable.command }\n : { ok: false, reason: unavailable.reason }\n }\n }\n\n return rejectedResult ?? { ok: false, reason: \"not-found\" }\n }\n\n return {\n runCommand(cmd, commandOptions) {\n return executeProgrammaticCommand(cmd, commandOptions, \"registered\")\n },\n dispatchCommand(cmd, commandOptions) {\n return executeProgrammaticCommand(cmd, commandOptions, \"active\")\n },\n runBinding(bindingLayer, binding, event, focused, payload) {\n const data = runtime.getReadonlyData()\n\n if (binding.run) {\n const result = executeResolvedCommand(\n typeof binding.command === \"string\" ? binding.command : \"<function>\",\n binding.run,\n createCommandContext(\n event,\n focused,\n bindingLayer.target ?? null,\n data,\n typeof binding.command === \"string\" ? binding.command : \"<function>\",\n payload,\n ),\n false,\n )\n\n if (result.status === \"rejected\") {\n return false\n }\n\n applyBindingEventEffects(binding, event)\n return true\n }\n\n if (typeof binding.command !== \"string\") {\n return false\n }\n\n const chain = catalog.getResolvedCommandChain(\n binding.command,\n focused,\n payload === undefined ? undefined : { input: binding.command, payload },\n ).entries\n for (const entry of chain ?? []) {\n const result = executeResolvedCommand(\n binding.command,\n entry.command,\n createCommandContext(\n event,\n focused,\n entry.target ?? bindingLayer.target ?? null,\n data,\n entry.input ?? binding.command,\n entry.payload,\n ),\n false,\n )\n if (result.status === \"rejected\") {\n continue\n }\n\n applyBindingEventEffects(binding, event)\n return true\n }\n\n return false\n },\n }\n}\n\nfunction isRunCommandResult<TTarget extends object, TEvent extends KeymapEvent>(\n value: CommandResult<TTarget, TEvent>,\n): value is RunCommandResult<TTarget, TEvent> {\n return typeof value === \"object\" && value !== null && \"ok\" in value\n}\n\nfunction applyBindingEventEffects<TTarget extends object, TEvent extends KeymapEvent>(\n binding: BindingState<TTarget, TEvent>,\n event: TEvent,\n): void {\n if (!binding.preventDefault) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n}\n",
|
|
18
|
+
"import type { ConditionService } from \"./conditions.js\"\nimport type { State } from \"./state.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport { normalizeBindingCommand } from \"./primitives/command-normalization.js\"\nimport type {\n Attributes,\n BindingCommand,\n BindingEvent,\n BindingExpansion,\n BindingExpander,\n BindingExpanderContext,\n Binding,\n BindingParser,\n BindingParserContext,\n EventData,\n ParsedBinding,\n ReactiveMatcher,\n BindingState,\n BindingCompilationResult,\n KeyLike,\n KeyMatch,\n KeymapEvent,\n KeyStrokeInput,\n KeySequencePart,\n ResolvedKeyToken,\n ResolvedSequencePattern,\n RuntimeMatcher,\n StringifyOptions,\n} from \"../types.js\"\nimport { RESERVED_BINDING_FIELDS } from \"../schema.js\"\nimport {\n cloneKeySequence,\n createKeySequencePart,\n createTextKeyMatch,\n normalizeBindingTokenName,\n stringifyKeySequence,\n} from \"./keys.js\"\nimport { snapshotParsedBinding } from \"./primitives/bindings.js\"\nimport { createFieldCompilerContext } from \"./primitives/field-invariants.js\"\nimport { getErrorMessage, snapshotDataValue } from \"./values.js\"\n\nconst EMPTY_COMPILE_FIELDS: Readonly<Record<string, unknown>> = Object.freeze({})\nconst EMPTY_REQUIRES: readonly [name: string, value: unknown][] = []\nconst EMPTY_MATCHERS: readonly RuntimeMatcher[] = []\n\nfunction snapshotAttributes(attrs: Attributes): Readonly<Attributes> | undefined {\n if (Object.keys(attrs).length === 0) {\n return undefined\n }\n\n return snapshotDataValue(attrs, { freeze: true }) as Readonly<Attributes>\n}\n\ninterface ParsedBindingSequenceResult {\n parts: KeySequencePart[]\n usedTokens: readonly string[]\n unknownTokens: readonly string[]\n hasTokenBindings: boolean\n}\n\ninterface ExpandedBindingKey {\n key: KeyLike\n displays?: readonly string[]\n}\n\nexport interface CompilerOptions {\n warnUnknownField: (kind: \"binding\" | \"layer\", fieldName: string) => void\n warnUnknownToken: (token: string, sequence: string) => void\n}\n\nexport interface CompilerService<TTarget extends object, TEvent extends KeymapEvent> {\n parseTokenKey(key: KeyLike): KeySequencePart\n parseKeySequence(key: KeyLike): KeySequencePart[]\n formatKey(key: KeyLike, options?: StringifyOptions): string\n compileBindings(\n bindings: readonly Binding<TTarget, TEvent>[],\n tokens: ReadonlyMap<string, ResolvedKeyToken>,\n sourceTarget: TTarget | undefined,\n sourceLayerOrder: number,\n fields?: Readonly<Record<string, unknown>>,\n ): BindingCompilationResult<TTarget, TEvent>\n}\n\nexport function createCompilerService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n conditions: ConditionService<TTarget, TEvent>,\n options: CompilerOptions,\n): CompilerService<TTarget, TEvent> {\n const parseTokenKey = (key: KeyLike): KeySequencePart => {\n return parseSingleKeyPartWithParsers(key, state.bindingParsers.values(), {\n tokens: state.tokens,\n patterns: state.patterns,\n layer: EMPTY_COMPILE_FIELDS,\n parseObjectKey: (value, options) => parseObjectKeyPart(value, options),\n })\n }\n\n const parseKeySequence = (key: KeyLike): KeySequencePart[] => {\n if (typeof key !== \"string\") {\n return [parseObjectKeyPart(key)]\n }\n\n const parsed = parseBindingSequenceWithParsers(key, state.bindingParsers.values(), {\n tokens: state.tokens,\n patterns: state.patterns,\n layer: EMPTY_COMPILE_FIELDS,\n parseObjectKey: (value, options) => parseObjectKeyPart(value, options),\n })\n\n for (const tokenName of parsed.unknownTokens) {\n options.warnUnknownToken(tokenName, key)\n }\n\n return parsed.parts\n }\n\n const formatKey = (key: KeyLike, options?: StringifyOptions): string => {\n return stringifyKeySequence(parseKeySequence(key), options)\n }\n\n const compileBindings = (\n bindings: readonly Binding<TTarget, TEvent>[],\n tokens: ReadonlyMap<string, ResolvedKeyToken>,\n sourceTarget: TTarget | undefined,\n sourceLayerOrder: number,\n compileFields?: Readonly<Record<string, unknown>>,\n ): BindingCompilationResult<TTarget, TEvent> => {\n const bindingStates: BindingState<TTarget, TEvent>[] = []\n let hasTokenBindings = false\n const bindingExpanders = state.bindingExpanders.values()\n const bindingParsers = state.bindingParsers.values()\n const bindingFieldCompilers = state.bindingFields\n const allowExactPrefixAmbiguity = state.disambiguationResolvers.has()\n const warnUnknownField = options.warnUnknownField\n const warnUnknownToken = options.warnUnknownToken\n\n for (const [bindingIndex, binding] of bindings.entries()) {\n let expandedBindingKeys: readonly ExpandedBindingKey[]\n\n try {\n expandedBindingKeys = expandBindingKeyWithExpanders(binding.key, bindingExpanders, {\n layer: compileFields,\n })\n } catch (error) {\n notify.emitError(\"binding-expand-error\", error, getErrorMessage(error, \"Failed to expand keymap binding\"))\n continue\n }\n\n for (const expandedBindingKey of expandedBindingKeys) {\n const expandedKey = expandedBindingKey.key\n let parsed: ParsedBindingSequenceResult | undefined\n\n try {\n parsed =\n typeof expandedKey === \"string\"\n ? parseBindingSequenceWithParsers(expandedKey, bindingParsers, {\n tokens,\n patterns: state.patterns,\n layer: compileFields,\n parseObjectKey: (value, options) => parseObjectKeyPart(value, options),\n })\n : {\n parts: [parseObjectKeyPart(expandedKey)],\n usedTokens: [] as readonly string[],\n unknownTokens: [] as readonly string[],\n hasTokenBindings: false,\n }\n\n parsed = applyExpansionDisplays(parsed, expandedBindingKey)\n } catch (error) {\n notify.emitError(\"binding-parse-error\", error, getErrorMessage(error, \"Failed to parse keymap binding\"))\n continue\n }\n\n const sequence = parsed.parts\n hasTokenBindings ||= parsed.hasTokenBindings\n\n for (const tokenName of parsed.unknownTokens) {\n warnUnknownToken(tokenName, typeof expandedKey === \"string\" ? expandedKey : String(expandedKey.name))\n }\n\n for (const compiledInput of applyBindingTransformers(\n binding,\n sequence,\n tokens,\n bindingParsers,\n compileFields,\n )) {\n try {\n const event = normalizeBindingEvent(compiledInput.event)\n const compiledSequence = compiledInput.sequence\n const mergedRequires: EventData = {}\n const mergedAttrs: Attributes = {}\n const matchers: RuntimeMatcher[] = []\n\n for (const fieldName in compiledInput) {\n if (fieldName === \"sequence\") {\n continue\n }\n\n if (RESERVED_BINDING_FIELDS.has(fieldName)) {\n continue\n }\n\n const value = compiledInput[fieldName as keyof ParsedBinding]\n\n if (value === undefined) {\n continue\n }\n\n const compiler = bindingFieldCompilers.get(fieldName)\n if (!compiler) {\n warnUnknownField(\"binding\", fieldName)\n continue\n }\n\n compiler(\n value,\n createFieldCompilerContext({\n fieldName,\n conditions,\n requirements: mergedRequires,\n matchers,\n attrs: mergedAttrs,\n }),\n )\n }\n\n const attrs = Object.keys(mergedAttrs).length > 0 ? snapshotAttributes(mergedAttrs) : undefined\n const command = normalizeBindingCommand(compiledInput.cmd)\n const compiledBinding: BindingState<TTarget, TEvent> = {\n binding,\n sequence: compiledSequence,\n command,\n event,\n parsedBinding: snapshotParsedBinding(compiledInput),\n sourceTarget,\n sourceLayerOrder,\n bindingIndex: bindingIndex,\n requires: Object.keys(mergedRequires).length > 0 ? Object.entries(mergedRequires) : EMPTY_REQUIRES,\n matchers: matchers.length > 0 ? matchers : EMPTY_MATCHERS,\n preventDefault: compiledInput.preventDefault !== false,\n fallthrough: compiledInput.fallthrough ?? false,\n }\n\n if (attrs) {\n compiledBinding.attrs = attrs\n }\n\n if (typeof command === \"function\") {\n compiledBinding.run = command\n }\n\n if (compiledSequence.length === 0) {\n continue\n }\n\n if (event === \"release\" && compiledSequence.length > 1) {\n throw new Error(\"Keymap release bindings only support a single key stroke\")\n }\n\n const terminalPattern = compiledSequence.at(-1)\n if (terminalPattern?.patternName) {\n const pattern = state.patterns.get(terminalPattern.patternName)\n if (pattern && pattern.max !== pattern.min) {\n throw new Error(\"Keymap unbounded sequence patterns must be followed by a concrete continuation\")\n }\n }\n\n if (event === \"press\" && !allowExactPrefixAmbiguity) {\n validateExactPrefixAmbiguity(bindingStates, compiledBinding)\n }\n\n bindingStates.push(compiledBinding)\n } catch (error) {\n notify.emitError(\"binding-compile-error\", error, getErrorMessage(error, \"Failed to compile keymap binding\"))\n }\n }\n }\n }\n\n return {\n bindings: bindingStates,\n hasTokenBindings,\n }\n }\n\n const parseObjectKeyPart = (\n key: KeyStrokeInput,\n options?: {\n display?: string\n match?: KeyMatch\n tokenName?: string\n },\n ): KeySequencePart => {\n return createKeySequencePart(key, options)\n }\n\n const normalizeBindingEvent = (event: unknown): BindingEvent => {\n if (event === undefined || event === \"press\") {\n return \"press\"\n }\n\n if (event === \"release\") {\n return \"release\"\n }\n\n throw new Error(`Invalid keymap binding event \"${String(event)}\": expected \"press\" or \"release\"`)\n }\n\n const applyBindingTransformers = (\n binding: Binding<TTarget, TEvent>,\n sequence: KeySequencePart[],\n tokens: ReadonlyMap<string, ResolvedKeyToken>,\n bindingParsers: readonly BindingParser[],\n compileFields?: Readonly<Record<string, unknown>>,\n ): ParsedBinding<TTarget, TEvent>[] => {\n const bindingTransformers = state.bindingTransformers.values()\n\n if (bindingTransformers.length === 0) {\n return [{ ...binding, sequence: cloneKeySequence(sequence) }]\n }\n\n const parsedBinding: ParsedBinding<TTarget, TEvent> = {\n ...binding,\n sequence: cloneKeySequence(sequence),\n }\n const extraBindings: ParsedBinding<TTarget, TEvent>[] = []\n let keepOriginal = true\n const layer = compileFields ?? EMPTY_COMPILE_FIELDS\n\n for (const transformer of bindingTransformers) {\n try {\n transformer(parsedBinding, {\n layer,\n parseKey: (key) => {\n return parseSingleKeyPartWithParsers(key, bindingParsers, {\n tokens,\n patterns: state.patterns,\n layer,\n parseObjectKey: (value, options) => parseObjectKeyPart(value, options),\n })\n },\n add: (nextBinding) => {\n extraBindings.push(snapshotParsedBinding(nextBinding))\n },\n skipOriginal: () => {\n keepOriginal = false\n },\n })\n } catch (error) {\n notify.emitError(\"binding-transformer-error\", error, \"[Keymap] Error in binding transformer:\")\n }\n }\n\n if (!keepOriginal) {\n return extraBindings\n }\n\n if (extraBindings.length === 0) {\n return [parsedBinding]\n }\n\n return [parsedBinding, ...extraBindings]\n }\n\n return { parseTokenKey, parseKeySequence, formatKey, compileBindings }\n}\n\nfunction sequenceMatchesPrefix(left: readonly KeySequencePart[], right: readonly KeySequencePart[]): boolean {\n if (left.length >= right.length) {\n return false\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (left[index]?.match !== right[index]?.match) {\n return false\n }\n }\n\n return true\n}\n\nfunction validateExactPrefixAmbiguity<TTarget extends object, TEvent extends KeymapEvent>(\n bindings: readonly BindingState<TTarget, TEvent>[],\n next: BindingState<TTarget, TEvent>,\n): void {\n for (const existing of bindings) {\n if (existing.event !== \"press\") {\n continue\n }\n\n if (\n (existing.command !== undefined && sequenceMatchesPrefix(existing.sequence, next.sequence)) ||\n (next.command !== undefined && sequenceMatchesPrefix(next.sequence, existing.sequence))\n ) {\n throw new Error(\n \"Keymap bindings cannot use the same sequence as both an exact match and a prefix in the same layer\",\n )\n }\n }\n}\n\nfunction expandBindingKeyWithExpanders(\n key: KeyLike,\n expanders: readonly BindingExpander[],\n options?: {\n layer?: Readonly<Record<string, unknown>>\n },\n): readonly ExpandedBindingKey[] {\n if (typeof key !== \"string\" || expanders.length === 0) {\n return [{ key }]\n }\n\n const layer = options?.layer ?? EMPTY_COMPILE_FIELDS\n let candidates: BindingExpansion[] = [{ key }]\n\n for (const expander of expanders) {\n const nextCandidates: BindingExpansion[] = []\n\n for (const candidate of candidates) {\n const result = expander({\n input: candidate.key,\n displays: candidate.displays,\n layer,\n } satisfies BindingExpanderContext)\n if (!result) {\n nextCandidates.push(candidate)\n continue\n }\n\n if (result.length === 0) {\n throw new Error(`Keymap binding expander must return at least one key sequence for \"${candidate.key}\"`)\n }\n\n for (const expanded of result) {\n if (!expanded || typeof expanded !== \"object\" || Array.isArray(expanded) || typeof expanded.key !== \"string\") {\n throw new Error(\n `Keymap binding expander must return expansion objects with string keys for \"${candidate.key}\"`,\n )\n }\n\n if (expanded.displays !== undefined) {\n if (!Array.isArray(expanded.displays)) {\n throw new Error(`Keymap binding expander displays must be an array of strings for \"${candidate.key}\"`)\n }\n\n for (const display of expanded.displays) {\n if (typeof display !== \"string\") {\n throw new Error(`Keymap binding expander displays must be an array of strings for \"${candidate.key}\"`)\n }\n }\n }\n\n nextCandidates.push(expanded)\n }\n }\n\n candidates = nextCandidates\n }\n\n return candidates\n}\n\nfunction applyExpansionDisplays(\n parsed: ParsedBindingSequenceResult,\n expansion: ExpandedBindingKey,\n): ParsedBindingSequenceResult {\n if (!expansion.displays) {\n return parsed\n }\n\n if (expansion.displays.length !== parsed.parts.length) {\n throw new Error(\n `Keymap binding expansion displays length must match parsed sequence length for \"${String(expansion.key)}\"`,\n )\n }\n\n return {\n ...parsed,\n parts: parsed.parts.map((part, index) => ({\n ...part,\n display: expansion.displays![index]!,\n })),\n }\n}\n\nfunction parseBindingSequenceWithParsers(\n key: string,\n parsers: readonly BindingParser[],\n options: {\n tokens?: ReadonlyMap<string, ResolvedKeyToken>\n patterns?: ReadonlyMap<string, ResolvedSequencePattern>\n layer?: Readonly<Record<string, unknown>>\n parseObjectKey: (\n key: KeyStrokeInput,\n options?: { display?: string; match?: KeyMatch; tokenName?: string },\n ) => KeySequencePart\n },\n): ParsedBindingSequenceResult {\n if (key.length === 0) {\n throw new Error(\"Invalid key sequence: sequence cannot be empty\")\n }\n\n if (parsers.length === 0) {\n throw new Error(\"No keymap binding parsers are registered\")\n }\n\n const tokens = options.tokens ?? new Map<string, ResolvedKeyToken>()\n const patterns = options.patterns ?? new Map<string, ResolvedSequencePattern>()\n const layer = options.layer ?? EMPTY_COMPILE_FIELDS\n const parseObjectKey = options.parseObjectKey\n const parts: KeySequencePart[] = []\n const usedTokens = new Set<string>()\n const unknownTokens = new Set<string>()\n\n let index = 0\n while (index < key.length) {\n let matched = false\n\n for (const parser of parsers) {\n const result = parser({\n input: key,\n index,\n layer,\n tokens,\n patterns,\n normalizeTokenName: normalizeBindingTokenName,\n createMatch: createTextKeyMatch,\n parseObjectKey,\n } satisfies BindingParserContext)\n if (!result) {\n continue\n }\n\n if (result.nextIndex <= index || result.nextIndex > key.length) {\n throw new Error(`Keymap binding parser must advance the input for \"${key}\" at index ${index}`)\n }\n\n parts.push(...result.parts)\n for (const tokenName of result.usedTokens ?? []) {\n usedTokens.add(tokenName)\n }\n for (const tokenName of result.unknownTokens ?? []) {\n unknownTokens.add(tokenName)\n }\n\n index = result.nextIndex\n matched = true\n break\n }\n\n if (!matched) {\n throw new Error(`No keymap binding parser handled input at index ${index} in \"${key}\"`)\n }\n }\n\n return {\n parts,\n usedTokens: [...usedTokens],\n unknownTokens: [...unknownTokens],\n hasTokenBindings: usedTokens.size > 0 || unknownTokens.size > 0,\n }\n}\n\nfunction parseSingleKeyPartWithParsers(\n key: KeyLike,\n parsers: readonly BindingParser[],\n options: {\n tokens?: ReadonlyMap<string, ResolvedKeyToken>\n patterns?: ReadonlyMap<string, ResolvedSequencePattern>\n layer?: Readonly<Record<string, unknown>>\n parseObjectKey: (\n key: KeyStrokeInput,\n options?: { display?: string; match?: KeyMatch; tokenName?: string },\n ) => KeySequencePart\n },\n): KeySequencePart {\n if (typeof key !== \"string\") {\n return options.parseObjectKey(key)\n }\n\n const { parts } = parseBindingSequenceWithParsers(key, parsers, options)\n const [part] = parts\n if (!part || parts.length !== 1) {\n throw new Error(`Invalid key \"${String(key)}\": expected a single key stroke`)\n }\n\n return part\n}\n",
|
|
19
|
+
"import type { State } from \"./state.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { KeymapEvent, ReactiveMatcher, RuntimeMatchable, RuntimeMatcher } from \"../types.js\"\n\nfunction isReactiveMatcher(value: unknown): value is ReactiveMatcher {\n if (!value || typeof value !== \"object\") {\n return false\n }\n\n const candidate = value as { get?: unknown; subscribe?: unknown }\n return typeof candidate.get === \"function\" && typeof candidate.subscribe === \"function\"\n}\n\nexport interface ConditionService<TTarget extends object, TEvent extends KeymapEvent> {\n buildRuntimeMatcher(matcher: (() => boolean) | ReactiveMatcher, source: string): RuntimeMatcher\n matchesConditions(target: RuntimeMatchable): boolean\n}\n\nexport function createConditionService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n): ConditionService<TTarget, TEvent> {\n const hasNoConditions = (target: RuntimeMatchable): boolean => {\n return target.requires.length === 0 && target.matchers.length === 0\n }\n\n const matchesRuntimeMatcher = (matcher: RuntimeMatcher): boolean => {\n try {\n return matcher.match()\n } catch (error) {\n notify.emitError(\n \"runtime-matcher-error\",\n error,\n `[Keymap] Error evaluating runtime matcher from ${matcher.source}:`,\n )\n return false\n }\n }\n\n const matchesRuntimeMatchers = (target: RuntimeMatchable): boolean => {\n if (target.matchers.length === 0) {\n return true\n }\n\n if (target.matchers.length === 1) {\n const [matcher] = target.matchers\n return matcher ? matchesRuntimeMatcher(matcher) : true\n }\n\n for (const matcher of target.matchers) {\n if (!matchesRuntimeMatcher(matcher)) {\n return false\n }\n }\n\n return true\n }\n\n const matchRequirements = (requires: readonly [name: string, value: unknown][]): boolean => {\n if (requires.length === 0) {\n return true\n }\n\n for (const [name, value] of requires) {\n if (!Object.is(state.data[name], value)) {\n return false\n }\n }\n\n return true\n }\n\n const matchesConditions = (target: RuntimeMatchable): boolean => {\n return hasNoConditions(target) || (matchRequirements(target.requires) && matchesRuntimeMatchers(target))\n }\n\n return {\n buildRuntimeMatcher(matcher, source) {\n if (typeof matcher === \"function\") {\n return { source, match: matcher }\n }\n\n if (isReactiveMatcher(matcher)) {\n return {\n source,\n match: () => matcher.get(),\n subscribe: (onChange) => matcher.subscribe(onChange),\n }\n }\n\n throw new Error(`Keymap ${source} expected a function or a reactive matcher`)\n },\n matchesConditions,\n }\n}\n",
|
|
20
|
+
"import type { Keymap } from \"./keymap.js\"\n\nexport interface KeymapEvent {\n name: string\n ctrl: boolean\n shift: boolean\n meta: boolean\n super?: boolean\n hyper?: boolean\n preventDefault(): void\n stopPropagation(): void\n readonly propagationStopped: boolean\n}\n\nexport type HostPlatform = \"macos\" | \"windows\" | \"linux\" | \"unknown\"\n\nexport type HostModifier = \"ctrl\" | \"shift\" | \"meta\" | \"super\" | \"hyper\"\n\nexport type HostCapability = \"supported\" | \"unsupported\" | \"unknown\"\n\nexport interface HostMetadata {\n platform: HostPlatform\n primaryModifier: \"ctrl\" | \"super\" | \"unknown\"\n modifiers: Record<HostModifier, HostCapability>\n}\n\nexport interface KeymapHost<TTarget extends object, TEvent extends KeymapEvent = KeymapEvent> {\n readonly metadata: HostMetadata\n readonly rootTarget: TTarget\n readonly isDestroyed: boolean\n getFocusedTarget(): TTarget | null\n getParentTarget(target: TTarget): TTarget | null\n isTargetDestroyed(target: TTarget): boolean\n onKeyPress(listener: (event: TEvent) => void): () => void\n onKeyRelease(listener: (event: TEvent) => void): () => void\n onFocusChange(listener: (target: TTarget | null) => void): () => void\n /** Optional for hosts whose lifetime is managed by GC or root reachability. */\n onDestroy?(listener: () => void): () => void\n onTargetDestroy(target: TTarget, listener: () => void): () => void\n onRawInput?(listener: (sequence: string) => boolean): () => void\n createCommandEvent(): TEvent\n}\n\nexport type EventData = Record<string, unknown>\n\nexport type Attributes = Record<string, unknown>\n\nexport interface KeyStrokeInput {\n name: string\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n hyper?: boolean\n}\n\nexport interface NormalizedKeyStroke extends KeyStrokeInput {\n ctrl: boolean\n shift: boolean\n meta: boolean\n super: boolean\n}\n\nexport type KeyMatch = string\n\nexport interface EventMatchResolverContext {\n resolveKey(key: KeyLike): KeyMatch\n}\n\nexport type EventMatchResolver<TEvent extends KeymapEvent = KeymapEvent> = (\n event: TEvent,\n ctx: EventMatchResolverContext,\n) => readonly KeyMatch[] | undefined\n\nexport const KEY_DISAMBIGUATION_DECISION = Symbol(\"keymap-disambiguation-decision\")\nexport const KEY_DEFERRED_DISAMBIGUATION_DECISION = Symbol(\"keymap-deferred-disambiguation-decision\")\n\nexport interface KeyDisambiguationDecision {\n readonly [KEY_DISAMBIGUATION_DECISION]: true\n}\n\nexport interface KeyDeferredDisambiguationDecision {\n readonly [KEY_DEFERRED_DISAMBIGUATION_DECISION]: true\n}\n\nexport interface KeyDisambiguationContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n readonly event: Readonly<Omit<TEvent, \"preventDefault\" | \"stopPropagation\">>\n readonly focused: TTarget | null\n readonly sequence: readonly KeySequencePart[]\n readonly stroke: KeySequencePart\n readonly exact: readonly ActiveBinding<TTarget, TEvent>[]\n readonly continuations: readonly ActiveKey<TTarget, TEvent>[]\n getData(name: string): unknown\n setData(name: string, value: unknown): void\n runExact(): KeyDisambiguationDecision\n continueSequence(): KeyDisambiguationDecision\n clear(): KeyDisambiguationDecision\n defer(run: KeyDeferredDisambiguationHandler<TTarget, TEvent>): KeyDisambiguationDecision\n}\n\nexport interface KeyDeferredDisambiguationContext<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n> {\n readonly signal: AbortSignal\n readonly sequence: readonly KeySequencePart[]\n readonly focused: TTarget | null\n sleep(ms: number): Promise<boolean>\n runExact(): KeyDeferredDisambiguationDecision\n continueSequence(): KeyDeferredDisambiguationDecision\n clear(): KeyDeferredDisambiguationDecision\n}\n\nexport type KeyDeferredDisambiguationHandler<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n> = (\n ctx: KeyDeferredDisambiguationContext<TTarget, TEvent>,\n) => KeyDeferredDisambiguationDecision | void | Promise<KeyDeferredDisambiguationDecision | void>\n\nexport type KeyDisambiguationResolver<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (\n ctx: KeyDisambiguationContext<TTarget, TEvent>,\n) => KeyDisambiguationDecision | undefined\n\nexport interface ResolvedKeyToken {\n stroke: NormalizedKeyStroke\n match: KeyMatch\n}\n\nexport interface KeySequencePart {\n stroke: NormalizedKeyStroke\n display: string\n match: KeyMatch\n tokenName?: string\n patternName?: string\n payloadKey?: string\n}\n\nexport interface StringifyOptions {\n preferDisplay?: boolean\n separator?: string\n}\n\nexport type KeyStringifyInput =\n | KeyStrokeInput\n | NormalizedKeyStroke\n | KeySequencePart\n | { stroke: NormalizedKeyStroke; display?: string }\n\nexport type KeyLike = string | KeyStrokeInput\n\n/**\n * Public command shape used for layer registration, command queries, command\n * contexts, and command resolver results. Custom command fields are top-level\n * properties so registration stays as simple as `{ name, run, desc }`.\n */\nexport interface Command<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n TPayload = unknown,\n> {\n name: string\n run(ctx: CommandContext<TTarget, TEvent, TPayload>): CommandResult<TTarget, TEvent>\n [key: string]: unknown\n}\n\nexport type CommandQueryValue<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> =\n | unknown\n | readonly unknown[]\n | ((value: unknown, command: Command<TTarget, TEvent>) => boolean)\n\nexport type CommandFilter<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> =\n | Readonly<Record<string, CommandQueryValue<TTarget, TEvent>>>\n | ((command: Command<TTarget, TEvent>) => boolean)\n\nexport interface CommandQuery<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n visibility?: \"reachable\" | \"active\" | \"registered\"\n focused?: TTarget | null\n namespace?: string | readonly string[]\n search?: string\n searchIn?: readonly string[]\n filter?: CommandFilter<TTarget, TEvent>\n limit?: number\n}\n\nexport interface CommandBindingsQuery<TTarget extends object = object> {\n visibility?: \"reachable\" | \"active\" | \"registered\"\n focused?: TTarget | null\n commands: readonly string[]\n}\n\nexport interface RunCommandOptions<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n event?: TEvent\n focused?: TTarget | null\n target?: TTarget | null\n includeCommand?: boolean\n payload?: unknown\n}\n\nexport type RunCommandResult<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> =\n | { ok: true; command?: Command<TTarget, TEvent> }\n | { ok: false; reason: \"not-found\" }\n | {\n ok: false\n reason: \"inactive\" | \"disabled\" | \"invalid-args\" | \"rejected\" | \"error\"\n command?: Command<TTarget, TEvent>\n }\n\nexport interface CommandContext<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n TPayload = unknown,\n> {\n keymap: Keymap<TTarget, TEvent>\n event: TEvent\n focused: TTarget | null\n target: TTarget | null\n data: Readonly<EventData>\n command?: Command<TTarget, TEvent, TPayload>\n input: string\n payload: TPayload\n}\n\nexport type CommandResult<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> =\n | boolean\n | void\n | RunCommandResult<TTarget, TEvent>\n | Promise<boolean | void | RunCommandResult<TTarget, TEvent>>\n\nexport type CommandResolutionStatus = \"resolved\" | \"unresolved\" | \"error\"\n\nexport type CommandHandler<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n TPayload = unknown,\n> = (ctx: CommandContext<TTarget, TEvent, TPayload>) => CommandResult<TTarget, TEvent>\n\nexport type BindingCommand<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> =\n | string\n | CommandHandler<TTarget, TEvent>\n\nexport type BindingEvent = \"press\" | \"release\"\n\nexport interface Binding<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n key: KeyLike\n cmd?: BindingCommand<TTarget, TEvent>\n event?: BindingEvent\n /**\n * Default `true`. Calls `event.preventDefault()` and\n * `event.stopPropagation()` so the matched key does not reach the focused\n * target or later host listeners. Independent of `fallthrough`, which only\n * controls dispatch inside the keymap. Set `preventDefault: false` if you\n * want a fallthrough binding to keep matching inside the keymap and still let\n * the key escape to later handlers.\n */\n preventDefault?: boolean\n /**\n * Default `false`. Continues to later matching bindings in the same\n * dispatch chain after this command runs. Independent of `preventDefault`,\n * which controls whether the key event leaves the keymap.\n */\n fallthrough?: boolean\n [key: string]: unknown\n}\n\nexport type Bindings<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = readonly Binding<\n TTarget,\n TEvent\n>[]\n\nexport type TargetMode = \"focus\" | \"focus-within\"\n\nexport interface Layer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n target?: TTarget\n priority?: number\n bindings?: Bindings<TTarget, TEvent>\n commands?: readonly Command<TTarget, TEvent, any>[]\n targetMode?: TargetMode\n /**\n * Extra layer fields feed layer-field compilers and binding compilation via\n * `BindingParserContext.layer` / `BindingTransformerContext.layer`. Unlike\n * binding and command fields, layer fields do not compile into public attrs.\n */\n [key: string]: unknown\n}\n\nexport interface ParsedCommand {\n input: string\n name: string\n args: string[]\n}\n\nexport interface CommandResolverContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n readonly input: string\n readonly payload: unknown\n setInput(input: string): void\n setPayload(payload: unknown): void\n getCommand(name: string): Command<TTarget, TEvent> | undefined\n}\n\nexport type CommandResolver<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (\n command: string,\n ctx: CommandResolverContext<TTarget, TEvent>,\n) => Command<TTarget, TEvent> | undefined\n\nexport interface KeyToken {\n name: string\n key: KeyLike\n}\n\nexport interface SequencePatternMatch {\n value?: unknown\n display?: string\n}\n\nexport interface SequencePattern<TEvent extends KeymapEvent = KeymapEvent> {\n name: string\n display?: string\n payloadKey?: string\n min?: number\n max?: number\n match(event: TEvent): SequencePatternMatch | undefined\n finalize?(values: readonly unknown[]): unknown\n}\n\nexport interface ResolvedSequencePattern<TEvent extends KeymapEvent = KeymapEvent> {\n name: string\n display?: string\n payloadKey: string\n match: KeyMatch\n min: number\n max: number\n matcher(event: TEvent): SequencePatternMatch | undefined\n finalize?: (values: readonly unknown[]) => unknown\n}\n\nexport interface ActiveBinding<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n sequence: KeySequencePart[]\n command?: BindingCommand<TTarget, TEvent>\n commandAttrs?: Readonly<Attributes>\n attrs?: Readonly<Attributes>\n event: BindingEvent\n preventDefault: boolean\n fallthrough: boolean\n}\n\nexport interface DispatchLayer<TTarget extends object = object> {\n order: number\n priority: number\n target?: TTarget\n targetMode?: TargetMode\n}\n\nexport interface DispatchBinding<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n> extends ActiveBinding<TTarget, TEvent> {\n sourceLayerOrder: number\n bindingIndex: number\n}\n\nexport type DispatchPhase =\n | \"sequence-start\"\n | \"sequence-advance\"\n | \"sequence-clear\"\n | \"binding-execute\"\n | \"binding-reject\"\n\nexport interface DispatchEvent<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n phase: DispatchPhase\n event: BindingEvent\n focused: TTarget | null\n layer?: DispatchLayer<TTarget>\n binding?: DispatchBinding<TTarget, TEvent>\n sequence: readonly KeySequencePart[]\n command?: BindingCommand<TTarget, TEvent>\n}\n\nexport type KeyAfterReason =\n | \"intercept-consumed\"\n | \"binding-handled\"\n | \"binding-rejected\"\n | \"no-match\"\n | \"sequence-pending\"\n | \"sequence-miss\"\n | \"sequence-cleared\"\n\nexport interface KeyAfterInputContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n event: TEvent\n eventType: BindingEvent\n focused: TTarget | null\n handled: boolean\n reason: KeyAfterReason\n sequence: readonly KeySequencePart[]\n pendingSequence: readonly KeySequencePart[]\n setData: (name: string, value: unknown) => void\n getData: (name: string) => unknown\n consume: (options?: { preventDefault?: boolean; stopPropagation?: boolean }) => void\n}\n\n/**\n * Command metadata together with the bindings that invoke it in a given query\n * projection.\n */\nexport interface CommandEntry<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n command: Command<TTarget, TEvent>\n bindings: readonly ActiveBinding<TTarget, TEvent>[]\n}\n\nexport interface ActiveKeyOptions {\n includeBindings?: boolean\n includeMetadata?: boolean\n}\n\nexport interface ActiveKey<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n stroke: NormalizedKeyStroke\n display: string\n tokenName?: string\n bindings?: ActiveBinding<TTarget, TEvent>[]\n bindingAttrs?: Readonly<Attributes>\n commandAttrs?: Readonly<Attributes>\n command?: BindingCommand<TTarget, TEvent>\n continues: boolean\n}\n\n/**\n * Boolean source with subscription-based invalidation. `ctx.activeWhen(...)`\n * subscribes at registration time and unsubscribes when the owning\n * layer or binding is removed.\n */\nexport interface ReactiveMatcher {\n get(): boolean\n subscribe(onChange: () => void): () => void\n}\n\nexport interface BindingFieldContext {\n require(name: string, value: unknown): void\n attr(name: string, value: unknown): void\n /**\n * Registers a runtime matcher. Matchers are evaluated when the owning\n * record is queried or dispatched; reactive matchers also notify state\n * subscribers when their external source changes.\n */\n activeWhen(matcher: (() => boolean) | ReactiveMatcher): void\n}\n\nexport type BindingFieldCompiler = (value: unknown, ctx: BindingFieldContext) => void\n\nexport interface LayerFieldContext {\n require(name: string, value: unknown): void\n attr(name: string, value: unknown): void\n /**\n * Registers a runtime matcher. Matchers are evaluated when the owning\n * record is queried or dispatched; reactive matchers also notify state\n * subscribers when their external source changes.\n */\n activeWhen(matcher: (() => boolean) | ReactiveMatcher): void\n}\n\nexport type LayerFieldCompiler = (value: unknown, ctx: LayerFieldContext) => void\n\nexport interface LayerAnalysisContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n target?: TTarget\n order: number\n sourceBindings: readonly Binding<TTarget, TEvent>[]\n bindings: readonly LayerBindingAnalysis<TTarget, TEvent>[]\n hasTokenBindings: boolean\n checkCommandResolution(command: string): CommandResolutionStatus\n warn(code: string, warning: unknown, message: string): void\n warnOnce(key: string, code: string, warning: unknown, message: string): void\n error(code: string, error: unknown, message: string): void\n}\n\nexport interface LayerBindingAnalysis<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n sequence: KeySequencePart[]\n command?: BindingCommand<TTarget, TEvent>\n attrs?: Readonly<Attributes>\n event: BindingEvent\n preventDefault: boolean\n fallthrough: boolean\n parsedBinding: ParsedBinding<TTarget, TEvent>\n sourceTarget?: TTarget\n sourceLayerOrder: number\n bindingIndex: number\n hasCommandAtSequence: boolean\n hasContinuations: boolean\n}\n\nexport type LayerAnalyzer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (\n ctx: LayerAnalysisContext<TTarget, TEvent>,\n) => void\n\nexport interface BindingParserContext {\n input: string\n index: number\n layer: Readonly<Record<string, unknown>>\n tokens: ReadonlyMap<string, ResolvedKeyToken>\n patterns: ReadonlyMap<string, ResolvedSequencePattern>\n normalizeTokenName(token: string): string\n createMatch(id: string): KeyMatch\n parseObjectKey(\n key: KeyStrokeInput,\n options?: {\n display?: string\n match?: KeyMatch\n tokenName?: string\n },\n ): KeySequencePart\n}\n\nexport interface BindingExpanderContext {\n input: string\n displays?: readonly string[]\n layer: Readonly<Record<string, unknown>>\n}\n\nexport interface BindingExpansion {\n key: string\n displays?: readonly string[]\n}\n\nexport interface BindingParserResult {\n parts: KeySequencePart[]\n nextIndex: number\n usedTokens?: readonly string[]\n unknownTokens?: readonly string[]\n}\n\nexport type BindingParser = (ctx: BindingParserContext) => BindingParserResult | undefined\n\nexport type BindingExpander = (ctx: BindingExpanderContext) => readonly BindingExpansion[] | undefined\n\nexport interface ParsedBinding<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n key: KeyLike\n sequence: KeySequencePart[]\n cmd?: BindingCommand<TTarget, TEvent>\n event?: BindingEvent\n preventDefault?: boolean\n fallthrough?: boolean\n [key: string]: unknown\n}\n\nexport interface BindingTransformerContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n layer: Readonly<Record<string, unknown>>\n parseKey(key: KeyLike): KeySequencePart\n add(binding: ParsedBinding<TTarget, TEvent>): void\n skipOriginal(): void\n}\n\nexport type BindingTransformer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (\n binding: ParsedBinding<TTarget, TEvent>,\n ctx: BindingTransformerContext<TTarget, TEvent>,\n) => void\n\nexport type BindingsValidationResult = { ok: true } | { ok: false; reason: string }\n\nexport interface LayerBindingsTransformerContext<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n> {\n layer: Readonly<Layer<TTarget, TEvent>>\n validateBindings(bindings: unknown): BindingsValidationResult\n}\n\nexport type LayerBindingsTransformer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (\n bindings: readonly Binding<TTarget, TEvent>[],\n ctx: LayerBindingsTransformerContext<TTarget, TEvent>,\n) => readonly Binding<TTarget, TEvent>[] | void\n\nexport interface CommandTransformerContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n layer: Readonly<Layer<TTarget, TEvent>>\n add(command: Command<TTarget, TEvent>): void\n skipOriginal(): void\n}\n\nexport type CommandTransformer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (\n command: Command<TTarget, TEvent>,\n ctx: CommandTransformerContext<TTarget, TEvent>,\n) => void\n\nexport interface CommandFieldContext {\n require(name: string, value: unknown): void\n attr(name: string, value: unknown): void\n /**\n * Registers a runtime matcher. Matchers are evaluated when the owning\n * record is queried or dispatched; reactive matchers also notify state\n * subscribers when their external source changes.\n */\n activeWhen(matcher: (() => boolean) | ReactiveMatcher): void\n}\n\nexport type CommandFieldCompiler = (value: unknown, ctx: CommandFieldContext) => void\n\nexport interface KeyInputContext<TEvent extends KeymapEvent = KeymapEvent> {\n event: TEvent\n setData: (name: string, value: unknown) => void\n getData: (name: string) => unknown\n consume: (options?: { preventDefault?: boolean; stopPropagation?: boolean }) => void\n}\n\nexport interface RawInputContext {\n sequence: string\n stop: () => void\n}\n\nexport type Hooks<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = {\n /**\n * Batched \"derived state may have changed\" signal. Re-read through getters;\n * framework adapters should use this event.\n */\n state: void\n /**\n * Synchronous pending-sequence updates, including clear. Payload is the\n * current sequence.\n */\n pendingSequence: readonly KeySequencePart[]\n /** Dispatch trace events for sequence continuation and binding execution. */\n dispatch: DispatchEvent<TTarget, TEvent>\n}\n\nexport type HookName = keyof Hooks\n\nexport type Listener<TValue> = [TValue] extends [void] ? () => void : (value: TValue) => void\n\nexport interface WarningEvent {\n code: string\n message: string\n warning: unknown\n}\n\nexport interface ErrorEvent {\n code: string\n message: string\n error: unknown\n}\n\n/** Events exposed by `keymap.on(...)`. `state` is batched and `pendingSequence` is synchronous. */\nexport type Events<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = Hooks<\n TTarget,\n TEvent\n> & {\n warning: WarningEvent\n error: ErrorEvent\n}\n\nexport type EventName = keyof Events\n\nexport type Intercepts<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = {\n key: KeyInputContext<TEvent>\n \"key:after\": KeyAfterInputContext<TTarget, TEvent>\n raw: RawInputContext\n}\n\nexport type InterceptName = keyof Intercepts\n\nexport interface KeyInterceptOptions {\n priority?: number\n release?: boolean\n}\n\nexport interface RawInterceptOptions {\n priority?: number\n}\n\nexport type { Keymap }\n\nexport interface RuntimeMatcher {\n source: string\n match: () => boolean\n /**\n * Present for reactive matchers; wired during registration and torn down via\n * `dispose`.\n */\n subscribe?: (onChange: () => void) => () => void\n dispose?: () => void\n}\n\nexport interface RuntimeMatchable {\n requires: readonly [name: string, value: unknown][]\n matchers: readonly RuntimeMatcher[]\n}\n\nexport interface BindingState<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent>\n extends ActiveBinding<TTarget, TEvent>, RuntimeMatchable {\n binding: Binding<TTarget, TEvent>\n run?: CommandHandler<TTarget, TEvent>\n parsedBinding: ParsedBinding<TTarget, TEvent>\n sourceTarget?: TTarget\n sourceLayerOrder: number\n bindingIndex: number\n}\n\nexport interface ActiveKeySelection<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n display: string\n tokenName?: string\n continues: boolean\n firstBinding?: BindingState<TTarget, TEvent>\n commandBinding?: BindingState<TTarget, TEvent>\n bindings?: readonly BindingState<TTarget, TEvent>[]\n stop: boolean\n}\n\nexport interface ActiveKeyState<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n stroke: NormalizedKeyStroke\n display: string\n tokenName?: string\n continues: boolean\n firstBinding?: BindingState<TTarget, TEvent>\n commandBinding?: BindingState<TTarget, TEvent>\n bindings?: BindingState<TTarget, TEvent>[]\n}\n\nexport interface CommandState<\n TTarget extends object = object,\n TEvent extends KeymapEvent = KeymapEvent,\n> extends RuntimeMatchable {\n command: Command<TTarget, TEvent, any>\n fields: Readonly<Record<string, unknown>>\n attrs?: Readonly<Attributes>\n}\n\nexport interface BindingCompilationResult<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n bindings: readonly BindingState<TTarget, TEvent>[]\n hasTokenBindings: boolean\n}\n\nexport interface SequenceNode<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n parent: SequenceNode<TTarget, TEvent> | null\n depth: number\n stroke: NormalizedKeyStroke | null\n match: KeyMatch | null\n pattern?: ResolvedSequencePattern<TEvent>\n children: Map<KeyMatch, SequenceNode<TTarget, TEvent>>\n patternChildren: SequenceNode<TTarget, TEvent>[]\n bindings: BindingState<TTarget, TEvent>[]\n reachableBindings: BindingState<TTarget, TEvent>[]\n}\n\nexport interface RegisteredLayer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n order: number\n target?: TTarget\n targetMode?: TargetMode\n priority: number\n requires: readonly [name: string, value: unknown][]\n matchers: readonly RuntimeMatcher[]\n fields?: Readonly<Record<string, unknown>>\n attrs?: Readonly<Attributes>\n commands: readonly CommandState<TTarget, TEvent>[]\n sourceBindings: readonly Binding<TTarget, TEvent>[]\n bindings: readonly BindingState<TTarget, TEvent>[]\n root: SequenceNode<TTarget, TEvent>\n hasTokenBindings: boolean\n activeKeyCacheBlocked: boolean\n activeCommandViewCacheBlocked: boolean\n offTargetDestroy?: () => void\n}\n\nexport interface PendingSequenceCapture<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n layer: RegisteredLayer<TTarget, TEvent>\n binding: BindingState<TTarget, TEvent>\n index: number\n parts: readonly KeySequencePart[]\n patterns?: readonly PendingSequencePatternCapture[]\n}\n\nexport interface PendingSequencePatternCapture {\n name: string\n payloadKey: string\n values: readonly unknown[]\n parts: readonly KeySequencePart[]\n}\n\nexport interface PendingSequenceState<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[]\n}\n",
|
|
21
|
+
"import type {\n KeyDeferredDisambiguationDecision,\n KeyDeferredDisambiguationHandler,\n KeyDisambiguationDecision,\n KeymapEvent,\n PendingSequenceCapture,\n} from \"../types.js\"\nimport { KEY_DEFERRED_DISAMBIGUATION_DECISION, KEY_DISAMBIGUATION_DECISION } from \"../types.js\"\n\nexport type SyncDecisionAction = \"run-exact\" | \"continue-sequence\" | \"clear\" | \"defer\"\nexport type DeferredDecisionAction = \"run-exact\" | \"continue-sequence\" | \"clear\"\n\nexport interface InternalDisambiguationDecision extends KeyDisambiguationDecision {\n readonly action: SyncDecisionAction\n readonly handler?: KeyDeferredDisambiguationHandler<any, any>\n}\n\nexport interface InternalDeferredDisambiguationDecision extends KeyDeferredDisambiguationDecision {\n readonly action: DeferredDecisionAction\n}\n\nexport interface PendingDisambiguation<TTarget extends object, TEvent extends KeymapEvent> {\n id: number\n controller: AbortController\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[]\n apply: (decision: InternalDeferredDisambiguationDecision | void) => void\n}\n\nexport function createSyncDecision(\n action: SyncDecisionAction,\n handler?: KeyDeferredDisambiguationHandler<any, any>,\n): InternalDisambiguationDecision {\n return {\n [KEY_DISAMBIGUATION_DECISION]: true,\n action,\n handler,\n }\n}\n\nexport function createDeferredDecision(action: DeferredDecisionAction): InternalDeferredDisambiguationDecision {\n return {\n [KEY_DEFERRED_DISAMBIGUATION_DECISION]: true,\n action,\n }\n}\n\nexport function isSyncDecision(value: unknown): value is InternalDisambiguationDecision {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as { [KEY_DISAMBIGUATION_DECISION]?: unknown })[KEY_DISAMBIGUATION_DECISION] === true\n )\n}\n\nexport function isDeferredDecision(value: unknown): value is InternalDeferredDisambiguationDecision {\n return (\n !!value &&\n typeof value === \"object\" &&\n (value as { [KEY_DEFERRED_DISAMBIGUATION_DECISION]?: unknown })[KEY_DEFERRED_DISAMBIGUATION_DECISION] === true\n )\n}\n\nexport function sleepWithSignal(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) {\n return Promise.resolve(false)\n }\n\n return new Promise<boolean>((resolve) => {\n const timeout = setTimeout(\n () => {\n signal.removeEventListener(\"abort\", onAbort)\n resolve(true)\n },\n Math.max(0, ms),\n )\n\n const onAbort = () => {\n clearTimeout(timeout)\n signal.removeEventListener(\"abort\", onAbort)\n resolve(false)\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true })\n })\n}\n",
|
|
22
|
+
"import type {\n KeymapEvent,\n KeySequencePart,\n PendingSequenceCapture,\n ResolvedSequencePattern,\n SequencePatternMatch,\n} from \"../types.js\"\nimport { createKeySequencePart } from \"./keys.js\"\nimport type { NotificationService } from \"./notify.js\"\n\nexport function matchSequencePattern<TTarget extends object, TEvent extends KeymapEvent>(\n patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>,\n notify: NotificationService<TTarget, TEvent>,\n patternName: string,\n event: TEvent,\n): SequencePatternMatch | undefined {\n const pattern = patterns.get(patternName)\n if (!pattern) {\n return undefined\n }\n\n try {\n return pattern.matcher(event)\n } catch (error) {\n notify.emitError(\n \"sequence-pattern-match-error\",\n error,\n `[Keymap] Error matching sequence pattern \"${pattern.name}\":`,\n )\n return undefined\n }\n}\n\nexport function createPatternEventPart<TEvent extends KeymapEvent>(\n patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>,\n event: TEvent,\n patternName: string,\n match: SequencePatternMatch,\n): KeySequencePart {\n const pattern = patterns.get(patternName)\n const payloadKey = pattern?.payloadKey ?? patternName\n const part = createKeySequencePart(\n {\n name: event.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 { display: match.display ?? String(match.value ?? event.name) },\n )\n\n return { ...part, patternName, payloadKey }\n}\n\nexport function createSequencePayload<TTarget extends object, TEvent extends KeymapEvent>(\n patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>,\n notify: NotificationService<TTarget, TEvent>,\n capture?: PendingSequenceCapture<TTarget, TEvent>,\n): unknown {\n if (!capture?.patterns || capture.patterns.length === 0) {\n return undefined\n }\n\n const payload: Record<string, unknown> = {}\n let hasPayload = false\n for (const captured of capture.patterns) {\n const pattern = patterns.get(captured.name)\n let value: unknown\n\n try {\n value = pattern?.finalize\n ? pattern.finalize(captured.values)\n : captured.values.length === 1\n ? captured.values[0]\n : [...captured.values]\n } catch (error) {\n notify.emitError(\n \"sequence-pattern-finalize-error\",\n error,\n `[Keymap] Error finalizing sequence pattern \"${captured.name}\":`,\n )\n continue\n }\n\n const existing = payload[captured.payloadKey]\n if (existing === undefined) {\n payload[captured.payloadKey] = value\n hasPayload = true\n } else if (Array.isArray(existing)) {\n existing.push(value)\n } else {\n payload[captured.payloadKey] = [existing, value]\n }\n }\n\n return hasPayload ? payload : undefined\n}\n",
|
|
23
|
+
"import type { CompilerService } from \"./compiler.js\"\nimport type { RuntimeEmitter } from \"../lib/runtime-utils.js\"\nimport type { ActivationService } from \"./activation.js\"\nimport type { CommandExecutorService } from \"./command-executor.js\"\nimport type { CommandCatalogService } from \"./command-catalog.js\"\nimport type { ConditionService } from \"./conditions.js\"\nimport type { LayerService } from \"./layers.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { RuntimeService } from \"./runtime.js\"\nimport type { State } from \"./state.js\"\nimport { cloneKeySequence, cloneKeyStroke, stringifyKeySequence } from \"./keys.js\"\nimport { captureHasContinuations, captureIsExact } from \"./primitives/pending-captures.js\"\nimport { advanceSequenceCapture, capturePriority, collectRootSequenceCaptures } from \"./sequence-index.js\"\nimport { isPromiseLike } from \"./values.js\"\nimport {\n type ActiveBinding,\n type ActiveKey,\n type EventMatchResolverContext,\n type EventMatchResolver,\n type KeyDeferredDisambiguationContext,\n type KeyDeferredDisambiguationDecision,\n type KeyDeferredDisambiguationHandler,\n type KeyDisambiguationContext,\n type KeyDisambiguationDecision,\n type KeyDisambiguationResolver,\n type KeyMatch,\n type KeyInterceptOptions,\n type KeyAfterInputContext,\n type KeyAfterReason,\n type KeyInputContext,\n type KeymapEvent,\n type PendingSequenceCapture,\n type PendingSequenceState,\n type RawInterceptOptions,\n type RawInputContext,\n type BindingState,\n type Hooks,\n type DispatchBinding,\n type DispatchEvent,\n type KeySequencePart,\n type RegisteredLayer,\n} from \"../types.js\"\nimport type { PriorityRegistration } from \"../lib/registry.js\"\nimport {\n createDeferredDecision,\n createSyncDecision,\n isDeferredDecision,\n isSyncDecision,\n sleepWithSignal,\n type InternalDeferredDisambiguationDecision,\n type InternalDisambiguationDecision,\n type PendingDisambiguation,\n} from \"./dispatch-decisions.js\"\nimport {\n createPatternEventPart as createPatternEventPartFromPattern,\n createSequencePayload as createSequencePayloadFromPattern,\n matchSequencePattern,\n} from \"./dispatch-patterns.js\"\n\ninterface KeyDispatchOutcome {\n handled: boolean\n reason: KeyAfterReason\n sequence?: readonly KeySequencePart[]\n captures?: readonly PendingSequenceCapture<any, any>[]\n}\n\ntype KeyAfterHook<TTarget extends object, TEvent extends KeymapEvent> = PriorityRegistration<\n (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n { priority: number; release: boolean }\n>\n\nexport interface DispatchService<TTarget extends object, TEvent extends KeymapEvent> {\n intercept(name: \"key\", fn: (ctx: KeyInputContext<TEvent>) => void, options?: KeyInterceptOptions): () => void\n intercept(\n name: \"key:after\",\n fn: (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n options?: KeyInterceptOptions,\n ): () => void\n intercept(name: \"raw\", fn: (ctx: RawInputContext) => void, options?: RawInterceptOptions): () => void\n prependEventMatchResolver(resolver: EventMatchResolver<TEvent>): () => void\n appendEventMatchResolver(resolver: EventMatchResolver<TEvent>): () => void\n clearEventMatchResolvers(): void\n prependDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void\n appendDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void\n clearDisambiguationResolvers(): void\n handlePendingSequenceChange(\n previous: PendingSequenceState<TTarget, TEvent> | null,\n next: PendingSequenceState<TTarget, TEvent> | null,\n ): void\n handleRawSequence(sequence: string): boolean\n handleKeyEvent(event: TEvent, release: boolean): void\n}\n\nexport function createDispatchService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n runtime: RuntimeService<TTarget, TEvent>,\n activation: ActivationService<TTarget, TEvent>,\n conditions: ConditionService<TTarget, TEvent>,\n executor: CommandExecutorService<TTarget, TEvent>,\n compiler: CompilerService<TTarget, TEvent>,\n catalog: CommandCatalogService<TTarget, TEvent>,\n layers: LayerService<TTarget, TEvent>,\n hooks: RuntimeEmitter<Hooks<TTarget, TEvent>>,\n): DispatchService<TTarget, TEvent> {\n const eventMatchResolverContext: EventMatchResolverContext = {\n resolveKey: (key) => compiler.parseTokenKey(key).match,\n }\n let pendingDisambiguation: PendingDisambiguation<TTarget, TEvent> | null = null\n let nextPendingDisambiguationId = 0\n\n function intercept(name: \"key\", fn: (ctx: KeyInputContext<TEvent>) => void, options?: KeyInterceptOptions): () => void\n\n function intercept(\n name: \"key:after\",\n fn: (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n options?: KeyInterceptOptions,\n ): () => void\n\n function intercept(name: \"raw\", fn: (ctx: RawInputContext) => void, options?: RawInterceptOptions): () => void\n\n function intercept(\n name: \"key\" | \"key:after\" | \"raw\",\n fn:\n | ((ctx: KeyInputContext<TEvent>) => void)\n | ((ctx: KeyAfterInputContext<TTarget, TEvent>) => void)\n | ((ctx: RawInputContext) => void),\n options?: KeyInterceptOptions | RawInterceptOptions,\n ): () => void {\n if (name === \"key\") {\n const keyOptions = options as KeyInterceptOptions | undefined\n return state.keyHooks.register(fn as (ctx: KeyInputContext<TEvent>) => void, {\n priority: keyOptions?.priority ?? 0,\n release: keyOptions?.release ?? false,\n })\n }\n\n if (name === \"key:after\") {\n const keyOptions = options as KeyInterceptOptions | undefined\n return state.keyAfterHooks.register(fn as (ctx: KeyAfterInputContext<TTarget, TEvent>) => void, {\n priority: keyOptions?.priority ?? 0,\n release: keyOptions?.release ?? false,\n })\n }\n\n const rawOptions = options as RawInterceptOptions | undefined\n return state.rawHooks.register(fn as (ctx: RawInputContext) => void, {\n priority: rawOptions?.priority ?? 0,\n })\n }\n\n function prependEventMatchResolver(resolver: EventMatchResolver<TEvent>): () => void {\n return state.eventMatchResolvers.prepend(resolver)\n }\n\n function appendEventMatchResolver(resolver: EventMatchResolver<TEvent>): () => void {\n return state.eventMatchResolvers.append(resolver)\n }\n\n function clearEventMatchResolvers(): void {\n state.eventMatchResolvers.clear()\n }\n\n function prependDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void {\n return mutateDisambiguationResolvers(() => state.disambiguationResolvers.prepend(resolver), resolver)\n }\n\n function appendDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void {\n return mutateDisambiguationResolvers(() => state.disambiguationResolvers.append(resolver), resolver)\n }\n\n function clearDisambiguationResolvers(): void {\n if (!state.disambiguationResolvers.has()) {\n return\n }\n\n notify.runWithStateChangeBatch(() => {\n state.disambiguationResolvers.clear()\n layers.recompileBindings()\n })\n }\n\n function handlePendingSequenceChange(\n _previous: PendingSequenceState<TTarget, TEvent> | null,\n _next: PendingSequenceState<TTarget, TEvent> | null,\n ): void {\n if (!pendingDisambiguation) {\n return\n }\n\n cancelPendingDisambiguation()\n }\n\n function handleRawSequence(sequence: string): boolean {\n const hooks = state.rawHooks.entries()\n if (hooks.length === 0) {\n return false\n }\n\n let stopped = false\n const context: RawInputContext = {\n sequence,\n stop() {\n stopped = true\n },\n }\n\n for (const hook of hooks) {\n try {\n hook.listener(context)\n } catch (error) {\n notify.emitError(\"raw-intercept-error\", error, \"[Keymap] Error in raw intercept listener:\")\n }\n\n if (stopped) {\n return true\n }\n }\n\n return false\n }\n\n function createDispatchBinding(\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n ): DispatchBinding<TTarget, TEvent> {\n return {\n sequence: cloneKeySequence(binding.sequence),\n command: binding.command,\n commandAttrs: catalog.getBindingCommandAttrs(binding, focused, catalog.getActiveCommandView(focused)),\n attrs: binding.attrs,\n event: binding.event,\n preventDefault: binding.preventDefault,\n fallthrough: binding.fallthrough,\n sourceLayerOrder: binding.sourceLayerOrder,\n bindingIndex: binding.bindingIndex,\n }\n }\n\n function emitDispatchEvent(event: DispatchEvent<TTarget, TEvent>): void {\n if (!hooks.has(\"dispatch\")) {\n return\n }\n\n hooks.emit(\"dispatch\", event)\n }\n\n function emitBindingDispatch(\n phase: \"binding-execute\" | \"binding-reject\",\n layer: RegisteredLayer<TTarget, TEvent>,\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n ): void {\n if (!hooks.has(\"dispatch\")) {\n return\n }\n\n emitDispatchEvent({\n phase,\n event: binding.event,\n focused,\n layer: {\n order: layer.order,\n priority: layer.priority,\n target: layer.target,\n targetMode: layer.targetMode,\n },\n binding: createDispatchBinding(binding, focused),\n sequence: cloneKeySequence(binding.sequence),\n command: binding.command,\n })\n }\n\n function emitSequenceDispatch(\n phase: \"sequence-start\" | \"sequence-advance\" | \"sequence-clear\",\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n focused: TTarget | null,\n ): void {\n if (!hooks.has(\"dispatch\")) {\n return\n }\n\n const first = captures[0]\n const sequence = captures.length > 0 ? activation.collectSequencePartsFromPending({ captures }) : []\n\n emitDispatchEvent({\n phase,\n event: \"press\",\n focused,\n layer: first\n ? {\n order: first.layer.order,\n priority: first.layer.priority,\n target: first.layer.target,\n targetMode: first.layer.targetMode,\n }\n : undefined,\n sequence,\n })\n }\n\n function getKeyAfterHooks(release: boolean): readonly KeyAfterHook<TTarget, TEvent>[] | undefined {\n const hooks = state.keyAfterHooks.entries()\n for (const hook of hooks) {\n if (hook.release === release) {\n return hooks\n }\n }\n\n return undefined\n }\n\n function getOutcomeSequence(outcome: KeyDispatchOutcome): readonly KeySequencePart[] {\n if (outcome.sequence) {\n return cloneKeySequence(outcome.sequence)\n }\n\n if (outcome.captures) {\n return activation.collectSequencePartsFromPending({ captures: outcome.captures })\n }\n\n return []\n }\n\n function createSequenceOutcome(\n reason: \"sequence-pending\" | \"sequence-miss\" | \"sequence-cleared\",\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n ): KeyDispatchOutcome {\n return {\n handled: reason !== \"sequence-miss\",\n reason,\n captures,\n }\n }\n\n function createBindingOutcome(binding: BindingState<TTarget, TEvent>, handled: boolean): KeyDispatchOutcome {\n return {\n handled,\n reason: handled ? \"binding-handled\" : \"binding-rejected\",\n sequence: binding.sequence,\n }\n }\n\n function preferDispatchOutcome(current: KeyDispatchOutcome, next: KeyDispatchOutcome): KeyDispatchOutcome {\n if (next.handled || current.reason === \"no-match\") {\n return next\n }\n\n return current\n }\n\n function emitKeyAfter(\n hooks: readonly KeyAfterHook<TTarget, TEvent>[],\n event: TEvent,\n release: boolean,\n focused: TTarget | null,\n outcome: KeyDispatchOutcome,\n ): void {\n const context: KeyAfterInputContext<TTarget, TEvent> = {\n event,\n eventType: release ? \"release\" : \"press\",\n focused,\n handled: outcome.handled,\n reason: outcome.reason,\n sequence: getOutcomeSequence(outcome),\n pendingSequence: activation.getPendingSequence(),\n setData: (name, value) => {\n runtime.setData(name, value)\n },\n getData: (name) => {\n return runtime.getData(name)\n },\n consume: (options) => {\n const shouldPreventDefault = options?.preventDefault ?? true\n const shouldStopPropagation = options?.stopPropagation ?? true\n\n if (shouldPreventDefault) {\n event.preventDefault()\n }\n\n if (shouldStopPropagation) {\n event.stopPropagation()\n }\n },\n }\n\n for (const hook of hooks) {\n if (hook.release !== release) {\n continue\n }\n\n try {\n hook.listener(context)\n } catch (error) {\n notify.emitError(\"key-after-intercept-error\", error, \"[Keymap] Error in key:after intercept listener:\")\n }\n }\n }\n\n function noMatchOutcome(): KeyDispatchOutcome {\n return { handled: false, reason: \"no-match\" }\n }\n\n function consumeSequenceEvent(event: TEvent): void {\n event.preventDefault()\n event.stopPropagation()\n }\n\n function holdSequence(\n phase: \"sequence-start\" | \"sequence-advance\",\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n focused: TTarget | null,\n event: TEvent,\n ): KeyDispatchOutcome {\n activation.setPendingSequence({ captures })\n const outcome = createSequenceOutcome(\"sequence-pending\", captures)\n emitSequenceDispatch(phase, captures, focused)\n consumeSequenceEvent(event)\n return outcome\n }\n\n function clearSequence(\n reason: \"sequence-cleared\",\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n focused: TTarget | null,\n event: TEvent,\n ): KeyDispatchOutcome {\n const outcome = createSequenceOutcome(reason, captures)\n emitSequenceDispatch(\"sequence-clear\", captures, focused)\n activation.setPendingSequence(null)\n consumeSequenceEvent(event)\n return outcome\n }\n\n function handleKeyEvent(event: TEvent, release: boolean): void {\n if (!release) {\n cancelPendingDisambiguation()\n }\n\n const afterHooks = getKeyAfterHooks(release)\n const afterFocused = afterHooks ? activation.getFocusedTarget() : null\n const hooks = state.keyHooks.entries()\n const context: KeyInputContext<TEvent> = {\n event,\n setData: (name, value) => {\n runtime.setData(name, value)\n },\n getData: (name) => {\n return runtime.getData(name)\n },\n consume: (options) => {\n const shouldPreventDefault = options?.preventDefault ?? true\n const shouldStopPropagation = options?.stopPropagation ?? true\n\n if (shouldPreventDefault) {\n event.preventDefault()\n }\n\n if (shouldStopPropagation) {\n event.stopPropagation()\n }\n },\n }\n\n for (const hook of hooks) {\n if (hook.release !== release) {\n continue\n }\n\n try {\n hook.listener(context)\n } catch (error) {\n notify.emitError(\"key-intercept-error\", error, \"[Keymap] Error in key intercept listener:\")\n }\n\n if (event.propagationStopped) {\n if (afterHooks) {\n emitKeyAfter(afterHooks, event, release, afterFocused, {\n handled: true,\n reason: \"intercept-consumed\",\n sequence: [],\n })\n }\n return\n }\n }\n\n if (release) {\n const outcome = dispatchReleaseLayers(event)\n if (afterHooks) {\n emitKeyAfter(afterHooks, event, release, afterFocused, outcome)\n }\n return\n }\n\n const outcome = dispatchLayers(event)\n if (afterHooks) {\n emitKeyAfter(afterHooks, event, release, afterFocused, outcome)\n }\n }\n\n function mutateDisambiguationResolvers(\n register: () => () => void,\n resolver: KeyDisambiguationResolver<TTarget, TEvent>,\n ): () => void {\n return notify.runWithStateChangeBatch(() => {\n const hadResolvers = state.disambiguationResolvers.has()\n const off = register()\n\n if (!hadResolvers && state.disambiguationResolvers.has()) {\n layers.recompileBindings()\n }\n\n return () => {\n notify.runWithStateChangeBatch(() => {\n const hadBeforeRemoval = state.disambiguationResolvers.has()\n off()\n\n if (state.disambiguationResolvers.values().includes(resolver)) {\n return\n }\n\n if (hadBeforeRemoval && !state.disambiguationResolvers.has()) {\n layers.recompileBindings()\n }\n })\n }\n })\n }\n\n function dispatchReleaseLayers(event: TEvent): KeyDispatchOutcome {\n const focused = activation.getFocusedTarget()\n const activeLayers = activation.getActiveLayers(focused)\n const matchKeys = resolveEventMatchKeys(event)\n let outcome = noMatchOutcome()\n\n layerLoop: for (const layer of activeLayers) {\n if (layer.bindings.length === 0) {\n continue\n }\n\n if (!conditions.matchesConditions(layer)) {\n continue\n }\n\n for (const strokeKey of matchKeys) {\n const result = runReleaseBindings(layer, strokeKey, event, focused)\n outcome = preferDispatchOutcome(outcome, result.outcome)\n if (!result.handled) {\n continue\n }\n\n if (result.stop) {\n return outcome\n }\n\n continue layerLoop\n }\n }\n\n return outcome\n }\n\n function dispatchLayers(event: TEvent): KeyDispatchOutcome {\n const focused = activation.getFocusedTarget()\n const pending = activation.ensureValidPendingSequence()\n const matchKeys = resolveEventMatchKeys(event)\n\n if (pending) {\n return dispatchPendingSequence(pending, matchKeys, event, focused)\n }\n\n const activeLayers = activation.getActiveLayers(focused)\n return dispatchFromRoot(activeLayers, matchKeys, event, focused)\n }\n\n function dispatchPendingSequence(\n pending: PendingSequenceState<TTarget, TEvent>,\n matchKeys: readonly KeyMatch[],\n event: TEvent,\n focused: TTarget | null,\n ): KeyDispatchOutcome {\n const activeView = catalog.getActiveCommandView(focused)\n const advancedCaptures: PendingSequenceCapture<TTarget, TEvent>[] = []\n\n for (const capture of pending.captures) {\n const advanced = advanceSequenceCapture(\n capture,\n matchKeys,\n event,\n state.patterns,\n matchPattern,\n createPatternEventPart,\n )\n if (!advanced) {\n continue\n }\n\n advancedCaptures.push(advanced)\n }\n\n const bestPriority = advancedCaptures.reduce(\n (best, capture) => Math.min(best, capturePriority(capture, matchKeys)),\n Number.POSITIVE_INFINITY,\n )\n const prioritizedCaptures = advancedCaptures.filter(\n (capture) => capturePriority(capture, matchKeys) === bestPriority,\n )\n\n if (\n prioritizedCaptures.length === 0 ||\n !prioritizedCaptures.some((capture) => captureIsReachable(capture, focused, activeView))\n ) {\n const outcome = createSequenceOutcome(\"sequence-miss\", pending.captures)\n emitSequenceDispatch(\"sequence-clear\", pending.captures, focused)\n activation.setPendingSequence(null)\n return outcome\n }\n\n return dispatchPendingCapturesFromIndex(prioritizedCaptures, 0, false, event, focused)\n }\n\n function dispatchPendingCapturesFromIndex(\n advancedCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n startIndex: number,\n handledExact: boolean,\n event: TEvent,\n focused: TTarget | null,\n ): KeyDispatchOutcome {\n let hasHandledExact = handledExact\n let outcome = noMatchOutcome()\n const processedExact = new Set<PendingSequenceCapture<TTarget, TEvent>>()\n\n for (let index = startIndex; index < advancedCaptures.length; index += 1) {\n const capture = advancedCaptures[index]\n if (!capture || processedExact.has(capture)) {\n continue\n }\n\n const continuationCapturesForPrefix = collectContinuationCapturesForPrefix(advancedCaptures, index, capture)\n if (continuationCapturesForPrefix.length > 0) {\n if (hasHandledExact) {\n continue\n }\n\n const exactCaptures = collectExactCapturesForPrefix(advancedCaptures, capture)\n const resolvedOutcome = tryResolvePendingAmbiguity(\n advancedCaptures,\n index,\n continuationCapturesForPrefix,\n exactCaptures,\n event,\n focused,\n hasHandledExact,\n )\n if (resolvedOutcome) {\n return resolvedOutcome\n }\n\n return holdSequence(\"sequence-advance\", continuationCapturesForPrefix, focused, event)\n }\n\n if (!captureIsExact(capture, state.patterns)) {\n continue\n }\n\n const exactCaptures = collectExactCapturesForPrefix(advancedCaptures, capture)\n for (const exact of exactCaptures) processedExact.add(exact)\n const result = runCaptureBindings(capture.layer, exactCaptures, event, focused)\n outcome = preferDispatchOutcome(outcome, result.outcome)\n if (!result.handled) {\n continue\n }\n\n hasHandledExact = true\n if (result.stop) {\n emitSequenceDispatch(\"sequence-clear\", advancedCaptures, focused)\n activation.setPendingSequence(null)\n return outcome\n }\n }\n\n emitSequenceDispatch(\"sequence-clear\", advancedCaptures, focused)\n activation.setPendingSequence(null)\n return outcome\n }\n\n function dispatchFromRoot(\n activeLayers: RegisteredLayer<TTarget, TEvent>[],\n matchKeys: readonly KeyMatch[],\n event: TEvent,\n focused: TTarget | null,\n ): KeyDispatchOutcome {\n return dispatchFromRootAtIndex(activeLayers, 0, matchKeys, event, focused)\n }\n\n function dispatchFromRootAtIndex(\n activeLayers: RegisteredLayer<TTarget, TEvent>[],\n startIndex: number,\n matchKeys: readonly KeyMatch[],\n event: TEvent,\n focused: TTarget | null,\n ): KeyDispatchOutcome {\n const activeView = catalog.getActiveCommandView(focused)\n let outcome = noMatchOutcome()\n\n for (let index = startIndex; index < activeLayers.length; index += 1) {\n const layer = activeLayers[index]\n if (!layer) {\n continue\n }\n\n if (!conditions.matchesConditions(layer)) {\n continue\n }\n\n const captures = collectRootCaptures(layer, matchKeys, event, focused, activeView)\n if (captures.length === 0) {\n continue\n }\n\n const layerContinuationCaptures = captures.filter((capture) =>\n captureHasContinuations(capture, state.patterns, false),\n )\n if (layerContinuationCaptures.length > 0) {\n const exactCaptures = captures.filter((capture) => captureIsExact(capture, state.patterns))\n const continuationCaptures = collectPendingCapturesFromRoot(activeLayers, index, matchKeys, event, focused)\n const resolvedOutcome = tryResolveRootAmbiguity(\n activeLayers,\n index,\n matchKeys,\n continuationCaptures,\n exactCaptures,\n event,\n focused,\n )\n if (resolvedOutcome) {\n return resolvedOutcome\n }\n\n return holdSequence(\"sequence-start\", continuationCaptures, focused, event)\n }\n\n const exactCaptures = captures.filter((capture) => captureIsExact(capture, state.patterns))\n const result = runCaptureBindings(layer, exactCaptures, event, focused)\n outcome = preferDispatchOutcome(outcome, result.outcome)\n if (!result.handled) {\n continue\n }\n\n if (result.stop) {\n return outcome\n }\n }\n\n return outcome\n }\n\n function tryResolveRootAmbiguity(\n activeLayers: RegisteredLayer<TTarget, TEvent>[],\n layerIndex: number,\n matchKeys: readonly KeyMatch[],\n continuationCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n exactCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n event: TEvent,\n focused: TTarget | null,\n ): KeyDispatchOutcome | undefined {\n const applyExact = (): KeyDispatchOutcome => {\n activation.setPendingSequence(null)\n const layer = exactCaptures[0]?.layer\n if (!layer) return noMatchOutcome()\n const result = runCaptureBindings(layer, exactCaptures, event, focused)\n if (!result.stop) {\n return preferDispatchOutcome(\n result.outcome,\n dispatchFromRootAtIndex(activeLayers, layerIndex + 1, matchKeys, event, focused),\n )\n }\n\n return result.outcome\n }\n\n return tryResolveAmbiguity({\n event,\n focused,\n continuationCaptures,\n exactBindingsSource: exactCaptures.map((capture) => capture.binding),\n sequencePhase: \"sequence-start\",\n runExact: applyExact,\n })\n }\n\n function tryResolvePendingAmbiguity(\n advancedCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n captureIndex: number,\n continuationCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n exactCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n event: TEvent,\n focused: TTarget | null,\n handledExact: boolean,\n ): KeyDispatchOutcome | undefined {\n const applyExact = (): KeyDispatchOutcome => {\n activation.setPendingSequence(null)\n const layer = exactCaptures[0]?.layer\n if (!layer) return noMatchOutcome()\n const result = runCaptureBindings(layer, exactCaptures, event, focused)\n if (result.stop) {\n return result.outcome\n }\n\n return preferDispatchOutcome(\n result.outcome,\n dispatchPendingCapturesFromIndex(\n advancedCaptures,\n captureIndex + 1,\n handledExact || result.handled,\n event,\n focused,\n ),\n )\n }\n\n return tryResolveAmbiguity({\n event,\n focused,\n continuationCaptures,\n exactBindingsSource: exactCaptures.map((capture) => capture.binding),\n sequencePhase: \"sequence-advance\",\n runExact: applyExact,\n })\n }\n\n function tryResolveAmbiguity(options: {\n event: TEvent\n focused: TTarget | null\n continuationCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[]\n exactBindingsSource: readonly BindingState<TTarget, TEvent>[]\n sequencePhase: \"sequence-start\" | \"sequence-advance\"\n runExact: () => KeyDispatchOutcome\n }): KeyDispatchOutcome | undefined {\n const { event, focused, continuationCaptures, exactBindingsSource, sequencePhase, runExact } = options\n\n if (!state.disambiguationResolvers.has() || continuationCaptures.length === 0) {\n return undefined\n }\n\n const activeView = catalog.getActiveCommandView(focused)\n const exactBindings = activation.collectMatchingBindings(exactBindingsSource, focused, activeView)\n if (!exactBindings.some((binding) => binding.command !== undefined)) {\n return undefined\n }\n\n const continueSequence = (): KeyDispatchOutcome => {\n return holdSequence(sequencePhase, continuationCaptures, focused, event)\n }\n\n const clear = (): KeyDispatchOutcome => {\n return clearSequence(\"sequence-cleared\", continuationCaptures, focused, event)\n }\n\n let sequence: ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]> | undefined\n const getSequence = (): ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]> => {\n sequence ??= activation.collectSequencePartsFromPending({ captures: continuationCaptures })\n return sequence\n }\n\n const decision = resolveDisambiguation({\n event,\n focused,\n getSequence,\n exactBindings,\n continuationCaptures,\n activeView,\n })\n\n if (!decision) {\n warnUnresolvedAmbiguity(getSequence())\n return continueSequence()\n }\n\n return applySyncDecision(decision, continuationCaptures, runExact, continueSequence, clear, focused, getSequence)\n }\n\n function applySyncDecision(\n decision: InternalDisambiguationDecision,\n continuationCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n runExact: () => KeyDispatchOutcome,\n continueSequence: () => KeyDispatchOutcome,\n clear: () => KeyDispatchOutcome,\n focused: TTarget | null,\n getSequence: () => ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]>,\n ): KeyDispatchOutcome {\n if (decision.action === \"run-exact\") {\n return runExact()\n }\n\n if (decision.action === \"continue-sequence\") {\n return continueSequence()\n }\n\n if (decision.action === \"clear\") {\n return clear()\n }\n\n const outcome = continueSequence()\n scheduleDeferredDisambiguation(continuationCaptures, decision.handler!, focused, getSequence(), (nextDecision) => {\n if (!nextDecision) {\n return\n }\n\n if (nextDecision.action === \"run-exact\") {\n runExact()\n return\n }\n\n if (nextDecision.action === \"continue-sequence\") {\n continueSequence()\n return\n }\n\n clear()\n })\n return outcome\n }\n\n function resolveDisambiguation(options: {\n event: TEvent\n focused: TTarget | null\n getSequence: () => ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]>\n exactBindings: readonly BindingState<TTarget, TEvent>[]\n continuationCaptures: readonly PendingSequenceCapture<TTarget, TEvent>[]\n activeView: ReturnType<CommandCatalogService<TTarget, TEvent>[\"getActiveCommandView\"]>\n }): InternalDisambiguationDecision | undefined {\n let sequence: ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]> | undefined\n let exact: readonly ActiveBinding<TTarget, TEvent>[] | undefined\n let continuations: readonly ActiveKey<TTarget, TEvent>[] | undefined\n let strokePart: KeyDisambiguationContext<TTarget, TEvent>[\"stroke\"] | undefined\n\n const ctx: KeyDisambiguationContext<TTarget, TEvent> = {\n event: options.event as Readonly<Omit<TEvent, \"preventDefault\" | \"stopPropagation\">>,\n focused: options.focused,\n get sequence() {\n sequence ??= cloneKeySequence(options.getSequence())\n return sequence\n },\n get stroke() {\n const stroke = options.getSequence().at(-1)\n if (!stroke) {\n throw new Error(\"Disambiguation context expected a non-empty sequence\")\n }\n\n strokePart ??= {\n ...stroke,\n stroke: cloneKeyStroke(stroke.stroke),\n }\n\n return strokePart\n },\n get exact() {\n exact ??= activation\n .collectActiveBindings(options.exactBindings, options.focused, options.activeView)\n .map((binding) => ({\n ...binding,\n sequence: cloneKeySequence(binding.sequence),\n }))\n\n return exact\n },\n get continuations() {\n continuations ??= activation.getActiveKeysForCaptures(options.continuationCaptures, {\n includeBindings: true,\n includeMetadata: true,\n })\n\n return continuations\n },\n getData: (name) => {\n return runtime.getData(name)\n },\n setData: (name, value) => {\n runtime.setData(name, value)\n },\n runExact: () => createSyncDecision(\"run-exact\"),\n continueSequence: () => createSyncDecision(\"continue-sequence\"),\n clear: () => createSyncDecision(\"clear\"),\n defer: (run) => createSyncDecision(\"defer\", run),\n }\n\n for (const resolver of state.disambiguationResolvers.values()) {\n let result: KeyDisambiguationDecision | undefined\n\n try {\n result = resolver(ctx)\n } catch (error) {\n notify.emitError(\"disambiguation-resolver-error\", error, \"[Keymap] Error in disambiguation resolver:\")\n continue\n }\n\n if (result === undefined) {\n continue\n }\n\n if (isPromiseLike(result)) {\n notify.emitError(\n \"invalid-disambiguation-resolver-return\",\n result,\n \"[Keymap] Disambiguation resolvers must return synchronously; use ctx.defer(...) for async handling\",\n )\n continue\n }\n\n if (!isSyncDecision(result)) {\n notify.emitError(\n \"invalid-disambiguation-decision\",\n result,\n \"[Keymap] Invalid disambiguation decision returned by resolver:\",\n )\n continue\n }\n\n return result\n }\n\n return undefined\n }\n\n function scheduleDeferredDisambiguation(\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n handler: KeyDeferredDisambiguationHandler<TTarget, TEvent>,\n focused: TTarget | null,\n sequence: ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]>,\n apply: (decision: InternalDeferredDisambiguationDecision | void) => void,\n ): void {\n cancelPendingDisambiguation()\n\n const controller = new AbortController()\n const pending: PendingDisambiguation<TTarget, TEvent> = {\n id: nextPendingDisambiguationId++,\n controller,\n captures,\n apply,\n }\n pendingDisambiguation = pending\n\n queueMicrotask(() => {\n executeDeferredDisambiguation(pending, handler, focused, sequence)\n })\n }\n\n function executeDeferredDisambiguation(\n pending: PendingDisambiguation<TTarget, TEvent>,\n handler: KeyDeferredDisambiguationHandler<TTarget, TEvent>,\n focused: TTarget | null,\n sequence: ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]>,\n ): void {\n if (!isPendingDisambiguationCurrent(pending)) {\n return\n }\n\n const ctx: KeyDeferredDisambiguationContext<TTarget, TEvent> = {\n signal: pending.controller.signal,\n sequence: cloneKeySequence(sequence),\n focused,\n sleep: (ms) => {\n return sleepWithSignal(ms, pending.controller.signal)\n },\n runExact: () => createDeferredDecision(\"run-exact\"),\n continueSequence: () => createDeferredDecision(\"continue-sequence\"),\n clear: () => createDeferredDecision(\"clear\"),\n }\n\n let result: KeyDeferredDisambiguationDecision | void | Promise<KeyDeferredDisambiguationDecision | void>\n try {\n result = handler(ctx)\n } catch (error) {\n if (isPendingDisambiguationCurrent(pending)) {\n notify.emitError(\"deferred-disambiguation-error\", error, \"[Keymap] Error in deferred disambiguation handler:\")\n finishPendingDisambiguation(pending)\n }\n return\n }\n\n if (isPromiseLike(result)) {\n result\n .then((resolved) => {\n applyDeferredDisambiguationResult(pending, resolved)\n })\n .catch((error) => {\n if (!isPendingDisambiguationCurrent(pending)) {\n return\n }\n\n notify.emitError(\"deferred-disambiguation-error\", error, \"[Keymap] Error in deferred disambiguation handler:\")\n finishPendingDisambiguation(pending)\n })\n return\n }\n\n applyDeferredDisambiguationResult(pending, result)\n }\n\n function applyDeferredDisambiguationResult(\n pending: PendingDisambiguation<TTarget, TEvent>,\n result: KeyDeferredDisambiguationDecision | void,\n ): void {\n if (!isPendingDisambiguationCurrent(pending)) {\n return\n }\n\n if (result !== undefined && !isDeferredDecision(result)) {\n notify.emitError(\n \"invalid-deferred-disambiguation-decision\",\n result,\n \"[Keymap] Invalid deferred disambiguation decision returned by handler:\",\n )\n finishPendingDisambiguation(pending)\n return\n }\n\n finishPendingDisambiguation(pending)\n pending.apply(result as InternalDeferredDisambiguationDecision | void)\n }\n\n function finishPendingDisambiguation(pending: PendingDisambiguation<TTarget, TEvent>): void {\n if (!isPendingDisambiguationCurrent(pending)) {\n return\n }\n\n pendingDisambiguation = null\n }\n\n function cancelPendingDisambiguation(): void {\n const pending = pendingDisambiguation\n if (!pending) {\n return\n }\n\n pendingDisambiguation = null\n pending.controller.abort()\n }\n\n function isPendingDisambiguationCurrent(pending: PendingDisambiguation<TTarget, TEvent>): boolean {\n return pendingDisambiguation === pending\n }\n\n function warnUnresolvedAmbiguity(\n sequence: ReturnType<ActivationService<TTarget, TEvent>[\"collectSequencePartsFromPending\"]>,\n ): void {\n const display = stringifyKeySequence(sequence, { preferDisplay: true })\n\n notify.warnOnce(\n `unresolved-disambiguation:${display}`,\n \"unresolved-disambiguation\",\n { sequence: display },\n `[Keymap] Ambiguous exact/prefix sequence \"${display}\" fell back to prefix handling because no disambiguation resolver resolved it`,\n )\n }\n\n function collectPendingCapturesFromRoot(\n activeLayers: RegisteredLayer<TTarget, TEvent>[],\n startIndex: number,\n matchKeys: readonly KeyMatch[],\n event: TEvent,\n focused: TTarget | null,\n ): PendingSequenceCapture<TTarget, TEvent>[] {\n const captures: PendingSequenceCapture<TTarget, TEvent>[] = []\n const activeView = catalog.getActiveCommandView(focused)\n\n for (let index = startIndex; index < activeLayers.length; index += 1) {\n const layer = activeLayers[index]\n if (!layer) {\n continue\n }\n\n if (!conditions.matchesConditions(layer)) {\n continue\n }\n\n for (const capture of collectRootCaptures(layer, matchKeys, event, focused, activeView)) {\n if (captureHasContinuations(capture, state.patterns, false)) {\n captures.push(capture)\n }\n }\n }\n\n return captures\n }\n\n function collectContinuationCapturesForPrefix(\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n startIndex: number,\n prefix: PendingSequenceCapture<TTarget, TEvent>,\n ): PendingSequenceCapture<TTarget, TEvent>[] {\n return captures.filter((candidate, candidateIndex) => {\n return (\n candidateIndex >= startIndex &&\n captureHasContinuations(candidate, state.patterns, false) &&\n sameParts(candidate.parts, prefix.parts)\n )\n })\n }\n\n function collectExactCapturesForPrefix(\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n prefix: PendingSequenceCapture<TTarget, TEvent>,\n ): PendingSequenceCapture<TTarget, TEvent>[] {\n return captures.filter((capture) => {\n return (\n capture.layer === prefix.layer &&\n captureIsExact(capture, state.patterns) &&\n sameParts(capture.parts, prefix.parts)\n )\n })\n }\n\n function resolveEventMatchKeys(event: TEvent): KeyMatch[] {\n const resolvers = state.eventMatchResolvers.values()\n\n if (resolvers.length === 0) {\n return []\n }\n\n if (resolvers.length === 1) {\n return resolveSingleEventMatchKeys(resolvers[0]!, event, eventMatchResolverContext, notify)\n }\n\n const keys: KeyMatch[] = []\n const seen = new Set<KeyMatch>()\n\n for (const resolver of resolvers) {\n let resolved: readonly KeyMatch[] | undefined\n\n try {\n resolved = resolver(event, eventMatchResolverContext)\n } catch (error) {\n notify.emitError(\"event-match-resolver-error\", error, \"[Keymap] Error in event match resolver:\")\n continue\n }\n\n if (!resolved || resolved.length === 0) {\n continue\n }\n\n for (const candidate of resolved) {\n if (typeof candidate !== \"string\") {\n notify.emitError(\n \"invalid-event-match-resolver-candidate\",\n candidate,\n \"[Keymap] Invalid event match resolver candidate:\",\n )\n continue\n }\n\n if (seen.has(candidate)) {\n continue\n }\n\n seen.add(candidate)\n keys.push(candidate)\n }\n }\n\n return keys\n }\n\n function runReleaseBindings(\n layer: RegisteredLayer<TTarget, TEvent>,\n strokeKey: KeyMatch,\n event: TEvent,\n focused: TTarget | null,\n ): { handled: boolean; stop: boolean; outcome: KeyDispatchOutcome } {\n let handled = false\n let outcome = noMatchOutcome()\n\n for (const binding of layer.bindings) {\n if (binding.event !== \"release\") {\n continue\n }\n\n const firstPart = binding.sequence[0]\n if (!firstPart || firstPart.match !== strokeKey) {\n continue\n }\n\n if (!conditions.matchesConditions(binding)) {\n continue\n }\n\n const bindingHandled = executor.runBinding(layer, binding, event, focused)\n outcome = preferDispatchOutcome(outcome, createBindingOutcome(binding, bindingHandled))\n if (!bindingHandled) {\n emitBindingDispatch(\"binding-reject\", layer, binding, focused)\n continue\n }\n\n emitBindingDispatch(\"binding-execute\", layer, binding, focused)\n handled = true\n if (!binding.fallthrough) {\n return { handled: true, stop: true, outcome }\n }\n }\n\n return { handled, stop: false, outcome }\n }\n\n function matchPattern(patternName: string, event: TEvent) {\n return matchSequencePattern(state.patterns, notify, patternName, event)\n }\n\n function createPatternEventPart(\n event: TEvent,\n patternName: string,\n match: NonNullable<ReturnType<typeof matchPattern>>,\n ) {\n return createPatternEventPartFromPattern(state.patterns, event, patternName, match)\n }\n\n function collectRootCaptures(\n layer: RegisteredLayer<TTarget, TEvent>,\n matchKeys: readonly KeyMatch[],\n event: TEvent,\n focused: TTarget | null,\n activeView: ReturnType<CommandCatalogService<TTarget, TEvent>[\"getActiveCommandView\"]>,\n ): PendingSequenceCapture<TTarget, TEvent>[] {\n const captures = collectRootSequenceCaptures(layer, matchKeys, event, matchPattern, createPatternEventPart)\n return captures.some((capture) => captureIsReachable(capture, focused, activeView)) ? captures : []\n }\n\n function createSequencePayload(capture?: PendingSequenceCapture<TTarget, TEvent>): unknown {\n return createSequencePayloadFromPattern(state.patterns, notify, capture)\n }\n\n function bindingMatchesRuntimeState(\n binding: BindingState<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ReturnType<CommandCatalogService<TTarget, TEvent>[\"getActiveCommandView\"]>,\n ): boolean {\n return conditions.matchesConditions(binding) && catalog.isBindingVisible(binding, focused, activeView)\n }\n\n function captureIsReachable(\n capture: PendingSequenceCapture<TTarget, TEvent>,\n focused: TTarget | null,\n activeView: ReturnType<CommandCatalogService<TTarget, TEvent>[\"getActiveCommandView\"]>,\n ): boolean {\n return bindingMatchesRuntimeState(capture.binding, focused, activeView)\n }\n\n function runCaptureBindings(\n layer: RegisteredLayer<TTarget, TEvent>,\n captures: readonly PendingSequenceCapture<TTarget, TEvent>[],\n event: TEvent,\n focused: TTarget | null,\n ): { handled: boolean; stop: boolean; outcome: KeyDispatchOutcome } {\n let handled = false\n let outcome = noMatchOutcome()\n\n for (const capture of captures) {\n const binding = capture.binding\n if (!conditions.matchesConditions(binding)) {\n continue\n }\n\n const bindingHandled = executor.runBinding(layer, binding, event, focused, createSequencePayload(capture))\n outcome = preferDispatchOutcome(outcome, createBindingOutcome(binding, bindingHandled))\n if (!bindingHandled) {\n emitBindingDispatch(\"binding-reject\", layer, binding, focused)\n continue\n }\n\n emitBindingDispatch(\"binding-execute\", layer, binding, focused)\n handled = true\n if (!binding.fallthrough) {\n return { handled: true, stop: true, outcome }\n }\n }\n\n return { handled, stop: false, outcome }\n }\n\n return {\n intercept,\n prependEventMatchResolver,\n appendEventMatchResolver,\n clearEventMatchResolvers,\n prependDisambiguationResolver,\n appendDisambiguationResolver,\n clearDisambiguationResolvers,\n handlePendingSequenceChange,\n handleRawSequence,\n handleKeyEvent,\n }\n}\n\nfunction resolveSingleEventMatchKeys<TTarget extends object, TEvent extends KeymapEvent>(\n resolver: EventMatchResolver<TEvent>,\n event: TEvent,\n ctx: EventMatchResolverContext,\n notify: NotificationService<TTarget, TEvent>,\n): KeyMatch[] {\n let resolved: readonly KeyMatch[] | undefined\n try {\n resolved = resolver(event, ctx)\n } catch (error) {\n notify.emitError(\"event-match-resolver-error\", error, \"[Keymap] Error in event match resolver:\")\n return []\n }\n\n if (!resolved || resolved.length === 0) {\n return []\n }\n\n if (resolved.length === 1) {\n const [candidate] = resolved\n if (typeof candidate !== \"string\") {\n notify.emitError(\n \"invalid-event-match-resolver-candidate\",\n candidate,\n \"[Keymap] Invalid event match resolver candidate:\",\n )\n return []\n }\n\n return [candidate]\n }\n\n const keys: KeyMatch[] = []\n const seen = new Set<KeyMatch>()\n for (const candidate of resolved) {\n if (typeof candidate !== \"string\") {\n notify.emitError(\n \"invalid-event-match-resolver-candidate\",\n candidate,\n \"[Keymap] Invalid event match resolver candidate:\",\n )\n continue\n }\n\n if (seen.has(candidate)) {\n continue\n }\n\n seen.add(candidate)\n keys.push(candidate)\n }\n\n return keys\n}\n\nfunction sameParts(left: readonly KeySequencePart[], right: readonly KeySequencePart[]): boolean {\n if (left.length !== right.length) {\n return false\n }\n\n for (let index = 0; index < left.length; index += 1) {\n if (left[index]?.match !== right[index]?.match) {\n return false\n }\n }\n\n return true\n}\n",
|
|
24
|
+
"import type { CompilerService } from \"./compiler.js\"\nimport type { LayerService } from \"./layers.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { State } from \"./state.js\"\nimport { RESERVED_BINDING_FIELDS, RESERVED_COMMAND_FIELDS, RESERVED_LAYER_FIELDS } from \"../schema.js\"\nimport type {\n KeySequencePart,\n KeyToken,\n KeymapEvent,\n ResolvedKeyToken,\n ResolvedSequencePattern,\n SequencePattern,\n} from \"../types.js\"\nimport { createTextKeyMatch, normalizeBindingTokenName } from \"./keys.js\"\nimport { getErrorMessage } from \"./values.js\"\n\nconst NOOP = (): void => {}\n\ntype FieldKind = \"layer\" | \"binding\" | \"command\"\n\nfunction normalizePatternLimit(name: string, field: \"min\" | \"max\", value: unknown, fallback: number): number {\n if (value === undefined) {\n return fallback\n }\n\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw new Error(`Keymap sequence pattern \"${name}\" ${field} must be a non-negative integer`)\n }\n\n return value\n}\n\nfunction registerFieldCompilers<T>(\n fields: Record<string, T>,\n options: {\n kind: FieldKind\n reservedFields: ReadonlySet<string>\n registeredFields: Map<string, T>\n emitError(code: string, error: unknown, message: string): void\n },\n): () => void {\n const { kind, reservedFields, registeredFields, emitError } = options\n const entries = Object.entries(fields)\n const registered: Array<[string, T]> = []\n\n for (const [name, compiler] of entries) {\n if (reservedFields.has(name)) {\n emitError(`reserved-${kind}-field`, { field: name, kind }, `Keymap ${kind} field \"${name}\" is reserved`)\n continue\n }\n\n if (registeredFields.has(name)) {\n emitError(\n `duplicate-${kind}-field`,\n { field: name, kind },\n `Keymap ${kind} field \"${name}\" is already registered`,\n )\n continue\n }\n\n registeredFields.set(name, compiler)\n registered.push([name, compiler])\n }\n\n return () => {\n for (const [name, compiler] of registered) {\n const current = registeredFields.get(name)\n if (current === compiler) {\n registeredFields.delete(name)\n }\n }\n }\n}\n\nexport function registerToken<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n compiler: CompilerService<TTarget, TEvent>,\n layers: LayerService<TTarget, TEvent>,\n token: KeyToken,\n): () => void {\n let normalizedToken: string\n\n try {\n normalizedToken = normalizeBindingTokenName(token.name)\n } catch (error) {\n notify.emitError(\"token-name-normalize-error\", error, getErrorMessage(error, \"Failed to register keymap token\"))\n return NOOP\n }\n\n if (state.tokens.has(normalizedToken) || state.patterns.has(normalizedToken)) {\n notify.emitError(\n \"duplicate-token\",\n { token: normalizedToken },\n `Keymap token \"${normalizedToken}\" is already registered`,\n )\n return NOOP\n }\n\n let parsedToken: KeySequencePart\n\n try {\n parsedToken = compiler.parseTokenKey(token.key)\n if (parsedToken.patternName) {\n throw new Error(`Invalid key \"${String(token.key)}\": expected a concrete key stroke`)\n }\n } catch (error) {\n notify.emitError(\n \"token-parse-error\",\n error,\n getErrorMessage(error, `Failed to register keymap token \"${normalizedToken}\"`),\n )\n return NOOP\n }\n\n const registeredToken: ResolvedKeyToken = {\n stroke: parsedToken.stroke,\n match: parsedToken.match,\n }\n const nextTokens = new Map(state.tokens)\n nextTokens.set(normalizedToken, registeredToken)\n\n try {\n layers.applyTokenState(nextTokens)\n } catch (error) {\n notify.emitError(\n \"token-register-error\",\n error,\n getErrorMessage(error, `Failed to register keymap token \"${normalizedToken}\"`),\n )\n return NOOP\n }\n\n return () => {\n const current = state.tokens.get(normalizedToken)\n if (current !== registeredToken) {\n return\n }\n\n const nextTokens = new Map(state.tokens)\n nextTokens.delete(normalizedToken)\n\n try {\n layers.applyTokenState(nextTokens)\n } catch (error) {\n notify.emitError(\n \"token-unregister-error\",\n error,\n getErrorMessage(error, `Failed to unregister keymap token \"${normalizedToken}\"`),\n )\n }\n }\n}\n\nexport function registerSequencePattern<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n layers: LayerService<TTarget, TEvent>,\n pattern: SequencePattern<TEvent>,\n): () => void {\n let normalizedName: string\n let resolvedPattern: ResolvedSequencePattern<TEvent>\n\n try {\n normalizedName = normalizeBindingTokenName(pattern.name)\n const min = normalizePatternLimit(normalizedName, \"min\", pattern.min, 1)\n const max = normalizePatternLimit(normalizedName, \"max\", pattern.max, Number.MAX_SAFE_INTEGER)\n if (max < min) {\n throw new Error(`Keymap sequence pattern \"${normalizedName}\" max must be greater than or equal to min`)\n }\n\n resolvedPattern = {\n name: normalizedName,\n display: pattern.display,\n payloadKey: pattern.payloadKey ?? normalizedName,\n match: createTextKeyMatch(`pattern:${normalizedName}`),\n min,\n max,\n matcher: (event) => pattern.match(event),\n finalize: pattern.finalize,\n }\n } catch (error) {\n notify.emitError(\n \"sequence-pattern-register-error\",\n error,\n getErrorMessage(error, \"Failed to register keymap sequence pattern\"),\n )\n return NOOP\n }\n\n if (state.tokens.has(normalizedName) || state.patterns.has(normalizedName)) {\n notify.emitError(\n \"duplicate-sequence-pattern\",\n { pattern: normalizedName },\n `Keymap sequence pattern \"${normalizedName}\" is already registered`,\n )\n return NOOP\n }\n\n state.patterns.set(normalizedName, resolvedPattern)\n layers.recompileBindings()\n\n return () => {\n const current = state.patterns.get(normalizedName)\n if (current !== resolvedPattern) {\n return\n }\n\n state.patterns.delete(normalizedName)\n layers.recompileBindings()\n }\n}\n\nexport function registerFields<TTarget extends object, TEvent extends KeymapEvent, T>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n kind: FieldKind,\n fields: Record<string, T>,\n): () => void {\n const reservedFields =\n kind === \"layer\" ? RESERVED_LAYER_FIELDS : kind === \"binding\" ? RESERVED_BINDING_FIELDS : RESERVED_COMMAND_FIELDS\n const registeredFields =\n kind === \"layer\" ? state.layerFields : kind === \"binding\" ? state.bindingFields : state.commandFields\n\n return registerFieldCompilers(fields, {\n kind,\n reservedFields,\n registeredFields: registeredFields as Map<string, T>,\n emitError: (code, error, message) => notify.emitError(code, error, message),\n })\n}\n",
|
|
25
|
+
"import type { CompilerService } from \"./compiler.js\"\nimport type { CommandCatalogService } from \"./command-catalog.js\"\nimport type { ConditionService } from \"./conditions.js\"\nimport type { ActivationService } from \"./activation.js\"\nimport type {\n Attributes,\n Binding,\n BindingState,\n BindingCompilationResult,\n Command,\n EventData,\n KeymapEvent,\n KeymapHost,\n Layer,\n ResolvedKeyToken,\n CommandState,\n RegisteredLayer,\n RuntimeMatchable,\n RuntimeMatcher,\n TargetMode,\n} from \"../types.js\"\nimport { RESERVED_LAYER_FIELDS } from \"../schema.js\"\nimport type { State } from \"./state.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport { snapshotBindings, validateBindings } from \"./primitives/bindings.js\"\nimport { createFieldCompilerContext } from \"./primitives/field-invariants.js\"\nimport { buildSequenceTree } from \"./sequence-index.js\"\nimport { getErrorMessage, snapshotDataValue } from \"./values.js\"\n\nconst NOOP = (): void => {}\n\nfunction compareLayers<TTarget extends object, TEvent extends KeymapEvent>(\n left: RegisteredLayer<TTarget, TEvent>,\n right: RegisteredLayer<TTarget, TEvent>,\n): number {\n const priorityDiff = right.priority - left.priority\n return priorityDiff || right.order - left.order\n}\n\nfunction layerBlocksActiveKeyCache<TTarget extends object, TEvent extends KeymapEvent>(\n layer: RegisteredLayer<TTarget, TEvent>,\n): boolean {\n if (layer.matchers.length > 0) return true\n for (const command of layer.commands) if (command.matchers.length > 0) return true\n for (const binding of layer.bindings) if (binding.matchers.length > 0) return true\n return false\n}\n\nfunction layerBlocksActiveCommandViewCache<TTarget extends object, TEvent extends KeymapEvent>(\n layer: RegisteredLayer<TTarget, TEvent>,\n): boolean {\n if (layer.commands.length === 0) return false\n if (layer.matchers.length > 0) return true\n for (const command of layer.commands) if (command.matchers.length > 0) return true\n return false\n}\n\ninterface CompileLayerRuntimeStateResult {\n requires: readonly [name: string, value: unknown][]\n matchers: readonly RuntimeMatcher[]\n fields?: Readonly<Record<string, unknown>>\n attrs?: Readonly<Attributes>\n}\n\ninterface LayersOptions<TTarget extends object, TEvent extends KeymapEvent> {\n compiler: CompilerService<TTarget, TEvent>\n commands: CommandCatalogService<TTarget, TEvent>\n host: KeymapHost<TTarget, TEvent>\n diagnostics?: LayerDiagnostics<TTarget, TEvent>\n warnUnknownField: (kind: \"binding\" | \"layer\", fieldName: string) => void\n}\n\nexport interface AnalyzeLayerOptions<TTarget extends object, TEvent extends KeymapEvent> {\n target?: TTarget\n order: number\n commands: readonly CommandState<TTarget, TEvent>[]\n sourceBindings: readonly Binding<TTarget, TEvent>[]\n bindings: readonly BindingState<TTarget, TEvent>[]\n hasTokenBindings: boolean\n}\n\nexport interface LayerDiagnostics<TTarget extends object, TEvent extends KeymapEvent> {\n analyzeLayer(options: AnalyzeLayerOptions<TTarget, TEvent>): void\n}\n\nexport interface LayerService<TTarget extends object, TEvent extends KeymapEvent> {\n registerLayer(layer: Layer<TTarget, TEvent>): () => void\n applyTokenState(nextTokens: Map<string, ResolvedKeyToken>): void\n recompileBindings(): void\n cleanup(): void\n}\n\nexport function createLayerService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n conditions: ConditionService<TTarget, TEvent>,\n activation: ActivationService<TTarget, TEvent>,\n options: LayersOptions<TTarget, TEvent>,\n): LayerService<TTarget, TEvent> {\n const registerLayer = (layer: Layer<TTarget, TEvent>): (() => void) => {\n return notify.runWithStateChangeBatch(() => {\n const target = layer.target\n if (target && options.host.isTargetDestroyed(target)) {\n notify.emitError(\n \"destroyed-layer-target\",\n { target },\n \"Cannot register a keymap layer for a destroyed keymap target\",\n )\n return NOOP\n }\n\n let sourceBindings: Binding<TTarget, TEvent>[]\n let requires: readonly [name: string, value: unknown][]\n let matchers: readonly RuntimeMatcher[]\n let fields: Readonly<Record<string, unknown>> | undefined\n let attrs: Readonly<Attributes> | undefined\n let commands: readonly CommandState<TTarget, TEvent>[]\n let targetMode: TargetMode | undefined\n\n try {\n targetMode = normalizeTargetMode(layer)\n sourceBindings = applyLayerBindingsTransformers(snapshotBindings(layer.bindings ?? []), layer)\n const sourceCommands = applyCommandTransformers(layer.commands ?? [], layer)\n commands = sourceCommands.length === 0 ? [] : options.commands.normalizeCommands(sourceCommands)\n ;({ requires, matchers, fields, attrs } = compileLayerRuntimeState(layer))\n } catch (error) {\n notify.emitError(\"register-layer-failed\", error, getErrorMessage(error, \"Failed to register keymap layer\"))\n return NOOP\n }\n\n const order = state.order++\n const bindingStates = options.compiler.compileBindings(sourceBindings, state.tokens, target, order, fields)\n\n if (bindingStates.bindings.length === 0 && !bindingStates.hasTokenBindings && commands.length === 0) {\n return NOOP\n }\n\n options.diagnostics?.analyzeLayer({\n target,\n order,\n commands,\n sourceBindings,\n bindings: bindingStates.bindings,\n hasTokenBindings: bindingStates.hasTokenBindings,\n })\n\n const registeredLayer: RegisteredLayer<TTarget, TEvent> = {\n order,\n target,\n targetMode,\n priority: layer.priority ?? 0,\n requires,\n matchers,\n fields,\n attrs,\n commands,\n sourceBindings,\n bindings: bindingStates.bindings,\n root: buildSequenceTree(bindingStates.bindings, state.patterns),\n hasTokenBindings: bindingStates.hasTokenBindings,\n activeKeyCacheBlocked: false,\n activeCommandViewCacheBlocked: false,\n }\n\n updateCacheBlockers(registeredLayer)\n\n state.layers.add(registeredLayer)\n state.sortedLayers = [...state.sortedLayers, registeredLayer].sort(compareLayers)\n attachReactiveMatchers(registeredLayer)\n for (const command of registeredLayer.commands) {\n attachReactiveMatchers(command)\n }\n for (const binding of registeredLayer.bindings) {\n attachReactiveMatchers(binding)\n }\n\n if (target) {\n const onTargetDestroy = () => {\n unregisterLayer(registeredLayer)\n }\n\n registeredLayer.offTargetDestroy = options.host.onTargetDestroy(target, onTargetDestroy)\n }\n\n if (registeredLayer.commands.length > 0) {\n activation.ensureValidPendingSequence()\n }\n\n notify.queueStateChange()\n\n return () => {\n unregisterLayer(registeredLayer)\n }\n })\n }\n\n const applyTokenState = (nextTokens: Map<string, ResolvedKeyToken>): void => {\n notify.runWithStateChangeBatch(() => {\n const nextCompilations = new Map<RegisteredLayer<TTarget, TEvent>, BindingCompilationResult<TTarget, TEvent>>()\n\n for (const layer of state.layers) {\n if (!layer.hasTokenBindings) {\n continue\n }\n\n nextCompilations.set(layer, compileLayerBindings(layer, nextTokens))\n }\n\n state.tokens = nextTokens\n\n let shouldClearPending = false\n for (const [layer, compilation] of nextCompilations) {\n if (applyBindingStates(layer, compilation)) {\n shouldClearPending = true\n }\n }\n\n if (shouldClearPending) {\n activation.setPendingSequence(null)\n }\n\n if (nextCompilations.size > 0) {\n notify.queueStateChange()\n }\n })\n }\n\n const recompileBindings = (): void => {\n notify.runWithStateChangeBatch(() => {\n let recompiledLayers = 0\n let shouldClearPending = false\n\n for (const layer of state.layers) {\n if (layer.sourceBindings.length === 0) {\n continue\n }\n\n const compilation = compileLayerBindings(layer, state.tokens)\n\n if (applyBindingStates(layer, compilation)) {\n shouldClearPending = true\n }\n\n recompiledLayers += 1\n }\n\n if (shouldClearPending) {\n activation.setPendingSequence(null)\n }\n\n if (recompiledLayers > 0) {\n notify.queueStateChange()\n }\n })\n }\n\n const cleanup = (): void => {\n for (const layer of state.layers) {\n detachReactiveMatchers(layer)\n for (const command of layer.commands) {\n detachReactiveMatchers(command)\n }\n for (const binding of layer.bindings) {\n detachReactiveMatchers(binding)\n }\n\n layer.offTargetDestroy?.()\n layer.offTargetDestroy = undefined\n }\n }\n\n const normalizeTargetMode = (layer: Layer<TTarget, TEvent>): TargetMode | undefined => {\n if (layer.targetMode) {\n if (!layer.target) {\n throw new Error(`Keymap targetMode \"${layer.targetMode}\" requires a target`)\n }\n\n return layer.targetMode\n }\n\n return layer.target ? \"focus-within\" : undefined\n }\n\n const applyLayerBindingsTransformers = (\n bindings: Binding<TTarget, TEvent>[],\n layer: Layer<TTarget, TEvent>,\n ): Binding<TTarget, TEvent>[] => {\n const transformers = state.layerBindingsTransformers.values()\n if (transformers.length === 0) {\n return bindings\n }\n\n let current = bindings\n\n for (const transformer of transformers) {\n const next = transformer(current, {\n layer,\n validateBindings: (bindings) => validateBindings(bindings),\n })\n if (!next) {\n continue\n }\n\n current = snapshotBindings(next)\n }\n\n return current\n }\n\n const applyCommandTransformers = (\n commands: readonly Command<TTarget, TEvent>[],\n layer: Layer<TTarget, TEvent>,\n ): readonly Command<TTarget, TEvent>[] => {\n const transformers = state.commandTransformers.values()\n if (commands.length === 0 || transformers.length === 0) {\n return commands\n }\n\n const transformedCommands: Command<TTarget, TEvent>[] = []\n\n for (const command of commands) {\n const transformedCommand = { ...command }\n const extraCommands: Command<TTarget, TEvent>[] = []\n let keepOriginal = true\n\n for (const transformer of transformers) {\n try {\n transformer(transformedCommand, {\n layer,\n add(nextCommand) {\n extraCommands.push({ ...nextCommand })\n },\n skipOriginal() {\n keepOriginal = false\n },\n })\n } catch (error) {\n notify.emitError(\"command-transformer-error\", error, \"[Keymap] Error in command transformer:\")\n }\n }\n\n if (keepOriginal) {\n transformedCommands.push(transformedCommand)\n }\n transformedCommands.push(...extraCommands)\n }\n\n return transformedCommands\n }\n\n const compileLayerRuntimeState = (layer: Layer<TTarget, TEvent>): CompileLayerRuntimeStateResult => {\n const mergedRequires: EventData = {}\n const matchers: RuntimeMatcher[] = []\n const fields: Record<string, unknown> = Object.create(null)\n const attrs: Attributes = {}\n\n for (const [fieldName, value] of Object.entries(layer)) {\n if (RESERVED_LAYER_FIELDS.has(fieldName)) {\n continue\n }\n\n if (value === undefined) {\n continue\n }\n\n fields[fieldName] = snapshotDataValue(value)\n\n const compiler = state.layerFields.get(fieldName)\n if (!compiler) {\n options.warnUnknownField(\"layer\", fieldName)\n continue\n }\n\n compiler(\n value,\n createFieldCompilerContext({\n fieldName,\n conditions: conditions,\n requirements: mergedRequires,\n matchers,\n attrs,\n }),\n )\n }\n\n return {\n requires: Object.entries(mergedRequires),\n matchers,\n fields: Object.keys(fields).length > 0 ? Object.freeze(fields) : undefined,\n attrs:\n Object.keys(attrs).length > 0\n ? (snapshotDataValue(attrs, { freeze: true }) as Readonly<Attributes>)\n : undefined,\n }\n }\n\n const compileLayerBindings = (\n layer: RegisteredLayer<TTarget, TEvent>,\n tokens: ReadonlyMap<string, ResolvedKeyToken>,\n ): BindingCompilationResult<TTarget, TEvent> => {\n return options.compiler.compileBindings(layer.sourceBindings, tokens, layer.target, layer.order, layer.fields)\n }\n\n const applyBindingStates = (\n layer: RegisteredLayer<TTarget, TEvent>,\n compilation: BindingCompilationResult<TTarget, TEvent>,\n ): boolean => {\n options.diagnostics?.analyzeLayer({\n target: layer.target,\n order: layer.order,\n commands: layer.commands,\n sourceBindings: layer.sourceBindings,\n bindings: compilation.bindings,\n hasTokenBindings: compilation.hasTokenBindings,\n })\n\n untrackCacheBlockers(layer)\n for (const binding of layer.bindings) {\n detachReactiveMatchers(binding)\n }\n\n layer.bindings = compilation.bindings\n layer.root = buildSequenceTree(compilation.bindings, state.patterns)\n layer.hasTokenBindings = compilation.hasTokenBindings\n updateCacheBlockers(layer)\n\n for (const binding of layer.bindings) {\n attachReactiveMatchers(binding)\n }\n\n return state.pending?.captures.some((capture) => capture.layer === layer) ?? false\n }\n\n const unregisterLayer = (layer: RegisteredLayer<TTarget, TEvent>): void => {\n notify.runWithStateChangeBatch(() => {\n if (!state.layers.delete(layer)) {\n return\n }\n\n state.sortedLayers = state.sortedLayers.filter((candidate) => candidate !== layer)\n untrackCacheBlockers(layer)\n\n detachReactiveMatchers(layer)\n for (const command of layer.commands) {\n detachReactiveMatchers(command)\n }\n for (const binding of layer.bindings) {\n detachReactiveMatchers(binding)\n }\n\n layer.offTargetDestroy?.()\n layer.offTargetDestroy = undefined\n\n if (state.pending?.captures.some((capture) => capture.layer === layer)) {\n activation.setPendingSequence(null)\n } else if (layer.commands.length > 0 && !options.host.isDestroyed) {\n activation.ensureValidPendingSequence()\n }\n\n notify.queueStateChange()\n })\n }\n\n const attachReactiveMatchers = (target: RuntimeMatchable): void => {\n for (const matcher of target.matchers) {\n if (!matcher.subscribe) {\n continue\n }\n\n try {\n matcher.dispose = matcher.subscribe(() => {\n if (!activation.hasPendingSequenceState()) {\n notify.queueStateChange()\n return\n }\n\n notify.runWithStateChangeBatch(() => {\n activation.revalidatePendingSequenceIfNeeded()\n notify.queueStateChange()\n })\n })\n } catch (error) {\n notify.emitError(\n \"reactive-matcher-subscribe-error\",\n error,\n getErrorMessage(error, `Failed to subscribe to reactive matcher from ${matcher.source}`),\n )\n }\n }\n }\n\n const updateCacheBlockers = (layer: RegisteredLayer<TTarget, TEvent>): void => {\n const activeKeyBlocked = layerBlocksActiveKeyCache(layer)\n const activeCommandViewBlocked = layerBlocksActiveCommandViewCache(layer)\n\n layer.activeKeyCacheBlocked = activeKeyBlocked\n layer.activeCommandViewCacheBlocked = activeCommandViewBlocked\n if (activeKeyBlocked) state.activeKeyCacheBlockers += 1\n if (activeCommandViewBlocked) state.activeCommandViewCacheBlockers += 1\n }\n\n const untrackCacheBlockers = (layer: RegisteredLayer<TTarget, TEvent>): void => {\n if (layer.activeKeyCacheBlocked) {\n state.activeKeyCacheBlockers -= 1\n layer.activeKeyCacheBlocked = false\n }\n\n if (layer.activeCommandViewCacheBlocked) {\n state.activeCommandViewCacheBlockers -= 1\n layer.activeCommandViewCacheBlocked = false\n }\n }\n\n const detachReactiveMatchers = (target: RuntimeMatchable): void => {\n for (const matcher of target.matchers) {\n if (!matcher.dispose) {\n continue\n }\n\n try {\n matcher.dispose()\n } catch (error) {\n notify.emitError(\n \"reactive-matcher-dispose-error\",\n error,\n getErrorMessage(error, `Failed to dispose reactive matcher from ${matcher.source}`),\n )\n }\n\n matcher.dispose = undefined\n }\n }\n\n return { registerLayer, applyTokenState, recompileBindings, cleanup }\n}\n",
|
|
26
|
+
"import type { Events, HookName, Hooks, KeymapEvent } from \"../types.js\"\nimport type { RuntimeEmitter } from \"../lib/runtime-utils.js\"\nimport type { State } from \"./state.js\"\n\ntype DiagnosticEvents<TTarget extends object, TEvent extends KeymapEvent> = Pick<\n Events<TTarget, TEvent>,\n \"warning\" | \"error\"\n>\n\nexport const MAX_STATE_CHANGE_FLUSH_ITERATIONS = 1000\n\nexport interface NotificationService<TTarget extends object, TEvent extends KeymapEvent> {\n runWithStateChangeBatch<T>(fn: () => T): T\n queueStateChange(options?: { invalidateCaches?: boolean }): void\n emitWarning(code: string, warning: unknown, message: string): void\n emitError(code: string, error: unknown, message: string): void\n reportListenerError(name: HookName, error: unknown): void\n warnOnce(key: string, code: string, warning: unknown, message: string): void\n}\n\nexport function createNotificationService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n events: RuntimeEmitter<DiagnosticEvents<TTarget, TEvent>>,\n hooks: RuntimeEmitter<Hooks<TTarget, TEvent>>,\n): NotificationService<TTarget, TEvent> {\n const emitWarning = (code: string, warning: unknown, message: string): void => {\n if (!events.has(\"warning\")) {\n const consoleMessage = `[${code}] ${message}`\n if (warning instanceof Error) {\n console.warn(consoleMessage, warning)\n } else {\n console.warn(consoleMessage)\n }\n\n return\n }\n\n events.emit(\"warning\", { code, message, warning })\n }\n\n const emitError = (code: string, error: unknown, message: string): void => {\n if (!events.has(\"error\")) {\n const consoleMessage = `[${code}] ${message}`\n if (error instanceof Error) {\n console.error(consoleMessage, error)\n } else {\n console.error(consoleMessage)\n }\n\n return\n }\n\n events.emit(\"error\", { code, message, error })\n }\n\n const flushStateChange = (): void => {\n if (!state.stateChangePending || state.stateChangeDepth > 0 || state.flushingStateChange) {\n return\n }\n\n state.flushingStateChange = true\n\n try {\n let iterations = 0\n\n while (state.stateChangePending && state.stateChangeDepth === 0) {\n if (iterations >= MAX_STATE_CHANGE_FLUSH_ITERATIONS) {\n state.stateChangePending = false\n emitError(\n \"state-change-feedback-loop\",\n { iterations: MAX_STATE_CHANGE_FLUSH_ITERATIONS },\n `[Keymap] Possible infinite state listener feedback loop detected after ${MAX_STATE_CHANGE_FLUSH_ITERATIONS} iterations; pending state notifications were dropped`,\n )\n break\n }\n\n iterations += 1\n state.stateChangePending = false\n hooks.emit(\"state\")\n }\n } finally {\n state.flushingStateChange = false\n }\n }\n\n return {\n runWithStateChangeBatch(fn) {\n state.stateChangeDepth += 1\n\n try {\n return fn()\n } finally {\n state.stateChangeDepth -= 1\n if (state.stateChangeDepth === 0) {\n flushStateChange()\n }\n }\n },\n queueStateChange(options) {\n state.derivedVersion += 1\n if (options?.invalidateCaches !== false) {\n state.cacheVersion += 1\n }\n\n if (!hooks.has(\"state\")) {\n return\n }\n\n state.stateChangePending = true\n if (state.stateChangeDepth === 0 && !state.flushingStateChange) {\n flushStateChange()\n }\n },\n emitWarning,\n emitError,\n reportListenerError(name, error) {\n if (name === \"state\") {\n emitError(\"state-listener-error\", error, \"[Keymap] Error in state listener:\")\n return\n }\n\n if (name === \"pendingSequence\") {\n emitError(\"pending-sequence-listener-error\", error, \"[Keymap] Error in pending sequence listener:\")\n return\n }\n\n if (name === \"dispatch\") {\n emitError(\"dispatch-listener-error\", error, \"[Keymap] Error in dispatch listener:\")\n }\n },\n warnOnce(key, code, warning, message) {\n if (state.usedWarningKeys.has(key)) {\n return\n }\n\n state.usedWarningKeys.add(key)\n emitWarning(code, warning, message)\n },\n }\n}\n",
|
|
27
|
+
"import type { EventData, KeymapEvent } from \"../types.js\"\nimport type { ActivationService } from \"./activation.js\"\nimport type { NotificationService } from \"./notify.js\"\nimport type { State } from \"./state.js\"\n\nexport interface RuntimeService<TTarget extends object, TEvent extends KeymapEvent> {\n getData(name: string): unknown\n setData(name: string, value: unknown): void\n getReadonlyData(): Readonly<EventData>\n}\n\nexport function createRuntimeService<TTarget extends object, TEvent extends KeymapEvent>(\n state: State<TTarget, TEvent>,\n notify: NotificationService<TTarget, TEvent>,\n activation: ActivationService<TTarget, TEvent>,\n): RuntimeService<TTarget, TEvent> {\n return {\n getData(name) {\n return state.data[name]\n },\n setData(name, value) {\n notify.runWithStateChangeBatch(() => {\n if (value === undefined) {\n if (!(name in state.data)) {\n return\n }\n\n delete state.data[name]\n state.dataVersion += 1\n activation.ensureValidPendingSequence()\n notify.queueStateChange()\n return\n }\n\n if (Object.is(state.data[name], value)) {\n return\n }\n\n state.data[name] = value\n state.dataVersion += 1\n activation.ensureValidPendingSequence()\n notify.queueStateChange()\n })\n },\n getReadonlyData() {\n if (state.readonlyDataVersion === state.dataVersion) {\n return state.readonlyData\n }\n\n state.readonlyData = Object.freeze({ ...state.data })\n state.readonlyDataVersion = state.dataVersion\n return state.readonlyData\n },\n }\n}\n",
|
|
28
|
+
"import type {\n Attributes,\n BindingExpander,\n BindingFieldCompiler,\n LayerBindingsTransformer,\n BindingParser,\n BindingTransformer,\n Command,\n CommandFieldCompiler,\n CommandTransformer,\n CommandResolver,\n EventData,\n KeyDisambiguationResolver,\n EventMatchResolver,\n Hooks,\n KeyAfterInputContext,\n KeyInputContext,\n KeymapEvent,\n LayerFieldCompiler,\n PendingSequenceState,\n RawInputContext,\n ResolvedSequencePattern,\n CommandState,\n RegisteredLayer,\n} from \"../types.js\"\nimport {\n createRuntimeOrderedRegistry,\n createRuntimePriorityRegistry,\n type RuntimeOrderedRegistry,\n type RuntimePriorityRegistry,\n} from \"../lib/runtime-utils.js\"\n\nconst EMPTY_DATA: Readonly<EventData> = Object.freeze({})\n\nexport interface LayerCommandEntry<TTarget extends object, TEvent extends KeymapEvent> {\n layer: RegisteredLayer<TTarget, TEvent>\n commandState: CommandState<TTarget, TEvent>\n}\n\nexport interface ResolvedCommandEntry<TTarget extends object, TEvent extends KeymapEvent> {\n target?: TTarget\n command: Command<TTarget, TEvent>\n attrs?: Readonly<Attributes>\n input?: string\n payload?: unknown\n}\n\nexport interface ActiveCommandView<TTarget extends object, TEvent extends KeymapEvent> {\n layers: readonly RegisteredLayer<TTarget, TEvent>[]\n entries: readonly LayerCommandEntry<TTarget, TEvent>[]\n reachable: readonly LayerCommandEntry<TTarget, TEvent>[]\n reachableByName: ReadonlyMap<string, LayerCommandEntry<TTarget, TEvent>>\n chainsByName: ReadonlyMap<string, readonly LayerCommandEntry<TTarget, TEvent>[]>\n}\n\nexport interface CommandView<TTarget extends object, TEvent extends KeymapEvent> {\n entries: readonly LayerCommandEntry<TTarget, TEvent>[]\n chainsByName: ReadonlyMap<string, readonly LayerCommandEntry<TTarget, TEvent>[]>\n}\n\nexport interface State<TTarget extends object, TEvent extends KeymapEvent> {\n order: number\n tokens: Map<string, import(\"../types.js\").ResolvedKeyToken>\n patterns: Map<string, ResolvedSequencePattern<TEvent>>\n layerFields: Map<string, LayerFieldCompiler>\n layerBindingsTransformers: RuntimeOrderedRegistry<LayerBindingsTransformer<TTarget, TEvent>>\n bindingExpanders: RuntimeOrderedRegistry<BindingExpander>\n bindingParsers: RuntimeOrderedRegistry<BindingParser>\n bindingTransformers: RuntimeOrderedRegistry<BindingTransformer<TTarget, TEvent>>\n bindingFields: Map<string, BindingFieldCompiler>\n commandTransformers: RuntimeOrderedRegistry<CommandTransformer<TTarget, TEvent>>\n commandFields: Map<string, CommandFieldCompiler>\n eventMatchResolvers: RuntimeOrderedRegistry<EventMatchResolver<TEvent>>\n disambiguationResolvers: RuntimeOrderedRegistry<KeyDisambiguationResolver<TTarget, TEvent>>\n keyHooks: RuntimePriorityRegistry<(ctx: KeyInputContext<TEvent>) => void, { priority: number; release: boolean }>\n keyAfterHooks: RuntimePriorityRegistry<\n (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n { priority: number; release: boolean }\n >\n rawHooks: RuntimePriorityRegistry<(ctx: RawInputContext) => void, { priority: number }>\n layers: Set<RegisteredLayer<TTarget, TEvent>>\n sortedLayers: RegisteredLayer<TTarget, TEvent>[]\n activeLayersCacheVersion: number\n activeLayersCacheFocused: TTarget | null | undefined\n activeLayersCache: RegisteredLayer<TTarget, TEvent>[]\n activeKeyCacheBlockers: number\n activeCommandViewCacheBlockers: number\n commandResolvers: RuntimeOrderedRegistry<CommandResolver<TTarget, TEvent>>\n pending: PendingSequenceState<TTarget, TEvent> | null\n data: EventData\n dataVersion: number\n readonlyDataVersion: number\n readonlyData: Readonly<EventData>\n cacheVersion: number\n derivedVersion: number\n stateChangeDepth: number\n stateChangePending: boolean\n flushingStateChange: boolean\n usedWarningKeys: Set<string>\n}\n\nexport function createKeymapState<TTarget extends object, TEvent extends KeymapEvent>(): State<TTarget, TEvent> {\n return {\n order: 0,\n tokens: new Map<string, import(\"../types.js\").ResolvedKeyToken>(),\n patterns: new Map<string, ResolvedSequencePattern<TEvent>>(),\n layerFields: new Map<string, LayerFieldCompiler>(),\n layerBindingsTransformers: createRuntimeOrderedRegistry<LayerBindingsTransformer<TTarget, TEvent>>(),\n bindingExpanders: createRuntimeOrderedRegistry<BindingExpander>(),\n bindingParsers: createRuntimeOrderedRegistry<BindingParser>(),\n bindingTransformers: createRuntimeOrderedRegistry<BindingTransformer<TTarget, TEvent>>(),\n bindingFields: new Map<string, BindingFieldCompiler>(),\n commandTransformers: createRuntimeOrderedRegistry<CommandTransformer<TTarget, TEvent>>(),\n commandFields: new Map<string, CommandFieldCompiler>(),\n eventMatchResolvers: createRuntimeOrderedRegistry<EventMatchResolver<TEvent>>(),\n disambiguationResolvers: createRuntimeOrderedRegistry<KeyDisambiguationResolver<TTarget, TEvent>>(),\n keyHooks: createRuntimePriorityRegistry<\n (ctx: KeyInputContext<TEvent>) => void,\n { priority: number; release: boolean }\n >(),\n keyAfterHooks: createRuntimePriorityRegistry<\n (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n { priority: number; release: boolean }\n >(),\n rawHooks: createRuntimePriorityRegistry<(ctx: RawInputContext) => void, { priority: number }>(),\n layers: new Set<RegisteredLayer<TTarget, TEvent>>(),\n sortedLayers: [],\n activeLayersCacheVersion: -1,\n activeLayersCacheFocused: undefined,\n activeLayersCache: [],\n activeKeyCacheBlockers: 0,\n activeCommandViewCacheBlockers: 0,\n commandResolvers: createRuntimeOrderedRegistry<CommandResolver<TTarget, TEvent>>(),\n pending: null,\n data: {},\n dataVersion: 0,\n readonlyDataVersion: -1,\n readonlyData: EMPTY_DATA,\n cacheVersion: 0,\n derivedVersion: 0,\n stateChangeDepth: 0,\n stateChangePending: false,\n flushingStateChange: false,\n usedWarningKeys: new Set<string>(),\n }\n}\n",
|
|
29
|
+
"import type {\n ActiveBinding,\n ActiveKey,\n ActiveKeyOptions,\n BindingExpander,\n BindingParser,\n BindingFieldCompiler,\n LayerBindingsTransformer,\n BindingTransformer,\n Events,\n Hooks,\n CommandFieldCompiler,\n CommandTransformer,\n CommandBindingsQuery,\n CommandEntry,\n CommandQuery,\n Command,\n KeymapEvent,\n KeymapHost,\n HostMetadata,\n LayerAnalyzer,\n Listener,\n RunCommandOptions,\n RunCommandResult,\n CommandResolver,\n KeyAfterInputContext,\n KeyInterceptOptions,\n KeyInputContext,\n Layer,\n LayerFieldCompiler,\n KeyDisambiguationResolver,\n RawInterceptOptions,\n RawInputContext,\n EventMatchResolver,\n KeyMatch,\n KeyStringifyInput,\n KeyToken,\n SequencePattern,\n KeyLike,\n KeySequencePart,\n StringifyOptions,\n} from \"./types.js\"\nimport { createLayerDiagnostics, type LayerDiagnosticsCore } from \"./services/layer-diagnostics.js\"\nimport { createActivationService, type ActivationService } from \"./services/activation.js\"\nimport { createCommandCatalogService, type CommandCatalogService } from \"./services/command-catalog.js\"\nimport { createCommandExecutorService, type CommandExecutorService } from \"./services/command-executor.js\"\nimport { createCompilerService, type CompilerService } from \"./services/compiler.js\"\nimport { createConditionService, type ConditionService } from \"./services/conditions.js\"\nimport { createDispatchService, type DispatchService } from \"./services/dispatch.js\"\nimport {\n registerFields,\n registerSequencePattern as registerEnvironmentSequencePattern,\n registerToken as registerEnvironmentToken,\n} from \"./services/environment.js\"\nimport { createLayerService, type LayerService } from \"./services/layers.js\"\nimport type { EmitterListener } from \"./lib/emitter.js\"\nimport { createRuntimeEmitter, type RuntimeEmitter } from \"./lib/runtime-utils.js\"\nimport { createNotificationService, type NotificationService } from \"./services/notify.js\"\nimport { resolveKeyMatch } from \"./services/keys.js\"\nimport { createRuntimeService, type RuntimeService } from \"./services/runtime.js\"\nimport { KEYMAP_EXTENSION_CONTEXT, type KeymapExtensionContext } from \"./services/extension-context.js\"\nimport { createKeymapState } from \"./services/state.js\"\n\ntype DiagnosticEvents<TTarget extends object, TEvent extends KeymapEvent> = Pick<\n Events<TTarget, TEvent>,\n \"warning\" | \"error\"\n>\n\nfunction getKeyMatchKey(input: KeyStringifyInput): KeyMatch {\n return resolveKeyMatch(input)\n}\n\nexport class Keymap<TTarget extends object, TEvent extends KeymapEvent = KeymapEvent> {\n #state = createKeymapState<TTarget, TEvent>()\n #cleanedUp = false\n #resources = new Map<symbol, { count: number; dispose: () => void }>()\n #cleanupListeners: Array<() => void> = []\n // Reuse `Emitter`, but keep its `onError` hook as a no-op so throwing error\n // listeners cannot re-enter `emitError` and loop forever.\n #events = createRuntimeEmitter<DiagnosticEvents<TTarget, TEvent>>(() => {})\n #hooks: RuntimeEmitter<Hooks<TTarget, TEvent>>\n #notify: NotificationService<TTarget, TEvent>\n #activation: ActivationService<TTarget, TEvent>\n #runtime: RuntimeService<TTarget, TEvent>\n #conditions: ConditionService<TTarget, TEvent>\n #catalog: CommandCatalogService<TTarget, TEvent>\n #executor: CommandExecutorService<TTarget, TEvent>\n #compiler: CompilerService<TTarget, TEvent>\n #dispatch: DispatchService<TTarget, TEvent>\n #layers: LayerService<TTarget, TEvent>\n #layerDiagnostics: LayerDiagnosticsCore<TTarget, TEvent>\n\n #keypressListener: (event: TEvent) => void\n #keyreleaseListener: (event: TEvent) => void\n #rawListener: (sequence: string) => boolean\n #focusedTargetListener: (focused: TTarget | null) => void\n\n #host: KeymapHost<TTarget, TEvent>\n\n public getPendingSequence: () => readonly KeySequencePart[]\n public getActiveKeys: (options?: ActiveKeyOptions) => readonly ActiveKey<TTarget, TEvent>[]\n\n constructor(host: KeymapHost<TTarget, TEvent>) {\n this.#host = host\n if (host.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed host\")\n }\n\n this.#hooks = createRuntimeEmitter<Hooks<TTarget, TEvent>>((name, error) => {\n this.#notify.reportListenerError(name, error)\n })\n this.#notify = createNotificationService(this.#state, this.#events, this.#hooks)\n this.#conditions = createConditionService(this.#state, this.#notify)\n this.#catalog = createCommandCatalogService(this.#state, this.#host, this.#notify, this.#conditions, {\n onCommandResolversChanged: () => {\n this.#activation.ensureValidPendingSequence()\n },\n })\n this.#activation = createActivationService(\n this.#state,\n this.#host,\n this.#hooks,\n this.#notify,\n this.#conditions,\n this.#catalog,\n {\n onPendingSequenceChanged: (previous, next) => {\n this.#dispatch?.handlePendingSequenceChange(previous, next)\n },\n },\n )\n this.#runtime = createRuntimeService(this.#state, this.#notify, this.#activation)\n this.#executor = createCommandExecutorService(this.#notify, this.#runtime, this.#activation, this.#catalog, {\n keymap: this,\n createCommandEvent: () => this.#host.createCommandEvent(),\n })\n this.#compiler = createCompilerService(this.#state, this.#notify, this.#conditions, {\n warnUnknownField: (kind, fieldName) => {\n this.#warnUnknownField(kind, fieldName)\n },\n warnUnknownToken: (token, sequence) => {\n this.#warnUnknownToken(token, sequence)\n },\n })\n this.#layerDiagnostics = createLayerDiagnostics(this.#notify, this.#catalog)\n this.#layers = createLayerService(this.#state, this.#notify, this.#conditions, this.#activation, {\n compiler: this.#compiler,\n commands: this.#catalog,\n host: this.#host,\n diagnostics: this.#layerDiagnostics,\n warnUnknownField: (kind, fieldName) => {\n this.#warnUnknownField(kind, fieldName)\n },\n })\n this.#dispatch = createDispatchService(\n this.#state,\n this.#notify,\n this.#runtime,\n this.#activation,\n this.#conditions,\n this.#executor,\n this.#compiler,\n this.#catalog,\n this.#layers,\n this.#hooks,\n )\n this.getPendingSequence = this.#activation.getPendingSequence\n this.getActiveKeys = this.#activation.getActiveKeys\n this.#keypressListener = (event) => {\n this.#dispatch.handleKeyEvent(event, false)\n }\n this.#keyreleaseListener = (event) => {\n this.#dispatch.handleKeyEvent(event, true)\n }\n this.#rawListener = (sequence) => {\n return this.#dispatch.handleRawSequence(sequence)\n }\n this.#focusedTargetListener = (focused) => {\n this.#handleFocusedTargetChange(focused)\n }\n\n this.#cleanupListeners.push(this.#host.onKeyPress(this.#keypressListener))\n this.#cleanupListeners.push(this.#host.onKeyRelease(this.#keyreleaseListener))\n if (this.#host.onRawInput) {\n this.#cleanupListeners.push(this.#host.onRawInput(this.#rawListener))\n }\n this.#cleanupListeners.push(this.#host.onFocusChange(this.#focusedTargetListener))\n if (this.#host.onDestroy) {\n this.#cleanupListeners.push(\n this.#host.onDestroy(() => {\n this.#cleanup()\n }),\n )\n }\n }\n\n public [KEYMAP_EXTENSION_CONTEXT](): KeymapExtensionContext<TTarget, TEvent> {\n return {\n state: this.#state,\n host: this.#host,\n conditions: this.#conditions,\n catalog: this.#catalog,\n activation: this.#activation,\n }\n }\n\n #cleanup(): void {\n if (this.#cleanedUp) {\n return\n }\n\n this.#cleanedUp = true\n\n this.#activation.setPendingSequence(null)\n\n for (const resource of this.#resources.values()) {\n resource.dispose()\n }\n this.#resources.clear()\n\n this.#layers.cleanup()\n\n for (const cleanupListener of this.#cleanupListeners.splice(0)) {\n cleanupListener()\n }\n }\n\n public setData(name: string, value: unknown): void {\n this.#runtime.setData(name, value)\n }\n\n public getData(name: string): unknown {\n return this.#runtime.getData(name)\n }\n\n public getHostMetadata(): Readonly<HostMetadata> {\n return this.#host.metadata\n }\n\n public hasPendingSequence(): boolean {\n return this.#activation.ensureValidPendingSequence() !== undefined\n }\n\n public createKeyMatcher(key: KeyLike): (input: KeyStringifyInput | null | undefined) => boolean {\n const match = this.#compiler.parseTokenKey(key).match\n\n return (input) => {\n if (!input) {\n return false\n }\n\n return getKeyMatchKey(input) === match\n }\n }\n\n public parseKeySequence(key: KeyLike): readonly KeySequencePart[] {\n return this.#compiler.parseKeySequence(key)\n }\n\n public formatKey(key: KeyLike, options?: StringifyOptions): string {\n return this.#compiler.formatKey(key, options)\n }\n\n public clearPendingSequence(): void {\n this.#activation.setPendingSequence(null)\n }\n\n public popPendingSequence(): boolean {\n return this.#activation.popPendingSequence()\n }\n\n public getCommands(query?: CommandQuery<TTarget, TEvent>): readonly Command<TTarget, TEvent>[] {\n return this.#catalog.getCommands(query)\n }\n\n public getCommandEntries(query?: CommandQuery<TTarget, TEvent>): readonly CommandEntry<TTarget, TEvent>[] {\n return this.#catalog.getCommandEntries(query)\n }\n\n public getCommandBindings(\n query: CommandBindingsQuery<TTarget>,\n ): ReadonlyMap<string, readonly ActiveBinding<TTarget, TEvent>[]> {\n return this.#catalog.getCommandBindings(query)\n }\n\n public acquireResource(key: symbol, setup: () => () => void): () => void {\n if (this.#cleanedUp || this.#host.isDestroyed) {\n throw new Error(\"Cannot use a keymap after its host was destroyed\")\n }\n\n const existing = this.#resources.get(key)\n if (existing) {\n existing.count += 1\n return () => {\n this.#releaseResource(key, existing)\n }\n }\n\n const dispose = setup()\n const resource = { count: 1, dispose }\n this.#resources.set(key, resource)\n\n return () => {\n this.#releaseResource(key, resource)\n }\n }\n\n public runCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult<TTarget, TEvent> {\n return this.#executor.runCommand(cmd, options)\n }\n\n public dispatchCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult<TTarget, TEvent> {\n return this.#executor.dispatchCommand(cmd, options)\n }\n\n public on(name: \"state\", fn: Listener<Events<TTarget, TEvent>[\"state\"]>): () => void\n\n public on(name: \"pendingSequence\", fn: Listener<Events<TTarget, TEvent>[\"pendingSequence\"]>): () => void\n\n public on(name: \"dispatch\", fn: Listener<Events<TTarget, TEvent>[\"dispatch\"]>): () => void\n\n public on(name: \"warning\", fn: Listener<Events<TTarget, TEvent>[\"warning\"]>): () => void\n\n public on(name: \"error\", fn: Listener<Events<TTarget, TEvent>[\"error\"]>): () => void\n\n public on(\n name: keyof Events<TTarget, TEvent>,\n fn: (() => void) | ((value: Events<TTarget, TEvent>[keyof Events<TTarget, TEvent>]) => void),\n ): () => void {\n if (name === \"warning\") {\n return this.#events.hook(name, fn as EmitterListener<Events<TTarget, TEvent>[\"warning\"]>)\n }\n\n if (name === \"error\") {\n return this.#events.hook(name, fn as EmitterListener<Events<TTarget, TEvent>[\"error\"]>)\n }\n\n return this.#hooks.hook(name, fn as Listener<Hooks<TTarget, TEvent>[typeof name]>)\n }\n\n public intercept(name: \"key\", fn: (ctx: KeyInputContext<TEvent>) => void, options?: KeyInterceptOptions): () => void\n\n public intercept(\n name: \"key:after\",\n fn: (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n options?: KeyInterceptOptions,\n ): () => void\n\n public intercept(name: \"raw\", fn: (ctx: RawInputContext) => void, options?: RawInterceptOptions): () => void\n\n public intercept(\n name: \"key\" | \"key:after\" | \"raw\",\n fn:\n | ((ctx: KeyInputContext<TEvent>) => void)\n | ((ctx: KeyAfterInputContext<TTarget, TEvent>) => void)\n | ((ctx: RawInputContext) => void),\n options?: KeyInterceptOptions | RawInterceptOptions,\n ): () => void {\n if (name === \"key\") {\n return this.#dispatch.intercept(\n name,\n fn as (ctx: KeyInputContext<TEvent>) => void,\n options as KeyInterceptOptions,\n )\n }\n\n if (name === \"key:after\") {\n return this.#dispatch.intercept(\n name,\n fn as (ctx: KeyAfterInputContext<TTarget, TEvent>) => void,\n options as KeyInterceptOptions,\n )\n }\n\n return this.#dispatch.intercept(name, fn as (ctx: RawInputContext) => void, options as RawInterceptOptions)\n }\n\n public registerLayer(layer: Layer<TTarget, TEvent>): () => void {\n return this.#layers.registerLayer(layer)\n }\n\n public registerLayerFields(fields: Record<string, LayerFieldCompiler>): () => void {\n return registerFields(this.#state, this.#notify, \"layer\", fields)\n }\n\n public prependLayerBindingsTransformer(transformer: LayerBindingsTransformer<TTarget, TEvent>): () => void {\n return this.#state.layerBindingsTransformers.prepend(transformer)\n }\n\n public appendLayerBindingsTransformer(transformer: LayerBindingsTransformer<TTarget, TEvent>): () => void {\n return this.#state.layerBindingsTransformers.append(transformer)\n }\n\n public clearLayerBindingsTransformers(): void {\n this.#state.layerBindingsTransformers.clear()\n }\n\n public prependBindingTransformer(transformer: BindingTransformer<TTarget, TEvent>): () => void {\n return this.#state.bindingTransformers.prepend(transformer)\n }\n\n public appendBindingTransformer(transformer: BindingTransformer<TTarget, TEvent>): () => void {\n return this.#state.bindingTransformers.append(transformer)\n }\n\n public clearBindingTransformers(): void {\n this.#state.bindingTransformers.clear()\n }\n\n public prependCommandTransformer(transformer: CommandTransformer<TTarget, TEvent>): () => void {\n return this.#state.commandTransformers.prepend(transformer)\n }\n\n public appendCommandTransformer(transformer: CommandTransformer<TTarget, TEvent>): () => void {\n return this.#state.commandTransformers.append(transformer)\n }\n\n public clearCommandTransformers(): void {\n this.#state.commandTransformers.clear()\n }\n\n public prependBindingParser(parser: BindingParser): () => void {\n return this.#state.bindingParsers.prepend(parser)\n }\n\n public appendBindingParser(parser: BindingParser): () => void {\n return this.#state.bindingParsers.append(parser)\n }\n\n public clearBindingParsers(): void {\n this.#state.bindingParsers.clear()\n }\n\n public registerToken(token: KeyToken): () => void {\n return registerEnvironmentToken(this.#state, this.#notify, this.#compiler, this.#layers, token)\n }\n\n public registerSequencePattern(pattern: SequencePattern<TEvent>): () => void {\n return registerEnvironmentSequencePattern(this.#state, this.#notify, this.#layers, pattern)\n }\n\n public prependBindingExpander(expander: BindingExpander): () => void {\n return this.#state.bindingExpanders.prepend(expander)\n }\n\n public appendBindingExpander(expander: BindingExpander): () => void {\n return this.#state.bindingExpanders.append(expander)\n }\n\n public clearBindingExpanders(): void {\n this.#state.bindingExpanders.clear()\n }\n\n public registerBindingFields(fields: Record<string, BindingFieldCompiler>): () => void {\n return registerFields(this.#state, this.#notify, \"binding\", fields)\n }\n\n public registerCommandFields(fields: Record<string, CommandFieldCompiler>): () => void {\n return registerFields(this.#state, this.#notify, \"command\", fields)\n }\n\n public prependCommandResolver(resolver: CommandResolver<TTarget, TEvent>): () => void {\n return this.#catalog.prependCommandResolver(resolver)\n }\n\n public appendCommandResolver(resolver: CommandResolver<TTarget, TEvent>): () => void {\n return this.#catalog.appendCommandResolver(resolver)\n }\n\n public clearCommandResolvers(): void {\n this.#catalog.clearCommandResolvers()\n }\n\n public prependLayerAnalyzer(analyzer: LayerAnalyzer<TTarget, TEvent>): () => void {\n return this.#layerDiagnostics.prependLayerAnalyzer(analyzer)\n }\n\n public appendLayerAnalyzer(analyzer: LayerAnalyzer<TTarget, TEvent>): () => void {\n return this.#layerDiagnostics.appendLayerAnalyzer(analyzer)\n }\n\n public clearLayerAnalyzers(): void {\n this.#layerDiagnostics.clearLayerAnalyzers()\n }\n\n public prependEventMatchResolver(resolver: EventMatchResolver<TEvent>): () => void {\n return this.#dispatch.prependEventMatchResolver(resolver)\n }\n\n public appendEventMatchResolver(resolver: EventMatchResolver<TEvent>): () => void {\n return this.#dispatch.appendEventMatchResolver(resolver)\n }\n\n public clearEventMatchResolvers(): void {\n this.#dispatch.clearEventMatchResolvers()\n }\n\n public prependDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void {\n return this.#dispatch.prependDisambiguationResolver(resolver)\n }\n\n public appendDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void {\n return this.#dispatch.appendDisambiguationResolver(resolver)\n }\n\n public clearDisambiguationResolvers(): void {\n this.#dispatch.clearDisambiguationResolvers()\n }\n\n #handleFocusedTargetChange(_focused: TTarget | null): void {\n this.#notify.runWithStateChangeBatch(() => {\n // Any focus change breaks a pending sequence. Prefix dispatch is captured\n // against the state that started it, and changing focus can change the\n // active bindings and their precedence.\n this.#activation.setPendingSequence(null)\n this.#notify.queueStateChange({ invalidateCaches: false })\n })\n }\n\n #warnUnknownField(kind: \"binding\" | \"layer\", fieldName: string): void {\n this.#notify.warnOnce(\n `${kind}:${fieldName}`,\n `unknown-${kind}-field`,\n { field: fieldName, kind },\n `[Keymap] Unknown ${kind} field \"${fieldName}\" was ignored`,\n )\n }\n\n #warnUnknownToken(token: string, sequence: string): void {\n this.#notify.warnOnce(\n `token:${token}`,\n \"unknown-token\",\n { token, sequence },\n `[Keymap] Unknown token \"${token}\" in key sequence \"${sequence}\" was ignored`,\n )\n }\n\n #releaseResource(key: symbol, resource: { count: number; dispose: () => void }): void {\n const current = this.#resources.get(key)\n if (current !== resource) {\n return\n }\n\n resource.count -= 1\n if (resource.count > 0) {\n return\n }\n\n resource.dispose()\n this.#resources.delete(key)\n }\n}\n"
|
|
30
|
+
],
|
|
31
|
+
"mappings": "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",
|
|
32
|
+
"debugId": "DF4DB67A4951EA4E64756E2164756E21",
|
|
33
|
+
"names": []
|
|
34
|
+
}
|