import { Prisma } from '@prisma/client/extension';
import type { Cache } from 'cache-manager';
export declare const REQUIRED_ARGS_OPERATIONS: readonly ["findUnique", "findUniqueOrThrow", "groupBy", "aggregate"];
export declare const OPTIONAL_ARGS_OPERATIONS: readonly ["findMany", "findFirst", "findFirstOrThrow", "count"];
export declare const CACHE_OPERATIONS: readonly ["findUnique", "findUniqueOrThrow", "groupBy", "aggregate", "findMany", "findFirst", "findFirstOrThrow", "count"];
type RequiredArgsOperation = (typeof REQUIRED_ARGS_OPERATIONS)[number];
type OptionalArgsOperation = (typeof OPTIONAL_ARGS_OPERATIONS)[number];
export type CacheOperation = RequiredArgsOperation | OptionalArgsOperation;
type RequiredArgsFunction<O extends RequiredArgsOperation> = <T, A>(this: T, args: Prisma.Exact<A, Prisma.Args<T, O> & PrismaCacheArgs>) => Promise<Prisma.Result<T, A, O>>;
type OptionalArgsFunction<O extends OptionalArgsOperation> = <T, A>(this: T, args?: Prisma.Exact<A, Prisma.Args<T, O> & PrismaCacheArgs>) => Promise<Prisma.Result<T, A, O>>;
export type ModelExtension = {
    [O1 in RequiredArgsOperation]: RequiredArgsFunction<O1>;
} & {
    [O2 in OptionalArgsOperation]: OptionalArgsFunction<O2>;
};
export interface CacheOptions {
    /**
     * Time-to-live in milliseconds
     */
    ttl?: number;
    /**
     * Cache key
     */
    key?: string;
}
export type CacheConfig = true | number | CacheOptions;
export interface PrismaCacheArgs {
    cache?: CacheConfig;
}
export type KeyGeneratorArgs = {
    model: string;
    operation: string;
    args: unknown;
};
export type KeyGenerator = (args: KeyGeneratorArgs) => string | Promise<string>;
export interface PrismaCacheExtensionConfig {
    cache: Cache;
    keyGenerator?: KeyGenerator;
}
export {};
