@tanstack/solid-query 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (54) hide show
  1. package/build/cjs/index.js +73 -34
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/index.js +75 -37
  4. package/build/esm/index.js.map +1 -1
  5. package/build/source/QueryClient.js +6 -0
  6. package/build/source/__tests__/QueryClientProvider.test.jsx +2 -1
  7. package/build/source/__tests__/createInfiniteQuery.test.jsx +67 -20
  8. package/build/source/__tests__/createMutation.test.jsx +19 -18
  9. package/build/source/__tests__/createQueries.test.jsx +4 -91
  10. package/build/source/__tests__/createQuery.test.jsx +62 -271
  11. package/build/source/__tests__/suspense.test.jsx +3 -64
  12. package/build/source/__tests__/useIsFetching.test.jsx +2 -4
  13. package/build/source/__tests__/useIsMutating.test.jsx +25 -28
  14. package/build/source/__tests__/utils.jsx +4 -3
  15. package/build/source/createBaseQuery.js +45 -19
  16. package/build/source/createQueries.js +5 -5
  17. package/build/source/index.js +1 -0
  18. package/build/source/useIsFetching.js +5 -5
  19. package/build/source/useIsMutating.js +5 -5
  20. package/build/types/QueryClient.d.ts +29 -0
  21. package/build/types/QueryClientProvider.d.ts +1 -1
  22. package/build/types/__tests__/utils.d.ts +3 -4
  23. package/build/types/createBaseQuery.d.ts +3 -2
  24. package/build/types/createInfiniteQuery.d.ts +4 -2
  25. package/build/types/createMutation.d.ts +4 -2
  26. package/build/types/createQueries.d.ts +5 -4
  27. package/build/types/createQuery.d.ts +2 -1
  28. package/build/types/index.d.ts +2 -0
  29. package/build/types/types.d.ts +2 -1
  30. package/build/types/useIsFetching.d.ts +3 -7
  31. package/build/types/useIsMutating.d.ts +3 -7
  32. package/build/umd/index.js +1 -1
  33. package/build/umd/index.js.map +1 -1
  34. package/package.json +5 -5
  35. package/src/QueryClient.ts +84 -0
  36. package/src/QueryClientProvider.tsx +1 -1
  37. package/src/__tests__/QueryClientProvider.test.tsx +2 -1
  38. package/src/__tests__/createInfiniteQuery.test.tsx +95 -34
  39. package/src/__tests__/createMutation.test.tsx +19 -18
  40. package/src/__tests__/createQueries.test.tsx +4 -97
  41. package/src/__tests__/createQuery.test.tsx +78 -344
  42. package/src/__tests__/suspense.test.tsx +3 -85
  43. package/src/__tests__/useIsFetching.test.tsx +2 -4
  44. package/src/__tests__/useIsMutating.test.tsx +32 -40
  45. package/src/__tests__/utils.tsx +4 -3
  46. package/src/createBaseQuery.ts +70 -25
  47. package/src/createInfiniteQuery.ts +3 -2
  48. package/src/createMutation.ts +4 -2
  49. package/src/createQueries.ts +9 -8
  50. package/src/createQuery.ts +4 -2
  51. package/src/index.ts +7 -0
  52. package/src/types.ts +4 -2
  53. package/src/useIsFetching.ts +10 -13
  54. package/src/useIsMutating.ts +10 -11
@@ -5,6 +5,7 @@ import { createEffect, createRenderEffect, createSignal, Show } from 'solid-js';
5
5
  import { render } from 'solid-testing-library';
6
6
  import * as MutationCacheModule from '../../../query-core/src/mutationCache';
7
7
  import { setActTimeout } from './utils';
