wraplet 1.0.0-beta.2 → 1.0.0-beta.20

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.
Files changed (66) hide show
  1. package/dist/DependencyManager/DDM.d.ts +76 -0
  2. package/dist/DependencyManager/types/DDMOptions.d.ts +10 -0
  3. package/dist/{Core/types/DependencyInstantiatedListener.d.ts → DependencyManager/types/DependencyLifecycleAsyncListener.d.ts} +1 -1
  4. package/dist/{Core/types/DestroyDependencyListener.d.ts → DependencyManager/types/DependencyLifecycleListener.d.ts} +1 -1
  5. package/dist/DependencyManager/types/DependencyManager.d.ts +55 -0
  6. package/dist/DependencyManager/types/WrapletCreator.d.ts +5 -0
  7. package/dist/Injector/types/Injector.d.ts +6 -0
  8. package/dist/Logger/ConsoleLogger.d.ts +7 -0
  9. package/dist/Logger/types/Logger.d.ts +3 -0
  10. package/dist/Map/MapTreeBuilder.d.ts +15 -0
  11. package/dist/Map/utils.d.ts +1 -1
  12. package/dist/NodeTreeManager/DNTM.d.ts +8 -0
  13. package/dist/NodeTreeManager/types/NodeInitializer.d.ts +1 -0
  14. package/dist/NodeTreeManager/types/NodeTreeManager.d.ts +5 -7
  15. package/dist/NodeTreeManager/utils.d.ts +4 -4
  16. package/dist/Set/DefaultWrapletSet.d.ts +2 -2
  17. package/dist/Set/types/WrapletSet.d.ts +1 -1
  18. package/dist/Wraplet/AbstractDependentWraplet.d.ts +35 -0
  19. package/dist/Wraplet/AbstractWraplet.d.ts +52 -0
  20. package/dist/Wraplet/NodeManager.d.ts +22 -0
  21. package/dist/Wraplet/createOuterDestroyCallback.d.ts +10 -0
  22. package/dist/Wraplet/createOuterInitializeCallback.d.ts +9 -0
  23. package/dist/Wraplet/createWrapletApi.d.ts +1 -2
  24. package/dist/Wraplet/statusActions.d.ts +4 -6
  25. package/dist/Wraplet/types/DependencyInstance.d.ts +2 -1
  26. package/dist/Wraplet/types/Wraplet.d.ts +4 -5
  27. package/dist/Wraplet/types/WrapletApi.d.ts +8 -7
  28. package/dist/Wraplet/types/WrapletApiFactoryArgs.d.ts +5 -9
  29. package/dist/Wraplet/types/WrapletDependencyDefinition.d.ts +6 -10
  30. package/dist/Wraplet/types/WrapletDependencyMap.d.ts +7 -1
  31. package/dist/Wraplet/utils.d.ts +1 -0
  32. package/dist/ambient.d.ts +254 -257
  33. package/dist/errors.d.ts +5 -2
  34. package/dist/index.cjs +1 -1
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.ts +14 -18
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/storage.cjs.map +1 -1
  40. package/dist/storage.js.map +1 -1
  41. package/dist/types/global.d.ts +2 -1
  42. package/dist/utils/createLifecycleAsyncError.d.ts +2 -0
  43. package/dist/utils/types/Utils.d.ts +2 -2
  44. package/package.json +2 -2
  45. package/dist/AbstractWraplet.d.ts +0 -54
  46. package/dist/Core/DefaultArgCreator.d.ts +0 -10
  47. package/dist/Core/DefaultCore.d.ts +0 -64
  48. package/dist/Core/defaultWrapletCreator.d.ts +0 -6
  49. package/dist/Core/types/ArgCreator.d.ts +0 -9
  50. package/dist/Core/types/Core.d.ts +0 -66
  51. package/dist/Core/types/CoreInitOptions.d.ts +0 -7
  52. package/dist/Core/types/WrapletCreator.d.ts +0 -15
  53. package/dist/Map/MapRepeat.d.ts +0 -10
  54. package/dist/Map/MapWrapper.d.ts +0 -33
  55. package/dist/Map/types/DynamicMap.d.ts +0 -9
  56. package/dist/NodeTreeManager/DefaultNodeTreeManager.d.ts +0 -12
  57. package/dist/NodeTreeManager/types/NodeTreeParent.d.ts +0 -10
  58. package/dist/Wraplet/createDefaultDestroyCallback.d.ts +0 -13
  59. package/dist/Wraplet/createDefaultInitializeCallback.d.ts +0 -15
  60. package/dist/Wraplet/createRichWrapletApi.d.ts +0 -5
  61. package/dist/Wraplet/customizeDefaultWrapletApi.d.ts +0 -2
  62. package/dist/Wraplet/types/RichWrapletApi.d.ts +0 -4
  63. package/dist/Wraplet/types/RichWrapletApiFactoryArgs.d.ts +0 -6
  64. package/dist/types/Groupable.d.ts +0 -13
  65. /package/dist/{Core → DependencyManager}/types/DestroyListener.d.ts +0 -0
  66. /package/dist/Wraplet/types/{WrapletApiFactoryBasicCallback.d.ts → WrapletApiFactoryCallbacks.d.ts} +0 -0
