import { FactoryType } from '../utils'; export interface Context { id: number; container: ContainerInterface; plan: Plan; currentRequest: Request; addPlan(plan: Plan): void; setCurrentRequest(request: Request): void; } export declare type DynamicValue = (context: Context) => T | Promise; export declare type ContainerResolution = T | Promise | (T | Promise)[]; declare type AsyncCallback = TCallback extends (...args: infer TArgs) => infer TResult ? (...args: TArgs) => Promise : never; export declare type BindingScope = 'Singleton' | 'Transient' | 'Request'; export declare type BindingType = 'ConstantValue' | 'Constructor' | 'DynamicValue' | 'Factory' | 'Function' | 'Instance' | 'Invalid' | 'Provider'; export declare type TargetType = 'ConstructorArgument' | 'ClassProperty' | 'Variable'; export interface BindingScopeEnumInterface { Request: BindingScope; Singleton: BindingScope; Transient: BindingScope; } export interface BindingTypeEnumInterface { ConstantValue: BindingType; Constructor: BindingType; DynamicValue: BindingType; Factory: BindingType; Function: BindingType; Instance: BindingType; Invalid: BindingType; Provider: BindingType; } export interface TargetTypeEnumInterface { ConstructorArgument: TargetType; ClassProperty: TargetType; Variable: TargetType; } export declare type Newable = new (...args: any[]) => T; export interface Abstract { prototype: T; } export declare type ServiceIdentifier = string | symbol | Newable | Abstract; export interface Clonable { clone(): T; } export declare type BindingActivation = (context: Context, injectable: T) => T | Promise; export declare type BindingDeactivation = (injectable: T) => void | Promise; export interface Binding extends Clonable> { id: number; moduleId: ContainerModuleBase['id']; activated: boolean; serviceIdentifier: ServiceIdentifier; constraint: ConstraintFunction; dynamicValue: DynamicValue | null; scope: BindingScope; type: BindingType; implementationType: Newable | T | null; factory: FactoryCreator | null; provider: ProviderCreator | null; onActivation: BindingActivation | null; onDeactivation: BindingDeactivation | null; cache: T | null | Promise; } export declare type SimpleFactory = (...args: U) => T; export declare type MultiFactory = (...args: U) => SimpleFactory; export declare type Factory = SimpleFactory | MultiFactory; export declare type FactoryCreator = (context: Context) => Factory; export declare type AutoNamedFactory = SimpleFactory; export declare type AutoFactory = SimpleFactory; export declare type FactoryTypeFunction = (context: Context) => T | Promise; export interface FactoryDetails { factoryType: FactoryType; factory: FactoryTypeFunction | null; } export declare type Provider = (...args: any[]) => ((...args: any[]) => Promise) | Promise; export declare type ProviderCreator = (context: Context) => Provider; export interface NextArgs { avoidConstraints: boolean; contextInterceptor: (contexts: Context) => Context; isMultiInject: boolean; targetType: TargetType; serviceIdentifier: ServiceIdentifier; key?: string | number | symbol; value?: unknown; } export declare type Next = (args: NextArgs) => any | any[]; export declare type Middleware = (next: Next) => Next; export declare type ContextInterceptor = (context: Context) => Context; export interface Context { id: number; container: ContainerInterface; plan: Plan; currentRequest: Request; addPlan(plan: Plan): void; setCurrentRequest(request: Request): void; } export interface ReflectResult { [key: string]: Metadata[]; } export declare type MetadataOrMetadataArray = Metadata | Metadata[]; export interface Metadata { key: string | number | symbol; value: TValue; } export interface Plan { parentContext: Context; rootRequest: Request; } export interface QueryableString { startsWith(searchString: string): boolean; endsWith(searchString: string): boolean; contains(searchString: string): boolean; equals(compareString: string): boolean; value(): string; } export declare type ResolveRequestHandler = (request: Request) => unknown; export declare type RequestScope = Map; export interface Request { id: number; serviceIdentifier: ServiceIdentifier; parentContext: Context; parentRequest: Request | null; childRequests: Request[]; target: Target; bindings: Binding[]; requestScope: RequestScope | null; addChildRequest(serviceIdentifier: ServiceIdentifier, bindings: Binding | Binding[], target: Target): Request; } export interface Target { id: number; serviceIdentifier: ServiceIdentifier; type: TargetType; name: QueryableString; identifier: string | symbol; metadata: Metadata[]; getNamedTag(): Metadata | null; getCustomTags(): Metadata[] | null; hasTag(key: string | number | symbol): boolean; isArray(): boolean; matchesArray(name: ServiceIdentifier): boolean; isNamed(): boolean; isTagged(): boolean; isOptional(): boolean; matchesNamedTag(name: string): boolean; matchesTag(key: string | number | symbol): (value: unknown) => boolean; } export interface ContainerOptions { autoBindInjectable?: boolean; defaultScope?: BindingScope; skipBaseClassChecks?: boolean; } export interface ContainerInterface { id: number; parent: ContainerInterface | null; options: ContainerOptions; bind(serviceIdentifier: ServiceIdentifier): BindingToSyntax; rebind(serviceIdentifier: ServiceIdentifier): BindingToSyntax; unbind(serviceIdentifier: ServiceIdentifier): void; unbindAll(): void; isBound(serviceIdentifier: ServiceIdentifier): boolean; isCurrentBound(serviceIdentifier: ServiceIdentifier): boolean; isBoundNamed(serviceIdentifier: ServiceIdentifier, named: string | number | symbol): boolean; isBoundTagged(serviceIdentifier: ServiceIdentifier, key: string | number | symbol, value: any): boolean; get(serviceIdentifier: ServiceIdentifier): T; getNamed(serviceIdentifier: ServiceIdentifier, named: string | number | symbol): T; getTagged(serviceIdentifier: ServiceIdentifier, key: string | number | symbol, value: any): T; getAll(serviceIdentifier: ServiceIdentifier): T[]; getAllTagged(serviceIdentifier: ServiceIdentifier, key: string | number | symbol, value: any): T[]; getAllNamed(serviceIdentifier: ServiceIdentifier, named: string | number | symbol): T[]; getAsync(serviceIdentifier: ServiceIdentifier): Promise; getNamedAsync(serviceIdentifier: ServiceIdentifier, named: string | number | symbol): Promise; getTaggedAsync(serviceIdentifier: ServiceIdentifier, key: string | number | symbol, value: unknown): Promise; getAllAsync(serviceIdentifier: ServiceIdentifier): Promise; getAllTaggedAsync(serviceIdentifier: ServiceIdentifier, key: string | number | symbol, value: unknown): Promise; getAllNamedAsync(serviceIdentifier: ServiceIdentifier, named: string | number | symbol): Promise; onActivation(serviceIdentifier: ServiceIdentifier, onActivation: BindingActivation): void; onDeactivation(serviceIdentifier: ServiceIdentifier, onDeactivation: BindingDeactivation): void; resolve(constructorFunction: Newable): T; load(...modules: ContainerModuleInterface[]): void; loadAsync(...modules: AsyncContainerModuleInterface[]): Promise; unload(...modules: ContainerModuleInterface[]): void; unloadAsync(...modules: ContainerModuleBase[]): Promise; applyCustomMetadataReader(metadataReader: MetadataReaderInterface): void; applyMiddleware(...middleware: Middleware[]): void; snapshot(): void; restore(): void; createChild(): ContainerInterface; } export declare type Bind = (serviceIdentifier: ServiceIdentifier) => BindingToSyntax; export declare type Rebind = (serviceIdentifier: ServiceIdentifier) => BindingToSyntax; export declare type Unbind = (serviceIdentifier: ServiceIdentifier) => void; export declare type UnbindAsync = (serviceIdentifier: ServiceIdentifier) => Promise; export declare type IsBound = (serviceIdentifier: ServiceIdentifier) => boolean; export interface ContainerModuleBase { id: number; } export interface ContainerModuleInterface extends ContainerModuleBase { registry: ContainerModuleCallBack; } export interface AsyncContainerModuleInterface extends ContainerModuleBase { registry: AsyncContainerModuleCallBack; } export interface ModuleActivationHandlers { onActivations: Lookup>; onDeactivations: Lookup>; } export interface ModuleActivationStoreInterface extends Clonable { addDeactivation(moduleId: ContainerModuleBase['id'], serviceIdentifier: ServiceIdentifier, onDeactivation: BindingDeactivation): void; addActivation(moduleId: ContainerModuleBase['id'], serviceIdentifier: ServiceIdentifier, onActivation: BindingActivation): void; remove(moduleId: ContainerModuleBase['id']): ModuleActivationHandlers; } export declare type ContainerModuleCallBack = (bind: Bind, unbind: Unbind, isBound: IsBound, rebind: Rebind, unbindAsync: UnbindAsync, onActivation: ContainerInterface['onActivation'], onDeactivation: ContainerInterface['onDeactivation']) => void; export declare type AsyncContainerModuleCallBack = AsyncCallback; export interface ContainerSnapshot { bindings: Lookup>; activations: Lookup>; deactivations: Lookup>; middleware: Next | null; moduleActivationStore: ModuleActivationStoreInterface; } export interface Lookup extends Clonable> { add(serviceIdentifier: ServiceIdentifier, value: T): void; getMap(): Map; get(serviceIdentifier: ServiceIdentifier): T[]; remove(serviceIdentifier: ServiceIdentifier): void; removeByCondition(condition: (item: T) => boolean): void; removeIntersection(lookup: Lookup): void; hasKey(serviceIdentifier: ServiceIdentifier): boolean; clone(): Lookup; traverse(func: (key: ServiceIdentifier, value: T[]) => void): void; } export interface BindingOnSyntax { onActivation(fn: (context: Context, injectable: T) => T): BindingWhenSyntax; onDeactivation(fn: (injectable: T) => void | Promise): BindingWhenSyntax; } export interface BindingWhenSyntax { when(constraint: (request: Request) => boolean): BindingOnSyntax; whenTargetNamed(name: string | number | symbol): BindingOnSyntax; whenTargetIsDefault(): BindingOnSyntax; whenTargetTagged(tag: string | number | symbol, value: unknown): BindingOnSyntax; whenInjectedInto(parent: NewableFunction | string): BindingOnSyntax; whenParentNamed(name: string | number | symbol): BindingOnSyntax; whenParentTagged(tag: string | number | symbol, value: unknown): BindingOnSyntax; whenAnyAncestorIs(ancestor: NewableFunction | string): BindingOnSyntax; whenNoAncestorIs(ancestor: NewableFunction | string): BindingOnSyntax; whenAnyAncestorNamed(name: string | number | symbol): BindingOnSyntax; whenAnyAncestorTagged(tag: string | number | symbol, value: unknown): BindingOnSyntax; whenNoAncestorNamed(name: string | number | symbol): BindingOnSyntax; whenNoAncestorTagged(tag: string | number | symbol, value: unknown): BindingOnSyntax; whenAnyAncestorMatches(constraint: (request: Request) => boolean): BindingOnSyntax; whenNoAncestorMatches(constraint: (request: Request) => boolean): BindingOnSyntax; } export interface BindingWhenOnSyntax extends BindingWhenSyntax, BindingOnSyntax { } export interface BindingInSyntax { inSingletonScope(): BindingWhenOnSyntax; inTransientScope(): BindingWhenOnSyntax; inRequestScope(): BindingWhenOnSyntax; } export interface BindingInWhenOnSyntax extends BindingInSyntax, BindingWhenOnSyntax { } export interface BindingToSyntax { to(constructor: new (...args: never[]) => T): BindingInWhenOnSyntax; toSelf(): BindingInWhenOnSyntax; toConstantValue(value: T): BindingWhenOnSyntax; toDynamicValue(func: DynamicValue): BindingInWhenOnSyntax; toConstructor(constructor: Newable): BindingWhenOnSyntax; toFactory(factory: FactoryCreator): BindingWhenOnSyntax; toFunction(func: T): BindingWhenOnSyntax; toAutoFactory(serviceIdentifier: ServiceIdentifier): BindingWhenOnSyntax; toAutoNamedFactory(serviceIdentifier: ServiceIdentifier): BindingWhenOnSyntax; toProvider(provider: ProviderCreator): BindingWhenOnSyntax; toService(service: ServiceIdentifier): void; } export interface ConstraintFunction { metaData?: Metadata; (request: Request | null): boolean; } export interface MetadataReaderInterface { getConstructorMetadata(constructorFunc: NewableFunction): ConstructorMetadata; getPropertiesMetadata(constructorFunc: NewableFunction): MetadataMap; } export interface MetadataMap { [propertyNameOrArgumentIndex: string | symbol]: Metadata[]; } export interface ConstructorMetadata { compilerGeneratedMetadata: Function[] | undefined; userGeneratedMetadata: MetadataMap; } export {};