@art-ws/di 2.0.25 → 2.0.27

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.
@@ -32,3 +32,15 @@ export declare function setRootInjector(injector: Injector | undefined): void;
32
32
  export declare function getOnScopeHandler(): OnScopeHandler | undefined;
33
33
  export declare function setOnScopeHandler(handler: OnScopeHandler | undefined): void;
34
34
  export declare function getModuleName(module: DIModuleDef): string;
35
+ export declare function runScopedTask<T = void>(options: {
36
+ task: (...args: any[]) => Promise<T | undefined>;
37
+ deps?: Token[];
38
+ providers?: Provider[];
39
+ }): Promise<T | undefined>;
40
+ export type IDisposable = {
41
+ dispose: () => void;
42
+ };
43
+ export declare function disposeInstances(instances: unknown[]): {
44
+ instance: unknown;
45
+ error: Error;
46
+ }[];
@@ -54,21 +54,24 @@ export class Injector {
54
54
  const p1 = p;
55
55
  const p2 = p;
56
56
  const p3 = p;
57
+ const p4 = p;
57
58
  if (isClass(p1)) {
58
59
  this.addFactory(p1);
59
60
  }
60
61
  else if (p2.token && p2.factory) {
61
62
  this.addFactory(p2.token, p2.factory);
62
63
  }
63
- else if (p3.provide || p3.useClass) {
64
- const provide = p3.provide || p3.useClass;
64
+ else if (p3.provide || p4.useClass) {
65
+ const provide = p3.provide || p4.useClass;
65
66
  if (!provide)
66
67
  throw new Error(`provide|useClass is not defined`);
67
68
  const factory = () => {
68
- if (p3.useFactory || p3.useClass) {
69
+ if (p3.useFactory || p4.useClass) {
69
70
  const deps = (p3.deps || []).map((dep) => inject(dep));
70
- if (p3.useClass)
71
- return new p3.useClass(...deps);
71
+ if (p4.useClass) {
72
+ const C = p4.useClass;
73
+ return new C(...deps);
74
+ }
72
75
  else
73
76
  return p3.useFactory(...deps);
74
77
  }
@@ -172,3 +175,44 @@ export function getModuleName(module) {
172
175
  name = name || "Unknown Module";
173
176
  return name;
174
177
  }
178
+ export function runScopedTask(options) {
179
+ let resolveFunc;
180
+ let rejectFunc;
181
+ const promise = new Promise((resolve, reject) => {
182
+ resolveFunc = resolve;
183
+ rejectFunc = reject;
184
+ });
185
+ let result = undefined;
186
+ getRootInjector().runScope(async () => {
187
+ const deps = options.deps?.map((d) => inject(d)) || [];
188
+ try {
189
+ result = await options.task(...deps);
190
+ }
191
+ catch (e) {
192
+ rejectFunc(e);
193
+ }
194
+ }, {
195
+ providers: options.providers,
196
+ onEnd: ({ injector }) => {
197
+ resolveFunc(result);
198
+ disposeInstances(injector.getInstances());
199
+ injector.dispose();
200
+ },
201
+ });
202
+ return promise;
203
+ }
204
+ export function disposeInstances(instances) {
205
+ const errors = [];
206
+ for (const instance of instances) {
207
+ const d = instance;
208
+ if (d && typeof d.dispose === "function") {
209
+ try {
210
+ d.dispose();
211
+ }
212
+ catch (error) {
213
+ errors.push({ instance, error: error });
214
+ }
215
+ }
216
+ }
217
+ return errors;
218
+ }
@@ -20,14 +20,27 @@ export type ProviderAngularLikeDef<T = unknown> = {
20
20
  provide?: Token<T>;
21
21
  multi?: boolean;
22
22
  deps?: Token[];
23
- useClass?: Type<T>;
24
23
  useExisting?: Token<T>;
25
24
  useValue?: T;
26
25
  useFactory?: FuncArgs<T>;
27
26
  };
28
- export type Provider<T = unknown> = Type<T> | ProviderCoreDef<T> | ProviderAngularLikeDef<T>;
27
+ export type Provider<T = unknown> = Type<T> | ProviderCoreDef<T> | ProviderAngularLikeDef<T> | ProviderClassDef<T>;
29
28
  export type DIModuleDef = {
30
29
  name?: string;
31
30
  imports?: DIModuleDef[];
32
31
  providers?: Provider[];
33
32
  };
33
+ type Ctor<R = any, A extends any[] = any[]> = abstract new (...args: A) => R;
34
+ type TokenFor<P> = Ctor<P, any[]>;
35
+ type DepsFor<C extends Ctor> = {
36
+ [K in keyof ConstructorParameters<C>]: TokenFor<ConstructorParameters<C>[K]>;
37
+ } & {
38
+ length: ConstructorParameters<C>["length"];
39
+ };
40
+ export type ProviderClassDef<T = unknown, C extends Ctor<T> = Ctor<T>> = {
41
+ useClass: C;
42
+ deps?: ConstructorParameters<C> extends [] ? never : DepsFor<C>;
43
+ };
44
+ export declare class NoDeps {
45
+ }
46
+ export {};
package/dist/es/types.js CHANGED
@@ -7,3 +7,5 @@ export class InjectionToken {
7
7
  this.factory = factory;
8
8
  }
9
9
  }
10
+ export class NoDeps {
11
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@art-ws/di",
3
- "version": "2.0.25",
3
+ "version": "2.0.27",
4
4
  "description": "Dependency injection for TypeScript",
5
5
  "license": "UNLICENSED",
6
6
  "author": "art-ws Team",