UNPKG

ts5deco-inject

Version:

TypeScript 5 Modern Decorator Dependency Injection Framework

8 lines 64.3 kB
{
  "version": 3,
  "sources": ["../src/metadata/index.ts", "../src/metadata/decorators.ts", "../src/types/index.ts", "../src/types/advanced.ts", "../src/types/constants.ts", "../src/container/Container.ts", "../src/container/ContainerFactory.ts"],
  "sourcesContent": ["// Metadata collection system for Modern Decorators\n\nexport interface MetadataKey<T = any> {\n  readonly key: symbol;\n  readonly description: string;\n}\n\nexport interface ClassMetadata {\n  dependencies?: Array<MetadataKey | string>;\n  scope?: 'singleton' | 'prototype' | 'transient';\n  injectable?: boolean;\n  providers?: Array<{ token: MetadataKey | string; value: any }>;\n}\n\nexport interface PropertyMetadata {\n  token?: MetadataKey | string | undefined;\n  optional?: boolean;\n  inject?: boolean;\n}\n\nexport interface MethodMetadata {\n  parameterTypes?: Array<MetadataKey | string>;\n  returnType?: MetadataKey | string;\n  lifecycle?: 'postConstruct' | 'preDestroy';\n}\n\n// Memory-efficient storage using WeakMap\nconst classMetadataStore = new WeakMap<Function, ClassMetadata>();\nconst propertyMetadataStore = new WeakMap<object, Map<string | symbol, PropertyMetadata>>();\nconst methodMetadataStore = new WeakMap<object, Map<string | symbol, MethodMetadata>>();\n\n/**\n * Creates a metadata key for type-safe metadata operations\n */\nexport function createMetadataKey<T = any>(description: string): MetadataKey<T> {\n  return {\n    key: Symbol(description),\n    description\n  };\n}\n\n/**\n * Sets metadata for a class\n */\nexport function setClassMetadata(target: Function, metadata: ClassMetadata): void {\n  const existing = classMetadataStore.get(target) || {};\n  classMetadataStore.set(target, { ...existing, ...metadata });\n}\n\n/**\n * Gets metadata for a class\n */\nexport function getClassMetadata(target: Function): ClassMetadata | undefined {\n  return classMetadataStore.get(target);\n}\n\n/**\n * Sets metadata for a class property\n */\nexport function setPropertyMetadata(\n  target: object,\n  propertyKey: string | symbol,\n  metadata: PropertyMetadata\n): void {\n  let targetMetadata = propertyMetadataStore.get(target);\n  if (!targetMetadata) {\n    targetMetadata = new Map();\n    propertyMetadataStore.set(target, targetMetadata);\n  }\n  \n  const existing = targetMetadata.get(propertyKey) || {};\n  targetMetadata.set(propertyKey, { ...existing, ...metadata });\n}\n\n/**\n * Gets metadata for a class property\n */\nexport function getPropertyMetadata(\n  target: object,\n  propertyKey: string | symbol\n): PropertyMetadata | undefined {\n  const targetMetadata = propertyMetadataStore.get(target);\n  return targetMetadata?.get(propertyKey);\n}\n\n/**\n * Sets metadata for a class method\n */\nexport function setMethodMetadata(\n  target: object,\n  methodKey: string | symbol,\n  metadata: MethodMetadata\n): void {\n  let targetMetadata = methodMetadataStore.get(target);\n  if (!targetMetadata) {\n    targetMetadata = new Map();\n    methodMetadataStore.set(target, targetMetadata);\n  }\n  \n  const existing = targetMetadata.get(methodKey) || {};\n  targetMetadata.set(methodKey, { ...existing, ...metadata });\n}\n\n/**\n * Gets metadata for a class method\n */\nexport function getMethodMetadata(\n  target: object,\n  methodKey: string | symbol\n): MethodMetadata | undefined {\n  const targetMetadata = methodMetadataStore.get(target);\n  return targetMetadata?.get(methodKey);\n}\n\n/**\n * Gets all property metadata for a class\n */\nexport function getAllPropertyMetadata(target: object): Map<string | symbol, PropertyMetadata> | undefined {\n  return propertyMetadataStore.get(target);\n}\n\n/**\n * Gets all method metadata for a class\n */\nexport function getAllMethodMetadata(target: object): Map<string | symbol, MethodMetadata> | undefined {\n  return methodMetadataStore.get(target);\n}\n\n/**\n * Checks if a class has any metadata\n */\nexport function hasClassMetadata(target: Function): boolean {\n  return classMetadataStore.has(target);\n}\n\n/**\n * Checks if a property has metadata\n */\nexport function hasPropertyMetadata(target: object, propertyKey: string | symbol): boolean {\n  const targetMetadata = propertyMetadataStore.get(target);\n  return targetMetadata?.has(propertyKey) ?? false;\n}\n\n/**\n * Checks if a method has metadata\n */\nexport function hasMethodMetadata(target: object, methodKey: string | symbol): boolean {\n  const targetMetadata = methodMetadataStore.get(target);\n  return targetMetadata?.has(methodKey) ?? false;\n}\n\n/**\n * Clears all metadata for a class (useful for testing)\n */\nexport function clearClassMetadata(target: Function): void {\n  classMetadataStore.delete(target);\n  propertyMetadataStore.delete(target.prototype);\n  methodMetadataStore.delete(target.prototype);\n}", "// Modern Decorator implementations using the metadata system\n\nimport {\n  setClassMetadata,\n  setPropertyMetadata,\n  setMethodMetadata,\n  createMetadataKey,\n  type MetadataKey\n} from './index';\n\n/**\n * Marks a class as injectable for dependency injection\n */\nexport function Injectable(scope: 'singleton' | 'prototype' | 'transient' = 'singleton') {\n  return function <T extends new (...args: any[]) => any>(\n    target: T,\n    context: ClassDecoratorContext\n  ): T {\n    setClassMetadata(target, {\n      injectable: true,\n      scope\n    });\n    \n    return target;\n  };\n}\n\n/**\n * Marks a property for dependency injection\n */\nexport function Inject(token?: MetadataKey | string, optional: boolean = false) {\n  return function (\n    target: undefined,\n    context: ClassFieldDecoratorContext | ClassAccessorDecoratorContext\n  ) {\n    context.addInitializer(function (this: any) {\n      setPropertyMetadata(this.constructor.prototype, context.name, {\n        token,\n        optional,\n        inject: true\n      });\n    });\n  };\n}\n\n/**\n * Marks a class as singleton scope\n */\nexport function Singleton<T extends new (...args: any[]) => any>(\n  target: T,\n  context: ClassDecoratorContext\n): T {\n  setClassMetadata(target, {\n    scope: 'singleton'\n  });\n  \n  return target;\n}\n\n/**\n * Sets a custom scope for a class\n */\nexport function Scope(scope: 'singleton' | 'prototype' | 'transient') {\n  return function <T extends new (...args: any[]) => any>(\n    target: T,\n    context: ClassDecoratorContext\n  ): T {\n    setClassMetadata(target, {\n      scope\n    });\n    \n    return target;\n  };\n}\n\n/**\n * Marks a method to be called after instance construction\n */\nexport function PostConstruct(\n  target: Function,\n  context: ClassMethodDecoratorContext\n): Function {\n  context.addInitializer(function (this: any) {\n    setMethodMetadata(this.constructor.prototype, context.name, {\n      lifecycle: 'postConstruct'\n    });\n  });\n  \n  return target;\n}\n\n/**\n * Marks a method to be called before instance destruction\n */\nexport function PreDestroy(\n  target: Function,\n  context: ClassMethodDecoratorContext\n): Function {\n  context.addInitializer(function (this: any) {\n    setMethodMetadata(this.constructor.prototype, context.name, {\n      lifecycle: 'preDestroy'\n    });\n  });\n  \n  return target;\n}\n\n/**\n * Provides a service with a specific token\n */\nexport function Provide(token: MetadataKey | string, value: any) {\n  return function <T extends new (...args: any[]) => any>(\n    target: T,\n    context: ClassDecoratorContext\n  ): T {\n    const providers = [{ token, value }];\n    \n    setClassMetadata(target, {\n      providers\n    });\n    \n    return target;\n  };\n}\n\n// Commonly used metadata keys\nexport const DESIGN_TYPE = createMetadataKey<Function>('design:type');\nexport const DESIGN_PARAM_TYPES = createMetadataKey<Function[]>('design:paramtypes');\nexport const DESIGN_RETURN_TYPE = createMetadataKey<Function>('design:returntype');", "// Core types and interfaces for the DI/IoC Framework\n\nimport type { MetadataKey } from '../metadata';\n\n/**\n * Service identifier type - can be a constructor, string, symbol, or MetadataKey\n */\nexport type ServiceIdentifier<T = any> = \n  | (new (...args: any[]) => T)\n  | string \n  | symbol \n  | MetadataKey<T>;\n\n/**\n * Service scope enumeration\n */\nexport enum ServiceScope {\n  SINGLETON = 'singleton',\n  PROTOTYPE = 'prototype', \n  TRANSIENT = 'transient'\n}\n\n/**\n * Service lifecycle hooks\n */\nexport enum ServiceLifecycle {\n  POST_CONSTRUCT = 'postConstruct',\n  PRE_DESTROY = 'preDestroy'\n}\n\n/**\n * Provider types for different service registration patterns\n */\nexport interface ClassProvider<T = any> {\n  type: 'class';\n  token: ServiceIdentifier<T>;\n  useClass: new (...args: any[]) => T;\n  scope?: ServiceScope;\n}\n\nexport interface ValueProvider<T = any> {\n  type: 'value';\n  token: ServiceIdentifier<T>;\n  useValue: T;\n}\n\nexport interface FactoryProvider<T = any> {\n  type: 'factory';\n  token: ServiceIdentifier<T>;\n  useFactory: (...deps: any[]) => T;\n  deps?: ServiceIdentifier[];\n  scope?: ServiceScope;\n}\n\nexport interface ExistingProvider<T = any> {\n  type: 'existing';\n  token: ServiceIdentifier<T>;\n  useExisting: ServiceIdentifier<T>;\n}\n\n/**\n * Union type for all provider types\n */\nexport type Provider<T = any> = \n  | ClassProvider<T>\n  | ValueProvider<T> \n  | FactoryProvider<T>\n  | ExistingProvider<T>;\n\n/**\n * Service registration options\n */\nexport interface ServiceOptions {\n  scope?: ServiceScope;\n  lazy?: boolean;\n  tags?: string[];\n  onActivation?: (instance: any) => any;\n  onDeactivation?: (instance: any) => void;\n}\n\n/**\n * Dependency injection information\n */\nexport interface DependencyInfo {\n  token: ServiceIdentifier;\n  optional: boolean;\n  parameterIndex?: number;\n  propertyKey?: string | symbol;\n}\n\n/**\n * Service registration metadata\n */\nexport interface ServiceRegistration<T = any> {\n  token: ServiceIdentifier<T>;\n  provider: Provider<T>;\n  options: ServiceOptions;\n  dependencies: DependencyInfo[];\n  metadata: {\n    registeredAt: Date;\n    sourceLocation?: string;\n  };\n}\n\n/**\n * Container configuration options\n */\nexport interface ContainerOptions {\n  defaultScope?: ServiceScope;\n  autoBindInjectable?: boolean;\n  skipBaseClassChecks?: boolean;\n  throwOnMissingDependencies?: boolean;\n  enableCaching?: boolean;\n  maxCacheSize?: number;\n}\n\n/**\n * Container interface for dependency injection operations\n */\nexport interface IContainer {\n  /**\n   * Register a service with the container\n   */\n  register<T>(provider: Provider<T>, options?: ServiceOptions): this;\n  \n  /**\n   * Register a class as a service\n   */\n  bind<T>(token: ServiceIdentifier<T>): IBindingBuilder<T>;\n  \n  /**\n   * Resolve a service instance\n   */\n  resolve<T>(token: ServiceIdentifier<T>): T;\n  \n  /**\n   * Try to resolve a service, return undefined if not found\n   */\n  tryResolve<T>(token: ServiceIdentifier<T>): T | undefined;\n  \n  /**\n   * Check if a service is registered\n   */\n  has(token: ServiceIdentifier): boolean;\n  \n  /**\n   * Unbind a service from the container\n   */\n  unbind(token: ServiceIdentifier): boolean;\n  \n  /**\n   * Create a child container\n   */\n  createChild(options?: Partial<ContainerOptions>): IContainer;\n  \n  /**\n   * Get the parent container\n   */\n  getParent(): IContainer | undefined;\n  \n  /**\n   * Get all registered service tokens\n   */\n  getServices(): ServiceIdentifier[];\n  \n  /**\n   * Clear all registrations\n   */\n  clear(): void;\n  \n  /**\n   * Dispose the container and all singleton instances\n   */\n  dispose(): Promise<void>;\n}\n\n/**\n * Fluent binding builder interface\n */\nexport interface IBindingBuilder<T> {\n  to(implementation: new (...args: any[]) => T): IBindingOptions<T>;\n  toValue(value: T): IBindingFinalized<T>;\n  toFactory(factory: (...deps: any[]) => T): IBindingFactoryOptions<T>;\n  toExisting(token: ServiceIdentifier<T>): IBindingFinalized<T>;\n  toSelf(): IBindingOptions<T>;\n}\n\nexport interface IBindingOptions<T> {\n  inSingletonScope(): IBindingFinalized<T>;\n  inPrototypeScope(): IBindingFinalized<T>;\n  inTransientScope(): IBindingFinalized<T>;\n  inScope(scope: ServiceScope): IBindingFinalized<T>;\n  withOptions(options: ServiceOptions): IBindingFinalized<T>;\n}\n\nexport interface IBindingFactoryOptions<T> {\n  withDependencies(...deps: ServiceIdentifier[]): IBindingFinalized<T>;\n  inSingletonScope(): IBindingFinalized<T>;\n  inPrototypeScope(): IBindingFinalized<T>;\n  inTransientScope(): IBindingFinalized<T>;\n  inScope(scope: ServiceScope): IBindingFinalized<T>;\n  withOptions(options: ServiceOptions): IBindingFinalized<T>;\n}\n\nexport interface IBindingFinalized<T> {\n  // Marker interface for completed bindings\n}\n\n/**\n * Resolution context for tracking dependency resolution\n */\nexport interface ResolutionContext {\n  container: IContainer;\n  resolutionStack: ServiceIdentifier[];\n  cache: Map<ServiceIdentifier, any>;\n  isOptional: boolean;\n}\n\n/**\n * Service instance metadata\n */\nexport interface ServiceInstance<T = any> {\n  instance: T;\n  scope: ServiceScope;\n  createdAt: Date;\n  lastAccessed: Date;\n  accessCount: number;\n  disposed: boolean;\n}\n\n/**\n * Container events\n */\nexport enum ContainerEvent {\n  SERVICE_REGISTERED = 'service:registered',\n  SERVICE_RESOLVED = 'service:resolved',\n  SERVICE_CREATED = 'service:created',\n  SERVICE_DISPOSED = 'service:disposed',\n  CONTAINER_DISPOSED = 'container:disposed'\n}\n\n/**\n * Event data for container events\n */\nexport interface ContainerEventData {\n  token: ServiceIdentifier;\n  instance?: any;\n  container: IContainer;\n  timestamp: Date;\n}\n\n/**\n * Event listener type\n */\nexport type ContainerEventListener = (data: ContainerEventData) => void;\n\n/**\n * Container snapshot for debugging/testing\n */\nexport interface ContainerSnapshot {\n  registrations: ServiceRegistration[];\n  instances: Map<ServiceIdentifier, ServiceInstance>;\n  childContainers: IContainer[];\n  options: ContainerOptions;\n  createdAt: Date;\n}\n\n/**\n * Error types for container operations\n */\nexport class ContainerError extends Error {\n  constructor(message: string, public readonly token?: ServiceIdentifier) {\n    super(message);\n    this.name = 'ContainerError';\n  }\n}\n\nexport class CircularDependencyError extends ContainerError {\n  constructor(\n    public readonly dependencyChain: ServiceIdentifier[],\n    token?: ServiceIdentifier\n  ) {\n    super(\n      `Circular dependency detected: ${dependencyChain.map(t => String(t)).join(' -> ')}`,\n      token\n    );\n    this.name = 'CircularDependencyError';\n  }\n}\n\nexport class ServiceNotFoundError extends ContainerError {\n  constructor(token: ServiceIdentifier) {\n    super(`Service not found: ${String(token)}`, token);\n    this.name = 'ServiceNotFoundError';\n  }\n}\n\nexport class InvalidProviderError extends ContainerError {\n  constructor(message: string, token?: ServiceIdentifier) {\n    super(message, token);\n    this.name = 'InvalidProviderError';\n  }\n}\n\n/**\n * Type guards for provider types\n */\nexport function isClassProvider(provider: Provider): provider is ClassProvider {\n  return provider.type === 'class';\n}\n\nexport function isValueProvider(provider: Provider): provider is ValueProvider {\n  return provider.type === 'value';\n}\n\nexport function isFactoryProvider(provider: Provider): provider is FactoryProvider {\n  return provider.type === 'factory';\n}\n\nexport function isExistingProvider(provider: Provider): provider is ExistingProvider {\n  return provider.type === 'existing';\n}\n\n/**\n * Utility types for improved type inference\n */\nexport type ConstructorParameters<T extends new (...args: any[]) => any> = \n  T extends new (...args: infer P) => any ? P : never;\n\nexport type InstanceType<T extends new (...args: any[]) => any> = \n  T extends new (...args: any[]) => infer R ? R : any;\n\nexport type InferServiceType<T extends ServiceIdentifier> = \n  T extends new (...args: any[]) => infer R ? R :\n  T extends MetadataKey<infer R> ? R :\n  any;", "// Advanced types and utilities for enhanced type safety\n\nimport type { ServiceIdentifier, Provider, ServiceScope } from './index';\n\n/**\n * Conditional types for improved decorator type inference\n */\nexport type DecoratorTarget<T> = T extends ClassDecorator \n  ? new (...args: any[]) => any\n  : T extends PropertyDecorator \n  ? any\n  : T extends MethodDecorator\n  ? (...args: any[]) => any\n  : T extends ParameterDecorator\n  ? any\n  : never;\n\n/**\n * Extract constructor parameter types for dependency injection\n */\nexport type ExtractConstructorParams<T extends new (...args: any[]) => any> = \n  T extends new (...args: infer P) => any ? P : never;\n\n/**\n * Type-safe dependency array for factory providers\n */\nexport type DependencyArray<T extends readonly ServiceIdentifier[]> = {\n  readonly [K in keyof T]: T[K] extends ServiceIdentifier<infer U> ? U : any;\n};\n\n/**\n * Factory function type with typed dependencies\n */\nexport type TypedFactory<T, TDeps extends readonly ServiceIdentifier[] = readonly ServiceIdentifier[]> = \n  (...deps: DependencyArray<TDeps>) => T;\n\n/**\n * Enhanced factory provider with typed dependencies\n */\nexport interface TypedFactoryProvider<T, TDeps extends readonly ServiceIdentifier[] = readonly ServiceIdentifier[]> {\n  type: 'factory';\n  token: ServiceIdentifier<T>;\n  useFactory: TypedFactory<T, TDeps>;\n  deps: TDeps;\n  scope?: ServiceScope;\n}\n\n/**\n * Service registration with compile-time type checking\n */\nexport type TypedServiceRegistration<T> = {\n  [K in keyof Provider<T>]: Provider<T>[K];\n} & {\n  __serviceType?: T; // Phantom type for compile-time checking\n};\n\n/**\n * Container interface with enhanced type safety\n */\nexport interface ITypedContainer {\n  /**\n   * Register with enhanced type checking\n   */\n  registerTyped<T>(registration: TypedServiceRegistration<T>): this;\n  \n  /**\n   * Resolve with guaranteed return type\n   */\n  resolveTyped<T>(token: ServiceIdentifier<T>): T;\n  \n  /**\n   * Register a factory with typed dependencies\n   */\n  registerFactory<T, TDeps extends readonly ServiceIdentifier[]>(\n    token: ServiceIdentifier<T>,\n    factory: TypedFactory<T, TDeps>,\n    deps: TDeps,\n    scope?: ServiceScope\n  ): this;\n}\n\n/**\n * Decorator context types for Modern Decorators\n */\nexport type InjectableDecoratorContext = ClassDecoratorContext;\nexport type InjectDecoratorContext = ClassFieldDecoratorContext | ClassAccessorDecoratorContext;\nexport type LifecycleDecoratorContext = ClassMethodDecoratorContext;\n\n/**\n * Metadata extraction utilities\n */\nexport type ExtractMetadata<T> = T extends { __metadata: infer M } ? M : never;\n\n/**\n * Service collection builder for bulk registrations\n */\nexport interface IServiceCollection {\n  addSingleton<T>(token: ServiceIdentifier<T>, implementation?: new (...args: any[]) => T): this;\n  addTransient<T>(token: ServiceIdentifier<T>, implementation?: new (...args: any[]) => T): this;\n  addScoped<T>(token: ServiceIdentifier<T>, implementation?: new (...args: any[]) => T): this;\n  addInstance<T>(token: ServiceIdentifier<T>, instance: T): this;\n  addFactory<T>(token: ServiceIdentifier<T>, factory: (...deps: any[]) => T, deps?: ServiceIdentifier[]): this;\n  build(): Provider[];\n}\n\n/**\n * Module definition for organizing services\n */\nexport interface ModuleMetadata {\n  providers?: Provider[];\n  imports?: ModuleClass[];\n  exports?: ServiceIdentifier[];\n}\n\nexport interface ModuleClass {\n  new (...args: any[]): any;\n}\n\n/**\n * Async service resolution for lazy loading\n */\nexport interface IAsyncContainer {\n  resolveAsync<T>(token: ServiceIdentifier<T>): Promise<T>;\n  registerAsync<T>(token: ServiceIdentifier<T>, factory: () => Promise<T>): this;\n}\n\n/**\n * Conditional types for service validation\n */\nexport type ValidateService<T> = T extends abstract new (...args: any[]) => any\n  ? 'Abstract classes cannot be used as concrete services'\n  : T extends new (...args: any[]) => any\n  ? T\n  : 'Only constructable types can be used as services';\n\n/**\n * Service interface extraction\n */\nexport type ServiceInterface<T> = T extends new (...args: any[]) => infer I ? I : never;\n\n/**\n * Dependency graph types\n */\nexport interface DependencyNode {\n  token: ServiceIdentifier;\n  dependencies: Set<ServiceIdentifier>;\n  dependents: Set<ServiceIdentifier>;\n  depth: number;\n}\n\nexport type DependencyGraph = Map<ServiceIdentifier, DependencyNode>;\n\n/**\n * Resolution strategy types\n */\nexport enum ResolutionStrategy {\n  THROW_ON_MISSING = 'throw',\n  RETURN_UNDEFINED = 'undefined',\n  USE_DEFAULT = 'default'\n}\n\n/**\n * Interceptor types for AOP support\n */\nexport interface IInterceptor {\n  intercept(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor;\n}\n\nexport type InterceptorFactory = (...args: any[]) => IInterceptor;\n\n/**\n * Service proxy types for lazy loading and interception\n */\nexport interface ServiceProxy<T> {\n  readonly __isProxy: true;\n  readonly __target: ServiceIdentifier<T>;\n  readonly __container: any; // Avoid circular dependency\n}\n\n/**\n * Compile-time service validation\n */\nexport type EnsureService<T> = T extends new (...args: any[]) => any \n  ? T \n  : never;\n\n/**\n * Union type for all possible injection tokens\n */\nexport type InjectionToken<T = any> = \n  | ServiceIdentifier<T>\n  | string \n  | symbol\n  | { toString(): string };\n\n/**\n * Helper type for optional dependencies\n */\nexport type Optional<T> = T | undefined;\n\n/**\n * Container hierarchy types\n */\nexport interface ContainerHierarchy {\n  root: any; // Avoid circular dependency\n  current: any;\n  path: any[];\n}\n\n/**\n * Service lifecycle state\n */\nexport enum ServiceState {\n  REGISTERED = 'registered',\n  CREATING = 'creating', \n  CREATED = 'created',\n  DISPOSED = 'disposed'\n}\n\n/**\n * Enhanced error types with generic support\n */\nexport class TypedContainerError<T = any> extends Error {\n  constructor(\n    message: string,\n    public readonly token?: ServiceIdentifier<T>,\n    public readonly serviceType?: T\n  ) {\n    super(message);\n    this.name = 'TypedContainerError';\n  }\n}", "// Constants and predefined tokens for the DI framework\n\nimport { createMetadataKey } from '../metadata';\nimport type { ContainerOptions, ServiceScope } from './index';\n\n/**\n * Predefined metadata keys for common scenarios\n */\nexport const PREDEFINED_TOKENS = {\n  // Container and infrastructure\n  CONTAINER: createMetadataKey<any>('DI_CONTAINER'),\n  LOGGER: createMetadataKey<any>('DI_LOGGER'),\n  CONFIG: createMetadataKey<any>('DI_CONFIG'),\n  \n  // Common service interfaces\n  HTTP_CLIENT: createMetadataKey<any>('HTTP_CLIENT'),\n  DATABASE: createMetadataKey<any>('DATABASE'),\n  CACHE: createMetadataKey<any>('CACHE'),\n  EVENT_BUS: createMetadataKey<any>('EVENT_BUS'),\n  \n  // Framework internals\n  METADATA_READER: createMetadataKey<any>('METADATA_READER'),\n  LIFECYCLE_MANAGER: createMetadataKey<any>('LIFECYCLE_MANAGER'),\n  DEPENDENCY_RESOLVER: createMetadataKey<any>('DEPENDENCY_RESOLVER')\n} as const;\n\n/**\n * String tokens for common services\n */\nexport const STRING_TOKENS = {\n  // Environment and configuration\n  NODE_ENV: 'NODE_ENV',\n  PORT: 'PORT',\n  DATABASE_URL: 'DATABASE_URL',\n  API_KEY: 'API_KEY',\n  \n  // Application services\n  USER_SERVICE: 'UserService',\n  AUTH_SERVICE: 'AuthService',\n  EMAIL_SERVICE: 'EmailService',\n  \n  // Infrastructure\n  REDIS_CLIENT: 'RedisClient',\n  MONGO_CLIENT: 'MongoClient',\n  MYSQL_CLIENT: 'MySQLClient'\n} as const;\n\n/**\n * Symbol tokens for unique identification\n */\nexport const SYMBOL_TOKENS = {\n  // Core container symbols\n  CONTAINER_ID: Symbol('DI_CONTAINER_ID'),\n  PARENT_CONTAINER: Symbol('DI_PARENT_CONTAINER'),\n  CHILD_CONTAINERS: Symbol('DI_CHILD_CONTAINERS'),\n  \n  // Metadata symbols\n  INJECTABLE_METADATA: Symbol('INJECTABLE_METADATA'),\n  DEPENDENCIES_METADATA: Symbol('DEPENDENCIES_METADATA'),\n  SCOPE_METADATA: Symbol('SCOPE_METADATA'),\n  \n  // Lifecycle symbols\n  POST_CONSTRUCT: Symbol('POST_CONSTRUCT'),\n  PRE_DESTROY: Symbol('PRE_DESTROY'),\n  \n  // Special tokens\n  SELF: Symbol('DI_SELF'),\n  OPTIONAL: Symbol('DI_OPTIONAL'),\n  MULTIPLE: Symbol('DI_MULTIPLE')\n} as const;\n\n/**\n * Default container configuration\n */\nexport const DEFAULT_CONTAINER_OPTIONS: ContainerOptions = {\n  defaultScope: 'singleton' as ServiceScope,\n  autoBindInjectable: true,\n  skipBaseClassChecks: false,\n  throwOnMissingDependencies: true,\n  enableCaching: true,\n  maxCacheSize: 1000\n};\n\n/**\n * Default service scopes\n */\nexport const DEFAULT_SCOPES = {\n  SINGLETON: 'singleton' as const,\n  PROTOTYPE: 'prototype' as const, \n  TRANSIENT: 'transient' as const\n};\n\n/**\n * Container event names as constants\n */\nexport const CONTAINER_EVENTS = {\n  SERVICE_REGISTERED: 'service:registered',\n  SERVICE_RESOLVED: 'service:resolved', \n  SERVICE_CREATED: 'service:created',\n  SERVICE_DISPOSED: 'service:disposed',\n  CONTAINER_DISPOSED: 'container:disposed',\n  DEPENDENCY_RESOLVED: 'dependency:resolved',\n  CIRCULAR_DEPENDENCY: 'circular:dependency',\n  MISSING_DEPENDENCY: 'missing:dependency'\n} as const;\n\n/**\n * Decorator metadata keys\n */\nexport const DECORATOR_KEYS = {\n  INJECTABLE: 'design:injectable',\n  INJECT: 'design:inject',\n  SCOPE: 'design:scope',\n  POST_CONSTRUCT: 'design:postconstruct',\n  PRE_DESTROY: 'design:predestroy',\n  OPTIONAL: 'design:optional',\n  SELF: 'design:self',\n  MULTIPLE: 'design:multiple'\n} as const;\n\n/**\n * Error messages for common scenarios\n */\nexport const ERROR_MESSAGES = {\n  SERVICE_NOT_FOUND: (token: string) => `Service not found: ${token}`,\n  CIRCULAR_DEPENDENCY: (chain: string[]) => `Circular dependency detected: ${chain.join(' -> ')}`,\n  INVALID_PROVIDER: (reason: string) => `Invalid provider: ${reason}`,\n  CONTAINER_DISPOSED: 'Container has been disposed',\n  INVALID_SCOPE: (scope: string) => `Invalid scope: ${scope}`,\n  ABSTRACT_CLASS: (name: string) => `Cannot instantiate abstract class: ${name}`,\n  MISSING_DEPENDENCY: (token: string, target: string) => `Missing dependency ${token} in ${target}`,\n  INVALID_TOKEN: (token: string) => `Invalid service token: ${token}`,\n  REGISTRATION_FAILED: (token: string, reason: string) => `Failed to register ${token}: ${reason}`,\n  RESOLUTION_FAILED: (token: string, reason: string) => `Failed to resolve ${token}: ${reason}`\n} as const;\n\n/**\n * Performance and debugging constants\n */\nexport const PERFORMANCE_CONSTANTS = {\n  MAX_RESOLUTION_DEPTH: 100,\n  MAX_CIRCULAR_REFERENCES: 10,\n  DEFAULT_CACHE_SIZE: 1000,\n  DEFAULT_TIMEOUT_MS: 5000,\n  GC_INTERVAL_MS: 60000, // 1 minute\n  STATS_COLLECTION_INTERVAL_MS: 30000 // 30 seconds\n} as const;\n\n/**\n * Feature flags for optional functionality\n */\nexport const FEATURE_FLAGS = {\n  ENABLE_ASYNC_RESOLUTION: true,\n  ENABLE_LAZY_LOADING: true,\n  ENABLE_PROXY_SERVICES: true,\n  ENABLE_AOP_SUPPORT: false,\n  ENABLE_PERFORMANCE_MONITORING: true,\n  ENABLE_DEBUG_LOGGING: false,\n  ENABLE_STRICT_MODE: true\n} as const;\n\n/**\n * Type-safe access to all constants\n */\nexport const CONSTANTS = {\n  TOKENS: {\n    ...PREDEFINED_TOKENS,\n    ...STRING_TOKENS,\n    ...SYMBOL_TOKENS\n  },\n  DEFAULTS: {\n    CONTAINER_OPTIONS: DEFAULT_CONTAINER_OPTIONS,\n    SCOPES: DEFAULT_SCOPES\n  },\n  EVENTS: CONTAINER_EVENTS,\n  DECORATORS: DECORATOR_KEYS,\n  ERRORS: ERROR_MESSAGES,\n  PERFORMANCE: PERFORMANCE_CONSTANTS,\n  FEATURES: FEATURE_FLAGS\n} as const;", "// Core IoC Container implementation\n\nimport {\n  ServiceIdentifier,\n  ServiceScope,\n  Provider,\n  FactoryProvider,\n  IContainer,\n  ServiceOptions,\n  ContainerOptions,\n  ServiceRegistration,\n  ResolutionContext,\n  ServiceInstance,\n  ContainerError,\n  CircularDependencyError,\n  ServiceNotFoundError,\n  InvalidProviderError,\n  isClassProvider,\n  isValueProvider,\n  isFactoryProvider,\n  isExistingProvider,\n  IBindingBuilder,\n  IBindingOptions,\n  IBindingFactoryOptions,\n  IBindingFinalized\n} from '../types';\n\nimport {\n  getClassMetadata,\n  getPropertyMetadata,\n  getAllPropertyMetadata,\n  getMethodMetadata,\n  getAllMethodMetadata\n} from '../metadata';\n\nimport { DEFAULT_CONTAINER_OPTIONS } from '../types/constants';\n\n/**\n * Core IoC Container implementation\n */\nexport class Container implements IContainer {\n  private readonly registrations = new Map<ServiceIdentifier, ServiceRegistration>();\n  private readonly instances = new Map<ServiceIdentifier, ServiceInstance>();\n  private readonly children = new Set<Container>();\n  private readonly options: ContainerOptions;\n  private readonly parent: Container | undefined;\n  private disposed = false;\n\n  constructor(options: Partial<ContainerOptions> = {}, parent?: Container) {\n    this.options = { ...DEFAULT_CONTAINER_OPTIONS, ...options };\n    this.parent = parent;\n    if (parent) {\n      parent.children.add(this);\n    }\n  }\n\n  /**\n   * Register a service with the container\n   */\n  register<T>(provider: Provider<T>, options: ServiceOptions = {}): this {\n    this.throwIfDisposed();\n    \n    if (!provider || !provider.token) {\n      throw new InvalidProviderError('Provider must have a valid token');\n    }\n\n    // Validate provider based on type\n    this.validateProvider(provider);\n\n    // Create registration metadata\n    const registration: ServiceRegistration<T> = {\n      token: provider.token,\n      provider,\n      options: {\n        scope: options.scope || (provider as any).scope || this.options.defaultScope || ServiceScope.SINGLETON,\n        lazy: options.lazy ?? true,\n        tags: options.tags || [],\n        ...(options.onActivation && { onActivation: options.onActivation }),\n        ...(options.onDeactivation && { onDeactivation: options.onDeactivation })\n      },\n      dependencies: this.extractDependencies(provider),\n      metadata: (() => {\n        const location = this.getSourceLocation();\n        return {\n          registeredAt: new Date(),\n          ...(location && { sourceLocation: location })\n        };\n      })()\n    };\n\n    this.registrations.set(provider.token, registration);\n    \n    // Auto-bind injectable classes if enabled\n    if (this.options.autoBindInjectable && isClassProvider(provider)) {\n      this.autoBindInjectableClass(provider.useClass);\n    }\n\n    return this;\n  }\n\n  /**\n   * Create a fluent binding builder\n   */\n  bind<T>(token: ServiceIdentifier<T>): IBindingBuilder<T> {\n    return new BindingBuilder<T>(token, this);\n  }\n\n  /**\n   * Resolve a service instance\n   */\n  resolve<T>(token: ServiceIdentifier<T>): T {\n    this.throwIfDisposed();\n    \n    const context: ResolutionContext = {\n      container: this,\n      resolutionStack: [],\n      cache: new Map(),\n      isOptional: false\n    };\n\n    return this.resolveWithContext<T>(token, context);\n  }\n\n  /**\n   * Try to resolve a service, return undefined if not found\n   */\n  tryResolve<T>(token: ServiceIdentifier<T>): T | undefined {\n    try {\n      return this.resolve<T>(token);\n    } catch (error) {\n      if (error instanceof ServiceNotFoundError) {\n        return undefined;\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Check if a service is registered\n   */\n  has(token: ServiceIdentifier): boolean {\n    return this.registrations.has(token) || (this.parent?.has(token) ?? false);\n  }\n\n  /**\n   * Unbind a service from the container\n   */\n  unbind(token: ServiceIdentifier): boolean {\n    this.throwIfDisposed();\n    \n    const instance = this.instances.get(token);\n    if (instance) {\n      this.disposeInstance(instance, token);\n      this.instances.delete(token);\n    }\n    \n    return this.registrations.delete(token);\n  }\n\n  /**\n   * Create a child container\n   */\n  createChild(options: Partial<ContainerOptions> = {}): IContainer {\n    this.throwIfDisposed();\n    return new Container(options, this);\n  }\n\n  /**\n   * Get the parent container\n   */\n  getParent(): IContainer | undefined {\n    return this.parent;\n  }\n\n  /**\n   * Get all registered service tokens\n   */\n  getServices(): ServiceIdentifier[] {\n    const tokens = Array.from(this.registrations.keys());\n    if (this.parent) {\n      tokens.push(...this.parent.getServices());\n    }\n    return [...new Set(tokens)]; // Remove duplicates\n  }\n\n  /**\n   * Clear all registrations\n   */\n  clear(): void {\n    this.throwIfDisposed();\n    \n    // Dispose all instances\n    for (const [token, instance] of this.instances) {\n      this.disposeInstance(instance, token);\n    }\n    \n    this.instances.clear();\n    this.registrations.clear();\n  }\n\n  /**\n   * Dispose the container and all singleton instances\n   */\n  async dispose(): Promise<void> {\n    if (this.disposed) return;\n    \n    this.disposed = true;\n    \n    // Dispose all child containers first\n    for (const child of this.children) {\n      await child.dispose();\n    }\n    this.children.clear();\n    \n    // Dispose all instances\n    for (const [token, instance] of this.instances) {\n      this.disposeInstance(instance, token);\n    }\n    \n    this.instances.clear();\n    this.registrations.clear();\n    \n    // Remove from parent\n    if (this.parent) {\n      this.parent.children.delete(this);\n    }\n  }\n\n  // Private helper methods\n\n  private resolveWithContext<T>(token: ServiceIdentifier<T>, context: ResolutionContext): T {\n    // Check for circular dependencies\n    if (context.resolutionStack.includes(token)) {\n      throw new CircularDependencyError([...context.resolutionStack, token], token);\n    }\n\n    // Check cache first (only for circular dependency prevention during this resolution)\n    if (context.cache.has(token)) {\n      return context.cache.get(token);\n    }\n\n    // Find registration\n    const registration = this.findRegistration(token);\n    if (!registration) {\n      if (this.options.throwOnMissingDependencies && !context.isOptional) {\n        throw new ServiceNotFoundError(token);\n      }\n      return undefined as any;\n    }\n\n    const scope = registration.options.scope || ServiceScope.SINGLETON;\n\n    // For prototype and transient scopes, don't check for existing instances\n    // Only singletons should be cached\n    if (scope === ServiceScope.SINGLETON) {\n      const existingInstance = this.instances.get(token);\n      if (existingInstance) {\n        existingInstance.lastAccessed = new Date();\n        existingInstance.accessCount++;\n        return existingInstance.instance;\n      }\n    }\n\n    // Add to resolution stack\n    context.resolutionStack.push(token);\n\n    try {\n      // Create instance\n      const instance = this.createInstance<T>(registration, context);\n      \n      // Cache singleton instances only\n      if (scope === ServiceScope.SINGLETON) {\n        const serviceInstance: ServiceInstance<T> = {\n          instance,\n          scope,\n          createdAt: new Date(),\n          lastAccessed: new Date(),\n          accessCount: 1,\n          disposed: false\n        };\n        this.instances.set(token, serviceInstance);\n      }\n\n      // Add to resolution cache for circular dependency prevention \n      // (only during active resolution of this token)\n      context.cache.set(token, instance);\n\n      // Call activation hook if defined\n      if (registration.options.onActivation) {\n        registration.options.onActivation(instance);\n      }\n\n      return instance;\n    } finally {\n      // Remove from resolution stack\n      context.resolutionStack.pop();\n    }\n  }\n\n  private createInstance<T>(registration: ServiceRegistration<T>, context: ResolutionContext): T {\n    const { provider } = registration;\n\n    if (isClassProvider(provider)) {\n      return this.createClassInstance(provider.useClass, context);\n    }\n\n    if (isValueProvider(provider)) {\n      return provider.useValue;\n    }\n\n    if (isFactoryProvider(provider)) {\n      const dependencies = this.resolveDependencies(provider.deps || [], context);\n      return provider.useFactory(...dependencies);\n    }\n\n    if (isExistingProvider(provider)) {\n      return this.resolveWithContext(provider.useExisting, context);\n    }\n\n    throw new InvalidProviderError(`Unknown provider type for token: ${String((provider as any).token)}`, (provider as any).token);\n  }\n\n  private createClassInstance<T>(constructor: new (...args: any[]) => T, context: ResolutionContext): T {\n    // Get constructor dependencies from metadata\n    const dependencies = this.getConstructorDependencies(constructor);\n    const resolvedDependencies = this.resolveDependencies(dependencies, context);\n\n    // Create instance\n    const instance = new constructor(...resolvedDependencies);\n\n    // Inject properties\n    this.injectProperties(instance, context);\n\n    // Call PostConstruct methods\n    this.callLifecycleMethods(instance, 'postConstruct');\n\n    return instance;\n  }\n\n  private getConstructorDependencies(constructor: Function): ServiceIdentifier[] {\n    const metadata = getClassMetadata(constructor);\n    return metadata?.dependencies || [];\n  }\n\n  private resolveDependencies(tokens: ServiceIdentifier[], context: ResolutionContext): any[] {\n    return tokens.map(token => {\n      const childContext = { ...context, isOptional: false };\n      return this.resolveWithContext(token, childContext);\n    });\n  }\n\n  private injectProperties(instance: any, context: ResolutionContext): void {\n    const propertiesMetadata = getAllPropertyMetadata(instance.constructor.prototype);\n    if (!propertiesMetadata) return;\n\n    for (const [propertyKey, metadata] of propertiesMetadata) {\n      if (metadata.inject && metadata.token) {\n        try {\n          const childContext = { ...context, isOptional: metadata.optional || false };\n          const dependency = this.resolveWithContext(metadata.token, childContext);\n          if (dependency !== undefined) {\n            instance[propertyKey] = dependency;\n          }\n        } catch (error) {\n          if (!metadata.optional) {\n            throw error;\n          }\n        }\n      }\n    }\n  }\n\n  private callLifecycleMethods(instance: any, lifecycle: 'postConstruct' | 'preDestroy'): void {\n    const methodsMetadata = getAllMethodMetadata(instance.constructor.prototype);\n    if (!methodsMetadata) return;\n\n    for (const [methodName, metadata] of methodsMetadata) {\n      if (metadata.lifecycle === lifecycle) {\n        const method = instance[methodName];\n        if (typeof method === 'function') {\n          method.call(instance);\n        }\n      }\n    }\n  }\n\n  private findRegistration(token: ServiceIdentifier): ServiceRegistration | undefined {\n    const registration = this.registrations.get(token);\n    if (registration) return registration;\n\n    // Check parent container\n    if (this.parent) {\n      return (this.parent as Container).findRegistration(token);\n    }\n\n    return undefined;\n  }\n\n  private validateProvider(provider: Provider): void {\n    if (isClassProvider(provider)) {\n      if (!provider.useClass || typeof provider.useClass !== 'function') {\n        throw new InvalidProviderError('ClassProvider must have a valid useClass constructor');\n      }\n    } else if (isFactoryProvider(provider)) {\n      if (!provider.useFactory || typeof provider.useFactory !== 'function') {\n        throw new InvalidProviderError('FactoryProvider must have a valid useFactory function');\n      }\n    } else if (isExistingProvider(provider)) {\n      if (!provider.useExisting) {\n        throw new InvalidProviderError('ExistingProvider must have a valid useExisting token');\n      }\n    }\n  }\n\n  private extractDependencies(provider: Provider): any[] {\n    if (isClassProvider(provider)) {\n      return this.getConstructorDependencies(provider.useClass);\n    }\n    if (isFactoryProvider(provider)) {\n      return provider.deps || [];\n    }\n    return [];\n  }\n\n  private autoBindInjectableClass(constructor: Function): void {\n    const metadata = getClassMetadata(constructor);\n    if (metadata?.injectable) {\n      // Auto-register injectable dependencies\n      const dependencies = metadata.dependencies || [];\n      dependencies.forEach(dep => {\n        if (typeof dep === 'function' && !this.has(dep)) {\n          this.register({\n            type: 'class',\n            token: dep,\n            useClass: dep as any\n          });\n        }\n      });\n    }\n  }\n\n  private disposeInstance(instance: ServiceInstance, token: ServiceIdentifier): void {\n    if (instance.disposed) return;\n\n    // Call PreDestroy methods\n    this.callLifecycleMethods(instance.instance, 'preDestroy');\n\n    // Call deactivation hook if defined\n    const registration = this.registrations.get(token);\n    if (registration?.options.onDeactivation) {\n      registration.options.onDeactivation(instance.instance);\n    }\n\n    instance.disposed = true;\n  }\n\n  private getSourceLocation(): string | undefined {\n    const stack = new Error().stack;\n    if (stack) {\n      const lines = stack.split('\\n');\n      for (let i = 3; i < lines.length; i++) {\n        const line = lines[i];\n        if (line && !line.includes('Container.ts') && !line.includes('node_modules')) {\n          return line.trim();\n        }\n      }\n    }\n    return undefined;\n  }\n\n  private throwIfDisposed(): void {\n    if (this.disposed) {\n      throw new ContainerError('Container has been disposed');\n    }\n  }\n}\n\n/**\n * Fluent binding builder implementation\n */\nclass BindingBuilder<T> implements IBindingBuilder<T> {\n  constructor(\n    private readonly token: ServiceIdentifier<T>,\n    private readonly container: Container\n  ) {}\n\n  to(implementation: new (...args: any[]) => T) {\n    return new BindingOptions<T>(this.token, this.container, {\n      type: 'class',\n      token: this.token,\n      useClass: implementation\n    });\n  }\n\n  toValue(value: T) {\n    this.container.register({\n      type: 'value',\n      token: this.token,\n      useValue: value\n    });\n    return new BindingFinalized<T>();\n  }\n\n  toFactory(factory: (...deps: any[]) => T) {\n    return new BindingFactoryOptions<T>(this.token, this.container, factory);\n  }\n\n  toExisting(token: ServiceIdentifier<T>) {\n    this.container.register({\n      type: 'existing',\n      token: this.token,\n      useExisting: token\n    });\n    return new BindingFinalized<T>();\n  }\n\n  toSelf() {\n    if (typeof this.token !== 'function') {\n      throw new InvalidProviderError('toSelf() can only be used with class tokens');\n    }\n    return this.to(this.token as any);\n  }\n}\n\nclass BindingOptions<T> implements IBindingOptions<T> {\n  constructor(\n    private readonly token: ServiceIdentifier<T>,\n    private readonly container: Container,\n    private provider: Provider<T>\n  ) {}\n\n  inSingletonScope() {\n    this.container.register(this.provider, { scope: ServiceScope.SINGLETON });\n    return new BindingFinalized<T>();\n  }\n\n  inPrototypeScope() {\n    this.container.register(this.provider, { scope: ServiceScope.PROTOTYPE });\n    return new BindingFinalized<T>();\n  }\n\n  inTransientScope() {\n    this.container.register(this.provider, { scope: ServiceScope.TRANSIENT });\n    return new BindingFinalized<T>();\n  }\n\n  inScope(scope: ServiceScope) {\n    this.container.register(this.provider, { scope });\n    return new BindingFinalized<T>();\n  }\n\n  withOptions(options: ServiceOptions) {\n    this.container.register(this.provider, options);\n    return new BindingFinalized<T>();\n  }\n}\n\nclass BindingFactoryOptions<T> implements IBindingFactoryOptions<T> {\n  private deps: ServiceIdentifier[] = [];\n\n  constructor(\n    private readonly token: ServiceIdentifier<T>,\n    private readonly container: Container,\n    private readonly factory: (...deps: any[]) => T\n  ) {}\n\n  withDependencies(...deps: ServiceIdentifier[]) {\n    this.deps = deps;\n    // Register immediately with default scope\n    this.container.register({\n      type: 'factory',\n      token: this.token,\n      useFactory: this.factory,\n      deps: this.deps\n    });\n    return new BindingFinalized<T>();\n  }\n\n  inSingletonScope() {\n    this.container.register({\n      type: 'factory',\n      token: this.token,\n      useFactory: this.factory,\n      deps: this.deps,\n      scope: ServiceScope.SINGLETON\n    });\n    return new BindingFinalized<T>();\n  }\n\n  inPrototypeScope() {\n    this.container.register({\n      type: 'factory',\n      token: this.token,\n      useFactory: this.factory,\n      deps: this.deps,\n      scope: ServiceScope.PROTOTYPE\n    });\n    return new BindingFinalized<T>();\n  }\n\n  inTransientScope() {\n    this.container.register({\n      type: 'factory',\n      token: this.token,\n      useFactory: this.factory,\n      deps: this.deps,\n      scope: ServiceScope.TRANSIENT\n    });\n    return new BindingFinalized<T>();\n  }\n\n  inScope(scope: ServiceScope) {\n    this.container.register({\n      type: 'factory',\n      token: this.token,\n      useFactory: this.factory,\n      deps: this.deps,\n      scope\n    });\n    return new BindingFinalized<T>();\n  }\n\n  withOptions(options: ServiceOptions) {\n    this.container.register({\n      type: 'factory',\n      token: this.token,\n      useFactory: this.factory,\n      deps: this.deps\n    }, options);\n    return new BindingFinalized<T>();\n  }\n}\n\nclass BindingFinalized<T> implements IBindingFinalized<T> {\n  // Marker class for completed bindings\n}", "// Container factory for creating and configuring containers\n\nimport { Container } from './Container';\nimport { IContainer, ContainerOptions, ServiceScope } from '../types';\n\n/**\n * Factory for creating and configuring containers\n */\nexport class ContainerFactory {\n  /**\n   * Create a new container with default configuration\n   */\n  static create(options?: Partial<ContainerOptions>): IContainer {\n    return new Container(options);\n  }\n\n  /**\n   * Create a container optimized for singleton services\n   */\n  static createSingletonContainer(): IContainer {\n    return new Container({\n      defaultScope: ServiceScope.SINGLETON,\n      enableCaching: true,\n      autoBindInjectable: true,\n      throwOnMissingDependencies: true\n    });\n  }\n\n  /**\n   * Create a container optimized for prototype services\n   */\n  static createPrototypeContainer(): IContainer {\n    return new Container({\n      defaultScope: ServiceScope.PROTOTYPE,\n      enableCaching: false,\n      autoBindInjectable: true,\n      throwOnMissingDependencies: true\n    });\n  }\n\n  /**\n   * Create a testing container with relaxed validation\n   */\n  static createTestContainer(): IContainer {\n    return new Container({\n      defaultScope: ServiceScope.SINGLETON,\n      enableCaching: true,\n      autoBindInjectable: false,\n      throwOnMissingDependencies: false,\n      skipBaseClassChecks: true\n    });\n  }\n\n  /**\n   * Create a strict container with enhanced validation\n   */\n  static createStrictContainer(): IContainer {\n    return new Container({\n      defaultScope: ServiceScope.SINGLETON,\n      enableCaching: true,\n      autoBindInjectable: true,\n      throwOnMissingDependencies: true,\n      skipBaseClassChecks: false,\n      maxCacheSize: 500\n    });\n  }\n\n  /**\n   * Create a high-performance container\n   */\n  static createHighPerformanceContainer(): IContainer {\n    return new Container({\n      defaultScope: ServiceScope.SINGLETON,\n      enableCaching: true,\n      autoBindInjectable: true,\n      throwOnMissingDependencies: true,\n      maxCacheSize: 2000\n    });\n  }\n}"],
  "mappings": "oKA2BA,IAAMA,EAAqB,IAAI,QACzBC,EAAwB,IAAI,QAC5BC,EAAsB,IAAI,QAKzB,SAASC,EAA2BC,EAAqC,CAC9E,MAAO,CACL,IAAK,OAAOA,CAAW,EACvB,YAAAA,CACF,CACF,CAKO,SAASC,EAAiBC,EAAkBC,EAA+B,CAChF,IAAMC,EAAWR,EAAmB,IAAIM,CAAM,GAAK,CAAC,EACpDN,EAAmB,IAAIM,EAAQ,CAAE,GAAGE,EAAU,GAAGD,CAAS,CAAC,CAC7D,CAKO,SAASE,EAAiBH,EAA6C,CAC5E,OAAON,EAAmB,IAAIM,CAAM,CACtC,CAKO,SAASI,EACdJ,EACAK,EACAJ,EACM,CACN,IAAIK,EAAiBX,EAAsB,IAAIK,CAAM,EAChDM,IACHA,EAAiB,IAAI,IACrBX,EAAsB,IAAIK,EAAQM,CAAc,GAGlD,IAAMJ,EAAWI,EAAe,IAAID,CAAW,GAAK,CAAC,EACrDC,EAAe,IAAID,EAAa,CAAE,GAAGH,EAAU,GAAGD,CAAS,CAAC,CAC9D,CAKO,SAASM,EACdP,EACAK,EAC8B,CAE9B,OADuBV,EAAsB,IAAIK,CAAM,GAChC,IAAIK,CAAW,CACxC,CAKO,SAASG,EACdR,EACAS,EACAR,EACM,CACN,IAAIK,EAAiBV,EAAoB,IAAII,CAAM,EAC9CM,IACHA,EAAiB,IAAI,IACrBV,EAAoB,IAAII,EAAQM,CAAc,GAGhD,IAAMJ,EAAWI,EAAe,IAAIG,CAAS,GAAK,CAAC,EACnDH,EAAe,IAAIG,EAAW,CAAE,GAAGP,EAAU,GAAGD,CAAS,CAAC,CAC5D,CAKO,SAASS,EACdV,EACAS,EAC4B,CAE5B,OADuBb,EAAoB,IAAII,CAAM,GAC9B,IAAIS,CAAS,CACtC,CAKO,SAASE,EAAuBX,EAAoE,CACzG,OAAOL,EAAsB,IAAIK,CAAM,CACzC,CAKO,SAASY,EAAqBZ,EAAkE,CACrG,OAAOJ,EAAoB,IAAII,CAAM,CACvC,CAKO,SAASa,GAAiBb,EAA2B,CAC1D,OAAON,EAAmB,IAAIM,CAAM,CACtC,CAKO,SAASc,GAAoBd,EAAgBK,EAAuC,CAEzF,OADuBV,EAAsB,IAAIK,CAAM,GAChC,IAAIK,CAAW,GAAK,EAC7C,CAKO,SAASU,GAAkBf,EAAgBS,EAAqC,CAErF,OADuBb,EAAoB,IAAII,CAAM,GAC9B,IAAIS,CAAS,GAAK,EAC3C,CAKO,SAASO,GAAmBhB,EAAwB,CACzDN,EAAmB,OAAOM,CAAM,EAChCL,EAAsB,OAAOK,EAAO,SAAS,EAC7CJ,EAAoB,OAAOI,EAAO,SAAS,CAC7C,CCjJO,SAASiB,GAAWC,EAAiD,YAAa,CACvF,OAAO,SACLC,EACAC,EACG,CACH,OAAAC,EAAiBF,EAAQ,CACvB,WAAY,GACZ,MAAAD,CACF,CAAC,EAEMC,CACT,CACF,CAKO,SAASG,GAAOC,EAA8BC,EAAoB,GAAO,CAC9E,OAAO,SACLL,EACAC,EACA,CACAA,EAAQ,eAAe,UAAqB,CAC1CK,EAAoB,KAAK,YAAY,UAAWL,EAAQ,KAAM,CAC5D,MAAAG,EACA,SAAAC,EACA,OAAQ,EACV,CAAC,CACH,CAAC,CACH,CACF,CAKO,SAASE,GACdP,EACAC,EACG,CACH,OAAAC,EAAiBF,EAAQ,CACvB,MAAO,WACT,CAAC,EAEMA,CACT,CAKO,SAASQ,GAAMT,EAAgD,CACpE,OAAO,SACLC,EACAC,EACG,CACH,OAAAC,EAAiBF,EAAQ,CACvB,MAAAD,CACF,CAAC,EAEMC,CACT,CACF,CAKO,SAASS,GACdT,EACAC,EACU,CACV,OAAAA,EAAQ,eAAe,UAAqB,CAC1CS,EAAkB,KAAK,YAAY,UAAWT,EAAQ,KAAM,CAC1D,UAAW,eACb,CAAC,CACH,CAAC,EAEMD,CACT,CAKO,SAASW,GACdX,EACAC,EACU,CACV,OAAAA,EAAQ,eAAe,UAAqB,CAC1CS,EAAkB,KAAK,YAAY,UAAWT,EAAQ,KAAM,CAC1D,UAAW,YACb,CAAC,CACH,CAAC,EAEMD,CACT,CAKO,SAASY,GAAQR,EAA6BS,EAAY,CAC/D,OAAO,SACLb,EACAC,EACG,CAGH,OAAAC,EAAiBF,EAAQ,CACvB,UAHgB,CAAC,CAAE,MAAAI,EAAO,MAAAS,CAAM,CAAC,CAInC,CAAC,EAEMb,CACT,CACF,CAGO,IAAMc,GAAcC,EAA4B,aAAa,EACvDC,GAAqBD,EAA8B,mBAAmB,EACtEE,GAAqBF,EAA4B,mBAAmB,EChH1E,IAAKG,OACVA,EAAA,UAAY,YACZA,EAAA,UAAY,YACZA,EAAA,UAAY,YAHFA,OAAA,IASAC,OACVA,EAAA,eAAiB,gBACjBA,EAAA,YAAc,aAFJA,OAAA,IAgNAC,OACVA,EAAA,mBAAqB,qBACrBA,EAAA,iBAAmB,mBACnBA,EAAA,gBAAkB,kBAClBA,EAAA,iBAAmB,mBACnBA,EAAA,mBAAqB,qBALXA,OAAA,IAqCCC,EAAN,cAA6B,KAAM,CACxC,YAAYC,EAAiCC,EAA2B,CACtE,MAAMD,CAAO,EAD8B,WAAAC,EAE3C,KAAK,KAAO,gBACd,CACF,EAEaC,EAAN,cAAsCH,CAAe,CAC1D,YACkBI,EAChBF,EACA,CACA,MACE,iCAAiCE,EAAgB,IAAIC,GAAK,OAAOA,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,GACjFH,CACF,EANgB,qBAAAE,EAOhB,KAAK,KAAO,yBACd,CACF,EAEaE,EAAN,cAAmCN,CAAe,CACvD,YAAYE,EAA0B,CACpC,MAAM,sBAAsB,OAAOA,CAAK,CAAC,GAAIA,CAAK,EAClD,KAAK,KAAO,sBACd,CACF,EAEaK,EAAN,cAAmCP,CAAe,CACvD,YAAYC,EAAiBC,EAA2B,CACtD,MAAMD,EAASC,CAAK,EACpB,KAAK,KAAO,sBACd,CACF,EAKO,SAASM,EAAgBC,EAA+C,CAC7E,OAAOA,EAAS,OAAS,OAC3B,CAEO,SAASC,EAAgBD,EAA+C,CAC7E,OAAOA,EAAS,OAAS,OAC3B,CAEO,SAASE,EAAkBF,EAAiD,CACjF,OAAOA,EAAS,OAAS,SAC3B,CAEO,SAASG,EAAmBH,EAAkD,CACnF,OAAOA,EAAS,OAAS,UAC3B,CCtKO,IAAKI,OACVA,EAAA,iBAAmB,QACnBA,EAAA,iBAAmB,YACnBA,EAAA,YAAc,UAHJA,OAAA,IAyDAC,OACVA,EAAA,WAAa,aACbA,EAAA,SAAW,WACXA,EAAA,QAAU,UACVA,EAAA,SAAW,WAJDA,OAAA,IAUCC,EAAN,cAA2C,KAAM,CACtD,YACEC,EACgBC,EACAC,EAChB,CACA,MAAMF,CAAO,EAHG,WAAAC,EACA,iBAAAC,EAGhB,KAAK,KAAO,qBACd,CACF,EC/NO,IAAMC,EAAoB,CAE/B,UAAWC,EAAuB,cAAc,EAChD,OAAQA,EAAuB,WAAW,EAC1C,OAAQA,EAAuB,WAAW,EAG1C,YAAaA,EAAuB,aAAa,EACjD,SAAUA,EAAuB,UAAU,EAC3C,MAAOA,EAAuB,OAAO,EACrC,UAAWA,EAAuB,WAAW,EAG7C,gBAAiBA,EAAuB,iBAAiB,EACzD,kBAAmBA,EAAuB,mBAAmB,EAC7D,oBAAqBA,EAAuB,qBAAqB,CACnE,EAKaC,EAAgB,CAE3B,SAAU,WACV,KAAM,OACN,aAAc,eACd,QAAS,UAGT,aAAc,cACd,aAAc,cACd,cAAe,eAGf,aAAc,cACd,aAAc,cACd,aAAc,aAChB,EAKaC,EAAgB,CAE3B,aAAc,OAAO,iBAAiB,EACtC,iBAAkB,OAAO,qBAAqB,EAC9C,iBAAkB,OAAO,qBAAqB,EAG9C,oBAAqB,OAAO,qBAAqB,EACjD,sBAAuB,OAAO,uBAAuB,EACrD,eAAgB,OAAO,gBAAgB,EAGvC,eAAgB,OAAO,gBAAgB,EACvC,YAAa,OAAO,aAAa,EAGjC,KAAM,OAAO,SAAS,EACtB,SAAU,OAAO,aAAa,EAC9B,SAAU,OAAO,aAAa,CAChC,EAKaC,EAA8C,CACzD,aAAc,YACd,mBAAoB,GACpB,oBAAqB,GACrB,2BAA4B,GAC5B,cAAe,GACf,aAAc,GAChB,EAKaC,EAAiB,CAC5B,UAAW,YACX,UAAW,YACX,UAAW,WACb,EAKaC,EAAmB,CAC9B,mBAAoB,qBACpB,iBAAkB,mBAClB,gBAAiB,kBACjB,iBAAkB,mBAClB,mBAAoB,qBACpB,oBAAqB,sBACrB,oBAAqB,sBACrB,mBAAoB,oBACtB,EAKaC,EAAiB,CAC5B,WAAY,oBACZ,OAAQ,gBACR,MAAO,eACP,eAAgB,uBAChB,YAAa,oBACb,SAAU,kBACV,KAAM,cACN,SAAU,iBACZ,EAKaC,EAAiB,CAC5B,kBAAoBC,GAAkB,sBAAsBA,CAAK,GACjE,oBAAsBC,GAAoB,iCAAiCA,EAAM,KAAK,MAAM,CAAC,GAC7F,iBAAmBC,GAAmB,qBAAqBA,CAAM,GACjE,mBAAoB,8BACpB,cAAgBC,GAAkB,kBAAkBA,CAAK,GACzD,eAAiBC,GAAiB,sCAAsCA,CAAI,GAC5E,mBAAoB,CAACJ,EAAeK,IAAmB,sBAAsBL,CAAK,OAAOK,CAAM,GAC/F,cAAgBL,GAAkB,0BAA0BA,CAAK,GACjE,oBAAqB,CAACA,EAAeE,IAAmB,sBAAsBF,CAAK,KAAKE,CAAM,GAC9F,kBAAmB,CAACF,EAAeE,IAAmB,qBAAqBF,CAAK,KAAKE,CAAM,EAC7F,EAKaI,EAAwB,CACnC,qBAAsB,IACtB,wBAAyB,GACzB,mBAAoB,IACpB,mBAAoB,IACpB,eAAgB,IAChB,6BAA8B,GAChC,EAKaC,EAAgB,CAC3B,wBAAyB,GACzB,oBAAqB,GACrB,sBAAuB,GACvB,mBAAoB,GACpB,8BAA+B,GAC/B,qBAAsB,GACtB,mBAAoB,EACtB,EAKaC,GAAY,CACvB,OAAQ,CACN,GAAGjB,EACH,GAAGE,EACH,GAAGC,CACL,EACA,SAAU,CACR,kBAAmBC,EACnB,OAAQC,CACV,EACA,OAAQC,EACR,WAAYC,EACZ,OAAQC,EACR,YAAaO,EACb,SAAUC,CACZ,EC3IO,IAAME,EAAN,MAAMC,CAAgC,CAQ3C,YAAYC,EAAqC,CAAC,EAAGC,EAAoB,CAPzEC,EAAA,KAAiB,gBAAgB,IAAI,KACrCA,EAAA,KAAiB,YAAY,IAAI,KACjCA,EAAA,KAAiB,WAAW,IAAI,KAChCA,EAAA,KAAiB,WACjBA,EAAA,KAAiB,UACjBA,EAAA,KAAQ,WAAW,IAGjB,KAAK,QAAU,CAAE,GAAGC,EAA2B,GAAGH,CAAQ,EAC1D,KAAK,OAASC,EACVA,GACFA,EAAO,SAAS,IAAI,IAAI,CAE5B,CAKA,SAAYG,EAAuBJ,EAA0B,CAAC,EAAS,CAGrE,GAFA,KAAK,gBAAgB,EAEjB,CAACI,GAAY,CAACA,EAAS,MACzB,MAAM,IAAIC,EAAqB,kCAAkC,EAInE,KAAK,iBAAiBD,CAAQ,EAG9B,IAAME,EAAuC,CAC3C,MAAOF,EAAS,MAChB,SAAAA,EACA,QAAS,CACP,MAAOJ,EAAQ,OAAUI,EAAiB,OAAS,KAAK,QAAQ,cAAgB,YAChF,KAAMJ,EAAQ,MAAQ,GACtB,KAAMA,EAAQ,MAAQ,CAAC,EACvB,GAAIA,EAAQ,cAAgB,CAAE,aAAcA,EAAQ,YAAa,EACjE,GAAIA,EAAQ,gBAAkB,CAAE,eAAgBA,EAAQ,cAAe,CACzE,EACA,aAAc,KAAK,oBAAoBI,CAAQ,EAC/C,UAAW,IAAM,CACf,IAAMG,EAAW,KAAK,kBAAkB,EACxC,MAAO,CACL,aAAc,IAAI,KAClB,GAAIA,GAAY,CAAE,eAAgBA,CAAS,CAC7C,CACF,GAAG,CACL,EAEA,YAAK,cAAc,IAAIH,EAAS,MAAOE,CAAY,EAG/C,KAAK,QAAQ,oBAAsBE,EAAgBJ,CAAQ,GAC7D,KAAK,wBAAwBA,EAAS,QAAQ,EAGzC,IACT,CAKA,KAAQK,EAAiD,CACvD,OAAO,IAAIC,EAAkBD,EAAO,IAAI,CAC1C,CAKA,QAAWA,EAAgC,CACzC,KAAK,gBAAgB,EAErB,IAAME,EAA6B,CACjC,UAAW,KACX,gBAAiB,CAAC,EAClB,MAAO,IAAI,IACX,WAAY,EACd,EAEA,OAAO,KAAK,mBAAsBF,EAAOE,CAAO,CAClD,CAKA,WAAcF,EAA4C,CACxD,GAAI,CACF,OAAO,KAAK,QAAWA,CAAK,CAC9B,OAASG,EAAO,CACd,GAAIA,aAAiBC,EACnB,OAEF,MAAMD,CACR,CACF,CAKA,IAAIH,EAAmC,CACrC,OAAO,KAAK,cAAc,IAAIA,CAAK,IAAM,KAAK,QAAQ,IAAIA,CAAK,GAAK,GACtE,CAKA,OAAOA,EAAmC,CACxC,KAAK,gBAAgB,EAErB,IAAMK,EAAW,KAAK,UAAU,IAAIL,CAAK,EACzC,OAAIK,IACF,KAAK,gBAAgBA,EAAUL,CAAK,EACpC,KAAK,UAAU,OAAOA,CAAK,GAGtB,KAAK,cAAc,OAAOA,CAAK,CACxC,CAKA,YAAYT,EAAqC,CAAC,EAAe,CAC/D,YAAK,gBAAgB,EACd,IAAID,EAAUC,EAAS,IAAI,CACpC,CAKA,WAAoC,CAClC,OAAO,KAAK,MACd,CAKA,aAAmC,CACjC,IAAMe,EAAS,MAAM,KAAK,KAAK,cAAc,KAAK,CAAC,EACnD,OAAI,KAAK,QACPA,EAAO,KAAK,GAAG,KAAK,OAAO,YAAY,CAAC,EAEnC,CAAC,GAAG,IAAI,IAAIA,CAAM,CAAC,CAC5B,CAKA,OAAc,CACZ,KAAK,gBAAgB,EAGrB,OAAW,CAACN,EAAOK,CAAQ,IAAK,KAAK,UACnC,KAAK,gBAAgBA,EAAUL,CAAK,EAGtC,KAAK,UAAU,MAAM,EACrB,KAAK,cAAc,MAAM,CAC3B,CAKA,MAAM,SAAyB,CAC7B,GAAI,MAAK,SAET,MAAK,SAAW,GAGhB,QAAWO,KAAS,KAAK,SACvB,MAAMA,EAAM,QAAQ,EAEtB,KAAK,SAAS,MAAM,EAGpB,OAAW,CAACP,EAAOK,CAAQ,IAAK,KAAK,UACnC,KAAK,gBAAgBA,EAAUL,CAAK,EAGtC,KAAK,UAAU,MAAM,EACrB,KAAK,cAAc,MAAM,EAGrB,KAAK,QACP,KAAK,OAAO,SAAS,OAAO,IAAI,EAEpC,CAIQ,mBAAsBA,EAA6BE,EAA+B,CAExF,GAAIA,EAAQ,gBAAgB,SAASF,CAAK,EACxC,MAAM,IAAIQ,EAAwB,CAAC,GAAGN,EAAQ,gBAAiBF,CAAK,EAAGA,CAAK,EAI9E,GAAIE,EAAQ,MAAM,IAAIF,CAAK,EACzB,OAAOE,EAAQ,MAAM,IAAIF,CAAK,EAIhC,IAAMH,EAAe,KAAK,iBAAiBG,CAAK,EAChD,GAAI,CAACH,EAAc,CACjB,GAAI,KAAK,QAAQ,4BAA8B,CAACK,EAAQ,WACtD,MAAM,IAAIE,EAAqBJ,CAAK,EAEtC,MACF,CAEA,IAAMS,EAAQZ,EAAa,QAAQ,OAAS,YAI5C,GAAIY,IAAU,YAAwB,CACpC,IAAMC,EAAmB,KAAK,UAAU,IAAIV,CAAK,EACjD,GAAIU,EACF,OAAAA,EAAiB,aAAe,IAAI,KACpCA,EAAiB,cACVA,EAAiB,QAE5B,CAGAR,EAAQ,gBAAgB,KAAKF,CAAK,EAElC,GAAI,CAEF,IAAMK,EAAW,KAAK,eAAkBR,EAAcK,CAAO,EAG7D,GAAIO,IAAU,YAAwB,CACpC,IAAME,EAAsC,CAC1C,SAAAN,EACA,MAAAI,EACA,UAAW,IAAI,KACf,aAAc,IAAI,KAClB,YAAa,EACb,SAAU,EACZ,EACA,KAAK,UAAU,IAAIT,EAAOW,CAAe,CAC3C,CAIA,OAAAT,EAAQ,MAAM,IAAIF,EAAOK,CAAQ,EAG7BR,EAAa,QAAQ,cACvBA,EAAa,QAAQ,aAAaQ,CAAQ,EAGrCA,CACT,QAAE,CAEAH,EAAQ,gBAAgB,IAAI,CAC9B,CACF,CAEQ,eAAkBL,EAAsCK,EAA+B,CAC7F,GAAM,CAAE,SAAAP,CAAS,EAAIE,EAErB,GAAIE,EAAgBJ,CAAQ,EAC1B,OAAO,KAAK,oBAAoBA,EAAS,SAAUO,CAAO,EAG5D,GAAIU,EAAgBjB,CAAQ,EAC1B,OAAOA,EAAS,SAGlB,GAAIkB,EAAkBlB,CAAQ,EAAG,CAC/B,IAAMmB,EAAe,KAAK,oBAAoBnB,EAAS,MAAQ,CAAC,EAAGO,CAAO,EAC1E,OAAOP,EAAS,WAAW,GAAGmB,CAAY,CAC5C,CAEA,GAAIC,EAAmBpB,CAAQ,EAC7B,OAAO,KAAK,mBAAmBA,EAAS,YAAaO,CAAO,EAG9D,MAAM,IAAIN,EAAqB,oCAAoC,OAAQD,EAAiB,KAAK,CAAC,GAAKA,EAAiB,KAAK,CAC/H,CAEQ,oBAAuBqB,EAAwCd,EAA+B,CAEpG,IAAMY,EAAe,KAAK,2BAA2BE,CAAW,EAC1DC,EAAuB,KAAK,oBAAoBH,EAAcZ,CAAO,EAGrEG,EAAW,IAAIW,EAAY,GAAGC,CAAoB,EAGxD,YAAK,iBAAiBZ,EAAUH,CAAO,EAGvC,KAAK,qBAAqBG,EAAU,eAAe,EAE5CA,CACT,CAEQ,2BAA2BW,EAA4C,CAE7E,OADiBE,EAAiBF,CAAW,GAC5B,cAAgB,CAAC,CACpC,CAEQ,oBAAoBV,EAA6BJ,EAAmC,CAC1F,OAAOI,EAAO,IAAIN,GAAS,CACzB,IAAMmB,EAAe,CAAE,GAAGjB,EAAS,WAAY,EAAM,EACrD,OAAO,KAAK,mBAAmBF,EAAOmB,CAAY,CACpD,CAAC,CACH,CAEQ,iBAAiBd,EAAeH,EAAkC,CACxE,IAAMkB,EAAqBC,EAAuBhB,EAAS,YAAY,SAAS,EAChF,GAAKe,GAEL,OAAW,CAACE,EAAaC,CAAQ,IAAKH,EACpC,GAAIG,EAAS,QAAUA,EAAS,MAC9B,GAAI,CACF,IAAMJ,EAAe,CAAE,GAAGjB,EAAS,WAAYqB,EAAS,UAAY,EAAM,EACpEC,EAAa,KAAK,mBAAmBD,EAAS,MAAOJ,CAAY,EACnEK,IAAe,SACjBnB,EAASiB,CAAW,EAAIE,EAE5B,OAASrB,EAAO,CACd,GAAI,CAACoB,EAAS,SACZ,MAAMpB,CAEV,EAGN,CAEQ,qBAAqBE,EAAeoB,EAAiD,CAC3F,IAAMC,EAAkBC,EAAqBtB,EAAS,YAAY,SAAS,EAC3E,GAAKqB,GAEL,OAAW,CAACE,EAAYL,CAAQ,IAAKG,EACnC,GAAIH,EAAS,YAAcE,EAAW,CACpC,IAAMI,EAASxB,EAASuB,CAAU,EAC9B,OAAOC,GAAW,YACpBA,EAAO,KAAKxB,CAAQ,CAExB,EAEJ,CAEQ,iBAAiBL,EAA2D,CAClF,IAAMH,EAAe,KAAK,cAAc,IAAIG,CAAK,EACjD,GAAIH,EAAc,OAAOA,EAGzB,GAAI,KAAK,OACP,OAAQ,KAAK,OAAqB,iBAAiBG,CAAK,CAI5D,CAEQ,iBAAiBL,EAA0B,CACjD,GAAII,EAAgBJ,CAAQ,GAC1B,GAAI,CAACA,EAAS,UAAY,OAAOA,EAAS,UAAa,WACrD,MAAM,IAAIC,EAAqB,sDAAsD,UAE9EiB,EAAkBlB,CAAQ,GACnC,GAAI,CAACA,EAAS,YAAc,OAAOA,EAAS,YAAe,WACzD,MAAM,IAAIC,EAAqB,uDAAuD,UAE/EmB,EAAmBpB,CAAQ,GAChC,CAACA,EAAS,YACZ,MAAM,IAAIC,EAAqB,sDAAsD,CAG3F,CAEQ,oBAAoBD,EAA2B,CACrD,OAAII,EAAgBJ,CAAQ,EACnB,KAAK,2BAA2BA,EAAS,QAAQ,EAEtDkB,EAAkBlB,CAAQ,EACrBA,EAAS,MAAQ,CAAC,EAEpB,CAAC,CACV,CAEQ,wBAAwBqB,EAA6B,CAC3D,IAAMO,EAAWL,EAAiBF,CAAW,EACzCO,GAAU,aAESA,EAAS,cAAgB,CAAC,GAClC,QAAQO,GAAO,CACtB,OAAOA,GAAQ,YAAc,CAAC,KAAK,IAAIA,CAAG,GAC5C,KAAK,SAAS,CACZ,KAAM,QACN,MAAOA,EACP,SAAUA,CACZ,CAAC,CAEL,CAAC,CAEL,CAEQ,gBAAgBzB,EAA2BL,EAAgC,CACjF,GAAIK,EAAS,SAAU,OAGvB,KAAK,qBAAqBA,EAAS,SAAU,YAAY,EAGzD,IAAMR,EAAe,KAAK,cAAc,IAAIG,CAAK,EAC7CH,GAAc,QAAQ,gBACxBA,EAAa,QAAQ,eAAeQ,EAAS,QAAQ,EAGvDA,EAAS,SAAW,EACtB,CAEQ,mBAAwC,CAC9C,IAAM0B,EAAQ,IAAI,MAAM,EAAE,MAC1B,GAAIA,EAAO,CACT,IAAMC,EAAQD,EAAM,MAAM;AAAA,CAAI,EAC9B,QAAS,EAAI,EAAG,EAAIC,EAAM,OAAQ,IAAK,CACrC,IAAMC,EAAOD,EAAM,CAAC,EACpB,GAAIC,GAAQ,CAACA,EAAK,SAAS,cAAc,GAAK,CAACA,EAAK,SAAS,cAAc,EACzE,OAAOA,EAAK,KAAK,CAErB,CACF,CAEF,CAEQ,iBAAwB,CAC9B,GAAI,KAAK,SACP,MAAM,IAAIC,EAAe,6BAA6B,CAE1D,CACF,EAKMjC,EAAN,KAAsD,CACpD,YACmBD,EACAmC,EACjB,CAFiB,WAAAnC,EACA,eAAAmC,CAChB,CAEH,GAAGC,EAA2C,CAC5C,OAAO,IAAIC,EAAkB,KAAK,MAAO,KAAK,UAAW,CACvD,KAAM,QACN,MAAO,KAAK,MACZ,SAAUD,CACZ,CAAC,CACH,CAEA,QAAQE,EAAU,CAChB,YAAK,UAAU,SAAS,CACtB,KAAM,QACN,MAAO,KAAK,MACZ,SAAUA,CACZ,CAAC,EACM,IAAIC,CACb,CAEA,UAAUC,EAAgC,CACxC,OAAO,IAAIC,EAAyB,KAAK,MAAO,KAAK,UAAWD,CAAO,CACzE,CAEA,WAAWxC,EAA6B,CACtC,YAAK,UAAU,SAAS,CACtB,KAAM,WACN,MAAO,KAAK,MACZ,YAAaA,CACf,CAAC,EACM,IAAIuC,CACb,CAEA,QAAS,CACP,GAAI,OAAO,KAAK,OAAU,WACxB,MAAM,IAAI3C,EAAqB,6CAA6C,EAE9E,OAAO,KAAK,GAAG,KAAK,KAAY,CAClC,CACF,EAEMyC,EAAN,KAAsD,CACpD,YACmBrC,EACAmC,EACTxC,EACR,CAHiB,WAAAK,EACA,eAAAmC,EACT,cAAAxC,CACP,CAEH,kBAAmB,CACjB,YAAK,UAAU,SAAS,KAAK,SAAU,CAAE,iBAA8B,CAAC,EACjE,IAAI4C,CACb,CAEA,kBAAmB,CACjB,YAAK,UAAU,SAAS,KAAK,SAAU,CAAE,iBAA8B,CAAC,EACjE,IAAIA,CACb,CAEA,kBAAmB,CACjB,YAAK,UAAU,SAAS,KAAK,SAAU,CAAE,iBAA8B,CAAC,EACjE,IAAIA,CACb,CAEA,QAAQ9B,EAAqB,CAC3B,YAAK,UAAU,SAAS,KAAK,SAAU,CAAE,MAAAA,CAAM,CAAC,EACzC,IAAI8B,CACb,CAEA,YAAYhD,EAAyB,CACnC,YAAK,UAAU,SAAS,KAAK,SAAUA,CAAO,EACvC,IAAIgD,CACb,CACF,EAEME,EAAN,KAAoE,CAGlE,YACmBzC,EACAmC,EACAK,EACjB,CAHiB,WAAAxC,EACA,eAAAmC,EACA,aAAAK,EALnB/C,EAAA,KAAQ,OAA4B,CAAC,EAMlC,CAEH,oBAAoBiD,EAA2B,CAC7C,YAAK,KAAOA,EAEZ,KAAK,UAAU,SAAS,CACtB,KAAM,UACN,MAAO,KAAK,MACZ,WAAY,KAAK,QACjB,KAAM,KAAK,IACb,CAAC,EACM,IAAIH,CACb,CAEA,kBAAmB,CACjB,YAAK,UAAU,SAAS,CACtB,KAAM,UACN,MAAO,KAAK,MACZ,WAAY,KAAK,QACjB,KAAM,KAAK,KACX,iBACF,CAAC,EACM,IAAIA,CACb,CAEA,kBAAmB,CACjB,YAAK,UAAU,SAAS,CACtB,KAAM,UACN,MAAO,KAAK,MACZ,WAAY,KAAK,QACjB,KAAM,KAAK,KACX,iBACF,CAAC,EACM,IAAIA,CACb,CAEA,kBAAmB,CACjB,YAAK,UAAU,SAAS,CACtB,KAAM,UACN,MAAO,KAAK,MACZ,WAAY,KAAK,QACjB,KAAM,KAAK,KACX,iBACF,CAAC,EACM,IAAIA,CACb,CAEA,QAAQ9B,EAAqB,CAC3B,YAAK,UAAU,SAAS,CACtB,KAAM,UACN,MAAO,KAAK,MACZ,WAAY,KAAK,QACjB,KAAM,KAAK,KACX,MAAAA,CACF,CAAC,EACM,IAAI8B,CACb,CAEA,YAAYhD,EAAyB,CACnC,YAAK,UAAU,SAAS,CACtB,KAAM,UACN,MAAO,KAAK,MACZ,WAAY,KAAK,QACjB,KAAM,KAAK,IACb,EAAGA,CAAO,EACH,IAAIgD,CACb,CACF,EAEMA,EAAN,KAA0D,CAE1D,ECnnBO,IAAMI,EAAN,KAAuB,CAI5B,OAAO,OAAOC,EAAiD,CAC7D,OAAO,IAAIC,EAAUD,CAAO,CAC9B,CAKA,OAAO,0BAAuC,CAC5C,OAAO,IAAIC,EAAU,CACnB,yBACA,cAAe,GACf,mBAAoB,GACpB,2BAA4B,EAC9B,CAAC,CACH,CAKA,OAAO,0BAAuC,CAC5C,OAAO,IAAIA,EAAU,CACnB,yBACA,cAAe,GACf,mBAAoB,GACpB,2BAA4B,EAC9B,CAAC,CACH,CAKA,OAAO,qBAAkC,CACvC,OAAO,IAAIA,EAAU,CACnB,yBACA,cAAe,GACf,mBAAoB,GACpB,2BAA4B,GAC5B,oBAAqB,EACvB,CAAC,CACH,CAKA,OAAO,uBAAoC,CACzC,OAAO,IAAIA,EAAU,CACnB,yBACA,cAAe,GACf,mBAAoB,GACpB,2BAA4B,GAC5B,oBAAqB,GACrB,aAAc,GAChB,CAAC,CACH,CAKA,OAAO,gCAA6C,CAClD,OAAO,IAAIA,EAAU,CACnB,yBACA,cAAe,GACf,mBAAoB,GACpB,2BAA4B,GAC5B,aAAc,GAChB,CAAC,CACH,CACF",
  "names": ["classMetadataStore", "propertyMetadataStore", "methodMetadataStore", "createMetadataKey", "description", "setClassMetadata", "target", "metadata", "existing", "getClassMetadata", "setPropertyMetadata", "propertyKey", "targetMetadata", "getPropertyMetadata", "setMethodMetadata", "methodKey", "getMethodMetadata", "getAllPropertyMetadata", "getAllMethodMetadata", "hasClassMetadata", "hasPropertyMetadata", "hasMethodMetadata", "clearClassMetadata", "Injectable", "scope", "target", "context", "setClassMetadata", "Inject", "token", "optional", "setPropertyMetadata", "Singleton", "Scope", "PostConstruct", "setMethodMetadata", "PreDestroy", "Provide", "value", "DESIGN_TYPE", "createMetadataKey", "DESIGN_PARAM_TYPES", "DESIGN_RETURN_TYPE", "ServiceScope", "ServiceLifecycle", "ContainerEvent", "ContainerError", "message", "token", "CircularDependencyError", "dependencyChain", "t", "ServiceNotFoundError", "InvalidProviderError", "isClassProvider", "provider", "isValueProvider", "isFactoryProvider", "isExistingProvider", "ResolutionStrategy", "ServiceState", "TypedContainerError", "message", "token", "serviceType", "PREDEFINED_TOKENS", "createMetadataKey", "STRING_TOKENS", "SYMBOL_TOKENS", "DEFAULT_CONTAINER_OPTIONS", "DEFAULT_SCOPES", "CONTAINER_EVENTS", "DECORATOR_KEYS", "ERROR_MESSAGES", "token", "chain", "reason", "scope", "name", "target", "PERFORMANCE_CONSTANTS", "FEATURE_FLAGS", "CONSTANTS", "Container", "_Container", "options", "parent", "__publicField", "DEFAULT_CONTAINER_OPTIONS", "provider", "InvalidProviderError", "registration", "location", "isClassProvider", "token", "BindingBuilder", "context", "error", "ServiceNotFoundError", "instance", "tokens", "child", "CircularDependencyError", "scope", "existingInstance", "serviceInstance", "isValueProvider", "isFactoryProvider", "dependencies", "isExistingProvider", "constructor", "resolvedDependencies", "getClassMetadata", "childContext", "propertiesMetadata", "getAllPropertyMetadata", "propertyKey", "metadata", "dependency", "lifecycle", "methodsMetadata", "getAllMethodMetadata", "methodName", "method", "dep", "stack", "lines", "line", "ContainerError", "container", "implementation", "BindingOptions", "value", "BindingFinalized", "factory", "BindingFactoryOptions", "deps", "ContainerFactory", "options", "Container"]
}