From 2ca903843532b62feb75df6ca9c993f8e3649d09 Mon Sep 17 00:00:00 2001 From: Jongsun Suh Date: Thu, 1 Aug 2024 11:34:04 -0400 Subject: [PATCH] Implement better state metadata constraint types --- .../src/ComposableController.ts | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/composable-controller/src/ComposableController.ts b/packages/composable-controller/src/ComposableController.ts index 8d3b4e60e48..684dffdda9b 100644 --- a/packages/composable-controller/src/ComposableController.ts +++ b/packages/composable-controller/src/ComposableController.ts @@ -10,7 +10,7 @@ import type { ControllerStateChangeEvent, } from '@metamask/base-controller'; import { BaseController } from '@metamask/base-controller'; -import type { PublicInterface } from '@metamask/utils'; +import type { Json, PublicInterface } from '@metamask/utils'; import type { Patch } from 'immer'; export const controllerName = 'ComposableController'; @@ -39,6 +39,23 @@ type BaseControllerV1Instance = PublicInterface< BaseControllerV1 >; +/** + * A universal supertype of functions that accept a piece of controller state and return some derivation of that state. + */ +type StateDeriverConstraint = (value: never) => Json; + +/** + * A universal supertype of metadata objects for individual state properties. + */ +type StatePropertyMetadataConstraint = { + [P in 'anonymous' | 'persist']: boolean | StateDeriverConstraint; +}; + +/** + * A universal supertype of state metadata objects. + */ +type StateMetadataConstraint = Record; + /** * A universal subtype of all controller instances that extend from `BaseController` (formerly `BaseControllerV2`). * Any `BaseController` instance can be assigned to this type. @@ -57,7 +74,9 @@ type BaseControllerInstance = Omit< > >, 'metadata' -> & { metadata: Record }; +> & { + metadata: StateMetadataConstraint; +}; /** * A universal subtype of all controller instances that extend from `BaseController` (formerly `BaseControllerV2`) or `BaseControllerV1`.