ts-ioc-container 71.0.0 → 72.0.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/README.md +109 -65
- package/cjm/container/Container.js +5 -5
- package/cjm/hooks/HookContext.js +3 -2
- package/cjm/hooks/injectProp.js +2 -4
- package/cjm/index.js +3 -3
- package/cjm/injector/IInjector.js +2 -2
- package/cjm/injector/MetadataInjector.js +14 -9
- package/cjm/injector/ProxyInjector.js +1 -1
- package/cjm/injector/SimpleInjector.js +2 -2
- package/cjm/provider/Provider.js +9 -8
- package/cjm/registration/IRegistration.js +2 -2
- package/cjm/select.js +2 -2
- package/cjm/token/ClassToken.js +3 -3
- package/cjm/token/FunctionToken.js +5 -4
- package/cjm/token/GroupAliasToken.js +3 -3
- package/cjm/token/InjectionToken.js +1 -1
- package/cjm/token/SingleAliasToken.js +3 -3
- package/cjm/token/SingleToken.js +3 -3
- package/cjm/token/toToken.js +1 -8
- package/esm/container/Container.js +5 -5
- package/esm/hooks/HookContext.js +3 -2
- package/esm/hooks/injectProp.js +1 -4
- package/esm/index.js +2 -2
- package/esm/injector/IInjector.js +2 -2
- package/esm/injector/MetadataInjector.js +13 -9
- package/esm/injector/ProxyInjector.js +1 -1
- package/esm/injector/SimpleInjector.js +2 -2
- package/esm/provider/Provider.js +9 -8
- package/esm/registration/IRegistration.js +2 -2
- package/esm/select.js +2 -2
- package/esm/token/ClassToken.js +3 -3
- package/esm/token/FunctionToken.js +5 -4
- package/esm/token/GroupAliasToken.js +3 -3
- package/esm/token/InjectionToken.js +1 -1
- package/esm/token/SingleAliasToken.js +3 -3
- package/esm/token/SingleToken.js +3 -3
- package/esm/token/toToken.js +0 -6
- package/package.json +1 -1
- package/typings/container/IContainer.d.ts +2 -2
- package/typings/hooks/HookContext.d.ts +3 -3
- package/typings/hooks/hook.d.ts +1 -2
- package/typings/hooks/injectProp.d.ts +2 -14
- package/typings/index.d.ts +4 -4
- package/typings/injector/IInjector.d.ts +7 -4
- package/typings/injector/MetadataInjector.d.ts +6 -16
- package/typings/injector/ProxyInjector.d.ts +1 -2
- package/typings/injector/SimpleInjector.d.ts +1 -2
- package/typings/provider/IProvider.d.ts +5 -4
- package/typings/provider/Provider.d.ts +2 -2
- package/typings/select.d.ts +3 -3
- package/typings/token/ClassToken.d.ts +2 -2
- package/typings/token/FunctionToken.d.ts +2 -2
- package/typings/token/GroupAliasToken.d.ts +2 -2
- package/typings/token/InjectionToken.d.ts +2 -2
- package/typings/token/SingleAliasToken.d.ts +3 -3
- package/typings/token/SingleToken.d.ts +2 -2
- package/typings/token/toToken.d.ts +0 -2
package/cjm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.TypedEvent = exports.getConstructorChain = exports.memoize = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.runAtOnce = exports.runInOrder = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.resolveConstructor = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.
|
|
3
|
+
exports.createHookExecutionContext = exports.createHookContextFactory = exports.HookContext = exports.toHookFn = exports.hasHooks = exports.hook = exports.getHooks = exports.ArgumentNotFoundError = exports.TypedEventDisposedError = exports.UnsupportedTokenTypeError = exports.CannonSingletonApplyTwiceError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.ContainerNotFoundError = exports.DependencyNotFoundError = exports.ContainerError = exports.Registration = exports.onResolve = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.autoResolve = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.toRegistrationFn = exports.toProviderFn = exports.toBindToken = exports.registerPipe = exports.isProviderPipe = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.by = exports.argsFn = exports.args = exports.arg = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.AutoResolveModule = exports.Container = exports.isDependencyKey = void 0;
|
|
4
|
+
exports.TypedEvent = exports.getConstructorChain = exports.memoize = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.runAtOnce = exports.runInOrder = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.resolveConstructor = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.toToken = exports.forwardArgs = exports.isInjectionToken = exports.InjectionToken = exports.toTask = exports.HookCollector = exports.oncePerInstance = exports.parallel = exports.sequential = exports.injectProp = void 0;
|
|
5
5
|
exports.isSerializable = exports.Is = exports.unwrapProxy = exports.ProxyRegistry = exports.findOrFail = exports.pipe = exports.select = void 0;
|
|
6
6
|
var IContainer_1 = require("./container/IContainer");
|
|
7
7
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
@@ -19,6 +19,7 @@ Object.defineProperty(exports, "inject", { enumerable: true, get: function () {
|
|
|
19
19
|
Object.defineProperty(exports, "arg", { enumerable: true, get: function () { return MetadataInjector_1.arg; } });
|
|
20
20
|
Object.defineProperty(exports, "args", { enumerable: true, get: function () { return MetadataInjector_1.args; } });
|
|
21
21
|
Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return MetadataInjector_1.argsFn; } });
|
|
22
|
+
Object.defineProperty(exports, "by", { enumerable: true, get: function () { return MetadataInjector_1.by; } });
|
|
22
23
|
Object.defineProperty(exports, "resolveArgs", { enumerable: true, get: function () { return MetadataInjector_1.resolveArgs; } });
|
|
23
24
|
var SimpleInjector_1 = require("./injector/SimpleInjector");
|
|
24
25
|
Object.defineProperty(exports, "SimpleInjector", { enumerable: true, get: function () { return SimpleInjector_1.SimpleInjector; } });
|
|
@@ -91,7 +92,6 @@ Object.defineProperty(exports, "isInjectionToken", { enumerable: true, get: func
|
|
|
91
92
|
Object.defineProperty(exports, "forwardArgs", { enumerable: true, get: function () { return InjectionToken_1.forwardArgs; } });
|
|
92
93
|
var toToken_1 = require("./token/toToken");
|
|
93
94
|
Object.defineProperty(exports, "toToken", { enumerable: true, get: function () { return toToken_1.toToken; } });
|
|
94
|
-
Object.defineProperty(exports, "toMappedToken", { enumerable: true, get: function () { return toToken_1.toMappedToken; } });
|
|
95
95
|
Object.defineProperty(exports, "argToToken", { enumerable: true, get: function () { return toToken_1.argToToken; } });
|
|
96
96
|
var GroupAliasToken_1 = require("./token/GroupAliasToken");
|
|
97
97
|
Object.defineProperty(exports, "GroupAliasToken", { enumerable: true, get: function () { return GroupAliasToken_1.GroupAliasToken; } });
|
|
@@ -8,9 +8,9 @@ class Injector {
|
|
|
8
8
|
constructor(proxyRegistry = ProxyRegistry_1.ProxyRegistry.getInstance()) {
|
|
9
9
|
this.proxyRegistry = proxyRegistry;
|
|
10
10
|
}
|
|
11
|
-
resolve(
|
|
11
|
+
resolve(Target, { scope, args, lazy }) {
|
|
12
12
|
return this.proxyRegistry.toLazyIf(() => {
|
|
13
|
-
const instance = this.createInstance(
|
|
13
|
+
const instance = this.createInstance(Target, { scope, args });
|
|
14
14
|
scope.addInstance(instance);
|
|
15
15
|
for (const onConstructed of this.onConstructedHookList) {
|
|
16
16
|
onConstructed(instance, scope);
|
|
@@ -1,32 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveArgs = exports.args = exports.arg = exports.argsFn = exports.MetadataInjector = void 0;
|
|
3
|
+
exports.resolveArgs = exports.args = exports.arg = exports.argsFn = exports.by = exports.MetadataInjector = void 0;
|
|
4
4
|
exports.inject = inject;
|
|
5
5
|
const IInjector_1 = require("./IInjector");
|
|
6
6
|
const target_1 = require("../metadata/target");
|
|
7
7
|
const parameter_1 = require("../metadata/parameter");
|
|
8
8
|
const toToken_1 = require("../token/toToken");
|
|
9
9
|
class MetadataInjector extends IInjector_1.Injector {
|
|
10
|
-
createInstance(
|
|
11
|
-
const args = (0, exports.resolveArgs)(Target)(scope,
|
|
10
|
+
createInstance(Target, { scope, args: deps = [] }) {
|
|
11
|
+
const args = (0, exports.resolveArgs)(Target)({ scope, args: deps });
|
|
12
12
|
return new Target(...args);
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
exports.MetadataInjector = MetadataInjector;
|
|
16
16
|
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
|
|
17
|
-
function inject(fn
|
|
17
|
+
function inject(fn) {
|
|
18
18
|
return (target, propertyKey, parameterIndex) => {
|
|
19
|
-
(0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), () =>
|
|
19
|
+
(0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), () => fn)((0, target_1.resolveConstructor)(target), propertyKey, parameterIndex);
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
const
|
|
22
|
+
const by = (target) => {
|
|
23
|
+
const token = (0, toToken_1.toToken)(target);
|
|
24
|
+
return ({ scope, ...options }) => token.resolve(scope, options);
|
|
25
|
+
};
|
|
26
|
+
exports.by = by;
|
|
27
|
+
const argsFn = (predicate) => ({ args = [] }) => args.find((value, index) => predicate(value, index));
|
|
23
28
|
exports.argsFn = argsFn;
|
|
24
29
|
const arg = (index) => (0, exports.argsFn)((value, i) => i === index);
|
|
25
30
|
exports.arg = arg;
|
|
26
|
-
const args = (
|
|
31
|
+
const args = ({ args = [] }) => args;
|
|
27
32
|
exports.args = args;
|
|
28
33
|
const resolveArgs = (target, methodName) => {
|
|
29
|
-
const
|
|
30
|
-
return (
|
|
34
|
+
const fns = (0, parameter_1.getParamMeta)(hookMetaKey(methodName), target);
|
|
35
|
+
return (options) => fns.map((fn) => fn(options));
|
|
31
36
|
};
|
|
32
37
|
exports.resolveArgs = resolveArgs;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ProxyInjector = void 0;
|
|
4
4
|
const IInjector_1 = require("./IInjector");
|
|
5
5
|
class ProxyInjector extends IInjector_1.Injector {
|
|
6
|
-
createInstance(
|
|
6
|
+
createInstance(Target, { scope, args = [] }) {
|
|
7
7
|
const proxy = new Proxy({}, {
|
|
8
8
|
get(target, prop) {
|
|
9
9
|
if (prop === 'args') {
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SimpleInjector = void 0;
|
|
4
4
|
const IInjector_1 = require("./IInjector");
|
|
5
5
|
class SimpleInjector extends IInjector_1.Injector {
|
|
6
|
-
createInstance(
|
|
7
|
-
return new Target(
|
|
6
|
+
createInstance(Target, { scope, args = [] }) {
|
|
7
|
+
return new Target(scope, ...args);
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
exports.SimpleInjector = SimpleInjector;
|
package/cjm/provider/Provider.js
CHANGED
|
@@ -7,13 +7,13 @@ const ProviderDisposedError_1 = require("../errors/ProviderDisposedError");
|
|
|
7
7
|
class Provider {
|
|
8
8
|
resolveDependency;
|
|
9
9
|
static fromClass(Target) {
|
|
10
|
-
return new Provider((
|
|
10
|
+
return new Provider(({ scope, ...options }) => scope.resolve(Target, options));
|
|
11
11
|
}
|
|
12
12
|
static fromValue(value) {
|
|
13
13
|
return new Provider(() => value);
|
|
14
14
|
}
|
|
15
15
|
static fromKey(key) {
|
|
16
|
-
return new Provider((
|
|
16
|
+
return new Provider(({ scope }) => scope.resolve(key));
|
|
17
17
|
}
|
|
18
18
|
argsFnList = [];
|
|
19
19
|
accessRules = [];
|
|
@@ -27,20 +27,21 @@ class Provider {
|
|
|
27
27
|
constructor(resolveDependency) {
|
|
28
28
|
this.resolveDependency = resolveDependency;
|
|
29
29
|
}
|
|
30
|
-
resolve(
|
|
30
|
+
resolve(options) {
|
|
31
31
|
ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
32
32
|
if (!this.getKey) {
|
|
33
|
-
return this.resolveDep(
|
|
33
|
+
return this.resolveDep(options);
|
|
34
34
|
}
|
|
35
35
|
const key = (0, basic_1.toString)(this.getKey(options.args ?? []));
|
|
36
36
|
if (!this.cache.has(key)) {
|
|
37
|
-
this.cache.set(key, this.resolveDep(
|
|
37
|
+
this.cache.set(key, this.resolveDep(options));
|
|
38
38
|
}
|
|
39
39
|
return this.cache.get(key);
|
|
40
40
|
}
|
|
41
|
-
resolveDep(scope,
|
|
42
|
-
let dependency = this.resolveDependency(
|
|
43
|
-
|
|
41
|
+
resolveDep({ scope, args = [], lazy }) {
|
|
42
|
+
let dependency = this.resolveDependency({
|
|
43
|
+
scope,
|
|
44
|
+
args: this.argsFnList.reduce((acc, current) => current({ scope, args: acc }), args),
|
|
44
45
|
lazy: lazy ?? this.isLazy,
|
|
45
46
|
});
|
|
46
47
|
dependency = this.mappers.reduce((acc, current) => current(acc, scope), dependency);
|
|
@@ -40,9 +40,9 @@ const bindTo = (...tokens) => (r) => {
|
|
|
40
40
|
exports.bindTo = bindTo;
|
|
41
41
|
const scope = (...rules) => (r) => r.when(...rules);
|
|
42
42
|
exports.scope = scope;
|
|
43
|
-
const appendArgs = (...extraArgs) => (0, exports.registerPipe)((p) => p.addArgsFn((
|
|
43
|
+
const appendArgs = (...extraArgs) => (0, exports.registerPipe)((p) => p.addArgsFn(({ args = [] }) => [...args, ...extraArgs]));
|
|
44
44
|
exports.appendArgs = appendArgs;
|
|
45
|
-
const appendArgsFn = (fn) => (0, exports.registerPipe)((p) => p.addArgsFn((
|
|
45
|
+
const appendArgsFn = (fn) => (0, exports.registerPipe)((p) => p.addArgsFn((options) => [...(options.args ?? []), ...fn(options)]));
|
|
46
46
|
exports.appendArgsFn = appendArgsFn;
|
|
47
47
|
const scopeAccess = (rule) => (0, exports.registerPipe)((p) => p.addAccessRule(rule));
|
|
48
48
|
exports.scopeAccess = scopeAccess;
|
package/cjm/select.js
CHANGED
|
@@ -10,7 +10,7 @@ exports.select = {
|
|
|
10
10
|
token: toToken_1.toToken,
|
|
11
11
|
instances: (predicate = () => true) => new GroupInstanceToken_1.GroupInstanceToken(predicate),
|
|
12
12
|
scope: {
|
|
13
|
-
current: new FunctionToken_1.FunctionToken((
|
|
14
|
-
create: (options) => new FunctionToken_1.FunctionToken((
|
|
13
|
+
current: new FunctionToken_1.FunctionToken(({ scope }) => scope),
|
|
14
|
+
create: (options) => new FunctionToken_1.FunctionToken(({ scope }) => scope.createScope(options)),
|
|
15
15
|
},
|
|
16
16
|
};
|
package/cjm/token/ClassToken.js
CHANGED
|
@@ -17,14 +17,14 @@ class ClassToken extends InjectionToken_1.InjectionToken {
|
|
|
17
17
|
}
|
|
18
18
|
resolve(s, { args = [], lazy } = {}) {
|
|
19
19
|
return s.resolve(this.target, {
|
|
20
|
-
args: this._getArgsFn(s,
|
|
20
|
+
args: this._getArgsFn({ scope: s, args }),
|
|
21
21
|
lazy: this._isLazy || lazy,
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
args(...newArgs) {
|
|
25
25
|
const parentFn = this._getArgsFn;
|
|
26
26
|
return new ClassToken(this.target, {
|
|
27
|
-
getArgsFn: (
|
|
27
|
+
getArgsFn: (options) => [...parentFn(options), ...newArgs],
|
|
28
28
|
isLazy: this._isLazy,
|
|
29
29
|
tags: this.getTags(),
|
|
30
30
|
});
|
|
@@ -32,7 +32,7 @@ class ClassToken extends InjectionToken_1.InjectionToken {
|
|
|
32
32
|
argsFn(fn) {
|
|
33
33
|
const parentFn = this._getArgsFn;
|
|
34
34
|
return new ClassToken(this.target, {
|
|
35
|
-
getArgsFn: (
|
|
35
|
+
getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
|
|
36
36
|
isLazy: this._isLazy,
|
|
37
37
|
tags: this.getTags(),
|
|
38
38
|
});
|
|
@@ -14,15 +14,16 @@ class FunctionToken extends InjectionToken_1.InjectionToken {
|
|
|
14
14
|
this._isLazy = isLazy;
|
|
15
15
|
}
|
|
16
16
|
resolve(s, { args = [], lazy } = {}) {
|
|
17
|
-
return this.fn(
|
|
18
|
-
|
|
17
|
+
return this.fn({
|
|
18
|
+
scope: s,
|
|
19
|
+
args: this._getArgsFn({ scope: s, args }),
|
|
19
20
|
lazy: this._isLazy || lazy,
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
23
|
args(...newArgs) {
|
|
23
24
|
const parentFn = this._getArgsFn;
|
|
24
25
|
return new FunctionToken(this.fn, {
|
|
25
|
-
getArgsFn: (
|
|
26
|
+
getArgsFn: (options) => [...parentFn(options), ...newArgs],
|
|
26
27
|
isLazy: this._isLazy,
|
|
27
28
|
tags: this.getTags(),
|
|
28
29
|
});
|
|
@@ -30,7 +31,7 @@ class FunctionToken extends InjectionToken_1.InjectionToken {
|
|
|
30
31
|
argsFn(fn) {
|
|
31
32
|
const parentFn = this._getArgsFn;
|
|
32
33
|
return new FunctionToken(this.fn, {
|
|
33
|
-
getArgsFn: (
|
|
34
|
+
getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
|
|
34
35
|
isLazy: this._isLazy,
|
|
35
36
|
tags: this.getTags(),
|
|
36
37
|
});
|
|
@@ -17,7 +17,7 @@ class GroupAliasToken extends InjectionToken_1.InjectionToken {
|
|
|
17
17
|
}
|
|
18
18
|
resolve(s, { args = [], lazy } = {}) {
|
|
19
19
|
return s.resolveByAlias(this.token, {
|
|
20
|
-
args: this._getArgsFn(s,
|
|
20
|
+
args: this._getArgsFn({ scope: s, args }),
|
|
21
21
|
lazy: this._isLazy || lazy,
|
|
22
22
|
});
|
|
23
23
|
}
|
|
@@ -27,7 +27,7 @@ class GroupAliasToken extends InjectionToken_1.InjectionToken {
|
|
|
27
27
|
args(...newArgs) {
|
|
28
28
|
const parentFn = this._getArgsFn;
|
|
29
29
|
return new GroupAliasToken(this.token, {
|
|
30
|
-
getArgsFn: (
|
|
30
|
+
getArgsFn: (options) => [...parentFn(options), ...newArgs],
|
|
31
31
|
isLazy: this._isLazy,
|
|
32
32
|
tags: this.getTags(),
|
|
33
33
|
});
|
|
@@ -35,7 +35,7 @@ class GroupAliasToken extends InjectionToken_1.InjectionToken {
|
|
|
35
35
|
argsFn(fn) {
|
|
36
36
|
const parentFn = this._getArgsFn;
|
|
37
37
|
return new GroupAliasToken(this.token, {
|
|
38
|
-
getArgsFn: (
|
|
38
|
+
getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
|
|
39
39
|
isLazy: this._isLazy,
|
|
40
40
|
tags: this.getTags(),
|
|
41
41
|
});
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.InjectionToken = exports.forwardArgs = void 0;
|
|
4
4
|
exports.isInjectionToken = isInjectionToken;
|
|
5
5
|
const basic_1 = require("../utils/basic");
|
|
6
|
-
const forwardArgs = (
|
|
6
|
+
const forwardArgs = ({ args = [] }) => args;
|
|
7
7
|
exports.forwardArgs = forwardArgs;
|
|
8
8
|
class InjectionToken {
|
|
9
9
|
tags;
|
|
@@ -17,7 +17,7 @@ class SingleAliasToken extends InjectionToken_1.InjectionToken {
|
|
|
17
17
|
}
|
|
18
18
|
resolve(s, { args = [], lazy } = {}) {
|
|
19
19
|
return s.resolveOneByAlias(this.token, {
|
|
20
|
-
args: this._getArgsFn(s,
|
|
20
|
+
args: this._getArgsFn({ scope: s, args }),
|
|
21
21
|
lazy: this._isLazy || lazy,
|
|
22
22
|
});
|
|
23
23
|
}
|
|
@@ -27,7 +27,7 @@ class SingleAliasToken extends InjectionToken_1.InjectionToken {
|
|
|
27
27
|
args(...newArgs) {
|
|
28
28
|
const parentFn = this._getArgsFn;
|
|
29
29
|
return new SingleAliasToken(this.token, {
|
|
30
|
-
getArgsFn: (
|
|
30
|
+
getArgsFn: (options) => [...parentFn(options), ...newArgs],
|
|
31
31
|
isLazy: this._isLazy,
|
|
32
32
|
tags: this.getTags(),
|
|
33
33
|
});
|
|
@@ -35,7 +35,7 @@ class SingleAliasToken extends InjectionToken_1.InjectionToken {
|
|
|
35
35
|
argsFn(fn) {
|
|
36
36
|
const parentFn = this._getArgsFn;
|
|
37
37
|
return new SingleAliasToken(this.token, {
|
|
38
|
-
getArgsFn: (
|
|
38
|
+
getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
|
|
39
39
|
isLazy: this._isLazy,
|
|
40
40
|
tags: this.getTags(),
|
|
41
41
|
});
|
package/cjm/token/SingleToken.js
CHANGED
|
@@ -17,7 +17,7 @@ class SingleToken extends InjectionToken_1.InjectionToken {
|
|
|
17
17
|
}
|
|
18
18
|
resolve(s, { args = [], lazy } = {}) {
|
|
19
19
|
return s.resolve(this.token, {
|
|
20
|
-
args: this._getArgsFn(s,
|
|
20
|
+
args: this._getArgsFn({ scope: s, args }),
|
|
21
21
|
lazy: this._isLazy || lazy,
|
|
22
22
|
});
|
|
23
23
|
}
|
|
@@ -27,7 +27,7 @@ class SingleToken extends InjectionToken_1.InjectionToken {
|
|
|
27
27
|
args(...newArgs) {
|
|
28
28
|
const parentFn = this._getArgsFn;
|
|
29
29
|
return new SingleToken(this.token, {
|
|
30
|
-
getArgsFn: (
|
|
30
|
+
getArgsFn: (options) => [...parentFn(options), ...newArgs],
|
|
31
31
|
isLazy: this._isLazy,
|
|
32
32
|
tags: this.getTags(),
|
|
33
33
|
});
|
|
@@ -35,7 +35,7 @@ class SingleToken extends InjectionToken_1.InjectionToken {
|
|
|
35
35
|
argsFn(fn) {
|
|
36
36
|
const parentFn = this._getArgsFn;
|
|
37
37
|
return new SingleToken(this.token, {
|
|
38
|
-
getArgsFn: (
|
|
38
|
+
getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
|
|
39
39
|
isLazy: this._isLazy,
|
|
40
40
|
tags: this.getTags(),
|
|
41
41
|
});
|
package/cjm/token/toToken.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.argToToken = exports.toToken = void 0;
|
|
4
4
|
const IContainer_1 = require("../container/IContainer");
|
|
5
5
|
const SingleToken_1 = require("./SingleToken");
|
|
6
6
|
const ClassToken_1 = require("./ClassToken");
|
|
@@ -9,7 +9,6 @@ const UnsupportedTokenTypeError_1 = require("../errors/UnsupportedTokenTypeError
|
|
|
9
9
|
const InjectionToken_1 = require("./InjectionToken");
|
|
10
10
|
const basic_1 = require("../utils/basic");
|
|
11
11
|
const ConstantToken_1 = require("./ConstantToken");
|
|
12
|
-
const fp_1 = require("../utils/fp");
|
|
13
12
|
const toToken = (token) => {
|
|
14
13
|
if (token instanceof InjectionToken_1.InjectionToken) {
|
|
15
14
|
return token;
|
|
@@ -28,9 +27,3 @@ const toToken = (token) => {
|
|
|
28
27
|
exports.toToken = toToken;
|
|
29
28
|
const argToToken = (v) => ((0, InjectionToken_1.isInjectionToken)(v) ? v : new ConstantToken_1.ConstantToken(v));
|
|
30
29
|
exports.argToToken = argToToken;
|
|
31
|
-
const toMappedToken = (token, mappers) => {
|
|
32
|
-
const source = (0, exports.toToken)(token);
|
|
33
|
-
const mapInstance = (0, fp_1.pipe)(...mappers);
|
|
34
|
-
return new FunctionToken_1.FunctionToken((scope, options) => mapInstance(source.resolve(scope, options)));
|
|
35
|
-
};
|
|
36
|
-
exports.toMappedToken = toMappedToken;
|
|
@@ -38,11 +38,11 @@ export class Container {
|
|
|
38
38
|
resolve(target, { args = [], child = this, lazy } = {}) {
|
|
39
39
|
this.validateContainer();
|
|
40
40
|
if (Is.constructor(target)) {
|
|
41
|
-
return this.injector.resolve(
|
|
41
|
+
return this.injector.resolve(target, { scope: this, args, lazy });
|
|
42
42
|
}
|
|
43
43
|
const provider = this.providers.get(target);
|
|
44
44
|
return provider?.hasAccess({ invocationScope: child, providerScope: this, args })
|
|
45
|
-
? provider.resolve(this,
|
|
45
|
+
? provider.resolve({ scope: this, args, lazy })
|
|
46
46
|
: this.parent.resolve(target, { args, child, lazy });
|
|
47
47
|
}
|
|
48
48
|
resolveByAlias(alias, { args = [], child = this, lazy, excludedKeys = [] } = {}) {
|
|
@@ -55,7 +55,7 @@ export class Container {
|
|
|
55
55
|
continue;
|
|
56
56
|
}
|
|
57
57
|
keys.push(key);
|
|
58
|
-
deps.push(provider.resolve(this,
|
|
58
|
+
deps.push(provider.resolve({ scope: this, args, lazy }));
|
|
59
59
|
}
|
|
60
60
|
const parentDeps = this.parent.resolveByAlias(alias, {
|
|
61
61
|
args,
|
|
@@ -70,7 +70,7 @@ export class Container {
|
|
|
70
70
|
const [key] = this.aliases.getKeysByAlias(alias);
|
|
71
71
|
const provider = key ? this.findProviderByKeyOrFail(key) : undefined;
|
|
72
72
|
return provider?.hasAccess({ invocationScope: child, providerScope: this, args })
|
|
73
|
-
? provider.resolve(this,
|
|
73
|
+
? provider.resolve({ scope: this, args, lazy })
|
|
74
74
|
: this.parent.resolveOneByAlias(alias, { args, child, lazy });
|
|
75
75
|
}
|
|
76
76
|
createScope({ tags } = {}) {
|
|
@@ -90,7 +90,7 @@ export class Container {
|
|
|
90
90
|
this.validateContainer();
|
|
91
91
|
for (const provider of this.providers.values()) {
|
|
92
92
|
if (provider.isAutoResolvable() && provider.hasAccess({ invocationScope: this, providerScope: this, args })) {
|
|
93
|
-
provider.resolve(this,
|
|
93
|
+
provider.resolve({ scope: this, args });
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
return this;
|
package/esm/hooks/HookContext.js
CHANGED
|
@@ -10,7 +10,8 @@ export class HookContext {
|
|
|
10
10
|
this.methodName = methodName;
|
|
11
11
|
}
|
|
12
12
|
resolveArgs(...args) {
|
|
13
|
-
return resolveArgs(this.instance, this.methodName)(
|
|
13
|
+
return resolveArgs(this.instance, this.methodName)({
|
|
14
|
+
scope: this.scope,
|
|
14
15
|
args: [...this.initialArgs, ...args],
|
|
15
16
|
});
|
|
16
17
|
}
|
|
@@ -18,7 +19,7 @@ export class HookContext {
|
|
|
18
19
|
return this.instance[this.methodName](...args);
|
|
19
20
|
}
|
|
20
21
|
setProperty(fn) {
|
|
21
|
-
this.instance[this.methodName] = fn
|
|
22
|
+
this.instance[this.methodName] = fn({ scope: this.scope });
|
|
22
23
|
}
|
|
23
24
|
getProperty() {
|
|
24
25
|
return this.instance[this.methodName];
|
package/esm/hooks/injectProp.js
CHANGED
package/esm/index.js
CHANGED
|
@@ -3,7 +3,7 @@ export { Container } from './container/Container.js';
|
|
|
3
3
|
export { AutoResolveModule } from './container/AutoResolveModule.js';
|
|
4
4
|
export { EmptyContainer } from './container/EmptyContainer.js';
|
|
5
5
|
export { Injector, } from './injector/IInjector.js';
|
|
6
|
-
export { MetadataInjector, inject, arg, args, argsFn, resolveArgs } from './injector/MetadataInjector.js';
|
|
6
|
+
export { MetadataInjector, inject, arg, args, argsFn, by, resolveArgs } from './injector/MetadataInjector.js';
|
|
7
7
|
export { SimpleInjector } from './injector/SimpleInjector.js';
|
|
8
8
|
export { ProxyInjector } from './injector/ProxyInjector.js';
|
|
9
9
|
export { Provider } from './provider/Provider.js';
|
|
@@ -26,7 +26,7 @@ export { injectProp } from './hooks/injectProp.js';
|
|
|
26
26
|
export { sequential, parallel, oncePerInstance } from './hooks/combinators.js';
|
|
27
27
|
export { HookCollector, toTask, } from './hooks/HookCollector.js';
|
|
28
28
|
export { InjectionToken, isInjectionToken, forwardArgs } from './token/InjectionToken.js';
|
|
29
|
-
export { toToken,
|
|
29
|
+
export { toToken, argToToken } from './token/toToken.js';
|
|
30
30
|
export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken.js';
|
|
31
31
|
export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken.js';
|
|
32
32
|
export { ClassToken } from './token/ClassToken.js';
|
|
@@ -5,9 +5,9 @@ export class Injector {
|
|
|
5
5
|
constructor(proxyRegistry = ProxyRegistry.getInstance()) {
|
|
6
6
|
this.proxyRegistry = proxyRegistry;
|
|
7
7
|
}
|
|
8
|
-
resolve(
|
|
8
|
+
resolve(Target, { scope, args, lazy }) {
|
|
9
9
|
return this.proxyRegistry.toLazyIf(() => {
|
|
10
|
-
const instance = this.createInstance(
|
|
10
|
+
const instance = this.createInstance(Target, { scope, args });
|
|
11
11
|
scope.addInstance(instance);
|
|
12
12
|
for (const onConstructed of this.onConstructedHookList) {
|
|
13
13
|
onConstructed(instance, scope);
|
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
import { Injector } from './IInjector.js';
|
|
2
2
|
import { resolveConstructor } from '../metadata/target.js';
|
|
3
3
|
import { addParamMeta, getParamMeta } from '../metadata/parameter.js';
|
|
4
|
-
import {
|
|
4
|
+
import { toToken } from '../token/toToken.js';
|
|
5
5
|
export class MetadataInjector extends Injector {
|
|
6
|
-
createInstance(
|
|
7
|
-
const args = resolveArgs(Target)(scope,
|
|
6
|
+
createInstance(Target, { scope, args: deps = [] }) {
|
|
7
|
+
const args = resolveArgs(Target)({ scope, args: deps });
|
|
8
8
|
return new Target(...args);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
|
|
12
|
-
export function inject(fn
|
|
12
|
+
export function inject(fn) {
|
|
13
13
|
return (target, propertyKey, parameterIndex) => {
|
|
14
|
-
addParamMeta(hookMetaKey(propertyKey), () =>
|
|
14
|
+
addParamMeta(hookMetaKey(propertyKey), () => fn)(resolveConstructor(target), propertyKey, parameterIndex);
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
-
export const
|
|
17
|
+
export const by = (target) => {
|
|
18
|
+
const token = toToken(target);
|
|
19
|
+
return ({ scope, ...options }) => token.resolve(scope, options);
|
|
20
|
+
};
|
|
21
|
+
export const argsFn = (predicate) => ({ args = [] }) => args.find((value, index) => predicate(value, index));
|
|
18
22
|
export const arg = (index) => argsFn((value, i) => i === index);
|
|
19
|
-
export const args = (
|
|
23
|
+
export const args = ({ args = [] }) => args;
|
|
20
24
|
export const resolveArgs = (target, methodName) => {
|
|
21
|
-
const
|
|
22
|
-
return (
|
|
25
|
+
const fns = getParamMeta(hookMetaKey(methodName), target);
|
|
26
|
+
return (options) => fns.map((fn) => fn(options));
|
|
23
27
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Injector } from './IInjector.js';
|
|
2
2
|
export class ProxyInjector extends Injector {
|
|
3
|
-
createInstance(
|
|
3
|
+
createInstance(Target, { scope, args = [] }) {
|
|
4
4
|
const proxy = new Proxy({}, {
|
|
5
5
|
get(target, prop) {
|
|
6
6
|
if (prop === 'args') {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Injector } from './IInjector.js';
|
|
2
2
|
export class SimpleInjector extends Injector {
|
|
3
|
-
createInstance(
|
|
4
|
-
return new Target(
|
|
3
|
+
createInstance(Target, { scope, args = [] }) {
|
|
4
|
+
return new Target(scope, ...args);
|
|
5
5
|
}
|
|
6
6
|
}
|
package/esm/provider/Provider.js
CHANGED
|
@@ -4,13 +4,13 @@ import { ProviderDisposedError } from '../errors/ProviderDisposedError.js';
|
|
|
4
4
|
export class Provider {
|
|
5
5
|
resolveDependency;
|
|
6
6
|
static fromClass(Target) {
|
|
7
|
-
return new Provider((
|
|
7
|
+
return new Provider(({ scope, ...options }) => scope.resolve(Target, options));
|
|
8
8
|
}
|
|
9
9
|
static fromValue(value) {
|
|
10
10
|
return new Provider(() => value);
|
|
11
11
|
}
|
|
12
12
|
static fromKey(key) {
|
|
13
|
-
return new Provider((
|
|
13
|
+
return new Provider(({ scope }) => scope.resolve(key));
|
|
14
14
|
}
|
|
15
15
|
argsFnList = [];
|
|
16
16
|
accessRules = [];
|
|
@@ -24,20 +24,21 @@ export class Provider {
|
|
|
24
24
|
constructor(resolveDependency) {
|
|
25
25
|
this.resolveDependency = resolveDependency;
|
|
26
26
|
}
|
|
27
|
-
resolve(
|
|
27
|
+
resolve(options) {
|
|
28
28
|
ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
|
|
29
29
|
if (!this.getKey) {
|
|
30
|
-
return this.resolveDep(
|
|
30
|
+
return this.resolveDep(options);
|
|
31
31
|
}
|
|
32
32
|
const key = toString(this.getKey(options.args ?? []));
|
|
33
33
|
if (!this.cache.has(key)) {
|
|
34
|
-
this.cache.set(key, this.resolveDep(
|
|
34
|
+
this.cache.set(key, this.resolveDep(options));
|
|
35
35
|
}
|
|
36
36
|
return this.cache.get(key);
|
|
37
37
|
}
|
|
38
|
-
resolveDep(scope,
|
|
39
|
-
let dependency = this.resolveDependency(
|
|
40
|
-
|
|
38
|
+
resolveDep({ scope, args = [], lazy }) {
|
|
39
|
+
let dependency = this.resolveDependency({
|
|
40
|
+
scope,
|
|
41
|
+
args: this.argsFnList.reduce((acc, current) => current({ scope, args: acc }), args),
|
|
41
42
|
lazy: lazy ?? this.isLazy,
|
|
42
43
|
});
|
|
43
44
|
dependency = this.mappers.reduce((acc, current) => current(acc, scope), dependency);
|
|
@@ -28,8 +28,8 @@ export const bindTo = (...tokens) => (r) => {
|
|
|
28
28
|
return r;
|
|
29
29
|
};
|
|
30
30
|
export const scope = (...rules) => (r) => r.when(...rules);
|
|
31
|
-
export const appendArgs = (...extraArgs) => registerPipe((p) => p.addArgsFn((
|
|
32
|
-
export const appendArgsFn = (fn) => registerPipe((p) => p.addArgsFn((
|
|
31
|
+
export const appendArgs = (...extraArgs) => registerPipe((p) => p.addArgsFn(({ args = [] }) => [...args, ...extraArgs]));
|
|
32
|
+
export const appendArgsFn = (fn) => registerPipe((p) => p.addArgsFn((options) => [...(options.args ?? []), ...fn(options)]));
|
|
33
33
|
export const scopeAccess = (rule) => registerPipe((p) => p.addAccessRule(rule));
|
|
34
34
|
export const lazy = () => registerPipe((p) => p.lazy());
|
|
35
35
|
export const autoResolve = () => registerPipe((p) => p.autoResolve());
|
package/esm/select.js
CHANGED
|
@@ -7,7 +7,7 @@ export const select = {
|
|
|
7
7
|
token: toToken,
|
|
8
8
|
instances: (predicate = () => true) => new GroupInstanceToken(predicate),
|
|
9
9
|
scope: {
|
|
10
|
-
current: new FunctionToken((
|
|
11
|
-
create: (options) => new FunctionToken((
|
|
10
|
+
current: new FunctionToken(({ scope }) => scope),
|
|
11
|
+
create: (options) => new FunctionToken(({ scope }) => scope.createScope(options)),
|
|
12
12
|
},
|
|
13
13
|
};
|
package/esm/token/ClassToken.js
CHANGED
|
@@ -14,14 +14,14 @@ export class ClassToken extends InjectionToken {
|
|
|
14
14
|
}
|
|
15
15
|
resolve(s, { args = [], lazy } = {}) {
|
|
16
16
|
return s.resolve(this.target, {
|
|
17
|
-
args: this._getArgsFn(s,
|
|
17
|
+
args: this._getArgsFn({ scope: s, args }),
|
|
18
18
|
lazy: this._isLazy || lazy,
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
args(...newArgs) {
|
|
22
22
|
const parentFn = this._getArgsFn;
|
|
23
23
|
return new ClassToken(this.target, {
|
|
24
|
-
getArgsFn: (
|
|
24
|
+
getArgsFn: (options) => [...parentFn(options), ...newArgs],
|
|
25
25
|
isLazy: this._isLazy,
|
|
26
26
|
tags: this.getTags(),
|
|
27
27
|
});
|
|
@@ -29,7 +29,7 @@ export class ClassToken extends InjectionToken {
|
|
|
29
29
|
argsFn(fn) {
|
|
30
30
|
const parentFn = this._getArgsFn;
|
|
31
31
|
return new ClassToken(this.target, {
|
|
32
|
-
getArgsFn: (
|
|
32
|
+
getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
|
|
33
33
|
isLazy: this._isLazy,
|
|
34
34
|
tags: this.getTags(),
|
|
35
35
|
});
|