diff options
| author | cashmere <cashmere@autistici.org> | 2026-07-27 00:26:31 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-07-27 00:26:31 +0200 |
| commit | b4d8145f2adb981b462a4581bdf3bf96bc32e3d9 (patch) | |
| tree | 728d90210d573f3ac577a44edf8e6815cc05e140 /apps/web/src/actions/guards.ts | |
| parent | 607f9717ae44efe8f135b6c79ed85a583f3d2d1d (diff) | |
| download | opencut-b4d8145f2adb981b462a4581bdf3bf96bc32e3d9.tar.gz | |
fix: restore missing keybinding validation guards
persistence.ts imported isActionWithOptionalArgs and isShortcutKey,
neither of which existed at runtime — loading persisted custom
keybindings would crash. Adds actions/guards.ts (excluding required-args
actions per TActionArgsMap) and isShortcutKey in keybinding.ts; the nine
previously dead persistence tests now pass.
Diffstat (limited to 'apps/web/src/actions/guards.ts')
| -rw-r--r-- | apps/web/src/actions/guards.ts | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/apps/web/src/actions/guards.ts b/apps/web/src/actions/guards.ts new file mode 100644 index 00000000..c4fbe8a7 --- /dev/null +++ b/apps/web/src/actions/guards.ts @@ -0,0 +1,29 @@ +import { ACTIONS } from "./definitions"; +import type { TActionArgsMap, TActionWithOptionalArgs } from "./types"; + +type TActionWithRequiredArgs = { + [K in keyof TActionArgsMap]: undefined extends TActionArgsMap[K] + ? never + : K; +}[keyof TActionArgsMap]; + +/** + * Actions that require arguments cannot be bound to a shortcut key — a key + * press has no way to supply them. Keep in sync with the required (non- + * optional) members of `TActionArgsMap`; the type annotation rejects keys + * that are not actually required-args actions. + */ +const ACTIONS_WITH_REQUIRED_ARGS: readonly TActionWithRequiredArgs[] = [ + "remove-media-asset", + "remove-media-assets", +]; + +export function isActionWithOptionalArgs( + action: unknown, +): action is TActionWithOptionalArgs { + return ( + typeof action === "string" && + action in ACTIONS && + !(ACTIONS_WITH_REQUIRED_ARGS as readonly string[]).includes(action) + ); +} |