@@ -0,0 +1,76 @@
1
+ import { WrapletDependencies } from "../Wraplet/types/WrapletDependencies";
2
+ import { MultipleDependencyKeys, SingleDependencyKeys, WrapletDependencyMap, WrapletDependencyMapWithDefaults } from "../Wraplet/types/WrapletDependencyMap";
3
+ import { DependencyInstance } from "../Wraplet/types/DependencyInstance";
4
+ import { DDMOptions } from "./types/DDMOptions";
5
+ import { DependencyManager, DependencyManagerSymbol } from "./types/DependencyManager";
6
+ import { Status } from "../Wraplet/types/Status";
7
+ import { DependencyLifecycleAsyncListener } from "./types/DependencyLifecycleAsyncListener";
8
+ import { DependencyLifecycleListener } from "./types/DependencyLifecycleListener";
9
+ import { MapTreeBuilder } from "../Map/MapTreeBuilder";
10
+ import { Injector } from "../Injector/types/Injector";
11
+ export declare class DDM<N extends Node = Node, M extends WrapletDependencyMap = {}> implements DependencyManager<N, M> {
12
+ node: N;
13
+ [DependencyManagerSymbol]: true;
14
+ private logger;
15
+ private dependenciesAreInstantiated;
16
+ private statusWritable;
17
+ get status(): Status;
18
+ private readonly mapTree;
19
+ private directDependencies;
20
+ private wrappedDependencies;
21
+ private instantiatedDependencyListeners;
22
+ private initializedDependencyListeners;
23
+ private destroyedDependencyListeners;
24
+ constructor(node: N, map: M | MapTreeBuilder<M>, options?: Partial<DDMOptions<M>>);
25
+ /**
26
+ * Initialize dependencies.
27
+ */
28
+ initializeDependencies(): Promise<void>;
29
+ get map(): WrapletDependencyMapWithDefaults<M>;
30
+ instantiateDependencies(): void;
31
+ private findExistingWraplet;
32
+ private instantiateSingleWrapletDependency;
33
+ private instantiateWrapletItem;
34
+ private instantiateMultipleDependencies;
35
+ addDependencyInstantiatedListener<K extends keyof M>(id: K, callback: DependencyLifecycleListener<M, K>): void;
36
+ addDependencyInitializedListener<K extends keyof M>(id: K, callback: DependencyLifecycleAsyncListener<M, K>): void;
37
+ addDependencyDestroyedListener<K extends keyof M>(id: K, callback: DependencyLifecycleAsyncListener<M, K>): void;
38
+ setExistingInstance<K extends SingleDependencyKeys<M> & Extract<keyof M, string>>(id: K, wraplet: DependencyInstance<M, K>): void;
39
+ addExistingInstance<K extends MultipleDependencyKeys<M> & Extract<keyof M, string>>(id: K, wraplet: DependencyInstance<M, K>): void;
40
+ private prepareIndividualWraplet;
41
+ private createDependencyDestroyListener;
42
+ /**
43
+ * Checks whether a required dependency has been removed while the DDM
44
+ * is NOT being destroyed itself. Returns the error instance instead of
45
+ * throwing, so the caller can route it through the lifecycle error pipeline.
46
+ */
47
+ private validateRequiredDependencyAfterRemoval;
48
+ /**
49
+ * This method removes from nodes references to this wraplet and its dependencies recursively.
50
+ */
51
+ destroyDependencies(): Promise<void>;
52
+ private findChildrenElements;
53
+ get dependencies(): WrapletDependencies<M>;
54
+ private removeDependency;
55
+ private validateMapItem;
56
+ private validateMapItemForNonParent;
57
+ private validateElements;
58
+ /**
59
+ * Set up a proxy to check if dependencies have not been destroyed before fetching them.
60
+ */
61
+ private wrapDependencies;
62
+ private defaultOptions;
63
+ private destroyDeps;
64
+ /**
65
+ * Creates a definition for creating a node wrapper.
66
+ *
67
+ * @param map_or_position
68
+ * You can provide a map or a number representing the
69
+ * relative position of the ancestor map that should be
70
+ * reused.
71
+ *
72
+ * This is useful for recursive maps.
73
+ * @param options
74
+ */
75
+ static createInjector<N extends Node, M extends WrapletDependencyMap>(map_or_position: WrapletDependencyMap | number, options?: DDMOptions): Injector<N, M, DDMOptions>;
76
+ }
@@ -0,0 +1,10 @@
1
+ import { WrapletDependencyMap } from "../../Wraplet/types/WrapletDependencyMap";
2
+ import { DependencyLifecycleAsyncListener } from "./DependencyLifecycleAsyncListener";
3
+ import { DependencyLifecycleListener } from "./DependencyLifecycleListener";
4
+ import { Logger } from "../../Logger/types/Logger";
5
+ export type DDMOptions<M extends WrapletDependencyMap = WrapletDependencyMap> = {
6
+ dependencyInstantiatedListeners?: Map<keyof M, DependencyLifecycleListener<M, keyof M>[]>;
7
+ dependencyInitializedListeners?: Map<keyof M, DependencyLifecycleAsyncListener<M, keyof M>[]>;
8
+ dependencyDestroyedListeners?: Map<keyof M, DependencyLifecycleAsyncListener<M, keyof M>[]>;
9
+ logger?: Logger;
10
+ };
@@ -1,3 +1,3 @@
1
1
  import { WrapletDependencyMap } from "../../Wraplet/types/WrapletDependencyMap";
