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.
- package/dist/DependencyManager/DDM.d.ts +76 -0
- package/dist/DependencyManager/types/DDMOptions.d.ts +10 -0
- package/dist/{Core/types/DependencyInstantiatedListener.d.ts → DependencyManager/types/DependencyLifecycleAsyncListener.d.ts} +1 -1
- package/dist/{Core/types/DestroyDependencyListener.d.ts → DependencyManager/types/DependencyLifecycleListener.d.ts} +1 -1
- package/dist/DependencyManager/types/DependencyManager.d.ts +55 -0
- package/dist/DependencyManager/types/WrapletCreator.d.ts +5 -0
- package/dist/Injector/types/Injector.d.ts +6 -0
- package/dist/Logger/ConsoleLogger.d.ts +7 -0
- package/dist/Logger/types/Logger.d.ts +3 -0
- package/dist/Map/MapTreeBuilder.d.ts +15 -0
- package/dist/Map/utils.d.ts +1 -1
- package/dist/NodeTreeManager/DNTM.d.ts +8 -0
- package/dist/NodeTreeManager/types/NodeInitializer.d.ts +1 -0
- package/dist/NodeTreeManager/types/NodeTreeManager.d.ts +5 -7
- package/dist/NodeTreeManager/utils.d.ts +4 -4
- package/dist/Set/DefaultWrapletSet.d.ts +2 -2
- package/dist/Set/types/WrapletSet.d.ts +1 -1
- package/dist/Wraplet/AbstractDependentWraplet.d.ts +35 -0
- package/dist/Wraplet/AbstractWraplet.d.ts +52 -0
- package/dist/Wraplet/NodeManager.d.ts +22 -0
- package/dist/Wraplet/createOuterDestroyCallback.d.ts +10 -0
- package/dist/Wraplet/createOuterInitializeCallback.d.ts +9 -0
- package/dist/Wraplet/createWrapletApi.d.ts +1 -2
- package/dist/Wraplet/statusActions.d.ts +4 -6
- package/dist/Wraplet/types/DependencyInstance.d.ts +2 -1
- package/dist/Wraplet/types/Wraplet.d.ts +4 -5
- package/dist/Wraplet/types/WrapletApi.d.ts +8 -7
- package/dist/Wraplet/types/WrapletApiFactoryArgs.d.ts +5 -9
- package/dist/Wraplet/types/WrapletDependencyDefinition.d.ts +6 -10
- package/dist/Wraplet/types/WrapletDependencyMap.d.ts +7 -1
- package/dist/Wraplet/utils.d.ts +1 -0
- package/dist/ambient.d.ts +254 -257
- package/dist/errors.d.ts +5 -2
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +14 -18
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/storage.cjs.map +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/types/global.d.ts +2 -1
- package/dist/utils/createLifecycleAsyncError.d.ts +2 -0
- package/dist/utils/types/Utils.d.ts +2 -2
- package/package.json +2 -2
- package/dist/AbstractWraplet.d.ts +0 -54
- package/dist/Core/DefaultArgCreator.d.ts +0 -10
- package/dist/Core/DefaultCore.d.ts +0 -64
- package/dist/Core/defaultWrapletCreator.d.ts +0 -6
- package/dist/Core/types/ArgCreator.d.ts +0 -9
- package/dist/Core/types/Core.d.ts +0 -66
- package/dist/Core/types/CoreInitOptions.d.ts +0 -7
- package/dist/Core/types/WrapletCreator.d.ts +0 -15
- package/dist/Map/MapRepeat.d.ts +0 -10
- package/dist/Map/MapWrapper.d.ts +0 -33
- package/dist/Map/types/DynamicMap.d.ts +0 -9
- package/dist/NodeTreeManager/DefaultNodeTreeManager.d.ts +0 -12
- package/dist/NodeTreeManager/types/NodeTreeParent.d.ts +0 -10
- package/dist/Wraplet/createDefaultDestroyCallback.d.ts +0 -13
- package/dist/Wraplet/createDefaultInitializeCallback.d.ts +0 -15
- package/dist/Wraplet/createRichWrapletApi.d.ts +0 -5
- package/dist/Wraplet/customizeDefaultWrapletApi.d.ts +0 -2
- package/dist/Wraplet/types/RichWrapletApi.d.ts +0 -4
- package/dist/Wraplet/types/RichWrapletApiFactoryArgs.d.ts +0 -6
- package/dist/types/Groupable.d.ts +0 -13
- /package/dist/{Core → DependencyManager}/types/DestroyListener.d.ts +0 -0
- /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
|
|
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
|
|
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,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 {};
|
package/dist/Map/utils.d.ts
CHANGED
|
@@ -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<
|
|
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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
5
|
-
export declare function removeWrapletFromNode<N extends Node>(wraplet: Wraplet
|
|
6
|
-
export declare function addWrapletToNode<N extends Node>(wraplet: Wraplet
|
|
7
|
-
export declare function actOnNodesRecursively(node: Node, callback: (node: Node) =>
|
|
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
|
|
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:
|
|
3
|
+
export declare const createWrapletApi: (args: WrapletApiFactoryArgs) => WrapletApi & WrapletApiDebug;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { StatusWritable } from "../Wraplet/types/Status";
|
|
2
|
-
import {
|
|
3
|
-
import { DestroyListener } from "../Core/types/DestroyListener";
|
|
2
|
+
import { DestroyListener } from "../DependencyManager/types/DestroyListener";
|
|
4
3
|
import { Wraplet } from "../Wraplet/types/Wraplet";
|
|
5
|
-
|
|
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
|
|
9
|
-
export declare function destructionCompleted
|
|
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
|
-
|
|
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
|
|
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
|
|
5
|
+
wraplet: WrapletApi;
|
|
7
6
|
}
|
|
8
|
-
export declare function isWraplet
|
|
7
|
+
export declare function isWraplet(object: unknown): object is Wraplet;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { DestroyListener } from "../../
|
|
1
|
+
import { DestroyListener } from "../../DependencyManager/types/DestroyListener";
|
|
2
2
|
import { Status } from "./Status";
|
|
3
|
-
|
|
4
|
-
export interface WrapletApi
|
|
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
|
|
9
|
+
addDestroyListener(callback: DestroyListener): void;
|
|
10
10
|
}
|
|
11
|
-
export
|
|
12
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
5
|
+
export type WrapletDependencyDefinition = {
|
|
8
6
|
selector?: string | SelectorCallback;
|
|
9
|
-
Class: Constructable<Wraplet
|
|
10
|
-
|
|
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
|
|
14
|
+
export type WrapletDependencyDefinitionWithDefaults<T extends WrapletDependencyDefinition = WrapletDependencyDefinition> = T & {
|
|
18
15
|
args: unknown[];
|
|
19
16
|
destructible: boolean;
|
|
20
|
-
|
|
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]
|
|
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;
|