import { Defined } from './commonTypes'; import type { QueryBase } from './queryTypes'; export type SelectFieldPrimitive = { $name: string; $fields: SelectFieldPrimitive[]; $alias: string; $on: string; as: (alias: string) => SelectFieldPrimitive; }; export type SelectFieldPrimitives = Array< SelectFieldPrimitive | SelectFieldPrimitives | QueryBase >; type SelectFieldObjectFn = ( select: ((s: Select) => SelectFieldPrimitives) | QueryBase ) => SelectFieldPrimitive; type SelectFieldObject = Field extends Array ? SelectFieldPrimitive : SelectFieldObjectFn & Select; type SelectField = Field extends object ? SelectFieldObject : SelectFieldPrimitive; type SelectX = { [K in keyof Def]: SelectField; } & { on: ( type: string, cb: (s: Select>) => SelectFieldPrimitives ) => SelectFieldPrimitives; }; export type Select = SelectX< Defined ? Def[0] : Def> >;