ts-ioc-container 46.1.0 → 46.3.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
@@ -1392,9 +1392,16 @@ Sometimes you need to invoke methods after construct or dispose of class. This i
1392
1392
 
1393
1393
  ### OnConstruct
1394
1394
  ```typescript
1395
- import { Container, HookContext, HookFn, HooksRunner, inject, onConstruct, Registration as R } from 'ts-ioc-container';
1395
+ import {
1396
+ AddOnConstructHookModule,
1397
+ Container,
1398
+ HookContext,
1399
+ HookFn,
1400
+ inject,
1401
+ onConstruct,
1402
+ Registration as R,
1403
+ } from 'ts-ioc-container';
1396
1404
 
1397
- const onConstructHooksRunner = new HooksRunner('onConstruct');
1398
1405
  const execute: HookFn = (ctx: HookContext) => {
1399
1406
  ctx.invokeMethod({ args: ctx.resolveArgs() });
1400
1407
  };
@@ -1415,9 +1422,7 @@ class Car {
1415
1422
  describe('onConstruct', function () {
1416
1423
  it('should run methods and resolve arguments from container', function () {
1417
1424
  const root = new Container()
1418
- .addOnConstructHook((instance, scope) => {
1419
- onConstructHooksRunner.execute(instance, { scope });
1420
- })
1425
+ .useModule(new AddOnConstructHookModule())
1421
1426
  .addRegistration(R.fromValue('bmw').bindTo('engine'));
1422
1427
 
1423
1428
  const car = root.resolve(Car);
@@ -1431,19 +1436,17 @@ describe('onConstruct', function () {
1431
1436
  ### OnDispose
1432
1437
  ```typescript
1433
1438
  import {
1439
+ AddOnDisposeHookModule,
1434
1440
  bindTo,
1435
1441
  Container,
1436
- hook,
1437
1442
  type HookFn,
1438
- HooksRunner,
1439
1443
  inject,
1444
+ onDispose,
1440
1445
  register,
1441
1446
  Registration as R,
1442
- select,
1443
1447
  singleton,
1444
1448
  } from 'ts-ioc-container';
1445
1449
 
1446
- const onDisposeHookRunner = new HooksRunner('onDispose');
1447
1450
  const execute: HookFn = (ctx) => {
1448
1451
  ctx.invokeMethod({ args: ctx.resolveArgs() });
1449
1452
  };
