import type { AwilixContainer, NameAndRegistrationPair } from 'awilix';
import { AwilixManager } from 'awilix-manager';
import type { FastifyInstance } from 'fastify';
import type { AbstractModule } from './AbstractModule.js';
import { type NestedPartial } from './configUtils.js';
import type { ENABLE_ALL } from './diConfigUtils.js';
export type RegisterDependenciesParams<Dependencies, Config, ExternalDependencies> = {
    modules: readonly AbstractModule<unknown, ExternalDependencies>[];
    secondaryModules?: readonly AbstractModule<unknown, ExternalDependencies>[];
    dependencyOverrides?: NameAndRegistrationPair<Dependencies>;
    configOverrides?: NestedPartial<Config>;
    configDependencyId?: string;
};
export type DependencyInjectionOptions = {
    jobQueuesEnabled?: false | typeof ENABLE_ALL | string[];
    enqueuedJobWorkersEnabled?: false | typeof ENABLE_ALL | string[];
    messageQueueConsumersEnabled?: false | typeof ENABLE_ALL | string[];
    periodicJobsEnabled?: false | typeof ENABLE_ALL | string[];
};
export declare class DIContext<Dependencies extends object, Config extends object, ExternalDependencies = undefined> {
    private readonly options;
    readonly awilixManager: AwilixManager;
    readonly diContainer: AwilixContainer<Dependencies>;
    private readonly controllerResolvers;
    private readonly appConfig;
    constructor(diContainer: AwilixContainer, options: DependencyInjectionOptions, appConfig: Config, awilixManager?: AwilixManager);
    private registerModule;
    registerDependencies(params: RegisterDependenciesParams<Dependencies, Config, ExternalDependencies>, externalDependencies: ExternalDependencies, resolveControllers?: boolean): void;
    registerRoutes(app: FastifyInstance<any, any, any, any>): void;
    destroy(): Promise<void>;
    init(): Promise<void>;
}
