@metamask-previews/composable-controller 12.0.1-preview-8bfa290fb → 13.0.0-preview-97d6b86c0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,11 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [13.0.0]
11
+
10
12
  ### Changed
11
13
 
14
+ - **BREAKING:** Drop CommonJS support ([#9536](https://github.com/MetaMask/core/pull/9536))
15
+ - This package is now ESM-only, but can still be used in CommonJS projects via `require(esm)` in modern Node.js versions (22+), or dynamic imports in older Node.js versions.
16
+ - **BREAKING:** Bump minimum Node.js version to 22 ([#9976](https://github.com/MetaMask/core/pull/9976))
17
+ - **BREAKING:** Bump TypeScript target to ES2022 ([#10019](https://github.com/MetaMask/core/pull/10019))
18
+ - This package now ships ES2022 code, requiring a compatible modern environment or bundler configuration to consume.
12
19
  - Bump `@metamask/json-rpc-engine` from `^10.2.4` to `^10.3.0` ([#8661](https://github.com/MetaMask/core/pull/8661))
13
- - Bump `@metamask/messenger` from `^1.0.0` to `^2.0.0` ([#8364](https://github.com/MetaMask/core/pull/8364), [#8373](https://github.com/MetaMask/core/pull/8373), [#8632](https://github.com/MetaMask/core/pull/8632), [#9392](https://github.com/MetaMask/core/pull/9392))
14
- - Bump `@metamask/base-controller` from `^9.0.1` to `^9.1.0` ([#8457](https://github.com/MetaMask/core/pull/8457))
20
+ - Bump `@metamask/messenger` from `^1.0.0` to `^3.0.0` ([#8364](https://github.com/MetaMask/core/pull/8364), [#8373](https://github.com/MetaMask/core/pull/8373), [#8632](https://github.com/MetaMask/core/pull/8632), [#9392](https://github.com/MetaMask/core/pull/9392), [#10160](https://github.com/MetaMask/core/pull/10160))
21
+ - Bump `@metamask/base-controller` from `^9.0.1` to `^10.0.0` ([#8457](https://github.com/MetaMask/core/pull/8457), [#10160](https://github.com/MetaMask/core/pull/10160))
15
22
 
16
23
  ## [12.0.1]
17
24
 
@@ -48,16 +55,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
48
55
 
49
56
  ### Changed
50
57
 
51
- - Bump `@metamask/base-controller` from `^8.0.0` to `^8.4.1` ([#5722](https://github.com/MetaMask/core/pull/5722), [#6284](https://github.com/MetaMask/core/pull/6284), [#6355](https://github.com/MetaMask/core/pull/6355), [#6465](https://github.com/MetaMask/core/pull/6465), [#6632](https://github.com/MetaMask/core/pull/6632),[#6807](https://github.com/MetaMask/core/pull/6807))
58
+ - Bump `@metamask/base-controller` from `^8.0.0` to `^8.4.1` ([#5722](https://github.com/MetaMask/core/pull/5722), [#6284](https://github.com/MetaMask/core/pull/6284), [#6355](https://github.com/MetaMask/core/pull/6355), [#6465](https://github.com/MetaMask/core/pull/6465), [#6632](https://github.com/MetaMask/core/pull/6632), [#6807](https://github.com/MetaMask/core/pull/6807))
52
59
 
53
60
  ## [11.0.0]
54
61
 
55
62
  ### Changed
56
63
 
57
- - **BREAKING:** Re-define `ComposableControllerStateConstraint` type using `StateConstraint` instead of `LegacyControllerStateConstraint` ([#5018](https://github.com/MetaMask/core/pull/5018/))
58
- - **BREAKING:** Constrain the `ComposableControllerState` generic argument for the `ComposableController` class using `ComposableControllerStateConstraint` instead of `LegacyComposableControllerStateConstraint` ([#5018](https://github.com/MetaMask/core/pull/5018/))
59
- - Bump `@metamask/base-controller` from `^7.0.2` to `^8.0.0` ([#5079](https://github.com/MetaMask/core/pull/5079)), ([#5135](https://github.com/MetaMask/core/pull/5135)), ([#5305](https://github.com/MetaMask/core/pull/5305))
60
- - Bump `@metamask/json-rpc-engine` from `^10.0.1` to `^10.0.3` ([#5082](https://github.com/MetaMask/core/pull/5082)), ([#5272](https://github.com/MetaMask/core/pull/5272))
64
+ - **BREAKING:** Re-define `ComposableControllerStateConstraint` type using `StateConstraint` instead of `LegacyControllerStateConstraint` ([#5018](https://github.com/MetaMask/core/pull/5018))
65
+ - **BREAKING:** Constrain the `ComposableControllerState` generic argument for the `ComposableController` class using `ComposableControllerStateConstraint` instead of `LegacyComposableControllerStateConstraint` ([#5018](https://github.com/MetaMask/core/pull/5018))
66
+ - Bump `@metamask/base-controller` from `^7.0.2` to `^8.0.0` ([#5079](https://github.com/MetaMask/core/pull/5079), [#5135](https://github.com/MetaMask/core/pull/5135), [#5305](https://github.com/MetaMask/core/pull/5305))
67
+ - Bump `@metamask/json-rpc-engine` from `^10.0.1` to `^10.0.3` ([#5082](https://github.com/MetaMask/core/pull/5082), [#5272](https://github.com/MetaMask/core/pull/5272))
61
68
 
62
69
  ## [10.0.0]
63
70
 
@@ -84,7 +91,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
84
91
  ["Are the Types Wrong?"](https://arethetypeswrong.github.io/) tool as
85
92
  ["masquerading as CJS"](https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/FalseCJS.md).
86
93
  All of the ATTW checks now pass.
87
- - Remove chunk files ([#4648](https://github.com/MetaMask/core/pull/4648)).
94
+ - Remove chunk files. ([#4648](https://github.com/MetaMask/core/pull/4648))
88
95
  - Previously, the build tool we used to generate JavaScript files extracted
89
96
  common code to "chunk" files. While this was intended to make this package
90
97
  more tree-shakeable, it also made debugging more difficult for our
@@ -143,9 +150,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
143
150
 
144
151
  ### Changed
145
152
 
146
- - **BREAKING:** The `ComposableController` class is now a generic class that expects one generic argument `ComposableControllerState` ([#3952](https://github.com/MetaMask/core/pull/3952)).
153
+ - **BREAKING:** The `ComposableController` class is now a generic class that expects one generic argument `ComposableControllerState`. ([#3952](https://github.com/MetaMask/core/pull/3952))
147
154
  - **BREAKING:** For the `ComposableController` class to be typed correctly, any of its child controllers that extend `BaseControllerV1` must have an overridden `name` property that is defined using the `as const` assertion.
148
- - **BREAKING:** The types `ComposableControllerStateChangeEvent`, `ComposableControllerEvents`, `ComposableControllerMessenger` are now generic types that expect one generic argument `ComposableControllerState` ([#3952](https://github.com/MetaMask/core/pull/3952)).
155
+ - **BREAKING:** The types `ComposableControllerStateChangeEvent`, `ComposableControllerEvents`, `ComposableControllerMessenger` are now generic types that expect one generic argument `ComposableControllerState`. ([#3952](https://github.com/MetaMask/core/pull/3952))
149
156
  - Bump `@metamask/json-rpc-engine` to `^8.0.2` ([#4234](https://github.com/MetaMask/core/pull/4234))
150
157
  - Bump `@metamask/base-controller` to `^5.0.2` ([#4232](https://github.com/MetaMask/core/pull/4232))
151
158
 
@@ -262,7 +269,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
262
269
 
263
270
  All changes listed after this point were applied to this package following the monorepo conversion.
264
271
 
265
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/composable-controller@12.0.1...HEAD
272
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/composable-controller@13.0.0...HEAD
273
+ [13.0.0]: https://github.com/MetaMask/core/compare/@metamask/composable-controller@12.0.1...@metamask/composable-controller@13.0.0
266
274
  [12.0.1]: https://github.com/MetaMask/core/compare/@metamask/composable-controller@12.0.0...@metamask/composable-controller@12.0.1
267
275
  [12.0.0]: https://github.com/MetaMask/core/compare/@metamask/composable-controller@11.1.1...@metamask/composable-controller@12.0.0
268
276
  [11.1.1]: https://github.com/MetaMask/core/compare/@metamask/composable-controller@11.1.0...@metamask/composable-controller@11.1.1
@@ -1,6 +1,6 @@
1
- import type { StateConstraint, ControllerStateChangeEvent, ControllerGetStateAction, BaseControllerInstance as ControllerInstance } from "@metamask/base-controller";
2
- import { BaseController } from "@metamask/base-controller";
3
- import type { Messenger } from "@metamask/messenger";
1
+ import type { StateConstraint, ControllerStateChangeEvent, ControllerGetStateAction, BaseControllerInstance as ControllerInstance } from '@metamask/base-controller';
2
+ import { BaseController } from '@metamask/base-controller';
3
+ import type { Messenger } from '@metamask/messenger';
4
4
  export declare const controllerName = "ComposableController";
5
5
  export declare const INVALID_CONTROLLER_ERROR = "Invalid controller: controller must inherit from `BaseController`.";
6
6
  /**
@@ -73,4 +73,4 @@ export declare class ComposableController<ComposableControllerState extends Comp
73
73
  });
74
74
  }
75
75
  export default ComposableController;
76
- //# sourceMappingURL=ComposableController.d.mts.map
76
+ //# sourceMappingURL=ComposableController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposableController.d.ts","sourceRoot":"","sources":["../src/ComposableController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,IAAI,kBAAkB,EAC7C,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD,eAAO,MAAM,wBAAwB,uEACiC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,kCAAkC,CAC5C,yBAAyB,SAAS,mCAAmC,IACnE,wBAAwB,CAAC,OAAO,cAAc,EAAE,yBAAyB,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,MAAM,oCAAoC,CAC9C,yBAAyB,SAAS,mCAAmC,IACnE,0BAA0B,CAC5B,OAAO,cAAc,EACrB,yBAAyB,CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CACpC,yBAAyB,SAAS,mCAAmC,IACnE,oCAAoC,CAAC,yBAAyB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,CACrC,yBAAyB,SAAS,mCAAmC,IACnE,kCAAkC,CAAC,yBAAyB,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,MAAM,gCAAgC,CAC1C,yBAAyB,SAAS,mCAAmC,IAErE,yBAAyB,SAAS,MAAM,CACtC,MAAM,mBAAmB,SAAS,MAAM,EACxC,MAAM,oBAAoB,SAAS,eAAe,CACnD,GACG,0BAA0B,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,GACrE,KAAK,CAAC;AAEZ;;;;GAIG;AACH,MAAM,MAAM,aAAa,CACvB,yBAAyB,SAAS,mCAAmC,IACnE,gCAAgC,CAAC,yBAAyB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CACvC,yBAAyB,SAAS,mCAAmC,IACnE,SAAS,CACX,OAAO,cAAc,EACrB,2BAA2B,CAAC,yBAAyB,CAAC,EACpD,0BAA0B,CAAC,yBAAyB,CAAC,GACrD,aAAa,CAAC,yBAAyB,CAAC,CAC3C,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,oBAAoB,CAC/B,yBAAyB,SAAS,mCAAmC,EACrE,mBAAmB,SAAS,MAAM,CAChC,MAAM,yBAAyB,EAC/B,kBAAkB,CACnB,CACD,SAAQ,cAAc,CACtB,OAAO,cAAc,EACrB,yBAAyB,EACzB,6BAA6B,CAAC,yBAAyB,CAAC,CACzD;;IACC;;;;;;OAMG;IACH,YAAY,EACV,WAAW,EACX,SAAS,GACV,EAAE;QACD,WAAW,EAAE,mBAAmB,CAAC;QACjC,SAAS,EAAE,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;KACrE,EAmCA;CAiCF;eAuBc,oBAAoB"}
@@ -1,10 +1,4 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
- var _ComposableController_instances, _ComposableController_updateChildController;
7
- import { BaseController } from "@metamask/base-controller";
1
+ import { BaseController } from '@metamask/base-controller';
8
2
  export const controllerName = 'ComposableController';
9
3
  export const INVALID_CONTROLLER_ERROR = 'Invalid controller: controller must inherit from `BaseController`.';
10
4
  /**
@@ -46,36 +40,39 @@ export class ComposableController extends BaseController {
46
40
  }, {}),
47
41
  messenger,
48
42
  });
49
- _ComposableController_instances.add(this);
50
43
  Object.values(controllers).forEach((controller) => {
51
- __classPrivateFieldGet(this, _ComposableController_instances, "m", _ComposableController_updateChildController).call(this, controller);
44
+ this.#updateChildController(controller);
52
45
  });
53
46
  }
54
- }
55
- _ComposableController_instances = new WeakSet(), _ComposableController_updateChildController = function _ComposableController_updateChildController(controller) {
56
- const { name } = controller;
57
- if (!isBaseController(controller)) {
58
- try {
59
- delete this.metadata[name];
60
- delete this.state[name];
61
- // eslint-disable-next-line no-empty
47
+ /**
48
+ * Constructor helper that subscribes to child controller state changes.
49
+ *
50
+ * @param controller - Controller instance to update
51
+ */
52
+ #updateChildController(controller) {
53
+ const { name } = controller;
54
+ if (!isBaseController(controller)) {
55
+ try {
56
+ delete this.metadata[name];
57
+ delete this.state[name];
58
+ // eslint-disable-next-line no-empty
59
+ }
60
+ catch { }
61
+ throw new Error(`${name} - ${INVALID_CONTROLLER_ERROR}`);
62
62
  }
63
- catch { }
64
- throw new Error(`${name} - ${INVALID_CONTROLLER_ERROR}`);
65
- }
66
- try {
67
- this.messenger.subscribe(`${name}:stateChange`, (childState) => {
68
- this.update((state) => {
69
- // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.
70
- // @ts-expect-error "Type instantiation is excessively deep"
71
- state[name] = childState;
63
+ try {
64
+ this.messenger.subscribe(`${name}:stateChange`, (childState) => {
65
+ this.update((state) => {
66
+ // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.
67
+ state[name] = childState;
68
+ });
72
69
  });
73
- });
74
- }
75
- catch (error) {
76
- console.error(`${name} - ${String(error)}`);
70
+ }
71
+ catch (error) {
72
+ console.error(`${name} - ${String(error)}`);
73
+ }
77
74
  }
78
- };
75
+ }
79
76
  /**
80
77
  * Determines if the given controller is an instance of `BaseController`
81
78
  *
@@ -93,4 +90,4 @@ function isBaseController(controller) {
93
90
  typeof controller.metadata === 'object');
94
91
  }
95
92
  export default ComposableController;
96
- //# sourceMappingURL=ComposableController.mjs.map
93
+ //# sourceMappingURL=ComposableController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComposableController.js","sourceRoot":"","sources":["../src/ComposableController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateConstraint,\n StateMetadata,\n StateMetadataConstraint,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n BaseControllerInstance as ControllerInstance,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nexport const controllerName = 'ComposableController';\n\nexport const INVALID_CONTROLLER_ERROR =\n 'Invalid controller: controller must inherit from `BaseController`.';\n\n/**\n * The narrowest supertype for the composable controller state object.\n */\nexport type ComposableControllerStateConstraint = {\n [controllerName: string]: StateConstraint;\n};\n\n/**\n * The `getState` action type for the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerGetStateAction<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ControllerGetStateAction<typeof controllerName, ComposableControllerState>;\n\n/**\n * The `stateChange` event type for the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerStateChangeEvent<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ControllerStateChangeEvent<\n typeof controllerName,\n ComposableControllerState\n>;\n\n/**\n * A union type of internal event types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ComposableControllerStateChangeEvent<ComposableControllerState>;\n\n/**\n * A union type of action types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerActions<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ComposableControllerGetStateAction<ComposableControllerState>;\n\n/**\n * A utility type that extracts controllers from the {@link ComposableControllerState} type,\n * and derives a union type of all of their corresponding `stateChange` events.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ChildControllerStateChangeEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> =\n ComposableControllerState extends Record<\n infer ChildControllerName extends string,\n infer ChildControllerState extends StateConstraint\n >\n ? ControllerStateChangeEvent<ChildControllerName, ChildControllerState>\n : never;\n\n/**\n * A union type of external event types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type AllowedEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ChildControllerStateChangeEvents<ComposableControllerState>;\n\n/**\n * The messenger of the {@link ComposableController}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerMessenger<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = Messenger<\n typeof controllerName,\n ComposableControllerActions<ComposableControllerState>,\n | ComposableControllerEvents<ComposableControllerState>\n | AllowedEvents<ComposableControllerState>\n>;\n\n/**\n * Controller that composes multiple child controllers and maintains up-to-date composed state.\n *\n * @template ComposableControllerState - A type object containing the names and state types of the child controllers.\n * @template ChildControllersMap - A type object that specifies the child controllers which are used to instantiate the {@link ComposableController}.\n */\nexport class ComposableController<\n ComposableControllerState extends ComposableControllerStateConstraint,\n ChildControllersMap extends Record<\n keyof ComposableControllerState,\n ControllerInstance\n >,\n> extends BaseController<\n typeof controllerName,\n ComposableControllerState,\n ComposableControllerMessenger<ComposableControllerState>\n> {\n /**\n * Creates a ComposableController instance.\n *\n * @param options - Initial options used to configure this controller\n * @param options.controllers - An object that contains child controllers keyed by their names.\n * @param options.messenger - A controller messenger.\n */\n constructor({\n controllers,\n messenger,\n }: {\n controllers: ChildControllersMap;\n messenger: ComposableControllerMessenger<ComposableControllerState>;\n }) {\n if (messenger === undefined) {\n throw new Error(`Messaging system is required`);\n }\n\n super({\n name: controllerName,\n // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.\n metadata: Object.keys(controllers).reduce<\n StateMetadata<ComposableControllerState>\n >((metadata, name) => {\n (metadata as StateMetadataConstraint)[name] = {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n };\n return metadata;\n }, {} as never),\n // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.\n state: Object.values(controllers).reduce<ComposableControllerState>(\n (state, controller) => {\n // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.\n (state as ComposableControllerStateConstraint)[controller.name] =\n controller.state;\n return state;\n },\n {} as never,\n ),\n messenger,\n });\n\n Object.values(controllers).forEach((controller) => {\n this.#updateChildController(controller);\n });\n }\n\n /**\n * Constructor helper that subscribes to child controller state changes.\n *\n * @param controller - Controller instance to update\n */\n #updateChildController(controller: ControllerInstance): void {\n const { name } = controller;\n if (!isBaseController(controller)) {\n try {\n delete this.metadata[name];\n delete this.state[name];\n // eslint-disable-next-line no-empty\n } catch {}\n throw new Error(`${name} - ${INVALID_CONTROLLER_ERROR}`);\n }\n try {\n this.messenger.subscribe<\n // The type intersection with \"ComposableController:stateChange\" is added by one of the `Messenger.subscribe` overloads, but that constraint is unnecessary here,\n // since this method only subscribes the messenger to child controller `stateChange` events.\n // @ts-expect-error \"Type '`${string}:stateChange`' is not assignable to parameter of type '\"ComposableController:stateChange\" & ChildControllerStateChangeEvents<ComposableControllerState>[\"type\"]'.\"\n ChildControllerStateChangeEvents<ComposableControllerState>['type']\n >(`${name}:stateChange`, (childState: StateConstraint) => {\n this.update((state) => {\n // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.\n (state as ComposableControllerStateConstraint)[name] = childState;\n });\n });\n } catch (error: unknown) {\n console.error(`${name} - ${String(error)}`);\n }\n }\n}\n\n/**\n * Determines if the given controller is an instance of `BaseController`\n *\n * @param controller - Controller instance to check\n * @returns True if the controller is an instance of `BaseController`\n */\nfunction isBaseController(\n controller: unknown,\n): controller is ControllerInstance {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n 'name' in controller &&\n typeof controller.name === 'string' &&\n 'state' in controller &&\n typeof controller.state === 'object' &&\n 'metadata' in controller &&\n typeof controller.metadata === 'object'\n );\n}\n\nexport default ComposableController;\n"]}
@@ -0,0 +1,3 @@
1
+ export type { ComposableControllerStateConstraint, ComposableControllerStateChangeEvent, ComposableControllerEvents, ComposableControllerMessenger, } from './ComposableController.js';
2
+ export { ComposableController } from './ComposableController.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mCAAmC,EACnC,oCAAoC,EACpC,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ComposableController } from './ComposableController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC","sourcesContent":["export type {\n ComposableControllerStateConstraint,\n ComposableControllerStateChangeEvent,\n ComposableControllerEvents,\n ComposableControllerMessenger,\n} from './ComposableController.js';\nexport { ComposableController } from './ComposableController.js';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/composable-controller",
3
- "version": "12.0.1-preview-8bfa290fb",
3
+ "version": "13.0.0-preview-97d6b86c0",
4
4
  "description": "Consolidates the state from multiple controllers into one",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -18,19 +18,12 @@
18
18
  "files": [
19
19
  "dist/"
20
20
  ],
21
+ "type": "module",
21
22
  "sideEffects": false,
22
- "main": "./dist/index.cjs",
23
- "types": "./dist/index.d.cts",
24
23
  "exports": {
25
24
  ".": {
26
- "import": {
27
- "types": "./dist/index.d.mts",
28
- "default": "./dist/index.mjs"
29
- },
30
- "require": {
31
- "types": "./dist/index.d.cts",
32
- "default": "./dist/index.cjs"
33
- }
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.js"
34
27
  },
35
28
  "./package.json": "./package.json"
36
29
  },
@@ -39,9 +32,11 @@
39
32
  "registry": "https://registry.npmjs.org/"
40
33
  },
41
34
  "scripts": {
42
- "build": "ts-bridge --project tsconfig.build.json --verbose --clean --no-references",
43
- "build:all": "ts-bridge --project tsconfig.build.json --verbose --clean",
35
+ "build": "tsc --project tsconfig.build.json",
36
+ "build:all": "tsc --build tsconfig.build.json --verbose",
37
+ "build:clean": "yarn build:only-clean && yarn build",
44
38
  "build:docs": "typedoc",
39
+ "build:only-clean": "rimraf './dist' './tsconfig.build.tsbuildinfo'",
45
40
  "changelog:update": "../../scripts/update-changelog.sh @metamask/composable-controller",
46
41
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/composable-controller",
47
42
  "lint:tsconfigs": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts",
@@ -53,24 +48,25 @@
53
48
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
54
49
  },
55
50
  "dependencies": {
56
- "@metamask/base-controller": "^9.1.0",
57
- "@metamask/messenger": "^2.0.0"
51
+ "@metamask/base-controller": "^10.0.0",
52
+ "@metamask/messenger": "^3.0.0"
58
53
  },
59
54
  "devDependencies": {
60
55
  "@metamask/auto-changelog": "^6.1.0",
61
- "@metamask/json-rpc-engine": "^10.5.0",
62
- "@ts-bridge/cli": "^0.6.4",
56
+ "@metamask/json-rpc-engine": "^11.0.0",
63
57
  "@types/jest": "^30.0.0",
58
+ "@typescript/native": "npm:typescript@^7.0.2",
64
59
  "deepmerge": "^4.2.2",
65
60
  "immer": "^9.0.6",
66
61
  "jest": "^30.4.2",
62
+ "rimraf": "^5.0.5",
67
63
  "ts-jest": "^29.4.11",
68
64
  "tsx": "^4.20.5",
69
65
  "typedoc": "^0.25.13",
70
66
  "typedoc-plugin-missing-exports": "^2.0.0",
71
- "typescript": "~5.3.3"
67
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
72
68
  },
73
69
  "engines": {
74
- "node": "^18.18 || >=20"
70
+ "node": "^22.14.0 || ^24"
75
71
  }
76
72
  }
@@ -1,100 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var _ComposableController_instances, _ComposableController_updateChildController;
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ComposableController = exports.INVALID_CONTROLLER_ERROR = exports.controllerName = void 0;
10
- const base_controller_1 = require("@metamask/base-controller");
11
- exports.controllerName = 'ComposableController';
12
- exports.INVALID_CONTROLLER_ERROR = 'Invalid controller: controller must inherit from `BaseController`.';
13
- /**
14
- * Controller that composes multiple child controllers and maintains up-to-date composed state.
15
- *
16
- * @template ComposableControllerState - A type object containing the names and state types of the child controllers.
17
- * @template ChildControllersMap - A type object that specifies the child controllers which are used to instantiate the {@link ComposableController}.
18
- */
19
- class ComposableController extends base_controller_1.BaseController {
20
- /**
21
- * Creates a ComposableController instance.
22
- *
23
- * @param options - Initial options used to configure this controller
24
- * @param options.controllers - An object that contains child controllers keyed by their names.
25
- * @param options.messenger - A controller messenger.
26
- */
27
- constructor({ controllers, messenger, }) {
28
- if (messenger === undefined) {
29
- throw new Error(`Messaging system is required`);
30
- }
31
- super({
32
- name: exports.controllerName,
33
- // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.
34
- metadata: Object.keys(controllers).reduce((metadata, name) => {
35
- metadata[name] = {
36
- includeInStateLogs: false,
37
- persist: true,
38
- includeInDebugSnapshot: true,
39
- usedInUi: false,
40
- };
41
- return metadata;
42
- }, {}),
43
- // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.
44
- state: Object.values(controllers).reduce((state, controller) => {
45
- // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.
46
- state[controller.name] =
47
- controller.state;
48
- return state;
49
- }, {}),
50
- messenger,
51
- });
52
- _ComposableController_instances.add(this);
53
- Object.values(controllers).forEach((controller) => {
54
- __classPrivateFieldGet(this, _ComposableController_instances, "m", _ComposableController_updateChildController).call(this, controller);
55
- });
56
- }
57
- }
58
- exports.ComposableController = ComposableController;
59
- _ComposableController_instances = new WeakSet(), _ComposableController_updateChildController = function _ComposableController_updateChildController(controller) {
60
- const { name } = controller;
61
- if (!isBaseController(controller)) {
62
- try {
63
- delete this.metadata[name];
64
- delete this.state[name];
65
- // eslint-disable-next-line no-empty
66
- }
67
- catch { }
68
- throw new Error(`${name} - ${exports.INVALID_CONTROLLER_ERROR}`);
69
- }
70
- try {
71
- this.messenger.subscribe(`${name}:stateChange`, (childState) => {
72
- this.update((state) => {
73
- // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.
74
- // @ts-expect-error "Type instantiation is excessively deep"
75
- state[name] = childState;
76
- });
77
- });
78
- }
79
- catch (error) {
80
- console.error(`${name} - ${String(error)}`);
81
- }
82
- };
83
- /**
84
- * Determines if the given controller is an instance of `BaseController`
85
- *
86
- * @param controller - Controller instance to check
87
- * @returns True if the controller is an instance of `BaseController`
88
- */
89
- function isBaseController(controller) {
90
- return (typeof controller === 'object' &&
91
- controller !== null &&
92
- 'name' in controller &&
93
- typeof controller.name === 'string' &&
94
- 'state' in controller &&
95
- typeof controller.state === 'object' &&
96
- 'metadata' in controller &&
97
- typeof controller.metadata === 'object');
98
- }
99
- exports.default = ComposableController;
100
- //# sourceMappingURL=ComposableController.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComposableController.cjs","sourceRoot":"","sources":["../src/ComposableController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateConstraint,\n StateMetadata,\n StateMetadataConstraint,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n BaseControllerInstance as ControllerInstance,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nexport const controllerName = 'ComposableController';\n\nexport const INVALID_CONTROLLER_ERROR =\n 'Invalid controller: controller must inherit from `BaseController`.';\n\n/**\n * The narrowest supertype for the composable controller state object.\n */\nexport type ComposableControllerStateConstraint = {\n [controllerName: string]: StateConstraint;\n};\n\n/**\n * The `getState` action type for the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerGetStateAction<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ControllerGetStateAction<typeof controllerName, ComposableControllerState>;\n\n/**\n * The `stateChange` event type for the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerStateChangeEvent<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ControllerStateChangeEvent<\n typeof controllerName,\n ComposableControllerState\n>;\n\n/**\n * A union type of internal event types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ComposableControllerStateChangeEvent<ComposableControllerState>;\n\n/**\n * A union type of action types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerActions<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ComposableControllerGetStateAction<ComposableControllerState>;\n\n/**\n * A utility type that extracts controllers from the {@link ComposableControllerState} type,\n * and derives a union type of all of their corresponding `stateChange` events.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ChildControllerStateChangeEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> =\n ComposableControllerState extends Record<\n infer ChildControllerName extends string,\n infer ChildControllerState extends StateConstraint\n >\n ? ControllerStateChangeEvent<ChildControllerName, ChildControllerState>\n : never;\n\n/**\n * A union type of external event types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type AllowedEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ChildControllerStateChangeEvents<ComposableControllerState>;\n\n/**\n * The messenger of the {@link ComposableController}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerMessenger<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = Messenger<\n typeof controllerName,\n ComposableControllerActions<ComposableControllerState>,\n | ComposableControllerEvents<ComposableControllerState>\n | AllowedEvents<ComposableControllerState>\n>;\n\n/**\n * Controller that composes multiple child controllers and maintains up-to-date composed state.\n *\n * @template ComposableControllerState - A type object containing the names and state types of the child controllers.\n * @template ChildControllersMap - A type object that specifies the child controllers which are used to instantiate the {@link ComposableController}.\n */\nexport class ComposableController<\n ComposableControllerState extends ComposableControllerStateConstraint,\n ChildControllersMap extends Record<\n keyof ComposableControllerState,\n ControllerInstance\n >,\n> extends BaseController<\n typeof controllerName,\n ComposableControllerState,\n ComposableControllerMessenger<ComposableControllerState>\n> {\n /**\n * Creates a ComposableController instance.\n *\n * @param options - Initial options used to configure this controller\n * @param options.controllers - An object that contains child controllers keyed by their names.\n * @param options.messenger - A controller messenger.\n */\n constructor({\n controllers,\n messenger,\n }: {\n controllers: ChildControllersMap;\n messenger: ComposableControllerMessenger<ComposableControllerState>;\n }) {\n if (messenger === undefined) {\n throw new Error(`Messaging system is required`);\n }\n\n super({\n name: controllerName,\n // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.\n metadata: Object.keys(controllers).reduce<\n StateMetadata<ComposableControllerState>\n >((metadata, name) => {\n (metadata as StateMetadataConstraint)[name] = {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n };\n return metadata;\n }, {} as never),\n // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.\n state: Object.values(controllers).reduce<ComposableControllerState>(\n (state, controller) => {\n // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.\n (state as ComposableControllerStateConstraint)[controller.name] =\n controller.state;\n return state;\n },\n {} as never,\n ),\n messenger,\n });\n\n Object.values(controllers).forEach((controller) => {\n this.#updateChildController(controller);\n });\n }\n\n /**\n * Constructor helper that subscribes to child controller state changes.\n *\n * @param controller - Controller instance to update\n */\n #updateChildController(controller: ControllerInstance): void {\n const { name } = controller;\n if (!isBaseController(controller)) {\n try {\n delete this.metadata[name];\n delete this.state[name];\n // eslint-disable-next-line no-empty\n } catch {}\n throw new Error(`${name} - ${INVALID_CONTROLLER_ERROR}`);\n }\n try {\n this.messenger.subscribe<\n // The type intersection with \"ComposableController:stateChange\" is added by one of the `Messenger.subscribe` overloads, but that constraint is unnecessary here,\n // since this method only subscribes the messenger to child controller `stateChange` events.\n // @ts-expect-error \"Type '`${string}:stateChange`' is not assignable to parameter of type '\"ComposableController:stateChange\" & ChildControllerStateChangeEvents<ComposableControllerState>[\"type\"]'.\"\n ChildControllerStateChangeEvents<ComposableControllerState>['type']\n >(`${name}:stateChange`, (childState: StateConstraint) => {\n this.update((state) => {\n // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.\n // @ts-expect-error \"Type instantiation is excessively deep\"\n (state as ComposableControllerStateConstraint)[name] = childState;\n });\n });\n } catch (error: unknown) {\n console.error(`${name} - ${String(error)}`);\n }\n }\n}\n\n/**\n * Determines if the given controller is an instance of `BaseController`\n *\n * @param controller - Controller instance to check\n * @returns True if the controller is an instance of `BaseController`\n */\nfunction isBaseController(\n controller: unknown,\n): controller is ControllerInstance {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n 'name' in controller &&\n typeof controller.name === 'string' &&\n 'state' in controller &&\n typeof controller.state === 'object' &&\n 'metadata' in controller &&\n typeof controller.metadata === 'object'\n );\n}\n\nexport default ComposableController;\n"]}
@@ -1,76 +0,0 @@
1
- import type { StateConstraint, ControllerStateChangeEvent, ControllerGetStateAction, BaseControllerInstance as ControllerInstance } from "@metamask/base-controller";
2
- import { BaseController } from "@metamask/base-controller";
3
- import type { Messenger } from "@metamask/messenger";
4
- export declare const controllerName = "ComposableController";
5
- export declare const INVALID_CONTROLLER_ERROR = "Invalid controller: controller must inherit from `BaseController`.";
6
- /**
7
- * The narrowest supertype for the composable controller state object.
8
- */
9
- export type ComposableControllerStateConstraint = {
10
- [controllerName: string]: StateConstraint;
11
- };
12
- /**
13
- * The `getState` action type for the {@link ComposableControllerMessenger}.
14
- *
15
- * @template ComposableControllerState - A type object that maps controller names to their state types.
16
- */
17
- export type ComposableControllerGetStateAction<ComposableControllerState extends ComposableControllerStateConstraint> = ControllerGetStateAction<typeof controllerName, ComposableControllerState>;
18
- /**
19
- * The `stateChange` event type for the {@link ComposableControllerMessenger}.
20
- *
21
- * @template ComposableControllerState - A type object that maps controller names to their state types.
22
- */
23
- export type ComposableControllerStateChangeEvent<ComposableControllerState extends ComposableControllerStateConstraint> = ControllerStateChangeEvent<typeof controllerName, ComposableControllerState>;
24
- /**
25
- * A union type of internal event types available to the {@link ComposableControllerMessenger}.
26
- *
27
- * @template ComposableControllerState - A type object that maps controller names to their state types.
28
- */
29
- export type ComposableControllerEvents<ComposableControllerState extends ComposableControllerStateConstraint> = ComposableControllerStateChangeEvent<ComposableControllerState>;
30
- /**
31
- * A union type of action types available to the {@link ComposableControllerMessenger}.
32
- *
33
- * @template ComposableControllerState - A type object that maps controller names to their state types.
34
- */
35
- export type ComposableControllerActions<ComposableControllerState extends ComposableControllerStateConstraint> = ComposableControllerGetStateAction<ComposableControllerState>;
36
- /**
37
- * A utility type that extracts controllers from the {@link ComposableControllerState} type,
38
- * and derives a union type of all of their corresponding `stateChange` events.
39
- *
40
- * @template ComposableControllerState - A type object that maps controller names to their state types.
41
- */
42
- export type ChildControllerStateChangeEvents<ComposableControllerState extends ComposableControllerStateConstraint> = ComposableControllerState extends Record<infer ChildControllerName extends string, infer ChildControllerState extends StateConstraint> ? ControllerStateChangeEvent<ChildControllerName, ChildControllerState> : never;
43
- /**
44
- * A union type of external event types available to the {@link ComposableControllerMessenger}.
45
- *
46
- * @template ComposableControllerState - A type object that maps controller names to their state types.
47
- */
48
- export type AllowedEvents<ComposableControllerState extends ComposableControllerStateConstraint> = ChildControllerStateChangeEvents<ComposableControllerState>;
49
- /**
50
- * The messenger of the {@link ComposableController}.
51
- *
52
- * @template ComposableControllerState - A type object that maps controller names to their state types.
53
- */
54
- export type ComposableControllerMessenger<ComposableControllerState extends ComposableControllerStateConstraint> = Messenger<typeof controllerName, ComposableControllerActions<ComposableControllerState>, ComposableControllerEvents<ComposableControllerState> | AllowedEvents<ComposableControllerState>>;
55
- /**
56
- * Controller that composes multiple child controllers and maintains up-to-date composed state.
57
- *
58
- * @template ComposableControllerState - A type object containing the names and state types of the child controllers.
59
- * @template ChildControllersMap - A type object that specifies the child controllers which are used to instantiate the {@link ComposableController}.
60
- */
61
- export declare class ComposableController<ComposableControllerState extends ComposableControllerStateConstraint, ChildControllersMap extends Record<keyof ComposableControllerState, ControllerInstance>> extends BaseController<typeof controllerName, ComposableControllerState, ComposableControllerMessenger<ComposableControllerState>> {
62
- #private;
63
- /**
64
- * Creates a ComposableController instance.
65
- *
66
- * @param options - Initial options used to configure this controller
67
- * @param options.controllers - An object that contains child controllers keyed by their names.
68
- * @param options.messenger - A controller messenger.
69
- */
70
- constructor({ controllers, messenger, }: {
71
- controllers: ChildControllersMap;
72
- messenger: ComposableControllerMessenger<ComposableControllerState>;
73
- });
74
- }
75
- export default ComposableController;
76
- //# sourceMappingURL=ComposableController.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComposableController.d.cts","sourceRoot":"","sources":["../src/ComposableController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,IAAI,kBAAkB,EAC7C,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD,eAAO,MAAM,wBAAwB,uEACiC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,kCAAkC,CAC5C,yBAAyB,SAAS,mCAAmC,IACnE,wBAAwB,CAAC,OAAO,cAAc,EAAE,yBAAyB,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,MAAM,oCAAoC,CAC9C,yBAAyB,SAAS,mCAAmC,IACnE,0BAA0B,CAC5B,OAAO,cAAc,EACrB,yBAAyB,CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CACpC,yBAAyB,SAAS,mCAAmC,IACnE,oCAAoC,CAAC,yBAAyB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,CACrC,yBAAyB,SAAS,mCAAmC,IACnE,kCAAkC,CAAC,yBAAyB,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,MAAM,gCAAgC,CAC1C,yBAAyB,SAAS,mCAAmC,IAErE,yBAAyB,SAAS,MAAM,CACtC,MAAM,mBAAmB,SAAS,MAAM,EACxC,MAAM,oBAAoB,SAAS,eAAe,CACnD,GACG,0BAA0B,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,GACrE,KAAK,CAAC;AAEZ;;;;GAIG;AACH,MAAM,MAAM,aAAa,CACvB,yBAAyB,SAAS,mCAAmC,IACnE,gCAAgC,CAAC,yBAAyB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CACvC,yBAAyB,SAAS,mCAAmC,IACnE,SAAS,CACX,OAAO,cAAc,EACrB,2BAA2B,CAAC,yBAAyB,CAAC,EACpD,0BAA0B,CAAC,yBAAyB,CAAC,GACrD,aAAa,CAAC,yBAAyB,CAAC,CAC3C,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,oBAAoB,CAC/B,yBAAyB,SAAS,mCAAmC,EACrE,mBAAmB,SAAS,MAAM,CAChC,MAAM,yBAAyB,EAC/B,kBAAkB,CACnB,CACD,SAAQ,cAAc,CACtB,OAAO,cAAc,EACrB,yBAAyB,EACzB,6BAA6B,CAAC,yBAAyB,CAAC,CACzD;;IACC;;;;;;OAMG;gBACS,EACV,WAAW,EACX,SAAS,GACV,EAAE;QACD,WAAW,EAAE,mBAAmB,CAAC;QACjC,SAAS,EAAE,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;KACrE;CAqEF;AAuBD,eAAe,oBAAoB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComposableController.d.mts","sourceRoot":"","sources":["../src/ComposableController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,IAAI,kBAAkB,EAC7C,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAErD,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD,eAAO,MAAM,wBAAwB,uEACiC,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3C,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,kCAAkC,CAC5C,yBAAyB,SAAS,mCAAmC,IACnE,wBAAwB,CAAC,OAAO,cAAc,EAAE,yBAAyB,CAAC,CAAC;AAE/E;;;;GAIG;AACH,MAAM,MAAM,oCAAoC,CAC9C,yBAAyB,SAAS,mCAAmC,IACnE,0BAA0B,CAC5B,OAAO,cAAc,EACrB,yBAAyB,CAC1B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,CACpC,yBAAyB,SAAS,mCAAmC,IACnE,oCAAoC,CAAC,yBAAyB,CAAC,CAAC;AAEpE;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,CACrC,yBAAyB,SAAS,mCAAmC,IACnE,kCAAkC,CAAC,yBAAyB,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,MAAM,gCAAgC,CAC1C,yBAAyB,SAAS,mCAAmC,IAErE,yBAAyB,SAAS,MAAM,CACtC,MAAM,mBAAmB,SAAS,MAAM,EACxC,MAAM,oBAAoB,SAAS,eAAe,CACnD,GACG,0BAA0B,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,GACrE,KAAK,CAAC;AAEZ;;;;GAIG;AACH,MAAM,MAAM,aAAa,CACvB,yBAAyB,SAAS,mCAAmC,IACnE,gCAAgC,CAAC,yBAAyB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CACvC,yBAAyB,SAAS,mCAAmC,IACnE,SAAS,CACX,OAAO,cAAc,EACrB,2BAA2B,CAAC,yBAAyB,CAAC,EACpD,0BAA0B,CAAC,yBAAyB,CAAC,GACrD,aAAa,CAAC,yBAAyB,CAAC,CAC3C,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,oBAAoB,CAC/B,yBAAyB,SAAS,mCAAmC,EACrE,mBAAmB,SAAS,MAAM,CAChC,MAAM,yBAAyB,EAC/B,kBAAkB,CACnB,CACD,SAAQ,cAAc,CACtB,OAAO,cAAc,EACrB,yBAAyB,EACzB,6BAA6B,CAAC,yBAAyB,CAAC,CACzD;;IACC;;;;;;OAMG;gBACS,EACV,WAAW,EACX,SAAS,GACV,EAAE;QACD,WAAW,EAAE,mBAAmB,CAAC;QACjC,SAAS,EAAE,6BAA6B,CAAC,yBAAyB,CAAC,CAAC;KACrE;CAqEF;AAuBD,eAAe,oBAAoB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ComposableController.mjs","sourceRoot":"","sources":["../src/ComposableController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateConstraint,\n StateMetadata,\n StateMetadataConstraint,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n BaseControllerInstance as ControllerInstance,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\n\nexport const controllerName = 'ComposableController';\n\nexport const INVALID_CONTROLLER_ERROR =\n 'Invalid controller: controller must inherit from `BaseController`.';\n\n/**\n * The narrowest supertype for the composable controller state object.\n */\nexport type ComposableControllerStateConstraint = {\n [controllerName: string]: StateConstraint;\n};\n\n/**\n * The `getState` action type for the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerGetStateAction<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ControllerGetStateAction<typeof controllerName, ComposableControllerState>;\n\n/**\n * The `stateChange` event type for the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerStateChangeEvent<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ControllerStateChangeEvent<\n typeof controllerName,\n ComposableControllerState\n>;\n\n/**\n * A union type of internal event types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ComposableControllerStateChangeEvent<ComposableControllerState>;\n\n/**\n * A union type of action types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerActions<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ComposableControllerGetStateAction<ComposableControllerState>;\n\n/**\n * A utility type that extracts controllers from the {@link ComposableControllerState} type,\n * and derives a union type of all of their corresponding `stateChange` events.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ChildControllerStateChangeEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> =\n ComposableControllerState extends Record<\n infer ChildControllerName extends string,\n infer ChildControllerState extends StateConstraint\n >\n ? ControllerStateChangeEvent<ChildControllerName, ChildControllerState>\n : never;\n\n/**\n * A union type of external event types available to the {@link ComposableControllerMessenger}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type AllowedEvents<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = ChildControllerStateChangeEvents<ComposableControllerState>;\n\n/**\n * The messenger of the {@link ComposableController}.\n *\n * @template ComposableControllerState - A type object that maps controller names to their state types.\n */\nexport type ComposableControllerMessenger<\n ComposableControllerState extends ComposableControllerStateConstraint,\n> = Messenger<\n typeof controllerName,\n ComposableControllerActions<ComposableControllerState>,\n | ComposableControllerEvents<ComposableControllerState>\n | AllowedEvents<ComposableControllerState>\n>;\n\n/**\n * Controller that composes multiple child controllers and maintains up-to-date composed state.\n *\n * @template ComposableControllerState - A type object containing the names and state types of the child controllers.\n * @template ChildControllersMap - A type object that specifies the child controllers which are used to instantiate the {@link ComposableController}.\n */\nexport class ComposableController<\n ComposableControllerState extends ComposableControllerStateConstraint,\n ChildControllersMap extends Record<\n keyof ComposableControllerState,\n ControllerInstance\n >,\n> extends BaseController<\n typeof controllerName,\n ComposableControllerState,\n ComposableControllerMessenger<ComposableControllerState>\n> {\n /**\n * Creates a ComposableController instance.\n *\n * @param options - Initial options used to configure this controller\n * @param options.controllers - An object that contains child controllers keyed by their names.\n * @param options.messenger - A controller messenger.\n */\n constructor({\n controllers,\n messenger,\n }: {\n controllers: ChildControllersMap;\n messenger: ComposableControllerMessenger<ComposableControllerState>;\n }) {\n if (messenger === undefined) {\n throw new Error(`Messaging system is required`);\n }\n\n super({\n name: controllerName,\n // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.\n metadata: Object.keys(controllers).reduce<\n StateMetadata<ComposableControllerState>\n >((metadata, name) => {\n (metadata as StateMetadataConstraint)[name] = {\n includeInStateLogs: false,\n persist: true,\n includeInDebugSnapshot: true,\n usedInUi: false,\n };\n return metadata;\n }, {} as never),\n // This reduce operation intentionally reuses its output object. This provides a significant performance benefit over returning a new object on each iteration.\n state: Object.values(controllers).reduce<ComposableControllerState>(\n (state, controller) => {\n // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.\n (state as ComposableControllerStateConstraint)[controller.name] =\n controller.state;\n return state;\n },\n {} as never,\n ),\n messenger,\n });\n\n Object.values(controllers).forEach((controller) => {\n this.#updateChildController(controller);\n });\n }\n\n /**\n * Constructor helper that subscribes to child controller state changes.\n *\n * @param controller - Controller instance to update\n */\n #updateChildController(controller: ControllerInstance): void {\n const { name } = controller;\n if (!isBaseController(controller)) {\n try {\n delete this.metadata[name];\n delete this.state[name];\n // eslint-disable-next-line no-empty\n } catch {}\n throw new Error(`${name} - ${INVALID_CONTROLLER_ERROR}`);\n }\n try {\n this.messenger.subscribe<\n // The type intersection with \"ComposableController:stateChange\" is added by one of the `Messenger.subscribe` overloads, but that constraint is unnecessary here,\n // since this method only subscribes the messenger to child controller `stateChange` events.\n // @ts-expect-error \"Type '`${string}:stateChange`' is not assignable to parameter of type '\"ComposableController:stateChange\" & ChildControllerStateChangeEvents<ComposableControllerState>[\"type\"]'.\"\n ChildControllerStateChangeEvents<ComposableControllerState>['type']\n >(`${name}:stateChange`, (childState: StateConstraint) => {\n this.update((state) => {\n // Type assertion is necessary for property assignment to a generic type. This does not pollute or widen the type of the asserted variable.\n // @ts-expect-error \"Type instantiation is excessively deep\"\n (state as ComposableControllerStateConstraint)[name] = childState;\n });\n });\n } catch (error: unknown) {\n console.error(`${name} - ${String(error)}`);\n }\n }\n}\n\n/**\n * Determines if the given controller is an instance of `BaseController`\n *\n * @param controller - Controller instance to check\n * @returns True if the controller is an instance of `BaseController`\n */\nfunction isBaseController(\n controller: unknown,\n): controller is ControllerInstance {\n return (\n typeof controller === 'object' &&\n controller !== null &&\n 'name' in controller &&\n typeof controller.name === 'string' &&\n 'state' in controller &&\n typeof controller.state === 'object' &&\n 'metadata' in controller &&\n typeof controller.metadata === 'object'\n );\n}\n\nexport default ComposableController;\n"]}
package/dist/index.cjs DELETED
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ComposableController = void 0;
4
- var ComposableController_js_1 = require("./ComposableController.cjs");
5
- Object.defineProperty(exports, "ComposableController", { enumerable: true, get: function () { return ComposableController_js_1.ComposableController; } });
6
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAMA,sEAAiE;AAAxD,+HAAA,oBAAoB,OAAA","sourcesContent":["export type {\n ComposableControllerStateConstraint,\n ComposableControllerStateChangeEvent,\n ComposableControllerEvents,\n ComposableControllerMessenger,\n} from './ComposableController.js';\nexport { ComposableController } from './ComposableController.js';\n"]}
package/dist/index.d.cts DELETED
@@ -1,3 +0,0 @@
1
- export type { ComposableControllerStateConstraint, ComposableControllerStateChangeEvent, ComposableControllerEvents, ComposableControllerMessenger, } from "./ComposableController.cjs";
2
- export { ComposableController } from "./ComposableController.cjs";
3
- //# sourceMappingURL=index.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mCAAmC,EACnC,oCAAoC,EACpC,0BAA0B,EAC1B,6BAA6B,GAC9B,mCAAkC;AACnC,OAAO,EAAE,oBAAoB,EAAE,mCAAkC"}
package/dist/index.d.mts DELETED
@@ -1,3 +0,0 @@
1
- export type { ComposableControllerStateConstraint, ComposableControllerStateChangeEvent, ComposableControllerEvents, ComposableControllerMessenger, } from "./ComposableController.mjs";
2
- export { ComposableController } from "./ComposableController.mjs";
3
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mCAAmC,EACnC,oCAAoC,EACpC,0BAA0B,EAC1B,6BAA6B,GAC9B,mCAAkC;AACnC,OAAO,EAAE,oBAAoB,EAAE,mCAAkC"}
package/dist/index.mjs DELETED
@@ -1,2 +0,0 @@
1
- export { ComposableController } from "./ComposableController.mjs";
2
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,mCAAkC","sourcesContent":["export type {\n ComposableControllerStateConstraint,\n ComposableControllerStateChangeEvent,\n ComposableControllerEvents,\n ComposableControllerMessenger,\n} from './ComposableController.js';\nexport { ComposableController } from './ComposableController.js';\n"]}