@navios/di 0.4.2 → 0.5.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.
Files changed (122) hide show
  1. package/README.md +211 -1
  2. package/coverage/clover.xml +1912 -1277
  3. package/coverage/coverage-final.json +37 -28
  4. package/coverage/docs/examples/basic-usage.mts.html +1 -1
  5. package/coverage/docs/examples/factory-pattern.mts.html +1 -1
  6. package/coverage/docs/examples/index.html +1 -1
  7. package/coverage/docs/examples/injection-tokens.mts.html +1 -1
  8. package/coverage/docs/examples/request-scope-example.mts.html +1 -1
  9. package/coverage/docs/examples/service-lifecycle.mts.html +1 -1
  10. package/coverage/index.html +71 -41
  11. package/coverage/lib/_tsup-dts-rollup.d.mts.html +682 -43
  12. package/coverage/lib/index.d.mts.html +7 -4
  13. package/coverage/lib/index.html +5 -5
  14. package/coverage/lib/testing/index.d.mts.html +91 -0
  15. package/coverage/lib/testing/index.html +116 -0
  16. package/coverage/src/base-instance-holder-manager.mts.html +589 -0
  17. package/coverage/src/container.mts.html +257 -74
  18. package/coverage/src/decorators/factory.decorator.mts.html +1 -1
  19. package/coverage/src/decorators/index.html +1 -1
  20. package/coverage/src/decorators/index.mts.html +1 -1
  21. package/coverage/src/decorators/injectable.decorator.mts.html +20 -20
  22. package/coverage/src/enums/index.html +1 -1
  23. package/coverage/src/enums/index.mts.html +1 -1
  24. package/coverage/src/enums/injectable-scope.enum.mts.html +1 -1
  25. package/coverage/src/enums/injectable-type.enum.mts.html +1 -1
  26. package/coverage/src/errors/di-error.mts.html +292 -0
  27. package/coverage/src/errors/errors.enum.mts.html +30 -21
  28. package/coverage/src/errors/factory-not-found.mts.html +31 -22
  29. package/coverage/src/errors/factory-token-not-resolved.mts.html +29 -26
  30. package/coverage/src/errors/index.html +56 -41
  31. package/coverage/src/errors/index.mts.html +15 -9
  32. package/coverage/src/errors/instance-destroying.mts.html +31 -22
  33. package/coverage/src/errors/instance-expired.mts.html +31 -22
  34. package/coverage/src/errors/instance-not-found.mts.html +31 -22
  35. package/coverage/src/errors/unknown-error.mts.html +31 -43
  36. package/coverage/src/event-emitter.mts.html +14 -14
  37. package/coverage/src/factory-context.mts.html +1 -1
  38. package/coverage/src/index.html +121 -46
  39. package/coverage/src/index.mts.html +7 -4
  40. package/coverage/src/injection-token.mts.html +28 -28
  41. package/coverage/src/injector.mts.html +1 -1
  42. package/coverage/src/instance-resolver.mts.html +1762 -0
  43. package/coverage/src/interfaces/factory.interface.mts.html +1 -1
  44. package/coverage/src/interfaces/index.html +1 -1
  45. package/coverage/src/interfaces/index.mts.html +1 -1
  46. package/coverage/src/interfaces/on-service-destroy.interface.mts.html +1 -1
  47. package/coverage/src/interfaces/on-service-init.interface.mts.html +1 -1
  48. package/coverage/src/registry.mts.html +28 -28
  49. package/coverage/src/request-context-holder.mts.html +183 -102
  50. package/coverage/src/request-context-manager.mts.html +532 -0
  51. package/coverage/src/service-instantiator.mts.html +49 -49
  52. package/coverage/src/service-invalidator.mts.html +1372 -0
  53. package/coverage/src/service-locator-event-bus.mts.html +48 -48
  54. package/coverage/src/service-locator-instance-holder.mts.html +2 -14
  55. package/coverage/src/service-locator-manager.mts.html +71 -335
  56. package/coverage/src/service-locator.mts.html +240 -2328
  57. package/coverage/src/symbols/index.html +1 -1
  58. package/coverage/src/symbols/index.mts.html +1 -1
  59. package/coverage/src/symbols/injectable-token.mts.html +1 -1
  60. package/coverage/src/testing/index.html +131 -0
  61. package/coverage/src/testing/index.mts.html +88 -0
  62. package/coverage/src/testing/test-container.mts.html +445 -0
  63. package/coverage/src/token-processor.mts.html +607 -0
  64. package/coverage/src/utils/defer.mts.html +28 -214
  65. package/coverage/src/utils/get-injectable-token.mts.html +7 -7
  66. package/coverage/src/utils/get-injectors.mts.html +99 -99
  67. package/coverage/src/utils/index.html +15 -15
  68. package/coverage/src/utils/index.mts.html +4 -7
  69. package/coverage/src/utils/types.mts.html +1 -1
  70. package/docs/injectable.md +51 -11
  71. package/docs/scopes.md +63 -29
  72. package/lib/_tsup-dts-rollup.d.mts +376 -213
  73. package/lib/_tsup-dts-rollup.d.ts +376 -213
  74. package/lib/{chunk-3NLYPYBY.mjs → chunk-2M576LCC.mjs} +1024 -608
  75. package/lib/chunk-2M576LCC.mjs.map +1 -0
  76. package/lib/index.d.mts +6 -4
  77. package/lib/index.d.ts +6 -4
  78. package/lib/index.js +1189 -773
  79. package/lib/index.js.map +1 -1
  80. package/lib/index.mjs +2 -2
  81. package/lib/testing/index.js +1261 -843
  82. package/lib/testing/index.js.map +1 -1
  83. package/lib/testing/index.mjs +1 -1
  84. package/package.json +4 -4
  85. package/src/__tests__/container.spec.mts +47 -13
  86. package/src/__tests__/errors.spec.mts +53 -27
  87. package/src/__tests__/injectable.spec.mts +73 -0
  88. package/src/__tests__/request-scope.spec.mts +0 -2
  89. package/src/__tests__/service-instantiator.spec.mts +1 -0
  90. package/src/__tests__/service-locator-manager.spec.mts +12 -82
  91. package/src/__tests__/service-locator.spec.mts +1009 -1
  92. package/src/__type-tests__/inject.spec-d.mts +30 -7
  93. package/src/__type-tests__/injectable.spec-d.mts +76 -37
  94. package/src/base-instance-holder-manager.mts +2 -9
  95. package/src/container.mts +61 -9
  96. package/src/decorators/injectable.decorator.mts +29 -5
  97. package/src/errors/di-error.mts +69 -0
  98. package/src/errors/index.mts +9 -7
  99. package/src/injection-token.mts +1 -0
  100. package/src/injector.mts +2 -0
  101. package/src/instance-resolver.mts +559 -0
  102. package/src/request-context-holder.mts +0 -2
  103. package/src/request-context-manager.mts +149 -0
  104. package/src/service-invalidator.mts +429 -0
  105. package/src/service-locator-event-bus.mts +1 -1
  106. package/src/service-locator-instance-holder.mts +0 -4
  107. package/src/service-locator-manager.mts +10 -40
  108. package/src/service-locator.mts +86 -782
  109. package/src/token-processor.mts +174 -0
  110. package/src/utils/get-injectors.mts +161 -24
  111. package/src/utils/index.mts +0 -1
  112. package/src/utils/types.mts +12 -8
  113. package/lib/chunk-3NLYPYBY.mjs.map +0 -1
  114. package/src/__tests__/defer.spec.mts +0 -166
  115. package/src/errors/errors.enum.mts +0 -8
  116. package/src/errors/factory-not-found.mts +0 -8
  117. package/src/errors/factory-token-not-resolved.mts +0 -10
  118. package/src/errors/instance-destroying.mts +0 -8
  119. package/src/errors/instance-expired.mts +0 -8
  120. package/src/errors/instance-not-found.mts +0 -8
  121. package/src/errors/unknown-error.mts +0 -15
  122. package/src/utils/defer.mts +0 -73
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/injection-token.mts","../../src/registry.mts","../../src/symbols/injectable-token.mts","../../src/decorators/injectable.decorator.mts","../../src/utils/get-injectors.mts","../../src/utils/get-injectable-token.mts","../../src/utils/defer.mts","../../src/injector.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/base-instance-holder-manager.mts","../../src/request-context-holder.mts","../../src/service-instantiator.mts","../../src/service-locator-event-bus.mts","../../src/service-locator-manager.mts","../../src/service-locator.mts","../../src/container.mts","../../src/testing/test-container.mts"],"names":["provideFactoryContext","asyncInject","wrapSyncInit","inject","res","instanceName","holder","_init"],"mappings":"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","file":"index.js","sourcesContent":["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 { 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","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","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 { 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 { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\nimport { createDeferred } from './utils/defer.mjs'\n\n/**\n * Abstract base class that provides common functionality for managing ServiceLocatorInstanceHolder objects.\n * This class contains shared patterns used by both RequestContextHolder and ServiceLocatorManager.\n */\nexport abstract class BaseInstanceHolderManager {\n protected readonly _holders: Map<string, ServiceLocatorInstanceHolder>\n\n constructor(protected readonly logger: Console | null = null) {\n this._holders = new Map()\n }\n\n /**\n * Protected getter for accessing the holders map from subclasses.\n */\n protected get holders(): Map<string, ServiceLocatorInstanceHolder> {\n return this._holders\n }\n\n /**\n * Abstract method to get a holder by name. Each implementation defines its own return type\n * based on their specific error handling and validation needs.\n */\n abstract get(name: string): any\n\n /**\n * Abstract method to set a holder by name. Each implementation may have different validation logic.\n */\n abstract set(name: string, holder: ServiceLocatorInstanceHolder): void\n\n /**\n * Abstract method to check if a holder exists. Each implementation may have different validation logic.\n */\n abstract has(name: string): any\n\n /**\n * Deletes a holder by name.\n * @param name The name of the holder to delete\n * @returns true if the holder was deleted, false if it didn't exist\n */\n delete(name: string): boolean {\n return this._holders.delete(name)\n }\n\n /**\n * Filters holders based on a predicate function.\n * @param predicate Function to test each holder\n * @returns A new Map containing only the holders that match the predicate\n */\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this._holders].filter(([key, value]) => predicate(value, key)),\n )\n }\n\n /**\n * Clears all holders from this manager.\n */\n clear(): void {\n this._holders.clear()\n }\n\n /**\n * Gets the number of holders currently managed.\n */\n size(): number {\n return this._holders.size\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 protected createCreatedHolder<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 return holder\n }\n\n /**\n * Gets all holder names currently managed.\n */\n getAllNames(): string[] {\n return Array.from(this._holders.keys())\n }\n\n /**\n * Gets all holders currently managed.\n */\n getAllHolders(): ServiceLocatorInstanceHolder[] {\n return Array.from(this._holders.values())\n }\n\n /**\n * Checks if this manager has any holders.\n */\n isEmpty(): boolean {\n return this._holders.size === 0\n }\n}\n","import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { BaseInstanceHolderManager } from './base-instance-holder-manager.mjs'\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 * 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 an instance holder from this context.\n */\n get(instanceName: string): ServiceLocatorInstanceHolder | undefined\n\n /**\n * Checks if this context has a pre-prepared instance.\n */\n has(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 // Methods inherited from BaseInstanceHolderManager\n /**\n * Filters holders based on a predicate function.\n */\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder>\n\n /**\n * Deletes a holder by name.\n */\n delete(name: string): boolean\n\n /**\n * Gets the number of holders currently managed.\n */\n size(): number\n\n /**\n * Checks if this manager has any holders.\n */\n isEmpty(): boolean\n}\n\n/**\n * Default implementation of RequestContextHolder.\n */\nexport class DefaultRequestContextHolder\n extends BaseInstanceHolderManager\n implements RequestContextHolder\n{\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 super(null) // RequestContextHolder doesn't need logging\n if (initialMetadata) {\n Object.entries(initialMetadata).forEach(([key, value]) => {\n this.metadata.set(key, value)\n })\n }\n }\n\n /**\n * Public getter for holders to maintain interface compatibility.\n */\n get holders(): Map<string, ServiceLocatorInstanceHolder> {\n return this._holders\n }\n\n /**\n * Gets a holder by name. For RequestContextHolder, this is a simple lookup.\n */\n get(name: string): ServiceLocatorInstanceHolder | undefined {\n return this._holders.get(name)\n }\n\n /**\n * Sets a holder by name.\n */\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this._holders.set(name, holder)\n }\n\n /**\n * Checks if a holder exists by name.\n */\n has(name: string): boolean {\n return this._holders.has(name)\n }\n\n addInstance(\n instanceName: string | InjectionToken<any, undefined>,\n instance: any,\n holder?: ServiceLocatorInstanceHolder,\n ): void {\n if (instanceName instanceof InjectionToken) {\n const name = instanceName.toString()\n const createdHolder = this.createCreatedHolder(\n name,\n instance,\n InjectableType.Class,\n InjectableScope.Singleton,\n new Set(),\n Infinity,\n )\n this._holders.set(name, createdHolder)\n } else {\n if (!holder) {\n throw new Error('Holder is required when adding an instance by name')\n }\n this._holders.set(instanceName, holder)\n }\n }\n\n clear(): void {\n super.clear() // Use the base class clear method for holders\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","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","/* 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 { BaseInstanceHolderManager } from './base-instance-holder-manager.mjs'\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'\n\nexport class ServiceLocatorManager extends BaseInstanceHolderManager {\n constructor(logger: Console | null = null) {\n super(logger)\n }\n\n get(\n name: string,\n ):\n | [InstanceExpired | InstanceDestroying, ServiceLocatorInstanceHolder]\n | [InstanceNotFound]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this._holders.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._holders.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 and filter methods are inherited from BaseInstanceHolderManager\n\n // createCreatingHolder method is inherited from BaseInstanceHolderManager\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 = this.createCreatedHolder(\n name,\n instance,\n type,\n scope,\n deps,\n ttl,\n )\n\n this._holders.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\n const { instanceName, validatedArgs, actualToken, realToken } = data\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\n // Try request context first\n if (this.currentRequestContext) {\n const requestHolder = this.currentRequestContext.get(instanceName)\n if (requestHolder) {\n return requestHolder.instance as Instance\n }\n }\n\n // Try singleton manager\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] Starting invalidation process for ${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 promises.push(this.invalidateHolder(key, holder, round))\n }\n return Promise.all(promises)\n }\n\n /**\n * Invalidates a single holder based on its current status.\n */\n private async invalidateHolder(\n key: string,\n holder: ServiceLocatorInstanceHolder<any>,\n round: number,\n ): Promise<void> {\n switch (holder.status) {\n case ServiceLocatorInstanceHolderStatus.Destroying:\n this.logger?.trace(`[ServiceLocator] ${key} is already being destroyed`)\n await holder.destroyPromise\n break\n\n case ServiceLocatorInstanceHolderStatus.Creating:\n this.logger?.trace(\n `[ServiceLocator] ${key} is being created, waiting...`,\n )\n await holder.creationPromise\n if (round > 3) {\n this.logger?.error(\n `[ServiceLocator] ${key} creation triggered too many invalidation rounds`,\n )\n return\n }\n await this.invalidate(key, round + 1)\n break\n\n default:\n await this.destroyHolder(key, holder)\n break\n }\n }\n\n /**\n * Destroys a holder and cleans up its resources.\n */\n private async destroyHolder(\n key: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ): Promise<void> {\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(\n `[ServiceLocator] Invalidating ${key} and notifying listeners`,\n )\n\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\n await holder.destroyPromise\n }\n\n async ready() {\n const holders = Array.from(this.manager.filter(() => true)).map(\n ([, holder]) => holder,\n )\n await Promise.all(\n holders.map((holder) => this.waitForHolderToSettle(holder)),\n )\n }\n\n /**\n * Waits for a holder to settle (either created, destroyed, or error state).\n */\n private async waitForHolderToSettle(\n holder: ServiceLocatorInstanceHolder<any>,\n ): Promise<void> {\n switch (holder.status) {\n case ServiceLocatorInstanceHolderStatus.Creating:\n await holder.creationPromise\n break\n case ServiceLocatorInstanceHolderStatus.Destroying:\n await holder.destroyPromise\n break\n // Already settled states\n case ServiceLocatorInstanceHolderStatus.Created:\n case ServiceLocatorInstanceHolderStatus.Error:\n break\n }\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 // Try to get existing instance (handles both request-scoped and singleton)\n const existingHolder = await this.tryGetExistingInstance(\n instanceName,\n realToken,\n )\n if (existingHolder) {\n return existingHolder\n }\n\n // No existing instance found, create a new one\n const result = await this.createNewInstance(\n instanceName,\n realToken,\n realArgs,\n )\n if (result[0]) {\n return [result[0]]\n }\n\n const [, holder] = result\n return this.waitForInstanceReady(holder)\n }\n\n /**\n * Attempts to retrieve an existing instance, handling request-scoped and singleton instances.\n * Returns null if no instance exists and a new one should be created.\n */\n private async tryGetExistingInstance(\n instanceName: string,\n realToken: InjectionToken<any, any>,\n ): Promise<\n [undefined, ServiceLocatorInstanceHolder<any>] | [UnknownError] | null\n > {\n // Check request-scoped instances first\n const requestResult = await this.tryGetRequestScopedInstance(\n instanceName,\n realToken,\n )\n if (requestResult) {\n return requestResult\n }\n\n // Check singleton instances\n return this.tryGetSingletonInstance(instanceName)\n }\n\n /**\n * Attempts to get a request-scoped instance if applicable.\n */\n private async tryGetRequestScopedInstance(\n instanceName: string,\n realToken: InjectionToken<any, any>,\n ): Promise<\n [undefined, ServiceLocatorInstanceHolder<any>] | [UnknownError] | null\n > {\n if (!this.registry.has(realToken)) {\n return null\n }\n\n const record = this.registry.get(realToken)\n if (record.scope !== InjectableScope.Request) {\n return null\n }\n\n if (!this.currentRequestContext) {\n this.logger?.log(\n `[ServiceLocator] No current request context available for request-scoped service ${instanceName}`,\n )\n return [new UnknownError(ErrorsEnum.InstanceNotFound)]\n }\n\n const requestHolder = this.currentRequestContext.get(instanceName)\n if (!requestHolder) {\n return null\n }\n\n return this.waitForInstanceReady(requestHolder)\n }\n\n /**\n * Attempts to get a singleton instance from the manager.\n */\n private async tryGetSingletonInstance(\n instanceName: string,\n ): Promise<\n [undefined, ServiceLocatorInstanceHolder<any>] | [UnknownError] | null\n > {\n const [error, holder] = this.manager.get(instanceName)\n\n if (!error) {\n return this.waitForInstanceReady(holder)\n }\n\n // Handle recovery scenarios\n switch (error.code) {\n case ErrorsEnum.InstanceDestroying:\n this.logger?.log(\n `[ServiceLocator] Instance ${instanceName} is being destroyed, waiting...`,\n )\n await holder?.destroyPromise\n // Retry after destruction is complete\n return this.tryGetSingletonInstance(instanceName)\n\n case ErrorsEnum.InstanceExpired:\n this.logger?.log(\n `[ServiceLocator] Instance ${instanceName} expired, invalidating...`,\n )\n await this.invalidate(instanceName)\n // Retry after invalidation\n return this.tryGetSingletonInstance(instanceName)\n\n case ErrorsEnum.InstanceNotFound:\n return null // Instance doesn't exist, should create new one\n\n default:\n return [error]\n }\n }\n\n /**\n * Waits for an instance holder to be ready and returns the appropriate result.\n */\n private async waitForInstanceReady<T>(\n holder: ServiceLocatorInstanceHolder<T>,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<T>] | [UnknownError]> {\n switch (holder.status) {\n case ServiceLocatorInstanceHolderStatus.Creating:\n await holder.creationPromise\n return this.waitForInstanceReady(holder)\n\n case ServiceLocatorInstanceHolderStatus.Destroying:\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n\n case ServiceLocatorInstanceHolderStatus.Error:\n return [holder.instance as UnknownError]\n\n case ServiceLocatorInstanceHolderStatus.Created:\n return [undefined, holder]\n\n default:\n return [new UnknownError(ErrorsEnum.InstanceNotFound)]\n }\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 await this.handleInstantiationResult(\n instanceName,\n holder,\n ctx,\n deferred,\n scope,\n error,\n instance,\n )\n })\n .catch(async (error) => {\n await this.handleInstantiationError(\n instanceName,\n holder,\n deferred,\n scope,\n error,\n )\n })\n\n this.storeInstanceByScope(scope, instanceName, holder)\n // @ts-expect-error TS2322 This is correct type\n return [undefined, holder]\n }\n\n /**\n * Handles the result of service instantiation.\n */\n private async handleInstantiationResult(\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ctx: any,\n deferred: any,\n scope: InjectableScope,\n error: any,\n instance: any,\n ): Promise<void> {\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.creationPromise = null\n\n if (error) {\n await this.handleInstantiationError(\n instanceName,\n holder,\n deferred,\n scope,\n error,\n )\n } else {\n await this.handleInstantiationSuccess(\n instanceName,\n holder,\n ctx,\n deferred,\n instance,\n )\n }\n }\n\n /**\n * Handles successful service instantiation.\n */\n private async handleInstantiationSuccess(\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ctx: any,\n deferred: any,\n instance: any,\n ): Promise<void> {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n\n // Set up dependency invalidation listeners\n if (ctx.deps.size > 0) {\n ctx.deps.forEach((dependency: string) => {\n holder.destroyListeners.push(\n this.eventBus.on(dependency, 'destroy', () =>\n this.invalidate(instanceName),\n ),\n )\n })\n }\n\n await this.emitInstanceEvent(instanceName)\n deferred.resolve([undefined, instance])\n }\n\n /**\n * Handles service instantiation errors.\n */\n private async handleInstantiationError(\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n deferred: any,\n scope: InjectableScope,\n error: any,\n ): Promise<void> {\n this.logger?.error(\n `[ServiceLocator] Error creating instance for ${instanceName}`,\n error,\n )\n\n holder.status = ServiceLocatorInstanceHolderStatus.Error\n holder.instance = error\n holder.creationPromise = null\n\n if (scope === InjectableScope.Singleton) {\n setTimeout(() => this.invalidate(instanceName), 10)\n }\n\n deferred.reject(error)\n }\n\n /**\n * Stores an instance holder based on its scope.\n */\n private storeInstanceByScope(\n scope: InjectableScope,\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ): void {\n switch (scope) {\n case InjectableScope.Singleton:\n this.logger?.debug(\n `[ServiceLocator] Setting singleton instance for ${instanceName}`,\n )\n this.manager.set(instanceName, holder)\n break\n\n case InjectableScope.Request:\n if (this.currentRequestContext) {\n this.logger?.debug(\n `[ServiceLocator] Setting request-scoped instance for ${instanceName}`,\n )\n this.currentRequestContext.addInstance(\n instanceName,\n holder.instance,\n holder,\n )\n }\n break\n\n case InjectableScope.Transient:\n // Transient instances are not stored anywhere\n break\n }\n }\n\n /**\n * Tries to get a pre-prepared instance from request contexts.\n */\n private tryGetPrePreparedInstance(\n instanceName: string,\n contextHolder: RequestContextHolder | undefined,\n deps: Set<string>,\n ): any {\n // Check provided context holder first (if has higher priority)\n if (contextHolder && contextHolder.priority > 0) {\n const prePreparedInstance = contextHolder.get(instanceName)?.instance\n if (prePreparedInstance !== undefined) {\n this.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 // Check current request context (if different from provided contextHolder)\n if (\n this.currentRequestContext &&\n this.currentRequestContext !== contextHolder\n ) {\n const prePreparedInstance =\n this.currentRequestContext.get(instanceName)?.instance\n if (prePreparedInstance !== undefined) {\n this.logger?.debug(\n `[ServiceLocator] Using pre-prepared instance ${instanceName} from current request context ${this.currentRequestContext.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n return undefined\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 const instanceName = self.generateInstanceName(token, args)\n\n // Check request contexts for pre-prepared instances\n const prePreparedInstance = self.tryGetPrePreparedInstance(\n instanceName,\n contextHolder,\n deps,\n )\n if (prePreparedInstance !== undefined) {\n return prePreparedInstance\n }\n\n // 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 if (!args) {\n return token.toString()\n }\n\n const formattedArgs = Object.entries(args)\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => `${key}=${this.formatArgValue(value)}`)\n .join(',')\n\n return `${token.toString()}:${formattedArgs.replaceAll(/\"/g, '').replaceAll(/:/g, '=')}`\n }\n\n /**\n * Formats a single argument value for instance name generation.\n */\n private formatArgValue(value: any): string {\n if (typeof value === 'function') {\n return `fn_${value.name}(${value.length})`\n }\n if (typeof value === 'symbol') {\n return value.toString()\n }\n return JSON.stringify(value).slice(0, 40)\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 protected readonly registry: Registry = globalRegistry,\n protected readonly logger: Console | null = null,\n protected readonly 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 /**\n * Clears all instances and bindings from the container.\n * This is useful for testing or resetting the container state.\n */\n clear(): void {\n this.serviceLocator.getManager().clear()\n }\n}\n","import type { ClassType, InjectionToken } from '../injection-token.mjs'\nimport type { Registry } from '../registry.mjs'\nimport type { Injectors } from '../utils/index.mjs'\n\nimport { Container } from '../container.mjs'\nimport { Injectable } from '../decorators/injectable.decorator.mjs'\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { getInjectableToken } from '../utils/index.mjs'\n\n/**\n * A binding builder for the TestContainer that allows chaining binding operations.\n */\nexport class TestBindingBuilder<T> {\n constructor(\n private readonly container: TestContainer,\n private readonly token: InjectionToken<T, any>,\n ) {}\n\n /**\n * Binds the token to a specific value.\n * This is useful for testing with mock values or constants.\n * @param value The value to bind to the token\n */\n toValue(value: T): TestContainer {\n const instanceName = this.container\n .getServiceLocator()\n .getInstanceIdentifier(this.token)\n this.container\n .getServiceLocator()\n .getManager()\n .storeCreatedHolder(\n instanceName,\n value,\n InjectableType.Class,\n InjectableScope.Singleton,\n )\n return this.container\n }\n\n /**\n * Binds the token to a class constructor.\n * @param target The class constructor to bind to\n */\n toClass(target: ClassType): TestContainer {\n this.container['registry'].set(\n this.token,\n InjectableScope.Singleton,\n target,\n InjectableType.Class,\n )\n return this.container\n }\n}\n\n/**\n * TestContainer extends the base Container with additional methods useful for testing.\n * It provides a simplified API for binding values and classes during test setup.\n */\n@Injectable()\nexport class TestContainer extends Container {\n constructor(\n registry: Registry = globalRegistry,\n logger: Console | null = null,\n injectors: Injectors = undefined as any,\n ) {\n super(registry, logger, injectors)\n }\n\n /**\n * Creates a binding builder for the given token.\n * This allows chaining binding operations like bind(Token).toValue(value).\n * @param token The injection token to bind\n * @returns A TestBindingBuilder for chaining binding operations\n */\n bind<T>(token: ClassType): TestBindingBuilder<T>\n bind<T>(token: InjectionToken<T, any>): TestBindingBuilder<T>\n bind(token: any): TestBindingBuilder<any> {\n let realToken = token\n if (typeof token === 'function') {\n realToken = getInjectableToken(token)\n }\n return new TestBindingBuilder(this, realToken)\n }\n\n /**\n * Binds a value directly to a token.\n * This is a convenience method equivalent to bind(token).toValue(value).\n * @param token The injection token to bind\n * @param value The value to bind to the token\n * @returns The TestContainer instance for chaining\n */\n bindValue<T>(token: ClassType, value: T): TestContainer\n bindValue<T>(token: InjectionToken<T, any>, value: T): TestContainer\n bindValue(token: any, value: any): TestContainer {\n return this.bind(token).toValue(value)\n }\n\n /**\n * Binds a class to a token.\n * This is a convenience method equivalent to bind(token).toClass(target).\n * @param token The injection token to bind\n * @param target The class constructor to bind to\n * @returns The TestContainer instance for chaining\n */\n bindClass(token: ClassType, target: ClassType): TestContainer\n bindClass<T>(token: InjectionToken<T, any>, target: ClassType): TestContainer\n bindClass(token: any, target: any): TestContainer {\n return this.bind(token).toClass(target)\n }\n\n /**\n * Creates a new TestContainer instance with the same configuration.\n * This is useful for creating isolated test containers.\n * @returns A new TestContainer instance\n */\n createChild(): TestContainer {\n return new TestContainer(this.registry, this.logger, this.injectors)\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/injection-token.mts","../../src/registry.mts","../../src/symbols/injectable-token.mts","../../src/decorators/injectable.decorator.mts","../../src/utils/get-injectors.mts","../../src/utils/get-injectable-token.mts","../../src/injector.mts","../../src/errors/di-error.mts","../../src/instance-resolver.mts","../../src/base-instance-holder-manager.mts","../../src/request-context-holder.mts","../../src/request-context-manager.mts","../../src/service-instantiator.mts","../../src/service-invalidator.mts","../../src/service-locator-event-bus.mts","../../src/service-locator-manager.mts","../../src/token-processor.mts","../../src/service-locator.mts","../../src/container.mts","../../src/testing/test-container.mts"],"names":["provideFactoryContext","request","asyncInject","wrapSyncInit","inject","optional","res","_init"],"mappings":"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","file":"index.js","sourcesContent":["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 ClassTypeWithoutArguments = new () => 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 { z, ZodObject } from 'zod/v4'\n\nimport type {\n BaseInjectionTokenSchemaType,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithInstance,\n ClassTypeWithInstanceAndArgument,\n ClassTypeWithInstanceAndOptionalArgument,\n ClassTypeWithOptionalArgument,\n ClassTypeWithoutArguments,\n InjectionTokenSchemaType,\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 schema?: InjectionTokenSchemaType\n registry?: Registry\n}\n// #1 Simple constructorless class\nexport function Injectable(): <T extends ClassTypeWithoutArguments>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n scope?: InjectableScope\n registry: Registry\n}): <T extends ClassTypeWithoutArguments>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n scope: InjectableScope\n}): <T extends ClassTypeWithoutArguments>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n// #2 Class with schema\nexport function Injectable<Schema extends InjectionTokenSchemaType>(options: {\n scope?: InjectableScope\n schema: Schema\n registry?: Registry\n}): <T extends ClassTypeWithArgument<z.output<Schema>>>(\n target: T,\n context?: ClassDecoratorContext,\n) => 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 schema,\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 if (schema && token) {\n throw new Error(\n '[ServiceLocator] @Injectable decorator cannot have both a token and a schema',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target, schema as InjectionTokenSchemaType)\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","import type { z, ZodObject, ZodType } from 'zod/v4'\n\nimport type { FactoryContext } from '../factory-context.mjs'\nimport type {\n BoundInjectionToken,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithoutArguments,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type {\n Factorable,\n FactorableWithArgs,\n} from '../interfaces/factory.interface.mjs'\nimport type {\n InjectRequest,\n InjectState,\n Join,\n UnionToArray,\n} from './types.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface Injectors {\n // #1 Simple class\n asyncInject<T extends ClassTypeWithoutArguments>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n asyncInject<Args, T extends ClassTypeWithArgument<Args>>(\n token: T,\n args: Args,\n ): Promise<InstanceType<T>>\n asyncInject<\n Schema extends InjectionTokenSchemaType,\n R,\n T extends FactorableWithArgs<R, Schema>,\n >(\n token: T,\n args: z.input<Schema>,\n ): Promise<R>\n\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 ClassTypeWithoutArguments>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>\n inject<Args, T extends ClassTypeWithArgument<Args>>(\n token: T,\n args: Args,\n ): InstanceType<T>\n inject<\n Schema extends InjectionTokenSchemaType,\n R,\n T extends FactorableWithArgs<R, Schema>,\n >(\n token: T,\n args: z.input<Schema>,\n ): R\n\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 /**\n * Optional injection that returns null if the service fails to initialize\n * or is not available. This is useful when you want to inject a service\n * that may not be configured or may fail gracefully.\n *\n * @example\n * ```ts\n * class MyService {\n * constructor() {\n * const optionalService = optional(OptionalServiceToken)\n * // optionalService will be null if initialization fails\n * if (optionalService) {\n * optionalService.doSomething()\n * }\n * }\n * }\n * ```\n */\n optional<T extends ClassType>(\n token: T,\n ): (InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>) | null\n optional<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T | null\n optional<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? T | null\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 optional<T>(token: InjectionToken<T, undefined>): T | null\n optional<T>(token: BoundInjectionToken<T, any>): T | null\n optional<T>(token: FactoryInjectionToken<T, any>): T | null\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 getRequest(token: InjectionToken<any>, args?: unknown) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to make a request 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\n }\n let result: any = null\n let error: Error | null = null\n const promise = getFactoryContext()\n .inject(token as any, args as any)\n .then((r) => {\n result = r\n return r\n })\n .catch((e) => {\n // We don't throw here because we have a mechanism to handle errors\n error = e\n })\n const request: InjectRequest = {\n token,\n promise,\n get result() {\n return result\n },\n get error() {\n return error\n },\n }\n injectState.requests.push(request)\n injectState.currentIndex++\n\n return request\n }\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 // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n const request = getRequest(realToken, args)\n return request.promise.then((result) => {\n if (request.error) {\n // We throw here because we want to fail the asyncInject call if the dependency fails to initialize\n throw request.error\n }\n return result\n })\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 if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n\n const instance = getFactoryContext().locator.getSyncInstance(\n realToken,\n args,\n )\n if (!instance) {\n const request = getRequest(realToken, args)\n if (request.error) {\n throw request.error\n } else if (request.result) {\n return request.result\n }\n if (promiseCollector) {\n promiseCollector(request.promise)\n }\n // Return a dynamic proxy that looks up the instance when accessed\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please move the code to a onServiceInit method`,\n )\n },\n },\n ) as unknown as T\n }\n return instance as unknown as T\n }\n\n function optional<\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 | null {\n try {\n return inject(token, args)\n } catch {\n // If injection fails, return null instead of throwing\n return null\n }\n }\n\n const injectors: Injectors = {\n asyncInject,\n inject,\n optional,\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","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 optional: Injectors['optional'] = defaultInjectors.optional\n\nexport const wrapSyncInit: Injectors['wrapSyncInit'] =\n defaultInjectors.wrapSyncInit\n\nexport const provideFactoryContext: Injectors['provideFactoryContext'] =\n defaultInjectors.provideFactoryContext\n","export enum DIErrorCode {\n FactoryNotFound = 'FactoryNotFound',\n FactoryTokenNotResolved = 'FactoryTokenNotResolved',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n UnknownError = 'UnknownError',\n}\n\nexport class DIError extends Error {\n public readonly code: DIErrorCode\n public readonly context?: Record<string, unknown>\n\n constructor(\n code: DIErrorCode,\n message: string,\n context?: Record<string, unknown>,\n ) {\n super(message)\n this.name = 'DIError'\n this.code = code\n this.context = context\n }\n\n // Static factory methods for common error types\n static factoryNotFound(name: string): DIError {\n return new DIError(\n DIErrorCode.FactoryNotFound,\n `Factory ${name} not found`,\n { name },\n )\n }\n\n static factoryTokenNotResolved(token: string | symbol | unknown): DIError {\n return new DIError(\n DIErrorCode.FactoryTokenNotResolved,\n `Factory token not resolved: ${token?.toString() ?? 'unknown'}`,\n { token },\n )\n }\n\n static instanceNotFound(name: string): DIError {\n return new DIError(\n DIErrorCode.InstanceNotFound,\n `Instance ${name} not found`,\n { name },\n )\n }\n\n static instanceDestroying(name: string): DIError {\n return new DIError(\n DIErrorCode.InstanceDestroying,\n `Instance ${name} destroying`,\n { name },\n )\n }\n\n static unknown(\n message: string | Error,\n context?: Record<string, unknown>,\n ): DIError {\n if (message instanceof Error) {\n return new DIError(DIErrorCode.UnknownError, message.message, {\n ...context,\n parent: message,\n })\n }\n return new DIError(DIErrorCode.UnknownError, message, context)\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 { ServiceInstantiator } from './service-instantiator.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\nimport type { ServiceLocatorManager } from './service-locator-manager.mjs'\nimport type { ServiceLocator } from './service-locator.mjs'\nimport type { TokenProcessor } from './token-processor.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\nimport { DIError, DIErrorCode } from './errors/index.mjs'\nimport {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\n/**\n * InstanceResolver handles instance resolution, creation, and lifecycle management.\n * Extracted from ServiceLocator to improve separation of concerns.\n */\nexport class InstanceResolver {\n constructor(\n private readonly registry: Registry,\n private readonly manager: ServiceLocatorManager,\n private readonly serviceInstantiator: ServiceInstantiator,\n private readonly tokenProcessor: TokenProcessor,\n private readonly logger: Console | null = null,\n private readonly serviceLocator: ServiceLocator,\n ) {}\n\n /**\n * Resolves an instance for the given token and arguments.\n */\n async resolveInstance(\n token: AnyInjectableType,\n args?: any,\n requestContext?: RequestContextHolder,\n ): Promise<[undefined, any] | [DIError]> {\n const [err, data] = await this.resolveTokenAndPrepareInstanceName(\n token,\n args,\n )\n if (err) {\n return [err]\n }\n\n const {\n instanceName,\n validatedArgs,\n actualToken: _actualToken,\n realToken,\n } = data\n\n const [error, holder] = await this.retrieveOrCreateInstanceByInstanceName(\n instanceName,\n realToken,\n validatedArgs,\n requestContext,\n )\n if (error) {\n return [error]\n }\n return [undefined, holder.instance]\n }\n\n /**\n * Gets a synchronous instance (for sync operations).\n */\n 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 currentRequestContext: RequestContextHolder | null,\n ): Instance | null {\n const [err, { actualToken, validatedArgs }] =\n this.tokenProcessor.validateAndResolveTokenArgs(token, args)\n if (err) {\n return null\n }\n const instanceName = this.tokenProcessor.generateInstanceName(\n actualToken,\n validatedArgs,\n )\n\n // Try request context first\n if (currentRequestContext) {\n const requestHolder = currentRequestContext.get(instanceName)\n if (requestHolder) {\n return requestHolder.instance as Instance\n }\n }\n\n // Try singleton manager\n const [error, holder] = this.manager.get(instanceName)\n if (error) {\n return null\n }\n return holder.instance as Instance\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 | [DIError]\n > {\n const [err, { actualToken, validatedArgs }] =\n this.tokenProcessor.validateAndResolveTokenArgs(token, args)\n if (err instanceof DIError && err.code === DIErrorCode.UnknownError) {\n return [err]\n } else if (\n err instanceof DIError &&\n err.code === DIErrorCode.FactoryTokenNotResolved &&\n actualToken instanceof FactoryInjectionToken\n ) {\n this.logger?.log(\n `[InstanceResolver]#resolveTokenAndPrepareInstanceName() Factory token not resolved, resolving it`,\n )\n await actualToken.resolve(this.createFactoryContext())\n return this.resolveTokenAndPrepareInstanceName(token)\n }\n const instanceName = this.tokenProcessor.generateInstanceName(\n actualToken,\n validatedArgs,\n )\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 requestContext?: RequestContextHolder,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<any>] | [DIError]> {\n // Try to get existing instance (handles both request-scoped and singleton)\n const existingHolder = await this.tryGetExistingInstance(\n instanceName,\n realToken,\n requestContext,\n )\n if (existingHolder) {\n return existingHolder\n }\n\n // No existing instance found, create a new one\n const result = await this.createNewInstance(\n instanceName,\n realToken,\n realArgs,\n requestContext,\n )\n if (result[0]) {\n return [result[0]]\n }\n\n const [, holder] = result\n return this.waitForInstanceReady(holder)\n }\n\n /**\n * Attempts to retrieve an existing instance, handling request-scoped and singleton instances.\n * Returns null if no instance exists and a new one should be created.\n */\n private async tryGetExistingInstance(\n instanceName: string,\n realToken: InjectionToken<any, any>,\n requestContext?: RequestContextHolder,\n ): Promise<\n [undefined, ServiceLocatorInstanceHolder<any>] | [DIError] | null\n > {\n // Check request-scoped instances first\n const requestResult = await this.tryGetRequestScopedInstance(\n instanceName,\n realToken,\n requestContext,\n )\n if (requestResult) {\n return requestResult\n }\n\n // Check singleton instances\n return this.tryGetSingletonInstance(instanceName)\n }\n\n /**\n * Attempts to get a request-scoped instance if applicable.\n */\n private async tryGetRequestScopedInstance(\n instanceName: string,\n realToken: InjectionToken<any, any>,\n requestContext?: RequestContextHolder,\n ): Promise<\n [undefined, ServiceLocatorInstanceHolder<any>] | [DIError] | null\n > {\n if (!this.registry.has(realToken)) {\n return null\n }\n\n const record = this.registry.get(realToken)\n if (record.scope !== InjectableScope.Request) {\n return null\n }\n\n if (!requestContext) {\n this.logger?.log(\n `[InstanceResolver] No current request context available for request-scoped service ${instanceName}`,\n )\n return [\n DIError.unknown(\n `No current request context available for request-scoped service ${instanceName}`,\n ),\n ]\n }\n\n const requestHolder = requestContext.get(instanceName)\n if (!requestHolder) {\n return null\n }\n\n return this.waitForInstanceReady(requestHolder)\n }\n\n /**\n * Attempts to get a singleton instance from the manager.\n */\n private async tryGetSingletonInstance(\n instanceName: string,\n ): Promise<\n [undefined, ServiceLocatorInstanceHolder<any>] | [DIError] | null\n > {\n const [error, holder] = this.manager.get(instanceName)\n\n if (!error) {\n return this.waitForInstanceReady(holder)\n }\n\n // Handle recovery scenarios\n switch (error.code) {\n case DIErrorCode.InstanceDestroying:\n this.logger?.log(\n `[InstanceResolver] Instance ${instanceName} is being destroyed, waiting...`,\n )\n await holder?.destroyPromise\n // Retry after destruction is complete\n return this.tryGetSingletonInstance(instanceName)\n\n case DIErrorCode.InstanceNotFound:\n return null // Instance doesn't exist, should create new one\n\n default:\n return [error]\n }\n }\n\n /**\n * Waits for an instance holder to be ready and returns the appropriate result.\n */\n private async waitForInstanceReady<T>(\n holder: ServiceLocatorInstanceHolder<T>,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<T>] | [DIError]> {\n switch (holder.status) {\n case ServiceLocatorInstanceHolderStatus.Creating:\n await holder.creationPromise\n return this.waitForInstanceReady(holder)\n\n case ServiceLocatorInstanceHolderStatus.Destroying:\n return [DIError.instanceDestroying(holder.name)]\n\n case ServiceLocatorInstanceHolderStatus.Error:\n return [holder.instance as DIError]\n\n case ServiceLocatorInstanceHolderStatus.Created:\n return [undefined, holder]\n\n default:\n return [DIError.instanceNotFound('unknown')]\n }\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 requestContext?: RequestContextHolder,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<Instance>] | [DIError]> {\n this.logger?.log(\n `[InstanceResolver]#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 requestContext,\n )\n } else {\n return [DIError.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 requestContext?: RequestContextHolder,\n ): Promise<[undefined, ServiceLocatorInstanceHolder<Instance>]> {\n this.logger?.log(\n `[InstanceResolver]#instantiateServiceFromRegistry(): Creating instance for ${instanceName} from abstract factory`,\n )\n const ctx = this.createFactoryContext()\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 )\n\n // Start the instantiation process\n this.serviceInstantiator\n .instantiateService(ctx, record, args)\n .then(async ([error, instance]) => {\n await this.handleInstantiationResult(\n instanceName,\n holder,\n ctx,\n deferred,\n scope,\n error,\n instance,\n requestContext,\n )\n })\n .catch(async (error) => {\n await this.handleInstantiationError(\n instanceName,\n holder,\n deferred,\n scope,\n error,\n )\n })\n\n this.storeInstanceByScope(scope, instanceName, holder, requestContext)\n // @ts-expect-error TS2322 This is correct type\n return [undefined, holder]\n }\n\n /**\n * Handles the result of service instantiation.\n */\n private async handleInstantiationResult(\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ctx: FactoryContext & {\n deps: Set<string>\n getDestroyListeners: () => (() => void)[]\n },\n deferred: any,\n scope: InjectableScope,\n error: any,\n instance: any,\n _requestContext?: RequestContextHolder,\n ): Promise<void> {\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.creationPromise = null\n\n if (error) {\n await this.handleInstantiationError(\n instanceName,\n holder,\n deferred,\n scope,\n error,\n )\n } else {\n await this.handleInstantiationSuccess(\n instanceName,\n holder,\n ctx,\n deferred,\n instance,\n )\n }\n }\n\n /**\n * Handles successful service instantiation.\n */\n private async handleInstantiationSuccess(\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ctx: FactoryContext & {\n deps: Set<string>\n getDestroyListeners: () => (() => void)[]\n },\n deferred: any,\n instance: any,\n ): Promise<void> {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n\n // Set up dependency invalidation listeners\n if (ctx.deps.size > 0) {\n ctx.deps.forEach((dependency: string) => {\n holder.destroyListeners.push(\n this.serviceLocator.getEventBus().on(dependency, 'destroy', () => {\n this.logger?.log(\n `[InstanceResolver] Dependency ${dependency} destroyed, invalidating ${instanceName}`,\n )\n this.serviceLocator.getServiceInvalidator().invalidate(instanceName)\n }),\n )\n })\n }\n\n // Note: Event emission would need access to the event bus\n this.logger?.log(\n `[InstanceResolver] Instance ${instanceName} created successfully`,\n )\n deferred.resolve([undefined, instance])\n }\n\n /**\n * Handles service instantiation errors.\n */\n private async handleInstantiationError(\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n deferred: any,\n scope: InjectableScope,\n error: any,\n ): Promise<void> {\n this.logger?.error(\n `[InstanceResolver] Error creating instance for ${instanceName}`,\n error,\n )\n\n holder.status = ServiceLocatorInstanceHolderStatus.Error\n holder.instance = error\n holder.creationPromise = null\n\n if (scope === InjectableScope.Singleton) {\n this.logger?.log(\n `[InstanceResolver] Singleton ${instanceName} failed, will be invalidated`,\n )\n this.serviceLocator.getServiceInvalidator().invalidate(instanceName)\n }\n\n deferred.reject(error)\n }\n\n /**\n * Stores an instance holder based on its scope.\n */\n private storeInstanceByScope(\n scope: InjectableScope,\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n requestContext?: RequestContextHolder,\n ): void {\n switch (scope) {\n case InjectableScope.Singleton:\n this.logger?.debug(\n `[InstanceResolver] Setting singleton instance for ${instanceName}`,\n )\n this.manager.set(instanceName, holder)\n break\n\n case InjectableScope.Request:\n if (requestContext) {\n this.logger?.debug(\n `[InstanceResolver] Setting request-scoped instance for ${instanceName}`,\n )\n requestContext.addInstance(instanceName, holder.instance, holder)\n }\n break\n\n case InjectableScope.Transient:\n // Transient instances are not stored anywhere\n break\n }\n }\n\n /**\n * Creates a factory context for dependency injection during service instantiation.\n */\n private createFactoryContext(): FactoryContext & {\n getDestroyListeners: () => (() => void)[]\n deps: Set<string>\n } {\n return this.tokenProcessor.createFactoryContext(this.serviceLocator)\n }\n}\n","import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\n/**\n * Abstract base class that provides common functionality for managing ServiceLocatorInstanceHolder objects.\n * This class contains shared patterns used by both RequestContextHolder and ServiceLocatorManager.\n */\nexport abstract class BaseInstanceHolderManager {\n protected readonly _holders: Map<string, ServiceLocatorInstanceHolder>\n\n constructor(protected readonly logger: Console | null = null) {\n this._holders = new Map()\n }\n\n /**\n * Protected getter for accessing the holders map from subclasses.\n */\n protected get holders(): Map<string, ServiceLocatorInstanceHolder> {\n return this._holders\n }\n\n /**\n * Abstract method to get a holder by name. Each implementation defines its own return type\n * based on their specific error handling and validation needs.\n */\n abstract get(name: string): any\n\n /**\n * Abstract method to set a holder by name. Each implementation may have different validation logic.\n */\n abstract set(name: string, holder: ServiceLocatorInstanceHolder): void\n\n /**\n * Abstract method to check if a holder exists. Each implementation may have different validation logic.\n */\n abstract has(name: string): any\n\n /**\n * Deletes a holder by name.\n * @param name The name of the holder to delete\n * @returns true if the holder was deleted, false if it didn't exist\n */\n delete(name: string): boolean {\n return this._holders.delete(name)\n }\n\n /**\n * Filters holders based on a predicate function.\n * @param predicate Function to test each holder\n * @returns A new Map containing only the holders that match the predicate\n */\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this._holders].filter(([key, value]) => predicate(value, key)),\n )\n }\n\n /**\n * Clears all holders from this manager.\n */\n clear(): void {\n this._holders.clear()\n }\n\n /**\n * Gets the number of holders currently managed.\n */\n size(): number {\n return this._holders.size\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 * @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 ): [\n ReturnType<typeof Promise.withResolvers<[undefined, Instance]>>,\n ServiceLocatorInstanceHolder<Instance>,\n ] {\n const deferred = Promise.withResolvers<[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 }\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 * @returns The created holder\n */\n protected createCreatedHolder<Instance>(\n name: string,\n instance: Instance,\n type: InjectableType,\n scope: InjectableScope,\n deps: Set<string> = new Set(),\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 }\n\n return holder\n }\n\n /**\n * Gets all holder names currently managed.\n */\n getAllNames(): string[] {\n return Array.from(this._holders.keys())\n }\n\n /**\n * Gets all holders currently managed.\n */\n getAllHolders(): ServiceLocatorInstanceHolder[] {\n return Array.from(this._holders.values())\n }\n\n /**\n * Checks if this manager has any holders.\n */\n isEmpty(): boolean {\n return this._holders.size === 0\n }\n}\n","import type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { BaseInstanceHolderManager } from './base-instance-holder-manager.mjs'\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { InjectionToken } from './injection-token.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 * 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 an instance holder from this context.\n */\n get(instanceName: string): ServiceLocatorInstanceHolder | undefined\n\n /**\n * Checks if this context has a pre-prepared instance.\n */\n has(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 // Methods inherited from BaseInstanceHolderManager\n /**\n * Filters holders based on a predicate function.\n */\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder>\n\n /**\n * Deletes a holder by name.\n */\n delete(name: string): boolean\n\n /**\n * Gets the number of holders currently managed.\n */\n size(): number\n\n /**\n * Checks if this manager has any holders.\n */\n isEmpty(): boolean\n}\n\n/**\n * Default implementation of RequestContextHolder.\n */\nexport class DefaultRequestContextHolder\n extends BaseInstanceHolderManager\n implements RequestContextHolder\n{\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 super(null) // RequestContextHolder doesn't need logging\n if (initialMetadata) {\n Object.entries(initialMetadata).forEach(([key, value]) => {\n this.metadata.set(key, value)\n })\n }\n }\n\n /**\n * Public getter for holders to maintain interface compatibility.\n */\n get holders(): Map<string, ServiceLocatorInstanceHolder> {\n return this._holders\n }\n\n /**\n * Gets a holder by name. For RequestContextHolder, this is a simple lookup.\n */\n get(name: string): ServiceLocatorInstanceHolder | undefined {\n return this._holders.get(name)\n }\n\n /**\n * Sets a holder by name.\n */\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this._holders.set(name, holder)\n }\n\n /**\n * Checks if a holder exists by name.\n */\n has(name: string): boolean {\n return this._holders.has(name)\n }\n\n addInstance(\n instanceName: string | InjectionToken<any, undefined>,\n instance: any,\n holder?: ServiceLocatorInstanceHolder,\n ): void {\n if (instanceName instanceof InjectionToken) {\n const name = instanceName.toString()\n const createdHolder = this.createCreatedHolder(\n name,\n instance,\n InjectableType.Class,\n InjectableScope.Singleton,\n new Set(),\n )\n this._holders.set(name, createdHolder)\n } else {\n if (!holder) {\n throw new Error('Holder is required when adding an instance by name')\n }\n this._holders.set(instanceName, holder)\n }\n }\n\n clear(): void {\n super.clear() // Use the base class clear method for holders\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","import type { RequestContextHolder } from './request-context-holder.mjs'\n\nimport { DefaultRequestContextHolder } from './request-context-holder.mjs'\n\n/**\n * RequestContextManager handles request context lifecycle management.\n * Extracted from ServiceLocator to improve separation of concerns.\n */\nexport class RequestContextManager {\n private readonly requestContexts = new Map<string, RequestContextHolder>()\n private currentRequestContext: RequestContextHolder | null = null\n\n constructor(private readonly logger: Console | null = null) {}\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 `[RequestContextManager] 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(\n `[RequestContextManager] Started request context: ${requestId}`,\n )\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 `[RequestContextManager] Request context ${requestId} not found`,\n )\n return\n }\n\n this.logger?.log(\n `[RequestContextManager] Ending request context: ${requestId}`,\n )\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(\n `[RequestContextManager] Request context ${requestId} ended`,\n )\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(\n `[RequestContextManager] Request context ${requestId} not found`,\n )\n }\n this.currentRequestContext = contextHolder\n }\n\n /**\n * Gets all request contexts.\n * @returns Map of request contexts\n */\n getRequestContexts(): Map<string, RequestContextHolder> {\n return this.requestContexts\n }\n\n /**\n * Clears all request contexts.\n */\n async clearAllRequestContexts(): Promise<void> {\n const requestIds = Array.from(this.requestContexts.keys())\n\n if (requestIds.length === 0) {\n this.logger?.log('[RequestContextManager] No request contexts to clear')\n return\n }\n\n this.logger?.log(\n `[RequestContextManager] Clearing ${requestIds.length} request contexts: ${requestIds.join(', ')}`,\n )\n\n // Clear request contexts sequentially to avoid race conditions\n for (const requestId of requestIds) {\n try {\n await this.endRequest(requestId)\n } catch (error) {\n this.logger?.error(\n `[RequestContextManager] Error clearing request context ${requestId}:`,\n error,\n )\n // Continue with other request contexts even if one fails\n }\n }\n }\n}\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","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { RequestContextManager } from './request-context-manager.mjs'\nimport type { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\nimport type { ServiceLocatorManager } from './service-locator-manager.mjs'\n\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\nexport interface ClearAllOptions {\n /** Whether to also clear request contexts (default: true) */\n clearRequestContexts?: boolean\n /** Maximum number of invalidation rounds to prevent infinite loops (default: 10) */\n maxRounds?: number\n /** Whether to wait for all services to settle before starting (default: true) */\n waitForSettlement?: boolean\n}\n\n/**\n * ServiceInvalidator handles service invalidation, cleanup, and graceful clearing.\n * Extracted from ServiceLocator to improve separation of concerns.\n */\nexport class ServiceInvalidator {\n constructor(\n private readonly manager: ServiceLocatorManager,\n private readonly requestContextManager: RequestContextManager,\n private readonly eventBus: ServiceLocatorEventBus,\n private readonly logger: Console | null = null,\n ) {}\n\n /**\n * Invalidates a service and all its dependencies.\n */\n invalidate(service: string, round = 1): Promise<any> {\n this.logger?.log(\n `[ServiceInvalidator] Starting invalidation process for ${service}`,\n )\n const [, toInvalidate] = this.manager.get(service)\n\n const promises = []\n if (toInvalidate) {\n promises.push(this.invalidateHolder(service, toInvalidate, round))\n }\n\n // Also invalidate request-scoped instances that depend on the service or match the service name\n const requestContexts = this.requestContextManager.getRequestContexts()\n for (const [requestId, requestContext] of requestContexts.entries()) {\n const holder = requestContext.get(service)\n if (holder) {\n this.logger?.log(\n `[ServiceInvalidator] Invalidating request-scoped instance ${service} in request ${requestId}`,\n )\n promises.push(\n this.invalidateRequestHolder(requestId, service, holder, round),\n )\n }\n }\n\n return Promise.all(promises)\n }\n\n /**\n * Gracefully clears all services in the ServiceLocator using invalidation logic.\n * This method respects service dependencies and ensures proper cleanup order.\n * Services that depend on others will be invalidated first, then their dependencies.\n */\n async clearAll(options: ClearAllOptions = {}): Promise<void> {\n const {\n clearRequestContexts = true,\n maxRounds = 10,\n waitForSettlement = true,\n } = options\n\n this.logger?.log(\n '[ServiceInvalidator] Starting graceful clearing of all services',\n )\n\n // Wait for all services to settle if requested\n if (waitForSettlement) {\n this.logger?.log(\n '[ServiceInvalidator] Waiting for all services to settle...',\n )\n await this.ready()\n }\n\n // Get all service names that need to be cleared\n const allServiceNames = this.getAllServiceNames()\n\n if (allServiceNames.length === 0) {\n this.logger?.log('[ServiceInvalidator] No singleton services to clear')\n } else {\n this.logger?.log(\n `[ServiceInvalidator] Found ${allServiceNames.length} services to clear: ${allServiceNames.join(', ')}`,\n )\n\n // Clear services using dependency-aware invalidation\n await this.clearServicesWithDependencyAwareness(\n allServiceNames,\n maxRounds,\n )\n }\n\n // Clear request contexts if requested\n if (clearRequestContexts) {\n await this.requestContextManager.clearAllRequestContexts()\n }\n\n this.logger?.log('[ServiceInvalidator] Graceful clearing completed')\n }\n\n /**\n * Waits for all services to settle (either created, destroyed, or error state).\n */\n async ready(): Promise<void> {\n const holders = Array.from(this.manager.filter(() => true)).map(\n ([, holder]) => holder,\n )\n await Promise.all(\n holders.map((holder) => this.waitForHolderToSettle(holder)),\n )\n }\n\n /**\n * Invalidates a single holder based on its current status.\n */\n private async invalidateHolder(\n key: string,\n holder: ServiceLocatorInstanceHolder<any>,\n round: number,\n ): Promise<void> {\n await this.invalidateHolderByStatus(holder, round, {\n context: key,\n isRequestScoped: false,\n onCreationError: () =>\n this.logger?.error(\n `[ServiceInvalidator] ${key} creation triggered too many invalidation rounds`,\n ),\n onRecursiveInvalidate: () => this.invalidate(key, round + 1),\n onDestroy: () => this.destroyHolder(key, holder),\n })\n }\n\n /**\n * Invalidates a request-scoped holder based on its current status.\n */\n private async invalidateRequestHolder(\n requestId: string,\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n round: number,\n ): Promise<void> {\n await this.invalidateHolderByStatus(holder, round, {\n context: `Request-scoped ${instanceName} in ${requestId}`,\n isRequestScoped: true,\n onCreationError: () =>\n this.logger?.error(\n `[ServiceInvalidator] Request-scoped ${instanceName} in ${requestId} creation triggered too many invalidation rounds`,\n ),\n onRecursiveInvalidate: () =>\n this.invalidateRequestHolder(\n requestId,\n instanceName,\n holder,\n round + 1,\n ),\n onDestroy: () =>\n this.destroyRequestHolder(requestId, instanceName, holder),\n })\n }\n\n /**\n * Common invalidation logic for holders based on their status.\n */\n private async invalidateHolderByStatus(\n holder: ServiceLocatorInstanceHolder<any>,\n round: number,\n options: {\n context: string\n isRequestScoped: boolean\n onCreationError: () => void\n onRecursiveInvalidate: () => Promise<void>\n onDestroy: () => Promise<void>\n },\n ): Promise<void> {\n switch (holder.status) {\n case ServiceLocatorInstanceHolderStatus.Destroying:\n await holder.destroyPromise\n break\n\n case ServiceLocatorInstanceHolderStatus.Creating:\n await holder.creationPromise\n if (round > 3) {\n options.onCreationError()\n return\n }\n await options.onRecursiveInvalidate()\n break\n\n default:\n await options.onDestroy()\n break\n }\n }\n\n /**\n * Destroys a holder and cleans up its resources.\n */\n private async destroyHolder(\n key: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ): Promise<void> {\n await this.destroyHolderWithCleanup(holder, {\n context: key,\n logMessage: `[ServiceInvalidator] Invalidating ${key} and notifying listeners`,\n cleanup: () => this.manager.delete(key),\n eventName: key,\n })\n }\n\n /**\n * Destroys a request-scoped holder and cleans up its resources.\n */\n private async destroyRequestHolder(\n requestId: string,\n instanceName: string,\n holder: ServiceLocatorInstanceHolder<any>,\n ): Promise<void> {\n await this.destroyHolderWithCleanup(holder, {\n context: `Request-scoped ${instanceName} in ${requestId}`,\n logMessage: `[ServiceInvalidator] Invalidating request-scoped ${instanceName} in ${requestId} and notifying listeners`,\n cleanup: () => {\n const requestContext = this.requestContextManager\n .getRequestContexts()\n .get(requestId)\n if (requestContext) {\n requestContext.delete(instanceName)\n }\n },\n eventName: instanceName,\n })\n }\n\n /**\n * Common destroy logic for holders with customizable cleanup.\n */\n private async destroyHolderWithCleanup(\n holder: ServiceLocatorInstanceHolder<any>,\n options: {\n context: string\n logMessage: string\n cleanup: () => void\n eventName: string\n },\n ): Promise<void> {\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(options.logMessage)\n\n holder.destroyPromise = Promise.all(\n holder.destroyListeners.map((listener) => listener()),\n ).then(async () => {\n holder.destroyListeners = []\n holder.deps.clear()\n options.cleanup()\n await this.emitInstanceEvent(options.eventName, 'destroy')\n })\n\n await holder.destroyPromise\n }\n\n /**\n * Waits for a holder to settle (either created, destroyed, or error state).\n */\n private async waitForHolderToSettle(\n holder: ServiceLocatorInstanceHolder<any>,\n ): Promise<void> {\n switch (holder.status) {\n case ServiceLocatorInstanceHolderStatus.Creating:\n await holder.creationPromise\n break\n case ServiceLocatorInstanceHolderStatus.Destroying:\n await holder.destroyPromise\n break\n // Already settled states\n case ServiceLocatorInstanceHolderStatus.Created:\n case ServiceLocatorInstanceHolderStatus.Error:\n break\n }\n }\n\n /**\n * Clears services with dependency awareness, ensuring proper cleanup order.\n * Services with no dependencies are cleared first, then services that depend on them.\n */\n private async clearServicesWithDependencyAwareness(\n serviceNames: string[],\n maxRounds: number,\n ): Promise<void> {\n const clearedServices = new Set<string>()\n let round = 1\n\n while (clearedServices.size < serviceNames.length && round <= maxRounds) {\n this.logger?.log(\n `[ServiceInvalidator] Clearing round ${round}/${maxRounds}, ${clearedServices.size}/${serviceNames.length} services cleared`,\n )\n\n // Find services that can be cleared in this round\n const servicesToClearThisRound = this.findServicesReadyForClearing(\n serviceNames,\n clearedServices,\n )\n\n if (servicesToClearThisRound.length === 0) {\n // If no services can be cleared, try to clear remaining services anyway\n // This handles circular dependencies or other edge cases\n const remainingServices = serviceNames.filter(\n (name) => !clearedServices.has(name),\n )\n\n if (remainingServices.length > 0) {\n this.logger?.warn(\n `[ServiceInvalidator] No services ready for clearing, forcing cleanup of remaining: ${remainingServices.join(', ')}`,\n )\n await this.forceClearServices(remainingServices)\n remainingServices.forEach((name) => clearedServices.add(name))\n }\n break\n }\n\n // Clear services in this round\n const clearPromises = servicesToClearThisRound.map(\n async (serviceName) => {\n try {\n await this.invalidate(serviceName, round)\n clearedServices.add(serviceName)\n this.logger?.log(\n `[ServiceInvalidator] Successfully cleared service: ${serviceName}`,\n )\n } catch (error) {\n this.logger?.error(\n `[ServiceInvalidator] Error clearing service ${serviceName}:`,\n error,\n )\n // Still mark as cleared to avoid infinite loops\n clearedServices.add(serviceName)\n }\n },\n )\n\n await Promise.all(clearPromises)\n round++\n }\n\n if (clearedServices.size < serviceNames.length) {\n this.logger?.warn(\n `[ServiceInvalidator] Clearing completed after ${maxRounds} rounds, but ${serviceNames.length - clearedServices.size} services may not have been properly cleared`,\n )\n }\n }\n\n /**\n * Finds services that are ready to be cleared in the current round.\n * A service is ready if all its dependencies have already been cleared.\n */\n private findServicesReadyForClearing(\n allServiceNames: string[],\n clearedServices: Set<string>,\n ): string[] {\n return allServiceNames.filter((serviceName) => {\n if (clearedServices.has(serviceName)) {\n return false // Already cleared\n }\n\n // Check if this service has any dependencies that haven't been cleared yet\n const [error, holder] = this.manager.get(serviceName)\n if (error) {\n return true // Service not found or in error state, can be cleared\n }\n\n // Check if all dependencies have been cleared\n const hasUnclearedDependencies = Array.from(holder.deps).some(\n (dep) => !clearedServices.has(dep),\n )\n\n return !hasUnclearedDependencies\n })\n }\n\n /**\n * Force clears services that couldn't be cleared through normal dependency resolution.\n * This handles edge cases like circular dependencies.\n */\n private async forceClearServices(serviceNames: string[]): Promise<void> {\n const promises = serviceNames.map(async (serviceName) => {\n try {\n // Directly destroy the holder without going through normal invalidation\n const [error, holder] = this.manager.get(serviceName)\n if (!error && holder) {\n await this.destroyHolder(serviceName, holder)\n }\n } catch (error) {\n this.logger?.error(\n `[ServiceInvalidator] Error force clearing service ${serviceName}:`,\n error,\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n /**\n * Gets all service names currently managed by the ServiceLocator.\n */\n private getAllServiceNames(): string[] {\n return this.manager.getAllNames()\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 `[ServiceInvalidator]#emitInstanceEvent() Notifying listeners for ${name} with event ${event}`,\n )\n return this.eventBus.emit(name, event)\n }\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 { BaseInstanceHolderManager } from './base-instance-holder-manager.mjs'\nimport { InjectableScope, InjectableType } from './enums/index.mjs'\nimport { DIError, DIErrorCode } from './errors/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\nexport class ServiceLocatorManager extends BaseInstanceHolderManager {\n constructor(logger: Console | null = null) {\n super(logger)\n }\n\n get(\n name: string,\n ):\n | [DIError, ServiceLocatorInstanceHolder]\n | [DIError]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this._holders.get(name)\n if (holder) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`,\n )\n return [DIError.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 DIError, holder]\n }\n\n return [undefined, holder]\n } else {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${name} not found`,\n )\n return [DIError.instanceNotFound(name)]\n }\n }\n\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this._holders.set(name, holder)\n }\n\n has(name: string): [DIError] | [undefined, boolean] {\n const [error, holder] = this.get(name)\n if (!error) {\n return [undefined, true]\n }\n if (error.code === DIErrorCode.InstanceDestroying) {\n return [error]\n }\n return [undefined, !!holder]\n }\n\n // delete and filter methods are inherited from BaseInstanceHolderManager\n\n // createCreatingHolder method is inherited from BaseInstanceHolderManager\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 * @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 ): ServiceLocatorInstanceHolder<Instance> {\n const holder = this.createCreatedHolder(name, instance, type, scope, deps)\n\n this._holders.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 */\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n AnyInjectableType,\n InjectionTokenType,\n} from './injection-token.mjs'\nimport type { RequestContextHolder } from './request-context-holder.mjs'\nimport type { ServiceLocator } from './service-locator.mjs'\n\nimport { DIError } from './errors/index.mjs'\nimport {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport { getInjectableToken } from './utils/index.mjs'\n\n/**\n * TokenProcessor handles token validation, resolution, and instance name generation.\n * Extracted from ServiceLocator to improve separation of concerns.\n */\nexport class TokenProcessor {\n constructor(private readonly logger: Console | null = null) {}\n\n /**\n * Validates and resolves token arguments, handling factory token resolution and validation.\n */\n validateAndResolveTokenArgs(\n token: AnyInjectableType,\n args?: any,\n ): [\n DIError | 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 [DIError.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 `[TokenProcessor]#validateAndResolveTokenArgs(): Error validating args for ${actualToken.name.toString()}`,\n validatedArgs.error,\n )\n return [DIError.unknown(validatedArgs.error), { actualToken }]\n }\n return [undefined, { actualToken, validatedArgs: validatedArgs?.data }]\n }\n\n /**\n * Generates a unique instance name based on token and arguments.\n */\n generateInstanceName(token: InjectionTokenType, args: any): string {\n if (!args) {\n return token.toString()\n }\n\n const formattedArgs = Object.entries(args)\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => `${key}=${this.formatArgValue(value)}`)\n .join(',')\n\n return `${token.toString()}:${formattedArgs.replaceAll(/\"/g, '').replaceAll(/:/g, '=')}`\n }\n\n /**\n * Formats a single argument value for instance name generation.\n */\n formatArgValue(value: any): string {\n if (typeof value === 'function') {\n return `fn_${value.name}(${value.length})`\n }\n if (typeof value === 'symbol') {\n return value.toString()\n }\n return JSON.stringify(value).slice(0, 40)\n }\n\n /**\n * Creates a factory context for dependency injection during service instantiation.\n * @param serviceLocator Reference to the service locator for dependency resolution\n */\n createFactoryContext(\n serviceLocator: ServiceLocator, // ServiceLocator reference for dependency resolution\n ): FactoryContext & {\n getDestroyListeners: () => (() => void)[]\n deps: Set<string>\n } {\n const destroyListeners = new Set<() => void>()\n const deps = new Set<string>()\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 // Fall back to normal resolution\n const [error, instance] = await serviceLocator.getInstance(\n token,\n args,\n ({ instanceName }: { instanceName: string }) => {\n deps.add(instanceName)\n },\n )\n if (error) {\n throw error\n }\n return instance\n },\n addDestroyListener,\n getDestroyListeners,\n locator: serviceLocator,\n deps,\n }\n }\n\n /**\n * Tries to get a pre-prepared instance from request contexts.\n */\n tryGetPrePreparedInstance(\n instanceName: string,\n contextHolder: RequestContextHolder | undefined,\n deps: Set<string>,\n currentRequestContext: RequestContextHolder | null,\n ): any {\n // Check provided context holder first (if has higher priority)\n if (contextHolder && contextHolder.priority > 0) {\n const prePreparedInstance = contextHolder.get(instanceName)?.instance\n if (prePreparedInstance !== undefined) {\n this.logger?.debug(\n `[TokenProcessor] Using pre-prepared instance ${instanceName} from request context ${contextHolder.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n // Check current request context (if different from provided contextHolder)\n if (currentRequestContext && currentRequestContext !== contextHolder) {\n const prePreparedInstance =\n currentRequestContext.get(instanceName)?.instance\n if (prePreparedInstance !== undefined) {\n this.logger?.debug(\n `[TokenProcessor] Using pre-prepared instance ${instanceName} from current request context ${currentRequestContext.requestId}`,\n )\n deps.add(instanceName)\n return prePreparedInstance\n }\n }\n\n return undefined\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 {\n AnyInjectableType,\n InjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { RequestContextHolder } from './request-context-holder.mjs'\nimport type { ClearAllOptions } from './service-invalidator.mjs'\nimport type { Injectors } from './utils/index.mjs'\n\nimport { defaultInjectors } from './injector.mjs'\nimport { InstanceResolver } from './instance-resolver.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { RequestContextManager } from './request-context-manager.mjs'\nimport { ServiceInstantiator } from './service-instantiator.mjs'\nimport { ServiceInvalidator } from './service-invalidator.mjs'\nimport { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport { ServiceLocatorManager } from './service-locator-manager.mjs'\nimport { TokenProcessor } from './token-processor.mjs'\n\nexport class ServiceLocator {\n private readonly eventBus: ServiceLocatorEventBus\n private readonly manager: ServiceLocatorManager\n private readonly serviceInstantiator: ServiceInstantiator\n private readonly tokenProcessor: TokenProcessor\n private readonly requestContextManager: RequestContextManager\n private readonly serviceInvalidator: ServiceInvalidator\n private readonly instanceResolver: InstanceResolver\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 this.tokenProcessor = new TokenProcessor(logger)\n this.requestContextManager = new RequestContextManager(logger)\n this.serviceInvalidator = new ServiceInvalidator(\n this.manager,\n this.requestContextManager,\n this.eventBus,\n logger,\n )\n this.instanceResolver = new InstanceResolver(\n this.registry,\n this.manager,\n this.serviceInstantiator,\n this.tokenProcessor,\n logger,\n this,\n )\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 getRequestContexts() {\n return this.requestContextManager.getRequestContexts()\n }\n\n getRequestContextManager() {\n return this.requestContextManager\n }\n\n getServiceInvalidator() {\n return this.serviceInvalidator\n }\n\n public getInstanceIdentifier(token: AnyInjectableType, args?: any): string {\n const [err, { actualToken, validatedArgs }] =\n this.tokenProcessor.validateAndResolveTokenArgs(token, args)\n if (err) {\n throw err\n }\n return this.tokenProcessor.generateInstanceName(actualToken, validatedArgs)\n }\n\n public async getInstance(\n token: AnyInjectableType,\n args?: any,\n onPrepare?: (data: {\n instanceName: string\n actualToken: any\n validatedArgs?: any\n }) => void,\n ) {\n const [err, data] = await this.instanceResolver.resolveInstance(\n token,\n args,\n this.requestContextManager.getCurrentRequestContext() || undefined,\n )\n if (err) {\n return [err]\n }\n\n // Call onPrepare callback if provided\n if (onPrepare) {\n const instanceName = this.getInstanceIdentifier(token, args)\n const [tokenErr, { actualToken, validatedArgs }] =\n this.tokenProcessor.validateAndResolveTokenArgs(token, args)\n if (!tokenErr) {\n onPrepare({ instanceName, actualToken, validatedArgs })\n }\n }\n\n return [undefined, data]\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 return this.instanceResolver.getSyncInstance(\n token,\n args as any,\n this.requestContextManager.getCurrentRequestContext(),\n )\n }\n\n invalidate(service: string, round = 1): Promise<any> {\n return this.serviceInvalidator.invalidate(service, round)\n }\n\n /**\n * Gracefully clears all services in the ServiceLocator using invalidation logic.\n * This method respects service dependencies and ensures proper cleanup order.\n * Services that depend on others will be invalidated first, then their dependencies.\n *\n * @param options Optional configuration for the clearing process\n * @returns Promise that resolves when all services have been cleared\n */\n async clearAll(options: ClearAllOptions = {}): Promise<void> {\n return this.serviceInvalidator.clearAll(options)\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.requestContextManager.beginRequest(\n requestId,\n metadata,\n priority,\n )\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 return this.requestContextManager.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.requestContextManager.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 return this.requestContextManager.setCurrentRequestContext(requestId)\n }\n\n /**\n * Waits for all services to settle (either created, destroyed, or error state).\n */\n async ready(): Promise<void> {\n return this.serviceInvalidator.ready()\n }\n\n /**\n * Helper method for TokenProcessor to access pre-prepared instances.\n * This is needed for the factory context creation.\n */\n tryGetPrePreparedInstance(\n instanceName: string,\n contextHolder: RequestContextHolder | undefined,\n deps: Set<string>,\n ): any {\n return this.tokenProcessor.tryGetPrePreparedInstance(\n instanceName,\n contextHolder,\n deps,\n this.requestContextManager.getCurrentRequestContext(),\n )\n }\n\n /**\n * Helper method for InstanceResolver to generate instance names.\n * This is needed for the factory context creation.\n */\n generateInstanceName(token: any, args: any): string {\n return this.tokenProcessor.generateInstanceName(token, args)\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 { ServiceLocatorInstanceHolder } from './service-locator-instance-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 protected readonly registry: Registry = globalRegistry,\n protected readonly logger: Console | null = null,\n protected readonly 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 holder = this.getHolderByInstance(service)\n if (holder) {\n await this.serviceLocator.invalidate(holder.name)\n } else {\n const requestHolder = this.getRequestHolderByInstance(service)\n if (requestHolder) {\n await this.serviceLocator.invalidate(requestHolder.name)\n }\n }\n }\n\n /**\n * Gets a service holder by instance (reverse lookup)\n */\n private getHolderByInstance(\n instance: unknown,\n ): ServiceLocatorInstanceHolder | null {\n const holderMap = Array.from(\n this.serviceLocator\n .getManager()\n .filter((holder) => holder.instance === instance)\n .values(),\n )\n\n return holderMap.length > 0 ? holderMap[0] : null\n }\n\n private getRequestHolderByInstance(\n instance: unknown,\n ): ServiceLocatorInstanceHolder | null {\n const requestContexts = this.serviceLocator\n .getRequestContextManager()\n .getRequestContexts()\n if (requestContexts) {\n for (const requestContext of requestContexts.values()) {\n for (const holder of requestContext.holders.values()) {\n if (holder.instance === instance) {\n return holder\n }\n }\n }\n }\n return null\n }\n\n /**\n * Checks if a service is registered in the container\n */\n isRegistered(token: any): boolean {\n try {\n return this.serviceLocator.getInstanceIdentifier(token) !== null\n } catch {\n return false\n }\n }\n\n /**\n * Disposes the container and cleans up all resources\n */\n async dispose(): Promise<void> {\n await this.serviceLocator.clearAll()\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 /**\n * Clears all instances and bindings from the container.\n * This is useful for testing or resetting the container state.\n */\n clear(): Promise<void> {\n return this.serviceLocator.clearAll()\n }\n}\n","import type { ClassType, InjectionToken } from '../injection-token.mjs'\nimport type { Registry } from '../registry.mjs'\nimport type { Injectors } from '../utils/index.mjs'\n\nimport { Container } from '../container.mjs'\nimport { Injectable } from '../decorators/injectable.decorator.mjs'\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { getInjectableToken } from '../utils/index.mjs'\n\n/**\n * A binding builder for the TestContainer that allows chaining binding operations.\n */\nexport class TestBindingBuilder<T> {\n constructor(\n private readonly container: TestContainer,\n private readonly token: InjectionToken<T, any>,\n ) {}\n\n /**\n * Binds the token to a specific value.\n * This is useful for testing with mock values or constants.\n * @param value The value to bind to the token\n */\n toValue(value: T): TestContainer {\n const instanceName = this.container\n .getServiceLocator()\n .getInstanceIdentifier(this.token)\n this.container\n .getServiceLocator()\n .getManager()\n .storeCreatedHolder(\n instanceName,\n value,\n InjectableType.Class,\n InjectableScope.Singleton,\n )\n return this.container\n }\n\n /**\n * Binds the token to a class constructor.\n * @param target The class constructor to bind to\n */\n toClass(target: ClassType): TestContainer {\n this.container['registry'].set(\n this.token,\n InjectableScope.Singleton,\n target,\n InjectableType.Class,\n )\n return this.container\n }\n}\n\n/**\n * TestContainer extends the base Container with additional methods useful for testing.\n * It provides a simplified API for binding values and classes during test setup.\n */\n@Injectable()\nexport class TestContainer extends Container {\n constructor(\n registry: Registry = globalRegistry,\n logger: Console | null = null,\n injectors: Injectors = undefined as any,\n ) {\n super(registry, logger, injectors)\n }\n\n /**\n * Creates a binding builder for the given token.\n * This allows chaining binding operations like bind(Token).toValue(value).\n * @param token The injection token to bind\n * @returns A TestBindingBuilder for chaining binding operations\n */\n bind<T>(token: ClassType): TestBindingBuilder<T>\n bind<T>(token: InjectionToken<T, any>): TestBindingBuilder<T>\n bind(token: any): TestBindingBuilder<any> {\n let realToken = token\n if (typeof token === 'function') {\n realToken = getInjectableToken(token)\n }\n return new TestBindingBuilder(this, realToken)\n }\n\n /**\n * Binds a value directly to a token.\n * This is a convenience method equivalent to bind(token).toValue(value).\n * @param token The injection token to bind\n * @param value The value to bind to the token\n * @returns The TestContainer instance for chaining\n */\n bindValue<T>(token: ClassType, value: T): TestContainer\n bindValue<T>(token: InjectionToken<T, any>, value: T): TestContainer\n bindValue(token: any, value: any): TestContainer {\n return this.bind(token).toValue(value)\n }\n\n /**\n * Binds a class to a token.\n * This is a convenience method equivalent to bind(token).toClass(target).\n * @param token The injection token to bind\n * @param target The class constructor to bind to\n * @returns The TestContainer instance for chaining\n */\n bindClass(token: ClassType, target: ClassType): TestContainer\n bindClass<T>(token: InjectionToken<T, any>, target: ClassType): TestContainer\n bindClass(token: any, target: any): TestContainer {\n return this.bind(token).toClass(target)\n }\n\n /**\n * Creates a new TestContainer instance with the same configuration.\n * This is useful for creating isolated test containers.\n * @returns A new TestContainer instance\n */\n createChild(): TestContainer {\n return new TestContainer(this.registry, this.logger, this.injectors)\n }\n}\n"]}