@zudojs/container 0.0.1
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/LICENSE +21 -0
- package/README.md +38 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/containerCore/containerCore.core.d.ts +52 -0
- package/dist/containerCore/containerCore.core.d.ts.map +1 -0
- package/dist/containerCore/containerCore.core.js +150 -0
- package/dist/containerCore/containerCore.core.js.map +1 -0
- package/dist/containerCore/containerCore.scope.d.ts +58 -0
- package/dist/containerCore/containerCore.scope.d.ts.map +1 -0
- package/dist/containerCore/containerCore.scope.js +100 -0
- package/dist/containerCore/containerCore.scope.js.map +1 -0
- package/dist/containerCore/containerCore.type.d.ts +40 -0
- package/dist/containerCore/containerCore.type.d.ts.map +1 -0
- package/dist/containerCore/containerCore.type.js +5 -0
- package/dist/containerCore/containerCore.type.js.map +1 -0
- package/dist/containerCore/index.d.ts +9 -0
- package/dist/containerCore/index.d.ts.map +1 -0
- package/dist/containerCore/index.js +9 -0
- package/dist/containerCore/index.js.map +1 -0
- package/dist/containerLifecycle/containerLifecycle.core.d.ts +56 -0
- package/dist/containerLifecycle/containerLifecycle.core.d.ts.map +1 -0
- package/dist/containerLifecycle/containerLifecycle.core.js +145 -0
- package/dist/containerLifecycle/containerLifecycle.core.js.map +1 -0
- package/dist/containerLifecycle/index.d.ts +7 -0
- package/dist/containerLifecycle/index.d.ts.map +1 -0
- package/dist/containerLifecycle/index.js +7 -0
- package/dist/containerLifecycle/index.js.map +1 -0
- package/dist/containerOptions/containerOptions.type.d.ts +54 -0
- package/dist/containerOptions/containerOptions.type.d.ts.map +1 -0
- package/dist/containerOptions/containerOptions.type.js +73 -0
- package/dist/containerOptions/containerOptions.type.js.map +1 -0
- package/dist/containerOptions/index.d.ts +7 -0
- package/dist/containerOptions/index.d.ts.map +1 -0
- package/dist/containerOptions/index.js +7 -0
- package/dist/containerOptions/index.js.map +1 -0
- package/dist/containerProvider/containerProvider.core.d.ts +59 -0
- package/dist/containerProvider/containerProvider.core.d.ts.map +1 -0
- package/dist/containerProvider/containerProvider.core.js +61 -0
- package/dist/containerProvider/containerProvider.core.js.map +1 -0
- package/dist/containerProvider/index.d.ts +7 -0
- package/dist/containerProvider/index.d.ts.map +1 -0
- package/dist/containerProvider/index.js +7 -0
- package/dist/containerProvider/index.js.map +1 -0
- package/dist/containerRegistration/containerRegistration.core.d.ts +54 -0
- package/dist/containerRegistration/containerRegistration.core.d.ts.map +1 -0
- package/dist/containerRegistration/containerRegistration.core.js +135 -0
- package/dist/containerRegistration/containerRegistration.core.js.map +1 -0
- package/dist/containerRegistration/index.d.ts +7 -0
- package/dist/containerRegistration/index.d.ts.map +1 -0
- package/dist/containerRegistration/index.js +7 -0
- package/dist/containerRegistration/index.js.map +1 -0
- package/dist/containerRegistry/containerRegistry.core.d.ts +36 -0
- package/dist/containerRegistry/containerRegistry.core.d.ts.map +1 -0
- package/dist/containerRegistry/containerRegistry.core.js +153 -0
- package/dist/containerRegistry/containerRegistry.core.js.map +1 -0
- package/dist/containerRegistry/containerRegistry.error.d.ts +12 -0
- package/dist/containerRegistry/containerRegistry.error.d.ts.map +1 -0
- package/dist/containerRegistry/containerRegistry.error.js +22 -0
- package/dist/containerRegistry/containerRegistry.error.js.map +1 -0
- package/dist/containerRegistry/containerRegistry.type.d.ts +43 -0
- package/dist/containerRegistry/containerRegistry.type.d.ts.map +1 -0
- package/dist/containerRegistry/containerRegistry.type.js +14 -0
- package/dist/containerRegistry/containerRegistry.type.js.map +1 -0
- package/dist/containerRegistry/index.d.ts +9 -0
- package/dist/containerRegistry/index.d.ts.map +1 -0
- package/dist/containerRegistry/index.js +9 -0
- package/dist/containerRegistry/index.js.map +1 -0
- package/dist/containerResolution/containerResolution.core.d.ts +26 -0
- package/dist/containerResolution/containerResolution.core.d.ts.map +1 -0
- package/dist/containerResolution/containerResolution.core.js +125 -0
- package/dist/containerResolution/containerResolution.core.js.map +1 -0
- package/dist/containerResolution/containerResolution.error.d.ts +8 -0
- package/dist/containerResolution/containerResolution.error.d.ts.map +1 -0
- package/dist/containerResolution/containerResolution.error.js +8 -0
- package/dist/containerResolution/containerResolution.error.js.map +1 -0
- package/dist/containerResolution/containerResolution.type.d.ts +38 -0
- package/dist/containerResolution/containerResolution.type.d.ts.map +1 -0
- package/dist/containerResolution/containerResolution.type.js +5 -0
- package/dist/containerResolution/containerResolution.type.js.map +1 -0
- package/dist/containerResolution/index.d.ts +8 -0
- package/dist/containerResolution/index.d.ts.map +1 -0
- package/dist/containerResolution/index.js +8 -0
- package/dist/containerResolution/index.js.map +1 -0
- package/dist/containerScope/containerScope.type.d.ts +17 -0
- package/dist/containerScope/containerScope.type.d.ts.map +1 -0
- package/dist/containerScope/containerScope.type.js +43 -0
- package/dist/containerScope/containerScope.type.js.map +1 -0
- package/dist/containerScope/index.d.ts +7 -0
- package/dist/containerScope/index.d.ts.map +1 -0
- package/dist/containerScope/index.js +7 -0
- package/dist/containerScope/index.js.map +1 -0
- package/dist/containerToken/containerToken.type.d.ts +23 -0
- package/dist/containerToken/containerToken.type.d.ts.map +1 -0
- package/dist/containerToken/containerToken.type.js +45 -0
- package/dist/containerToken/containerToken.type.js.map +1 -0
- package/dist/containerToken/index.d.ts +7 -0
- package/dist/containerToken/index.d.ts.map +1 -0
- package/dist/containerToken/index.js +7 -0
- package/dist/containerToken/index.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core dependency injection container for Zudojs.
|
|
3
|
+
*/
|
|
4
|
+
import { existingProvider, factoryProvider, valueProvider, classProvider, } from "../containerProvider/containerProvider.core.js";
|
|
5
|
+
import { ContainerScope as Scope } from "../containerScope/containerScope.type.js";
|
|
6
|
+
import { ContainerRegistry } from "../containerRegistry/containerRegistry.core.js";
|
|
7
|
+
import { ContainerResolver } from "../containerResolution/containerResolution.core.js";
|
|
8
|
+
import { ContainerLifecycle, ContainerLifecycleOwner, } from "../containerLifecycle/containerLifecycle.core.js";
|
|
9
|
+
import { resolveContainerOptions } from "../containerOptions/containerOptions.type.js";
|
|
10
|
+
import { ContainerScopeContext } from "./containerCore.scope.js";
|
|
11
|
+
export class Container {
|
|
12
|
+
name;
|
|
13
|
+
options;
|
|
14
|
+
registry;
|
|
15
|
+
resolver;
|
|
16
|
+
lifecycle;
|
|
17
|
+
started = false;
|
|
18
|
+
disposed = false;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.options = resolveContainerOptions(options);
|
|
21
|
+
this.name = this.options.name;
|
|
22
|
+
this.registry = new ContainerRegistry(this.options.registry);
|
|
23
|
+
this.resolver = new ContainerResolver(this.registry);
|
|
24
|
+
this.lifecycle = new ContainerLifecycle(this.options.lifecycle);
|
|
25
|
+
}
|
|
26
|
+
start() {
|
|
27
|
+
this.ensureNotDisposed();
|
|
28
|
+
if (this.started)
|
|
29
|
+
return this;
|
|
30
|
+
this.started = true;
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
register(token, provider, options = {}) {
|
|
34
|
+
this.ensureMutable();
|
|
35
|
+
return this.registry.register(token, provider, options);
|
|
36
|
+
}
|
|
37
|
+
registerClass(token, ctor, options = {}) {
|
|
38
|
+
return this.register(token, classProvider(ctor), options);
|
|
39
|
+
}
|
|
40
|
+
registerValue(token, value, options = {}) {
|
|
41
|
+
return this.register(token, valueProvider(value), {
|
|
42
|
+
...options,
|
|
43
|
+
scope: Scope.SINGLETON,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
registerFactory(token, factory, inject = [], options = {}) {
|
|
47
|
+
return this.register(token, factoryProvider(factory, inject), options);
|
|
48
|
+
}
|
|
49
|
+
registerExisting(token, existing, options = {}) {
|
|
50
|
+
return this.register(token, existingProvider(existing), options);
|
|
51
|
+
}
|
|
52
|
+
resolve(token) {
|
|
53
|
+
this.ensureActive();
|
|
54
|
+
const result = this.resolver.resolveDetailed(token, this.resolutionOptions);
|
|
55
|
+
this.lifecycle.track(result.token, result.value, ContainerLifecycleOwner.CONTAINER);
|
|
56
|
+
return result.value;
|
|
57
|
+
}
|
|
58
|
+
resolveMany(tokens) {
|
|
59
|
+
return tokens.map((t) => this.resolve(t));
|
|
60
|
+
}
|
|
61
|
+
resolveOptional(token) {
|
|
62
|
+
if (!this.canResolve(token))
|
|
63
|
+
return undefined;
|
|
64
|
+
return this.resolve(token);
|
|
65
|
+
}
|
|
66
|
+
canResolve(token) {
|
|
67
|
+
this.ensureNotDisposed();
|
|
68
|
+
return this.resolver.canResolve(token);
|
|
69
|
+
}
|
|
70
|
+
has(token) {
|
|
71
|
+
this.ensureNotDisposed();
|
|
72
|
+
return this.registry.has(token);
|
|
73
|
+
}
|
|
74
|
+
getRegistration(token) {
|
|
75
|
+
this.ensureNotDisposed();
|
|
76
|
+
return this.registry.get(token);
|
|
77
|
+
}
|
|
78
|
+
remove(token) {
|
|
79
|
+
this.ensureMutable();
|
|
80
|
+
return this.registry.remove(token);
|
|
81
|
+
}
|
|
82
|
+
createScope(options = {}) {
|
|
83
|
+
this.ensureActive();
|
|
84
|
+
if (!this.options.allowScopes)
|
|
85
|
+
throw new Error("Container scopes are disabled.");
|
|
86
|
+
return new ContainerScopeContext(this, options);
|
|
87
|
+
}
|
|
88
|
+
getRegistrations() {
|
|
89
|
+
this.ensureNotDisposed();
|
|
90
|
+
return this.registry.getAll();
|
|
91
|
+
}
|
|
92
|
+
get registrationCount() {
|
|
93
|
+
return this.registry.size;
|
|
94
|
+
}
|
|
95
|
+
isStarted() {
|
|
96
|
+
return this.started;
|
|
97
|
+
}
|
|
98
|
+
isDisposed() {
|
|
99
|
+
return this.disposed;
|
|
100
|
+
}
|
|
101
|
+
clearSingletons() {
|
|
102
|
+
this.ensureActive();
|
|
103
|
+
this.resolver.clearSingletons();
|
|
104
|
+
}
|
|
105
|
+
async dispose() {
|
|
106
|
+
if (this.disposed)
|
|
107
|
+
return;
|
|
108
|
+
try {
|
|
109
|
+
if (this.options.autoDispose)
|
|
110
|
+
await this.lifecycle.disposeContainer();
|
|
111
|
+
else
|
|
112
|
+
this.lifecycle.reset();
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.resolver.clearSingletons();
|
|
116
|
+
this.disposed = true;
|
|
117
|
+
this.started = false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
get resolutionOptions() {
|
|
121
|
+
return {
|
|
122
|
+
autoRegisterClasses: this.options.resolution.autoRegisterClasses ?? true,
|
|
123
|
+
detectCircularDependencies: this.options.resolution.detectCircularDependencies ?? true,
|
|
124
|
+
maxResolutionDepth: this.options.resolution.maxResolutionDepth ?? 100,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
ensureActive() {
|
|
128
|
+
this.ensureNotDisposed();
|
|
129
|
+
if (!this.started)
|
|
130
|
+
this.start();
|
|
131
|
+
}
|
|
132
|
+
ensureNotDisposed() {
|
|
133
|
+
if (this.disposed)
|
|
134
|
+
throw new Error(`Container "${this.name}" has already been disposed.`);
|
|
135
|
+
}
|
|
136
|
+
ensureMutable() {
|
|
137
|
+
this.ensureNotDisposed();
|
|
138
|
+
if (!this.options.freezeRegistrations)
|
|
139
|
+
return;
|
|
140
|
+
if (this.started)
|
|
141
|
+
throw new Error(`Registrations for container "${this.name}" are frozen.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function createContainer(options = {}) {
|
|
145
|
+
return new Container(options);
|
|
146
|
+
}
|
|
147
|
+
export function createStartedContainer(options = {}) {
|
|
148
|
+
return new Container(options).start();
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=containerCore.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerCore.core.js","sourceRoot":"","sources":["../../src/containerCore/containerCore.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContainerScopeContext — child dependency scope with
|
|
3
|
+
* its own scoped-instance cache.
|
|
4
|
+
*/
|
|
5
|
+
import type { RegistrationToken } from "../containerRegistration/containerRegistration.core.js";
|
|
6
|
+
import type { ContainerScopeOptions, ContainerLike } from "./containerCore.type.js";
|
|
7
|
+
/**
|
|
8
|
+
* Represents a child dependency scope.
|
|
9
|
+
*
|
|
10
|
+
* A scope has its own scoped-instance cache while sharing
|
|
11
|
+
* registrations and singleton instances with its parent.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ContainerScopeContext {
|
|
14
|
+
private readonly parent;
|
|
15
|
+
private disposed;
|
|
16
|
+
private readonly cache;
|
|
17
|
+
private readonly lifecycle;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly metadata: Readonly<Record<string, unknown>>;
|
|
20
|
+
constructor(parent: ContainerLike, options?: ContainerScopeOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Resolves a dependency within this scope.
|
|
23
|
+
*/
|
|
24
|
+
resolve<T>(token: RegistrationToken<T>): T;
|
|
25
|
+
/**
|
|
26
|
+
* Resolves multiple dependencies within this scope.
|
|
27
|
+
*/
|
|
28
|
+
resolveMany<T>(tokens: readonly RegistrationToken<T>[]): T[];
|
|
29
|
+
/**
|
|
30
|
+
* Checks whether a dependency can be resolved.
|
|
31
|
+
*/
|
|
32
|
+
canResolve<T>(token: RegistrationToken<T>): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Checks whether a registration exists.
|
|
35
|
+
*/
|
|
36
|
+
has<T>(token: RegistrationToken<T>): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Creates another nested scope.
|
|
39
|
+
*/
|
|
40
|
+
createScope(options?: ContainerScopeOptions): ContainerScopeContext;
|
|
41
|
+
/**
|
|
42
|
+
* Disposes all instances belonging to this scope.
|
|
43
|
+
*/
|
|
44
|
+
dispose(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns whether the scope has been disposed.
|
|
47
|
+
*/
|
|
48
|
+
isDisposed(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Returns the parent container.
|
|
51
|
+
*/
|
|
52
|
+
getParent(): ContainerLike;
|
|
53
|
+
/**
|
|
54
|
+
* Throws when the scope is no longer active.
|
|
55
|
+
*/
|
|
56
|
+
private ensureActive;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=containerCore.scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerCore.scope.d.ts","sourceRoot":"","sources":["../../src/containerCore/containerCore.scope.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wDAAwD,CAAC;AAWhG,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EACd,MAAM,yBAAyB,CAAC;AAEjC;;;;;GAKG;AACH,qBAAa,qBAAqB;IAQ9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAErD,YACmB,MAAM,EAAE,aAAa,EACtC,OAAO,GAAE,qBAA0B,EAMpC;IAED;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAYzC;IAED;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAE3D;IAED;;OAEG;IACH,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAGlD;IAED;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAG3C;IAED;;OAEG;IACH,WAAW,CAAC,OAAO,GAAE,qBAA0B,GAAG,qBAAqB,CAGtE;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ7B;IAED;;OAEG;IACH,UAAU,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,SAAS,IAAI,aAAa,CAEzB;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContainerScopeContext — child dependency scope with
|
|
3
|
+
* its own scoped-instance cache.
|
|
4
|
+
*/
|
|
5
|
+
import { ContainerLifecycle, ContainerLifecycleOwner, } from "../containerLifecycle/containerLifecycle.core.js";
|
|
6
|
+
/**
|
|
7
|
+
* Represents a child dependency scope.
|
|
8
|
+
*
|
|
9
|
+
* A scope has its own scoped-instance cache while sharing
|
|
10
|
+
* registrations and singleton instances with its parent.
|
|
11
|
+
*/
|
|
12
|
+
export class ContainerScopeContext {
|
|
13
|
+
parent;
|
|
14
|
+
disposed = false;
|
|
15
|
+
cache;
|
|
16
|
+
lifecycle;
|
|
17
|
+
name;
|
|
18
|
+
metadata;
|
|
19
|
+
constructor(parent, options = {}) {
|
|
20
|
+
this.parent = parent;
|
|
21
|
+
this.name = options.name ?? `${parent.name}:scope`;
|
|
22
|
+
this.metadata = Object.freeze({ ...(options.metadata ?? {}) });
|
|
23
|
+
this.cache = parent.resolver.createScope();
|
|
24
|
+
this.lifecycle = new ContainerLifecycle();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a dependency within this scope.
|
|
28
|
+
*/
|
|
29
|
+
resolve(token) {
|
|
30
|
+
this.ensureActive();
|
|
31
|
+
const result = this.parent.resolver.resolveDetailed(token, {
|
|
32
|
+
...this.parent.resolutionOptions,
|
|
33
|
+
cache: this.cache,
|
|
34
|
+
});
|
|
35
|
+
this.lifecycle.track(result.token, result.value, ContainerLifecycleOwner.SCOPE);
|
|
36
|
+
return result.value;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolves multiple dependencies within this scope.
|
|
40
|
+
*/
|
|
41
|
+
resolveMany(tokens) {
|
|
42
|
+
return tokens.map((token) => this.resolve(token));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Checks whether a dependency can be resolved.
|
|
46
|
+
*/
|
|
47
|
+
canResolve(token) {
|
|
48
|
+
this.ensureActive();
|
|
49
|
+
return this.parent.resolver.canResolve(token);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Checks whether a registration exists.
|
|
53
|
+
*/
|
|
54
|
+
has(token) {
|
|
55
|
+
this.ensureActive();
|
|
56
|
+
return this.parent.has(token);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates another nested scope.
|
|
60
|
+
*/
|
|
61
|
+
createScope(options = {}) {
|
|
62
|
+
this.ensureActive();
|
|
63
|
+
return this.parent.createScope(options);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Disposes all instances belonging to this scope.
|
|
67
|
+
*/
|
|
68
|
+
async dispose() {
|
|
69
|
+
if (this.disposed)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
await this.lifecycle.disposeScope();
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
this.cache.clear();
|
|
76
|
+
this.disposed = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns whether the scope has been disposed.
|
|
81
|
+
*/
|
|
82
|
+
isDisposed() {
|
|
83
|
+
return this.disposed;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Returns the parent container.
|
|
87
|
+
*/
|
|
88
|
+
getParent() {
|
|
89
|
+
return this.parent;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Throws when the scope is no longer active.
|
|
93
|
+
*/
|
|
94
|
+
ensureActive() {
|
|
95
|
+
if (this.disposed) {
|
|
96
|
+
throw new Error(`Container scope "${this.name}" has already been disposed.`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=containerCore.scope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerCore.scope.js","sourceRoot":"","sources":["../../src/containerCore/containerCore.scope.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,kDAAkD,CAAC;AAW1D;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IAQb,MAAM;IAPjB,QAAQ,GAAG,KAAK,CAAC;IACR,KAAK,CAAkB;IACvB,SAAS,CAAqB;IACtC,IAAI,CAAS;IACb,QAAQ,CAAoC;IAErD,YACmB,MAAqB,EACtC,OAAO,GAA0B,EAAE;sBADlB,MAAM;QAGvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,QAAQ,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,OAAO,CAAI,KAA2B;QACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE;YACzD,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAClB,MAAM,CAAC,KAAc,EACrB,MAAM,CAAC,KAAK,EACZ,uBAAuB,CAAC,KAAK,CAC9B,CAAC;QACF,OAAO,MAAM,CAAC,KAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,WAAW,CAAI,MAAuC;QACpD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,UAAU,CAAI,KAA2B;QACvC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,GAAG,CAAI,KAA2B;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAO,GAA0B,EAAE;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,CAAC,IAAI,8BAA8B,CAC5D,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the core container.
|
|
3
|
+
*/
|
|
4
|
+
import type { RegistrationToken } from "../containerRegistration/containerRegistration.core.js";
|
|
5
|
+
/**
|
|
6
|
+
* Options used when creating a child container scope.
|
|
7
|
+
*/
|
|
8
|
+
export interface ContainerScopeOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Optional name for the child scope.
|
|
11
|
+
*/
|
|
12
|
+
readonly name?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Optional metadata for the scope.
|
|
15
|
+
*/
|
|
16
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Full Container interface including mixin methods.
|
|
20
|
+
* Used by ContainerScopeContext to reference the parent container.
|
|
21
|
+
*/
|
|
22
|
+
export interface ContainerLike {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly resolver: {
|
|
25
|
+
createScope(): import("../containerResolution/containerResolution.type.js").ResolutionCache;
|
|
26
|
+
resolveDetailed(token: unknown, options: unknown): {
|
|
27
|
+
token: unknown;
|
|
28
|
+
value: unknown;
|
|
29
|
+
};
|
|
30
|
+
canResolve(token: unknown): boolean;
|
|
31
|
+
};
|
|
32
|
+
readonly resolutionOptions: {
|
|
33
|
+
autoRegisterClasses: boolean;
|
|
34
|
+
detectCircularDependencies: boolean;
|
|
35
|
+
maxResolutionDepth: number;
|
|
36
|
+
};
|
|
37
|
+
has<T>(token: RegistrationToken<T>): boolean;
|
|
38
|
+
createScope(options?: ContainerScopeOptions): import("./containerCore.scope.js").ContainerScopeContext;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=containerCore.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerCore.type.d.ts","sourceRoot":"","sources":["../../src/containerCore/containerCore.type.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wDAAwD,CAAC;AAIhG;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE;QACjB,WAAW,IAAI,OAAO,oDAAoD,EAAE,eAAe,CAAC;QAC5F,eAAe,CACb,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACf;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,CAAC;QACtC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;KACrC,CAAC;IACF,QAAQ,CAAC,iBAAiB,EAAE;QAC1B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,0BAA0B,EAAE,OAAO,CAAC;QACpC,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAC7C,WAAW,CACT,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,0BAA0B,EAAE,qBAAqB,CAAC;CAC7D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerCore.type.js","sourceRoot":"","sources":["../../src/containerCore/containerCore.type.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/container/containerCore
|
|
3
|
+
*
|
|
4
|
+
* Core dependency injection container implementation.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./containerCore.type.js";
|
|
7
|
+
export * from "./containerCore.scope.js";
|
|
8
|
+
export * from "./containerCore.core.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/containerCore/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/container/containerCore
|
|
3
|
+
*
|
|
4
|
+
* Core dependency injection container implementation.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./containerCore.type.js";
|
|
7
|
+
export * from "./containerCore.scope.js";
|
|
8
|
+
export * from "./containerCore.core.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/containerCore/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle management for resolved container instances.
|
|
3
|
+
* Tracks instances that need cleanup and disposes them when a container or scope is destroyed.
|
|
4
|
+
*/
|
|
5
|
+
import type { Token } from "../containerToken/containerToken.type.js";
|
|
6
|
+
import { ContainerLifecycleError } from "@zudojs/errors";
|
|
7
|
+
export interface Disposable {
|
|
8
|
+
dispose(): void;
|
|
9
|
+
}
|
|
10
|
+
export interface AsyncDisposable {
|
|
11
|
+
[Symbol.asyncDispose]?: () => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export type DisposableInstance = Disposable | AsyncDisposable;
|
|
14
|
+
export declare enum ContainerLifecycleOwner {
|
|
15
|
+
CONTAINER = "container",
|
|
16
|
+
SCOPE = "scope"
|
|
17
|
+
}
|
|
18
|
+
export interface TrackedInstance<T = unknown> {
|
|
19
|
+
readonly token: Token<T>;
|
|
20
|
+
readonly instance: T;
|
|
21
|
+
readonly owner: ContainerLifecycleOwner;
|
|
22
|
+
disposed: boolean;
|
|
23
|
+
readonly trackedAt: Date;
|
|
24
|
+
}
|
|
25
|
+
export interface ContainerLifecycleOptions {
|
|
26
|
+
readonly failFast?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare class ContainerDisposalError extends ContainerLifecycleError {
|
|
29
|
+
readonly errors: readonly unknown[];
|
|
30
|
+
readonly tokens: readonly Token<unknown>[];
|
|
31
|
+
constructor(errors: readonly unknown[], tokens: readonly Token<unknown>[]);
|
|
32
|
+
}
|
|
33
|
+
export declare function isDisposable(value: unknown): value is Disposable;
|
|
34
|
+
export declare function isAsyncDisposable(value: unknown): value is AsyncDisposable;
|
|
35
|
+
export declare function isDisposableInstance(value: unknown): value is DisposableInstance;
|
|
36
|
+
export declare class ContainerLifecycle {
|
|
37
|
+
private readonly instances;
|
|
38
|
+
private readonly options;
|
|
39
|
+
private disposed;
|
|
40
|
+
constructor(options?: ContainerLifecycleOptions);
|
|
41
|
+
track<T>(token: Token<T>, instance: T, owner?: ContainerLifecycleOwner): void;
|
|
42
|
+
has<T>(token: Token<T>): boolean;
|
|
43
|
+
get<T>(token: Token<T>): TrackedInstance<T> | undefined;
|
|
44
|
+
getAll(): readonly TrackedInstance[];
|
|
45
|
+
get size(): number;
|
|
46
|
+
untrack<T>(token: Token<T>): boolean;
|
|
47
|
+
disposeInstance<T>(token: Token<T>): Promise<void>;
|
|
48
|
+
dispose(owner?: ContainerLifecycleOwner): Promise<void>;
|
|
49
|
+
disposeScope(): Promise<void>;
|
|
50
|
+
disposeContainer(): Promise<void>;
|
|
51
|
+
isDisposed(): boolean;
|
|
52
|
+
reset(): void;
|
|
53
|
+
getTrackedTokens(): readonly Token<unknown>[];
|
|
54
|
+
}
|
|
55
|
+
export declare function createContainerLifecycle(options?: ContainerLifecycleOptions): ContainerLifecycle;
|
|
56
|
+
//# sourceMappingURL=containerLifecycle.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerLifecycle.core.d.ts","sourceRoot":"","sources":["../../src/containerLifecycle/containerLifecycle.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle management for resolved container instances.
|
|
3
|
+
* Tracks instances that need cleanup and disposes them when a container or scope is destroyed.
|
|
4
|
+
*/
|
|
5
|
+
import { describeToken } from "../containerToken/containerToken.type.js";
|
|
6
|
+
import { ContainerLifecycleError } from "@zudojs/errors";
|
|
7
|
+
export var ContainerLifecycleOwner;
|
|
8
|
+
(function (ContainerLifecycleOwner) {
|
|
9
|
+
ContainerLifecycleOwner["CONTAINER"] = "container";
|
|
10
|
+
ContainerLifecycleOwner["SCOPE"] = "scope";
|
|
11
|
+
})(ContainerLifecycleOwner || (ContainerLifecycleOwner = {}));
|
|
12
|
+
export class ContainerDisposalError extends ContainerLifecycleError {
|
|
13
|
+
errors;
|
|
14
|
+
tokens;
|
|
15
|
+
constructor(errors, tokens) {
|
|
16
|
+
super("disposal", `Failed to dispose ${errors.length} container instance(s): ${tokens.map(describeToken).join(", ")}.`);
|
|
17
|
+
this.errors = errors;
|
|
18
|
+
this.tokens = tokens;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function isDisposable(value) {
|
|
22
|
+
return (typeof value === "object" &&
|
|
23
|
+
value !== null &&
|
|
24
|
+
"dispose" in value &&
|
|
25
|
+
typeof value.dispose === "function");
|
|
26
|
+
}
|
|
27
|
+
export function isAsyncDisposable(value) {
|
|
28
|
+
return (typeof value === "object" &&
|
|
29
|
+
value !== null &&
|
|
30
|
+
Symbol.asyncDispose in value &&
|
|
31
|
+
typeof value[Symbol.asyncDispose] === "function");
|
|
32
|
+
}
|
|
33
|
+
export function isDisposableInstance(value) {
|
|
34
|
+
return isDisposable(value) || isAsyncDisposable(value);
|
|
35
|
+
}
|
|
36
|
+
export class ContainerLifecycle {
|
|
37
|
+
instances = new Map();
|
|
38
|
+
options;
|
|
39
|
+
disposed = false;
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
this.options = { failFast: options.failFast ?? false };
|
|
42
|
+
}
|
|
43
|
+
track(token, instance, owner = ContainerLifecycleOwner.CONTAINER) {
|
|
44
|
+
if (this.disposed)
|
|
45
|
+
throw new Error("Cannot track an instance after the container lifecycle has been disposed.");
|
|
46
|
+
if (!isDisposableInstance(instance))
|
|
47
|
+
return;
|
|
48
|
+
this.instances.set(token, {
|
|
49
|
+
token,
|
|
50
|
+
instance,
|
|
51
|
+
owner,
|
|
52
|
+
disposed: false,
|
|
53
|
+
trackedAt: new Date(),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
has(token) {
|
|
57
|
+
return this.instances.has(token);
|
|
58
|
+
}
|
|
59
|
+
get(token) {
|
|
60
|
+
return this.instances.get(token);
|
|
61
|
+
}
|
|
62
|
+
getAll() {
|
|
63
|
+
return [...this.instances.values()];
|
|
64
|
+
}
|
|
65
|
+
get size() {
|
|
66
|
+
return this.instances.size;
|
|
67
|
+
}
|
|
68
|
+
untrack(token) {
|
|
69
|
+
return this.instances.delete(token);
|
|
70
|
+
}
|
|
71
|
+
async disposeInstance(token) {
|
|
72
|
+
const tracked = this.get(token);
|
|
73
|
+
if (!tracked || tracked.disposed)
|
|
74
|
+
return;
|
|
75
|
+
try {
|
|
76
|
+
await disposeValue(tracked.instance);
|
|
77
|
+
tracked.disposed = true;
|
|
78
|
+
this.instances.delete(token);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (this.options.failFast)
|
|
82
|
+
throw error;
|
|
83
|
+
throw new ContainerDisposalError([error], [token]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async dispose(owner) {
|
|
87
|
+
if (this.disposed)
|
|
88
|
+
return;
|
|
89
|
+
const tracked = [...this.instances.values()].reverse();
|
|
90
|
+
const selected = owner
|
|
91
|
+
? tracked.filter((entry) => entry.owner === owner)
|
|
92
|
+
: tracked;
|
|
93
|
+
const errors = [];
|
|
94
|
+
const failedTokens = [];
|
|
95
|
+
for (const entry of selected) {
|
|
96
|
+
if (entry.disposed)
|
|
97
|
+
continue;
|
|
98
|
+
try {
|
|
99
|
+
await disposeValue(entry.instance);
|
|
100
|
+
entry.disposed = true;
|
|
101
|
+
this.instances.delete(entry.token);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
errors.push(error);
|
|
105
|
+
failedTokens.push(entry.token);
|
|
106
|
+
if (this.options.failFast)
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (errors.length > 0)
|
|
111
|
+
throw new ContainerDisposalError(errors, failedTokens);
|
|
112
|
+
if (owner === undefined)
|
|
113
|
+
this.disposed = true;
|
|
114
|
+
}
|
|
115
|
+
async disposeScope() {
|
|
116
|
+
await this.dispose(ContainerLifecycleOwner.SCOPE);
|
|
117
|
+
}
|
|
118
|
+
async disposeContainer() {
|
|
119
|
+
await this.dispose(ContainerLifecycleOwner.CONTAINER);
|
|
120
|
+
}
|
|
121
|
+
isDisposed() {
|
|
122
|
+
return this.disposed;
|
|
123
|
+
}
|
|
124
|
+
reset() {
|
|
125
|
+
this.instances.clear();
|
|
126
|
+
this.disposed = false;
|
|
127
|
+
}
|
|
128
|
+
getTrackedTokens() {
|
|
129
|
+
return [...this.instances.keys()];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async function disposeValue(value) {
|
|
133
|
+
if (isAsyncDisposable(value)) {
|
|
134
|
+
await value[Symbol.asyncDispose]();
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (isDisposable(value)) {
|
|
138
|
+
value.dispose();
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export function createContainerLifecycle(options = {}) {
|
|
143
|
+
return new ContainerLifecycle(options);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=containerLifecycle.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"containerLifecycle.core.js","sourceRoot":"","sources":["../../src/containerLifecycle/containerLifecycle.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/containerLifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/containerLifecycle/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,8BAA8B,CAAC"}
|