ts-ioc-container 52.0.0 → 52.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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.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.CannonSingletonApplyError = 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,6 +46,8 @@ 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
53
  var CannonSingletonApplyError_1 = require("./errors/CannonSingletonApplyError");
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Provider = void 0;
4
4
  const CannonSingletonApplyError_1 = require("../errors/CannonSingletonApplyError");
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,6 +59,7 @@ 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') {
@@ -65,5 +69,13 @@ class Provider {
65
69
  this.getKey = getCacheKey;
66
70
  return this;
67
71
  }
72
+ dispose() {
73
+ this.isDisposed = true;
74
+ this.getKey = undefined;
75
+ this.cache.clear();
76
+ this.accessRules.splice(0, this.accessRules.length);
77
+ this.mappers.splice(0, this.mappers.length);
78
+ this.argsFnList.splice(0, this.argsFnList.length);
79
+ }
68
80
  }
69
81
  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 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,6 +16,7 @@ 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
21
  export { CannonSingletonApplyError } from './errors/CannonSingletonApplyError';
21
22
  // Hooks
@@ -1,4 +1,5 @@
1
1
  import { CannonSingletonApplyError } from '../errors/CannonSingletonApplyError';
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,6 +56,7 @@ 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') {
@@ -62,4 +66,12 @@ export class Provider {
62
66
  this.getKey = getCacheKey;
63
67
  return this;
64
68
  }
69
+ dispose() {
70
+ this.isDisposed = true;
71
+ this.getKey = undefined;
72
+ this.cache.clear();
73
+ this.accessRules.splice(0, this.accessRules.length);
74
+ this.mappers.splice(0, this.mappers.length);
75
+ this.argsFnList.splice(0, this.argsFnList.length);
76
+ }
65
77
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "52.0.0",
3
+ "version": "52.0.1",
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 ProviderDisposedError extends ContainerError {
3
+ name: string;
4
+ static assert(isTrue: boolean, failMessage: string): void;
5
+ constructor(message: string);
6
+ }
@@ -13,6 +13,7 @@ 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
18
  export { CannonSingletonApplyError } from './errors/CannonSingletonApplyError';
18
19
  export { getHooks, hook, hasHooks, type HookFn, type HookClass, type InjectFn, type HooksOfClass } from './hooks/hook';
@@ -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
  }
@@ -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
  }