@tanstack/vue-query 5.0.0-alpha.32 → 5.0.0-alpha.34

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.
Files changed (47) hide show
  1. package/build/lib/useQueries.d.ts +3 -2
  2. package/build/lib/useQueries.esm.js +14 -10
  3. package/build/lib/useQueries.esm.js.map +1 -1
  4. package/build/lib/useQueries.js +14 -10
  5. package/build/lib/useQueries.js.map +1 -1
  6. package/build/lib/useQueries.mjs +14 -10
  7. package/build/lib/useQueries.mjs.map +1 -1
  8. package/build/umd/index.development.js +45 -20
  9. package/build/umd/index.development.js.map +1 -1
  10. package/build/umd/index.production.js +1 -1
  11. package/build/umd/index.production.js.map +1 -1
  12. package/package.json +2 -2
  13. package/build/lib/__mocks__/useBaseQuery.d.ts.map +0 -1
  14. package/build/lib/__mocks__/useQueryClient.d.ts.map +0 -1
  15. package/build/lib/__tests__/mutationCache.test.d.ts.map +0 -1
  16. package/build/lib/__tests__/queryCache.test.d.ts.map +0 -1
  17. package/build/lib/__tests__/queryClient.test.d.ts.map +0 -1
  18. package/build/lib/__tests__/test-utils.d.ts.map +0 -1
  19. package/build/lib/__tests__/useInfiniteQuery.test.d.ts.map +0 -1
  20. package/build/lib/__tests__/useInfiniteQuery.types.test.d.ts.map +0 -1
  21. package/build/lib/__tests__/useIsFetching.test.d.ts.map +0 -1
  22. package/build/lib/__tests__/useIsMutating.test.d.ts.map +0 -1
  23. package/build/lib/__tests__/useMutation.test.d.ts.map +0 -1
  24. package/build/lib/__tests__/useMutation.types.test.d.ts.map +0 -1
  25. package/build/lib/__tests__/useQueries.test.d.ts.map +0 -1
  26. package/build/lib/__tests__/useQuery.test.d.ts.map +0 -1
  27. package/build/lib/__tests__/useQuery.types.test.d.ts.map +0 -1
  28. package/build/lib/__tests__/useQueryClient.test.d.ts.map +0 -1
  29. package/build/lib/__tests__/utils.test.d.ts.map +0 -1
  30. package/build/lib/__tests__/vueQueryPlugin.test.d.ts.map +0 -1
  31. package/build/lib/devtools/devtools.d.ts.map +0 -1
  32. package/build/lib/devtools/utils.d.ts.map +0 -1
  33. package/build/lib/index.d.ts.map +0 -1
  34. package/build/lib/mutationCache.d.ts.map +0 -1
  35. package/build/lib/queryCache.d.ts.map +0 -1
  36. package/build/lib/queryClient.d.ts.map +0 -1
  37. package/build/lib/types.d.ts.map +0 -1
  38. package/build/lib/useBaseQuery.d.ts.map +0 -1
  39. package/build/lib/useInfiniteQuery.d.ts.map +0 -1
  40. package/build/lib/useIsFetching.d.ts.map +0 -1
  41. package/build/lib/useMutation.d.ts.map +0 -1
  42. package/build/lib/useMutationState.d.ts.map +0 -1
  43. package/build/lib/useQueries.d.ts.map +0 -1
  44. package/build/lib/useQuery.d.ts.map +0 -1
  45. package/build/lib/useQueryClient.d.ts.map +0 -1
  46. package/build/lib/utils.d.ts.map +0 -1
  47. package/build/lib/vueQueryPlugin.d.ts.map +0 -1
@@ -49,8 +49,9 @@ export declare type UseQueriesOptions<T extends any[], Result extends any[] = []
49
49
  */
50
50
  export declare type UseQueriesResults<T extends any[], Result extends any[] = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? QueryObserverResult[] : T extends [] ? [] : T extends [infer Head] ? [...Result, GetResults<Head>] : T extends [infer Head, ...infer Tail] ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]> : T extends UseQueryOptionsForUseQueries<infer TQueryFnData, infer TError, infer TData, any>[] ? QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[] : QueryObserverResult[];
51
51
  declare type UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>];
52
- export declare function useQueries<T extends any[]>({ queries, }: {
52
+ export declare function useQueries<T extends any[], TCombinedResult = UseQueriesResults<T>>({ queries, ...options }: {
53
53
  queries: MaybeRefDeep<UseQueriesOptionsArg<T>>;
54
- }, queryClient?: QueryClient): Readonly<Ref<UseQueriesResults<T>>>;
54
+ combine?: (result: UseQueriesResults<T>) => TCombinedResult;
55
+ }, queryClient?: QueryClient): Readonly<Ref<TCombinedResult>>;
55
56
  export {};
56
57
  //# sourceMappingURL=useQueries.d.ts.map
@@ -5,33 +5,37 @@ import { cloneDeepUnref } from './utils.esm.js';
5
5
 
6
6
  /* eslint-disable @typescript-eslint/no-explicit-any */
