ts-ioc-container 47.0.0 → 47.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/cjm/container/Container.js +1 -1
- package/cjm/hooks/HookContext.js +10 -4
- package/cjm/hooks/hook.js +10 -2
- package/cjm/index.js +29 -16
- package/cjm/injector/IInjector.js +1 -0
- package/cjm/injector/inject.js +2 -2
- package/cjm/metadata/class.js +15 -6
- package/cjm/metadata/errorHandler.js +29 -0
- package/cjm/metadata/method.js +14 -5
- package/cjm/metadata/parameter.js +27 -6
- package/cjm/registration/IRegistration.js +2 -2
- package/cjm/utils/basic.js +4 -0
- package/cjm/utils/proxy.js +23 -3
- package/esm/container/Container.js +1 -1
- package/esm/hooks/HookContext.js +10 -4
- package/esm/hooks/hook.js +10 -2
- package/esm/index.js +8 -10
- package/esm/injector/IInjector.js +1 -0
- package/esm/injector/inject.js +3 -3
- package/esm/metadata/class.js +8 -3
- package/esm/metadata/errorHandler.js +24 -0
- package/esm/metadata/method.js +7 -2
- package/esm/metadata/parameter.js +20 -3
- package/esm/registration/IRegistration.js +3 -3
- package/esm/utils/basic.js +3 -0
- package/esm/utils/proxy.js +21 -3
- package/package.json +56 -12
- package/typings/hooks/HookContext.d.ts +6 -3
- package/typings/index.d.ts +7 -12
- package/typings/metadata/class.d.ts +6 -2
- package/typings/metadata/errorHandler.d.ts +6 -0
- package/typings/metadata/method.d.ts +6 -2
- package/typings/metadata/parameter.d.ts +6 -3
- package/typings/utils/basic.d.ts +1 -0
- package/typings/utils/proxy.d.ts +4 -2
package/README.md
CHANGED
|
@@ -2626,7 +2626,7 @@ Sometimes you need to invoke methods after construct or dispose of class. This i
|
|
|
2626
2626
|
import {
|
|
2627
2627
|
AddOnConstructHookModule,
|
|
2628
2628
|
Container,
|
|
2629
|
-
|
|
2629
|
+
IHookContext,
|
|
2630
2630
|
HookFn,
|
|
2631
2631
|
inject,
|
|
2632
2632
|
onConstruct,
|
|
@@ -2646,7 +2646,7 @@ import {
|
|
|
2646
2646
|
* Note: You must register the AddOnConstructHookModule or manually add the hook runner.
|
|
2647
2647
|
*/
|
|
2648
2648
|
|
|
2649
|
-
const execute: HookFn = (ctx:
|
|
2649
|
+
const execute: HookFn = (ctx: IHookContext) => {
|
|
2650
2650
|
ctx.invokeMethod({ args: ctx.resolveArgs() });
|
|
2651
2651
|
};
|
|
2652
2652
|
|
|
@@ -63,7 +63,7 @@ class Container {
|
|
|
63
63
|
}
|
|
64
64
|
resolveOneByAlias(alias, { args, child = this, lazy } = {}) {
|
|
65
65
|
this.validateContainer();
|
|
66
|
-
const key = this.aliases.getKeysByAlias(alias)
|
|
66
|
+
const [key, ..._] = this.aliases.getKeysByAlias(alias);
|
|
67
67
|
const provider = key ? this.findProviderByKeyOrFail(key) : undefined;
|
|
68
68
|
return provider?.hasAccess({ invocationScope: child, providerScope: this })
|
|
69
69
|
? provider.resolve(this, { args, lazy })
|
package/cjm/hooks/HookContext.js
CHANGED
|
@@ -2,19 +2,21 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createHookContext = exports.HookContext = void 0;
|
|
4
4
|
const inject_1 = require("../injector/inject");
|
|
5
|
+
const proxy_1 = require("../utils/proxy");
|
|
5
6
|
class HookContext {
|
|
6
|
-
instance;
|
|
7
7
|
scope;
|
|
8
8
|
methodName;
|
|
9
|
+
instance;
|
|
10
|
+
initialArgs = [];
|
|
9
11
|
constructor(instance, scope, methodName) {
|
|
10
|
-
this.instance = instance;
|
|
11
12
|
this.scope = scope;
|
|
12
13
|
this.methodName = methodName;
|
|
14
|
+
this.instance = (0, proxy_1.isProxy)(instance) ? (0, proxy_1.getProxyTarget)(instance) : instance;
|
|
13
15
|
}
|
|
14
16
|
resolveArgs(...args) {
|
|
15
|
-
return (0, inject_1.resolveArgs)(this.instance.constructor, this.methodName)(this.scope, ...args);
|
|
17
|
+
return (0, inject_1.resolveArgs)(this.instance.constructor, this.methodName)(this.scope, ...[...this.initialArgs, ...args]);
|
|
16
18
|
}
|
|
17
|
-
invokeMethod({ args = this.resolveArgs() }) {
|
|
19
|
+
invokeMethod({ args = this.resolveArgs() } = {}) {
|
|
18
20
|
// @ts-ignore
|
|
19
21
|
return this.instance[this.methodName](...args);
|
|
20
22
|
}
|
|
@@ -22,6 +24,10 @@ class HookContext {
|
|
|
22
24
|
// @ts-ignore
|
|
23
25
|
this.instance[this.methodName] = fn.resolve(this.scope);
|
|
24
26
|
}
|
|
27
|
+
setInitialArgs(...args) {
|
|
28
|
+
this.initialArgs = args;
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
25
31
|
}
|
|
26
32
|
exports.HookContext = HookContext;
|
|
27
33
|
const createHookContext = (Target, scope, methodName = 'constructor') => new HookContext(Target, scope, methodName);
|
package/cjm/hooks/hook.js
CHANGED
|
@@ -4,17 +4,25 @@ exports.hook = exports.toHookFn = void 0;
|
|
|
4
4
|
exports.getHooks = getHooks;
|
|
5
5
|
exports.hasHooks = hasHooks;
|
|
6
6
|
const basic_1 = require("../utils/basic");
|
|
7
|
+
const proxy_1 = require("../utils/proxy");
|
|
7
8
|
const isHookClassConstructor = (execute) => {
|
|
8
9
|
return basic_1.Is.constructor(execute) && execute.prototype.execute;
|
|
9
10
|
};
|
|
10
11
|
const toHookFn = (execute) => isHookClassConstructor(execute) ? (context) => context.scope.resolve(execute).execute(context) : execute;
|
|
11
12
|
exports.toHookFn = toHookFn;
|
|
13
|
+
const getReflectionTarget = (target) => {
|
|
14
|
+
return (0, proxy_1.isProxy)(target) ? (0, proxy_1.getProxyTarget)(target) : target;
|
|
15
|
+
};
|
|
12
16
|
// Get hooks metadata
|
|
13
17
|
function getHooks(target, key) {
|
|
14
|
-
|
|
18
|
+
const reflectionTarget = getReflectionTarget(target);
|
|
19
|
+
return Reflect.hasMetadata(key, reflectionTarget.constructor)
|
|
20
|
+
? Reflect.getMetadata(key, reflectionTarget.constructor)
|
|
21
|
+
: new Map();
|
|
15
22
|
}
|
|
16
23
|
function hasHooks(target, key) {
|
|
17
|
-
|
|
24
|
+
const reflectionTarget = getReflectionTarget(target);
|
|
25
|
+
return Reflect.hasMetadata(key, reflectionTarget.constructor);
|
|
18
26
|
}
|
|
19
27
|
// Hook decorator
|
|
20
28
|
const hook = (key, ...fns) => (target, propertyKey) => {
|
package/cjm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.InjectionToken = exports.HooksRunner = exports.AddOnDisposeHookModule = exports.onDispose = exports.onDisposeHooksRunner = exports.AddOnConstructHookModule = exports.onConstruct = exports.onConstructHooksRunner = exports.injectProp = exports.HookContext = exports.hasHooks = exports.hook = exports.getHooks = exports.UnexpectedHookResultError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.DependencyNotFoundError = exports.Registration = exports.bindTo = exports.register = exports.scope = exports.decorate = exports.MultiCache = exports.multiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.resolveByArgs = exports.ProviderDecorator = exports.args = exports.argsFn = exports.lazy = exports.scopeAccess = exports.ProxyInjector = exports.SimpleInjector = exports.MetadataInjector = exports.Injector = exports.resolveArgs = exports.inject = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.resolveConstructor = exports.Is = exports.pipe = exports.select = exports.getMethodTags = exports.methodTag = exports.getMethodLabels = exports.methodLabel = exports.getMethodMeta = exports.methodMeta = exports.getParamTags = exports.paramTag = exports.getParamLabels = exports.paramLabel = exports.getParamMeta = exports.paramMeta = exports.getClassTags = exports.classTag = exports.getClassLabels = exports.classLabel = exports.getClassMeta = exports.classMeta = exports.handleAsyncError = exports.handleError = exports.GroupInstanceToken = exports.ConstantToken = void 0;
|
|
5
5
|
// Containers
|
|
6
6
|
var IContainer_1 = require("./container/IContainer");
|
|
7
7
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
@@ -76,8 +76,7 @@ Object.defineProperty(exports, "onDispose", { enumerable: true, get: function ()
|
|
|
76
76
|
Object.defineProperty(exports, "AddOnDisposeHookModule", { enumerable: true, get: function () { return onDispose_1.AddOnDisposeHookModule; } });
|
|
77
77
|
var HooksRunner_1 = require("./hooks/HooksRunner");
|
|
78
78
|
Object.defineProperty(exports, "HooksRunner", { enumerable: true, get: function () { return HooksRunner_1.HooksRunner; } });
|
|
79
|
-
//
|
|
80
|
-
// InjectionToken
|
|
79
|
+
// Tokens
|
|
81
80
|
var InjectionToken_1 = require("./token/InjectionToken");
|
|
82
81
|
Object.defineProperty(exports, "InjectionToken", { enumerable: true, get: function () { return InjectionToken_1.InjectionToken; } });
|
|
83
82
|
var GroupAliasToken_1 = require("./token/GroupAliasToken");
|
|
@@ -96,22 +95,36 @@ var ConstantToken_1 = require("./token/ConstantToken");
|
|
|
96
95
|
Object.defineProperty(exports, "ConstantToken", { enumerable: true, get: function () { return ConstantToken_1.ConstantToken; } });
|
|
97
96
|
var GroupInstanceToken_1 = require("./token/GroupInstanceToken");
|
|
98
97
|
Object.defineProperty(exports, "GroupInstanceToken", { enumerable: true, get: function () { return GroupInstanceToken_1.GroupInstanceToken; } });
|
|
99
|
-
//
|
|
98
|
+
// Metadata
|
|
99
|
+
var errorHandler_1 = require("./metadata/errorHandler");
|
|
100
|
+
Object.defineProperty(exports, "handleError", { enumerable: true, get: function () { return errorHandler_1.handleError; } });
|
|
101
|
+
Object.defineProperty(exports, "handleAsyncError", { enumerable: true, get: function () { return errorHandler_1.handleAsyncError; } });
|
|
102
|
+
var class_1 = require("./metadata/class");
|
|
103
|
+
Object.defineProperty(exports, "classMeta", { enumerable: true, get: function () { return class_1.classMeta; } });
|
|
104
|
+
Object.defineProperty(exports, "getClassMeta", { enumerable: true, get: function () { return class_1.getClassMeta; } });
|
|
105
|
+
Object.defineProperty(exports, "classLabel", { enumerable: true, get: function () { return class_1.classLabel; } });
|
|
106
|
+
Object.defineProperty(exports, "getClassLabels", { enumerable: true, get: function () { return class_1.getClassLabels; } });
|
|
107
|
+
Object.defineProperty(exports, "classTag", { enumerable: true, get: function () { return class_1.classTag; } });
|
|
108
|
+
Object.defineProperty(exports, "getClassTags", { enumerable: true, get: function () { return class_1.getClassTags; } });
|
|
109
|
+
var parameter_1 = require("./metadata/parameter");
|
|
110
|
+
Object.defineProperty(exports, "paramMeta", { enumerable: true, get: function () { return parameter_1.paramMeta; } });
|
|
111
|
+
Object.defineProperty(exports, "getParamMeta", { enumerable: true, get: function () { return parameter_1.getParamMeta; } });
|
|
112
|
+
Object.defineProperty(exports, "paramLabel", { enumerable: true, get: function () { return parameter_1.paramLabel; } });
|
|
113
|
+
Object.defineProperty(exports, "getParamLabels", { enumerable: true, get: function () { return parameter_1.getParamLabels; } });
|
|
114
|
+
Object.defineProperty(exports, "paramTag", { enumerable: true, get: function () { return parameter_1.paramTag; } });
|
|
115
|
+
Object.defineProperty(exports, "getParamTags", { enumerable: true, get: function () { return parameter_1.getParamTags; } });
|
|
116
|
+
var method_1 = require("./metadata/method");
|
|
117
|
+
Object.defineProperty(exports, "methodMeta", { enumerable: true, get: function () { return method_1.methodMeta; } });
|
|
118
|
+
Object.defineProperty(exports, "getMethodMeta", { enumerable: true, get: function () { return method_1.getMethodMeta; } });
|
|
119
|
+
Object.defineProperty(exports, "methodLabel", { enumerable: true, get: function () { return method_1.methodLabel; } });
|
|
120
|
+
Object.defineProperty(exports, "getMethodLabels", { enumerable: true, get: function () { return method_1.getMethodLabels; } });
|
|
121
|
+
Object.defineProperty(exports, "methodTag", { enumerable: true, get: function () { return method_1.methodTag; } });
|
|
122
|
+
Object.defineProperty(exports, "getMethodTags", { enumerable: true, get: function () { return method_1.getMethodTags; } });
|
|
123
|
+
// Utils
|
|
100
124
|
var select_1 = require("./select");
|
|
101
125
|
Object.defineProperty(exports, "select", { enumerable: true, get: function () { return select_1.select; } });
|
|
102
126
|
var fp_1 = require("./utils/fp");
|
|
103
127
|
Object.defineProperty(exports, "pipe", { enumerable: true, get: function () { return fp_1.pipe; } });
|
|
104
128
|
var basic_1 = require("./utils/basic");
|
|
105
129
|
Object.defineProperty(exports, "Is", { enumerable: true, get: function () { return basic_1.Is; } });
|
|
106
|
-
|
|
107
|
-
Object.defineProperty(exports, "getClassMetadata", { enumerable: true, get: function () { return class_1.getClassMetadata; } });
|
|
108
|
-
var class_2 = require("./metadata/class");
|
|
109
|
-
Object.defineProperty(exports, "setClassMetadata", { enumerable: true, get: function () { return class_2.setClassMetadata; } });
|
|
110
|
-
var parameter_1 = require("./metadata/parameter");
|
|
111
|
-
Object.defineProperty(exports, "getParameterMetadata", { enumerable: true, get: function () { return parameter_1.getParameterMetadata; } });
|
|
112
|
-
var parameter_2 = require("./metadata/parameter");
|
|
113
|
-
Object.defineProperty(exports, "setParameterMetadata", { enumerable: true, get: function () { return parameter_2.setParameterMetadata; } });
|
|
114
|
-
var method_1 = require("./metadata/method");
|
|
115
|
-
Object.defineProperty(exports, "getMethodMetadata", { enumerable: true, get: function () { return method_1.getMethodMetadata; } });
|
|
116
|
-
var method_2 = require("./metadata/method");
|
|
117
|
-
Object.defineProperty(exports, "setMethodMetadata", { enumerable: true, get: function () { return method_2.setMethodMetadata; } });
|
|
130
|
+
Object.defineProperty(exports, "resolveConstructor", { enumerable: true, get: function () { return basic_1.resolveConstructor; } });
|
|
@@ -4,6 +4,7 @@ exports.Injector = void 0;
|
|
|
4
4
|
const proxy_1 = require("../utils/proxy");
|
|
5
5
|
class Injector {
|
|
6
6
|
resolve(scope, Target, { args, lazy } = {}) {
|
|
7
|
+
// @ts-ignore
|
|
7
8
|
return (0, proxy_1.toLazyIf)(() => {
|
|
8
9
|
const instance = this.createInstance(scope, Target, { args });
|
|
9
10
|
scope.addInstance(instance);
|
package/cjm/injector/inject.js
CHANGED
|
@@ -8,11 +8,11 @@ const basic_1 = require("../utils/basic");
|
|
|
8
8
|
const parameter_1 = require("../metadata/parameter");
|
|
9
9
|
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
|
|
10
10
|
const inject = (fn) => (target, propertyKey, parameterIndex) => {
|
|
11
|
-
(0, parameter_1.
|
|
11
|
+
(0, parameter_1.paramMeta)(hookMetaKey(propertyKey), () => (0, toToken_1.toToken)(fn))(basic_1.Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
|
|
12
12
|
};
|
|
13
13
|
exports.inject = inject;
|
|
14
14
|
const resolveArgs = (Target, methodName) => {
|
|
15
|
-
const argsTokens = (0, parameter_1.
|
|
15
|
+
const argsTokens = (0, parameter_1.getParamMeta)(hookMetaKey(methodName), Target);
|
|
16
16
|
return (scope, ...deps) => {
|
|
17
17
|
const depsTokens = deps.map((v) => new ConstantToken_1.ConstantToken(v));
|
|
18
18
|
const allTokens = (0, array_1.fillEmptyIndexes)(argsTokens, depsTokens);
|
package/cjm/metadata/class.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
5
|
-
const
|
|
3
|
+
exports.getClassTags = exports.classTag = exports.getClassLabels = exports.classLabel = exports.classMeta = void 0;
|
|
4
|
+
exports.getClassMeta = getClassMeta;
|
|
5
|
+
const basic_1 = require("../utils/basic");
|
|
6
|
+
const classMeta = (key, mapFn) => (target) => {
|
|
6
7
|
const value = Reflect.getOwnMetadata(key, target);
|
|
7
8
|
Reflect.defineMetadata(key, mapFn(value), target);
|
|
8
9
|
};
|
|
9
|
-
exports.
|
|
10
|
-
function
|
|
11
|
-
return Reflect.getOwnMetadata(key, target);
|
|
10
|
+
exports.classMeta = classMeta;
|
|
11
|
+
function getClassMeta(target, key) {
|
|
12
|
+
return Reflect.getOwnMetadata(key, (0, basic_1.resolveConstructor)(target));
|
|
12
13
|
}
|
|
14
|
+
const classLabel = (key, label) => (0, exports.classMeta)('label', (prev = new Map()) => prev.set(key, label));
|
|
15
|
+
exports.classLabel = classLabel;
|
|
16
|
+
const getClassLabels = (target) => getClassMeta(target, 'label') ?? new Map();
|
|
17
|
+
exports.getClassLabels = getClassLabels;
|
|
18
|
+
const classTag = (tag) => (0, exports.classMeta)('tag', (prev = new Set()) => prev.add(tag));
|
|
19
|
+
exports.classTag = classTag;
|
|
20
|
+
const getClassTags = (target) => getClassMeta(target, 'tag') ?? new Set();
|
|
21
|
+
exports.getClassTags = getClassTags;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleError = exports.handleAsyncError = void 0;
|
|
4
|
+
const handleAsyncError = (errorHandler) => (target, propertyKey, descriptor) => {
|
|
5
|
+
const originalMethod = descriptor.value;
|
|
6
|
+
descriptor.value = async function (...args) {
|
|
7
|
+
try {
|
|
8
|
+
return await originalMethod.apply(this, args);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
errorHandler(e, { target: target.constructor.name, method: propertyKey });
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
return descriptor;
|
|
15
|
+
};
|
|
16
|
+
exports.handleAsyncError = handleAsyncError;
|
|
17
|
+
const handleError = (errorHandler) => (target, propertyKey, descriptor) => {
|
|
18
|
+
const originalMethod = descriptor.value;
|
|
19
|
+
descriptor.value = function (...args) {
|
|
20
|
+
try {
|
|
21
|
+
return originalMethod.apply(this, args);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
errorHandler(e, { target: target.constructor.name, method: propertyKey });
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return descriptor;
|
|
28
|
+
};
|
|
29
|
+
exports.handleError = handleError;
|
package/cjm/metadata/method.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
3
|
+
exports.getMethodTags = exports.methodTag = exports.getMethodLabels = exports.methodLabel = exports.getMethodMeta = exports.methodMeta = void 0;
|
|
4
|
+
const basic_1 = require("../utils/basic");
|
|
5
|
+
const methodMeta = (key, mapFn) => (target, propertyKey) => {
|
|
5
6
|
const metadata = Reflect.getMetadata(key, target.constructor, propertyKey);
|
|
6
7
|
Reflect.defineMetadata(key, mapFn(metadata), target.constructor, propertyKey);
|
|
7
8
|
};
|
|
8
|
-
exports.
|
|
9
|
-
const
|
|
10
|
-
exports.
|
|
9
|
+
exports.methodMeta = methodMeta;
|
|
10
|
+
const getMethodMeta = (key, target, propertyKey) => Reflect.getMetadata(key, (0, basic_1.resolveConstructor)(target), propertyKey);
|
|
11
|
+
exports.getMethodMeta = getMethodMeta;
|
|
12
|
+
const methodLabel = (key, label) => (0, exports.methodMeta)('label', (prev = new Map()) => prev.set(key, label));
|
|
13
|
+
exports.methodLabel = methodLabel;
|
|
14
|
+
const getMethodLabels = (target, propertyKey) => (0, exports.getMethodMeta)('label', target, propertyKey) ?? new Map();
|
|
15
|
+
exports.getMethodLabels = getMethodLabels;
|
|
16
|
+
const methodTag = (tag) => (0, exports.methodMeta)('tag', (prev = new Set()) => prev.add(tag));
|
|
17
|
+
exports.methodTag = methodTag;
|
|
18
|
+
const getMethodTags = (target, propertyKey) => (0, exports.getMethodMeta)('tag', target, propertyKey) ?? new Set();
|
|
19
|
+
exports.getMethodTags = getMethodTags;
|
|
@@ -1,13 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
3
|
+
exports.getParamTags = exports.paramTag = exports.getParamLabels = exports.paramLabel = exports.getParamMeta = exports.paramMeta = void 0;
|
|
4
|
+
const basic_1 = require("../utils/basic");
|
|
5
|
+
const paramMeta = (key, mapFn) => (target, _, parameterIndex) => {
|
|
5
6
|
const metadata = Reflect.getOwnMetadata(key, target) ?? [];
|
|
6
7
|
metadata[parameterIndex] = mapFn(metadata[parameterIndex]);
|
|
7
8
|
Reflect.defineMetadata(key, metadata, target);
|
|
8
9
|
};
|
|
9
|
-
exports.
|
|
10
|
-
const
|
|
11
|
-
return Reflect.getOwnMetadata(key, target) ?? [];
|
|
10
|
+
exports.paramMeta = paramMeta;
|
|
11
|
+
const getParamMeta = (key, target) => {
|
|
12
|
+
return Reflect.getOwnMetadata(key, (0, basic_1.resolveConstructor)(target)) ?? [];
|
|
12
13
|
};
|
|
13
|
-
exports.
|
|
14
|
+
exports.getParamMeta = getParamMeta;
|
|
15
|
+
const paramLabel = (key, label) => (0, exports.paramMeta)('label', (prev) => {
|
|
16
|
+
const map = prev ?? new Map();
|
|
17
|
+
return map.set(key, label);
|
|
18
|
+
});
|
|
19
|
+
exports.paramLabel = paramLabel;
|
|
20
|
+
const getParamLabels = (target, parameterIndex) => {
|
|
21
|
+
const all = (0, exports.getParamMeta)('label', target);
|
|
22
|
+
return all[parameterIndex] ?? new Map();
|
|
23
|
+
};
|
|
24
|
+
exports.getParamLabels = getParamLabels;
|
|
25
|
+
const paramTag = (tag) => (0, exports.paramMeta)('tag', (prev) => {
|
|
26
|
+
const set = prev ?? new Set();
|
|
27
|
+
return set.add(tag);
|
|
28
|
+
});
|
|
29
|
+
exports.paramTag = paramTag;
|
|
30
|
+
const getParamTags = (target, parameterIndex) => {
|
|
31
|
+
const all = (0, exports.getParamMeta)('tag', target);
|
|
32
|
+
return all[parameterIndex] ?? new Set();
|
|
33
|
+
};
|
|
34
|
+
exports.getParamTags = getParamTags;
|
|
@@ -8,9 +8,9 @@ const class_1 = require("../metadata/class");
|
|
|
8
8
|
const scope = (...rules) => (r) => r.when(...rules);
|
|
9
9
|
exports.scope = scope;
|
|
10
10
|
const METADATA_KEY = 'registration';
|
|
11
|
-
const getTransformers = (Target) => (0, class_1.
|
|
11
|
+
const getTransformers = (Target) => (0, class_1.getClassMeta)(Target, METADATA_KEY) ?? [];
|
|
12
12
|
exports.getTransformers = getTransformers;
|
|
13
|
-
const register = (...mappers) => (0, class_1.
|
|
13
|
+
const register = (...mappers) => (0, class_1.classMeta)(METADATA_KEY, (acc) => {
|
|
14
14
|
const result = mappers.map((m) => (0, ProviderPipe_1.isProviderPipe)(m) ? (r) => m.mapRegistration(r) : m);
|
|
15
15
|
return acc ? [...result, ...acc] : result;
|
|
16
16
|
});
|
package/cjm/utils/basic.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Is = void 0;
|
|
4
|
+
exports.resolveConstructor = resolveConstructor;
|
|
4
5
|
exports.Is = {
|
|
5
6
|
nullish: (value) => value === undefined || value === null,
|
|
6
7
|
object: (target) => target !== null && typeof target === 'object',
|
|
7
8
|
instance: (target) => Object.prototype.hasOwnProperty.call(target, 'constructor'),
|
|
8
9
|
constructor: (target) => typeof target === 'function' && !!target.prototype,
|
|
9
10
|
};
|
|
11
|
+
function resolveConstructor(target) {
|
|
12
|
+
return exports.Is.constructor(target) ? target : target.constructor;
|
|
13
|
+
}
|
package/cjm/utils/proxy.js
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isProxy = isProxy;
|
|
4
|
+
exports.getProxyTarget = getProxyTarget;
|
|
3
5
|
exports.lazyProxy = lazyProxy;
|
|
4
6
|
exports.toLazyIf = toLazyIf;
|
|
7
|
+
const proxyStateMap = new WeakMap();
|
|
8
|
+
const unwrapProxyTarget = (value) => {
|
|
9
|
+
return isProxy(value) ? getProxyTarget(value) : value;
|
|
10
|
+
};
|
|
11
|
+
function isProxy(value) {
|
|
12
|
+
return proxyStateMap.has(value);
|
|
13
|
+
}
|
|
14
|
+
function getProxyTarget(value) {
|
|
15
|
+
return proxyStateMap.get(value).getTarget();
|
|
16
|
+
}
|
|
5
17
|
function lazyProxy(resolveInstance) {
|
|
6
18
|
let instance;
|
|
7
|
-
|
|
19
|
+
const state = {
|
|
20
|
+
getTarget: () => {
|
|
21
|
+
instance = instance ?? unwrapProxyTarget(resolveInstance());
|
|
22
|
+
return instance;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const proxy = new Proxy({}, {
|
|
8
26
|
get: (_, prop) => {
|
|
9
|
-
|
|
27
|
+
const target = state.getTarget();
|
|
10
28
|
// @ts-ignore
|
|
11
|
-
return
|
|
29
|
+
return target[prop];
|
|
12
30
|
},
|
|
13
31
|
});
|
|
32
|
+
proxyStateMap.set(proxy, state);
|
|
33
|
+
return proxy;
|
|
14
34
|
}
|
|
15
35
|
function toLazyIf(resolveInstance, isLazy = false) {
|
|
16
36
|
if (isLazy) {
|
|
@@ -60,7 +60,7 @@ export class Container {
|
|
|
60
60
|
}
|
|
61
61
|
resolveOneByAlias(alias, { args, child = this, lazy } = {}) {
|
|
62
62
|
this.validateContainer();
|
|
63
|
-
const key = this.aliases.getKeysByAlias(alias)
|
|
63
|
+
const [key, ..._] = this.aliases.getKeysByAlias(alias);
|
|
64
64
|
const provider = key ? this.findProviderByKeyOrFail(key) : undefined;
|
|
65
65
|
return provider?.hasAccess({ invocationScope: child, providerScope: this })
|
|
66
66
|
? provider.resolve(this, { args, lazy })
|
package/esm/hooks/HookContext.js
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { resolveArgs } from '../injector/inject';
|
|
2
|
+
import { getProxyTarget, isProxy } from '../utils/proxy';
|
|
2
3
|
export class HookContext {
|
|
3
|
-
instance;
|
|
4
4
|
scope;
|
|
5
5
|
methodName;
|
|
6
|
+
instance;
|
|
7
|
+
initialArgs = [];
|
|
6
8
|
constructor(instance, scope, methodName) {
|
|
7
|
-
this.instance = instance;
|
|
8
9
|
this.scope = scope;
|
|
9
10
|
this.methodName = methodName;
|
|
11
|
+
this.instance = isProxy(instance) ? getProxyTarget(instance) : instance;
|
|
10
12
|
}
|
|
11
13
|
resolveArgs(...args) {
|
|
12
|
-
return resolveArgs(this.instance.constructor, this.methodName)(this.scope, ...args);
|
|
14
|
+
return resolveArgs(this.instance.constructor, this.methodName)(this.scope, ...[...this.initialArgs, ...args]);
|
|
13
15
|
}
|
|
14
|
-
invokeMethod({ args = this.resolveArgs() }) {
|
|
16
|
+
invokeMethod({ args = this.resolveArgs() } = {}) {
|
|
15
17
|
// @ts-ignore
|
|
16
18
|
return this.instance[this.methodName](...args);
|
|
17
19
|
}
|
|
@@ -19,5 +21,9 @@ export class HookContext {
|
|
|
19
21
|
// @ts-ignore
|
|
20
22
|
this.instance[this.methodName] = fn.resolve(this.scope);
|
|
21
23
|
}
|
|
24
|
+
setInitialArgs(...args) {
|
|
25
|
+
this.initialArgs = args;
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
22
28
|
}
|
|
23
29
|
export const createHookContext = (Target, scope, methodName = 'constructor') => new HookContext(Target, scope, methodName);
|
package/esm/hooks/hook.js
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { Is } from '../utils/basic';
|
|
2
|
+
import { getProxyTarget, isProxy } from '../utils/proxy';
|
|
2
3
|
const isHookClassConstructor = (execute) => {
|
|
3
4
|
return Is.constructor(execute) && execute.prototype.execute;
|
|
4
5
|
};
|
|
5
6
|
export const toHookFn = (execute) => isHookClassConstructor(execute) ? (context) => context.scope.resolve(execute).execute(context) : execute;
|
|
7
|
+
const getReflectionTarget = (target) => {
|
|
8
|
+
return isProxy(target) ? getProxyTarget(target) : target;
|
|
9
|
+
};
|
|
6
10
|
// Get hooks metadata
|
|
7
11
|
export function getHooks(target, key) {
|
|
8
|
-
|
|
12
|
+
const reflectionTarget = getReflectionTarget(target);
|
|
13
|
+
return Reflect.hasMetadata(key, reflectionTarget.constructor)
|
|
14
|
+
? Reflect.getMetadata(key, reflectionTarget.constructor)
|
|
15
|
+
: new Map();
|
|
9
16
|
}
|
|
10
17
|
export function hasHooks(target, key) {
|
|
11
|
-
|
|
18
|
+
const reflectionTarget = getReflectionTarget(target);
|
|
19
|
+
return Reflect.hasMetadata(key, reflectionTarget.constructor);
|
|
12
20
|
}
|
|
13
21
|
// Hook decorator
|
|
14
22
|
export const hook = (key, ...fns) => (target, propertyKey) => {
|
package/esm/index.js
CHANGED
|
@@ -30,8 +30,7 @@ export { injectProp } from './hooks/injectProp';
|
|
|
30
30
|
export { onConstructHooksRunner, onConstruct, AddOnConstructHookModule } from './hooks/onConstruct';
|
|
31
31
|
export { onDisposeHooksRunner, onDispose, AddOnDisposeHookModule } from './hooks/onDispose';
|
|
32
32
|
export { HooksRunner } from './hooks/HooksRunner';
|
|
33
|
-
//
|
|
34
|
-
// InjectionToken
|
|
33
|
+
// Tokens
|
|
35
34
|
export { InjectionToken } from './token/InjectionToken';
|
|
36
35
|
export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken';
|
|
37
36
|
export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken';
|
|
@@ -40,13 +39,12 @@ export { SingleToken } from './token/SingleToken';
|
|
|
40
39
|
export { FunctionToken } from './token/FunctionToken';
|
|
41
40
|
export { ConstantToken } from './token/ConstantToken';
|
|
42
41
|
export { GroupInstanceToken } from './token/GroupInstanceToken';
|
|
43
|
-
//
|
|
42
|
+
// Metadata
|
|
43
|
+
export { handleError, handleAsyncError } from './metadata/errorHandler';
|
|
44
|
+
export { classMeta, getClassMeta, classLabel, getClassLabels, classTag, getClassTags } from './metadata/class';
|
|
45
|
+
export { paramMeta, getParamMeta, paramLabel, getParamLabels, paramTag, getParamTags } from './metadata/parameter';
|
|
46
|
+
export { methodMeta, getMethodMeta, methodLabel, getMethodLabels, methodTag, getMethodTags } from './metadata/method';
|
|
47
|
+
// Utils
|
|
44
48
|
export { select } from './select';
|
|
45
49
|
export { pipe } from './utils/fp';
|
|
46
|
-
export { Is } from './utils/basic';
|
|
47
|
-
export { getClassMetadata } from './metadata/class';
|
|
48
|
-
export { setClassMetadata } from './metadata/class';
|
|
49
|
-
export { getParameterMetadata } from './metadata/parameter';
|
|
50
|
-
export { setParameterMetadata } from './metadata/parameter';
|
|
51
|
-
export { getMethodMetadata } from './metadata/method';
|
|
52
|
-
export { setMethodMetadata } from './metadata/method';
|
|
50
|
+
export { Is, resolveConstructor } from './utils/basic';
|
package/esm/injector/inject.js
CHANGED
|
@@ -2,13 +2,13 @@ import { ConstantToken } from '../token/ConstantToken';
|
|
|
2
2
|
import { toToken } from '../token/toToken';
|
|
3
3
|
import { fillEmptyIndexes } from '../utils/array';
|
|
4
4
|
import { Is } from '../utils/basic';
|
|
5
|
-
import {
|
|
5
|
+
import { getParamMeta, paramMeta } from '../metadata/parameter';
|
|
6
6
|
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
|
|
7
7
|
export const inject = (fn) => (target, propertyKey, parameterIndex) => {
|
|
8
|
-
|
|
8
|
+
paramMeta(hookMetaKey(propertyKey), () => toToken(fn))(Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
|
|
9
9
|
};
|
|
10
10
|
export const resolveArgs = (Target, methodName) => {
|
|
11
|
-
const argsTokens =
|
|
11
|
+
const argsTokens = getParamMeta(hookMetaKey(methodName), Target);
|
|
12
12
|
return (scope, ...deps) => {
|
|
13
13
|
const depsTokens = deps.map((v) => new ConstantToken(v));
|
|
14
14
|
const allTokens = fillEmptyIndexes(argsTokens, depsTokens);
|
package/esm/metadata/class.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolveConstructor } from '../utils/basic';
|
|
2
|
+
export const classMeta = (key, mapFn) => (target) => {
|
|
2
3
|
const value = Reflect.getOwnMetadata(key, target);
|
|
3
4
|
Reflect.defineMetadata(key, mapFn(value), target);
|
|
4
5
|
};
|
|
5
|
-
export function
|
|
6
|
-
return Reflect.getOwnMetadata(key, target);
|
|
6
|
+
export function getClassMeta(target, key) {
|
|
7
|
+
return Reflect.getOwnMetadata(key, resolveConstructor(target));
|
|
7
8
|
}
|
|
9
|
+
export const classLabel = (key, label) => classMeta('label', (prev = new Map()) => prev.set(key, label));
|
|
10
|
+
export const getClassLabels = (target) => getClassMeta(target, 'label') ?? new Map();
|
|
11
|
+
export const classTag = (tag) => classMeta('tag', (prev = new Set()) => prev.add(tag));
|
|
12
|
+
export const getClassTags = (target) => getClassMeta(target, 'tag') ?? new Set();
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const handleAsyncError = (errorHandler) => (target, propertyKey, descriptor) => {
|
|
2
|
+
const originalMethod = descriptor.value;
|
|
3
|
+
descriptor.value = async function (...args) {
|
|
4
|
+
try {
|
|
5
|
+
return await originalMethod.apply(this, args);
|
|
6
|
+
}
|
|
7
|
+
catch (e) {
|
|
8
|
+
errorHandler(e, { target: target.constructor.name, method: propertyKey });
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
return descriptor;
|
|
12
|
+
};
|
|
13
|
+
export const handleError = (errorHandler) => (target, propertyKey, descriptor) => {
|
|
14
|
+
const originalMethod = descriptor.value;
|
|
15
|
+
descriptor.value = function (...args) {
|
|
16
|
+
try {
|
|
17
|
+
return originalMethod.apply(this, args);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
errorHandler(e, { target: target.constructor.name, method: propertyKey });
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
return descriptor;
|
|
24
|
+
};
|
package/esm/metadata/method.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolveConstructor } from '../utils/basic';
|
|
2
|
+
export const methodMeta = (key, mapFn) => (target, propertyKey) => {
|
|
2
3
|
const metadata = Reflect.getMetadata(key, target.constructor, propertyKey);
|
|
3
4
|
Reflect.defineMetadata(key, mapFn(metadata), target.constructor, propertyKey);
|
|
4
5
|
};
|
|
5
|
-
export const
|
|
6
|
+
export const getMethodMeta = (key, target, propertyKey) => Reflect.getMetadata(key, resolveConstructor(target), propertyKey);
|
|
7
|
+
export const methodLabel = (key, label) => methodMeta('label', (prev = new Map()) => prev.set(key, label));
|
|
8
|
+
export const getMethodLabels = (target, propertyKey) => getMethodMeta('label', target, propertyKey) ?? new Map();
|
|
9
|
+
export const methodTag = (tag) => methodMeta('tag', (prev = new Set()) => prev.add(tag));
|
|
10
|
+
export const getMethodTags = (target, propertyKey) => getMethodMeta('tag', target, propertyKey) ?? new Set();
|
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import { resolveConstructor } from '../utils/basic';
|
|
2
|
+
export const paramMeta = (key, mapFn) => (target, _, parameterIndex) => {
|
|
2
3
|
const metadata = Reflect.getOwnMetadata(key, target) ?? [];
|
|
3
4
|
metadata[parameterIndex] = mapFn(metadata[parameterIndex]);
|
|
4
5
|
Reflect.defineMetadata(key, metadata, target);
|
|
5
6
|
};
|
|
6
|
-
export const
|
|
7
|
-
return Reflect.getOwnMetadata(key, target) ?? [];
|
|
7
|
+
export const getParamMeta = (key, target) => {
|
|
8
|
+
return Reflect.getOwnMetadata(key, resolveConstructor(target)) ?? [];
|
|
9
|
+
};
|
|
10
|
+
export const paramLabel = (key, label) => paramMeta('label', (prev) => {
|
|
11
|
+
const map = prev ?? new Map();
|
|
12
|
+
return map.set(key, label);
|
|
13
|
+
});
|
|
14
|
+
export const getParamLabels = (target, parameterIndex) => {
|
|
15
|
+
const all = getParamMeta('label', target);
|
|
16
|
+
return all[parameterIndex] ?? new Map();
|
|
17
|
+
};
|
|
18
|
+
export const paramTag = (tag) => paramMeta('tag', (prev) => {
|
|
19
|
+
const set = prev ?? new Set();
|
|
20
|
+
return set.add(tag);
|
|
21
|
+
});
|
|
22
|
+
export const getParamTags = (target, parameterIndex) => {
|
|
23
|
+
const all = getParamMeta('tag', target);
|
|
24
|
+
return all[parameterIndex] ?? new Set();
|
|
8
25
|
};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { isProviderPipe } from '../provider/ProviderPipe';
|
|
2
2
|
import { SingleToken } from '../token/SingleToken';
|
|
3
3
|
import { isBindToken } from '../token/BindToken';
|
|
4
|
-
import {
|
|
4
|
+
import { getClassMeta, classMeta } from '../metadata/class';
|
|
5
5
|
export const scope = (...rules) => (r) => r.when(...rules);
|
|
6
6
|
const METADATA_KEY = 'registration';
|
|
7
|
-
export const getTransformers = (Target) =>
|
|
8
|
-
export const register = (...mappers) =>
|
|
7
|
+
export const getTransformers = (Target) => getClassMeta(Target, METADATA_KEY) ?? [];
|
|
8
|
+
export const register = (...mappers) => classMeta(METADATA_KEY, (acc) => {
|
|
9
9
|
const result = mappers.map((m) => isProviderPipe(m) ? (r) => m.mapRegistration(r) : m);
|
|
10
10
|
return acc ? [...result, ...acc] : result;
|
|
11
11
|
});
|
package/esm/utils/basic.js
CHANGED
|
@@ -4,3 +4,6 @@ export const Is = {
|
|
|
4
4
|
instance: (target) => Object.prototype.hasOwnProperty.call(target, 'constructor'),
|
|
5
5
|
constructor: (target) => typeof target === 'function' && !!target.prototype,
|
|
6
6
|
};
|
|
7
|
+
export function resolveConstructor(target) {
|
|
8
|
+
return Is.constructor(target) ? target : target.constructor;
|
|
9
|
+
}
|
package/esm/utils/proxy.js
CHANGED
|
@@ -1,12 +1,30 @@
|
|
|
1
|
+
const proxyStateMap = new WeakMap();
|
|
2
|
+
const unwrapProxyTarget = (value) => {
|
|
3
|
+
return isProxy(value) ? getProxyTarget(value) : value;
|
|
4
|
+
};
|
|
5
|
+
export function isProxy(value) {
|
|
6
|
+
return proxyStateMap.has(value);
|
|
7
|
+
}
|
|
8
|
+
export function getProxyTarget(value) {
|
|
9
|
+
return proxyStateMap.get(value).getTarget();
|
|
10
|
+
}
|
|
1
11
|
export function lazyProxy(resolveInstance) {
|
|
2
12
|
let instance;
|
|
3
|
-
|
|
13
|
+
const state = {
|
|
14
|
+
getTarget: () => {
|
|
15
|
+
instance = instance ?? unwrapProxyTarget(resolveInstance());
|
|
16
|
+
return instance;
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const proxy = new Proxy({}, {
|
|
4
20
|
get: (_, prop) => {
|
|
5
|
-
|
|
21
|
+
const target = state.getTarget();
|
|
6
22
|
// @ts-ignore
|
|
7
|
-
return
|
|
23
|
+
return target[prop];
|
|
8
24
|
},
|
|
9
25
|
});
|
|
26
|
+
proxyStateMap.set(proxy, state);
|
|
27
|
+
return proxy;
|
|
10
28
|
}
|
|
11
29
|
export function toLazyIf(resolveInstance, isLazy = false) {
|
|
12
30
|
if (isLazy) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "47.0.
|
|
3
|
+
"version": "47.0.1",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
|
+
"workspaces": [
|
|
6
|
+
"docs"
|
|
7
|
+
],
|
|
5
8
|
"publishConfig": {
|
|
6
9
|
"access": "public",
|
|
7
10
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -35,40 +38,81 @@
|
|
|
35
38
|
],
|
|
36
39
|
"repository": {
|
|
37
40
|
"type": "git",
|
|
38
|
-
"url": "git+https://github.com/IgorBabkin/ts-ioc-container"
|
|
39
|
-
"directory": "packages/ts-ioc-container"
|
|
41
|
+
"url": "git+https://github.com/IgorBabkin/ts-ioc-container"
|
|
40
42
|
},
|
|
41
43
|
"scripts": {
|
|
42
44
|
"build:cjm": "rimraf cjm && tsc -p tsconfig.production.json --outDir cjm --module CommonJS",
|
|
43
45
|
"build:esm": "rimraf esm && tsc -p tsconfig.production.json --outDir esm",
|
|
44
46
|
"build:types": "rimraf typings && tsc -p tsconfig.production.json --outDir typings --emitDeclarationOnly --declaration",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"test
|
|
47
|
+
"generate:docs": "scripts/generate-readme/generate-readme.ts && git add README.md",
|
|
48
|
+
"build": "npm run build:cjm && npm run build:esm && npm run build:types",
|
|
49
|
+
"test": "jest",
|
|
50
|
+
"test:coverage": "jest --coverage --coverageReporters=lcov --coverageReporters=text-summary",
|
|
48
51
|
"type-check": "tsc --noEmit",
|
|
49
52
|
"type-check:watch": "tsc --noEmit --watch",
|
|
50
|
-
"
|
|
51
|
-
"lint:fix": "pnpm run lint -- --fix",
|
|
53
|
+
"commit": "cz",
|
|
52
54
|
"format": "prettier --write \"**/*.ts\"",
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
+
"lint": "eslint lib/**/*.ts __tests__/**/*.ts scripts/**/*.ts",
|
|
56
|
+
"lint:fix": "npm run lint --fix",
|
|
57
|
+
"audit": "npm audit",
|
|
58
|
+
"prepare": "husky",
|
|
59
|
+
"release": "npm run build && npm test && npm publish",
|
|
60
|
+
"docs:dev": "pnpm --filter ts-ioc-container-docs run dev",
|
|
61
|
+
"docs:serve": "pnpm --filter ts-ioc-container-docs run dev",
|
|
62
|
+
"docs:build": "pnpm --filter ts-ioc-container-docs run build",
|
|
63
|
+
"docs:preview": "pnpm --filter ts-ioc-container-docs run preview"
|
|
55
64
|
},
|
|
56
65
|
"devDependencies": {
|
|
66
|
+
"@commitlint/cli": "^20.2.0",
|
|
67
|
+
"@commitlint/config-conventional": "^20.2.0",
|
|
68
|
+
"@eslint/eslintrc": "^3.3.5",
|
|
69
|
+
"@eslint/js": "^9.24.0",
|
|
70
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
71
|
+
"@semantic-release/git": "^10.0.1",
|
|
72
|
+
"@semantic-release/github": "^12.0.2",
|
|
73
|
+
"@semantic-release/npm": "^13.1.2",
|
|
57
74
|
"@types/jest": "29.5.14",
|
|
58
|
-
"@types/node": "^25.
|
|
75
|
+
"@types/node": "^25.5.2",
|
|
59
76
|
"@typescript-eslint/eslint-plugin": "8.29.1",
|
|
60
77
|
"@typescript-eslint/parser": "8.29.1",
|
|
78
|
+
"cz-conventional-changelog": "^3.3.0",
|
|
61
79
|
"eslint": "9.24.0",
|
|
62
80
|
"eslint-config-prettier": "10.1.1",
|
|
63
81
|
"eslint-plugin-prettier": "5.2.6",
|
|
64
82
|
"handlebars": "^4.7.8",
|
|
83
|
+
"husky": "^9.1.7",
|
|
65
84
|
"jest": "29.7.0",
|
|
85
|
+
"lint-staged": "^15.5.0",
|
|
66
86
|
"moq.ts": "^7.4.1",
|
|
67
87
|
"prettier": "3.5.3",
|
|
88
|
+
"prettier-plugin-astro": "^0.14.1",
|
|
68
89
|
"reflect-metadata": "^0.2.2",
|
|
69
90
|
"rimraf": "6.0.1",
|
|
91
|
+
"semantic-release": "^25.0.2",
|
|
70
92
|
"ts-jest": "29.3.1",
|
|
93
|
+
"tsx": "^4.21.0",
|
|
71
94
|
"typescript": "5.8.3"
|
|
72
95
|
},
|
|
73
|
-
"
|
|
96
|
+
"lint-staged": {
|
|
97
|
+
"*.{js,ts,tsx}": [
|
|
98
|
+
"eslint --fix",
|
|
99
|
+
"prettier --write"
|
|
100
|
+
],
|
|
101
|
+
"docs/**/*.{js,ts,tsx,mjs,astro}": [
|
|
102
|
+
"prettier --write"
|
|
103
|
+
],
|
|
104
|
+
"docs/**/*.astro": [
|
|
105
|
+
"eslint --fix"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"gitHead": "ae10f302c7e0f55196b42669040735112479a854",
|
|
109
|
+
"config": {
|
|
110
|
+
"commitizen": {
|
|
111
|
+
"path": "./node_modules/cz-conventional-changelog"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd",
|
|
115
|
+
"engines": {
|
|
116
|
+
"node": ">= 22.14.0"
|
|
117
|
+
}
|
|
74
118
|
}
|
|
@@ -5,21 +5,24 @@ export interface IHookContext {
|
|
|
5
5
|
scope: IContainer;
|
|
6
6
|
methodName?: string;
|
|
7
7
|
resolveArgs(...args: unknown[]): unknown[];
|
|
8
|
-
invokeMethod(
|
|
8
|
+
invokeMethod(options?: {
|
|
9
9
|
args?: unknown[];
|
|
10
10
|
}): unknown;
|
|
11
11
|
setProperty(fn: InjectionToken): void;
|
|
12
|
+
setInitialArgs(...args: unknown[]): this;
|
|
12
13
|
}
|
|
13
14
|
export declare class HookContext implements IHookContext {
|
|
14
|
-
instance: object;
|
|
15
15
|
scope: IContainer;
|
|
16
16
|
methodName?: string | undefined;
|
|
17
|
+
readonly instance: object;
|
|
18
|
+
private initialArgs;
|
|
17
19
|
constructor(instance: object, scope: IContainer, methodName?: string | undefined);
|
|
18
20
|
resolveArgs(...args: unknown[]): unknown[];
|
|
19
|
-
invokeMethod({ args }
|
|
21
|
+
invokeMethod({ args }?: {
|
|
20
22
|
args?: unknown[];
|
|
21
23
|
}): unknown;
|
|
22
24
|
setProperty(fn: InjectionToken): void;
|
|
25
|
+
setInitialArgs(...args: unknown[]): this;
|
|
23
26
|
}
|
|
24
27
|
export type CreateHookContext = (Target: object, scope: IContainer, methodName?: string) => IHookContext;
|
|
25
28
|
export declare const createHookContext: CreateHookContext;
|
package/typings/index.d.ts
CHANGED
|
@@ -19,13 +19,12 @@ export { DependencyMissingKeyError } from './errors/DependencyMissingKeyError';
|
|
|
19
19
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
20
20
|
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
21
21
|
export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
|
|
22
|
-
export { getHooks, hook, hasHooks, type HookFn, type HookClass } from './hooks/hook';
|
|
22
|
+
export { getHooks, hook, hasHooks, type HookFn, type HookClass, type InjectFn } from './hooks/hook';
|
|
23
23
|
export { HookContext, type IHookContext } from './hooks/HookContext';
|
|
24
24
|
export { injectProp } from './hooks/injectProp';
|
|
25
25
|
export { onConstructHooksRunner, onConstruct, AddOnConstructHookModule } from './hooks/onConstruct';
|
|
26
26
|
export { onDisposeHooksRunner, onDispose, AddOnDisposeHookModule } from './hooks/onDispose';
|
|
27
|
-
export type
|
|
28
|
-
export { HooksRunner } from './hooks/HooksRunner';
|
|
27
|
+
export { HooksRunner, type HooksRunnerContext } from './hooks/HooksRunner';
|
|
29
28
|
export { InjectionToken } from './token/InjectionToken';
|
|
30
29
|
export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken';
|
|
31
30
|
export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken';
|
|
@@ -34,14 +33,10 @@ export { SingleToken } from './token/SingleToken';
|
|
|
34
33
|
export { FunctionToken } from './token/FunctionToken';
|
|
35
34
|
export { ConstantToken } from './token/ConstantToken';
|
|
36
35
|
export { type InstancePredicate, GroupInstanceToken } from './token/GroupInstanceToken';
|
|
36
|
+
export { handleError, handleAsyncError, type HandleErrorParams } from './metadata/errorHandler';
|
|
37
|
+
export { classMeta, getClassMeta, classLabel, getClassLabels, classTag, getClassTags } from './metadata/class';
|
|
38
|
+
export { paramMeta, getParamMeta, paramLabel, getParamLabels, paramTag, getParamTags } from './metadata/parameter';
|
|
39
|
+
export { methodMeta, getMethodMeta, methodLabel, getMethodLabels, methodTag, getMethodTags } from './metadata/method';
|
|
37
40
|
export { select } from './select';
|
|
38
41
|
export { pipe, type MapFn } from './utils/fp';
|
|
39
|
-
export type
|
|
40
|
-
export { type constructor, type Instance } from './utils/basic';
|
|
41
|
-
export { Is } from './utils/basic';
|
|
42
|
-
export { getClassMetadata } from './metadata/class';
|
|
43
|
-
export { setClassMetadata } from './metadata/class';
|
|
44
|
-
export { getParameterMetadata } from './metadata/parameter';
|
|
45
|
-
export { setParameterMetadata } from './metadata/parameter';
|
|
46
|
-
export { getMethodMetadata } from './metadata/method';
|
|
47
|
-
export { setMethodMetadata } from './metadata/method';
|
|
42
|
+
export { type constructor, type Instance, Is, resolveConstructor } from './utils/basic';
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
export declare function
|
|
1
|
+
export declare const classMeta: <T>(key: string | symbol, mapFn: (prev: T | undefined) => T) => ClassDecorator;
|
|
2
|
+
export declare function getClassMeta<T>(target: object, key: string | symbol): T | undefined;
|
|
3
|
+
export declare const classLabel: (key: string, label: string) => ClassDecorator;
|
|
4
|
+
export declare const getClassLabels: (target: object) => Map<string, string>;
|
|
5
|
+
export declare const classTag: (tag: string) => ClassDecorator;
|
|
6
|
+
export declare const getClassTags: (target: object) => Set<string>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type HandleErrorParams = (error: unknown, context: {
|
|
2
|
+
target: string;
|
|
3
|
+
method: string;
|
|
4
|
+
}) => void;
|
|
5
|
+
export declare const handleAsyncError: (errorHandler: HandleErrorParams) => MethodDecorator;
|
|
6
|
+
export declare const handleError: (errorHandler: HandleErrorParams) => MethodDecorator;
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
export declare const
|
|
1
|
+
export declare const methodMeta: <T>(key: string, mapFn: (prev: T | undefined) => T) => MethodDecorator;
|
|
2
|
+
export declare const getMethodMeta: (key: string, target: object, propertyKey: string) => unknown;
|
|
3
|
+
export declare const methodLabel: (key: string, label: string) => MethodDecorator;
|
|
4
|
+
export declare const getMethodLabels: (target: object, propertyKey: string) => Map<string, string>;
|
|
5
|
+
export declare const methodTag: (tag: string) => MethodDecorator;
|
|
6
|
+
export declare const getMethodTags: (target: object, propertyKey: string) => Set<string>;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
1
|
+
export declare const paramMeta: (key: string | symbol, mapFn: (prev: unknown) => unknown) => ParameterDecorator;
|
|
2
|
+
export declare const getParamMeta: (key: string | symbol, target: object) => unknown[];
|
|
3
|
+
export declare const paramLabel: (key: string, label: string) => ParameterDecorator;
|
|
4
|
+
export declare const getParamLabels: (target: object, parameterIndex: number) => Map<string, string>;
|
|
5
|
+
export declare const paramTag: (tag: string) => ParameterDecorator;
|
|
6
|
+
export declare const getParamTags: (target: object, parameterIndex: number) => Set<string>;
|
package/typings/utils/basic.d.ts
CHANGED
package/typings/utils/proxy.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
export declare function
|
|
2
|
-
export declare function
|
|
1
|
+
export declare function isProxy(value: object): boolean;
|
|
2
|
+
export declare function getProxyTarget<T extends object>(value: T): T;
|
|
3
|
+
export declare function lazyProxy<T extends object>(resolveInstance: () => T): T;
|
|
4
|
+
export declare function toLazyIf<T extends object>(resolveInstance: () => T, isLazy?: boolean): T;
|