@@ -1459,7 +1462,7 @@ class LogsRepo {
1459
1462
 
1460
1463
  @register(bindTo('logger'))
1461
1464
  class Logger {
1462
- @hook('onDispose', ({ instance, methodName }) => {
1465
+ @onDispose(({ instance, methodName }) => {
1463
1466
  // @ts-ignore
1464
1467
  instance[methodName].push('world');
1465
1468
  }) // <--- or extract it to @onDispose
@@ -1471,7 +1474,7 @@ class Logger {
1471
1474
  this.messages.push(message);
1472
1475
  }
1473
1476
 
1474
- @hook('onDispose', execute) // <--- or extract it to @onDispose
1477
+ @onDispose(execute)
1475
1478
  save() {
1476
1479
  this.logsRepo.saveLogs(this.messages);
1477
1480
  }
@@ -1479,16 +1482,18 @@ class Logger {
1479
1482
 
1480
1483
  describe('onDispose', function () {
1481
1484
  it('should invoke hooks on all instances', function () {
1482
- const container = new Container().addRegistration(R.fromClass(Logger)).addRegistration(R.fromClass(LogsRepo));
1485
+ const container = new Container()
1486
+ .useModule(new AddOnDisposeHookModule())
1487
+ .addRegistration(R.fromClass(Logger))
1488
+ .addRegistration(R.fromClass(LogsRepo));
1483
1489
 
1484
1490
  const logger = container.resolve<Logger>('logger');
1485
1491
  logger.log('Hello');
1492
+ const logsRepo = container.resolve<LogsRepo>('logsRepo');
1486
1493
 
1487
- for (const instance of select.instances().resolve(container)) {
1488
- onDisposeHookRunner.execute(instance, { scope: container });
1489
- }
1494
+ container.dispose();
1490
1495
 
1491
- expect(container.resolve<LogsRepo>('logsRepo').savedLogs.join(',')).toBe('Hello,world');
1496
+ expect(logsRepo.savedLogs.join(',')).toBe('Hello,world');
1492
1497
  });
1493
1498
  });
1494
1499
 
@@ -48,5 +48,11 @@ class EmptyContainer {
48
48
  resolveOneByAlias(alias, options) {
49
49
  throw new DependencyNotFoundError_1.DependencyNotFoundError(`Cannot find alias ${alias.toString()}`);
50
50
  }
51
+ addOnDisposeHook(...hooks) {
52
+ throw new MethodNotImplementedError_1.MethodNotImplementedError();
53
+ }
54
+ addOnConstructHook(...hooks) {
55
+ throw new MethodNotImplementedError_1.MethodNotImplementedError();
56
+ }
51
57
  }
52
58
  exports.EmptyContainer = EmptyContainer;
@@ -1,8 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.onConstruct = exports.onConstructHooksRunner = void 0;
3
+ exports.AddOnConstructHookModule = exports.onConstruct = exports.onConstructHooksRunner = void 0;
4
4
  const hook_1 = require("./hook");
5
5
  const HooksRunner_1 = require("./HooksRunner");
6
6
  exports.onConstructHooksRunner = new HooksRunner_1.HooksRunner('onConstruct');
7
7
  const onConstruct = (fn) => (0, hook_1.hook)('onConstruct', fn);
8
8
  exports.onConstruct = onConstruct;
9
+ class AddOnConstructHookModule {
10
+ applyTo(container) {
11
+ container.addOnConstructHook((instance, scope) => {
12
+ exports.onConstructHooksRunner.execute(instance, { scope });
13
+ });
14
+ }
15
+ }
16
+ exports.AddOnConstructHookModule = AddOnConstructHookModule;
@@ -1,8 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.onDispose = exports.onDisposeHooksRunner = void 0;
3
+ exports.AddOnDisposeHookModule = exports.onDispose = exports.onDisposeHooksRunner = void 0;
4
4
  const hook_1 = require("./hook");
5
5
  const HooksRunner_1 = require("./HooksRunner");
6
6
  exports.onDisposeHooksRunner = new HooksRunner_1.HooksRunner('onDispose');
7
7
  const onDispose = (fn) => (0, hook_1.hook)('onDispose', fn);
8
8
  exports.onDispose = onDispose;
9
+ class AddOnDisposeHookModule {
10
+ applyTo(container) {
11
+ container.addOnDisposeHook((scope) => {
12
+ for (const instance of scope.getInstances()) {
13
+ exports.onDisposeHooksRunner.execute(instance, { scope });
14
+ }
15
+ });
16
+ }
17
+ }
18
+ exports.AddOnDisposeHookModule = AddOnDisposeHookModule;
package/cjm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SingleAliasToken = exports.toGroupAlias = exports.GroupAliasToken = exports.InjectionToken = exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getClassMetadata = exports.setClassMetadata = exports.HooksRunner = exports.onDispose = exports.onDisposeHooksRunner = 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.Is = exports.select = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = void 0;
3
+ exports.GroupAliasToken = exports.InjectionToken = exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getClassMetadata = exports.setClassMetadata = 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.Is = exports.select = exports.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = exports.SingleToken = exports.ClassToken = exports.toSingleAlias = exports.SingleAliasToken = exports.toGroupAlias = 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; } });
@@ -69,9 +69,11 @@ Object.defineProperty(exports, "injectProp", { enumerable: true, get: function (
69
69
  var onConstruct_1 = require("./hooks/onConstruct");
70
70
  Object.defineProperty(exports, "onConstructHooksRunner", { enumerable: true, get: function () { return onConstruct_1.onConstructHooksRunner; } });
71
71
  Object.defineProperty(exports, "onConstruct", { enumerable: true, get: function () { return onConstruct_1.onConstruct; } });
72
+ Object.defineProperty(exports, "AddOnConstructHookModule", { enumerable: true, get: function () { return onConstruct_1.AddOnConstructHookModule; } });
72
73
  var onDispose_1 = require("./hooks/onDispose");
73
74
  Object.defineProperty(exports, "onDisposeHooksRunner", { enumerable: true, get: function () { return onDispose_1.onDisposeHooksRunner; } });
74
75
  Object.defineProperty(exports, "onDispose", { enumerable: true, get: function () { return onDispose_1.onDispose; } });
76
+ Object.defineProperty(exports, "AddOnDisposeHookModule", { enumerable: true, get: function () { return onDispose_1.AddOnDisposeHookModule; } });
75
77
  var HooksRunner_1 = require("./hooks/HooksRunner");
76
78
  Object.defineProperty(exports, "HooksRunner", { enumerable: true, get: function () { return HooksRunner_1.HooksRunner; } });
77
79
  // Metadata
@@ -10,7 +10,10 @@ exports.scope = scope;
10
10
  const METADATA_KEY = 'registration';
11
11
  const getTransformers = (Target) => (0, metadata_1.getClassMetadata)(Target, METADATA_KEY) ?? [];
12
12
  exports.getTransformers = getTransformers;
13
- const register = (...mappers) => (0, metadata_1.setClassMetadata)(METADATA_KEY, () => mappers.map((m) => ((0, ProviderPipe_1.isProviderPipe)(m) ? (r) => m.mapRegistration(r) : m)));
13
+ const register = (...mappers) => (0, metadata_1.setClassMetadata)(METADATA_KEY, (acc) => {
14
+ const result = mappers.map((m) => (0, ProviderPipe_1.isProviderPipe)(m) ? (r) => m.mapRegistration(r) : m);
15
+ return acc ? [...result, ...acc] : result;
16
+ });
14
17
  exports.register = register;
15
18
  const bindTo = (...tokens) => (r) => {
16
19
  for (const token of tokens) {
@@ -45,4 +45,10 @@ export class EmptyContainer {
45
45
  resolveOneByAlias(alias, options) {
46
46
  throw new DependencyNotFoundError(`Cannot find alias ${alias.toString()}`);
47
47
  }
48
+ addOnDisposeHook(...hooks) {
49
+ throw new MethodNotImplementedError();
50
+ }
51
+ addOnConstructHook(...hooks) {
52
+ throw new MethodNotImplementedError();
53
+ }
48
54
  }
@@ -2,3 +2,10 @@ import { hook } from './hook';
2
2
  import { HooksRunner } from './HooksRunner';
3
3
  export const onConstructHooksRunner = new HooksRunner('onConstruct');
4
4
  export const onConstruct = (fn) => hook('onConstruct', fn);
5
+ export class AddOnConstructHookModule {
6
+ applyTo(container) {
7
+ container.addOnConstructHook((instance, scope) => {
8
+ onConstructHooksRunner.execute(instance, { scope });
9
+ });
10
+ }
11
+ }
@@ -2,3 +2,12 @@ import { hook } from './hook';
2
2
  import { HooksRunner } from './HooksRunner';
3
3
  export const onDisposeHooksRunner = new HooksRunner('onDispose');
4
4
  export const onDispose = (fn) => hook('onDispose', fn);
5
+ export class AddOnDisposeHookModule {
6
+ applyTo(container) {
7
+ container.addOnDisposeHook((scope) => {
8
+ for (const instance of scope.getInstances()) {
9
+ onDisposeHooksRunner.execute(instance, { scope });
10
+ }
11
+ });
12
+ }
13
+ }
package/esm/index.js CHANGED
@@ -27,8 +27,8 @@ export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
27
27
  export { getHooks, hook, hasHooks } from './hooks/hook';
28
28
  export { HookContext } from './hooks/HookContext';
29
29
  export { injectProp } from './hooks/injectProp';
30
- export { onConstructHooksRunner, onConstruct } from './hooks/onConstruct';
31
- export { onDisposeHooksRunner, onDispose } from './hooks/onDispose';
30
+ export { onConstructHooksRunner, onConstruct, AddOnConstructHookModule } from './hooks/onConstruct';
31
+ export { onDisposeHooksRunner, onDispose, AddOnDisposeHookModule } from './hooks/onDispose';
32
32
  export { HooksRunner } from './hooks/HooksRunner';
33
33
  // Metadata
34
34
  export { setClassMetadata, getClassMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
@@ -5,7 +5,10 @@ import { isBindToken } from '../token/BindToken';
5
5
  export const scope = (...rules) => (r) => r.when(...rules);
6
6
  const METADATA_KEY = 'registration';
7
7
  export const getTransformers = (Target) => getClassMetadata(Target, METADATA_KEY) ?? [];
8
- export const register = (...mappers) => setClassMetadata(METADATA_KEY, () => mappers.map((m) => (isProviderPipe(m) ? (r) => m.mapRegistration(r) : m)));
8
+ export const register = (...mappers) => setClassMetadata(METADATA_KEY, (acc) => {
9
+ const result = mappers.map((m) => isProviderPipe(m) ? (r) => m.mapRegistration(r) : m);
10
+ return acc ? [...result, ...acc] : result;
11
+ });
9
12
  export const bindTo = (...tokens) => (r) => {
10
13
  for (const token of tokens) {
11
14
  const targetToken = isBindToken(token) ? token : new SingleToken(token);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "46.1.0",
3
+ "version": "46.3.0",
4
4
  "description": "Typescript IoC container",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -2,6 +2,8 @@ import { type DependencyKey, type IContainer, type IContainerModule, type Resolv
2
2
  import { type IProvider } from '../provider/IProvider';
3
3
  import { type IRegistration } from '../registration/IRegistration';
4
4
  import { constructor, Instance } from '../types';
5
+ import { OnDisposeHook } from '../hooks/onDispose';
6
+ import { OnConstructHook } from '../hooks/onConstruct';
5
7
  export declare class EmptyContainer implements IContainer {
6
8
  get isDisposed(): boolean;
7
9
  addInstance(instance: Instance): void;
@@ -19,4 +21,6 @@ export declare class EmptyContainer implements IContainer {
19
21
  resolve<T>(key: constructor<T> | DependencyKey, options?: ResolveOneOptions): T;
20
22
  resolveByAlias<T>(alias: DependencyKey, options?: ResolveManyOptions): T[];
21
23
  resolveOneByAlias<T>(alias: DependencyKey, options?: ResolveOneOptions): T;
24
+ addOnDisposeHook(...hooks: OnDisposeHook[]): this;
25
+ addOnConstructHook(...hooks: OnConstructHook[]): this;
22
26
  }
@@ -1,6 +1,8 @@
1
1
  import { type IProvider, ProviderOptions } from '../provider/IProvider';
2
2
  import { type IRegistration } from '../registration/IRegistration';
3
3
  import { constructor, Instance } from '../types';
4
+ import { OnConstructHook } from '../hooks/onConstruct';
5
+ import { OnDisposeHook } from '../hooks/onDispose';
4
6
  export type DependencyKey = string | symbol;
5
7
  export declare function isDependencyKey(target: unknown): target is DependencyKey;
6
8
  export type Tag = string;
@@ -30,6 +32,8 @@ export type RegisterOptions = {
30
32
  };
31
33
  export interface IContainer extends Tagged {
32
34
  readonly isDisposed: boolean;
35
+ addOnConstructHook(...hooks: OnConstructHook[]): this;
36
+ addOnDisposeHook(...hooks: OnDisposeHook[]): this;
33
37
  register(key: DependencyKey, value: IProvider, options?: RegisterOptions): this;
34
38
  addRegistration(registration: IRegistration): this;
35
39
  getRegistrations(): IRegistration[];
@@ -1,7 +1,10 @@
1
1
  import { HookClass, HookFn } from './hook';
2
- import type { IContainer } from '../container/IContainer';
2
+ import type { IContainer, IContainerModule } from '../container/IContainer';
3
3
  import { constructor, Instance } from '../types';
4
4
  import { HooksRunner } from './HooksRunner';
5
5
  export declare const onConstructHooksRunner: HooksRunner;
6
6
  export declare const onConstruct: (fn: HookFn | constructor<HookClass>) => (target: object, propertyKey: string | symbol) => void;
7
7
  export type OnConstructHook = (instance: Instance, scope: IContainer) => void;
8
+ export declare class AddOnConstructHookModule implements IContainerModule {
9
+ applyTo(container: IContainer): void;
10
+ }
@@ -1,7 +1,10 @@
1
1
  import { HookClass, HookFn } from './hook';
2
- import type { IContainer } from '../container/IContainer';
2
+ import type { IContainer, IContainerModule } from '../container/IContainer';
3
3
  import { constructor } from '../types';
4
4
  import { HooksRunner } from './HooksRunner';
5
5
  export declare const onDisposeHooksRunner: HooksRunner;
6
6
  export declare const onDispose: (fn: HookFn | constructor<HookClass>) => (target: object, propertyKey: string | symbol) => void;
7
7
  export type OnDisposeHook = (scope: IContainer) => void;
8
+ export declare class AddOnDisposeHookModule implements IContainerModule {
9
+ applyTo(container: IContainer): void;
10
+ }
@@ -22,8 +22,8 @@ export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
22
22
  export { getHooks, hook, hasHooks, type HookFn, type HookClass } from './hooks/hook';
23
23
  export { HookContext, type IHookContext } from './hooks/HookContext';
24
24
  export { injectProp } from './hooks/injectProp';
25
- export { onConstructHooksRunner, onConstruct } from './hooks/onConstruct';
26
- export { onDisposeHooksRunner, onDispose } from './hooks/onDispose';
25
+ export { onConstructHooksRunner, onConstruct, AddOnConstructHookModule } from './hooks/onConstruct';
26
+ export { onDisposeHooksRunner, onDispose, AddOnDisposeHookModule } from './hooks/onDispose';
27
27
  export type { HooksRunnerContext } from './hooks/HooksRunner';
28
28
  export { HooksRunner } from './hooks/HooksRunner';
29
29
  export { setClassMetadata, getClassMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';