import type { Defined } from './commonTypes'; export type WhereStatement = [string, string, any]; export type WhereStatements = Array; type WhereOperator = (value: T | null | undefined) => WhereStatement; type WherePrimitive = { is: WhereOperator; ne: WhereOperator; not: WhereOperator; gt: WhereOperator; gte: WhereOperator; lt: WhereOperator; lte: WhereOperator; in: WhereOperator; nin: WhereOperator; notIn: WhereOperator; contains: WhereOperator; } & WhereOperator; type WhereFieldFn = (( cb: (w: Where) => WhereStatements ) => WhereStatements) & WherePrimitive ? string | Field : string>; type WhereField = Field extends object ? WhereFieldFn : WherePrimitive; type WhereAndOr = { and: (...statements: WhereStatements[]) => WhereStatement; or: (...statements: WhereStatements[]) => WhereStatement; }; type WhereX = { [K in keyof Def]: WhereField; } & WhereAndOr; export type Where = WhereX ? Def[0] : Def>>;