import type { AnyMongoAbility, Generics, SubjectType, Abilities, AbilityTuple, ExtractSubjectType } from '@casl/ability';
export declare const EMPTY_RESULT_QUERY: {
    $expr: {
        $eq: number[];
    };
};
export declare class AccessibleRecords<T extends SubjectType> {
    private readonly _ability;
    private readonly _action;
    constructor(_ability: AnyMongoAbility, _action: string);
    /**
     * In case action is not allowed, it returns `{ $expr: { $eq: [0, 1] } }`
     */
    ofType(subjectType: T): Record<string, unknown>;
}
type SubjectTypes<T extends Abilities> = T extends AbilityTuple ? ExtractSubjectType<T[1]> : never;
/**
 * Returns accessible records Mongo query per record type (i.e., entity type) based on provided Ability and action.
 */
export declare function accessibleBy<T extends AnyMongoAbility>(ability: T, action?: Parameters<T['rulesFor']>[0]): AccessibleRecords<SubjectTypes<Generics<T>['abilities']>>;
export {};
