@tsed/di 7.0.0-beta.2 → 7.0.0-beta.20
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/coverage.json +6 -0
- package/jest.config.js +9 -0
- package/lib/cjs/constants/{index.js → constants.js} +1 -1
- package/lib/cjs/constants/constants.js.map +1 -0
- package/lib/cjs/decorators/constant.js +1 -1
- package/lib/cjs/decorators/constant.js.map +1 -1
- package/lib/cjs/decorators/controller.js.map +1 -1
- package/lib/cjs/decorators/inject.js +27 -2
- package/lib/cjs/decorators/inject.js.map +1 -1
- package/lib/cjs/decorators/injectable.js +0 -2
- package/lib/cjs/decorators/injectable.js.map +1 -1
- package/lib/cjs/decorators/intercept.js +20 -12
- package/lib/cjs/decorators/intercept.js.map +1 -1
- package/lib/cjs/decorators/module.js +4 -3
- package/lib/cjs/decorators/module.js.map +1 -1
- package/lib/cjs/decorators/opts.js +1 -1
- package/lib/cjs/decorators/opts.js.map +1 -1
- package/lib/cjs/decorators/useOpts.js +1 -1
- package/lib/cjs/decorators/useOpts.js.map +1 -1
- package/lib/cjs/decorators/value.js +1 -1
- package/lib/cjs/decorators/value.js.map +1 -1
- package/lib/cjs/domain/Container.js +1 -2
- package/lib/cjs/domain/Container.js.map +1 -1
- package/lib/cjs/domain/ContextLogger.js +41 -30
- package/lib/cjs/domain/ContextLogger.js.map +1 -1
- package/lib/cjs/domain/ControllerProvider.js +37 -0
- package/lib/cjs/domain/ControllerProvider.js.map +1 -0
- package/lib/cjs/domain/DIContext.js +86 -30
- package/lib/cjs/domain/DIContext.js.map +1 -1
- package/lib/cjs/domain/LocalsContainer.js +3 -46
- package/lib/cjs/domain/LocalsContainer.js.map +1 -1
- package/lib/cjs/domain/Provider.js +20 -1
- package/lib/cjs/domain/Provider.js.map +1 -1
- package/lib/cjs/errors/InjectionError.js +3 -2
- package/lib/cjs/errors/InjectionError.js.map +1 -1
- package/lib/cjs/errors/UndefinedTokenError.js +1 -1
- package/lib/cjs/errors/UndefinedTokenError.js.map +1 -1
- package/lib/cjs/index.js +60 -17
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces/AlterRunInContext.js +3 -0
- package/lib/cjs/interfaces/AlterRunInContext.js.map +1 -0
- package/lib/cjs/interfaces/DIConfigurationOptions.js.map +1 -1
- package/lib/cjs/interfaces/DILoggerOptions.js +3 -0
- package/lib/cjs/interfaces/DILoggerOptions.js.map +1 -0
- package/lib/cjs/interfaces/InjectableProperties.js.map +1 -1
- package/lib/cjs/interfaces/InterceptorMethods.js.map +1 -1
- package/lib/cjs/interfaces/ProviderOpts.js +3 -0
- package/lib/cjs/interfaces/ProviderOpts.js.map +1 -0
- package/lib/cjs/interfaces/RegistrySettings.js.map +1 -1
- package/lib/cjs/interfaces/TokenProvider.js.map +1 -1
- package/lib/cjs/interfaces/{IProvider.js → TokenRoute.js} +1 -1
- package/lib/cjs/interfaces/TokenRoute.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/registries/GlobalProviders.js +7 -12
- package/lib/cjs/registries/GlobalProviders.js.map +1 -1
- package/lib/cjs/registries/ProviderRegistry.js +8 -7
- package/lib/cjs/registries/ProviderRegistry.js.map +1 -1
- package/lib/cjs/services/DIConfiguration.js +56 -43
- package/lib/cjs/services/DIConfiguration.js.map +1 -1
- package/lib/cjs/services/DITest.js +13 -6
- package/lib/cjs/services/DITest.js.map +1 -1
- package/lib/cjs/services/InjectorService.js +115 -113
- package/lib/cjs/services/InjectorService.js.map +1 -1
- package/lib/cjs/utils/asyncHookContext.js +42 -0
- package/lib/cjs/utils/asyncHookContext.js.map +1 -0
- package/lib/cjs/utils/getConfiguration.js +13 -10
- package/lib/cjs/utils/getConfiguration.js.map +1 -1
- package/lib/cjs/utils/resolveControllers.js +47 -0
- package/lib/cjs/utils/resolveControllers.js.map +1 -0
- package/lib/cjs/utils/setLoggerConfiguration.js +11 -0
- package/lib/cjs/utils/setLoggerConfiguration.js.map +1 -0
- package/lib/cjs/utils/setLoggerFormat.js +33 -0
- package/lib/cjs/utils/setLoggerFormat.js.map +1 -0
- package/lib/cjs/utils/setLoggerLevel.js +1 -2
- package/lib/cjs/utils/setLoggerLevel.js.map +1 -1
- package/lib/esm/constants/{index.js → constants.js} +1 -1
- package/lib/esm/constants/constants.js.map +1 -0
- package/lib/esm/decorators/configuration.js +1 -1
- package/lib/esm/decorators/constant.js +2 -2
- package/lib/esm/decorators/constant.js.map +1 -1
- package/lib/esm/decorators/controller.js +1 -1
- package/lib/esm/decorators/controller.js.map +1 -1
- package/lib/esm/decorators/inject.js +25 -1
- package/lib/esm/decorators/inject.js.map +1 -1
- package/lib/esm/decorators/injectable.js +1 -3
- package/lib/esm/decorators/injectable.js.map +1 -1
- package/lib/esm/decorators/intercept.js +21 -13
- package/lib/esm/decorators/intercept.js.map +1 -1
- package/lib/esm/decorators/interceptor.js +2 -2
- package/lib/esm/decorators/lazyInject.js +1 -1
- package/lib/esm/decorators/module.js +4 -3
- package/lib/esm/decorators/module.js.map +1 -1
- package/lib/esm/decorators/opts.js +4 -4
- package/lib/esm/decorators/opts.js.map +1 -1
- package/lib/esm/decorators/overrideProvider.js +1 -1
- package/lib/esm/decorators/scope.js +1 -1
- package/lib/esm/decorators/service.js +1 -1
- package/lib/esm/decorators/useOpts.js +1 -1
- package/lib/esm/decorators/useOpts.js.map +1 -1
- package/lib/esm/decorators/value.js +2 -2
- package/lib/esm/decorators/value.js.map +1 -1
- package/lib/esm/domain/Container.js +3 -4
- package/lib/esm/domain/Container.js.map +1 -1
- package/lib/esm/domain/ContextLogger.js +41 -30
- package/lib/esm/domain/ContextLogger.js.map +1 -1
- package/lib/esm/domain/ControllerProvider.js +33 -0
- package/lib/esm/domain/ControllerProvider.js.map +1 -0
- package/lib/esm/domain/DIContext.js +88 -32
- package/lib/esm/domain/DIContext.js.map +1 -1
- package/lib/esm/domain/LocalsContainer.js +3 -46
- package/lib/esm/domain/LocalsContainer.js.map +1 -1
- package/lib/esm/domain/Provider.js +23 -4
- package/lib/esm/domain/Provider.js.map +1 -1
- package/lib/esm/errors/InjectionError.js +4 -3
- package/lib/esm/errors/InjectionError.js.map +1 -1
- package/lib/esm/errors/UndefinedTokenError.js +1 -1
- package/lib/esm/errors/UndefinedTokenError.js.map +1 -1
- package/lib/esm/index.js +60 -17
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/interfaces/AlterRunInContext.js +2 -0
- package/lib/esm/interfaces/AlterRunInContext.js.map +1 -0
- package/lib/esm/interfaces/DIConfigurationOptions.js.map +1 -1
- package/lib/esm/interfaces/DILoggerOptions.js +2 -0
- package/lib/esm/interfaces/DILoggerOptions.js.map +1 -0
- package/lib/esm/interfaces/InjectableProperties.js.map +1 -1
- package/lib/esm/interfaces/InterceptorMethods.js.map +1 -1
- package/lib/esm/interfaces/ProviderOpts.js +2 -0
- package/lib/esm/interfaces/ProviderOpts.js.map +1 -0
- package/lib/esm/interfaces/RegistrySettings.js.map +1 -1
- package/lib/esm/interfaces/TokenProvider.js.map +1 -1
- package/lib/esm/interfaces/TokenRoute.js +2 -0
- package/lib/esm/interfaces/TokenRoute.js.map +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/registries/GlobalProviders.js +9 -14
- package/lib/esm/registries/GlobalProviders.js.map +1 -1
- package/lib/esm/registries/ProviderRegistry.js +6 -5
- package/lib/esm/registries/ProviderRegistry.js.map +1 -1
- package/lib/esm/services/DIConfiguration.js +57 -44
- package/lib/esm/services/DIConfiguration.js.map +1 -1
- package/lib/esm/services/DILogger.js +2 -2
- package/lib/esm/services/DITest.js +16 -9
- package/lib/esm/services/DITest.js.map +1 -1
- package/lib/esm/services/InjectorService.js +116 -114
- package/lib/esm/services/InjectorService.js.map +1 -1
- package/lib/esm/utils/asyncHookContext.js +33 -0
- package/lib/esm/utils/asyncHookContext.js.map +1 -0
- package/lib/esm/utils/createContainer.js +2 -2
- package/lib/esm/utils/getConfiguration.js +12 -10
- package/lib/esm/utils/getConfiguration.js.map +1 -1
- package/lib/esm/utils/resolveControllers.js +42 -0
- package/lib/esm/utils/resolveControllers.js.map +1 -0
- package/lib/esm/utils/setLoggerConfiguration.js +7 -0
- package/lib/esm/utils/setLoggerConfiguration.js.map +1 -0
- package/lib/esm/utils/setLoggerFormat.js +29 -0
- package/lib/esm/utils/setLoggerFormat.js.map +1 -0
- package/lib/esm/utils/setLoggerLevel.js +1 -2
- package/lib/esm/utils/setLoggerLevel.js.map +1 -1
- package/lib/types/constants/{index.d.ts → constants.d.ts} +0 -0
- package/lib/types/decorators/controller.d.ts +2 -3
- package/lib/types/decorators/inject.d.ts +15 -0
- package/lib/types/decorators/injectable.d.ts +2 -4
- package/lib/types/decorators/intercept.d.ts +2 -2
- package/lib/types/decorators/module.d.ts +3 -2
- package/lib/types/domain/Container.d.ts +3 -3
- package/lib/types/domain/ContextLogger.d.ts +13 -18
- package/lib/types/domain/ControllerProvider.d.ts +17 -0
- package/lib/types/domain/DIContext.d.ts +23 -35
- package/lib/types/domain/LocalsContainer.d.ts +3 -22
- package/lib/types/domain/Provider.d.ts +5 -6
- package/lib/types/errors/InjectionError.d.ts +1 -1
- package/lib/types/index.d.ts +54 -11
- package/lib/types/interfaces/AlterRunInContext.d.ts +3 -0
- package/lib/types/interfaces/DIConfigurationOptions.d.ts +5 -2
- package/lib/types/interfaces/DILoggerOptions.d.ts +44 -0
- package/lib/types/interfaces/InjectableProperties.d.ts +2 -1
- package/lib/types/interfaces/InterceptorMethods.d.ts +1 -1
- package/lib/types/interfaces/{IProvider.d.ts → ProviderOpts.d.ts} +5 -4
- package/lib/types/interfaces/RegistrySettings.d.ts +1 -1
- package/lib/types/interfaces/TokenProvider.d.ts +1 -1
- package/lib/types/interfaces/TokenRoute.d.ts +5 -0
- package/lib/types/registries/GlobalProviders.d.ts +9 -6
- package/lib/types/registries/ProviderRegistry.d.ts +5 -4
- package/lib/types/services/DIConfiguration.d.ts +21 -12
- package/lib/types/services/DITest.d.ts +2 -0
- package/lib/types/services/InjectorService.d.ts +28 -34
- package/lib/types/utils/asyncHookContext.d.ts +14 -0
- package/lib/types/utils/getConfiguration.d.ts +1 -0
- package/lib/types/utils/resolveControllers.d.ts +12 -0
- package/lib/types/utils/setLoggerConfiguration.d.ts +2 -0
- package/lib/types/utils/setLoggerFormat.d.ts +6 -0
- package/lib/types/utils/setLoggerLevel.d.ts +1 -1
- package/package.json +29 -10
- package/readme.md +40 -43
- package/tsconfig.compile.esm.json +1 -0
- package/lib/cjs/constants/index.js.map +0 -1
- package/lib/cjs/decorators/index.js +0 -19
- package/lib/cjs/decorators/index.js.map +0 -1
- package/lib/cjs/domain/index.js +0 -12
- package/lib/cjs/domain/index.js.map +0 -1
- package/lib/cjs/interfaces/IProvider.js.map +0 -1
- package/lib/cjs/interfaces/index.js +0 -18
- package/lib/cjs/interfaces/index.js.map +0 -1
- package/lib/cjs/utils/data/Test1.js +0 -8
- package/lib/cjs/utils/data/Test1.js.map +0 -1
- package/lib/cjs/utils/data/Test2.js +0 -8
- package/lib/cjs/utils/data/Test2.js.map +0 -1
- package/lib/esm/constants/index.js.map +0 -1
- package/lib/esm/decorators/index.js +0 -16
- package/lib/esm/decorators/index.js.map +0 -1
- package/lib/esm/domain/index.js +0 -9
- package/lib/esm/domain/index.js.map +0 -1
- package/lib/esm/interfaces/IProvider.js +0 -2
- package/lib/esm/interfaces/IProvider.js.map +0 -1
- package/lib/esm/interfaces/index.js +0 -15
- package/lib/esm/interfaces/index.js.map +0 -1
- package/lib/esm/utils/data/Test1.js +0 -4
- package/lib/esm/utils/data/Test1.js.map +0 -1
- package/lib/esm/utils/data/Test2.js +0 -4
- package/lib/esm/utils/data/Test2.js.map +0 -1
- package/lib/types/decorators/index.d.ts +0 -15
- package/lib/types/domain/index.d.ts +0 -8
- package/lib/types/interfaces/index.d.ts +0 -14
- package/lib/types/utils/data/Test1.d.ts +0 -3
- package/lib/types/utils/data/Test2.d.ts +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DITest.js","sourceRoot":"","sources":["../../../src/services/DITest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAE,QAAQ,EAAC,MAAM,YAAY,CAAC;AACzC,OAAO,EAAC,IAAI,EAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAG1D,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"DITest.js","sourceRoot":"","sources":["../../../src/services/DITest.ts"],"names":[],"mappings":"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","sourcesContent":["import {Env, getValue} from \"@tsed/core\";\nimport {$log} from \"@tsed/logger\";\nimport {createContainer} from \"../utils/createContainer\";\nimport {LocalsContainer} from \"../domain/LocalsContainer\";\nimport {OnInit} from \"../interfaces/OnInit\";\nimport {TokenProvider} from \"../interfaces/TokenProvider\";\nimport {setLoggerConfiguration} from \"../utils/setLoggerConfiguration\";\nimport {setLoggerLevel} from \"../utils/setLoggerLevel\";\nimport {InjectorService} from \"./InjectorService\";\nimport {DIContext} from \"../domain/DIContext\";\n\nexport interface DITestInvokeOptions {\n token?: TokenProvider;\n use: any;\n}\n\nexport interface DITestOptions extends Partial<TsED.Configuration> {\n imports?: DITestInvokeOptions[];\n}\n\n/**\n * Tool to run test with lightweight DI sandbox.\n */\nexport class DITest {\n protected static _injector: InjectorService | null = null;\n\n static get injector(): InjectorService {\n if (DITest._injector) {\n return DITest._injector!;\n }\n\n /* istanbul ignore next */\n throw new Error(\n \"PlatformTest.injector is not initialized. Use PlatformTest.create(): Promise before PlatformTest.invoke() or PlatformTest.injector.\\n\" +\n \"Example:\\n\" +\n \"before(async () => {\\n\" +\n \" await PlatformTest.create()\\n\" +\n \" await PlatformTest.invoke(MyService, [])\\n\" +\n \"})\"\n );\n }\n\n static set injector(injector: InjectorService) {\n DITest._injector = injector;\n }\n\n static hasInjector() {\n return !!DITest._injector;\n }\n\n static async create(settings: DITestOptions = {}) {\n DITest.injector = DITest.createInjector(settings);\n\n await DITest.createContainer(settings);\n }\n\n static async createContainer(settings: DITestOptions = {}) {\n const container = createContainer();\n\n settings.imports?.forEach(({token, use}) => {\n container.addProvider(token, {\n useValue: use\n });\n });\n\n await DITest.injector.load(container);\n }\n\n /**\n * Create a new injector with the right default services\n */\n static createInjector(settings: any = {}): InjectorService {\n const injector = new InjectorService();\n injector.logger = $log;\n\n // @ts-ignore\n injector.settings.set(DITest.configure(settings));\n\n setLoggerConfiguration(injector);\n\n return injector;\n }\n\n /**\n * Resets the test injector of the test context, so it won't pollute your next test. Call this in your `tearDown` logic.\n */\n static async reset() {\n if (DITest.hasInjector()) {\n await DITest.injector.destroy();\n DITest._injector = null;\n }\n }\n\n /**\n * Invoke a provider and return a fresh instance\n * @param target\n * @param providers\n */\n static invoke<T = any>(target: TokenProvider, providers: DITestInvokeOptions[] = []): T | Promise<T> {\n const locals = new LocalsContainer();\n providers.forEach((p) => {\n locals.set(p.token, p.use);\n });\n\n locals.set(InjectorService, DITest.injector);\n\n const instance: OnInit = DITest.injector.invoke(target, locals, {rebuild: true});\n\n if (instance && instance.$onInit) {\n // await instance.$onInit();\n const result = instance.$onInit();\n if (result instanceof Promise) {\n return result.then(() => instance as any);\n }\n }\n\n return instance as any;\n }\n\n /**\n * Return the instance from injector registry\n * @param target\n * @param options\n */\n static get<T = any>(target: TokenProvider, options: any = {}): T {\n return DITest.injector.get<T>(target, options)!;\n }\n\n static createDIContext() {\n return new DIContext({\n id: \"id\",\n injector: DITest.injector,\n logger: DITest.injector.logger\n });\n }\n\n protected static configure(settings: Partial<TsED.Configuration> = {}): Partial<TsED.Configuration> {\n return {\n ...settings,\n env: getValue(settings, \"env\", Env.TEST),\n logger: {\n ...getValue(settings, \"logger\", {}),\n level: getValue(settings, \"logger.level\", \"off\")\n }\n };\n }\n}\n"]}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
var _InjectorService_cache;
|
|
2
1
|
var InjectorService_1;
|
|
3
|
-
import {
|
|
4
|
-
import { ancestorsOf, catchError, classOf, deepClone, deepMerge, isClass, isFunction, isInheritedFrom, Metadata, nameOf, prototypeOf, Store } from "@tsed/core";
|
|
5
|
-
import { DI_PARAM_OPTIONS, INJECTABLE_PROP } from "../constants";
|
|
6
|
-
import { Configuration } from "../decorators/configuration";
|
|
7
|
-
import { Injectable } from "../decorators/injectable";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { LocalsContainer } from "../domain/LocalsContainer";
|
|
11
|
-
import { Provider } from "../domain/Provider";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
2
|
+
import { __decorate, __metadata } from "tslib";
|
|
3
|
+
import { ancestorsOf, catchError, classOf, deepClone, deepMerge, Hooks, isClass, isFunction, isInheritedFrom, Metadata, nameOf, prototypeOf, Store } from "@tsed/core";
|
|
4
|
+
import { DI_PARAM_OPTIONS, INJECTABLE_PROP } from "../constants/constants.js";
|
|
5
|
+
import { Configuration } from "../decorators/configuration.js";
|
|
6
|
+
import { Injectable } from "../decorators/injectable.js";
|
|
7
|
+
import { Container } from "../domain/Container.js";
|
|
8
|
+
import { InjectablePropertyType } from "../domain/InjectablePropertyType.js";
|
|
9
|
+
import { LocalsContainer } from "../domain/LocalsContainer.js";
|
|
10
|
+
import { Provider } from "../domain/Provider.js";
|
|
11
|
+
import { ProviderScope } from "../domain/ProviderScope.js";
|
|
12
|
+
import { InjectionError } from "../errors/InjectionError.js";
|
|
13
|
+
import { UndefinedTokenError } from "../errors/UndefinedTokenError.js";
|
|
14
|
+
import { GlobalProviders } from "../registries/GlobalProviders.js";
|
|
15
|
+
import { createContainer } from "../utils/createContainer.js";
|
|
16
|
+
import { resolveControllers } from "../utils/resolveControllers.js";
|
|
17
|
+
import { DIConfiguration } from "./DIConfiguration.js";
|
|
17
18
|
/**
|
|
18
19
|
* This service contain all services collected by `@Service` or services declared manually with `InjectorService.factory()` or `InjectorService.service()`.
|
|
19
20
|
*
|
|
@@ -27,7 +28,7 @@ import { DIConfiguration } from "./DIConfiguration";
|
|
|
27
28
|
* import MyService2 from "./services/service2";
|
|
28
29
|
* import MyService3 from "./services/service3";
|
|
29
30
|
*
|
|
30
|
-
* // When all services
|
|
31
|
+
* // When all services are imported, you can load InjectorService.
|
|
31
32
|
* const injector = new InjectorService()
|
|
32
33
|
*
|
|
33
34
|
* await injector.load();
|
|
@@ -36,13 +37,14 @@ import { DIConfiguration } from "./DIConfiguration";
|
|
|
36
37
|
* ```
|
|
37
38
|
*/
|
|
38
39
|
let InjectorService = InjectorService_1 = class InjectorService extends Container {
|
|
40
|
+
settings = new DIConfiguration();
|
|
41
|
+
logger = console;
|
|
42
|
+
resolvedConfiguration = false;
|
|
43
|
+
#cache = new LocalsContainer();
|
|
44
|
+
#hooks = new Hooks();
|
|
39
45
|
constructor() {
|
|
40
46
|
super();
|
|
41
|
-
this.
|
|
42
|
-
this.logger = console;
|
|
43
|
-
this.resolvedConfiguration = false;
|
|
44
|
-
_InjectorService_cache.set(this, new LocalsContainer());
|
|
45
|
-
__classPrivateFieldGet(this, _InjectorService_cache, "f").set(InjectorService_1, this);
|
|
47
|
+
this.#cache.set(InjectorService_1, this);
|
|
46
48
|
}
|
|
47
49
|
get resolvers() {
|
|
48
50
|
return this.settings.resolvers;
|
|
@@ -57,26 +59,11 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
57
59
|
scopeOf(provider) {
|
|
58
60
|
return provider.scope || this.scopes[provider.type] || ProviderScope.SINGLETON;
|
|
59
61
|
}
|
|
60
|
-
/**
|
|
61
|
-
* Clone a provider from GlobalProviders and the given token. forkProvider method build automatically the provider if the instance parameter ins't given.
|
|
62
|
-
* @param token
|
|
63
|
-
* @param settings
|
|
64
|
-
* @deprecated
|
|
65
|
-
*/
|
|
66
|
-
forkProvider(token, settings = {}) {
|
|
67
|
-
if (!this.hasProvider(token)) {
|
|
68
|
-
this.addProvider(token);
|
|
69
|
-
}
|
|
70
|
-
const provider = this.getProvider(token);
|
|
71
|
-
Object.assign(provider, settings);
|
|
72
|
-
__classPrivateFieldGet(this, _InjectorService_cache, "f").set(token, this.invoke(token));
|
|
73
|
-
return provider;
|
|
74
|
-
}
|
|
75
62
|
/**
|
|
76
63
|
* Return a list of instance build by the injector.
|
|
77
64
|
*/
|
|
78
65
|
toArray() {
|
|
79
|
-
return
|
|
66
|
+
return [...this.#cache.values()];
|
|
80
67
|
}
|
|
81
68
|
/**
|
|
82
69
|
* Get a service or factory already constructed from his symbol or class.
|
|
@@ -112,13 +99,22 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
112
99
|
}
|
|
113
100
|
}
|
|
114
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Return all instance of the same provider type
|
|
104
|
+
* @param type
|
|
105
|
+
*/
|
|
106
|
+
getAll(type) {
|
|
107
|
+
return this.getProviders(type).map((provider) => {
|
|
108
|
+
return this.get(provider.token);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
115
111
|
/**
|
|
116
112
|
* The has() method returns a boolean indicating whether an element with the specified key exists or not.
|
|
117
113
|
* @returns {boolean}
|
|
118
114
|
* @param token
|
|
119
115
|
*/
|
|
120
116
|
has(token) {
|
|
121
|
-
return
|
|
117
|
+
return this.#cache.get(token) !== undefined;
|
|
122
118
|
}
|
|
123
119
|
/**
|
|
124
120
|
* Invoke the class and inject all services that required by the class constructor.
|
|
@@ -141,73 +137,73 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
141
137
|
* @param options
|
|
142
138
|
* @returns {T} The class constructed.
|
|
143
139
|
*/
|
|
144
|
-
invoke(token, locals
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
140
|
+
invoke(token, locals, options = {}) {
|
|
141
|
+
let instance = locals ? locals.get(token) : undefined;
|
|
142
|
+
if (instance !== undefined) {
|
|
143
|
+
return instance;
|
|
144
|
+
}
|
|
145
|
+
if (token === Configuration) {
|
|
146
|
+
return this.settings;
|
|
147
|
+
}
|
|
148
|
+
instance = !options.rebuild ? this.getInstance(token) : undefined;
|
|
149
|
+
if (instance != undefined) {
|
|
150
|
+
return instance;
|
|
150
151
|
}
|
|
151
152
|
if (token === DI_PARAM_OPTIONS) {
|
|
152
153
|
return {};
|
|
153
154
|
}
|
|
155
|
+
const provider = this.ensureProvider(token);
|
|
154
156
|
if (!provider || options.rebuild) {
|
|
155
157
|
instance = this.resolve(token, locals, options);
|
|
156
158
|
if (this.hasProvider(token)) {
|
|
157
|
-
|
|
159
|
+
this.#cache.set(token, instance);
|
|
158
160
|
}
|
|
159
161
|
return instance;
|
|
160
162
|
}
|
|
163
|
+
instance = this.resolve(token, locals, options);
|
|
161
164
|
switch (this.scopeOf(provider)) {
|
|
162
165
|
case ProviderScope.SINGLETON:
|
|
163
|
-
if (!
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
166
|
+
if (provider.hooks && !options.rebuild) {
|
|
167
|
+
this.registerHooks(provider, instance);
|
|
168
|
+
}
|
|
169
|
+
if (!provider.isAsync()) {
|
|
170
|
+
this.#cache.set(token, instance);
|
|
171
|
+
return instance;
|
|
170
172
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
+
// store promise to lock token in cache
|
|
174
|
+
this.#cache.set(token, instance);
|
|
175
|
+
instance = instance.then((instance) => {
|
|
176
|
+
this.#cache.set(token, instance);
|
|
177
|
+
return instance;
|
|
178
|
+
});
|
|
179
|
+
return instance;
|
|
173
180
|
case ProviderScope.REQUEST:
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
181
|
+
if (locals) {
|
|
182
|
+
locals.set(token, instance);
|
|
183
|
+
if (provider.hooks && provider.hooks.$onDestroy) {
|
|
184
|
+
locals.hooks.on("$onDestroy", (...args) => provider.hooks.$onDestroy(instance, ...args));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return instance;
|
|
180
188
|
}
|
|
181
189
|
return instance;
|
|
182
190
|
}
|
|
183
191
|
/**
|
|
184
192
|
* Build only providers which are asynchronous.
|
|
185
193
|
*/
|
|
186
|
-
async loadAsync(
|
|
194
|
+
async loadAsync() {
|
|
187
195
|
for (const [, provider] of this) {
|
|
188
|
-
if (!
|
|
189
|
-
|
|
190
|
-
await this.invoke(provider.token, locals);
|
|
191
|
-
}
|
|
192
|
-
const instance = __classPrivateFieldGet(this, _InjectorService_cache, "f").get(provider.token);
|
|
193
|
-
if (instance !== undefined) {
|
|
194
|
-
locals.set(provider.token, instance);
|
|
195
|
-
}
|
|
196
|
+
if (!this.has(provider.token) && provider.isAsync()) {
|
|
197
|
+
await this.invoke(provider.token);
|
|
196
198
|
}
|
|
197
199
|
}
|
|
198
|
-
return locals;
|
|
199
200
|
}
|
|
200
|
-
loadSync(
|
|
201
|
+
loadSync() {
|
|
201
202
|
for (const [, provider] of this) {
|
|
202
|
-
if (!
|
|
203
|
-
this.invoke(provider.token
|
|
204
|
-
}
|
|
205
|
-
const instance = __classPrivateFieldGet(this, _InjectorService_cache, "f").get(provider.token);
|
|
206
|
-
if (instance !== undefined) {
|
|
207
|
-
locals.set(provider.token, instance);
|
|
203
|
+
if (!this.has(provider.token) && this.scopeOf(provider) === ProviderScope.SINGLETON) {
|
|
204
|
+
this.invoke(provider.token);
|
|
208
205
|
}
|
|
209
206
|
}
|
|
210
|
-
return locals;
|
|
211
207
|
}
|
|
212
208
|
/**
|
|
213
209
|
* Boostrap injector from container and resolve configuration.
|
|
@@ -221,24 +217,33 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
221
217
|
this.resolveConfiguration();
|
|
222
218
|
return this;
|
|
223
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Load injector from a given module
|
|
222
|
+
* @param rootModule
|
|
223
|
+
*/
|
|
224
|
+
loadModule(rootModule) {
|
|
225
|
+
this.settings.routes = this.settings.routes.concat(resolveControllers(this.settings));
|
|
226
|
+
const container = createContainer();
|
|
227
|
+
container.delete(rootModule);
|
|
228
|
+
container.addProvider(rootModule, {
|
|
229
|
+
type: "server:module",
|
|
230
|
+
scope: ProviderScope.SINGLETON
|
|
231
|
+
});
|
|
232
|
+
return this.load(container);
|
|
233
|
+
}
|
|
224
234
|
/**
|
|
225
235
|
* Build all providers from given container (or GlobalProviders) and emit `$onInit` event.
|
|
226
236
|
*
|
|
227
237
|
* @param container
|
|
228
|
-
* @param rootModule
|
|
229
238
|
*/
|
|
230
|
-
async load(container = createContainer()
|
|
239
|
+
async load(container = createContainer()) {
|
|
231
240
|
this.bootstrap(container);
|
|
232
241
|
// build async and sync provider
|
|
233
|
-
|
|
234
|
-
if (rootModule) {
|
|
235
|
-
await this.invoke(rootModule);
|
|
236
|
-
}
|
|
242
|
+
await this.loadAsync();
|
|
237
243
|
// load sync provider
|
|
238
|
-
|
|
239
|
-
await
|
|
240
|
-
await
|
|
241
|
-
return locals;
|
|
244
|
+
this.loadSync();
|
|
245
|
+
await this.emit("$beforeInit");
|
|
246
|
+
await this.emit("$onInit");
|
|
242
247
|
}
|
|
243
248
|
/**
|
|
244
249
|
* Load all configurations registered on providers
|
|
@@ -251,18 +256,19 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
251
256
|
super.forEach((provider) => {
|
|
252
257
|
if (provider.configuration && provider.type !== "server:module") {
|
|
253
258
|
Object.entries(provider.configuration).forEach(([key, value]) => {
|
|
254
|
-
|
|
255
|
-
|
|
259
|
+
if (!["resolvers", "mount", "imports"].includes(key)) {
|
|
260
|
+
value = mergedConfiguration.has(key) ? deepMerge(mergedConfiguration.get(key), value) : deepClone(value);
|
|
261
|
+
mergedConfiguration.set(key, value);
|
|
262
|
+
}
|
|
256
263
|
});
|
|
257
264
|
}
|
|
258
265
|
if (provider.resolvers) {
|
|
259
|
-
this.resolvers.
|
|
266
|
+
this.settings.resolvers = this.settings.resolvers.concat(provider.resolvers);
|
|
260
267
|
}
|
|
261
268
|
});
|
|
262
269
|
mergedConfiguration.forEach((value, key) => {
|
|
263
|
-
this.settings
|
|
270
|
+
this.settings.set(key, deepMerge(value, this.settings.get(key)));
|
|
264
271
|
});
|
|
265
|
-
this.settings.build();
|
|
266
272
|
this.resolvedConfiguration = true;
|
|
267
273
|
}
|
|
268
274
|
/**
|
|
@@ -300,7 +306,6 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
300
306
|
});
|
|
301
307
|
}
|
|
302
308
|
/**
|
|
303
|
-
*
|
|
304
309
|
* @param instance
|
|
305
310
|
* @param {string} propertyKey
|
|
306
311
|
*/
|
|
@@ -400,20 +405,11 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
400
405
|
}, next);
|
|
401
406
|
};
|
|
402
407
|
}
|
|
403
|
-
/**
|
|
404
|
-
* Allow handler hack for AsyncHookContext plugin.
|
|
405
|
-
* @param ctx
|
|
406
|
-
* @param cb
|
|
407
|
-
* @protected
|
|
408
|
-
*/
|
|
409
|
-
runInContext(ctx, cb) {
|
|
410
|
-
return cb();
|
|
411
|
-
}
|
|
412
408
|
async lazyInvoke(token) {
|
|
413
409
|
let instance = this.getInstance(token);
|
|
414
410
|
if (!instance) {
|
|
415
411
|
instance = await this.invoke(token);
|
|
416
|
-
if (isFunction(instance
|
|
412
|
+
if (isFunction(instance?.$onInit)) {
|
|
417
413
|
await instance.$onInit();
|
|
418
414
|
}
|
|
419
415
|
}
|
|
@@ -422,11 +418,11 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
422
418
|
/**
|
|
423
419
|
* Emit an event to all service. See service [lifecycle hooks](/docs/services.md#lifecycle-hooks).
|
|
424
420
|
* @param eventName The event name to emit at all services.
|
|
425
|
-
* @param args List of the parameters to give to each
|
|
421
|
+
* @param args List of the parameters to give to each service.
|
|
426
422
|
* @returns {Promise<any[]>} A list of promises.
|
|
427
423
|
*/
|
|
428
424
|
async emit(eventName, ...args) {
|
|
429
|
-
return
|
|
425
|
+
return this.#hooks.asyncEmit(eventName, args);
|
|
430
426
|
}
|
|
431
427
|
/**
|
|
432
428
|
* @param eventName
|
|
@@ -434,7 +430,7 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
434
430
|
* @param args
|
|
435
431
|
*/
|
|
436
432
|
alter(eventName, value, ...args) {
|
|
437
|
-
return
|
|
433
|
+
return this.#hooks.alter(eventName, value, args);
|
|
438
434
|
}
|
|
439
435
|
/**
|
|
440
436
|
* @param eventName
|
|
@@ -442,10 +438,10 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
442
438
|
* @param args
|
|
443
439
|
*/
|
|
444
440
|
async alterAsync(eventName, value, ...args) {
|
|
445
|
-
return
|
|
441
|
+
return this.#hooks.asyncAlter(eventName, value, args);
|
|
446
442
|
}
|
|
447
443
|
async destroy() {
|
|
448
|
-
await
|
|
444
|
+
await this.emit("$onDestroy");
|
|
449
445
|
}
|
|
450
446
|
ensureProvider(token) {
|
|
451
447
|
if (!this.hasProvider(token) && GlobalProviders.has(token)) {
|
|
@@ -454,7 +450,7 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
454
450
|
return this.getProvider(token);
|
|
455
451
|
}
|
|
456
452
|
getInstance(token) {
|
|
457
|
-
return
|
|
453
|
+
return this.#cache.get(token);
|
|
458
454
|
}
|
|
459
455
|
/**
|
|
460
456
|
* Invoke a class method and inject service.
|
|
@@ -473,7 +469,7 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
473
469
|
* @param options
|
|
474
470
|
* @private
|
|
475
471
|
*/
|
|
476
|
-
resolve(target, locals, options = {}) {
|
|
472
|
+
resolve(target, locals = new LocalsContainer(), options = {}) {
|
|
477
473
|
const resolvedOpts = this.mapInvokeOptions(target, locals, options);
|
|
478
474
|
const { token, deps, construct, imports, provider } = resolvedOpts;
|
|
479
475
|
if (provider) {
|
|
@@ -483,10 +479,9 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
483
479
|
let currentDependency = false;
|
|
484
480
|
try {
|
|
485
481
|
const invokeDependency = (parent) => (token, index) => {
|
|
486
|
-
var _a;
|
|
487
482
|
currentDependency = { token, index, deps };
|
|
488
483
|
if (token !== DI_PARAM_OPTIONS) {
|
|
489
|
-
const options =
|
|
484
|
+
const options = provider?.store?.get(`${DI_PARAM_OPTIONS}:${index}`);
|
|
490
485
|
locals.set(DI_PARAM_OPTIONS, options || {});
|
|
491
486
|
}
|
|
492
487
|
return isInheritedFrom(token, Provider, 1) ? provider : this.invoke(token, locals, { parent });
|
|
@@ -565,8 +560,15 @@ let InjectorService = InjectorService_1 = class InjectorService extends Containe
|
|
|
565
560
|
provider
|
|
566
561
|
};
|
|
567
562
|
}
|
|
563
|
+
registerHooks(provider, instance) {
|
|
564
|
+
if (provider.hooks) {
|
|
565
|
+
Object.entries(provider.hooks).forEach(([event, cb]) => {
|
|
566
|
+
const callback = (...args) => cb(this.get(provider.token) || instance, ...args);
|
|
567
|
+
this.#hooks.on(event, callback);
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
}
|
|
568
571
|
};
|
|
569
|
-
_InjectorService_cache = new WeakMap();
|
|
570
572
|
InjectorService = InjectorService_1 = __decorate([
|
|
571
573
|
Injectable({
|
|
572
574
|
scope: ProviderScope.SINGLETON,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InjectorService.js","sourceRoot":"","sources":["../../../src/services/InjectorService.ts"],"names":[],"mappings":";;;AAAA,OAAO,EACL,WAAW,EACX,UAAU,EACV,OAAO,EACP,SAAS,EACT,SAAS,EAET,OAAO,EACP,UAAU,EACV,eAAe,EACf,QAAQ,EACR,MAAM,EACN,WAAW,EACX,KAAK,EACN,MAAM,YAAY,CAAC;AACpB,OAAO,EAAC,gBAAgB,EAAE,eAAe,EAAC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAC,UAAU,EAAC,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAY,sBAAsB,EAAE,aAAa,EAAC,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAC,cAAc,EAAC,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAC,mBAAmB,EAAC,MAAM,+BAA+B,CAAC;AAYlE,OAAO,EAAC,eAAe,EAAC,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAGlD;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,IAAa,eAAe,uBAA5B,MAAa,eAAgB,SAAQ,SAAS;IAM5C;QACE,KAAK,EAAE,CAAC;QANH,aAAQ,GAAyC,IAAI,eAAe,EAAS,CAAC;QAC9E,WAAM,GAAa,OAAO,CAAC;QAC1B,0BAAqB,GAAY,KAAK,CAAC;QAC/C,iCAAS,IAAI,eAAe,EAAE,EAAC;QAI7B,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,iBAAe,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAU,CAAC;IAClC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACI,OAAO,CAAC,QAAkB;QAC/B,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,SAAS,CAAC;IACjF,CAAC;IAED;;;;;OAKG;IACI,YAAY,CAAC,KAAoB,EAAE,WAAoC,EAAE;QAC9E,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC5B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SACzB;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAE,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAElC,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAE3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,OAAO,uBAAA,IAAI,8BAAO,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,GAAG,CAAU,KAAoB,EAAE,UAAe,EAAE;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,OAAO,QAAQ,CAAC;SACjB;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC5B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;gBACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAE5C,IAAI,MAAM,KAAK,SAAS,EAAE;oBACxB,OAAO,MAAM,CAAC;iBACf;aACF;SACF;IACH,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,KAAoB;QACtB,OAAO,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACI,MAAM,CACX,KAAoB,EACpB,SAAkC,IAAI,eAAe,EAAE,EACvD,UAAqC,EAAE;QAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,QAAa,CAAC;QAElB,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACrB,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SAC1B;QAED,IAAI,KAAK,KAAK,gBAAgB,EAAE;YAC9B,OAAO,EAAO,CAAC;SAChB;QAED,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE;YAChC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAEhD,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;gBAC3B,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;aAClC;YAED,OAAO,QAAQ,CAAC;SACjB;QAED,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC9B,KAAK,aAAa,CAAC,SAAS;gBAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBACpB,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;oBAE7D,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;wBACtB,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAa,EAAE,EAAE;4BAC5C,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;wBACnC,CAAC,CAAC,CAAC;qBACJ;iBACF;gBAED,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAI,KAAK,CAAE,CAAC;gBAC/B,MAAM;YAER,KAAK,aAAa,CAAC,OAAO;gBACxB,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC5B,MAAM;YAER,KAAK,aAAa,CAAC,QAAQ;gBACzB,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC3D,MAAM;SACT;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,SAA0B,IAAI,eAAe,EAAE;QAC7D,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAC/B,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;oBACtB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;iBAC3C;gBAED,MAAM,QAAQ,GAAG,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjD,IAAI,QAAQ,KAAK,SAAS,EAAE;oBAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;iBACtC;aACF;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,SAA0B,IAAI,eAAe,EAAE;QACtD,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC,SAAS,EAAE;gBACrF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aACrC;YAED,MAAM,QAAQ,GAAG,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;aACtC;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,YAAuB,eAAe,EAAE;QAChD,uCAAuC;QACvC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAE7B,4BAA4B;QAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,YAAuB,eAAe,EAAE,EAAE,UAA0B;QAC7E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE1B,gCAAgC;QAChC,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAEpC,IAAI,UAAU,EAAE;YACd,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;SAC/B;QAED,qBAAqB;QACrB,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/B,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,OAAO;SACR;QACD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;QAEtC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACzB,IAAI,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE;gBAC/D,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBAC9D,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACzG,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;aACJ;YACD,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;aAC5C;QACH,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACI,wBAAwB,CAAC,QAAa,EAAE,MAA+B,EAAE,OAA+B;QAC7G,MAAM,UAAU,GAAyB,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UAAe,EAAE,MAAW,EAAE,EAAE;YAC9G,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEjC,OAAO;gBACL,GAAG,UAAU;gBACb,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YAC/C,QAAQ,UAAU,CAAC,WAAW,EAAE;gBAC9B,KAAK,sBAAsB,CAAC,MAAM;oBAChC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACtC,MAAM;gBACR,KAAK,sBAAsB,CAAC,QAAQ;oBAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;oBACzD,MAAM;gBACR,KAAK,sBAAsB,CAAC,QAAQ;oBAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACxC,MAAM;gBACR,KAAK,sBAAsB,CAAC,KAAK;oBAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACrC,MAAM;gBACR,KAAK,sBAAsB,CAAC,WAAW;oBACrC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAC3C,MAAM;aACT;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,QAAa,EAAE,EAAC,WAAW,EAA4B;QACvE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QAEtE,QAAQ,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAe,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YAErE,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;OAUG;IACI,YAAY,CACjB,QAAa,EACb,EAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,EAAE,EAA4B,EAChE,MAA+B,EAC/B,aAAqC;QAErC,IAAI,GAAc,CAAC;QAEnB,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAC,GAAG,aAAa,EAAE,OAAO,EAAC,CAAC,CAAC;QAE1D,UAAU,CAAC,GAAG,EAAE,CACd,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE;YAC3C,GAAG;SACJ,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,QAAa,EAAE,EAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAA0B;QAC9F,MAAM,UAAU,GAAG;YACjB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,YAAY;YACxD,GAAG,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC;YACzD,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SACnB,CAAC;QAEF,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;OAKG;IACI,YAAY,CAAC,QAAa,EAAE,EAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAA0B;QACjG,IAAI,IAAS,CAAC;QAEd,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,IAAI,IAAI,KAAK,SAAS,EAAE;gBACtB,OAAO,IAAI,CAAC;aACb;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC1D,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YAEvC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG;YACjB,GAAG;YACH,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SACnB,CAAC;QAEF,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;OAMG;IACI,eAAe,CAAC,QAAa,EAAE,EAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAA4B;QAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QAE7C,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;gBAC3B,IAAI,CAAC,GAAG,EAAE;oBACR,OAAO,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;iBAC7C;gBAED,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC;YAEF,MAAM,OAAO,GAA4B;gBACvC,MAAM;gBACN,WAAW;gBACX,IAAI;gBACJ,OAAO;gBACP,IAAI;aACL,CAAC;YAEF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAqB,OAAO,CAAE,CAAC;YAE3D,OAAO,WAAW,CAAC,SAAU,CAC3B;gBACE,GAAG,OAAO;gBACV,OAAO;aACR,EACD,IAAI,CACL,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAc,EAAE,EAAO;QAClC,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAU,KAAoB;QAC5C,IAAI,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAI,KAAK,CAAC,CAAC;YAEvC,IAAI,UAAU,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,EAAE;gBACjC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;aAC1B;SACF;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,GAAG,IAAW;QACjD,OAAO,uBAAA,IAAI,8BAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAU,SAAiB,EAAE,KAAU,EAAE,GAAG,IAAW;QACjE,OAAO,uBAAA,IAAI,8BAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,UAAU,CAAU,SAAiB,EAAE,KAAU,EAAE,GAAG,IAAW;QAC5E,OAAO,uBAAA,IAAI,8BAAO,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,uBAAA,IAAI,8BAAO,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAES,cAAc,CAAC,KAAoB;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC1D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SACzB;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAE,CAAC;IAClC,CAAC;IAES,WAAW,CAAC,KAAU;QAC9B,OAAO,uBAAA,IAAI,8BAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACK,OAAO,CAAI,MAAqB,EAAE,MAA+B,EAAE,UAAqC,EAAE;QAChH,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,EAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAC,GAAG,YAAY,CAAC;QAEjE,IAAI,QAAQ,EAAE;YACZ,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAC,GAAG,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;SAC/E;QAED,IAAI,QAAa,CAAC;QAClB,IAAI,iBAAiB,GAAQ,KAAK,CAAC;QAEnC,IAAI;YACF,MAAM,gBAAgB,GAAG,CAAC,MAAY,EAAE,EAAE,CAAC,CAAC,KAAU,EAAE,KAAa,EAAO,EAAE;;gBAC5E,iBAAiB,GAAG,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC;gBAEzC,IAAI,KAAK,KAAK,gBAAgB,EAAE;oBAC9B,MAAM,OAAO,GAAG,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,0CAAE,GAAG,CAAC,GAAG,gBAAgB,IAAI,KAAK,EAAE,CAAC,CAAC;oBAErE,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;iBAC7C;gBAED,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAC,MAAM,EAAC,CAAC,CAAC;YAC/F,CAAC,CAAC;YAEF,qCAAqC;YACrC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAEpC,sBAAsB;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;YAEnD,iBAAiB,GAAG,KAAK,CAAC;YAE1B,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;SAChC;QAAC,OAAO,KAAK,EAAE;YACd,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;SACpE;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,MAAM,IAAI,cAAc,CACtB,KAAK,EACL,2FAA2F,MAAM,CAAC,KAAK,CAAC,EAAE,CAC3G,CAAC;SACH;QAED,IAAI,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE;YAC1C,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;SAC1D;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,KAAoB,EAAE,MAA+B,EAAE,OAA+B;QAC7G,IAAI,OAAO,GAAgC,OAAO,CAAC,OAAO,CAAC;QAC3D,IAAI,IAAI,GAAgC,OAAO,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,IAAI,SAAS,CAAC;QAEd,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,mBAAmB,EAAE,CAAC;SACjC;QAED,IAAI,QAAkB,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC5B,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE/B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAEjE,IAAI,MAAM,KAAK,SAAS,EAAE;oBACxB,QAAQ,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;iBACpC;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAE,CAAC;SACrC;QAED,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;QAC7B,OAAO,GAAG,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC;QAEtC,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE;YACnC,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAC7F;aAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;YAC9B,SAAS,GAAG,CAAC,IAAqB,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;SACrE;aAAM,IAAI,QAAQ,CAAC,eAAe,EAAE;YACnC,SAAS,GAAG,KAAK,EAAE,IAAqB,EAAE,EAAE;gBAC1C,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC;SACH;aAAM;YACL,WAAW;YACX,IAAI,GAAG,IAAI,IAAI,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzD,SAAS,GAAG,CAAC,IAAqB,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;SACvE;QAED,OAAO;YACL,KAAK;YACL,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,SAAS;YACzE,IAAI,EAAE,IAAK,IAAI,EAAE;YACjB,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,SAAS;YACT,QAAQ;SACT,CAAC;IACJ,CAAC;CACF,CAAA;;AAvoBY,eAAe;IAJ3B,UAAU,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,SAAS;QAC9B,MAAM,EAAE,IAAI;KACb,CAAC;;GACW,eAAe,CAuoB3B;SAvoBY,eAAe","sourcesContent":["import {\n ancestorsOf,\n catchError,\n classOf,\n deepClone,\n deepMerge,\n getClassOrSymbol,\n isClass,\n isFunction,\n isInheritedFrom,\n Metadata,\n nameOf,\n prototypeOf,\n Store\n} from \"@tsed/core\";\nimport {DI_PARAM_OPTIONS, INJECTABLE_PROP} from \"../constants\";\nimport {Configuration} from \"../decorators/configuration\";\nimport {Injectable} from \"../decorators/injectable\";\nimport {DIContext, InjectablePropertyType, ProviderScope} from \"../domain\";\nimport {Container} from \"../domain/Container\";\nimport {LocalsContainer} from \"../domain/LocalsContainer\";\nimport {Provider} from \"../domain/Provider\";\nimport {InjectionError} from \"../errors/InjectionError\";\nimport {UndefinedTokenError} from \"../errors/UndefinedTokenError\";\nimport {\n DILogger,\n InjectableProperties,\n InjectablePropertyOptions,\n InjectablePropertyValue,\n InterceptorContext,\n InterceptorMethods,\n InvokeOptions,\n IProvider,\n TokenProvider\n} from \"../interfaces\";\nimport {GlobalProviders} from \"../registries/GlobalProviders\";\nimport {createContainer} from \"../utils/createContainer\";\nimport {DIConfiguration} from \"./DIConfiguration\";\nimport {ResolvedInvokeOptions} from \"../interfaces/ResolvedInvokeOptions\";\n\n/**\n * This service contain all services collected by `@Service` or services declared manually with `InjectorService.factory()` or `InjectorService.service()`.\n *\n * ### Example:\n *\n * ```typescript\n * import {InjectorService} from \"@tsed/di\";\n *\n * // Import the services (all services are decorated with @Service()\";\n * import MyService1 from \"./services/service1\";\n * import MyService2 from \"./services/service2\";\n * import MyService3 from \"./services/service3\";\n *\n * // When all services is imported you can load InjectorService.\n * const injector = new InjectorService()\n *\n * await injector.load();\n *\n * const myService1 = injector.get<MyService1>(MyServcice1);\n * ```\n */\n@Injectable({\n scope: ProviderScope.SINGLETON,\n global: true\n})\nexport class InjectorService extends Container {\n public settings: TsED.Configuration & DIConfiguration = new DIConfiguration() as any;\n public logger: DILogger = console;\n private resolvedConfiguration: boolean = false;\n #cache = new LocalsContainer();\n\n constructor() {\n super();\n this.#cache.set(InjectorService, this);\n }\n\n get resolvers() {\n return this.settings.resolvers!;\n }\n\n get scopes() {\n return this.settings.scopes || {};\n }\n\n /**\n * Retrieve default scope for a given provider.\n * @param provider\n */\n public scopeOf(provider: Provider) {\n return provider.scope || this.scopes[provider.type] || ProviderScope.SINGLETON;\n }\n\n /**\n * Clone a provider from GlobalProviders and the given token. forkProvider method build automatically the provider if the instance parameter ins't given.\n * @param token\n * @param settings\n * @deprecated\n */\n public forkProvider(token: TokenProvider, settings: Partial<IProvider<any>> = {}): Provider {\n if (!this.hasProvider(token)) {\n this.addProvider(token);\n }\n\n const provider = this.getProvider(token)!;\n\n Object.assign(provider, settings);\n\n this.#cache.set(token, this.invoke(token));\n\n return provider;\n }\n\n /**\n * Return a list of instance build by the injector.\n */\n public toArray(): any[] {\n return this.#cache.toArray();\n }\n\n /**\n * Get a service or factory already constructed from his symbol or class.\n *\n * #### Example\n *\n * ```typescript\n * import {InjectorService} from \"@tsed/di\";\n * import MyService from \"./services\";\n *\n * class OtherService {\n * constructor(injectorService: InjectorService) {\n * const myService = injectorService.get<MyService>(MyService);\n * }\n * }\n * ```\n *\n * @param token The class or symbol registered in InjectorService.\n * @param options\n * @returns {boolean}\n */\n get<T = any>(token: TokenProvider, options: any = {}): T | undefined {\n const instance = this.getInstance(token);\n\n if (instance !== undefined) {\n return instance;\n }\n\n if (!this.hasProvider(token)) {\n for (const resolver of this.resolvers) {\n const result = resolver.get(token, options);\n\n if (result !== undefined) {\n return result;\n }\n }\n }\n }\n\n /**\n * The has() method returns a boolean indicating whether an element with the specified key exists or not.\n * @returns {boolean}\n * @param token\n */\n has(token: TokenProvider): boolean {\n return this.#cache.get(token) !== undefined;\n }\n\n /**\n * Invoke the class and inject all services that required by the class constructor.\n *\n * #### Example\n *\n * ```typescript\n * import {InjectorService} from \"@tsed/di\";\n * import MyService from \"./services\";\n *\n * class OtherService {\n * constructor(injectorService: InjectorService) {\n * const myService = injectorService.invoke<MyService>(MyService);\n * }\n * }\n * ```\n *\n * @param token The injectable class to invoke. Class parameters are injected according constructor signature.\n * @param locals Optional object. If preset then any argument Class are read from this object first, before the `InjectorService` is consulted.\n * @param options\n * @returns {T} The class constructed.\n */\n public invoke<T>(\n token: TokenProvider,\n locals: Map<TokenProvider, any> = new LocalsContainer(),\n options: Partial<InvokeOptions<T>> = {}\n ): T {\n const provider = this.ensureProvider(token);\n let instance: any;\n\n !locals.has(Configuration) && locals.set(Configuration, this.settings);\n\n if (locals.has(token)) {\n return locals.get(token);\n }\n\n if (token === DI_PARAM_OPTIONS) {\n return {} as T;\n }\n\n if (!provider || options.rebuild) {\n instance = this.resolve(token, locals, options);\n\n if (this.hasProvider(token)) {\n this.#cache.set(token, instance);\n }\n\n return instance;\n }\n\n switch (this.scopeOf(provider)) {\n case ProviderScope.SINGLETON:\n if (!this.has(token)) {\n this.#cache.set(token, this.resolve(token, locals, options));\n\n if (provider.isAsync()) {\n this.#cache.get(token).then((instance: any) => {\n this.#cache.set(token, instance);\n });\n }\n }\n\n instance = this.get<T>(token)!;\n break;\n\n case ProviderScope.REQUEST:\n instance = this.resolve(token, locals, options);\n locals.set(token, instance);\n break;\n\n case ProviderScope.INSTANCE:\n instance = this.resolve(provider.provide, locals, options);\n break;\n }\n\n return instance;\n }\n\n /**\n * Build only providers which are asynchronous.\n */\n async loadAsync(locals: LocalsContainer = new LocalsContainer()) {\n for (const [, provider] of this) {\n if (!locals.has(provider.token)) {\n if (provider.isAsync()) {\n await this.invoke(provider.token, locals);\n }\n\n const instance = this.#cache.get(provider.token);\n if (instance !== undefined) {\n locals.set(provider.token, instance);\n }\n }\n }\n\n return locals;\n }\n\n loadSync(locals: LocalsContainer = new LocalsContainer()) {\n for (const [, provider] of this) {\n if (!locals.has(provider.token) && this.scopeOf(provider) === ProviderScope.SINGLETON) {\n this.invoke(provider.token, locals);\n }\n\n const instance = this.#cache.get(provider.token);\n if (instance !== undefined) {\n locals.set(provider.token, instance);\n }\n }\n\n return locals;\n }\n\n /**\n * Boostrap injector from container and resolve configuration.\n *\n * @param container\n */\n bootstrap(container: Container = createContainer()) {\n // Clone all providers in the container\n this.addProviders(container);\n\n // Resolve all configuration\n this.resolveConfiguration();\n\n return this;\n }\n\n /**\n * Build all providers from given container (or GlobalProviders) and emit `$onInit` event.\n *\n * @param container\n * @param rootModule\n */\n async load(container: Container = createContainer(), rootModule?: TokenProvider): Promise<LocalsContainer<any>> {\n this.bootstrap(container);\n\n // build async and sync provider\n let locals = await this.loadAsync();\n\n if (rootModule) {\n await this.invoke(rootModule);\n }\n\n // load sync provider\n locals = this.loadSync(locals);\n\n await locals.emit(\"$beforeInit\");\n await locals.emit(\"$onInit\");\n\n return locals;\n }\n\n /**\n * Load all configurations registered on providers\n */\n resolveConfiguration() {\n if (this.resolvedConfiguration) {\n return;\n }\n const mergedConfiguration = new Map();\n\n super.forEach((provider) => {\n if (provider.configuration && provider.type !== \"server:module\") {\n Object.entries(provider.configuration).forEach(([key, value]) => {\n value = mergedConfiguration.has(key) ? deepMerge(mergedConfiguration.get(key), value) : deepClone(value);\n mergedConfiguration.set(key, value);\n });\n }\n if (provider.resolvers) {\n this.resolvers.push(...provider.resolvers);\n }\n });\n\n mergedConfiguration.forEach((value, key) => {\n this.settings[key] = deepMerge(value, this.settings[key]);\n });\n\n this.settings.build();\n\n this.resolvedConfiguration = true;\n }\n\n /**\n *\n * @param instance\n * @param locals\n * @param options\n */\n public bindInjectableProperties(instance: any, locals: Map<TokenProvider, any>, options: Partial<InvokeOptions>) {\n const properties: InjectableProperties = ancestorsOf(classOf(instance)).reduce((properties: any, target: any) => {\n const store = Store.from(target);\n\n return {\n ...properties,\n ...(store.get(INJECTABLE_PROP) || {})\n };\n }, {});\n\n Object.values(properties).forEach((definition) => {\n switch (definition.bindingType) {\n case InjectablePropertyType.METHOD:\n this.bindMethod(instance, definition);\n break;\n case InjectablePropertyType.PROPERTY:\n this.bindProperty(instance, definition, locals, options);\n break;\n case InjectablePropertyType.CONSTANT:\n this.bindConstant(instance, definition);\n break;\n case InjectablePropertyType.VALUE:\n this.bindValue(instance, definition);\n break;\n case InjectablePropertyType.INTERCEPTOR:\n this.bindInterceptor(instance, definition);\n break;\n }\n });\n }\n\n /**\n *\n * @param instance\n * @param {string} propertyKey\n */\n public bindMethod(instance: any, {propertyKey}: InjectablePropertyOptions) {\n const target = classOf(instance);\n const originalMethod = instance[propertyKey];\n const deps = Metadata.getParamTypes(prototypeOf(target), propertyKey);\n\n instance[propertyKey] = () => {\n const services = deps.map((dependency: any) => this.get(dependency));\n\n return originalMethod.call(instance, ...services);\n };\n }\n\n /**\n * Create an injectable property.\n *\n * @param instance\n * @param {string} propertyKey\n * @param {any} useType\n * @param resolver\n * @param options\n * @param locals\n * @param invokeOptions\n */\n public bindProperty(\n instance: any,\n {propertyKey, resolver, options = {}}: InjectablePropertyOptions,\n locals: Map<TokenProvider, any>,\n invokeOptions: Partial<InvokeOptions>\n ) {\n let get: () => any;\n\n get = resolver(this, locals, {...invokeOptions, options});\n\n catchError(() =>\n Object.defineProperty(instance, propertyKey, {\n get\n })\n );\n }\n\n /**\n *\n * @param instance\n * @param {string} propertyKey\n * @param {any} useType\n */\n public bindValue(instance: any, {propertyKey, expression, defaultValue}: InjectablePropertyValue) {\n const descriptor = {\n get: () => this.settings.get(expression) || defaultValue,\n set: (value: any) => this.settings.set(expression, value),\n enumerable: true,\n configurable: true\n };\n\n catchError(() => Object.defineProperty(instance, propertyKey, descriptor));\n }\n\n /**\n *\n * @param instance\n * @param {string} propertyKey\n * @param {any} useType\n */\n public bindConstant(instance: any, {propertyKey, expression, defaultValue}: InjectablePropertyValue) {\n let bean: any;\n\n const get = () => {\n if (bean !== undefined) {\n return bean;\n }\n\n const value = this.settings.get(expression, defaultValue);\n bean = Object.freeze(deepClone(value));\n\n return bean;\n };\n\n const descriptor = {\n get,\n enumerable: true,\n configurable: true\n };\n\n catchError(() => Object.defineProperty(instance, propertyKey, descriptor));\n }\n\n /**\n *\n * @param instance\n * @param propertyKey\n * @param useType\n * @param options\n */\n public bindInterceptor(instance: any, {propertyKey, useType, options}: InjectablePropertyOptions) {\n const target = classOf(instance);\n const originalMethod = instance[propertyKey];\n\n instance[propertyKey] = (...args: any[]) => {\n const next = (err?: Error) => {\n if (!err) {\n return originalMethod.apply(instance, args);\n }\n\n throw err;\n };\n\n const context: InterceptorContext<any> = {\n target,\n propertyKey,\n args,\n options,\n next\n };\n\n const interceptor = this.get<InterceptorMethods>(useType)!;\n\n return interceptor.intercept!(\n {\n ...context,\n options\n },\n next\n );\n };\n }\n\n /**\n * Allow handler hack for AsyncHookContext plugin.\n * @param ctx\n * @param cb\n * @protected\n */\n runInContext(ctx: DIContext, cb: any) {\n return cb();\n }\n\n async lazyInvoke<T = any>(token: TokenProvider) {\n let instance = this.getInstance(token);\n\n if (!instance) {\n instance = await this.invoke<T>(token);\n\n if (isFunction(instance?.$onInit)) {\n await instance.$onInit();\n }\n }\n\n return instance;\n }\n\n /**\n * Emit an event to all service. See service [lifecycle hooks](/docs/services.md#lifecycle-hooks).\n * @param eventName The event name to emit at all services.\n * @param args List of the parameters to give to each services.\n * @returns {Promise<any[]>} A list of promises.\n */\n public async emit(eventName: string, ...args: any[]) {\n return this.#cache.emit(eventName, ...args);\n }\n\n /**\n * @param eventName\n * @param value\n * @param args\n */\n public alter<T = any>(eventName: string, value: any, ...args: any[]): T {\n return this.#cache.alter(eventName, value, ...args);\n }\n\n /**\n * @param eventName\n * @param value\n * @param args\n */\n public async alterAsync<T = any>(eventName: string, value: any, ...args: any[]): Promise<T> {\n return this.#cache.alterAsync(eventName, value, ...args);\n }\n\n async destroy() {\n await this.#cache.destroy();\n }\n\n protected ensureProvider(token: TokenProvider): Provider | undefined {\n if (!this.hasProvider(token) && GlobalProviders.has(token)) {\n this.addProvider(token);\n }\n\n return this.getProvider(token)!;\n }\n\n protected getInstance(token: any) {\n return this.#cache.get(token);\n }\n\n /**\n * Invoke a class method and inject service.\n *\n * #### IInjectableMethod options\n *\n * * **target**: Optional. The class instance.\n * * **methodName**: `string` Optional. The method name.\n * * **designParamTypes**: `any[]` Optional. List of injectable types.\n * * **locals**: `Map<Function, any>` Optional. If preset then any argument Class are read from this object first, before the `InjectorService` is consulted.\n *\n * #### Example\n *\n * @param target\n * @param locals\n * @param options\n * @private\n */\n private resolve<T>(target: TokenProvider, locals: Map<TokenProvider, any>, options: Partial<InvokeOptions<T>> = {}): Promise<T> {\n const resolvedOpts = this.mapInvokeOptions(target, locals, options);\n const {token, deps, construct, imports, provider} = resolvedOpts;\n\n if (provider) {\n GlobalProviders.onInvoke(provider, locals, {...resolvedOpts, injector: this});\n }\n\n let instance: any;\n let currentDependency: any = false;\n\n try {\n const invokeDependency = (parent?: any) => (token: any, index: number): any => {\n currentDependency = {token, index, deps};\n\n if (token !== DI_PARAM_OPTIONS) {\n const options = provider?.store?.get(`${DI_PARAM_OPTIONS}:${index}`);\n\n locals.set(DI_PARAM_OPTIONS, options || {});\n }\n\n return isInheritedFrom(token, Provider, 1) ? provider : this.invoke(token, locals, {parent});\n };\n\n // Invoke manually imported providers\n imports.forEach(invokeDependency());\n\n // Inject dependencies\n const services = deps.map(invokeDependency(token));\n\n currentDependency = false;\n\n instance = construct(services);\n } catch (error) {\n InjectionError.throwInjectorError(token, currentDependency, error);\n }\n\n if (instance === undefined) {\n throw new InjectionError(\n token,\n `Unable to create new instance from undefined value. Check your provider declaration for ${nameOf(token)}`\n );\n }\n\n if (instance && isClass(classOf(instance))) {\n this.bindInjectableProperties(instance, locals, options);\n }\n\n return instance;\n }\n\n /**\n * Create options to invoke a provider or class.\n * @param token\n * @param locals\n * @param options\n */\n private mapInvokeOptions(token: TokenProvider, locals: Map<TokenProvider, any>, options: Partial<InvokeOptions>): ResolvedInvokeOptions {\n let imports: TokenProvider[] | undefined = options.imports;\n let deps: TokenProvider[] | undefined = options.deps;\n let scope = options.scope;\n let construct;\n\n if (!token) {\n throw new UndefinedTokenError();\n }\n\n let provider: Provider;\n\n if (!this.hasProvider(token)) {\n provider = new Provider(token);\n\n this.resolvers.forEach((resolver) => {\n const result = resolver.get(token, locals.get(DI_PARAM_OPTIONS));\n\n if (result !== undefined) {\n provider.useFactory = () => result;\n }\n });\n } else {\n provider = this.getProvider(token)!;\n }\n\n scope = scope || this.scopeOf(provider);\n deps = deps || provider.deps;\n imports = imports || provider.imports;\n\n if (provider.useValue !== undefined) {\n construct = () => (isFunction(provider.useValue) ? provider.useValue() : provider.useValue);\n } else if (provider.useFactory) {\n construct = (deps: TokenProvider[]) => provider.useFactory(...deps);\n } else if (provider.useAsyncFactory) {\n construct = async (deps: TokenProvider[]) => {\n deps = await Promise.all(deps);\n return provider.useAsyncFactory(...deps);\n };\n } else {\n // useClass\n deps = deps || Metadata.getParamTypes(provider.useClass);\n construct = (deps: TokenProvider[]) => new provider.useClass(...deps);\n }\n\n return {\n token,\n scope: scope || Store.from(token).get(\"scope\") || ProviderScope.SINGLETON,\n deps: deps! || [],\n imports: imports || [],\n construct,\n provider\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"InjectorService.js","sourceRoot":"","sources":["../../../src/services/InjectorService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ancestorsOf,\n catchError,\n classOf,\n deepClone,\n deepMerge,\n Hooks,\n isClass,\n isFunction,\n isInheritedFrom,\n Metadata,\n nameOf,\n prototypeOf,\n Store\n} from \"@tsed/core\";\nimport {DI_PARAM_OPTIONS, INJECTABLE_PROP} from \"../constants/constants\";\nimport {Configuration} from \"../decorators/configuration\";\nimport {Injectable} from \"../decorators/injectable\";\nimport {Container} from \"../domain/Container\";\nimport {InjectablePropertyType} from \"../domain/InjectablePropertyType\";\nimport {LocalsContainer} from \"../domain/LocalsContainer\";\nimport {Provider} from \"../domain/Provider\";\nimport {ProviderScope} from \"../domain/ProviderScope\";\nimport {InjectionError} from \"../errors/InjectionError\";\nimport {UndefinedTokenError} from \"../errors/UndefinedTokenError\";\nimport {DILogger} from \"../interfaces/DILogger\";\nimport {InjectableProperties, InjectablePropertyOptions, InjectablePropertyValue} from \"../interfaces/InjectableProperties\";\nimport {InterceptorContext} from \"../interfaces/InterceptorContext\";\nimport {InterceptorMethods} from \"../interfaces/InterceptorMethods\";\nimport {InvokeOptions} from \"../interfaces/InvokeOptions\";\nimport {ResolvedInvokeOptions} from \"../interfaces/ResolvedInvokeOptions\";\nimport {TokenProvider} from \"../interfaces/TokenProvider\";\nimport {GlobalProviders} from \"../registries/GlobalProviders\";\nimport {runInContext} from \"../utils/asyncHookContext\";\nimport {createContainer} from \"../utils/createContainer\";\nimport {resolveControllers} from \"../utils/resolveControllers\";\nimport {DIConfiguration} from \"./DIConfiguration\";\n\n/**\n * This service contain all services collected by `@Service` or services declared manually with `InjectorService.factory()` or `InjectorService.service()`.\n *\n * ### Example:\n *\n * ```typescript\n * import {InjectorService} from \"@tsed/di\";\n *\n * // Import the services (all services are decorated with @Service()\";\n * import MyService1 from \"./services/service1\";\n * import MyService2 from \"./services/service2\";\n * import MyService3 from \"./services/service3\";\n *\n * // When all services are imported, you can load InjectorService.\n * const injector = new InjectorService()\n *\n * await injector.load();\n *\n * const myService1 = injector.get<MyService1>(MyServcice1);\n * ```\n */\n@Injectable({\n scope: ProviderScope.SINGLETON,\n global: true\n})\nexport class InjectorService extends Container {\n public settings: DIConfiguration = new DIConfiguration();\n public logger: DILogger = console;\n private resolvedConfiguration: boolean = false;\n\n #cache = new LocalsContainer();\n #hooks = new Hooks();\n\n constructor() {\n super();\n this.#cache.set(InjectorService, this);\n }\n\n get resolvers() {\n return this.settings.resolvers!;\n }\n\n get scopes() {\n return this.settings.scopes || {};\n }\n\n /**\n * Retrieve default scope for a given provider.\n * @param provider\n */\n public scopeOf(provider: Provider) {\n return provider.scope || this.scopes[provider.type] || ProviderScope.SINGLETON;\n }\n\n /**\n * Return a list of instance build by the injector.\n */\n public toArray(): any[] {\n return [...this.#cache.values()];\n }\n\n /**\n * Get a service or factory already constructed from his symbol or class.\n *\n * #### Example\n *\n * ```typescript\n * import {InjectorService} from \"@tsed/di\";\n * import MyService from \"./services\";\n *\n * class OtherService {\n * constructor(injectorService: InjectorService) {\n * const myService = injectorService.get<MyService>(MyService);\n * }\n * }\n * ```\n *\n * @param token The class or symbol registered in InjectorService.\n * @param options\n * @returns {boolean}\n */\n get<T = any>(token: TokenProvider<T>, options: any = {}): T | undefined {\n const instance = this.getInstance(token);\n\n if (instance !== undefined) {\n return instance;\n }\n\n if (!this.hasProvider(token)) {\n for (const resolver of this.resolvers) {\n const result = resolver.get(token, options);\n\n if (result !== undefined) {\n return result;\n }\n }\n }\n }\n\n /**\n * Return all instance of the same provider type\n * @param type\n */\n getAll(type: string) {\n return this.getProviders(type).map((provider) => {\n return this.get(provider.token);\n });\n }\n\n /**\n * The has() method returns a boolean indicating whether an element with the specified key exists or not.\n * @returns {boolean}\n * @param token\n */\n has(token: TokenProvider): boolean {\n return this.#cache.get(token) !== undefined;\n }\n\n /**\n * Invoke the class and inject all services that required by the class constructor.\n *\n * #### Example\n *\n * ```typescript\n * import {InjectorService} from \"@tsed/di\";\n * import MyService from \"./services\";\n *\n * class OtherService {\n * constructor(injectorService: InjectorService) {\n * const myService = injectorService.invoke<MyService>(MyService);\n * }\n * }\n * ```\n *\n * @param token The injectable class to invoke. Class parameters are injected according constructor signature.\n * @param locals Optional object. If preset then any argument Class are read from this object first, before the `InjectorService` is consulted.\n * @param options\n * @returns {T} The class constructed.\n */\n public invoke<T = any>(token: TokenProvider, locals?: LocalsContainer, options: Partial<InvokeOptions<T>> = {}): T {\n let instance: any = locals ? locals.get(token) : undefined;\n\n if (instance !== undefined) {\n return instance;\n }\n\n if (token === Configuration) {\n return this.settings as unknown as T;\n }\n\n instance = !options.rebuild ? this.getInstance(token) : undefined;\n\n if (instance != undefined) {\n return instance;\n }\n\n if (token === DI_PARAM_OPTIONS) {\n return {} as T;\n }\n\n const provider = this.ensureProvider(token);\n\n if (!provider || options.rebuild) {\n instance = this.resolve(token, locals, options);\n\n if (this.hasProvider(token)) {\n this.#cache.set(token, instance);\n }\n\n return instance;\n }\n\n instance = this.resolve(token, locals, options);\n\n switch (this.scopeOf(provider)) {\n case ProviderScope.SINGLETON:\n if (provider.hooks && !options.rebuild) {\n this.registerHooks(provider, instance);\n }\n\n if (!provider.isAsync()) {\n this.#cache.set(token, instance);\n return instance;\n }\n\n // store promise to lock token in cache\n this.#cache.set(token, instance);\n\n instance = instance.then((instance: any) => {\n this.#cache.set(token, instance);\n\n return instance;\n });\n\n return instance;\n\n case ProviderScope.REQUEST:\n if (locals) {\n locals.set(token, instance);\n\n if (provider.hooks && provider.hooks.$onDestroy) {\n locals.hooks.on(\"$onDestroy\", (...args: any[]) => provider.hooks!.$onDestroy(instance, ...args));\n }\n }\n\n return instance;\n }\n\n return instance;\n }\n\n /**\n * Build only providers which are asynchronous.\n */\n async loadAsync() {\n for (const [, provider] of this) {\n if (!this.has(provider.token) && provider.isAsync()) {\n await this.invoke(provider.token);\n }\n }\n }\n\n loadSync() {\n for (const [, provider] of this) {\n if (!this.has(provider.token) && this.scopeOf(provider) === ProviderScope.SINGLETON) {\n this.invoke(provider.token);\n }\n }\n }\n\n /**\n * Boostrap injector from container and resolve configuration.\n *\n * @param container\n */\n bootstrap(container: Container = createContainer()) {\n // Clone all providers in the container\n this.addProviders(container);\n\n // Resolve all configuration\n this.resolveConfiguration();\n\n return this;\n }\n\n /**\n * Load injector from a given module\n * @param rootModule\n */\n loadModule(rootModule: TokenProvider) {\n this.settings.routes = this.settings.routes.concat(resolveControllers(this.settings));\n\n const container = createContainer();\n container.delete(rootModule);\n\n container.addProvider(rootModule, {\n type: \"server:module\",\n scope: ProviderScope.SINGLETON\n });\n\n return this.load(container);\n }\n\n /**\n * Build all providers from given container (or GlobalProviders) and emit `$onInit` event.\n *\n * @param container\n */\n async load(container: Container = createContainer()) {\n this.bootstrap(container);\n\n // build async and sync provider\n await this.loadAsync();\n\n // load sync provider\n this.loadSync();\n\n await this.emit(\"$beforeInit\");\n await this.emit(\"$onInit\");\n }\n\n /**\n * Load all configurations registered on providers\n */\n resolveConfiguration() {\n if (this.resolvedConfiguration) {\n return;\n }\n const mergedConfiguration = new Map();\n\n super.forEach((provider) => {\n if (provider.configuration && provider.type !== \"server:module\") {\n Object.entries(provider.configuration).forEach(([key, value]) => {\n if (![\"resolvers\", \"mount\", \"imports\"].includes(key)) {\n value = mergedConfiguration.has(key) ? deepMerge(mergedConfiguration.get(key), value) : deepClone(value);\n mergedConfiguration.set(key, value);\n }\n });\n }\n\n if (provider.resolvers) {\n this.settings.resolvers = this.settings.resolvers.concat(provider.resolvers);\n }\n });\n\n mergedConfiguration.forEach((value, key) => {\n this.settings.set(key, deepMerge(value, this.settings.get(key)));\n });\n\n this.resolvedConfiguration = true;\n }\n\n /**\n *\n * @param instance\n * @param locals\n * @param options\n */\n public bindInjectableProperties(instance: any, locals: LocalsContainer, options: Partial<InvokeOptions>) {\n const properties: InjectableProperties = ancestorsOf(classOf(instance)).reduce((properties: any, target: any) => {\n const store = Store.from(target);\n\n return {\n ...properties,\n ...(store.get(INJECTABLE_PROP) || {})\n };\n }, {});\n\n Object.values(properties).forEach((definition) => {\n switch (definition.bindingType) {\n case InjectablePropertyType.METHOD:\n this.bindMethod(instance, definition);\n break;\n case InjectablePropertyType.PROPERTY:\n this.bindProperty(instance, definition, locals, options);\n break;\n case InjectablePropertyType.CONSTANT:\n this.bindConstant(instance, definition);\n break;\n case InjectablePropertyType.VALUE:\n this.bindValue(instance, definition);\n break;\n case InjectablePropertyType.INTERCEPTOR:\n this.bindInterceptor(instance, definition);\n break;\n }\n });\n }\n\n /**\n * @param instance\n * @param {string} propertyKey\n */\n public bindMethod(instance: any, {propertyKey}: InjectablePropertyOptions) {\n const target = classOf(instance);\n const originalMethod = instance[propertyKey];\n const deps = Metadata.getParamTypes(prototypeOf(target), propertyKey);\n\n instance[propertyKey] = () => {\n const services = deps.map((dependency: any) => this.get(dependency));\n\n return originalMethod.call(instance, ...services);\n };\n }\n\n /**\n * Create an injectable property.\n *\n * @param instance\n * @param {string} propertyKey\n * @param {any} useType\n * @param resolver\n * @param options\n * @param locals\n * @param invokeOptions\n */\n public bindProperty(\n instance: any,\n {propertyKey, resolver, options = {}}: InjectablePropertyOptions,\n locals: LocalsContainer,\n invokeOptions: Partial<InvokeOptions>\n ) {\n let get: () => any;\n\n get = resolver(this, locals, {...invokeOptions, options});\n\n catchError(() =>\n Object.defineProperty(instance, propertyKey, {\n get\n })\n );\n }\n\n /**\n *\n * @param instance\n * @param {string} propertyKey\n * @param {any} useType\n */\n public bindValue(instance: any, {propertyKey, expression, defaultValue}: InjectablePropertyValue) {\n const descriptor = {\n get: () => this.settings.get(expression) || defaultValue,\n set: (value: any) => this.settings.set(expression, value),\n enumerable: true,\n configurable: true\n };\n\n catchError(() => Object.defineProperty(instance, propertyKey, descriptor));\n }\n\n /**\n *\n * @param instance\n * @param {string} propertyKey\n * @param {any} useType\n */\n public bindConstant(instance: any, {propertyKey, expression, defaultValue}: InjectablePropertyValue) {\n let bean: any;\n\n const get = () => {\n if (bean !== undefined) {\n return bean;\n }\n\n const value = this.settings.get(expression, defaultValue);\n bean = Object.freeze(deepClone(value));\n\n return bean;\n };\n\n const descriptor = {\n get,\n enumerable: true,\n configurable: true\n };\n\n catchError(() => Object.defineProperty(instance, propertyKey, descriptor));\n }\n\n /**\n *\n * @param instance\n * @param propertyKey\n * @param useType\n * @param options\n */\n public bindInterceptor(instance: any, {propertyKey, useType, options}: InjectablePropertyOptions) {\n const target = classOf(instance);\n const originalMethod = instance[propertyKey];\n\n instance[propertyKey] = (...args: any[]) => {\n const next = (err?: Error) => {\n if (!err) {\n return originalMethod.apply(instance, args);\n }\n\n throw err;\n };\n\n const context: InterceptorContext<any> = {\n target,\n propertyKey,\n args,\n options,\n next\n };\n\n const interceptor = this.get<InterceptorMethods>(useType)!;\n\n return interceptor.intercept!(\n {\n ...context,\n options\n },\n next\n );\n };\n }\n\n async lazyInvoke<T = any>(token: TokenProvider) {\n let instance = this.getInstance(token);\n\n if (!instance) {\n instance = await this.invoke<T>(token);\n\n if (isFunction(instance?.$onInit)) {\n await instance.$onInit();\n }\n }\n\n return instance;\n }\n\n /**\n * Emit an event to all service. See service [lifecycle hooks](/docs/services.md#lifecycle-hooks).\n * @param eventName The event name to emit at all services.\n * @param args List of the parameters to give to each service.\n * @returns {Promise<any[]>} A list of promises.\n */\n public async emit(eventName: string, ...args: any[]) {\n return this.#hooks.asyncEmit(eventName, args);\n }\n\n /**\n * @param eventName\n * @param value\n * @param args\n */\n public alter<T = any>(eventName: string, value: any, ...args: any[]): T {\n return this.#hooks.alter(eventName, value, args);\n }\n\n /**\n * @param eventName\n * @param value\n * @param args\n */\n public async alterAsync<T = any>(eventName: string, value: any, ...args: any[]): Promise<T> {\n return this.#hooks.asyncAlter(eventName, value, args);\n }\n\n async destroy() {\n await this.emit(\"$onDestroy\");\n }\n\n protected ensureProvider(token: TokenProvider): Provider | undefined {\n if (!this.hasProvider(token) && GlobalProviders.has(token)) {\n this.addProvider(token);\n }\n\n return this.getProvider(token)!;\n }\n\n protected getInstance(token: any) {\n return this.#cache.get(token);\n }\n\n /**\n * Invoke a class method and inject service.\n *\n * #### IInjectableMethod options\n *\n * * **target**: Optional. The class instance.\n * * **methodName**: `string` Optional. The method name.\n * * **designParamTypes**: `any[]` Optional. List of injectable types.\n * * **locals**: `Map<Function, any>` Optional. If preset then any argument Class are read from this object first, before the `InjectorService` is consulted.\n *\n * #### Example\n *\n * @param target\n * @param locals\n * @param options\n * @private\n */\n private resolve<T>(\n target: TokenProvider,\n locals: LocalsContainer = new LocalsContainer(),\n options: Partial<InvokeOptions<T>> = {}\n ): T | Promise<T> {\n const resolvedOpts = this.mapInvokeOptions(target, locals, options);\n const {token, deps, construct, imports, provider} = resolvedOpts;\n\n if (provider) {\n GlobalProviders.onInvoke(provider, locals, {...resolvedOpts, injector: this});\n }\n\n let instance: any;\n let currentDependency: any = false;\n\n try {\n const invokeDependency =\n (parent?: any) =>\n (token: any, index: number): any => {\n currentDependency = {token, index, deps};\n\n if (token !== DI_PARAM_OPTIONS) {\n const options = provider?.store?.get(`${DI_PARAM_OPTIONS}:${index}`);\n\n locals.set(DI_PARAM_OPTIONS, options || {});\n }\n\n return isInheritedFrom(token, Provider, 1) ? provider : this.invoke(token, locals, {parent});\n };\n\n // Invoke manually imported providers\n imports.forEach(invokeDependency());\n\n // Inject dependencies\n const services = deps.map(invokeDependency(token));\n\n currentDependency = false;\n\n instance = construct(services);\n } catch (error) {\n InjectionError.throwInjectorError(token, currentDependency, error);\n }\n\n if (instance === undefined) {\n throw new InjectionError(\n token,\n `Unable to create new instance from undefined value. Check your provider declaration for ${nameOf(token)}`\n );\n }\n\n if (instance && isClass(classOf(instance))) {\n this.bindInjectableProperties(instance, locals, options);\n }\n\n return instance;\n }\n\n /**\n * Create options to invoke a provider or class.\n * @param token\n * @param locals\n * @param options\n */\n private mapInvokeOptions(token: TokenProvider, locals: Map<TokenProvider, any>, options: Partial<InvokeOptions>): ResolvedInvokeOptions {\n let imports: TokenProvider[] | undefined = options.imports;\n let deps: TokenProvider[] | undefined = options.deps;\n let scope = options.scope;\n let construct;\n\n if (!token) {\n throw new UndefinedTokenError();\n }\n\n let provider: Provider;\n\n if (!this.hasProvider(token)) {\n provider = new Provider(token);\n\n this.resolvers.forEach((resolver) => {\n const result = resolver.get(token, locals.get(DI_PARAM_OPTIONS));\n\n if (result !== undefined) {\n provider.useFactory = () => result;\n }\n });\n } else {\n provider = this.getProvider(token)!;\n }\n\n scope = scope || this.scopeOf(provider);\n deps = deps || provider.deps;\n imports = imports || provider.imports;\n\n if (provider.useValue !== undefined) {\n construct = () => (isFunction(provider.useValue) ? provider.useValue() : provider.useValue);\n } else if (provider.useFactory) {\n construct = (deps: TokenProvider[]) => provider.useFactory(...deps);\n } else if (provider.useAsyncFactory) {\n construct = async (deps: TokenProvider[]) => {\n deps = await Promise.all(deps);\n return provider.useAsyncFactory(...deps);\n };\n } else {\n // useClass\n deps = deps || Metadata.getParamTypes(provider.useClass);\n construct = (deps: TokenProvider[]) => new provider.useClass(...deps);\n }\n\n return {\n token,\n scope: scope || Store.from(token).get(\"scope\") || ProviderScope.SINGLETON,\n deps: deps! || [],\n imports: imports || [],\n construct,\n provider\n };\n }\n\n private registerHooks(provider: Provider, instance: any) {\n if (provider.hooks) {\n Object.entries(provider.hooks).forEach(([event, cb]) => {\n const callback = (...args: any[]) => cb(this.get(provider.token) || instance, ...args);\n\n this.#hooks.on(event, callback);\n });\n }\n }\n}\n"]}
|