ts-ioc-container 32.0.7 → 32.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.
package/README.md CHANGED
@@ -1207,7 +1207,6 @@ import {
1207
1207
  MetadataInjector,
1208
1208
  register,
1209
1209
  } from 'ts-ioc-container';
1210
- import * as console from 'node:console';
1211
1210
 
1212
1211
  @register(key('logsRepo'))
1213
1212
  @provider(singleton())
@@ -1225,7 +1224,7 @@ class Logger {
1225
1224
 
1226
1225
  constructor(@inject(by.key('logsRepo')) private logsRepo: LogsRepo) {}
1227
1226
 
1228
- log(message: string): void {
1227
+ log(@inject(by.key('logsRepo')) message: string): void {
1229
1228
  this.messages.push(message);
1230
1229
  }
1231
1230
 
@@ -1,7 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startAutorun = exports.getAutorunHooks = exports.autorun = void 0;
3
+ exports.startAutorun = exports.getAutorunHooks = exports.autorun = exports.AutorunContext = void 0;
4
+ const MetadataInjector_1 = require("./injector/MetadataInjector");
4
5
  const METADATA_KEY = 'autorun';
6
+ class AutorunContext {
7
+ constructor(instance, methodName, scope) {
8
+ this.instance = instance;
9
+ this.methodName = methodName;
10
+ this.scope = scope;
11
+ }
12
+ resolveArgs(...args) {
13
+ return (0, MetadataInjector_1.resolveArgs)(this.instance.constructor, this.methodName)(this.scope, ...args);
14
+ }
15
+ invokeMethod({ args = this.resolveArgs() }) {
16
+ // @ts-ignore
17
+ return this.instance[this.methodName](...args);
18
+ }
19
+ }
20
+ exports.AutorunContext = AutorunContext;
5
21
  const createStore = () => new Map();
6
22
  const autorun = (execute) => (target, propertyKey) => {
7
23
  const hooks = Reflect.hasMetadata(METADATA_KEY, target.constructor)
@@ -17,9 +33,9 @@ const getAutorunHooks = (target) => {
17
33
  : new Map();
18
34
  };
19
35
  exports.getAutorunHooks = getAutorunHooks;
20
- const startAutorun = (target, createContext = (c) => c) => {
36
+ const startAutorun = (target, scope, createContext = (c) => c) => {
21
37
  for (const [methodName, execute] of (0, exports.getAutorunHooks)(target)) {
22
- execute(createContext({ instance: target, methodName }));
38
+ execute(createContext(new AutorunContext(target, methodName, scope)));
23
39
  }
24
40
  };
25
41
  exports.startAutorun = startAutorun;
package/cjm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.startAutorun = exports.autorun = exports.byAliases = exports.byAlias = exports.IMemoKey = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.Registration = exports.register = exports.scope = exports.key = exports.decorate = exports.multiCache = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.ProviderDecorator = exports.args = exports.argsFn = exports.alias = exports.visible = exports.provider = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.AutoMockedContainer = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
3
+ exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.AutorunContext = exports.startAutorun = exports.autorun = exports.byAliases = exports.byAlias = exports.IMemoKey = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.Registration = exports.register = exports.scope = exports.key = exports.decorate = exports.multiCache = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.ProviderDecorator = exports.args = exports.argsFn = exports.alias = exports.visible = exports.provider = exports.ProxyInjector = exports.SimpleInjector = exports.getInjectFns = exports.resolveArgs = exports.inject = exports.MetadataInjector = exports.AutoMockedContainer = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
4
4
  // Containers
5
5
  var IContainer_1 = require("./container/IContainer");
6
6
  Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "AutoMockedContainer", { enumerable: true, get: f
13
13
  var MetadataInjector_1 = require("./injector/MetadataInjector");
14
14
  Object.defineProperty(exports, "MetadataInjector", { enumerable: true, get: function () { return MetadataInjector_1.MetadataInjector; } });
15
15
  Object.defineProperty(exports, "inject", { enumerable: true, get: function () { return MetadataInjector_1.inject; } });
16
+ Object.defineProperty(exports, "resolveArgs", { enumerable: true, get: function () { return MetadataInjector_1.resolveArgs; } });
17
+ Object.defineProperty(exports, "getInjectFns", { enumerable: true, get: function () { return MetadataInjector_1.getInjectFns; } });
16
18
  var SimpleInjector_1 = require("./injector/SimpleInjector");
17
19
  Object.defineProperty(exports, "SimpleInjector", { enumerable: true, get: function () { return SimpleInjector_1.SimpleInjector; } });
18
20
  var ProxyInjector_1 = require("./injector/ProxyInjector");
@@ -59,9 +61,10 @@ Object.defineProperty(exports, "by", { enumerable: true, get: function () { retu
59
61
  Object.defineProperty(exports, "IMemoKey", { enumerable: true, get: function () { return by_1.IMemoKey; } });
60
62
  Object.defineProperty(exports, "byAlias", { enumerable: true, get: function () { return by_1.byAlias; } });
61
63
  Object.defineProperty(exports, "byAliases", { enumerable: true, get: function () { return by_1.byAliases; } });
62
- var autorun_1 = require("./utils/autorun");
64
+ var autorun_1 = require("./autorun");
63
65
  Object.defineProperty(exports, "autorun", { enumerable: true, get: function () { return autorun_1.autorun; } });
64
66
  Object.defineProperty(exports, "startAutorun", { enumerable: true, get: function () { return autorun_1.startAutorun; } });
67
+ Object.defineProperty(exports, "AutorunContext", { enumerable: true, get: function () { return autorun_1.AutorunContext; } });
65
68
  var metadata_1 = require("./metadata");
66
69
  Object.defineProperty(exports, "setMetadata", { enumerable: true, get: function () { return metadata_1.setMetadata; } });
67
70
  Object.defineProperty(exports, "getMetadata", { enumerable: true, get: function () { return metadata_1.getMetadata; } });
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MetadataInjector = exports.inject = void 0;
3
+ exports.MetadataInjector = exports.resolveArgs = exports.inject = exports.getInjectFns = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const metadata_1 = require("../metadata");
6
6
  const METADATA_KEY = 'inject';
7
- const getInjectFns = (Target) => (0, metadata_1.getParameterMetadata)(METADATA_KEY, Target);
8
- const inject = (fn) => (0, metadata_1.setParameterMetadata)(METADATA_KEY, fn);
7
+ const getInjectFns = (Target, methodName) => (0, metadata_1.getParameterMetadata)(metaKey(methodName), Target);
8
+ exports.getInjectFns = getInjectFns;
9
+ const metaKey = (methodName = 'constructor') => `${METADATA_KEY}:${methodName}`;
10
+ const inject = (fn) => (target, propertyKey, parameterIndex) => (0, metadata_1.setParameterMetadata)(metaKey(propertyKey), fn)(target, propertyKey, parameterIndex);
9
11
  exports.inject = inject;
12
+ const resolveArgs = (Target, methodName) => {
13
+ const argsFns = (0, exports.getInjectFns)(Target, methodName);
14
+ return (scope, ...deps) => (0, utils_1.fillEmptyIndexes)(argsFns, deps.map(utils_1.constant)).map((fn) => fn(scope));
15
+ };
16
+ exports.resolveArgs = resolveArgs;
10
17
  class MetadataInjector {
11
18
  resolve(container, Target, { args: deps }) {
12
- const injectionFns = getInjectFns(Target);
13
- const args = (0, utils_1.fillEmptyIndexes)(injectionFns, deps.map(utils_1.constant)).map((fn) => fn(container));
19
+ const args = (0, exports.resolveArgs)(Target)(container, ...deps);
14
20
  return new Target(...args);
15
21
  }
16
22
  }
@@ -1,4 +1,19 @@
1
+ import { resolveArgs } from './injector/MetadataInjector';
1
2
  const METADATA_KEY = 'autorun';
3
+ export class AutorunContext {
4
+ constructor(instance, methodName, scope) {
5
+ this.instance = instance;
6
+ this.methodName = methodName;
7
+ this.scope = scope;
8
+ }
9
+ resolveArgs(...args) {
10
+ return resolveArgs(this.instance.constructor, this.methodName)(this.scope, ...args);
11
+ }
12
+ invokeMethod({ args = this.resolveArgs() }) {
13
+ // @ts-ignore
14
+ return this.instance[this.methodName](...args);
15
+ }
16
+ }
2
17
  const createStore = () => new Map();
3
18
  export const autorun = (execute) => (target, propertyKey) => {
4
19
  const hooks = Reflect.hasMetadata(METADATA_KEY, target.constructor)
@@ -12,8 +27,8 @@ export const getAutorunHooks = (target) => {
12
27
  ? Reflect.getMetadata(METADATA_KEY, target.constructor)
13
28
  : new Map();
14
29
  };
15
- export const startAutorun = (target, createContext = (c) => c) => {
30
+ export const startAutorun = (target, scope, createContext = (c) => c) => {
16
31
  for (const [methodName, execute] of getAutorunHooks(target)) {
17
- execute(createContext({ instance: target, methodName }));
32
+ execute(createContext(new AutorunContext(target, methodName, scope)));
18
33
  }
19
34
  };
package/esm/index.js CHANGED
@@ -3,7 +3,7 @@ export { isDependencyKey, } from './container/IContainer';
3
3
  export { Container } from './container/Container';
4
4
  export { EmptyContainer } from './container/EmptyContainer';
5
5
  export { AutoMockedContainer } from './container/AutoMockedContainer';
6
- export { MetadataInjector, inject } from './injector/MetadataInjector';
6
+ export { MetadataInjector, inject, resolveArgs, getInjectFns } from './injector/MetadataInjector';
7
7
  export { SimpleInjector } from './injector/SimpleInjector';
8
8
  export { ProxyInjector } from './injector/ProxyInjector';
9
9
  // Providers
@@ -22,5 +22,5 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
22
22
  // Others
23
23
  export { getHooks, hook, hasHooks } from './hook';
24
24
  export { by, IMemoKey, byAlias, byAliases } from './by';
25
- export { autorun, startAutorun } from './utils/autorun';
25
+ export { autorun, startAutorun, AutorunContext } from './autorun';
26
26
  export { setMetadata, getMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
@@ -1,12 +1,16 @@
1
1
  import { constant, fillEmptyIndexes } from '../utils';
2
2
  import { setParameterMetadata, getParameterMetadata } from '../metadata';
3
3
  const METADATA_KEY = 'inject';
4
- const getInjectFns = (Target) => getParameterMetadata(METADATA_KEY, Target);
5
- export const inject = (fn) => setParameterMetadata(METADATA_KEY, fn);
4
+ export const getInjectFns = (Target, methodName) => getParameterMetadata(metaKey(methodName), Target);
5
+ const metaKey = (methodName = 'constructor') => `${METADATA_KEY}:${methodName}`;
6
+ export const inject = (fn) => (target, propertyKey, parameterIndex) => setParameterMetadata(metaKey(propertyKey), fn)(target, propertyKey, parameterIndex);
7
+ export const resolveArgs = (Target, methodName) => {
8
+ const argsFns = getInjectFns(Target, methodName);
9
+ return (scope, ...deps) => fillEmptyIndexes(argsFns, deps.map(constant)).map((fn) => fn(scope));
10
+ };
6
11
  export class MetadataInjector {
7
12
  resolve(container, Target, { args: deps }) {
8
- const injectionFns = getInjectFns(Target);
9
- const args = fillEmptyIndexes(injectionFns, deps.map(constant)).map((fn) => fn(container));
13
+ const args = resolveArgs(Target)(container, ...deps);
10
14
  return new Target(...args);
11
15
  }
12
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "32.0.7",
3
+ "version": "32.1.0",
4
4
  "description": "Typescript IoC container",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -59,5 +59,5 @@
59
59
  "ts-node": "^10.9.1",
60
60
  "typescript": "5.4.3"
61
61
  },
62
- "gitHead": "b8a57d6ba85affdbb5e743ac4653dbc6e65b3bc4"
62
+ "gitHead": "79eba3d3a19747339a7b078592f719f00c869f59"
63
63
  }
@@ -0,0 +1,16 @@
1
+ import { IContainer } from './container/IContainer';
2
+ export declare class AutorunContext {
3
+ instance: object;
4
+ methodName: string;
5
+ private scope;
6
+ constructor(instance: object, methodName: string, scope: IContainer);
7
+ resolveArgs(...args: unknown[]): unknown[];
8
+ invokeMethod({ args }: {
9
+ args: unknown[];
10
+ }): unknown;
11
+ }
12
+ type AutorunHandler = <T extends AutorunContext>(context: T) => void;
13
+ export declare const autorun: (execute: AutorunHandler) => MethodDecorator;
14
+ export declare const getAutorunHooks: (target: object) => Map<string, AutorunHandler>;
15
+ export declare const startAutorun: <Context extends AutorunContext>(target: object, scope: IContainer, createContext?: (c: AutorunContext) => Context) => void;
16
+ export {};
@@ -3,7 +3,7 @@ export { Container } from './container/Container';
3
3
  export { EmptyContainer } from './container/EmptyContainer';
4
4
  export { AutoMockedContainer } from './container/AutoMockedContainer';
5
5
  export { IInjector } from './injector/IInjector';
6
- export { MetadataInjector, inject } from './injector/MetadataInjector';
6
+ export { MetadataInjector, inject, resolveArgs, getInjectFns, InjectFn } from './injector/MetadataInjector';
7
7
  export { SimpleInjector } from './injector/SimpleInjector';
8
8
  export { ProxyInjector } from './injector/ProxyInjector';
9
9
  export { ResolveDependency, IProvider, provider, visible, alias, argsFn, args, ArgsFn, ProviderDecorator, InstantDependencyOptions, ProviderResolveOptions, } from './provider/IProvider';
@@ -20,5 +20,5 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
20
20
  export { getHooks, hook, hasHooks } from './hook';
21
21
  export { by, InstancePredicate, IMemo, IMemoKey, byAlias, byAliases } from './by';
22
22
  export { constructor } from './utils';
23
- export { autorun, startAutorun } from './utils/autorun';
23
+ export { autorun, startAutorun, AutorunContext } from './autorun';
24
24
  export { setMetadata, getMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
@@ -2,7 +2,9 @@ import { IInjector, InjectOptions } from './IInjector';
2
2
  import { IContainer } from '../container/IContainer';
3
3
  import { constructor } from '../utils';
4
4
  export type InjectFn<T = unknown> = (l: IContainer) => T;
5
+ export declare const getInjectFns: (Target: constructor<unknown>, methodName?: string) => InjectFn<unknown>[];
5
6
  export declare const inject: (fn: InjectFn) => ParameterDecorator;
7
+ export declare const resolveArgs: (Target: constructor<unknown>, methodName?: string) => (scope: IContainer, ...deps: unknown[]) => unknown[];
6
8
  export declare class MetadataInjector implements IInjector {
7
9
  resolve<T>(container: IContainer, Target: constructor<T>, { args: deps }: InjectOptions): T;
8
10
  }
@@ -1,12 +0,0 @@
1
- interface AutorunContext {
2
- instance: object;
3
- methodName: string;
4
- }
5
- type AutorunHandler = <T extends AutorunContext>(context: T) => void;
6
- export declare const autorun: (execute: AutorunHandler) => MethodDecorator;
7
- export declare const getAutorunHooks: (target: object) => Map<string, AutorunHandler>;
8
- export declare const startAutorun: <Context extends AutorunContext>(target: object, createContext?: (props: {
9
- instance: object;
10
- methodName: string;
11
- }) => Context) => void;
12
- export {};