import type { TypesaurusUtils as Utils } from "./utils.js"; import type { TypesaurusCore as Core } from "./core.js"; export declare namespace TypesaurusQuery { interface Function { >(queries: Getter, options?: Core.ReadOptions): Getter extends ($: Helpers) => infer Result ? Result extends Utils.Falsy ? undefined : SubscriptionPromise : never; build(options?: Core.ReadOptions): Builder; } interface SubscriptionPromise extends Core.SubscriptionPromise[], Core.SubscriptionListMeta> { count(): Promise; sum(field: Utils.KeysOfType, number>): Promise; average(field: Utils.KeysOfType, number>): Promise; } type Data = Query | Array | Utils.Falsy> | Utils.Falsy; type Getter = ($: Helpers) => Data; /** * Query helpers object avaliable in the `query` function. */ interface Helpers extends CommonQueryHelpers> { } /** * Query builder works like regular query helpers, but the run can be delayed * and mixed with other code. */ interface Builder extends CommonQueryHelpers> { /** * Runs the built query. */ run(): Core.SubscriptionPromise[], Core.SubscriptionListMeta>; } type DocId = "__id__"; type OrderDirection = "desc" | "asc"; type WhereFilter = "<" | "<=" | "==" | "!=" | ">=" | ">" | "in" | "not-in" | "array-contains" | "array-contains-any"; /** * The query type. */ type Query = OrderQuery | WhereQuery | LimitQuery | OrQuery; /** * The order query type. Used to build query. */ interface OrderQuery<_Model> { type: "order"; field: string[]; method: OrderDirection; cursors: OrderCursors; } interface WhereQuery<_Model> { type: "where"; field: string[] | [DocId]; filter: WhereFilter; value: any; } /** * The limit query type. It contains the limit value. */ interface LimitQuery<_Model> { type: "limit"; number: number; } /** * The allowed or query type. */ type OrQueryQuery = WhereQuery; /** * The or query type. It contains other queries. */ interface OrQuery { type: "or"; queries: OrQueryQuery[]; } type OrderCursors | DocId> = Utils.Falsy | OrderCursorStart | [OrderCursorStart | Utils.Falsy] | OrderCursorEnd | [OrderCursorEnd | Utils.Falsy] | [ OrderCursorStart | Utils.Falsy, OrderCursorEnd | Utils.Falsy ]; type OrderCursorsEmpty = undefined | null | "" | false | []; type OrderCursorPosition = "startAt" | "startAfter" | "endBefore" | "endAt"; type OrderCursorStart | DocId> = OrderCursorStartAt | OrderCursorStartAfter; interface OrderCursorStartAt | DocId> extends OrderCursor { } interface OrderCursorStartAfter | DocId> extends OrderCursor { } type OrderCursorEnd | DocId> = OrderCursorEndAt | OrderCursorEndBefore; interface OrderCursorEndAt | DocId> extends OrderCursor { } interface OrderCursorEndBefore | DocId> extends OrderCursor { } interface OrderCursor | DocId, Position extends OrderCursorPosition> { type: "cursor"; position: Position; value: OrderCursorValue; } type OrderCursorValue | DocId> = (Key extends QueryFieldKey1 ? QueryFieldValue : Def["Id"]) | Core.Doc | undefined; interface QueryFieldBase | DocId> { order(cursors?: OrderCursors | []): OrderQuery; order(method: OrderDirection, cursors?: OrderCursors | []): OrderQuery; } interface QueryIdField extends QueryFieldBase { lt(id: Def["Id"]): WhereQuery; lte(id: Def["Id"]): WhereQuery; eq(id: Def["Id"]): WhereQuery; not(id: Def["Id"]): WhereQuery; gt(id: Def["Id"]): WhereQuery; gte(id: Def["Id"]): WhereQuery; in(ids: Def["Id"][]): WhereQuery; notIn(ids: Def["Id"][]): WhereQuery; } interface QueryPrimitiveField> extends QueryFieldBase { lt(field: QueryFieldValue): WhereQuery; lte(field: QueryFieldValue): WhereQuery; eq(field: QueryFieldValue): WhereQuery; not(field: QueryFieldValue): WhereQuery; gt(field: QueryFieldValue): WhereQuery; gte(field: QueryFieldValue): WhereQuery; in(fields: QueryFieldValue[]): WhereQuery; notIn(fields: QueryFieldValue[]): WhereQuery; } interface QueryArrayField> { contains(field: Exclude, undefined> extends Array ? QueryFieldValueNonNullish : never): WhereQuery; containsAny(field: Exclude, undefined> extends Array ? QueryFieldValue : never): WhereQuery; } type QueryField> = Exclude, undefined> extends Array ? QueryArrayField : QueryPrimitiveField; type QueryFieldValue> = // Unless the original field type is unknown, union with it (unknown extends Parent[Key] ? never : Exclude) | QueryFieldValueNonNullish>; type QueryFieldValueNonNullish = Exclude extends Core.ServerDate ? Exclude | Date : Value; /** * Common query helpers API with query object result passed as a generic. */ interface CommonQueryHelpers { /** * Id selector, allows querying by the document id. */ field(id: DocId): QueryIdField; /** * Field selector, allows querying by a specific field. */ field>(key: Key): QueryField; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2>(key1: Key1, key2: Key2): QueryField, Key2>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3>(key1: Key1, key2: Key2, key3: Key3): QueryField, Key3>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4>(key1: Key1, key2: Key2, key3: Key3, key4: Key4): QueryField, Key4>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5>(key1: Key1, key2: Key2, key3: Key3, key4: Key4, key5: Key5): QueryField, Key5>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6>(key1: Key1, key2: Key2, key3: Key3, key4: Key4, key5: Key5, key6: Key6): QueryField, Key6>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7>(key1: Key1, key2: Key2, key3: Key3, key4: Key4, key5: Key5, key6: Key6, key7: Key7): QueryField, Key7>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8>(key1: Key1, key2: Key2, key3: Key3, key4: Key4, key5: Key5, key6: Key6, key7: Key7, key8: Key8): QueryField, Key8>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8, Key9 extends QueryFieldKey9>(key1: Key1, key2: Key2, key3: Key3, key4: Key4, key5: Key5, key6: Key6, key7: Key7, key8: Key8, key9: Key9): QueryField, Key9>; /** * Field selector, allows querying by a specific field. */ field, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8, Key9 extends QueryFieldKey9, Key10 extends QueryFieldKey10>(key1: Key1, key2: Key2, key3: Key3, key4: Key4, key5: Key5, key6: Key6, key7: Key7, key8: Key8, key9: Key9, key10: Key10): QueryField, Key10>; limit(to: number): LimitQuery; startAt | DocId>(value: OrderCursorValue): OrderCursorStartAt; startAfter | DocId>(value: OrderCursorValue): OrderCursorStartAfter; endAt | DocId>(value: OrderCursorValue): OrderCursorEndAt; endBefore | DocId>(value: OrderCursorValue): OrderCursorEndBefore; docId(): DocId; or(...queries: OrQueryQuery[]): OrQuery; } type QueryFieldKey1 = Utils.UnionKeys>; type QueryFieldKey2> = QueryFieldKey1>; type QueryFieldKey3, Key2 extends QueryFieldKey2> = QueryFieldKey1>; type QueryFieldKey4, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3> = QueryFieldKey1>; type QueryFieldKey5, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4> = QueryFieldKey1>; type QueryFieldKey6, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5> = QueryFieldKey1>; type QueryFieldKey7, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6> = QueryFieldKey1>; type QueryFieldKey8, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7> = QueryFieldKey1>; type QueryFieldKey9, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8> = QueryFieldKey1>; type QueryFieldKey10, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8, Key9 extends QueryFieldKey9> = QueryFieldKey1>; type QueryFieldGet1> = Utils.UnionValue, Key>; type QueryFieldGet2, Key2 extends QueryFieldKey2> = QueryFieldGet1, Key2>; type QueryFieldGet3, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3> = QueryFieldGet1, Key3>; type QueryFieldGet4, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4> = QueryFieldGet1, Key4>; type QueryFieldGet5, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5> = QueryFieldGet1, Key5>; type QueryFieldGet6, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6> = QueryFieldGet1, Key6>; type QueryFieldGet7, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7> = QueryFieldGet1, Key7>; type QueryFieldGet8, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8> = QueryFieldGet1, Key8>; type QueryFieldGet9, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8, Key9 extends QueryFieldKey9> = QueryFieldGet1, Key9>; type QueryFieldGet10, Key2 extends QueryFieldKey2, Key3 extends QueryFieldKey3, Key4 extends QueryFieldKey4, Key5 extends QueryFieldKey5, Key6 extends QueryFieldKey6, Key7 extends QueryFieldKey7, Key8 extends QueryFieldKey8, Key9 extends QueryFieldKey9, Key10 extends QueryFieldKey10> = QueryFieldGet1, Key10>; }