8
+ import { vi } from 'vitest';
8
9
  describe('useIsMutating', () => {
9
10
  it('should return the number of fetching mutations', async () => {
10
11
  const isMutatings = [];
@@ -54,9 +55,7 @@ describe('useIsMutating', () => {
54
55
  const isMutatings = [];
55
56
  const queryClient = createQueryClient();
56
57
  function IsMutating() {
57
- const isMutating = useIsMutating(() => ({
58
- filters: { mutationKey: ['mutation1'] },
59
- }));
58
+ const isMutating = useIsMutating(() => ({ mutationKey: ['mutation1'] }));
60
59
  createRenderEffect(() => {
61
60
  isMutatings.push(isMutating());
62
61
  });
@@ -94,9 +93,7 @@ describe('useIsMutating', () => {
94
93
  const queryClient = createQueryClient();
95
94
  function IsMutating() {
96
95
  const isMutating = useIsMutating(() => ({
97
- filters: {
98
- predicate: (mutation) => mutation.options.mutationKey?.[0] === 'mutation1',
99
- },
96
+ predicate: (mutation) => mutation.options.mutationKey?.[0] === 'mutation1',
100
97
  }));
101
98
  createRenderEffect(() => {
102
99
  isMutatings.push(isMutating());
@@ -130,6 +127,27 @@ describe('useIsMutating', () => {
130
127
  // Again, No unnecessary re-renders like React
131
128
  await waitFor(() => expect(isMutatings).toEqual([0, 1, 0]));
132
129
  });
130
+ it('should use provided custom queryClient', async () => {
131
+ const queryClient = createQueryClient();
132
+ function Page() {
133
+ const isMutating = useIsMutating(undefined, () => queryClient);
134
+ const { mutate } = createMutation(() => ({
135
+ mutationKey: ['mutation1'],
136
+ mutationFn: async () => {
137
+ await sleep(10);
138
+ return 'data';
139
+ },
140
+ }), () => queryClient);
141
+ createEffect(() => {
142
+ mutate();
143
+ });
144
+ return (<div>
145
+ <div>mutating: {isMutating}</div>
146
+ </div>);
147
+ }
148
+ render(() => <Page></Page>);
149
+ await waitFor(() => screen.findByText('mutating: 1'));
150
+ });
133
151
  it('should not change state if unmounted', async () => {
134
152
  // We have to mock the MutationCache to not unsubscribe
135
153
  // the listener when the component is unmounted
@@ -139,7 +157,7 @@ describe('useIsMutating', () => {
139
157
  return () => void 0;
140
158
  }
141
159
  }
142
- const MutationCacheSpy = jest
160
+ const MutationCacheSpy = vi
143
161
  .spyOn(MutationCacheModule, 'MutationCache')
144
162
  .mockImplementation((fn) => {
145
163
  return new MutationCacheMock(fn);
@@ -177,25 +195,4 @@ describe('useIsMutating', () => {
177
195
  await sleep(20);
178
196
  MutationCacheSpy.mockRestore();
179
197
  });
180
- it('should use provided custom queryClient', async () => {
181
- const queryClient = createQueryClient();
182
- function Page() {
183
- const isMutating = useIsMutating(() => ({ queryClient }));
184
- const { mutate } = createMutation(() => ({
185
- mutationKey: ['mutation1'],
186
- mutationFn: async () => {
187
- await sleep(10);
188
- return 'data';
189
- },
190
- }), () => queryClient);
191
- createEffect(() => {
192
- mutate();
193
- });
194
- return (<div>
195
- <div>mutating: {isMutating}</div>
196
- </div>);
197
- }
198
- render(() => <Page></Page>);
199
- await waitFor(() => screen.findByText('mutating: 1'));
200
- });
201
198
  });
@@ -1,5 +1,6 @@
1
- import { QueryClient } from '@tanstack/query-core';
1
+ import { QueryClient } from '../QueryClient';
2
2
  import { createEffect, createSignal, onCleanup, Show } from 'solid-js';
3
+ import { vi } from 'vitest';
3
4
  let queryKeyCount = 0;
4
5
  export function queryKey() {
5
6
  queryKeyCount++;
@@ -20,10 +21,10 @@ export function createQueryClient(config) {
20
21
  return new QueryClient(config);
21
22
  }
22
23
  export function mockVisibilityState(value) {
23
- return jest.spyOn(document, 'visibilityState', 'get').mockReturnValue(value);
24
+ return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value);
24
25
  }
25
26
  export function mockNavigatorOnLine(value) {
26
- return jest.spyOn(navigator, 'onLine', 'get').mockReturnValue(value);
27
+ return vi.spyOn(navigator, 'onLine', 'get').mockReturnValue(value);
27
28
  }
28
29
  export function sleep(timeout) {
29
30
  return new Promise((resolve, _reject) => {
@@ -1,15 +1,26 @@
1
1
  import { hydrate } from '@tanstack/query-core';
2
2
  import { notifyManager } from '@tanstack/query-core';
3
3
  import { isServer } from 'solid-js/web';
4
- import { createComputed, createMemo, createResource, on, onCleanup, onMount, } from 'solid-js';
5
- import { createStore, unwrap } from 'solid-js/store';
4
+ import { createComputed, createMemo, createResource, on, onCleanup, } from 'solid-js';
5
+ import { createStore, reconcile, unwrap } from 'solid-js/store';
6
6
  import { useQueryClient } from './QueryClientProvider';
7
7
  import { shouldThrowError } from './utils';
8
+ function reconcileFn(store, result, reconcileOption) {
9
+ if (reconcileOption === false)
10
+ return result;
11
+ if (typeof reconcileOption === 'function') {
12
+ const newData = reconcileOption(store.data, result.data);
13
+ return { ...result, data: newData };
14
+ }
15
+ const newData = reconcile(result.data, { key: reconcileOption })(store.data);
16
+ return { ...result, data: newData };
17
+ }
8
18
  // Base Query Function that is used to create the query.
9
19
  export function createBaseQuery(options, Observer, queryClient) {
10
20
  const client = createMemo(() => useQueryClient(queryClient?.()));
11
21
  const defaultedOptions = client().defaultQueryOptions(options());
12
22
  defaultedOptions._optimisticResults = 'optimistic';
23
+ defaultedOptions.structuralSharing = false;
13
24
  if (isServer) {
14
25
  defaultedOptions.retry = false;
15
26
  defaultedOptions.throwErrors = true;
@@ -19,7 +30,19 @@ export function createBaseQuery(options, Observer, queryClient) {
19
30
  const createServerSubscriber = (resolve, reject) => {
20
31
  return observer.subscribe((result) => {
21
32
  notifyManager.batchCalls(() => {
22
- const unwrappedResult = { ...unwrap(result) };
33
+ const query = observer.getCurrentQuery();
34
+ const { refetch, ...rest } = unwrap(result);
35
+ const unwrappedResult = {
36
+ ...rest,
37
+ // hydrate() expects a QueryState object, which is similar but not
38
+ // quite the same as a QueryObserverResult object. Thus, for now, we're
39
+ // copying over the missing properties from state in order to support hydration
40
+ dataUpdateCount: query.state.dataUpdateCount,
41
+ fetchFailureCount: query.state.fetchFailureCount,
42
+ fetchFailureReason: query.state.fetchFailureReason,
43
+ fetchMeta: query.state.fetchMeta,
44
+ isInvalidated: query.state.isInvalidated,
45
+ };
23
46
  if (unwrappedResult.isError) {
24
47
  if (process.env['NODE_ENV'] === 'development') {
25
48
  console.error(unwrappedResult.error);
@@ -27,6 +50,8 @@ export function createBaseQuery(options, Observer, queryClient) {
27
50
  reject(unwrappedResult.error);
28
51
  }
29
52
  if (unwrappedResult.isSuccess) {
53
+ // Use of any here is fine
54
+ // We cannot include refetch since it is not serializable
30
55
  resolve(unwrappedResult);
31
56
  }
32
57
  })();
@@ -35,17 +60,21 @@ export function createBaseQuery(options, Observer, queryClient) {
35
60
  const createClientSubscriber = () => {
36
61
  return observer.subscribe((result) => {
37
62
  notifyManager.batchCalls(() => {
38
- const unwrappedResult = { ...unwrap(result) };
63
+ // @ts-expect-error - This will error because the reconcile option does not
64
+ // exist on the query-core QueryObserverResult type
65
+ const reconcileOptions = observer.options.reconcile;
39
66
  // If the query has data we dont suspend but instead mutate the resource
40
67
  // This could happen when placeholderData/initialData is defined
41
- if (queryResource()?.data &&
42
- unwrappedResult.data &&
43
- !queryResource.loading) {
44
- setState(unwrappedResult);
68
+ if (queryResource()?.data && result.data && !queryResource.loading) {
69
+ setState((store) => {
70
+ return reconcileFn(store, result, reconcileOptions === undefined ? 'id' : reconcileOptions);
71
+ });
45
72
  mutate(state);
46
73
  }
47
74
  else {
48
- setState(unwrappedResult);
75
+ setState((store) => {
76
+ return reconcileFn(store, result, reconcileOptions === undefined ? 'id' : reconcileOptions);
77
+ });
49
78
  refetch();
50
79
  }
51
80
  })();
@@ -119,12 +148,11 @@ export function createBaseQuery(options, Observer, queryClient) {
119
148
  unsubscribe = null;
120
149
  }
121
150
  });
122
- onMount(() => {
123
- observer.setOptions(defaultedOptions, { listeners: false });
124
- });
125
- createComputed(() => {
126
- observer.setOptions(client().defaultQueryOptions(options()));
127
- });
151
+ createComputed(on(() => client().defaultQueryOptions(options()), () => observer.setOptions(client().defaultQueryOptions(options())), {
152
+ // Defer because we don't need to trigger on first render
153
+ // This only cares about changes to options after the observer is created
154
+ defer: true,
155
+ }));
128
156
  createComputed(on(() => state.status, () => {
129
157
  if (state.isError &&
130
158
  !state.isFetching &&
@@ -137,10 +165,8 @@ export function createBaseQuery(options, Observer, queryClient) {
137
165
  }));
138
166
  const handler = {
139
167
  get(target, prop) {
140
- if (prop === 'data') {
141
- return queryResource()?.data;
142
- }
143
- return Reflect.get(target, prop);
168
+ const val = queryResource()?.[prop];
169
+ return val !== undefined ? val : Reflect.get(target, prop);
144
170
  },
145
171
  };
146
172
  return new Proxy(state, handler);
@@ -2,14 +2,14 @@ import { notifyManager, QueriesObserver } from '@tanstack/query-core';
2
2
  import { createComputed, onCleanup, onMount } from 'solid-js';
3
3
  import { createStore, unwrap } from 'solid-js/store';
4
4
  import { useQueryClient } from './QueryClientProvider';
5
- export function createQueries(queriesOptions) {
6
- const queryClient = useQueryClient(queriesOptions().queryClient);
5
+ export function createQueries(queriesOptions, queryClient) {
6
+ const client = useQueryClient(queryClient?.());
7
7
  const defaultedQueries = queriesOptions().queries.map((options) => {
8
- const defaultedOptions = queryClient.defaultQueryOptions(options);
8
+ const defaultedOptions = client.defaultQueryOptions(options);
9
9
  defaultedOptions._optimisticResults = 'optimistic';
10
10
  return defaultedOptions;
11
11
  });
12
- const observer = new QueriesObserver(queryClient, defaultedQueries);
12
+ const observer = new QueriesObserver(client, defaultedQueries);
13
13
  const [state, setState] = createStore(observer.getOptimisticResult(defaultedQueries));
14
14
  const unsubscribe = observer.subscribe((result) => {
15
15
  notifyManager.batchCalls(() => {
@@ -22,7 +22,7 @@ export function createQueries(queriesOptions) {
22
22
  });
23
23
  createComputed(() => {
24
24
  const updatedQueries = queriesOptions().queries.map((options) => {
25
- const defaultedOptions = queryClient.defaultQueryOptions(options);
25
+ const defaultedOptions = client.defaultQueryOptions(options);
26
26
  defaultedOptions._optimisticResults = 'optimistic';
27
27
  return defaultedOptions;
28
28
  });
@@ -5,6 +5,7 @@ import './setBatchUpdatesFn';
5
5
  export * from '@tanstack/query-core';
6
6
  // Solid Query
7
7
  export * from './types';
8
+ export { QueryClient } from './QueryClient';
8
9
  export { createQuery } from './createQuery';
9
10
  export { QueryClientContext, QueryClientProvider, useQueryClient, } from './QueryClientProvider';
10
11
  export { useIsFetching } from './useIsFetching';
@@ -1,11 +1,11 @@
1
1
  import { createMemo, createSignal, onCleanup } from 'solid-js';
2
2
  import { useQueryClient } from './QueryClientProvider';
3
- export function useIsFetching(options = () => ({})) {
4
- const queryClient = createMemo(() => useQueryClient(options().queryClient));
5
- const queryCache = createMemo(() => queryClient().getQueryCache());
6
- const [fetches, setFetches] = createSignal(queryClient().isFetching(options().filters));
3
+ export function useIsFetching(filters, queryClient) {
4
+ const client = createMemo(() => useQueryClient(queryClient?.()));
5
+ const queryCache = createMemo(() => client().getQueryCache());
6
+ const [fetches, setFetches] = createSignal(client().isFetching(filters?.()));
7
7
  const unsubscribe = queryCache().subscribe(() => {
8
- setFetches(queryClient().isFetching(options().filters));
8
+ setFetches(client().isFetching(filters?.()));
9
9
  });
10
10
  onCleanup(unsubscribe);
11
11
  return fetches;
@@ -1,11 +1,11 @@
1
1
  import { useQueryClient } from './QueryClientProvider';
2
2
  import { createSignal, onCleanup, createMemo } from 'solid-js';
3
- export function useIsMutating(options = () => ({})) {
4
- const queryClient = createMemo(() => useQueryClient(options().queryClient));
5
- const mutationCache = createMemo(() => queryClient().getMutationCache());
6
- const [mutations, setMutations] = createSignal(queryClient().isMutating(options().filters));
3
+ export function useIsMutating(filters, queryClient) {
4
+ const client = createMemo(() => useQueryClient(queryClient?.()));
5
+ const mutationCache = createMemo(() => client().getMutationCache());
6
+ const [mutations, setMutations] = createSignal(client().isMutating(filters?.()));
7
7
  const unsubscribe = mutationCache().subscribe((_result) => {
8
- setMutations(queryClient().isMutating(options().filters));
8
+ setMutations(client().isMutating(filters?.()));
9
9
  });
10
10
  onCleanup(unsubscribe);
11
11
  return mutations;
@@ -0,0 +1,29 @@
1
+ import type { QueryClientConfig as QueryCoreClientConfig, DefaultOptions as CoreDefaultOptions, QueryObserverOptions as QueryCoreObserverOptions, InfiniteQueryObserverOptions as QueryCoreInfiniteQueryObserverOptions, DefaultError, QueryKey } from '@tanstack/query-core';
2
+ import { QueryClient as QueryCoreClient } from '@tanstack/query-core';
3
+ export interface QueryObserverOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = never> extends Omit<QueryCoreObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, 'structuralSharing'> {
4
+ /**
5
+ * Set this to a reconciliation key to enable reconciliation between query results.
6
+ * Set this to `false` to disable reconciliation between query results.
7
+ * Set this to a function which accepts the old and new data and returns resolved data of the same type to implement custom reconciliation logic.
8
+ * Defaults reconciliation key to `id`.
9
+ */
10
+ reconcile?: string | false | ((oldData: TData | undefined, newData: TData) => TData);
11
+ }
12
+ export interface InfiniteQueryObserverOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown> extends Omit<QueryCoreInfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey, TPageParam>, 'structuralSharing'> {
13
+ /**
14
+ * Set this to a reconciliation key to enable reconciliation between query results.
15
+ * Set this to `false` to disable reconciliation between query results.
16
+ * Set this to a function which accepts the old and new data and returns resolved data of the same type to implement custom reconciliation logic.
17
+ * Defaults reconciliation key to `id`.
18
+ */
19
+ reconcile?: string | false | ((oldData: TData | undefined, newData: TData) => TData);
20
+ }
21
+ export interface DefaultOptions<TError = DefaultError> extends CoreDefaultOptions<TError> {
22
+ queries?: QueryObserverOptions<unknown, TError>;
23
+ }
24
+ export interface QueryClientConfig extends QueryCoreClientConfig {
25
+ defaultOptions?: DefaultOptions;
26
+ }
27
+ export declare class QueryClient extends QueryCoreClient {
28
+ constructor(config?: QueryClientConfig);
29
+ }
@@ -1,4 +1,4 @@
1
- import type { QueryClient } from '@tanstack/query-core';
1
+ import type { QueryClient } from './QueryClient';
2
2
  import type { JSX } from 'solid-js';
3
3
  export declare const QueryClientContext: import("solid-js").Context<QueryClient | undefined>;
4
4
  export declare const useQueryClient: (queryClient?: QueryClient) => QueryClient;
@@ -1,15 +1,14 @@
1
- /// <reference types="jest" />
2
1
  /// <reference types="node" />
3
2
  import type { QueryClientConfig } from '@tanstack/query-core';
4
- import { QueryClient } from '@tanstack/query-core';
3
+ import { QueryClient } from '../QueryClient';
5
4
  import type { ParentProps } from 'solid-js';
6
5
  export declare function queryKey(): Array<string>;
7
6
  export declare const Blink: (props: {
8
7
  duration: number;
9
8
  } & ParentProps) => import("solid-js").JSX.Element;
10
9
  export declare function createQueryClient(config?: QueryClientConfig): QueryClient;
11
- export declare function mockVisibilityState(value: DocumentVisibilityState): jest.SpyInstance<DocumentVisibilityState, [], any>;
12
- export declare function mockNavigatorOnLine(value: boolean): jest.SpyInstance<boolean, [], any>;
10
+ export declare function mockVisibilityState(value: DocumentVisibilityState): import("vitest/dist/index-1cfc7f58").S<[], DocumentVisibilityState>;
11
+ export declare function mockNavigatorOnLine(value: boolean): import("vitest/dist/index-1cfc7f58").S<[], boolean>;
13
12
  export declare function sleep(timeout: number): Promise<void>;
14
13
  export declare function setActTimeout(fn: () => void, ms?: number): NodeJS.Timeout;
15
14
  /**
@@ -1,4 +1,5 @@
1
- import type { QueryClient, QueryKey, QueryObserver, QueryObserverResult } from '@tanstack/query-core';
1
+ import type { QueryKey, QueryObserver, QueryObserverResult } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
2
3
  import type { Accessor } from 'solid-js';
3
4
  import type { CreateBaseQueryOptions } from './types';
4
- export declare function createBaseQuery<TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>(options: Accessor<CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, Observer: typeof QueryObserver, queryClient?: () => QueryClient): QueryObserverResult<TData, TError>;
5
+ export declare function createBaseQuery<TQueryFnData, TError, TData, TQueryData, TQueryKey extends QueryKey>(options: Accessor<CreateBaseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, Observer: typeof QueryObserver, queryClient?: Accessor<QueryClient>): QueryObserverResult<TData, TError>;
@@ -1,3 +1,5 @@
1
- import type { QueryKey, QueryClient, DefaultError, InfiniteData } from '@tanstack/query-core';
1
+ import type { QueryKey, DefaultError, InfiniteData } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
2
3
  import type { CreateInfiniteQueryOptions, CreateInfiniteQueryResult } from './types';
3
- export declare function createInfiniteQuery<TQueryFnData, TError = DefaultError, TData = InfiniteData<TQueryFnData>, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown>(options: CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient?: () => QueryClient): CreateInfiniteQueryResult<TData, TError>;
4
+ import type { Accessor } from 'solid-js';
5
+ export declare function createInfiniteQuery<TQueryFnData, TError = DefaultError, TData = InfiniteData<TQueryFnData>, TQueryKey extends QueryKey = QueryKey, TPageParam = unknown>(options: CreateInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient?: Accessor<QueryClient>): CreateInfiniteQueryResult<TData, TError>;
@@ -1,3 +1,5 @@
1
- import type { QueryClient, DefaultError } from '@tanstack/query-core';
1
+ import type { DefaultError } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
2
3
  import type { CreateMutationOptions, CreateMutationResult } from './types';
3
- export declare function createMutation<TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown>(options: CreateMutationOptions<TData, TError, TVariables, TContext>, queryClient?: () => QueryClient): CreateMutationResult<TData, TError, TVariables, TContext>;
4
+ import type { Accessor } from 'solid-js';
5
+ export declare function createMutation<TData = unknown, TError = DefaultError, TVariables = void, TContext = unknown>(options: CreateMutationOptions<TData, TError, TVariables, TContext>, queryClient?: Accessor<QueryClient>): CreateMutationResult<TData, TError, TVariables, TContext>;
@@ -1,4 +1,6 @@
1
- import type { QueriesPlaceholderDataFunction, QueryClient, QueryFunction, QueryKey, DefaultError } from '@tanstack/query-core';
1
+ import type { QueriesPlaceholderDataFunction, QueryFunction, QueryKey, DefaultError } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
3
+ import type { Accessor } from 'solid-js';
2
4
  import type { CreateQueryResult, SolidQueryOptions } from './types';
3
5
  declare type CreateQueryOptionsForCreateQueries<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = Omit<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey>, 'placeholderData'> & {
4
6
  placeholderData?: TQueryFnData | QueriesPlaceholderDataFunction<TQueryFnData>;
@@ -44,8 +46,7 @@ export declare type QueriesOptions<T extends any[], Result extends any[] = [], D
44
46
  * QueriesResults reducer recursively maps type param to results
45
47
  */
46
48
  export declare type QueriesResults<T extends any[], Result extends any[] = [], Depth extends ReadonlyArray<number> = []> = Depth['length'] extends MAXIMUM_DEPTH ? CreateQueryResult[] : T extends [] ? [] : T extends [infer Head] ? [...Result, GetResults<Head>] : T extends [infer Head, ...infer Tail] ? QueriesResults<[...Tail], [...Result, GetResults<Head>], [...Depth, 1]> : T extends CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, any>[] ? CreateQueryResult<unknown extends TData ? TQueryFnData : TData, unknown extends TError ? DefaultError : TError>[] : CreateQueryResult[];
47
- export declare function createQueries<T extends any[]>(queriesOptions: () => {
49
+ export declare function createQueries<T extends any[]>(queriesOptions: Accessor<{
48
50
  queries: readonly [...QueriesOptions<T>];
49
- queryClient?: QueryClient;
50
- }): QueriesResults<T>;
51
+ }>, queryClient?: Accessor<QueryClient>): QueriesResults<T>;
51
52
  export {};
@@ -1,4 +1,5 @@
1
- import type { QueryClient, QueryKey, DefaultError } from '@tanstack/query-core';
1
+ import type { QueryKey, DefaultError } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
2
3
  import type { CreateQueryResult, DefinedCreateQueryResult, FunctionedParams, SolidQueryOptions } from './types';
3
4
  declare type UndefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = FunctionedParams<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
4
5
  initialData?: undefined;
@@ -1,6 +1,8 @@
1
1
  import './setBatchUpdatesFn';
2
2
  export * from '@tanstack/query-core';
3
3
  export * from './types';
4
+ export { QueryClient } from './QueryClient';
5
+ export type { QueryObserverOptions, DefaultOptions, QueryClientConfig, InfiniteQueryObserverOptions, } from './QueryClient';
4
6
  export { createQuery } from './createQuery';
5
7
  export { QueryClientContext, QueryClientProvider, useQueryClient, } from './QueryClientProvider';
6
8
  export type { QueryClientProviderProps } from './QueryClientProvider';
@@ -1,4 +1,5 @@
1
- import type { QueryKey, QueryObserverOptions, QueryObserverResult, MutateFunction, MutationObserverOptions, MutationObserverResult, DefinedQueryObserverResult, InfiniteQueryObserverOptions, InfiniteQueryObserverResult, WithRequired, DefaultError } from '@tanstack/query-core';
1
+ import type { QueryKey, QueryObserverResult, MutateFunction, MutationObserverOptions, MutationObserverResult, DefinedQueryObserverResult, InfiniteQueryObserverResult, WithRequired, DefaultError } from '@tanstack/query-core';
2
+ import type { QueryObserverOptions, InfiniteQueryObserverOptions } from './QueryClient';
2
3
  export declare type FunctionedParams<T> = () => T;
3
4
  export interface CreateBaseQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends WithRequired<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 'queryKey'> {
4
5
  deferStream?: boolean;
@@ -1,8 +1,4 @@
1
- import type { QueryClient, QueryFilters } from '@tanstack/query-core';
1
+ import type { QueryFilters } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
2
3
  import type { Accessor } from 'solid-js';
3
- declare type Options = () => {
4
- filters?: QueryFilters;
5
- queryClient?: QueryClient;
6
- };
7
- export declare function useIsFetching(options?: Options): Accessor<number>;
8
- export {};
4
+ export declare function useIsFetching(filters?: Accessor<QueryFilters>, queryClient?: Accessor<QueryClient>): Accessor<number>;
@@ -1,8 +1,4 @@
1
- import type { MutationFilters, QueryClient } from '@tanstack/query-core';
1
+ import type { MutationFilters } from '@tanstack/query-core';
2
+ import type { QueryClient } from './QueryClient';
2
3
  import type { Accessor } from 'solid-js';
3
- declare type Options = () => {
4
- filters?: MutationFilters;
5
- queryClient?: QueryClient;
6
- };
7
- export declare function useIsMutating(options?: Options): Accessor<number>;
8
- export {};
4
+ export declare function useIsMutating(filters?: Accessor<MutationFilters>, queryClient?: Accessor<QueryClient>): Accessor<number>;
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@tanstack/query-core"),require("solid-js"),require("solid-js/web"),require("solid-js/store")):"function"==typeof define&&define.amd?define(["exports","@tanstack/query-core","solid-js","solid-js/web","solid-js/store"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).index={},e.QueryCore,e.Solid,e.SolidWeb,e.SolidStore)}(this,(function(e,t,r,n,i){"use strict";t.notifyManager.setBatchNotifyFunction(r.batch);const o=r.createContext(void 0),s=e=>{const t=r.useContext(o);if(e)return e;if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t};function u(e,t){return"function"==typeof e?e(...t):!!e}function a(e,o,a){const c=r.createMemo((()=>s(a?.()))),l=c().defaultQueryOptions(e());l._optimisticResults="optimistic",n.isServer&&(l.retry=!1,l.throwErrors=!0);const f=new o(c(),l),[d,p]=i.createStore(f.getOptimisticResult(l)),y=()=>f.subscribe((e=>{t.notifyManager.batchCalls((()=>{const t={...i.unwrap(e)};C()?.data&&t.data&&!C.loading?(p(t),h(d)):(p(t),g())}))()}));let m=null;const[C,{refetch:g,mutate:h}]=r.createResource((()=>new Promise(((e,r)=>{n.isServer?m=((e,r)=>f.subscribe((n=>{t.notifyManager.batchCalls((()=>{const t={...i.unwrap(n)};t.isError&&("development"===process.env.NODE_ENV&&console.error(t.error),r(t.error)),t.isSuccess&&e(t)}))()})))(e,r):m||(m=y()),d.isLoading||e(d)}))),{initialValue:d,ssrLoadFrom:e().initialData?"initial":"server",get deferStream(){return e().deferStream},onHydrated(e,r){if(r.value&&t.hydrate(c(),{queries:[{queryKey:l.queryKey,queryHash:l.queryHash,state:r.value}]}),!m){const e={...l};!l.staleTime&&l.initialData||(e.refetchOnMount=!1),f.setOptions(e),p(f.getOptimisticResult(e)),m=y()}}});r.onCleanup((()=>{m&&(m(),m=null)})),r.onMount((()=>{f.setOptions(l,{listeners:!1})})),r.createComputed((()=>{f.setOptions(c().defaultQueryOptions(e()))})),r.createComputed(r.on((()=>d.status),(()=>{if(d.isError&&!d.isFetching&&u(f.options.throwErrors,[d.error,f.getCurrentQuery()]))throw d.error})));return new Proxy(d,{get:(e,t)=>"data"===t?C()?.data:Reflect.get(e,t)})}function c(){}e.QueryClientContext=o,e.QueryClientProvider=e=>(r.onMount((()=>{e.client.mount()})),r.onCleanup((()=>e.client.unmount())),n.createComponent(o.Provider,{get value(){return e.client},get children(){return e.children}})),e.createInfiniteQuery=function(e,n){return a(r.createMemo((()=>e())),t.InfiniteQueryObserver,n)},e.createMutation=function(e,n){const o=s(n?.()),a=new t.MutationObserver(o,e()),l=(e,t)=>{a.mutate(e,t).catch(c)},[f,d]=i.createStore({...a.getCurrentResult(),mutate:l,mutateAsync:a.getCurrentResult().mutate});r.createComputed((()=>{a.setOptions(e())})),r.createComputed(r.on((()=>f.status),(()=>{if(f.isError&&u(a.options.throwErrors,[f.error]))throw f.error})));const p=a.subscribe((e=>{d({...e,mutate:l,mutateAsync:e.mutate})}));return r.onCleanup(p),f},e.createQueries=function(e){const n=s(e().queryClient),o=e().queries.map((e=>{const t=n.defaultQueryOptions(e);return t._optimisticResults="optimistic",t})),u=new t.QueriesObserver(n,o),[a,c]=i.createStore(u.getOptimisticResult(o)),l=u.subscribe((e=>{t.notifyManager.batchCalls((()=>{c(i.unwrap(e))}))()}));return r.onCleanup(l),r.onMount((()=>{u.setQueries(o,{listeners:!1})})),r.createComputed((()=>{const t=e().queries.map((e=>{const t=n.defaultQueryOptions(e);return t._optimisticResults="optimistic",t}));u.setQueries(t)})),a},e.createQuery=function(e,n){return a(r.createMemo((()=>e())),t.QueryObserver,n)},e.useIsFetching=function(e=(()=>({}))){const t=r.createMemo((()=>s(e().queryClient))),n=r.createMemo((()=>t().getQueryCache())),[i,o]=r.createSignal(t().isFetching(e().filters)),u=n().subscribe((()=>{o(t().isFetching(e().filters))}));return r.onCleanup(u),i},e.useIsMutating=function(e=(()=>({}))){const t=r.createMemo((()=>s(e().queryClient))),n=r.createMemo((()=>t().getMutationCache())),[i,o]=r.createSignal(t().isMutating(e().filters)),u=n().subscribe((r=>{o(t().isMutating(e().filters))}));return r.onCleanup(u),i},e.useQueryClient=s,Object.keys(t).forEach((function(r){"default"===r||e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[r]}})}))}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@tanstack/query-core"),require("solid-js"),require("solid-js/web"),require("solid-js/store")):"function"==typeof define&&define.amd?define(["exports","@tanstack/query-core","solid-js","solid-js/web","solid-js/store"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).index={},e.QueryCore,e.Solid,e.SolidWeb,e.SolidStore)}(this,(function(e,t,r,n,o){"use strict";t.notifyManager.setBatchNotifyFunction(r.batch);class i extends t.QueryClient{constructor(e={}){super(e)}}const s=r.createContext(void 0),u=e=>{const t=r.useContext(s);if(e)return e;if(!t)throw new Error("No QueryClient set, use QueryClientProvider to set one");return t};function a(e,t){return"function"==typeof e?e(...t):!!e}function c(e,t,r){if(!1===r)return t;if("function"==typeof r){const n=r(e.data,t.data);return{...t,data:n}}const n=o.reconcile(t.data,{key:r})(e.data);return{...t,data:n}}function l(e,i,s){const l=r.createMemo((()=>u(s?.()))),d=l().defaultQueryOptions(e());d._optimisticResults="optimistic",d.structuralSharing=!1,n.isServer&&(d.retry=!1,d.throwErrors=!0);const f=new i(l(),d),[p,y]=o.createStore(f.getOptimisticResult(d)),m=()=>f.subscribe((e=>{t.notifyManager.batchCalls((()=>{const t=f.options.reconcile;C()?.data&&e.data&&!C.loading?(y((r=>c(r,e,void 0===t?"id":t))),b(p)):(y((r=>c(r,e,void 0===t?"id":t))),g())}))()}));let h=null;const[C,{refetch:g,mutate:b}]=r.createResource((()=>new Promise(((e,r)=>{n.isServer?h=((e,r)=>f.subscribe((n=>{t.notifyManager.batchCalls((()=>{const t=f.getCurrentQuery(),{refetch:i,...s}=o.unwrap(n),u={...s,dataUpdateCount:t.state.dataUpdateCount,fetchFailureCount:t.state.fetchFailureCount,fetchFailureReason:t.state.fetchFailureReason,fetchMeta:t.state.fetchMeta,isInvalidated:t.state.isInvalidated};u.isError&&("development"===process.env.NODE_ENV&&console.error(u.error),r(u.error)),u.isSuccess&&e(u)}))()})))(e,r):h||(h=m()),p.isLoading||e(p)}))),{initialValue:p,ssrLoadFrom:e().initialData?"initial":"server",get deferStream(){return e().deferStream},onHydrated(e,r){if(r.value&&t.hydrate(l(),{queries:[{queryKey:d.queryKey,queryHash:d.queryHash,state:r.value}]}),!h){const e={...d};!d.staleTime&&d.initialData||(e.refetchOnMount=!1),f.setOptions(e),y(f.getOptimisticResult(e)),h=m()}}});r.onCleanup((()=>{h&&(h(),h=null)})),r.createComputed(r.on((()=>l().defaultQueryOptions(e())),(()=>f.setOptions(l().defaultQueryOptions(e()))),{defer:!0})),r.createComputed(r.on((()=>p.status),(()=>{if(p.isError&&!p.isFetching&&a(f.options.throwErrors,[p.error,f.getCurrentQuery()]))throw p.error})));return new Proxy(p,{get(e,t){const r=C()?.[t];return void 0!==r?r:Reflect.get(e,t)}})}function d(){}e.QueryClient=i,e.QueryClientContext=s,e.QueryClientProvider=e=>(r.onMount((()=>{e.client.mount()})),r.onCleanup((()=>e.client.unmount())),n.createComponent(s.Provider,{get value(){return e.client},get children(){return e.children}})),e.createInfiniteQuery=function(e,n){return l(r.createMemo((()=>e())),t.InfiniteQueryObserver,n)},e.createMutation=function(e,n){const i=u(n?.()),s=new t.MutationObserver(i,e()),c=(e,t)=>{s.mutate(e,t).catch(d)},[l,f]=o.createStore({...s.getCurrentResult(),mutate:c,mutateAsync:s.getCurrentResult().mutate});r.createComputed((()=>{s.setOptions(e())})),r.createComputed(r.on((()=>l.status),(()=>{if(l.isError&&a(s.options.throwErrors,[l.error]))throw l.error})));const p=s.subscribe((e=>{f({...e,mutate:c,mutateAsync:e.mutate})}));return r.onCleanup(p),l},e.createQueries=function(e,n){const i=u(n?.()),s=e().queries.map((e=>{const t=i.defaultQueryOptions(e);return t._optimisticResults="optimistic",t})),a=new t.QueriesObserver(i,s),[c,l]=o.createStore(a.getOptimisticResult(s)),d=a.subscribe((e=>{t.notifyManager.batchCalls((()=>{l(o.unwrap(e))}))()}));return r.onCleanup(d),r.onMount((()=>{a.setQueries(s,{listeners:!1})})),r.createComputed((()=>{const t=e().queries.map((e=>{const t=i.defaultQueryOptions(e);return t._optimisticResults="optimistic",t}));a.setQueries(t)})),c},e.createQuery=function(e,n){return l(r.createMemo((()=>e())),t.QueryObserver,n)},e.useIsFetching=function(e,t){const n=r.createMemo((()=>u(t?.()))),o=r.createMemo((()=>n().getQueryCache())),[i,s]=r.createSignal(n().isFetching(e?.())),a=o().subscribe((()=>{s(n().isFetching(e?.()))}));return r.onCleanup(a),i},e.useIsMutating=function(e,t){const n=r.createMemo((()=>u(t?.()))),o=r.createMemo((()=>n().getMutationCache())),[i,s]=r.createSignal(n().isMutating(e?.())),a=o().subscribe((t=>{s(n().isMutating(e?.()))}));return r.onCleanup(a),i},e.useQueryClient=u,Object.keys(t).forEach((function(r){"default"===r||e.hasOwnProperty(r)||Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[r]}})}))}));
2
2
  //# sourceMappingURL=index.js.map