import { LazyServiceIdentifier, ServiceIdentifier, Newable } from '@inversifyjs/common'; import { MetadataName, MetadataTag, BindingConstraints, BindingActivation, BindingDeactivation, DynamicValueBuilder, Factory, ResolutionContext, Provider, GetOptionsTagConstraint, OptionalGetOptions, GetOptions, GetAllOptions, BindingScope } from '@inversifyjs/core'; interface BindingIdentifier { readonly id: number; } type ResolvedValueInjectOptions = LazyServiceIdentifier | ResolvedValueMetadataInjectOptions | ServiceIdentifier; type ResolvedValueMetadataInjectOptions = [T] extends [ (infer U)[] | undefined ] ? [T] extends [U[]] ? MultipleResolvedValueMetadataInjectOptions : MultipleOptionalResolvedValueMetadataInjectOptions : T extends undefined ? OptionalResolvedValueMetadataInjectOptions : BaseResolvedValueMetadataInjectOptions; interface BaseResolvedValueMetadataInjectOptions { name?: MetadataName; serviceIdentifier: ServiceIdentifier | LazyServiceIdentifier; tags?: ResolvedValueMetadataInjectTagOptions[]; } interface BaseMultipleResolvedValueMetadataInjectOptions { chained?: boolean; isMultiple: true; } interface BaseOptionalResolvedValueMetadataInjectOptions { optional: true; } interface MultipleResolvedValueMetadataInjectOptions extends BaseResolvedValueMetadataInjectOptions, BaseMultipleResolvedValueMetadataInjectOptions { } interface MultipleOptionalResolvedValueMetadataInjectOptions extends BaseResolvedValueMetadataInjectOptions, BaseMultipleResolvedValueMetadataInjectOptions, BaseOptionalResolvedValueMetadataInjectOptions { } interface OptionalResolvedValueMetadataInjectOptions extends BaseResolvedValueMetadataInjectOptions, BaseOptionalResolvedValueMetadataInjectOptions { } interface ResolvedValueMetadataInjectTagOptions { key: MetadataTag; value: unknown; } type MapToResolvedValueInjectOptions = { [K in keyof TArgs]-?: ResolvedValueInjectOptions; }; interface BoundServiceSyntax { getIdentifier(): BindingIdentifier; } interface BindToFluentSyntax { to(type: Newable): BindInWhenOnFluentSyntax; toSelf(): BindInWhenOnFluentSyntax; toConstantValue(value: T): BindWhenOnFluentSyntax; toDynamicValue(builder: DynamicValueBuilder): BindInWhenOnFluentSyntax; toFactory(factory: T extends Factory ? (context: ResolutionContext) => T | Promise : never): BindWhenOnFluentSyntax; /** * @deprecated Use `toFactory()` instead. Providers 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. */ toProvider(provider: T extends Provider ? (context: ResolutionContext) => T : never): BindWhenOnFluentSyntax; toResolvedValue(factory: () => T | Promise): BindInWhenOnFluentSyntax; toResolvedValue(factory: (...args: TArgs) => T | Promise, injectOptions: MapToResolvedValueInjectOptions): BindInWhenOnFluentSyntax; toService(service: ServiceIdentifier): void; } interface BindInFluentSyntax extends BoundServiceSyntax { inSingletonScope(): BindWhenOnFluentSyntax; inTransientScope(): BindWhenOnFluentSyntax; inRequestScope(): BindWhenOnFluentSyntax; } interface BindInWhenOnFluentSyntax extends BindInFluentSyntax, BindWhenOnFluentSyntax { } interface BindOnFluentSyntax extends BoundServiceSyntax { onActivation(activation: BindingActivation): BindWhenFluentSyntax; onDeactivation(deactivation: BindingDeactivation): BindWhenFluentSyntax; } interface BindWhenOnFluentSyntax extends BindWhenFluentSyntax, BindOnFluentSyntax { } interface BindWhenFluentSyntax extends BoundServiceSyntax { when(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax; whenAnyAncestor(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax; whenAnyAncestorIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax; whenAnyAncestorNamed(name: MetadataName): BindOnFluentSyntax; whenAnyAncestorTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax; whenDefault(): BindOnFluentSyntax; whenNamed(name: MetadataName): BindOnFluentSyntax; whenNoAncestor(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax; whenNoAncestorIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax; whenNoAncestorNamed(name: MetadataName): BindOnFluentSyntax; whenNoAncestorTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax; whenNoParent(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax; whenNoParentIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax; whenNoParentNamed(name: MetadataName): BindOnFluentSyntax; whenNoParentTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax; whenParent(constraint: (metadata: BindingConstraints) => boolean): BindOnFluentSyntax; whenParentIs(serviceIdentifier: ServiceIdentifier): BindOnFluentSyntax; whenParentNamed(name: MetadataName): BindOnFluentSyntax; whenParentTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax; whenTagged(tag: MetadataTag, tagValue: unknown): BindOnFluentSyntax; } interface IsBoundOptions { name?: MetadataName; tag?: GetOptionsTagConstraint; } type Bind = (serviceIdentifier: ServiceIdentifier) => BindToFluentSyntax; type IsBound = (serviceIdentifier: ServiceIdentifier, options?: IsBoundOptions) => boolean; type OnActivation = (serviceIdentifier: ServiceIdentifier, activation: BindingActivation) => void; type OnDeactivation = (serviceIdentifier: ServiceIdentifier, deactivation: BindingDeactivation) => void; type Rebind = (serviceIdentifier: ServiceIdentifier) => Promise>; type RebindSync = (serviceIdentifier: ServiceIdentifier) => BindToFluentSyntax; type Unbind = (identifier: BindingIdentifier | ServiceIdentifier) => Promise; type UnbindSync = (identifier: BindingIdentifier | ServiceIdentifier) => void; interface ContainerModuleLoadOptions { bind: Bind; isBound: IsBound; onActivation: OnActivation; onDeactivation: OnDeactivation; rebind: Rebind; rebindSync: RebindSync; unbind: Unbind; unbindSync: UnbindSync; } declare class ContainerModule { #private; constructor(load: (options: ContainerModuleLoadOptions) => void | Promise); get id(): number; load(options: ContainerModuleLoadOptions): void | Promise; } declare class Container { #private; constructor(options?: ContainerOptions); bind(serviceIdentifier: ServiceIdentifier): BindToFluentSyntax; get(serviceIdentifier: ServiceIdentifier, options: OptionalGetOptions): T | undefined; get(serviceIdentifier: ServiceIdentifier, options?: GetOptions): T; getAll(serviceIdentifier: ServiceIdentifier, options?: GetAllOptions): T[]; getAllAsync(serviceIdentifier: ServiceIdentifier, options?: GetAllOptions): Promise; getAsync(serviceIdentifier: ServiceIdentifier, options: OptionalGetOptions): Promise; getAsync(serviceIdentifier: ServiceIdentifier, options?: GetOptions): Promise; isBound(serviceIdentifier: ServiceIdentifier, options?: IsBoundOptions): boolean; isCurrentBound(serviceIdentifier: ServiceIdentifier, options?: IsBoundOptions): boolean; load(...modules: ContainerModule[]): Promise; loadSync(...modules: ContainerModule[]): void; onActivation(serviceIdentifier: ServiceIdentifier, activation: BindingActivation): void; onDeactivation(serviceIdentifier: ServiceIdentifier, deactivation: BindingDeactivation): void; register(pluginConstructor: Newable): void; restore(): void; rebind(serviceIdentifier: ServiceIdentifier): Promise>; rebindSync(serviceIdentifier: ServiceIdentifier): BindToFluentSyntax; snapshot(): void; unbind(identifier: BindingIdentifier | ServiceIdentifier): Promise; unbindAll(): Promise; unbindSync(identifier: BindingIdentifier | ServiceIdentifier): void; unload(...modules: ContainerModule[]): Promise; unloadSync(...modules: ContainerModule[]): void; } interface ContainerOptions { autobind?: true; defaultScope?: BindingScope | undefined; parent?: Container | undefined; } declare enum InversifyContainerErrorKind { invalidOperation = 0 } declare const isAppErrorSymbol: unique symbol; declare class InversifyContainerError extends Error { [isAppErrorSymbol]: true; kind: InversifyContainerErrorKind; constructor(kind: InversifyContainerErrorKind, message?: string, options?: ErrorOptions); static is(value: unknown): value is InversifyContainerError; static isErrorOfKind(value: unknown, kind: InversifyContainerErrorKind): value is InversifyContainerError; } export { Container, ContainerModule, InversifyContainerError, InversifyContainerErrorKind }; export type { Bind, BindInFluentSyntax, BindInWhenOnFluentSyntax, BindOnFluentSyntax, BindToFluentSyntax, BindWhenFluentSyntax, BindWhenOnFluentSyntax, BindingIdentifier, BoundServiceSyntax, ContainerModuleLoadOptions, ContainerOptions, IsBound, IsBoundOptions, MapToResolvedValueInjectOptions, OnActivation, OnDeactivation, Rebind, RebindSync, ResolvedValueInjectOptions, ResolvedValueMetadataInjectOptions, ResolvedValueMetadataInjectTagOptions, Unbind, UnbindSync };