import { Query } from './internal/match.js'; import { StorageAdapter } from './storage.js'; import { Modifier } from './internal/modifier.js'; type Projected = keyof TPrj extends never ? TDoc : Pick>; type Projection = Partial>; type Sort = Partial>; type WithId = T & { id: string; }; type WithoutId = Omit; type WithOptionalId = WithoutId & { id?: string; }; export type Document = WithId>; export interface Observer { id: string; stop: () => void; } interface UpdateResult { matchedCount: number; modifiedCount: number; upsertedCount: number; upsertedId: string | null; } interface FindOptions> { projection?: TPrj; sort?: Sort; skip?: number; limit?: number; } interface UpdateOptions { upsert?: boolean; } interface TtlIndex { field: string; expireAfterSeconds: number; } interface Change { type: 'added' | 'removed' | 'changed'; doc: T; } declare class Cursor { #private; constructor(queryFn: () => Array, options?: FindOptions); sort(sort: Sort): Cursor; limit(limit: number): Cursor; skip(skip: number): Cursor; project, TOut = Cursor>>(projection: TProjection): TOut; paginate(page: number, perPage: number): Cursor; observe(fn: (change: Change) => void): Observer; watch(callback: (results: TOut[]) => void, options?: { immediate?: boolean; }): Observer; toArray(): Array; map(fn: (doc: TDoc) => U): Array; forEach(fn: (doc: TDoc) => void): void; count(): number; first(): TOut | undefined; last(): TOut | undefined; exists(): boolean; group, TOut = GroupResult>(group: TGroup): Cursor; distinct(key: K): Array; } export declare class Collection = {}> { #private; get meta(): Meta>; constructor(name: string, options?: { storage?: StorageAdapter; ttlIndexes?: TtlIndex[]; ttlInterval?: number; }); dispose(): void; onReady(callback: () => void): void; get ready(): Promise; batch any>(fn: Fn): ReturnType extends Promise ? Promise : void; insert(doc: WithOptionalId): void; update(query: Query, modifier: Modifier, opts?: UpdateOptions): UpdateResult; remove(query: Query): void; transaction(fn: () => Promise): Promise; find = {}, TOut = Projected>(query?: Query, opts?: FindOptions): Cursor; findOne = {}, TOut = Projected>(query: Query, opts?: FindOptions): TOut | undefined; count(query?: Query): number; } type SumAccumulator = { $sum: 1; }; type PushAccumulator = { $push: '$$ROOT'; } | { $push: keyof T; }; type GroupAccumulator = SumAccumulator | PushAccumulator; type GroupExpression = { key: Extract; [key: string]: GroupAccumulator | keyof T; }; type GroupResult> = { [K in keyof TGroup]: K extends 'key' ? TGroup[K] extends keyof TDoc ? TDoc[TGroup[K]] : unknown : TGroup[K] extends { $sum: 1; } ? number : TGroup[K] extends { $push: '$$ROOT'; } ? TDoc[] : TGroup[K] extends { $push: keyof TDoc; } ? Array : never; }; declare class Meta extends Collection, {}> { #private; constructor(name: string, options: { storage?: StorageAdapter; }); get(key: K): TMeta[K] | undefined; set(key: K, value: TMeta[K]): void; } export {};