import type { Defined } from './commonTypes'; import type { Select, SelectFieldPrimitives } from './selectTypes'; import type { Where, WhereStatements } from './whereTypes'; type Index = keyof Defined; export type QueryBase, QDef> = { toString(): string; combine>(query: Q): Queries, Q>; __r: Record; }; type QueryCommon, QDef, QDefSingle> = QueryBase & { as(v: S): Query>; where(cb: (w: Where) => WhereStatements): Query; select(cb: (s: Select) => SelectFieldPrimitives): Query; stringify(): string; toString(): string; combine>(query: Q): Queries, Q>; }; type QuerySingle, QDef> = { id(id: string): Query; } & QueryCommon; type QueryList, QDef extends Array> = { first(limit: number): Query; skip(limit: number): Query; orderBy(field: K): Query; orderDirection(direction: 'asc' | 'desc'): Query; } & QueryCommon; export type Query, QDef> = QDef extends Array ? QueryList : QuerySingle; export type Queries, Q extends QueryBase> = { toString(): string; combine>(query: Q2): Queries, Q2>; __r: Qs['__r'] & Q['__r']; }; interface CombineFn { , Q2 extends QueryBase>(queries: [Q1, Q2]): Queries; , Q2 extends QueryBase, Q3 extends QueryBase>(queries: [Q1, Q2, Q3]): Queries, Q3>; , Q2 extends QueryBase, Q3 extends QueryBase, Q4 extends QueryBase>(queries: [Q1, Q2, Q3, Q4]): Queries, Q3>, Q4>; } export type RootQuery> = { [K in keyof Defined]: Query[K]>; } & { combine: CombineFn; }; export {};