@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.
Files changed (78) hide show
  1. package/README.md +56 -32
  2. package/chunks/index-frk6sdcd.js +409 -0
  3. package/chunks/index-frk6sdcd.js.map +14 -0
  4. package/package.json +17 -7
  5. package/src/addons/index.js +511 -4870
  6. package/src/addons/index.js.map +25 -0
  7. package/src/addons/opentui/edit-buffer-bindings.d.ts +6 -2
  8. package/src/addons/opentui/index.d.ts +2 -2
  9. package/src/addons/opentui/index.js +101 -5515
  10. package/src/addons/opentui/index.js.map +12 -0
  11. package/src/addons/universal/dead-bindings.d.ts +1 -1
  12. package/src/addons/universal/default-parser.d.ts +2 -2
  13. package/src/addons/universal/ex-commands.d.ts +11 -8
  14. package/src/addons/universal/index.d.ts +2 -1
  15. package/src/addons/universal/leader.d.ts +1 -1
  16. package/src/addons/universal/metadata.d.ts +2 -2
  17. package/src/addons/universal/mod-bindings.d.ts +6 -0
  18. package/src/addons/universal/unresolved-commands.d.ts +1 -1
  19. package/src/extras/binding-sections.d.ts +16 -7
  20. package/src/extras/command-bindings.d.ts +2 -2
  21. package/src/extras/formatting.d.ts +3 -0
  22. package/src/extras/graph.d.ts +9 -0
  23. package/src/extras/graph.js +373 -0
  24. package/src/extras/graph.js.map +11 -0
  25. package/src/extras/index.js +57 -4
  26. package/src/extras/index.js.map +12 -0
  27. package/src/extras/lib/graph-snapshot.d.ts +14 -0
  28. package/src/extras/lib/graph-types.d.ts +83 -0
  29. package/src/html.d.ts +3 -3
  30. package/src/html.js +47 -4992
  31. package/src/html.js.map +10 -0
  32. package/src/index.d.ts +3 -1
  33. package/src/index.js +2688 -2807
  34. package/src/index.js.map +34 -0
  35. package/src/keymap.d.ts +17 -33
  36. package/src/lib/emitter.d.ts +1 -2
  37. package/src/lib/registry.d.ts +2 -2
  38. package/src/lib/runtime-utils.d.ts +34 -0
  39. package/src/opentui.d.ts +1 -3
  40. package/src/opentui.js +40 -4994
  41. package/src/opentui.js.map +10 -0
  42. package/src/react/index.d.ts +5 -19
  43. package/src/react/index.js +3 -0
  44. package/src/react/index.js.map +10 -0
  45. package/src/runtime-modules.d.ts +2 -0
  46. package/src/runtime-modules.js +5 -0
  47. package/src/runtime-modules.js.map +10 -0
  48. package/src/services/activation.d.ts +7 -33
  49. package/src/services/active-key-cache.d.ts +29 -0
  50. package/src/services/command-catalog.d.ts +27 -52
  51. package/src/services/command-executor.d.ts +6 -12
  52. package/src/services/compiler.d.ts +4 -12
  53. package/src/services/conditions.d.ts +4 -16
  54. package/src/services/dispatch-decisions.d.ts +21 -0
  55. package/src/services/dispatch-patterns.d.ts +5 -0
  56. package/src/services/dispatch.d.ts +6 -42
  57. package/src/services/environment.d.ts +6 -24
  58. package/src/services/extension-context.d.ts +16 -0
  59. package/src/services/layer-diagnostics.d.ts +10 -0
  60. package/src/services/layers.d.ts +15 -24
  61. package/src/services/notify.d.ts +6 -8
  62. package/src/services/pending-sequence.d.ts +4 -0
  63. package/src/services/primitives/active-layers.d.ts +2 -3
  64. package/src/services/primitives/bindings.d.ts +4 -0
  65. package/src/services/primitives/field-invariants.d.ts +16 -1
  66. package/src/services/primitives/pending-captures.d.ts +5 -0
  67. package/src/services/runtime-view.d.ts +5 -0
  68. package/src/services/runtime.d.ts +2 -7
  69. package/src/services/sequence-index.d.ts +24 -0
  70. package/src/services/state.d.ts +46 -92
  71. package/src/solid/index.d.ts +5 -19
  72. package/src/solid/index.js +3 -0
  73. package/src/solid/index.js.map +10 -0
  74. package/src/testing/index.d.ts +90 -0
  75. package/src/testing/index.js +276 -0
  76. package/src/testing/index.js.map +10 -0
  77. package/src/types.d.ts +180 -128
  78. package/src/services/primitives/binding-inputs.d.ts +0 -4
@@ -2,41 +2,32 @@ import type { CompilerService } from "./compiler.js";
2
2
  import type { CommandCatalogService } from "./command-catalog.js";
3
3
  import type { ConditionService } from "./conditions.js";
4
4
  import type { ActivationService } from "./activation.js";
5
- import type { KeymapEvent, KeymapHost, Layer, LayerAnalyzer, ResolvedKeyToken } from "../types.js";
5
+ import type { Binding, BindingState, KeymapEvent, KeymapHost, Layer, ResolvedKeyToken, CommandState } from "../types.js";
6
6
  import type { State } from "./state.js";
7
7
  import type { NotificationService } from "./notify.js";
8
8
  interface LayersOptions<TTarget extends object, TEvent extends KeymapEvent> {
9
9
  compiler: CompilerService<TTarget, TEvent>;
10
10
  commands: CommandCatalogService<TTarget, TEvent>;
11
11
  host: KeymapHost<TTarget, TEvent>;
12
+ diagnostics?: LayerDiagnostics<TTarget, TEvent>;
12
13
  warnUnknownField: (kind: "binding" | "layer", fieldName: string) => void;
13
14
  }
