@navios/di 0.3.0 → 0.3.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/lib/_tsup-dts-rollup.d.mts +5 -1
- package/lib/_tsup-dts-rollup.d.ts +5 -1
- package/lib/index.js +31 -11
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +31 -11
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/request-scope.spec.mts +164 -0
- package/src/request-context-holder.mts +33 -4
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/enums/injectable-scope.enum.mts","../src/enums/injectable-type.enum.mts","../src/injection-token.mts","../src/registry.mts","../src/symbols/injectable-token.mts","../src/decorators/factory.decorator.mts","../src/decorators/injectable.decorator.mts","../src/errors/errors.enum.mts","../src/errors/factory-not-found.mts","../src/errors/factory-token-not-resolved.mts","../src/errors/instance-destroying.mts","../src/errors/instance-expired.mts","../src/errors/instance-not-found.mts","../src/errors/unknown-error.mts","../src/utils/get-injectors.mts","../src/utils/get-injectable-token.mts","../src/utils/defer.mts","../src/event-emitter.mts","../src/injector.mts","../src/service-instantiator.mts","../src/request-context-holder.mts","../src/service-locator-event-bus.mts","../src/service-locator-instance-holder.mts","../src/service-locator-manager.mts","../src/service-locator.mts","../src/container.mts"],"names":["InjectableScope","InjectableType","ErrorsEnum","provideFactoryContext","asyncInject","wrapSyncInit","inject","res","ServiceLocatorInstanceHolderStatus","_init","holder"],"mappings":"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","file":"index.mjs","sourcesContent":["export enum InjectableScope {\n /**\n * Singleton scope: The instance is created once and shared across the application.\n */\n Singleton = 'Singleton',\n /**\n * Instance scope: A new instance is created for each injection.\n */\n Transient = 'Transient',\n /**\n * Request scope: The instance is created once per request and shared within that request context.\n */\n Request = 'Request',\n}\n","export enum InjectableType {\n Class = 'Class',\n Factory = 'Factory',\n}\n","import type { z, ZodObject, ZodOptional, ZodRecord } from 'zod/v4'\n\nimport type { FactoryContext } from './factory-context.mjs'\n\nexport type ClassType = new (...args: any[]) => any\nexport type ClassTypeWithArgument<Arg> = new (arg: Arg) => any\nexport type ClassTypeWithOptionalArgument<Arg> = new (arg?: Arg) => any\n\nexport type ClassTypeWithInstance<T> = new (...args: any[]) => T\nexport type ClassTypeWithInstanceAndArgument<T, Arg> = new (arg: Arg) => T\nexport type ClassTypeWithInstanceAndOptionalArgument<T, Arg> = new (\n arg?: Arg,\n) => T\n\nexport type BaseInjectionTokenSchemaType = ZodObject | ZodRecord\n\nexport type OptionalInjectionTokenSchemaType =\n | ZodOptional<ZodObject>\n | ZodOptional<ZodRecord>\n\nexport type InjectionTokenSchemaType =\n | BaseInjectionTokenSchemaType\n | OptionalInjectionTokenSchemaType\n\nexport class InjectionToken<\n // oxlint-disable-next-line no-unused-vars\n T,\n S extends InjectionTokenSchemaType | unknown = unknown,\n // oxlint-disable-next-line no-unused-vars\n Required extends boolean = S extends ZodOptional<ZodObject>\n ? false\n : S extends ZodOptional<ZodRecord>\n ? false\n : S extends ZodObject\n ? true\n : S extends ZodRecord\n ? true\n : false,\n> {\n public id = globalThis.crypto.randomUUID()\n private formattedName: string | null = null\n\n constructor(\n public readonly name: string | symbol | ClassType,\n public readonly schema: ZodObject | undefined,\n ) {}\n\n static create<T extends ClassType>(\n name: T,\n ): InjectionToken<InstanceType<T>, undefined>\n static create<T extends ClassType, Schema extends InjectionTokenSchemaType>(\n name: T,\n schema: Schema,\n ): Schema['_def']['type'] extends 'ZodOptional'\n ? InjectionToken<InstanceType<T>, Schema, false>\n : InjectionToken<InstanceType<T>, Schema, true>\n static create<T>(name: string | symbol): InjectionToken<T, undefined>\n static create<T, Schema extends InjectionTokenSchemaType>(\n name: string | any,\n schema: Schema,\n ): InjectionToken<T, Schema>\n static create(name: string | symbol, schema?: unknown) {\n // @ts-expect-error\n return new InjectionToken(name, schema)\n }\n\n static bound<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n value: z.input<S>,\n ): BoundInjectionToken<T, S> {\n return new BoundInjectionToken(token, value)\n }\n\n static factory<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n factory: (ctx: FactoryContext) => Promise<z.input<S>>,\n ): FactoryInjectionToken<T, S> {\n return new FactoryInjectionToken(token, factory)\n }\n\n static refineType<T>(\n token: BoundInjectionToken<any, any>,\n ): BoundInjectionToken<T, any> {\n return token as BoundInjectionToken<T, any>\n }\n\n toString() {\n if (this.formattedName) {\n return this.formattedName\n }\n const { name } = this\n if (typeof name === 'function') {\n const className = name.name\n this.formattedName = `${className}(${this.id})`\n } else if (typeof name === 'symbol') {\n this.formattedName = `${name.toString()}(${this.id})`\n } else {\n this.formattedName = `${name}(${this.id})`\n }\n\n return this.formattedName\n }\n}\n\nexport class BoundInjectionToken<T, S extends InjectionTokenSchemaType> {\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly value: z.input<S>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n toString() {\n return this.token.toString()\n }\n}\n\nexport class FactoryInjectionToken<T, S extends InjectionTokenSchemaType> {\n public value?: z.input<S>\n public resolved = false\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly factory: (ctx: FactoryContext) => Promise<z.input<S>>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n async resolve(ctx: FactoryContext): Promise<z.input<S>> {\n if (!this.value) {\n this.value = await this.factory(ctx)\n this.resolved = true\n }\n return this.value\n }\n\n toString() {\n return this.token.toString()\n }\n}\n\nexport type AnyInjectableType =\n | ClassType\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>\n\nexport type InjectionTokenType =\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>\n","import type { ClassType, InjectionToken } from './injection-token.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\n\nexport type FactoryRecord<Instance = any, Schema = any> = {\n scope: InjectableScope\n originalToken: InjectionToken<Instance, Schema>\n target: ClassType\n type: InjectableType\n}\n\nexport class Registry {\n private readonly factories = new Map<string, FactoryRecord>()\n\n constructor(private readonly parent?: Registry) {}\n\n has(token: InjectionToken<any, any>): boolean {\n if (this.factories.has(token.id)) {\n return true\n }\n if (this.parent) {\n return this.parent.has(token)\n }\n return false\n }\n\n get<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n ): FactoryRecord<Instance, Schema> {\n const factory = this.factories.get(token.id)\n if (!factory) {\n if (this.parent) {\n return this.parent.get(token)\n }\n throw new Error(`[Registry] No factory found for ${token.toString()}`)\n }\n return factory\n }\n\n set<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n scope: InjectableScope,\n target: ClassType,\n type: InjectableType,\n ) {\n this.factories.set(token.id, { scope, originalToken: token, target, type })\n }\n\n delete(token: InjectionToken<any, any>) {\n this.factories.delete(token.id)\n }\n}\n\nexport const globalRegistry = new Registry()\n","export const InjectableTokenMeta = Symbol.for('InjectableTokenMeta')\n","import type {\n ClassTypeWithInstance,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Factorable, FactorableWithArgs } from '../interfaces/index.mjs'\nimport type { Registry } from '../registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface FactoryOptions {\n scope?: InjectableScope\n token?: InjectionToken<any, any>\n registry?: Registry\n}\n\n// #1 Factory without arguments\nexport function Factory<R>(options?: {\n scope?: InjectableScope\n registry?: Registry\n}): <T extends ClassTypeWithInstance<Factorable<R>>>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n\n// #2 Factory with typed token\nexport function Factory<R, S>(options: {\n scope?: InjectableScope\n token: InjectionToken<R, S>\n registry?: Registry\n}): R extends undefined // #2.1 Check that token has a type\n ? never // #2.1.1 Token must have a type\n : S extends InjectionTokenSchemaType // #2.2 Check that schema is an object or a record\n ? <T extends ClassTypeWithInstance<FactorableWithArgs<R, S>>>( // #2.2.1 Token have a schema\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : S extends undefined // #2.3 For a factory without schema\n ? <T extends ClassTypeWithInstance<Factorable<R>>>( // #2.3.1 Token without a schema\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : never // #2.4 Cannot use a token without a type and schema\n\nexport function Factory({\n scope = InjectableScope.Singleton,\n token,\n registry = globalRegistry,\n}: FactoryOptions = {}) {\n return <\n T extends ClassTypeWithInstance<\n Factorable<any> | FactorableWithArgs<any, any>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error(\n '[ServiceLocator] @Factory decorator can only be used on classes.',\n )\n }\n\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n\n registry.set(injectableToken, scope, target, InjectableType.Factory)\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","import { z } from 'zod/v4'\n\nimport type {\n BaseInjectionTokenSchemaType,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithInstance,\n ClassTypeWithInstanceAndArgument,\n ClassTypeWithInstanceAndOptionalArgument,\n ClassTypeWithOptionalArgument,\n OptionalInjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Registry } from '../registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface InjectableOptions {\n scope?: InjectableScope\n token?: InjectionToken<any, any>\n registry?: Registry\n}\n// #1 Simple constructorless class\nexport function Injectable(): <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n scope?: InjectableScope\n registry: Registry\n}): <T extends ClassType>(target: T, context?: ClassDecoratorContext) => T\nexport function Injectable(options: {\n scope: InjectableScope\n}): <T extends ClassType>(target: T, context?: ClassDecoratorContext) => T\n\n// #3 Class with typeless token and schema\nexport function Injectable<Type, Schema>(options: {\n scope?: InjectableScope\n token: InjectionToken<Type, Schema>\n registry?: Registry\n}): Schema extends BaseInjectionTokenSchemaType // #3.1 Check that schema is an object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithArgument<z.output<Schema>>>( // #3.1.1 Typeless token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>( // #3.1.2 Typed token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends OptionalInjectionTokenSchemaType // #3.2 Check that schema is an optional object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>( // #3.2.1 Typeless token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <\n // #3.2.2 Typed token\n T extends ClassTypeWithInstanceAndOptionalArgument<\n Type,\n z.output<Schema>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends undefined // #3.3 Check that schema is undefined\n ? <R extends ClassTypeWithInstance<Type>>( // #3.3.1 Token must have a type\n target: R,\n context?: ClassDecoratorContext,\n ) => R\n : never // #3.4 Cannot use a token without a type and schema\n\nexport function Injectable({\n scope = InjectableScope.Singleton,\n token,\n registry = globalRegistry,\n}: InjectableOptions = {}) {\n return <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error(\n '[ServiceLocator] @Injectable decorator can only be used on classes.',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n\n registry.set(injectableToken, scope, target, InjectableType.Class)\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","export enum ErrorsEnum {\n InstanceExpired = 'InstanceExpired',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n UnknownError = 'UnknownError',\n FactoryNotFound = 'FactoryNotFound',\n FactoryTokenNotResolved = 'FactoryTokenNotResolved',\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryNotFound extends Error {\n code = ErrorsEnum.FactoryNotFound\n constructor(public name: string) {\n super(`Factory ${name} not found`)\n }\n}\n","import type { ClassType } from '../injection-token.mjs'\n\nimport { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryTokenNotResolved extends Error {\n code = ErrorsEnum.FactoryTokenNotResolved\n constructor(name: string | symbol | ClassType) {\n super(`Factory token not resolved: ${name.toString()}`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceDestroying extends Error {\n code = ErrorsEnum.InstanceDestroying\n constructor(public name: string) {\n super(`Instance ${name} destroying`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceExpired extends Error {\n code = ErrorsEnum.InstanceExpired\n constructor(public name: string) {\n super(`Instance ${name} expired`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceNotFound extends Error {\n code = ErrorsEnum.InstanceNotFound\n constructor(public name: string) {\n super(`Instance ${name} not found`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class UnknownError extends Error {\n code = ErrorsEnum.UnknownError\n parent?: Error\n\n constructor(message: string | Error) {\n if (message instanceof Error) {\n super(message.message)\n this.parent = message\n return\n }\n super(message)\n }\n}\n","import type { z, ZodObject, ZodType } from 'zod/v4'\n\nimport type { FactoryContext } from '../factory-context.mjs'\nimport type {\n BoundInjectionToken,\n ClassType,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Factorable } from '../interfaces/factory.interface.mjs'\nimport type { InjectState, Join, UnionToArray } from './types.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface Injectors {\n // #1 Simple class\n asyncInject<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n // #2 Token with required Schema\n asyncInject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n asyncInject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? Promise<T>\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n // #4 Token with no Schema\n asyncInject<T>(token: InjectionToken<T, undefined>): Promise<T>\n asyncInject<T>(token: BoundInjectionToken<T, any>): Promise<T>\n asyncInject<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n inject<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>\n inject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T\n // #3 Token with optional Schema\n inject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? T\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n inject<T>(token: InjectionToken<T, undefined>): T\n inject<T>(token: BoundInjectionToken<T, any>): T\n inject<T>(token: FactoryInjectionToken<T, any>): T\n\n wrapSyncInit(\n cb: () => any,\n ): (injectState?: InjectState) => [any, Promise<any>[], InjectState]\n\n provideFactoryContext(context: FactoryContext | null): FactoryContext | null\n}\n\nexport function getInjectors() {\n let currentFactoryContext: FactoryContext | null = null\n\n function provideFactoryContext(\n context: FactoryContext,\n ): FactoryContext | null {\n const original = currentFactoryContext\n currentFactoryContext = context\n return original\n }\n function getFactoryContext(): FactoryContext {\n if (!currentFactoryContext) {\n throw new Error(\n '[Injector] Trying to access injection context outside of a injectable context',\n )\n }\n return currentFactoryContext\n }\n\n let promiseCollector: null | ((promise: Promise<any>) => void) = null\n let injectState: InjectState | null = null\n\n function asyncInject(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n if (injectState.isFrozen) {\n const idx = injectState.currentIndex++\n const request = injectState.requests[idx]\n if (request.token !== token) {\n throw new Error(\n `[Injector] Wrong token order. Expected ${request.token.toString()} but got ${token.toString()}`,\n )\n }\n return request.promise\n }\n\n const promise = getFactoryContext().inject(token as any, args as any)\n injectState.requests.push({\n token,\n promise,\n })\n injectState.currentIndex++\n\n return promise\n }\n\n function wrapSyncInit(cb: () => any) {\n return (previousState?: InjectState) => {\n const promises: Promise<any>[] = []\n const originalPromiseCollector = promiseCollector\n const originalInjectState = injectState\n injectState = previousState\n ? {\n ...previousState,\n currentIndex: 0,\n }\n : {\n currentIndex: 0,\n isFrozen: false,\n requests: [],\n }\n promiseCollector = (promise) => {\n promises.push(promise)\n }\n const result = cb()\n promiseCollector = originalPromiseCollector\n const newInjectState = {\n ...injectState,\n isFrozen: true,\n }\n injectState = originalInjectState\n return [result, promises, newInjectState]\n }\n }\n\n function inject<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends ZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends ZodObject ? z.input<S> : never): T {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n const instance = getFactoryContext().locator.getSyncInstance(\n realToken,\n args,\n )\n if (!instance) {\n if (promiseCollector) {\n const promise = getFactoryContext().inject(realToken, args)\n promiseCollector(promise)\n } else {\n throw new Error(`[Injector] Cannot initiate ${realToken.toString()}`)\n }\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please use asyncInject() instead of inject() or do not use the value outside of class methods`,\n )\n },\n },\n ) as unknown as T\n }\n return instance as unknown as T\n }\n\n const injectors: Injectors = {\n asyncInject,\n inject,\n wrapSyncInit,\n provideFactoryContext,\n } as Injectors\n\n return injectors\n}\n","import type { ClassType, InjectionToken } from '../injection-token.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport function getInjectableToken<R>(\n target: ClassType,\n): R extends { create(...args: any[]): infer V }\n ? InjectionToken<V>\n : InjectionToken<R> {\n // @ts-expect-error We inject the token into the class itself\n const token = target[InjectableTokenMeta] as InjectionToken<any, any>\n if (!token) {\n throw new Error(\n `[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`,\n )\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n","/**\n * Creates a deferred promise that can be resolved or rejected externally.\n * This is useful for creating stub holders that can be fulfilled later.\n */\nexport class Deferred<T> {\n public readonly promise: Promise<T>\n private _resolve!: (value: T) => void\n private _reject!: (reason?: any) => void\n private _isResolved = false\n private _isRejected = false\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n /**\n * Resolves the deferred promise with the given value.\n * @param value The value to resolve with\n * @throws Error if the promise has already been resolved or rejected\n */\n resolve(value: T): void {\n if (this._isResolved || this._isRejected) {\n throw new Error('Deferred promise has already been resolved or rejected')\n }\n this._isResolved = true\n this._resolve(value)\n }\n\n /**\n * Rejects the deferred promise with the given reason.\n * @param reason The reason for rejection\n * @throws Error if the promise has already been resolved or rejected\n */\n reject(reason?: any): void {\n if (this._isResolved || this._isRejected) {\n throw new Error('Deferred promise has already been resolved or rejected')\n }\n this._isRejected = true\n this._reject(reason)\n }\n\n /**\n * Returns true if the promise has been resolved.\n */\n get isResolved(): boolean {\n return this._isResolved\n }\n\n /**\n * Returns true if the promise has been rejected.\n */\n get isRejected(): boolean {\n return this._isRejected\n }\n\n /**\n * Returns true if the promise has been settled (resolved or rejected).\n */\n get isSettled(): boolean {\n return this._isResolved || this._isRejected\n }\n}\n\n/**\n * Creates a new deferred promise.\n * @returns A new Deferred instance\n */\nexport function createDeferred<T>(): Deferred<T> {\n return new Deferred<T>()\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\nimport { Injectable, InjectableScope } from './index.mjs'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type EventsConfig = {\n [event: string]: any[]\n}\nexport type EventsNames<Events extends EventsConfig> = Exclude<\n keyof Events,\n symbol | number\n>\nexport type EventsArgs<\n Events extends EventsConfig,\n Name extends EventsNames<Events>,\n> = Events[Name] extends any[] ? Events[Name] : []\n\nexport type ChannelEmitter<\n Events extends EventsConfig,\n Ns extends string,\n E extends EventsNames<Events>,\n> = {\n emit<Args extends EventsArgs<Events, E>>(\n ns: Ns,\n event: E,\n ...args: Args\n ): Promise<any>\n}\n\nexport interface EventEmitterInterface<Events extends EventsConfig> {\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ): () => void\n emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): void\n}\n\n@Injectable({ scope: InjectableScope.Transient })\nexport class EventEmitter<Events extends EventsConfig = {}>\n implements EventEmitterInterface<Events>\n{\n private listeners: Map<EventsNames<Events>, Set<Function>> = new Map()\n\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n\n this.listeners.get(event)!.add(listener)\n\n return () => {\n this.off(event, listener)\n }\n }\n\n off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n return\n }\n\n this.listeners.get(event)!.delete(listener)\n if (this.listeners.get(event)!.size === 0) {\n this.listeners.delete(event)\n }\n }\n\n once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n const off = this.on(event, (...args) => {\n off()\n // @ts-expect-error - This is a valid call\n listener(...args)\n })\n\n return off\n }\n\n async emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): Promise<any> {\n if (!this.listeners.has(event)) {\n return\n }\n\n return Promise.all(\n Array.from(this.listeners.get(event)!).map((listener) =>\n listener(...args),\n ),\n )\n }\n}\n","import type { Injectors } from './utils/index.mjs'\n\nimport { getInjectors } from './utils/index.mjs'\n\nexport const defaultInjectors = getInjectors()\n\nexport const asyncInject: Injectors['asyncInject'] =\n defaultInjectors.asyncInject\n\nexport const inject: Injectors['inject'] = defaultInjectors.inject\n\nexport const wrapSyncInit: Injectors['wrapSyncInit'] =\n defaultInjectors.wrapSyncInit\n\nexport const provideFactoryContext: Injectors['provideFactoryContext'] =\n defaultInjectors.provideFactoryContext\n","import type { FactoryContext } from './factory-context.mjs'\nimport type { FactoryRecord } from './registry.mjs'\nimport type { Injectors } from './utils/get-injectors.mjs'\n\nimport { InjectableType } from './enums/index.mjs'\n\n/**\n * ServiceInstantiator handles the instantiation of services based on registry records.\n * It replaces the hard-coded logic in Injectable and Factory decorators.\n */\nexport class ServiceInstantiator {\n constructor(private readonly injectors: Injectors) {}\n\n /**\n * Instantiates a service based on its registry record.\n * @param ctx The factory context for dependency injection\n * @param record The factory record from the registry\n * @param args Optional arguments for the service\n * @returns Promise resolving to [undefined, instance] or [error]\n */\n async instantiateService<T>(\n ctx: FactoryContext,\n record: FactoryRecord<T, any>,\n args: any = undefined,\n ): Promise<[undefined, T] | [Error]> {\n try {\n switch (record.type) {\n case InjectableType.Class:\n return this.instantiateClass(ctx, record, args)\n case InjectableType.Factory:\n return this.instantiateFactory(ctx, record, args)\n default:\n throw new Error(\n `[ServiceInstantiator] Unknown service type: ${record.type}`,\n )\n }\n } catch (error) {\n return [error instanceof Error ? error : new Error(String(error))]\n }\n }\n\n /**\n * Instantiates a class-based service (Injectable decorator).\n * @param ctx The factory context for dependency injection\n * @param record The factory record from the registry\n * @param args Optional arguments for the service constructor\n * @returns Promise resolving to [undefined, instance] or [error]\n */\n private async instantiateClass<T>(\n ctx: FactoryContext,\n record: FactoryRecord<T, any>,\n args: any,\n ): Promise<[undefined, T] | [Error]> {\n try {\n const tryLoad = this.injectors.wrapSyncInit(() => {\n const original = this.injectors.provideFactoryContext(ctx)\n let result = new record.target(...(args ? [args] : []))\n this.injectors.provideFactoryContext(original)\n return result\n })\n\n let [instance, promises, injectState] = tryLoad()\n if (promises.length > 0) {\n const results = await Promise.allSettled(promises)\n if (results.some((result) => result.status === 'rejected')) {\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n const newRes = tryLoad(injectState)\n instance = newRes[0]\n promises = newRes[1]\n }\n\n if (promises.length > 0) {\n console.error(`[ServiceInstantiator] ${record.target.name} has problem with it's definition.\n\n One or more of the dependencies are registered as a InjectableScope.Instance and are used with inject.\n\n Please use inject asyncInject of inject to load those dependencies.`)\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n\n // Handle lifecycle hooks\n if ('onServiceInit' in instance) {\n await (instance as any).onServiceInit()\n }\n if ('onServiceDestroy' in instance) {\n ctx.addDestroyListener(async () => {\n await (instance as any).onServiceDestroy()\n })\n }\n\n return [undefined, instance]\n } catch (error) {\n return [error instanceof Error ? error : new Error(String(error))]\n }\n }\n\n /**\n * Instantiates a factory-based service (Factory decorator).\n * @param ctx The factory context for dependency injection\n * @param record The factory record from the registry\n * @param args Optional arguments for the factory\n * @returns Promise resolving to [undefined, instance] or [error]\n */\n private async instantiateFactory<T>(\n ctx: FactoryContext,\n record: FactoryRecord<T, any>,\n args: any,\n ): Promise<[undefined, T] | [Error]> {\n try {\n const tryLoad = this.injectors.wrapSyncInit(() => {\n const original = this.injectors.provideFactoryContext(ctx)\n let result = new record.target()\n this.injectors.provideFactoryContext(original)\n return result\n })\n\n let [builder, promises, injectState] = tryLoad()\n if (promises.length > 0) {\n const results = await Promise.allSettled(promises)\n if (results.some((result) => result.status === 'rejected')) {\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n const newRes = tryLoad(injectState)\n builder = newRes[0]\n promises = newRes[1]\n }\n\n if (promises.length > 0) {\n console.error(`[ServiceInstantiator] ${record.target.name} has problem with it's definition.\n\n One or more of the dependencies are registered as a InjectableScope.Instance and are used with inject.\n\n Please use asyncInject instead of inject to load those dependencies.`)\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n\n if (typeof builder.create !== 'function') {\n throw new Error(\n `[ServiceInstantiator] Factory ${record.target.name} does not implement the create method.`,\n )\n }\n\n const instance = await builder.create(ctx, args)\n return [undefined, instance]\n } catch (error) {\n return [error instanceof Error ? error : new Error(String(error))]\n }\n }\n}\n","import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\n/**\n * Request context holder that manages pre-prepared instances for a specific request.\n * This allows for efficient instantiation of request-scoped services.\n */\nexport interface RequestContextHolder {\n /**\n * Unique identifier for this request context.\n */\n readonly requestId: string\n\n /**\n * Pre-prepared instances for this request, keyed by instance name.\n */\n readonly instances: Map<string, any>\n\n /**\n * Instance holders for request-scoped services.\n */\n readonly holders: Map<string, ServiceLocatorInstanceHolder>\n\n /**\n * Priority for resolution in FactoryContext.inject method.\n * Higher values take precedence.\n */\n readonly priority: number\n\n /**\n * Request-specific metadata that can be used during instantiation.\n */\n readonly metadata: Map<string, any>\n\n /**\n * Timestamp when this context was created.\n */\n readonly createdAt: number\n\n /**\n * Adds a pre-prepared instance to this context.\n */\n addInstance(\n instanceName: string,\n instance: any,\n holder: ServiceLocatorInstanceHolder,\n ): void\n\n /**\n * Gets a pre-prepared instance from this context.\n */\n getInstance(instanceName: string): any | undefined\n\n /**\n * Gets an instance holder from this context.\n */\n getHolder(instanceName: string): ServiceLocatorInstanceHolder | undefined\n\n /**\n * Checks if this context has a pre-prepared instance.\n */\n hasInstance(instanceName: string): boolean\n\n /**\n * Clears all instances and holders from this context.\n */\n clear(): void\n\n /**\n * Gets metadata value by key.\n */\n getMetadata(key: string): any | undefined\n\n /**\n * Sets metadata value by key.\n */\n setMetadata(key: string, value: any): void\n}\n\n/**\n * Default implementation of RequestContextHolder.\n */\nexport class DefaultRequestContextHolder implements RequestContextHolder {\n public readonly instances = new Map<string, any>()\n public readonly holders = new Map<string, ServiceLocatorInstanceHolder>()\n public readonly metadata = new Map<string, any>()\n public readonly createdAt = Date.now()\n\n constructor(\n public readonly requestId: string,\n public readonly priority: number = 100,\n initialMetadata?: Record<string, any>,\n ) {\n if (initialMetadata) {\n Object.entries(initialMetadata).forEach(([key, value]) => {\n this.metadata.set(key, value)\n })\n }\n }\n\n addInstance(\n instanceName: string,\n instance: any,\n holder: ServiceLocatorInstanceHolder,\n ): void {\n this.instances.set(instanceName, instance)\n this.holders.set(instanceName, holder)\n }\n\n getInstance(instanceName: string): any | undefined {\n return this.instances.get(instanceName)\n }\n\n getHolder(instanceName: string): ServiceLocatorInstanceHolder | undefined {\n return this.holders.get(instanceName)\n }\n\n hasInstance(instanceName: string): boolean {\n return this.instances.has(instanceName)\n }\n\n clear(): void {\n this.instances.clear()\n this.holders.clear()\n this.metadata.clear()\n }\n\n getMetadata(key: string): any | undefined {\n return this.metadata.get(key)\n }\n\n setMetadata(key: string, value: any): void {\n this.metadata.set(key, value)\n }\n}\n\n/**\n * Creates a new request context holder with the given parameters.\n */\nexport function createRequestContextHolder(\n requestId: string,\n priority: number = 100,\n initialMetadata?: Record<string, any>,\n): RequestContextHolder {\n return new DefaultRequestContextHolder(requestId, priority, initialMetadata)\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\ntype ListenersMap = Map<string, Map<string, Set<Function>>>\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport class ServiceLocatorEventBus {\n private listeners: ListenersMap = new Map()\n constructor(private readonly logger: Console | null = null) {}\n\n on<Event extends string | `pre:${string}` | `post:${string}`>(\n ns: string,\n event: Event,\n listener: (event: Event) => void,\n ) {\n this.logger?.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`)\n if (!this.listeners.has(ns)) {\n this.listeners.set(ns, new Map())\n }\n\n const nsEvents = this.listeners.get(ns)!\n if (!nsEvents.has(event)) {\n nsEvents.set(event, new Set())\n }\n\n nsEvents.get(event)!.add(listener)\n\n return () => {\n nsEvents.get(event)!.delete(listener)\n if (nsEvents.get(event)?.size === 0) {\n nsEvents.delete(event)\n }\n if (nsEvents.size === 0) {\n this.listeners.delete(ns)\n }\n }\n }\n\n async emit(key: string, event: string) {\n if (!this.listeners.has(key)) {\n return\n }\n\n const events = this.listeners.get(key)!\n\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`)\n\n const res = await Promise.allSettled(\n [...(events.get(event) ?? [])!].map((listener) => listener(event)),\n ).then((results) => {\n const res = results\n .filter((result) => result.status === 'rejected')\n .map((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,\n result.reason,\n )\n return result\n })\n\n if (res.length > 0) {\n return Promise.reject(res)\n }\n return results\n })\n return res\n }\n}\n","import type { InjectableScope, InjectableType } from './enums/index.mjs'\n\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nexport enum ServiceLocatorInstanceHolderStatus {\n Created = 'created',\n Creating = 'creating',\n Destroying = 'destroying',\n Error = 'error',\n}\n\nexport type ServiceLocatorInstanceEffect = () => void\nexport type ServiceLocatorInstanceDestroyListener = () => void | Promise<void>\n\nexport interface ServiceLocatorInstanceHolderCreating<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Creating\n name: string\n instance: null\n creationPromise: Promise<[undefined, Instance]> | null\n destroyPromise: null\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderCreated<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Created\n name: string\n instance: Instance\n creationPromise: null\n destroyPromise: null\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderDestroying<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Destroying\n name: string\n instance: Instance | null\n creationPromise: null\n destroyPromise: Promise<void>\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderError {\n status: ServiceLocatorInstanceHolderStatus.Error\n name: string\n instance: Error\n creationPromise: null\n destroyPromise: null\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport type ServiceLocatorInstanceHolder<Instance = unknown> =\n | ServiceLocatorInstanceHolderCreating<Instance>\n | ServiceLocatorInstanceHolderCreated<Instance>\n | ServiceLocatorInstanceHolderDestroying<Instance>\n | ServiceLocatorInstanceHolderError\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport {\n ErrorsEnum,\n InstanceDestroying,\n InstanceExpired,\n InstanceNotFound,\n} from './errors/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\nimport { createDeferred } from './utils/defer.mjs'\n\nexport class ServiceLocatorManager {\n private readonly instancesHolders: Map<string, ServiceLocatorInstanceHolder> =\n new Map()\n\n constructor(private readonly logger: Console | null = null) {}\n\n get(\n name: string,\n ):\n | [InstanceExpired | InstanceDestroying, ServiceLocatorInstanceHolder]\n | [InstanceNotFound]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this.instancesHolders.get(name)\n if (holder) {\n if (holder.ttl !== Infinity) {\n const now = Date.now()\n if (now - holder.createdAt > holder.ttl) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`,\n )\n return [new InstanceExpired(holder.name), holder]\n }\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`,\n )\n return [new InstanceDestroying(holder.name), holder]\n } else if (holder.status === ServiceLocatorInstanceHolderStatus.Error) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is in error state`,\n )\n return [holder.instance as InstanceNotFound, holder]\n }\n\n return [undefined, holder]\n } else {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${name} not found`,\n )\n return [new InstanceNotFound(name)]\n }\n }\n\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this.instancesHolders.set(name, holder)\n }\n\n has(\n name: string,\n ): [InstanceExpired | InstanceDestroying] | [undefined, boolean] {\n const [error, holder] = this.get(name)\n if (!error) {\n return [undefined, true]\n }\n if (\n [ErrorsEnum.InstanceExpired, ErrorsEnum.InstanceDestroying].includes(\n error.code,\n )\n ) {\n return [error]\n }\n return [undefined, !!holder]\n }\n\n delete(name: string): boolean {\n return this.instancesHolders.delete(name)\n }\n\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this.instancesHolders].filter(([key, value]) =>\n predicate(value, key),\n ),\n )\n }\n\n /**\n * Creates a new holder with Creating status and a deferred creation promise.\n * This is useful for creating placeholder holders that can be fulfilled later.\n * @param name The name of the instance\n * @param type The injectable type\n * @param scope The injectable scope\n * @param deps Optional set of dependencies\n * @param ttl Optional time-to-live in milliseconds (defaults to Infinity)\n * @returns A tuple containing the deferred promise and the holder\n */\n createCreatingHolder<Instance>(\n name: string,\n type: InjectableType,\n scope: InjectableScope,\n deps: Set<string> = new Set(),\n ttl: number = Infinity,\n ): [\n ReturnType<typeof createDeferred<[undefined, Instance]>>,\n ServiceLocatorInstanceHolder<Instance>,\n ] {\n const deferred = createDeferred<[undefined, Instance]>()\n\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n status: ServiceLocatorInstanceHolderStatus.Creating,\n name,\n instance: null,\n creationPromise: deferred.promise,\n destroyPromise: null,\n type,\n scope,\n deps,\n destroyListeners: [],\n createdAt: Date.now(),\n ttl,\n }\n\n return [deferred, holder]\n }\n\n /**\n * Creates a new holder with Created status and an actual instance.\n * This is useful for creating holders that already have their instance ready.\n * @param name The name of the instance\n * @param instance The actual instance to store\n * @param type The injectable type\n * @param scope The injectable scope\n * @param deps Optional set of dependencies\n * @param ttl Optional time-to-live in milliseconds (defaults to Infinity)\n * @returns The created holder\n */\n storeCreatedHolder<Instance>(\n name: string,\n instance: Instance,\n type: InjectableType,\n scope: InjectableScope,\n deps: Set<string> = new Set(),\n ttl: number = Infinity,\n ): ServiceLocatorInstanceHolder<Instance> {\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n status: ServiceLocatorInstanceHolderStatus.Created,\n name,\n instance,\n creationPromise: null,\n destroyPromise: null,\n type,\n scope,\n deps,\n destroyListeners: [],\n createdAt: Date.now(),\n ttl,\n }\n\n this.instancesHolders.set(name, holder)\n\n return holder\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { z, ZodObject, ZodOptional } from 'zod/v4'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n AnyInjectableType,\n BaseInjectionTokenSchemaType,\n InjectionTokenSchemaType,\n InjectionTokenType,\n OptionalInjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { RequestContextHolder } from './request-context-holder.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\nimport type { Injectors } from './utils/index.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\nimport {\n ErrorsEnum,\n FactoryNotFound,\n FactoryTokenNotResolved,\n UnknownError,\n} from './errors/index.mjs'\nimport {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport { defaultInjectors } from './injector.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { DefaultRequestContextHolder } from './request-context-holder.mjs'\nimport { ServiceInstantiator } from './service-instantiator.mjs'\nimport { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\nimport { ServiceLocatorManager } from './service-locator-manager.mjs'\nimport { getInjectableToken } from './utils/index.mjs'\n\nexport class ServiceLocator {\n private readonly eventBus: ServiceLocatorEventBus\n private readonly manager: ServiceLocatorManager\n private readonly serviceInstantiator: ServiceInstantiator\n private readonly requestContexts = new Map<string, RequestContextHolder>()\n private currentRequestContext: RequestContextHolder | null = null\n\n constructor(\n private readonly registry: Registry = globalRegistry,\n private readonly logger: Console | null = null,\n private readonly injectors: Injectors = defaultInjectors,\n ) {\n this.eventBus = new ServiceLocatorEventBus(logger)\n this.manager = new ServiceLocatorManager(logger)\n this.serviceInstantiator = new ServiceInstantiator(injectors)\n }\n\n // ============================================================================\n // PUBLIC METHODS\n // ============================================================================\n\n getEventBus() {\n return this.eventBus\n }\n\n getManager() {\n return this.manager\n }\n\n public getInstanceIdentifier(token: AnyInjectableType, args?: any): string {\n const [err, { actualToken, validatedArgs }] =\n this.validateAndResolveTokenArgs(token, args)\n if (err) {\n throw err\n }\n return this.generateInstanceName(actualToken, validatedArgs)\n }\n\n public async getInstance(\n token: AnyInjectableType,\n args?: any,\n onPrepare?: (data: {\n instanceName: string\n actualToken: InjectionTokenType\n validatedArgs?: any\n }) => void,\n ) {\n const [err, data] = await this.resolveTokenAndPrepareInstanceName(\n token,\n args,\n )\n if (err) {\n return [err]\n }\n const { instanceName, validatedArgs, actualToken, realToken } = data\n if (onPrepare) {\n onPrepare({ instanceName, actualToken, validatedArgs })\n }\n const [error, holder] = await this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n validatedArgs,\n )\n if (error) {\n return [error]\n }\n return [undefined, holder.instance]\n }\n\n public async getOrThrowInstance<Instance>(\n token: AnyInjectableType,\n args: any,\n ): Promise<Instance> {\n const [error, instance] = await this.getInstance(token, args)\n if (error) {\n throw error\n }\n return instance\n }\n\n public getSyncInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n token: AnyInjectableType,\n args: Schema extends ZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<ZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Instance | null {\n const [err, { actualToken, validatedArgs }] =\n this.validateAndResolveTokenArgs(token, args)\n if (err) {\n return null\n }\n const instanceName = this.generateInstanceName(actualToken, validatedArgs)\n if (this.currentRequestContext) {\n const requestHolder = this.currentRequestContext.getHolder(instanceName)\n if (requestHolder) {\n return requestHolder.instance as Instance\n }\n }\n const [error, holder] = this.manager.get(instanceName)\n if (error) {\n return null\n }\n return holder.instance as Instance\n }\n\n invalidate(service: string, round = 1): Promise<any> {\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`,\n )\n const toInvalidate = this.manager.filter(\n (holder) => holder.name === service || holder.deps.has(service),\n )\n const promises = []\n for (const [key, holder] of toInvalidate.entries()) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is already being destroyed`,\n )\n promises.push(holder.destroyPromise)\n continue\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`,\n )\n promises.push(\n holder.creationPromise?.then(() => {\n if (round > 3) {\n this.logger?.error(\n `[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`,\n )\n return\n }\n return this.invalidate(key, round + 1)\n }),\n )\n continue\n }\n // @ts-expect-error TS2322 we are changing the status\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`,\n )\n // @ts-expect-error TS2322 we are changing the status\n holder.destroyPromise = Promise.all(\n holder.destroyListeners.map((listener) => listener()),\n ).then(async () => {\n this.manager.delete(key)\n await this.emitInstanceEvent(key, 'destroy')\n })\n promises.push(holder.destroyPromise)\n }\n return Promise.all(promises)\n }\n\n async ready() {\n return Promise.all(\n Array.from(this.manager.filter(() => true)).map(([, holder]) => {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise?.then(() => null)\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n return holder.destroyPromise.then(() => null)\n }\n return Promise.resolve(null)\n }),\n ).then(() => null)\n }\n\n // ============================================================================\n // REQUEST CONTEXT MANAGEMENT\n // ============================================================================\n\n /**\n * Begins a new request context with the given parameters.\n * @param requestId Unique identifier for this request\n * @param metadata Optional metadata for the request\n * @param priority Priority for resolution (higher = more priority)\n * @returns The created request context holder\n */\n beginRequest(\n requestId: string,\n metadata?: Record<string, any>,\n priority: number = 100,\n ): RequestContextHolder {\n if (this.requestContexts.has(requestId)) {\n throw new Error(\n `[ServiceLocator] Request context ${requestId} already exists`,\n )\n }\n\n const contextHolder = new DefaultRequestContextHolder(\n requestId,\n priority,\n metadata,\n )\n this.requestContexts.set(requestId, contextHolder)\n this.currentRequestContext = contextHolder\n\n this.logger?.log(`[ServiceLocator] Started request context: ${requestId}`)\n return contextHolder\n }\n\n /**\n * Ends a request context and cleans up all associated instances.\n * @param requestId The request ID to end\n */\n async endRequest(requestId: string): Promise<void> {\n const contextHolder = this.requestContexts.get(requestId)\n if (!contextHolder) {\n this.logger?.warn(\n `[ServiceLocator] Request context ${requestId} not found`,\n )\n return\n }\n\n this.logger?.log(`[ServiceLocator] Ending request context: ${requestId}`)\n\n // Clean up all request-scoped instances\n const cleanupPromises: Promise<any>[] = []\n for (const [, holder] of contextHolder.holders) {\n if (holder.destroyListeners.length > 0) {\n cleanupPromises.push(\n Promise.all(holder.destroyListeners.map((listener) => listener())),\n )\n }\n }\n\n await Promise.all(cleanupPromises)\n\n // Clear the context\n contextHolder.clear()\n this.requestContexts.delete(requestId)\n\n // Reset current context if it was the one being ended\n if (this.currentRequestContext === contextHolder) {\n this.currentRequestContext =\n Array.from(this.requestContexts.values()).at(-1) ?? null\n }\n\n this.logger?.log(`[ServiceLocator] Request context ${requestId} ended`)\n }\n\n /**\n * Gets the current request context.\n * @returns The current request context holder or null\n */\n getCurrentRequestContext(): RequestContextHolder | null {\n return this.currentRequestContext\n }\n\n /**\n * Sets the current request context.\n * @param requestId The request ID to set as current\n */\n setCurrentRequestContext(requestId: string): void {\n const contextHolder = this.requestContexts.get(requestId)\n if (!contextHolder) {\n throw new Error(`[ServiceLocator] Request context ${requestId} not found`)\n }\n this.currentRequestContext = contextHolder\n }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n /**\n * Validates and resolves token arguments, handling factory token resolution and validation.\n */\n private validateAndResolveTokenArgs(\n token: AnyInjectableType,\n args?: any,\n ): [\n FactoryTokenNotResolved | UnknownError | undefined,\n { actualToken: InjectionTokenType; validatedArgs?: any },\n ] {\n let actualToken = token as InjectionToken<any, any>\n if (typeof token === 'function') {\n actualToken = getInjectableToken(token)\n }\n let realArgs = args\n if (actualToken instanceof BoundInjectionToken) {\n realArgs = actualToken.value\n } else if (actualToken instanceof FactoryInjectionToken) {\n if (actualToken.resolved) {\n realArgs = actualToken.value\n } else {\n return [new FactoryTokenNotResolved(token.name), { actualToken }]\n }\n }\n if (!actualToken.schema) {\n return [undefined, { actualToken, validatedArgs: realArgs }]\n }\n const validatedArgs = actualToken.schema?.safeParse(realArgs)\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#validateAndResolveTokenArgs(): Error validating args for ${actualToken.name.toString()}`,\n validatedArgs.error,\n )\n return [new UnknownError(validatedArgs.error), { actualToken }]\n }\n return [undefined, { actualToken, validatedArgs: validatedArgs?.data }]\n }\n\n /**\n * Internal method to resolve token args and create instance name.\n * Handles factory token resolution and validation.\n */\n private async resolveTokenAndPrepareInstanceName(\n token: AnyInjectableType,\n args?: any,\n ): Promise<\n | [\n undefined,\n {\n instanceName: string\n validatedArgs: any\n actualToken: InjectionTokenType\n realToken: InjectionToken<any, any>\n },\n ]\n | [UnknownError | FactoryTokenNotResolved]\n > {\n const [err, { actualToken, validatedArgs }] =\n this.validateAndResolveTokenArgs(token, args)\n if (err instanceof UnknownError) {\n return [err]\n } else if (\n (err as any) instanceof FactoryTokenNotResolved &&\n actualToken instanceof FactoryInjectionToken\n ) {\n this.logger?.log(\n `[ServiceLocator]#resolveTokenAndPrepareInstanceName() Factory token not resolved, resolving it`,\n )\n await actualToken.resolve(this.createFactoryContext())\n return this.resolveTokenAndPrepareInstanceName(token)\n }\n const instanceName = this.generateInstanceName(actualToken, validatedArgs)\n // Determine the real token (the actual InjectionToken that will be used for resolution)\n const realToken =\n actualToken instanceof BoundInjectionToken ||\n actualToken instanceof FactoryInjectionToken\n ? actualToken.token\n : actualToken\n return [undefined, { instanceName, validatedArgs, actualToken, realToken }]\n }\n\n /**\n * Gets an instance by its instance name, handling all the logic after instance name creation.\n */\n private async retrieveOrCreateInstanceByInstanceName(\n instanceName: string,\n realToken: InjectionToken<any, any>,\n realArgs: any,\n ): Promise<\n | [undefined, ServiceLocatorInstanceHolder<any>]\n | [UnknownError | FactoryNotFound]\n > {\n // Check if this is a request-scoped service and we have a current request context\n if (this.registry.has(realToken)) {\n const record = this.registry.get(realToken)\n if (record.scope === InjectableScope.Request) {\n if (!this.currentRequestContext) {\n this.logger?.log(\n `[ServiceLocator]#retrieveOrCreateInstanceByInstanceName() No current request context available for request-scoped service ${instanceName}`,\n )\n return [new UnknownError(ErrorsEnum.InstanceNotFound)]\n }\n const requestHolder = this.currentRequestContext.getHolder(instanceName)\n if (requestHolder) {\n if (\n requestHolder.status === ServiceLocatorInstanceHolderStatus.Creating\n ) {\n await requestHolder.creationPromise\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n } else if (\n requestHolder.status ===\n ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n return [undefined, requestHolder]\n }\n }\n }\n\n const [error, holder] = this.manager.get(instanceName)\n if (!error) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n await holder.creationPromise\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n // Should never happen\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n return [undefined, holder]\n }\n switch (error.code) {\n case ErrorsEnum.InstanceDestroying:\n this.logger?.log(\n `[ServiceLocator]#retrieveOrCreateInstanceByInstanceName() TTL expired for ${holder?.name}`,\n )\n await holder?.destroyPromise\n //Maybe we already have a new instance\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n\n case ErrorsEnum.InstanceExpired:\n this.logger?.log(\n `[ServiceLocator]#retrieveOrCreateInstanceByInstanceName() TTL expired for ${holder?.name}`,\n )\n await this.invalidate(instanceName)\n //Maybe we already have a new instance\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n case ErrorsEnum.InstanceNotFound:\n break\n default:\n return [error]\n }\n const result = await this.createNewInstance(\n instanceName,\n realToken,\n realArgs,\n )\n if (result[0]) {\n return [result[0]]\n }\n if (result[1].status === ServiceLocatorInstanceHolderStatus.Creating) {\n await result[1].creationPromise\n }\n if (result[1].status === ServiceLocatorInstanceHolderStatus.Error) {\n return [result[1].instance] as [UnknownError | FactoryNotFound]\n }\n return [undefined, result[1]]\n }\n\n /**\n * Emits events to listeners for instance lifecycle events.\n */\n private emitInstanceEvent(\n name: string,\n event: 'create' | 'destroy' = 'create',\n ) {\n this.logger?.log(\n `[ServiceLocator]#emitInstanceEvent() Notifying listeners for ${name} with event ${event}`,\n )\n return this.eventBus.emit(name, event)\n }\n\n /**\n * Creates a new instance for the given token and arguments.\n */\n private async createNewInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n instanceName: string,\n realToken: InjectionToken<Instance, Schema>,\n args: Schema extends ZodObject\n ? z.output<Schema>\n : Schema extends ZodOptional<ZodObject>\n ? z.output<Schema> | undefined\n : undefined,\n ): Promise<\n | [undefined, ServiceLocatorInstanceHolder<Instance>]\n | [FactoryNotFound | UnknownError]\n > {\n this.logger?.log(\n `[ServiceLocator]#createNewInstance() Creating instance for ${instanceName}`,\n )\n if (this.registry.has(realToken)) {\n return this.instantiateServiceFromRegistry<Instance, Schema, any>(\n instanceName,\n realToken,\n args,\n )\n } else {\n return [new FactoryNotFound(realToken.name.toString())]\n }\n }\n\n /**\n * Instantiates a service from the registry using the service instantiator.\n */\n private instantiateServiceFromRegistry<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n Args extends Schema extends BaseInjectionTokenSchemaType\n ? z.output<Schema>\n : Schema extends OptionalInjectionTokenSchemaType\n ? z.output<Schema> | undefined\n : undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Args,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<Instance>]> {\n this.logger?.log(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Creating instance for ${instanceName} from abstract factory`,\n )\n const ctx = this.createFactoryContext(\n this.currentRequestContext || undefined,\n )\n let record = this.registry.get<Instance, Schema>(token)\n let { scope, type } = record\n\n // Use createCreatingHolder from manager\n const [deferred, holder] = this.manager.createCreatingHolder<Instance>(\n instanceName,\n type,\n scope,\n ctx.deps,\n Infinity,\n )\n\n // Start the instantiation process\n this.serviceInstantiator\n .instantiateService(ctx, record, args)\n .then(async ([error, instance]) => {\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.creationPromise = null\n if (error) {\n this.logger?.error(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Error creating instance for ${instanceName}`,\n error,\n )\n holder.status = ServiceLocatorInstanceHolderStatus.Error\n holder.instance = error\n if (scope === InjectableScope.Singleton) {\n setTimeout(() => this.invalidate(instanceName), 10)\n }\n deferred.reject(error)\n } else {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n if (ctx.deps.size > 0) {\n ctx.deps.forEach((dependency) => {\n holder.destroyListeners.push(\n this.eventBus.on(dependency, 'destroy', () =>\n this.invalidate(instanceName),\n ),\n )\n })\n }\n await this.emitInstanceEvent(instanceName)\n deferred.resolve([undefined, instance])\n }\n })\n .catch((error) => {\n this.logger?.error(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Unexpected error creating instance for ${instanceName}`,\n error,\n )\n holder.status = ServiceLocatorInstanceHolderStatus.Error\n holder.instance = error\n holder.creationPromise = null\n if (scope === InjectableScope.Singleton) {\n setTimeout(() => this.invalidate(instanceName), 10)\n }\n deferred.reject(error)\n })\n\n if (scope === InjectableScope.Singleton) {\n this.logger?.debug(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Setting instance for ${instanceName}`,\n )\n this.manager.set(instanceName, holder)\n } else if (\n scope === InjectableScope.Request &&\n this.currentRequestContext\n ) {\n this.logger?.debug(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Setting request-scoped instance for ${instanceName}`,\n )\n // For request-scoped services, we don't store them in the global manager\n // They will be managed by the request context holder\n this.currentRequestContext.addInstance(\n instanceName,\n holder.instance,\n holder,\n )\n }\n // @ts-expect-error TS2322 This is correct type\n return [undefined, holder]\n }\n\n /**\n * Creates a factory context for dependency injection during service instantiation.\n * @param contextHolder Optional request context holder for priority-based resolution\n */\n private createFactoryContext(\n contextHolder?: RequestContextHolder,\n ): FactoryContext & {\n getDestroyListeners: () => (() => void)[]\n deps: Set<string>\n } {\n const destroyListeners = new Set<() => void>()\n const deps = new Set<string>()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n\n function addDestroyListener(listener: () => void) {\n destroyListeners.add(listener)\n }\n\n function getDestroyListeners() {\n return Array.from(destroyListeners)\n }\n\n return {\n // @ts-expect-error This is correct type\n async inject(token, args) {\n // 1. Check RequestContextHolder first (if provided and has higher priority)\n if (contextHolder && contextHolder.priority > 0) {\n const instanceName = self.generateInstanceName(token, args)\n const prePreparedInstance = contextHolder.getInstance(instanceName)\n if (prePreparedInstance !== undefined) {\n self.logger?.debug(\n `[ServiceLocator] Using pre-prepared instance ${instanceName} from request context ${contextHolder.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n // 2. Check current request context (if different from provided contextHolder)\n if (\n self.currentRequestContext &&\n self.currentRequestContext !== contextHolder\n ) {\n const instanceName = self.generateInstanceName(token, args)\n const prePreparedInstance =\n self.currentRequestContext.getInstance(instanceName)\n if (prePreparedInstance !== undefined) {\n self.logger?.debug(\n `[ServiceLocator] Using pre-prepared instance ${instanceName} from current request context ${self.currentRequestContext.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n // 3. Fall back to normal resolution\n const [error, instance] = await self.getInstance(\n token,\n args,\n ({ instanceName }) => {\n deps.add(instanceName)\n },\n )\n if (error) {\n throw error\n }\n return instance\n },\n addDestroyListener,\n getDestroyListeners,\n locator: self,\n deps,\n }\n }\n\n /**\n * Generates a unique instance name based on token and arguments.\n */\n private generateInstanceName(token: InjectionTokenType, args: any) {\n const formattedArgs = args\n ? ':' +\n Object.entries(args ?? {})\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => {\n if (typeof value === 'function') {\n return `${key}=fn_${value.name}(${value.length})`\n }\n if (typeof value === 'symbol') {\n return `${key}=${value.toString()}`\n }\n return `${key}=${JSON.stringify(value).slice(0, 40)}`\n })\n .join(',')\n .replaceAll(/\"/g, '')\n .replaceAll(/:/g, '=')\n : ''\n return `${token.toString()}${formattedArgs}`\n }\n}\n","import type { z, ZodType } from 'zod/v4'\n\nimport type {\n BoundInjectionToken,\n ClassType,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Factorable } from './interfaces/factory.interface.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { RequestContextHolder } from './request-context-holder.mjs'\nimport type { Injectors } from './utils/index.mjs'\nimport type { Join, UnionToArray } from './utils/types.mjs'\n\nimport { Injectable } from './decorators/injectable.decorator.mjs'\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { defaultInjectors } from './injector.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { ServiceLocator } from './service-locator.mjs'\nimport { getInjectableToken } from './utils/get-injectable-token.mjs'\n\n/**\n * Container class that provides a simplified public API for dependency injection.\n * It wraps a ServiceLocator instance and provides convenient methods for getting instances.\n */\n@Injectable()\nexport class Container {\n private readonly serviceLocator: ServiceLocator\n\n constructor(\n registry: Registry = globalRegistry,\n logger: Console | null = null,\n injectors: Injectors = defaultInjectors,\n ) {\n this.serviceLocator = new ServiceLocator(registry, logger, injectors)\n this.registerSelf()\n }\n\n private registerSelf() {\n const token = getInjectableToken(Container)\n const instanceName = this.serviceLocator.getInstanceIdentifier(token)\n this.serviceLocator\n .getManager()\n .storeCreatedHolder(\n instanceName,\n this,\n InjectableType.Class,\n InjectableScope.Singleton,\n )\n }\n\n /**\n * Gets an instance from the container.\n * This method has the same type signature as the inject method from get-injectors.mts\n */\n // #1 Simple class\n get<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n // #2 Token with required Schema\n get<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n get<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? Promise<T>\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n // #4 Token with no Schema\n get<T>(token: InjectionToken<T, undefined>): Promise<T>\n get<T>(token: BoundInjectionToken<T, any>): Promise<T>\n get<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n async get(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n return this.serviceLocator.getOrThrowInstance(token, args as any)\n }\n\n /**\n * Gets the underlying ServiceLocator instance for advanced usage\n */\n getServiceLocator(): ServiceLocator {\n return this.serviceLocator\n }\n\n /**\n * Invalidates a service and its dependencies\n */\n async invalidate(service: unknown): Promise<void> {\n const holderMap = this.serviceLocator\n .getManager()\n .filter((holder) => holder.instance === service)\n if (holderMap.size === 0) {\n return\n }\n const holder = holderMap.values().next().value\n if (holder) {\n await this.serviceLocator.invalidate(holder.name)\n }\n }\n\n /**\n * Waits for all pending operations to complete\n */\n async ready(): Promise<void> {\n await this.serviceLocator.ready()\n }\n\n // ============================================================================\n // REQUEST CONTEXT MANAGEMENT\n // ============================================================================\n\n /**\n * Begins a new request context with the given parameters.\n * @param requestId Unique identifier for this request\n * @param metadata Optional metadata for the request\n * @param priority Priority for resolution (higher = more priority)\n * @returns The created request context holder\n */\n beginRequest(\n requestId: string,\n metadata?: Record<string, any>,\n priority: number = 100,\n ): RequestContextHolder {\n return this.serviceLocator.beginRequest(requestId, metadata, priority)\n }\n\n /**\n * Ends a request context and cleans up all associated instances.\n * @param requestId The request ID to end\n */\n async endRequest(requestId: string): Promise<void> {\n await this.serviceLocator.endRequest(requestId)\n }\n\n /**\n * Gets the current request context.\n * @returns The current request context holder or null\n */\n getCurrentRequestContext(): RequestContextHolder | null {\n return this.serviceLocator.getCurrentRequestContext()\n }\n\n /**\n * Sets the current request context.\n * @param requestId The request ID to set as current\n */\n setCurrentRequestContext(requestId: string): void {\n this.serviceLocator.setCurrentRequestContext(requestId)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/enums/injectable-scope.enum.mts","../src/enums/injectable-type.enum.mts","../src/injection-token.mts","../src/registry.mts","../src/symbols/injectable-token.mts","../src/decorators/factory.decorator.mts","../src/decorators/injectable.decorator.mts","../src/errors/errors.enum.mts","../src/errors/factory-not-found.mts","../src/errors/factory-token-not-resolved.mts","../src/errors/instance-destroying.mts","../src/errors/instance-expired.mts","../src/errors/instance-not-found.mts","../src/errors/unknown-error.mts","../src/utils/get-injectors.mts","../src/utils/get-injectable-token.mts","../src/utils/defer.mts","../src/event-emitter.mts","../src/injector.mts","../src/service-instantiator.mts","../src/service-locator-instance-holder.mts","../src/request-context-holder.mts","../src/service-locator-event-bus.mts","../src/service-locator-manager.mts","../src/service-locator.mts","../src/container.mts"],"names":["InjectableScope","InjectableType","ErrorsEnum","provideFactoryContext","asyncInject","wrapSyncInit","inject","ServiceLocatorInstanceHolderStatus","res","_init","holder"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAK,eAAA,qBAAAA,gBAAAA,KAAL;AAIL,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAIZ,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAIZ,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AAZA,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;;;ACAL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,gBAAA,SAAA,CAAA,GAAU,SAAA;AAFA,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACwBL,IAAM,cAAA,GAAN,MAAM,eAAA,CAcX;AAAA,EAIA,WAAA,CACkB,MACA,MAAA,EAChB;AAFgB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACf;AAAA,EANI,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW;AAAA,EACjC,aAAA,GAA+B,IAAA;AAAA,EAqBvC,OAAO,MAAA,CAAO,IAAA,EAAuB,MAAA,EAAkB;AAErD,IAAA,OAAO,IAAI,eAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,OAAO,KAAA,CACL,KAAA,EACA,KAAA,EAC2B;AAC3B,IAAA,OAAO,IAAI,mBAAA,CAAoB,KAAA,EAAO,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,OAAA,CACL,KAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,OAAO,IAAI,qBAAA,CAAsB,KAAA,EAAO,OAAO,CAAA;AAAA,EACjD;AAAA,EAEA,OAAO,WACL,KAAA,EAC6B;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,OAAO,IAAA,CAAK,aAAA;AAAA,IACd;AACA,IAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,IAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,OAAO,IAAA,KAAS,QAAA,EAAU;AACnC,MAAA,IAAA,CAAK,gBAAgB,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,CAAA,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,MAAiE;AAAA,EAKtE,WAAA,CACkB,OACA,KAAA,EAChB;AAFgB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEhB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAClB,IAAA,IAAA,CAAK,KAAK,KAAA,CAAM,EAAA;AAChB,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AAAA,EACtB;AAAA,EAXO,EAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EAWP,QAAA,GAAW;AACT,IAAA,OAAO,IAAA,CAAK,MAAM,QAAA,EAAS;AAAA,EAC7B;AACF;AAEO,IAAM,wBAAN,MAAmE;AAAA,EAOxE,WAAA,CACkB,OACA,OAAA,EAChB;AAFgB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEhB,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAClB,IAAA,IAAA,CAAK,KAAK,KAAA,CAAM,EAAA;AAChB,IAAA,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA;AAAA,EACtB;AAAA,EAbO,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,EAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EAWP,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAW;AACT,IAAA,OAAO,IAAA,CAAK,MAAM,QAAA,EAAS;AAAA,EAC7B;AACF;;;AC3IO,IAAM,WAAN,MAAe;AAAA,EAGpB,YAA6B,MAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAoB;AAAA,EAFhC,SAAA,uBAAgB,GAAA,EAA2B;AAAA,EAI5D,IAAI,KAAA,EAA0C;AAC5C,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IACE,KAAA,EACiC;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,EAAE,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MAC9B;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAA,CAAM,QAAA,EAAU,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,GAAA,CACE,KAAA,EACA,KAAA,EACA,MAAA,EACA,IAAA,EACA;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,OAAO,aAAA,EAAe,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,EAC5E;AAAA,EAEA,OAAO,KAAA,EAAiC;AACtC,IAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAAA,EAChC;AACF;AAEO,IAAM,cAAA,GAAiB,IAAI,QAAA;;;ACrD3B,IAAM,mBAAA,GAAsB,MAAA,CAAO,GAAA,CAAI,qBAAqB;;;AC8C5D,SAAS,OAAA,CAAQ;AAAA,EACtB,KAAA,GAAA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,GAAoB,EAAC,EAAG;AACtB,EAAA,OAAO,CAKL,QACA,OAAA,KACM;AACN,IAAA,IACG,WAAW,OAAA,CAAQ,IAAA,KAAS,WAC5B,MAAA,YAAkB,QAAA,IAAY,CAAC,OAAA,EAChC;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,GACF,KAAA,IAAS,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAEvC,IAAA,QAAA,CAAS,GAAA,CAAI,eAAA,EAAiB,KAAA,EAAO,MAAA,EAAA,SAAA,eAA8B;AAGnE,IAAA,MAAA,CAAO,mBAAmB,CAAA,GAAI,eAAA;AAE9B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;ACHO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA,GAAA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,GAAuB,EAAC,EAAG;AACzB,EAAA,OAAO,CACL,QACA,OAAA,KACM;AACN,IAAA,IACG,WAAW,OAAA,CAAQ,IAAA,KAAS,WAC5B,MAAA,YAAkB,QAAA,IAAY,CAAC,OAAA,EAChC;AACA,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,eAAA,GACF,KAAA,IAAS,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAEvC,IAAA,QAAA,CAAS,GAAA,CAAI,eAAA,EAAiB,KAAA,EAAO,MAAA,EAAA,OAAA,aAA4B;AAGjE,IAAA,MAAA,CAAO,mBAAmB,CAAA,GAAI,eAAA;AAE9B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;;;ACtGO,IAAK,UAAA,qBAAAC,WAAAA,KAAL;AACL,EAAAA,YAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,YAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,YAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,YAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,YAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,YAAA,yBAAA,CAAA,GAA0B,yBAAA;AANhB,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;;;ACEL,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAEzC,YAAmB,IAAA,EAAc;AAC/B,IAAA,KAAA,CAAM,CAAA,QAAA,EAAW,IAAI,CAAA,UAAA,CAAY,CAAA;AADhB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAEnB;AAAA,EAHA,IAAA,GAAA,iBAAA;AAIF;;;ACHO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,IAAA,GAAA,yBAAA;AAAA,EACA,YAAY,IAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,CAAA;AAAA,EACxD;AACF;;;ACPO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAE5C,YAAmB,IAAA,EAAc;AAC/B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,WAAA,CAAa,CAAA;AADlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAEnB;AAAA,EAHA,IAAA,GAAA,oBAAA;AAIF;;;ACLO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAEzC,YAAmB,IAAA,EAAc;AAC/B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,QAAA,CAAU,CAAA;AADf,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAEnB;AAAA,EAHA,IAAA,GAAA,iBAAA;AAIF;;;ACLO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAE1C,YAAmB,IAAA,EAAc;AAC/B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,UAAA,CAAY,CAAA;AADjB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAEnB;AAAA,EAHA,IAAA,GAAA,kBAAA;AAIF;;;ACLO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,IAAA,GAAA,cAAA;AAAA,EACA,MAAA;AAAA,EAEA,YAAY,OAAA,EAAyB;AACnC,IAAA,IAAI,mBAAmB,KAAA,EAAO;AAC5B,MAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,MAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAAA,EACf;AACF;;;AC0DO,SAAS,YAAA,GAAe;AAC7B,EAAA,IAAI,qBAAA,GAA+C,IAAA;AAEnD,EAAA,SAASC,uBACP,OAAA,EACuB;AACvB,IAAA,MAAM,QAAA,GAAW,qBAAA;AACjB,IAAA,qBAAA,GAAwB,OAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,SAAS,iBAAA,GAAoC;AAC3C,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,qBAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,GAA6D,IAAA;AACjE,EAAA,IAAI,WAAA,GAAkC,IAAA;AAEtC,EAAA,SAASC,YAAAA,CACP,OAKA,IAAA,EACA;AACA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,MAAM,MAAM,WAAA,CAAY,YAAA,EAAA;AACxB,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA;AACxC,MAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,EAAO;AAC3B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,uCAAA,EAA0C,QAAQ,KAAA,CAAM,QAAA,EAAU,CAAA,SAAA,EAAY,KAAA,CAAM,UAAU,CAAA;AAAA,SAChG;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IACjB;AAEA,IAAA,MAAM,OAAA,GAAU,iBAAA,EAAkB,CAAE,MAAA,CAAO,OAAc,IAAW,CAAA;AACpE,IAAA,WAAA,CAAY,SAAS,IAAA,CAAK;AAAA,MACxB,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,WAAA,CAAY,YAAA,EAAA;AAEZ,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,SAASC,cAAa,EAAA,EAAe;AACnC,IAAA,OAAO,CAAC,aAAA,KAAgC;AACtC,MAAA,MAAM,WAA2B,EAAC;AAClC,MAAA,MAAM,wBAAA,GAA2B,gBAAA;AACjC,MAAA,MAAM,mBAAA,GAAsB,WAAA;AAC5B,MAAA,WAAA,GAAc,aAAA,GACV;AAAA,QACE,GAAG,aAAA;AAAA,QACH,YAAA,EAAc;AAAA,OAChB,GACA;AAAA,QACE,YAAA,EAAc,CAAA;AAAA,QACd,QAAA,EAAU,KAAA;AAAA,QACV,UAAU;AAAC,OACb;AACJ,MAAA,gBAAA,GAAmB,CAAC,OAAA,KAAY;AAC9B,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MACvB,CAAA;AACA,MAAA,MAAM,SAAS,EAAA,EAAG;AAClB,MAAA,gBAAA,GAAmB,wBAAA;AACnB,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,GAAG,WAAA;AAAA,QACH,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,WAAA,GAAc,mBAAA;AACd,MAAA,OAAO,CAAC,MAAA,EAAQ,QAAA,EAAU,cAAc,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF;AAEA,EAAA,SAASC,OAAAA,CAOP,OAAc,IAAA,EAAoD;AAElE,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,mBAAmB,CAAA,IAAK,KAAA;AAEhD,IAAA,MAAM,QAAA,GAAW,iBAAA,EAAkB,CAAE,OAAA,CAAQ,eAAA;AAAA,MAC3C,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,OAAA,GAAU,iBAAA,EAAkB,CAAE,MAAA,CAAO,WAAW,IAAI,CAAA;AAC1D,QAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAA,CAAU,QAAA,EAAU,CAAA,CAAE,CAAA;AAAA,MACtE;AACA,MAAA,OAAO,IAAI,KAAA;AAAA,QACT,EAAC;AAAA,QACD;AAAA,UACE,GAAA,GAAM;AACJ,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,CAAA,4BAAA,EAA+B,SAAA,CAAU,QAAA,EAAU,CAAA,uHAAA;AAAA,aACrD;AAAA,UACF;AAAA;AACF,OACF;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,WAAA,EAAAF,YAAAA;AAAA,IACA,MAAA,EAAAE,OAAAA;AAAA,IACA,YAAA,EAAAD,aAAAA;AAAA,IACA,qBAAA,EAAAF;AAAA,GACF;AAEA,EAAA,OAAO,SAAA;AACT;;;ACrMO,SAAS,mBACd,MAAA,EAGoB;AAEpB,EAAA,MAAM,KAAA,GAAQ,OAAO,mBAAmB,CAAA;AACxC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uBAAA,EAA0B,OAAO,IAAI,CAAA,mCAAA;AAAA,KACvC;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;ACdO,IAAM,WAAN,MAAkB;AAAA,EACP,OAAA;AAAA,EACR,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EAEtB,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAW,CAAC,SAAS,MAAA,KAAW;AACjD,MAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,MAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,KAAA,EAAgB;AACtB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,EAAa;AACxC,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAA,EAAoB;AACzB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,EAAa;AACxC,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA;AAAA,EAClC;AACF;AAMO,SAAS,cAAA,GAAiC;AAC/C,EAAA,OAAO,IAAI,QAAA,EAAY;AACzB;;;ACxEA,IAAA,wBAAA,EAAA,KAAA;AA0CA,wBAAA,GAAA,CAAC,UAAA,CAAW,EAAE,KAAA,EAAA,WAAA,kBAAkC,CAAA,CAAA;AACzC,IAAM,eAAN,MAEP;AAAA,EACU,SAAA,uBAAyD,GAAA,EAAI;AAAA,EAErE,EAAA,CACE,OACA,QAAA,EACA;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACrC;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAEvC,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,IAC1B,CAAA;AAAA,EACF;AAAA,EAEA,GAAA,CACE,OACA,QAAA,EACA;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,OAAO,QAAQ,CAAA;AAC1C,IAAA,IAAI,KAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,SAAS,CAAA,EAAG;AACzC,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,IAAA,CACE,OACA,QAAA,EACA;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,IAAI,IAAA,KAAS;AACtC,MAAA,GAAA,EAAI;AAEJ,MAAA,QAAA,CAAS,GAAG,IAAI,CAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,CACJ,KAAA,EAAA,GACG,IAAA,EACW;AACd,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,MACb,MAAM,IAAA,CAAK,IAAA,CAAK,UAAU,GAAA,CAAI,KAAK,CAAE,CAAA,CAAE,GAAA;AAAA,QAAI,CAAC,QAAA,KAC1C,QAAA,CAAS,GAAG,IAAI;AAAA;AAClB,KACF;AAAA,EACF;AACF;AA7DO,KAAA,GAAA,gBAAA,CAAA,CAAA;AAAM,YAAA,GAAN,4CADP,wBAAA,EACa,YAAA,CAAA;AAAN,iBAAA,CAAA,KAAA,EAAA,CAAA,EAAM,YAAA,CAAA;;;ACvCN,IAAM,mBAAmB,YAAA;AAEzB,IAAM,cACX,gBAAA,CAAiB;AAEZ,IAAM,SAA8B,gBAAA,CAAiB;AAErD,IAAM,eACX,gBAAA,CAAiB;AAEZ,IAAM,wBACX,gBAAA,CAAiB;;;ACLZ,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YAA6B,SAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpD,MAAM,kBAAA,CACJ,GAAA,EACA,MAAA,EACA,OAAY,MAAA,EACuB;AACnC,IAAA,IAAI;AACF,MAAA,QAAQ,OAAO,IAAA;AAAM,QACnB,KAAA,OAAA;AACE,UAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,QAChD,KAAA,SAAA;AACE,UAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,QAClD;AACE,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,4CAAA,EAA+C,OAAO,IAAI,CAAA;AAAA,WAC5D;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,CAAC,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,gBAAA,CACZ,GAAA,EACA,MAAA,EACA,IAAA,EACmC;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,MAAM;AAChD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,GAAG,CAAA;AACzD,QAAA,IAAI,MAAA,GAAS,IAAI,MAAA,CAAO,MAAA,CAAO,GAAI,OAAO,CAAC,IAAI,CAAA,GAAI,EAAG,CAAA;AACtD,QAAA,IAAA,CAAK,SAAA,CAAU,sBAAsB,QAAQ,CAAA;AAC7C,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,IAAI,OAAA,EAAQ;AAChD,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA;AACjD,QAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,MAAA,KAAW,UAAU,CAAA,EAAG;AAC1D,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,8BAAA,EAAiC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,wBAAA;AAAA,WACrD;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA;AAClC,QAAA,QAAA,GAAW,OAAO,CAAC,CAAA;AACnB,QAAA,QAAA,GAAW,OAAO,CAAC,CAAA;AAAA,MACrB;AAEA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;;AAAA;;AAAA,0EAAA,CAIU,CAAA;AACnE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,8BAAA,EAAiC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,wBAAA;AAAA,SACrD;AAAA,MACF;AAGA,MAAA,IAAI,mBAAmB,QAAA,EAAU;AAC/B,QAAA,MAAO,SAAiB,aAAA,EAAc;AAAA,MACxC;AACA,MAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,QAAA,GAAA,CAAI,mBAAmB,YAAY;AACjC,UAAA,MAAO,SAAiB,gBAAA,EAAiB;AAAA,QAC3C,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,CAAC,QAAW,QAAQ,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,CAAC,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,kBAAA,CACZ,GAAA,EACA,MAAA,EACA,IAAA,EACmC;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,MAAM;AAChD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,qBAAA,CAAsB,GAAG,CAAA;AACzD,QAAA,IAAI,MAAA,GAAS,IAAI,MAAA,CAAO,MAAA,EAAO;AAC/B,QAAA,IAAA,CAAK,SAAA,CAAU,sBAAsB,QAAQ,CAAA;AAC7C,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,IAAI,CAAC,OAAA,EAAS,QAAA,EAAU,WAAW,IAAI,OAAA,EAAQ;AAC/C,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA;AACjD,QAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,MAAA,KAAW,UAAU,CAAA,EAAG;AAC1D,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,8BAAA,EAAiC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,wBAAA;AAAA,WACrD;AAAA,QACF;AACA,QAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA;AAClC,QAAA,OAAA,GAAU,OAAO,CAAC,CAAA;AAClB,QAAA,QAAA,GAAW,OAAO,CAAC,CAAA;AAAA,MACrB;AAEA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;;AAAA;;AAAA,2EAAA,CAIW,CAAA;AACpE,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,8BAAA,EAAiC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,wBAAA;AAAA,SACrD;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,OAAA,CAAQ,MAAA,KAAW,UAAA,EAAY;AACxC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,8BAAA,EAAiC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,sCAAA;AAAA,SACrD;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,IAAI,CAAA;AAC/C,MAAA,OAAO,CAAC,QAAW,QAAQ,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,CAAC,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IACnE;AAAA,EACF;AACF;;;AC1JO,IAAK,kCAAA,qBAAAI,mCAAAA,KAAL;AACL,EAAAA,oCAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,oCAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,oCAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,oCAAA,OAAA,CAAA,GAAQ,OAAA;AAJE,EAAA,OAAAA,mCAAAA;AAAA,CAAA,EAAA,kCAAA,IAAA,EAAA;;;ACuFL,IAAM,8BAAN,MAAkE;AAAA,EAMvE,WAAA,CACkB,SAAA,EACA,QAAA,GAAmB,GAAA,EACnC,eAAA,EACA;AAHgB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGhB,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACxD,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,MAC9B,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAfgB,SAAA,uBAAgB,GAAA,EAAiB;AAAA,EACjC,OAAA,uBAAc,GAAA,EAA0C;AAAA,EACxD,QAAA,uBAAe,GAAA,EAAiB;AAAA,EAChC,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EAcrC,WAAA,CACE,YAAA,EACA,QAAA,EACA,MAAA,EACM;AACN,IAAA,IAAI,wBAAwB,cAAA,EAAgB;AAC1C,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAA,CAAa,QAAA,IAAY,QAAQ,CAAA;AACpD,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,QAAA,EAAS,EAAG;AAAA,QACxC,QAAA;AAAA,QACA,MAAA,EAAA,SAAA;AAAA,QACA,eAAA,EAAiB,IAAA;AAAA,QACjB,cAAA,EAAgB,IAAA;AAAA,QAChB,kBAAkB,EAAC;AAAA,QACnB,IAAA,sBAAU,GAAA,EAAI;AAAA,QACd,IAAA,EAAM,aAAa,QAAA,EAAS;AAAA,QAC5B,IAAA,EAAA,OAAA;AAAA,QACA,KAAA,EAAA,WAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,MACtE;AACA,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAA,EAAc,QAAQ,CAAA;AACzC,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,MAAM,CAAA;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,YAAY,YAAA,EAAuC;AACjD,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAAA,EACxC;AAAA,EAEA,UAAU,YAAA,EAAgE;AACxE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAAA,EACtC;AAAA,EAEA,YAAY,YAAA,EAA+B;AACzC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAAA,EACxC;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA,EAEA,YAAY,GAAA,EAA8B;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,WAAA,CAAY,KAAa,KAAA,EAAkB;AACzC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC9B;AACF;AAKO,SAAS,0BAAA,CACd,SAAA,EACA,QAAA,GAAmB,GAAA,EACnB,eAAA,EACsB;AACtB,EAAA,OAAO,IAAI,2BAAA,CAA4B,SAAA,EAAW,QAAA,EAAU,eAAe,CAAA;AAC7E;;;ACvKO,IAAM,yBAAN,MAA6B;AAAA,EAElC,WAAA,CAA6B,SAAyB,IAAA,EAAM;AAA/B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAgC;AAAA,EADrD,SAAA,uBAA8B,GAAA,EAAI;AAAA,EAG1C,EAAA,CACE,EAAA,EACA,KAAA,EACA,QAAA,EACA;AACA,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAC3E,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,kBAAI,IAAI,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AAAA,IAC/B;AAEA,IAAA,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,CAAG,GAAA,CAAI,QAAQ,CAAA;AAEjC,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,CAAG,MAAA,CAAO,QAAQ,CAAA;AACpC,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,EAAG,SAAS,CAAA,EAAG;AACnC,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACvB;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,EAAE,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,GAAA,EAAa,KAAA,EAAe;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAErC,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAErE,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,UAAA;AAAA,MACxB,CAAC,GAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,IAAK,EAAI,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,KAAK,CAAC;AAAA,KACnE,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY;AAClB,MAAA,MAAMC,IAAAA,GAAM,OAAA,CACT,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,UAAU,CAAA,CAC/C,GAAA,CAAI,CAAC,MAAA,KAAkC;AACtC,QAAA,IAAA,CAAK,MAAA,EAAQ,IAAA;AAAA,UACX,CAAA,iCAAA,EAAoC,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,cAAA,CAAA;AAAA,UAChD,MAAA,CAAO;AAAA,SACT;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAC,CAAA;AAEH,MAAA,IAAIA,IAAAA,CAAI,SAAS,CAAA,EAAG;AAClB,QAAA,OAAO,OAAA,CAAQ,OAAOA,IAAG,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;ACtDO,IAAM,wBAAN,MAA4B;AAAA,EAIjC,WAAA,CAA6B,SAAyB,IAAA,EAAM;AAA/B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAgC;AAAA,EAH5C,gBAAA,uBACX,GAAA,EAAI;AAAA,EAIV,IACE,IAAA,EAI4C;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA;AAC7C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,MAAA,CAAO,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,IAAI,GAAA,GAAM,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,GAAA,EAAK;AACvC,UAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,YACX,CAAA,4DAAA,EAA+D,OAAO,IAAI,CAAA;AAAA,WAC5E;AACA,UAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,MAAA,CAAO,IAAI,GAAG,MAAM,CAAA;AAAA,QAClD;AAAA,MACF,CAAA,MAAA,IACE,OAAO,MAAA,KAAA,YAAA,mBACP;AACA,QAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,UACX,CAAA,qDAAA,EAAwD,OAAO,IAAI,CAAA,cAAA;AAAA,SACrE;AACA,QAAA,OAAO,CAAC,IAAI,kBAAA,CAAmB,MAAA,CAAO,IAAI,GAAG,MAAM,CAAA;AAAA,MACrD,CAAA,MAAA,IAAW,OAAO,MAAA,KAAA,OAAA,cAAqD;AACrE,QAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,UACX,CAAA,qDAAA,EAAwD,OAAO,IAAI,CAAA,kBAAA;AAAA,SACrE;AACA,QAAA,OAAO,CAAC,MAAA,CAAO,QAAA,EAA8B,MAAM,CAAA;AAAA,MACrD;AAEA,MAAA,OAAO,CAAC,QAAW,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,QACX,wDAAwD,IAAI,CAAA,UAAA;AAAA,OAC9D;AACA,MAAA,OAAO,CAAC,IAAI,gBAAA,CAAiB,IAAI,CAAC,CAAA;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,GAAA,CAAI,MAAc,MAAA,EAA4C;AAC5D,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAAA,EACxC;AAAA,EAEA,IACE,IAAA,EAC+D;AAC/D,IAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,IAAA,CAAK,IAAI,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,CAAC,QAAW,IAAI,CAAA;AAAA,IACzB;AACA,IAAA,IACE,wFAA0D,CAAE,QAAA;AAAA,MAC1D,KAAA,CAAM;AAAA,KACR,EACA;AACA,MAAA,OAAO,CAAC,KAAK,CAAA;AAAA,IACf;AACA,IAAA,OAAO,CAAC,MAAA,EAAW,CAAC,CAAC,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEA,OAAO,IAAA,EAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,OACE,SAAA,EAI2C;AAC3C,IAAA,OAAO,IAAI,GAAA;AAAA,MACT,CAAC,GAAG,IAAA,CAAK,gBAAgB,CAAA,CAAE,MAAA;AAAA,QAAO,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAC5C,SAAA,CAAU,OAAO,GAAG;AAAA;AACtB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,oBAAA,CACE,MACA,IAAA,EACA,KAAA,EACA,uBAAoB,IAAI,GAAA,EAAI,EAC5B,GAAA,GAAc,QAAA,EAId;AACA,IAAA,MAAM,WAAW,cAAA,EAAsC;AAEvD,IAAA,MAAM,MAAA,GAAiD;AAAA,MACrD,MAAA,EAAA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,iBAAiB,QAAA,CAAS,OAAA;AAAA,MAC1B,cAAA,EAAgB,IAAA;AAAA,MAChB,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,kBAAkB,EAAC;AAAA,MACnB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACF;AAEA,IAAA,OAAO,CAAC,UAAU,MAAM,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,kBAAA,CACE,IAAA,EACA,QAAA,EACA,IAAA,EACA,KAAA,EACA,uBAAoB,IAAI,GAAA,EAAI,EAC5B,GAAA,GAAc,QAAA,EAC0B;AACxC,IAAA,MAAM,MAAA,GAAiD;AAAA,MACrD,MAAA,EAAA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,eAAA,EAAiB,IAAA;AAAA,MACjB,cAAA,EAAgB,IAAA;AAAA,MAChB,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,kBAAkB,EAAC;AAAA,MACnB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAEtC,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;ACtIO,IAAM,iBAAN,MAAqB;AAAA,EAO1B,YACmB,QAAA,GAAqB,cAAA,EACrB,MAAA,GAAyB,IAAA,EACzB,YAAuB,gBAAA,EACxC;AAHiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEjB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,sBAAA,CAAuB,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,qBAAA,CAAsB,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAI,mBAAA,CAAoB,SAAS,CAAA;AAAA,EAC9D;AAAA,EAdiB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA,uBAAsB,GAAA,EAAkC;AAAA,EACjE,qBAAA,GAAqD,IAAA;AAAA;AAAA;AAAA;AAAA,EAgB7D,WAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAAa;AACX,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEO,qBAAA,CAAsB,OAA0B,IAAA,EAAoB;AACzE,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,WAAA,EAAa,aAAA,EAAe,CAAA,GACxC,IAAA,CAAK,2BAAA,CAA4B,KAAA,EAAO,IAAI,CAAA;AAC9C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,WAAA,EAAa,aAAa,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAa,WAAA,CACX,KAAA,EACA,IAAA,EACA,SAAA,EAKA;AACA,IAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,MAAM,IAAA,CAAK,kCAAA;AAAA,MAC7B,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,CAAC,GAAG,CAAA;AAAA,IACb;AACA,IAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,WAAA,EAAa,WAAU,GAAI,IAAA;AAChE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,EAAE,YAAA,EAAc,WAAA,EAAa,aAAA,EAAe,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,sCAAA;AAAA,MACjC,YAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,CAAC,KAAK,CAAA;AAAA,IACf;AACA,IAAA,OAAO,CAAC,MAAA,EAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,EACpC;AAAA,EAEA,MAAa,kBAAA,CACX,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAI,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEO,eAAA,CAIL,OACA,IAAA,EAKiB;AACjB,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,WAAA,EAAa,aAAA,EAAe,CAAA,GACxC,IAAA,CAAK,2BAAA,CAA4B,KAAA,EAAO,IAAI,CAAA;AAC9C,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,oBAAA,CAAqB,WAAA,EAAa,aAAa,CAAA;AACzE,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAU,YAAY,CAAA;AACvE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,OAAO,aAAA,CAAc,QAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,MAAM,CAAC,KAAA,EAAO,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,YAAY,CAAA;AACrD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB;AAAA,EAEA,UAAA,CAAW,OAAA,EAAiB,KAAA,GAAQ,CAAA,EAAiB;AACnD,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,MACX,mEAAmE,OAAO,CAAA;AAAA,KAC5E;AACA,IAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,MAAA;AAAA,MAChC,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,WAAW,MAAA,CAAO,IAAA,CAAK,IAAI,OAAO;AAAA,KAChE;AACA,IAAA,MAAM,WAAW,EAAC;AAClB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AAClD,MAAA,IAAI,OAAO,MAAA,KAAA,YAAA,mBAA0D;AACnE,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,UACX,kCAAkC,GAAG,CAAA,2BAAA;AAAA,SACvC;AACA,QAAA,QAAA,CAAS,IAAA,CAAK,OAAO,cAAc,CAAA;AACnC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,MAAA,KAAA,UAAA,iBAAwD;AACjE,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,UACX,kCAAkC,GAAG,CAAA,iDAAA;AAAA,SACvC;AACA,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,MAAA,CAAO,eAAA,EAAiB,IAAA,CAAK,MAAM;AACjC,YAAA,IAAI,QAAQ,CAAA,EAAG;AACb,cAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,gBACX,kCAAkC,GAAG,CAAA,6EAAA;AAAA,eACvC;AACA,cAAA;AAAA,YACF;AACA,YAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,KAAA,GAAQ,CAAC,CAAA;AAAA,UACvC,CAAC;AAAA,SACH;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,MAAA,GAAA,YAAA;AACP,MAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,QACX,+CAA+C,GAAG,CAAA,wBAAA;AAAA,OACpD;AAEA,MAAA,MAAA,CAAO,iBAAiB,OAAA,CAAQ,GAAA;AAAA,QAC9B,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,QAAA,KAAa,UAAU;AAAA,OACtD,CAAE,KAAK,YAAY;AACjB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB,QAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,SAAS,CAAA;AAAA,MAC7C,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,IAAA,CAAK,OAAO,cAAc,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAA,GAAQ;AACZ,IAAA,OAAO,OAAA,CAAQ,GAAA;AAAA,MACb,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAM,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,MAAM,CAAA,KAAM;AAC9D,QAAA,IAAI,OAAO,MAAA,KAAA,UAAA,iBAAwD;AACjE,UAAA,OAAO,MAAA,CAAO,eAAA,EAAiB,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QAChD;AACA,QAAA,IAAI,OAAO,MAAA,KAAA,YAAA,mBAA0D;AACnE,UAAA,OAAO,MAAA,CAAO,cAAA,CAAe,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QAC9C;AACA,QAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MAC7B,CAAC;AAAA,KACH,CAAE,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,YAAA,CACE,SAAA,EACA,QAAA,EACA,QAAA,GAAmB,GAAA,EACG;AACtB,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,oCAAoC,SAAS,CAAA,eAAA;AAAA,OAC/C;AAAA,IACF;AAEA,IAAA,MAAM,gBAAgB,IAAI,2BAAA;AAAA,MACxB,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,aAAa,CAAA;AACjD,IAAA,IAAA,CAAK,qBAAA,GAAwB,aAAA;AAE7B,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,CAAA,0CAAA,EAA6C,SAAS,CAAA,CAAE,CAAA;AACzE,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,SAAA,EAAkC;AACjD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,IAAA,CAAK,MAAA,EAAQ,IAAA;AAAA,QACX,oCAAoC,SAAS,CAAA,UAAA;AAAA,OAC/C;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,SAAS,CAAA,CAAE,CAAA;AAGxE,IAAA,MAAM,kBAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,GAAG,MAAM,CAAA,IAAK,cAAc,OAAA,EAAS;AAC9C,MAAA,IAAI,MAAA,CAAO,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACtC,QAAA,eAAA,CAAgB,IAAA;AAAA,UACd,OAAA,CAAQ,IAAI,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAC,QAAA,KAAa,QAAA,EAAU,CAAC;AAAA,SACnE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AAGjC,IAAA,aAAA,CAAc,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AAGrC,IAAA,IAAI,IAAA,CAAK,0BAA0B,aAAA,EAAe;AAChD,MAAA,IAAA,CAAK,qBAAA,GACH,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA,IAAK,IAAA;AAAA,IACxD;AAEA,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,CAAA,iCAAA,EAAoC,SAAS,CAAA,MAAA,CAAQ,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAA,GAAwD;AACtD,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAyB,SAAA,EAAyB;AAChD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,IAC3E;AACA,IAAA,IAAA,CAAK,qBAAA,GAAwB,aAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,2BAAA,CACN,OACA,IAAA,EAIA;AACA,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,MAAA,WAAA,GAAc,mBAAmB,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,QAAA,GAAW,IAAA;AACf,IAAA,IAAI,uBAAuB,mBAAA,EAAqB;AAC9C,MAAA,QAAA,GAAW,WAAA,CAAY,KAAA;AAAA,IACzB,CAAA,MAAA,IAAW,uBAAuB,qBAAA,EAAuB;AACvD,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,QAAA,GAAW,WAAA,CAAY,KAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,OAAO,CAAC,IAAI,uBAAA,CAAwB,KAAA,CAAM,IAAI,CAAA,EAAG,EAAE,aAAa,CAAA;AAAA,MAClE;AAAA,IACF;AACA,IAAA,IAAI,CAAC,YAAY,MAAA,EAAQ;AACvB,MAAA,OAAO,CAAC,MAAA,EAAW,EAAE,WAAA,EAAa,aAAA,EAAe,UAAU,CAAA;AAAA,IAC7D;AACA,IAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,QAAQ,CAAA;AAC5D,IAAA,IAAI,aAAA,IAAiB,CAAC,aAAA,CAAc,OAAA,EAAS;AAC3C,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,QACX,CAAA,0EAAA,EAA6E,WAAA,CAAY,IAAA,CAAK,QAAA,EAAU,CAAA,CAAA;AAAA,QACxG,aAAA,CAAc;AAAA,OAChB;AACA,MAAA,OAAO,CAAC,IAAI,YAAA,CAAa,aAAA,CAAc,KAAK,CAAA,EAAG,EAAE,aAAa,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,CAAC,MAAA,EAAW,EAAE,aAAa,aAAA,EAAe,aAAA,EAAe,MAAM,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kCAAA,CACZ,KAAA,EACA,IAAA,EAYA;AACA,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,WAAA,EAAa,aAAA,EAAe,CAAA,GACxC,IAAA,CAAK,2BAAA,CAA4B,KAAA,EAAO,IAAI,CAAA;AAC9C,IAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,MAAA,OAAO,CAAC,GAAG,CAAA;AAAA,IACb,CAAA,MAAA,IACG,GAAA,YAAuB,uBAAA,IACxB,WAAA,YAAuB,qBAAA,EACvB;AACA,MAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,QACX,CAAA,8FAAA;AAAA,OACF;AACA,MAAA,MAAM,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,oBAAA,EAAsB,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,mCAAmC,KAAK,CAAA;AAAA,IACtD;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,oBAAA,CAAqB,WAAA,EAAa,aAAa,CAAA;AAEzE,IAAA,MAAM,YACJ,WAAA,YAAuB,mBAAA,IACvB,WAAA,YAAuB,qBAAA,GACnB,YAAY,KAAA,GACZ,WAAA;AACN,IAAA,OAAO,CAAC,MAAA,EAAW,EAAE,cAAc,aAAA,EAAe,WAAA,EAAa,WAAW,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sCAAA,CACZ,YAAA,EACA,SAAA,EACA,QAAA,EAIA;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAChC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC1C,MAAA,IAAI,OAAO,KAAA,KAAA,SAAA,gBAAmC;AAC5C,QAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,UAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,YACX,6HAA6H,YAAY,CAAA;AAAA,WAC3I;AACA,UAAA,OAAO,CAAC,IAAI,YAAA,CAAA,kBAAA,wBAAyC,CAAA;AAAA,QACvD;AACA,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAU,YAAY,CAAA;AACvE,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,IACE,cAAc,MAAA,KAAA,UAAA,iBACd;AACA,YAAA,MAAM,aAAA,CAAc,eAAA;AACpB,YAAA,OAAO,IAAA,CAAK,sCAAA;AAAA,cACV,YAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF,CAAA,MAAA,IACE,cAAc,MAAA,KAAA,YAAA,mBAEd;AACA,YAAA,OAAO,CAAC,IAAI,YAAA,CAAA,oBAAA,0BAA2C,CAAA;AAAA,UACzD;AACA,UAAA,OAAO,CAAC,QAAW,aAAa,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,CAAC,KAAA,EAAO,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,YAAY,CAAA;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,IAAI,OAAO,MAAA,KAAA,UAAA,iBAAwD;AACjE,QAAA,MAAM,MAAA,CAAO,eAAA;AACb,QAAA,OAAO,IAAA,CAAK,sCAAA;AAAA,UACV,YAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAA,IACE,OAAO,MAAA,KAAA,YAAA,mBACP;AAEA,QAAA,OAAO,CAAC,IAAI,YAAA,CAAA,oBAAA,0BAA2C,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,CAAC,QAAW,MAAM,CAAA;AAAA,IAC3B;AACA,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAA,oBAAA;AACE,QAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,UACX,CAAA,0EAAA,EAA6E,QAAQ,IAAI,CAAA;AAAA,SAC3F;AACA,QAAA,MAAM,MAAA,EAAQ,cAAA;AAEd,QAAA,OAAO,IAAA,CAAK,sCAAA;AAAA,UACV,YAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MAEF,KAAA,iBAAA;AACE,QAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,UACX,CAAA,0EAAA,EAA6E,QAAQ,IAAI,CAAA;AAAA,SAC3F;AACA,QAAA,MAAM,IAAA,CAAK,WAAW,YAAY,CAAA;AAElC,QAAA,OAAO,IAAA,CAAK,sCAAA;AAAA,UACV,YAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,KAAA,kBAAA;AACE,QAAA;AAAA,MACF;AACE,QAAA,OAAO,CAAC,KAAK,CAAA;AAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA;AAAA,MACxB,YAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,EAAG;AACb,MAAA,OAAO,CAAC,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACnB;AACA,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA,KAAA,UAAA,iBAAwD;AACpE,MAAA,MAAM,MAAA,CAAO,CAAC,CAAA,CAAE,eAAA;AAAA,IAClB;AACA,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA,KAAA,OAAA,cAAqD;AACjE,MAAA,OAAO,CAAC,MAAA,CAAO,CAAC,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,CAAC,MAAA,EAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,IAAA,EACA,KAAA,GAA8B,QAAA,EAC9B;AACA,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,MACX,CAAA,6DAAA,EAAgE,IAAI,CAAA,YAAA,EAAe,KAAK,CAAA;AAAA,KAC1F;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CAIZ,YAAA,EACA,SAAA,EACA,IAAA,EAQA;AACA,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,MACX,8DAA8D,YAAY,CAAA;AAAA,KAC5E;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA,CAAK,8BAAA;AAAA,QACV,YAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,UAAU,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,8BAAA,CASN,YAAA,EACA,KAAA,EACA,IAAA,EAC8D;AAC9D,IAAA,IAAA,CAAK,MAAA,EAAQ,GAAA;AAAA,MACX,4EAA4E,YAAY,CAAA,sBAAA;AAAA,KAC1F;AACA,IAAA,MAAM,MAAM,IAAA,CAAK,oBAAA;AAAA,MACf,KAAK,qBAAA,IAAyB;AAAA,KAChC;AACA,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAsB,KAAK,CAAA;AACtD,IAAA,IAAI,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAA;AAGtB,IAAA,MAAM,CAAC,QAAA,EAAU,MAAM,CAAA,GAAI,KAAK,OAAA,CAAQ,oBAAA;AAAA,MACtC,YAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAA,CAAI,IAAA;AAAA,MACJ;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,mBAAA,CACF,kBAAA,CAAmB,GAAA,EAAK,MAAA,EAAQ,IAAI,CAAA,CACpC,IAAA,CAAK,OAAO,CAAC,KAAA,EAAO,QAAQ,CAAA,KAAM;AACjC,MAAA,MAAA,CAAO,gBAAA,GAAmB,IAAI,mBAAA,EAAoB;AAClD,MAAA,MAAA,CAAO,eAAA,GAAkB,IAAA;AACzB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,UACX,kFAAkF,YAAY,CAAA,CAAA;AAAA,UAC9F;AAAA,SACF;AACA,QAAA,MAAA,CAAO,MAAA,GAAA,OAAA;AACP,QAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAClB,QAAA,IAAI,KAAA,KAAA,WAAA,kBAAqC;AACvC,UAAA,UAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,GAAG,EAAE,CAAA;AAAA,QACpD;AACA,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,QAAA,MAAA,CAAO,MAAA,GAAA,SAAA;AACP,QAAA,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG;AACrB,UAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,UAAA,KAAe;AAC/B,YAAA,MAAA,CAAO,gBAAA,CAAiB,IAAA;AAAA,cACtB,KAAK,QAAA,CAAS,EAAA;AAAA,gBAAG,UAAA;AAAA,gBAAY,SAAA;AAAA,gBAAW,MACtC,IAAA,CAAK,UAAA,CAAW,YAAY;AAAA;AAC9B,aACF;AAAA,UACF,CAAC,CAAA;AAAA,QACH;AACA,QAAA,MAAM,IAAA,CAAK,kBAAkB,YAAY,CAAA;AACzC,QAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,MACxC;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,QACX,6FAA6F,YAAY,CAAA,CAAA;AAAA,QACzG;AAAA,OACF;AACA,MAAA,MAAA,CAAO,MAAA,GAAA,OAAA;AACP,MAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAClB,MAAA,MAAA,CAAO,eAAA,GAAkB,IAAA;AACzB,MAAA,IAAI,KAAA,KAAA,WAAA,kBAAqC;AACvC,QAAA,UAAA,CAAW,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,GAAG,EAAE,CAAA;AAAA,MACpD;AACA,MAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,IACvB,CAAC,CAAA;AAEH,IAAA,IAAI,KAAA,KAAA,WAAA,kBAAqC;AACvC,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,QACX,2EAA2E,YAAY,CAAA;AAAA,OACzF;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,MAAM,CAAA;AAAA,IACvC,CAAA,MAAA,IACE,KAAA,KAAA,SAAA,kBACA,IAAA,CAAK,qBAAA,EACL;AACA,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,QACX,0FAA0F,YAAY,CAAA;AAAA,OACxG;AAGA,MAAA,IAAA,CAAK,qBAAA,CAAsB,WAAA;AAAA,QACzB,YAAA;AAAA,QACA,MAAA,CAAO,QAAA;AAAA,QACP;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,CAAC,QAAW,MAAM,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBACN,aAAA,EAIA;AACA,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAgB;AAC7C,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,IAAA,MAAM,IAAA,GAAO,IAAA;AAEb,IAAA,SAAS,mBAAmB,QAAA,EAAsB;AAChD,MAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAAA,IAC/B;AAEA,IAAA,SAAS,mBAAA,GAAsB;AAC7B,MAAA,OAAO,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM;AAExB,QAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,QAAA,GAAW,CAAA,EAAG;AAC/C,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,IAAI,CAAA;AAC1D,UAAA,MAAM,mBAAA,GAAsB,aAAA,CAAc,WAAA,CAAY,YAAY,CAAA;AAClE,UAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,YAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,cACX,CAAA,6CAAA,EAAgD,YAAY,CAAA,sBAAA,EAAyB,aAAA,CAAc,SAAS,CAAA;AAAA,aAC9G;AACA,YAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AACrB,YAAA,OAAO,mBAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,IACE,IAAA,CAAK,qBAAA,IACL,IAAA,CAAK,qBAAA,KAA0B,aAAA,EAC/B;AACA,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,IAAI,CAAA;AAC1D,UAAA,MAAM,mBAAA,GACJ,IAAA,CAAK,qBAAA,CAAsB,WAAA,CAAY,YAAY,CAAA;AACrD,UAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,YAAA,IAAA,CAAK,MAAA,EAAQ,KAAA;AAAA,cACX,CAAA,6CAAA,EAAgD,YAAY,CAAA,8BAAA,EAAiC,IAAA,CAAK,sBAAsB,SAAS,CAAA;AAAA,aACnI;AACA,YAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AACrB,YAAA,OAAO,mBAAA;AAAA,UACT;AAAA,QACF;AAGA,QAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,MAAM,IAAA,CAAK,WAAA;AAAA,UACnC,KAAA;AAAA,UACA,IAAA;AAAA,UACA,CAAC,EAAE,YAAA,EAAa,KAAM;AACpB,YAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AAAA,UACvB;AAAA,SACF;AACA,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,KAAA;AAAA,QACR;AACA,QAAA,OAAO,QAAA;AAAA,MACT,CAAA;AAAA,MACA,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,CAAqB,OAA2B,IAAA,EAAW;AACjE,IAAA,MAAM,aAAA,GAAgB,IAAA,GAClB,GAAA,GACA,MAAA,CAAO,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA,CACtB,IAAA,CAAK,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,IAAI,CAAA,KAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAC,CAAA,CACjD,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrB,MAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,QAAA,OAAO,GAAG,GAAG,CAAA,IAAA,EAAO,MAAM,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACnC;AACA,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IACrD,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA,CACR,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA,CACnB,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,GACvB,EAAA;AACJ,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,QAAA,EAAU,GAAG,aAAa,CAAA,CAAA;AAAA,EAC5C;AACF;;;AC1uBA,IAAA,qBAAA,EAAAC,MAAAA;AA0BA,qBAAA,GAAA,CAAC,UAAA,EAAW,CAAA;AACL,IAAM,UAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACJ,cAAA;AAAA,EAEjB,YACE,QAAA,GAAqB,cAAA,EACrB,MAAA,GAAyB,IAAA,EACzB,YAAuB,gBAAA,EACvB;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,QAAA,EAAU,QAAQ,SAAS,CAAA;AACpE,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,MAAM,KAAA,GAAQ,mBAAmB,UAAS,CAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,qBAAA,CAAsB,KAAK,CAAA;AACpE,IAAA,IAAA,CAAK,cAAA,CACF,YAAW,CACX,kBAAA;AAAA,MACC,YAAA;AAAA,MACA,IAAA;AAAA,MAAA,OAAA;AAAA,MAAA,WAAA;AAAA,KAGF;AAAA,EACJ;AAAA,EAiCA,MAAM,GAAA,CACJ,KAAA,EAKA,IAAA,EACA;AACA,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,KAAA,EAAO,IAAW,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAiC;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CACpB,UAAA,EAAW,CACX,OAAO,CAACC,OAAAA,KAAWA,OAAAA,CAAO,QAAA,KAAa,OAAO,CAAA;AACjD,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACzC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,YAAA,CACE,SAAA,EACA,QAAA,EACA,QAAA,GAAmB,GAAA,EACG;AACtB,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,YAAA,CAAa,SAAA,EAAW,UAAU,QAAQ,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAW,SAAA,EAAkC;AACjD,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAA,GAAwD;AACtD,IAAA,OAAO,IAAA,CAAK,eAAe,wBAAA,EAAyB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAyB,SAAA,EAAyB;AAChD,IAAA,IAAA,CAAK,cAAA,CAAe,yBAAyB,SAAS,CAAA;AAAA,EACxD;AACF,CAAA;AA3IOD,MAAAA,GAAA,gBAAA,CAAA,CAAA;AAAM,UAAA,GAAN,iBAAA,CAAAA,MAAAA,EAAA,CAAA,EAAA,WAAA,EADP,qBAAA,EACa,UAAA,CAAA;AAAN,iBAAA,CAAAA,QAAA,CAAA,EAAM,UAAA,CAAA;AAAN,IAAM,SAAA,GAAN","file":"index.mjs","sourcesContent":["export enum InjectableScope {\n /**\n * Singleton scope: The instance is created once and shared across the application.\n */\n Singleton = 'Singleton',\n /**\n * Instance scope: A new instance is created for each injection.\n */\n Transient = 'Transient',\n /**\n * Request scope: The instance is created once per request and shared within that request context.\n */\n Request = 'Request',\n}\n","export enum InjectableType {\n Class = 'Class',\n Factory = 'Factory',\n}\n","import type { z, ZodObject, ZodOptional, ZodRecord } from 'zod/v4'\n\nimport type { FactoryContext } from './factory-context.mjs'\n\nexport type ClassType = new (...args: any[]) => any\nexport type ClassTypeWithArgument<Arg> = new (arg: Arg) => any\nexport type ClassTypeWithOptionalArgument<Arg> = new (arg?: Arg) => any\n\nexport type ClassTypeWithInstance<T> = new (...args: any[]) => T\nexport type ClassTypeWithInstanceAndArgument<T, Arg> = new (arg: Arg) => T\nexport type ClassTypeWithInstanceAndOptionalArgument<T, Arg> = new (\n arg?: Arg,\n) => T\n\nexport type BaseInjectionTokenSchemaType = ZodObject | ZodRecord\n\nexport type OptionalInjectionTokenSchemaType =\n | ZodOptional<ZodObject>\n | ZodOptional<ZodRecord>\n\nexport type InjectionTokenSchemaType =\n | BaseInjectionTokenSchemaType\n | OptionalInjectionTokenSchemaType\n\nexport class InjectionToken<\n // oxlint-disable-next-line no-unused-vars\n T,\n S extends InjectionTokenSchemaType | unknown = unknown,\n // oxlint-disable-next-line no-unused-vars\n Required extends boolean = S extends ZodOptional<ZodObject>\n ? false\n : S extends ZodOptional<ZodRecord>\n ? false\n : S extends ZodObject\n ? true\n : S extends ZodRecord\n ? true\n : false,\n> {\n public id = globalThis.crypto.randomUUID()\n private formattedName: string | null = null\n\n constructor(\n public readonly name: string | symbol | ClassType,\n public readonly schema: ZodObject | undefined,\n ) {}\n\n static create<T extends ClassType>(\n name: T,\n ): InjectionToken<InstanceType<T>, undefined>\n static create<T extends ClassType, Schema extends InjectionTokenSchemaType>(\n name: T,\n schema: Schema,\n ): Schema['_def']['type'] extends 'ZodOptional'\n ? InjectionToken<InstanceType<T>, Schema, false>\n : InjectionToken<InstanceType<T>, Schema, true>\n static create<T>(name: string | symbol): InjectionToken<T, undefined>\n static create<T, Schema extends InjectionTokenSchemaType>(\n name: string | any,\n schema: Schema,\n ): InjectionToken<T, Schema>\n static create(name: string | symbol, schema?: unknown) {\n // @ts-expect-error\n return new InjectionToken(name, schema)\n }\n\n static bound<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n value: z.input<S>,\n ): BoundInjectionToken<T, S> {\n return new BoundInjectionToken(token, value)\n }\n\n static factory<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n factory: (ctx: FactoryContext) => Promise<z.input<S>>,\n ): FactoryInjectionToken<T, S> {\n return new FactoryInjectionToken(token, factory)\n }\n\n static refineType<T>(\n token: BoundInjectionToken<any, any>,\n ): BoundInjectionToken<T, any> {\n return token as BoundInjectionToken<T, any>\n }\n\n toString() {\n if (this.formattedName) {\n return this.formattedName\n }\n const { name } = this\n if (typeof name === 'function') {\n const className = name.name\n this.formattedName = `${className}(${this.id})`\n } else if (typeof name === 'symbol') {\n this.formattedName = `${name.toString()}(${this.id})`\n } else {\n this.formattedName = `${name}(${this.id})`\n }\n\n return this.formattedName\n }\n}\n\nexport class BoundInjectionToken<T, S extends InjectionTokenSchemaType> {\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly value: z.input<S>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n toString() {\n return this.token.toString()\n }\n}\n\nexport class FactoryInjectionToken<T, S extends InjectionTokenSchemaType> {\n public value?: z.input<S>\n public resolved = false\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly factory: (ctx: FactoryContext) => Promise<z.input<S>>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n async resolve(ctx: FactoryContext): Promise<z.input<S>> {\n if (!this.value) {\n this.value = await this.factory(ctx)\n this.resolved = true\n }\n return this.value\n }\n\n toString() {\n return this.token.toString()\n }\n}\n\nexport type AnyInjectableType =\n | ClassType\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>\n\nexport type InjectionTokenType =\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>\n","import type { ClassType, InjectionToken } from './injection-token.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\n\nexport type FactoryRecord<Instance = any, Schema = any> = {\n scope: InjectableScope\n originalToken: InjectionToken<Instance, Schema>\n target: ClassType\n type: InjectableType\n}\n\nexport class Registry {\n private readonly factories = new Map<string, FactoryRecord>()\n\n constructor(private readonly parent?: Registry) {}\n\n has(token: InjectionToken<any, any>): boolean {\n if (this.factories.has(token.id)) {\n return true\n }\n if (this.parent) {\n return this.parent.has(token)\n }\n return false\n }\n\n get<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n ): FactoryRecord<Instance, Schema> {\n const factory = this.factories.get(token.id)\n if (!factory) {\n if (this.parent) {\n return this.parent.get(token)\n }\n throw new Error(`[Registry] No factory found for ${token.toString()}`)\n }\n return factory\n }\n\n set<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n scope: InjectableScope,\n target: ClassType,\n type: InjectableType,\n ) {\n this.factories.set(token.id, { scope, originalToken: token, target, type })\n }\n\n delete(token: InjectionToken<any, any>) {\n this.factories.delete(token.id)\n }\n}\n\nexport const globalRegistry = new Registry()\n","export const InjectableTokenMeta = Symbol.for('InjectableTokenMeta')\n","import type {\n ClassTypeWithInstance,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Factorable, FactorableWithArgs } from '../interfaces/index.mjs'\nimport type { Registry } from '../registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface FactoryOptions {\n scope?: InjectableScope\n token?: InjectionToken<any, any>\n registry?: Registry\n}\n\n// #1 Factory without arguments\nexport function Factory<R>(options?: {\n scope?: InjectableScope\n registry?: Registry\n}): <T extends ClassTypeWithInstance<Factorable<R>>>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n\n// #2 Factory with typed token\nexport function Factory<R, S>(options: {\n scope?: InjectableScope\n token: InjectionToken<R, S>\n registry?: Registry\n}): R extends undefined // #2.1 Check that token has a type\n ? never // #2.1.1 Token must have a type\n : S extends InjectionTokenSchemaType // #2.2 Check that schema is an object or a record\n ? <T extends ClassTypeWithInstance<FactorableWithArgs<R, S>>>( // #2.2.1 Token have a schema\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : S extends undefined // #2.3 For a factory without schema\n ? <T extends ClassTypeWithInstance<Factorable<R>>>( // #2.3.1 Token without a schema\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : never // #2.4 Cannot use a token without a type and schema\n\nexport function Factory({\n scope = InjectableScope.Singleton,\n token,\n registry = globalRegistry,\n}: FactoryOptions = {}) {\n return <\n T extends ClassTypeWithInstance<\n Factorable<any> | FactorableWithArgs<any, any>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error(\n '[ServiceLocator] @Factory decorator can only be used on classes.',\n )\n }\n\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n\n registry.set(injectableToken, scope, target, InjectableType.Factory)\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","import { z } from 'zod/v4'\n\nimport type {\n BaseInjectionTokenSchemaType,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithInstance,\n ClassTypeWithInstanceAndArgument,\n ClassTypeWithInstanceAndOptionalArgument,\n ClassTypeWithOptionalArgument,\n OptionalInjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Registry } from '../registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface InjectableOptions {\n scope?: InjectableScope\n token?: InjectionToken<any, any>\n registry?: Registry\n}\n// #1 Simple constructorless class\nexport function Injectable(): <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n scope?: InjectableScope\n registry: Registry\n}): <T extends ClassType>(target: T, context?: ClassDecoratorContext) => T\nexport function Injectable(options: {\n scope: InjectableScope\n}): <T extends ClassType>(target: T, context?: ClassDecoratorContext) => T\n\n// #3 Class with typeless token and schema\nexport function Injectable<Type, Schema>(options: {\n scope?: InjectableScope\n token: InjectionToken<Type, Schema>\n registry?: Registry\n}): Schema extends BaseInjectionTokenSchemaType // #3.1 Check that schema is an object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithArgument<z.output<Schema>>>( // #3.1.1 Typeless token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>( // #3.1.2 Typed token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends OptionalInjectionTokenSchemaType // #3.2 Check that schema is an optional object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>( // #3.2.1 Typeless token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <\n // #3.2.2 Typed token\n T extends ClassTypeWithInstanceAndOptionalArgument<\n Type,\n z.output<Schema>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends undefined // #3.3 Check that schema is undefined\n ? <R extends ClassTypeWithInstance<Type>>( // #3.3.1 Token must have a type\n target: R,\n context?: ClassDecoratorContext,\n ) => R\n : never // #3.4 Cannot use a token without a type and schema\n\nexport function Injectable({\n scope = InjectableScope.Singleton,\n token,\n registry = globalRegistry,\n}: InjectableOptions = {}) {\n return <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error(\n '[ServiceLocator] @Injectable decorator can only be used on classes.',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n\n registry.set(injectableToken, scope, target, InjectableType.Class)\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","export enum ErrorsEnum {\n InstanceExpired = 'InstanceExpired',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n UnknownError = 'UnknownError',\n FactoryNotFound = 'FactoryNotFound',\n FactoryTokenNotResolved = 'FactoryTokenNotResolved',\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryNotFound extends Error {\n code = ErrorsEnum.FactoryNotFound\n constructor(public name: string) {\n super(`Factory ${name} not found`)\n }\n}\n","import type { ClassType } from '../injection-token.mjs'\n\nimport { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryTokenNotResolved extends Error {\n code = ErrorsEnum.FactoryTokenNotResolved\n constructor(name: string | symbol | ClassType) {\n super(`Factory token not resolved: ${name.toString()}`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceDestroying extends Error {\n code = ErrorsEnum.InstanceDestroying\n constructor(public name: string) {\n super(`Instance ${name} destroying`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceExpired extends Error {\n code = ErrorsEnum.InstanceExpired\n constructor(public name: string) {\n super(`Instance ${name} expired`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceNotFound extends Error {\n code = ErrorsEnum.InstanceNotFound\n constructor(public name: string) {\n super(`Instance ${name} not found`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class UnknownError extends Error {\n code = ErrorsEnum.UnknownError\n parent?: Error\n\n constructor(message: string | Error) {\n if (message instanceof Error) {\n super(message.message)\n this.parent = message\n return\n }\n super(message)\n }\n}\n","import type { z, ZodObject, ZodType } from 'zod/v4'\n\nimport type { FactoryContext } from '../factory-context.mjs'\nimport type {\n BoundInjectionToken,\n ClassType,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Factorable } from '../interfaces/factory.interface.mjs'\nimport type { InjectState, Join, UnionToArray } from './types.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface Injectors {\n // #1 Simple class\n asyncInject<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n // #2 Token with required Schema\n asyncInject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n asyncInject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? Promise<T>\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n // #4 Token with no Schema\n asyncInject<T>(token: InjectionToken<T, undefined>): Promise<T>\n asyncInject<T>(token: BoundInjectionToken<T, any>): Promise<T>\n asyncInject<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n inject<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>\n inject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T\n // #3 Token with optional Schema\n inject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? T\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n inject<T>(token: InjectionToken<T, undefined>): T\n inject<T>(token: BoundInjectionToken<T, any>): T\n inject<T>(token: FactoryInjectionToken<T, any>): T\n\n wrapSyncInit(\n cb: () => any,\n ): (injectState?: InjectState) => [any, Promise<any>[], InjectState]\n\n provideFactoryContext(context: FactoryContext | null): FactoryContext | null\n}\n\nexport function getInjectors() {\n let currentFactoryContext: FactoryContext | null = null\n\n function provideFactoryContext(\n context: FactoryContext,\n ): FactoryContext | null {\n const original = currentFactoryContext\n currentFactoryContext = context\n return original\n }\n function getFactoryContext(): FactoryContext {\n if (!currentFactoryContext) {\n throw new Error(\n '[Injector] Trying to access injection context outside of a injectable context',\n )\n }\n return currentFactoryContext\n }\n\n let promiseCollector: null | ((promise: Promise<any>) => void) = null\n let injectState: InjectState | null = null\n\n function asyncInject(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n if (injectState.isFrozen) {\n const idx = injectState.currentIndex++\n const request = injectState.requests[idx]\n if (request.token !== token) {\n throw new Error(\n `[Injector] Wrong token order. Expected ${request.token.toString()} but got ${token.toString()}`,\n )\n }\n return request.promise\n }\n\n const promise = getFactoryContext().inject(token as any, args as any)\n injectState.requests.push({\n token,\n promise,\n })\n injectState.currentIndex++\n\n return promise\n }\n\n function wrapSyncInit(cb: () => any) {\n return (previousState?: InjectState) => {\n const promises: Promise<any>[] = []\n const originalPromiseCollector = promiseCollector\n const originalInjectState = injectState\n injectState = previousState\n ? {\n ...previousState,\n currentIndex: 0,\n }\n : {\n currentIndex: 0,\n isFrozen: false,\n requests: [],\n }\n promiseCollector = (promise) => {\n promises.push(promise)\n }\n const result = cb()\n promiseCollector = originalPromiseCollector\n const newInjectState = {\n ...injectState,\n isFrozen: true,\n }\n injectState = originalInjectState\n return [result, promises, newInjectState]\n }\n }\n\n function inject<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends ZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends ZodObject ? z.input<S> : never): T {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n const instance = getFactoryContext().locator.getSyncInstance(\n realToken,\n args,\n )\n if (!instance) {\n if (promiseCollector) {\n const promise = getFactoryContext().inject(realToken, args)\n promiseCollector(promise)\n } else {\n throw new Error(`[Injector] Cannot initiate ${realToken.toString()}`)\n }\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please use asyncInject() instead of inject() or do not use the value outside of class methods`,\n )\n },\n },\n ) as unknown as T\n }\n return instance as unknown as T\n }\n\n const injectors: Injectors = {\n asyncInject,\n inject,\n wrapSyncInit,\n provideFactoryContext,\n } as Injectors\n\n return injectors\n}\n","import type { ClassType, InjectionToken } from '../injection-token.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport function getInjectableToken<R>(\n target: ClassType,\n): R extends { create(...args: any[]): infer V }\n ? InjectionToken<V>\n : InjectionToken<R> {\n // @ts-expect-error We inject the token into the class itself\n const token = target[InjectableTokenMeta] as InjectionToken<any, any>\n if (!token) {\n throw new Error(\n `[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`,\n )\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n","/**\n * Creates a deferred promise that can be resolved or rejected externally.\n * This is useful for creating stub holders that can be fulfilled later.\n */\nexport class Deferred<T> {\n public readonly promise: Promise<T>\n private _resolve!: (value: T) => void\n private _reject!: (reason?: any) => void\n private _isResolved = false\n private _isRejected = false\n\n constructor() {\n this.promise = new Promise<T>((resolve, reject) => {\n this._resolve = resolve\n this._reject = reject\n })\n }\n\n /**\n * Resolves the deferred promise with the given value.\n * @param value The value to resolve with\n * @throws Error if the promise has already been resolved or rejected\n */\n resolve(value: T): void {\n if (this._isResolved || this._isRejected) {\n throw new Error('Deferred promise has already been resolved or rejected')\n }\n this._isResolved = true\n this._resolve(value)\n }\n\n /**\n * Rejects the deferred promise with the given reason.\n * @param reason The reason for rejection\n * @throws Error if the promise has already been resolved or rejected\n */\n reject(reason?: any): void {\n if (this._isResolved || this._isRejected) {\n throw new Error('Deferred promise has already been resolved or rejected')\n }\n this._isRejected = true\n this._reject(reason)\n }\n\n /**\n * Returns true if the promise has been resolved.\n */\n get isResolved(): boolean {\n return this._isResolved\n }\n\n /**\n * Returns true if the promise has been rejected.\n */\n get isRejected(): boolean {\n return this._isRejected\n }\n\n /**\n * Returns true if the promise has been settled (resolved or rejected).\n */\n get isSettled(): boolean {\n return this._isResolved || this._isRejected\n }\n}\n\n/**\n * Creates a new deferred promise.\n * @returns A new Deferred instance\n */\nexport function createDeferred<T>(): Deferred<T> {\n return new Deferred<T>()\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\nimport { Injectable, InjectableScope } from './index.mjs'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type EventsConfig = {\n [event: string]: any[]\n}\nexport type EventsNames<Events extends EventsConfig> = Exclude<\n keyof Events,\n symbol | number\n>\nexport type EventsArgs<\n Events extends EventsConfig,\n Name extends EventsNames<Events>,\n> = Events[Name] extends any[] ? Events[Name] : []\n\nexport type ChannelEmitter<\n Events extends EventsConfig,\n Ns extends string,\n E extends EventsNames<Events>,\n> = {\n emit<Args extends EventsArgs<Events, E>>(\n ns: Ns,\n event: E,\n ...args: Args\n ): Promise<any>\n}\n\nexport interface EventEmitterInterface<Events extends EventsConfig> {\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ): () => void\n emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): void\n}\n\n@Injectable({ scope: InjectableScope.Transient })\nexport class EventEmitter<Events extends EventsConfig = {}>\n implements EventEmitterInterface<Events>\n{\n private listeners: Map<EventsNames<Events>, Set<Function>> = new Map()\n\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n\n this.listeners.get(event)!.add(listener)\n\n return () => {\n this.off(event, listener)\n }\n }\n\n off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n return\n }\n\n this.listeners.get(event)!.delete(listener)\n if (this.listeners.get(event)!.size === 0) {\n this.listeners.delete(event)\n }\n }\n\n once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n const off = this.on(event, (...args) => {\n off()\n // @ts-expect-error - This is a valid call\n listener(...args)\n })\n\n return off\n }\n\n async emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): Promise<any> {\n if (!this.listeners.has(event)) {\n return\n }\n\n return Promise.all(\n Array.from(this.listeners.get(event)!).map((listener) =>\n listener(...args),\n ),\n )\n }\n}\n","import type { Injectors } from './utils/index.mjs'\n\nimport { getInjectors } from './utils/index.mjs'\n\nexport const defaultInjectors = getInjectors()\n\nexport const asyncInject: Injectors['asyncInject'] =\n defaultInjectors.asyncInject\n\nexport const inject: Injectors['inject'] = defaultInjectors.inject\n\nexport const wrapSyncInit: Injectors['wrapSyncInit'] =\n defaultInjectors.wrapSyncInit\n\nexport const provideFactoryContext: Injectors['provideFactoryContext'] =\n defaultInjectors.provideFactoryContext\n","import type { FactoryContext } from './factory-context.mjs'\nimport type { FactoryRecord } from './registry.mjs'\nimport type { Injectors } from './utils/get-injectors.mjs'\n\nimport { InjectableType } from './enums/index.mjs'\n\n/**\n * ServiceInstantiator handles the instantiation of services based on registry records.\n * It replaces the hard-coded logic in Injectable and Factory decorators.\n */\nexport class ServiceInstantiator {\n constructor(private readonly injectors: Injectors) {}\n\n /**\n * Instantiates a service based on its registry record.\n * @param ctx The factory context for dependency injection\n * @param record The factory record from the registry\n * @param args Optional arguments for the service\n * @returns Promise resolving to [undefined, instance] or [error]\n */\n async instantiateService<T>(\n ctx: FactoryContext,\n record: FactoryRecord<T, any>,\n args: any = undefined,\n ): Promise<[undefined, T] | [Error]> {\n try {\n switch (record.type) {\n case InjectableType.Class:\n return this.instantiateClass(ctx, record, args)\n case InjectableType.Factory:\n return this.instantiateFactory(ctx, record, args)\n default:\n throw new Error(\n `[ServiceInstantiator] Unknown service type: ${record.type}`,\n )\n }\n } catch (error) {\n return [error instanceof Error ? error : new Error(String(error))]\n }\n }\n\n /**\n * Instantiates a class-based service (Injectable decorator).\n * @param ctx The factory context for dependency injection\n * @param record The factory record from the registry\n * @param args Optional arguments for the service constructor\n * @returns Promise resolving to [undefined, instance] or [error]\n */\n private async instantiateClass<T>(\n ctx: FactoryContext,\n record: FactoryRecord<T, any>,\n args: any,\n ): Promise<[undefined, T] | [Error]> {\n try {\n const tryLoad = this.injectors.wrapSyncInit(() => {\n const original = this.injectors.provideFactoryContext(ctx)\n let result = new record.target(...(args ? [args] : []))\n this.injectors.provideFactoryContext(original)\n return result\n })\n\n let [instance, promises, injectState] = tryLoad()\n if (promises.length > 0) {\n const results = await Promise.allSettled(promises)\n if (results.some((result) => result.status === 'rejected')) {\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n const newRes = tryLoad(injectState)\n instance = newRes[0]\n promises = newRes[1]\n }\n\n if (promises.length > 0) {\n console.error(`[ServiceInstantiator] ${record.target.name} has problem with it's definition.\n\n One or more of the dependencies are registered as a InjectableScope.Instance and are used with inject.\n\n Please use inject asyncInject of inject to load those dependencies.`)\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n\n // Handle lifecycle hooks\n if ('onServiceInit' in instance) {\n await (instance as any).onServiceInit()\n }\n if ('onServiceDestroy' in instance) {\n ctx.addDestroyListener(async () => {\n await (instance as any).onServiceDestroy()\n })\n }\n\n return [undefined, instance]\n } catch (error) {\n return [error instanceof Error ? error : new Error(String(error))]\n }\n }\n\n /**\n * Instantiates a factory-based service (Factory decorator).\n * @param ctx The factory context for dependency injection\n * @param record The factory record from the registry\n * @param args Optional arguments for the factory\n * @returns Promise resolving to [undefined, instance] or [error]\n */\n private async instantiateFactory<T>(\n ctx: FactoryContext,\n record: FactoryRecord<T, any>,\n args: any,\n ): Promise<[undefined, T] | [Error]> {\n try {\n const tryLoad = this.injectors.wrapSyncInit(() => {\n const original = this.injectors.provideFactoryContext(ctx)\n let result = new record.target()\n this.injectors.provideFactoryContext(original)\n return result\n })\n\n let [builder, promises, injectState] = tryLoad()\n if (promises.length > 0) {\n const results = await Promise.allSettled(promises)\n if (results.some((result) => result.status === 'rejected')) {\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n const newRes = tryLoad(injectState)\n builder = newRes[0]\n promises = newRes[1]\n }\n\n if (promises.length > 0) {\n console.error(`[ServiceInstantiator] ${record.target.name} has problem with it's definition.\n\n One or more of the dependencies are registered as a InjectableScope.Instance and are used with inject.\n\n Please use asyncInject instead of inject to load those dependencies.`)\n throw new Error(\n `[ServiceInstantiator] Service ${record.target.name} cannot be instantiated.`,\n )\n }\n\n if (typeof builder.create !== 'function') {\n throw new Error(\n `[ServiceInstantiator] Factory ${record.target.name} does not implement the create method.`,\n )\n }\n\n const instance = await builder.create(ctx, args)\n return [undefined, instance]\n } catch (error) {\n return [error instanceof Error ? error : new Error(String(error))]\n }\n }\n}\n","import type { InjectableScope, InjectableType } from './enums/index.mjs'\n\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nexport enum ServiceLocatorInstanceHolderStatus {\n Created = 'created',\n Creating = 'creating',\n Destroying = 'destroying',\n Error = 'error',\n}\n\nexport type ServiceLocatorInstanceEffect = () => void\nexport type ServiceLocatorInstanceDestroyListener = () => void | Promise<void>\n\nexport interface ServiceLocatorInstanceHolderCreating<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Creating\n name: string\n instance: null\n creationPromise: Promise<[undefined, Instance]> | null\n destroyPromise: null\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderCreated<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Created\n name: string\n instance: Instance\n creationPromise: null\n destroyPromise: null\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderDestroying<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Destroying\n name: string\n instance: Instance | null\n creationPromise: null\n destroyPromise: Promise<void>\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderError {\n status: ServiceLocatorInstanceHolderStatus.Error\n name: string\n instance: Error\n creationPromise: null\n destroyPromise: null\n type: InjectableType\n scope: InjectableScope\n deps: Set<string>\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport type ServiceLocatorInstanceHolder<Instance = unknown> =\n | ServiceLocatorInstanceHolderCreating<Instance>\n | ServiceLocatorInstanceHolderCreated<Instance>\n | ServiceLocatorInstanceHolderDestroying<Instance>\n | ServiceLocatorInstanceHolderError\n","import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { InjectionToken } from './injection-token.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\n/**\n * Request context holder that manages pre-prepared instances for a specific request.\n * This allows for efficient instantiation of request-scoped services.\n */\nexport interface RequestContextHolder {\n /**\n * Unique identifier for this request context.\n */\n readonly requestId: string\n\n /**\n * Pre-prepared instances for this request, keyed by instance name.\n */\n readonly instances: Map<string, any>\n\n /**\n * Instance holders for request-scoped services.\n */\n readonly holders: Map<string, ServiceLocatorInstanceHolder>\n\n /**\n * Priority for resolution in FactoryContext.inject method.\n * Higher values take precedence.\n */\n readonly priority: number\n\n /**\n * Request-specific metadata that can be used during instantiation.\n */\n readonly metadata: Map<string, any>\n\n /**\n * Timestamp when this context was created.\n */\n readonly createdAt: number\n\n /**\n * Adds a pre-prepared instance to this context.\n */\n addInstance(\n instanceName: string,\n instance: any,\n holder: ServiceLocatorInstanceHolder,\n ): void\n\n /**\n * Adds a pre-prepared instance to this context.\n */\n addInstance(token: InjectionToken<any, undefined>, instance: any): void\n\n /**\n * Gets a pre-prepared instance from this context.\n */\n getInstance(instanceName: string): any | undefined\n\n /**\n * Gets an instance holder from this context.\n */\n getHolder(instanceName: string): ServiceLocatorInstanceHolder | undefined\n\n /**\n * Checks if this context has a pre-prepared instance.\n */\n hasInstance(instanceName: string): boolean\n\n /**\n * Clears all instances and holders from this context.\n */\n clear(): void\n\n /**\n * Gets metadata value by key.\n */\n getMetadata(key: string): any | undefined\n\n /**\n * Sets metadata value by key.\n */\n setMetadata(key: string, value: any): void\n}\n\n/**\n * Default implementation of RequestContextHolder.\n */\nexport class DefaultRequestContextHolder implements RequestContextHolder {\n public readonly instances = new Map<string, any>()\n public readonly holders = new Map<string, ServiceLocatorInstanceHolder>()\n public readonly metadata = new Map<string, any>()\n public readonly createdAt = Date.now()\n\n constructor(\n public readonly requestId: string,\n public readonly priority: number = 100,\n initialMetadata?: Record<string, any>,\n ) {\n if (initialMetadata) {\n Object.entries(initialMetadata).forEach(([key, value]) => {\n this.metadata.set(key, value)\n })\n }\n }\n\n addInstance(\n instanceName: string | InjectionToken<any, undefined>,\n instance: any,\n holder?: ServiceLocatorInstanceHolder,\n ): void {\n if (instanceName instanceof InjectionToken) {\n this.instances.set(instanceName.toString(), instance)\n this.holders.set(instanceName.toString(), {\n instance,\n status: ServiceLocatorInstanceHolderStatus.Created,\n creationPromise: null,\n destroyPromise: null,\n destroyListeners: [],\n deps: new Set(),\n name: instanceName.toString(),\n type: InjectableType.Class,\n scope: InjectableScope.Singleton,\n createdAt: Date.now(),\n ttl: Infinity,\n })\n } else {\n if (!holder) {\n throw new Error('Holder is required when adding an instance by name')\n }\n this.instances.set(instanceName, instance)\n this.holders.set(instanceName, holder)\n }\n }\n\n getInstance(instanceName: string): any | undefined {\n return this.instances.get(instanceName)\n }\n\n getHolder(instanceName: string): ServiceLocatorInstanceHolder | undefined {\n return this.holders.get(instanceName)\n }\n\n hasInstance(instanceName: string): boolean {\n return this.instances.has(instanceName)\n }\n\n clear(): void {\n this.instances.clear()\n this.holders.clear()\n this.metadata.clear()\n }\n\n getMetadata(key: string): any | undefined {\n return this.metadata.get(key)\n }\n\n setMetadata(key: string, value: any): void {\n this.metadata.set(key, value)\n }\n}\n\n/**\n * Creates a new request context holder with the given parameters.\n */\nexport function createRequestContextHolder(\n requestId: string,\n priority: number = 100,\n initialMetadata?: Record<string, any>,\n): RequestContextHolder {\n return new DefaultRequestContextHolder(requestId, priority, initialMetadata)\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\ntype ListenersMap = Map<string, Map<string, Set<Function>>>\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport class ServiceLocatorEventBus {\n private listeners: ListenersMap = new Map()\n constructor(private readonly logger: Console | null = null) {}\n\n on<Event extends string | `pre:${string}` | `post:${string}`>(\n ns: string,\n event: Event,\n listener: (event: Event) => void,\n ) {\n this.logger?.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`)\n if (!this.listeners.has(ns)) {\n this.listeners.set(ns, new Map())\n }\n\n const nsEvents = this.listeners.get(ns)!\n if (!nsEvents.has(event)) {\n nsEvents.set(event, new Set())\n }\n\n nsEvents.get(event)!.add(listener)\n\n return () => {\n nsEvents.get(event)!.delete(listener)\n if (nsEvents.get(event)?.size === 0) {\n nsEvents.delete(event)\n }\n if (nsEvents.size === 0) {\n this.listeners.delete(ns)\n }\n }\n }\n\n async emit(key: string, event: string) {\n if (!this.listeners.has(key)) {\n return\n }\n\n const events = this.listeners.get(key)!\n\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`)\n\n const res = await Promise.allSettled(\n [...(events.get(event) ?? [])!].map((listener) => listener(event)),\n ).then((results) => {\n const res = results\n .filter((result) => result.status === 'rejected')\n .map((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,\n result.reason,\n )\n return result\n })\n\n if (res.length > 0) {\n return Promise.reject(res)\n }\n return results\n })\n return res\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport {\n ErrorsEnum,\n InstanceDestroying,\n InstanceExpired,\n InstanceNotFound,\n} from './errors/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\nimport { createDeferred } from './utils/defer.mjs'\n\nexport class ServiceLocatorManager {\n private readonly instancesHolders: Map<string, ServiceLocatorInstanceHolder> =\n new Map()\n\n constructor(private readonly logger: Console | null = null) {}\n\n get(\n name: string,\n ):\n | [InstanceExpired | InstanceDestroying, ServiceLocatorInstanceHolder]\n | [InstanceNotFound]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this.instancesHolders.get(name)\n if (holder) {\n if (holder.ttl !== Infinity) {\n const now = Date.now()\n if (now - holder.createdAt > holder.ttl) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`,\n )\n return [new InstanceExpired(holder.name), holder]\n }\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`,\n )\n return [new InstanceDestroying(holder.name), holder]\n } else if (holder.status === ServiceLocatorInstanceHolderStatus.Error) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is in error state`,\n )\n return [holder.instance as InstanceNotFound, holder]\n }\n\n return [undefined, holder]\n } else {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${name} not found`,\n )\n return [new InstanceNotFound(name)]\n }\n }\n\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this.instancesHolders.set(name, holder)\n }\n\n has(\n name: string,\n ): [InstanceExpired | InstanceDestroying] | [undefined, boolean] {\n const [error, holder] = this.get(name)\n if (!error) {\n return [undefined, true]\n }\n if (\n [ErrorsEnum.InstanceExpired, ErrorsEnum.InstanceDestroying].includes(\n error.code,\n )\n ) {\n return [error]\n }\n return [undefined, !!holder]\n }\n\n delete(name: string): boolean {\n return this.instancesHolders.delete(name)\n }\n\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this.instancesHolders].filter(([key, value]) =>\n predicate(value, key),\n ),\n )\n }\n\n /**\n * Creates a new holder with Creating status and a deferred creation promise.\n * This is useful for creating placeholder holders that can be fulfilled later.\n * @param name The name of the instance\n * @param type The injectable type\n * @param scope The injectable scope\n * @param deps Optional set of dependencies\n * @param ttl Optional time-to-live in milliseconds (defaults to Infinity)\n * @returns A tuple containing the deferred promise and the holder\n */\n createCreatingHolder<Instance>(\n name: string,\n type: InjectableType,\n scope: InjectableScope,\n deps: Set<string> = new Set(),\n ttl: number = Infinity,\n ): [\n ReturnType<typeof createDeferred<[undefined, Instance]>>,\n ServiceLocatorInstanceHolder<Instance>,\n ] {\n const deferred = createDeferred<[undefined, Instance]>()\n\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n status: ServiceLocatorInstanceHolderStatus.Creating,\n name,\n instance: null,\n creationPromise: deferred.promise,\n destroyPromise: null,\n type,\n scope,\n deps,\n destroyListeners: [],\n createdAt: Date.now(),\n ttl,\n }\n\n return [deferred, holder]\n }\n\n /**\n * Creates a new holder with Created status and an actual instance.\n * This is useful for creating holders that already have their instance ready.\n * @param name The name of the instance\n * @param instance The actual instance to store\n * @param type The injectable type\n * @param scope The injectable scope\n * @param deps Optional set of dependencies\n * @param ttl Optional time-to-live in milliseconds (defaults to Infinity)\n * @returns The created holder\n */\n storeCreatedHolder<Instance>(\n name: string,\n instance: Instance,\n type: InjectableType,\n scope: InjectableScope,\n deps: Set<string> = new Set(),\n ttl: number = Infinity,\n ): ServiceLocatorInstanceHolder<Instance> {\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n status: ServiceLocatorInstanceHolderStatus.Created,\n name,\n instance,\n creationPromise: null,\n destroyPromise: null,\n type,\n scope,\n deps,\n destroyListeners: [],\n createdAt: Date.now(),\n ttl,\n }\n\n this.instancesHolders.set(name, holder)\n\n return holder\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { z, ZodObject, ZodOptional } from 'zod/v4'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n AnyInjectableType,\n BaseInjectionTokenSchemaType,\n InjectionTokenSchemaType,\n InjectionTokenType,\n OptionalInjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { RequestContextHolder } from './request-context-holder.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\nimport type { Injectors } from './utils/index.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\nimport {\n ErrorsEnum,\n FactoryNotFound,\n FactoryTokenNotResolved,\n UnknownError,\n} from './errors/index.mjs'\nimport {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport { defaultInjectors } from './injector.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { DefaultRequestContextHolder } from './request-context-holder.mjs'\nimport { ServiceInstantiator } from './service-instantiator.mjs'\nimport { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\nimport { ServiceLocatorManager } from './service-locator-manager.mjs'\nimport { getInjectableToken } from './utils/index.mjs'\n\nexport class ServiceLocator {\n private readonly eventBus: ServiceLocatorEventBus\n private readonly manager: ServiceLocatorManager\n private readonly serviceInstantiator: ServiceInstantiator\n private readonly requestContexts = new Map<string, RequestContextHolder>()\n private currentRequestContext: RequestContextHolder | null = null\n\n constructor(\n private readonly registry: Registry = globalRegistry,\n private readonly logger: Console | null = null,\n private readonly injectors: Injectors = defaultInjectors,\n ) {\n this.eventBus = new ServiceLocatorEventBus(logger)\n this.manager = new ServiceLocatorManager(logger)\n this.serviceInstantiator = new ServiceInstantiator(injectors)\n }\n\n // ============================================================================\n // PUBLIC METHODS\n // ============================================================================\n\n getEventBus() {\n return this.eventBus\n }\n\n getManager() {\n return this.manager\n }\n\n public getInstanceIdentifier(token: AnyInjectableType, args?: any): string {\n const [err, { actualToken, validatedArgs }] =\n this.validateAndResolveTokenArgs(token, args)\n if (err) {\n throw err\n }\n return this.generateInstanceName(actualToken, validatedArgs)\n }\n\n public async getInstance(\n token: AnyInjectableType,\n args?: any,\n onPrepare?: (data: {\n instanceName: string\n actualToken: InjectionTokenType\n validatedArgs?: any\n }) => void,\n ) {\n const [err, data] = await this.resolveTokenAndPrepareInstanceName(\n token,\n args,\n )\n if (err) {\n return [err]\n }\n const { instanceName, validatedArgs, actualToken, realToken } = data\n if (onPrepare) {\n onPrepare({ instanceName, actualToken, validatedArgs })\n }\n const [error, holder] = await this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n validatedArgs,\n )\n if (error) {\n return [error]\n }\n return [undefined, holder.instance]\n }\n\n public async getOrThrowInstance<Instance>(\n token: AnyInjectableType,\n args: any,\n ): Promise<Instance> {\n const [error, instance] = await this.getInstance(token, args)\n if (error) {\n throw error\n }\n return instance\n }\n\n public getSyncInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n token: AnyInjectableType,\n args: Schema extends ZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<ZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Instance | null {\n const [err, { actualToken, validatedArgs }] =\n this.validateAndResolveTokenArgs(token, args)\n if (err) {\n return null\n }\n const instanceName = this.generateInstanceName(actualToken, validatedArgs)\n if (this.currentRequestContext) {\n const requestHolder = this.currentRequestContext.getHolder(instanceName)\n if (requestHolder) {\n return requestHolder.instance as Instance\n }\n }\n const [error, holder] = this.manager.get(instanceName)\n if (error) {\n return null\n }\n return holder.instance as Instance\n }\n\n invalidate(service: string, round = 1): Promise<any> {\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`,\n )\n const toInvalidate = this.manager.filter(\n (holder) => holder.name === service || holder.deps.has(service),\n )\n const promises = []\n for (const [key, holder] of toInvalidate.entries()) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is already being destroyed`,\n )\n promises.push(holder.destroyPromise)\n continue\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`,\n )\n promises.push(\n holder.creationPromise?.then(() => {\n if (round > 3) {\n this.logger?.error(\n `[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`,\n )\n return\n }\n return this.invalidate(key, round + 1)\n }),\n )\n continue\n }\n // @ts-expect-error TS2322 we are changing the status\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`,\n )\n // @ts-expect-error TS2322 we are changing the status\n holder.destroyPromise = Promise.all(\n holder.destroyListeners.map((listener) => listener()),\n ).then(async () => {\n this.manager.delete(key)\n await this.emitInstanceEvent(key, 'destroy')\n })\n promises.push(holder.destroyPromise)\n }\n return Promise.all(promises)\n }\n\n async ready() {\n return Promise.all(\n Array.from(this.manager.filter(() => true)).map(([, holder]) => {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise?.then(() => null)\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n return holder.destroyPromise.then(() => null)\n }\n return Promise.resolve(null)\n }),\n ).then(() => null)\n }\n\n // ============================================================================\n // REQUEST CONTEXT MANAGEMENT\n // ============================================================================\n\n /**\n * Begins a new request context with the given parameters.\n * @param requestId Unique identifier for this request\n * @param metadata Optional metadata for the request\n * @param priority Priority for resolution (higher = more priority)\n * @returns The created request context holder\n */\n beginRequest(\n requestId: string,\n metadata?: Record<string, any>,\n priority: number = 100,\n ): RequestContextHolder {\n if (this.requestContexts.has(requestId)) {\n throw new Error(\n `[ServiceLocator] Request context ${requestId} already exists`,\n )\n }\n\n const contextHolder = new DefaultRequestContextHolder(\n requestId,\n priority,\n metadata,\n )\n this.requestContexts.set(requestId, contextHolder)\n this.currentRequestContext = contextHolder\n\n this.logger?.log(`[ServiceLocator] Started request context: ${requestId}`)\n return contextHolder\n }\n\n /**\n * Ends a request context and cleans up all associated instances.\n * @param requestId The request ID to end\n */\n async endRequest(requestId: string): Promise<void> {\n const contextHolder = this.requestContexts.get(requestId)\n if (!contextHolder) {\n this.logger?.warn(\n `[ServiceLocator] Request context ${requestId} not found`,\n )\n return\n }\n\n this.logger?.log(`[ServiceLocator] Ending request context: ${requestId}`)\n\n // Clean up all request-scoped instances\n const cleanupPromises: Promise<any>[] = []\n for (const [, holder] of contextHolder.holders) {\n if (holder.destroyListeners.length > 0) {\n cleanupPromises.push(\n Promise.all(holder.destroyListeners.map((listener) => listener())),\n )\n }\n }\n\n await Promise.all(cleanupPromises)\n\n // Clear the context\n contextHolder.clear()\n this.requestContexts.delete(requestId)\n\n // Reset current context if it was the one being ended\n if (this.currentRequestContext === contextHolder) {\n this.currentRequestContext =\n Array.from(this.requestContexts.values()).at(-1) ?? null\n }\n\n this.logger?.log(`[ServiceLocator] Request context ${requestId} ended`)\n }\n\n /**\n * Gets the current request context.\n * @returns The current request context holder or null\n */\n getCurrentRequestContext(): RequestContextHolder | null {\n return this.currentRequestContext\n }\n\n /**\n * Sets the current request context.\n * @param requestId The request ID to set as current\n */\n setCurrentRequestContext(requestId: string): void {\n const contextHolder = this.requestContexts.get(requestId)\n if (!contextHolder) {\n throw new Error(`[ServiceLocator] Request context ${requestId} not found`)\n }\n this.currentRequestContext = contextHolder\n }\n\n // ============================================================================\n // PRIVATE METHODS\n // ============================================================================\n\n /**\n * Validates and resolves token arguments, handling factory token resolution and validation.\n */\n private validateAndResolveTokenArgs(\n token: AnyInjectableType,\n args?: any,\n ): [\n FactoryTokenNotResolved | UnknownError | undefined,\n { actualToken: InjectionTokenType; validatedArgs?: any },\n ] {\n let actualToken = token as InjectionToken<any, any>\n if (typeof token === 'function') {\n actualToken = getInjectableToken(token)\n }\n let realArgs = args\n if (actualToken instanceof BoundInjectionToken) {\n realArgs = actualToken.value\n } else if (actualToken instanceof FactoryInjectionToken) {\n if (actualToken.resolved) {\n realArgs = actualToken.value\n } else {\n return [new FactoryTokenNotResolved(token.name), { actualToken }]\n }\n }\n if (!actualToken.schema) {\n return [undefined, { actualToken, validatedArgs: realArgs }]\n }\n const validatedArgs = actualToken.schema?.safeParse(realArgs)\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#validateAndResolveTokenArgs(): Error validating args for ${actualToken.name.toString()}`,\n validatedArgs.error,\n )\n return [new UnknownError(validatedArgs.error), { actualToken }]\n }\n return [undefined, { actualToken, validatedArgs: validatedArgs?.data }]\n }\n\n /**\n * Internal method to resolve token args and create instance name.\n * Handles factory token resolution and validation.\n */\n private async resolveTokenAndPrepareInstanceName(\n token: AnyInjectableType,\n args?: any,\n ): Promise<\n | [\n undefined,\n {\n instanceName: string\n validatedArgs: any\n actualToken: InjectionTokenType\n realToken: InjectionToken<any, any>\n },\n ]\n | [UnknownError | FactoryTokenNotResolved]\n > {\n const [err, { actualToken, validatedArgs }] =\n this.validateAndResolveTokenArgs(token, args)\n if (err instanceof UnknownError) {\n return [err]\n } else if (\n (err as any) instanceof FactoryTokenNotResolved &&\n actualToken instanceof FactoryInjectionToken\n ) {\n this.logger?.log(\n `[ServiceLocator]#resolveTokenAndPrepareInstanceName() Factory token not resolved, resolving it`,\n )\n await actualToken.resolve(this.createFactoryContext())\n return this.resolveTokenAndPrepareInstanceName(token)\n }\n const instanceName = this.generateInstanceName(actualToken, validatedArgs)\n // Determine the real token (the actual InjectionToken that will be used for resolution)\n const realToken =\n actualToken instanceof BoundInjectionToken ||\n actualToken instanceof FactoryInjectionToken\n ? actualToken.token\n : actualToken\n return [undefined, { instanceName, validatedArgs, actualToken, realToken }]\n }\n\n /**\n * Gets an instance by its instance name, handling all the logic after instance name creation.\n */\n private async retrieveOrCreateInstanceByInstanceName(\n instanceName: string,\n realToken: InjectionToken<any, any>,\n realArgs: any,\n ): Promise<\n | [undefined, ServiceLocatorInstanceHolder<any>]\n | [UnknownError | FactoryNotFound]\n > {\n // Check if this is a request-scoped service and we have a current request context\n if (this.registry.has(realToken)) {\n const record = this.registry.get(realToken)\n if (record.scope === InjectableScope.Request) {\n if (!this.currentRequestContext) {\n this.logger?.log(\n `[ServiceLocator]#retrieveOrCreateInstanceByInstanceName() No current request context available for request-scoped service ${instanceName}`,\n )\n return [new UnknownError(ErrorsEnum.InstanceNotFound)]\n }\n const requestHolder = this.currentRequestContext.getHolder(instanceName)\n if (requestHolder) {\n if (\n requestHolder.status === ServiceLocatorInstanceHolderStatus.Creating\n ) {\n await requestHolder.creationPromise\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n } else if (\n requestHolder.status ===\n ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n return [undefined, requestHolder]\n }\n }\n }\n\n const [error, holder] = this.manager.get(instanceName)\n if (!error) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n await holder.creationPromise\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n // Should never happen\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n return [undefined, holder]\n }\n switch (error.code) {\n case ErrorsEnum.InstanceDestroying:\n this.logger?.log(\n `[ServiceLocator]#retrieveOrCreateInstanceByInstanceName() TTL expired for ${holder?.name}`,\n )\n await holder?.destroyPromise\n //Maybe we already have a new instance\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n\n case ErrorsEnum.InstanceExpired:\n this.logger?.log(\n `[ServiceLocator]#retrieveOrCreateInstanceByInstanceName() TTL expired for ${holder?.name}`,\n )\n await this.invalidate(instanceName)\n //Maybe we already have a new instance\n return this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n realArgs,\n )\n case ErrorsEnum.InstanceNotFound:\n break\n default:\n return [error]\n }\n const result = await this.createNewInstance(\n instanceName,\n realToken,\n realArgs,\n )\n if (result[0]) {\n return [result[0]]\n }\n if (result[1].status === ServiceLocatorInstanceHolderStatus.Creating) {\n await result[1].creationPromise\n }\n if (result[1].status === ServiceLocatorInstanceHolderStatus.Error) {\n return [result[1].instance] as [UnknownError | FactoryNotFound]\n }\n return [undefined, result[1]]\n }\n\n /**\n * Emits events to listeners for instance lifecycle events.\n */\n private emitInstanceEvent(\n name: string,\n event: 'create' | 'destroy' = 'create',\n ) {\n this.logger?.log(\n `[ServiceLocator]#emitInstanceEvent() Notifying listeners for ${name} with event ${event}`,\n )\n return this.eventBus.emit(name, event)\n }\n\n /**\n * Creates a new instance for the given token and arguments.\n */\n private async createNewInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n instanceName: string,\n realToken: InjectionToken<Instance, Schema>,\n args: Schema extends ZodObject\n ? z.output<Schema>\n : Schema extends ZodOptional<ZodObject>\n ? z.output<Schema> | undefined\n : undefined,\n ): Promise<\n | [undefined, ServiceLocatorInstanceHolder<Instance>]\n | [FactoryNotFound | UnknownError]\n > {\n this.logger?.log(\n `[ServiceLocator]#createNewInstance() Creating instance for ${instanceName}`,\n )\n if (this.registry.has(realToken)) {\n return this.instantiateServiceFromRegistry<Instance, Schema, any>(\n instanceName,\n realToken,\n args,\n )\n } else {\n return [new FactoryNotFound(realToken.name.toString())]\n }\n }\n\n /**\n * Instantiates a service from the registry using the service instantiator.\n */\n private instantiateServiceFromRegistry<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n Args extends Schema extends BaseInjectionTokenSchemaType\n ? z.output<Schema>\n : Schema extends OptionalInjectionTokenSchemaType\n ? z.output<Schema> | undefined\n : undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Args,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<Instance>]> {\n this.logger?.log(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Creating instance for ${instanceName} from abstract factory`,\n )\n const ctx = this.createFactoryContext(\n this.currentRequestContext || undefined,\n )\n let record = this.registry.get<Instance, Schema>(token)\n let { scope, type } = record\n\n // Use createCreatingHolder from manager\n const [deferred, holder] = this.manager.createCreatingHolder<Instance>(\n instanceName,\n type,\n scope,\n ctx.deps,\n Infinity,\n )\n\n // Start the instantiation process\n this.serviceInstantiator\n .instantiateService(ctx, record, args)\n .then(async ([error, instance]) => {\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.creationPromise = null\n if (error) {\n this.logger?.error(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Error creating instance for ${instanceName}`,\n error,\n )\n holder.status = ServiceLocatorInstanceHolderStatus.Error\n holder.instance = error\n if (scope === InjectableScope.Singleton) {\n setTimeout(() => this.invalidate(instanceName), 10)\n }\n deferred.reject(error)\n } else {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n if (ctx.deps.size > 0) {\n ctx.deps.forEach((dependency) => {\n holder.destroyListeners.push(\n this.eventBus.on(dependency, 'destroy', () =>\n this.invalidate(instanceName),\n ),\n )\n })\n }\n await this.emitInstanceEvent(instanceName)\n deferred.resolve([undefined, instance])\n }\n })\n .catch((error) => {\n this.logger?.error(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Unexpected error creating instance for ${instanceName}`,\n error,\n )\n holder.status = ServiceLocatorInstanceHolderStatus.Error\n holder.instance = error\n holder.creationPromise = null\n if (scope === InjectableScope.Singleton) {\n setTimeout(() => this.invalidate(instanceName), 10)\n }\n deferred.reject(error)\n })\n\n if (scope === InjectableScope.Singleton) {\n this.logger?.debug(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Setting instance for ${instanceName}`,\n )\n this.manager.set(instanceName, holder)\n } else if (\n scope === InjectableScope.Request &&\n this.currentRequestContext\n ) {\n this.logger?.debug(\n `[ServiceLocator]#instantiateServiceFromRegistry(): Setting request-scoped instance for ${instanceName}`,\n )\n // For request-scoped services, we don't store them in the global manager\n // They will be managed by the request context holder\n this.currentRequestContext.addInstance(\n instanceName,\n holder.instance,\n holder,\n )\n }\n // @ts-expect-error TS2322 This is correct type\n return [undefined, holder]\n }\n\n /**\n * Creates a factory context for dependency injection during service instantiation.\n * @param contextHolder Optional request context holder for priority-based resolution\n */\n private createFactoryContext(\n contextHolder?: RequestContextHolder,\n ): FactoryContext & {\n getDestroyListeners: () => (() => void)[]\n deps: Set<string>\n } {\n const destroyListeners = new Set<() => void>()\n const deps = new Set<string>()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n\n function addDestroyListener(listener: () => void) {\n destroyListeners.add(listener)\n }\n\n function getDestroyListeners() {\n return Array.from(destroyListeners)\n }\n\n return {\n // @ts-expect-error This is correct type\n async inject(token, args) {\n // 1. Check RequestContextHolder first (if provided and has higher priority)\n if (contextHolder && contextHolder.priority > 0) {\n const instanceName = self.generateInstanceName(token, args)\n const prePreparedInstance = contextHolder.getInstance(instanceName)\n if (prePreparedInstance !== undefined) {\n self.logger?.debug(\n `[ServiceLocator] Using pre-prepared instance ${instanceName} from request context ${contextHolder.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n // 2. Check current request context (if different from provided contextHolder)\n if (\n self.currentRequestContext &&\n self.currentRequestContext !== contextHolder\n ) {\n const instanceName = self.generateInstanceName(token, args)\n const prePreparedInstance =\n self.currentRequestContext.getInstance(instanceName)\n if (prePreparedInstance !== undefined) {\n self.logger?.debug(\n `[ServiceLocator] Using pre-prepared instance ${instanceName} from current request context ${self.currentRequestContext.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n // 3. Fall back to normal resolution\n const [error, instance] = await self.getInstance(\n token,\n args,\n ({ instanceName }) => {\n deps.add(instanceName)\n },\n )\n if (error) {\n throw error\n }\n return instance\n },\n addDestroyListener,\n getDestroyListeners,\n locator: self,\n deps,\n }\n }\n\n /**\n * Generates a unique instance name based on token and arguments.\n */\n private generateInstanceName(token: InjectionTokenType, args: any) {\n const formattedArgs = args\n ? ':' +\n Object.entries(args ?? {})\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => {\n if (typeof value === 'function') {\n return `${key}=fn_${value.name}(${value.length})`\n }\n if (typeof value === 'symbol') {\n return `${key}=${value.toString()}`\n }\n return `${key}=${JSON.stringify(value).slice(0, 40)}`\n })\n .join(',')\n .replaceAll(/\"/g, '')\n .replaceAll(/:/g, '=')\n : ''\n return `${token.toString()}${formattedArgs}`\n }\n}\n","import type { z, ZodType } from 'zod/v4'\n\nimport type {\n BoundInjectionToken,\n ClassType,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Factorable } from './interfaces/factory.interface.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { RequestContextHolder } from './request-context-holder.mjs'\nimport type { Injectors } from './utils/index.mjs'\nimport type { Join, UnionToArray } from './utils/types.mjs'\n\nimport { Injectable } from './decorators/injectable.decorator.mjs'\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { defaultInjectors } from './injector.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { ServiceLocator } from './service-locator.mjs'\nimport { getInjectableToken } from './utils/get-injectable-token.mjs'\n\n/**\n * Container class that provides a simplified public API for dependency injection.\n * It wraps a ServiceLocator instance and provides convenient methods for getting instances.\n */\n@Injectable()\nexport class Container {\n private readonly serviceLocator: ServiceLocator\n\n constructor(\n registry: Registry = globalRegistry,\n logger: Console | null = null,\n injectors: Injectors = defaultInjectors,\n ) {\n this.serviceLocator = new ServiceLocator(registry, logger, injectors)\n this.registerSelf()\n }\n\n private registerSelf() {\n const token = getInjectableToken(Container)\n const instanceName = this.serviceLocator.getInstanceIdentifier(token)\n this.serviceLocator\n .getManager()\n .storeCreatedHolder(\n instanceName,\n this,\n InjectableType.Class,\n InjectableScope.Singleton,\n )\n }\n\n /**\n * Gets an instance from the container.\n * This method has the same type signature as the inject method from get-injectors.mts\n */\n // #1 Simple class\n get<T extends ClassType>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n // #2 Token with required Schema\n get<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n get<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? Promise<T>\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n // #4 Token with no Schema\n get<T>(token: InjectionToken<T, undefined>): Promise<T>\n get<T>(token: BoundInjectionToken<T, any>): Promise<T>\n get<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n async get(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n return this.serviceLocator.getOrThrowInstance(token, args as any)\n }\n\n /**\n * Gets the underlying ServiceLocator instance for advanced usage\n */\n getServiceLocator(): ServiceLocator {\n return this.serviceLocator\n }\n\n /**\n * Invalidates a service and its dependencies\n */\n async invalidate(service: unknown): Promise<void> {\n const holderMap = this.serviceLocator\n .getManager()\n .filter((holder) => holder.instance === service)\n if (holderMap.size === 0) {\n return\n }\n const holder = holderMap.values().next().value\n if (holder) {\n await this.serviceLocator.invalidate(holder.name)\n }\n }\n\n /**\n * Waits for all pending operations to complete\n */\n async ready(): Promise<void> {\n await this.serviceLocator.ready()\n }\n\n // ============================================================================\n // REQUEST CONTEXT MANAGEMENT\n // ============================================================================\n\n /**\n * Begins a new request context with the given parameters.\n * @param requestId Unique identifier for this request\n * @param metadata Optional metadata for the request\n * @param priority Priority for resolution (higher = more priority)\n * @returns The created request context holder\n */\n beginRequest(\n requestId: string,\n metadata?: Record<string, any>,\n priority: number = 100,\n ): RequestContextHolder {\n return this.serviceLocator.beginRequest(requestId, metadata, priority)\n }\n\n /**\n * Ends a request context and cleans up all associated instances.\n * @param requestId The request ID to end\n */\n async endRequest(requestId: string): Promise<void> {\n await this.serviceLocator.endRequest(requestId)\n }\n\n /**\n * Gets the current request context.\n * @returns The current request context holder or null\n */\n getCurrentRequestContext(): RequestContextHolder | null {\n return this.serviceLocator.getCurrentRequestContext()\n }\n\n /**\n * Sets the current request context.\n * @param requestId The request ID to set as current\n */\n setCurrentRequestContext(requestId: string): void {\n this.serviceLocator.setCurrentRequestContext(requestId)\n }\n}\n"]}
|