ts-ioc-container 72.1.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/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 +5 -3
- 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 +1 -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 +2 -0
- 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 +27 -0
- package/typings/metadata/class.d.ts.map +1 -0
- package/typings/metadata/method.d.ts +24 -0
- package/typings/metadata/method.d.ts.map +1 -0
- package/typings/metadata/parameter.d.ts +21 -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
|
@@ -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';
|
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
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type AutoResolveOptions, type IContainer, type IContainerModule } from './IContainer';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Enables eager resolution of providers marked with the `autoResolve()` pipe.
|
|
5
|
+
*
|
|
6
|
+
* Every scope created after this module is applied resolves its own
|
|
7
|
+
* auto-resolvable providers as part of `createScope`, so the instances exist
|
|
8
|
+
* before anyone asks for them. Child scopes inherit the behaviour, so a single
|
|
9
|
+
* `useModule` call on the root covers the whole scope tree.
|
|
10
|
+
*
|
|
11
|
+
* `options.args` are forwarded to every eagerly resolved provider of every such
|
|
12
|
+
* scope. Pass a per-scope value by calling `scope.autoResolve({ args })`
|
|
13
|
+
* directly instead.
|
|
14
|
+
*
|
|
15
|
+
* The container the module is applied to is not a created scope — call
|
|
16
|
+
* `container.autoResolve()` explicitly to eagerly resolve its own providers.
|
|
17
|
+
*/
|
|
18
|
+
export class AutoResolveModule implements IContainerModule {
|
|
19
|
+
constructor(private readonly options: AutoResolveOptions = {}) {}
|
|
20
|
+
|
|
21
|
+
applyTo(container: IContainer): void {
|
|
22
|
+
container.scopeCreated.subscribe((scope) => scope.autoResolve(this.options));
|
|
23
|
+
}
|
|
24
|
+
}
|