@adimm/x-injection 1.2.0 → 1.2.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.
- package/README.md +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -190,9 +190,9 @@ AppModule.lazyImport(FancyModuleDefinition);
|
|
|
190
190
|
|
|
191
191
|
> [!NOTE]
|
|
192
192
|
>
|
|
193
|
-
> _All modules which are imported into the `AppModule` must have the [isGlobal](https://adimarianmutu.github.io/x-injection/interfaces/ProviderModuleOptions.html#
|
|
193
|
+
> _All modules which are imported into the `AppModule` must have the [isGlobal](https://adimarianmutu.github.io/x-injection/interfaces/ProviderModuleOptions.html#isglobal) option set to `true`, otherwise the [InjectionProviderModuleGlobalMarkError](https://adimarianmutu.github.io/x-injection/classes/InjectionProviderModuleGlobalMarkError.html) exception will be thrown!_
|
|
194
194
|
>
|
|
195
|
-
> _An [InjectionProviderModuleGlobalMarkError](https://adimarianmutu.github.io/x-injection/classes/InjectionProviderModuleGlobalMarkError.html) exception will be thrown also when importing into the `AppModule` a module which does **not** have the [isGlobal](https://adimarianmutu.github.io/x-injection/interfaces/ProviderModuleOptions.html#
|
|
195
|
+
> _An [InjectionProviderModuleGlobalMarkError](https://adimarianmutu.github.io/x-injection/classes/InjectionProviderModuleGlobalMarkError.html) exception will be thrown also when importing into the `AppModule` a module which does **not** have the [isGlobal](https://adimarianmutu.github.io/x-injection/interfaces/ProviderModuleOptions.html#isglobal) flag option!_
|
|
196
196
|
|
|
197
197
|
### Injection Scope
|
|
198
198
|
|
|
@@ -477,7 +477,7 @@ When invoking the [AppModule.register](https://adimarianmutu.github.io/x-injecti
|
|
|
477
477
|
|
|
478
478
|
##### isGlobal
|
|
479
479
|
|
|
480
|
-
When using the [isGlobal](https://adimarianmutu.github.io/x-injection/interfaces/ProviderModuleOptions.html#
|
|
480
|
+
When using the [isGlobal](https://adimarianmutu.github.io/x-injection/interfaces/ProviderModuleOptions.html#isglobal) property if a `module` is imported into the `AppModule` without having the `isGlobal` flag property set, it'll throw an error.
|
|
481
481
|
|
|
482
482
|
This may look redundant, but it may save you _(and your team)_ some hours of debugging in understanding why some `providers` are able to make their way into other `modules`. As those `providers` are now acting as _global_ `providers`.
|
|
483
483
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/constants.ts","../src/decorators/injectable.ts","../src/enums/injection-scope.enum.ts","../src/helpers/scope-converter.ts","../src/helpers/provider-token.ts","../src/helpers/is-class.ts","../src/helpers/is-class-or-function.ts","../src/helpers/is-function.ts","../src/helpers/is-plain-object.ts","../src/core/global-modules-register.ts","../src/core/provider-module-definition.ts","../src/helpers/provider-module.ts","../src/decorators/inject.ts","../src/decorators/multi-inject.ts","../src/decorators/inject-from-base.ts","../src/decorators/named.ts","../src/decorators/optional.ts","../src/decorators/tagged.ts","../src/decorators/unmanaged.ts","../src/errors/base.error.ts","../src/errors/provider-module.error.ts","../src/errors/provider-module-disposed.error.ts","../src/errors/provider-module-missing-identifier.ts","../src/errors/provider-module-global-mark.error.ts","../src/core/global-container.ts","../src/core/provider-module.ts","../src/utils/provider-module.utils.ts","../src/core/app.module.ts"],"sourcesContent":["export * from './core/constants';\nexport * from './decorators';\nexport * from './errors';\nexport * from './enums';\nexport * from './helpers';\n\nexport { GlobalContainer, AppModule, GlobalAppModule, ProviderModule, ProviderModuleDefinition } from './core';\n\nexport type {\n IAppModule,\n AppModuleOptions,\n ProviderModuleOptions,\n ProviderModuleOptionsInternal,\n IProviderModule,\n IProviderModuleDefinition,\n IProviderModuleNaked,\n ExportsList,\n ProviderModuleGetManySignature,\n ProviderModuleGetManyParam,\n DependencyProvider,\n ProviderToken,\n ProviderClassToken,\n ProviderValueToken,\n ProviderFactoryToken,\n ProviderIdentifier,\n ProviderOptions,\n ProviderScopeOption,\n ProviderModuleOrDefinition,\n InternalInitOptions,\n OnEvent,\n} from './types';\n","/** The identifier of the `GlobalAppModule`. */\nexport const GLOBAL_APP_MODULE_ID = 'GlobalAppModule';\n","import { injectable as _injectable } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport { injectionScopeToBindingScope } from '../helpers';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectable} for more details. */\nexport function Injectable(scope?: InjectionScope) {\n if (scope === undefined) return _injectable();\n\n return _injectable(injectionScopeToBindingScope(scope));\n}\n","export enum InjectionScope {\n /** When the service is resolved, the same cached resolved value will be used. */\n Singleton,\n\n /** When the service is resolved, a new resolved value will be used each time. */\n Transient,\n\n /** When the service is resolved within the same container request, the same resolved value will be used. */\n Request,\n}\n","import type { BindingScope } from 'inversify';\n\nimport { InjectionScope } from '../enums';\n\nexport function injectionScopeToBindingScope(injectionScope: InjectionScope): BindingScope {\n switch (injectionScope) {\n case InjectionScope.Singleton:\n return 'Singleton';\n case InjectionScope.Transient:\n return 'Transient';\n case InjectionScope.Request:\n return 'Request';\n }\n}\n\nexport function bindingScopeToInjectionScope(bindingScope: BindingScope): InjectionScope {\n switch (bindingScope) {\n case 'Singleton':\n return InjectionScope.Singleton;\n case 'Transient':\n return InjectionScope.Transient;\n case 'Request':\n return InjectionScope.Request;\n }\n}\n","import { getClassMetadata } from '@inversifyjs/core';\nimport type { ServiceIdentifier } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport type {\n DependencyProvider,\n ProviderClassToken,\n ProviderFactoryToken,\n ProviderIdentifier,\n ProviderOptions,\n ProviderScopeOption,\n ProviderToken,\n ProviderValueToken,\n} from '../types';\nimport { isClass } from './is-class';\nimport { isClassOrFunction } from './is-class-or-function';\nimport { isFunction } from './is-function';\nimport { isPlainObject } from './is-plain-object';\nimport { bindingScopeToInjectionScope } from './scope-converter';\n\nexport namespace ProviderTokenHelpers {\n export function isClassToken<T>(provider: ProviderToken<T>): provider is ProviderClassToken<T> {\n return hasProvideProperty(provider) && 'useClass' in provider;\n }\n\n export function isValueToken<T>(provider: ProviderToken<T>): provider is ProviderValueToken<T> {\n return hasProvideProperty(provider) && 'useValue' in provider;\n }\n\n export function isFactoryToken<T>(provider: ProviderToken<T>): provider is ProviderFactoryToken<T> {\n return hasProvideProperty(provider) && 'useFactory' in provider;\n }\n\n export function isProviderIdentifier<T = any>(value: any): value is ProviderIdentifier<T> {\n return typeof value === 'string' || typeof value === 'symbol' || isClassOrFunction(value);\n }\n\n export function toServiceIdentifier<T = any>(provider: ProviderToken<T>): ServiceIdentifier<T> {\n return isProviderIdentifier(provider) ? provider : provider.provide;\n }\n\n export function toServiceIdentifiers(providers: ProviderToken[]): ServiceIdentifier<unknown>[] {\n return providers.map((provider) => toServiceIdentifier(provider));\n }\n\n export function toDependencyProviderWithOptions<T extends DependencyProvider<any>>(\n original: T,\n // Can be used to override the options\n override?: Partial<T>\n ): T {\n if (isClass(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useClass: (override as any)?.useClass ?? original,\n };\n } else if (isFunction(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useFactory: (override as any)?.useFactory ?? original,\n };\n }\n\n return {\n ...original,\n ...override,\n };\n }\n\n /**\n * The priority order is as follows:\n * 1. From the `ProviderToken.scope`\n * 2. From the class `@Injectable(scope)` decorator\n * 3. From the `ProviderModule` default scope.\n *\n * @param provider The {@link ProviderToken}.\n * @param moduleDefaultScope The module default scope.\n */\n export function getInjectionScopeByPriority(\n provider: ProviderToken,\n moduleDefaultScope: InjectionScope\n ): InjectionScope {\n return tryGetScopeFromProvider(provider) ?? tryGetDecoratorScopeFromClass(provider) ?? moduleDefaultScope;\n }\n\n export function tryGetProviderOptions<T>(\n provider: ProviderToken<T>\n ): (ProviderOptions<T> & ProviderScopeOption) | undefined {\n if (!hasProvideProperty(provider)) return;\n\n return provider as any;\n }\n\n export function tryGetScopeFromProvider(provider: ProviderToken): InjectionScope | undefined {\n const providerOptions = tryGetProviderOptions(provider);\n if (!providerOptions) return;\n\n return providerOptions.scope;\n }\n\n export function tryGetDecoratorScopeFromClass<T = any>(provider: ProviderToken<T>): InjectionScope | undefined {\n const providerClass = toServiceIdentifier(provider);\n if (!isClass(providerClass)) return;\n\n const inversifyScope = getClassMetadata(providerClass as any)?.scope;\n if (!inversifyScope) return;\n\n return bindingScopeToInjectionScope(inversifyScope);\n }\n\n function hasProvideProperty(provider: any): provider is object {\n return isPlainObject(provider) && typeof provider === 'object' && 'provide' in provider;\n }\n}\n","export function isClass(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return Function.prototype.toString.call(v).startsWith('class ');\n}\n","import type { Class } from 'type-fest';\n\nexport function isClassOrFunction(value: any): value is Function | Class<any> {\n return typeof value === 'function';\n}\n","export function isFunction(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return !Function.prototype.toString.call(v).startsWith('class ');\n}\n","/*\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: any): o is object {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/**\n * Each module which uses the `markAsGlobal` marker will\n * register itself into this register.\n *\n * Will then be used by the `AppModule` to make sure that the imported modules\n * are correctly using the global flag option.\n *\n * _Should be empty if all global modules are correctly registered._\n */\nexport const GlobalModuleRegister = new Set<ProviderModuleOrDefinition>();\n","import { InjectionScope } from '../enums';\r\nimport type { IProviderModuleDefinition, ProviderModuleOptions } from '../types';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\n\r\n/**\r\n * Can be used when you _don't_ want to initialize a `ProviderModule` eagerly as each `ProviderModule` has its own _(InversifyJS)_ container\r\n * initialized as soon as you do `new ProviderModule({...})`.\r\n *\r\n * The {@link ProviderModuleDefinition} allows you to just _define_ the `ProviderModule` options so you can _import_ it later into different modules.\r\n *\r\n * You can always edit a property of the definition after instantiation by doing:\r\n *\r\n * ```ts\r\n * const GarageModuleDefinition = new ProviderModuleDefinition({ identifier: 'GarageModuleDefinition' });\r\n *\r\n * // Later in your code\r\n *\r\n * GarageModuleDefinition.imports = [...GarageModuleDefinition.imports, PorscheModule, FerrariModuleDefinition];\r\n *\r\n * // ...\r\n *\r\n * const GarageModule = new ProviderModule(GarageModuleDefinition);\r\n *\r\n * // or\r\n *\r\n * ExistingModule.lazyImport(GarageModuleDefinition);\r\n * ```\r\n *\r\n * **Note:** _This means that you can't expect to be able to inject dependencies from a {@link ProviderModuleDefinition}_\r\n * _as how you would do with an instance of a `ProviderModule`._\r\n */\r\nexport class ProviderModuleDefinition implements IProviderModuleDefinition {\r\n identifier: IProviderModuleDefinition['identifier'];\r\n imports: IProviderModuleDefinition['imports'];\r\n providers: IProviderModuleDefinition['providers'];\r\n exports: IProviderModuleDefinition['exports'];\r\n defaultScope: IProviderModuleDefinition['defaultScope'];\r\n isGlobal: IProviderModuleDefinition['isGlobal'];\r\n onReady: IProviderModuleDefinition['onReady'];\r\n onDispose: IProviderModuleDefinition['onDispose'];\r\n\r\n constructor(moduleOptions: ProviderModuleOptions) {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose } = moduleOptions;\r\n\r\n this.identifier = identifier;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = defaultScope ?? InjectionScope.Singleton;\r\n this.isGlobal = isGlobal ?? false;\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n getDefinition(): ProviderModuleOptions {\r\n return {\r\n identifier: this.identifier,\r\n imports: this.imports,\r\n providers: this.providers,\r\n exports: this.exports,\r\n defaultScope: this.defaultScope,\r\n isGlobal: this.isGlobal,\r\n onReady: this.onReady,\r\n onDispose: this.onDispose,\r\n };\r\n }\r\n\r\n clone(definition?: Partial<ProviderModuleOptions>): IProviderModuleDefinition {\r\n const currentDefinition = this.getDefinition();\r\n\r\n if (!definition) return new ProviderModuleDefinition(currentDefinition);\r\n\r\n return new ProviderModuleDefinition({\r\n ...currentDefinition,\r\n ...definition,\r\n });\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (!this.isGlobal) return;\r\n\r\n GlobalModuleRegister.add(this);\r\n }\r\n}\r\n","import { ProviderModuleDefinition } from '../core/provider-module-definition';\r\nimport type {\r\n IProviderModule,\r\n IProviderModuleDefinition,\r\n LazyExport,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n StaticExport,\r\n} from '../types';\r\nimport { isFunction } from './is-function';\r\n\r\nexport namespace ProviderModuleHelpers {\r\n export function buildInternalConstructorParams(\r\n params: Partial<ProviderModuleOptions & ProviderModuleOptionsInternal>\r\n ): ProviderModuleOptions {\r\n return params as ProviderModuleOptions;\r\n }\r\n\r\n export function getOptionsOrModuleDefinitionOptions(\r\n optionsOrDefinition: ProviderModuleOptions | IProviderModuleDefinition\r\n ): { options: ProviderModuleOptions; internalOptions: ProviderModuleOptionsInternal } {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose, ...internalParams } =\r\n optionsOrDefinition;\r\n const internalOptions = internalParams as ProviderModuleOptionsInternal;\r\n\r\n if (isModuleDefinition(optionsOrDefinition)) {\r\n const ip = internalParams as any;\r\n\r\n // [TO-DO]: Find a better way to handle this as it is confusing\r\n // and we may also forget to update this `delete` operation list.\r\n //\r\n // This is done because the `ProviderModule` constructor can accept both\r\n // the `ProviderModuleOptionsInternal` plain object and `ProviderModuleDefinition` instance.\r\n // So we make sure to delete from the remaining properties (the `internalParams` spread object)\r\n // the properties/methods of the `ProviderModuleDefinition` instance.\r\n delete ip['getDefinition'];\r\n delete ip['clone'];\r\n delete ip['toString'];\r\n }\r\n\r\n return {\r\n options: {\r\n identifier,\r\n imports,\r\n providers,\r\n exports,\r\n defaultScope,\r\n isGlobal,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n };\r\n }\r\n\r\n export function isModuleDefinition(value: any): value is IProviderModuleDefinition {\r\n return value instanceof ProviderModuleDefinition;\r\n }\r\n\r\n export function isLazyExport(exp: any): exp is LazyExport {\r\n return isFunction(exp);\r\n }\r\n\r\n export function tryStaticOrLazyExportToStaticExport(\r\n module: IProviderModule,\r\n exp: StaticExport | LazyExport\r\n ): StaticExport | void {\r\n return isLazyExport(exp) ? exp(module) : exp;\r\n }\r\n}\r\n","import { inject as _inject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#inject} for more details. */\nexport function Inject(provider: ProviderToken) {\n return _inject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { multiInject as _multiInject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#multiinject} for more details. */\nexport function MultiInject(provider: ProviderToken) {\n return _multiInject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { injectFromBase as _injectFromBase } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectfrombase} for more details. */\nexport function InjectFromBase(options?: Parameters<typeof _injectFromBase>[0]) {\n return _injectFromBase(options);\n}\n","import { named as _named, type MetadataName } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#named} for more details. */\nexport function Named(name: MetadataName) {\n return _named(name);\n}\n","import { optional as _optional } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#optional} for more details. */\nexport function Optional() {\n return _optional();\n}\n","import { tagged as _tagged, type MetadataTag } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#tagged} for more details. */\nexport function Tagged(key: MetadataTag, value: unknown) {\n return _tagged(key, value);\n}\n","import { unmanaged as _unmanaged } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#unmanaged} for more details. */\nexport function Unmanaged() {\n return _unmanaged();\n}\n","/** Exception which indicates that there is a generic error. */\nexport class InjectionError extends Error {\n override name = InjectionError.name;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/** Exception which indicates that there is a generic error with an instance of {@link IProviderModule}. */\nexport class InjectionProviderModuleError extends Error {\n override name = InjectionProviderModuleError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(`{ProviderModule.${module.toString()}} => ${message}`);\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an invokation of a disposed module. */\nexport class InjectionProviderModuleDisposedError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleDisposedError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'Has been disposed! You can re-initialize it by using the `_internalInit` method.');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates that a module has been initialized without an `identifier`. */\nexport class InjectionProviderModuleMissingIdentifierError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleMissingIdentifierError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'An `identifier` must be supplied!');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an error with regards to the `isGlobal` option. */\nexport class InjectionProviderModuleGlobalMarkError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleGlobalMarkError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(module, message);\n }\n}\n","import { Container } from 'inversify';\n\n/**\n * The low-level App Container.\n *\n * **Internally used, please use the `AppModule` to interact with it.**\n */\nexport const GlobalContainer = new Container({\n defaultScope: 'Singleton',\n});\n","import { Container, type BindToFluentSyntax, type GetOptions, type IsBoundOptions } from 'inversify';\r\n\r\nimport { InjectionScope } from '../enums';\r\nimport {\r\n InjectionProviderModuleDisposedError,\r\n InjectionProviderModuleError,\r\n InjectionProviderModuleMissingIdentifierError,\r\n} from '../errors';\r\nimport { injectionScopeToBindingScope, isPlainObject, ProviderModuleHelpers, ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n InternalInitOptions,\r\n IProviderModule,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n IProviderModuleDefinition,\r\n IProviderModuleNaked,\r\n ModuleIdentifier,\r\n OnGetEffects,\r\n ProviderModuleGetManyParam,\r\n ProviderModuleGetManySignature,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n ProviderModuleOrDefinition,\r\n ProviderToken,\r\n} from '../types';\r\nimport { ProviderModuleUtils } from '../utils';\r\nimport { GlobalContainer } from './global-container';\r\n\r\n/**\r\n * Modules are highly recommended as an effective way to organize your components.\r\n * For most applications, you'll likely have multiple modules, each encapsulating a closely related set of capabilities.\r\n *\r\n * _See {@link ProviderModuleOptions | ProviderModuleOptions}_.\r\n *\r\n * **Note:** _Check also the {@link IProviderModuleDefinition}._\r\n *\r\n * @example\r\n * ```ts\r\n * const EngineModule = new ProviderModule({\r\n * identifier: Symbol('EngineModule'),\r\n * providers: [EngineService],\r\n * exports: [EngineService]\r\n * });\r\n *\r\n * const DashboardModule = new ProviderModule({\r\n * identifier: Symbol('DashboardModule'),\r\n * providers: [DashboardService],\r\n * exports: [DashboardService]\r\n * });\r\n *\r\n * const CarModule = new ProviderModule({\r\n * identifier: Symbol('CarModule'),\r\n * imports: [EngineModule, DashboardModule],\r\n * providers: [CarService],\r\n * exports: [CarService]\r\n * });\r\n *\r\n * // Run-time class replacement:\r\n * const RedCarModule = new ProviderModule({\r\n * identifier: Symbol('RedCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useClass: RedCarService,\r\n * }\r\n * ],\r\n * });\r\n *\r\n * // Run-time factory example:\r\n * const BlackCarModule = new ProviderModule({\r\n * identifier: Symbol('BlackCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useFactory: (carService: CarService) => {\r\n * carService.setColor('black');\r\n *\r\n * return carService;\r\n * },\r\n * inject: [CarService]\r\n * }\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport class ProviderModule implements IProviderModule {\r\n isDisposed: boolean = false;\r\n\r\n readonly identifier: ModuleIdentifier;\r\n isGlobal: boolean = false;\r\n\r\n protected isAppModule: IProviderModuleNaked['isAppModule'];\r\n protected instantiatedFromDefinition: IProviderModuleNaked['instantiatedFromDefinition'];\r\n protected container!: Container;\r\n protected defaultScope!: IProviderModuleNaked['defaultScope'];\r\n protected onReady: IProviderModuleNaked['onReady'];\r\n protected onDispose: IProviderModuleNaked['onDispose'];\r\n protected moduleUtils!: IProviderModuleNaked['moduleUtils'];\r\n protected imports!: IProviderModuleNaked['imports'];\r\n protected providers!: IProviderModuleNaked['providers'];\r\n protected exports!: IProviderModuleNaked['exports'];\r\n protected registeredSideEffects!: IProviderModuleNaked['registeredSideEffects'];\r\n\r\n constructor(options: ProviderModuleOptions | IProviderModuleDefinition) {\r\n const { options: opts, internalOptions } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options);\r\n\r\n this.identifier = this.setIdentifier(opts.identifier);\r\n this.isDisposed = internalOptions.isDisposed ?? false;\r\n this.isAppModule = internalOptions.isAppModule ?? false;\r\n this.instantiatedFromDefinition = internalOptions.instantiatedFromDefinition ?? false;\r\n\r\n // If this module is the `AppModule`,\r\n // the initialization will be done when the `IProviderModuleNaked._internalInit` method is invoked.\r\n if (this.isAppModule) return;\r\n\r\n this._internalInit({\r\n ...opts,\r\n ...internalOptions,\r\n });\r\n }\r\n\r\n get<T>(provider: ProviderToken<T>, isOptional?: boolean): T {\r\n return this.__get(provider, { optional: isOptional ?? false });\r\n }\r\n\r\n getMany<D extends (ProviderModuleGetManyParam<any> | ProviderToken)[]>(\r\n ...deps: D | unknown[]\r\n ): ProviderModuleGetManySignature<D> {\r\n return (deps as D).map((dep) => {\r\n const withOptions = isPlainObject(dep) && 'provider' in dep;\r\n\r\n return this.get(withOptions ? dep.provider : dep, withOptions ? dep.isOptional : false);\r\n }) as any;\r\n }\r\n\r\n lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.injectImportedModules(modules as ProviderModule[]);\r\n }\r\n\r\n toNaked(): IProviderModuleNaked {\r\n return this as any;\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n const { before, after } = this.onDispose?.() ?? {};\r\n\r\n await before?.(this);\r\n await this.__unbindAll();\r\n\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.container = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.imports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.providers = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.exports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.registeredSideEffects = null;\r\n\r\n this.isDisposed = true;\r\n\r\n await after?.(this);\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private setIdentifier(identifier: ModuleIdentifier): ModuleIdentifier {\r\n if (!identifier) throw new InjectionProviderModuleMissingIdentifierError(this);\r\n\r\n return identifier;\r\n }\r\n\r\n private prepareContainer(params: ProviderModuleOptionsInternal): Container {\r\n if (this.isAppModule) {\r\n return params.container?.() ?? GlobalContainer;\r\n } else if (params.container) {\r\n console.warn(`[xInjection]: The '${this.toString()}' module is overwriting its container!`);\r\n\r\n return params.container();\r\n } else {\r\n return new Container({\r\n parent: GlobalContainer,\r\n defaultScope: this.defaultScope.inversify,\r\n });\r\n }\r\n }\r\n\r\n private injectImportedModules(importedModules?: ProviderModuleOrDefinition[]): void {\r\n if (!importedModules || importedModules.length === 0) return;\r\n\r\n importedModules.forEach((importedModuleOrDefinition) => {\r\n if (importedModuleOrDefinition.toString() === 'GlobalAppModule') {\r\n throw new InjectionProviderModuleError(this, `The 'GlobalAppModule' can't be imported!`);\r\n }\r\n\r\n // If the current module is marked as global\r\n // then let's import it into the `AppModule` automatically in order to mimic NestJS's behavior.\r\n if (!this.isAppModule && importedModuleOrDefinition.isGlobal) {\r\n this.moduleUtils.appModule._importWithoutSecondaryImportCheck(importedModuleOrDefinition);\r\n\r\n return;\r\n }\r\n\r\n const importedModule = (\r\n ProviderModuleHelpers.isModuleDefinition(importedModuleOrDefinition)\r\n ? new ProviderModule(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n ...importedModuleOrDefinition.getDefinition(),\r\n instantiatedFromDefinition: true,\r\n })\r\n )\r\n : importedModuleOrDefinition\r\n ) as ProviderModule;\r\n\r\n importedModule.exports.forEach((exp) => {\r\n const exportable = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, exp);\r\n\r\n // This would happen when the return of the lazy export is `void`.\r\n if (!exportable) return;\r\n\r\n if (exportable instanceof ProviderModule) {\r\n // The current item of the `exports` array is actually\r\n // another ProviderModule, therefore we must recursively drill into it\r\n // to import its exported modules/providers.\r\n this.injectImportedModules([exportable]);\r\n\r\n return;\r\n }\r\n\r\n const providerToken = exportable as ProviderToken;\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(providerToken);\r\n const importedProvider = {\r\n scope: ProviderTokenHelpers.getInjectionScopeByPriority(providerToken, importedModule.defaultScope.native),\r\n provide: serviceIdentifier,\r\n useFactory: () => importedModule.get(providerToken),\r\n // As we are using a factory token, there is no need to include the `onEvent` and `when` properties\r\n // into the processed `ProviderToken` created for this imported provider,\r\n // because the `importedModule.get` invokation will\r\n // fire the `onEvent` and `when` properties of the original imported provider.\r\n };\r\n\r\n this.moduleUtils.bindToContainer(importedProvider, importedModule.defaultScope.native);\r\n\r\n // It is important that we also `unbind` the imported provider when the imported module unbinds it\r\n // as we would not be able anymore to retrieve it because the `importedModule` unbound it.\r\n importedModule.registerSideEffect(providerToken, 'unbind', () => this.__unbind(importedProvider), {\r\n registerModuleId: this.identifier,\r\n });\r\n\r\n // It is also important that we remove our `unbind` effect frm the `importedModule` when the `unbind` method\r\n // will be invoked for this imported provider.\r\n // Not doing so, would create a side-effect where the `importedModule` would invoke `this.__unbind`\r\n // method on an already unbound provider, causing it to throw an error.\r\n this._onUnbind(serviceIdentifier, () => {\r\n const effects = importedModule.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!effects) return;\r\n\r\n effects.onUnbindEffects = effects.onUnbindEffects.filter(\r\n (effect) => effect.registerModuleId !== this.identifier\r\n );\r\n });\r\n });\r\n });\r\n }\r\n\r\n private injectProviders(): void {\r\n this.providers.forEach((provider) => this.moduleUtils.bindToContainer(provider, this.defaultScope.native));\r\n }\r\n\r\n private registerSideEffect(\r\n provider: ProviderToken,\r\n on: 'bind' | 'get' | 'rebind' | 'unbind',\r\n cb: () => Promise<void> | void,\r\n options?: Record<string, any>\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) {\r\n this.registeredSideEffects.set(serviceIdentifier, {\r\n onBindEffects: [],\r\n onGetEffects: [],\r\n onRebindEffects: [],\r\n onUnbindEffects: [],\r\n });\r\n }\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier)!;\r\n\r\n if (on === 'bind') {\r\n providerSideEffects.onBindEffects.push(cb);\r\n } else if (on === 'get') {\r\n providerSideEffects.onGetEffects.push({ once: options!['once'], invoked: false, cb });\r\n } else if (on === 'rebind') {\r\n providerSideEffects.onRebindEffects.push(cb);\r\n } else if (on === 'unbind') {\r\n providerSideEffects.onUnbindEffects.push({ registerModuleId: options?.['registerModuleId'], cb });\r\n }\r\n }\r\n\r\n private invokeRegisteredSideEffects(\r\n provider: ProviderToken,\r\n event: 'onBind' | 'onGet' | 'onRebind' | 'onUnbind'\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!providerSideEffects) return;\r\n\r\n providerSideEffects[`${event}Effects`].forEach((p) => {\r\n if (typeof p === 'function') return p();\r\n\r\n if (event === 'onGet') {\r\n const options = p as OnGetEffects;\r\n\r\n if (options.invoked && options.once) return;\r\n\r\n options.invoked = true;\r\n }\r\n\r\n p.cb();\r\n });\r\n }\r\n\r\n private async removeRegisteredSideEffects(provider: ProviderToken | 'all'): Promise<void> {\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects) return;\r\n\r\n if (provider === 'all') {\r\n this.registeredSideEffects.forEach(({ onUnbindEffects }) => onUnbindEffects.forEach((effect) => effect.cb()));\r\n this.registeredSideEffects.clear();\r\n\r\n return;\r\n }\r\n\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) return;\r\n\r\n /* istanbul ignore next */\r\n const unbindEffects = this.registeredSideEffects.get(serviceIdentifier)?.onUnbindEffects ?? [];\r\n for (const effect of unbindEffects) {\r\n await effect.cb();\r\n }\r\n\r\n this.registeredSideEffects.delete(serviceIdentifier);\r\n }\r\n\r\n private shouldThrowIfDisposed(): void {\r\n if (this.container !== null) return;\r\n\r\n throw new InjectionProviderModuleDisposedError(this);\r\n }\r\n\r\n //#region IProviderModuleNaked methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._internalInit}.\r\n */\r\n protected _internalInit(options: InternalInitOptions | IProviderModuleDefinition): IProviderModule {\r\n const {\r\n options: {\r\n isGlobal,\r\n imports = [],\r\n providers = [],\r\n exports = [],\r\n defaultScope = InjectionScope.Singleton,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options as any);\r\n\r\n this.isGlobal = isGlobal ?? false;\r\n this.isDisposed = false;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = { native: defaultScope, inversify: injectionScopeToBindingScope(defaultScope) };\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.container = this.prepareContainer({ ...internalOptions });\r\n this.moduleUtils = new ProviderModuleUtils(this, internalOptions);\r\n this.registeredSideEffects = new Map();\r\n\r\n this.injectImportedModules(this.imports as any);\r\n this.injectProviders();\r\n\r\n this.onReady?.(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onBind}.\r\n */\r\n protected _onBind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'bind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onGet}.\r\n */\r\n protected _onGet<T>(provider: ProviderToken<T>, once: boolean, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n if (typeof once !== 'boolean') {\r\n throw new InjectionProviderModuleError(\r\n this,\r\n `The 'once' parameter is required when using the '${this._onGet.name}' method!`\r\n );\r\n }\r\n\r\n this.registerSideEffect(provider, 'get', cb, { once });\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onRebind}.\r\n */\r\n protected _onRebind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'rebind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onUnbind}.\r\n */\r\n protected _onUnbind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'unbind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._overwriteContainer}.\r\n */\r\n protected _overwriteContainer(cb: () => Container): void {\r\n this.container = cb();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region InversifyJS Container native methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__bind}.\r\n */\r\n /* istanbul ignore next */\r\n protected __bind<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onBind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__get}.\r\n */\r\n /* istanbul ignore next */\r\n protected __get<T>(provider: ProviderToken<T>, options?: GetOptions): T {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onGet');\r\n\r\n return this.container.get(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected __getAll<T>(provider: ProviderToken<T>, options?: GetOptions): T[] {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAll(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAllAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAllAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T[]> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAllAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isCurrentBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isCurrentBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isCurrentBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__takeSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __takeSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.snapshot();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__restoreSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __restoreSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.restore();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __rebind<T>(provider: ProviderToken<T>): Promise<BindToFluentSyntax<T>> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = await this.container.rebind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __rebindSync<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.rebindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbind(provider: ProviderToken): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n await this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __unbindSync(provider: ProviderToken): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.unbindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbindAll(): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbindAll();\r\n\r\n await this.removeRegisteredSideEffects('all');\r\n }\r\n\r\n //#endregion\r\n}\r\n","import type { BindInWhenOnFluentSyntax, BindOnFluentSyntax, BindWhenOnFluentSyntax, Container } from 'inversify';\r\n\r\nimport { AppModule, GlobalModuleRegister } from '../core';\r\nimport { InjectionScope } from '../enums';\r\nimport { ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n DependencyProvider,\r\n IProviderModule,\r\n IProviderModuleNaked,\r\n ProviderClassToken,\r\n ProviderFactoryToken,\r\n ProviderIdentifier,\r\n ProviderModuleOptionsInternal,\r\n ProviderOptions,\r\n ProviderToken,\r\n ProviderValueToken,\r\n} from '../types';\r\n\r\n/**\r\n * Class containing an internal set of `utils`.\r\n *\r\n * Each {@link IProviderModuleNaked.moduleUtils | ProviderModule} instance has its own {@link ProviderModuleUtils} property instance.\r\n */\r\nexport class ProviderModuleUtils {\r\n /** The low-level InversifyJS {@link Container} owned by {@link ProviderModuleUtils.module | module}. */\r\n get container(): Container {\r\n return this.moduleNaked.container;\r\n }\r\n\r\n readonly appModule = AppModule;\r\n /** The parent {@link IProviderModule | ProviderModule} of `this` instance. */\r\n readonly module: IProviderModule;\r\n readonly moduleNaked: IProviderModuleNaked;\r\n\r\n constructor(module: IProviderModule, internalOptions: ProviderModuleOptionsInternal) {\r\n this.module = module;\r\n this.moduleNaked = module.toNaked();\r\n\r\n this.appModule = internalOptions.appModule?.() ?? this.appModule;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n /**\r\n * Low-level method which can be used to manually register _(bind)_ a new {@link provider} into the {@link ProviderModuleUtils.module | module} container.\r\n *\r\n * **Note:** _You shouldn't directly use this to register providers as they will not appear_\r\n * _into the module's `imports` and `exports` arrays! Therefore leading to unexpected bugs and confusion!_\r\n *\r\n * @param provider The {@link ProviderToken | provider} to register.\r\n * @param defaultScope Optionally provide the default {@link InjectionScope} to use when applicable.\r\n * @returns `true` when the {@link provider} has been bound otherwhise `false`.\r\n */\r\n bindToContainer<T>(provider: DependencyProvider<T>, defaultScope: InjectionScope): boolean {\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) {\r\n return this.bindSelfTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isClassToken(provider)) {\r\n return this.bindClassTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isValueToken(provider)) {\r\n return this.bindValueTokenToContainer(provider);\r\n } else if (ProviderTokenHelpers.isFactoryToken(provider)) {\r\n return this.bindFactoryTokenToContainer(provider, defaultScope);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (this.moduleNaked.isAppModule || !this.module.isGlobal || this.moduleNaked.instantiatedFromDefinition) {\r\n return;\r\n }\r\n\r\n GlobalModuleRegister.add(this.module);\r\n }\r\n\r\n private bindSelfTokenToContainer<T>(provider: ProviderIdentifier<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toSelf(),\r\n defaultScope\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindClassTokenToContainer<T>(provider: ProviderClassToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).to(provider.useClass),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindValueTokenToContainer<T>(provider: ProviderValueToken<T>): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toConstantValue(provider.useValue)\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindFactoryTokenToContainer<T>(provider: ProviderFactoryToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container\r\n .bind(ProviderTokenHelpers.toServiceIdentifier(provider))\r\n .toResolvedValue(provider.useFactory, ProviderTokenHelpers.toServiceIdentifiers(provider.inject ?? [])),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n /** Sets the {@link InjectionScope} of a bound {@link provider}. */\r\n private setBindingScope<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindInWhenOnFluentSyntax<T>,\r\n defaultScope: InjectionScope\r\n ): BindWhenOnFluentSyntax<T> {\r\n // A constant token will always be a singleton.\r\n if (ProviderTokenHelpers.isValueToken(provider)) return binding;\r\n\r\n const injectionScope = ProviderTokenHelpers.getInjectionScopeByPriority(provider, defaultScope);\r\n\r\n switch (injectionScope) {\r\n case InjectionScope.Singleton:\r\n return binding.inSingletonScope();\r\n case InjectionScope.Transient:\r\n return binding.inTransientScope();\r\n case InjectionScope.Request:\r\n return binding.inRequestScope();\r\n }\r\n }\r\n\r\n /** Sets the `when` clause of a bound {@link provider}. */\r\n private setWhenBinding<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindWhenOnFluentSyntax<T>\r\n ): BindOnFluentSyntax<unknown> {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return binding;\r\n\r\n const when = (provider as ProviderOptions<unknown>).when;\r\n if (!when) return binding;\r\n\r\n return binding.when(when);\r\n }\r\n\r\n /** Sets the `activation` and `deactivation` events of a bound {@link provider}. */\r\n private setBindingOnEvent(provider: ProviderToken, binding: BindOnFluentSyntax<any>): void {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return;\r\n\r\n const opts = provider as ProviderOptions<unknown>;\r\n\r\n if (opts.onEvent?.activation) {\r\n binding.onActivation(opts.onEvent.activation);\r\n }\r\n\r\n if (opts.onEvent?.deactivation) {\r\n binding.onDeactivation(opts.onEvent.deactivation);\r\n }\r\n }\r\n}\r\n","import { InjectionError, InjectionProviderModuleGlobalMarkError } from '../errors';\r\nimport { ProviderModuleHelpers } from '../helpers';\r\nimport type {\r\n AppModuleOptions,\r\n ExportsList,\r\n IAppModule,\r\n IProviderModuleNaked,\r\n ProviderModuleOrDefinition,\r\n} from '../types';\r\nimport { GLOBAL_APP_MODULE_ID } from './constants';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\nimport { ProviderModule } from './provider-module';\r\n\r\n/**\r\n * Class of the {@link AppModule} instance.\r\n *\r\n * **You shouldn't initialize a new instance of this class, please use the {@link AppModule} instance!**\r\n */\r\nexport class GlobalAppModule extends ProviderModule implements IAppModule {\r\n _strict: AppModuleOptions['_strict'];\r\n\r\n private nakedModule = this as unknown as IProviderModuleNaked;\r\n private isLoaded = false;\r\n\r\n constructor() {\r\n super(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n identifier: GLOBAL_APP_MODULE_ID,\r\n isAppModule: true,\r\n })\r\n );\r\n }\r\n\r\n register<AsNaked extends boolean = false>(\r\n options: AppModuleOptions\r\n ): AsNaked extends false ? IAppModule : IAppModule & IProviderModuleNaked {\r\n if (this.isLoaded) {\r\n throw new InjectionError(`The '${this.toString()}' has already been registered!`);\r\n }\r\n\r\n this._strict = options._strict ?? true;\r\n\r\n this.nakedModule._internalInit(options);\r\n\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, this.imports);\r\n\r\n this.isLoaded = true;\r\n\r\n return this as any;\r\n }\r\n\r\n override lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n /* istanbul ignore next */\r\n override toNaked(): IAppModule & IProviderModuleNaked {\r\n return super.toNaked() as any;\r\n }\r\n\r\n override async dispose(): Promise<void> {\r\n this.isLoaded = false;\r\n\r\n await super.dispose();\r\n }\r\n\r\n /** **Internally used, do not use!** */\r\n _importWithoutSecondaryImportCheck(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules, true);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n private checkIfRegisteredModulesHaveGlobalMark(\r\n parentModule: IProviderModuleNaked,\r\n list: ExportsList,\r\n isSecondaryImport = false\r\n ): void {\r\n if (!this._strict) return;\r\n\r\n list.forEach((m) => {\r\n const module = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, m) as IProviderModuleNaked;\r\n const isModuleDefinition = ProviderModuleHelpers.isModuleDefinition(module);\r\n\r\n if (!(module instanceof ProviderModule) && !isModuleDefinition) return;\r\n\r\n if (module.isGlobal) {\r\n GlobalModuleRegister.delete(module);\r\n\r\n // This module may also export other modules\r\n // which may have been marked as global\r\n // and not directly imported into the `AppModule`.\r\n if (module.exports) {\r\n this.checkIfRegisteredModulesHaveGlobalMark(module, module.exports, true);\r\n }\r\n\r\n return;\r\n }\r\n\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n isSecondaryImport\r\n ? 'Is not marked as `global` but has been imported into the `AppModule` ' +\r\n `via the \\`${parentModule.toString()}\\` module!`\r\n : 'Is not marked as `global` but has been imported into the `AppModule`!'\r\n );\r\n });\r\n\r\n if (isSecondaryImport) return;\r\n\r\n GlobalModuleRegister.forEach((module) => {\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n `Is marked as 'global' and has not been imported into the 'AppModule'!`\r\n );\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Special instance of {@link ProviderModule} which acts as the global module of your application in which you can inject any provider\r\n * which must be available through your entire application.\r\n *\r\n * The registered providers will automatically be available inside all the modules.\r\n *\r\n * @example\r\n * ```ts\r\n * // The `register` method must be invoked only once during your application life cycle!\r\n * AppModule.register({\r\n * imports: [ConfigModule, ApiModule, UserModule, DatabaseModule],\r\n * providers: [DummyService],\r\n * });\r\n * ```\r\n */\r\nexport const AppModule = new GlobalAppModule();\r\n"],"mappings":"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","names":["GLOBAL_APP_MODULE_ID","InjectionScope","injectionScopeToBindingScope","injectionScope","InjectionScope","Singleton","Transient","Request","bindingScopeToInjectionScope","bindingScope","isClass","v","Function","prototype","toString","call","startsWith","isClassOrFunction","value","isFunction","v","Function","prototype","toString","call","startsWith","isObject","o","Object","prototype","toString","call","isPlainObject","ctor","constructor","undefined","prot","hasOwnProperty","ProviderTokenHelpers","isClassToken","provider","hasProvideProperty","isValueToken","isFactoryToken","isProviderIdentifier","value","isClassOrFunction","toServiceIdentifier","provide","toServiceIdentifiers","providers","map","toDependencyProviderWithOptions","original","override","isClass","useClass","isFunction","useFactory","getInjectionScopeByPriority","moduleDefaultScope","tryGetScopeFromProvider","tryGetDecoratorScopeFromClass","tryGetProviderOptions","providerOptions","scope","providerClass","inversifyScope","getClassMetadata","bindingScopeToInjectionScope","isPlainObject","GlobalModuleRegister","Set","ProviderModuleDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","constructor","moduleOptions","InjectionScope","Singleton","checkIfShouldBeAddedToTheGlobalRegister","getDefinition","clone","definition","currentDefinition","toString","description","GlobalModuleRegister","add","ProviderModuleHelpers","buildInternalConstructorParams","params","getOptionsOrModuleDefinitionOptions","optionsOrDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","internalParams","internalOptions","isModuleDefinition","ip","options","value","ProviderModuleDefinition","isLazyExport","exp","isFunction","tryStaticOrLazyExportToStaticExport","module","Injectable","scope","undefined","_injectable","injectionScopeToBindingScope","import_inversify","Inject","provider","_inject","ProviderTokenHelpers","toServiceIdentifier","import_inversify","MultiInject","provider","_multiInject","ProviderTokenHelpers","toServiceIdentifier","import_inversify","InjectFromBase","options","_injectFromBase","import_inversify","Named","name","_named","import_inversify","Optional","_optional","import_inversify","Tagged","key","value","_tagged","import_inversify","Unmanaged","_unmanaged","InjectionError","Error","name","InjectionProviderModuleError","Error","name","constructor","module","message","toString","InjectionProviderModuleDisposedError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleMissingIdentifierError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleGlobalMarkError","InjectionProviderModuleError","name","constructor","module","message","import_inversify","GlobalContainer","Container","defaultScope","import_inversify","ProviderModuleUtils","container","moduleNaked","appModule","AppModule","module","constructor","internalOptions","toNaked","checkIfShouldBeAddedToTheGlobalRegister","bindToContainer","provider","defaultScope","ProviderTokenHelpers","isProviderIdentifier","bindSelfTokenToContainer","isClassToken","bindClassTokenToContainer","isValueToken","bindValueTokenToContainer","isFactoryToken","bindFactoryTokenToContainer","isAppModule","isGlobal","instantiatedFromDefinition","GlobalModuleRegister","add","setBindingScope","bind","toServiceIdentifier","toSelf","__isCurrentBound","setBindingOnEvent","setWhenBinding","to","useClass","toConstantValue","useValue","toResolvedValue","useFactory","toServiceIdentifiers","inject","binding","injectionScope","getInjectionScopeByPriority","InjectionScope","Singleton","inSingletonScope","Transient","inTransientScope","Request","inRequestScope","when","opts","onEvent","activation","onActivation","deactivation","onDeactivation","ProviderModule","isDisposed","identifier","isGlobal","isAppModule","instantiatedFromDefinition","container","defaultScope","onReady","onDispose","moduleUtils","imports","providers","exports","registeredSideEffects","constructor","options","opts","internalOptions","ProviderModuleHelpers","getOptionsOrModuleDefinitionOptions","setIdentifier","_internalInit","get","provider","isOptional","__get","optional","getMany","deps","map","dep","withOptions","isPlainObject","lazyImport","modules","injectImportedModules","toNaked","dispose","before","after","__unbindAll","toString","description","InjectionProviderModuleMissingIdentifierError","prepareContainer","params","GlobalContainer","console","warn","Container","parent","inversify","importedModules","length","forEach","importedModuleOrDefinition","InjectionProviderModuleError","appModule","_importWithoutSecondaryImportCheck","importedModule","isModuleDefinition","buildInternalConstructorParams","getDefinition","exp","exportable","tryStaticOrLazyExportToStaticExport","providerToken","serviceIdentifier","ProviderTokenHelpers","toServiceIdentifier","importedProvider","scope","getInjectionScopeByPriority","native","provide","useFactory","bindToContainer","registerSideEffect","__unbind","registerModuleId","_onUnbind","effects","onUnbindEffects","filter","effect","injectProviders","on","cb","has","set","onBindEffects","onGetEffects","onRebindEffects","providerSideEffects","push","once","invoked","invokeRegisteredSideEffects","event","p","removeRegisteredSideEffects","clear","unbindEffects","delete","shouldThrowIfDisposed","InjectionProviderModuleDisposedError","InjectionScope","Singleton","injectionScopeToBindingScope","ProviderModuleUtils","Map","_onBind","_onGet","name","_onRebind","_overwriteContainer","__bind","binding","bind","__getAsync","getAsync","__getAll","getAll","__getAllAsync","getAllAsync","__isBound","isBound","__isCurrentBound","isCurrentBound","__takeSnapshot","snapshot","__restoreSnapshot","restore","__rebind","rebind","__rebindSync","rebindSync","unbind","__unbindSync","unbindSync","unbindAll","GlobalAppModule","ProviderModule","_strict","nakedModule","isLoaded","constructor","ProviderModuleHelpers","buildInternalConstructorParams","identifier","GLOBAL_APP_MODULE_ID","isAppModule","register","options","InjectionError","toString","_internalInit","checkIfRegisteredModulesHaveGlobalMark","imports","lazyImport","modules","toNaked","dispose","_importWithoutSecondaryImportCheck","parentModule","list","isSecondaryImport","forEach","m","module","tryStaticOrLazyExportToStaticExport","isModuleDefinition","isGlobal","GlobalModuleRegister","delete","exports","InjectionProviderModuleGlobalMarkError","AppModule"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/constants.ts","../src/decorators/injectable.ts","../src/enums/injection-scope.enum.ts","../src/helpers/scope-converter.ts","../src/helpers/provider-token.ts","../src/helpers/is-class.ts","../src/helpers/is-class-or-function.ts","../src/helpers/is-function.ts","../src/helpers/is-plain-object.ts","../src/core/global-modules-register.ts","../src/core/provider-module-definition.ts","../src/helpers/provider-module.ts","../src/decorators/inject.ts","../src/decorators/multi-inject.ts","../src/decorators/inject-from-base.ts","../src/decorators/named.ts","../src/decorators/optional.ts","../src/decorators/tagged.ts","../src/decorators/unmanaged.ts","../src/errors/base.error.ts","../src/errors/provider-module.error.ts","../src/errors/provider-module-disposed.error.ts","../src/errors/provider-module-missing-identifier.ts","../src/errors/provider-module-global-mark.error.ts","../src/core/global-container.ts","../src/core/provider-module.ts","../src/utils/provider-module.utils.ts","../src/core/app.module.ts"],"sourcesContent":["export * from './core/constants';\nexport * from './decorators';\nexport * from './errors';\nexport * from './enums';\nexport * from './helpers';\n\nexport { GlobalContainer, AppModule, GlobalAppModule, ProviderModule, ProviderModuleDefinition } from './core';\n\nexport type {\n IAppModule,\n AppModuleOptions,\n ProviderModuleOptions,\n ProviderModuleOptionsInternal,\n IProviderModule,\n IProviderModuleDefinition,\n IProviderModuleNaked,\n ExportsList,\n ProviderModuleGetManySignature,\n ProviderModuleGetManyParam,\n DependencyProvider,\n ProviderToken,\n ProviderClassToken,\n ProviderValueToken,\n ProviderFactoryToken,\n ProviderIdentifier,\n ProviderOptions,\n ProviderScopeOption,\n ProviderModuleOrDefinition,\n InternalInitOptions,\n OnEvent,\n} from './types';\n","/** The identifier of the `GlobalAppModule`. */\nexport const GLOBAL_APP_MODULE_ID = 'GlobalAppModule';\n","import { injectable as _injectable } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport { injectionScopeToBindingScope } from '../helpers';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectable} for more details. */\nexport function Injectable(scope?: InjectionScope) {\n if (scope === undefined) return _injectable();\n\n return _injectable(injectionScopeToBindingScope(scope));\n}\n","export enum InjectionScope {\n /** When the service is resolved, the same cached resolved value will be used. */\n Singleton,\n\n /** When the service is resolved, a new resolved value will be used each time. */\n Transient,\n\n /** When the service is resolved within the same container request, the same resolved value will be used. */\n Request,\n}\n","import type { BindingScope } from 'inversify';\n\nimport { InjectionScope } from '../enums';\n\nexport function injectionScopeToBindingScope(injectionScope: InjectionScope): BindingScope {\n switch (injectionScope) {\n case InjectionScope.Singleton:\n return 'Singleton';\n case InjectionScope.Transient:\n return 'Transient';\n case InjectionScope.Request:\n return 'Request';\n }\n}\n\nexport function bindingScopeToInjectionScope(bindingScope: BindingScope): InjectionScope {\n switch (bindingScope) {\n case 'Singleton':\n return InjectionScope.Singleton;\n case 'Transient':\n return InjectionScope.Transient;\n case 'Request':\n return InjectionScope.Request;\n }\n}\n","import { getClassMetadata } from '@inversifyjs/core';\nimport type { ServiceIdentifier } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport type {\n DependencyProvider,\n ProviderClassToken,\n ProviderFactoryToken,\n ProviderIdentifier,\n ProviderOptions,\n ProviderScopeOption,\n ProviderToken,\n ProviderValueToken,\n} from '../types';\nimport { isClass } from './is-class';\nimport { isClassOrFunction } from './is-class-or-function';\nimport { isFunction } from './is-function';\nimport { isPlainObject } from './is-plain-object';\nimport { bindingScopeToInjectionScope } from './scope-converter';\n\nexport namespace ProviderTokenHelpers {\n export function isClassToken<T>(provider: ProviderToken<T>): provider is ProviderClassToken<T> {\n return hasProvideProperty(provider) && 'useClass' in provider;\n }\n\n export function isValueToken<T>(provider: ProviderToken<T>): provider is ProviderValueToken<T> {\n return hasProvideProperty(provider) && 'useValue' in provider;\n }\n\n export function isFactoryToken<T>(provider: ProviderToken<T>): provider is ProviderFactoryToken<T> {\n return hasProvideProperty(provider) && 'useFactory' in provider;\n }\n\n export function isProviderIdentifier<T = any>(value: any): value is ProviderIdentifier<T> {\n return typeof value === 'string' || typeof value === 'symbol' || isClassOrFunction(value);\n }\n\n export function toServiceIdentifier<T = any>(provider: ProviderToken<T>): ServiceIdentifier<T> {\n return isProviderIdentifier(provider) ? provider : provider.provide;\n }\n\n export function toServiceIdentifiers(providers: ProviderToken[]): ServiceIdentifier<unknown>[] {\n return providers.map((provider) => toServiceIdentifier(provider));\n }\n\n export function toDependencyProviderWithOptions<T extends DependencyProvider<any>>(\n original: T,\n // Can be used to override the options\n override?: Partial<T>\n ): T {\n if (isClass(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useClass: (override as any)?.useClass ?? original,\n };\n } else if (isFunction(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useFactory: (override as any)?.useFactory ?? original,\n };\n }\n\n return {\n ...original,\n ...override,\n };\n }\n\n /**\n * The priority order is as follows:\n * 1. From the `ProviderToken.scope`\n * 2. From the class `@Injectable(scope)` decorator\n * 3. From the `ProviderModule` default scope.\n *\n * @param provider The {@link ProviderToken}.\n * @param moduleDefaultScope The module default scope.\n */\n export function getInjectionScopeByPriority(\n provider: ProviderToken,\n moduleDefaultScope: InjectionScope\n ): InjectionScope {\n return tryGetScopeFromProvider(provider) ?? tryGetDecoratorScopeFromClass(provider) ?? moduleDefaultScope;\n }\n\n export function tryGetProviderOptions<T>(\n provider: ProviderToken<T>\n ): (ProviderOptions<T> & ProviderScopeOption) | undefined {\n if (!hasProvideProperty(provider)) return;\n\n return provider as any;\n }\n\n export function tryGetScopeFromProvider(provider: ProviderToken): InjectionScope | undefined {\n const providerOptions = tryGetProviderOptions(provider);\n if (!providerOptions) return;\n\n return providerOptions.scope;\n }\n\n export function tryGetDecoratorScopeFromClass<T = any>(provider: ProviderToken<T>): InjectionScope | undefined {\n const providerClass = toServiceIdentifier(provider);\n if (!isClass(providerClass)) return;\n\n const inversifyScope = getClassMetadata(providerClass as any)?.scope;\n if (!inversifyScope) return;\n\n return bindingScopeToInjectionScope(inversifyScope);\n }\n\n function hasProvideProperty(provider: any): provider is object {\n return isPlainObject(provider) && typeof provider === 'object' && 'provide' in provider;\n }\n}\n","export function isClass(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return Function.prototype.toString.call(v).startsWith('class ');\n}\n","import type { Class } from 'type-fest';\n\nexport function isClassOrFunction(value: any): value is Function | Class<any> {\n return typeof value === 'function';\n}\n","export function isFunction(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return !Function.prototype.toString.call(v).startsWith('class ');\n}\n","/*\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: any): o is object {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/**\n * Each module which uses the `isGlobal` marker will\n * register itself into this register.\n *\n * Will then be used by the `AppModule` to make sure that the imported modules\n * are correctly using the global flag option.\n *\n * _Should be empty if all global modules are correctly registered._\n */\nexport const GlobalModuleRegister = new Set<ProviderModuleOrDefinition>();\n","import { InjectionScope } from '../enums';\r\nimport type { IProviderModuleDefinition, ProviderModuleOptions } from '../types';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\n\r\n/**\r\n * Can be used when you _don't_ want to initialize a `ProviderModule` eagerly as each `ProviderModule` has its own _(InversifyJS)_ container\r\n * initialized as soon as you do `new ProviderModule({...})`.\r\n *\r\n * The {@link ProviderModuleDefinition} allows you to just _define_ the `ProviderModule` options so you can _import_ it later into different modules.\r\n *\r\n * You can always edit a property of the definition after instantiation by doing:\r\n *\r\n * ```ts\r\n * const GarageModuleDefinition = new ProviderModuleDefinition({ identifier: 'GarageModuleDefinition' });\r\n *\r\n * // Later in your code\r\n *\r\n * GarageModuleDefinition.imports = [...GarageModuleDefinition.imports, PorscheModule, FerrariModuleDefinition];\r\n *\r\n * // ...\r\n *\r\n * const GarageModule = new ProviderModule(GarageModuleDefinition);\r\n *\r\n * // or\r\n *\r\n * ExistingModule.lazyImport(GarageModuleDefinition);\r\n * ```\r\n *\r\n * **Note:** _This means that you can't expect to be able to inject dependencies from a {@link ProviderModuleDefinition}_\r\n * _as how you would do with an instance of a `ProviderModule`._\r\n */\r\nexport class ProviderModuleDefinition implements IProviderModuleDefinition {\r\n identifier: IProviderModuleDefinition['identifier'];\r\n imports: IProviderModuleDefinition['imports'];\r\n providers: IProviderModuleDefinition['providers'];\r\n exports: IProviderModuleDefinition['exports'];\r\n defaultScope: IProviderModuleDefinition['defaultScope'];\r\n isGlobal: IProviderModuleDefinition['isGlobal'];\r\n onReady: IProviderModuleDefinition['onReady'];\r\n onDispose: IProviderModuleDefinition['onDispose'];\r\n\r\n constructor(moduleOptions: ProviderModuleOptions) {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose } = moduleOptions;\r\n\r\n this.identifier = identifier;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = defaultScope ?? InjectionScope.Singleton;\r\n this.isGlobal = isGlobal ?? false;\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n getDefinition(): ProviderModuleOptions {\r\n return {\r\n identifier: this.identifier,\r\n imports: this.imports,\r\n providers: this.providers,\r\n exports: this.exports,\r\n defaultScope: this.defaultScope,\r\n isGlobal: this.isGlobal,\r\n onReady: this.onReady,\r\n onDispose: this.onDispose,\r\n };\r\n }\r\n\r\n clone(definition?: Partial<ProviderModuleOptions>): IProviderModuleDefinition {\r\n const currentDefinition = this.getDefinition();\r\n\r\n if (!definition) return new ProviderModuleDefinition(currentDefinition);\r\n\r\n return new ProviderModuleDefinition({\r\n ...currentDefinition,\r\n ...definition,\r\n });\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (!this.isGlobal) return;\r\n\r\n GlobalModuleRegister.add(this);\r\n }\r\n}\r\n","import { ProviderModuleDefinition } from '../core/provider-module-definition';\r\nimport type {\r\n IProviderModule,\r\n IProviderModuleDefinition,\r\n LazyExport,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n StaticExport,\r\n} from '../types';\r\nimport { isFunction } from './is-function';\r\n\r\nexport namespace ProviderModuleHelpers {\r\n export function buildInternalConstructorParams(\r\n params: Partial<ProviderModuleOptions & ProviderModuleOptionsInternal>\r\n ): ProviderModuleOptions {\r\n return params as ProviderModuleOptions;\r\n }\r\n\r\n export function getOptionsOrModuleDefinitionOptions(\r\n optionsOrDefinition: ProviderModuleOptions | IProviderModuleDefinition\r\n ): { options: ProviderModuleOptions; internalOptions: ProviderModuleOptionsInternal } {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose, ...internalParams } =\r\n optionsOrDefinition;\r\n const internalOptions = internalParams as ProviderModuleOptionsInternal;\r\n\r\n if (isModuleDefinition(optionsOrDefinition)) {\r\n const ip = internalParams as any;\r\n\r\n // [TO-DO]: Find a better way to handle this as it is confusing\r\n // and we may also forget to update this `delete` operation list.\r\n //\r\n // This is done because the `ProviderModule` constructor can accept both\r\n // the `ProviderModuleOptionsInternal` plain object and `ProviderModuleDefinition` instance.\r\n // So we make sure to delete from the remaining properties (the `internalParams` spread object)\r\n // the properties/methods of the `ProviderModuleDefinition` instance.\r\n delete ip['getDefinition'];\r\n delete ip['clone'];\r\n delete ip['toString'];\r\n }\r\n\r\n return {\r\n options: {\r\n identifier,\r\n imports,\r\n providers,\r\n exports,\r\n defaultScope,\r\n isGlobal,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n };\r\n }\r\n\r\n export function isModuleDefinition(value: any): value is IProviderModuleDefinition {\r\n return value instanceof ProviderModuleDefinition;\r\n }\r\n\r\n export function isLazyExport(exp: any): exp is LazyExport {\r\n return isFunction(exp);\r\n }\r\n\r\n export function tryStaticOrLazyExportToStaticExport(\r\n module: IProviderModule,\r\n exp: StaticExport | LazyExport\r\n ): StaticExport | void {\r\n return isLazyExport(exp) ? exp(module) : exp;\r\n }\r\n}\r\n","import { inject as _inject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#inject} for more details. */\nexport function Inject(provider: ProviderToken) {\n return _inject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { multiInject as _multiInject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#multiinject} for more details. */\nexport function MultiInject(provider: ProviderToken) {\n return _multiInject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { injectFromBase as _injectFromBase } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectfrombase} for more details. */\nexport function InjectFromBase(options?: Parameters<typeof _injectFromBase>[0]) {\n return _injectFromBase(options);\n}\n","import { named as _named, type MetadataName } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#named} for more details. */\nexport function Named(name: MetadataName) {\n return _named(name);\n}\n","import { optional as _optional } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#optional} for more details. */\nexport function Optional() {\n return _optional();\n}\n","import { tagged as _tagged, type MetadataTag } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#tagged} for more details. */\nexport function Tagged(key: MetadataTag, value: unknown) {\n return _tagged(key, value);\n}\n","import { unmanaged as _unmanaged } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#unmanaged} for more details. */\nexport function Unmanaged() {\n return _unmanaged();\n}\n","/** Exception which indicates that there is a generic error. */\nexport class InjectionError extends Error {\n override name = InjectionError.name;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/** Exception which indicates that there is a generic error with an instance of {@link IProviderModule}. */\nexport class InjectionProviderModuleError extends Error {\n override name = InjectionProviderModuleError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(`{ProviderModule.${module.toString()}} => ${message}`);\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an invokation of a disposed module. */\nexport class InjectionProviderModuleDisposedError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleDisposedError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'Has been disposed! You can re-initialize it by using the `_internalInit` method.');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates that a module has been initialized without an `identifier`. */\nexport class InjectionProviderModuleMissingIdentifierError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleMissingIdentifierError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'An `identifier` must be supplied!');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an error with regards to the `isGlobal` option. */\nexport class InjectionProviderModuleGlobalMarkError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleGlobalMarkError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(module, message);\n }\n}\n","import { Container } from 'inversify';\n\n/**\n * The low-level App Container.\n *\n * **Internally used, please use the `AppModule` to interact with it.**\n */\nexport const GlobalContainer = new Container({\n defaultScope: 'Singleton',\n});\n","import { Container, type BindToFluentSyntax, type GetOptions, type IsBoundOptions } from 'inversify';\r\n\r\nimport { InjectionScope } from '../enums';\r\nimport {\r\n InjectionProviderModuleDisposedError,\r\n InjectionProviderModuleError,\r\n InjectionProviderModuleMissingIdentifierError,\r\n} from '../errors';\r\nimport { injectionScopeToBindingScope, isPlainObject, ProviderModuleHelpers, ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n InternalInitOptions,\r\n IProviderModule,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n IProviderModuleDefinition,\r\n IProviderModuleNaked,\r\n ModuleIdentifier,\r\n OnGetEffects,\r\n ProviderModuleGetManyParam,\r\n ProviderModuleGetManySignature,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n ProviderModuleOrDefinition,\r\n ProviderToken,\r\n} from '../types';\r\nimport { ProviderModuleUtils } from '../utils';\r\nimport { GlobalContainer } from './global-container';\r\n\r\n/**\r\n * Modules are highly recommended as an effective way to organize your components.\r\n * For most applications, you'll likely have multiple modules, each encapsulating a closely related set of capabilities.\r\n *\r\n * _See {@link ProviderModuleOptions | ProviderModuleOptions}_.\r\n *\r\n * **Note:** _Check also the {@link IProviderModuleDefinition}._\r\n *\r\n * @example\r\n * ```ts\r\n * const EngineModule = new ProviderModule({\r\n * identifier: Symbol('EngineModule'),\r\n * providers: [EngineService],\r\n * exports: [EngineService]\r\n * });\r\n *\r\n * const DashboardModule = new ProviderModule({\r\n * identifier: Symbol('DashboardModule'),\r\n * providers: [DashboardService],\r\n * exports: [DashboardService]\r\n * });\r\n *\r\n * const CarModule = new ProviderModule({\r\n * identifier: Symbol('CarModule'),\r\n * imports: [EngineModule, DashboardModule],\r\n * providers: [CarService],\r\n * exports: [CarService]\r\n * });\r\n *\r\n * // Run-time class replacement:\r\n * const RedCarModule = new ProviderModule({\r\n * identifier: Symbol('RedCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useClass: RedCarService,\r\n * }\r\n * ],\r\n * });\r\n *\r\n * // Run-time factory example:\r\n * const BlackCarModule = new ProviderModule({\r\n * identifier: Symbol('BlackCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useFactory: (carService: CarService) => {\r\n * carService.setColor('black');\r\n *\r\n * return carService;\r\n * },\r\n * inject: [CarService]\r\n * }\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport class ProviderModule implements IProviderModule {\r\n isDisposed: boolean = false;\r\n\r\n readonly identifier: ModuleIdentifier;\r\n isGlobal: boolean = false;\r\n\r\n protected isAppModule: IProviderModuleNaked['isAppModule'];\r\n protected instantiatedFromDefinition: IProviderModuleNaked['instantiatedFromDefinition'];\r\n protected container!: Container;\r\n protected defaultScope!: IProviderModuleNaked['defaultScope'];\r\n protected onReady: IProviderModuleNaked['onReady'];\r\n protected onDispose: IProviderModuleNaked['onDispose'];\r\n protected moduleUtils!: IProviderModuleNaked['moduleUtils'];\r\n protected imports!: IProviderModuleNaked['imports'];\r\n protected providers!: IProviderModuleNaked['providers'];\r\n protected exports!: IProviderModuleNaked['exports'];\r\n protected registeredSideEffects!: IProviderModuleNaked['registeredSideEffects'];\r\n\r\n constructor(options: ProviderModuleOptions | IProviderModuleDefinition) {\r\n const { options: opts, internalOptions } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options);\r\n\r\n this.identifier = this.setIdentifier(opts.identifier);\r\n this.isDisposed = internalOptions.isDisposed ?? false;\r\n this.isAppModule = internalOptions.isAppModule ?? false;\r\n this.instantiatedFromDefinition = internalOptions.instantiatedFromDefinition ?? false;\r\n\r\n // If this module is the `AppModule`,\r\n // the initialization will be done when the `IProviderModuleNaked._internalInit` method is invoked.\r\n if (this.isAppModule) return;\r\n\r\n this._internalInit({\r\n ...opts,\r\n ...internalOptions,\r\n });\r\n }\r\n\r\n get<T>(provider: ProviderToken<T>, isOptional?: boolean): T {\r\n return this.__get(provider, { optional: isOptional ?? false });\r\n }\r\n\r\n getMany<D extends (ProviderModuleGetManyParam<any> | ProviderToken)[]>(\r\n ...deps: D | unknown[]\r\n ): ProviderModuleGetManySignature<D> {\r\n return (deps as D).map((dep) => {\r\n const withOptions = isPlainObject(dep) && 'provider' in dep;\r\n\r\n return this.get(withOptions ? dep.provider : dep, withOptions ? dep.isOptional : false);\r\n }) as any;\r\n }\r\n\r\n lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.injectImportedModules(modules as ProviderModule[]);\r\n }\r\n\r\n toNaked(): IProviderModuleNaked {\r\n return this as any;\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n const { before, after } = this.onDispose?.() ?? {};\r\n\r\n await before?.(this);\r\n await this.__unbindAll();\r\n\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.container = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.imports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.providers = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.exports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.registeredSideEffects = null;\r\n\r\n this.isDisposed = true;\r\n\r\n await after?.(this);\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private setIdentifier(identifier: ModuleIdentifier): ModuleIdentifier {\r\n if (!identifier) throw new InjectionProviderModuleMissingIdentifierError(this);\r\n\r\n return identifier;\r\n }\r\n\r\n private prepareContainer(params: ProviderModuleOptionsInternal): Container {\r\n if (this.isAppModule) {\r\n return params.container?.() ?? GlobalContainer;\r\n } else if (params.container) {\r\n console.warn(`[xInjection]: The '${this.toString()}' module is overwriting its container!`);\r\n\r\n return params.container();\r\n } else {\r\n return new Container({\r\n parent: GlobalContainer,\r\n defaultScope: this.defaultScope.inversify,\r\n });\r\n }\r\n }\r\n\r\n private injectImportedModules(importedModules?: ProviderModuleOrDefinition[]): void {\r\n if (!importedModules || importedModules.length === 0) return;\r\n\r\n importedModules.forEach((importedModuleOrDefinition) => {\r\n if (importedModuleOrDefinition.toString() === 'GlobalAppModule') {\r\n throw new InjectionProviderModuleError(this, `The 'GlobalAppModule' can't be imported!`);\r\n }\r\n\r\n // If the current module is marked as global\r\n // then let's import it into the `AppModule` automatically in order to mimic NestJS's behavior.\r\n if (!this.isAppModule && importedModuleOrDefinition.isGlobal) {\r\n this.moduleUtils.appModule._importWithoutSecondaryImportCheck(importedModuleOrDefinition);\r\n\r\n return;\r\n }\r\n\r\n const importedModule = (\r\n ProviderModuleHelpers.isModuleDefinition(importedModuleOrDefinition)\r\n ? new ProviderModule(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n ...importedModuleOrDefinition.getDefinition(),\r\n instantiatedFromDefinition: true,\r\n })\r\n )\r\n : importedModuleOrDefinition\r\n ) as ProviderModule;\r\n\r\n importedModule.exports.forEach((exp) => {\r\n const exportable = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, exp);\r\n\r\n // This would happen when the return of the lazy export is `void`.\r\n if (!exportable) return;\r\n\r\n if (exportable instanceof ProviderModule) {\r\n // The current item of the `exports` array is actually\r\n // another ProviderModule, therefore we must recursively drill into it\r\n // to import its exported modules/providers.\r\n this.injectImportedModules([exportable]);\r\n\r\n return;\r\n }\r\n\r\n const providerToken = exportable as ProviderToken;\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(providerToken);\r\n const importedProvider = {\r\n scope: ProviderTokenHelpers.getInjectionScopeByPriority(providerToken, importedModule.defaultScope.native),\r\n provide: serviceIdentifier,\r\n useFactory: () => importedModule.get(providerToken),\r\n // As we are using a factory token, there is no need to include the `onEvent` and `when` properties\r\n // into the processed `ProviderToken` created for this imported provider,\r\n // because the `importedModule.get` invokation will\r\n // fire the `onEvent` and `when` properties of the original imported provider.\r\n };\r\n\r\n this.moduleUtils.bindToContainer(importedProvider, importedModule.defaultScope.native);\r\n\r\n // It is important that we also `unbind` the imported provider when the imported module unbinds it\r\n // as we would not be able anymore to retrieve it because the `importedModule` unbound it.\r\n importedModule.registerSideEffect(providerToken, 'unbind', () => this.__unbind(importedProvider), {\r\n registerModuleId: this.identifier,\r\n });\r\n\r\n // It is also important that we remove our `unbind` effect frm the `importedModule` when the `unbind` method\r\n // will be invoked for this imported provider.\r\n // Not doing so, would create a side-effect where the `importedModule` would invoke `this.__unbind`\r\n // method on an already unbound provider, causing it to throw an error.\r\n this._onUnbind(serviceIdentifier, () => {\r\n const effects = importedModule.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!effects) return;\r\n\r\n effects.onUnbindEffects = effects.onUnbindEffects.filter(\r\n (effect) => effect.registerModuleId !== this.identifier\r\n );\r\n });\r\n });\r\n });\r\n }\r\n\r\n private injectProviders(): void {\r\n this.providers.forEach((provider) => this.moduleUtils.bindToContainer(provider, this.defaultScope.native));\r\n }\r\n\r\n private registerSideEffect(\r\n provider: ProviderToken,\r\n on: 'bind' | 'get' | 'rebind' | 'unbind',\r\n cb: () => Promise<void> | void,\r\n options?: Record<string, any>\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) {\r\n this.registeredSideEffects.set(serviceIdentifier, {\r\n onBindEffects: [],\r\n onGetEffects: [],\r\n onRebindEffects: [],\r\n onUnbindEffects: [],\r\n });\r\n }\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier)!;\r\n\r\n if (on === 'bind') {\r\n providerSideEffects.onBindEffects.push(cb);\r\n } else if (on === 'get') {\r\n providerSideEffects.onGetEffects.push({ once: options!['once'], invoked: false, cb });\r\n } else if (on === 'rebind') {\r\n providerSideEffects.onRebindEffects.push(cb);\r\n } else if (on === 'unbind') {\r\n providerSideEffects.onUnbindEffects.push({ registerModuleId: options?.['registerModuleId'], cb });\r\n }\r\n }\r\n\r\n private invokeRegisteredSideEffects(\r\n provider: ProviderToken,\r\n event: 'onBind' | 'onGet' | 'onRebind' | 'onUnbind'\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!providerSideEffects) return;\r\n\r\n providerSideEffects[`${event}Effects`].forEach((p) => {\r\n if (typeof p === 'function') return p();\r\n\r\n if (event === 'onGet') {\r\n const options = p as OnGetEffects;\r\n\r\n if (options.invoked && options.once) return;\r\n\r\n options.invoked = true;\r\n }\r\n\r\n p.cb();\r\n });\r\n }\r\n\r\n private async removeRegisteredSideEffects(provider: ProviderToken | 'all'): Promise<void> {\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects) return;\r\n\r\n if (provider === 'all') {\r\n this.registeredSideEffects.forEach(({ onUnbindEffects }) => onUnbindEffects.forEach((effect) => effect.cb()));\r\n this.registeredSideEffects.clear();\r\n\r\n return;\r\n }\r\n\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) return;\r\n\r\n /* istanbul ignore next */\r\n const unbindEffects = this.registeredSideEffects.get(serviceIdentifier)?.onUnbindEffects ?? [];\r\n for (const effect of unbindEffects) {\r\n await effect.cb();\r\n }\r\n\r\n this.registeredSideEffects.delete(serviceIdentifier);\r\n }\r\n\r\n private shouldThrowIfDisposed(): void {\r\n if (this.container !== null) return;\r\n\r\n throw new InjectionProviderModuleDisposedError(this);\r\n }\r\n\r\n //#region IProviderModuleNaked methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._internalInit}.\r\n */\r\n protected _internalInit(options: InternalInitOptions | IProviderModuleDefinition): IProviderModule {\r\n const {\r\n options: {\r\n isGlobal,\r\n imports = [],\r\n providers = [],\r\n exports = [],\r\n defaultScope = InjectionScope.Singleton,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options as any);\r\n\r\n this.isGlobal = isGlobal ?? false;\r\n this.isDisposed = false;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = { native: defaultScope, inversify: injectionScopeToBindingScope(defaultScope) };\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.container = this.prepareContainer({ ...internalOptions });\r\n this.moduleUtils = new ProviderModuleUtils(this, internalOptions);\r\n this.registeredSideEffects = new Map();\r\n\r\n this.injectImportedModules(this.imports as any);\r\n this.injectProviders();\r\n\r\n this.onReady?.(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onBind}.\r\n */\r\n protected _onBind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'bind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onGet}.\r\n */\r\n protected _onGet<T>(provider: ProviderToken<T>, once: boolean, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n if (typeof once !== 'boolean') {\r\n throw new InjectionProviderModuleError(\r\n this,\r\n `The 'once' parameter is required when using the '${this._onGet.name}' method!`\r\n );\r\n }\r\n\r\n this.registerSideEffect(provider, 'get', cb, { once });\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onRebind}.\r\n */\r\n protected _onRebind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'rebind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onUnbind}.\r\n */\r\n protected _onUnbind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'unbind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._overwriteContainer}.\r\n */\r\n protected _overwriteContainer(cb: () => Container): void {\r\n this.container = cb();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region InversifyJS Container native methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__bind}.\r\n */\r\n /* istanbul ignore next */\r\n protected __bind<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onBind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__get}.\r\n */\r\n /* istanbul ignore next */\r\n protected __get<T>(provider: ProviderToken<T>, options?: GetOptions): T {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onGet');\r\n\r\n return this.container.get(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected __getAll<T>(provider: ProviderToken<T>, options?: GetOptions): T[] {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAll(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAllAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAllAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T[]> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAllAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isCurrentBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isCurrentBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isCurrentBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__takeSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __takeSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.snapshot();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__restoreSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __restoreSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.restore();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __rebind<T>(provider: ProviderToken<T>): Promise<BindToFluentSyntax<T>> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = await this.container.rebind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __rebindSync<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.rebindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbind(provider: ProviderToken): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n await this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __unbindSync(provider: ProviderToken): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.unbindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbindAll(): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbindAll();\r\n\r\n await this.removeRegisteredSideEffects('all');\r\n }\r\n\r\n //#endregion\r\n}\r\n","import type { BindInWhenOnFluentSyntax, BindOnFluentSyntax, BindWhenOnFluentSyntax, Container } from 'inversify';\r\n\r\nimport { AppModule, GlobalModuleRegister } from '../core';\r\nimport { InjectionScope } from '../enums';\r\nimport { ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n DependencyProvider,\r\n IProviderModule,\r\n IProviderModuleNaked,\r\n ProviderClassToken,\r\n ProviderFactoryToken,\r\n ProviderIdentifier,\r\n ProviderModuleOptionsInternal,\r\n ProviderOptions,\r\n ProviderToken,\r\n ProviderValueToken,\r\n} from '../types';\r\n\r\n/**\r\n * Class containing an internal set of `utils`.\r\n *\r\n * Each {@link IProviderModuleNaked.moduleUtils | ProviderModule} instance has its own {@link ProviderModuleUtils} property instance.\r\n */\r\nexport class ProviderModuleUtils {\r\n /** The low-level InversifyJS {@link Container} owned by {@link ProviderModuleUtils.module | module}. */\r\n get container(): Container {\r\n return this.moduleNaked.container;\r\n }\r\n\r\n readonly appModule = AppModule;\r\n /** The parent {@link IProviderModule | ProviderModule} of `this` instance. */\r\n readonly module: IProviderModule;\r\n readonly moduleNaked: IProviderModuleNaked;\r\n\r\n constructor(module: IProviderModule, internalOptions: ProviderModuleOptionsInternal) {\r\n this.module = module;\r\n this.moduleNaked = module.toNaked();\r\n\r\n this.appModule = internalOptions.appModule?.() ?? this.appModule;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n /**\r\n * Low-level method which can be used to manually register _(bind)_ a new {@link provider} into the {@link ProviderModuleUtils.module | module} container.\r\n *\r\n * **Note:** _You shouldn't directly use this to register providers as they will not appear_\r\n * _into the module's `imports` and `exports` arrays! Therefore leading to unexpected bugs and confusion!_\r\n *\r\n * @param provider The {@link ProviderToken | provider} to register.\r\n * @param defaultScope Optionally provide the default {@link InjectionScope} to use when applicable.\r\n * @returns `true` when the {@link provider} has been bound otherwhise `false`.\r\n */\r\n bindToContainer<T>(provider: DependencyProvider<T>, defaultScope: InjectionScope): boolean {\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) {\r\n return this.bindSelfTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isClassToken(provider)) {\r\n return this.bindClassTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isValueToken(provider)) {\r\n return this.bindValueTokenToContainer(provider);\r\n } else if (ProviderTokenHelpers.isFactoryToken(provider)) {\r\n return this.bindFactoryTokenToContainer(provider, defaultScope);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (this.moduleNaked.isAppModule || !this.module.isGlobal || this.moduleNaked.instantiatedFromDefinition) {\r\n return;\r\n }\r\n\r\n GlobalModuleRegister.add(this.module);\r\n }\r\n\r\n private bindSelfTokenToContainer<T>(provider: ProviderIdentifier<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toSelf(),\r\n defaultScope\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindClassTokenToContainer<T>(provider: ProviderClassToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).to(provider.useClass),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindValueTokenToContainer<T>(provider: ProviderValueToken<T>): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toConstantValue(provider.useValue)\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindFactoryTokenToContainer<T>(provider: ProviderFactoryToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container\r\n .bind(ProviderTokenHelpers.toServiceIdentifier(provider))\r\n .toResolvedValue(provider.useFactory, ProviderTokenHelpers.toServiceIdentifiers(provider.inject ?? [])),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n /** Sets the {@link InjectionScope} of a bound {@link provider}. */\r\n private setBindingScope<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindInWhenOnFluentSyntax<T>,\r\n defaultScope: InjectionScope\r\n ): BindWhenOnFluentSyntax<T> {\r\n // A constant token will always be a singleton.\r\n if (ProviderTokenHelpers.isValueToken(provider)) return binding;\r\n\r\n const injectionScope = ProviderTokenHelpers.getInjectionScopeByPriority(provider, defaultScope);\r\n\r\n switch (injectionScope) {\r\n case InjectionScope.Singleton:\r\n return binding.inSingletonScope();\r\n case InjectionScope.Transient:\r\n return binding.inTransientScope();\r\n case InjectionScope.Request:\r\n return binding.inRequestScope();\r\n }\r\n }\r\n\r\n /** Sets the `when` clause of a bound {@link provider}. */\r\n private setWhenBinding<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindWhenOnFluentSyntax<T>\r\n ): BindOnFluentSyntax<unknown> {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return binding;\r\n\r\n const when = (provider as ProviderOptions<unknown>).when;\r\n if (!when) return binding;\r\n\r\n return binding.when(when);\r\n }\r\n\r\n /** Sets the `activation` and `deactivation` events of a bound {@link provider}. */\r\n private setBindingOnEvent(provider: ProviderToken, binding: BindOnFluentSyntax<any>): void {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return;\r\n\r\n const opts = provider as ProviderOptions<unknown>;\r\n\r\n if (opts.onEvent?.activation) {\r\n binding.onActivation(opts.onEvent.activation);\r\n }\r\n\r\n if (opts.onEvent?.deactivation) {\r\n binding.onDeactivation(opts.onEvent.deactivation);\r\n }\r\n }\r\n}\r\n","import { InjectionError, InjectionProviderModuleGlobalMarkError } from '../errors';\r\nimport { ProviderModuleHelpers } from '../helpers';\r\nimport type {\r\n AppModuleOptions,\r\n ExportsList,\r\n IAppModule,\r\n IProviderModuleNaked,\r\n ProviderModuleOrDefinition,\r\n} from '../types';\r\nimport { GLOBAL_APP_MODULE_ID } from './constants';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\nimport { ProviderModule } from './provider-module';\r\n\r\n/**\r\n * Class of the {@link AppModule} instance.\r\n *\r\n * **You shouldn't initialize a new instance of this class, please use the {@link AppModule} instance!**\r\n */\r\nexport class GlobalAppModule extends ProviderModule implements IAppModule {\r\n _strict: AppModuleOptions['_strict'];\r\n\r\n private nakedModule = this as unknown as IProviderModuleNaked;\r\n private isLoaded = false;\r\n\r\n constructor() {\r\n super(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n identifier: GLOBAL_APP_MODULE_ID,\r\n isAppModule: true,\r\n })\r\n );\r\n }\r\n\r\n register<AsNaked extends boolean = false>(\r\n options: AppModuleOptions\r\n ): AsNaked extends false ? IAppModule : IAppModule & IProviderModuleNaked {\r\n if (this.isLoaded) {\r\n throw new InjectionError(`The '${this.toString()}' has already been registered!`);\r\n }\r\n\r\n this._strict = options._strict ?? true;\r\n\r\n this.nakedModule._internalInit(options);\r\n\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, this.imports);\r\n\r\n this.isLoaded = true;\r\n\r\n return this as any;\r\n }\r\n\r\n override lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n /* istanbul ignore next */\r\n override toNaked(): IAppModule & IProviderModuleNaked {\r\n return super.toNaked() as any;\r\n }\r\n\r\n override async dispose(): Promise<void> {\r\n this.isLoaded = false;\r\n\r\n await super.dispose();\r\n }\r\n\r\n /** **Internally used, do not use!** */\r\n _importWithoutSecondaryImportCheck(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules, true);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n private checkIfRegisteredModulesHaveGlobalMark(\r\n parentModule: IProviderModuleNaked,\r\n list: ExportsList,\r\n isSecondaryImport = false\r\n ): void {\r\n if (!this._strict) return;\r\n\r\n list.forEach((m) => {\r\n const module = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, m) as IProviderModuleNaked;\r\n const isModuleDefinition = ProviderModuleHelpers.isModuleDefinition(module);\r\n\r\n if (!(module instanceof ProviderModule) && !isModuleDefinition) return;\r\n\r\n if (module.isGlobal) {\r\n GlobalModuleRegister.delete(module);\r\n\r\n // This module may also export other modules\r\n // which may have been marked as global\r\n // and not directly imported into the `AppModule`.\r\n if (module.exports) {\r\n this.checkIfRegisteredModulesHaveGlobalMark(module, module.exports, true);\r\n }\r\n\r\n return;\r\n }\r\n\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n isSecondaryImport\r\n ? 'Is not marked as `global` but has been imported into the `AppModule` ' +\r\n `via the \\`${parentModule.toString()}\\` module!`\r\n : 'Is not marked as `global` but has been imported into the `AppModule`!'\r\n );\r\n });\r\n\r\n if (isSecondaryImport) return;\r\n\r\n GlobalModuleRegister.forEach((module) => {\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n `Is marked as 'global' and has not been imported into the 'AppModule'!`\r\n );\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Special instance of {@link ProviderModule} which acts as the global module of your application in which you can inject any provider\r\n * which must be available through your entire application.\r\n *\r\n * The registered providers will automatically be available inside all the modules.\r\n *\r\n * @example\r\n * ```ts\r\n * // The `register` method must be invoked only once during your application life cycle!\r\n * AppModule.register({\r\n * imports: [ConfigModule, ApiModule, UserModule, DatabaseModule],\r\n * providers: [DummyService],\r\n * });\r\n * ```\r\n */\r\nexport const AppModule = new GlobalAppModule();\r\n"],"mappings":"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","names":["GLOBAL_APP_MODULE_ID","InjectionScope","injectionScopeToBindingScope","injectionScope","InjectionScope","Singleton","Transient","Request","bindingScopeToInjectionScope","bindingScope","isClass","v","Function","prototype","toString","call","startsWith","isClassOrFunction","value","isFunction","v","Function","prototype","toString","call","startsWith","isObject","o","Object","prototype","toString","call","isPlainObject","ctor","constructor","undefined","prot","hasOwnProperty","ProviderTokenHelpers","isClassToken","provider","hasProvideProperty","isValueToken","isFactoryToken","isProviderIdentifier","value","isClassOrFunction","toServiceIdentifier","provide","toServiceIdentifiers","providers","map","toDependencyProviderWithOptions","original","override","isClass","useClass","isFunction","useFactory","getInjectionScopeByPriority","moduleDefaultScope","tryGetScopeFromProvider","tryGetDecoratorScopeFromClass","tryGetProviderOptions","providerOptions","scope","providerClass","inversifyScope","getClassMetadata","bindingScopeToInjectionScope","isPlainObject","GlobalModuleRegister","Set","ProviderModuleDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","constructor","moduleOptions","InjectionScope","Singleton","checkIfShouldBeAddedToTheGlobalRegister","getDefinition","clone","definition","currentDefinition","toString","description","GlobalModuleRegister","add","ProviderModuleHelpers","buildInternalConstructorParams","params","getOptionsOrModuleDefinitionOptions","optionsOrDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","internalParams","internalOptions","isModuleDefinition","ip","options","value","ProviderModuleDefinition","isLazyExport","exp","isFunction","tryStaticOrLazyExportToStaticExport","module","Injectable","scope","undefined","_injectable","injectionScopeToBindingScope","import_inversify","Inject","provider","_inject","ProviderTokenHelpers","toServiceIdentifier","import_inversify","MultiInject","provider","_multiInject","ProviderTokenHelpers","toServiceIdentifier","import_inversify","InjectFromBase","options","_injectFromBase","import_inversify","Named","name","_named","import_inversify","Optional","_optional","import_inversify","Tagged","key","value","_tagged","import_inversify","Unmanaged","_unmanaged","InjectionError","Error","name","InjectionProviderModuleError","Error","name","constructor","module","message","toString","InjectionProviderModuleDisposedError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleMissingIdentifierError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleGlobalMarkError","InjectionProviderModuleError","name","constructor","module","message","import_inversify","GlobalContainer","Container","defaultScope","import_inversify","ProviderModuleUtils","container","moduleNaked","appModule","AppModule","module","constructor","internalOptions","toNaked","checkIfShouldBeAddedToTheGlobalRegister","bindToContainer","provider","defaultScope","ProviderTokenHelpers","isProviderIdentifier","bindSelfTokenToContainer","isClassToken","bindClassTokenToContainer","isValueToken","bindValueTokenToContainer","isFactoryToken","bindFactoryTokenToContainer","isAppModule","isGlobal","instantiatedFromDefinition","GlobalModuleRegister","add","setBindingScope","bind","toServiceIdentifier","toSelf","__isCurrentBound","setBindingOnEvent","setWhenBinding","to","useClass","toConstantValue","useValue","toResolvedValue","useFactory","toServiceIdentifiers","inject","binding","injectionScope","getInjectionScopeByPriority","InjectionScope","Singleton","inSingletonScope","Transient","inTransientScope","Request","inRequestScope","when","opts","onEvent","activation","onActivation","deactivation","onDeactivation","ProviderModule","isDisposed","identifier","isGlobal","isAppModule","instantiatedFromDefinition","container","defaultScope","onReady","onDispose","moduleUtils","imports","providers","exports","registeredSideEffects","constructor","options","opts","internalOptions","ProviderModuleHelpers","getOptionsOrModuleDefinitionOptions","setIdentifier","_internalInit","get","provider","isOptional","__get","optional","getMany","deps","map","dep","withOptions","isPlainObject","lazyImport","modules","injectImportedModules","toNaked","dispose","before","after","__unbindAll","toString","description","InjectionProviderModuleMissingIdentifierError","prepareContainer","params","GlobalContainer","console","warn","Container","parent","inversify","importedModules","length","forEach","importedModuleOrDefinition","InjectionProviderModuleError","appModule","_importWithoutSecondaryImportCheck","importedModule","isModuleDefinition","buildInternalConstructorParams","getDefinition","exp","exportable","tryStaticOrLazyExportToStaticExport","providerToken","serviceIdentifier","ProviderTokenHelpers","toServiceIdentifier","importedProvider","scope","getInjectionScopeByPriority","native","provide","useFactory","bindToContainer","registerSideEffect","__unbind","registerModuleId","_onUnbind","effects","onUnbindEffects","filter","effect","injectProviders","on","cb","has","set","onBindEffects","onGetEffects","onRebindEffects","providerSideEffects","push","once","invoked","invokeRegisteredSideEffects","event","p","removeRegisteredSideEffects","clear","unbindEffects","delete","shouldThrowIfDisposed","InjectionProviderModuleDisposedError","InjectionScope","Singleton","injectionScopeToBindingScope","ProviderModuleUtils","Map","_onBind","_onGet","name","_onRebind","_overwriteContainer","__bind","binding","bind","__getAsync","getAsync","__getAll","getAll","__getAllAsync","getAllAsync","__isBound","isBound","__isCurrentBound","isCurrentBound","__takeSnapshot","snapshot","__restoreSnapshot","restore","__rebind","rebind","__rebindSync","rebindSync","unbind","__unbindSync","unbindSync","unbindAll","GlobalAppModule","ProviderModule","_strict","nakedModule","isLoaded","constructor","ProviderModuleHelpers","buildInternalConstructorParams","identifier","GLOBAL_APP_MODULE_ID","isAppModule","register","options","InjectionError","toString","_internalInit","checkIfRegisteredModulesHaveGlobalMark","imports","lazyImport","modules","toNaked","dispose","_importWithoutSecondaryImportCheck","parentModule","list","isSecondaryImport","forEach","m","module","tryStaticOrLazyExportToStaticExport","isModuleDefinition","isGlobal","GlobalModuleRegister","delete","exports","InjectionProviderModuleGlobalMarkError","AppModule"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -811,7 +811,7 @@ interface AppModuleOptions extends Except<InternalInitOptions, 'appModule' | 'is
|
|
|
811
811
|
*
|
|
812
812
|
* **Note:** _Do not open an `issue` if a bug or edge-case is caused by having the `strict` property disabled!_
|
|
813
813
|
*
|
|
814
|
-
* - `
|
|
814
|
+
* - `isGlobal`: Will not be enforced anymore.
|
|
815
815
|
*
|
|
816
816
|
* Defaults to `true`.
|
|
817
817
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -811,7 +811,7 @@ interface AppModuleOptions extends Except<InternalInitOptions, 'appModule' | 'is
|
|
|
811
811
|
*
|
|
812
812
|
* **Note:** _Do not open an `issue` if a bug or edge-case is caused by having the `strict` property disabled!_
|
|
813
813
|
*
|
|
814
|
-
* - `
|
|
814
|
+
* - `isGlobal`: Will not be enforced anymore.
|
|
815
815
|
*
|
|
816
816
|
* Defaults to `true`.
|
|
817
817
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/constants.ts","../src/decorators/injectable.ts","../src/enums/injection-scope.enum.ts","../src/helpers/scope-converter.ts","../src/helpers/provider-token.ts","../src/helpers/is-class.ts","../src/helpers/is-class-or-function.ts","../src/helpers/is-function.ts","../src/helpers/is-plain-object.ts","../src/core/global-modules-register.ts","../src/core/provider-module-definition.ts","../src/helpers/provider-module.ts","../src/decorators/inject.ts","../src/decorators/multi-inject.ts","../src/decorators/inject-from-base.ts","../src/decorators/named.ts","../src/decorators/optional.ts","../src/decorators/tagged.ts","../src/decorators/unmanaged.ts","../src/errors/base.error.ts","../src/errors/provider-module.error.ts","../src/errors/provider-module-disposed.error.ts","../src/errors/provider-module-missing-identifier.ts","../src/errors/provider-module-global-mark.error.ts","../src/core/global-container.ts","../src/core/provider-module.ts","../src/utils/provider-module.utils.ts","../src/core/app.module.ts"],"sourcesContent":["/** The identifier of the `GlobalAppModule`. */\nexport const GLOBAL_APP_MODULE_ID = 'GlobalAppModule';\n","import { injectable as _injectable } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport { injectionScopeToBindingScope } from '../helpers';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectable} for more details. */\nexport function Injectable(scope?: InjectionScope) {\n if (scope === undefined) return _injectable();\n\n return _injectable(injectionScopeToBindingScope(scope));\n}\n","export enum InjectionScope {\n /** When the service is resolved, the same cached resolved value will be used. */\n Singleton,\n\n /** When the service is resolved, a new resolved value will be used each time. */\n Transient,\n\n /** When the service is resolved within the same container request, the same resolved value will be used. */\n Request,\n}\n","import type { BindingScope } from 'inversify';\n\nimport { InjectionScope } from '../enums';\n\nexport function injectionScopeToBindingScope(injectionScope: InjectionScope): BindingScope {\n switch (injectionScope) {\n case InjectionScope.Singleton:\n return 'Singleton';\n case InjectionScope.Transient:\n return 'Transient';\n case InjectionScope.Request:\n return 'Request';\n }\n}\n\nexport function bindingScopeToInjectionScope(bindingScope: BindingScope): InjectionScope {\n switch (bindingScope) {\n case 'Singleton':\n return InjectionScope.Singleton;\n case 'Transient':\n return InjectionScope.Transient;\n case 'Request':\n return InjectionScope.Request;\n }\n}\n","import { getClassMetadata } from '@inversifyjs/core';\nimport type { ServiceIdentifier } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport type {\n DependencyProvider,\n ProviderClassToken,\n ProviderFactoryToken,\n ProviderIdentifier,\n ProviderOptions,\n ProviderScopeOption,\n ProviderToken,\n ProviderValueToken,\n} from '../types';\nimport { isClass } from './is-class';\nimport { isClassOrFunction } from './is-class-or-function';\nimport { isFunction } from './is-function';\nimport { isPlainObject } from './is-plain-object';\nimport { bindingScopeToInjectionScope } from './scope-converter';\n\nexport namespace ProviderTokenHelpers {\n export function isClassToken<T>(provider: ProviderToken<T>): provider is ProviderClassToken<T> {\n return hasProvideProperty(provider) && 'useClass' in provider;\n }\n\n export function isValueToken<T>(provider: ProviderToken<T>): provider is ProviderValueToken<T> {\n return hasProvideProperty(provider) && 'useValue' in provider;\n }\n\n export function isFactoryToken<T>(provider: ProviderToken<T>): provider is ProviderFactoryToken<T> {\n return hasProvideProperty(provider) && 'useFactory' in provider;\n }\n\n export function isProviderIdentifier<T = any>(value: any): value is ProviderIdentifier<T> {\n return typeof value === 'string' || typeof value === 'symbol' || isClassOrFunction(value);\n }\n\n export function toServiceIdentifier<T = any>(provider: ProviderToken<T>): ServiceIdentifier<T> {\n return isProviderIdentifier(provider) ? provider : provider.provide;\n }\n\n export function toServiceIdentifiers(providers: ProviderToken[]): ServiceIdentifier<unknown>[] {\n return providers.map((provider) => toServiceIdentifier(provider));\n }\n\n export function toDependencyProviderWithOptions<T extends DependencyProvider<any>>(\n original: T,\n // Can be used to override the options\n override?: Partial<T>\n ): T {\n if (isClass(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useClass: (override as any)?.useClass ?? original,\n };\n } else if (isFunction(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useFactory: (override as any)?.useFactory ?? original,\n };\n }\n\n return {\n ...original,\n ...override,\n };\n }\n\n /**\n * The priority order is as follows:\n * 1. From the `ProviderToken.scope`\n * 2. From the class `@Injectable(scope)` decorator\n * 3. From the `ProviderModule` default scope.\n *\n * @param provider The {@link ProviderToken}.\n * @param moduleDefaultScope The module default scope.\n */\n export function getInjectionScopeByPriority(\n provider: ProviderToken,\n moduleDefaultScope: InjectionScope\n ): InjectionScope {\n return tryGetScopeFromProvider(provider) ?? tryGetDecoratorScopeFromClass(provider) ?? moduleDefaultScope;\n }\n\n export function tryGetProviderOptions<T>(\n provider: ProviderToken<T>\n ): (ProviderOptions<T> & ProviderScopeOption) | undefined {\n if (!hasProvideProperty(provider)) return;\n\n return provider as any;\n }\n\n export function tryGetScopeFromProvider(provider: ProviderToken): InjectionScope | undefined {\n const providerOptions = tryGetProviderOptions(provider);\n if (!providerOptions) return;\n\n return providerOptions.scope;\n }\n\n export function tryGetDecoratorScopeFromClass<T = any>(provider: ProviderToken<T>): InjectionScope | undefined {\n const providerClass = toServiceIdentifier(provider);\n if (!isClass(providerClass)) return;\n\n const inversifyScope = getClassMetadata(providerClass as any)?.scope;\n if (!inversifyScope) return;\n\n return bindingScopeToInjectionScope(inversifyScope);\n }\n\n function hasProvideProperty(provider: any): provider is object {\n return isPlainObject(provider) && typeof provider === 'object' && 'provide' in provider;\n }\n}\n","export function isClass(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return Function.prototype.toString.call(v).startsWith('class ');\n}\n","import type { Class } from 'type-fest';\n\nexport function isClassOrFunction(value: any): value is Function | Class<any> {\n return typeof value === 'function';\n}\n","export function isFunction(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return !Function.prototype.toString.call(v).startsWith('class ');\n}\n","/*\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: any): o is object {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/**\n * Each module which uses the `markAsGlobal` marker will\n * register itself into this register.\n *\n * Will then be used by the `AppModule` to make sure that the imported modules\n * are correctly using the global flag option.\n *\n * _Should be empty if all global modules are correctly registered._\n */\nexport const GlobalModuleRegister = new Set<ProviderModuleOrDefinition>();\n","import { InjectionScope } from '../enums';\r\nimport type { IProviderModuleDefinition, ProviderModuleOptions } from '../types';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\n\r\n/**\r\n * Can be used when you _don't_ want to initialize a `ProviderModule` eagerly as each `ProviderModule` has its own _(InversifyJS)_ container\r\n * initialized as soon as you do `new ProviderModule({...})`.\r\n *\r\n * The {@link ProviderModuleDefinition} allows you to just _define_ the `ProviderModule` options so you can _import_ it later into different modules.\r\n *\r\n * You can always edit a property of the definition after instantiation by doing:\r\n *\r\n * ```ts\r\n * const GarageModuleDefinition = new ProviderModuleDefinition({ identifier: 'GarageModuleDefinition' });\r\n *\r\n * // Later in your code\r\n *\r\n * GarageModuleDefinition.imports = [...GarageModuleDefinition.imports, PorscheModule, FerrariModuleDefinition];\r\n *\r\n * // ...\r\n *\r\n * const GarageModule = new ProviderModule(GarageModuleDefinition);\r\n *\r\n * // or\r\n *\r\n * ExistingModule.lazyImport(GarageModuleDefinition);\r\n * ```\r\n *\r\n * **Note:** _This means that you can't expect to be able to inject dependencies from a {@link ProviderModuleDefinition}_\r\n * _as how you would do with an instance of a `ProviderModule`._\r\n */\r\nexport class ProviderModuleDefinition implements IProviderModuleDefinition {\r\n identifier: IProviderModuleDefinition['identifier'];\r\n imports: IProviderModuleDefinition['imports'];\r\n providers: IProviderModuleDefinition['providers'];\r\n exports: IProviderModuleDefinition['exports'];\r\n defaultScope: IProviderModuleDefinition['defaultScope'];\r\n isGlobal: IProviderModuleDefinition['isGlobal'];\r\n onReady: IProviderModuleDefinition['onReady'];\r\n onDispose: IProviderModuleDefinition['onDispose'];\r\n\r\n constructor(moduleOptions: ProviderModuleOptions) {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose } = moduleOptions;\r\n\r\n this.identifier = identifier;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = defaultScope ?? InjectionScope.Singleton;\r\n this.isGlobal = isGlobal ?? false;\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n getDefinition(): ProviderModuleOptions {\r\n return {\r\n identifier: this.identifier,\r\n imports: this.imports,\r\n providers: this.providers,\r\n exports: this.exports,\r\n defaultScope: this.defaultScope,\r\n isGlobal: this.isGlobal,\r\n onReady: this.onReady,\r\n onDispose: this.onDispose,\r\n };\r\n }\r\n\r\n clone(definition?: Partial<ProviderModuleOptions>): IProviderModuleDefinition {\r\n const currentDefinition = this.getDefinition();\r\n\r\n if (!definition) return new ProviderModuleDefinition(currentDefinition);\r\n\r\n return new ProviderModuleDefinition({\r\n ...currentDefinition,\r\n ...definition,\r\n });\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (!this.isGlobal) return;\r\n\r\n GlobalModuleRegister.add(this);\r\n }\r\n}\r\n","import { ProviderModuleDefinition } from '../core/provider-module-definition';\r\nimport type {\r\n IProviderModule,\r\n IProviderModuleDefinition,\r\n LazyExport,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n StaticExport,\r\n} from '../types';\r\nimport { isFunction } from './is-function';\r\n\r\nexport namespace ProviderModuleHelpers {\r\n export function buildInternalConstructorParams(\r\n params: Partial<ProviderModuleOptions & ProviderModuleOptionsInternal>\r\n ): ProviderModuleOptions {\r\n return params as ProviderModuleOptions;\r\n }\r\n\r\n export function getOptionsOrModuleDefinitionOptions(\r\n optionsOrDefinition: ProviderModuleOptions | IProviderModuleDefinition\r\n ): { options: ProviderModuleOptions; internalOptions: ProviderModuleOptionsInternal } {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose, ...internalParams } =\r\n optionsOrDefinition;\r\n const internalOptions = internalParams as ProviderModuleOptionsInternal;\r\n\r\n if (isModuleDefinition(optionsOrDefinition)) {\r\n const ip = internalParams as any;\r\n\r\n // [TO-DO]: Find a better way to handle this as it is confusing\r\n // and we may also forget to update this `delete` operation list.\r\n //\r\n // This is done because the `ProviderModule` constructor can accept both\r\n // the `ProviderModuleOptionsInternal` plain object and `ProviderModuleDefinition` instance.\r\n // So we make sure to delete from the remaining properties (the `internalParams` spread object)\r\n // the properties/methods of the `ProviderModuleDefinition` instance.\r\n delete ip['getDefinition'];\r\n delete ip['clone'];\r\n delete ip['toString'];\r\n }\r\n\r\n return {\r\n options: {\r\n identifier,\r\n imports,\r\n providers,\r\n exports,\r\n defaultScope,\r\n isGlobal,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n };\r\n }\r\n\r\n export function isModuleDefinition(value: any): value is IProviderModuleDefinition {\r\n return value instanceof ProviderModuleDefinition;\r\n }\r\n\r\n export function isLazyExport(exp: any): exp is LazyExport {\r\n return isFunction(exp);\r\n }\r\n\r\n export function tryStaticOrLazyExportToStaticExport(\r\n module: IProviderModule,\r\n exp: StaticExport | LazyExport\r\n ): StaticExport | void {\r\n return isLazyExport(exp) ? exp(module) : exp;\r\n }\r\n}\r\n","import { inject as _inject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#inject} for more details. */\nexport function Inject(provider: ProviderToken) {\n return _inject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { multiInject as _multiInject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#multiinject} for more details. */\nexport function MultiInject(provider: ProviderToken) {\n return _multiInject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { injectFromBase as _injectFromBase } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectfrombase} for more details. */\nexport function InjectFromBase(options?: Parameters<typeof _injectFromBase>[0]) {\n return _injectFromBase(options);\n}\n","import { named as _named, type MetadataName } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#named} for more details. */\nexport function Named(name: MetadataName) {\n return _named(name);\n}\n","import { optional as _optional } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#optional} for more details. */\nexport function Optional() {\n return _optional();\n}\n","import { tagged as _tagged, type MetadataTag } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#tagged} for more details. */\nexport function Tagged(key: MetadataTag, value: unknown) {\n return _tagged(key, value);\n}\n","import { unmanaged as _unmanaged } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#unmanaged} for more details. */\nexport function Unmanaged() {\n return _unmanaged();\n}\n","/** Exception which indicates that there is a generic error. */\nexport class InjectionError extends Error {\n override name = InjectionError.name;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/** Exception which indicates that there is a generic error with an instance of {@link IProviderModule}. */\nexport class InjectionProviderModuleError extends Error {\n override name = InjectionProviderModuleError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(`{ProviderModule.${module.toString()}} => ${message}`);\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an invokation of a disposed module. */\nexport class InjectionProviderModuleDisposedError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleDisposedError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'Has been disposed! You can re-initialize it by using the `_internalInit` method.');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates that a module has been initialized without an `identifier`. */\nexport class InjectionProviderModuleMissingIdentifierError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleMissingIdentifierError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'An `identifier` must be supplied!');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an error with regards to the `isGlobal` option. */\nexport class InjectionProviderModuleGlobalMarkError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleGlobalMarkError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(module, message);\n }\n}\n","import { Container } from 'inversify';\n\n/**\n * The low-level App Container.\n *\n * **Internally used, please use the `AppModule` to interact with it.**\n */\nexport const GlobalContainer = new Container({\n defaultScope: 'Singleton',\n});\n","import { Container, type BindToFluentSyntax, type GetOptions, type IsBoundOptions } from 'inversify';\r\n\r\nimport { InjectionScope } from '../enums';\r\nimport {\r\n InjectionProviderModuleDisposedError,\r\n InjectionProviderModuleError,\r\n InjectionProviderModuleMissingIdentifierError,\r\n} from '../errors';\r\nimport { injectionScopeToBindingScope, isPlainObject, ProviderModuleHelpers, ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n InternalInitOptions,\r\n IProviderModule,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n IProviderModuleDefinition,\r\n IProviderModuleNaked,\r\n ModuleIdentifier,\r\n OnGetEffects,\r\n ProviderModuleGetManyParam,\r\n ProviderModuleGetManySignature,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n ProviderModuleOrDefinition,\r\n ProviderToken,\r\n} from '../types';\r\nimport { ProviderModuleUtils } from '../utils';\r\nimport { GlobalContainer } from './global-container';\r\n\r\n/**\r\n * Modules are highly recommended as an effective way to organize your components.\r\n * For most applications, you'll likely have multiple modules, each encapsulating a closely related set of capabilities.\r\n *\r\n * _See {@link ProviderModuleOptions | ProviderModuleOptions}_.\r\n *\r\n * **Note:** _Check also the {@link IProviderModuleDefinition}._\r\n *\r\n * @example\r\n * ```ts\r\n * const EngineModule = new ProviderModule({\r\n * identifier: Symbol('EngineModule'),\r\n * providers: [EngineService],\r\n * exports: [EngineService]\r\n * });\r\n *\r\n * const DashboardModule = new ProviderModule({\r\n * identifier: Symbol('DashboardModule'),\r\n * providers: [DashboardService],\r\n * exports: [DashboardService]\r\n * });\r\n *\r\n * const CarModule = new ProviderModule({\r\n * identifier: Symbol('CarModule'),\r\n * imports: [EngineModule, DashboardModule],\r\n * providers: [CarService],\r\n * exports: [CarService]\r\n * });\r\n *\r\n * // Run-time class replacement:\r\n * const RedCarModule = new ProviderModule({\r\n * identifier: Symbol('RedCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useClass: RedCarService,\r\n * }\r\n * ],\r\n * });\r\n *\r\n * // Run-time factory example:\r\n * const BlackCarModule = new ProviderModule({\r\n * identifier: Symbol('BlackCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useFactory: (carService: CarService) => {\r\n * carService.setColor('black');\r\n *\r\n * return carService;\r\n * },\r\n * inject: [CarService]\r\n * }\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport class ProviderModule implements IProviderModule {\r\n isDisposed: boolean = false;\r\n\r\n readonly identifier: ModuleIdentifier;\r\n isGlobal: boolean = false;\r\n\r\n protected isAppModule: IProviderModuleNaked['isAppModule'];\r\n protected instantiatedFromDefinition: IProviderModuleNaked['instantiatedFromDefinition'];\r\n protected container!: Container;\r\n protected defaultScope!: IProviderModuleNaked['defaultScope'];\r\n protected onReady: IProviderModuleNaked['onReady'];\r\n protected onDispose: IProviderModuleNaked['onDispose'];\r\n protected moduleUtils!: IProviderModuleNaked['moduleUtils'];\r\n protected imports!: IProviderModuleNaked['imports'];\r\n protected providers!: IProviderModuleNaked['providers'];\r\n protected exports!: IProviderModuleNaked['exports'];\r\n protected registeredSideEffects!: IProviderModuleNaked['registeredSideEffects'];\r\n\r\n constructor(options: ProviderModuleOptions | IProviderModuleDefinition) {\r\n const { options: opts, internalOptions } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options);\r\n\r\n this.identifier = this.setIdentifier(opts.identifier);\r\n this.isDisposed = internalOptions.isDisposed ?? false;\r\n this.isAppModule = internalOptions.isAppModule ?? false;\r\n this.instantiatedFromDefinition = internalOptions.instantiatedFromDefinition ?? false;\r\n\r\n // If this module is the `AppModule`,\r\n // the initialization will be done when the `IProviderModuleNaked._internalInit` method is invoked.\r\n if (this.isAppModule) return;\r\n\r\n this._internalInit({\r\n ...opts,\r\n ...internalOptions,\r\n });\r\n }\r\n\r\n get<T>(provider: ProviderToken<T>, isOptional?: boolean): T {\r\n return this.__get(provider, { optional: isOptional ?? false });\r\n }\r\n\r\n getMany<D extends (ProviderModuleGetManyParam<any> | ProviderToken)[]>(\r\n ...deps: D | unknown[]\r\n ): ProviderModuleGetManySignature<D> {\r\n return (deps as D).map((dep) => {\r\n const withOptions = isPlainObject(dep) && 'provider' in dep;\r\n\r\n return this.get(withOptions ? dep.provider : dep, withOptions ? dep.isOptional : false);\r\n }) as any;\r\n }\r\n\r\n lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.injectImportedModules(modules as ProviderModule[]);\r\n }\r\n\r\n toNaked(): IProviderModuleNaked {\r\n return this as any;\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n const { before, after } = this.onDispose?.() ?? {};\r\n\r\n await before?.(this);\r\n await this.__unbindAll();\r\n\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.container = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.imports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.providers = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.exports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.registeredSideEffects = null;\r\n\r\n this.isDisposed = true;\r\n\r\n await after?.(this);\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private setIdentifier(identifier: ModuleIdentifier): ModuleIdentifier {\r\n if (!identifier) throw new InjectionProviderModuleMissingIdentifierError(this);\r\n\r\n return identifier;\r\n }\r\n\r\n private prepareContainer(params: ProviderModuleOptionsInternal): Container {\r\n if (this.isAppModule) {\r\n return params.container?.() ?? GlobalContainer;\r\n } else if (params.container) {\r\n console.warn(`[xInjection]: The '${this.toString()}' module is overwriting its container!`);\r\n\r\n return params.container();\r\n } else {\r\n return new Container({\r\n parent: GlobalContainer,\r\n defaultScope: this.defaultScope.inversify,\r\n });\r\n }\r\n }\r\n\r\n private injectImportedModules(importedModules?: ProviderModuleOrDefinition[]): void {\r\n if (!importedModules || importedModules.length === 0) return;\r\n\r\n importedModules.forEach((importedModuleOrDefinition) => {\r\n if (importedModuleOrDefinition.toString() === 'GlobalAppModule') {\r\n throw new InjectionProviderModuleError(this, `The 'GlobalAppModule' can't be imported!`);\r\n }\r\n\r\n // If the current module is marked as global\r\n // then let's import it into the `AppModule` automatically in order to mimic NestJS's behavior.\r\n if (!this.isAppModule && importedModuleOrDefinition.isGlobal) {\r\n this.moduleUtils.appModule._importWithoutSecondaryImportCheck(importedModuleOrDefinition);\r\n\r\n return;\r\n }\r\n\r\n const importedModule = (\r\n ProviderModuleHelpers.isModuleDefinition(importedModuleOrDefinition)\r\n ? new ProviderModule(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n ...importedModuleOrDefinition.getDefinition(),\r\n instantiatedFromDefinition: true,\r\n })\r\n )\r\n : importedModuleOrDefinition\r\n ) as ProviderModule;\r\n\r\n importedModule.exports.forEach((exp) => {\r\n const exportable = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, exp);\r\n\r\n // This would happen when the return of the lazy export is `void`.\r\n if (!exportable) return;\r\n\r\n if (exportable instanceof ProviderModule) {\r\n // The current item of the `exports` array is actually\r\n // another ProviderModule, therefore we must recursively drill into it\r\n // to import its exported modules/providers.\r\n this.injectImportedModules([exportable]);\r\n\r\n return;\r\n }\r\n\r\n const providerToken = exportable as ProviderToken;\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(providerToken);\r\n const importedProvider = {\r\n scope: ProviderTokenHelpers.getInjectionScopeByPriority(providerToken, importedModule.defaultScope.native),\r\n provide: serviceIdentifier,\r\n useFactory: () => importedModule.get(providerToken),\r\n // As we are using a factory token, there is no need to include the `onEvent` and `when` properties\r\n // into the processed `ProviderToken` created for this imported provider,\r\n // because the `importedModule.get` invokation will\r\n // fire the `onEvent` and `when` properties of the original imported provider.\r\n };\r\n\r\n this.moduleUtils.bindToContainer(importedProvider, importedModule.defaultScope.native);\r\n\r\n // It is important that we also `unbind` the imported provider when the imported module unbinds it\r\n // as we would not be able anymore to retrieve it because the `importedModule` unbound it.\r\n importedModule.registerSideEffect(providerToken, 'unbind', () => this.__unbind(importedProvider), {\r\n registerModuleId: this.identifier,\r\n });\r\n\r\n // It is also important that we remove our `unbind` effect frm the `importedModule` when the `unbind` method\r\n // will be invoked for this imported provider.\r\n // Not doing so, would create a side-effect where the `importedModule` would invoke `this.__unbind`\r\n // method on an already unbound provider, causing it to throw an error.\r\n this._onUnbind(serviceIdentifier, () => {\r\n const effects = importedModule.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!effects) return;\r\n\r\n effects.onUnbindEffects = effects.onUnbindEffects.filter(\r\n (effect) => effect.registerModuleId !== this.identifier\r\n );\r\n });\r\n });\r\n });\r\n }\r\n\r\n private injectProviders(): void {\r\n this.providers.forEach((provider) => this.moduleUtils.bindToContainer(provider, this.defaultScope.native));\r\n }\r\n\r\n private registerSideEffect(\r\n provider: ProviderToken,\r\n on: 'bind' | 'get' | 'rebind' | 'unbind',\r\n cb: () => Promise<void> | void,\r\n options?: Record<string, any>\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) {\r\n this.registeredSideEffects.set(serviceIdentifier, {\r\n onBindEffects: [],\r\n onGetEffects: [],\r\n onRebindEffects: [],\r\n onUnbindEffects: [],\r\n });\r\n }\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier)!;\r\n\r\n if (on === 'bind') {\r\n providerSideEffects.onBindEffects.push(cb);\r\n } else if (on === 'get') {\r\n providerSideEffects.onGetEffects.push({ once: options!['once'], invoked: false, cb });\r\n } else if (on === 'rebind') {\r\n providerSideEffects.onRebindEffects.push(cb);\r\n } else if (on === 'unbind') {\r\n providerSideEffects.onUnbindEffects.push({ registerModuleId: options?.['registerModuleId'], cb });\r\n }\r\n }\r\n\r\n private invokeRegisteredSideEffects(\r\n provider: ProviderToken,\r\n event: 'onBind' | 'onGet' | 'onRebind' | 'onUnbind'\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!providerSideEffects) return;\r\n\r\n providerSideEffects[`${event}Effects`].forEach((p) => {\r\n if (typeof p === 'function') return p();\r\n\r\n if (event === 'onGet') {\r\n const options = p as OnGetEffects;\r\n\r\n if (options.invoked && options.once) return;\r\n\r\n options.invoked = true;\r\n }\r\n\r\n p.cb();\r\n });\r\n }\r\n\r\n private async removeRegisteredSideEffects(provider: ProviderToken | 'all'): Promise<void> {\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects) return;\r\n\r\n if (provider === 'all') {\r\n this.registeredSideEffects.forEach(({ onUnbindEffects }) => onUnbindEffects.forEach((effect) => effect.cb()));\r\n this.registeredSideEffects.clear();\r\n\r\n return;\r\n }\r\n\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) return;\r\n\r\n /* istanbul ignore next */\r\n const unbindEffects = this.registeredSideEffects.get(serviceIdentifier)?.onUnbindEffects ?? [];\r\n for (const effect of unbindEffects) {\r\n await effect.cb();\r\n }\r\n\r\n this.registeredSideEffects.delete(serviceIdentifier);\r\n }\r\n\r\n private shouldThrowIfDisposed(): void {\r\n if (this.container !== null) return;\r\n\r\n throw new InjectionProviderModuleDisposedError(this);\r\n }\r\n\r\n //#region IProviderModuleNaked methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._internalInit}.\r\n */\r\n protected _internalInit(options: InternalInitOptions | IProviderModuleDefinition): IProviderModule {\r\n const {\r\n options: {\r\n isGlobal,\r\n imports = [],\r\n providers = [],\r\n exports = [],\r\n defaultScope = InjectionScope.Singleton,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options as any);\r\n\r\n this.isGlobal = isGlobal ?? false;\r\n this.isDisposed = false;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = { native: defaultScope, inversify: injectionScopeToBindingScope(defaultScope) };\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.container = this.prepareContainer({ ...internalOptions });\r\n this.moduleUtils = new ProviderModuleUtils(this, internalOptions);\r\n this.registeredSideEffects = new Map();\r\n\r\n this.injectImportedModules(this.imports as any);\r\n this.injectProviders();\r\n\r\n this.onReady?.(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onBind}.\r\n */\r\n protected _onBind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'bind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onGet}.\r\n */\r\n protected _onGet<T>(provider: ProviderToken<T>, once: boolean, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n if (typeof once !== 'boolean') {\r\n throw new InjectionProviderModuleError(\r\n this,\r\n `The 'once' parameter is required when using the '${this._onGet.name}' method!`\r\n );\r\n }\r\n\r\n this.registerSideEffect(provider, 'get', cb, { once });\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onRebind}.\r\n */\r\n protected _onRebind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'rebind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onUnbind}.\r\n */\r\n protected _onUnbind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'unbind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._overwriteContainer}.\r\n */\r\n protected _overwriteContainer(cb: () => Container): void {\r\n this.container = cb();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region InversifyJS Container native methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__bind}.\r\n */\r\n /* istanbul ignore next */\r\n protected __bind<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onBind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__get}.\r\n */\r\n /* istanbul ignore next */\r\n protected __get<T>(provider: ProviderToken<T>, options?: GetOptions): T {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onGet');\r\n\r\n return this.container.get(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected __getAll<T>(provider: ProviderToken<T>, options?: GetOptions): T[] {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAll(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAllAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAllAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T[]> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAllAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isCurrentBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isCurrentBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isCurrentBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__takeSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __takeSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.snapshot();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__restoreSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __restoreSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.restore();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __rebind<T>(provider: ProviderToken<T>): Promise<BindToFluentSyntax<T>> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = await this.container.rebind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __rebindSync<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.rebindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbind(provider: ProviderToken): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n await this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __unbindSync(provider: ProviderToken): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.unbindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbindAll(): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbindAll();\r\n\r\n await this.removeRegisteredSideEffects('all');\r\n }\r\n\r\n //#endregion\r\n}\r\n","import type { BindInWhenOnFluentSyntax, BindOnFluentSyntax, BindWhenOnFluentSyntax, Container } from 'inversify';\r\n\r\nimport { AppModule, GlobalModuleRegister } from '../core';\r\nimport { InjectionScope } from '../enums';\r\nimport { ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n DependencyProvider,\r\n IProviderModule,\r\n IProviderModuleNaked,\r\n ProviderClassToken,\r\n ProviderFactoryToken,\r\n ProviderIdentifier,\r\n ProviderModuleOptionsInternal,\r\n ProviderOptions,\r\n ProviderToken,\r\n ProviderValueToken,\r\n} from '../types';\r\n\r\n/**\r\n * Class containing an internal set of `utils`.\r\n *\r\n * Each {@link IProviderModuleNaked.moduleUtils | ProviderModule} instance has its own {@link ProviderModuleUtils} property instance.\r\n */\r\nexport class ProviderModuleUtils {\r\n /** The low-level InversifyJS {@link Container} owned by {@link ProviderModuleUtils.module | module}. */\r\n get container(): Container {\r\n return this.moduleNaked.container;\r\n }\r\n\r\n readonly appModule = AppModule;\r\n /** The parent {@link IProviderModule | ProviderModule} of `this` instance. */\r\n readonly module: IProviderModule;\r\n readonly moduleNaked: IProviderModuleNaked;\r\n\r\n constructor(module: IProviderModule, internalOptions: ProviderModuleOptionsInternal) {\r\n this.module = module;\r\n this.moduleNaked = module.toNaked();\r\n\r\n this.appModule = internalOptions.appModule?.() ?? this.appModule;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n /**\r\n * Low-level method which can be used to manually register _(bind)_ a new {@link provider} into the {@link ProviderModuleUtils.module | module} container.\r\n *\r\n * **Note:** _You shouldn't directly use this to register providers as they will not appear_\r\n * _into the module's `imports` and `exports` arrays! Therefore leading to unexpected bugs and confusion!_\r\n *\r\n * @param provider The {@link ProviderToken | provider} to register.\r\n * @param defaultScope Optionally provide the default {@link InjectionScope} to use when applicable.\r\n * @returns `true` when the {@link provider} has been bound otherwhise `false`.\r\n */\r\n bindToContainer<T>(provider: DependencyProvider<T>, defaultScope: InjectionScope): boolean {\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) {\r\n return this.bindSelfTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isClassToken(provider)) {\r\n return this.bindClassTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isValueToken(provider)) {\r\n return this.bindValueTokenToContainer(provider);\r\n } else if (ProviderTokenHelpers.isFactoryToken(provider)) {\r\n return this.bindFactoryTokenToContainer(provider, defaultScope);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (this.moduleNaked.isAppModule || !this.module.isGlobal || this.moduleNaked.instantiatedFromDefinition) {\r\n return;\r\n }\r\n\r\n GlobalModuleRegister.add(this.module);\r\n }\r\n\r\n private bindSelfTokenToContainer<T>(provider: ProviderIdentifier<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toSelf(),\r\n defaultScope\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindClassTokenToContainer<T>(provider: ProviderClassToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).to(provider.useClass),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindValueTokenToContainer<T>(provider: ProviderValueToken<T>): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toConstantValue(provider.useValue)\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindFactoryTokenToContainer<T>(provider: ProviderFactoryToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container\r\n .bind(ProviderTokenHelpers.toServiceIdentifier(provider))\r\n .toResolvedValue(provider.useFactory, ProviderTokenHelpers.toServiceIdentifiers(provider.inject ?? [])),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n /** Sets the {@link InjectionScope} of a bound {@link provider}. */\r\n private setBindingScope<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindInWhenOnFluentSyntax<T>,\r\n defaultScope: InjectionScope\r\n ): BindWhenOnFluentSyntax<T> {\r\n // A constant token will always be a singleton.\r\n if (ProviderTokenHelpers.isValueToken(provider)) return binding;\r\n\r\n const injectionScope = ProviderTokenHelpers.getInjectionScopeByPriority(provider, defaultScope);\r\n\r\n switch (injectionScope) {\r\n case InjectionScope.Singleton:\r\n return binding.inSingletonScope();\r\n case InjectionScope.Transient:\r\n return binding.inTransientScope();\r\n case InjectionScope.Request:\r\n return binding.inRequestScope();\r\n }\r\n }\r\n\r\n /** Sets the `when` clause of a bound {@link provider}. */\r\n private setWhenBinding<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindWhenOnFluentSyntax<T>\r\n ): BindOnFluentSyntax<unknown> {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return binding;\r\n\r\n const when = (provider as ProviderOptions<unknown>).when;\r\n if (!when) return binding;\r\n\r\n return binding.when(when);\r\n }\r\n\r\n /** Sets the `activation` and `deactivation` events of a bound {@link provider}. */\r\n private setBindingOnEvent(provider: ProviderToken, binding: BindOnFluentSyntax<any>): void {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return;\r\n\r\n const opts = provider as ProviderOptions<unknown>;\r\n\r\n if (opts.onEvent?.activation) {\r\n binding.onActivation(opts.onEvent.activation);\r\n }\r\n\r\n if (opts.onEvent?.deactivation) {\r\n binding.onDeactivation(opts.onEvent.deactivation);\r\n }\r\n }\r\n}\r\n","import { InjectionError, InjectionProviderModuleGlobalMarkError } from '../errors';\r\nimport { ProviderModuleHelpers } from '../helpers';\r\nimport type {\r\n AppModuleOptions,\r\n ExportsList,\r\n IAppModule,\r\n IProviderModuleNaked,\r\n ProviderModuleOrDefinition,\r\n} from '../types';\r\nimport { GLOBAL_APP_MODULE_ID } from './constants';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\nimport { ProviderModule } from './provider-module';\r\n\r\n/**\r\n * Class of the {@link AppModule} instance.\r\n *\r\n * **You shouldn't initialize a new instance of this class, please use the {@link AppModule} instance!**\r\n */\r\nexport class GlobalAppModule extends ProviderModule implements IAppModule {\r\n _strict: AppModuleOptions['_strict'];\r\n\r\n private nakedModule = this as unknown as IProviderModuleNaked;\r\n private isLoaded = false;\r\n\r\n constructor() {\r\n super(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n identifier: GLOBAL_APP_MODULE_ID,\r\n isAppModule: true,\r\n })\r\n );\r\n }\r\n\r\n register<AsNaked extends boolean = false>(\r\n options: AppModuleOptions\r\n ): AsNaked extends false ? IAppModule : IAppModule & IProviderModuleNaked {\r\n if (this.isLoaded) {\r\n throw new InjectionError(`The '${this.toString()}' has already been registered!`);\r\n }\r\n\r\n this._strict = options._strict ?? true;\r\n\r\n this.nakedModule._internalInit(options);\r\n\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, this.imports);\r\n\r\n this.isLoaded = true;\r\n\r\n return this as any;\r\n }\r\n\r\n override lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n /* istanbul ignore next */\r\n override toNaked(): IAppModule & IProviderModuleNaked {\r\n return super.toNaked() as any;\r\n }\r\n\r\n override async dispose(): Promise<void> {\r\n this.isLoaded = false;\r\n\r\n await super.dispose();\r\n }\r\n\r\n /** **Internally used, do not use!** */\r\n _importWithoutSecondaryImportCheck(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules, true);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n private checkIfRegisteredModulesHaveGlobalMark(\r\n parentModule: IProviderModuleNaked,\r\n list: ExportsList,\r\n isSecondaryImport = false\r\n ): void {\r\n if (!this._strict) return;\r\n\r\n list.forEach((m) => {\r\n const module = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, m) as IProviderModuleNaked;\r\n const isModuleDefinition = ProviderModuleHelpers.isModuleDefinition(module);\r\n\r\n if (!(module instanceof ProviderModule) && !isModuleDefinition) return;\r\n\r\n if (module.isGlobal) {\r\n GlobalModuleRegister.delete(module);\r\n\r\n // This module may also export other modules\r\n // which may have been marked as global\r\n // and not directly imported into the `AppModule`.\r\n if (module.exports) {\r\n this.checkIfRegisteredModulesHaveGlobalMark(module, module.exports, true);\r\n }\r\n\r\n return;\r\n }\r\n\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n isSecondaryImport\r\n ? 'Is not marked as `global` but has been imported into the `AppModule` ' +\r\n `via the \\`${parentModule.toString()}\\` module!`\r\n : 'Is not marked as `global` but has been imported into the `AppModule`!'\r\n );\r\n });\r\n\r\n if (isSecondaryImport) return;\r\n\r\n GlobalModuleRegister.forEach((module) => {\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n `Is marked as 'global' and has not been imported into the 'AppModule'!`\r\n );\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Special instance of {@link ProviderModule} which acts as the global module of your application in which you can inject any provider\r\n * which must be available through your entire application.\r\n *\r\n * The registered providers will automatically be available inside all the modules.\r\n *\r\n * @example\r\n * ```ts\r\n * // The `register` method must be invoked only once during your application life cycle!\r\n * AppModule.register({\r\n * imports: [ConfigModule, ApiModule, UserModule, DatabaseModule],\r\n * providers: [DummyService],\r\n * });\r\n * ```\r\n */\r\nexport const AppModule = new GlobalAppModule();\r\n"],"mappings":";;;;AACO,IAAMA,uBAAuB;;;ACDpC,SAASC,cAAcC,mBAAmB;;;ACAnC,IAAKC,iBAAAA,yBAAAA,iBAAAA;AACqE,EAAAA,gBAAAA,gBAAA,WAAA,IAAA,CAAA,IAAA;AAGA,EAAAA,gBAAAA,gBAAA,WAAA,IAAA,CAAA,IAAA;AAG2B,EAAAA,gBAAAA,gBAAA,SAAA,IAAA,CAAA,IAAA;SAPhGA;;;;ACIL,SAASC,6BAA6BC,gBAA8B;AACzE,UAAQA,gBAAAA;IACN,KAAKC,eAAeC;AAClB,aAAO;IACT,KAAKD,eAAeE;AAClB,aAAO;IACT,KAAKF,eAAeG;AAClB,aAAO;EACX;AACF;AATgBL;AAWT,SAASM,6BAA6BC,cAA0B;AACrE,UAAQA,cAAAA;IACN,KAAK;AACH,aAAOL,eAAeC;IACxB,KAAK;AACH,aAAOD,eAAeE;IACxB,KAAK;AACH,aAAOF,eAAeG;EAC1B;AACF;AATgBC;;;ACfhB,SAASE,wBAAwB;;;ACA1B,SAASC,QAAQC,GAAM;AAC5B,MAAI,OAAOA,MAAM,WAAY,QAAO;AAEpC,SAAOC,SAASC,UAAUC,SAASC,KAAKJ,CAAAA,EAAGK,WAAW,QAAA;AACxD;AAJgBN;;;ACET,SAASO,kBAAkBC,OAAU;AAC1C,SAAO,OAAOA,UAAU;AAC1B;AAFgBD;;;ACFT,SAASE,WAAWC,GAAM;AAC/B,MAAI,OAAOA,MAAM,WAAY,QAAO;AAEpC,SAAO,CAACC,SAASC,UAAUC,SAASC,KAAKJ,CAAAA,EAAGK,WAAW,QAAA;AACzD;AAJgBN;;;ACOhB,SAASO,SAASC,GAAM;AACtB,SAAOC,OAAOC,UAAUC,SAASC,KAAKJ,CAAAA,MAAO;AAC/C;AAFSD;AAIF,SAASM,cAAcL,GAAM;AAClC,MAAID,SAASC,CAAAA,MAAO,MAAO,QAAO;AAGlC,QAAMM,OAAON,EAAEO;AACf,MAAID,SAASE,OAAW,QAAO;AAG/B,QAAMC,OAAOH,KAAKJ;AAClB,MAAIH,SAASU,IAAAA,MAAU,MAAO,QAAO;AAGrC,MAAIA,KAAKC,eAAe,eAAA,MAAqB,OAAO;AAClD,WAAO;EACT;AAGA,SAAO;AACT;AAlBgBL;;;UJSCM,uBAAAA;AACR,WAASC,aAAgBC,UAA0B;AACxD,WAAOC,mBAAmBD,QAAAA,KAAa,cAAcA;EACvD;AAFgBD;wBAAAA,eAAAA;AAIT,WAASG,aAAgBF,UAA0B;AACxD,WAAOC,mBAAmBD,QAAAA,KAAa,cAAcA;EACvD;AAFgBE;wBAAAA,eAAAA;AAIT,WAASC,eAAkBH,UAA0B;AAC1D,WAAOC,mBAAmBD,QAAAA,KAAa,gBAAgBA;EACzD;AAFgBG;wBAAAA,iBAAAA;AAIT,WAASC,qBAA8BC,OAAU;AACtD,WAAO,OAAOA,UAAU,YAAY,OAAOA,UAAU,YAAYC,kBAAkBD,KAAAA;EACrF;AAFgBD;wBAAAA,uBAAAA;AAIT,WAASG,oBAA6BP,UAA0B;AACrE,WAAOI,qBAAqBJ,QAAAA,IAAYA,WAAWA,SAASQ;EAC9D;AAFgBD;wBAAAA,sBAAAA;AAIT,WAASE,qBAAqBC,WAA0B;AAC7D,WAAOA,UAAUC,IAAI,CAACX,aAAaO,oBAAoBP,QAAAA,CAAAA;EACzD;AAFgBS;wBAAAA,uBAAAA;AAIT,WAASG,gCACdC,UAEAC,UAAqB;AAErB,QAAIC,QAAQF,QAAAA,GAAW;AACrB,aAAO;QACL,GAAIC;QACJN,SAAUM,UAAkBN,WAAWK;QACvCG,UAAWF,UAAkBE,YAAYH;MAC3C;IACF,WAAWI,WAAWJ,QAAAA,GAAW;AAC/B,aAAO;QACL,GAAIC;QACJN,SAAUM,UAAkBN,WAAWK;QACvCK,YAAaJ,UAAkBI,cAAcL;MAC/C;IACF;AAEA,WAAO;MACL,GAAGA;MACH,GAAGC;IACL;EACF;AAvBgBF;wBAAAA,kCAAAA;AAkCT,WAASO,4BACdnB,UACAoB,oBAAkC;AAElC,WAAOC,wBAAwBrB,QAAAA,KAAasB,8BAA8BtB,QAAAA,KAAaoB;EACzF;AALgBD;AADf,EAAArB,sBACeqB,8BAAAA;AAOT,WAASI,sBACdvB,UAA0B;AAE1B,QAAI,CAACC,mBAAmBD,QAAAA,EAAW;AAEnC,WAAOA;EACT;AANgBuB;wBAAAA,wBAAAA;AAQT,WAASF,wBAAwBrB,UAAuB;AAC7D,UAAMwB,kBAAkBD,sBAAsBvB,QAAAA;AAC9C,QAAI,CAACwB,gBAAiB;AAEtB,WAAOA,gBAAgBC;EACzB;AALgBJ;wBAAAA,0BAAAA;AAOT,WAASC,8BAAuCtB,UAA0B;AAC/E,UAAM0B,gBAAgBnB,oBAAoBP,QAAAA;AAC1C,QAAI,CAACe,QAAQW,aAAAA,EAAgB;AAE7B,UAAMC,iBAAiBC,iBAAiBF,aAAAA,GAAuBD;AAC/D,QAAI,CAACE,eAAgB;AAErB,WAAOE,6BAA6BF,cAAAA;EACtC;AARgBL;wBAAAA,gCAAAA;AAUhB,WAASrB,mBAAmBD,UAAa;AACvC,WAAO8B,cAAc9B,QAAAA,KAAa,OAAOA,aAAa,YAAY,aAAaA;EACjF;AAFSC;AAGX,GA9FiBH,yBAAAA,uBAAAA,CAAAA,EAAAA;;;;AKTV,IAAMiC,uBAAuB,oBAAIC,IAAAA;;;ACoBjC,IAAMC,2BAAN,MAAMA,0BAAAA;EA/Bb,OA+BaA;;;EACXC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EAEAC,YAAYC,eAAsC;AAChD,UAAM,EAAET,YAAYC,SAASC,WAAWC,SAASC,cAAcC,UAAUC,SAASC,UAAS,IAAKE;AAEhG,SAAKT,aAAaA;AAClB,SAAKC,UAAUA;AACf,SAAKC,YAAYA;AACjB,SAAKC,UAAUA;AACf,SAAKC,eAAeA,gBAAgBM,eAAeC;AACnD,SAAKN,WAAWA,YAAY;AAC5B,SAAKC,UAAUA;AACf,SAAKC,YAAYA;AAEjB,SAAKK,wCAAuC;EAC9C;EAEAC,gBAAuC;AACrC,WAAO;MACLb,YAAY,KAAKA;MACjBC,SAAS,KAAKA;MACdC,WAAW,KAAKA;MAChBC,SAAS,KAAKA;MACdC,cAAc,KAAKA;MACnBC,UAAU,KAAKA;MACfC,SAAS,KAAKA;MACdC,WAAW,KAAKA;IAClB;EACF;EAEAO,MAAMC,YAAwE;AAC5E,UAAMC,oBAAoB,KAAKH,cAAa;AAE5C,QAAI,CAACE,WAAY,QAAO,IAAIhB,0BAAyBiB,iBAAAA;AAErD,WAAO,IAAIjB,0BAAyB;MAClC,GAAGiB;MACH,GAAGD;IACL,CAAA;EACF;EAEAE,WAAmB;AAEjB,YAAQ,OAAO,KAAKjB,eAAe,WAAW,KAAKA,WAAWkB,cAAc,KAAKlB,eAAe;EAClG;EAEQY,0CAAgD;AACtD,QAAI,CAAC,KAAKP,SAAU;AAEpBc,yBAAqBC,IAAI,IAAI;EAC/B;AACF;;;UC/EiBC,wBAAAA;AACR,WAASC,+BACdC,QAAsE;AAEtE,WAAOA;EACT;AAJgBD;yBAAAA,iCAAAA;AAMT,WAASE,oCACdC,qBAAsE;AAEtE,UAAM,EAAEC,YAAYC,SAASC,WAAWC,SAASC,cAAcC,UAAUC,SAASC,WAAW,GAAGC,eAAAA,IAC9FT;AACF,UAAMU,kBAAkBD;AAExB,QAAIE,mBAAmBX,mBAAAA,GAAsB;AAC3C,YAAMY,KAAKH;AASX,aAAOG,GAAG,eAAA;AACV,aAAOA,GAAG,OAAA;AACV,aAAOA,GAAG,UAAA;IACZ;AAEA,WAAO;MACLC,SAAS;QACPZ;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;MACF;MACAE;IACF;EACF;AAnCgBX;yBAAAA,sCAAAA;AAqCT,WAASY,mBAAmBG,OAAU;AAC3C,WAAOA,iBAAiBC;EAC1B;AAFgBJ;yBAAAA,qBAAAA;AAIT,WAASK,aAAaC,KAAQ;AACnC,WAAOC,WAAWD,GAAAA;EACpB;AAFgBD;yBAAAA,eAAAA;AAIT,WAASG,oCACdC,QACAH,KAA8B;AAE9B,WAAOD,aAAaC,GAAAA,IAAOA,IAAIG,MAAAA,IAAUH;EAC3C;AALgBE;yBAAAA,sCAAAA;AAMlB,GA1DiBvB,0BAAAA,wBAAAA,CAAAA,EAAAA;;;;AVLV,SAASyB,WAAWC,OAAsB;AAC/C,MAAIA,UAAUC,OAAW,QAAOC,YAAAA;AAEhC,SAAOA,YAAYC,6BAA6BH,KAAAA,CAAAA;AAClD;AAJgBD;;;AWNhB,SAASK,UAAUC,eAAe;AAM3B,SAASC,OAAOC,UAAuB;AAC5C,SAAOC,QAAQC,qBAAqBC,oBAAoBH,QAAAA,CAAAA;AAC1D;AAFgBD;;;ACNhB,SAASK,eAAeC,oBAAoB;AAMrC,SAASC,YAAYC,UAAuB;AACjD,SAAOC,aAAaC,qBAAqBC,oBAAoBH,QAAAA,CAAAA;AAC/D;AAFgBD;;;ACNhB,SAASK,kBAAkBC,uBAAuB;AAG3C,SAASC,eAAeC,SAA+C;AAC5E,SAAOC,gBAAgBD,OAAAA;AACzB;AAFgBD;;;ACHhB,SAASG,SAASC,cAAiC;AAG5C,SAASC,MAAMC,MAAkB;AACtC,SAAOC,OAAOD,IAAAA;AAChB;AAFgBD;;;ACHhB,SAASG,YAAYC,iBAAiB;AAG/B,SAASC,WAAAA;AACd,SAAOC,UAAAA;AACT;AAFgBD;;;ACHhB,SAASE,UAAUC,eAAiC;AAG7C,SAASC,OAAOC,KAAkBC,OAAc;AACrD,SAAOC,QAAQF,KAAKC,KAAAA;AACtB;AAFgBF;;;ACHhB,SAASI,aAAaC,kBAAkB;AAGjC,SAASC,YAAAA;AACd,SAAOC,WAAAA;AACT;AAFgBD;;;ACFT,IAAME,iBAAN,MAAMA,wBAAuBC,MAAAA;EADpC,OACoCA;;;EACzBC,OAAOF,gBAAeE;AACjC;;;ACAO,IAAMC,+BAAN,MAAMA,sCAAqCC,MAAAA;EADlD,OACkDA;;;EACvCC,OAAOF,8BAA6BE;EAE7CC,YAAYC,QAAoCC,SAAiB;AAC/D,UAAM,mBAAmBD,OAAOE,SAAQ,CAAA,QAAUD,OAAAA,EAAS;EAC7D;AACF;;;ACLO,IAAME,uCAAN,MAAMA,8CAA6CC,6BAAAA;EAH1D,OAG0DA;;;EAC/CC,OAAOF,sCAAqCE;EAErDC,YAAYC,QAAoC;AAC9C,UAAMA,QAAQ,kFAAA;EAChB;AACF;;;ACNO,IAAMC,gDAAN,MAAMA,uDAAsDC,6BAAAA;EAHnE,OAGmEA;;;EACxDC,OAAOF,+CAA8CE;EAE9DC,YAAYC,QAAoC;AAC9C,UAAMA,QAAQ,mCAAA;EAChB;AACF;;;ACNO,IAAMC,yCAAN,MAAMA,gDAA+CC,6BAAAA;EAH5D,OAG4DA;;;EACjDC,OAAOF,wCAAuCE;EAEvDC,YAAYC,QAAoCC,SAAiB;AAC/D,UAAMD,QAAQC,OAAAA;EAChB;AACF;;;ACVA,SAASC,iBAAiB;AAOnB,IAAMC,kBAAkB,IAAID,UAAU;EAC3CE,cAAc;AAChB,CAAA;;;ACTA,SAASC,aAAAA,kBAAgF;;;ACuBlF,IAAMC,sBAAN,MAAMA;EArBb,OAqBaA;;;;EAEX,IAAIC,YAAuB;AACzB,WAAO,KAAKC,YAAYD;EAC1B;EAESE,YAAYC;;EAEZC;EACAH;EAETI,YAAYD,QAAyBE,iBAAgD;AACnF,SAAKF,SAASA;AACd,SAAKH,cAAcG,OAAOG,QAAO;AAEjC,SAAKL,YAAYI,gBAAgBJ,YAAS,KAAQ,KAAKA;AAEvD,SAAKM,wCAAuC;EAC9C;;;;;;;;;;;EAYAC,gBAAmBC,UAAiCC,cAAuC;AACzF,QAAIC,qBAAqBC,qBAAqBH,QAAAA,GAAW;AACvD,aAAO,KAAKI,yBAAyBJ,UAAUC,YAAAA;IACjD,WAAWC,qBAAqBG,aAAaL,QAAAA,GAAW;AACtD,aAAO,KAAKM,0BAA0BN,UAAUC,YAAAA;IAClD,WAAWC,qBAAqBK,aAAaP,QAAAA,GAAW;AACtD,aAAO,KAAKQ,0BAA0BR,QAAAA;IACxC,WAAWE,qBAAqBO,eAAeT,QAAAA,GAAW;AACxD,aAAO,KAAKU,4BAA4BV,UAAUC,YAAAA;IACpD;AAEA,WAAO;EACT;EAEQH,0CAAgD;AACtD,QAAI,KAAKP,YAAYoB,eAAe,CAAC,KAAKjB,OAAOkB,YAAY,KAAKrB,YAAYsB,4BAA4B;AACxG;IACF;AAEAC,yBAAqBC,IAAI,KAAKrB,MAAM;EACtC;EAEQU,yBAA4BJ,UAAiCC,cAAuC;AAC1G,SAAKe,gBACHhB,UACA,KAAKV,UAAU2B,KAAKf,qBAAqBgB,oBAAoBlB,QAAAA,CAAAA,EAAWmB,OAAM,GAC9ElB,YAAAA;AAGF,WAAO,KAAKV,YAAY6B,iBAAiBpB,QAAAA;EAC3C;EAEQM,0BAA6BN,UAAiCC,cAAuC;AAC3G,SAAKoB,kBACHrB,UACA,KAAKsB,eACHtB,UACA,KAAKgB,gBACHhB,UACA,KAAKV,UAAU2B,KAAKf,qBAAqBgB,oBAAoBlB,QAAAA,CAAAA,EAAWuB,GAAGvB,SAASwB,QAAQ,GAC5FvB,YAAAA,CAAAA,CAAAA;AAKN,WAAO,KAAKV,YAAY6B,iBAAiBpB,QAAAA;EAC3C;EAEQQ,0BAA6BR,UAA0C;AAC7E,SAAKqB,kBACHrB,UACA,KAAKsB,eACHtB,UACA,KAAKV,UAAU2B,KAAKf,qBAAqBgB,oBAAoBlB,QAAAA,CAAAA,EAAWyB,gBAAgBzB,SAAS0B,QAAQ,CAAA,CAAA;AAI7G,WAAO,KAAKnC,YAAY6B,iBAAiBpB,QAAAA;EAC3C;EAEQU,4BAA+BV,UAAmCC,cAAuC;AAC/G,SAAKoB,kBACHrB,UACA,KAAKsB,eACHtB,UACA,KAAKgB,gBACHhB,UACA,KAAKV,UACF2B,KAAKf,qBAAqBgB,oBAAoBlB,QAAAA,CAAAA,EAC9C2B,gBAAgB3B,SAAS4B,YAAY1B,qBAAqB2B,qBAAqB7B,SAAS8B,UAAU,CAAA,CAAE,CAAA,GACvG7B,YAAAA,CAAAA,CAAAA;AAKN,WAAO,KAAKV,YAAY6B,iBAAiBpB,QAAAA;EAC3C;;EAGQgB,gBACNhB,UACA+B,SACA9B,cAC2B;AAE3B,QAAIC,qBAAqBK,aAAaP,QAAAA,EAAW,QAAO+B;AAExD,UAAMC,iBAAiB9B,qBAAqB+B,4BAA4BjC,UAAUC,YAAAA;AAElF,YAAQ+B,gBAAAA;MACN,KAAKE,eAAeC;AAClB,eAAOJ,QAAQK,iBAAgB;MACjC,KAAKF,eAAeG;AAClB,eAAON,QAAQO,iBAAgB;MACjC,KAAKJ,eAAeK;AAClB,eAAOR,QAAQS,eAAc;IACjC;EACF;;EAGQlB,eACNtB,UACA+B,SAC6B;AAE7B,QAAI7B,qBAAqBC,qBAAqBH,QAAAA,EAAW,QAAO+B;AAEhE,UAAMU,OAAQzC,SAAsCyC;AACpD,QAAI,CAACA,KAAM,QAAOV;AAElB,WAAOA,QAAQU,KAAKA,IAAAA;EACtB;;EAGQpB,kBAAkBrB,UAAyB+B,SAAwC;AAEzF,QAAI7B,qBAAqBC,qBAAqBH,QAAAA,EAAW;AAEzD,UAAM0C,OAAO1C;AAEb,QAAI0C,KAAKC,SAASC,YAAY;AAC5Bb,cAAQc,aAAaH,KAAKC,QAAQC,UAAU;IAC9C;AAEA,QAAIF,KAAKC,SAASG,cAAc;AAC9Bf,cAAQgB,eAAeL,KAAKC,QAAQG,YAAY;IAClD;EACF;AACF;;;AD/FO,IAAME,iBAAN,MAAMA,gBAAAA;EAtFb,OAsFaA;;;EACXC,aAAsB;EAEbC;EACTC,WAAoB;EAEVC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EACAC;EAEVC,YAAYC,SAA4D;AACtE,UAAM,EAAEA,SAASC,MAAMC,gBAAe,IAAKC,sBAAsBC,oCAAoCJ,OAAAA;AAErG,SAAKd,aAAa,KAAKmB,cAAcJ,KAAKf,UAAU;AACpD,SAAKD,aAAaiB,gBAAgBjB,cAAc;AAChD,SAAKG,cAAcc,gBAAgBd,eAAe;AAClD,SAAKC,6BAA6Ba,gBAAgBb,8BAA8B;AAIhF,QAAI,KAAKD,YAAa;AAEtB,SAAKkB,cAAc;MACjB,GAAGL;MACH,GAAGC;IACL,CAAA;EACF;EAEAK,IAAOC,UAA4BC,YAAyB;AAC1D,WAAO,KAAKC,MAAMF,UAAU;MAAEG,UAAUF,cAAc;IAAM,CAAA;EAC9D;EAEAG,WACKC,MACgC;AACnC,WAAQA,KAAWC,IAAI,CAACC,QAAAA;AACtB,YAAMC,cAAcC,cAAcF,GAAAA,KAAQ,cAAcA;AAExD,aAAO,KAAKR,IAAIS,cAAcD,IAAIP,WAAWO,KAAKC,cAAcD,IAAIN,aAAa,KAAA;IACnF,CAAA;EACF;EAEAS,cAAcC,SAA6C;AACzD,SAAKC,sBAAsBD,OAAAA;EAC7B;EAEAE,UAAgC;AAC9B,WAAO;EACT;EAEA,MAAMC,UAAyB;AAC7B,UAAM,EAAEC,QAAQC,MAAK,IAAK,KAAK/B,YAAS,KAAQ,CAAC;AAEjD,UAAM8B,SAAS,IAAI;AACnB,UAAM,KAAKE,YAAW;AAGtB,SAAKnC,YAAY;AAEjB,SAAKK,UAAU;AAEf,SAAKC,YAAY;AAEjB,SAAKC,UAAU;AAEf,SAAKC,wBAAwB;AAE7B,SAAKb,aAAa;AAElB,UAAMuC,QAAQ,IAAI;EACpB;EAEAE,WAAmB;AAEjB,YAAQ,OAAO,KAAKxC,eAAe,WAAW,KAAKA,WAAWyC,cAAc,KAAKzC,eAAe;EAClG;EAEQmB,cAAcnB,YAAgD;AACpE,QAAI,CAACA,WAAY,OAAM,IAAI0C,8CAA8C,IAAI;AAE7E,WAAO1C;EACT;EAEQ2C,iBAAiBC,QAAkD;AACzE,QAAI,KAAK1C,aAAa;AACpB,aAAO0C,OAAOxC,YAAS,KAAQyC;IACjC,WAAWD,OAAOxC,WAAW;AAC3B0C,cAAQC,KAAK,sBAAsB,KAAKP,SAAQ,CAAA,wCAA0C;AAE1F,aAAOI,OAAOxC,UAAS;IACzB,OAAO;AACL,aAAO,IAAI4C,WAAU;QACnBC,QAAQJ;QACRxC,cAAc,KAAKA,aAAa6C;MAClC,CAAA;IACF;EACF;EAEQhB,sBAAsBiB,iBAAsD;AAClF,QAAI,CAACA,mBAAmBA,gBAAgBC,WAAW,EAAG;AAEtDD,oBAAgBE,QAAQ,CAACC,+BAAAA;AACvB,UAAIA,2BAA2Bd,SAAQ,MAAO,mBAAmB;AAC/D,cAAM,IAAIe,6BAA6B,MAAM,0CAA0C;MACzF;AAIA,UAAI,CAAC,KAAKrD,eAAeoD,2BAA2BrD,UAAU;AAC5D,aAAKO,YAAYgD,UAAUC,mCAAmCH,0BAAAA;AAE9D;MACF;AAEA,YAAMI,iBACJzC,sBAAsB0C,mBAAmBL,0BAAAA,IACrC,IAAIxD,gBACFmB,sBAAsB2C,+BAA+B;QACnD,GAAGN,2BAA2BO,cAAa;QAC3C1D,4BAA4B;MAC9B,CAAA,CAAA,IAEFmD;AAGNI,qBAAe/C,QAAQ0C,QAAQ,CAACS,QAAAA;AAC9B,cAAMC,aAAa9C,sBAAsB+C,oCAAoC,MAAMF,GAAAA;AAGnF,YAAI,CAACC,WAAY;AAEjB,YAAIA,sBAAsBjE,iBAAgB;AAIxC,eAAKoC,sBAAsB;YAAC6B;WAAW;AAEvC;QACF;AAEA,cAAME,gBAAgBF;AACtB,cAAMG,oBAAoBC,qBAAqBC,oBAAoBH,aAAAA;AACnE,cAAMI,mBAAmB;UACvBC,OAAOH,qBAAqBI,4BAA4BN,eAAeP,eAAerD,aAAamE,MAAM;UACzGC,SAASP;UACTQ,YAAY,6BAAMhB,eAAerC,IAAI4C,aAAAA,GAAzB;QAKd;AAEA,aAAKzD,YAAYmE,gBAAgBN,kBAAkBX,eAAerD,aAAamE,MAAM;AAIrFd,uBAAekB,mBAAmBX,eAAe,UAAU,MAAM,KAAKY,SAASR,gBAAAA,GAAmB;UAChGS,kBAAkB,KAAK9E;QACzB,CAAA;AAMA,aAAK+E,UAAUb,mBAAmB,MAAA;AAChC,gBAAMc,UAAUtB,eAAe9C,sBAAsBS,IAAI6C,iBAAAA;AAEzD,cAAI,CAACc,QAAS;AAEdA,kBAAQC,kBAAkBD,QAAQC,gBAAgBC,OAChD,CAACC,WAAWA,OAAOL,qBAAqB,KAAK9E,UAAU;QAE3D,CAAA;MACF,CAAA;IACF,CAAA;EACF;EAEQoF,kBAAwB;AAC9B,SAAK1E,UAAU2C,QAAQ,CAAC/B,aAAa,KAAKd,YAAYmE,gBAAgBrD,UAAU,KAAKjB,aAAamE,MAAM,CAAA;EAC1G;EAEQI,mBACNtD,UACA+D,IACAC,IACAxE,SACM;AACN,UAAMoD,oBAAoBC,qBAAqBC,oBAAoB9C,QAAAA;AAEnE,QAAI,CAAC,KAAKV,sBAAsB2E,IAAIrB,iBAAAA,GAAoB;AACtD,WAAKtD,sBAAsB4E,IAAItB,mBAAmB;QAChDuB,eAAe,CAAA;QACfC,cAAc,CAAA;QACdC,iBAAiB,CAAA;QACjBV,iBAAiB,CAAA;MACnB,CAAA;IACF;AAEA,UAAMW,sBAAsB,KAAKhF,sBAAsBS,IAAI6C,iBAAAA;AAE3D,QAAImB,OAAO,QAAQ;AACjBO,0BAAoBH,cAAcI,KAAKP,EAAAA;IACzC,WAAWD,OAAO,OAAO;AACvBO,0BAAoBF,aAAaG,KAAK;QAAEC,MAAMhF,QAAS,MAAA;QAASiF,SAAS;QAAOT;MAAG,CAAA;IACrF,WAAWD,OAAO,UAAU;AAC1BO,0BAAoBD,gBAAgBE,KAAKP,EAAAA;IAC3C,WAAWD,OAAO,UAAU;AAC1BO,0BAAoBX,gBAAgBY,KAAK;QAAEf,kBAAkBhE,UAAU,kBAAA;QAAqBwE;MAAG,CAAA;IACjG;EACF;EAEQU,4BACN1E,UACA2E,OACM;AACN,UAAM/B,oBAAoBC,qBAAqBC,oBAAoB9C,QAAAA;AAEnE,UAAMsE,sBAAsB,KAAKhF,sBAAsBS,IAAI6C,iBAAAA;AAE3D,QAAI,CAAC0B,oBAAqB;AAE1BA,wBAAoB,GAAGK,KAAAA,SAAc,EAAE5C,QAAQ,CAAC6C,MAAAA;AAC9C,UAAI,OAAOA,MAAM,WAAY,QAAOA,EAAAA;AAEpC,UAAID,UAAU,SAAS;AACrB,cAAMnF,UAAUoF;AAEhB,YAAIpF,QAAQiF,WAAWjF,QAAQgF,KAAM;AAErChF,gBAAQiF,UAAU;MACpB;AAEAG,QAAEZ,GAAE;IACN,CAAA;EACF;EAEA,MAAca,4BAA4B7E,UAAgD;AAExF,QAAI,CAAC,KAAKV,sBAAuB;AAEjC,QAAIU,aAAa,OAAO;AACtB,WAAKV,sBAAsByC,QAAQ,CAAC,EAAE4B,gBAAe,MAAOA,gBAAgB5B,QAAQ,CAAC8B,WAAWA,OAAOG,GAAE,CAAA,CAAA;AACzG,WAAK1E,sBAAsBwF,MAAK;AAEhC;IACF;AAEA,UAAMlC,oBAAoBC,qBAAqBC,oBAAoB9C,QAAAA;AAGnE,QAAI,CAAC,KAAKV,sBAAsB2E,IAAIrB,iBAAAA,EAAoB;AAGxD,UAAMmC,gBAAgB,KAAKzF,sBAAsBS,IAAI6C,iBAAAA,GAAoBe,mBAAmB,CAAA;AAC5F,eAAWE,UAAUkB,eAAe;AAClC,YAAMlB,OAAOG,GAAE;IACjB;AAEA,SAAK1E,sBAAsB0F,OAAOpC,iBAAAA;EACpC;EAEQqC,wBAA8B;AACpC,QAAI,KAAKnG,cAAc,KAAM;AAE7B,UAAM,IAAIoG,qCAAqC,IAAI;EACrD;;;;;;;EASUpF,cAAcN,SAA2E;AACjG,UAAM,EACJA,SAAS,EACPb,UACAQ,UAAU,CAAA,GACVC,YAAY,CAAA,GACZC,UAAU,CAAA,GACVN,eAAeoG,eAAeC,WAC9BpG,SACAC,UAAS,GAEXS,gBAAe,IACbC,sBAAsBC,oCAAoCJ,OAAAA;AAE9D,SAAKb,WAAWA,YAAY;AAC5B,SAAKF,aAAa;AAClB,SAAKU,UAAUA;AACf,SAAKC,YAAYA;AACjB,SAAKC,UAAUA;AACf,SAAKN,eAAe;MAAEmE,QAAQnE;MAAc6C,WAAWyD,6BAA6BtG,YAAAA;IAAc;AAClG,SAAKC,UAAUA;AACf,SAAKC,YAAYA;AAEjB,SAAKH,YAAY,KAAKuC,iBAAiB;MAAE,GAAG3B;IAAgB,CAAA;AAC5D,SAAKR,cAAc,IAAIoG,oBAAoB,MAAM5F,eAAAA;AACjD,SAAKJ,wBAAwB,oBAAIiG,IAAAA;AAEjC,SAAK3E,sBAAsB,KAAKzB,OAAO;AACvC,SAAK2E,gBAAe;AAEpB,SAAK9E,UAAU,IAAI;AAEnB,WAAO;EACT;;;;;;EAOUwG,QAAWxF,UAA4BgE,IAAsC;AACrF,SAAKiB,sBAAqB;AAE1B,SAAK3B,mBAAmBtD,UAAU,QAAQgE,EAAAA;EAC5C;;;;;;EAOUyB,OAAUzF,UAA4BwE,MAAeR,IAAsC;AACnG,SAAKiB,sBAAqB;AAE1B,QAAI,OAAOT,SAAS,WAAW;AAC7B,YAAM,IAAIvC,6BACR,MACA,oDAAoD,KAAKwD,OAAOC,IAAI,WAAW;IAEnF;AAEA,SAAKpC,mBAAmBtD,UAAU,OAAOgE,IAAI;MAAEQ;IAAK,CAAA;EACtD;;;;;;EAOUmB,UAAa3F,UAA4BgE,IAAsC;AACvF,SAAKiB,sBAAqB;AAE1B,SAAK3B,mBAAmBtD,UAAU,UAAUgE,EAAAA;EAC9C;;;;;;EAOUP,UAAazD,UAA4BgE,IAAsC;AACvF,SAAKiB,sBAAqB;AAE1B,SAAK3B,mBAAmBtD,UAAU,UAAUgE,EAAAA;EAC9C;;;;;;EAOU4B,oBAAoB5B,IAA2B;AACvD,SAAKlF,YAAYkF,GAAAA;EACnB;;;;;;;;;EAYU6B,OAAU7F,UAAmD;AACrE,SAAKiF,sBAAqB;AAE1B,UAAMa,UAAU,KAAKhH,UAAUiH,KAAKlD,qBAAqBC,oBAAoB9C,QAAAA,CAAAA;AAE7E,SAAK0E,4BAA4B1E,UAAU,QAAA;AAE3C,WAAO8F;EACT;;;;;;;EAQU5F,MAASF,UAA4BR,SAAyB;AACtE,SAAKyF,sBAAqB;AAE1B,SAAKP,4BAA4B1E,UAAU,OAAA;AAE3C,WAAO,KAAKlB,UAAUiB,IAAI8C,qBAAqBC,oBAAoB9C,QAAAA,GAAWR,OAAAA;EAChF;;;;;;;EAQA,MAAgBwG,WAAchG,UAA4BR,SAAkC;AAC1F,SAAKyF,sBAAqB;AAE1B,WAAO,KAAKnG,UAAUmH,SAASpD,qBAAqBC,oBAAoB9C,QAAAA,GAAWR,OAAAA;EACrF;;;;;;;EAQU0G,SAAYlG,UAA4BR,SAA2B;AAC3E,SAAKyF,sBAAqB;AAE1B,WAAO,KAAKnG,UAAUqH,OAAOtD,qBAAqBC,oBAAoB9C,QAAAA,GAAWR,OAAAA;EACnF;;;;;;;EAQA,MAAgB4G,cAAiBpG,UAA4BR,SAAoC;AAC/F,SAAKyF,sBAAqB;AAE1B,WAAO,KAAKnG,UAAUuH,YAAYxD,qBAAqBC,oBAAoB9C,QAAAA,GAAWR,OAAAA;EACxF;;;;;;;EAQU8G,UAAUtG,UAAyBR,SAAmC;AAC9E,SAAKyF,sBAAqB;AAE1B,WAAO,KAAKnG,UAAUyH,QAAQ1D,qBAAqBC,oBAAoB9C,QAAAA,GAAWR,OAAAA;EACpF;;;;;;;EAQUgH,iBAAiBxG,UAAyBR,SAAmC;AACrF,SAAKyF,sBAAqB;AAE1B,WAAO,KAAKnG,UAAU2H,eAAe5D,qBAAqBC,oBAAoB9C,QAAAA,GAAWR,OAAAA;EAC3F;;;;;;;EAQUkH,iBAAuB;AAC/B,SAAKzB,sBAAqB;AAE1B,SAAKnG,UAAU6H,SAAQ;EACzB;;;;;;;EAQUC,oBAA0B;AAClC,SAAK3B,sBAAqB;AAE1B,SAAKnG,UAAU+H,QAAO;EACxB;;;;;;;EAQA,MAAgBC,SAAY9G,UAA4D;AACtF,SAAKiF,sBAAqB;AAE1B,UAAMa,UAAU,MAAM,KAAKhH,UAAUiI,OAAOlE,qBAAqBC,oBAAoB9C,QAAAA,CAAAA;AAErF,SAAK0E,4BAA4B1E,UAAU,UAAA;AAE3C,WAAO8F;EACT;;;;;;;EAQUkB,aAAgBhH,UAAmD;AAC3E,SAAKiF,sBAAqB;AAE1B,UAAMa,UAAU,KAAKhH,UAAUmI,WAAWpE,qBAAqBC,oBAAoB9C,QAAAA,CAAAA;AAEnF,SAAK0E,4BAA4B1E,UAAU,UAAA;AAE3C,WAAO8F;EACT;;;;;;;EAQA,MAAgBvC,SAASvD,UAAwC;AAC/D,SAAKiF,sBAAqB;AAE1B,UAAM,KAAKnG,UAAUoI,OAAOrE,qBAAqBC,oBAAoB9C,QAAAA,CAAAA;AAErE,UAAM,KAAK6E,4BAA4B7E,QAAAA;EACzC;;;;;;;EAQUmH,aAAanH,UAA+B;AACpD,SAAKiF,sBAAqB;AAE1B,SAAKnG,UAAUsI,WAAWvE,qBAAqBC,oBAAoB9C,QAAAA,CAAAA;AAEnE,SAAK6E,4BAA4B7E,QAAAA;EACnC;;;;;;;EAQA,MAAgBiB,cAA6B;AAC3C,SAAKgE,sBAAqB;AAE1B,UAAM,KAAKnG,UAAUuI,UAAS;AAE9B,UAAM,KAAKxC,4BAA4B,KAAA;EACzC;AAGF;;;AE9nBO,IAAMyC,kBAAN,cAA8BC,eAAAA;EAlBrC,OAkBqCA;;;EACnCC;EAEQC,cAAc;EACdC,WAAW;EAEnBC,cAAc;AACZ,UACEC,sBAAsBC,+BAA+B;MACnDC,YAAYC;MACZC,aAAa;IACf,CAAA,CAAA;EAEJ;EAEAC,SACEC,SACwE;AACxE,QAAI,KAAKR,UAAU;AACjB,YAAM,IAAIS,eAAe,QAAQ,KAAKC,SAAQ,CAAA,gCAAkC;IAClF;AAEA,SAAKZ,UAAUU,QAAQV,WAAW;AAElC,SAAKC,YAAYY,cAAcH,OAAAA;AAE/B,SAAKI,uCAAuC,KAAKb,aAAa,KAAKc,OAAO;AAE1E,SAAKb,WAAW;AAEhB,WAAO;EACT;EAESc,cAAcC,SAA6C;AAClE,SAAKH,uCAAuC,KAAKb,aAAagB,OAAAA;AAE9D,UAAMD,WAAAA,GAAcC,OAAAA;EACtB;;EAGSC,UAA6C;AACpD,WAAO,MAAMA,QAAAA;EACf;EAEA,MAAeC,UAAyB;AACtC,SAAKjB,WAAW;AAEhB,UAAM,MAAMiB,QAAAA;EACd;;EAGAC,sCAAsCH,SAA6C;AACjF,SAAKH,uCAAuC,KAAKb,aAAagB,SAAS,IAAA;AAEvE,UAAMD,WAAAA,GAAcC,OAAAA;EACtB;EAEQH,uCACNO,cACAC,MACAC,oBAAoB,OACd;AACN,QAAI,CAAC,KAAKvB,QAAS;AAEnBsB,SAAKE,QAAQ,CAACC,MAAAA;AACZ,YAAMC,SAAStB,sBAAsBuB,oCAAoC,MAAMF,CAAAA;AAC/E,YAAMG,qBAAqBxB,sBAAsBwB,mBAAmBF,MAAAA;AAEpE,UAAI,EAAEA,kBAAkB3B,mBAAmB,CAAC6B,mBAAoB;AAEhE,UAAIF,OAAOG,UAAU;AACnBC,6BAAqBC,OAAOL,MAAAA;AAK5B,YAAIA,OAAOM,SAAS;AAClB,eAAKlB,uCAAuCY,QAAQA,OAAOM,SAAS,IAAA;QACtE;AAEA;MACF;AAEA,YAAM,IAAIC,uCACRP,QACAH,oBACI,sFACaF,aAAaT,SAAQ,CAAA,eAClC,uEAAA;IAER,CAAA;AAEA,QAAIW,kBAAmB;AAEvBO,yBAAqBN,QAAQ,CAACE,WAAAA;AAC5B,YAAM,IAAIO,uCACRP,QACA,uEAAuE;IAE3E,CAAA;EACF;AACF;AAiBO,IAAMQ,YAAY,IAAIpC,gBAAAA;","names":["GLOBAL_APP_MODULE_ID","injectable","_injectable","InjectionScope","injectionScopeToBindingScope","injectionScope","InjectionScope","Singleton","Transient","Request","bindingScopeToInjectionScope","bindingScope","getClassMetadata","isClass","v","Function","prototype","toString","call","startsWith","isClassOrFunction","value","isFunction","v","Function","prototype","toString","call","startsWith","isObject","o","Object","prototype","toString","call","isPlainObject","ctor","constructor","undefined","prot","hasOwnProperty","ProviderTokenHelpers","isClassToken","provider","hasProvideProperty","isValueToken","isFactoryToken","isProviderIdentifier","value","isClassOrFunction","toServiceIdentifier","provide","toServiceIdentifiers","providers","map","toDependencyProviderWithOptions","original","override","isClass","useClass","isFunction","useFactory","getInjectionScopeByPriority","moduleDefaultScope","tryGetScopeFromProvider","tryGetDecoratorScopeFromClass","tryGetProviderOptions","providerOptions","scope","providerClass","inversifyScope","getClassMetadata","bindingScopeToInjectionScope","isPlainObject","GlobalModuleRegister","Set","ProviderModuleDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","constructor","moduleOptions","InjectionScope","Singleton","checkIfShouldBeAddedToTheGlobalRegister","getDefinition","clone","definition","currentDefinition","toString","description","GlobalModuleRegister","add","ProviderModuleHelpers","buildInternalConstructorParams","params","getOptionsOrModuleDefinitionOptions","optionsOrDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","internalParams","internalOptions","isModuleDefinition","ip","options","value","ProviderModuleDefinition","isLazyExport","exp","isFunction","tryStaticOrLazyExportToStaticExport","module","Injectable","scope","undefined","_injectable","injectionScopeToBindingScope","inject","_inject","Inject","provider","_inject","ProviderTokenHelpers","toServiceIdentifier","multiInject","_multiInject","MultiInject","provider","_multiInject","ProviderTokenHelpers","toServiceIdentifier","injectFromBase","_injectFromBase","InjectFromBase","options","_injectFromBase","named","_named","Named","name","_named","optional","_optional","Optional","_optional","tagged","_tagged","Tagged","key","value","_tagged","unmanaged","_unmanaged","Unmanaged","_unmanaged","InjectionError","Error","name","InjectionProviderModuleError","Error","name","constructor","module","message","toString","InjectionProviderModuleDisposedError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleMissingIdentifierError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleGlobalMarkError","InjectionProviderModuleError","name","constructor","module","message","Container","GlobalContainer","defaultScope","Container","ProviderModuleUtils","container","moduleNaked","appModule","AppModule","module","constructor","internalOptions","toNaked","checkIfShouldBeAddedToTheGlobalRegister","bindToContainer","provider","defaultScope","ProviderTokenHelpers","isProviderIdentifier","bindSelfTokenToContainer","isClassToken","bindClassTokenToContainer","isValueToken","bindValueTokenToContainer","isFactoryToken","bindFactoryTokenToContainer","isAppModule","isGlobal","instantiatedFromDefinition","GlobalModuleRegister","add","setBindingScope","bind","toServiceIdentifier","toSelf","__isCurrentBound","setBindingOnEvent","setWhenBinding","to","useClass","toConstantValue","useValue","toResolvedValue","useFactory","toServiceIdentifiers","inject","binding","injectionScope","getInjectionScopeByPriority","InjectionScope","Singleton","inSingletonScope","Transient","inTransientScope","Request","inRequestScope","when","opts","onEvent","activation","onActivation","deactivation","onDeactivation","ProviderModule","isDisposed","identifier","isGlobal","isAppModule","instantiatedFromDefinition","container","defaultScope","onReady","onDispose","moduleUtils","imports","providers","exports","registeredSideEffects","constructor","options","opts","internalOptions","ProviderModuleHelpers","getOptionsOrModuleDefinitionOptions","setIdentifier","_internalInit","get","provider","isOptional","__get","optional","getMany","deps","map","dep","withOptions","isPlainObject","lazyImport","modules","injectImportedModules","toNaked","dispose","before","after","__unbindAll","toString","description","InjectionProviderModuleMissingIdentifierError","prepareContainer","params","GlobalContainer","console","warn","Container","parent","inversify","importedModules","length","forEach","importedModuleOrDefinition","InjectionProviderModuleError","appModule","_importWithoutSecondaryImportCheck","importedModule","isModuleDefinition","buildInternalConstructorParams","getDefinition","exp","exportable","tryStaticOrLazyExportToStaticExport","providerToken","serviceIdentifier","ProviderTokenHelpers","toServiceIdentifier","importedProvider","scope","getInjectionScopeByPriority","native","provide","useFactory","bindToContainer","registerSideEffect","__unbind","registerModuleId","_onUnbind","effects","onUnbindEffects","filter","effect","injectProviders","on","cb","has","set","onBindEffects","onGetEffects","onRebindEffects","providerSideEffects","push","once","invoked","invokeRegisteredSideEffects","event","p","removeRegisteredSideEffects","clear","unbindEffects","delete","shouldThrowIfDisposed","InjectionProviderModuleDisposedError","InjectionScope","Singleton","injectionScopeToBindingScope","ProviderModuleUtils","Map","_onBind","_onGet","name","_onRebind","_overwriteContainer","__bind","binding","bind","__getAsync","getAsync","__getAll","getAll","__getAllAsync","getAllAsync","__isBound","isBound","__isCurrentBound","isCurrentBound","__takeSnapshot","snapshot","__restoreSnapshot","restore","__rebind","rebind","__rebindSync","rebindSync","unbind","__unbindSync","unbindSync","unbindAll","GlobalAppModule","ProviderModule","_strict","nakedModule","isLoaded","constructor","ProviderModuleHelpers","buildInternalConstructorParams","identifier","GLOBAL_APP_MODULE_ID","isAppModule","register","options","InjectionError","toString","_internalInit","checkIfRegisteredModulesHaveGlobalMark","imports","lazyImport","modules","toNaked","dispose","_importWithoutSecondaryImportCheck","parentModule","list","isSecondaryImport","forEach","m","module","tryStaticOrLazyExportToStaticExport","isModuleDefinition","isGlobal","GlobalModuleRegister","delete","exports","InjectionProviderModuleGlobalMarkError","AppModule"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/constants.ts","../src/decorators/injectable.ts","../src/enums/injection-scope.enum.ts","../src/helpers/scope-converter.ts","../src/helpers/provider-token.ts","../src/helpers/is-class.ts","../src/helpers/is-class-or-function.ts","../src/helpers/is-function.ts","../src/helpers/is-plain-object.ts","../src/core/global-modules-register.ts","../src/core/provider-module-definition.ts","../src/helpers/provider-module.ts","../src/decorators/inject.ts","../src/decorators/multi-inject.ts","../src/decorators/inject-from-base.ts","../src/decorators/named.ts","../src/decorators/optional.ts","../src/decorators/tagged.ts","../src/decorators/unmanaged.ts","../src/errors/base.error.ts","../src/errors/provider-module.error.ts","../src/errors/provider-module-disposed.error.ts","../src/errors/provider-module-missing-identifier.ts","../src/errors/provider-module-global-mark.error.ts","../src/core/global-container.ts","../src/core/provider-module.ts","../src/utils/provider-module.utils.ts","../src/core/app.module.ts"],"sourcesContent":["/** The identifier of the `GlobalAppModule`. */\nexport const GLOBAL_APP_MODULE_ID = 'GlobalAppModule';\n","import { injectable as _injectable } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport { injectionScopeToBindingScope } from '../helpers';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectable} for more details. */\nexport function Injectable(scope?: InjectionScope) {\n if (scope === undefined) return _injectable();\n\n return _injectable(injectionScopeToBindingScope(scope));\n}\n","export enum InjectionScope {\n /** When the service is resolved, the same cached resolved value will be used. */\n Singleton,\n\n /** When the service is resolved, a new resolved value will be used each time. */\n Transient,\n\n /** When the service is resolved within the same container request, the same resolved value will be used. */\n Request,\n}\n","import type { BindingScope } from 'inversify';\n\nimport { InjectionScope } from '../enums';\n\nexport function injectionScopeToBindingScope(injectionScope: InjectionScope): BindingScope {\n switch (injectionScope) {\n case InjectionScope.Singleton:\n return 'Singleton';\n case InjectionScope.Transient:\n return 'Transient';\n case InjectionScope.Request:\n return 'Request';\n }\n}\n\nexport function bindingScopeToInjectionScope(bindingScope: BindingScope): InjectionScope {\n switch (bindingScope) {\n case 'Singleton':\n return InjectionScope.Singleton;\n case 'Transient':\n return InjectionScope.Transient;\n case 'Request':\n return InjectionScope.Request;\n }\n}\n","import { getClassMetadata } from '@inversifyjs/core';\nimport type { ServiceIdentifier } from 'inversify';\n\nimport { InjectionScope } from '../enums';\nimport type {\n DependencyProvider,\n ProviderClassToken,\n ProviderFactoryToken,\n ProviderIdentifier,\n ProviderOptions,\n ProviderScopeOption,\n ProviderToken,\n ProviderValueToken,\n} from '../types';\nimport { isClass } from './is-class';\nimport { isClassOrFunction } from './is-class-or-function';\nimport { isFunction } from './is-function';\nimport { isPlainObject } from './is-plain-object';\nimport { bindingScopeToInjectionScope } from './scope-converter';\n\nexport namespace ProviderTokenHelpers {\n export function isClassToken<T>(provider: ProviderToken<T>): provider is ProviderClassToken<T> {\n return hasProvideProperty(provider) && 'useClass' in provider;\n }\n\n export function isValueToken<T>(provider: ProviderToken<T>): provider is ProviderValueToken<T> {\n return hasProvideProperty(provider) && 'useValue' in provider;\n }\n\n export function isFactoryToken<T>(provider: ProviderToken<T>): provider is ProviderFactoryToken<T> {\n return hasProvideProperty(provider) && 'useFactory' in provider;\n }\n\n export function isProviderIdentifier<T = any>(value: any): value is ProviderIdentifier<T> {\n return typeof value === 'string' || typeof value === 'symbol' || isClassOrFunction(value);\n }\n\n export function toServiceIdentifier<T = any>(provider: ProviderToken<T>): ServiceIdentifier<T> {\n return isProviderIdentifier(provider) ? provider : provider.provide;\n }\n\n export function toServiceIdentifiers(providers: ProviderToken[]): ServiceIdentifier<unknown>[] {\n return providers.map((provider) => toServiceIdentifier(provider));\n }\n\n export function toDependencyProviderWithOptions<T extends DependencyProvider<any>>(\n original: T,\n // Can be used to override the options\n override?: Partial<T>\n ): T {\n if (isClass(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useClass: (override as any)?.useClass ?? original,\n };\n } else if (isFunction(original)) {\n return {\n ...(override as any),\n provide: (override as any)?.provide ?? original,\n useFactory: (override as any)?.useFactory ?? original,\n };\n }\n\n return {\n ...original,\n ...override,\n };\n }\n\n /**\n * The priority order is as follows:\n * 1. From the `ProviderToken.scope`\n * 2. From the class `@Injectable(scope)` decorator\n * 3. From the `ProviderModule` default scope.\n *\n * @param provider The {@link ProviderToken}.\n * @param moduleDefaultScope The module default scope.\n */\n export function getInjectionScopeByPriority(\n provider: ProviderToken,\n moduleDefaultScope: InjectionScope\n ): InjectionScope {\n return tryGetScopeFromProvider(provider) ?? tryGetDecoratorScopeFromClass(provider) ?? moduleDefaultScope;\n }\n\n export function tryGetProviderOptions<T>(\n provider: ProviderToken<T>\n ): (ProviderOptions<T> & ProviderScopeOption) | undefined {\n if (!hasProvideProperty(provider)) return;\n\n return provider as any;\n }\n\n export function tryGetScopeFromProvider(provider: ProviderToken): InjectionScope | undefined {\n const providerOptions = tryGetProviderOptions(provider);\n if (!providerOptions) return;\n\n return providerOptions.scope;\n }\n\n export function tryGetDecoratorScopeFromClass<T = any>(provider: ProviderToken<T>): InjectionScope | undefined {\n const providerClass = toServiceIdentifier(provider);\n if (!isClass(providerClass)) return;\n\n const inversifyScope = getClassMetadata(providerClass as any)?.scope;\n if (!inversifyScope) return;\n\n return bindingScopeToInjectionScope(inversifyScope);\n }\n\n function hasProvideProperty(provider: any): provider is object {\n return isPlainObject(provider) && typeof provider === 'object' && 'provide' in provider;\n }\n}\n","export function isClass(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return Function.prototype.toString.call(v).startsWith('class ');\n}\n","import type { Class } from 'type-fest';\n\nexport function isClassOrFunction(value: any): value is Function | Class<any> {\n return typeof value === 'function';\n}\n","export function isFunction(v: any): boolean {\n if (typeof v !== 'function') return false;\n\n return !Function.prototype.toString.call(v).startsWith('class ');\n}\n","/*\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o: any): boolean {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: any): o is object {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/**\n * Each module which uses the `isGlobal` marker will\n * register itself into this register.\n *\n * Will then be used by the `AppModule` to make sure that the imported modules\n * are correctly using the global flag option.\n *\n * _Should be empty if all global modules are correctly registered._\n */\nexport const GlobalModuleRegister = new Set<ProviderModuleOrDefinition>();\n","import { InjectionScope } from '../enums';\r\nimport type { IProviderModuleDefinition, ProviderModuleOptions } from '../types';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\n\r\n/**\r\n * Can be used when you _don't_ want to initialize a `ProviderModule` eagerly as each `ProviderModule` has its own _(InversifyJS)_ container\r\n * initialized as soon as you do `new ProviderModule({...})`.\r\n *\r\n * The {@link ProviderModuleDefinition} allows you to just _define_ the `ProviderModule` options so you can _import_ it later into different modules.\r\n *\r\n * You can always edit a property of the definition after instantiation by doing:\r\n *\r\n * ```ts\r\n * const GarageModuleDefinition = new ProviderModuleDefinition({ identifier: 'GarageModuleDefinition' });\r\n *\r\n * // Later in your code\r\n *\r\n * GarageModuleDefinition.imports = [...GarageModuleDefinition.imports, PorscheModule, FerrariModuleDefinition];\r\n *\r\n * // ...\r\n *\r\n * const GarageModule = new ProviderModule(GarageModuleDefinition);\r\n *\r\n * // or\r\n *\r\n * ExistingModule.lazyImport(GarageModuleDefinition);\r\n * ```\r\n *\r\n * **Note:** _This means that you can't expect to be able to inject dependencies from a {@link ProviderModuleDefinition}_\r\n * _as how you would do with an instance of a `ProviderModule`._\r\n */\r\nexport class ProviderModuleDefinition implements IProviderModuleDefinition {\r\n identifier: IProviderModuleDefinition['identifier'];\r\n imports: IProviderModuleDefinition['imports'];\r\n providers: IProviderModuleDefinition['providers'];\r\n exports: IProviderModuleDefinition['exports'];\r\n defaultScope: IProviderModuleDefinition['defaultScope'];\r\n isGlobal: IProviderModuleDefinition['isGlobal'];\r\n onReady: IProviderModuleDefinition['onReady'];\r\n onDispose: IProviderModuleDefinition['onDispose'];\r\n\r\n constructor(moduleOptions: ProviderModuleOptions) {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose } = moduleOptions;\r\n\r\n this.identifier = identifier;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = defaultScope ?? InjectionScope.Singleton;\r\n this.isGlobal = isGlobal ?? false;\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n getDefinition(): ProviderModuleOptions {\r\n return {\r\n identifier: this.identifier,\r\n imports: this.imports,\r\n providers: this.providers,\r\n exports: this.exports,\r\n defaultScope: this.defaultScope,\r\n isGlobal: this.isGlobal,\r\n onReady: this.onReady,\r\n onDispose: this.onDispose,\r\n };\r\n }\r\n\r\n clone(definition?: Partial<ProviderModuleOptions>): IProviderModuleDefinition {\r\n const currentDefinition = this.getDefinition();\r\n\r\n if (!definition) return new ProviderModuleDefinition(currentDefinition);\r\n\r\n return new ProviderModuleDefinition({\r\n ...currentDefinition,\r\n ...definition,\r\n });\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (!this.isGlobal) return;\r\n\r\n GlobalModuleRegister.add(this);\r\n }\r\n}\r\n","import { ProviderModuleDefinition } from '../core/provider-module-definition';\r\nimport type {\r\n IProviderModule,\r\n IProviderModuleDefinition,\r\n LazyExport,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n StaticExport,\r\n} from '../types';\r\nimport { isFunction } from './is-function';\r\n\r\nexport namespace ProviderModuleHelpers {\r\n export function buildInternalConstructorParams(\r\n params: Partial<ProviderModuleOptions & ProviderModuleOptionsInternal>\r\n ): ProviderModuleOptions {\r\n return params as ProviderModuleOptions;\r\n }\r\n\r\n export function getOptionsOrModuleDefinitionOptions(\r\n optionsOrDefinition: ProviderModuleOptions | IProviderModuleDefinition\r\n ): { options: ProviderModuleOptions; internalOptions: ProviderModuleOptionsInternal } {\r\n const { identifier, imports, providers, exports, defaultScope, isGlobal, onReady, onDispose, ...internalParams } =\r\n optionsOrDefinition;\r\n const internalOptions = internalParams as ProviderModuleOptionsInternal;\r\n\r\n if (isModuleDefinition(optionsOrDefinition)) {\r\n const ip = internalParams as any;\r\n\r\n // [TO-DO]: Find a better way to handle this as it is confusing\r\n // and we may also forget to update this `delete` operation list.\r\n //\r\n // This is done because the `ProviderModule` constructor can accept both\r\n // the `ProviderModuleOptionsInternal` plain object and `ProviderModuleDefinition` instance.\r\n // So we make sure to delete from the remaining properties (the `internalParams` spread object)\r\n // the properties/methods of the `ProviderModuleDefinition` instance.\r\n delete ip['getDefinition'];\r\n delete ip['clone'];\r\n delete ip['toString'];\r\n }\r\n\r\n return {\r\n options: {\r\n identifier,\r\n imports,\r\n providers,\r\n exports,\r\n defaultScope,\r\n isGlobal,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n };\r\n }\r\n\r\n export function isModuleDefinition(value: any): value is IProviderModuleDefinition {\r\n return value instanceof ProviderModuleDefinition;\r\n }\r\n\r\n export function isLazyExport(exp: any): exp is LazyExport {\r\n return isFunction(exp);\r\n }\r\n\r\n export function tryStaticOrLazyExportToStaticExport(\r\n module: IProviderModule,\r\n exp: StaticExport | LazyExport\r\n ): StaticExport | void {\r\n return isLazyExport(exp) ? exp(module) : exp;\r\n }\r\n}\r\n","import { inject as _inject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#inject} for more details. */\nexport function Inject(provider: ProviderToken) {\n return _inject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { multiInject as _multiInject } from 'inversify';\n\nimport { ProviderTokenHelpers } from '../helpers';\nimport type { ProviderToken } from '../types';\n\n/** See {@link https://inversify.io/docs/api/decorator/#multiinject} for more details. */\nexport function MultiInject(provider: ProviderToken) {\n return _multiInject(ProviderTokenHelpers.toServiceIdentifier(provider));\n}\n","import { injectFromBase as _injectFromBase } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#injectfrombase} for more details. */\nexport function InjectFromBase(options?: Parameters<typeof _injectFromBase>[0]) {\n return _injectFromBase(options);\n}\n","import { named as _named, type MetadataName } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#named} for more details. */\nexport function Named(name: MetadataName) {\n return _named(name);\n}\n","import { optional as _optional } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#optional} for more details. */\nexport function Optional() {\n return _optional();\n}\n","import { tagged as _tagged, type MetadataTag } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#tagged} for more details. */\nexport function Tagged(key: MetadataTag, value: unknown) {\n return _tagged(key, value);\n}\n","import { unmanaged as _unmanaged } from 'inversify';\n\n/** See {@link https://inversify.io/docs/api/decorator/#unmanaged} for more details. */\nexport function Unmanaged() {\n return _unmanaged();\n}\n","/** Exception which indicates that there is a generic error. */\nexport class InjectionError extends Error {\n override name = InjectionError.name;\n}\n","import type { ProviderModuleOrDefinition } from '../types';\n\n/** Exception which indicates that there is a generic error with an instance of {@link IProviderModule}. */\nexport class InjectionProviderModuleError extends Error {\n override name = InjectionProviderModuleError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(`{ProviderModule.${module.toString()}} => ${message}`);\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an invokation of a disposed module. */\nexport class InjectionProviderModuleDisposedError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleDisposedError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'Has been disposed! You can re-initialize it by using the `_internalInit` method.');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates that a module has been initialized without an `identifier`. */\nexport class InjectionProviderModuleMissingIdentifierError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleMissingIdentifierError.name;\n\n constructor(module: ProviderModuleOrDefinition) {\n super(module, 'An `identifier` must be supplied!');\n }\n}\n","import type { ProviderModuleOrDefinition } from '../types';\nimport { InjectionProviderModuleError } from './provider-module.error';\n\n/** Exception which indicates an error with regards to the `isGlobal` option. */\nexport class InjectionProviderModuleGlobalMarkError extends InjectionProviderModuleError {\n override name = InjectionProviderModuleGlobalMarkError.name;\n\n constructor(module: ProviderModuleOrDefinition, message: string) {\n super(module, message);\n }\n}\n","import { Container } from 'inversify';\n\n/**\n * The low-level App Container.\n *\n * **Internally used, please use the `AppModule` to interact with it.**\n */\nexport const GlobalContainer = new Container({\n defaultScope: 'Singleton',\n});\n","import { Container, type BindToFluentSyntax, type GetOptions, type IsBoundOptions } from 'inversify';\r\n\r\nimport { InjectionScope } from '../enums';\r\nimport {\r\n InjectionProviderModuleDisposedError,\r\n InjectionProviderModuleError,\r\n InjectionProviderModuleMissingIdentifierError,\r\n} from '../errors';\r\nimport { injectionScopeToBindingScope, isPlainObject, ProviderModuleHelpers, ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n InternalInitOptions,\r\n IProviderModule,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n IProviderModuleDefinition,\r\n IProviderModuleNaked,\r\n ModuleIdentifier,\r\n OnGetEffects,\r\n ProviderModuleGetManyParam,\r\n ProviderModuleGetManySignature,\r\n ProviderModuleOptions,\r\n ProviderModuleOptionsInternal,\r\n ProviderModuleOrDefinition,\r\n ProviderToken,\r\n} from '../types';\r\nimport { ProviderModuleUtils } from '../utils';\r\nimport { GlobalContainer } from './global-container';\r\n\r\n/**\r\n * Modules are highly recommended as an effective way to organize your components.\r\n * For most applications, you'll likely have multiple modules, each encapsulating a closely related set of capabilities.\r\n *\r\n * _See {@link ProviderModuleOptions | ProviderModuleOptions}_.\r\n *\r\n * **Note:** _Check also the {@link IProviderModuleDefinition}._\r\n *\r\n * @example\r\n * ```ts\r\n * const EngineModule = new ProviderModule({\r\n * identifier: Symbol('EngineModule'),\r\n * providers: [EngineService],\r\n * exports: [EngineService]\r\n * });\r\n *\r\n * const DashboardModule = new ProviderModule({\r\n * identifier: Symbol('DashboardModule'),\r\n * providers: [DashboardService],\r\n * exports: [DashboardService]\r\n * });\r\n *\r\n * const CarModule = new ProviderModule({\r\n * identifier: Symbol('CarModule'),\r\n * imports: [EngineModule, DashboardModule],\r\n * providers: [CarService],\r\n * exports: [CarService]\r\n * });\r\n *\r\n * // Run-time class replacement:\r\n * const RedCarModule = new ProviderModule({\r\n * identifier: Symbol('RedCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useClass: RedCarService,\r\n * }\r\n * ],\r\n * });\r\n *\r\n * // Run-time factory example:\r\n * const BlackCarModule = new ProviderModule({\r\n * identifier: Symbol('BlackCarModule'),\r\n * imports: [CarModule],\r\n * providers: [\r\n * {\r\n * provide: CarService,\r\n * useFactory: (carService: CarService) => {\r\n * carService.setColor('black');\r\n *\r\n * return carService;\r\n * },\r\n * inject: [CarService]\r\n * }\r\n * ],\r\n * });\r\n * ```\r\n */\r\nexport class ProviderModule implements IProviderModule {\r\n isDisposed: boolean = false;\r\n\r\n readonly identifier: ModuleIdentifier;\r\n isGlobal: boolean = false;\r\n\r\n protected isAppModule: IProviderModuleNaked['isAppModule'];\r\n protected instantiatedFromDefinition: IProviderModuleNaked['instantiatedFromDefinition'];\r\n protected container!: Container;\r\n protected defaultScope!: IProviderModuleNaked['defaultScope'];\r\n protected onReady: IProviderModuleNaked['onReady'];\r\n protected onDispose: IProviderModuleNaked['onDispose'];\r\n protected moduleUtils!: IProviderModuleNaked['moduleUtils'];\r\n protected imports!: IProviderModuleNaked['imports'];\r\n protected providers!: IProviderModuleNaked['providers'];\r\n protected exports!: IProviderModuleNaked['exports'];\r\n protected registeredSideEffects!: IProviderModuleNaked['registeredSideEffects'];\r\n\r\n constructor(options: ProviderModuleOptions | IProviderModuleDefinition) {\r\n const { options: opts, internalOptions } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options);\r\n\r\n this.identifier = this.setIdentifier(opts.identifier);\r\n this.isDisposed = internalOptions.isDisposed ?? false;\r\n this.isAppModule = internalOptions.isAppModule ?? false;\r\n this.instantiatedFromDefinition = internalOptions.instantiatedFromDefinition ?? false;\r\n\r\n // If this module is the `AppModule`,\r\n // the initialization will be done when the `IProviderModuleNaked._internalInit` method is invoked.\r\n if (this.isAppModule) return;\r\n\r\n this._internalInit({\r\n ...opts,\r\n ...internalOptions,\r\n });\r\n }\r\n\r\n get<T>(provider: ProviderToken<T>, isOptional?: boolean): T {\r\n return this.__get(provider, { optional: isOptional ?? false });\r\n }\r\n\r\n getMany<D extends (ProviderModuleGetManyParam<any> | ProviderToken)[]>(\r\n ...deps: D | unknown[]\r\n ): ProviderModuleGetManySignature<D> {\r\n return (deps as D).map((dep) => {\r\n const withOptions = isPlainObject(dep) && 'provider' in dep;\r\n\r\n return this.get(withOptions ? dep.provider : dep, withOptions ? dep.isOptional : false);\r\n }) as any;\r\n }\r\n\r\n lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.injectImportedModules(modules as ProviderModule[]);\r\n }\r\n\r\n toNaked(): IProviderModuleNaked {\r\n return this as any;\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n const { before, after } = this.onDispose?.() ?? {};\r\n\r\n await before?.(this);\r\n await this.__unbindAll();\r\n\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.container = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.imports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.providers = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.exports = null;\r\n //@ts-expect-error Type 'null' is not assignable to type.\r\n this.registeredSideEffects = null;\r\n\r\n this.isDisposed = true;\r\n\r\n await after?.(this);\r\n }\r\n\r\n toString(): string {\r\n /* istanbul ignore next */\r\n return (typeof this.identifier === 'symbol' ? this.identifier.description : this.identifier) ?? 'Unknown';\r\n }\r\n\r\n private setIdentifier(identifier: ModuleIdentifier): ModuleIdentifier {\r\n if (!identifier) throw new InjectionProviderModuleMissingIdentifierError(this);\r\n\r\n return identifier;\r\n }\r\n\r\n private prepareContainer(params: ProviderModuleOptionsInternal): Container {\r\n if (this.isAppModule) {\r\n return params.container?.() ?? GlobalContainer;\r\n } else if (params.container) {\r\n console.warn(`[xInjection]: The '${this.toString()}' module is overwriting its container!`);\r\n\r\n return params.container();\r\n } else {\r\n return new Container({\r\n parent: GlobalContainer,\r\n defaultScope: this.defaultScope.inversify,\r\n });\r\n }\r\n }\r\n\r\n private injectImportedModules(importedModules?: ProviderModuleOrDefinition[]): void {\r\n if (!importedModules || importedModules.length === 0) return;\r\n\r\n importedModules.forEach((importedModuleOrDefinition) => {\r\n if (importedModuleOrDefinition.toString() === 'GlobalAppModule') {\r\n throw new InjectionProviderModuleError(this, `The 'GlobalAppModule' can't be imported!`);\r\n }\r\n\r\n // If the current module is marked as global\r\n // then let's import it into the `AppModule` automatically in order to mimic NestJS's behavior.\r\n if (!this.isAppModule && importedModuleOrDefinition.isGlobal) {\r\n this.moduleUtils.appModule._importWithoutSecondaryImportCheck(importedModuleOrDefinition);\r\n\r\n return;\r\n }\r\n\r\n const importedModule = (\r\n ProviderModuleHelpers.isModuleDefinition(importedModuleOrDefinition)\r\n ? new ProviderModule(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n ...importedModuleOrDefinition.getDefinition(),\r\n instantiatedFromDefinition: true,\r\n })\r\n )\r\n : importedModuleOrDefinition\r\n ) as ProviderModule;\r\n\r\n importedModule.exports.forEach((exp) => {\r\n const exportable = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, exp);\r\n\r\n // This would happen when the return of the lazy export is `void`.\r\n if (!exportable) return;\r\n\r\n if (exportable instanceof ProviderModule) {\r\n // The current item of the `exports` array is actually\r\n // another ProviderModule, therefore we must recursively drill into it\r\n // to import its exported modules/providers.\r\n this.injectImportedModules([exportable]);\r\n\r\n return;\r\n }\r\n\r\n const providerToken = exportable as ProviderToken;\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(providerToken);\r\n const importedProvider = {\r\n scope: ProviderTokenHelpers.getInjectionScopeByPriority(providerToken, importedModule.defaultScope.native),\r\n provide: serviceIdentifier,\r\n useFactory: () => importedModule.get(providerToken),\r\n // As we are using a factory token, there is no need to include the `onEvent` and `when` properties\r\n // into the processed `ProviderToken` created for this imported provider,\r\n // because the `importedModule.get` invokation will\r\n // fire the `onEvent` and `when` properties of the original imported provider.\r\n };\r\n\r\n this.moduleUtils.bindToContainer(importedProvider, importedModule.defaultScope.native);\r\n\r\n // It is important that we also `unbind` the imported provider when the imported module unbinds it\r\n // as we would not be able anymore to retrieve it because the `importedModule` unbound it.\r\n importedModule.registerSideEffect(providerToken, 'unbind', () => this.__unbind(importedProvider), {\r\n registerModuleId: this.identifier,\r\n });\r\n\r\n // It is also important that we remove our `unbind` effect frm the `importedModule` when the `unbind` method\r\n // will be invoked for this imported provider.\r\n // Not doing so, would create a side-effect where the `importedModule` would invoke `this.__unbind`\r\n // method on an already unbound provider, causing it to throw an error.\r\n this._onUnbind(serviceIdentifier, () => {\r\n const effects = importedModule.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!effects) return;\r\n\r\n effects.onUnbindEffects = effects.onUnbindEffects.filter(\r\n (effect) => effect.registerModuleId !== this.identifier\r\n );\r\n });\r\n });\r\n });\r\n }\r\n\r\n private injectProviders(): void {\r\n this.providers.forEach((provider) => this.moduleUtils.bindToContainer(provider, this.defaultScope.native));\r\n }\r\n\r\n private registerSideEffect(\r\n provider: ProviderToken,\r\n on: 'bind' | 'get' | 'rebind' | 'unbind',\r\n cb: () => Promise<void> | void,\r\n options?: Record<string, any>\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) {\r\n this.registeredSideEffects.set(serviceIdentifier, {\r\n onBindEffects: [],\r\n onGetEffects: [],\r\n onRebindEffects: [],\r\n onUnbindEffects: [],\r\n });\r\n }\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier)!;\r\n\r\n if (on === 'bind') {\r\n providerSideEffects.onBindEffects.push(cb);\r\n } else if (on === 'get') {\r\n providerSideEffects.onGetEffects.push({ once: options!['once'], invoked: false, cb });\r\n } else if (on === 'rebind') {\r\n providerSideEffects.onRebindEffects.push(cb);\r\n } else if (on === 'unbind') {\r\n providerSideEffects.onUnbindEffects.push({ registerModuleId: options?.['registerModuleId'], cb });\r\n }\r\n }\r\n\r\n private invokeRegisteredSideEffects(\r\n provider: ProviderToken,\r\n event: 'onBind' | 'onGet' | 'onRebind' | 'onUnbind'\r\n ): void {\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n const providerSideEffects = this.registeredSideEffects.get(serviceIdentifier);\r\n /* istanbul ignore next */\r\n if (!providerSideEffects) return;\r\n\r\n providerSideEffects[`${event}Effects`].forEach((p) => {\r\n if (typeof p === 'function') return p();\r\n\r\n if (event === 'onGet') {\r\n const options = p as OnGetEffects;\r\n\r\n if (options.invoked && options.once) return;\r\n\r\n options.invoked = true;\r\n }\r\n\r\n p.cb();\r\n });\r\n }\r\n\r\n private async removeRegisteredSideEffects(provider: ProviderToken | 'all'): Promise<void> {\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects) return;\r\n\r\n if (provider === 'all') {\r\n this.registeredSideEffects.forEach(({ onUnbindEffects }) => onUnbindEffects.forEach((effect) => effect.cb()));\r\n this.registeredSideEffects.clear();\r\n\r\n return;\r\n }\r\n\r\n const serviceIdentifier = ProviderTokenHelpers.toServiceIdentifier(provider);\r\n\r\n /* istanbul ignore next */\r\n if (!this.registeredSideEffects.has(serviceIdentifier)) return;\r\n\r\n /* istanbul ignore next */\r\n const unbindEffects = this.registeredSideEffects.get(serviceIdentifier)?.onUnbindEffects ?? [];\r\n for (const effect of unbindEffects) {\r\n await effect.cb();\r\n }\r\n\r\n this.registeredSideEffects.delete(serviceIdentifier);\r\n }\r\n\r\n private shouldThrowIfDisposed(): void {\r\n if (this.container !== null) return;\r\n\r\n throw new InjectionProviderModuleDisposedError(this);\r\n }\r\n\r\n //#region IProviderModuleNaked methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._internalInit}.\r\n */\r\n protected _internalInit(options: InternalInitOptions | IProviderModuleDefinition): IProviderModule {\r\n const {\r\n options: {\r\n isGlobal,\r\n imports = [],\r\n providers = [],\r\n exports = [],\r\n defaultScope = InjectionScope.Singleton,\r\n onReady,\r\n onDispose,\r\n },\r\n internalOptions,\r\n } = ProviderModuleHelpers.getOptionsOrModuleDefinitionOptions(options as any);\r\n\r\n this.isGlobal = isGlobal ?? false;\r\n this.isDisposed = false;\r\n this.imports = imports;\r\n this.providers = providers;\r\n this.exports = exports;\r\n this.defaultScope = { native: defaultScope, inversify: injectionScopeToBindingScope(defaultScope) };\r\n this.onReady = onReady;\r\n this.onDispose = onDispose;\r\n\r\n this.container = this.prepareContainer({ ...internalOptions });\r\n this.moduleUtils = new ProviderModuleUtils(this, internalOptions);\r\n this.registeredSideEffects = new Map();\r\n\r\n this.injectImportedModules(this.imports as any);\r\n this.injectProviders();\r\n\r\n this.onReady?.(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onBind}.\r\n */\r\n protected _onBind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'bind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onGet}.\r\n */\r\n protected _onGet<T>(provider: ProviderToken<T>, once: boolean, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n if (typeof once !== 'boolean') {\r\n throw new InjectionProviderModuleError(\r\n this,\r\n `The 'once' parameter is required when using the '${this._onGet.name}' method!`\r\n );\r\n }\r\n\r\n this.registerSideEffect(provider, 'get', cb, { once });\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onRebind}.\r\n */\r\n protected _onRebind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'rebind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._onUnbind}.\r\n */\r\n protected _onUnbind<T>(provider: ProviderToken<T>, cb: () => Promise<void> | void): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.registerSideEffect(provider, 'unbind', cb);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked._overwriteContainer}.\r\n */\r\n protected _overwriteContainer(cb: () => Container): void {\r\n this.container = cb();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region InversifyJS Container native methods\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__bind}.\r\n */\r\n /* istanbul ignore next */\r\n protected __bind<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onBind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__get}.\r\n */\r\n /* istanbul ignore next */\r\n protected __get<T>(provider: ProviderToken<T>, options?: GetOptions): T {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onGet');\r\n\r\n return this.container.get(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected __getAll<T>(provider: ProviderToken<T>, options?: GetOptions): T[] {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAll(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__getAllAsync}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __getAllAsync<T>(provider: ProviderToken<T>, options?: GetOptions): Promise<T[]> {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.getAllAsync(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__isCurrentBound}.\r\n */\r\n /* istanbul ignore next */\r\n protected __isCurrentBound(provider: ProviderToken, options?: IsBoundOptions): boolean {\r\n this.shouldThrowIfDisposed();\r\n\r\n return this.container.isCurrentBound(ProviderTokenHelpers.toServiceIdentifier(provider), options);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__takeSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __takeSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.snapshot();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__restoreSnapshot}.\r\n */\r\n /* istanbul ignore next */\r\n protected __restoreSnapshot(): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.restore();\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __rebind<T>(provider: ProviderToken<T>): Promise<BindToFluentSyntax<T>> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = await this.container.rebind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__rebindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __rebindSync<T>(provider: ProviderToken<T>): BindToFluentSyntax<T> {\r\n this.shouldThrowIfDisposed();\r\n\r\n const binding = this.container.rebindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.invokeRegisteredSideEffects(provider, 'onRebind');\r\n\r\n return binding;\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbind}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbind(provider: ProviderToken): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbind(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n await this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindSync}.\r\n */\r\n /* istanbul ignore next */\r\n protected __unbindSync(provider: ProviderToken): void {\r\n this.shouldThrowIfDisposed();\r\n\r\n this.container.unbindSync(ProviderTokenHelpers.toServiceIdentifier(provider));\r\n\r\n this.removeRegisteredSideEffects(provider);\r\n }\r\n\r\n /**\r\n * **Publicly visible when the instance is casted to {@link IProviderModuleNaked}.**\r\n *\r\n * See {@link IProviderModuleNaked.__unbindAll}.\r\n */\r\n /* istanbul ignore next */\r\n protected async __unbindAll(): Promise<void> {\r\n this.shouldThrowIfDisposed();\r\n\r\n await this.container.unbindAll();\r\n\r\n await this.removeRegisteredSideEffects('all');\r\n }\r\n\r\n //#endregion\r\n}\r\n","import type { BindInWhenOnFluentSyntax, BindOnFluentSyntax, BindWhenOnFluentSyntax, Container } from 'inversify';\r\n\r\nimport { AppModule, GlobalModuleRegister } from '../core';\r\nimport { InjectionScope } from '../enums';\r\nimport { ProviderTokenHelpers } from '../helpers';\r\nimport type {\r\n DependencyProvider,\r\n IProviderModule,\r\n IProviderModuleNaked,\r\n ProviderClassToken,\r\n ProviderFactoryToken,\r\n ProviderIdentifier,\r\n ProviderModuleOptionsInternal,\r\n ProviderOptions,\r\n ProviderToken,\r\n ProviderValueToken,\r\n} from '../types';\r\n\r\n/**\r\n * Class containing an internal set of `utils`.\r\n *\r\n * Each {@link IProviderModuleNaked.moduleUtils | ProviderModule} instance has its own {@link ProviderModuleUtils} property instance.\r\n */\r\nexport class ProviderModuleUtils {\r\n /** The low-level InversifyJS {@link Container} owned by {@link ProviderModuleUtils.module | module}. */\r\n get container(): Container {\r\n return this.moduleNaked.container;\r\n }\r\n\r\n readonly appModule = AppModule;\r\n /** The parent {@link IProviderModule | ProviderModule} of `this` instance. */\r\n readonly module: IProviderModule;\r\n readonly moduleNaked: IProviderModuleNaked;\r\n\r\n constructor(module: IProviderModule, internalOptions: ProviderModuleOptionsInternal) {\r\n this.module = module;\r\n this.moduleNaked = module.toNaked();\r\n\r\n this.appModule = internalOptions.appModule?.() ?? this.appModule;\r\n\r\n this.checkIfShouldBeAddedToTheGlobalRegister();\r\n }\r\n\r\n /**\r\n * Low-level method which can be used to manually register _(bind)_ a new {@link provider} into the {@link ProviderModuleUtils.module | module} container.\r\n *\r\n * **Note:** _You shouldn't directly use this to register providers as they will not appear_\r\n * _into the module's `imports` and `exports` arrays! Therefore leading to unexpected bugs and confusion!_\r\n *\r\n * @param provider The {@link ProviderToken | provider} to register.\r\n * @param defaultScope Optionally provide the default {@link InjectionScope} to use when applicable.\r\n * @returns `true` when the {@link provider} has been bound otherwhise `false`.\r\n */\r\n bindToContainer<T>(provider: DependencyProvider<T>, defaultScope: InjectionScope): boolean {\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) {\r\n return this.bindSelfTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isClassToken(provider)) {\r\n return this.bindClassTokenToContainer(provider, defaultScope);\r\n } else if (ProviderTokenHelpers.isValueToken(provider)) {\r\n return this.bindValueTokenToContainer(provider);\r\n } else if (ProviderTokenHelpers.isFactoryToken(provider)) {\r\n return this.bindFactoryTokenToContainer(provider, defaultScope);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private checkIfShouldBeAddedToTheGlobalRegister(): void {\r\n if (this.moduleNaked.isAppModule || !this.module.isGlobal || this.moduleNaked.instantiatedFromDefinition) {\r\n return;\r\n }\r\n\r\n GlobalModuleRegister.add(this.module);\r\n }\r\n\r\n private bindSelfTokenToContainer<T>(provider: ProviderIdentifier<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toSelf(),\r\n defaultScope\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindClassTokenToContainer<T>(provider: ProviderClassToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).to(provider.useClass),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindValueTokenToContainer<T>(provider: ProviderValueToken<T>): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.container.bind(ProviderTokenHelpers.toServiceIdentifier(provider)).toConstantValue(provider.useValue)\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n private bindFactoryTokenToContainer<T>(provider: ProviderFactoryToken<T>, defaultScope: InjectionScope): boolean {\r\n this.setBindingOnEvent(\r\n provider,\r\n this.setWhenBinding(\r\n provider,\r\n this.setBindingScope(\r\n provider,\r\n this.container\r\n .bind(ProviderTokenHelpers.toServiceIdentifier(provider))\r\n .toResolvedValue(provider.useFactory, ProviderTokenHelpers.toServiceIdentifiers(provider.inject ?? [])),\r\n defaultScope\r\n )\r\n )\r\n );\r\n\r\n return this.moduleNaked.__isCurrentBound(provider);\r\n }\r\n\r\n /** Sets the {@link InjectionScope} of a bound {@link provider}. */\r\n private setBindingScope<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindInWhenOnFluentSyntax<T>,\r\n defaultScope: InjectionScope\r\n ): BindWhenOnFluentSyntax<T> {\r\n // A constant token will always be a singleton.\r\n if (ProviderTokenHelpers.isValueToken(provider)) return binding;\r\n\r\n const injectionScope = ProviderTokenHelpers.getInjectionScopeByPriority(provider, defaultScope);\r\n\r\n switch (injectionScope) {\r\n case InjectionScope.Singleton:\r\n return binding.inSingletonScope();\r\n case InjectionScope.Transient:\r\n return binding.inTransientScope();\r\n case InjectionScope.Request:\r\n return binding.inRequestScope();\r\n }\r\n }\r\n\r\n /** Sets the `when` clause of a bound {@link provider}. */\r\n private setWhenBinding<T>(\r\n provider: ProviderToken<T>,\r\n binding: BindWhenOnFluentSyntax<T>\r\n ): BindOnFluentSyntax<unknown> {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return binding;\r\n\r\n const when = (provider as ProviderOptions<unknown>).when;\r\n if (!when) return binding;\r\n\r\n return binding.when(when);\r\n }\r\n\r\n /** Sets the `activation` and `deactivation` events of a bound {@link provider}. */\r\n private setBindingOnEvent(provider: ProviderToken, binding: BindOnFluentSyntax<any>): void {\r\n // A `ProviderIdentifier` has no options.\r\n if (ProviderTokenHelpers.isProviderIdentifier(provider)) return;\r\n\r\n const opts = provider as ProviderOptions<unknown>;\r\n\r\n if (opts.onEvent?.activation) {\r\n binding.onActivation(opts.onEvent.activation);\r\n }\r\n\r\n if (opts.onEvent?.deactivation) {\r\n binding.onDeactivation(opts.onEvent.deactivation);\r\n }\r\n }\r\n}\r\n","import { InjectionError, InjectionProviderModuleGlobalMarkError } from '../errors';\r\nimport { ProviderModuleHelpers } from '../helpers';\r\nimport type {\r\n AppModuleOptions,\r\n ExportsList,\r\n IAppModule,\r\n IProviderModuleNaked,\r\n ProviderModuleOrDefinition,\r\n} from '../types';\r\nimport { GLOBAL_APP_MODULE_ID } from './constants';\r\nimport { GlobalModuleRegister } from './global-modules-register';\r\nimport { ProviderModule } from './provider-module';\r\n\r\n/**\r\n * Class of the {@link AppModule} instance.\r\n *\r\n * **You shouldn't initialize a new instance of this class, please use the {@link AppModule} instance!**\r\n */\r\nexport class GlobalAppModule extends ProviderModule implements IAppModule {\r\n _strict: AppModuleOptions['_strict'];\r\n\r\n private nakedModule = this as unknown as IProviderModuleNaked;\r\n private isLoaded = false;\r\n\r\n constructor() {\r\n super(\r\n ProviderModuleHelpers.buildInternalConstructorParams({\r\n identifier: GLOBAL_APP_MODULE_ID,\r\n isAppModule: true,\r\n })\r\n );\r\n }\r\n\r\n register<AsNaked extends boolean = false>(\r\n options: AppModuleOptions\r\n ): AsNaked extends false ? IAppModule : IAppModule & IProviderModuleNaked {\r\n if (this.isLoaded) {\r\n throw new InjectionError(`The '${this.toString()}' has already been registered!`);\r\n }\r\n\r\n this._strict = options._strict ?? true;\r\n\r\n this.nakedModule._internalInit(options);\r\n\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, this.imports);\r\n\r\n this.isLoaded = true;\r\n\r\n return this as any;\r\n }\r\n\r\n override lazyImport(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n /* istanbul ignore next */\r\n override toNaked(): IAppModule & IProviderModuleNaked {\r\n return super.toNaked() as any;\r\n }\r\n\r\n override async dispose(): Promise<void> {\r\n this.isLoaded = false;\r\n\r\n await super.dispose();\r\n }\r\n\r\n /** **Internally used, do not use!** */\r\n _importWithoutSecondaryImportCheck(...modules: ProviderModuleOrDefinition[]): void {\r\n this.checkIfRegisteredModulesHaveGlobalMark(this.nakedModule, modules, true);\r\n\r\n super.lazyImport(...modules);\r\n }\r\n\r\n private checkIfRegisteredModulesHaveGlobalMark(\r\n parentModule: IProviderModuleNaked,\r\n list: ExportsList,\r\n isSecondaryImport = false\r\n ): void {\r\n if (!this._strict) return;\r\n\r\n list.forEach((m) => {\r\n const module = ProviderModuleHelpers.tryStaticOrLazyExportToStaticExport(this, m) as IProviderModuleNaked;\r\n const isModuleDefinition = ProviderModuleHelpers.isModuleDefinition(module);\r\n\r\n if (!(module instanceof ProviderModule) && !isModuleDefinition) return;\r\n\r\n if (module.isGlobal) {\r\n GlobalModuleRegister.delete(module);\r\n\r\n // This module may also export other modules\r\n // which may have been marked as global\r\n // and not directly imported into the `AppModule`.\r\n if (module.exports) {\r\n this.checkIfRegisteredModulesHaveGlobalMark(module, module.exports, true);\r\n }\r\n\r\n return;\r\n }\r\n\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n isSecondaryImport\r\n ? 'Is not marked as `global` but has been imported into the `AppModule` ' +\r\n `via the \\`${parentModule.toString()}\\` module!`\r\n : 'Is not marked as `global` but has been imported into the `AppModule`!'\r\n );\r\n });\r\n\r\n if (isSecondaryImport) return;\r\n\r\n GlobalModuleRegister.forEach((module) => {\r\n throw new InjectionProviderModuleGlobalMarkError(\r\n module,\r\n `Is marked as 'global' and has not been imported into the 'AppModule'!`\r\n );\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Special instance of {@link ProviderModule} which acts as the global module of your application in which you can inject any provider\r\n * which must be available through your entire application.\r\n *\r\n * The registered providers will automatically be available inside all the modules.\r\n *\r\n * @example\r\n * ```ts\r\n * // The `register` method must be invoked only once during your application life cycle!\r\n * AppModule.register({\r\n * imports: [ConfigModule, ApiModule, UserModule, DatabaseModule],\r\n * providers: [DummyService],\r\n * });\r\n * ```\r\n */\r\nexport const AppModule = new GlobalAppModule();\r\n"],"mappings":"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","names":["GLOBAL_APP_MODULE_ID","injectable","_injectable","InjectionScope","injectionScopeToBindingScope","injectionScope","InjectionScope","Singleton","Transient","Request","bindingScopeToInjectionScope","bindingScope","getClassMetadata","isClass","v","Function","prototype","toString","call","startsWith","isClassOrFunction","value","isFunction","v","Function","prototype","toString","call","startsWith","isObject","o","Object","prototype","toString","call","isPlainObject","ctor","constructor","undefined","prot","hasOwnProperty","ProviderTokenHelpers","isClassToken","provider","hasProvideProperty","isValueToken","isFactoryToken","isProviderIdentifier","value","isClassOrFunction","toServiceIdentifier","provide","toServiceIdentifiers","providers","map","toDependencyProviderWithOptions","original","override","isClass","useClass","isFunction","useFactory","getInjectionScopeByPriority","moduleDefaultScope","tryGetScopeFromProvider","tryGetDecoratorScopeFromClass","tryGetProviderOptions","providerOptions","scope","providerClass","inversifyScope","getClassMetadata","bindingScopeToInjectionScope","isPlainObject","GlobalModuleRegister","Set","ProviderModuleDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","constructor","moduleOptions","InjectionScope","Singleton","checkIfShouldBeAddedToTheGlobalRegister","getDefinition","clone","definition","currentDefinition","toString","description","GlobalModuleRegister","add","ProviderModuleHelpers","buildInternalConstructorParams","params","getOptionsOrModuleDefinitionOptions","optionsOrDefinition","identifier","imports","providers","exports","defaultScope","isGlobal","onReady","onDispose","internalParams","internalOptions","isModuleDefinition","ip","options","value","ProviderModuleDefinition","isLazyExport","exp","isFunction","tryStaticOrLazyExportToStaticExport","module","Injectable","scope","undefined","_injectable","injectionScopeToBindingScope","inject","_inject","Inject","provider","_inject","ProviderTokenHelpers","toServiceIdentifier","multiInject","_multiInject","MultiInject","provider","_multiInject","ProviderTokenHelpers","toServiceIdentifier","injectFromBase","_injectFromBase","InjectFromBase","options","_injectFromBase","named","_named","Named","name","_named","optional","_optional","Optional","_optional","tagged","_tagged","Tagged","key","value","_tagged","unmanaged","_unmanaged","Unmanaged","_unmanaged","InjectionError","Error","name","InjectionProviderModuleError","Error","name","constructor","module","message","toString","InjectionProviderModuleDisposedError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleMissingIdentifierError","InjectionProviderModuleError","name","constructor","module","InjectionProviderModuleGlobalMarkError","InjectionProviderModuleError","name","constructor","module","message","Container","GlobalContainer","defaultScope","Container","ProviderModuleUtils","container","moduleNaked","appModule","AppModule","module","constructor","internalOptions","toNaked","checkIfShouldBeAddedToTheGlobalRegister","bindToContainer","provider","defaultScope","ProviderTokenHelpers","isProviderIdentifier","bindSelfTokenToContainer","isClassToken","bindClassTokenToContainer","isValueToken","bindValueTokenToContainer","isFactoryToken","bindFactoryTokenToContainer","isAppModule","isGlobal","instantiatedFromDefinition","GlobalModuleRegister","add","setBindingScope","bind","toServiceIdentifier","toSelf","__isCurrentBound","setBindingOnEvent","setWhenBinding","to","useClass","toConstantValue","useValue","toResolvedValue","useFactory","toServiceIdentifiers","inject","binding","injectionScope","getInjectionScopeByPriority","InjectionScope","Singleton","inSingletonScope","Transient","inTransientScope","Request","inRequestScope","when","opts","onEvent","activation","onActivation","deactivation","onDeactivation","ProviderModule","isDisposed","identifier","isGlobal","isAppModule","instantiatedFromDefinition","container","defaultScope","onReady","onDispose","moduleUtils","imports","providers","exports","registeredSideEffects","constructor","options","opts","internalOptions","ProviderModuleHelpers","getOptionsOrModuleDefinitionOptions","setIdentifier","_internalInit","get","provider","isOptional","__get","optional","getMany","deps","map","dep","withOptions","isPlainObject","lazyImport","modules","injectImportedModules","toNaked","dispose","before","after","__unbindAll","toString","description","InjectionProviderModuleMissingIdentifierError","prepareContainer","params","GlobalContainer","console","warn","Container","parent","inversify","importedModules","length","forEach","importedModuleOrDefinition","InjectionProviderModuleError","appModule","_importWithoutSecondaryImportCheck","importedModule","isModuleDefinition","buildInternalConstructorParams","getDefinition","exp","exportable","tryStaticOrLazyExportToStaticExport","providerToken","serviceIdentifier","ProviderTokenHelpers","toServiceIdentifier","importedProvider","scope","getInjectionScopeByPriority","native","provide","useFactory","bindToContainer","registerSideEffect","__unbind","registerModuleId","_onUnbind","effects","onUnbindEffects","filter","effect","injectProviders","on","cb","has","set","onBindEffects","onGetEffects","onRebindEffects","providerSideEffects","push","once","invoked","invokeRegisteredSideEffects","event","p","removeRegisteredSideEffects","clear","unbindEffects","delete","shouldThrowIfDisposed","InjectionProviderModuleDisposedError","InjectionScope","Singleton","injectionScopeToBindingScope","ProviderModuleUtils","Map","_onBind","_onGet","name","_onRebind","_overwriteContainer","__bind","binding","bind","__getAsync","getAsync","__getAll","getAll","__getAllAsync","getAllAsync","__isBound","isBound","__isCurrentBound","isCurrentBound","__takeSnapshot","snapshot","__restoreSnapshot","restore","__rebind","rebind","__rebindSync","rebindSync","unbind","__unbindSync","unbindSync","unbindAll","GlobalAppModule","ProviderModule","_strict","nakedModule","isLoaded","constructor","ProviderModuleHelpers","buildInternalConstructorParams","identifier","GLOBAL_APP_MODULE_ID","isAppModule","register","options","InjectionError","toString","_internalInit","checkIfRegisteredModulesHaveGlobalMark","imports","lazyImport","modules","toNaked","dispose","_importWithoutSecondaryImportCheck","parentModule","list","isSecondaryImport","forEach","m","module","tryStaticOrLazyExportToStaticExport","isModuleDefinition","isGlobal","GlobalModuleRegister","delete","exports","InjectionProviderModuleGlobalMarkError","AppModule"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adimm/x-injection",
|
|
3
3
|
"description": "Powerful IoC library built on-top of InversifyJS inspired by NestJS's DI.",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.1",
|
|
5
5
|
"author": "Adi-Marian Mutu",
|
|
6
6
|
"homepage": "https://github.com/AdiMarianMutu/x-injection#readme",
|
|
7
7
|
"bugs": "https://github.com/AdiMarianMutu/x-injection/issues",
|