{"version":3,"file":"container.mjs","names":["AbstractContainer","Injectable","InjectableScope","InjectableType","DIError","InstanceResolver","NameResolver","ScopeTracker","ServiceInitializer","ServiceInvalidator","TokenResolver","UnifiedStorage","LifecycleEventBus","globalRegistry","defaultInjectors","getInjectableToken","ScopedContainer","Container","registry","logger","injectors","storage","Singleton","eventBus","nameResolver","tokenResolver","scopeTracker","serviceInitializer","serviceInvalidator","instanceResolver","registerSelf","defaultScope","requestId","undefined","activeRequestIds","Set","token","set","Class","instanceName","generateInstanceName","storeInstance","get","args","realToken","getRegistryToken","has","record","scope","Request","scopeMismatchError","name","error","instance","resolveInstance","invalidate","service","holder","findByInstance","warn","invalidateWithStorage","dispose","clearAllWithStorage","tryGetSync","tryGetSyncFromStorage","beginRequest","metadata","Error","add","getActiveRequestIds","hasActiveRequest","removeRequestId","delete","getStorage","getServiceInitializer","getServiceInvalidator","getTokenResolver","getNameResolver","getScopeTracker","getEventBus","getRegistry","getInstanceResolver"],"sources":["../../../src/container/container.mts"],"sourcesContent":["import type { z, ZodType } from 'zod/v4'\n\nimport type { Factorable } from '../interfaces/factory.interface.mjs'\nimport type {\n  ClassType,\n  ClassTypeWithArgument,\n  InjectionTokenSchemaType,\n} from '../token/injection-token.mjs'\nimport type { Registry } from '../token/registry.mjs'\nimport type { Injectors } from '../utils/get-injectors.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 { DIError } from '../errors/index.mjs'\nimport { InstanceResolver } from '../internal/core/instance-resolver.mjs'\nimport { NameResolver } from '../internal/core/name-resolver.mjs'\nimport { ScopeTracker } from '../internal/core/scope-tracker.mjs'\nimport { ServiceInitializer } from '../internal/core/service-initializer.mjs'\nimport { ServiceInvalidator } from '../internal/core/service-invalidator.mjs'\nimport { TokenResolver } from '../internal/core/token-resolver.mjs'\nimport { UnifiedStorage } from '../internal/holder/unified-storage.mjs'\nimport { LifecycleEventBus } from '../internal/lifecycle/lifecycle-event-bus.mjs'\nimport {\n  BoundInjectionToken,\n  FactoryInjectionToken,\n  InjectionToken,\n} from '../token/injection-token.mjs'\nimport { globalRegistry } from '../token/registry.mjs'\nimport { defaultInjectors } from '../utils/default-injectors.mjs'\nimport { getInjectableToken } from '../utils/index.mjs'\nimport { AbstractContainer } from './abstract-container.mjs'\nimport { ScopedContainer } from './scoped-container.mjs'\n\n/**\n * Main dependency injection container.\n *\n * Provides a simplified public API for dependency injection.\n * Handles singleton and transient services directly,\n * while request-scoped services require using beginRequest() to create a ScopedContainer.\n */\n@Injectable()\nexport class Container extends AbstractContainer {\n  protected readonly defaultScope = InjectableScope.Singleton\n  protected readonly requestId = undefined\n\n  private readonly storage: UnifiedStorage\n  private readonly serviceInitializer: ServiceInitializer\n  private readonly serviceInvalidator: ServiceInvalidator\n  private readonly tokenResolver: TokenResolver\n  private readonly nameResolver: NameResolver\n  private readonly scopeTracker: ScopeTracker\n  private readonly eventBus: LifecycleEventBus\n  private readonly instanceResolver: InstanceResolver\n  private readonly activeRequestIds = new Set<string>()\n\n  constructor(\n    protected readonly registry: Registry = globalRegistry,\n    protected readonly logger: Console | null = null,\n    protected readonly injectors: Injectors = defaultInjectors,\n  ) {\n    super()\n    // Initialize components\n    this.storage = new UnifiedStorage(InjectableScope.Singleton)\n    this.eventBus = new LifecycleEventBus(logger)\n    this.nameResolver = new NameResolver(logger)\n    this.tokenResolver = new TokenResolver(logger)\n    this.scopeTracker = new ScopeTracker(registry, this.nameResolver, logger)\n    this.serviceInitializer = new ServiceInitializer(injectors)\n    this.serviceInvalidator = new ServiceInvalidator(this.eventBus, logger)\n    this.instanceResolver = new InstanceResolver(\n      registry,\n      this.storage,\n      this.serviceInitializer,\n      this.tokenResolver,\n      this.nameResolver,\n      this.scopeTracker,\n      this.serviceInvalidator,\n      this.eventBus,\n      logger,\n    )\n    this.registerSelf()\n  }\n\n  private registerSelf() {\n    const token = getInjectableToken(Container)\n    this.registry.set(\n      token,\n      InjectableScope.Singleton,\n      Container,\n      InjectableType.Class,\n    )\n    const instanceName = this.nameResolver.generateInstanceName(\n      token,\n      undefined,\n      undefined,\n      InjectableScope.Singleton,\n    )\n    this.storage.storeInstance(instanceName, this)\n  }\n\n  /**\n   * Gets an instance from the container.\n   * NOTE: Request-scoped services cannot be resolved directly from Container.\n   * Use beginRequest() to create a ScopedContainer for request-scoped services.\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  // #1.1 Simple class with args\n  get<T extends ClassTypeWithArgument<R>, R>(\n    token: T,\n    args: 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    // Check if this is a request-scoped service\n    const realToken = this.tokenResolver.getRegistryToken(token)\n\n    if (this.registry.has(realToken)) {\n      const record = this.registry.get(realToken)\n      if (record.scope === InjectableScope.Request) {\n        throw DIError.scopeMismatchError(\n          realToken.name,\n          'ScopedContainer',\n          'Container',\n        )\n      }\n    }\n\n    const [error, instance] = await this.instanceResolver.resolveInstance(\n      token,\n      args,\n      this,\n    )\n\n    if (error) {\n      throw error\n    }\n\n    return instance\n  }\n\n  /**\n   * Invalidates a service and its dependencies.\n   */\n  async invalidate(service: unknown): Promise<void> {\n    // Find the service by instance\n    const holder = this.storage.findByInstance(service)\n    if (!holder) {\n      this.logger?.warn(\n        `[Container] Service instance not found for invalidation`,\n      )\n      return\n    }\n\n    await this.serviceInvalidator.invalidateWithStorage(\n      holder.name,\n      this.storage,\n    )\n  }\n\n  /**\n   * Disposes the container and cleans up all resources.\n   */\n  async dispose(): Promise<void> {\n    await this.serviceInvalidator.clearAllWithStorage(this.storage)\n  }\n\n  /**\n   * @internal\n   * Attempts to get an instance synchronously if it already exists.\n   * Overrides base class to support requestId parameter for ScopedContainer compatibility.\n   */\n  override tryGetSync<T>(token: any, args?: any, requestId?: string): T | null {\n    return this.tryGetSyncFromStorage(\n      token,\n      args,\n      this.storage,\n      requestId ?? this.requestId,\n    )\n  }\n\n  /**\n   * Begins a new request context and returns a ScopedContainer.\n   */\n  beginRequest(\n    requestId: string,\n    metadata?: Record<string, any>,\n  ): ScopedContainer {\n    if (this.activeRequestIds.has(requestId)) {\n      throw new Error(`Request with ID ${requestId} already exists`)\n    }\n\n    this.activeRequestIds.add(requestId)\n\n    return new ScopedContainer(this, this.registry, requestId, metadata)\n  }\n\n  /**\n   * Gets all active request IDs.\n   */\n  getActiveRequestIds(): ReadonlySet<string> {\n    return this.activeRequestIds\n  }\n\n  /**\n   * Checks if a request is active.\n   */\n  hasActiveRequest(requestId: string): boolean {\n    return this.activeRequestIds.has(requestId)\n  }\n\n  /**\n   * Removes a request ID from active requests.\n   * Called by ScopedContainer when request ends.\n   */\n  removeRequestId(requestId: string): void {\n    this.activeRequestIds.delete(requestId)\n  }\n\n  // ============================================================================\n  // INTERNAL METHODS FOR COMPONENT ACCESS\n  // ============================================================================\n\n  getStorage(): UnifiedStorage {\n    return this.storage\n  }\n\n  getServiceInitializer(): ServiceInitializer {\n    return this.serviceInitializer\n  }\n\n  getServiceInvalidator(): ServiceInvalidator {\n    return this.serviceInvalidator\n  }\n\n  getTokenResolver(): TokenResolver {\n    return this.tokenResolver\n  }\n\n  getNameResolver(): NameResolver {\n    return this.nameResolver\n  }\n\n  getScopeTracker(): ScopeTracker {\n    return this.scopeTracker\n  }\n\n  getEventBus(): LifecycleEventBus {\n    return this.eventBus\n  }\n\n  getRegistry(): Registry {\n    return this.registry\n  }\n\n  getInstanceResolver(): InstanceResolver {\n    return this.instanceResolver\n  }\n}\n"],"mappings":"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"}