import { AnyMongoAbility, Generics, Normalize } from '@casl/ability';
import type { Document, Model, Schema } from 'mongoose';
export type AccessibleFieldsOptions = {
    getFields(schema: Schema<Document>): string[];
} & ({
    only: string | string[];
} | {
    except: string | string[];
});
export declare const getSchemaPaths: AccessibleFieldsOptions['getFields'];
type GetAccessibleFields<T> = <U extends AnyMongoAbility>(this: Model<T> | T, ability: U, action?: Normalize<Generics<U>['abilities']>[0]) => string[];
export interface AccessibleFieldsModel<T, TQueryHelpers = {}, TMethods = {}, TVirtuals = {}> extends Model<T, TQueryHelpers, TMethods & AccessibleFieldDocumentMethods<T>, TVirtuals> {
    accessibleFieldsBy: GetAccessibleFields<T>;
}
export interface AccessibleFieldDocumentMethods<T = Document> {
    accessibleFieldsBy: GetAccessibleFields<T>;
}
/**
 * @deprecated Mongoose recommends against `extends Document`, prefer to use `AccessibleFieldsModel` instead.
 * See here: https://mongoosejs.com/docs/typescript.html#using-extends-document
 */
export interface AccessibleFieldsDocument extends Document, AccessibleFieldDocumentMethods {
}
export declare function accessibleFieldsPlugin(schema: Schema<any>, rawOptions?: Partial<AccessibleFieldsOptions>): void;
export {};