14
- export declare class LayerService<TTarget extends object, TEvent extends KeymapEvent> {
15
- private readonly state;
16
- private readonly notify;
17
- private readonly conditions;
18
- private readonly activation;
19
- private readonly options;
20
- constructor(state: State<TTarget, TEvent>, notify: NotificationService<TTarget, TEvent>, conditions: ConditionService<TTarget, TEvent>, activation: ActivationService<TTarget, TEvent>, options: LayersOptions<TTarget, TEvent>);
15
+ export interface AnalyzeLayerOptions<TTarget extends object, TEvent extends KeymapEvent> {
16
+ target?: TTarget;
17
+ order: number;
18
+ commands: readonly CommandState<TTarget, TEvent>[];
19
+ sourceBindings: readonly Binding<TTarget, TEvent>[];
20
+ bindings: readonly BindingState<TTarget, TEvent>[];
21
+ hasTokenBindings: boolean;
22
+ }
23
+ export interface LayerDiagnostics<TTarget extends object, TEvent extends KeymapEvent> {
24
+ analyzeLayer(options: AnalyzeLayerOptions<TTarget, TEvent>): void;
25
+ }
26
+ export interface LayerService<TTarget extends object, TEvent extends KeymapEvent> {
21
27
  registerLayer(layer: Layer<TTarget, TEvent>): () => void;
22
28
  applyTokenState(nextTokens: Map<string, ResolvedKeyToken>): void;
23
29
  recompileBindings(): void;
24
- prependLayerAnalyzer(analyzer: LayerAnalyzer<TTarget, TEvent>): () => void;
25
- appendLayerAnalyzer(analyzer: LayerAnalyzer<TTarget, TEvent>): () => void;
26
- clearLayerAnalyzers(): void;
27
30
  cleanup(): void;
28
- private normalizeTargetMode;
29
- private applyLayerBindingsTransformers;
30
- private runLayerAnalyzers;
31
- private compileLayerRuntimeState;
32
- private compileLayerBindings;
33
- private applyCompiledBindings;
34
- private indexLayer;
35
- private removeLayerFromIndex;
36
- private unregisterLayer;
37
- private connectRuntimeMatchable;
38
- private disconnectRuntimeMatchable;
39
- private attachReactiveMatchers;
40
- private detachReactiveMatchers;
41
31
  }
32
+ export declare function createLayerService<TTarget extends object, TEvent extends KeymapEvent>(state: State<TTarget, TEvent>, notify: NotificationService<TTarget, TEvent>, conditions: ConditionService<TTarget, TEvent>, activation: ActivationService<TTarget, TEvent>, options: LayersOptions<TTarget, TEvent>): LayerService<TTarget, TEvent>;
42
33
  export {};
@@ -1,19 +1,17 @@
1
1
  import type { Events, HookName, Hooks, KeymapEvent } from "../types.js";
2
+ import type { RuntimeEmitter } from "../lib/runtime-utils.js";
2
3
  import type { State } from "./state.js";
3
- import { Emitter } from "../lib/emitter.js";
4
4
  type DiagnosticEvents<TTarget extends object, TEvent extends KeymapEvent> = Pick<Events<TTarget, TEvent>, "warning" | "error">;
5
5
  export declare const MAX_STATE_CHANGE_FLUSH_ITERATIONS = 1000;
6
- export declare class NotificationService<TTarget extends object, TEvent extends KeymapEvent> {
7
- private readonly state;
8
- private readonly events;
9
- private readonly hooks;
10
- constructor(state: State<TTarget, TEvent>, events: Emitter<DiagnosticEvents<TTarget, TEvent>>, hooks: Emitter<Hooks<TTarget, TEvent>>);
6
+ export interface NotificationService<TTarget extends object, TEvent extends KeymapEvent> {
11
7
  runWithStateChangeBatch<T>(fn: () => T): T;
12
- queueStateChange(): void;
8
+ queueStateChange(options?: {
9
+ invalidateCaches?: boolean;
10
+ }): void;
13
11
  emitWarning(code: string, warning: unknown, message: string): void;
14
12
  emitError(code: string, error: unknown, message: string): void;
15
13
  reportListenerError(name: HookName, error: unknown): void;
16
14
  warnOnce(key: string, code: string, warning: unknown, message: string): void;
17
- private flushStateChange;
18
15
  }
16
+ export declare function createNotificationService<TTarget extends object, TEvent extends KeymapEvent>(state: State<TTarget, TEvent>, events: RuntimeEmitter<DiagnosticEvents<TTarget, TEvent>>, hooks: RuntimeEmitter<Hooks<TTarget, TEvent>>): NotificationService<TTarget, TEvent>;
19
17
  export {};
@@ -0,0 +1,4 @@
1
+ import type { KeymapEvent, KeySequencePart, PendingSequenceCapture, PendingSequenceState } from "../types.js";
2
+ export declare function isSamePendingSequence<TTarget extends object, TEvent extends KeymapEvent>(current: PendingSequenceState<TTarget, TEvent> | null, next: PendingSequenceState<TTarget, TEvent> | null): boolean;
3
+ export declare function popCapture<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>): PendingSequenceCapture<TTarget, TEvent> | undefined;
4
+ export declare function collectSequencePartsFromPending<TTarget extends object, TEvent extends KeymapEvent>(pending: PendingSequenceState<TTarget, TEvent>): KeySequencePart[];
@@ -1,8 +1,7 @@
1
1
  import type { KeymapEvent, KeymapHost, RegisteredLayer } from "../../types.js";
2
- import type { LayersState } from "../state.js";
3
2
  export declare function getFocusedTargetIfAvailable<TTarget extends object, TEvent extends KeymapEvent>(host: KeymapHost<TTarget, TEvent>): TTarget | null;
4
3
  export declare function forEachActivationTarget<TTarget extends object, TEvent extends KeymapEvent>(host: KeymapHost<TTarget, TEvent>, focused: TTarget | null, visit: (target: TTarget, isFocusedTarget: boolean) => boolean | void): void;
5
4
  export declare function getActivationPath<TTarget extends object, TEvent extends KeymapEvent>(host: KeymapHost<TTarget, TEvent>, focused: TTarget | null): Set<TTarget>;
6
- export declare function getActiveLayersForFocused<TTarget extends object, TEvent extends KeymapEvent>(state: LayersState<TTarget, TEvent>, host: KeymapHost<TTarget, TEvent>, focused: TTarget | null): readonly RegisteredLayer<TTarget, TEvent>[];
7
- export declare function invalidateCachedActiveLayers<TTarget extends object, TEvent extends KeymapEvent>(state: LayersState<TTarget, TEvent>): void;
5
+ export declare function getActiveLayersForFocused<TTarget extends object, TEvent extends KeymapEvent>(layers: readonly RegisteredLayer<TTarget, TEvent>[] | ReadonlySet<RegisteredLayer<TTarget, TEvent>>, host: KeymapHost<TTarget, TEvent>, focused: TTarget | null): readonly RegisteredLayer<TTarget, TEvent>[];
6
+ export declare function getSortedLayers<TTarget extends object, TEvent extends KeymapEvent>(layers: ReadonlySet<RegisteredLayer<TTarget, TEvent>>): RegisteredLayer<TTarget, TEvent>[];
8
7
  export declare function isLayerActiveForFocused<TTarget extends object, TEvent extends KeymapEvent>(host: KeymapHost<TTarget, TEvent>, layer: RegisteredLayer<TTarget, TEvent>, focused: TTarget | null, activationPath?: ReadonlySet<TTarget>): boolean;
@@ -0,0 +1,4 @@
1
+ import type { Binding, BindingsValidationResult, Bindings, KeymapEvent, ParsedBinding } from "../../types.js";
2
+ export declare function validateBindings(bindings: unknown): BindingsValidationResult;
3
+ export declare function snapshotBindings<TTarget extends object, TEvent extends KeymapEvent>(bindings: Bindings<TTarget, TEvent>): Binding<TTarget, TEvent>[];
4
+ export declare function snapshotParsedBinding<TTarget extends object, TEvent extends KeymapEvent>(binding: ParsedBinding<TTarget, TEvent>): ParsedBinding<TTarget, TEvent>;
@@ -1,3 +1,18 @@
1
- import type { Attributes, EventData } from "../../types.js";
1
+ import type { Attributes, BindingFieldContext, CommandFieldContext, EventData, KeymapEvent, LayerFieldContext, RuntimeMatcher } from "../../types.js";
2
+ import type { ConditionService } from "../conditions.js";
2
3
  export declare function mergeRequirement(target: EventData, name: string, value: unknown, source: string): void;
3
4
  export declare function mergeAttribute(target: Attributes, name: string, value: unknown, source: string): void;
5
+ interface FieldCompilerContextOptions<TTarget extends object, TEvent extends KeymapEvent> {
6
+ fieldName: string;
7
+ conditions: ConditionService<TTarget, TEvent>;
8
+ requirements: EventData;
9
+ matchers: RuntimeMatcher[];
10
+ attrs?: Attributes;
11
+ }
12
+ export declare function createFieldCompilerContext<TTarget extends object, TEvent extends KeymapEvent>(options: FieldCompilerContextOptions<TTarget, TEvent> & {
13
+ attrs: Attributes;
14
+ }): BindingFieldContext & CommandFieldContext & LayerFieldContext;
15
+ export declare function createFieldCompilerContext<TTarget extends object, TEvent extends KeymapEvent>(options: FieldCompilerContextOptions<TTarget, TEvent> & {
16
+ attrs?: undefined;
17
+ }): LayerFieldContext;
18
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { KeymapEvent, PendingSequenceCapture, ResolvedSequencePattern } from "../../types.js";
2
+ export declare function patternCaptureCount<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>): number;
3
+ export declare function captureHasMinimum<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>, patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>, missingPatternResult?: boolean): boolean;
4
+ export declare function captureHasContinuations<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>, patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>, missingPatternMinimum?: boolean): boolean;
5
+ export declare function captureIsExact<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>, patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>): boolean;
@@ -0,0 +1,5 @@
1
+ import type { ConditionService } from "./conditions.js";
2
+ import type { ActiveCommandView, CommandView, State } from "./state.js";
3
+ import type { KeymapEvent, KeymapHost } from "../types.js";
4
+ export declare function getRegisteredCommandView<TTarget extends object, TEvent extends KeymapEvent>(state: State<TTarget, TEvent>): CommandView<TTarget, TEvent>;
5
+ export declare function getActiveCommandView<TTarget extends object, TEvent extends KeymapEvent>(state: State<TTarget, TEvent>, host: KeymapHost<TTarget, TEvent>, conditions: ConditionService<TTarget, TEvent>, focused: TTarget | null): ActiveCommandView<TTarget, TEvent>;
@@ -1,15 +1,10 @@
1
1
  import type { EventData, KeymapEvent } from "../types.js";
