export declare type $FIXME = any;
export declare type QueryPlanner = any;
declare class NativeError extends global.Error {
}
declare type ValuesOf<T extends readonly any[]> = T[number];
export interface QueryHook<T extends Document = $FIXME> {
    (this: T, next: (err?: NativeError) => void): void;
}
export interface QueryLoggerArgs {
    operation: string;
    collectionName: string;
    executionTimeMS: number;
    filter: Object | null;
    fields: Object | null;
    options: any;
    update: Object | null;
    additionalLogProperties: any;
}
export declare type QueryLogger = (args: QueryLoggerArgs) => void;
export interface ExplainLoggerArgs {
    queryPlanners: QueryPlanner[];
}
export declare type ExplainLogger = (result: ExplainLoggerArgs) => void;
export declare const TARGET_METHODS: string[];
export declare type TargetMethod = ValuesOf<typeof TARGET_METHODS>;
export declare const QUERY_MIDDLEWARE: string[];
export declare type QueryMiddleware = ValuesOf<typeof QUERY_MIDDLEWARE>;
export declare const AGGREGATE_MIDDLEWARE: string[];
export declare type AggregateMiddleware = 'aggregate';
export declare const COUNT_MIDDLEWARE: string[];
export declare type CountMiddleware = ValuesOf<typeof COUNT_MIDDLEWARE>;
export declare const EXPLAIN_METHODS: string[];
export declare type ExplainMethod = ValuesOf<typeof EXPLAIN_METHODS>;
export interface QueryLoggerOptions {
    queryLogger: QueryLogger;
    explainLogger: ExplainLogger;
    explain: boolean;
    explainMethods: ExplainMethod[];
    targetMethods: TargetMethod[];
    additionalLogProperties: boolean;
}
export {};
