ts-ioc-container 72.0.0 → 72.2.0
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/AGENTS.md +179 -0
- package/README.md +94 -0
- package/cjm/container/Container.js +2 -2
- package/cjm/container/EmptyContainer.js +17 -15
- package/cjm/errors/ArgumentNotFoundError.js +1 -0
- package/cjm/errors/CannonSingletonApplyTwiceError.js +2 -14
- package/cjm/errors/CannotApplySingletonTwiceError.js +18 -0
- package/cjm/errors/ContainerDisposedError.js +1 -0
- package/cjm/errors/ContainerError.js +1 -0
- package/cjm/errors/ContainerNotFoundError.js +1 -0
- package/cjm/errors/DependencyMissingKeyError.js +1 -0
- package/cjm/errors/DependencyNotFoundError.js +1 -0
- package/cjm/errors/MethodNotImplementedError.js +1 -0
- package/cjm/errors/ProviderDisposedError.js +1 -0
- package/cjm/errors/TypedEventDisposedError.js +1 -0
- package/cjm/errors/UnsupportedTokenTypeError.js +1 -0
- package/cjm/index.js +8 -3
- package/cjm/metadata/class.js +3 -1
- package/cjm/metadata/method.js +3 -1
- package/cjm/metadata/parameter.js +7 -1
- package/cjm/provider/Provider.js +6 -6
- package/cjm/registration/Registration.js +2 -2
- package/cjm/token/ConstantToken.js +4 -4
- package/cjm/token/FunctionToken.js +1 -1
- package/cjm/token/GroupInstanceToken.js +4 -4
- package/cjm/token/toToken.js +1 -1
- package/cjm/utils/TypedEvent.js +1 -1
- package/cjm/utils/array.js +1 -1
- package/esm/container/Container.js +2 -2
- package/esm/container/EmptyContainer.js +17 -15
- package/esm/errors/ArgumentNotFoundError.js +1 -0
- package/esm/errors/CannonSingletonApplyTwiceError.js +2 -13
- package/esm/errors/CannotApplySingletonTwiceError.js +14 -0
- package/esm/errors/ContainerDisposedError.js +1 -0
- package/esm/errors/ContainerError.js +1 -0
- package/esm/errors/ContainerNotFoundError.js +1 -0
- package/esm/errors/DependencyMissingKeyError.js +1 -0
- package/esm/errors/DependencyNotFoundError.js +1 -0
- package/esm/errors/MethodNotImplementedError.js +1 -0
- package/esm/errors/ProviderDisposedError.js +1 -0
- package/esm/errors/TypedEventDisposedError.js +1 -0
- package/esm/errors/UnsupportedTokenTypeError.js +1 -0
- package/esm/index.js +4 -3
- package/esm/metadata/class.js +1 -0
- package/esm/metadata/method.js +1 -0
- package/esm/metadata/parameter.js +5 -0
- package/esm/provider/Provider.js +6 -6
- package/esm/registration/Registration.js +2 -2
- package/esm/token/ConstantToken.js +4 -4
- package/esm/token/FunctionToken.js +1 -1
- package/esm/token/GroupInstanceToken.js +4 -4
- package/esm/token/toToken.js +1 -1
- package/esm/utils/TypedEvent.js +1 -1
- package/esm/utils/array.js +1 -1
- package/lib/ExecutionContext.ts +6 -0
- package/lib/container/AliasMap.ts +30 -0
- package/lib/container/AutoResolveModule.ts +24 -0
- package/lib/container/Container.ts +311 -0
- package/lib/container/EmptyContainer.ts +166 -0
- package/lib/container/IContainer.ts +156 -0
- package/lib/errors/ArgumentNotFoundError.ts +13 -0
- package/lib/errors/CannonSingletonApplyTwiceError.ts +6 -0
- package/lib/errors/CannotApplySingletonTwiceError.ts +22 -0
- package/lib/errors/ContainerDisposedError.ts +13 -0
- package/lib/errors/ContainerError.ts +15 -0
- package/lib/errors/ContainerNotFoundError.ts +13 -0
- package/lib/errors/DependencyMissingKeyError.ts +13 -0
- package/lib/errors/DependencyNotFoundError.ts +13 -0
- package/lib/errors/MethodNotImplementedError.ts +13 -0
- package/lib/errors/ProviderDisposedError.ts +22 -0
- package/lib/errors/TypedEventDisposedError.ts +22 -0
- package/lib/errors/UnsupportedTokenTypeError.ts +13 -0
- package/lib/hooks/HookCollector.ts +109 -0
- package/lib/hooks/HookContext.ts +85 -0
- package/lib/hooks/combinators.ts +51 -0
- package/lib/hooks/hook.ts +89 -0
- package/lib/hooks/injectProp.ts +14 -0
- package/lib/index.ts +181 -0
- package/lib/injector/IInjector.ts +88 -0
- package/lib/injector/MetadataInjector.ts +100 -0
- package/lib/injector/ProxyInjector.ts +31 -0
- package/lib/injector/SimpleInjector.ts +20 -0
- package/lib/metadata/class.ts +50 -0
- package/lib/metadata/method.ts +47 -0
- package/lib/metadata/parameter.ts +60 -0
- package/lib/metadata/target.ts +25 -0
- package/lib/provider/IProvider.ts +65 -0
- package/lib/provider/Provider.ts +174 -0
- package/lib/registration/IRegistration.ts +235 -0
- package/lib/registration/Registration.ts +122 -0
- package/lib/select.ts +33 -0
- package/lib/token/BindToken.ts +13 -0
- package/lib/token/ClassToken.ts +72 -0
- package/lib/token/ConstantToken.ts +50 -0
- package/lib/token/FunctionToken.ts +79 -0
- package/lib/token/GroupAliasToken.ts +92 -0
- package/lib/token/GroupInstanceToken.ts +70 -0
- package/lib/token/InjectionToken.ts +46 -0
- package/lib/token/SingleAliasToken.ts +84 -0
- package/lib/token/SingleToken.ts +93 -0
- package/lib/token/toToken.ts +46 -0
- package/lib/utils/ProxyRegistry.ts +149 -0
- package/lib/utils/TypedEvent.ts +96 -0
- package/lib/utils/array.ts +28 -0
- package/lib/utils/basic.ts +34 -0
- package/lib/utils/debounce.ts +18 -0
- package/lib/utils/errorHandler.ts +34 -0
- package/lib/utils/fp.ts +86 -0
- package/lib/utils/getConstructorChain.ts +17 -0
- package/lib/utils/memoize.ts +24 -0
- package/lib/utils/once.ts +24 -0
- package/lib/utils/shallowCache.ts +22 -0
- package/lib/utils/task.ts +33 -0
- package/lib/utils/throttle.ts +17 -0
- package/package.json +5 -3
- package/typings/ExecutionContext.d.ts +2 -0
- package/typings/ExecutionContext.d.ts.map +1 -0
- package/typings/container/AliasMap.d.ts +1 -0
- package/typings/container/AliasMap.d.ts.map +1 -0
- package/typings/container/AutoResolveModule.d.ts +16 -0
- package/typings/container/AutoResolveModule.d.ts.map +1 -0
- package/typings/container/Container.d.ts +60 -0
- package/typings/container/Container.d.ts.map +1 -0
- package/typings/container/EmptyContainer.d.ts +51 -0
- package/typings/container/EmptyContainer.d.ts.map +1 -0
- package/typings/container/IContainer.d.ts +75 -0
- package/typings/container/IContainer.d.ts.map +1 -0
- package/typings/errors/ArgumentNotFoundError.d.ts +3 -0
- package/typings/errors/ArgumentNotFoundError.d.ts.map +1 -0
- package/typings/errors/CannonSingletonApplyTwiceError.d.ts +6 -6
- package/typings/errors/CannonSingletonApplyTwiceError.d.ts.map +1 -0
- package/typings/errors/CannotApplySingletonTwiceError.d.ts +12 -0
- package/typings/errors/CannotApplySingletonTwiceError.d.ts.map +1 -0
- package/typings/errors/ContainerDisposedError.d.ts +3 -0
- package/typings/errors/ContainerDisposedError.d.ts.map +1 -0
- package/typings/errors/ContainerError.d.ts +7 -0
- package/typings/errors/ContainerError.d.ts.map +1 -0
- package/typings/errors/ContainerNotFoundError.d.ts +3 -0
- package/typings/errors/ContainerNotFoundError.d.ts.map +1 -0
- package/typings/errors/DependencyMissingKeyError.d.ts +3 -0
- package/typings/errors/DependencyMissingKeyError.d.ts.map +1 -0
- package/typings/errors/DependencyNotFoundError.d.ts +3 -0
- package/typings/errors/DependencyNotFoundError.d.ts.map +1 -0
- package/typings/errors/MethodNotImplementedError.d.ts +3 -0
- package/typings/errors/MethodNotImplementedError.d.ts.map +1 -0
- package/typings/errors/ProviderDisposedError.d.ts +6 -0
- package/typings/errors/ProviderDisposedError.d.ts.map +1 -0
- package/typings/errors/TypedEventDisposedError.d.ts +6 -0
- package/typings/errors/TypedEventDisposedError.d.ts.map +1 -0
- package/typings/errors/UnsupportedTokenTypeError.d.ts +3 -0
- package/typings/errors/UnsupportedTokenTypeError.d.ts.map +1 -0
- package/typings/hooks/HookCollector.d.ts +36 -0
- package/typings/hooks/HookCollector.d.ts.map +1 -0
- package/typings/hooks/HookContext.d.ts +10 -0
- package/typings/hooks/HookContext.d.ts.map +1 -0
- package/typings/hooks/combinators.d.ts +23 -0
- package/typings/hooks/combinators.d.ts.map +1 -0
- package/typings/hooks/hook.d.ts +39 -0
- package/typings/hooks/hook.d.ts.map +1 -0
- package/typings/hooks/injectProp.d.ts +9 -0
- package/typings/hooks/injectProp.d.ts.map +1 -0
- package/typings/index.d.ts +5 -3
- package/typings/index.d.ts.map +1 -0
- package/typings/injector/IInjector.d.ts +32 -0
- package/typings/injector/IInjector.d.ts.map +1 -0
- package/typings/injector/MetadataInjector.d.ts +58 -0
- package/typings/injector/MetadataInjector.d.ts.map +1 -0
- package/typings/injector/ProxyInjector.d.ts +13 -0
- package/typings/injector/ProxyInjector.d.ts.map +1 -0
- package/typings/injector/SimpleInjector.d.ts +13 -0
- package/typings/injector/SimpleInjector.d.ts.map +1 -0
- package/typings/metadata/class.d.ts +28 -0
- package/typings/metadata/class.d.ts.map +1 -0
- package/typings/metadata/method.d.ts +25 -0
- package/typings/metadata/method.d.ts.map +1 -0
- package/typings/metadata/parameter.d.ts +22 -0
- package/typings/metadata/parameter.d.ts.map +1 -0
- package/typings/metadata/target.d.ts +19 -0
- package/typings/metadata/target.d.ts.map +1 -0
- package/typings/provider/IProvider.d.ts +25 -0
- package/typings/provider/IProvider.d.ts.map +1 -0
- package/typings/provider/Provider.d.ts +30 -0
- package/typings/provider/Provider.d.ts.map +1 -0
- package/typings/registration/IRegistration.d.ts +137 -0
- package/typings/registration/IRegistration.d.ts.map +1 -0
- package/typings/registration/Registration.d.ts +23 -0
- package/typings/registration/Registration.d.ts.map +1 -0
- package/typings/select.d.ts +15 -0
- package/typings/select.d.ts.map +1 -0
- package/typings/token/BindToken.d.ts +3 -0
- package/typings/token/BindToken.d.ts.map +1 -0
- package/typings/token/ClassToken.d.ts +2 -0
- package/typings/token/ClassToken.d.ts.map +1 -0
- package/typings/token/ConstantToken.d.ts +14 -0
- package/typings/token/ConstantToken.d.ts.map +1 -0
- package/typings/token/FunctionToken.d.ts +10 -0
- package/typings/token/FunctionToken.d.ts.map +1 -0
- package/typings/token/GroupAliasToken.d.ts +14 -0
- package/typings/token/GroupAliasToken.d.ts.map +1 -0
- package/typings/token/GroupInstanceToken.d.ts +19 -0
- package/typings/token/GroupInstanceToken.d.ts.map +1 -0
- package/typings/token/InjectionToken.d.ts +8 -0
- package/typings/token/InjectionToken.d.ts.map +1 -0
- package/typings/token/SingleAliasToken.d.ts +6 -0
- package/typings/token/SingleAliasToken.d.ts.map +1 -0
- package/typings/token/SingleToken.d.ts +18 -0
- package/typings/token/SingleToken.d.ts.map +1 -0
- package/typings/token/toToken.d.ts +12 -0
- package/typings/token/toToken.d.ts.map +1 -0
- package/typings/utils/ProxyRegistry.d.ts +63 -0
- package/typings/utils/ProxyRegistry.d.ts.map +1 -0
- package/typings/utils/TypedEvent.d.ts +42 -0
- package/typings/utils/TypedEvent.d.ts.map +1 -0
- package/typings/utils/array.d.ts +7 -0
- package/typings/utils/array.d.ts.map +1 -0
- package/typings/utils/basic.d.ts +12 -0
- package/typings/utils/basic.d.ts.map +1 -0
- package/typings/utils/debounce.d.ts +2 -0
- package/typings/utils/debounce.d.ts.map +1 -0
- package/typings/utils/errorHandler.d.ts +4 -0
- package/typings/utils/errorHandler.d.ts.map +1 -0
- package/typings/utils/fp.d.ts +8 -0
- package/typings/utils/fp.d.ts.map +1 -0
- package/typings/utils/getConstructorChain.d.ts +9 -0
- package/typings/utils/getConstructorChain.d.ts.map +1 -0
- package/typings/utils/memoize.d.ts +10 -0
- package/typings/utils/memoize.d.ts.map +1 -0
- package/typings/utils/once.d.ts +2 -0
- package/typings/utils/once.d.ts.map +1 -0
- package/typings/utils/shallowCache.d.ts +2 -0
- package/typings/utils/shallowCache.d.ts.map +1 -0
- package/typings/utils/task.d.ts +13 -0
- package/typings/utils/task.d.ts.map +1 -0
- package/typings/utils/throttle.d.ts +2 -0
- package/typings/utils/throttle.d.ts.map +1 -0
package/cjm/provider/Provider.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Provider = void 0;
|
|
4
4
|
const basic_1 = require("../utils/basic");
|
|
5
|
-
const
|
|
5
|
+
const CannotApplySingletonTwiceError_1 = require("../errors/CannotApplySingletonTwiceError");
|
|
6
6
|
const ProviderDisposedError_1 = require("../errors/ProviderDisposedError");
|
|
7
7
|
class Provider {
|
|
8
8
|
resolveDependency;
|
|
@@ -28,7 +28,7 @@ class Provider {
|
|
|
28
28
|
this.resolveDependency = resolveDependency;
|
|
29
29
|
}
|
|
30
30
|
resolve(options) {
|
|
31
|
-
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
31
|
+
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
32
32
|
if (!this.getKey) {
|
|
33
33
|
return this.resolveDep(options);
|
|
34
34
|
}
|
|
@@ -67,7 +67,7 @@ class Provider {
|
|
|
67
67
|
return this;
|
|
68
68
|
}
|
|
69
69
|
isAutoResolvable() {
|
|
70
|
-
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
70
|
+
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
71
71
|
return this.isAutoResolve;
|
|
72
72
|
}
|
|
73
73
|
addArgsFn(...fns) {
|
|
@@ -75,11 +75,11 @@ class Provider {
|
|
|
75
75
|
return this;
|
|
76
76
|
}
|
|
77
77
|
hasAccess(options) {
|
|
78
|
-
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
78
|
+
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
79
79
|
return this.accessRules.reduce((acc, rule) => rule(options, acc), true);
|
|
80
80
|
}
|
|
81
81
|
singleton(getCacheKey = () => '1') {
|
|
82
|
-
|
|
82
|
+
CannotApplySingletonTwiceError_1.CannotApplySingletonTwiceError.assert(!this.getKey, 'Provider is already singleton: singleton() was applied twice to the same provider. Remove the duplicate singleton().');
|
|
83
83
|
this.getKey = getCacheKey;
|
|
84
84
|
return this;
|
|
85
85
|
}
|
|
@@ -88,7 +88,7 @@ class Provider {
|
|
|
88
88
|
return this;
|
|
89
89
|
}
|
|
90
90
|
dispose() {
|
|
91
|
-
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
91
|
+
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
92
92
|
this.isDisposed = true;
|
|
93
93
|
this.isAutoResolve = false;
|
|
94
94
|
this.getKey = undefined;
|
|
@@ -62,14 +62,14 @@ class Registration {
|
|
|
62
62
|
return;
|
|
63
63
|
}
|
|
64
64
|
if (!this.key) {
|
|
65
|
-
throw new DependencyMissingKeyError_1.DependencyMissingKeyError('No key provided for registration');
|
|
65
|
+
throw new DependencyMissingKeyError_1.DependencyMissingKeyError('No key provided for registration: bind it with @register(bindTo(...)) or .bindTo(...).');
|
|
66
66
|
}
|
|
67
67
|
const provider = this.mappers.reduce((p, m) => m(p), this.createProvider());
|
|
68
68
|
container.register(this.key, provider, { aliases: [...this.aliases] });
|
|
69
69
|
}
|
|
70
70
|
getKeyOrFail() {
|
|
71
71
|
if (!this.key) {
|
|
72
|
-
throw new DependencyMissingKeyError_1.DependencyMissingKeyError('No key provided for registration');
|
|
72
|
+
throw new DependencyMissingKeyError_1.DependencyMissingKeyError('No key provided for registration: bind it with @register(bindTo(...)) or .bindTo(...).');
|
|
73
73
|
}
|
|
74
74
|
return this.key;
|
|
75
75
|
}
|
|
@@ -13,19 +13,19 @@ class ConstantToken extends InjectionToken_1.InjectionToken {
|
|
|
13
13
|
return this.token;
|
|
14
14
|
}
|
|
15
15
|
args(...deps) {
|
|
16
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
16
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('ConstantToken.args is not implemented');
|
|
17
17
|
}
|
|
18
18
|
argsFn(getArgsFn) {
|
|
19
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
19
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('ConstantToken.argsFn is not implemented');
|
|
20
20
|
}
|
|
21
21
|
lazy() {
|
|
22
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
22
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('ConstantToken.lazy is not implemented');
|
|
23
23
|
}
|
|
24
24
|
addTags(...tags) {
|
|
25
25
|
return new ConstantToken(this.token, { tags: [...this.getTags(), ...tags] });
|
|
26
26
|
}
|
|
27
27
|
toString() {
|
|
28
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
28
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('ConstantToken.toString is not implemented');
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
exports.ConstantToken = ConstantToken;
|
|
@@ -51,7 +51,7 @@ class FunctionToken extends InjectionToken_1.InjectionToken {
|
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
toString() {
|
|
54
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
54
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('FunctionToken.toString is not implemented');
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
exports.FunctionToken = FunctionToken;
|
|
@@ -15,13 +15,13 @@ class GroupInstanceToken extends InjectionToken_1.InjectionToken {
|
|
|
15
15
|
return (s) => this.resolve(s).map(fn);
|
|
16
16
|
}
|
|
17
17
|
args(...deps) {
|
|
18
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
18
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('GroupInstanceToken.args is not implemented');
|
|
19
19
|
}
|
|
20
20
|
argsFn(getArgsFn) {
|
|
21
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
21
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('GroupInstanceToken.argsFn is not implemented');
|
|
22
22
|
}
|
|
23
23
|
lazy() {
|
|
24
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
24
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('GroupInstanceToken.lazy is not implemented');
|
|
25
25
|
}
|
|
26
26
|
cascade(isTrue) {
|
|
27
27
|
this.isCascade = isTrue;
|
|
@@ -34,7 +34,7 @@ class GroupInstanceToken extends InjectionToken_1.InjectionToken {
|
|
|
34
34
|
return new GroupInstanceToken(this.predicate, { tags: [...this.getTags(), ...tags], isCascade: this.isCascade });
|
|
35
35
|
}
|
|
36
36
|
toString() {
|
|
37
|
-
throw new MethodNotImplementedError_1.MethodNotImplementedError('not implemented');
|
|
37
|
+
throw new MethodNotImplementedError_1.MethodNotImplementedError('GroupInstanceToken.toString is not implemented');
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
exports.GroupInstanceToken = GroupInstanceToken;
|
package/cjm/token/toToken.js
CHANGED
|
@@ -22,7 +22,7 @@ const toToken = (token) => {
|
|
|
22
22
|
if (typeof token === 'function') {
|
|
23
23
|
return new FunctionToken_1.FunctionToken(token);
|
|
24
24
|
}
|
|
25
|
-
throw new UnsupportedTokenTypeError_1.UnsupportedTokenTypeError(`Unknown token ${token}
|
|
25
|
+
throw new UnsupportedTokenTypeError_1.UnsupportedTokenTypeError(`Unknown token ${token}: expected an InjectionToken, a DependencyKey (string | symbol), a class or a function.`);
|
|
26
26
|
};
|
|
27
27
|
exports.toToken = toToken;
|
|
28
28
|
const argToToken = (v) => ((0, InjectionToken_1.isInjectionToken)(v) ? v : new ConstantToken_1.ConstantToken(v));
|
package/cjm/utils/TypedEvent.js
CHANGED
|
@@ -29,7 +29,7 @@ class TypedEvent {
|
|
|
29
29
|
this.isDisposed = true;
|
|
30
30
|
}
|
|
31
31
|
validate() {
|
|
32
|
-
TypedEventDisposedError_1.TypedEventDisposedError.assert(!this.isDisposed, 'TypedEvent is already disposed');
|
|
32
|
+
TypedEventDisposedError_1.TypedEventDisposedError.assert(!this.isDisposed, 'TypedEvent is already disposed: its scope was disposed, so it accepts no new listeners.');
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
exports.TypedEvent = TypedEvent;
|
package/cjm/utils/array.js
CHANGED
|
@@ -11,7 +11,7 @@ exports.Filter = {
|
|
|
11
11
|
const findOrFail = (predicate) => (args = []) => {
|
|
12
12
|
const index = args.findIndex((arg) => predicate(arg));
|
|
13
13
|
if (index === -1) {
|
|
14
|
-
throw new ArgumentNotFoundError_1.ArgumentNotFoundError();
|
|
14
|
+
throw new ArgumentNotFoundError_1.ArgumentNotFoundError(`No argument matches the predicate (received ${args.length} args).`);
|
|
15
15
|
}
|
|
16
16
|
return args[index];
|
|
17
17
|
};
|
|
@@ -161,12 +161,12 @@ export class Container {
|
|
|
161
161
|
}
|
|
162
162
|
validateContainer() {
|
|
163
163
|
if (this.isDisposed) {
|
|
164
|
-
throw new ContainerDisposedError('Container is already disposed');
|
|
164
|
+
throw new ContainerDisposedError('Container is already disposed: a scope cannot be used after dispose(). Create a new scope.');
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
findProviderByKeyOrFail(key) {
|
|
168
168
|
if (!this.providers.has(key)) {
|
|
169
|
-
throw new DependencyNotFoundError(`Provider ${key.toString()} does not exist
|
|
169
|
+
throw new DependencyNotFoundError(`Provider ${key.toString()} does not exist: an alias points at a key with no provider in this scope.`);
|
|
170
170
|
}
|
|
171
171
|
return this.providers.get(key);
|
|
172
172
|
}
|
|
@@ -2,7 +2,7 @@ import { MethodNotImplementedError } from '../errors/MethodNotImplementedError.j
|
|
|
2
2
|
import { DependencyNotFoundError } from '../errors/DependencyNotFoundError.js';
|
|
3
3
|
export class EmptyContainer {
|
|
4
4
|
get isDisposed() {
|
|
5
|
-
throw new MethodNotImplementedError();
|
|
5
|
+
throw new MethodNotImplementedError('EmptyContainer.isDisposed is not implemented');
|
|
6
6
|
}
|
|
7
7
|
addInstance(instance) { }
|
|
8
8
|
getParent() {
|
|
@@ -18,25 +18,25 @@ export class EmptyContainer {
|
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
20
|
createScope() {
|
|
21
|
-
throw new MethodNotImplementedError();
|
|
21
|
+
throw new MethodNotImplementedError('EmptyContainer.createScope is not implemented');
|
|
22
22
|
}
|
|
23
23
|
getInjector() {
|
|
24
|
-
throw new MethodNotImplementedError();
|
|
24
|
+
throw new MethodNotImplementedError('EmptyContainer.getInjector is not implemented');
|
|
25
25
|
}
|
|
26
26
|
autoResolve(options) {
|
|
27
|
-
throw new MethodNotImplementedError();
|
|
27
|
+
throw new MethodNotImplementedError('EmptyContainer.autoResolve is not implemented');
|
|
28
28
|
}
|
|
29
29
|
dispose() {
|
|
30
|
-
throw new MethodNotImplementedError();
|
|
30
|
+
throw new MethodNotImplementedError('EmptyContainer.dispose is not implemented');
|
|
31
31
|
}
|
|
32
32
|
register(key, value) {
|
|
33
|
-
throw new MethodNotImplementedError();
|
|
33
|
+
throw new MethodNotImplementedError('EmptyContainer.register is not implemented');
|
|
34
34
|
}
|
|
35
35
|
hasTag(tag) {
|
|
36
|
-
throw new MethodNotImplementedError();
|
|
36
|
+
throw new MethodNotImplementedError('EmptyContainer.hasTag is not implemented');
|
|
37
37
|
}
|
|
38
38
|
addTags(...tags) {
|
|
39
|
-
throw new MethodNotImplementedError();
|
|
39
|
+
throw new MethodNotImplementedError('EmptyContainer.addTags is not implemented');
|
|
40
40
|
}
|
|
41
41
|
getRegistrations() {
|
|
42
42
|
return [];
|
|
@@ -46,27 +46,29 @@ export class EmptyContainer {
|
|
|
46
46
|
}
|
|
47
47
|
removeScope() { }
|
|
48
48
|
useModule(module) {
|
|
49
|
-
throw new MethodNotImplementedError();
|
|
49
|
+
throw new MethodNotImplementedError('EmptyContainer.useModule is not implemented');
|
|
50
50
|
}
|
|
51
51
|
addRegistration(registration) {
|
|
52
|
-
throw new MethodNotImplementedError();
|
|
52
|
+
throw new MethodNotImplementedError('EmptyContainer.addRegistration is not implemented');
|
|
53
53
|
}
|
|
54
54
|
resolve(key, options) {
|
|
55
|
-
throw new DependencyNotFoundError(`Cannot find ${key.toString()}`
|
|
55
|
+
throw new DependencyNotFoundError(`Cannot find ${key.toString()}: no provider for this key in the resolving scope or any parent. ` +
|
|
56
|
+
'Check that it is registered, that its scope(...) rule matches this scope, that its scopeAccess(...) rule allows it, ' +
|
|
57
|
+
'and that it was registered before createScope() (existing child scopes are not updated).');
|
|
56
58
|
}
|
|
57
59
|
resolveByAlias(alias, options) {
|
|
58
60
|
return [];
|
|
59
61
|
}
|
|
60
62
|
resolveOneByAlias(alias, options) {
|
|
61
|
-
throw new DependencyNotFoundError(`Cannot find alias ${alias.toString()}
|
|
63
|
+
throw new DependencyNotFoundError(`Cannot find alias ${alias.toString()}: no accessible registration carries this alias in the resolving scope or any parent.`);
|
|
62
64
|
}
|
|
63
65
|
get scopeCreated() {
|
|
64
|
-
throw new MethodNotImplementedError();
|
|
66
|
+
throw new MethodNotImplementedError('EmptyContainer.scopeCreated is not implemented');
|
|
65
67
|
}
|
|
66
68
|
get scopeDisposed() {
|
|
67
|
-
throw new MethodNotImplementedError();
|
|
69
|
+
throw new MethodNotImplementedError('EmptyContainer.scopeDisposed is not implemented');
|
|
68
70
|
}
|
|
69
71
|
get registered() {
|
|
70
|
-
throw new MethodNotImplementedError();
|
|
72
|
+
throw new MethodNotImplementedError('EmptyContainer.registered is not implemented');
|
|
71
73
|
}
|
|
72
74
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class ArgumentNotFoundError extends ContainerError {
|
|
3
3
|
name = 'ArgumentNotFoundError';
|
|
4
|
+
code = 'IOC_ARGUMENT_NOT_FOUND';
|
|
4
5
|
constructor(message = 'Argument not found') {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, ArgumentNotFoundError.prototype);
|
|
@@ -1,13 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
name = 'CannonSingletonApplyTwiceError';
|
|
4
|
-
constructor(message) {
|
|
5
|
-
super(message);
|
|
6
|
-
Object.setPrototypeOf(this, CannonSingletonApplyTwiceError.prototype);
|
|
7
|
-
}
|
|
8
|
-
static assert(isTrue, failMessage) {
|
|
9
|
-
if (!isTrue) {
|
|
10
|
-
throw new CannonSingletonApplyTwiceError(failMessage);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
1
|
+
import { CannotApplySingletonTwiceError } from './CannotApplySingletonTwiceError.js';
|
|
2
|
+
export const CannonSingletonApplyTwiceError = CannotApplySingletonTwiceError;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ContainerError } from './ContainerError.js';
|
|
2
|
+
export class CannotApplySingletonTwiceError extends ContainerError {
|
|
3
|
+
name = 'CannotApplySingletonTwiceError';
|
|
4
|
+
code = 'IOC_SINGLETON_APPLIED_TWICE';
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
Object.setPrototypeOf(this, CannotApplySingletonTwiceError.prototype);
|
|
8
|
+
}
|
|
9
|
+
static assert(isTrue, failMessage) {
|
|
10
|
+
if (!isTrue) {
|
|
11
|
+
throw new CannotApplySingletonTwiceError(failMessage);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class ContainerDisposedError extends ContainerError {
|
|
3
3
|
name = 'ContainerDisposedError';
|
|
4
|
+
code = 'IOC_CONTAINER_DISPOSED';
|
|
4
5
|
constructor(message) {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, ContainerDisposedError.prototype);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class ContainerNotFoundError extends ContainerError {
|
|
3
3
|
name = 'ContainerNotFoundError';
|
|
4
|
+
code = 'IOC_CONTAINER_NOT_FOUND';
|
|
4
5
|
constructor(message) {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, ContainerNotFoundError.prototype);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class DependencyMissingKeyError extends ContainerError {
|
|
3
3
|
name = 'DependencyMissingKeyError';
|
|
4
|
+
code = 'IOC_DEPENDENCY_MISSING_KEY';
|
|
4
5
|
constructor(message) {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, DependencyMissingKeyError.prototype);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class DependencyNotFoundError extends ContainerError {
|
|
3
3
|
name = 'DependencyNotFoundError';
|
|
4
|
+
code = 'IOC_DEPENDENCY_NOT_FOUND';
|
|
4
5
|
constructor(message) {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, DependencyNotFoundError.prototype);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class MethodNotImplementedError extends ContainerError {
|
|
3
3
|
name = 'MethodNotImplementedError';
|
|
4
|
+
code = 'IOC_METHOD_NOT_IMPLEMENTED';
|
|
4
5
|
constructor(message) {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, MethodNotImplementedError.prototype);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class ProviderDisposedError extends ContainerError {
|
|
3
3
|
name = 'ProviderDisposedError';
|
|
4
|
+
code = 'IOC_PROVIDER_DISPOSED';
|
|
4
5
|
static assert(isTrue, failMessage) {
|
|
5
6
|
if (!isTrue) {
|
|
6
7
|
throw new ProviderDisposedError(failMessage);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class TypedEventDisposedError extends ContainerError {
|
|
3
3
|
name = 'TypedEventDisposedError';
|
|
4
|
+
code = 'IOC_EVENT_DISPOSED';
|
|
4
5
|
static assert(isTrue, failMessage) {
|
|
5
6
|
if (!isTrue) {
|
|
6
7
|
throw new TypedEventDisposedError(failMessage);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ContainerError } from './ContainerError.js';
|
|
2
2
|
export class UnsupportedTokenTypeError extends ContainerError {
|
|
3
3
|
name = 'UnsupportedTokenTypeError';
|
|
4
|
+
code = 'IOC_UNSUPPORTED_TOKEN_TYPE';
|
|
4
5
|
constructor(message) {
|
|
5
6
|
super(message);
|
|
6
7
|
Object.setPrototypeOf(this, UnsupportedTokenTypeError.prototype);
|
package/esm/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export { DependencyMissingKeyError } from './errors/DependencyMissingKeyError.js
|
|
|
16
16
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError.js';
|
|
17
17
|
export { ContainerDisposedError } from './errors/ContainerDisposedError.js';
|
|
18
18
|
export { ProviderDisposedError } from './errors/ProviderDisposedError.js';
|
|
19
|
+
export { CannotApplySingletonTwiceError } from './errors/CannotApplySingletonTwiceError.js';
|
|
19
20
|
export { CannonSingletonApplyTwiceError } from './errors/CannonSingletonApplyTwiceError.js';
|
|
20
21
|
export { UnsupportedTokenTypeError } from './errors/UnsupportedTokenTypeError.js';
|
|
21
22
|
export { TypedEventDisposedError } from './errors/TypedEventDisposedError.js';
|
|
@@ -35,9 +36,9 @@ export { FunctionToken } from './token/FunctionToken.js';
|
|
|
35
36
|
export { ConstantToken } from './token/ConstantToken.js';
|
|
36
37
|
export { GroupInstanceToken } from './token/GroupInstanceToken.js';
|
|
37
38
|
export { resolveConstructor } from './metadata/target.js';
|
|
38
|
-
export { addClassMeta, getClassMeta, addClassLabel, getClassLabels, addClassTag, getClassTags } from './metadata/class.js';
|
|
39
|
-
export { addParamMeta, getParamMeta, addParamLabel, getParamLabels, addParamTag, getParamTags, } from './metadata/parameter.js';
|
|
40
|
-
export { addMethodMeta, getMethodMeta, addMethodLabel, getMethodLabels, addMethodTag, getMethodTags, } from './metadata/method.js';
|
|
39
|
+
export { addClassMeta, getClassMeta, addClassLabel, getClassLabels, addClassTag, getClassTags, createComposeClassDecorator, } from './metadata/class.js';
|
|
40
|
+
export { addParamMeta, getParamMeta, addParamLabel, getParamLabels, addParamTag, getParamTags, createComposeParameterDecorator, } from './metadata/parameter.js';
|
|
41
|
+
export { addMethodMeta, getMethodMeta, addMethodLabel, getMethodLabels, addMethodTag, getMethodTags, createComposeMethodDecorator, } from './metadata/method.js';
|
|
41
42
|
export { handleError, handleAsyncError } from './utils/errorHandler.js';
|
|
42
43
|
export { runInOrder, runAtOnce } from './utils/task.js';
|
|
43
44
|
export { throttle } from './utils/throttle.js';
|
package/esm/metadata/class.js
CHANGED
|
@@ -10,3 +10,4 @@ export const addClassLabel = (key, label) => addClassMeta('label', (prev = new M
|
|
|
10
10
|
export const getClassLabels = (target) => getClassMeta(target, 'label') ?? new Map();
|
|
11
11
|
export const addClassTag = (tag) => addClassMeta('tag', (prev = new Set()) => prev.add(tag));
|
|
12
12
|
export const getClassTags = (target) => getClassMeta(target, 'tag') ?? new Set();
|
|
13
|
+
export const createComposeClassDecorator = (...decorators) => (target) => decorators.reduceRight((acc, decorate) => decorate(acc) ?? acc, target);
|
package/esm/metadata/method.js
CHANGED
|
@@ -8,3 +8,4 @@ export const addMethodLabel = (key, label) => addMethodMeta('label', (prev = new
|
|
|
8
8
|
export const getMethodLabels = (target, propertyKey) => getMethodMeta('label', target, propertyKey) ?? new Map();
|
|
9
9
|
export const addMethodTag = (tag) => addMethodMeta('tag', (prev = new Set()) => prev.add(tag));
|
|
10
10
|
export const getMethodTags = (target, propertyKey) => getMethodMeta('tag', target, propertyKey) ?? new Set();
|
|
11
|
+
export const createComposeMethodDecorator = (...decorators) => (target, propertyKey, descriptor) => decorators.reduceRight((acc, decorate) => decorate(target, propertyKey, acc) ?? acc, descriptor);
|
|
@@ -23,3 +23,8 @@ export const getParamTags = (target, parameterIndex) => {
|
|
|
23
23
|
const all = getParamMeta('tag', target);
|
|
24
24
|
return all[parameterIndex] ?? new Set();
|
|
25
25
|
};
|
|
26
|
+
export const createComposeParameterDecorator = (...decorators) => (target, propertyKey, parameterIndex) => {
|
|
27
|
+
for (let i = decorators.length - 1; i >= 0; i--) {
|
|
28
|
+
decorators[i](target, propertyKey, parameterIndex);
|
|
29
|
+
}
|
|
30
|
+
};
|
package/esm/provider/Provider.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toString } from '../utils/basic.js';
|
|
2
|
-
import {
|
|
2
|
+
import { CannotApplySingletonTwiceError } from '../errors/CannotApplySingletonTwiceError.js';
|
|
3
3
|
import { ProviderDisposedError } from '../errors/ProviderDisposedError.js';
|
|
4
4
|
export class Provider {
|
|
5
5
|
resolveDependency;
|
|
@@ -25,7 +25,7 @@ export class Provider {
|
|
|
25
25
|
this.resolveDependency = resolveDependency;
|
|
26
26
|
}
|
|
27
27
|
resolve(options) {
|
|
28
|
-
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
28
|
+
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
29
29
|
if (!this.getKey) {
|
|
30
30
|
return this.resolveDep(options);
|
|
31
31
|
}
|
|
@@ -64,7 +64,7 @@ export class Provider {
|
|
|
64
64
|
return this;
|
|
65
65
|
}
|
|
66
66
|
isAutoResolvable() {
|
|
67
|
-
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
67
|
+
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
68
68
|
return this.isAutoResolve;
|
|
69
69
|
}
|
|
70
70
|
addArgsFn(...fns) {
|
|
@@ -72,11 +72,11 @@ export class Provider {
|
|
|
72
72
|
return this;
|
|
73
73
|
}
|
|
74
74
|
hasAccess(options) {
|
|
75
|
-
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
75
|
+
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
76
76
|
return this.accessRules.reduce((acc, rule) => rule(options, acc), true);
|
|
77
77
|
}
|
|
78
78
|
singleton(getCacheKey = () => '1') {
|
|
79
|
-
|
|
79
|
+
CannotApplySingletonTwiceError.assert(!this.getKey, 'Provider is already singleton: singleton() was applied twice to the same provider. Remove the duplicate singleton().');
|
|
80
80
|
this.getKey = getCacheKey;
|
|
81
81
|
return this;
|
|
82
82
|
}
|
|
@@ -85,7 +85,7 @@ export class Provider {
|
|
|
85
85
|
return this;
|
|
86
86
|
}
|
|
87
87
|
dispose() {
|
|
88
|
-
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
88
|
+
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed: its scope was disposed. Resolve from a live scope.');
|
|
89
89
|
this.isDisposed = true;
|
|
90
90
|
this.isAutoResolve = false;
|
|
91
91
|
this.getKey = undefined;
|
|
@@ -59,14 +59,14 @@ export class Registration {
|
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
if (!this.key) {
|
|
62
|
-
throw new DependencyMissingKeyError('No key provided for registration');
|
|
62
|
+
throw new DependencyMissingKeyError('No key provided for registration: bind it with @register(bindTo(...)) or .bindTo(...).');
|
|
63
63
|
}
|
|
64
64
|
const provider = this.mappers.reduce((p, m) => m(p), this.createProvider());
|
|
65
65
|
container.register(this.key, provider, { aliases: [...this.aliases] });
|
|
66
66
|
}
|
|
67
67
|
getKeyOrFail() {
|
|
68
68
|
if (!this.key) {
|
|
69
|
-
throw new DependencyMissingKeyError('No key provided for registration');
|
|
69
|
+
throw new DependencyMissingKeyError('No key provided for registration: bind it with @register(bindTo(...)) or .bindTo(...).');
|
|
70
70
|
}
|
|
71
71
|
return this.key;
|
|
72
72
|
}
|
|
@@ -10,18 +10,18 @@ export class ConstantToken extends InjectionToken {
|
|
|
10
10
|
return this.token;
|
|
11
11
|
}
|
|
12
12
|
args(...deps) {
|
|
13
|
-
throw new MethodNotImplementedError('not implemented');
|
|
13
|
+
throw new MethodNotImplementedError('ConstantToken.args is not implemented');
|
|
14
14
|
}
|
|
15
15
|
argsFn(getArgsFn) {
|
|
16
|
-
throw new MethodNotImplementedError('not implemented');
|
|
16
|
+
throw new MethodNotImplementedError('ConstantToken.argsFn is not implemented');
|
|
17
17
|
}
|
|
18
18
|
lazy() {
|
|
19
|
-
throw new MethodNotImplementedError('not implemented');
|
|
19
|
+
throw new MethodNotImplementedError('ConstantToken.lazy is not implemented');
|
|
20
20
|
}
|
|
21
21
|
addTags(...tags) {
|
|
22
22
|
return new ConstantToken(this.token, { tags: [...this.getTags(), ...tags] });
|
|
23
23
|
}
|
|
24
24
|
toString() {
|
|
25
|
-
throw new MethodNotImplementedError('not implemented');
|
|
25
|
+
throw new MethodNotImplementedError('ConstantToken.toString is not implemented');
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -12,13 +12,13 @@ export class GroupInstanceToken extends InjectionToken {
|
|
|
12
12
|
return (s) => this.resolve(s).map(fn);
|
|
13
13
|
}
|
|
14
14
|
args(...deps) {
|
|
15
|
-
throw new MethodNotImplementedError('not implemented');
|
|
15
|
+
throw new MethodNotImplementedError('GroupInstanceToken.args is not implemented');
|
|
16
16
|
}
|
|
17
17
|
argsFn(getArgsFn) {
|
|
18
|
-
throw new MethodNotImplementedError('not implemented');
|
|
18
|
+
throw new MethodNotImplementedError('GroupInstanceToken.argsFn is not implemented');
|
|
19
19
|
}
|
|
20
20
|
lazy() {
|
|
21
|
-
throw new MethodNotImplementedError('not implemented');
|
|
21
|
+
throw new MethodNotImplementedError('GroupInstanceToken.lazy is not implemented');
|
|
22
22
|
}
|
|
23
23
|
cascade(isTrue) {
|
|
24
24
|
this.isCascade = isTrue;
|
|
@@ -31,6 +31,6 @@ export class GroupInstanceToken extends InjectionToken {
|
|
|
31
31
|
return new GroupInstanceToken(this.predicate, { tags: [...this.getTags(), ...tags], isCascade: this.isCascade });
|
|
32
32
|
}
|
|
33
33
|
toString() {
|
|
34
|
-
throw new MethodNotImplementedError('not implemented');
|
|
34
|
+
throw new MethodNotImplementedError('GroupInstanceToken.toString is not implemented');
|
|
35
35
|
}
|
|
36
36
|
}
|
package/esm/token/toToken.js
CHANGED
|
@@ -19,6 +19,6 @@ export const toToken = (token) => {
|
|
|
19
19
|
if (typeof token === 'function') {
|
|
20
20
|
return new FunctionToken(token);
|
|
21
21
|
}
|
|
22
|
-
throw new UnsupportedTokenTypeError(`Unknown token ${token}
|
|
22
|
+
throw new UnsupportedTokenTypeError(`Unknown token ${token}: expected an InjectionToken, a DependencyKey (string | symbol), a class or a function.`);
|
|
23
23
|
};
|
|
24
24
|
export const argToToken = (v) => (isInjectionToken(v) ? v : new ConstantToken(v));
|
package/esm/utils/TypedEvent.js
CHANGED
|
@@ -26,6 +26,6 @@ export class TypedEvent {
|
|
|
26
26
|
this.isDisposed = true;
|
|
27
27
|
}
|
|
28
28
|
validate() {
|
|
29
|
-
TypedEventDisposedError.assert(!this.isDisposed, 'TypedEvent is already disposed');
|
|
29
|
+
TypedEventDisposedError.assert(!this.isDisposed, 'TypedEvent is already disposed: its scope was disposed, so it accepts no new listeners.');
|
|
30
30
|
}
|
|
31
31
|
}
|
package/esm/utils/array.js
CHANGED
|
@@ -8,7 +8,7 @@ export const Filter = {
|
|
|
8
8
|
export const findOrFail = (predicate) => (args = []) => {
|
|
9
9
|
const index = args.findIndex((arg) => predicate(arg));
|
|
10
10
|
if (index === -1) {
|
|
11
|
-
throw new ArgumentNotFoundError();
|
|
11
|
+
throw new ArgumentNotFoundError(`No argument matches the predicate (received ${args.length} args).`);
|
|
12
12
|
}
|
|
13
13
|
return args[index];
|
|
14
14
|
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type DependencyKey } from './IContainer';
|
|
2
|
+
|
|
3
|
+
export type Alias = DependencyKey;
|
|
4
|
+
|
|
5
|
+
export class AliasMap {
|
|
6
|
+
private readonly aliasToKeySet = new Map<Alias, Set<DependencyKey>>();
|
|
7
|
+
|
|
8
|
+
getKeysByAlias(alias: DependencyKey): DependencyKey[] {
|
|
9
|
+
return [...(this.aliasToKeySet.get(alias) ?? [])];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
setAliasesByKey(key: DependencyKey, aliases: DependencyKey[]): void {
|
|
13
|
+
// reset existing key's aliases
|
|
14
|
+
for (const [alias, keySet] of this.aliasToKeySet) {
|
|
15
|
+
keySet.delete(key);
|
|
16
|
+
if (keySet.size === 0) {
|
|
17
|
+
this.aliasToKeySet.delete(alias);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
for (const alias of aliases) {
|
|
22
|
+
const dependencyKeySet = this.aliasToKeySet.get(alias) ?? new Set();
|
|
23
|
+
this.aliasToKeySet.set(alias, dependencyKeySet.add(key));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
destroy(): void {
|
|
28
|
+
this.aliasToKeySet.clear();
|
|
29
|
+
}
|
|
30
|
+
}
|