2
2
  import type { ActivationService } from "./activation.js";
3
- import type { ConditionService } from "./conditions.js";
4
3
  import type { NotificationService } from "./notify.js";
5
4
  import type { State } from "./state.js";
6
- export declare class RuntimeService<TTarget extends object, TEvent extends KeymapEvent> {
7
- private readonly state;
8
- private readonly notify;
9
- private readonly conditions;
10
- private readonly activation;
11
- constructor(state: State<TTarget, TEvent>, notify: NotificationService<TTarget, TEvent>, conditions: ConditionService<TTarget, TEvent>, activation: ActivationService<TTarget, TEvent>);
5
+ export interface RuntimeService<TTarget extends object, TEvent extends KeymapEvent> {
12
6
  getData(name: string): unknown;
13
7
  setData(name: string, value: unknown): void;
14
8
  getReadonlyData(): Readonly<EventData>;
15
9
  }
10
+ export declare function createRuntimeService<TTarget extends object, TEvent extends KeymapEvent>(state: State<TTarget, TEvent>, notify: NotificationService<TTarget, TEvent>, activation: ActivationService<TTarget, TEvent>): RuntimeService<TTarget, TEvent>;
@@ -0,0 +1,24 @@
1
+ import type { BindingState, KeymapEvent, KeySequencePart, KeyMatch, PendingSequenceCapture, PendingSequencePatternCapture, RegisteredLayer, ResolvedSequencePattern, SequenceNode, SequencePatternMatch } from "../types.js";
2
+ export interface SequenceActiveOption<TTarget extends object, TEvent extends KeymapEvent> {
3
+ part: KeySequencePart;
4
+ binding: BindingState<TTarget, TEvent>;
5
+ index: number;
6
+ exact: boolean;
7
+ continues: boolean;
8
+ }
9
+ export declare function createSequenceNode<TTarget extends object, TEvent extends KeymapEvent>(parent: SequenceNode<TTarget, TEvent> | null, stroke: KeySequencePart["stroke"] | null, match: KeySequencePart["match"] | null, pattern?: ResolvedSequencePattern<TEvent>): SequenceNode<TTarget, TEvent>;
10
+ export declare function buildSequenceTree<TTarget extends object, TEvent extends KeymapEvent>(bindings: readonly BindingState<TTarget, TEvent>[], patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>): SequenceNode<TTarget, TEvent>;
11
+ export declare function getCaptureNode<TTarget extends object, TEvent extends KeymapEvent>(root: SequenceNode<TTarget, TEvent>, capture: import("../types.js").PendingSequenceCapture<TTarget, TEvent>): SequenceNode<TTarget, TEvent> | undefined;
12
+ export declare function getNodeSequence<TTarget extends object, TEvent extends KeymapEvent>(node: SequenceNode<TTarget, TEvent>): KeySequencePart[];
13
+ export declare function getNodePresentation<TTarget extends object, TEvent extends KeymapEvent>(node: SequenceNode<TTarget, TEvent>): {
14
+ display: string;
15
+ tokenName?: string;
16
+ };
17
+ export declare function firstNodeForMatch<TTarget extends object, TEvent extends KeymapEvent>(root: SequenceNode<TTarget, TEvent>, match: KeyMatch): SequenceNode<TTarget, TEvent> | undefined;
18
+ export declare function childNodes<TTarget extends object, TEvent extends KeymapEvent>(node: SequenceNode<TTarget, TEvent>): SequenceNode<TTarget, TEvent>[];
19
+ export declare function activeOptionsForBindings<TTarget extends object, TEvent extends KeymapEvent>(bindings: readonly BindingState<TTarget, TEvent>[]): SequenceActiveOption<TTarget, TEvent>[];
20
+ export declare function activeOptionsForCaptures<TTarget extends object, TEvent extends KeymapEvent>(captures: readonly PendingSequenceCapture<TTarget, TEvent>[], patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>): SequenceActiveOption<TTarget, TEvent>[];
21
+ export declare function capturePriority<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>, matchKeys: readonly KeyMatch[]): number;
22
+ export declare function advanceSequenceBinding<TTarget extends object, TEvent extends KeymapEvent>(layer: RegisteredLayer<TTarget, TEvent>, binding: BindingState<TTarget, TEvent>, index: number, parts: readonly KeySequencePart[], patterns: readonly PendingSequencePatternCapture[] | undefined, matchKeys: readonly KeyMatch[], event: TEvent, matchPattern: (patternName: string, event: TEvent) => SequencePatternMatch | undefined, createPatternPart: (event: TEvent, patternName: string, match: SequencePatternMatch) => KeySequencePart): PendingSequenceCapture<TTarget, TEvent> | undefined;
23
+ export declare function advanceSequenceCapture<TTarget extends object, TEvent extends KeymapEvent>(capture: PendingSequenceCapture<TTarget, TEvent>, matchKeys: readonly KeyMatch[], event: TEvent, patterns: ReadonlyMap<string, ResolvedSequencePattern<TEvent>>, matchPattern: (patternName: string, event: TEvent) => SequencePatternMatch | undefined, createPatternPart: (event: TEvent, patternName: string, match: SequencePatternMatch) => KeySequencePart): PendingSequenceCapture<TTarget, TEvent> | undefined;
24
+ export declare function collectRootSequenceCaptures<TTarget extends object, TEvent extends KeymapEvent>(layer: RegisteredLayer<TTarget, TEvent>, matchKeys: readonly KeyMatch[], event: TEvent, matchPattern: (patternName: string, event: TEvent) => SequencePatternMatch | undefined, createPatternPart: (event: TEvent, patternName: string, match: SequencePatternMatch) => KeySequencePart): PendingSequenceCapture<TTarget, TEvent>[];
@@ -1,116 +1,70 @@
1
- import type { ActiveKey, BindingExpander, BindingFieldCompiler, LayerBindingsTransformer, BindingParser, BindingTransformer, CommandFieldCompiler, CommandResolver, EventData, KeyDisambiguationResolver, EventMatchResolver, KeyInputContext, KeySequencePart, KeymapEvent, LayerAnalyzer, LayerFieldCompiler, PendingSequenceState, RawInputContext, RegisteredCommand, RegisteredLayer, ResolvedBindingCommand, RuntimeMatchable } from "../types.js";
2
- import { OrderedRegistry, PriorityRegistry } from "../lib/registry.js";
3
- export interface CoreState {
4
- order: number;
5
- }
6
- export interface EnvironmentState<TTarget extends object, TEvent extends KeymapEvent> {
7
- tokens: Map<string, import("../types.js").ResolvedKeyToken>;
8
- layerFields: Map<string, LayerFieldCompiler>;
9
- layerBindingsTransformers: OrderedRegistry<LayerBindingsTransformer<TTarget, TEvent>>;
10
- bindingExpanders: OrderedRegistry<BindingExpander>;
11
- bindingParsers: OrderedRegistry<BindingParser>;
12
- bindingTransformers: OrderedRegistry<BindingTransformer<TTarget, TEvent>>;
13
- bindingFields: Map<string, BindingFieldCompiler>;
14
- commandFields: Map<string, CommandFieldCompiler>;
15
- }
16
- export interface DispatchState<TTarget extends object, TEvent extends KeymapEvent> {
17
- eventMatchResolvers: OrderedRegistry<EventMatchResolver<TEvent>>;
18
- disambiguationResolvers: OrderedRegistry<KeyDisambiguationResolver<TTarget, TEvent>>;
19
- keyHooks: PriorityRegistry<(ctx: KeyInputContext<TEvent>) => void, {
20
- priority: number;
21
- release: boolean;
22
- }>;
23
- rawHooks: PriorityRegistry<(ctx: RawInputContext) => void, {
24
- priority: number;
25
- }>;
26
- }
27
- export interface LayersState<TTarget extends object, TEvent extends KeymapEvent> {
28
- layers: Set<RegisteredLayer<TTarget, TEvent>>;
29
- sortedLayers: RegisteredLayer<TTarget, TEvent>[];
30
- activeLayersVersion: number;
31
- activeLayersCacheVersion: number;
32
- activeLayersCacheFocused: TTarget | null | undefined;
33
- activeLayersCache: readonly RegisteredLayer<TTarget, TEvent>[];
34
- layersWithConditions: number;
35
- layersWithCommands: number;
36
- layerAnalyzers: OrderedRegistry<LayerAnalyzer<TTarget, TEvent>>;
37
- }
1
+ import type { Attributes, BindingExpander, BindingFieldCompiler, LayerBindingsTransformer, BindingParser, BindingTransformer, Command, CommandFieldCompiler, CommandTransformer, CommandResolver, EventData, KeyDisambiguationResolver, EventMatchResolver, KeyAfterInputContext, KeyInputContext, KeymapEvent, LayerFieldCompiler, PendingSequenceState, RawInputContext, ResolvedSequencePattern, CommandState, RegisteredLayer } from "../types.js";
2
+ import { type RuntimeOrderedRegistry, type RuntimePriorityRegistry } from "../lib/runtime-utils.js";
38
3
  export interface LayerCommandEntry<TTarget extends object, TEvent extends KeymapEvent> {
39
4
  layer: RegisteredLayer<TTarget, TEvent>;
40
- command: RegisteredCommand<TTarget, TEvent>;
5
+ commandState: CommandState<TTarget, TEvent>;
41
6
  }
