/* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-explicit-any */ 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 * as Option from "../../Option.js" import type * as S from "../../Schema.js" import type { NonNegativeInt } from "../../Schema.js" 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) /** * Element type of an array-valued field path on `TFieldValues`. Falls back to * `FieldValues` when the path does not resolve to an array of structs so that * `FieldPath<...>` stays defined (it just degrades to `string`). * * Uses `Extract` so that when `P` defaults to the full `FieldPath` * union, only the array-valued branches contribute to the element type. */ export type RelationElement< TFieldValues extends FieldValues, P extends FieldPath > = Extract, ReadonlyArray> extends ReadonlyArray ? (E extends FieldValues ? E : FieldValues) : FieldValues export const relation = < TFieldValues extends FieldValues, const P extends FieldPath = FieldPath >( path: P ) => ({ /** * Typed math-expression builder bound to the relation's element scope: * `relation("items").expr.field("weight")` constrains the field path to * `FieldPath>`. */ expr: { field: (field: FieldPath>): ComputedProjectionMathExpression => ({ _tag: "field", field: field as string }), mul: ( left: ComputedProjectionMathExpression, right: ComputedProjectionMathExpression ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right }) }, 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: FieldPath>, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-distinct-count", path: path as string, field: field as string, operation } : { _tag: "relation-distinct-count", path: path as string, field: field as string }, sum: ( field: FieldPath>, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-sum", path: path as string, field: field as string, operation } : { _tag: "relation-sum", path: path as string, field: field as string }, 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: FieldPath> }, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-sum-expr-by", path: path as string, expression, unit: options.unit as string, operation } : { _tag: "relation-sum-expr-by", path: path as string, expression, unit: options.unit as string }, sumExprNormalized: ( expression: ComputedProjectionMathExpression, options: { unit: FieldPath> toBase: string factors: Readonly> }, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-sum-expr-normalized", path: path as string, expression, unit: options.unit as string, toBase: options.toBase, factors: options.factors, operation } : { _tag: "relation-sum-expr-normalized", path: path as string, expression, unit: options.unit as string, toBase: options.toBase, factors: options.factors }, collect: ( field: FieldPath>, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-collect", path: path as string, field: field as string, distinct: false, operation } : { _tag: "relation-collect", path: path as string, field: field as string, distinct: false }, collectDistinct: ( field: FieldPath>, operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-collect", path: path as string, field: field as string, distinct: true, operation } : { _tag: "relation-collect", path: path as string, field: field as string, distinct: true }, collectFields: ( fields: readonly FieldPath>[], operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-collect-fields", path: path as string, fields: fields as readonly string[], distinct: false, operation } : { _tag: "relation-collect-fields", path: path as string, fields: fields as readonly string[], distinct: false }, collectDistinctFields: ( fields: readonly FieldPath>[], operation?: ComputedProjectionOperation ): ComputedProjectionExpression => operation ? { _tag: "relation-collect-fields", path: path as string, fields: fields as readonly string[], distinct: true, operation } : { _tag: "relation-collect-fields", path: path as string, fields: fields as readonly string[], distinct: true } }) /** * Untyped math-expression builder. Field paths are not statically validated — * prefer the scope-bound `relation(path).expr` builder when the element type * is known, since it constrains the field argument to `FieldPath`. * * The generic parameter is accepted for symmetry with the scoped builder so * callers may opt into a tighter check via `expr.field("x")`. */ export const expr = { field: ( field: FieldPath ): ComputedProjectionMathExpression => ({ _tag: "field", field: field as string }), mul: ( left: ComputedProjectionMathExpression, right: ComputedProjectionMathExpression ): ComputedProjectionMathExpression => ({ _tag: "mul", left, right }) } as const export const computed = (value: T): T => value /** * Helpers passed to the inline-builder form of {@link projectComputed}. The * `relation` factory is bound to the source row shape so paths/fields inside * the projection are validated against the document shape inferred from the * pipe. */ export interface ComputedHelpers { relation: >(path: P) => ReturnType> } const makeComputedHelpers = (): ComputedHelpers => ({ relation: (path) => relation(path) }) export const projectComputed: { < Q extends Query | QueryWhere | QueryEnd, I extends Record, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec, I, R>, build: (helpers: ComputedHelpers>) => 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, build: (helpers: ComputedHelpers>) => ComputedProjectionMap, mode?: "project" ): ( 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, 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, mapOrBuild: | ComputedProjectionMap | ((helpers: ComputedHelpers) => ComputedProjectionMap), mode = "project" ) => (current: any) => { const computedProjection = typeof mapOrBuild === "function" ? mapOrBuild(makeComputedHelpers()) : mapOrBuild return new Project({ current, schema, mode, computed: computedProjection } as any) } /** * Builder shape returned by {@link agg}. Field-taking methods are constrained * to `FieldPath` so paths are validated against the document * shape. */ export interface AggBuilder { field: (path: FieldPath) => AggregateExpression count: () => AggregateExpression countWhen: (operation: ComputedProjectionOperation) => AggregateExpression sum: (field: FieldPath) => AggregateExpression min: (field: FieldPath) => AggregateExpression max: (field: FieldPath) => AggregateExpression } const makeAggBuilder = (): AggBuilder => ({ field: (path) => ({ _tag: "agg-field", path: path as string }), count: () => ({ _tag: "agg-count" }), countWhen: (operation) => ({ _tag: "agg-count-when", operation }), sum: (field) => ({ _tag: "agg-sum", field: field as string }), min: (field) => ({ _tag: "agg-min", field: field as string }), max: (field) => ({ _tag: "agg-max", field: field as string }) }) /** * Scope-bound aggregate-expression builder factory. Invoke with the source * document field-value shape to get a builder whose `field`/`sum`/`min`/`max` * arguments are constrained to `FieldPath`. * * Prefer the inline callback form of {@link aggregate} (`aggregate(schema, * ($) => ({...}))`) — there the source shape is inferred from the pipe so no * explicit type argument is needed. This factory is the escape hatch when * the builder is constructed outside the pipe. */ export const agg = (): AggBuilder => makeAggBuilder() /** * 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. * * Pass a builder callback to get a typed `agg` bound to the source row shape * (inferred from the pipe — no explicit generic needed): * * @example * ```ts * repo.query( * where("status", "active"), * aggregate( * S.Struct({ city: S.String, count: S.Number }), * ($) => ({ * city: $.field("address.city"), * count: $.countWhen((q) => q.pipe(where("active", true))) * }) * ) * ) * ``` * * A plain {@link AggregateMap} is also accepted for the rare case where the * map is built outside the pipe (loses path inference). * * The output is decoded directly with `schema` (no PM reverse-mapping, no etag tracking). * Decode failures surface as `S.SchemaError`. */ export const aggregate: { < Q extends Query | QueryWhere | QueryEnd, I extends Record, A = ExtractFieldValuesRefined, R = never, E extends boolean = ExtractExclusiveness >( schema: S.Codec, build: (agg: AggBuilder>) => AggregateMap ): ( 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, aggregateMap: AggregateMap ): ( current: Q ) => QueryProjection, A, R, ExtractTType, E> } = (schema: any, mapOrBuild: AggregateMap | ((agg: AggBuilder) => AggregateMap)) => (current: any) => { const aggregateMap = typeof mapOrBuild === "function" ? mapOrBuild(makeAggBuilder()) : mapOrBuild return 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