@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.
- package/build/cjs/index.js +73 -34
- package/build/cjs/index.js.map +1 -1
- package/build/esm/index.js +75 -37
- package/build/esm/index.js.map +1 -1
- package/build/source/QueryClient.js +6 -0
- package/build/source/__tests__/QueryClientProvider.test.jsx +2 -1
- package/build/source/__tests__/createInfiniteQuery.test.jsx +67 -20
- package/build/source/__tests__/createMutation.test.jsx +19 -18
- package/build/source/__tests__/createQueries.test.jsx +4 -91
- package/build/source/__tests__/createQuery.test.jsx +62 -271
- package/build/source/__tests__/suspense.test.jsx +3 -64
- package/build/source/__tests__/useIsFetching.test.jsx +2 -4
- package/build/source/__tests__/useIsMutating.test.jsx +25 -28
- package/build/source/__tests__/utils.jsx +4 -3
- package/build/source/createBaseQuery.js +45 -19
- package/build/source/createQueries.js +5 -5
- package/build/source/index.js +1 -0
- package/build/source/useIsFetching.js +5 -5
- package/build/source/useIsMutating.js +5 -5
- package/build/types/QueryClient.d.ts +29 -0
- package/build/types/QueryClientProvider.d.ts +1 -1
- package/build/types/__tests__/utils.d.ts +3 -4
- package/build/types/createBaseQuery.d.ts +3 -2
- package/build/types/createInfiniteQuery.d.ts +4 -2
- package/build/types/createMutation.d.ts +4 -2
- package/build/types/createQueries.d.ts +5 -4
- package/build/types/createQuery.d.ts +2 -1
- package/build/types/index.d.ts +2 -0
- package/build/types/types.d.ts +2 -1
- package/build/types/useIsFetching.d.ts +3 -7
- package/build/types/useIsMutating.d.ts +3 -7
- package/build/umd/index.js +1 -1
- package/build/umd/index.js.map +1 -1
- package/package.json +5 -5
- package/src/QueryClient.ts +84 -0
- package/src/QueryClientProvider.tsx +1 -1
- package/src/__tests__/QueryClientProvider.test.tsx +2 -1
- package/src/__tests__/createInfiniteQuery.test.tsx +95 -34
- package/src/__tests__/createMutation.test.tsx +19 -18
- package/src/__tests__/createQueries.test.tsx +4 -97
- package/src/__tests__/createQuery.test.tsx +78 -344
- package/src/__tests__/suspense.test.tsx +3 -85
- package/src/__tests__/useIsFetching.test.tsx +2 -4
- package/src/__tests__/useIsMutating.test.tsx +32 -40
- package/src/__tests__/utils.tsx +4 -3
- package/src/createBaseQuery.ts +70 -25
- package/src/createInfiniteQuery.ts +3 -2
- package/src/createMutation.ts +4 -2
- package/src/createQueries.ts +9 -8
- package/src/createQuery.ts +4 -2
- package/src/index.ts +7 -0
- package/src/types.ts +4 -2
- package/src/useIsFetching.ts +10 -13
- 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
|
-
|
|
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 =
|
|
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 '
|
|
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
|
|
24
|
+
return vi.spyOn(document, 'visibilityState', 'get').mockReturnValue(value);
|
|
24
25
|
}
|
|
25
26
|
export function mockNavigatorOnLine(value) {
|
|
26
|
-
return
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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(
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
|
5
|
+
export function createQueries(queriesOptions, queryClient) {
|
|
6
|
+
const client = useQueryClient(queryClient?.());
|
|
7
7
|
const defaultedQueries = queriesOptions().queries.map((options) => {
|
|
8
|
-
const defaultedOptions =
|
|
8
|
+
const defaultedOptions = client.defaultQueryOptions(options);
|
|
9
9
|
defaultedOptions._optimisticResults = 'optimistic';
|
|
10
10
|
return defaultedOptions;
|
|
11
11
|
});
|
|
12
|
-
const observer = new QueriesObserver(
|
|
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 =
|
|
25
|
+
const defaultedOptions = client.defaultQueryOptions(options);
|
|
26
26
|
defaultedOptions._optimisticResults = 'optimistic';
|
|
27
27
|
return defaultedOptions;
|
|
28
28
|
});
|
package/build/source/index.js
CHANGED
|
@@ -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(
|
|
4
|
-
const
|
|
5
|
-
const queryCache = createMemo(() =>
|
|
6
|
-
const [fetches, setFetches] = createSignal(
|
|
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(
|
|
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(
|
|
4
|
-
const
|
|
5
|
-
const mutationCache = createMemo(() =>
|
|
6
|
-
const [mutations, setMutations] = createSignal(
|
|
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(
|
|
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 '
|
|
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 '
|
|
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):
|
|
12
|
-
export declare function mockNavigatorOnLine(value: boolean):
|
|
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 {
|
|
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?:
|
|
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,
|
|
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
|
-
|
|
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 {
|
|
1
|
+
import type { DefaultError } from '@tanstack/query-core';
|
|
2
|
+
import type { QueryClient } from './QueryClient';
|
|
2
3
|
import type { CreateMutationOptions, CreateMutationResult } from './types';
|
|
3
|
-
|
|
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,
|
|
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
|
-
|
|
50
|
-
}): QueriesResults<T>;
|
|
51
|
+
}>, queryClient?: Accessor<QueryClient>): QueriesResults<T>;
|
|
51
52
|
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
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;
|
package/build/types/index.d.ts
CHANGED
|
@@ -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';
|
package/build/types/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { QueryKey,
|
|
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 {
|
|
1
|
+
import type { QueryFilters } from '@tanstack/query-core';
|
|
2
|
+
import type { QueryClient } from './QueryClient';
|
|
2
3
|
import type { Accessor } from 'solid-js';
|
|
3
|
-
declare
|
|
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
|
|
1
|
+
import type { MutationFilters } from '@tanstack/query-core';
|
|
2
|
+
import type { QueryClient } from './QueryClient';
|
|
2
3
|
import type { Accessor } from 'solid-js';
|
|
3
|
-
declare
|
|
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>;
|
package/build/umd/index.js
CHANGED
|
@@ -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,
|
|
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
|