7
7
  function useQueries({
8
- queries
8
+ queries,
9
+ ...options
9
10
  }, queryClient) {
10
11
  const client = queryClient || useQueryClient();
11
- const defaultedQueries = computed(() => cloneDeepUnref(queries).map(options => {
12
- const defaulted = client.defaultQueryOptions(options);
12
+ const defaultedQueries = computed(() => cloneDeepUnref(queries).map(queryOptions => {
13
+ const defaulted = client.defaultQueryOptions(queryOptions);
13
14
  defaulted._optimisticResults = client.isRestoring.value ? 'isRestoring' : 'optimistic';
14
15
  return defaulted;
15
16
  }));
16
- const observer = new QueriesObserver(client, defaultedQueries.value);
17
- const state = ref(observer.getCurrentResult());
17
+ const observer = new QueriesObserver(client, defaultedQueries.value, options);
18
+ const [, getCombinedResult] = observer.getOptimisticResult(defaultedQueries.value);
19
+ const state = ref(getCombinedResult());
18
20
  const unsubscribe = ref(() => {
19
21
  // noop
20
22
  });
21
23
  watch(client.isRestoring, isRestoring => {
22
24
  if (!isRestoring) {
23
25
  unsubscribe.value();
24
- unsubscribe.value = observer.subscribe(result => {
25
- state.value.splice(0, result.length, ...result);
26
+ unsubscribe.value = observer.subscribe(() => {
27
+ const [, getCombinedResultRestoring] = observer.getOptimisticResult(defaultedQueries.value);
28
+ state.value = getCombinedResultRestoring();
26
29
  });
27
30
  // Subscription would not fire for persisted results
28
- state.value = observer.getOptimisticResult(defaultedQueries.value);
31
+ const [, getCombinedResultPersisted] = observer.getOptimisticResult(defaultedQueries.value);
32
+ state.value = getCombinedResultPersisted();
29
33
  }
30
34
  }, {
31
35
  immediate: true
32
36
  });
33
- watch(defaultedQueries, () => {
34
- observer.setQueries(defaultedQueries.value);
37
+ watch([defaultedQueries], () => {
38
+ observer.setQueries(defaultedQueries.value, options);
35
39
  state.value = observer.getCurrentResult();
36
40
  }, {
37
41
  deep: true
@@ -1 +1 @@
1
- {"version":3,"file":"useQueries.esm.js","sources":["../../src/useQueries.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueriesObserver } from '@tanstack/query-core'\nimport type {\n QueriesPlaceholderDataFunction,\n QueryKey,\n} from '@tanstack/query-core'\nimport type { Ref } from 'vue-demi'\nimport { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'\n\nimport type { QueryFunction, QueryObserverResult } from '@tanstack/query-core'\n\nimport { useQueryClient } from './useQueryClient'\nimport { cloneDeepUnref } from './utils'\nimport type { UseQueryOptions } from './useQuery'\nimport type { QueryClient } from './queryClient'\nimport type { DistributiveOmit, MaybeRefDeep } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = DistributiveOmit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? QueryObserverResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? QueryObserverResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? QueryObserverResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? QueryObserverResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? QueryObserverResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? QueryObserverResult<TQueryFnData>\n : // Fallback\n QueryObserverResult\n\n/**\n * UseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type UseQueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? UseQueryOptionsForUseQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n UseQueryOptionsForUseQueries[]\n\n/**\n * UseQueriesResults reducer recursively maps type param to results\n */\nexport type UseQueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? QueryObserverResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]\n : // Fallback\n QueryObserverResult[]\n\ntype UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]\n\nexport function useQueries<T extends any[]>(\n {\n queries,\n }: {\n queries: MaybeRefDeep<UseQueriesOptionsArg<T>>\n },\n queryClient?: QueryClient,\n): Readonly<Ref<UseQueriesResults<T>>> {\n const client = queryClient || useQueryClient()\n\n const defaultedQueries = computed(() =>\n cloneDeepUnref(queries).map((options) => {\n const defaulted = client.defaultQueryOptions(options)\n defaulted._optimisticResults = client.isRestoring.value\n ? 'isRestoring'\n : 'optimistic'\n\n return defaulted\n }),\n )\n\n const observer = new QueriesObserver(client, defaultedQueries.value)\n const state = ref(observer.getCurrentResult())\n\n const unsubscribe = ref(() => {\n // noop\n })\n\n watch(\n client.isRestoring,\n (isRestoring) => {\n if (!isRestoring) {\n unsubscribe.value()\n unsubscribe.value = observer.subscribe((result) => {\n state.value.splice(0, result.length, ...result)\n })\n // Subscription would not fire for persisted results\n state.value = observer.getOptimisticResult(defaultedQueries.value)\n }\n },\n { immediate: true },\n )\n\n watch(\n defaultedQueries,\n () => {\n observer.setQueries(defaultedQueries.value)\n state.value = observer.getCurrentResult()\n },\n { deep: true },\n )\n\n onScopeDispose(() => {\n unsubscribe.value()\n })\n\n return readonly(state) as Readonly<Ref<UseQueriesResults<T>>>\n}\n"],"names":["useQueries","queries","queryClient","client","useQueryClient","defaultedQueries","computed","cloneDeepUnref","map","options","defaulted","defaultQueryOptions","_optimisticResults","isRestoring","value","observer","QueriesObserver","state","ref","getCurrentResult","unsubscribe","watch","subscribe","result","splice","length","getOptimisticResult","immediate","setQueries","deep","onScopeDispose","readonly"],"mappings":";;;;;AAAA;AAmJO,SAASA,UAAU,CACxB;AACEC,EAAAA,OAAAA;AAGF,CAAC,EACDC,WAAyB,EACY;AACrC,EAAA,MAAMC,MAAM,GAAGD,WAAW,IAAIE,cAAc,EAAE,CAAA;AAE9C,EAAA,MAAMC,gBAAgB,GAAGC,QAAQ,CAAC,MAChCC,cAAc,CAACN,OAAO,CAAC,CAACO,GAAG,CAAEC,OAAO,IAAK;AACvC,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACQ,mBAAmB,CAACF,OAAO,CAAC,CAAA;IACrDC,SAAS,CAACE,kBAAkB,GAAGT,MAAM,CAACU,WAAW,CAACC,KAAK,GACnD,aAAa,GACb,YAAY,CAAA;AAEhB,IAAA,OAAOJ,SAAS,CAAA;AAClB,GAAC,CAAC,CACH,CAAA;EAED,MAAMK,QAAQ,GAAG,IAAIC,eAAe,CAACb,MAAM,EAAEE,gBAAgB,CAACS,KAAK,CAAC,CAAA;EACpE,MAAMG,KAAK,GAAGC,GAAG,CAACH,QAAQ,CAACI,gBAAgB,EAAE,CAAC,CAAA;AAE9C,EAAA,MAAMC,WAAW,GAAGF,GAAG,CAAC,MAAM;AAC5B;AAAA,GACD,CAAC,CAAA;AAEFG,EAAAA,KAAK,CACHlB,MAAM,CAACU,WAAW,EACjBA,WAAW,IAAK;IACf,IAAI,CAACA,WAAW,EAAE;MAChBO,WAAW,CAACN,KAAK,EAAE,CAAA;MACnBM,WAAW,CAACN,KAAK,GAAGC,QAAQ,CAACO,SAAS,CAAEC,MAAM,IAAK;AACjDN,QAAAA,KAAK,CAACH,KAAK,CAACU,MAAM,CAAC,CAAC,EAAED,MAAM,CAACE,MAAM,EAAE,GAAGF,MAAM,CAAC,CAAA;AACjD,OAAC,CAAC,CAAA;AACF;MACAN,KAAK,CAACH,KAAK,GAAGC,QAAQ,CAACW,mBAAmB,CAACrB,gBAAgB,CAACS,KAAK,CAAC,CAAA;AACpE,KAAA;AACF,GAAC,EACD;AAAEa,IAAAA,SAAS,EAAE,IAAA;AAAK,GAAC,CACpB,CAAA;EAEDN,KAAK,CACHhB,gBAAgB,EAChB,MAAM;AACJU,IAAAA,QAAQ,CAACa,UAAU,CAACvB,gBAAgB,CAACS,KAAK,CAAC,CAAA;AAC3CG,IAAAA,KAAK,CAACH,KAAK,GAAGC,QAAQ,CAACI,gBAAgB,EAAE,CAAA;AAC3C,GAAC,EACD;AAAEU,IAAAA,IAAI,EAAE,IAAA;AAAK,GAAC,CACf,CAAA;AAEDC,EAAAA,cAAc,CAAC,MAAM;IACnBV,WAAW,CAACN,KAAK,EAAE,CAAA;AACrB,GAAC,CAAC,CAAA;EAEF,OAAOiB,QAAQ,CAACd,KAAK,CAAC,CAAA;AACxB;;;;"}
1
+ {"version":3,"file":"useQueries.esm.js","sources":["../../src/useQueries.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueriesObserver } from '@tanstack/query-core'\nimport type {\n QueriesPlaceholderDataFunction,\n QueryKey,\n QueriesObserverOptions,\n} from '@tanstack/query-core'\nimport type { Ref } from 'vue-demi'\nimport { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'\n\nimport type { QueryFunction, QueryObserverResult } from '@tanstack/query-core'\n\nimport { useQueryClient } from './useQueryClient'\nimport { cloneDeepUnref } from './utils'\nimport type { UseQueryOptions } from './useQuery'\nimport type { QueryClient } from './queryClient'\nimport type { DistributiveOmit, MaybeRefDeep } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = DistributiveOmit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? QueryObserverResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? QueryObserverResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? QueryObserverResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? QueryObserverResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? QueryObserverResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? QueryObserverResult<TQueryFnData>\n : // Fallback\n QueryObserverResult\n\n/**\n * UseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type UseQueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? UseQueryOptionsForUseQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n UseQueryOptionsForUseQueries[]\n\n/**\n * UseQueriesResults reducer recursively maps type param to results\n */\nexport type UseQueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? QueryObserverResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]\n : // Fallback\n QueryObserverResult[]\n\ntype UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]\n\nexport function useQueries<\n T extends any[],\n TCombinedResult = UseQueriesResults<T>,\n>(\n {\n queries,\n ...options\n }: {\n queries: MaybeRefDeep<UseQueriesOptionsArg<T>>\n combine?: (result: UseQueriesResults<T>) => TCombinedResult\n },\n queryClient?: QueryClient,\n): Readonly<Ref<TCombinedResult>> {\n const client = queryClient || useQueryClient()\n\n const defaultedQueries = computed(() =>\n cloneDeepUnref(queries).map((queryOptions) => {\n const defaulted = client.defaultQueryOptions(queryOptions)\n defaulted._optimisticResults = client.isRestoring.value\n ? 'isRestoring'\n : 'optimistic'\n\n return defaulted\n }),\n )\n\n const observer = new QueriesObserver<TCombinedResult>(\n client,\n defaultedQueries.value,\n options as QueriesObserverOptions<TCombinedResult>,\n )\n const [, getCombinedResult] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n const state = ref(getCombinedResult()) as Ref<TCombinedResult>\n\n const unsubscribe = ref(() => {\n // noop\n })\n\n watch(\n client.isRestoring,\n (isRestoring) => {\n if (!isRestoring) {\n unsubscribe.value()\n unsubscribe.value = observer.subscribe(() => {\n const [, getCombinedResultRestoring] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n state.value = getCombinedResultRestoring()\n })\n // Subscription would not fire for persisted results\n const [, getCombinedResultPersisted] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n state.value = getCombinedResultPersisted()\n }\n },\n { immediate: true },\n )\n\n watch(\n [defaultedQueries],\n () => {\n observer.setQueries(\n defaultedQueries.value,\n options as QueriesObserverOptions<TCombinedResult>,\n )\n state.value = observer.getCurrentResult()\n },\n { deep: true },\n )\n\n onScopeDispose(() => {\n unsubscribe.value()\n })\n\n return readonly(state) as Readonly<Ref<TCombinedResult>>\n}\n"],"names":["useQueries","queries","options","queryClient","client","useQueryClient","defaultedQueries","computed","cloneDeepUnref","map","queryOptions","defaulted","defaultQueryOptions","_optimisticResults","isRestoring","value","observer","QueriesObserver","getCombinedResult","getOptimisticResult","state","ref","unsubscribe","watch","subscribe","getCombinedResultRestoring","getCombinedResultPersisted","immediate","setQueries","getCurrentResult","deep","onScopeDispose","readonly"],"mappings":";;;;;AAAA;AAoJO,SAASA,UAAU,CAIxB;EACEC,OAAO;EACP,GAAGC,OAAAA;AAIL,CAAC,EACDC,WAAyB,EACO;AAChC,EAAA,MAAMC,MAAM,GAAGD,WAAW,IAAIE,cAAc,EAAE,CAAA;AAE9C,EAAA,MAAMC,gBAAgB,GAAGC,QAAQ,CAAC,MAChCC,cAAc,CAACP,OAAO,CAAC,CAACQ,GAAG,CAAEC,YAAY,IAAK;AAC5C,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACQ,mBAAmB,CAACF,YAAY,CAAC,CAAA;IAC1DC,SAAS,CAACE,kBAAkB,GAAGT,MAAM,CAACU,WAAW,CAACC,KAAK,GACnD,aAAa,GACb,YAAY,CAAA;AAEhB,IAAA,OAAOJ,SAAS,CAAA;AAClB,GAAC,CAAC,CACH,CAAA;AAED,EAAA,MAAMK,QAAQ,GAAG,IAAIC,eAAe,CAClCb,MAAM,EACNE,gBAAgB,CAACS,KAAK,EACtBb,OAAO,CACR,CAAA;EACD,MAAM,GAAGgB,iBAAiB,CAAC,GAAGF,QAAQ,CAACG,mBAAmB,CACxDb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACD,EAAA,MAAMK,KAAK,GAAGC,GAAG,CAACH,iBAAiB,EAAE,CAAyB,CAAA;AAE9D,EAAA,MAAMI,WAAW,GAAGD,GAAG,CAAC,MAAM;AAC5B;AAAA,GACD,CAAC,CAAA;AAEFE,EAAAA,KAAK,CACHnB,MAAM,CAACU,WAAW,EACjBA,WAAW,IAAK;IACf,IAAI,CAACA,WAAW,EAAE;MAChBQ,WAAW,CAACP,KAAK,EAAE,CAAA;AACnBO,MAAAA,WAAW,CAACP,KAAK,GAAGC,QAAQ,CAACQ,SAAS,CAAC,MAAM;QAC3C,MAAM,GAAGC,0BAA0B,CAAC,GAAGT,QAAQ,CAACG,mBAAmB,CACjEb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACDK,QAAAA,KAAK,CAACL,KAAK,GAAGU,0BAA0B,EAAE,CAAA;AAC5C,OAAC,CAAC,CAAA;AACF;MACA,MAAM,GAAGC,0BAA0B,CAAC,GAAGV,QAAQ,CAACG,mBAAmB,CACjEb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACDK,MAAAA,KAAK,CAACL,KAAK,GAAGW,0BAA0B,EAAE,CAAA;AAC5C,KAAA;AACF,GAAC,EACD;AAAEC,IAAAA,SAAS,EAAE,IAAA;AAAK,GAAC,CACpB,CAAA;AAEDJ,EAAAA,KAAK,CACH,CAACjB,gBAAgB,CAAC,EAClB,MAAM;IACJU,QAAQ,CAACY,UAAU,CACjBtB,gBAAgB,CAACS,KAAK,EACtBb,OAAO,CACR,CAAA;AACDkB,IAAAA,KAAK,CAACL,KAAK,GAAGC,QAAQ,CAACa,gBAAgB,EAAE,CAAA;AAC3C,GAAC,EACD;AAAEC,IAAAA,IAAI,EAAE,IAAA;AAAK,GAAC,CACf,CAAA;AAEDC,EAAAA,cAAc,CAAC,MAAM;IACnBT,WAAW,CAACP,KAAK,EAAE,CAAA;AACrB,GAAC,CAAC,CAAA;EAEF,OAAOiB,QAAQ,CAACZ,KAAK,CAAC,CAAA;AACxB;;;;"}
@@ -7,33 +7,37 @@ var utils = require('./utils.js');
7
7
 
8
8
  /* eslint-disable @typescript-eslint/no-explicit-any */
9
9
  function useQueries({
10
- queries
10
+ queries,
11
+ ...options
11
12
  }, queryClient) {
12
13
  const client = queryClient || useQueryClient.useQueryClient();
13
- const defaultedQueries = vueDemi.computed(() => utils.cloneDeepUnref(queries).map(options => {
14
- const defaulted = client.defaultQueryOptions(options);
14
+ const defaultedQueries = vueDemi.computed(() => utils.cloneDeepUnref(queries).map(queryOptions => {
15
+ const defaulted = client.defaultQueryOptions(queryOptions);
15
16
  defaulted._optimisticResults = client.isRestoring.value ? 'isRestoring' : 'optimistic';
16
17
  return defaulted;
17
18
  }));
18
- const observer = new queryCore.QueriesObserver(client, defaultedQueries.value);
19
- const state = vueDemi.ref(observer.getCurrentResult());
19
+ const observer = new queryCore.QueriesObserver(client, defaultedQueries.value, options);
20
+ const [, getCombinedResult] = observer.getOptimisticResult(defaultedQueries.value);
21
+ const state = vueDemi.ref(getCombinedResult());
20
22
  const unsubscribe = vueDemi.ref(() => {
21
23
  // noop
22
24
  });
23
25
  vueDemi.watch(client.isRestoring, isRestoring => {
24
26
  if (!isRestoring) {
25
27
  unsubscribe.value();
26
- unsubscribe.value = observer.subscribe(result => {
27
- state.value.splice(0, result.length, ...result);
28
+ unsubscribe.value = observer.subscribe(() => {
29
+ const [, getCombinedResultRestoring] = observer.getOptimisticResult(defaultedQueries.value);
30
+ state.value = getCombinedResultRestoring();
28
31
  });
29
32
  // Subscription would not fire for persisted results
30
- state.value = observer.getOptimisticResult(defaultedQueries.value);
33
+ const [, getCombinedResultPersisted] = observer.getOptimisticResult(defaultedQueries.value);
34
+ state.value = getCombinedResultPersisted();
31
35
  }
32
36
  }, {
33
37
  immediate: true
34
38
  });
35
- vueDemi.watch(defaultedQueries, () => {
36
- observer.setQueries(defaultedQueries.value);
39
+ vueDemi.watch([defaultedQueries], () => {
40
+ observer.setQueries(defaultedQueries.value, options);
37
41
  state.value = observer.getCurrentResult();
38
42
  }, {
39
43
  deep: true
@@ -1 +1 @@
1
- {"version":3,"file":"useQueries.js","sources":["../../src/useQueries.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueriesObserver } from '@tanstack/query-core'\nimport type {\n QueriesPlaceholderDataFunction,\n QueryKey,\n} from '@tanstack/query-core'\nimport type { Ref } from 'vue-demi'\nimport { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'\n\nimport type { QueryFunction, QueryObserverResult } from '@tanstack/query-core'\n\nimport { useQueryClient } from './useQueryClient'\nimport { cloneDeepUnref } from './utils'\nimport type { UseQueryOptions } from './useQuery'\nimport type { QueryClient } from './queryClient'\nimport type { DistributiveOmit, MaybeRefDeep } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = DistributiveOmit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? QueryObserverResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? QueryObserverResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? QueryObserverResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? QueryObserverResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? QueryObserverResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? QueryObserverResult<TQueryFnData>\n : // Fallback\n QueryObserverResult\n\n/**\n * UseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type UseQueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? UseQueryOptionsForUseQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n UseQueryOptionsForUseQueries[]\n\n/**\n * UseQueriesResults reducer recursively maps type param to results\n */\nexport type UseQueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? QueryObserverResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]\n : // Fallback\n QueryObserverResult[]\n\ntype UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]\n\nexport function useQueries<T extends any[]>(\n {\n queries,\n }: {\n queries: MaybeRefDeep<UseQueriesOptionsArg<T>>\n },\n queryClient?: QueryClient,\n): Readonly<Ref<UseQueriesResults<T>>> {\n const client = queryClient || useQueryClient()\n\n const defaultedQueries = computed(() =>\n cloneDeepUnref(queries).map((options) => {\n const defaulted = client.defaultQueryOptions(options)\n defaulted._optimisticResults = client.isRestoring.value\n ? 'isRestoring'\n : 'optimistic'\n\n return defaulted\n }),\n )\n\n const observer = new QueriesObserver(client, defaultedQueries.value)\n const state = ref(observer.getCurrentResult())\n\n const unsubscribe = ref(() => {\n // noop\n })\n\n watch(\n client.isRestoring,\n (isRestoring) => {\n if (!isRestoring) {\n unsubscribe.value()\n unsubscribe.value = observer.subscribe((result) => {\n state.value.splice(0, result.length, ...result)\n })\n // Subscription would not fire for persisted results\n state.value = observer.getOptimisticResult(defaultedQueries.value)\n }\n },\n { immediate: true },\n )\n\n watch(\n defaultedQueries,\n () => {\n observer.setQueries(defaultedQueries.value)\n state.value = observer.getCurrentResult()\n },\n { deep: true },\n )\n\n onScopeDispose(() => {\n unsubscribe.value()\n })\n\n return readonly(state) as Readonly<Ref<UseQueriesResults<T>>>\n}\n"],"names":["useQueries","queries","queryClient","client","useQueryClient","defaultedQueries","computed","cloneDeepUnref","map","options","defaulted","defaultQueryOptions","_optimisticResults","isRestoring","value","observer","QueriesObserver","state","ref","getCurrentResult","unsubscribe","watch","subscribe","result","splice","length","getOptimisticResult","immediate","setQueries","deep","onScopeDispose","readonly"],"mappings":";;;;;;;AAAA;AAmJO,SAASA,UAAU,CACxB;AACEC,EAAAA,OAAAA;AAGF,CAAC,EACDC,WAAyB,EACY;AACrC,EAAA,MAAMC,MAAM,GAAGD,WAAW,IAAIE,6BAAc,EAAE,CAAA;AAE9C,EAAA,MAAMC,gBAAgB,GAAGC,gBAAQ,CAAC,MAChCC,oBAAc,CAACN,OAAO,CAAC,CAACO,GAAG,CAAEC,OAAO,IAAK;AACvC,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACQ,mBAAmB,CAACF,OAAO,CAAC,CAAA;IACrDC,SAAS,CAACE,kBAAkB,GAAGT,MAAM,CAACU,WAAW,CAACC,KAAK,GACnD,aAAa,GACb,YAAY,CAAA;AAEhB,IAAA,OAAOJ,SAAS,CAAA;AAClB,GAAC,CAAC,CACH,CAAA;EAED,MAAMK,QAAQ,GAAG,IAAIC,yBAAe,CAACb,MAAM,EAAEE,gBAAgB,CAACS,KAAK,CAAC,CAAA;EACpE,MAAMG,KAAK,GAAGC,WAAG,CAACH,QAAQ,CAACI,gBAAgB,EAAE,CAAC,CAAA;AAE9C,EAAA,MAAMC,WAAW,GAAGF,WAAG,CAAC,MAAM;AAC5B;AAAA,GACD,CAAC,CAAA;AAEFG,EAAAA,aAAK,CACHlB,MAAM,CAACU,WAAW,EACjBA,WAAW,IAAK;IACf,IAAI,CAACA,WAAW,EAAE;MAChBO,WAAW,CAACN,KAAK,EAAE,CAAA;MACnBM,WAAW,CAACN,KAAK,GAAGC,QAAQ,CAACO,SAAS,CAAEC,MAAM,IAAK;AACjDN,QAAAA,KAAK,CAACH,KAAK,CAACU,MAAM,CAAC,CAAC,EAAED,MAAM,CAACE,MAAM,EAAE,GAAGF,MAAM,CAAC,CAAA;AACjD,OAAC,CAAC,CAAA;AACF;MACAN,KAAK,CAACH,KAAK,GAAGC,QAAQ,CAACW,mBAAmB,CAACrB,gBAAgB,CAACS,KAAK,CAAC,CAAA;AACpE,KAAA;AACF,GAAC,EACD;AAAEa,IAAAA,SAAS,EAAE,IAAA;AAAK,GAAC,CACpB,CAAA;EAEDN,aAAK,CACHhB,gBAAgB,EAChB,MAAM;AACJU,IAAAA,QAAQ,CAACa,UAAU,CAACvB,gBAAgB,CAACS,KAAK,CAAC,CAAA;AAC3CG,IAAAA,KAAK,CAACH,KAAK,GAAGC,QAAQ,CAACI,gBAAgB,EAAE,CAAA;AAC3C,GAAC,EACD;AAAEU,IAAAA,IAAI,EAAE,IAAA;AAAK,GAAC,CACf,CAAA;AAEDC,EAAAA,sBAAc,CAAC,MAAM;IACnBV,WAAW,CAACN,KAAK,EAAE,CAAA;AACrB,GAAC,CAAC,CAAA;EAEF,OAAOiB,gBAAQ,CAACd,KAAK,CAAC,CAAA;AACxB;;;;"}
1
+ {"version":3,"file":"useQueries.js","sources":["../../src/useQueries.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueriesObserver } from '@tanstack/query-core'\nimport type {\n QueriesPlaceholderDataFunction,\n QueryKey,\n QueriesObserverOptions,\n} from '@tanstack/query-core'\nimport type { Ref } from 'vue-demi'\nimport { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'\n\nimport type { QueryFunction, QueryObserverResult } from '@tanstack/query-core'\n\nimport { useQueryClient } from './useQueryClient'\nimport { cloneDeepUnref } from './utils'\nimport type { UseQueryOptions } from './useQuery'\nimport type { QueryClient } from './queryClient'\nimport type { DistributiveOmit, MaybeRefDeep } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = DistributiveOmit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? QueryObserverResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? QueryObserverResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? QueryObserverResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? QueryObserverResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? QueryObserverResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? QueryObserverResult<TQueryFnData>\n : // Fallback\n QueryObserverResult\n\n/**\n * UseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type UseQueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? UseQueryOptionsForUseQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n UseQueryOptionsForUseQueries[]\n\n/**\n * UseQueriesResults reducer recursively maps type param to results\n */\nexport type UseQueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? QueryObserverResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]\n : // Fallback\n QueryObserverResult[]\n\ntype UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]\n\nexport function useQueries<\n T extends any[],\n TCombinedResult = UseQueriesResults<T>,\n>(\n {\n queries,\n ...options\n }: {\n queries: MaybeRefDeep<UseQueriesOptionsArg<T>>\n combine?: (result: UseQueriesResults<T>) => TCombinedResult\n },\n queryClient?: QueryClient,\n): Readonly<Ref<TCombinedResult>> {\n const client = queryClient || useQueryClient()\n\n const defaultedQueries = computed(() =>\n cloneDeepUnref(queries).map((queryOptions) => {\n const defaulted = client.defaultQueryOptions(queryOptions)\n defaulted._optimisticResults = client.isRestoring.value\n ? 'isRestoring'\n : 'optimistic'\n\n return defaulted\n }),\n )\n\n const observer = new QueriesObserver<TCombinedResult>(\n client,\n defaultedQueries.value,\n options as QueriesObserverOptions<TCombinedResult>,\n )\n const [, getCombinedResult] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n const state = ref(getCombinedResult()) as Ref<TCombinedResult>\n\n const unsubscribe = ref(() => {\n // noop\n })\n\n watch(\n client.isRestoring,\n (isRestoring) => {\n if (!isRestoring) {\n unsubscribe.value()\n unsubscribe.value = observer.subscribe(() => {\n const [, getCombinedResultRestoring] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n state.value = getCombinedResultRestoring()\n })\n // Subscription would not fire for persisted results\n const [, getCombinedResultPersisted] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n state.value = getCombinedResultPersisted()\n }\n },\n { immediate: true },\n )\n\n watch(\n [defaultedQueries],\n () => {\n observer.setQueries(\n defaultedQueries.value,\n options as QueriesObserverOptions<TCombinedResult>,\n )\n state.value = observer.getCurrentResult()\n },\n { deep: true },\n )\n\n onScopeDispose(() => {\n unsubscribe.value()\n })\n\n return readonly(state) as Readonly<Ref<TCombinedResult>>\n}\n"],"names":["useQueries","queries","options","queryClient","client","useQueryClient","defaultedQueries","computed","cloneDeepUnref","map","queryOptions","defaulted","defaultQueryOptions","_optimisticResults","isRestoring","value","observer","QueriesObserver","getCombinedResult","getOptimisticResult","state","ref","unsubscribe","watch","subscribe","getCombinedResultRestoring","getCombinedResultPersisted","immediate","setQueries","getCurrentResult","deep","onScopeDispose","readonly"],"mappings":";;;;;;;AAAA;AAoJO,SAASA,UAAU,CAIxB;EACEC,OAAO;EACP,GAAGC,OAAAA;AAIL,CAAC,EACDC,WAAyB,EACO;AAChC,EAAA,MAAMC,MAAM,GAAGD,WAAW,IAAIE,6BAAc,EAAE,CAAA;AAE9C,EAAA,MAAMC,gBAAgB,GAAGC,gBAAQ,CAAC,MAChCC,oBAAc,CAACP,OAAO,CAAC,CAACQ,GAAG,CAAEC,YAAY,IAAK;AAC5C,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACQ,mBAAmB,CAACF,YAAY,CAAC,CAAA;IAC1DC,SAAS,CAACE,kBAAkB,GAAGT,MAAM,CAACU,WAAW,CAACC,KAAK,GACnD,aAAa,GACb,YAAY,CAAA;AAEhB,IAAA,OAAOJ,SAAS,CAAA;AAClB,GAAC,CAAC,CACH,CAAA;AAED,EAAA,MAAMK,QAAQ,GAAG,IAAIC,yBAAe,CAClCb,MAAM,EACNE,gBAAgB,CAACS,KAAK,EACtBb,OAAO,CACR,CAAA;EACD,MAAM,GAAGgB,iBAAiB,CAAC,GAAGF,QAAQ,CAACG,mBAAmB,CACxDb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACD,EAAA,MAAMK,KAAK,GAAGC,WAAG,CAACH,iBAAiB,EAAE,CAAyB,CAAA;AAE9D,EAAA,MAAMI,WAAW,GAAGD,WAAG,CAAC,MAAM;AAC5B;AAAA,GACD,CAAC,CAAA;AAEFE,EAAAA,aAAK,CACHnB,MAAM,CAACU,WAAW,EACjBA,WAAW,IAAK;IACf,IAAI,CAACA,WAAW,EAAE;MAChBQ,WAAW,CAACP,KAAK,EAAE,CAAA;AACnBO,MAAAA,WAAW,CAACP,KAAK,GAAGC,QAAQ,CAACQ,SAAS,CAAC,MAAM;QAC3C,MAAM,GAAGC,0BAA0B,CAAC,GAAGT,QAAQ,CAACG,mBAAmB,CACjEb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACDK,QAAAA,KAAK,CAACL,KAAK,GAAGU,0BAA0B,EAAE,CAAA;AAC5C,OAAC,CAAC,CAAA;AACF;MACA,MAAM,GAAGC,0BAA0B,CAAC,GAAGV,QAAQ,CAACG,mBAAmB,CACjEb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACDK,MAAAA,KAAK,CAACL,KAAK,GAAGW,0BAA0B,EAAE,CAAA;AAC5C,KAAA;AACF,GAAC,EACD;AAAEC,IAAAA,SAAS,EAAE,IAAA;AAAK,GAAC,CACpB,CAAA;AAEDJ,EAAAA,aAAK,CACH,CAACjB,gBAAgB,CAAC,EAClB,MAAM;IACJU,QAAQ,CAACY,UAAU,CACjBtB,gBAAgB,CAACS,KAAK,EACtBb,OAAO,CACR,CAAA;AACDkB,IAAAA,KAAK,CAACL,KAAK,GAAGC,QAAQ,CAACa,gBAAgB,EAAE,CAAA;AAC3C,GAAC,EACD;AAAEC,IAAAA,IAAI,EAAE,IAAA;AAAK,GAAC,CACf,CAAA;AAEDC,EAAAA,sBAAc,CAAC,MAAM;IACnBT,WAAW,CAACP,KAAK,EAAE,CAAA;AACrB,GAAC,CAAC,CAAA;EAEF,OAAOiB,gBAAQ,CAACZ,KAAK,CAAC,CAAA;AACxB;;;;"}
@@ -5,33 +5,37 @@ import { cloneDeepUnref } from './utils.mjs';
5
5
 
6
6
  /* eslint-disable @typescript-eslint/no-explicit-any */
7
7
  function useQueries({
8
- queries
8
+ queries,
9
+ ...options
9
10
  }, queryClient) {
10
11
  const client = queryClient || useQueryClient();
11
- const defaultedQueries = computed(() => cloneDeepUnref(queries).map(options => {
12
- const defaulted = client.defaultQueryOptions(options);
12
+ const defaultedQueries = computed(() => cloneDeepUnref(queries).map(queryOptions => {
13
+ const defaulted = client.defaultQueryOptions(queryOptions);
13
14
  defaulted._optimisticResults = client.isRestoring.value ? 'isRestoring' : 'optimistic';
14
15
  return defaulted;
15
16
  }));
16
- const observer = new QueriesObserver(client, defaultedQueries.value);
17
- const state = ref(observer.getCurrentResult());
17
+ const observer = new QueriesObserver(client, defaultedQueries.value, options);
18
+ const [, getCombinedResult] = observer.getOptimisticResult(defaultedQueries.value);
19
+ const state = ref(getCombinedResult());
18
20
  const unsubscribe = ref(() => {
19
21
  // noop
20
22
  });
21
23
  watch(client.isRestoring, isRestoring => {
22
24
  if (!isRestoring) {
23
25
  unsubscribe.value();
24
- unsubscribe.value = observer.subscribe(result => {
25
- state.value.splice(0, result.length, ...result);
26
+ unsubscribe.value = observer.subscribe(() => {
27
+ const [, getCombinedResultRestoring] = observer.getOptimisticResult(defaultedQueries.value);
28
+ state.value = getCombinedResultRestoring();
26
29
  });
27
30
  // Subscription would not fire for persisted results
28
- state.value = observer.getOptimisticResult(defaultedQueries.value);
31
+ const [, getCombinedResultPersisted] = observer.getOptimisticResult(defaultedQueries.value);
32
+ state.value = getCombinedResultPersisted();
29
33
  }
30
34
  }, {
31
35
  immediate: true
32
36
  });
33
- watch(defaultedQueries, () => {
34
- observer.setQueries(defaultedQueries.value);
37
+ watch([defaultedQueries], () => {
38
+ observer.setQueries(defaultedQueries.value, options);
35
39
  state.value = observer.getCurrentResult();
36
40
  }, {
37
41
  deep: true
@@ -1 +1 @@
1
- {"version":3,"file":"useQueries.mjs","sources":["../../src/useQueries.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueriesObserver } from '@tanstack/query-core'\nimport type {\n QueriesPlaceholderDataFunction,\n QueryKey,\n} from '@tanstack/query-core'\nimport type { Ref } from 'vue-demi'\nimport { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'\n\nimport type { QueryFunction, QueryObserverResult } from '@tanstack/query-core'\n\nimport { useQueryClient } from './useQueryClient'\nimport { cloneDeepUnref } from './utils'\nimport type { UseQueryOptions } from './useQuery'\nimport type { QueryClient } from './queryClient'\nimport type { DistributiveOmit, MaybeRefDeep } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = DistributiveOmit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? QueryObserverResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? QueryObserverResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? QueryObserverResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? QueryObserverResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? QueryObserverResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? QueryObserverResult<TQueryFnData>\n : // Fallback\n QueryObserverResult\n\n/**\n * UseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type UseQueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? UseQueryOptionsForUseQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n UseQueryOptionsForUseQueries[]\n\n/**\n * UseQueriesResults reducer recursively maps type param to results\n */\nexport type UseQueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? QueryObserverResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]\n : // Fallback\n QueryObserverResult[]\n\ntype UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]\n\nexport function useQueries<T extends any[]>(\n {\n queries,\n }: {\n queries: MaybeRefDeep<UseQueriesOptionsArg<T>>\n },\n queryClient?: QueryClient,\n): Readonly<Ref<UseQueriesResults<T>>> {\n const client = queryClient || useQueryClient()\n\n const defaultedQueries = computed(() =>\n cloneDeepUnref(queries).map((options) => {\n const defaulted = client.defaultQueryOptions(options)\n defaulted._optimisticResults = client.isRestoring.value\n ? 'isRestoring'\n : 'optimistic'\n\n return defaulted\n }),\n )\n\n const observer = new QueriesObserver(client, defaultedQueries.value)\n const state = ref(observer.getCurrentResult())\n\n const unsubscribe = ref(() => {\n // noop\n })\n\n watch(\n client.isRestoring,\n (isRestoring) => {\n if (!isRestoring) {\n unsubscribe.value()\n unsubscribe.value = observer.subscribe((result) => {\n state.value.splice(0, result.length, ...result)\n })\n // Subscription would not fire for persisted results\n state.value = observer.getOptimisticResult(defaultedQueries.value)\n }\n },\n { immediate: true },\n )\n\n watch(\n defaultedQueries,\n () => {\n observer.setQueries(defaultedQueries.value)\n state.value = observer.getCurrentResult()\n },\n { deep: true },\n )\n\n onScopeDispose(() => {\n unsubscribe.value()\n })\n\n return readonly(state) as Readonly<Ref<UseQueriesResults<T>>>\n}\n"],"names":["useQueries","queries","queryClient","client","useQueryClient","defaultedQueries","computed","cloneDeepUnref","map","options","defaulted","defaultQueryOptions","_optimisticResults","isRestoring","value","observer","QueriesObserver","state","ref","getCurrentResult","unsubscribe","watch","subscribe","result","splice","length","getOptimisticResult","immediate","setQueries","deep","onScopeDispose","readonly"],"mappings":";;;;;AAAA;AAmJO,SAASA,UAAU,CACxB;AACEC,EAAAA,OAAAA;AAGF,CAAC,EACDC,WAAyB,EACY;AACrC,EAAA,MAAMC,MAAM,GAAGD,WAAW,IAAIE,cAAc,EAAE,CAAA;AAE9C,EAAA,MAAMC,gBAAgB,GAAGC,QAAQ,CAAC,MAChCC,cAAc,CAACN,OAAO,CAAC,CAACO,GAAG,CAAEC,OAAO,IAAK;AACvC,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACQ,mBAAmB,CAACF,OAAO,CAAC,CAAA;IACrDC,SAAS,CAACE,kBAAkB,GAAGT,MAAM,CAACU,WAAW,CAACC,KAAK,GACnD,aAAa,GACb,YAAY,CAAA;AAEhB,IAAA,OAAOJ,SAAS,CAAA;AAClB,GAAC,CAAC,CACH,CAAA;EAED,MAAMK,QAAQ,GAAG,IAAIC,eAAe,CAACb,MAAM,EAAEE,gBAAgB,CAACS,KAAK,CAAC,CAAA;EACpE,MAAMG,KAAK,GAAGC,GAAG,CAACH,QAAQ,CAACI,gBAAgB,EAAE,CAAC,CAAA;AAE9C,EAAA,MAAMC,WAAW,GAAGF,GAAG,CAAC,MAAM;AAC5B;AAAA,GACD,CAAC,CAAA;AAEFG,EAAAA,KAAK,CACHlB,MAAM,CAACU,WAAW,EACjBA,WAAW,IAAK;IACf,IAAI,CAACA,WAAW,EAAE;MAChBO,WAAW,CAACN,KAAK,EAAE,CAAA;MACnBM,WAAW,CAACN,KAAK,GAAGC,QAAQ,CAACO,SAAS,CAAEC,MAAM,IAAK;AACjDN,QAAAA,KAAK,CAACH,KAAK,CAACU,MAAM,CAAC,CAAC,EAAED,MAAM,CAACE,MAAM,EAAE,GAAGF,MAAM,CAAC,CAAA;AACjD,OAAC,CAAC,CAAA;AACF;MACAN,KAAK,CAACH,KAAK,GAAGC,QAAQ,CAACW,mBAAmB,CAACrB,gBAAgB,CAACS,KAAK,CAAC,CAAA;AACpE,KAAA;AACF,GAAC,EACD;AAAEa,IAAAA,SAAS,EAAE,IAAA;AAAK,GAAC,CACpB,CAAA;EAEDN,KAAK,CACHhB,gBAAgB,EAChB,MAAM;AACJU,IAAAA,QAAQ,CAACa,UAAU,CAACvB,gBAAgB,CAACS,KAAK,CAAC,CAAA;AAC3CG,IAAAA,KAAK,CAACH,KAAK,GAAGC,QAAQ,CAACI,gBAAgB,EAAE,CAAA;AAC3C,GAAC,EACD;AAAEU,IAAAA,IAAI,EAAE,IAAA;AAAK,GAAC,CACf,CAAA;AAEDC,EAAAA,cAAc,CAAC,MAAM;IACnBV,WAAW,CAACN,KAAK,EAAE,CAAA;AACrB,GAAC,CAAC,CAAA;EAEF,OAAOiB,QAAQ,CAACd,KAAK,CAAC,CAAA;AACxB;;;;"}
1
+ {"version":3,"file":"useQueries.mjs","sources":["../../src/useQueries.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { QueriesObserver } from '@tanstack/query-core'\nimport type {\n QueriesPlaceholderDataFunction,\n QueryKey,\n QueriesObserverOptions,\n} from '@tanstack/query-core'\nimport type { Ref } from 'vue-demi'\nimport { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'\n\nimport type { QueryFunction, QueryObserverResult } from '@tanstack/query-core'\n\nimport { useQueryClient } from './useQueryClient'\nimport { cloneDeepUnref } from './utils'\nimport type { UseQueryOptions } from './useQuery'\nimport type { QueryClient } from './queryClient'\nimport type { DistributiveOmit, MaybeRefDeep } from './types'\n\n// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.\n// `placeholderData` function does not have a parameter\ntype UseQueryOptionsForUseQueries<\n TQueryFnData = unknown,\n TError = unknown,\n TData = TQueryFnData,\n TQueryKey extends QueryKey = QueryKey,\n> = DistributiveOmit<\n UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n 'placeholderData'\n> & {\n placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>\n}\n\n// Avoid TS depth-limit error in case of large array literal\ntype MAXIMUM_DEPTH = 20\n\ntype GetOptions<T> =\n // Part 1: responsible for applying explicit type parameter to function arguments, if object { queryFnData: TQueryFnData, error: TError, data: TData }\n T extends {\n queryFnData: infer TQueryFnData\n error?: infer TError\n data: infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? UseQueryOptionsForUseQueries<unknown, TError, TData>\n : // Part 2: responsible for applying explicit type parameter to function arguments, if tuple [TQueryFnData, TError, TData]\n T extends [infer TQueryFnData, infer TError, infer TData]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData>\n : T extends [infer TQueryFnData, infer TError]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? UseQueryOptionsForUseQueries<TQueryFnData>\n : // Part 3: responsible for inferring and enforcing type if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey>\n select: (data: any) => infer TData\n }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TData, TQueryKey>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, infer TQueryKey> }\n ? UseQueryOptionsForUseQueries<TQueryFnData, Error, TQueryFnData, TQueryKey>\n : // Fallback\n UseQueryOptionsForUseQueries\n\ntype GetResults<T> =\n // Part 1: responsible for mapping explicit type parameter to function result, if object\n T extends { queryFnData: any; error?: infer TError; data: infer TData }\n ? QueryObserverResult<TData, TError>\n : T extends { queryFnData: infer TQueryFnData; error?: infer TError }\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends { data: infer TData; error?: infer TError }\n ? QueryObserverResult<TData, TError>\n : // Part 2: responsible for mapping explicit type parameter to function result, if tuple\n T extends [any, infer TError, infer TData]\n ? QueryObserverResult<TData, TError>\n : T extends [infer TQueryFnData, infer TError]\n ? QueryObserverResult<TQueryFnData, TError>\n : T extends [infer TQueryFnData]\n ? QueryObserverResult<TQueryFnData>\n : // Part 3: responsible for mapping inferred type to results, if no explicit parameter was provided\n T extends {\n queryFn?: QueryFunction<unknown, any>\n select: (data: any) => infer TData\n }\n ? QueryObserverResult<TData>\n : T extends { queryFn?: QueryFunction<infer TQueryFnData, any> }\n ? QueryObserverResult<TQueryFnData>\n : // Fallback\n QueryObserverResult\n\n/**\n * UseQueriesOptions reducer recursively unwraps function arguments to infer/enforce type param\n */\nexport type UseQueriesOptions<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? UseQueryOptionsForUseQueries[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetOptions<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesOptions<[...Tail], [...Result, GetOptions<Head>], [...Depth, 1]>\n : unknown[] extends T\n ? T\n : // If T is *some* array but we couldn't assign unknown[] to it, then it must hold some known/homogenous type!\n // use this to infer the param types in the case of Array.map() argument\n T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n infer TQueryKey\n >[]\n ? UseQueryOptionsForUseQueries<TQueryFnData, TError, TData, TQueryKey>[]\n : // Fallback\n UseQueryOptionsForUseQueries[]\n\n/**\n * UseQueriesResults reducer recursively maps type param to results\n */\nexport type UseQueriesResults<\n T extends any[],\n Result extends any[] = [],\n Depth extends ReadonlyArray<number> = [],\n> = Depth['length'] extends MAXIMUM_DEPTH\n ? QueryObserverResult[]\n : T extends []\n ? []\n : T extends [infer Head]\n ? [...Result, GetResults<Head>]\n : T extends [infer Head, ...infer Tail]\n ? UseQueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]>\n : T extends UseQueryOptionsForUseQueries<\n infer TQueryFnData,\n infer TError,\n infer TData,\n any\n >[]\n ? // Dynamic-size (homogenous) UseQueryOptions array: map directly to array of results\n QueryObserverResult<unknown extends TData ? TQueryFnData : TData, TError>[]\n : // Fallback\n QueryObserverResult[]\n\ntype UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]\n\nexport function useQueries<\n T extends any[],\n TCombinedResult = UseQueriesResults<T>,\n>(\n {\n queries,\n ...options\n }: {\n queries: MaybeRefDeep<UseQueriesOptionsArg<T>>\n combine?: (result: UseQueriesResults<T>) => TCombinedResult\n },\n queryClient?: QueryClient,\n): Readonly<Ref<TCombinedResult>> {\n const client = queryClient || useQueryClient()\n\n const defaultedQueries = computed(() =>\n cloneDeepUnref(queries).map((queryOptions) => {\n const defaulted = client.defaultQueryOptions(queryOptions)\n defaulted._optimisticResults = client.isRestoring.value\n ? 'isRestoring'\n : 'optimistic'\n\n return defaulted\n }),\n )\n\n const observer = new QueriesObserver<TCombinedResult>(\n client,\n defaultedQueries.value,\n options as QueriesObserverOptions<TCombinedResult>,\n )\n const [, getCombinedResult] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n const state = ref(getCombinedResult()) as Ref<TCombinedResult>\n\n const unsubscribe = ref(() => {\n // noop\n })\n\n watch(\n client.isRestoring,\n (isRestoring) => {\n if (!isRestoring) {\n unsubscribe.value()\n unsubscribe.value = observer.subscribe(() => {\n const [, getCombinedResultRestoring] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n state.value = getCombinedResultRestoring()\n })\n // Subscription would not fire for persisted results\n const [, getCombinedResultPersisted] = observer.getOptimisticResult(\n defaultedQueries.value,\n )\n state.value = getCombinedResultPersisted()\n }\n },\n { immediate: true },\n )\n\n watch(\n [defaultedQueries],\n () => {\n observer.setQueries(\n defaultedQueries.value,\n options as QueriesObserverOptions<TCombinedResult>,\n )\n state.value = observer.getCurrentResult()\n },\n { deep: true },\n )\n\n onScopeDispose(() => {\n unsubscribe.value()\n })\n\n return readonly(state) as Readonly<Ref<TCombinedResult>>\n}\n"],"names":["useQueries","queries","options","queryClient","client","useQueryClient","defaultedQueries","computed","cloneDeepUnref","map","queryOptions","defaulted","defaultQueryOptions","_optimisticResults","isRestoring","value","observer","QueriesObserver","getCombinedResult","getOptimisticResult","state","ref","unsubscribe","watch","subscribe","getCombinedResultRestoring","getCombinedResultPersisted","immediate","setQueries","getCurrentResult","deep","onScopeDispose","readonly"],"mappings":";;;;;AAAA;AAoJO,SAASA,UAAU,CAIxB;EACEC,OAAO;EACP,GAAGC,OAAAA;AAIL,CAAC,EACDC,WAAyB,EACO;AAChC,EAAA,MAAMC,MAAM,GAAGD,WAAW,IAAIE,cAAc,EAAE,CAAA;AAE9C,EAAA,MAAMC,gBAAgB,GAAGC,QAAQ,CAAC,MAChCC,cAAc,CAACP,OAAO,CAAC,CAACQ,GAAG,CAAEC,YAAY,IAAK;AAC5C,IAAA,MAAMC,SAAS,GAAGP,MAAM,CAACQ,mBAAmB,CAACF,YAAY,CAAC,CAAA;IAC1DC,SAAS,CAACE,kBAAkB,GAAGT,MAAM,CAACU,WAAW,CAACC,KAAK,GACnD,aAAa,GACb,YAAY,CAAA;AAEhB,IAAA,OAAOJ,SAAS,CAAA;AAClB,GAAC,CAAC,CACH,CAAA;AAED,EAAA,MAAMK,QAAQ,GAAG,IAAIC,eAAe,CAClCb,MAAM,EACNE,gBAAgB,CAACS,KAAK,EACtBb,OAAO,CACR,CAAA;EACD,MAAM,GAAGgB,iBAAiB,CAAC,GAAGF,QAAQ,CAACG,mBAAmB,CACxDb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACD,EAAA,MAAMK,KAAK,GAAGC,GAAG,CAACH,iBAAiB,EAAE,CAAyB,CAAA;AAE9D,EAAA,MAAMI,WAAW,GAAGD,GAAG,CAAC,MAAM;AAC5B;AAAA,GACD,CAAC,CAAA;AAEFE,EAAAA,KAAK,CACHnB,MAAM,CAACU,WAAW,EACjBA,WAAW,IAAK;IACf,IAAI,CAACA,WAAW,EAAE;MAChBQ,WAAW,CAACP,KAAK,EAAE,CAAA;AACnBO,MAAAA,WAAW,CAACP,KAAK,GAAGC,QAAQ,CAACQ,SAAS,CAAC,MAAM;QAC3C,MAAM,GAAGC,0BAA0B,CAAC,GAAGT,QAAQ,CAACG,mBAAmB,CACjEb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACDK,QAAAA,KAAK,CAACL,KAAK,GAAGU,0BAA0B,EAAE,CAAA;AAC5C,OAAC,CAAC,CAAA;AACF;MACA,MAAM,GAAGC,0BAA0B,CAAC,GAAGV,QAAQ,CAACG,mBAAmB,CACjEb,gBAAgB,CAACS,KAAK,CACvB,CAAA;AACDK,MAAAA,KAAK,CAACL,KAAK,GAAGW,0BAA0B,EAAE,CAAA;AAC5C,KAAA;AACF,GAAC,EACD;AAAEC,IAAAA,SAAS,EAAE,IAAA;AAAK,GAAC,CACpB,CAAA;AAEDJ,EAAAA,KAAK,CACH,CAACjB,gBAAgB,CAAC,EAClB,MAAM;IACJU,QAAQ,CAACY,UAAU,CACjBtB,gBAAgB,CAACS,KAAK,EACtBb,OAAO,CACR,CAAA;AACDkB,IAAAA,KAAK,CAACL,KAAK,GAAGC,QAAQ,CAACa,gBAAgB,EAAE,CAAA;AAC3C,GAAC,EACD;AAAEC,IAAAA,IAAI,EAAE,IAAA;AAAK,GAAC,CACf,CAAA;AAEDC,EAAAA,cAAc,CAAC,MAAM;IACnBT,WAAW,CAACP,KAAK,EAAE,CAAA;AACrB,GAAC,CAAC,CAAA;EAEF,OAAOiB,QAAQ,CAACZ,KAAK,CAAC,CAAA;AACxB;;;;"}
@@ -2279,15 +2279,19 @@
2279
2279
  #result;
2280
2280
  #queries;
2281
2281
  #observers;
2282
- constructor(client, queries) {
2282
+ #options;
2283
+ #combinedResult;
2284
+ constructor(client, queries, options) {
2283
2285
  super();
2284
2286
  this.#client = client;
2285
2287
  this.#queries = [];
2286
- this.#result = [];
2287
2288
  this.#observers = [];
2288
- if (queries) {
2289
- this.setQueries(queries);
2290
- }
2289
+ this.#setResult([]);
2290
+ this.setQueries(queries, options);
2291
+ }
2292
+ #setResult(value) {
2293
+ this.#result = value;
2294
+ this.#combinedResult = this.#combineResult(value);
2291
2295
  }
2292
2296
  onSubscribe() {
2293
2297
  if (this.listeners.size === 1) {
@@ -2309,8 +2313,9 @@
2309
2313
  observer.destroy();
2310
2314
  });
2311
2315
  }
2312
- setQueries(queries, notifyOptions) {
2316
+ setQueries(queries, options, notifyOptions) {
2313
2317
  this.#queries = queries;
2318
+ this.#options = options;
2314
2319
  notifyManager.batch(() => {
2315
2320
  const prevObservers = this.#observers;
2316
2321
  const newObserverMatches = this.#findMatchingObservers(this.#queries);
@@ -2324,7 +2329,7 @@
2324
2329
  return;
2325
2330
  }
2326
2331
  this.#observers = newObservers;
2327
- this.#result = newResult;
2332
+ this.#setResult(newResult);
2328
2333
  if (!this.hasListeners()) {
2329
2334
  return;
2330
2335
  }
@@ -2340,7 +2345,7 @@
2340
2345
  });
2341
2346
  }
2342
2347
  getCurrentResult() {
2343
- return this.#result;
2348
+ return this.#combinedResult;
2344
2349
  }
2345
2350
  getQueries() {
2346
2351
  return this.#observers.map(observer => observer.getCurrentQuery());
@@ -2349,7 +2354,23 @@
2349
2354
  return this.#observers;
2350
2355
  }
2351
2356
  getOptimisticResult(queries) {
2352
- return this.#findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
2357
+ const matches = this.#findMatchingObservers(queries);
2358
+ const result = matches.map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));
2359
+ return [result, r => {
2360
+ return this.#combineResult(r ?? result);
2361
+ }, () => {
2362
+ return matches.map((match, index) => {
2363
+ const observerResult = result[index];
2364
+ return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult) : observerResult;
2365
+ });
2366
+ }];
2367
+ }
2368
+ #combineResult(input) {
2369
+ const combine = this.#options?.combine;
2370
+ if (combine) {
2371
+ return replaceEqualDeep(this.#combinedResult, combine(input));
2372
+ }
2373
+ return input;
2353
2374
  }
2354
2375
  #findMatchingObservers(queries) {
2355
2376
  const prevObservers = this.#observers;
@@ -2384,7 +2405,7 @@
2384
2405
  #onUpdate(observer, result) {
2385
2406
  const index = this.#observers.indexOf(observer);
2386
2407
  if (index !== -1) {
2387
- this.#result = replaceAt(this.#result, index, result);
2408
+ this.#setResult(replaceAt(this.#result, index, result));
2388
2409
  this.#notify();
2389
2410
  }
2390
2411
  }
@@ -4056,33 +4077,37 @@
4056
4077
 
4057
4078
  /* eslint-disable @typescript-eslint/no-explicit-any */
4058
4079
  function useQueries({
4059
- queries
4080
+ queries,
4081
+ ...options
4060
4082
  }, queryClient) {
4061
4083
  const client = queryClient || useQueryClient();
4062
- const defaultedQueries = vueDemi.computed(() => cloneDeepUnref(queries).map(options => {
4063
- const defaulted = client.defaultQueryOptions(options);
4084
+ const defaultedQueries = vueDemi.computed(() => cloneDeepUnref(queries).map(queryOptions => {
4085
+ const defaulted = client.defaultQueryOptions(queryOptions);
4064
4086
  defaulted._optimisticResults = client.isRestoring.value ? 'isRestoring' : 'optimistic';
4065
4087
  return defaulted;
4066
4088
  }));
4067
- const observer = new QueriesObserver(client, defaultedQueries.value);
4068
- const state = vueDemi.ref(observer.getCurrentResult());
4089
+ const observer = new QueriesObserver(client, defaultedQueries.value, options);
4090
+ const [, getCombinedResult] = observer.getOptimisticResult(defaultedQueries.value);
4091
+ const state = vueDemi.ref(getCombinedResult());
4069
4092
  const unsubscribe = vueDemi.ref(() => {
4070
4093
  // noop
4071
4094
  });
4072
4095
  vueDemi.watch(client.isRestoring, isRestoring => {
4073
4096
  if (!isRestoring) {
4074
4097
  unsubscribe.value();
4075
- unsubscribe.value = observer.subscribe(result => {
4076
- state.value.splice(0, result.length, ...result);
4098
+ unsubscribe.value = observer.subscribe(() => {
4099
+ const [, getCombinedResultRestoring] = observer.getOptimisticResult(defaultedQueries.value);
4100
+ state.value = getCombinedResultRestoring();
4077
4101
  });
4078
4102
  // Subscription would not fire for persisted results
4079
- state.value = observer.getOptimisticResult(defaultedQueries.value);
4103
+ const [, getCombinedResultPersisted] = observer.getOptimisticResult(defaultedQueries.value);
4104
+ state.value = getCombinedResultPersisted();
4080
4105
  }
4081
4106
  }, {
4082
4107
  immediate: true
4083
4108
  });
4084
- vueDemi.watch(defaultedQueries, () => {
4085
- observer.setQueries(defaultedQueries.value);
4109
+ vueDemi.watch([defaultedQueries], () => {
4110
+ observer.setQueries(defaultedQueries.value, options);
4086
4111
  state.value = observer.getCurrentResult();
4087
4112
  }, {
4088
4113
  deep: true