42
7
  export interface ResolvedCommandEntry<TTarget extends object, TEvent extends KeymapEvent> {
43
8
  target?: TTarget;
44
- resolved: ResolvedBindingCommand<TTarget, TEvent>;
45
- }
46
- export interface CommandChainCacheState<TTarget extends object, TEvent extends KeymapEvent> {
47
- resolvedWithoutRecordChains: Map<string, readonly ResolvedCommandEntry<TTarget, TEvent>[]>;
48
- resolvedWithRecordChains: Map<string, readonly ResolvedCommandEntry<TTarget, TEvent>[]>;
49
- fallbackWithoutRecord: Map<string, ResolvedBindingCommand<TTarget, TEvent> | null>;
50
- fallbackWithRecord: Map<string, ResolvedBindingCommand<TTarget, TEvent> | null>;
51
- fallbackWithoutRecordErrors: Set<string>;
52
- fallbackWithRecordErrors: Set<string>;
9
+ command: Command<TTarget, TEvent>;
10
+ attrs?: Readonly<Attributes>;
11
+ input?: string;
12
+ payload?: unknown;
53
13
  }
54
- export interface ActiveCommandView<TTarget extends object, TEvent extends KeymapEvent> extends CommandChainCacheState<TTarget, TEvent> {
55
- cacheable: boolean;
14
+ export interface ActiveCommandView<TTarget extends object, TEvent extends KeymapEvent> {
15
+ layers: readonly RegisteredLayer<TTarget, TEvent>[];
56
16
  entries: readonly LayerCommandEntry<TTarget, TEvent>[];
57
17
  reachable: readonly LayerCommandEntry<TTarget, TEvent>[];
58
18
  reachableByName: ReadonlyMap<string, LayerCommandEntry<TTarget, TEvent>>;
59
19
  chainsByName: ReadonlyMap<string, readonly LayerCommandEntry<TTarget, TEvent>[]>;
60
20
  }
61
- export interface RegisteredCommandView<TTarget extends object, TEvent extends KeymapEvent> extends CommandChainCacheState<TTarget, TEvent> {
21
+ export interface CommandView<TTarget extends object, TEvent extends KeymapEvent> {
62
22
  entries: readonly LayerCommandEntry<TTarget, TEvent>[];
63
23
  chainsByName: ReadonlyMap<string, readonly LayerCommandEntry<TTarget, TEvent>[]>;
64
24
  }
65
- export interface CommandsState<TTarget extends object, TEvent extends KeymapEvent> {
66
- commandMetadataVersion: number;
67
- registeredNames: Map<string, number>;
68
- commandResolvers: OrderedRegistry<CommandResolver<TTarget, TEvent>>;
69
- activeCommandViewVersion: number;
70
- activeCommandView?: ActiveCommandView<TTarget, TEvent>;
71
- registeredCommandViewVersion: number;
72
- registeredCommandView?: RegisteredCommandView<TTarget, TEvent>;
73
- registeredCommandEntriesCacheVersion: number;
74
- registeredCommandEntriesCache: readonly LayerCommandEntry<TTarget, TEvent>[];
75
- }
76
- export interface ProjectionState<TTarget extends object, TEvent extends KeymapEvent> {
77
- pendingSequence: PendingSequenceState<TTarget, TEvent> | null;
78
- pendingSequenceCacheVersion: number;
79
- pendingSequenceCache: readonly KeySequencePart[];
80
- activeKeysPlainCacheVersion: number;
81
- activeKeysPlainCache: readonly ActiveKey<TTarget, TEvent>[];
82
- activeKeysBindingsCacheVersion: number;
83
- activeKeysBindingsCache: readonly ActiveKey<TTarget, TEvent>[];
84
- activeKeysMetadataCacheVersion: number;
85
- activeKeysMetadataCache: readonly ActiveKey<TTarget, TEvent>[];
86
- activeKeysBindingsAndMetadataCacheVersion: number;
87
- activeKeysBindingsAndMetadataCache: readonly ActiveKey<TTarget, TEvent>[];
88
- }
89
- export interface ConditionsState {
90
- runtimeKeyDependents: Map<string, Set<RuntimeMatchable>>;
91
- }
92
- export interface RuntimeState {
25
+ export interface State<TTarget extends object, TEvent extends KeymapEvent> {
26
+ order: number;
27
+ tokens: Map<string, import("../types.js").ResolvedKeyToken>;
28
+ patterns: Map<string, ResolvedSequencePattern<TEvent>>;
29
+ layerFields: Map<string, LayerFieldCompiler>;
30
+ layerBindingsTransformers: RuntimeOrderedRegistry<LayerBindingsTransformer<TTarget, TEvent>>;
31
+ bindingExpanders: RuntimeOrderedRegistry<BindingExpander>;
32
+ bindingParsers: RuntimeOrderedRegistry<BindingParser>;
33
+ bindingTransformers: RuntimeOrderedRegistry<BindingTransformer<TTarget, TEvent>>;
34
+ bindingFields: Map<string, BindingFieldCompiler>;
35
+ commandTransformers: RuntimeOrderedRegistry<CommandTransformer<TTarget, TEvent>>;
36
+ commandFields: Map<string, CommandFieldCompiler>;
37
+ eventMatchResolvers: RuntimeOrderedRegistry<EventMatchResolver<TEvent>>;
38
+ disambiguationResolvers: RuntimeOrderedRegistry<KeyDisambiguationResolver<TTarget, TEvent>>;
39
+ keyHooks: RuntimePriorityRegistry<(ctx: KeyInputContext<TEvent>) => void, {
40
+ priority: number;
41
+ release: boolean;
42
+ }>;
43
+ keyAfterHooks: RuntimePriorityRegistry<(ctx: KeyAfterInputContext<TTarget, TEvent>) => void, {
44
+ priority: number;
45
+ release: boolean;
46
+ }>;
47
+ rawHooks: RuntimePriorityRegistry<(ctx: RawInputContext) => void, {
48
+ priority: number;
49
+ }>;
50
+ layers: Set<RegisteredLayer<TTarget, TEvent>>;
51
+ sortedLayers: RegisteredLayer<TTarget, TEvent>[];
52
+ activeLayersCacheVersion: number;
53
+ activeLayersCacheFocused: TTarget | null | undefined;
54
+ activeLayersCache: RegisteredLayer<TTarget, TEvent>[];
55
+ activeKeyCacheBlockers: number;
56
+ activeCommandViewCacheBlockers: number;
57
+ commandResolvers: RuntimeOrderedRegistry<CommandResolver<TTarget, TEvent>>;
58
+ pending: PendingSequenceState<TTarget, TEvent> | null;
93
59
  data: EventData;
94
60
  dataVersion: number;
95
61
  readonlyDataVersion: number;
96
62
  readonlyData: Readonly<EventData>;
97
- }
98
- export interface NotifyState {
99
- derivedStateVersion: number;
63
+ cacheVersion: number;
64
+ derivedVersion: number;
100
65
  stateChangeDepth: number;
101
66
  stateChangePending: boolean;
102
67
  flushingStateChange: boolean;
103
68
  usedWarningKeys: Set<string>;
104
69
  }
105
- export interface State<TTarget extends object, TEvent extends KeymapEvent> {
106
- core: CoreState;
107
- environment: EnvironmentState<TTarget, TEvent>;
108
- dispatch: DispatchState<TTarget, TEvent>;
109
- layers: LayersState<TTarget, TEvent>;
110
- commands: CommandsState<TTarget, TEvent>;
111
- projection: ProjectionState<TTarget, TEvent>;
112
- conditions: ConditionsState;
113
- runtime: RuntimeState;
114
- notify: NotifyState;
115
- }
116
70
  export declare function createKeymapState<TTarget extends object, TEvent extends KeymapEvent>(): State<TTarget, TEvent>;
@@ -1,5 +1,5 @@
1
1
  import type { KeyEvent, Renderable } from "@opentui/core";
2
- import { type Keymap, type LayerFields, type ReactiveMatcher } from "../index.js";
2
+ import { type Keymap, type Layer, type ReactiveMatcher, type TargetMode } from "../index.js";
3
3
  import { type Accessor, type JSX } from "solid-js";
4
4
  type OpenTuiKeymap = Keymap<Renderable, KeyEvent>;
5
5
  export interface KeymapProviderProps {
@@ -8,31 +8,17 @@ export interface KeymapProviderProps {
8
8
  }
9
9
  export declare function KeymapProvider(props: KeymapProviderProps): JSX.Element;
10
10
  export type UseBindingsTarget<TRenderable extends Renderable = Renderable> = () => TRenderable | null | undefined;
11
- type UseBindingsLayerBase = LayerFields<Renderable, KeyEvent>;
12
- export interface UseGlobalBindingsLayer extends UseBindingsLayerBase {
13
- target?: undefined;
11
+ export interface UseBindingsLayer<TRenderable extends Renderable = Renderable> extends Omit<Layer<Renderable, KeyEvent>, "target" | "targetMode"> {
12
+ target?: UseBindingsTarget<TRenderable>;
13
+ targetMode?: TargetMode;
14
14
  }
15
- export interface UseFocusBindingsLayer<TRenderable extends Renderable = Renderable> extends UseBindingsLayerBase {
16
- targetMode: "focus";
17
- target: UseBindingsTarget<TRenderable>;
18
- }
19
- export interface UseFocusWithinBindingsLayer<TRenderable extends Renderable = Renderable> extends UseBindingsLayerBase {
20
- targetMode?: "focus-within";
21
- target: UseBindingsTarget<TRenderable>;
22
- }
23
- export interface UseInferredFocusWithinBindingsLayer<TRenderable extends Renderable = Renderable> extends UseBindingsLayerBase {
24
- target: UseBindingsTarget<TRenderable>;
25
- }
26
- export type UseTargetBindingsLayer<TRenderable extends Renderable = Renderable> = UseFocusBindingsLayer<TRenderable> | UseFocusWithinBindingsLayer<TRenderable> | UseInferredFocusWithinBindingsLayer<TRenderable>;
27
- export type UseBindingsLayer<TRenderable extends Renderable = Renderable> = UseGlobalBindingsLayer | UseTargetBindingsLayer<TRenderable>;
28
15
  export declare const useKeymap: () => OpenTuiKeymap;
29
16
  /**
30
17
  * Reactively derives any view from the current keymap by re-running `selector`
31
18
  * on each batched keymap state change.
32
19
  */
33
20
  export declare const useKeymapSelector: <T>(selector: (keymap: OpenTuiKeymap) => T) => Accessor<T>;
34
- export declare function useBindings<TRenderable extends Renderable = Renderable>(createLayer: () => UseGlobalBindingsLayer): void;
35
- export declare function useBindings<TRenderable extends Renderable = Renderable>(createLayer: () => UseTargetBindingsLayer<TRenderable>): void;
21
+ export declare function useBindings<TRenderable extends Renderable = Renderable>(createLayer: () => UseBindingsLayer<TRenderable>): void;
36
22
  /**
37
23
  * Adapts a Solid accessor to `ReactiveMatcher`. The subscription
38
24
  * lives in a disposable reactive root so unregistering the layer tears it
@@ -115,3 +115,6 @@ export {
115
115
  reactiveMatcherFromSignal,
116
116
  KeymapProvider
117
117
  };
118
+
119
+ //# debugId=A624A2E448C2557164756E2164756E21
120
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/solid/index.ts"],
4
+ "sourcesContent": [
5
+ "import type { KeyEvent, Renderable } from \"@opentui/core\"\nimport { type Keymap, type Layer, type ReactiveMatcher, type TargetMode } from \"../index.js\"\nimport {\n createComponent,\n createContext,\n createEffect,\n createMemo,\n createRoot,\n createSignal,\n on,\n onCleanup,\n onMount,\n useContext,\n type Accessor,\n type JSX,\n} from \"solid-js\"\n\ntype OpenTuiKeymap = Keymap<Renderable, KeyEvent>\n\nconst KeymapContext = createContext<OpenTuiKeymap>()\n\nexport interface KeymapProviderProps {\n keymap: OpenTuiKeymap\n children: JSX.Element\n}\n\nexport function KeymapProvider(props: KeymapProviderProps): JSX.Element {\n return createComponent(KeymapContext.Provider, {\n get value() {\n return props.keymap\n },\n get children() {\n return props.children\n },\n })\n}\n\nexport type UseBindingsTarget<TRenderable extends Renderable = Renderable> = () => TRenderable | null | undefined\n\nexport interface UseBindingsLayer<TRenderable extends Renderable = Renderable> extends Omit<\n Layer<Renderable, KeyEvent>,\n \"target\" | \"targetMode\"\n> {\n target?: UseBindingsTarget<TRenderable>\n targetMode?: TargetMode\n}\n\nfunction resolveBindingsTarget(target: UseBindingsTarget | undefined): Renderable | undefined {\n return target?.() ?? undefined\n}\n\nexport const useKeymap = (): OpenTuiKeymap => {\n const keymap = useContext(KeymapContext)\n\n if (!keymap) {\n throw new Error(\"Keymap not found. Wrap the tree in <KeymapProvider>.\")\n }\n\n return keymap\n}\n\nfunction useKeymapStateVersion(keymap: OpenTuiKeymap): Accessor<number> {\n const [version, setVersion] = createSignal(0)\n let dispose: (() => void) | undefined\n\n onMount(() => {\n dispose = keymap.on(\"state\", () => {\n setVersion((value) => value + 1)\n })\n\n setVersion((value) => value + 1)\n })\n\n onCleanup(() => {\n dispose?.()\n })\n\n return version\n}\n\n/**\n * Reactively derives any view from the current keymap by re-running `selector`\n * on each batched keymap state change.\n */\nexport const useKeymapSelector = <T>(selector: (keymap: OpenTuiKeymap) => T): Accessor<T> => {\n const keymap = useKeymap()\n const version = useKeymapStateVersion(keymap)\n\n return createMemo((previous) => {\n version()\n try {\n return selector(keymap)\n } catch (error) {\n if (\n previous !== undefined &&\n error instanceof Error &&\n error.message === \"Cannot use a keymap after its host was destroyed\"\n ) {\n return previous\n }\n\n throw error\n }\n })\n}\n\nexport function useBindings<TRenderable extends Renderable = Renderable>(\n createLayer: () => UseBindingsLayer<TRenderable>,\n): void {\n const keymap = useKeymap()\n\n createEffect(() => {\n const layer = createLayer()\n const hasExplicitTarget = layer.target !== undefined\n const explicitTarget = resolveBindingsTarget(layer.target)\n const nextTargetMode: TargetMode | undefined = layer.targetMode ?? (hasExplicitTarget ? \"focus-within\" : undefined)\n\n const { target: _target, targetMode: _targetMode, ...baseLayer } = layer\n if (!nextTargetMode) {\n const dispose = keymap.registerLayer({\n ...baseLayer,\n })\n\n onCleanup(() => {\n dispose()\n })\n\n return\n }\n\n if (!hasExplicitTarget) {\n throw new Error(\"useBindings local bindings need a target accessor\")\n }\n\n if (!explicitTarget) {\n return\n }\n\n const dispose = keymap.registerLayer({\n ...baseLayer,\n target: explicitTarget,\n targetMode: nextTargetMode,\n })\n\n onCleanup(() => {\n dispose()\n })\n })\n}\n\n/**\n * Adapts a Solid accessor to `ReactiveMatcher`. The subscription\n * lives in a disposable reactive root so unregistering the layer tears it\n * down. Pass `predicate` when the accessor value is not already boolean.\n */\nexport function reactiveMatcherFromSignal<T>(\n accessor: Accessor<T>,\n predicate?: (value: T) => boolean,\n): ReactiveMatcher {\n return {\n get() {\n return predicate ? predicate(accessor()) : Boolean(accessor())\n },\n subscribe(onChange) {\n return createRoot((dispose) => {\n createEffect(on(accessor, () => onChange(), { defer: true }))\n return dispose\n })\n },\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "A624A2E448C2557164756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,90 @@
1
+ import { Keymap } from "@opentui/keymap";
2
+ import type { ErrorEvent, HostMetadata, KeymapEvent, KeymapHost, WarningEvent } from "@opentui/keymap";
3
+ export type TestKeyModifierOptions = Partial<Pick<KeymapEvent, "ctrl" | "shift" | "meta" | "super" | "hyper">>;
4
+ export type TestHostMetadataOptions = Partial<Omit<HostMetadata, "modifiers">> & {
5
+ modifiers?: Partial<HostMetadata["modifiers"]>;
6
+ };
7
+ export interface CreateTestKeymapHostOptions {
8
+ metadata?: HostMetadata | TestHostMetadataOptions;
9
+ }
10
+ export interface CreateTestKeymapOptions extends CreateTestKeymapHostOptions {
11
+ defaultKeys?: boolean;
12
+ }
13
+ export interface TestDiagnosticCapture {
14
+ readonly warnings: readonly string[];
15
+ readonly errors: readonly string[];
16
+ readonly warningEvents: readonly WarningEvent[];
17
+ readonly errorEvents: readonly ErrorEvent[];
18
+ takeWarnings(): {
19
+ warnings: string[];
20
+ warningEvents: WarningEvent[];
21
+ };
22
+ takeErrors(): {
23
+ errors: string[];
24
+ errorEvents: ErrorEvent[];
25
+ };
26
+ clear(): void;
27
+ dispose(): void;
28
+ }
29
+ export interface TestKeymapHarness {
30
+ keymap: Keymap<TestKeymapTarget, TestKeymapEvent>;
31
+ host: TestKeymapHost;
32
+ root: TestKeymapTarget;
33
+ diagnostics: TestDiagnosticCapture;
34
+ cleanup(): void;
35
+ }
36
+ export declare const DEFAULT_TEST_HOST_METADATA: HostMetadata;
37
+ export declare class TestKeymapTarget {
38
+ readonly id: string;
39
+ parent: TestKeymapTarget | null;
40
+ isDestroyed: boolean;
41
+ constructor(id: string);
42
+ append(child: TestKeymapTarget): TestKeymapTarget;
43
+ }
44
+ export declare class TestKeymapEvent implements KeymapEvent {
45
+ readonly name: string;
46
+ readonly ctrl: boolean;
47
+ readonly shift: boolean;
48
+ readonly meta: boolean;
49
+ readonly super: boolean;
50
+ readonly hyper?: boolean;
51
+ propagationStopped: boolean;
52
+ defaultPrevented: boolean;
53
+ constructor(name: string, modifiers?: TestKeyModifierOptions);
54
+ preventDefault(): void;
55
+ stopPropagation(): void;
56
+ }
57
+ export declare class TestKeymapHost implements KeymapHost<TestKeymapTarget, TestKeymapEvent> {
58
+ readonly metadata: HostMetadata;
59
+ readonly rootTarget: TestKeymapTarget;
60
+ isDestroyed: boolean;
61
+ private focusedTarget;
62
+ private readonly keyPressListeners;
63
+ private readonly keyReleaseListeners;
64
+ private readonly focusListeners;
65
+ private readonly destroyListeners;
66
+ private readonly rawListeners;
67
+ private readonly targetDestroyListeners;
68
+ constructor(options?: CreateTestKeymapHostOptions);
69
+ createTarget(id: string): TestKeymapTarget;
70
+ getFocusedTarget(): TestKeymapTarget | null;
71
+ getParentTarget(target: TestKeymapTarget): TestKeymapTarget | null;
72
+ isTargetDestroyed(target: TestKeymapTarget): boolean;
73
+ onKeyPress(listener: (event: TestKeymapEvent) => void): () => void;
74
+ onKeyRelease(listener: (event: TestKeymapEvent) => void): () => void;
75
+ onFocusChange(listener: (target: TestKeymapTarget | null) => void): () => void;
76
+ onDestroy(listener: () => void): () => void;
77
+ onTargetDestroy(target: TestKeymapTarget, listener: () => void): () => void;
78
+ onRawInput(listener: (sequence: string) => boolean): () => void;
79
+ createCommandEvent(): TestKeymapEvent;
80
+ focus(target: TestKeymapTarget | null): void;
81
+ press(name: string, modifiers?: TestKeyModifierOptions): TestKeymapEvent;
82
+ release(name: string, modifiers?: TestKeyModifierOptions): TestKeymapEvent;
83
+ raw(sequence: string): boolean;
84
+ destroyTarget(target: TestKeymapTarget): void;
85
+ destroy(): void;
86
+ }
87
+ export declare function createTestHostMetadata(options?: HostMetadata | TestHostMetadataOptions): HostMetadata;
88
+ export declare function createTestKeymapHost(options?: CreateTestKeymapHostOptions): TestKeymapHost;
89
+ export declare function createTestKeymap(options?: CreateTestKeymapOptions): TestKeymapHarness;
90
+ export declare function captureKeymapDiagnostics(keymap: Keymap<any, any>): TestDiagnosticCapture;