import { ServiceIdentifier, Either, Newable, LazyServiceIdentifier } from '@inversifyjs/common'; declare function getBindingId(): number; type BindingScope = 'Singleton' | 'Transient' | 'Request'; declare const bindingScopeValues: { [TKey in BindingScope]: TKey; }; interface AutobindOptions { scope: BindingScope; } type MetadataName = number | string | symbol; type MetadataTag = number | string | symbol; interface BindingConstraints { readonly name: MetadataName | undefined; readonly tags: Map; readonly serviceIdentifier: ServiceIdentifier; getAncestor(): BindingConstraints | undefined; } type BindingType = 'ConstantValue' | 'DynamicValue' | 'Factory' | 'Instance' | 'Provider' | 'ResolvedValue' | 'ServiceRedirection'; declare const bindingTypeValues: { [TKey in BindingType]: TKey; }; interface BaseBinding { readonly id: number; readonly moduleId: number | undefined; readonly serviceIdentifier: ServiceIdentifier; readonly type: TType; readonly isSatisfiedBy: (constraints: BindingConstraints) => boolean; } type Resolved = SyncResolved | Promise>; type SyncResolved = TActivated; interface GetOptionsTagConstraint { key: MetadataTag; value: unknown; } interface GetOptions { autobind?: boolean; name?: MetadataName; optional?: boolean; tag?: GetOptionsTagConstraint; } interface OptionalGetOptions extends GetOptions { optional: true; } interface ResolutionContext { get(serviceIdentifier: ServiceIdentifier, options: OptionalGetOptions): TActivated | undefined; get(serviceIdentifier: ServiceIdentifier, options?: GetOptions): TActivated; getAll(serviceIdentifier: ServiceIdentifier, options?: GetOptions): TActivated[]; getAllAsync(serviceIdentifier: ServiceIdentifier, options?: GetOptions): Promise; getAsync(serviceIdentifier: ServiceIdentifier, options: OptionalGetOptions): Promise; getAsync(serviceIdentifier: ServiceIdentifier, options?: GetOptions): Promise; } type BindingActivation = (context: ResolutionContext, injectable: T) => Resolved; type BindingDeactivation = (injectable: T) => void | Promise; interface ScopedBinding extends BaseBinding { cache: Either>; readonly onActivation: BindingActivation | undefined; readonly onDeactivation: BindingDeactivation | undefined; readonly scope: TScope; } interface ConstantValueBinding extends ScopedBinding { readonly value: Resolved; } type DynamicValueBuilder = (context: ResolutionContext) => Resolved; interface DynamicValueBinding extends ScopedBinding { readonly value: DynamicValueBuilder; } type Factory = (...args: TArgs) => TActivated | Promise; interface FactoryBinding> extends ScopedBinding { readonly factory: (context: ResolutionContext) => TActivated | Promise; } interface InstanceBinding extends ScopedBinding { readonly implementationType: Newable; } /** * @deprecated Use `Factory` instead. Provider will be removed in v8. * Providers exist for historical reasons from v5 when async dependencies weren't supported. * Factories are more flexible and can handle both sync and async operations. */ type Provider = (...args: TArgs) => Promise; interface ProviderBinding>// eslint-disable-line @typescript-eslint/no-deprecated extends ScopedBinding { readonly provider: (context: ResolutionContext) => TActivated; } interface BaseResolvedValueElementMetadata { kind: TKind; name: MetadataName | undefined; optional: boolean; tags: Map; value: ServiceIdentifier | LazyServiceIdentifier; } declare enum ResolvedValueElementMetadataKind { multipleInjection = 0, singleInjection = 1 } interface MultipleInjectionResolvedValueElementMetadata extends BaseResolvedValueElementMetadata { chained: boolean; } type SingleInjectionResolvedValueElementMetadata = BaseResolvedValueElementMetadata; type ResolvedValueElementMetadata = SingleInjectionResolvedValueElementMetadata | MultipleInjectionResolvedValueElementMetadata; interface ResolvedValueMetadata { arguments: ResolvedValueElementMetadata[]; } interface ResolvedValueBinding extends ScopedBinding { readonly factory: (...args: any[]) => TActivated | Promise; readonly metadata: ResolvedValueMetadata; } interface ServiceRedirectionBinding extends BaseBinding { targetServiceIdentifier: ServiceIdentifier; } type Binding = ConstantValueBinding | DynamicValueBinding | (TActivated extends Factory ? FactoryBinding : never) | InstanceBinding | (TActivated extends Provider ? ProviderBinding : never) | ResolvedValueBinding | ServiceRedirectionBinding; interface Cloneable { clone(): T; } declare enum ActivationRelationKind { moduleId = "moduleId", serviceId = "serviceId" } interface BindingActivationRelation { [ActivationRelationKind.moduleId]?: number; [ActivationRelationKind.serviceId]: ServiceIdentifier; } declare class ActivationsService implements Cloneable { #private; private constructor(); static build(getParent: () => ActivationsService | undefined): ActivationsService; add(activation: BindingActivation, relation: BindingActivationRelation): void; clone(): ActivationsService; get(serviceIdentifier: ServiceIdentifier): Iterable | undefined; removeAllByModuleId(moduleId: number): void; removeAllByServiceId(serviceId: ServiceIdentifier): void; } declare class BindingService implements Cloneable { #private; private constructor(); static build(getParent: () => BindingService | undefined, autobindOptions?: AutobindOptions): BindingService; clone(): BindingService; get(serviceIdentifier: ServiceIdentifier): Iterable> | undefined; getChained(serviceIdentifier: ServiceIdentifier): Generator, void, unknown>; getBoundServices(): Iterable; getById(id: number): Iterable> | undefined; getByModuleId(moduleId: number): Iterable> | undefined; getNonParentBindings(serviceId: ServiceIdentifier): Iterable> | undefined; getNonParentBoundServices(): Iterable; removeById(id: number): void; removeAllByModuleId(moduleId: number): void; removeAllByServiceId(serviceId: ServiceIdentifier): void; set(binding: Binding): void; } declare enum DeactivationRelationKind { moduleId = "moduleId", serviceId = "serviceId" } interface BindingDeactivationRelation { [DeactivationRelationKind.moduleId]?: number; [DeactivationRelationKind.serviceId]: ServiceIdentifier; } declare class DeactivationsService implements Cloneable { #private; private constructor(); static build(getParent: () => DeactivationsService | undefined): DeactivationsService; add(deactivation: BindingDeactivation, relation: BindingDeactivationRelation): void; clone(): DeactivationsService; get(serviceIdentifier: ServiceIdentifier): Iterable | undefined; removeAllByModuleId(moduleId: number): void; removeAllByServiceId(serviceId: ServiceIdentifier): void; } declare function decorate(decorators: ClassDecorator | ClassDecorator[], target: Function): void; declare function decorate(decorators: ParameterDecorator | ParameterDecorator[], target: Function, parameterIndex: number): void; declare function decorate(decorators: ParameterDecorator | ParameterDecorator[], target: Function, methodName: string | symbol, parameterIndex: number): void; declare function decorate(decorators: MethodDecorator | PropertyDecorator | MethodDecorator[] | PropertyDecorator[], target: Function, property: string | symbol): void; declare enum InversifyCoreErrorKind { injectionDecoratorConflict = 0, missingInjectionDecorator = 1, planning = 2, resolution = 3, unknown = 4 } declare const isAppErrorSymbol: unique symbol; declare class InversifyCoreError extends Error { [isAppErrorSymbol]: true; kind: InversifyCoreErrorKind; constructor(kind: InversifyCoreErrorKind, message?: string, options?: ErrorOptions); static is(value: unknown): value is InversifyCoreError; static isErrorOfKind(value: unknown, kind: InversifyCoreErrorKind): value is InversifyCoreError; } interface BaseClassElementMetadata { kind: TKind; } interface BaseManagedClassElementMetadata extends BaseClassElementMetadata { isFromTypescriptParamType?: true; name: MetadataName | undefined; optional: boolean; tags: Map; value: ServiceIdentifier | LazyServiceIdentifier; } declare enum ClassElementMetadataKind { multipleInjection = 0, singleInjection = 1, unmanaged = 2 } interface MultipleInjectionManagedClassElementMetadata extends BaseManagedClassElementMetadata { chained: boolean; } type SingleInjectionManagedClassElementMetadata = BaseManagedClassElementMetadata; type ManagedClassElementMetadata = SingleInjectionManagedClassElementMetadata | MultipleInjectionManagedClassElementMetadata; type UnmanagedClassElementMetadata = BaseClassElementMetadata; type ClassElementMetadata = ManagedClassElementMetadata | UnmanagedClassElementMetadata; interface ClassMetadataLifecycle { postConstructMethodNames: Set; preDestroyMethodNames: Set; } interface ClassMetadata { constructorArguments: ClassElementMetadata[]; lifecycle: ClassMetadataLifecycle; properties: Map; scope: BindingScope | undefined; } declare function getClassMetadata(type: Newable): ClassMetadata; declare function inject(serviceIdentifier: ServiceIdentifier | LazyServiceIdentifier): MethodDecorator & ParameterDecorator & PropertyDecorator; declare function injectable(scope?: BindingScope): ClassDecorator; interface InjectFromBaseOptionsLifecycle { extendPreDestroyMethods?: boolean | undefined; extendPostConstructMethods?: boolean | undefined; } interface InjectFromBaseOptions { extendConstructorArguments?: boolean | undefined; extendProperties?: boolean | undefined; lifecycle?: InjectFromBaseOptionsLifecycle | undefined; } declare function injectFromBase(options?: InjectFromBaseOptions): ClassDecorator; interface InjectFromHierarchyOptionsLifecycle { extendPreDestroyMethods?: boolean | undefined; extendPostConstructMethods?: boolean | undefined; } interface InjectFromHierarchyOptions { extendConstructorArguments?: boolean | undefined; extendProperties?: boolean | undefined; lifecycle?: InjectFromHierarchyOptionsLifecycle | undefined; } declare function injectFromHierarchy(options?: InjectFromHierarchyOptions): ClassDecorator; interface MultiInjectOptions { chained?: boolean; } declare function multiInject(serviceIdentifier: ServiceIdentifier | LazyServiceIdentifier, options?: MultiInjectOptions): MethodDecorator & ParameterDecorator & PropertyDecorator; declare function named(name: MetadataName): MethodDecorator & ParameterDecorator & PropertyDecorator; declare function optional(): MethodDecorator & ParameterDecorator & PropertyDecorator; declare function postConstruct(): MethodDecorator; declare function preDestroy(): MethodDecorator; declare function tagged(key: MetadataTag, value: unknown): MethodDecorator & ParameterDecorator & PropertyDecorator; declare function unmanaged(): MethodDecorator & ParameterDecorator & PropertyDecorator; interface InjectFromOptionsLifecycle { extendPreDestroyMethods?: boolean | undefined; extendPostConstructMethods?: boolean | undefined; } interface InjectFromOptions { extendConstructorArguments?: boolean | undefined; extendProperties?: boolean | undefined; lifecycle?: InjectFromOptionsLifecycle | undefined; type: Newable; } interface SingleImmutableLinkedListNode { elem: T; previous: SingleImmutableLinkedListNode | undefined; } declare class SingleImmutableLinkedList implements Iterable { readonly last: SingleImmutableLinkedListNode; constructor(last: SingleImmutableLinkedListNode); concat(elem: T): SingleImmutableLinkedList; [Symbol.iterator](): Iterator; } interface InternalBindingConstraints { getAncestorsCalled: boolean; readonly name: MetadataName | undefined; readonly tags: Map; readonly serviceIdentifier: ServiceIdentifier; } interface GetPlanOptionsTagConstraint { key: MetadataTag; value: unknown; } interface BaseGetPlanOptions { serviceIdentifier: ServiceIdentifier; name: MetadataName | undefined; optional: boolean; tag: GetPlanOptionsTagConstraint | undefined; } interface GetMultipleServicePlanOptions extends BaseGetPlanOptions { chained: boolean; isMultiple: true; } interface GetSingleServicePlanOptions extends BaseGetPlanOptions { isMultiple: false; } type GetPlanOptions = GetSingleServicePlanOptions | GetMultipleServicePlanOptions; interface NonCachedServiceNodeContext { bindingConstraintsList: SingleImmutableLinkedList; chainedBindings: boolean; optionalBindings: boolean; } interface BaseBindingNode = Binding> { readonly binding: TBinding; } type LeafBindingNode = BaseBindingNode | DynamicValueBinding | (TActivated extends Factory ? FactoryBinding : never) | (TActivated extends Provider ? ProviderBinding : never)>; interface InstanceBindingNode = InstanceBinding> extends BaseBindingNode { readonly classMetadata: ClassMetadata; readonly constructorParams: (PlanServiceNode | undefined)[]; readonly propertyParams: Map; } interface ResolvedValueBindingNode = ResolvedValueBinding> extends BaseBindingNode { readonly params: PlanServiceNode[]; } type PlanServiceNodeParent = InstanceBindingNode> | ResolvedValueBindingNode>; interface PlanServiceRedirectionBindingNode = ServiceRedirectionBinding> extends BaseBindingNode { redirections: PlanBindingNode[]; } type PlanBindingNode = PlanServiceNodeParent | PlanServiceRedirectionBindingNode | LeafBindingNode; interface PlanServiceNode { bindings: PlanBindingNode | PlanBindingNode[] | undefined; isContextFree: boolean; readonly serviceIdentifier: ServiceIdentifier; } interface PlanTree { readonly root: PlanServiceNode; } interface PlanResult { readonly tree: PlanTree; } interface PlanParamsOperations { getBindings: (serviceIdentifier: ServiceIdentifier) => Iterable> | undefined; getBindingsChained: (serviceIdentifier: ServiceIdentifier) => Generator, void, unknown>; readonly getClassMetadata: (type: Newable) => ClassMetadata; readonly getPlan: (options: GetPlanOptions) => PlanResult | undefined; setBinding: (binding: Binding) => void; readonly setNonCachedServiceNode: (node: PlanServiceNode, context: NonCachedServiceNodeContext) => void; readonly setPlan: (options: GetPlanOptions, planResult: PlanResult) => void; } interface BasePlanParams { autobindOptions: AutobindOptions | undefined; operations: PlanParamsOperations; servicesBranch: ServiceIdentifier[]; } interface PlanParamsTagConstraint { key: MetadataTag; value: unknown; } interface MultipleBindingPlanParamsConstraint { chained: boolean; name?: MetadataName; isMultiple: true; isOptional?: true; serviceIdentifier: ServiceIdentifier; tag?: PlanParamsTagConstraint; } interface SingleBindingPlanParamsConstraint { name?: MetadataName; isMultiple: false; isOptional?: true; serviceIdentifier: ServiceIdentifier; tag?: PlanParamsTagConstraint; } type PlanParamsConstraint = SingleBindingPlanParamsConstraint | MultipleBindingPlanParamsConstraint; interface PlanParams extends BasePlanParams { rootConstraints: PlanParamsConstraint; } declare function plan(params: PlanParams): PlanResult; declare enum CacheBindingInvalidationKind { bindingAdded = "bindingAdded", bindingRemoved = "bindingRemoved" } interface CacheBindingInvalidation { binding: Binding; kind: CacheBindingInvalidationKind; operations: PlanParamsOperations; } /** * Service to cache plans. * * This class is used to cache plans and to notify PlanService subscribers when the cache is cleared. * The cache should be cleared when a new binding is registered or when a binding is unregistered. * * Subscribers are supposed to be plan services from child containers. * * Ancestor binding constraints are the reason to avoid reusing plans from plan children nodes. */ declare class PlanResultCacheService { #private; constructor(); clearCache(): void; get(options: GetPlanOptions): PlanResult | undefined; invalidateServiceBinding(invalidation: CacheBindingInvalidation): void; set(options: GetPlanOptions, planResult: PlanResult): void; setNonCachedServiceNode(node: PlanServiceNode, context: NonCachedServiceNodeContext): void; subscribe(subscriber: PlanResultCacheService): void; } interface ResolutionParams { context: ResolutionContext; getActivations: (serviceIdentifier: ServiceIdentifier) => Iterable> | undefined; planResult: PlanResult; requestScopeCache: Map; } declare function resolve(params: ResolutionParams): unknown; interface DeactivationParams { getBindings: (serviceIdentifier: ServiceIdentifier) => Iterable> | undefined; getBindingsFromModule: (moduleId: number) => Iterable> | undefined; getClassMetadata: (type: Newable) => ClassMetadata; getDeactivations: (serviceIdentifier: ServiceIdentifier) => Iterable> | undefined; } declare function resolveBindingsDeactivations(params: DeactivationParams, bindings: Iterable | undefined): void | Promise; declare function resolveModuleDeactivations(params: DeactivationParams, moduleId: number): void | Promise; declare function resolveServiceDeactivations(params: DeactivationParams, serviceIdentifier: ServiceIdentifier): void | Promise; interface GetAllOptions extends GetOptions { chained?: boolean; } interface OptionalGetAllOptions extends GetAllOptions { optional: true; } export { ActivationsService, BindingService, CacheBindingInvalidationKind, ClassElementMetadataKind, DeactivationsService, InversifyCoreError, InversifyCoreErrorKind, PlanResultCacheService, ResolvedValueElementMetadataKind, bindingScopeValues, bindingTypeValues, decorate, getBindingId, getClassMetadata, inject, injectFromBase, injectFromHierarchy, injectable, multiInject, named, optional, plan, postConstruct, preDestroy, resolve, resolveBindingsDeactivations, resolveModuleDeactivations, resolveServiceDeactivations, tagged, unmanaged }; export type { AutobindOptions, BaseBinding, BaseBindingNode, BaseGetPlanOptions, BaseManagedClassElementMetadata, BasePlanParams, Binding, BindingActivation, BindingActivationRelation, BindingConstraints, BindingDeactivation, BindingDeactivationRelation, BindingScope, BindingType, CacheBindingInvalidation, ClassElementMetadata, ClassMetadata, ClassMetadataLifecycle, ConstantValueBinding, DeactivationParams, DynamicValueBinding, DynamicValueBuilder, Factory, FactoryBinding, GetAllOptions, GetMultipleServicePlanOptions, GetOptions, GetOptionsTagConstraint, GetPlanOptions, GetPlanOptionsTagConstraint, GetSingleServicePlanOptions, InjectFromBaseOptions, InjectFromBaseOptionsLifecycle, InjectFromHierarchyOptions, InjectFromHierarchyOptionsLifecycle, InjectFromOptions, InstanceBinding, InstanceBindingNode, LeafBindingNode, ManagedClassElementMetadata, MetadataName, MetadataTag, MultiInjectOptions, MultipleBindingPlanParamsConstraint, MultipleInjectionManagedClassElementMetadata, MultipleInjectionResolvedValueElementMetadata, NonCachedServiceNodeContext, OptionalGetAllOptions, OptionalGetOptions, PlanBindingNode, PlanParams, PlanParamsConstraint, PlanParamsOperations, PlanParamsTagConstraint, PlanResult, PlanServiceNode, PlanServiceNodeParent, PlanServiceRedirectionBindingNode, PlanTree, Provider, ProviderBinding, ResolutionContext, ResolutionParams, Resolved, ResolvedValueBinding, ResolvedValueBindingNode, ResolvedValueElementMetadata, ResolvedValueMetadata, ScopedBinding, ServiceRedirectionBinding, SingleBindingPlanParamsConstraint, SingleInjectionManagedClassElementMetadata, SingleInjectionResolvedValueElementMetadata, UnmanagedClassElementMetadata };