import { type AwilixContainer, type BuildResolver, type BuildResolverOptions, type DisposableResolver } from 'awilix';
import type { FunctionReturning } from 'awilix/lib/container';
import type { Resolver } from 'awilix/lib/resolvers';
type AsyncInitFunction<T> = <U extends T>(instance: U, diContainer: AwilixContainer<any>) => Promise<unknown>;
type AsyncInitMethod<T> = boolean | string | AsyncInitFunction<T>;
type AsyncInitConfig<T> = {
    method?: AsyncInitMethod<T>;
    nonBlocking?: boolean;
};
declare module 'awilix' {
    interface ResolverOptions<T> {
        asyncInit?: AsyncInitMethod<T> | AsyncInitConfig<T>;
        asyncInitPriority?: number;
        asyncDispose?: boolean | string | (<U extends T>(instance: U) => Promise<unknown>);
        asyncDisposePriority?: number;
        eagerInject?: boolean | string;
        tags?: string[];
        enabled?: boolean;
    }
}
export type Logger = (message: string) => void;
export type AwilixManagerConfig = {
    diContainer: AwilixContainer;
    asyncInit?: boolean;
    asyncDispose?: boolean;
    eagerInject?: boolean;
    strictBooleanEnforced?: boolean;
    enableDebugLogging?: boolean;
    loggerFn?: Logger;
};
export declare function asMockClass<T = object>(Type: unknown, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
export declare function asMockValue<T = object>(value: unknown): Resolver<T>;
export declare function asMockFunction<T = object>(fn: FunctionReturning<unknown>, opts?: BuildResolverOptions<T>): BuildResolver<T> & DisposableResolver<T>;
export declare class AwilixManager {
    readonly config: AwilixManagerConfig;
    constructor(config: AwilixManagerConfig);
    executeInit(): Promise<void>;
    executeDispose(): Promise<void>;
    getWithTags(tags: string[]): Record<string, any>;
    getByPredicate(predicate: (entity: any) => boolean): Record<string, any>;
}
export type AsyncInitOptions = {
    enableDebugLogging?: boolean;
    loggerFn?: Logger;
};
export declare function asyncInit(diContainer: AwilixContainer, options?: AsyncInitOptions): Promise<void>;
export declare function eagerInject(diContainer: AwilixContainer<any>): void;
export declare function getWithTags(diContainer: AwilixContainer<any>, tags: string[]): Record<string, any>;
export declare function getByPredicate(diContainer: AwilixContainer<any>, predicate: (entity: any) => boolean): Record<string, any>;
export declare function asyncDispose(diContainer: AwilixContainer<any>): Promise<void>;
export {};
