import type { QueryOperationTypesBase } from '@prisma-next/sql-contract/types'; import type { CodecExpression, Expression, RawSqlTag, TraitExpression, } from '@prisma-next/sql-relational-core/expression'; import type { Expand, QueryContext, Scope, ScopeField, ScopeTable, Subquery } from './scope'; export type { CodecExpression, Expression, RawSqlTag, TraitExpression }; export type BooleanCodecType = { codecId: 'pg/bool@1'; nullable: boolean }; export type WithField = Expand< Source & { [K in Alias]: Field } >; export type WithFields< Source, FromScope extends ScopeTable, Columns extends readonly (keyof FromScope)[], > = Expand>; export type ExtractScopeFields>> = { [K in keyof T]: T[K] extends Expression ? F : never; }; export type FieldProxy = { [K in keyof AvailableScope['topLevel']]: Expression; } & { [TableName in keyof AvailableScope['namespaces']]: { [K in keyof AvailableScope['namespaces'][TableName]]: Expression< AvailableScope['namespaces'][TableName][K] >; }; }; export type ExpressionBuilder = ( fields: FieldProxy, fns: Functions, ) => Expression; export type OrderByDirection = 'asc' | 'desc'; export type OrderByNulls = 'first' | 'last'; export type OrderByOptions = { direction?: OrderByDirection; nulls?: OrderByNulls; }; export type OrderByScope< AvailableScope extends Scope, RowType extends Record, > = { topLevel: Expand; namespaces: AvailableScope['namespaces']; }; type DeriveExtFunctions = { [K in keyof OT]: OT[K]['impl']; }; export type BuiltinFunctions> = { eq: ( a: CodecExpression | null, b: CodecExpression | null, ) => Expression; ne: ( a: CodecExpression | null, b: CodecExpression | null, ) => Expression; gt: ( a: CodecExpression, b: CodecExpression, ) => Expression; gte: ( a: CodecExpression, b: CodecExpression, ) => Expression; lt: ( a: CodecExpression, b: CodecExpression, ) => Expression; lte: ( a: CodecExpression, b: CodecExpression, ) => Expression; and: (...ands: CodecExpression<'pg/bool@1', boolean, CT>[]) => Expression; or: (...ors: CodecExpression<'pg/bool@1', boolean, CT>[]) => Expression; exists: (subquery: Subquery>) => Expression; notExists: (subquery: Subquery>) => Expression; in: { ( expr: Expression<{ codecId: CodecId; nullable: boolean }>, subquery: Subquery>, ): Expression; ( expr: Expression<{ codecId: CodecId; nullable: boolean }>, values: Array>, ): Expression; }; notIn: { ( expr: Expression<{ codecId: CodecId; nullable: boolean }>, subquery: Subquery>, ): Expression; ( expr: Expression<{ codecId: CodecId; nullable: boolean }>, values: Array>, ): Expression; }; readonly raw: RawSqlTag; }; export type Functions = BuiltinFunctions & DeriveExtFunctions; export type CountField = { codecId: 'pg/int8@1'; nullable: false }; export type AggregateOnlyFunctions = { count: (expr?: Expression) => Expression; sum: ( expr: Expression, ) => Expression<{ codecId: T['codecId']; nullable: true }>; avg: ( expr: Expression, ) => Expression<{ codecId: T['codecId']; nullable: true }>; min: ( expr: Expression, ) => Expression<{ codecId: T['codecId']; nullable: true }>; max: ( expr: Expression, ) => Expression<{ codecId: T['codecId']; nullable: true }>; }; export type AggregateFunctions = Functions & AggregateOnlyFunctions;