ts-ioc-container 71.0.0 → 72.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +203 -65
  2. package/cjm/container/Container.js +5 -5
  3. package/cjm/hooks/HookContext.js +3 -2
  4. package/cjm/hooks/injectProp.js +2 -4
  5. package/cjm/index.js +7 -4
  6. package/cjm/injector/IInjector.js +2 -2
  7. package/cjm/injector/MetadataInjector.js +14 -9
  8. package/cjm/injector/ProxyInjector.js +1 -1
  9. package/cjm/injector/SimpleInjector.js +2 -2
  10. package/cjm/metadata/class.js +3 -1
  11. package/cjm/metadata/method.js +3 -1
  12. package/cjm/metadata/parameter.js +7 -1
  13. package/cjm/provider/Provider.js +9 -8
  14. package/cjm/registration/IRegistration.js +2 -2
  15. package/cjm/select.js +2 -2
  16. package/cjm/token/ClassToken.js +3 -3
  17. package/cjm/token/FunctionToken.js +5 -4
  18. package/cjm/token/GroupAliasToken.js +3 -3
  19. package/cjm/token/InjectionToken.js +1 -1
  20. package/cjm/token/SingleAliasToken.js +3 -3
  21. package/cjm/token/SingleToken.js +3 -3
  22. package/cjm/token/toToken.js +1 -8
  23. package/esm/container/Container.js +5 -5
  24. package/esm/hooks/HookContext.js +3 -2
  25. package/esm/hooks/injectProp.js +1 -4
  26. package/esm/index.js +5 -5
  27. package/esm/injector/IInjector.js +2 -2
  28. package/esm/injector/MetadataInjector.js +13 -9
  29. package/esm/injector/ProxyInjector.js +1 -1
  30. package/esm/injector/SimpleInjector.js +2 -2
  31. package/esm/metadata/class.js +1 -0
  32. package/esm/metadata/method.js +1 -0
  33. package/esm/metadata/parameter.js +5 -0
  34. package/esm/provider/Provider.js +9 -8
  35. package/esm/registration/IRegistration.js +2 -2
  36. package/esm/select.js +2 -2
  37. package/esm/token/ClassToken.js +3 -3
  38. package/esm/token/FunctionToken.js +5 -4
  39. package/esm/token/GroupAliasToken.js +3 -3
  40. package/esm/token/InjectionToken.js +1 -1
  41. package/esm/token/SingleAliasToken.js +3 -3
  42. package/esm/token/SingleToken.js +3 -3
  43. package/esm/token/toToken.js +0 -6
  44. package/package.json +1 -1
  45. package/typings/container/IContainer.d.ts +2 -2
  46. package/typings/hooks/HookContext.d.ts +3 -3
  47. package/typings/hooks/hook.d.ts +1 -2
  48. package/typings/hooks/injectProp.d.ts +2 -14
  49. package/typings/index.d.ts +7 -7
  50. package/typings/injector/IInjector.d.ts +7 -4
  51. package/typings/injector/MetadataInjector.d.ts +6 -16
  52. package/typings/injector/ProxyInjector.d.ts +1 -2
  53. package/typings/injector/SimpleInjector.d.ts +1 -2
  54. package/typings/metadata/class.d.ts +1 -0
  55. package/typings/metadata/method.d.ts +1 -0
  56. package/typings/metadata/parameter.d.ts +1 -0
  57. package/typings/provider/IProvider.d.ts +5 -4
  58. package/typings/provider/Provider.d.ts +2 -2
  59. package/typings/select.d.ts +3 -3
  60. package/typings/token/ClassToken.d.ts +2 -2
  61. package/typings/token/FunctionToken.d.ts +2 -2
  62. package/typings/token/GroupAliasToken.d.ts +2 -2
  63. package/typings/token/InjectionToken.d.ts +2 -2
  64. package/typings/token/SingleAliasToken.d.ts +3 -3
  65. package/typings/token/SingleToken.d.ts +2 -2
  66. package/typings/token/toToken.d.ts +0 -2
