From 8b8d65b5091f4158af68fbad85cc74936302b07b Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Sat, 2 May 2026 01:33:32 +0200 Subject: 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 Co-authored-by: Cursor --- apps/web/src/masks/registry.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) (limited to 'apps/web/src/masks/registry.ts') 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; -}[BuiltinMaskType]; +export type MaskDefinitionForRegistration = { + [TType in MaskType]: MaskDefinition; +}[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, - ): ReturnType; + ): Partial; 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(); -- cgit v1.3.1