react-query-firebase 3.3.0 → 3.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,7 +20,7 @@ type UseCountQueryOptions<AppModelType extends AppModel = AppModel> = {
20
20
  /**
21
21
  * Composite filter
22
22
  */
23
- compositeFilter?: QueryCompositeFilterConstraint;
23
+ compositeFilter?: QueryCompositeFilterConstraint | null;
24
24
  };
25
25
  /**
26
26
  * Executes a query with specified constraints and returns the count of matched documents.
@@ -20,7 +20,7 @@ type UseInfiniteQueryOptions<AppModelType extends AppModel = AppModel, TQueryKey
20
20
  /**
21
21
  * Composite filter
22
22
  */
23
- compositeFilter?: QueryCompositeFilterConstraint;
23
+ compositeFilter?: QueryCompositeFilterConstraint | null;
24
24
  };
25
25
  /**
26
26
  * Executes an infinite query on a Firestore data source and returns the resulting documents as an array.
@@ -21,7 +21,7 @@ type UseQueryOptions<AppModelType extends AppModel = AppModel> = {
21
21
  /**
22
22
  * Composite filter
23
23
  */
24
- compositeFilter?: QueryCompositeFilterConstraint;
24
+ compositeFilter?: QueryCompositeFilterConstraint | null;
25
25
  };
26
26
  /**
27
27
  * Executes a query on a Firestore data source and returns the resulting documents as an array.
@@ -34,4 +34,4 @@ export type UseCompositeFilter<AppModelType extends AppModel = AppModel> = {
34
34
  * };
35
35
  * ```
36
36
  */
37
- export declare const useCompositeFilter: <AppModelType extends AppModel = AppModel>({ query }: UseCompositeFilter<AppModelType>) => import("@firebase/firestore").QueryCompositeFilterConstraint | undefined;
37
+ export declare const useCompositeFilter: <AppModelType extends AppModel = AppModel>({ query }: UseCompositeFilter<AppModelType>) => import("@firebase/firestore").QueryCompositeFilterConstraint | null;
@@ -1,4 +1,3 @@
1
- import { and, or } from "firebase/firestore";
2
1
  import { useMemo } from "react";
3
2
  import { buildCompositeFilter } from "./utils/buildCompositeFilter.js";
4
3
  /**
@@ -31,10 +30,6 @@ import { buildCompositeFilter } from "./utils/buildCompositeFilter.js";
31
30
  */
32
31
  export const useCompositeFilter = ({ query }) => {
33
32
  return useMemo(() => {
34
- const queryConstraints = (query?.children?.map?.((subQuery) => buildCompositeFilter(subQuery))?.filter)?.((constraint) => !!constraint) ?? [];
35
- if (queryConstraints.length <= 0) {
36
- return undefined;
37
- }
38
- return query?.operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
33
+ return query ? buildCompositeFilter(query) : null;
39
34
  }, [query]);
40
35
  };
@@ -1,7 +1,6 @@
1
- import { CollectionReference, QueryConstraint, QueryNonFilterConstraint } from "firebase/firestore";
1
+ import { CollectionReference, QueryConstraint, QueryNonFilterConstraint, QueryCompositeFilterConstraint } from "firebase/firestore";
2
2
  import { UseQueryResult, UseQueryOptions as UseReactQueryOptions } from "@tanstack/react-query";
3
3
  import { AppModel } from "../../types/index.js";
4
- import { QueryFilterConstraint } from "./utils/buildCompositeFilter.js";
5
4
  /**
6
5
  * @inline
7
6
  */
@@ -21,7 +20,7 @@ type UseCountQueryOptions<AppModelType extends AppModel = AppModel> = {
21
20
  /**
22
21
  * Composite filter
23
22
  */
24
- compositeFilter?: QueryFilterConstraint;
23
+ compositeFilter?: QueryCompositeFilterConstraint | null;
25
24
  };
26
25
  /**
27
26
  * Executes a query with specified constraints and returns the count of matched documents.
@@ -17,7 +17,7 @@ type UseFirestoreQueryEngineOptions<AppModelType extends AppModel = AppModel> =
17
17
  /**
18
18
  * Composite filter
19
19
  */
20
- compositeFilter?: CompositeFilter;
20
+ compositeFilter?: CompositeFilter<AppModelType>;
21
21
  };
