ts-ioc-container 52.0.0 → 53.0.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.
@@ -92,6 +92,9 @@ class Container {
92
92
  this.parent.removeScope(this);
93
93
  this.parent = new EmptyContainer_1.EmptyContainer();
94
94
  // Reset the state
95
+ for (const [_, provider] of this.providers) {
96
+ provider.dispose();
97
+ }
95
98
  this.providers.clear();
96
99
  this.aliases.destroy();
97
100
  this.instances = [];
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CannonSingletonApplyTwiceError = void 0;
4
+ const ContainerError_1 = require("./ContainerError");
5
+ class CannonSingletonApplyTwiceError extends ContainerError_1.ContainerError {
6
+ name = 'CannonSingletonApplyTwiceError';
7
+ constructor(message) {
8
+ super(message);
9
+ Object.setPrototypeOf(this, CannonSingletonApplyTwiceError.prototype);
10
+ }
11
+ static assert(isTrue, failMessage) {
12
+ if (!isTrue) {
13
+ throw new CannonSingletonApplyTwiceError(failMessage);
14
+ }
15
+ }
16
+ }
17
+ exports.CannonSingletonApplyTwiceError = CannonSingletonApplyTwiceError;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProviderDisposedError = void 0;
4
+ const ContainerError_1 = require("./ContainerError");
5
+ class ProviderDisposedError extends ContainerError_1.ContainerError {
6
+ name = 'ProviderDisposedError';
7
+ static assert(isTrue, failMessage) {
8
+ if (!isTrue) {
9
+ throw new ProviderDisposedError(failMessage);
10
+ }
11
+ }
12
+ constructor(message) {
13
+ super(message);
14
+ Object.setPrototypeOf(this, ProviderDisposedError.prototype);
15
+ }
16
+ }
17
+ exports.ProviderDisposedError = ProviderDisposedError;
package/cjm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
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.createHookContext = exports.createHookContextFactory = exports.HookContext = exports.hasHooks = exports.hook = exports.getHooks = exports.CannonSingletonApplyError = exports.UnexpectedHookResultError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.DependencyNotFoundError = exports.Registration = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.argsFn = exports.args = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
4
- exports.resolveConstructor = exports.Is = exports.pipe = exports.select = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.handleAsyncError = exports.handleError = 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.GroupInstanceToken = exports.ConstantToken = void 0;
3
+ 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.createHookContext = exports.createHookContextFactory = exports.HookContext = exports.hasHooks = exports.hook = exports.getHooks = exports.CannonSingletonApplyTwiceError = exports.UnexpectedHookResultError = exports.ProviderDisposedError = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyMissingKeyError = exports.DependencyNotFoundError = exports.Registration = exports.appendArgsFn = exports.appendArgs = exports.decorate = exports.singleton = exports.lazy = exports.scopeAccess = exports.scope = exports.bindTo = exports.register = exports.Provider = exports.ProxyInjector = exports.SimpleInjector = exports.resolveArgs = exports.argsFn = exports.args = exports.inject = exports.MetadataInjector = exports.Injector = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
4
+ exports.resolveConstructor = exports.Is = exports.pipe = exports.select = exports.once = exports.shallowCache = exports.debounce = exports.throttle = exports.handleAsyncError = exports.handleError = 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.GroupInstanceToken = exports.ConstantToken = exports.FunctionToken = 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; } });
@@ -46,10 +46,12 @@ var MethodNotImplementedError_1 = require("./errors/MethodNotImplementedError");
46
46
  Object.defineProperty(exports, "MethodNotImplementedError", { enumerable: true, get: function () { return MethodNotImplementedError_1.MethodNotImplementedError; } });
47
47
  var ContainerDisposedError_1 = require("./errors/ContainerDisposedError");
48
48
  Object.defineProperty(exports, "ContainerDisposedError", { enumerable: true, get: function () { return ContainerDisposedError_1.ContainerDisposedError; } });
49
+ var ProviderDisposedError_1 = require("./errors/ProviderDisposedError");
50
+ Object.defineProperty(exports, "ProviderDisposedError", { enumerable: true, get: function () { return ProviderDisposedError_1.ProviderDisposedError; } });
49
51
  var UnexpectedHookResultError_1 = require("./errors/UnexpectedHookResultError");
