/* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-explicit-any */ import type * as Option from "effect-app/Option" import type * as S from "effect-app/Schema" import type { NonNegativeInt } from "effect-app/Schema" import * as Data from "effect/Data" import { flow } from "effect/Function" import * as Pipeable from "effect/Pipeable" import type { Covariant } from "effect/Types" import type { Ops } from "../filter/filterApi.js" import type { FieldValues } from "../filter/types.js" import type { FieldPath, FieldPathValue, RefineFieldPathValue } from "../filter/types/path/eager.js" export type QAll< TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, A = TFieldValues, R = never, TType extends "one" | "many" = "many", Exclusive extends boolean = false > = | Query | QueryWhere | QueryEnd | QueryProjection export const QId = Symbol() export type QId = typeof QId export interface QueryTogether< out TFieldValues extends FieldValues, out TFieldValuesRefined extends TFieldValues = TFieldValues, out Exclusive extends boolean = false, out T extends "initial" | "where" | "end" | "projection" = "initial", out A = TFieldValues, out R = never, out TType extends "many" | "one" | "count" = "many" > extends Pipeable.Pipeable { readonly [QId]: { readonly _TFieldValues: Covariant readonly _T: Covariant readonly _TFieldValuesRefined: Covariant readonly _A: Covariant readonly _R: Covariant readonly _TT: Covariant readonly _Exclusive: Covariant } } type ExtractTType = T extends QueryTogether ? TType : never type ExtractExclusiveness = T extends QueryTogether ? Exclusive : never type ExtractFieldValuesRefined = T extends QueryTogether ? TFieldValuesRefined : never export type RelationDirection = "some" | "every" export type Relation = { relation: RelationDirection } export type Query = QueryTogether export type QueryWhere< TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, Exclusive extends boolean = false > = & QueryTogether< TFieldValues, TFieldValuesRefined, Exclusive, "where" > & Relation export type QueryEnd< TFieldValues extends FieldValues, TType extends "many" | "one" | "count" = "many", Exclusive extends boolean = false > = QueryTogether< TFieldValues, TFieldValues, Exclusive, "end", TFieldValues, never, TType > export type QueryProjection< TFieldValues extends FieldValues, A = TFieldValues, R = never, TType extends "many" | "one" | "count" = "many", Exclusive extends boolean = false > = QueryTogether< TFieldValues, TFieldValues, Exclusive, "projection", A, R, TType > export type ComputedProjectionOperation = (q: Query) => QueryWhere export type ComputedProjectionMathExpression = | { readonly _tag: "field" readonly field: string } | { readonly _tag: "mul" readonly left: ComputedProjectionMathExpression readonly right: ComputedProjectionMathExpression } export type ComputedProjectionExpression = | { readonly _tag: "relation-count" readonly path: string readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-any" readonly path: string readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-every" readonly path: string readonly operation: ComputedProjectionOperation } | { readonly _tag: "relation-distinct-count" readonly path: string readonly field: string readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-sum" readonly path: string readonly field: string readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-sum-expr" readonly path: string readonly expression: ComputedProjectionMathExpression readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-sum-expr-by" readonly path: string readonly expression: ComputedProjectionMathExpression readonly unit: string readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-sum-expr-normalized" readonly path: string readonly expression: ComputedProjectionMathExpression readonly unit: string readonly toBase: string readonly factors: Readonly> readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-collect" readonly path: string readonly field: string readonly distinct: boolean readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-collect-fields" readonly path: string readonly fields: readonly string[] readonly distinct: boolean readonly operation?: ComputedProjectionOperation } | { readonly _tag: "relation-length" readonly path: string } /** * An expression that aggregates values across documents (for use with {@link aggregate}). * `agg-field` references a document field to group by; other tags are aggregate functions. */ export type AggregateExpression = | { readonly _tag: "agg-field" readonly path: string } | { readonly _tag: "agg-count" } | { readonly _tag: "agg-count-when" readonly operation: ComputedProjectionOperation } | { readonly _tag: "agg-sum" readonly field: string } | { readonly _tag: "agg-min" readonly field: string } | { readonly _tag: "agg-max" readonly field: string } export type AggregateMap = Readonly> export type ComputedProjectionMap = Readonly> export type Q = | Initial | Where | And | Or | Order | Page | Project | One | Count export class Initial extends Data.TaggedClass("value")<{ value: "initial" }> implements Query { readonly [QId]!: any constructor() { super({ value: "initial" as const }) } override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class Where extends Data.TaggedClass("where")<{ current: Query operation: [string, Ops, any] | [string, any] | ((q: Query) => QueryWhere) relation: RelationDirection subPath?: string }> implements QueryWhere { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class And extends Data.TaggedClass("and")<{ current: Query operation: [string, Ops, any] | [string, any] | ((q: Query) => QueryWhere) relation: RelationDirection }> implements QueryWhere { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class Or extends Data.TaggedClass("or")<{ current: Query operation: [string, Ops, any] | [string, any] | ((q: Query) => QueryWhere) relation: RelationDirection }> implements QueryWhere { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class Page extends Data.TaggedClass("page")<{ current: Query | QueryWhere | QueryEnd take?: number | undefined skip?: number | undefined }> implements QueryEnd { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class One extends Data.TaggedClass("one")<{ current: Query | QueryWhere | QueryEnd }> implements QueryEnd { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class Count extends Data.TaggedClass("count")<{ current: Query | QueryWhere | QueryEnd }> implements QueryEnd { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class Order> extends Data.TaggedClass("order")<{ current: Query | QueryWhere | QueryEnd field: TFieldName direction: "ASC" | "DESC" }> implements QueryEnd { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export class Project extends Data.TaggedClass("project")<{ current: Query | QueryWhere | QueryEnd schema: S.Codec mode: "collect" | "project" | "transform" | "aggregate" computed?: ComputedProjectionMap aggregateMap?: AggregateMap }> implements QueryProjection { readonly [QId]!: any override pipe() { // eslint-disable-next-line prefer-rest-params return Pipeable.pipeArguments(this, arguments) } } export const make: () => Query = () => new Initial() export const where: FilterWhere = (...operation: any[]) => (current: any) => new Where({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any) export const and: FilterContinuationAnd = (...operation: any[]) => (current: any) => new And({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any) export const or: FilterContinuationOr = (...operation: any[]) => (current: any) => new Or({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any) export const whereEvery: WhereEveryOrSome = ((subPath: string, ...[first, ...rest]: any[]) => (current: any) => new Where( { current, operation: typeof first === "function" ? flow(...[first, ...rest] as [any]) : [`${subPath}.-1.${first}`, ...rest], relation: "every", subPath } as any )) as unknown as WhereEveryOrSome export const whereSome: WhereEveryOrSome = ((subPath: string, ...[first, ...rest]: any[]) => (current: any) => new Where( { current, operation: typeof first === "function" ? flow(...[first, ...rest] as [any]) : [`${subPath}.-1.${first}`, ...rest], relation: "some", subPath } as any )) as unknown as WhereEveryOrSome export const order: { < Q extends Query | QueryWhere | QueryEnd >( field: FieldPath>, direction?: "ASC" | "DESC" ): ( current: Q ) => QueryEnd, "many", ExtractExclusiveness> } = (field, direction = "ASC") => (current) => new Order({ current, field: field as any, direction }) export const page: { ( page: { skip?: number; take?: number } ): | QueryWhere | QueryEnd>( current: Q ) => QueryEnd, "many", ExtractExclusiveness> } = ({ skip, take }) => (current) => new Page({ current, take, skip }) export const one: { | QueryWhere | QueryEnd>( current: Q ): QueryEnd, "one", ExtractExclusiveness> } = (current) => new One({ current }) // it's better to implement a distinct count so that the implementation can be optimised per adapter export const count: { < Q extends Query | QueryWhere | QueryEnd >( current: Q ): QueryProjection, NonNegativeInt, never, "count", ExtractExclusiveness> } = (current) => new Count({ current }) /** * Attach a projection schema to a query. * * The `select` clause sent to the store is derived from the schema's encoded * AST property names (top-level + per-array sub-keys), so a projection always * narrows what is read from the store. The repository augments that select * with `id` and `_etag` for change tracking. See {@link toFilter} and the * dispatch in `Repository/internal/internal.ts`. * * Modes — pick based on shape of the decoded value and on whether the * persistence-model (PM) reverse-mapping is needed: * * - `"transform"` (default when `mode` omitted): goes through the repo's * `parseMany` pipeline. The raw row is reverse-mapped via the * etag/PM cache (re-injecting `_etag` and any PM-shape state) before * decoding. Decode failures `orDie` (error channel = `never`). Use when * the schema operates on the full PM shape (e.g. full-entity reads that * must preserve etag tracking). * * - `"project"`: decodes the raw encoded row directly with the supplied * schema. No PM reverse-mapping, no etag cache merge. Decode failures * surface as `S.SchemaError`. Use for slim DTOs / aggregations that do not * need etag tracking and whose schema input is a plain subset of `Encoded`. * * - `"collect"`: like `"project"`, but the schema yields `Option` and * `None` values are dropped post-decode (`Array.getSomes`). Use to filter * rows during decode (e.g. discriminated-union narrowing where some rows * should not appear in the result). */ export const project: { < Q extends Query | QueryWhere | QueryEnd, I, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec< Option.Option, { [K in keyof I]: K extends keyof ExtractFieldValuesRefined ? I[K] : never }, R >, mode: "collect" ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> < Q extends Query | QueryWhere | QueryEnd, I, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec< A, { [K in keyof I]: K extends keyof ExtractFieldValuesRefined ? I[K] : never }, R >, mode: "project" ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> < Q extends Query | QueryWhere | QueryEnd, I, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec< A, { [K in keyof I]: K extends keyof ExtractFieldValuesRefined ? I[K] : never }, R > ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> } = (schema: any, mode = "transform") => (current: any) => new Project({ current, schema, mode } as any) export const relation = ( path: FieldPath ) => ({ length: (): ComputedProjectionExpression => ({ _tag: "relation-length", path: path as string }), count: (operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-count", path: path as string, operation } : { _tag: "relation-count", path: path as string }, any: (operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-any", path: path as string, operation } : { _tag: "relation-any", path: path as string }, every: (operation: ComputedProjectionOperation): ComputedProjectionExpression => ({ _tag: "relation-every", path: path as string, operation }), distinctCount: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-distinct-count", path: path as string, field, operation } : { _tag: "relation-distinct-count", path: path as string, field }, sum: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-sum", path: path as string, field, operation } : { _tag: "relation-sum", path: path as string, field }, sumExpr: ( expression: ComputedProjectionMathExpression, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-sum-expr", path: path as string, expression, operation } : { _tag: "relation-sum-expr", path: path as string, expression }, sumExprBy: ( expression: ComputedProjectionMathExpression, options: { unit: string }, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-sum-expr-by", path: path as string, expression, unit: options.unit, operation } : { _tag: "relation-sum-expr-by", path: path as string, expression, unit: options.unit }, sumExprNormalized: ( expression: ComputedProjectionMathExpression, options: { unit: string; toBase: string; factors: Readonly> }, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-sum-expr-normalized", path: path as string, expression, unit: options.unit, toBase: options.toBase, factors: options.factors, operation } : { _tag: "relation-sum-expr-normalized", path: path as string, expression, unit: options.unit, toBase: options.toBase, factors: options.factors }, collect: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-collect", path: path as string, field, distinct: false, operation } : { _tag: "relation-collect", path: path as string, field, distinct: false }, collectDistinct: (field: string, operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-collect", path: path as string, field, distinct: true, operation } : { _tag: "relation-collect", path: path as string, field, distinct: true }, collectFields: (fields: readonly string[], operation?: ComputedProjectionOperation): ComputedProjectionExpression => operation ? { _tag: "relation-collect-fields", path: path as string, fields, distinct: false, operation } : { _tag: "relation-collect-fields", path: path as string, fields, distinct: false }, collectDistinctFields: ( fields: readonly string[], operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-collect-fields", path: path as string, fields, distinct: true, operation } : { _tag: "relation-collect-fields", path: path as string, fields, distinct: true } }) export const expr = { field: (field: string): ComputedProjectionMathExpression => ({ _tag: "field", field }), mul: ( left: ComputedProjectionMathExpression, right: ComputedProjectionMathExpression ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right }) } as const export const computed = (value: T): T => value export const projectComputed: { < Q extends Query | QueryWhere | QueryEnd, I extends Record, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec, I, R>, computedProjection: ComputedProjectionMap, mode: "collect" ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> < Q extends Query | QueryWhere | QueryEnd, I extends Record, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec, computedProjection: ComputedProjectionMap, mode?: "project" ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> } = (schema: any, computedProjection: ComputedProjectionMap, mode = "project") => (current: any) => new Project({ current, schema, mode, computed: computedProjection } as any) /** * DSL helpers for building aggregate expressions used with {@link aggregate}. * * - `agg.field(path)` — references a document field for GROUP BY (with optional output alias) * - `agg.count()` — COUNT(*) across all rows in the group * - `agg.countWhen(op)` — COUNT of rows matching the filter operation * - `agg.sum(field)` — SUM of a numeric document field * - `agg.min(field)` / `agg.max(field)` — MIN/MAX of a document field */ export const agg = { field: (path: string): AggregateExpression => ({ _tag: "agg-field", path }), count: (): AggregateExpression => ({ _tag: "agg-count" }), countWhen: (operation: ComputedProjectionOperation): AggregateExpression => ({ _tag: "agg-count-when", operation }), sum: (field: string): AggregateExpression => ({ _tag: "agg-sum", field }), min: (field: string): AggregateExpression => ({ _tag: "agg-min", field }), max: (field: string): AggregateExpression => ({ _tag: "agg-max", field }) } as const /** * Attach an aggregate projection to a query, performing GROUP BY + aggregate functions at the * database level instead of fetching all rows and grouping in memory. * * The `aggregateMap` maps each output field name to either: * - `agg.field(path)` — a group-by field (document path → output alias) * - `agg.count()` / `agg.countWhen(op)` / `agg.sum(f)` / `agg.min(f)` / `agg.max(f)` — an aggregate * * The output is decoded directly with `schema` (no PM reverse-mapping, no etag tracking). * Decode failures surface as `S.SchemaError`. * * @example * ```ts * repo.query( * where("status", "active"), * aggregate( * S.Struct({ city: S.String, count: S.Number }), * { * city: agg.field("address.city"), * count: agg.countWhen((q) => q.pipe(where("active", true))) * } * ) * ) * ``` */ export const aggregate: { < Q extends Query | QueryWhere | QueryEnd, I extends Record, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec, aggregateMap: AggregateMap ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> } = (schema: any, aggregateMap: AggregateMap) => (current: any) => new Project({ current, schema, mode: "aggregate", aggregateMap } as any) type GetArV = T extends readonly (infer R)[] ? R : never export type FilterContinuations = { < TFieldValues extends FieldValues, TFieldName extends FieldPath, V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, value: V ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: "gt" | "gte" | "lt" | "lte" | "neq", value: V // only numbers? ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: "startsWith" | "endsWith" | "contains" | "notContains" | "notStartsWith" | "notEndsWith", value: FieldPathValue extends string ? string : never ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, const V extends readonly FieldPathValue[], TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: "in" | "notIn", value: V ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: | "includes" | "notIncludes", value: GetArV ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: | "includes-any" | "notIncludes-any" | "includes-all" | "notIncludes-all", value: readonly GetArV[] ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >(f: { path: TFieldName op: "eq" value: V }): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => IsCurrentInitial extends true ? QueryWhere : QueryWhere } export type FilterContinuationsWithSubpath = { < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath, V extends FieldPathValue >( subPath: TFieldName, restPath: TFieldNameSub, value: V ): ( current: Query ) => QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath, V extends FieldPathValue >( subPath: TFieldName, restPath: TFieldNameSub, op: "gt" | "gte" | "lt" | "lte" | "neq", value: V // only numbers? ): ( current: Query ) => QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath >( subPath: TFieldName, restPath: TFieldNameSub, op: "startsWith" | "endsWith" | "contains" | "notContains" | "notStartsWith" | "notEndsWith", value: FieldPathValue extends string ? string : never ): ( current: Query ) => QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath, const V extends readonly FieldPathValue[] >( subPath: TFieldName, restPath: TFieldNameSub, op: "in" | "notIn", value: V ): ( current: Query ) => QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath, V extends FieldPathValue >( subPath: TFieldName, restPath: TFieldNameSub, op: | "includes" | "notIncludes", value: GetArV ): ( current: Query ) => QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath, V extends FieldPathValue >( subPath: TFieldName, restPath: TFieldNameSub, op: | "includes-any" | "notIncludes-any" | "includes-all" | "notIncludes-all", value: readonly GetArV[] ): ( current: Query ) => QueryWhere < TFieldValues extends FieldValues, TFieldName extends FieldPath, TFieldValuesSub extends TFieldValues[TFieldName][number], TFieldNameSub extends FieldPath, V extends FieldPathValue >(f: { subPath: TFieldName restPath: TFieldNameSub op: "eq" value: V }): ( current: Query ) => QueryWhere } /* dprint-ignore-start */ export type RefineWithLiteral< TFieldValues extends FieldValues, TFieldName extends FieldPath, V, Exclde extends boolean = false > = // refine only if the value is a primitive [V] extends [string | number | boolean | null | bigint] ? RefineFieldPathValue : TFieldValues /* dprint-ignore-end */ export type FilteringRefinements = { < TFieldValues extends FieldValues, const TFieldName extends FieldPath, const V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, value: V ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere< TFieldValues, // @ts-expect-error it's TS RefineWithLiteral, TFieldName extends "_tag" ? true : false // consider only _tag as an exclusive field and only in the positive case > < TFieldValues extends FieldValues, const TFieldName extends FieldPath, const V extends FieldPathValue, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: "neq", value: V ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere< TFieldValues, // @ts-expect-error it's TS RefineWithLiteral, E > < TFieldValues extends FieldValues, TFieldName extends FieldPath, const V extends readonly FieldPathValue[], TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false >( path: TFieldName, op: "in", value: V ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere< TFieldValues, // @ts-expect-error it's TS RefineWithLiteral>, E > } export type NestedQueriesFixedRefinement = { < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false >( fb: (current: Query) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere, fi: (query: QueryWhere) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere, fi: (query: QueryWhere) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere, fi: (query: QueryWhere) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere, fi: (query: QueryWhere) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false, E13 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere, fi: (query: QueryWhere) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere, fm: ( query: QueryWhere ) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false, E13 extends boolean = false, E14 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: (query: QueryWhere) => QueryWhere, fd: (query: QueryWhere) => QueryWhere, fe: (query: QueryWhere) => QueryWhere, ff: (query: QueryWhere) => QueryWhere, fg: (query: QueryWhere) => QueryWhere, fh: (query: QueryWhere) => QueryWhere, fi: (query: QueryWhere) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere, fm: ( query: QueryWhere ) => QueryWhere, fn: ( query: QueryWhere ) => QueryWhere ): ( current: IsCurrentInitial extends true ? Query : QueryWhere ) => QueryWhere } export type NestedQueriesFreeIntersectionRefinement = { < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false >( fb: (current: Query) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, TFieldValuesRefined12 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, TFieldValuesRefined12 extends TFieldValues = TFieldValues, TFieldValuesRefined13 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false, E13 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere, fm: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, TFieldValuesRefined12 extends TFieldValues = TFieldValues, TFieldValuesRefined13 extends TFieldValues = TFieldValues, TFieldValuesRefined14 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false, E13 extends boolean = false, E14 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere, fm: ( query: QueryWhere ) => QueryWhere, fn: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere } // to be safe, or forces the output to be exclusive because you can always or _tag filters export type NestedQueriesFreeDisjointRefinement = { < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false >( fb: (current: Query) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, TFieldValuesRefined12 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, TFieldValuesRefined12 extends TFieldValues = TFieldValues, TFieldValuesRefined13 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false, E13 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere, fm: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere < TFieldValues extends FieldValues, TFieldValuesRefined extends TFieldValues = TFieldValues, TFieldValuesRefined2 extends TFieldValues = TFieldValues, TFieldValuesRefined3 extends TFieldValues = TFieldValues, TFieldValuesRefined4 extends TFieldValues = TFieldValues, TFieldValuesRefined5 extends TFieldValues = TFieldValues, TFieldValuesRefined6 extends TFieldValues = TFieldValues, TFieldValuesRefined7 extends TFieldValues = TFieldValues, TFieldValuesRefined8 extends TFieldValues = TFieldValues, TFieldValuesRefined9 extends TFieldValues = TFieldValues, TFieldValuesRefined10 extends TFieldValues = TFieldValues, TFieldValuesRefined11 extends TFieldValues = TFieldValues, TFieldValuesRefined12 extends TFieldValues = TFieldValues, TFieldValuesRefined13 extends TFieldValues = TFieldValues, TFieldValuesRefined14 extends TFieldValues = TFieldValues, E extends boolean = false, E2 extends boolean = false, E3 extends boolean = false, E4 extends boolean = false, E5 extends boolean = false, E6 extends boolean = false, E7 extends boolean = false, E8 extends boolean = false, E9 extends boolean = false, E10 extends boolean = false, E11 extends boolean = false, E12 extends boolean = false, E13 extends boolean = false, E14 extends boolean = false >( fb: (current: Query) => QueryWhere, fc: ( query: QueryWhere ) => QueryWhere, fd: ( query: QueryWhere ) => QueryWhere, fe: ( query: QueryWhere ) => QueryWhere, ff: ( query: QueryWhere ) => QueryWhere, fg: ( query: QueryWhere ) => QueryWhere, fh: ( query: QueryWhere ) => QueryWhere, fi: ( query: QueryWhere ) => QueryWhere, fj: ( query: QueryWhere ) => QueryWhere, fk: ( query: QueryWhere ) => QueryWhere, fl: ( query: QueryWhere ) => QueryWhere, fm: ( query: QueryWhere ) => QueryWhere, fn: ( query: QueryWhere ) => QueryWhere ): ( current: QueryWhere ) => QueryWhere } export type FilterWhere = & NestedQueriesFixedRefinement & FilteringRefinements & FilterContinuations export type FilterContinuationAnd = & NestedQueriesFreeIntersectionRefinement & FilteringRefinements & FilterContinuations export type FilterContinuationOr = & NestedQueriesFreeDisjointRefinement & FilterContinuations // it does not support refinements by choice (for now) export type WhereEveryOrSome = & { < TFieldValues extends FieldValues, TFieldName extends FieldPath >( subPath: TFieldName, dude: ( current: Query ) => QueryWhere, ...dudes: (( current: QueryWhere ) => QueryWhere)[] ): ( current: Query ) => QueryWhere } & FilterContinuationsWithSubpath