@@ -41,11 +41,11 @@ class Container {
41
41
  resolve(target, { args = [], child = this, lazy } = {}) {
42
42
  this.validateContainer();
43
43
  if (basic_1.Is.constructor(target)) {
44
- return this.injector.resolve(this, target, { args, lazy });
44
+ return this.injector.resolve(target, { scope: this, args, lazy });
45
45
  }
46
46
  const provider = this.providers.get(target);
47
47
  return provider?.hasAccess({ invocationScope: child, providerScope: this, args })
48
- ? provider.resolve(this, { args, lazy })
48
+ ? provider.resolve({ scope: this, args, lazy })
49
49
  : this.parent.resolve(target, { args, child, lazy });
50
50
  }
51
51
  resolveByAlias(alias, { args = [], child = this, lazy, excludedKeys = [] } = {}) {
@@ -58,7 +58,7 @@ class Container {
58
58
  continue;
59
59
  }
60
60
  keys.push(key);
61
- deps.push(provider.resolve(this, { args, lazy }));
61
+ deps.push(provider.resolve({ scope: this, args, lazy }));
62
62
  }
63
63
  const parentDeps = this.parent.resolveByAlias(alias, {
64
64
  args,
@@ -73,7 +73,7 @@ class Container {
73
73
  const [key] = this.aliases.getKeysByAlias(alias);
74
74
  const provider = key ? this.findProviderByKeyOrFail(key) : undefined;
75
75
  return provider?.hasAccess({ invocationScope: child, providerScope: this, args })
76
- ? provider.resolve(this, { args, lazy })
76
+ ? provider.resolve({ scope: this, args, lazy })
77
77
  : this.parent.resolveOneByAlias(alias, { args, child, lazy });
78
78
  }
79
79
  createScope({ tags } = {}) {
@@ -93,7 +93,7 @@ class Container {
93
93
  this.validateContainer();
94
94
  for (const provider of this.providers.values()) {
95
95
  if (provider.isAutoResolvable() && provider.hasAccess({ invocationScope: this, providerScope: this, args })) {
96
- provider.resolve(this, { args });
96
+ provider.resolve({ scope: this, args });
97
97
  }
98
98
  }
99
99
  return this;
@@ -13,7 +13,8 @@ class HookContext {
13
13
  this.methodName = methodName;
14
14
  }
15
15
  resolveArgs(...args) {
16
- return (0, MetadataInjector_1.resolveArgs)(this.instance, this.methodName)(this.scope, {
16
+ return (0, MetadataInjector_1.resolveArgs)(this.instance, this.methodName)({
17
+ scope: this.scope,
17
18
  args: [...this.initialArgs, ...args],
18
19
  });
19
20
  }
@@ -21,7 +22,7 @@ class HookContext {
21
22
  return this.instance[this.methodName](...args);
22
23
  }
23
24
  setProperty(fn) {
24
- this.instance[this.methodName] = fn.resolve(this.scope);
25
+ this.instance[this.methodName] = fn({ scope: this.scope });
25
26
  }
26
27
  getProperty() {
27
28
  return this.instance[this.methodName];
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectProp = void 0;
4
+ const injectProp = (fn) => (context) => context.setProperty(fn);
3
5
  exports.injectProp = injectProp;
4
- const toToken_1 = require("../token/toToken");
5
- function injectProp(fn, ...mappers) {
6
- return (context) => context.setProperty((0, toToken_1.toMappedToken)(fn, mappers));
7
- }
package/cjm/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.injectProp = exports.createHookExecutionContext = exports.createHookContextFactory = exports.HookContext = exports.toHookFn = exports.hasHooks = exports.hook = exports.getHooks = exports.ArgumentNotFoundError = exports.TypedEventDisposedError = exports.UnsupportedTokenTypeError = exports.CannonSingletonApplyTwiceError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.ContainerNotFoundError = exports.DependencyNotFoundError = exports.ContainerError = exports.Registration = exports.onResolve = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.autoResolve = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.toRegistrationFn = exports.toProviderFn = exports.toBindToken = exports.registerPipe = exports.isProviderPipe = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.argsFn = exports.args = exports.arg = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.AutoResolveModule = exports.Container = exports.isDependencyKey = void 0;
4
- exports.TypedEvent = exports.getConstructorChain = exports.memoize = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.runAtOnce = exports.runInOrder = exports.handleAsyncError = exports.handleError = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.resolveConstructor = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.toMappedToken = exports.toToken = exports.forwardArgs = exports.isInjectionToken = exports.InjectionToken = exports.toTask = exports.HookCollector = exports.oncePerInstance = exports.parallel = exports.sequential = void 0;
5
- exports.isSerializable = exports.Is = exports.unwrapProxy = exports.ProxyRegistry = exports.findOrFail = exports.pipe = exports.select = void 0;
3
+ exports.createHookExecutionContext = exports.createHookContextFactory = exports.HookContext = exports.toHookFn = exports.hasHooks = exports.hook = exports.getHooks = exports.ArgumentNotFoundError = exports.TypedEventDisposedError = exports.UnsupportedTokenTypeError = exports.CannonSingletonApplyTwiceError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.ContainerNotFoundError = exports.DependencyNotFoundError = exports.ContainerError = exports.Registration = exports.onResolve = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.autoResolve = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.toRegistrationFn = exports.toProviderFn = exports.toBindToken = exports.registerPipe = exports.isProviderPipe = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.by = exports.argsFn = exports.args = exports.arg = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.AutoResolveModule = exports.Container = exports.isDependencyKey = void 0;
4
+ exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.runAtOnce = exports.runInOrder = exports.handleAsyncError = exports.handleError = exports.createComposeMethodDecorator = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = exports.createComposeParameterDecorator = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = exports.createComposeClassDecorator = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.getClassMeta = exports.addClassMeta = exports.resolveConstructor = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.argToToken = exports.toToken = exports.forwardArgs = exports.isInjectionToken = exports.InjectionToken = exports.toTask = exports.HookCollector = exports.oncePerInstance = exports.parallel = exports.sequential = exports.injectProp = void 0;
5
+ exports.isSerializable = exports.Is = exports.unwrapProxy = exports.ProxyRegistry = exports.findOrFail = exports.pipe = exports.select = exports.TypedEvent = exports.getConstructorChain = exports.memoize = void 0;
6
6
  var IContainer_1 = require("./container/IContainer");
7
7
  Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
8
8
  var Container_1 = require("./container/Container");
@@ -19,6 +19,7 @@ Object.defineProperty(exports, "inject", { enumerable: true, get: function () {
19
19
  Object.defineProperty(exports, "arg", { enumerable: true, get: function () { return MetadataInjector_1.arg; } });
20
20
  Object.defineProperty(exports, "args", { enumerable: true, get: function () { return MetadataInjector_1.args; } });
21
21
  Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return MetadataInjector_1.argsFn; } });
22
+ Object.defineProperty(exports, "by", { enumerable: true, get: function () { return MetadataInjector_1.by; } });
22
23
  Object.defineProperty(exports, "resolveArgs", { enumerable: true, get: function () { return MetadataInjector_1.resolveArgs; } });
23
24
  var SimpleInjector_1 = require("./injector/SimpleInjector");
24
25
  Object.defineProperty(exports, "SimpleInjector", { enumerable: true, get: function () { return SimpleInjector_1.SimpleInjector; } });
@@ -91,7 +92,6 @@ Object.defineProperty(exports, "isInjectionToken", { enumerable: true, get: func
91
92
  Object.defineProperty(exports, "forwardArgs", { enumerable: true, get: function () { return InjectionToken_1.forwardArgs; } });
92
93
  var toToken_1 = require("./token/toToken");
93
94
  Object.defineProperty(exports, "toToken", { enumerable: true, get: function () { return toToken_1.toToken; } });
94
- Object.defineProperty(exports, "toMappedToken", { enumerable: true, get: function () { return toToken_1.toMappedToken; } });
95
95
  Object.defineProperty(exports, "argToToken", { enumerable: true, get: function () { return toToken_1.argToToken; } });
96
96
  var GroupAliasToken_1 = require("./token/GroupAliasToken");
97
97
  Object.defineProperty(exports, "GroupAliasToken", { enumerable: true, get: function () { return GroupAliasToken_1.GroupAliasToken; } });
@@ -118,6 +118,7 @@ Object.defineProperty(exports, "addClassLabel", { enumerable: true, get: functio
118
118
  Object.defineProperty(exports, "getClassLabels", { enumerable: true, get: function () { return class_1.getClassLabels; } });
119
119
  Object.defineProperty(exports, "addClassTag", { enumerable: true, get: function () { return class_1.addClassTag; } });
120
120
  Object.defineProperty(exports, "getClassTags", { enumerable: true, get: function () { return class_1.getClassTags; } });
121
+ Object.defineProperty(exports, "createComposeClassDecorator", { enumerable: true, get: function () { return class_1.createComposeClassDecorator; } });
121
122
  var parameter_1 = require("./metadata/parameter");
122
123
  Object.defineProperty(exports, "addParamMeta", { enumerable: true, get: function () { return parameter_1.addParamMeta; } });
123
124
  Object.defineProperty(exports, "getParamMeta", { enumerable: true, get: function () { return parameter_1.getParamMeta; } });
@@ -125,6 +126,7 @@ Object.defineProperty(exports, "addParamLabel", { enumerable: true, get: functio
125
126
  Object.defineProperty(exports, "getParamLabels", { enumerable: true, get: function () { return parameter_1.getParamLabels; } });
126
127
  Object.defineProperty(exports, "addParamTag", { enumerable: true, get: function () { return parameter_1.addParamTag; } });
127
128
  Object.defineProperty(exports, "getParamTags", { enumerable: true, get: function () { return parameter_1.getParamTags; } });
129
+ Object.defineProperty(exports, "createComposeParameterDecorator", { enumerable: true, get: function () { return parameter_1.createComposeParameterDecorator; } });
128
130
  var method_1 = require("./metadata/method");
129
131
  Object.defineProperty(exports, "addMethodMeta", { enumerable: true, get: function () { return method_1.addMethodMeta; } });
130
132
  Object.defineProperty(exports, "getMethodMeta", { enumerable: true, get: function () { return method_1.getMethodMeta; } });
@@ -132,6 +134,7 @@ Object.defineProperty(exports, "addMethodLabel", { enumerable: true, get: functi
132
134
  Object.defineProperty(exports, "getMethodLabels", { enumerable: true, get: function () { return method_1.getMethodLabels; } });
133
135
  Object.defineProperty(exports, "addMethodTag", { enumerable: true, get: function () { return method_1.addMethodTag; } });
134
136
  Object.defineProperty(exports, "getMethodTags", { enumerable: true, get: function () { return method_1.getMethodTags; } });
137
+ Object.defineProperty(exports, "createComposeMethodDecorator", { enumerable: true, get: function () { return method_1.createComposeMethodDecorator; } });
135
138
  var errorHandler_1 = require("./utils/errorHandler");
136
139
  Object.defineProperty(exports, "handleError", { enumerable: true, get: function () { return errorHandler_1.handleError; } });
137
140
  Object.defineProperty(exports, "handleAsyncError", { enumerable: true, get: function () { return errorHandler_1.handleAsyncError; } });
@@ -8,9 +8,9 @@ class Injector {
8
8
  constructor(proxyRegistry = ProxyRegistry_1.ProxyRegistry.getInstance()) {
9
9
  this.proxyRegistry = proxyRegistry;
10
10
  }
11
- resolve(scope, Target, { args, lazy } = {}) {
11
+ resolve(Target, { scope, args, lazy }) {
12
12
  return this.proxyRegistry.toLazyIf(() => {
13
- const instance = this.createInstance(scope, Target, { args });
13
+ const instance = this.createInstance(Target, { scope, args });
14
14
  scope.addInstance(instance);
15
15
  for (const onConstructed of this.onConstructedHookList) {
16
16
  onConstructed(instance, scope);
@@ -1,32 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveArgs = exports.args = exports.arg = exports.argsFn = exports.MetadataInjector = void 0;
3
+ exports.resolveArgs = exports.args = exports.arg = exports.argsFn = exports.by = exports.MetadataInjector = void 0;
4
4
  exports.inject = inject;
5
5
  const IInjector_1 = require("./IInjector");
6
6
  const target_1 = require("../metadata/target");
7
7
  const parameter_1 = require("../metadata/parameter");
8
8
  const toToken_1 = require("../token/toToken");
9
9
  class MetadataInjector extends IInjector_1.Injector {
10
- createInstance(scope, Target, { args: deps = [] } = {}) {
11
- const args = (0, exports.resolveArgs)(Target)(scope, { args: deps });
10
+ createInstance(Target, { scope, args: deps = [] }) {
11
+ const args = (0, exports.resolveArgs)(Target)({ scope, args: deps });
12
12
  return new Target(...args);
13
13
  }
14
14
  }
15
15
  exports.MetadataInjector = MetadataInjector;
16
16
  const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
17
- function inject(fn, ...mappers) {
17
+ function inject(fn) {
18
18
  return (target, propertyKey, parameterIndex) => {
19
- (0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), () => (0, toToken_1.toMappedToken)(fn, mappers))((0, target_1.resolveConstructor)(target), propertyKey, parameterIndex);
19
+ (0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), () => fn)((0, target_1.resolveConstructor)(target), propertyKey, parameterIndex);
20
20
  };
21
21
  }
22
- const argsFn = (predicate) => (c, { args = [] }) => args.find((value, index) => predicate(value, index));
22
+ const by = (target) => {
23
+ const token = (0, toToken_1.toToken)(target);
24
+ return ({ scope, ...options }) => token.resolve(scope, options);
25
+ };
26
+ exports.by = by;
27
+ const argsFn = (predicate) => ({ args = [] }) => args.find((value, index) => predicate(value, index));
23
28
  exports.argsFn = argsFn;
24
29
  const arg = (index) => (0, exports.argsFn)((value, i) => i === index);
25
30
  exports.arg = arg;
26
- const args = (c, { args = [] }) => args;
31
+ const args = ({ args = [] }) => args;
27
32
  exports.args = args;
28
33
  const resolveArgs = (target, methodName) => {
29
- const tokens = (0, parameter_1.getParamMeta)(hookMetaKey(methodName), target);
30
- return (scope, { args = [], lazy }) => tokens.map((fn) => fn.resolve(scope, { args, lazy }));
34
+ const fns = (0, parameter_1.getParamMeta)(hookMetaKey(methodName), target);
35
+ return (options) => fns.map((fn) => fn(options));
31
36
  };
32
37
  exports.resolveArgs = resolveArgs;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ProxyInjector = void 0;
4
4
  const IInjector_1 = require("./IInjector");
5
5
  class ProxyInjector extends IInjector_1.Injector {
6
- createInstance(scope, Target, { args = [] } = {}) {
6
+ createInstance(Target, { scope, args = [] }) {
7
7
  const proxy = new Proxy({}, {
8
8
  get(target, prop) {
9
9
  if (prop === 'args') {
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SimpleInjector = void 0;
4
4
  const IInjector_1 = require("./IInjector");
5
5
  class SimpleInjector extends IInjector_1.Injector {
6
- createInstance(container, Target, { args = [] } = {}) {
7
- return new Target(container, ...args);
6
+ createInstance(Target, { scope, args = [] }) {
7
+ return new Target(scope, ...args);
8
8
  }
9
9
  }
10
10
  exports.SimpleInjector = SimpleInjector;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.addClassMeta = void 0;
3
+ exports.createComposeClassDecorator = exports.getClassTags = exports.addClassTag = exports.getClassLabels = exports.addClassLabel = exports.addClassMeta = void 0;
4
4
  exports.getClassMeta = getClassMeta;
5
5
  const target_1 = require("./target");
6
6
  const addClassMeta = (key, mapFn) => (target) => {
@@ -19,3 +19,5 @@ const addClassTag = (tag) => (0, exports.addClassMeta)('tag', (prev = new Set())
19
19
  exports.addClassTag = addClassTag;
20
20
  const getClassTags = (target) => getClassMeta(target, 'tag') ?? new Set();
21
21
  exports.getClassTags = getClassTags;
22
+ const createComposeClassDecorator = (...decorators) => (target) => decorators.reduceRight((acc, decorate) => decorate(acc) ?? acc, target);
23
+ exports.createComposeClassDecorator = createComposeClassDecorator;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = void 0;
3
+ exports.createComposeMethodDecorator = exports.getMethodTags = exports.addMethodTag = exports.getMethodLabels = exports.addMethodLabel = exports.getMethodMeta = exports.addMethodMeta = void 0;
4
4
  const target_1 = require("./target");
5
5
  const addMethodMeta = (key, mapFn) => (target, propertyKey) => {
6
6
  const metadata = Reflect.getMetadata(key, target.constructor, propertyKey);
@@ -17,3 +17,5 @@ const addMethodTag = (tag) => (0, exports.addMethodMeta)('tag', (prev = new Set(
17
17
  exports.addMethodTag = addMethodTag;
18
18
  const getMethodTags = (target, propertyKey) => (0, exports.getMethodMeta)('tag', target, propertyKey) ?? new Set();
19
19
  exports.getMethodTags = getMethodTags;
20
+ const createComposeMethodDecorator = (...decorators) => (target, propertyKey, descriptor) => decorators.reduceRight((acc, decorate) => decorate(target, propertyKey, acc) ?? acc, descriptor);
21
+ exports.createComposeMethodDecorator = createComposeMethodDecorator;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = void 0;
3
+ exports.createComposeParameterDecorator = exports.getParamTags = exports.addParamTag = exports.getParamLabels = exports.addParamLabel = exports.getParamMeta = exports.addParamMeta = void 0;
4
4
  const target_1 = require("./target");
5
5
  const addParamMeta = (key, mapFn) => (target, _, parameterIndex) => {
6
6
  const metadata = Reflect.getOwnMetadata(key, target) ?? [];
@@ -32,3 +32,9 @@ const getParamTags = (target, parameterIndex) => {
32
32
  return all[parameterIndex] ?? new Set();
33
33
  };
34
34
  exports.getParamTags = getParamTags;
35
+ const createComposeParameterDecorator = (...decorators) => (target, propertyKey, parameterIndex) => {
36
+ for (let i = decorators.length - 1; i >= 0; i--) {
37
+ decorators[i](target, propertyKey, parameterIndex);
38
+ }
39
+ };
40
+ exports.createComposeParameterDecorator = createComposeParameterDecorator;
@@ -7,13 +7,13 @@ const ProviderDisposedError_1 = require("../errors/ProviderDisposedError");
7
7
  class Provider {
8
8
  resolveDependency;
9
9
  static fromClass(Target) {
10
- return new Provider((container, options) => container.resolve(Target, options));
10
+ return new Provider(({ scope, ...options }) => scope.resolve(Target, options));
11
11
  }
12
12
  static fromValue(value) {
13
13
  return new Provider(() => value);
14
14
  }
15
15
  static fromKey(key) {
16
- return new Provider((c) => c.resolve(key));
16
+ return new Provider(({ scope }) => scope.resolve(key));
17
17
  }
18
18
  argsFnList = [];
19
19
  accessRules = [];
@@ -27,20 +27,21 @@ class Provider {
27
27
  constructor(resolveDependency) {
28
28
  this.resolveDependency = resolveDependency;
29
29
  }
30
- resolve(scope, options) {
30
+ resolve(options) {
31
31
  ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
32
32
  if (!this.getKey) {
33
- return this.resolveDep(scope, options);
33
+ return this.resolveDep(options);
34
34
  }
35
35
  const key = (0, basic_1.toString)(this.getKey(options.args ?? []));
36
36
  if (!this.cache.has(key)) {
37
- this.cache.set(key, this.resolveDep(scope, options));
37
+ this.cache.set(key, this.resolveDep(options));
38
38
  }
39
39
  return this.cache.get(key);
40
40
  }
41
- resolveDep(scope, { args = [], lazy } = {}) {
42
- let dependency = this.resolveDependency(scope, {
43
- args: this.argsFnList.reduce((acc, current) => current(scope, { args: acc }), args),
41
+ resolveDep({ scope, args = [], lazy }) {
42
+ let dependency = this.resolveDependency({
43
+ scope,
44
+ args: this.argsFnList.reduce((acc, current) => current({ scope, args: acc }), args),
44
45
  lazy: lazy ?? this.isLazy,
45
46
  });
46
47
  dependency = this.mappers.reduce((acc, current) => current(acc, scope), dependency);
@@ -40,9 +40,9 @@ const bindTo = (...tokens) => (r) => {
40
40
  exports.bindTo = bindTo;
41
41
  const scope = (...rules) => (r) => r.when(...rules);
42
42
  exports.scope = scope;
43
- const appendArgs = (...extraArgs) => (0, exports.registerPipe)((p) => p.addArgsFn((_, { args = [] } = {}) => [...args, ...extraArgs]));
43
+ const appendArgs = (...extraArgs) => (0, exports.registerPipe)((p) => p.addArgsFn(({ args = [] }) => [...args, ...extraArgs]));
44
44
  exports.appendArgs = appendArgs;
45
- const appendArgsFn = (fn) => (0, exports.registerPipe)((p) => p.addArgsFn((scope, options) => [...(options?.args ?? []), ...fn(scope, options)]));
45
+ const appendArgsFn = (fn) => (0, exports.registerPipe)((p) => p.addArgsFn((options) => [...(options.args ?? []), ...fn(options)]));
46
46
  exports.appendArgsFn = appendArgsFn;
47
47
  const scopeAccess = (rule) => (0, exports.registerPipe)((p) => p.addAccessRule(rule));
48
48
  exports.scopeAccess = scopeAccess;
package/cjm/select.js CHANGED
@@ -10,7 +10,7 @@ exports.select = {
10
10
  token: toToken_1.toToken,
11
11
  instances: (predicate = () => true) => new GroupInstanceToken_1.GroupInstanceToken(predicate),
12
12
  scope: {
13
- current: new FunctionToken_1.FunctionToken((s) => s),
14
- create: (options) => new FunctionToken_1.FunctionToken((s) => s.createScope(options)),
13
+ current: new FunctionToken_1.FunctionToken(({ scope }) => scope),
14
+ create: (options) => new FunctionToken_1.FunctionToken(({ scope }) => scope.createScope(options)),
15
15
  },
16
16
  };
@@ -17,14 +17,14 @@ class ClassToken extends InjectionToken_1.InjectionToken {
17
17
  }
18
18
  resolve(s, { args = [], lazy } = {}) {
19
19
  return s.resolve(this.target, {
20
- args: this._getArgsFn(s, { args }),
20
+ args: this._getArgsFn({ scope: s, args }),
21
21
  lazy: this._isLazy || lazy,
22
22
  });
23
23
  }
24
24
  args(...newArgs) {
25
25
  const parentFn = this._getArgsFn;
26
26
  return new ClassToken(this.target, {
27
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...newArgs],
27
+ getArgsFn: (options) => [...parentFn(options), ...newArgs],
28
28
  isLazy: this._isLazy,
29
29
  tags: this.getTags(),
30
30
  });
@@ -32,7 +32,7 @@ class ClassToken extends InjectionToken_1.InjectionToken {
32
32
  argsFn(fn) {
33
33
  const parentFn = this._getArgsFn;
34
34
  return new ClassToken(this.target, {
35
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...fn(s)],
35
+ getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
36
36
  isLazy: this._isLazy,
37
37
  tags: this.getTags(),
38
38
  });
@@ -14,15 +14,16 @@ class FunctionToken extends InjectionToken_1.InjectionToken {
14
14
  this._isLazy = isLazy;
15
15
  }
16
16
  resolve(s, { args = [], lazy } = {}) {
17
- return this.fn(s, {
18
- args: this._getArgsFn(s, { args }),
17
+ return this.fn({
18
+ scope: s,
19
+ args: this._getArgsFn({ scope: s, args }),
19
20
  lazy: this._isLazy || lazy,
20
21
  });
21
22
  }
22
23
  args(...newArgs) {
23
24
  const parentFn = this._getArgsFn;
24
25
  return new FunctionToken(this.fn, {
25
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...newArgs],
26
+ getArgsFn: (options) => [...parentFn(options), ...newArgs],
26
27
  isLazy: this._isLazy,
27
28
  tags: this.getTags(),
28
29
  });
@@ -30,7 +31,7 @@ class FunctionToken extends InjectionToken_1.InjectionToken {
30
31
  argsFn(fn) {
31
32
  const parentFn = this._getArgsFn;
32
33
  return new FunctionToken(this.fn, {
33
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...fn(s)],
34
+ getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
34
35
  isLazy: this._isLazy,
35
36
  tags: this.getTags(),
36
37
  });
@@ -17,7 +17,7 @@ class GroupAliasToken extends InjectionToken_1.InjectionToken {
17
17
  }
18
18
  resolve(s, { args = [], lazy } = {}) {
19
19
  return s.resolveByAlias(this.token, {
20
- args: this._getArgsFn(s, { args }),
20
+ args: this._getArgsFn({ scope: s, args }),
21
21
  lazy: this._isLazy || lazy,
22
22
  });
23
23
  }
@@ -27,7 +27,7 @@ class GroupAliasToken extends InjectionToken_1.InjectionToken {
27
27
  args(...newArgs) {
28
28
  const parentFn = this._getArgsFn;
29
29
  return new GroupAliasToken(this.token, {
30
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...newArgs],
30
+ getArgsFn: (options) => [...parentFn(options), ...newArgs],
31
31
  isLazy: this._isLazy,
32
32
  tags: this.getTags(),
33
33
  });
@@ -35,7 +35,7 @@ class GroupAliasToken extends InjectionToken_1.InjectionToken {
35
35
  argsFn(fn) {
36
36
  const parentFn = this._getArgsFn;
37
37
  return new GroupAliasToken(this.token, {
38
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...fn(s)],
38
+ getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
39
39
  isLazy: this._isLazy,
40
40
  tags: this.getTags(),
41
41
  });
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InjectionToken = exports.forwardArgs = void 0;
4
4
  exports.isInjectionToken = isInjectionToken;
5
5
  const basic_1 = require("../utils/basic");
6
- const forwardArgs = (_, { args = [] } = {}) => args;
6
+ const forwardArgs = ({ args = [] }) => args;
7
7
  exports.forwardArgs = forwardArgs;
8
8
  class InjectionToken {
9
9
  tags;
@@ -17,7 +17,7 @@ class SingleAliasToken extends InjectionToken_1.InjectionToken {
17
17
  }
18
18
  resolve(s, { args = [], lazy } = {}) {
19
19
  return s.resolveOneByAlias(this.token, {
20
- args: this._getArgsFn(s, { args }),
20
+ args: this._getArgsFn({ scope: s, args }),
21
21
  lazy: this._isLazy || lazy,
22
22
  });
23
23
  }
@@ -27,7 +27,7 @@ class SingleAliasToken extends InjectionToken_1.InjectionToken {
27
27
  args(...newArgs) {
28
28
  const parentFn = this._getArgsFn;
29
29
  return new SingleAliasToken(this.token, {
30
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...newArgs],
30
+ getArgsFn: (options) => [...parentFn(options), ...newArgs],
31
31
  isLazy: this._isLazy,
32
32
  tags: this.getTags(),
33
33
  });
@@ -35,7 +35,7 @@ class SingleAliasToken extends InjectionToken_1.InjectionToken {
35
35
  argsFn(fn) {
36
36
  const parentFn = this._getArgsFn;
37
37
  return new SingleAliasToken(this.token, {
38
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...fn(s)],
38
+ getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
39
39
  isLazy: this._isLazy,
40
40
  tags: this.getTags(),
41
41
  });
@@ -17,7 +17,7 @@ class SingleToken extends InjectionToken_1.InjectionToken {
17
17
  }
18
18
  resolve(s, { args = [], lazy } = {}) {
19
19
  return s.resolve(this.token, {
20
- args: this._getArgsFn(s, { args }),
20
+ args: this._getArgsFn({ scope: s, args }),
21
21
  lazy: this._isLazy || lazy,
22
22
  });
23
23
  }
@@ -27,7 +27,7 @@ class SingleToken extends InjectionToken_1.InjectionToken {
27
27
  args(...newArgs) {
28
28
  const parentFn = this._getArgsFn;
29
29
  return new SingleToken(this.token, {
30
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...newArgs],
30
+ getArgsFn: (options) => [...parentFn(options), ...newArgs],
31
31
  isLazy: this._isLazy,
32
32
  tags: this.getTags(),
33
33
  });
@@ -35,7 +35,7 @@ class SingleToken extends InjectionToken_1.InjectionToken {
35
35
  argsFn(fn) {
36
36
  const parentFn = this._getArgsFn;
37
37
  return new SingleToken(this.token, {
38
- getArgsFn: (s, opts) => [...parentFn(s, opts), ...fn(s)],
38
+ getArgsFn: (options) => [...parentFn(options), ...fn(options.scope)],
39
39
  isLazy: this._isLazy,
40
40
  tags: this.getTags(),
41
41
  });
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toMappedToken = exports.argToToken = exports.toToken = void 0;
3
+ exports.argToToken = exports.toToken = void 0;
4
4
  const IContainer_1 = require("../container/IContainer");
5
5
  const SingleToken_1 = require("./SingleToken");
6
6
  const ClassToken_1 = require("./ClassToken");
@@ -9,7 +9,6 @@ const UnsupportedTokenTypeError_1 = require("../errors/UnsupportedTokenTypeError
9
9
  const InjectionToken_1 = require("./InjectionToken");
10
10
  const basic_1 = require("../utils/basic");
11
11
  const ConstantToken_1 = require("./ConstantToken");
12
- const fp_1 = require("../utils/fp");
13
12
  const toToken = (token) => {
14
13
  if (token instanceof InjectionToken_1.InjectionToken) {
15
14
  return token;
@@ -28,9 +27,3 @@ const toToken = (token) => {
28
27
  exports.toToken = toToken;
29
28
  const argToToken = (v) => ((0, InjectionToken_1.isInjectionToken)(v) ? v : new ConstantToken_1.ConstantToken(v));
30
29
  exports.argToToken = argToToken;
31
- const toMappedToken = (token, mappers) => {
32
- const source = (0, exports.toToken)(token);
33
- const mapInstance = (0, fp_1.pipe)(...mappers);
34
- return new FunctionToken_1.FunctionToken((scope, options) => mapInstance(source.resolve(scope, options)));
35
- };
36
- exports.toMappedToken = toMappedToken;
@@ -38,11 +38,11 @@ export class Container {
38
38
  resolve(target, { args = [], child = this, lazy } = {}) {
39
39
  this.validateContainer();
40
40
  if (Is.constructor(target)) {
41
- return this.injector.resolve(this, target, { args, lazy });
41
+ return this.injector.resolve(target, { scope: this, args, lazy });
42
42
  }
43
43
  const provider = this.providers.get(target);
44
44
  return provider?.hasAccess({ invocationScope: child, providerScope: this, args })
45
- ? provider.resolve(this, { args, lazy })
45
+ ? provider.resolve({ scope: this, args, lazy })
46
46
  : this.parent.resolve(target, { args, child, lazy });
47
47
  }
48
48
  resolveByAlias(alias, { args = [], child = this, lazy, excludedKeys = [] } = {}) {
@@ -55,7 +55,7 @@ export class Container {
55
55
  continue;
56
56
  }
57
57
  keys.push(key);
58
- deps.push(provider.resolve(this, { args, lazy }));
58
+ deps.push(provider.resolve({ scope: this, args, lazy }));
59
59
  }
60
60
  const parentDeps = this.parent.resolveByAlias(alias, {
61
61
  args,
@@ -70,7 +70,7 @@ export class Container {
70
70
  const [key] = this.aliases.getKeysByAlias(alias);
71
71
  const provider = key ? this.findProviderByKeyOrFail(key) : undefined;
72
72
  return provider?.hasAccess({ invocationScope: child, providerScope: this, args })
73
- ? provider.resolve(this, { args, lazy })
73
+ ? provider.resolve({ scope: this, args, lazy })
74
74
  : this.parent.resolveOneByAlias(alias, { args, child, lazy });
75
75
  }
76
76
  createScope({ tags } = {}) {
@@ -90,7 +90,7 @@ export class Container {
90
90
  this.validateContainer();
91
91
  for (const provider of this.providers.values()) {
92
92
  if (provider.isAutoResolvable() && provider.hasAccess({ invocationScope: this, providerScope: this, args })) {
93
- provider.resolve(this, { args });
93
+ provider.resolve({ scope: this, args });
94
94
  }
95
95
  }
96
96
  return this;
@@ -10,7 +10,8 @@ export class HookContext {
10
10
  this.methodName = methodName;
11
11
  }
12
12
  resolveArgs(...args) {
13
- return resolveArgs(this.instance, this.methodName)(this.scope, {
13
+ return resolveArgs(this.instance, this.methodName)({
14
+ scope: this.scope,
14
15
  args: [...this.initialArgs, ...args],
15
16
  });
16
17
  }
@@ -18,7 +19,7 @@ export class HookContext {
18
19
  return this.instance[this.methodName](...args);
19
20
  }
20
21
  setProperty(fn) {
21
- this.instance[this.methodName] = fn.resolve(this.scope);
22
+ this.instance[this.methodName] = fn({ scope: this.scope });
22
23
  }
23
24
  getProperty() {
24
25
  return this.instance[this.methodName];
@@ -1,4 +1 @@
1
- import { toMappedToken } from '../token/toToken.js';
2
- export function injectProp(fn, ...mappers) {
3
- return (context) => context.setProperty(toMappedToken(fn, mappers));
4
- }
1
+ export const injectProp = (fn) => (context) => context.setProperty(fn);
package/esm/index.js CHANGED
@@ -3,7 +3,7 @@ export { Container } from './container/Container.js';
3
3
  export { AutoResolveModule } from './container/AutoResolveModule.js';
4
4
  export { EmptyContainer } from './container/EmptyContainer.js';
5
5
  export { Injector, } from './injector/IInjector.js';
6
- export { MetadataInjector, inject, arg, args, argsFn, resolveArgs } from './injector/MetadataInjector.js';
6
+ export { MetadataInjector, inject, arg, args, argsFn, by, resolveArgs } from './injector/MetadataInjector.js';
7
7
  export { SimpleInjector } from './injector/SimpleInjector.js';
8
8
  export { ProxyInjector } from './injector/ProxyInjector.js';
9
9
  export { Provider } from './provider/Provider.js';
@@ -26,7 +26,7 @@ export { injectProp } from './hooks/injectProp.js';
26
26
  export { sequential, parallel, oncePerInstance } from './hooks/combinators.js';
27
27
  export { HookCollector, toTask, } from './hooks/HookCollector.js';
28
28
  export { InjectionToken, isInjectionToken, forwardArgs } from './token/InjectionToken.js';
29
- export { toToken, toMappedToken, argToToken } from './token/toToken.js';
29
+ export { toToken, argToToken } from './token/toToken.js';
30
30
  export { GroupAliasToken, toGroupAlias } from './token/GroupAliasToken.js';
31
31
  export { SingleAliasToken, toSingleAlias } from './token/SingleAliasToken.js';
32
32
  export { ClassToken } from './token/ClassToken.js';
@@ -35,9 +35,9 @@ export { FunctionToken } from './token/FunctionToken.js';
35
35
  export { ConstantToken } from './token/ConstantToken.js';
36
36
  export { GroupInstanceToken } from './token/GroupInstanceToken.js';
37
37
  export { resolveConstructor } from './metadata/target.js';
38
- export { addClassMeta, getClassMeta, addClassLabel, getClassLabels, addClassTag, getClassTags } from './metadata/class.js';
39
- export { addParamMeta, getParamMeta, addParamLabel, getParamLabels, addParamTag, getParamTags, } from './metadata/parameter.js';
40
- export { addMethodMeta, getMethodMeta, addMethodLabel, getMethodLabels, addMethodTag, getMethodTags, } from './metadata/method.js';
38
+ export { addClassMeta, getClassMeta, addClassLabel, getClassLabels, addClassTag, getClassTags, createComposeClassDecorator, } from './metadata/class.js';
39
+ export { addParamMeta, getParamMeta, addParamLabel, getParamLabels, addParamTag, getParamTags, createComposeParameterDecorator, } from './metadata/parameter.js';
40
+ export { addMethodMeta, getMethodMeta, addMethodLabel, getMethodLabels, addMethodTag, getMethodTags, createComposeMethodDecorator, } from './metadata/method.js';
41
41
  export { handleError, handleAsyncError } from './utils/errorHandler.js';
42
42
  export { runInOrder, runAtOnce } from './utils/task.js';
43
43
  export { throttle } from './utils/throttle.js';
@@ -5,9 +5,9 @@ export class Injector {
5
5
  constructor(proxyRegistry = ProxyRegistry.getInstance()) {
6
6
  this.proxyRegistry = proxyRegistry;
7
7
  }
8
- resolve(scope, Target, { args, lazy } = {}) {
8
+ resolve(Target, { scope, args, lazy }) {
9
9
  return this.proxyRegistry.toLazyIf(() => {
10
- const instance = this.createInstance(scope, Target, { args });
10
+ const instance = this.createInstance(Target, { scope, args });
11
11
  scope.addInstance(instance);
12
12
  for (const onConstructed of this.onConstructedHookList) {
13
13
  onConstructed(instance, scope);