From 9d4f036b729c1bcadf47429be17737e3c7826609 Mon Sep 17 00:00:00 2001 From: tylim Date: Sun, 10 Mar 2024 20:00:15 +0800 Subject: [PATCH] fix where clause unable to allow all possible key especially from discriminated union --- package.json | 2 +- src/types/metaTypeCreator/index.ts | 1 + src/types/metaTypeCreator/utils.ts | 6 +++++ src/types/queryConstraints/orderBy.ts | 4 ++-- src/types/queryConstraints/query.ts | 8 +++---- src/types/queryConstraints/where.ts | 6 ++--- .../queryConstraintsLimitations/composite.ts | 4 ++-- .../queryConstraintsLimitations/query.ts | 4 ++-- .../queryConstraintsLimitations/where.ts | 22 +++++++++---------- 9 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 src/types/metaTypeCreator/utils.ts diff --git a/package.json b/package.json index 760a95f6..c9c86e2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firelordjs", - "version": "2.8.0", + "version": "2.8.1", "description": "🔥 High Precision Typescript Wrapper for Firestore Web, Providing Unparalleled Type Safe and Dev Experience", "author": "tylim", "license": "MIT", diff --git a/src/types/metaTypeCreator/index.ts b/src/types/metaTypeCreator/index.ts index 091ca85c..a10fbe06 100644 --- a/src/types/metaTypeCreator/index.ts +++ b/src/types/metaTypeCreator/index.ts @@ -1,3 +1,4 @@ export * from './metaTypeCreator' export * from './metaType' export * from './abstract' +export * from './utils' diff --git a/src/types/metaTypeCreator/utils.ts b/src/types/metaTypeCreator/utils.ts new file mode 100644 index 00000000..b4eb1c1b --- /dev/null +++ b/src/types/metaTypeCreator/utils.ts @@ -0,0 +1,6 @@ +import { MetaType } from './metaType' + +// TODO add tests! +export type GetAllCompareKeys = + (T['compare'] extends infer T ? (T extends T ? keyof T : never) : never) & + string diff --git a/src/types/queryConstraints/orderBy.ts b/src/types/queryConstraints/orderBy.ts index 5f1fa638..7d751b0f 100644 --- a/src/types/queryConstraints/orderBy.ts +++ b/src/types/queryConstraints/orderBy.ts @@ -1,5 +1,5 @@ import { OrderByDirection, QueryOrderByConstraint } from '../alias' -import { MetaType } from '../metaTypeCreator' +import { MetaType, GetAllCompareKeys } from '../metaTypeCreator' import { __name__ } from '../fieldPath' export type OrderByConstraint = { @@ -10,7 +10,7 @@ export type OrderByConstraint = { export type OrderBy = < T extends MetaType, - FieldPath extends (keyof T['compare'] & string) | __name__, + FieldPath extends GetAllCompareKeys | __name__, DirectionStr extends OrderByDirection | undefined = undefined >( fieldPath: FieldPath, diff --git a/src/types/queryConstraints/query.ts b/src/types/queryConstraints/query.ts index 89168079..47dba7f6 100644 --- a/src/types/queryConstraints/query.ts +++ b/src/types/queryConstraints/query.ts @@ -1,4 +1,4 @@ -import { MetaType } from '../metaTypeCreator' +import { MetaType, GetAllCompareKeys } from '../metaTypeCreator' import { WhereFilterOp } from '../alias' import { CursorType, CursorConstraint } from './cursor' import { WhereConstraint } from './where' @@ -9,14 +9,14 @@ import { QueryCompositeFilterConstraint } from './composite' type QueryNonFilterConstraints = | LimitConstraint<'limit' | 'limitToLast'> | CursorConstraint - | OrderByConstraint + | OrderByConstraint> export type QueryConstraints = - | WhereConstraint + | WhereConstraint, WhereFilterOp, unknown> | QueryNonFilterConstraints export type QueryFilterConstraints = - | WhereConstraint + | WhereConstraint, WhereFilterOp, unknown> | QueryCompositeFilterConstraint[]> export type QueryAllConstraints = diff --git a/src/types/queryConstraints/where.ts b/src/types/queryConstraints/where.ts index 22a8a2b5..64363211 100644 --- a/src/types/queryConstraints/where.ts +++ b/src/types/queryConstraints/where.ts @@ -1,10 +1,10 @@ -import { MetaType } from '../metaTypeCreator' +import { MetaType, GetAllCompareKeys } from '../metaTypeCreator' import { WhereFilterOp, QueryFieldFilterConstraint } from '../alias' import { __name__ } from '../fieldPath' export type WhereConstraint< T extends MetaType, - FieldPath extends keyof T['compare'] & string, + FieldPath extends GetAllCompareKeys | __name__, OpStr extends WhereFilterOp, Value > = { @@ -17,7 +17,7 @@ export type WhereConstraint< export type Where = < T extends MetaType, - FieldPath extends (keyof T['compare'] & string) | __name__, + FieldPath extends GetAllCompareKeys | __name__, OpStr extends WhereFilterOp, const Value >( diff --git a/src/types/queryConstraintsLimitations/composite.ts b/src/types/queryConstraintsLimitations/composite.ts index b7066a14..5342df9e 100644 --- a/src/types/queryConstraintsLimitations/composite.ts +++ b/src/types/queryConstraintsLimitations/composite.ts @@ -51,7 +51,7 @@ export type ValidateTopLevelQueryCompositeFilterPartOne< T extends MetaType, AllQQCs extends readonly QueryAllConstraints[] > = AllQQCs extends (infer P)[] - ? Extract> extends never + ? Extract> extends never ? true : GetAllQueryFilterCompositeConstraint extends never ? true @@ -129,7 +129,7 @@ export type QueryFilterConstraintLimitation< | OrderByConstraint | CursorConstraint ? ErrorOrAndInvalidConstraints - : Head extends WhereConstraint + : Head extends WhereConstraint ? Head['opStr'] extends NotIn ? 'or' extends ParentConstraint['type'] ? ParentConstraint['constraints']['length'] extends 1 diff --git a/src/types/queryConstraintsLimitations/query.ts b/src/types/queryConstraintsLimitations/query.ts index 020ff27e..60a755d2 100644 --- a/src/types/queryConstraintsLimitations/query.ts +++ b/src/types/queryConstraintsLimitations/query.ts @@ -34,7 +34,7 @@ export type ValidateOrderByAndInequalityWhere< AllQCs extends readonly QueryConstraints[] > = GetFirstInequalityWhere extends infer W extends WhereConstraint< T, - string, + any, InequalityOpStr, unknown > @@ -62,7 +62,7 @@ export type QueryConstraintLimitation< ? Head : Head extends LimitConstraint<'limitToLast'> ? LimitToLastConstraintLimitation - : Head extends WhereConstraint + : Head extends WhereConstraint ? ValidateWhereArrayContainsArrayContainsAny< T, Head, diff --git a/src/types/queryConstraintsLimitations/where.ts b/src/types/queryConstraintsLimitations/where.ts index c17443e8..61d3d916 100644 --- a/src/types/queryConstraintsLimitations/where.ts +++ b/src/types/queryConstraintsLimitations/where.ts @@ -30,7 +30,7 @@ import { DeepValue } from '../objectFlatten' // You can't combine 'not-in' with 'or', 'in', 'array-contains-any', or '!=' in the same query. type ValidateWhereNotIn< T extends MetaType, - U extends WhereConstraint, + U extends WhereConstraint, PreviousQCs extends readonly QueryConstraints[] > = U['opStr'] extends NotIn ? Extract< @@ -51,7 +51,7 @@ type ValidateWhereNotIn< // You cannot use more than one '!=' filter. (undocumented) type ValidateWhereNotEqual< T extends MetaType, - U extends WhereConstraint, + U extends WhereConstraint, PreviousQCs extends readonly QueryConstraints[] > = U['opStr'] extends NotEqual ? Extract< @@ -65,7 +65,7 @@ type ValidateWhereNotEqual< // You can use at most one array-contains or array-contains-any clause per query. You can't combine array-contains with array-contains-any. export type ValidateWhereArrayContainsArrayContainsAny< T extends MetaType, - U extends WhereConstraint, + U extends WhereConstraint, PreviousQCs extends readonly QueryConstraints[] > = U['opStr'] extends ArrayContains ? Extract< @@ -86,18 +86,18 @@ export type ValidateWhereArrayContainsArrayContainsAny< // In a compound query, range (<, <=, >, >=) and not equals (!=, not-in) comparisons must all filter on the same field. type ValidateWhereInequalityOpStrSameField< T extends MetaType, - U extends WhereConstraint, + U extends WhereConstraint, PreviousQCs extends readonly QueryConstraints[] > = U['opStr'] extends InequalityOpStr ? Extract< GetAllWhereConstraint, - WhereConstraint + WhereConstraint > extends never ? true : Exclude< Extract< GetAllWhereConstraint, - WhereConstraint + WhereConstraint >, WhereConstraint > extends never @@ -109,7 +109,7 @@ export type GetFirstInequalityWhere< T extends MetaType, QCs extends readonly QueryConstraints[] > = QCs extends [infer H, ...infer Rest extends readonly QueryConstraints[]] - ? H extends WhereConstraint + ? H extends WhereConstraint ? H : GetFirstInequalityWhere : true // not found, no check needed @@ -117,7 +117,7 @@ export type GetFirstInequalityWhere< export type GetAllWhereConstraint< T extends MetaType, AllQCs extends readonly QueryConstraints[], - WhereConstraintsAcc extends WhereConstraint + WhereConstraintsAcc extends WhereConstraint > = AllQCs extends [infer H, ...infer R] ? R extends readonly QueryConstraints[] ? @@ -125,7 +125,7 @@ export type GetAllWhereConstraint< | GetAllWhereConstraint< T, R, - | (H extends WhereConstraint + | (H extends WhereConstraint ? H : never) | WhereConstraintsAcc @@ -144,7 +144,7 @@ type GetAllWhereConstraintOpStr< | GetAllWhereConstraintOpStr< T, R, - | (H extends WhereConstraint + | (H extends WhereConstraint ? H['opStr'] : never) | OpStrAcc @@ -155,7 +155,7 @@ type GetAllWhereConstraintOpStr< export type WhereConstraintLimitation< T extends MetaType, Q extends GeneralQuery, - U extends WhereConstraint, + U extends WhereConstraint, PreviousQCs extends readonly QueryConstraints[] > = ValidateWhereNotIn extends infer R extends string ? R