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 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
 
@@ -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)[0];
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 })
@@ -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
- return Reflect.hasMetadata(key, target.constructor) ? Reflect.getMetadata(key, target.constructor) : new Map();
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
- return Reflect.hasMetadata(key, target.constructor);
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.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; } });
@@ -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);
@@ -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
+ }
@@ -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
- return new Proxy({}, {
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
- instance = instance ?? resolveInstance();
27
+ const target = state.getTarget();
10
28
  // @ts-ignore
11
- return instance[prop];
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)[0];
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 })
@@ -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
- return Reflect.hasMetadata(key, target.constructor) ? Reflect.getMetadata(key, target.constructor) : new Map();
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
- return Reflect.hasMetadata(key, target.constructor);
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
- // 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';
@@ -1,6 +1,7 @@
1
1
  import { toLazyIf } from '../utils/proxy';
2
2
  export class Injector {
3
3
  resolve(scope, Target, { args, lazy } = {}) {
4
+ // @ts-ignore
4
5
  return toLazyIf(() => {
5
6
  const instance = this.createInstance(scope, Target, { args });
6
7
  scope.addInstance(instance);
@@ -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
+ }
@@ -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
- return new Proxy({}, {
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
- instance = instance ?? resolveInstance();
21
+ const target = state.getTarget();
6
22
  // @ts-ignore
7
- return instance[prop];
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.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
- "build": "pnpm run build:cjm && pnpm run build:esm && pnpm run build:types",
46
- "test": "jest --maxWorkers=2",
47
- "test:coverage": "jest --maxWorkers=2 --coverage --coverageReporters=lcov --coverageReporters=text-summary",
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
- "lint": "eslint lib/**/*.ts __tests__/**/*.ts scripts/**/*.ts",
51
- "lint:fix": "pnpm run lint -- --fix",
53
+ "commit": "cz",
52
54
  "format": "prettier --write \"**/*.ts\"",
53
- "generate:docs": "scripts/generate-readme/generate-readme.ts",
54
- "release": "pnpm run build && pnpm run test && pnpm publish"
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.1.0",
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
- "gitHead": "a69936f0186667124169b27700f2e6da7b48dc93"
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({ args }: {
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;
@@ -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;
@@ -1,2 +1,4 @@
1
- export declare function lazyProxy<T>(resolveInstance: () => T): T;
2
- export declare function toLazyIf<T>(resolveInstance: () => T, isLazy?: boolean): T;
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;