import { InstanceToken } from '@nestjs/core/injector/module';
export declare const CUSTOM_INJECTOR_METADATA = "custom-injector:metadata";
export declare type InjectedProvidersStorageItemOptions<T, E extends CustomInjectorError<T> = CustomInjectorError<T>> = (GetProvidersOptions<T, E> & {
    lazy?: boolean;
    multi: true;
}) | (GetProviderOptions<T, E> & {
    lazy?: boolean;
    multi?: false;
});
export declare type InjectedProvidersStorageItem<T = unknown, E extends CustomInjectorError<T> = CustomInjectorError<T>> = {
    target: object;
    token: InstanceToken;
    options?: InjectedProvidersStorageItemOptions<T, E>;
    instance: null | T | T[];
    appiled: boolean;
    init: () => void;
    asyncInit: () => Promise<void>;
};
export declare class CustomInjectorError<T = unknown> extends Error {
    message: string;
    injectedProvidersStorageItem?: InjectedProvidersStorageItem<T, CustomInjectorError<T>> | undefined;
    constructor(message: string, injectedProvidersStorageItem?: InjectedProvidersStorageItem<T, CustomInjectorError<T>> | undefined);
}
export interface GetComponentsOptions<T, E extends CustomInjectorError<T>> {
    providerFactory?: (value: any) => T | Promise<T>;
    defaultProvidersValue?: T[];
    providersFactory?: (value: any) => T[];
    errorFactory?: (message: string, injectedProvidersStorageItem?: InjectedProvidersStorageItem<T, E>) => E;
}
export interface GetLastComponentOptions<T, E extends CustomInjectorError<T>> {
    providerFactory?: (value: any) => T | Promise<T>;
    defaultProviderValue?: T | Promise<T>;
    errorFactory?: (message: string, injectedProvidersStorageItem?: InjectedProvidersStorageItem<T, E>) => E;
}
export declare type GetProvidersOptions<T, E extends CustomInjectorError<T>> = GetComponentsOptions<T, E> & {
    propertyName?: keyof T;
};
export declare type GetProviderOptions<T, E extends CustomInjectorError<T>> = GetLastComponentOptions<T, E> & {
    propertyName?: keyof T;
};
