firelordjs
Version:
🔥 High Precision Typescript Wrapper for Firestore Web, Providing Unparalleled Type Safe and Dev Experience
18 lines (17 loc) • 5.23 kB
TypeScript
import { MetaType } from '../metaTypeCreator';
import { WhereFilterOp } from '../alias';
import { ErrorWhereCompareValueMustBeArray, ErrorWhereNotIn, ErrorWhereArrayContainsArrayContainsAny, ErrorWhereInequalityOpStrSameField, ErrorWhereOnlyOneNotEqual, ErrorWhereNoNeverEmptyArray, ErrorWhereInOrNotInValueIsNotArray } from '../error';
import { QueryConstraints, WhereConstraint } from '../queryConstraints';
import { GeneralQuery } from '../refs';
import { GetCorrectDocumentIdBasedOnRef } from '../fieldPath';
import { In, NotIn, ArrayContainsAny, NotEqual, ArrayContains, InequalityOpStr, ValueOfOptStr, ArrayOfOptStr, ValueOfOnlyArrayOptStr, ElementOfOptStr, Or } from './utils';
import { DeepValue } from '../objectFlatten';
type ValidateWhereNotIn<T extends MetaType, U extends WhereConstraint<string, WhereFilterOp, unknown>, PreviousQCs extends readonly QueryConstraints[]> = U['opStr'] extends NotIn ? Extract<GetAllWhereConstraintOpStr<T, PreviousQCs, never>, NotEqual | In | ArrayContainsAny | Or> extends never ? true : ErrorWhereNotIn : U['opStr'] extends NotEqual | In | ArrayContainsAny | Or ? Extract<GetAllWhereConstraintOpStr<T, PreviousQCs, never>, NotIn> extends never ? true : ErrorWhereNotIn : true;
type ValidateWhereNotEqual<T extends MetaType, U extends WhereConstraint<string, WhereFilterOp, unknown>, PreviousQCs extends readonly QueryConstraints[]> = U['opStr'] extends NotEqual ? Extract<GetAllWhereConstraintOpStr<T, PreviousQCs, never>, NotEqual> extends never ? true : ErrorWhereOnlyOneNotEqual : true;
export type ValidateWhereArrayContainsArrayContainsAny<T extends MetaType, U extends WhereConstraint<string, WhereFilterOp, unknown>, PreviousQCs extends readonly QueryConstraints[]> = U['opStr'] extends ArrayContains ? Extract<GetAllWhereConstraintOpStr<T, PreviousQCs, never>, ArrayContains | ArrayContainsAny> extends never ? true : ErrorWhereArrayContainsArrayContainsAny : U['opStr'] extends ArrayContainsAny ? Extract<GetAllWhereConstraintOpStr<T, PreviousQCs, never>, ArrayContains | ArrayContainsAny> extends never ? true : ErrorWhereArrayContainsArrayContainsAny : true;
type ValidateWhereInequalityOpStrSameField<T extends MetaType, U extends WhereConstraint<string, WhereFilterOp, unknown>, PreviousQCs extends readonly QueryConstraints[]> = U['opStr'] extends InequalityOpStr ? Extract<GetAllWhereConstraint<T, PreviousQCs, never>, WhereConstraint<string, InequalityOpStr, unknown>> extends never ? true : Exclude<Extract<GetAllWhereConstraint<T, PreviousQCs, never>, WhereConstraint<string, InequalityOpStr, unknown>>, WhereConstraint<U['fieldPath'], InequalityOpStr, unknown>> extends never ? true : ErrorWhereInequalityOpStrSameField : true;
export type GetFirstInequalityWhere<T extends MetaType, QCs extends readonly QueryConstraints[]> = QCs extends [infer H, ...infer Rest extends readonly QueryConstraints[]] ? H extends WhereConstraint<string, InequalityOpStr, unknown> ? H : GetFirstInequalityWhere<T, Rest> : true;
export type GetAllWhereConstraint<T extends MetaType, AllQCs extends readonly QueryConstraints[], WhereConstraintsAcc extends WhereConstraint<string, WhereFilterOp, unknown>> = AllQCs extends [infer H, ...infer R] ? R extends readonly QueryConstraints[] ? WhereConstraintsAcc | GetAllWhereConstraint<T, R, (H extends WhereConstraint<string, WhereFilterOp, unknown> ? H : never) | WhereConstraintsAcc> : WhereConstraintsAcc : WhereConstraintsAcc;
type GetAllWhereConstraintOpStr<T extends MetaType, QCs extends readonly QueryConstraints[], OpStrAcc extends WhereFilterOp> = QCs extends [infer H, ...infer R] ? R extends readonly QueryConstraints[] ? OpStrAcc | GetAllWhereConstraintOpStr<T, R, (H extends WhereConstraint<string, WhereFilterOp, unknown> ? H['opStr'] : never) | OpStrAcc> : OpStrAcc : OpStrAcc;
export type WhereConstraintLimitation<T extends MetaType, Q extends GeneralQuery<T>, U extends WhereConstraint<string, WhereFilterOp, unknown>, PreviousQCs extends readonly QueryConstraints[]> = ValidateWhereNotIn<T, U, PreviousQCs> extends infer R extends string ? R : ValidateWhereNotEqual<T, U, PreviousQCs> extends infer P extends string ? P : ValidateWhereInequalityOpStrSameField<T, U, PreviousQCs> extends infer K extends string ? K : U['opStr'] extends ValueOfOptStr ? WhereConstraint<U['fieldPath'], U['opStr'], GetCorrectDocumentIdBasedOnRef<T, Q, U['fieldPath'], U['value']>> : U['opStr'] extends ArrayOfOptStr ? WhereConstraint<U['fieldPath'], U['opStr'], U['value'] extends readonly never[] ? ErrorWhereNoNeverEmptyArray : U['value'] extends readonly (infer P)[] ? readonly GetCorrectDocumentIdBasedOnRef<T, Q, U['fieldPath'], P>[] : ErrorWhereInOrNotInValueIsNotArray<U['fieldPath']>> : U['opStr'] extends ValueOfOnlyArrayOptStr ? WhereConstraint<U['fieldPath'], U['opStr'], U['value'] extends readonly never[] ? ErrorWhereNoNeverEmptyArray : DeepValue<T['compare'], U['fieldPath']> extends readonly unknown[] ? DeepValue<T['compare'], U['fieldPath']> : ErrorWhereCompareValueMustBeArray<U['fieldPath']>> : U['opStr'] extends ElementOfOptStr ? WhereConstraint<U['fieldPath'], U['opStr'], DeepValue<T['compare'], U['fieldPath']> extends readonly (infer R)[] ? R : ErrorWhereCompareValueMustBeArray<U['fieldPath']>> : never;
export {};