summaryrefslogtreecommitdiff
path: root/apps/web/src/actions/guards.ts
diff options
context:
space:
mode:
authorcashmere <cashmere@autistici.org>2026-07-27 00:26:31 +0200
committercashmere <cashmere@autistici.org>2026-07-27 00:26:31 +0200
commitb4d8145f2adb981b462a4581bdf3bf96bc32e3d9 (patch)
tree728d90210d573f3ac577a44edf8e6815cc05e140 /apps/web/src/actions/guards.ts
parent607f9717ae44efe8f135b6c79ed85a583f3d2d1d (diff)
downloadopencut-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.ts29
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)
+ );
+}