2
2
  import { DependencyInstance } from "../../Wraplet/types/DependencyInstance";
3
- export type DependencyInstantiatedListener<M extends WrapletDependencyMap, K extends keyof M> = (wraplet: DependencyInstance<M, K>, id: K) => void;
3
+ export type DependencyLifecycleAsyncListener<M extends WrapletDependencyMap, K extends keyof M> = (wraplet: DependencyInstance<M, K>) => Promise<void>;
@@ -1,3 +1,3 @@
1
1
  import { WrapletDependencyMap } from "../../Wraplet/types/WrapletDependencyMap";
2
2
  import { DependencyInstance } from "../../Wraplet/types/DependencyInstance";
3
- export type DependencyDestroyedListener<M extends WrapletDependencyMap, K extends keyof M> = (wraplet: DependencyInstance<M, K>, id: K) => void;
3
+ export type DependencyLifecycleListener<M extends WrapletDependencyMap, K extends keyof M> = (wraplet: DependencyInstance<M, K>) => void;
@@ -0,0 +1,55 @@
1
+ import { WrapletDependencies } from "../../Wraplet/types/WrapletDependencies";
2
+ import { MultipleDependencyKeys, SingleDependencyKeys, WrapletDependencyMap } from "../../Wraplet/types/WrapletDependencyMap";
3
+ import { DependencyLifecycleAsyncListener } from "./DependencyLifecycleAsyncListener";
4
+ import { DependencyLifecycleListener } from "./DependencyLifecycleListener";
5
+ import { DependencyInstance } from "../../Wraplet/types/DependencyInstance";
6
+ export declare const DependencyManagerSymbol: unique symbol;
7
+ /**
8
+ * Dependency manager interface that defines the public API for managing wraplet relationships
9
+ * and lifecycles.
10
+ */
11
+ export interface DependencyManager<N extends Node = Node, M extends WrapletDependencyMap = {}> {
12
+ [DependencyManagerSymbol]: true;
13
+ /**
14
+ * The node that the manager is managing.
15
+ */
16
+ node: N;
17
+ /**
18
+ * Instantiate dependencies based on the map and the current node.
19
+ */
20
+ instantiateDependencies(): void;
21
+ /**
22
+ * Initialize dependencies.
23
+ */
24
+ initializeDependencies(): Promise<void>;
25
+ /**
26
+ * Destroy all dependencies.
27
+ */
28
+ destroyDependencies(): Promise<void>;
29
+ /**
30
+ * Add a listener that will be called when a dependency is initialized.
31
+ */
32
+ addDependencyInitializedListener<K extends keyof M>(id: K, callback: DependencyLifecycleAsyncListener<M, K>): void;
33
+ /**
34
+ * Add a listener that will be called when a dependency is destroyed.
35
+ */
36
+ addDependencyDestroyedListener<K extends keyof M>(id: K, callback: DependencyLifecycleAsyncListener<M, K>): void;
37
+ /**
38
+ * Add a listener that will be called when a dependency is instantiated.
39
+ */
40
+ addDependencyInstantiatedListener<K extends keyof M>(id: K, callback: DependencyLifecycleListener<M, K>): void;
41
+ /**
42
+ * This method allows you to set an existing dependency instance.
43
+ */
44
+ setExistingInstance<K extends SingleDependencyKeys<M> & Extract<keyof M, string>>(id: K, wraplet: DependencyInstance<M, K>): void;
45
+ /**
46
+ * This method allows you to add an existing dependency instance
47
+ * to a wraplet set.
48
+ */
49
+ addExistingInstance<K extends MultipleDependencyKeys<M> & Extract<keyof M, string>>(id: K, wraplet: DependencyInstance<M, K>): void;
50
+ /**
51
+ * Get the available dependencies.
52
+ */
53
+ readonly dependencies: WrapletDependencies<M>;
54
+ }
55
+ export declare function isDependencyManager<N extends Node, M extends WrapletDependencyMap>(object: unknown): object is DependencyManager<N, M>;
@@ -0,0 +1,5 @@
1
+ import { Wraplet } from "../../Wraplet/types/Wraplet";
2
+ import { WrapletDependencyMap } from "../../Wraplet/types/WrapletDependencyMap";
3
+ import { WrapletDependencyDefinitionWithDefaults } from "../../Wraplet/types/WrapletDependencyDefinition";
4
+ import { MapTreeBuilder } from "../../Map/MapTreeBuilder";
5
+ export type WrapletCreator<N extends Node, M extends WrapletDependencyMap> = (node: N, definition: WrapletDependencyDefinitionWithDefaults, map: MapTreeBuilder<M>) => Wraplet;
@@ -0,0 +1,6 @@
1
+ import { MapTreeBuilder } from "../../Map/MapTreeBuilder";
2
+ import { WrapletDependencyMap } from "../../Wraplet/types/WrapletDependencyMap";
3
+ export type Injector<N extends Node = Node, M extends WrapletDependencyMap = WrapletDependencyMap, D = any> = {
4
+ data?: D;
5
+ callback: (node: N, map: MapTreeBuilder<M>, data?: D) => unknown;
6
+ };
@@ -0,0 +1,7 @@
1
+ import { Logger } from "./types/Logger";
2
+ export declare class ConsoleLogger implements Logger {
3
+ #private;
4
+ private constructor();
5
+ dumpError(error: Error): void;
6
+ static getGlobalLogger(): Logger;
7
+ }
@@ -0,0 +1,3 @@
1
+ export interface Logger {
2
+ dumpError(error: Error): void;
3
+ }
@@ -0,0 +1,15 @@
1
+ import { WrapletDependencyMap, WrapletDependencyMapWithDefaults } from "../Wraplet/types/WrapletDependencyMap";
2
+ declare const MapTreeBuilderSymbol: unique symbol;
3
+ export declare class MapTreeBuilder<M extends WrapletDependencyMap = WrapletDependencyMap> {
4
+ private parent?;
5
+ [MapTreeBuilderSymbol]: true;
6
+ private map?;
7
+ private children;
8
+ constructor(parent?: MapTreeBuilder | undefined);
9
+ getParent(): MapTreeBuilder;
10
+ createChild<CM extends WrapletDependencyMap>(name: keyof M): MapTreeBuilder<CM>;
11
+ setMap(map: M): void;
12
+ getMap(): WrapletDependencyMapWithDefaults<M>;
13
+ }
14
+ export declare function isMapTreeBuilder(object: unknown): object is MapTreeBuilder;
15
+ export {};
@@ -1,4 +1,4 @@
1
1
  import { WrapletDependencyDefinition, WrapletDependencyDefinitionWithDefaults } from "../Wraplet/types/WrapletDependencyDefinition";
