import { MetaType } from '../metaTypeCreator'; import { ErrorMoreThanOnceDocSnapshotInCursor, ErrorEmptyCursor, ErrorCursorNoArray } from '../error'; import { DocumentSnapshot, QueryDocumentSnapshot } from '../snapshot'; import { OriQueryConstraint } from '../alias'; export type CursorType = 'startAt' | 'startAfter' | 'endAt' | 'endBefore'; export type CursorConstraint = { type: Type; values: Values; ref: QueryConstraint; }; export interface QueryConstraint extends OriQueryConstraint { type: T; } export type Cursor = (...snapshotOrFieldValues: Values['length'] extends 0 ? [ErrorEmptyCursor] : number extends Values['length'] ? [ErrorCursorNoArray] : Values extends (infer R)[] ? DocumentSnapshot extends R ? Values['length'] extends 1 ? Values : ErrorMoreThanOnceDocSnapshotInCursor[] : QueryDocumentSnapshot extends R ? Values['length'] extends 1 ? Values : ErrorMoreThanOnceDocSnapshotInCursor[] : Values : Values) => CursorConstraint;