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< QName, QDef > & { 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< Qs extends 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; < Q1 extends QueryBase, Q2 extends QueryBase, Q3 extends QueryBase >( queries: [Q1, Q2, Q3] ): Queries, Q3>; < Q1 extends QueryBase, 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; };