import { Aggregate, BasicExpression } from '../ir.js'; import { RefProxy } from './ref-proxy.js'; import { Context, GetRawResult, RefLeaf, StringifiableScalar } from './types.js'; import { QueryBuilder } from './index.js'; type StringRef = RefLeaf | RefLeaf | RefLeaf; type StringRefProxy = RefProxy | RefProxy | RefProxy; type StringBasicExpression = BasicExpression | BasicExpression | BasicExpression; type StringLike = StringRef | StringRefProxy | StringBasicExpression | string | null | undefined; type ComparisonOperand = RefProxy | RefLeaf | T | BasicExpression | undefined | null; type ComparisonOperandPrimitive = T | BasicExpression | undefined | null; type ExpressionLike = Aggregate | BasicExpression | RefProxy | RefLeaf | string | number | boolean | bigint | Date | null | undefined | Array; type CaseWhenValue = ExpressionLike | QueryBuilder | ToArrayWrapper | ConcatToArrayWrapper | Record; type ExtractCaseWhenValue = T extends CaseWhenWrapper ? TResult : T; type CaseWhenResult, THasDefault extends boolean> = TValues[number] extends ExpressionLike ? BasicExpression | (THasDefault extends true ? never : null)> : CaseWhenWrapper | (THasDefault extends true ? never : undefined)>; type ExtractType = T extends RefProxy ? U : T extends RefLeaf ? U : T extends BasicExpression ? U : T; type AggregateReturnType = ExtractType extends infer U ? U extends number | undefined | null | Date | bigint | string ? Aggregate : Aggregate : Aggregate; type StringFunctionReturnType = ExtractType extends infer U ? U extends string | undefined | null ? BasicExpression : BasicExpression : BasicExpression; type NumericFunctionReturnType = ExtractType extends infer U ? U extends string | Array | undefined | null | number ? BasicExpression> : BasicExpression : BasicExpression; type MapToNumber = T extends string | Array ? number : T extends undefined ? undefined : T extends null ? null : T; type BinaryNumericReturnType = ExtractType extends infer U1 ? ExtractType extends infer U2 ? U1 extends number ? U2 extends number ? BasicExpression : U2 extends number | undefined ? BasicExpression : U2 extends number | null ? BasicExpression : BasicExpression : U1 extends number | undefined ? U2 extends number ? BasicExpression : U2 extends number | undefined ? BasicExpression : BasicExpression : U1 extends number | null ? U2 extends number ? BasicExpression : BasicExpression : BasicExpression : BasicExpression : BasicExpression; export declare function eq(left: ComparisonOperand, right: ComparisonOperand): BasicExpression; export declare function eq(left: ComparisonOperandPrimitive, right: ComparisonOperandPrimitive): BasicExpression; export declare function eq(left: Aggregate, right: any): BasicExpression; export declare function gt(left: ComparisonOperand, right: ComparisonOperand): BasicExpression; export declare function gt(left: ComparisonOperandPrimitive, right: ComparisonOperandPrimitive): BasicExpression; export declare function gt(left: Aggregate, right: any): BasicExpression; export declare function gte(left: ComparisonOperand, right: ComparisonOperand): BasicExpression; export declare function gte(left: ComparisonOperandPrimitive, right: ComparisonOperandPrimitive): BasicExpression; export declare function gte(left: Aggregate, right: any): BasicExpression; export declare function lt(left: ComparisonOperand, right: ComparisonOperand): BasicExpression; export declare function lt(left: ComparisonOperandPrimitive, right: ComparisonOperandPrimitive): BasicExpression; export declare function lt(left: Aggregate, right: any): BasicExpression; export declare function lte(left: ComparisonOperand, right: ComparisonOperand): BasicExpression; export declare function lte(left: ComparisonOperandPrimitive, right: ComparisonOperandPrimitive): BasicExpression; export declare function lte(left: Aggregate, right: any): BasicExpression; export declare function and(left: ExpressionLike, right: ExpressionLike): BasicExpression; export declare function and(left: ExpressionLike, right: ExpressionLike, ...rest: Array): BasicExpression; export declare function or(left: ExpressionLike, right: ExpressionLike): BasicExpression; export declare function or(left: ExpressionLike, right: ExpressionLike, ...rest: Array): BasicExpression; export declare function not(value: ExpressionLike): BasicExpression; export declare function isUndefined(value: ExpressionLike): BasicExpression; export declare function isNull(value: ExpressionLike): BasicExpression; export declare function inArray(value: ExpressionLike, array: ExpressionLike): BasicExpression; export declare function like(left: StringLike, right: StringLike): BasicExpression; export declare function ilike(left: StringLike, right: StringLike): BasicExpression; export declare function upper(arg: T): StringFunctionReturnType; export declare function lower(arg: T): StringFunctionReturnType; export declare function length(arg: T): NumericFunctionReturnType; export declare function concat(arg: ToArrayWrapper): ConcatToArrayWrapper; export declare function concat(...args: Array): BasicExpression; type CoalesceArgTypes> = { [K in keyof T]: NonNullable>; }[number]; type HasGuaranteedNonNull> = { [K in keyof T]: null extends ExtractType ? false : undefined extends ExtractType ? false : true; }[number] extends false ? false : true; type CoalesceReturnType> = HasGuaranteedNonNull extends true ? BasicExpression> : BasicExpression | null>; export declare function coalesce]>(...args: T): CoalesceReturnType; /** * Returns the value for the first matching condition, similar to SQL * `CASE WHEN`. * * Arguments are evaluated as condition/value pairs followed by an optional * default value. Scalar branch values return a query expression and can be used * in expression contexts like `select`, `where`, `orderBy`, `groupBy`, * `having`, and equality join operands. If no scalar branch matches and no * default is provided, the result is `null`. * * When a branch value is a projection object, `caseWhen` becomes a select-only * projection value. Projection branches can include nested fields, ref spreads, * and includes. If no projection branch matches and no default is provided, the * result is `undefined`. * * @example * ```ts * caseWhen(gt(user.age, 18), `adult`, `minor`) * ``` * * @example * ```ts * caseWhen( * gt(user.age, 65), * `senior`, * gt(user.age, 18), * `adult`, * `minor`, * ) * ``` * * @example * ```ts * caseWhen(gt(user.age, 18), { * ...user, * posts: q * .from({ post: postsCollection }) * .where(({ post }) => eq(post.userId, user.id)), * }) * ``` */ export declare function caseWhen(condition1: C1, value1: V1): CaseWhenResult<[V1], false>; export declare function caseWhen(condition1: C1, value1: V1, defaultValue: D): CaseWhenResult<[V1, D], true>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2): CaseWhenResult<[V1, V2], false>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, defaultValue: D): CaseWhenResult<[V1, V2, D], true>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3): CaseWhenResult<[V1, V2, V3], false>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3, defaultValue: D): CaseWhenResult<[V1, V2, V3, D], true>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3, condition4: C4, value4: V4): CaseWhenResult<[V1, V2, V3, V4], false>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3, condition4: C4, value4: V4, defaultValue: D): CaseWhenResult<[V1, V2, V3, V4, D], true>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3, condition4: C4, value4: V4, condition5: C5, value5: V5): CaseWhenResult<[V1, V2, V3, V4, V5], false>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3, condition4: C4, value4: V4, condition5: C5, value5: V5, defaultValue: D): CaseWhenResult<[V1, V2, V3, V4, V5, D], true>; export declare function caseWhen(condition1: C1, value1: V1, condition2: C2, value2: V2, condition3: C3, value3: V3, condition4: C4, value4: V4, condition5: C5, value5: V5, condition6: ExpressionLike, value6: CaseWhenValue, ...rest: Array): any; export declare function add(left: T1, right: T2): BinaryNumericReturnType; export declare function count(arg: ExpressionLike): Aggregate; export declare function avg(arg: T): AggregateReturnType; export declare function sum(arg: T): AggregateReturnType; export declare function min(arg: T): AggregateReturnType; export declare function max(arg: T): AggregateReturnType; /** * List of comparison function names that can be used with indexes */ export declare const comparisonFunctions: readonly ["eq", "gt", "gte", "lt", "lte", "in", "like", "ilike"]; /** * All supported operator names in TanStack DB expressions */ export declare const operators: readonly ["eq", "gt", "gte", "lt", "lte", "in", "like", "ilike", "and", "or", "not", "isNull", "isUndefined", "upper", "lower", "length", "concat", "add", "coalesce", "caseWhen", "count", "avg", "sum", "min", "max"]; export type OperatorName = (typeof operators)[number]; export declare class ToArrayWrapper<_T = unknown> { readonly query: QueryBuilder; readonly __brand: "ToArrayWrapper"; readonly _type: `toArray`; readonly _result: _T; constructor(query: QueryBuilder); } export declare class ConcatToArrayWrapper<_T = unknown> { readonly query: QueryBuilder; readonly __brand: "ConcatToArrayWrapper"; readonly _type: `concatToArray`; readonly _result: _T; constructor(query: QueryBuilder); } export declare class CaseWhenWrapper<_T = any> { readonly args: Array; readonly __brand: "CaseWhenWrapper"; readonly _type: `caseWhen`; readonly _result?: _T; constructor(args: Array); } export declare function toArray(query: QueryBuilder): ToArrayWrapper>; export {};