22
22
  /**
23
23
  * Returns an async wrapper around native firestore query engine.
@@ -1,4 +1,4 @@
1
- import { getDocs, query, or, and } from "firebase/firestore";
1
+ import { getDocs, query } from "firebase/firestore";
2
2
  import { useCallback } from "react";
3
3
  import { buildCompositeFilter } from "./utils/buildCompositeFilter.js";
4
4
  import { buildQueryConstraint } from "./utils/buildQueryConstraint.js";
@@ -25,16 +25,9 @@ import { buildQueryConstraint } from "./utils/buildQueryConstraint.js";
25
25
  */
26
26
  export const useFirestoreQueryEngine = () => {
27
27
  return useCallback(async ({ collectionReference, queryConstraints = [], compositeFilter: inputCompositeFilter }) => {
28
- const compositeFilter = (inputCompositeFilter?.children?.map?.((subQuery) => buildCompositeFilter(subQuery))
29
- ?.filter)?.((constraint) => !!constraint) ?? [];
30
- const finalCompositeFilter = compositeFilter.length > 0
31
- ? inputCompositeFilter?.operator === "OR"
32
- ? or(...compositeFilter)
33
- : and(...compositeFilter)
34
- : undefined;
35
- const queryToExecute = finalCompositeFilter
36
- ? query(collectionReference, finalCompositeFilter, ...queryConstraints.map(buildQueryConstraint))
37
- : query(collectionReference, ...queryConstraints);
28
+ const compositeFilter = inputCompositeFilter ? buildCompositeFilter(inputCompositeFilter) : null;
29
+ const builtQueryConstraints = queryConstraints.map(buildQueryConstraint);
30
+ const queryToExecute = query(collectionReference, ...[...(compositeFilter ? [compositeFilter] : []), ...builtQueryConstraints]);
38
31
  const querySnapshot = await getDocs(queryToExecute);
39
32
  const docs = [];
40
33
  if (querySnapshot) {
@@ -1,7 +1,6 @@
1
- import { CollectionReference, QueryConstraint, QueryNonFilterConstraint } from "firebase/firestore";
1
+ import { CollectionReference, QueryCompositeFilterConstraint, QueryConstraint, QueryNonFilterConstraint } from "firebase/firestore";
2
2
  import { UseInfiniteQueryOptions as UseReactInfiniteQueryOptions, QueryKey, UseInfiniteQueryResult, InfiniteData } from "@tanstack/react-query";
3
3
  import { AppModel } from "../../types/index.js";
4
- import { QueryFilterConstraint } from "./utils/buildCompositeFilter.js";
5
4
  /**
6
5
  * @inline
7
6
  */
@@ -21,7 +20,7 @@ type UseInfiniteQueryOptions<AppModelType extends AppModel = AppModel, TQueryKey
21
20
  /**
22
21
  * Composite filter
23
22
  */
24
- compositeFilter?: QueryFilterConstraint;
23
+ compositeFilter?: QueryCompositeFilterConstraint | null;
25
24
  };
26
25
  /**
27
26
  * Executes an infinite query on a Firestore data source and returns the resulting documents as an array.
@@ -27,9 +27,7 @@ export const useInfiniteQuery = ({ options, collectionReference, queryConstraint
27
27
  ...options,
28
28
  queryFn: async ({ pageParam }) => {
29
29
  const allQueryConstraints = [...queryConstraints, ...(pageParam ? [pageParam] : [])];
30
- const queryToExecute = compositeFilter
31
- ? query(collectionReference, compositeFilter, ...allQueryConstraints)
32
- : query(collectionReference, ...allQueryConstraints);
30
+ const queryToExecute = query(collectionReference, ...[...(compositeFilter ? [compositeFilter] : []), ...allQueryConstraints]);
33
31
  const querySnapshot = await getDocs(queryToExecute);
34
32
  const docs = [];
35
33
  if (querySnapshot) {
@@ -1,7 +1,6 @@
1
- import { CollectionReference, QueryConstraint, QueryNonFilterConstraint } from "firebase/firestore";
1
+ import { CollectionReference, QueryCompositeFilterConstraint, QueryConstraint, QueryNonFilterConstraint } from "firebase/firestore";
2
2
  import { UseQueryResult, UseQueryOptions as UseReactQueryOptions } from "@tanstack/react-query";
3
3
  import { AppModel } from "../../types/index.js";
4
- import { QueryFilterConstraint } from "./utils/buildCompositeFilter.js";
5
4
  /**
6
5
  * @inline
7
6
  */
@@ -21,7 +20,7 @@ type UseQueryOptions<AppModelType extends AppModel = AppModel> = {
21
20
  /**
22
21
  * Composite filter
23
22
  */
24
- compositeFilter?: QueryFilterConstraint;
23
+ compositeFilter?: QueryCompositeFilterConstraint | null;
25
24
  };
26
25
  /**
27
26
  * Executes a query on a Firestore data source and returns the resulting documents as an array.
@@ -26,9 +26,7 @@ export const useQuery = ({ options, collectionReference, queryConstraints = [],
26
26
  return useReactQuery({
27
27
  ...options,
28
28
  queryFn: async () => {
29
- const queryToExecute = compositeFilter
30
- ? query(collectionReference, compositeFilter, ...queryConstraints)
31
- : query(collectionReference, ...queryConstraints);
29
+ const queryToExecute = query(collectionReference, ...[...(compositeFilter ? [compositeFilter] : []), ...queryConstraints]);
32
30
  const querySnapshot = await getDocs(queryToExecute);
33
31
  const docs = [];
34
32
  if (querySnapshot) {
@@ -1,20 +1,17 @@
1
- import { QueryFilterConstraint as FBQueryFilterConstraint, QueryCompositeFilterConstraint as FBQueryCompositeFilterConstraint, WhereFilterOp } from "firebase/firestore";
1
+ import { WhereFilterOp, QueryCompositeFilterConstraint } from "firebase/firestore";
2
2
  import { AppModel } from "../../../types/AppModel.js";
3
- export type QueryFilterConstraint = FBQueryFilterConstraint | FBQueryCompositeFilterConstraint;
4
3
  export type QueryElement<AppModelType extends AppModel = AppModel> = {
5
- operator?: "OR" | "AND";
6
- children?: QueryElement[];
7
- field?: keyof (AppModelType & {
4
+ field: keyof (AppModelType & {
8
5
  documentId?: string[];
9
6
  });
10
- value?: AppModelType[keyof AppModelType];
11
- op?: WhereFilterOp;
7
+ value: AppModelType[keyof AppModelType];
8
+ op: WhereFilterOp;
12
9
  };
13
10
  export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
14
11
  operator: "OR" | "AND";
15
- children: QueryElement<AppModelType & {
12
+ children: Array<CompositeFilter<AppModelType> | QueryElement<AppModelType & {
16
13
  documentId?: string[];
17
- }>[];
14
+ }>>;
18
15
  };
19
16
  /**
20
17
  * Constructs a composite or where query filter based on the provided query structure.
@@ -44,4 +41,4 @@ export type CompositeFilter<AppModelType extends AppModel = AppModel> = {
44
41
  * };
45
42
  * ```
46
43
  */
47
- export declare const buildCompositeFilter: <AppModelType extends AppModel = AppModel>(query: QueryElement<AppModelType>) => QueryFilterConstraint | null;
44
+ export declare const buildCompositeFilter: <AppModelType extends AppModel = AppModel>(query: CompositeFilter<AppModelType> | QueryElement<AppModelType>) => QueryCompositeFilterConstraint | null;
@@ -29,14 +29,23 @@ import { or, and, where, documentId } from "firebase/firestore";
29
29
  */
30
30
  export const buildCompositeFilter = (query) => {
31
31
  if (query.children) {
32
- const queryConstraints = query.children.map(buildCompositeFilter).filter((constraint) => !!constraint);
32
+ const queryConstraints = query.children
33
+ .map(buildCompositeFilter)
34
+ .filter((constraint) => !!constraint);
33
35
  if (queryConstraints.length <= 0) {
34
36
  return null;
35
37
  }
36
- return query.operator === "OR" ? or(...queryConstraints) : and(...queryConstraints);
38
+ if (queryConstraints.length <= 1) {
39
+ return and(queryConstraints[0]);
40
+ }
41
+ return query.operator === "OR"
42
+ ? or(...queryConstraints)
43
+ : and(...queryConstraints);
37
44
  }
38
45
  if (query.field && query.op) {
39
- return where(query.field === "documentId" ? documentId() : query.field, query.op, query.value);
46
+ return and(where(query.field === "documentId"
47
+ ? documentId()
48
+ : query.field, query.op, query.value));
40
49
  }
41
50
  return null;
42
51
  };
package/package.json CHANGED
@@ -93,5 +93,5 @@
93
93
  "docs:build": "vitepress build docs",
94
94
  "docs:preview": "vitepress preview docs"
95
95
  },
96
- "version": "3.3.0"
96
+ "version": "3.3.2"
97
97
  }