diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-05-02 01:33:32 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-05-02 03:27:23 +0200 |
| commit | 8b8d65b5091f4158af68fbad85cc74936302b07b (patch) | |
| tree | 53c5bb4ee0ec60ed2b9d87585230014229008cea /apps/web/src/masks/registry.ts | |
| parent | 23187b0b6a9f179bdb68578fc4bdaa8414b8316d (diff) | |
| download | opencut-8b8d65b5091f4158af68fbad85cc74936302b07b.tar.gz | |
refactor: collapse mask definition registry to a single keyed registry
The freeform mask was assembled on every getMaskDefinition("freeform") call,
re-spreading params and injecting a wrong SquareIcon placeholder, with a type
cast to suppress the structural mismatch. Root cause: MasksRegistry was keyed
on BuiltinMaskType, so freeform had no entry.
- Re-key MasksRegistry from BuiltinMaskType to MaskType
- Register freeform alongside builtins in registerDefaultMasks, with
PenToolAddIcon as its menu icon
- getMaskDefinition and getMaskDefinitionsForMenu become plain registry
lookups with no branching, no manual spreading, no cast
- Rename RegisteredBuiltinMaskDefinition to RegisteredMaskDefinition and
tighten computeParamUpdate return type to Partial<BaseMaskParams>
Co-authored-by: Cursor <cursoragent@cursor.com>
Diffstat (limited to 'apps/web/src/masks/registry.ts')
| -rw-r--r-- | apps/web/src/masks/registry.ts | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/apps/web/src/masks/registry.ts b/apps/web/src/masks/registry.ts index 77861926..35d215c6 100644 --- a/apps/web/src/masks/registry.ts +++ b/apps/web/src/masks/registry.ts @@ -2,7 +2,6 @@ import { MAX_FEATHER } from "@/masks/feather"; import type { ParamDefinition } from "@/params"; import type { BaseMaskParams, - BuiltinMaskType, Mask, MaskDefaultContext, MaskDefinition, @@ -24,9 +23,9 @@ type RegisteredMaskWithoutId = Mask extends infer TMask : never : never; -export type BuiltinMaskDefinitionForRegistration = { - [TType in BuiltinMaskType]: MaskDefinition<TType>; -}[BuiltinMaskType]; +export type MaskDefinitionForRegistration = { + [TType in MaskType]: MaskDefinition<TType>; +}[MaskType]; export const BASE_MASK_PARAM_DEFINITIONS: ParamDefinition< keyof BaseMaskParams & string @@ -58,7 +57,7 @@ export const BASE_MASK_PARAM_DEFINITIONS: ParamDefinition< }, ]; -export interface RegisteredBuiltinMaskDefinition { +export interface RegisteredMaskDefinition { type: MaskType; name: string; features: MaskDefinition["features"]; @@ -69,13 +68,13 @@ export interface RegisteredBuiltinMaskDefinition { buildDefault(context: MaskDefaultContext): RegisteredMaskWithoutId; computeParamUpdate( args: MaskParamUpdateArgs<BaseMaskParams>, - ): ReturnType<MaskDefinition["computeParamUpdate"]>; + ): Partial<BaseMaskParams>; icon: MaskIconProps; } -export class BuiltinMasksRegistry extends DefinitionRegistry< - BuiltinMaskType, - RegisteredBuiltinMaskDefinition +export class MasksRegistry extends DefinitionRegistry< + MaskType, + RegisteredMaskDefinition > { constructor() { super("mask"); @@ -85,10 +84,10 @@ export class BuiltinMasksRegistry extends DefinitionRegistry< definition, icon, }: { - definition: BuiltinMaskDefinitionForRegistration; + definition: MaskDefinitionForRegistration; icon: MaskIconProps; }): void { - const withBaseParams: RegisteredBuiltinMaskDefinition = { + const withBaseParams: RegisteredMaskDefinition = { type: definition.type, name: definition.name, features: definition.features, @@ -107,4 +106,4 @@ export class BuiltinMasksRegistry extends DefinitionRegistry< } } -export const builtinMasksRegistry = new BuiltinMasksRegistry(); +export const masksRegistry = new MasksRegistry(); |
