import { Collection } from './file-db.js';
export declare function autoIncrement(): Generator<number, void, unknown>;
export interface RepositoryOptions<T extends {
    id: string;
}> {
    idGenerator: () => string;
    beforeCreate?: (entity: Partial<T> & {
        id?: string;
    }) => Partial<T> & {
        id?: string;
    } | Promise<Partial<T> & {
        id?: string;
    }>;
    beforeSave?: (entity: T) => T | Promise<T>;
    beforeUpdate?: (entity: T, updates: Partial<Omit<T, 'id'>>) => Partial<Omit<T, 'id'>> | Promise<Partial<Omit<T, 'id'>>>;
    afterSave?: (entity: T) => void | Promise<void>;
}
export declare class Repository<T extends {
    id: string;
}> {
    private collection;
    private options;
    constructor(collection: Collection<T>, options: RepositoryOptions<T>);
    save(entity: Partial<T> & {
        id?: string;
    }): Promise<T>;
    findById(id: string): Promise<T | null>;
    findAll(): Promise<T[]>;
    findBy(criteria: Partial<T>): Promise<T[]>;
    findOne(criteria: Partial<T>): Promise<T | null>;
    update(id: string, data: Partial<Omit<T, 'id'>>): Promise<T | null>;
    delete(id: string): Promise<boolean>;
    count(): Promise<number>;
    exists(id: string): Promise<boolean>;
    clear(): Promise<void>;
    query<R>(queryFn: (entities: T[]) => R): Promise<R>;
    paginate(page?: number, limit?: number): Promise<{
        data: T[];
        total: number;
        page: number;
        limit: number;
        totalPages: number;
    }>;
    createPaginator<K extends keyof T>(limit: number | undefined, sortBy: K, order?: 'asc' | 'desc'): AsyncGenerator<{
        data: T[];
        total: number;
        page: number;
        isLast: boolean;
    }>;
    findAllSorted<K extends keyof T>(sortBy: K, order?: 'asc' | 'desc'): Promise<T[]>;
    getRawCollection(): Collection<T>;
}
export declare function createRepository<T extends {
    id: string;
}>(collection: Collection<T>, options?: RepositoryOptions<T>): Repository<T>;