2
2
  import { WrapletDependencyMap, WrapletDependencyMapWithDefaults } from "../Wraplet/types/WrapletDependencyMap";
3
- export declare function addDefaultsToDependencyDefinition<M extends WrapletDependencyMap, T extends WrapletDependencyDefinition<M>>(definition: T): WrapletDependencyDefinitionWithDefaults<T, M>;
3
+ export declare function addDefaultsToDependencyDefinition<T extends WrapletDependencyDefinition>(definition: T): WrapletDependencyDefinitionWithDefaults<T>;
4
4
  export declare function fillMapWithDefaults<M extends WrapletDependencyMap>(map: M): WrapletDependencyMapWithDefaults<M>;
@@ -0,0 +1,8 @@
1
+ import { NodeTreeManager } from "./types/NodeTreeManager";
2
+ import { NodeInitializer } from "./types/NodeInitializer";
3
+ export declare class DNTM<CONTEXT = unknown> implements NodeTreeManager<CONTEXT> {
4
+ private initializers;
5
+ addNodeInitializer(callback: NodeInitializer<CONTEXT>): void;
6
+ initializeNode(node: Node, context?: CONTEXT): Promise<void>;
7
+ destroyNode(node: Node): Promise<void>;
8
+ }
@@ -0,0 +1 @@
1
+ export type NodeInitializer<CONTEXT> = (node: Node, context?: CONTEXT) => Promise<void>;
@@ -1,8 +1,6 @@
1
- import { Initializer } from "../DefaultNodeTreeManager";
2
- import { WrapletSetReadonly } from "../../Set/types/WrapletSetReadonly";
3
- export interface NodeTreeManager {
4
- addWrapletInitializer(callback: Initializer): void;
5
- initializeNodeTree(node: Node): Promise<void>;
6
- destroyNodeTree(node: Node): Promise<void>;
7
- getSet(): WrapletSetReadonly;
1
+ import { NodeInitializer } from "./NodeInitializer";
2
+ export interface NodeTreeManager<CONTEXT = unknown> {
3
+ addNodeInitializer(callback: NodeInitializer<CONTEXT>): void;
4
+ initializeNode(node: Node, context?: CONTEXT): Promise<void>;
5
+ destroyNode(node: Node): Promise<void>;
8
6
  }
@@ -1,8 +1,8 @@
1
1
  import { Wraplet } from "../Wraplet/types/Wraplet";
2
2
  import { WrapletSet } from "../Set/types/WrapletSet";
3
3
  export declare function isParentNode(node: Node): node is ParentNode;
4
- export declare function getWrapletsFromNode<N extends Node = Node, W extends Wraplet<N> = Wraplet<N>>(node: N): WrapletSet<W>;
5
- export declare function removeWrapletFromNode<N extends Node>(wraplet: Wraplet<N>, node: N): boolean;
6
- export declare function addWrapletToNode<N extends Node>(wraplet: Wraplet<N>, node: N): void;
7
- export declare function actOnNodesRecursively(node: Node, callback: (node: Node) => Promise<void>): Promise<void>;
4
+ export declare function getWrapletsFromNode<N extends Node = Node>(node: N): WrapletSet | null;
5
+ export declare function removeWrapletFromNode<N extends Node>(wraplet: Wraplet, node: N): boolean;
6
+ export declare function addWrapletToNode<N extends Node>(wraplet: Wraplet, node: N): void;
7
+ export declare function actOnNodesRecursively(node: Node, callback: (node: Node) => void): Promise<void>;
8
8
  export declare function destroyWrapletsRecursively(node: Node): Promise<void>;
@@ -1,8 +1,8 @@
1
1
  import { WrapletSet, WrapletSetSymbol } from "./types/WrapletSet";
2
2
  import { Wraplet } from "../Wraplet/types/Wraplet";
3
3
  import { DefaultSearchableSet } from "./DefaultSearchableSet";
4
- import { WrapletSetReadonlySymbol } from "./types/WrapletSetReadonly";
5
- export declare class DefaultWrapletSet<T extends Wraplet> extends DefaultSearchableSet<T> implements WrapletSet {
4
+ import { WrapletSetReadonly, WrapletSetReadonlySymbol } from "./types/WrapletSetReadonly";
5
+ export declare class DefaultWrapletSet<T extends Wraplet> extends DefaultSearchableSet<T> implements WrapletSet<T>, WrapletSetReadonly<T> {
6
6
  [WrapletSetReadonlySymbol]: true;
7
7
  [WrapletSetSymbol]: true;
8
8
  }
@@ -5,4 +5,4 @@ export { WrapletSetSymbol };
5
5
  export interface WrapletSet<W extends Wraplet = Wraplet> extends BaseSet<W>, Set<W> {
6
6
  [WrapletSetSymbol]: true;
7
7
  }
8
- export declare function isWrapletSet<W extends Wraplet>(object: unknown): object is WrapletSet<W>;
8
+ export declare function isWrapletSet(object: unknown): object is WrapletSet;
@@ -0,0 +1,35 @@
1
+ import { WrapletDependencyMap } from "./types/WrapletDependencyMap";
2
+ import { WrapletDependencies } from "./types/WrapletDependencies";
3
+ import { Wraplet } from "./types/Wraplet";
4
+ import { DependencyManager } from "../DependencyManager/types/DependencyManager";
5
+ import { AbstractWraplet } from "./AbstractWraplet";
6
+ import { WrapletApi } from "./types/WrapletApi";
7
+ export declare abstract class AbstractDependentWraplet<N extends Node = Node, M extends WrapletDependencyMap = {}> extends AbstractWraplet<N> implements Wraplet {
8
+ protected dm: DependencyManager<N, M>;
9
+ constructor(dm: DependencyManager<N, M>);
10
+ /**
11
+ * Override createWrapletApi to provide DependencyManager-aware lifecycle callbacks
12
+ * instead of the base class's version — this avoids creating two WrapletApi
13
+ * instances.
14
+ */
15
+ protected createWrapletApi(): WrapletApi;
16
+ protected onDestroy(): Promise<void>;
17
+ protected onInitialize(): Promise<void>;
18
+ /**
19
+ * Dependencies.
20
+ */
21
+ protected get d(): WrapletDependencies<M>;
22
+ protected static createDependencyManager<N extends Node, M extends WrapletDependencyMap>(node: N, map: M): DependencyManager<N, M>;
23
+ protected static createWraplets(): InstanceType<abstract new (...args: any) => any>;
24
+ protected static createAndInitializeWraplets(): Promise<InstanceType<abstract new (...args: any) => any>>;
25
+ /**
26
+ * Instantiates wraplets on a given ParentNode.
27
+ */
28
+ protected static createDependentWraplets<T extends abstract new (ddm: any, ...args: any[]) => AbstractDependentWraplet<any, any>>(this: T, node: ParentNode, attribute: string, map: WrapletDependencyMap, additional_args?: unknown[]): InstanceType<T>[];
29
+ /**
30
+ * Instantiates and initializes wraplets on a given ParentNode.
31
+ */
32
+ protected static createAndInitializeDependentWraplets<T extends {
33
+ new (ddm: any, ...args: any[]): AbstractDependentWraplet<any, any>;
34
+ }>(this: T, node: ParentNode, attribute: string, map: WrapletDependencyMap, additional_args?: unknown[]): Promise<InstanceType<T>[]>;
35
+ }
@@ -0,0 +1,52 @@
1
+ import { Wraplet, WrapletSymbol } from "./types/Wraplet";
2
+ import { Constructable } from "../utils/types/Utils";
3
+ import { NodeManager } from "./NodeManager";
4
+ import { WrapletApi } from "./types/WrapletApi";
5
+ import { WrapletApiFactoryBasicCallback } from "./types/WrapletApiFactoryCallbacks";
6
+ export declare abstract class AbstractWraplet<N extends Node = Node> implements Wraplet {
7
+ protected node: N;
8
+ [WrapletSymbol]: true;
9
+ wraplet: WrapletApi;
10
+ private _nodeManager;
11
+ constructor(node: N);
12
+ /**
13
+ * Creates the WrapletApi for this wraplet. Subclasses (e.g. AbstractDependentWraplet)
14
+ * can override this to supply their own lifecycle callbacks without causing a
15
+ * double-creation of WrapletApi.
16
+ */
17
+ protected createWrapletApi(): WrapletApi;
18
+ /**
19
+ * Builds a WrapletApi with the given callbacks and ensures NodeManager cleanup
20
+ * is always wired into the destroy path.
21
+ */
22
+ protected buildWrapletApi(initializeCallback?: WrapletApiFactoryBasicCallback, destroyCallback?: WrapletApiFactoryBasicCallback): WrapletApi;
23
+ protected get nodeManager(): NodeManager<N>;
24
+ /**
25
+ * Subclasses must return an array of constructors covering all types in union N.
26
+ * Wrap the result in the `supportedTypeGuard` helper to make sure that the array contains all
27
+ * and only classes that extend the given type.
28
+ */
29
+ protected supportedNodeTypes(): readonly Constructable<N>[] | null;
30
+ /**
31
+ * Helper for subclasses to easily satisfy the exhaustive check.
32
+ */
33
+ protected supportedNodeTypesGuard<T extends readonly Constructable<N>[]>(types: T & (Exclude<N, InstanceType<T[number]>> extends never ? T : never)): T;
34
+ /**
35
+ * This method gets invoked when the wraplet is initialized.
36
+ */
37
+ protected onInitialize(): Promise<void>;
38
+ /**
39
+ * This method gets invoked when the wraplet is destroyed.
40
+ */
41
+ protected onDestroy(): Promise<void>;
42
+ /**
43
+ * Instantiates wraplets on a given ParentNode.
44
+ */
45
+ protected static createWraplets<T extends abstract new (ddm: any, ...args: any[]) => AbstractWraplet<any>>(this: T, node: ParentNode, attribute: string, additional_args?: unknown[]): InstanceType<T>[];
46
+ /**
47
+ * Instantiates and initializes wraplets on a given ParentNode.
48
+ */
49
+ protected static createAndInitializeWraplets<T extends {
50
+ new (ddm: any, ...args: any[]): AbstractWraplet<any>;
51
+ }>(this: T, node: ParentNode, attribute: string, additional_args?: unknown[]): Promise<InstanceType<T>[]>;
52
+ }
@@ -0,0 +1,22 @@
1
+ import { SelectorCallback } from "./types/WrapletDependencyDefinition";
2
+ export declare class NodeManager<N extends Node> {
3
+ private node;
4
+ private listeners;
5
+ constructor(node: N);
6
+ /**
7
+ * Add a listener to the current node.
8
+ */
9
+ addListener(eventName: string, callback: EventListenerOrEventListenerObject, options?: AddEventListenerOptions | boolean): void;
10
+ /**
11
+ * Add a listener to one of the descendants.
12
+ *
13
+ * Note: Most of the time it's not recommended to use this
14
+ * method because it makes a wraplet impure.
15
+ *
16
+ * Ideally, wraplet should directly interact only with its
17
+ * own node. However, you can make a wraplet impure if you
18
+ * know what you are doing.
19
+ */
20
+ addListenerTo(target: SelectorCallback | string, eventName: string, callback: EventListenerOrEventListenerObject, options?: AddEventListenerOptions | boolean, required?: boolean): void;
21
+ destroy(): void;
22
+ }
@@ -0,0 +1,10 @@
1
+ import { Status } from "./types/Status";
2
+ import { Wraplet } from "./types/Wraplet";
3
+ import { DestroyListener } from "../DependencyManager/types/DestroyListener";
4
+ import { WrapletApiFactoryBasicCallback } from "./types/WrapletApiFactoryCallbacks";
5
+ export type OuterDestroyCallbackArgs = {
6
+ wraplet: Wraplet;
7
+ destroyListeners: DestroyListener[];
8
+ status: Status;
9
+ };
10
+ export declare function createOuterDestroyCallback(args: OuterDestroyCallbackArgs, destroyLogic?: WrapletApiFactoryBasicCallback): () => Promise<void>;
@@ -0,0 +1,9 @@
1
+ import { Status } from "./types/Status";
2
+ import { Wraplet } from "./types/Wraplet";
3
+ import { WrapletApiFactoryBasicCallback } from "./types/WrapletApiFactoryCallbacks";
4
+ export type OuterInitializeCallbackArgs = {
5
+ wraplet: Wraplet;
6
+ destroyCallback: () => Promise<void>;
7
+ status: Status;
8
+ };
9
+ export declare function createOuterInitializeCallback(args: OuterInitializeCallbackArgs, initializeLogic?: WrapletApiFactoryBasicCallback): () => Promise<void>;
@@ -1,4 +1,3 @@
1
- import { WrapletDependencyMap } from "./types/WrapletDependencyMap";
2
1
  import { WrapletApiFactoryArgs } from "./types/WrapletApiFactoryArgs";
3
2
  import { WrapletApi, WrapletApiDebug } from "./types/WrapletApi";
4
- export declare const createWrapletApi: <N extends Node, M extends WrapletDependencyMap>(args: WrapletApiFactoryArgs<N, M>) => WrapletApi<N> & WrapletApiDebug<N>;
3
+ export declare const createWrapletApi: (args: WrapletApiFactoryArgs) => WrapletApi & WrapletApiDebug;
@@ -1,9 +1,7 @@
1
1
  import { StatusWritable } from "../Wraplet/types/Status";
2
- import { Core } from "../Core/types/Core";
3
- import { DestroyListener } from "../Core/types/DestroyListener";
2
+ import { DestroyListener } from "../DependencyManager/types/DestroyListener";
4
3
  import { Wraplet } from "../Wraplet/types/Wraplet";
5
- import { WrapletDependencyMap } from "./types/WrapletDependencyMap";
6
- export declare function initializationStarted<N extends Node, M extends WrapletDependencyMap>(status: StatusWritable, core: Core<N, M>, wraplet: Wraplet<N>): Promise<boolean>;
4
+ export declare function initializationStarted(status: StatusWritable): boolean;
7
5
  export declare function initializationCompleted(status: StatusWritable, destroyMethod: () => Promise<void>): Promise<void>;
8
- export declare function destructionStarted<N extends Node, W extends Wraplet<N>, M extends WrapletDependencyMap>(status: StatusWritable, core: Core<N, M>, wraplet: W, destroyListeners: DestroyListener<W>[]): Promise<boolean>;
9
- export declare function destructionCompleted<N extends Node, W extends Wraplet<N>, M extends WrapletDependencyMap>(status: StatusWritable, core: Core<N, M>, wraplet: W): Promise<void>;
6
+ export declare function destructionStarted(status: StatusWritable): boolean;
7
+ export declare function destructionCompleted(status: StatusWritable, wraplet: Wraplet, destroyListeners: DestroyListener[]): Promise<void>;
@@ -1,2 +1,3 @@
1
1
  import { WrapletDependencyMap } from "./WrapletDependencyMap";
2
- export type DependencyInstance<M extends WrapletDependencyMap, K extends keyof M = keyof M> = InstanceType<M[K]["Class"]>;
2
+ import { InstantiableReturnType } from "../../utils/types/Utils";
3
+ export type DependencyInstance<M extends WrapletDependencyMap, K extends keyof M = keyof M> = InstantiableReturnType<M[K]["Class"]>;
@@ -1,8 +1,7 @@
1
1
  import { WrapletApi } from "./WrapletApi";
2
- declare const WrapletSymbol: unique symbol;
3
- export { WrapletSymbol };
4
- export interface Wraplet<N extends Node = Node> {
2
+ export declare const WrapletSymbol: unique symbol;
3
+ export interface Wraplet {
5
4
  [WrapletSymbol]: true;
6
- wraplet: WrapletApi<N>;
5
+ wraplet: WrapletApi;
7
6
  }
8
- export declare function isWraplet<N extends Node>(object: unknown): object is Wraplet<N>;
7
+ export declare function isWraplet(object: unknown): object is Wraplet;
@@ -1,13 +1,14 @@
1
- import { DestroyListener } from "../../Core/types/DestroyListener";
1
+ import { DestroyListener } from "../../DependencyManager/types/DestroyListener";
2
2
  import { Status } from "./Status";
3
- import { Wraplet } from "../../Wraplet/types/Wraplet";
4
- export interface WrapletApi<N extends Node = Node> {
3
+ export declare const WrapletApiSymbol: unique symbol;
4
+ export interface WrapletApi {
5
+ [WrapletApiSymbol]: true;
5
6
  status: Status;
6
- accessNode(callback: (node: N) => void): void;
7
7
  destroy(): Promise<void>;
8
8
  initialize(): Promise<void>;
9
- addDestroyListener(callback: DestroyListener<Wraplet<N>>): void;
9
+ addDestroyListener(callback: DestroyListener): void;
10
10
  }
11
- export interface WrapletApiDebug<N extends Node> {
12
- __nodeAccessors: ((node: N) => void)[];
11
+ export declare function isWrapletApi(object: unknown): object is WrapletApi;
12
+ export interface WrapletApiDebug {
13
+ __destroyListeners: DestroyListener[];
13
14
  }
@@ -1,12 +1,8 @@
1
- import { WrapletDependencyMap } from "./WrapletDependencyMap";
2
- import { Core } from "../../Core/types/Core";
3
- import { DestroyListener } from "../../Core/types/DestroyListener";
4
- import { WrapletApiFactoryBasicCallback } from "./WrapletApiFactoryBasicCallback";
5
1
  import { Wraplet } from "./Wraplet";
6
- export type WrapletApiFactoryArgs<N extends Node = Node, M extends WrapletDependencyMap = WrapletDependencyMap> = {
7
- core: Core<N, M>;
8
- wraplet: Wraplet<N>;
9
- destroyListeners?: DestroyListener<Wraplet<N>>[];
10
- initializeCallback?: WrapletApiFactoryBasicCallback;
2
+ import { WrapletApiFactoryBasicCallback } from "./WrapletApiFactoryCallbacks";
3
+ export type WrapletApiFactoryArgs<N extends Node = Node> = {
4
+ node?: N;
5
+ wraplet: Wraplet;
11
6
  destroyCallback?: WrapletApiFactoryBasicCallback;
7
+ initializeCallback?: WrapletApiFactoryBasicCallback;
12
8
  };
@@ -1,22 +1,18 @@
1
1
  import { Wraplet } from "./Wraplet";
2
- import { WrapletDependencyMap } from "./WrapletDependencyMap";
3
- import { CoreInitOptions } from "../../Core/types/CoreInitOptions";
4
- import { DynamicMap } from "../../Map/types/DynamicMap";
5
2
  import { Constructable } from "../../utils/types/Utils";
3
+ import { Injector } from "../../Injector/types/Injector";
6
4
  export type SelectorCallback<N extends ParentNode = ParentNode> = (node: N) => Node[];
7
- export type WrapletDependencyDefinition<M extends WrapletDependencyMap = WrapletDependencyMap> = {
5
+ export type WrapletDependencyDefinition = {
8
6
  selector?: string | SelectorCallback;
9
- Class: Constructable<Wraplet<any>>;
10
- map?: M | DynamicMap;
11
- coreOptions?: CoreInitOptions<M>;
7
+ Class: Constructable<Wraplet>;
8
+ injector?: Injector;
12
9
  required: boolean;
13
10
  multiple: boolean;
14
11
  args?: unknown[];
15
12
  destructible?: boolean;
16
13
  };
17
- export type WrapletDependencyDefinitionWithDefaults<T extends WrapletDependencyDefinition = WrapletDependencyDefinition, M extends WrapletDependencyMap = WrapletDependencyMap> = T & {
14
+ export type WrapletDependencyDefinitionWithDefaults<T extends WrapletDependencyDefinition = WrapletDependencyDefinition> = T & {
18
15
  args: unknown[];
19
16
  destructible: boolean;
20
- map: M | DynamicMap;
21
- coreOptions: CoreInitOptions<M>;
17
+ injector: Injector;
22
18
  };
@@ -3,6 +3,12 @@ export type WrapletDependencyMap = {
3
3
  [id: string]: WrapletDependencyDefinition;
4
4
  };
5
5
  export type WrapletDependencyMapWithDefaults<M extends WrapletDependencyMap = WrapletDependencyMap> = {
6
- [key in keyof M]: WrapletDependencyDefinitionWithDefaults<M[key], M>;
6
+ [key in keyof M]: WrapletDependencyDefinitionWithDefaults<M[key]>;
7
7
  };
8
+ export type SingleDependencyKeys<M extends WrapletDependencyMap> = Extract<keyof {
9
+ [K in keyof M as M[K]["multiple"] extends false ? K : never]: true;
10
+ }, string>;
11
+ export type MultipleDependencyKeys<M extends WrapletDependencyMap> = Extract<keyof {
12
+ [K in keyof M as M[K]["multiple"] extends true ? K : never]: true;
13
+ }, string>;
8
14
  export declare function isWrapletDependencyMap(object: unknown): object is WrapletDependencyMapWithDefaults;
@@ -0,0 +1 @@
1
+ export declare const isOverridden: (instance: object, methodName: string, stopAt?: Function) => boolean;