ts-ioc-container 46.9.1 → 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 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
- HookContext,
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: HookContext) => {
2649
+ const execute: HookFn = (ctx: IHookContext) => {
2650
2650
  ctx.invokeMethod({ args: ctx.resolveArgs() });
2651
2651
  };
2652
2652
 
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.setMethodMetadata = exports.getMethodMetadata = exports.setParameterMetadata = exports.getParameterMetadata = exports.setClassMetadata = exports.getClassMetadata = exports.Is = exports.pipe = exports.select = exports.GroupInstanceToken = exports.ConstantToken = void 0;
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
- // Metadata
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
- // Others
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
- var class_1 = require("./metadata/class");
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; } });
@@ -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.setParameterMetadata)(hookMetaKey(propertyKey), () => (0, toToken_1.toToken)(fn))(basic_1.Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
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.getParameterMetadata)(hookMetaKey(methodName), Target);
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);
@@ -1,12 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setClassMetadata = void 0;
4
- exports.getClassMetadata = getClassMetadata;
5
- const setClassMetadata = (key, mapFn) => (target) => {
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.setClassMetadata = setClassMetadata;
10
- function getClassMetadata(target, key) {
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;
@@ -1,10 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMethodMetadata = exports.setMethodMetadata = void 0;
4
- const setMethodMetadata = (key, mapFn) => (target, propertyKey) => {
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.setMethodMetadata = setMethodMetadata;
9
- const getMethodMetadata = (key, target, propertyKey) => Reflect.getMetadata(key, target.constructor, propertyKey);
10
- exports.getMethodMetadata = getMethodMetadata;
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.getParameterMetadata = exports.setParameterMetadata = void 0;
4
- const setParameterMetadata = (key, mapFn) => (target, _, parameterIndex) => {
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.setParameterMetadata = setParameterMetadata;
10
- const getParameterMetadata = (key, target) => {
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.getParameterMetadata = getParameterMetadata;
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.getClassMetadata)(Target, METADATA_KEY) ?? [];
11
+ const getTransformers = (Target) => (0, class_1.getClassMeta)(Target, METADATA_KEY) ?? [];
12
12
  exports.getTransformers = getTransformers;
13
- const register = (...mappers) => (0, class_1.setClassMetadata)(METADATA_KEY, (acc) => {
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
  });
@@ -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/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
- // Metadata
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
- // Others
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';
@@ -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 { getParameterMetadata, setParameterMetadata } from '../metadata/parameter';
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
- setParameterMetadata(hookMetaKey(propertyKey), () => toToken(fn))(Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
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 = getParameterMetadata(hookMetaKey(methodName), Target);
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);
@@ -1,7 +1,12 @@
1
- export const setClassMetadata = (key, mapFn) => (target) => {
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 getClassMetadata(target, key) {
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
+ };
@@ -1,5 +1,10 @@
1
- export const setMethodMetadata = (key, mapFn) => (target, propertyKey) => {
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 getMethodMetadata = (key, target, propertyKey) => Reflect.getMetadata(key, target.constructor, propertyKey);
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
- export const setParameterMetadata = (key, mapFn) => (target, _, parameterIndex) => {
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 getParameterMetadata = (key, target) => {
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 { getClassMetadata, setClassMetadata } from '../metadata/class';
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) => getClassMetadata(Target, METADATA_KEY) ?? [];
8
- export const register = (...mappers) => setClassMetadata(METADATA_KEY, (acc) => {
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
  });
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "46.9.1",
3
+ "version": "47.0.1",
4
4
  "description": "Typescript IoC container",
5
5
  "workspaces": [
6
6
  "docs"
@@ -65,11 +65,14 @@
65
65
  "devDependencies": {
66
66
  "@commitlint/cli": "^20.2.0",
67
67
  "@commitlint/config-conventional": "^20.2.0",
68
+ "@eslint/eslintrc": "^3.3.5",
69
+ "@eslint/js": "^9.24.0",
68
70
  "@semantic-release/changelog": "^6.0.3",
69
71
  "@semantic-release/git": "^10.0.1",
70
72
  "@semantic-release/github": "^12.0.2",
71
73
  "@semantic-release/npm": "^13.1.2",
72
74
  "@types/jest": "29.5.14",
75
+ "@types/node": "^25.5.2",
73
76
  "@typescript-eslint/eslint-plugin": "8.29.1",
74
77
  "@typescript-eslint/parser": "8.29.1",
75
78
  "cz-conventional-changelog": "^3.3.0",
@@ -87,6 +90,7 @@
87
90
  "rimraf": "6.0.1",
88
91
  "semantic-release": "^25.0.2",
89
92
  "ts-jest": "29.3.1",
93
+ "tsx": "^4.21.0",
90
94
  "typescript": "5.8.3"
91
95
  },
92
96
  "lint-staged": {
@@ -107,5 +111,8 @@
107
111
  "path": "./node_modules/cz-conventional-changelog"
108
112
  }
109
113
  },
110
- "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd"
114
+ "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd",
115
+ "engines": {
116
+ "node": ">= 22.14.0"
117
+ }
111
118
  }
@@ -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 { HooksRunnerContext } from './hooks/HooksRunner';
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 { InjectFn } from './hooks/hook';
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 setClassMetadata: <T>(key: string | symbol, mapFn: (prev: T | undefined) => T) => ClassDecorator;
2
- export declare function getClassMetadata<T>(target: object, key: string | symbol): T | undefined;
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 setMethodMetadata: <T>(key: string, mapFn: (prev: T | undefined) => T) => MethodDecorator;
2
- export declare const getMethodMetadata: (key: string, target: object, propertyKey: string) => unknown;
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
- import { type constructor } from '../utils/basic';
2
- export declare const setParameterMetadata: (key: string | symbol, mapFn: (prev: unknown) => unknown) => ParameterDecorator;
3
- export declare const getParameterMetadata: (key: string | symbol, target: constructor<unknown>) => unknown[];
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>;
@@ -11,3 +11,4 @@ export declare const Is: {
11
11
  instance: (target: unknown) => target is InstanceOfClass;
12
12
  constructor: (target: unknown) => target is constructor<unknown>;
13
13
  };
14
+ export declare function resolveConstructor(target: object): object;