50
52
  Object.defineProperty(exports, "UnexpectedHookResultError", { enumerable: true, get: function () { return UnexpectedHookResultError_1.UnexpectedHookResultError; } });
51
- var CannonSingletonApplyError_1 = require("./errors/CannonSingletonApplyError");
52
- Object.defineProperty(exports, "CannonSingletonApplyError", { enumerable: true, get: function () { return CannonSingletonApplyError_1.CannonSingletonApplyError; } });
53
+ var CannonSingletonApplyTwiceError_1 = require("./errors/CannonSingletonApplyTwiceError");
54
+ Object.defineProperty(exports, "CannonSingletonApplyTwiceError", { enumerable: true, get: function () { return CannonSingletonApplyTwiceError_1.CannonSingletonApplyTwiceError; } });
53
55
  // Hooks
54
56
  var hook_1 = require("./hooks/hook");
55
57
  Object.defineProperty(exports, "getHooks", { enumerable: true, get: function () { return hook_1.getHooks; } });
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Provider = void 0;
4
- const CannonSingletonApplyError_1 = require("../errors/CannonSingletonApplyError");
4
+ const CannonSingletonApplyTwiceError_1 = require("../errors/CannonSingletonApplyTwiceError");
5
+ const ProviderDisposedError_1 = require("../errors/ProviderDisposedError");
5
6
  class Provider {
6
7
  resolveDependency;
7
8
  static fromClass(Target) {
@@ -19,10 +20,12 @@ class Provider {
19
20
  isLazy = false;
20
21
  cache = new Map();
21
22
  getKey;
23
+ isDisposed = false;
22
24
  constructor(resolveDependency) {
23
25
  this.resolveDependency = resolveDependency;
24
26
  }
25
27
  resolve(scope, options) {
28
+ ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
26
29
  if (!this.getKey) {
27
30
  return this.resolveDep(scope, options);
28
31
  }
@@ -56,14 +59,22 @@ class Provider {
56
59
  return this;
57
60
  }
58
61
  hasAccess(options) {
62
+ ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
59
63
  return this.accessRules.reduce((acc, rule) => rule(options, acc), true);
60
64
  }
61
65
  singleton(getCacheKey = () => '1') {
62
- if (this.getKey) {
63
- throw new CannonSingletonApplyError_1.CannonSingletonApplyError('Provider is already singleton');
64
- }
66
+ CannonSingletonApplyTwiceError_1.CannonSingletonApplyTwiceError.assert(!this.getKey, 'Provider is already singleton');
65
67
  this.getKey = getCacheKey;
66
68
  return this;
67
69
  }
70
+ dispose() {
71
+ ProviderDisposedError_1.ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
72
+ this.isDisposed = true;
73
+ this.getKey = undefined;
74
+ this.cache.clear();
75
+ this.accessRules.splice(0, this.accessRules.length);
76
+ this.mappers.splice(0, this.mappers.length);
77
+ this.argsFnList.splice(0, this.argsFnList.length);
78
+ }
68
79
  }
69
80
  exports.Provider = Provider;
@@ -89,6 +89,9 @@ export class Container {
89
89
  this.parent.removeScope(this);
90
90
  this.parent = new EmptyContainer();
91
91
  // Reset the state
92
+ for (const [_, provider] of this.providers) {
93
+ provider.dispose();
94
+ }
92
95
  this.providers.clear();
93
96
  this.aliases.destroy();
94
97
  this.instances = [];
@@ -0,0 +1,13 @@
1
+ import { ContainerError } from './ContainerError';
2
+ export class CannonSingletonApplyTwiceError extends ContainerError {
3
+ name = 'CannonSingletonApplyTwiceError';
4
+ constructor(message) {
5
+ super(message);
6
+ Object.setPrototypeOf(this, CannonSingletonApplyTwiceError.prototype);
7
+ }
8
+ static assert(isTrue, failMessage) {
9
+ if (!isTrue) {
10
+ throw new CannonSingletonApplyTwiceError(failMessage);
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ import { ContainerError } from './ContainerError';
2
+ export class ProviderDisposedError extends ContainerError {
3
+ name = 'ProviderDisposedError';
4
+ static assert(isTrue, failMessage) {
5
+ if (!isTrue) {
6
+ throw new ProviderDisposedError(failMessage);
7
+ }
8
+ }
9
+ constructor(message) {
10
+ super(message);
11
+ Object.setPrototypeOf(this, ProviderDisposedError.prototype);
12
+ }
13
+ }
package/esm/index.js CHANGED
@@ -16,8 +16,9 @@ export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
16
16
  export { DependencyMissingKeyError } from './errors/DependencyMissingKeyError';
17
17
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
18
18
  export { ContainerDisposedError } from './errors/ContainerDisposedError';
19
+ export { ProviderDisposedError } from './errors/ProviderDisposedError';
19
20
  export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
20
- export { CannonSingletonApplyError } from './errors/CannonSingletonApplyError';
21
+ export { CannonSingletonApplyTwiceError } from './errors/CannonSingletonApplyTwiceError';
21
22
  // Hooks
22
23
  export { getHooks, hook, hasHooks } from './hooks/hook';
23
24
  export { HookContext, createHookContextFactory, createHookContext } from './hooks/HookContext';
@@ -1,4 +1,5 @@
1
- import { CannonSingletonApplyError } from '../errors/CannonSingletonApplyError';
1
+ import { CannonSingletonApplyTwiceError } from '../errors/CannonSingletonApplyTwiceError';
2
+ import { ProviderDisposedError } from '../errors/ProviderDisposedError';
2
3
  export class Provider {
3
4
  resolveDependency;
4
5
  static fromClass(Target) {
@@ -16,10 +17,12 @@ export class Provider {
16
17
  isLazy = false;
17
18
  cache = new Map();
18
19
  getKey;
20
+ isDisposed = false;
19
21
  constructor(resolveDependency) {
20
22
  this.resolveDependency = resolveDependency;
21
23
  }
22
24
  resolve(scope, options) {
25
+ ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
23
26
  if (!this.getKey) {
24
27
  return this.resolveDep(scope, options);
25
28
  }
@@ -53,13 +56,21 @@ export class Provider {
53
56
  return this;
54
57
  }
55
58
  hasAccess(options) {
59
+ ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
56
60
  return this.accessRules.reduce((acc, rule) => rule(options, acc), true);
57
61
  }
58
62
  singleton(getCacheKey = () => '1') {
59
- if (this.getKey) {
60
- throw new CannonSingletonApplyError('Provider is already singleton');
61
- }
63
+ CannonSingletonApplyTwiceError.assert(!this.getKey, 'Provider is already singleton');
62
64
  this.getKey = getCacheKey;
63
65
  return this;
64
66
  }
67
+ dispose() {
68
+ ProviderDisposedError.assert(!this.isDisposed, 'Provider is already disposed');
69
+ this.isDisposed = true;
70
+ this.getKey = undefined;
71
+ this.cache.clear();
72
+ this.accessRules.splice(0, this.accessRules.length);
73
+ this.mappers.splice(0, this.mappers.length);
74
+ this.argsFnList.splice(0, this.argsFnList.length);
75
+ }
65
76
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "52.0.0",
3
+ "version": "53.0.0",
4
4
  "description": "Fast, lightweight TypeScript dependency injection container with a clean API, scoped lifecycles, decorators, tokens, hooks, lazy injection, customizable providers, and no global container objects.",
5
5
  "workspaces": [
6
6
  "docs"
@@ -0,0 +1,6 @@
1
+ import { ContainerError } from './ContainerError';
2
+ export declare class CannonSingletonApplyTwiceError extends ContainerError {
3
+ name: string;
4
+ constructor(message?: string);
5
+ static assert(isTrue: boolean, failMessage: string): void;
6
+ }
@@ -0,0 +1,6 @@
1
+ import { ContainerError } from './ContainerError';
2
+ export declare class ProviderDisposedError extends ContainerError {
3
+ name: string;
4
+ static assert(isTrue: boolean, failMessage: string): void;
5
+ constructor(message: string);
6
+ }
@@ -13,8 +13,9 @@ export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
13
13
  export { DependencyMissingKeyError } from './errors/DependencyMissingKeyError';
14
14
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
15
15
  export { ContainerDisposedError } from './errors/ContainerDisposedError';
16
+ export { ProviderDisposedError } from './errors/ProviderDisposedError';
16
17
  export { UnexpectedHookResultError } from './errors/UnexpectedHookResultError';
17
- export { CannonSingletonApplyError } from './errors/CannonSingletonApplyError';
18
+ export { CannonSingletonApplyTwiceError } from './errors/CannonSingletonApplyTwiceError';
18
19
  export { getHooks, hook, hasHooks, type HookFn, type HookClass, type InjectFn, type HooksOfClass } from './hooks/hook';
19
20
  export { HookContext, createHookContextFactory, createHookContext, type IHookContext } from './hooks/HookContext';
20
21
  export { injectProp } from './hooks/injectProp';
@@ -22,4 +22,5 @@ export interface IProvider<T = any> {
22
22
  addArgsFn(argsFn: ArgsFn): this;
23
23
  lazy(): this;
24
24
  singleton(getCacheKey?: GetCacheKey): this;
25
+ dispose(): void;
25
26
  }
@@ -1,4 +1,4 @@
1
- import { ArgsFn, DecorateFn, GetCacheKey, IProvider, ProviderOptions, ResolveDependency, ScopeAccessOptions, ScopeAccessRule } from './IProvider';
1
+ import { type ArgsFn, type DecorateFn, type GetCacheKey, type IProvider, type ProviderOptions, type ResolveDependency, type ScopeAccessOptions, type ScopeAccessRule } from './IProvider';
2
2
  import type { DependencyKey, IContainer } from '../container/IContainer';
3
3
  import { type constructor } from '../utils/basic';
4
4
  export declare class Provider<T = any> implements IProvider<T> {
@@ -6,12 +6,13 @@ export declare class Provider<T = any> implements IProvider<T> {
6
6
  static fromClass<T>(Target: constructor<T>): IProvider<T>;
7
7
  static fromValue<T>(value: T): IProvider<T>;
8
8
  static fromKey<T>(key: DependencyKey): Provider<T>;
9
- private argsFnList;
9
+ private readonly argsFnList;
10
10
  private readonly accessRules;
11
11
  private readonly mappers;
12
12
  private isLazy;
13
13
  private cache;
14
14
  private getKey;
15
+ private isDisposed;
15
16
  constructor(resolveDependency: ResolveDependency<T>);
16
17
  resolve(scope: IContainer, options: ProviderOptions): T;
17
18
  private resolveDep;
@@ -21,4 +22,5 @@ export declare class Provider<T = any> implements IProvider<T> {
21
22
  addArgsFn(...fns: ArgsFn[]): this;
22
23
  hasAccess(options: ScopeAccessOptions): boolean;
23
24
  singleton(getCacheKey?: GetCacheKey): this;
25
+ dispose(): void;
24
26
  }
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CannonSingletonApplyError = void 0;
4
- const ContainerError_1 = require("./ContainerError");
5
- class CannonSingletonApplyError extends ContainerError_1.ContainerError {
6
- name = 'CannonSingletonApplyError';
7
- constructor(message) {
8
- super(message);
9
- Object.setPrototypeOf(this, CannonSingletonApplyError.prototype);
10
- }
11
- }
12
- exports.CannonSingletonApplyError = CannonSingletonApplyError;
@@ -1,8 +0,0 @@
1
- import { ContainerError } from './ContainerError';
2
- export class CannonSingletonApplyError extends ContainerError {
3
- name = 'CannonSingletonApplyError';
4
- constructor(message) {
5
- super(message);
6
- Object.setPrototypeOf(this, CannonSingletonApplyError.prototype);
7
- }
8
- }
@@ -1,5 +0,0 @@
1
- import { ContainerError } from './ContainerError';
2
- export declare class CannonSingletonApplyError extends ContainerError {
3
- name: string;
4
- constructor(message?: string);
5
- }