@tanstack/solid-query 5.17.19 → 5.18.1
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/dev.cjs +8 -8
- package/build/dev.js +8 -8
- package/build/index.cjs +8 -8
- package/build/index.d.cts +8 -8
- package/build/index.d.ts +8 -8
- package/build/index.js +8 -8
- package/package.json +2 -2
- package/src/__tests__/createQuery.test.tsx +6 -6
- package/src/__tests__/createQuery.types.test.tsx +3 -3
- package/src/__tests__/suspense.test.tsx +5 -3
- package/src/__tests__/useIsFetching.test.tsx +6 -6
- package/src/__tests__/useIsMutating.test.tsx +9 -9
- package/src/createBaseQuery.ts +14 -14
- package/src/createQueries.ts +15 -15
- package/src/types.ts +5 -1
package/build/dev.cjs
CHANGED
|
@@ -60,7 +60,7 @@ function reconcileFn(store$1, result, reconcileOption) {
|
|
|
60
60
|
const newData = store.reconcile(result.data, { key: reconcileOption })(store$1.data);
|
|
61
61
|
return { ...result, data: newData };
|
|
62
62
|
}
|
|
63
|
-
var
|
|
63
|
+
var hydratableObserverResult = (query, result) => {
|
|
64
64
|
if (!web.isServer)
|
|
65
65
|
return result;
|
|
66
66
|
return {
|
|
@@ -106,7 +106,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
106
106
|
return observer().subscribe((result) => {
|
|
107
107
|
queryCore.notifyManager.batchCalls(() => {
|
|
108
108
|
const query = observer().getCurrentQuery();
|
|
109
|
-
const unwrappedResult =
|
|
109
|
+
const unwrappedResult = hydratableObserverResult(query, result);
|
|
110
110
|
if (unwrappedResult.isError) {
|
|
111
111
|
reject(unwrappedResult.error);
|
|
112
112
|
} else {
|
|
@@ -146,7 +146,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
146
146
|
obs.updateResult();
|
|
147
147
|
if (!state.isLoading && !isRestoring()) {
|
|
148
148
|
const query = obs.getCurrentQuery();
|
|
149
|
-
resolve(
|
|
149
|
+
resolve(hydratableObserverResult(query, state));
|
|
150
150
|
}
|
|
151
151
|
});
|
|
152
152
|
},
|
|
@@ -196,8 +196,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
196
196
|
solidJs.on(
|
|
197
197
|
[isRestoring, observer],
|
|
198
198
|
([restoring]) => {
|
|
199
|
-
const
|
|
200
|
-
queueMicrotask(() =>
|
|
199
|
+
const _unsubscribe = unsubscribe;
|
|
200
|
+
queueMicrotask(() => _unsubscribe?.());
|
|
201
201
|
unsubscribe = null;
|
|
202
202
|
if (!restoring)
|
|
203
203
|
refetch();
|
|
@@ -469,9 +469,9 @@ function createQueries(queriesOptions, queryClient) {
|
|
|
469
469
|
const getProxies = () => state.map((s, index) => {
|
|
470
470
|
return new Proxy(s, handler(index));
|
|
471
471
|
});
|
|
472
|
-
const [
|
|
473
|
-
solidJs.createRenderEffect(() =>
|
|
474
|
-
return
|
|
472
|
+
const [proxyState, setProxyState] = store.createStore(getProxies());
|
|
473
|
+
solidJs.createRenderEffect(() => setProxyState(getProxies()));
|
|
474
|
+
return proxyState;
|
|
475
475
|
}
|
|
476
476
|
|
|
477
477
|
exports.createInfiniteQuery = createInfiniteQuery;
|
package/build/dev.js
CHANGED
|
@@ -59,7 +59,7 @@ function reconcileFn(store, result, reconcileOption) {
|
|
|
59
59
|
const newData = reconcile(result.data, { key: reconcileOption })(store.data);
|
|
60
60
|
return { ...result, data: newData };
|
|
61
61
|
}
|
|
62
|
-
var
|
|
62
|
+
var hydratableObserverResult = (query, result) => {
|
|
63
63
|
if (!isServer)
|
|
64
64
|
return result;
|
|
65
65
|
return {
|
|
@@ -105,7 +105,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
105
105
|
return observer().subscribe((result) => {
|
|
106
106
|
notifyManager.batchCalls(() => {
|
|
107
107
|
const query = observer().getCurrentQuery();
|
|
108
|
-
const unwrappedResult =
|
|
108
|
+
const unwrappedResult = hydratableObserverResult(query, result);
|
|
109
109
|
if (unwrappedResult.isError) {
|
|
110
110
|
reject(unwrappedResult.error);
|
|
111
111
|
} else {
|
|
@@ -145,7 +145,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
145
145
|
obs.updateResult();
|
|
146
146
|
if (!state.isLoading && !isRestoring()) {
|
|
147
147
|
const query = obs.getCurrentQuery();
|
|
148
|
-
resolve(
|
|
148
|
+
resolve(hydratableObserverResult(query, state));
|
|
149
149
|
}
|
|
150
150
|
});
|
|
151
151
|
},
|
|
@@ -195,8 +195,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
195
195
|
on(
|
|
196
196
|
[isRestoring, observer],
|
|
197
197
|
([restoring]) => {
|
|
198
|
-
const
|
|
199
|
-
queueMicrotask(() =>
|
|
198
|
+
const _unsubscribe = unsubscribe;
|
|
199
|
+
queueMicrotask(() => _unsubscribe?.());
|
|
200
200
|
unsubscribe = null;
|
|
201
201
|
if (!restoring)
|
|
202
202
|
refetch();
|
|
@@ -468,9 +468,9 @@ function createQueries(queriesOptions, queryClient) {
|
|
|
468
468
|
const getProxies = () => state.map((s, index) => {
|
|
469
469
|
return new Proxy(s, handler(index));
|
|
470
470
|
});
|
|
471
|
-
const [
|
|
472
|
-
createRenderEffect(() =>
|
|
473
|
-
return
|
|
471
|
+
const [proxyState, setProxyState] = createStore(getProxies());
|
|
472
|
+
createRenderEffect(() => setProxyState(getProxies()));
|
|
473
|
+
return proxyState;
|
|
474
474
|
}
|
|
475
475
|
|
|
476
476
|
export { IsRestoringProvider, QueryClient, QueryClientContext, QueryClientProvider, createInfiniteQuery, createMutation, createQueries, createQuery, queryOptions, useIsFetching, useIsMutating, useIsRestoring, useMutationState, useQueryClient };
|
package/build/index.cjs
CHANGED
|
@@ -60,7 +60,7 @@ function reconcileFn(store$1, result, reconcileOption) {
|
|
|
60
60
|
const newData = store.reconcile(result.data, { key: reconcileOption })(store$1.data);
|
|
61
61
|
return { ...result, data: newData };
|
|
62
62
|
}
|
|
63
|
-
var
|
|
63
|
+
var hydratableObserverResult = (query, result) => {
|
|
64
64
|
if (!web.isServer)
|
|
65
65
|
return result;
|
|
66
66
|
return {
|
|
@@ -106,7 +106,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
106
106
|
return observer().subscribe((result) => {
|
|
107
107
|
queryCore.notifyManager.batchCalls(() => {
|
|
108
108
|
const query = observer().getCurrentQuery();
|
|
109
|
-
const unwrappedResult =
|
|
109
|
+
const unwrappedResult = hydratableObserverResult(query, result);
|
|
110
110
|
if (unwrappedResult.isError) {
|
|
111
111
|
reject(unwrappedResult.error);
|
|
112
112
|
} else {
|
|
@@ -146,7 +146,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
146
146
|
obs.updateResult();
|
|
147
147
|
if (!state.isLoading && !isRestoring()) {
|
|
148
148
|
const query = obs.getCurrentQuery();
|
|
149
|
-
resolve(
|
|
149
|
+
resolve(hydratableObserverResult(query, state));
|
|
150
150
|
}
|
|
151
151
|
});
|
|
152
152
|
},
|
|
@@ -196,8 +196,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
196
196
|
solidJs.on(
|
|
197
197
|
[isRestoring, observer],
|
|
198
198
|
([restoring]) => {
|
|
199
|
-
const
|
|
200
|
-
queueMicrotask(() =>
|
|
199
|
+
const _unsubscribe = unsubscribe;
|
|
200
|
+
queueMicrotask(() => _unsubscribe?.());
|
|
201
201
|
unsubscribe = null;
|
|
202
202
|
if (!restoring)
|
|
203
203
|
refetch();
|
|
@@ -469,9 +469,9 @@ function createQueries(queriesOptions, queryClient) {
|
|
|
469
469
|
const getProxies = () => state.map((s, index) => {
|
|
470
470
|
return new Proxy(s, handler(index));
|
|
471
471
|
});
|
|
472
|
-
const [
|
|
473
|
-
solidJs.createRenderEffect(() =>
|
|
474
|
-
return
|
|
472
|
+
const [proxyState, setProxyState] = store.createStore(getProxies());
|
|
473
|
+
solidJs.createRenderEffect(() => setProxyState(getProxies()));
|
|
474
|
+
return proxyState;
|
|
475
475
|
}
|
|
476
476
|
|
|
477
477
|
exports.createInfiniteQuery = createInfiniteQuery;
|
package/build/index.d.cts
CHANGED
|
@@ -59,8 +59,8 @@ type CreateBaseMutationResult<TData = unknown, TError = DefaultError, TVariables
|
|
|
59
59
|
mutateAsync: CreateMutateAsyncFunction<TData, TError, TVariables, TContext>;
|
|
60
60
|
};
|
|
61
61
|
type CreateMutationResult<TData = unknown, TError = DefaultError, TVariables = unknown, TContext = unknown> = CreateBaseMutationResult<TData, TError, TVariables, TContext>;
|
|
62
|
-
type Override<
|
|
63
|
-
[
|
|
62
|
+
type Override<TTargetA, TTargetB> = {
|
|
63
|
+
[AKey in keyof TTargetA]: AKey extends keyof TTargetB ? TTargetB[AKey] : TTargetA[AKey];
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
type UndefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = FunctionedParams<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
|
|
@@ -139,25 +139,25 @@ type GetResults<T> = T extends {
|
|
|
139
139
|
/**
|
|
140
140
|
* QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
|
|
141
141
|
*/
|
|
142
|
-
type QueriesOptions<T extends Array<any>,
|
|
142
|
+
type QueriesOptions<T extends Array<any>, TResult extends Array<any> = [], TDepth extends ReadonlyArray<number> = []> = TDepth['length'] extends MAXIMUM_DEPTH ? Array<CreateQueryOptionsForCreateQueries> : T extends [] ? [] : T extends [infer Head] ? [...TResult, GetOptions<Head>] : T extends [infer Head, ...infer Tail] ? QueriesOptions<[
|
|
143
143
|
...Tail
|
|
144
144
|
], [
|
|
145
|
-
...
|
|
145
|
+
...TResult,
|
|
146
146
|
GetOptions<Head>
|
|
147
147
|
], [
|
|
148
|
-
...
|
|
148
|
+
...TDepth,
|
|
149
149
|
1
|
|
150
150
|
]> : Array<unknown> extends T ? T : T extends Array<CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, infer TQueryKey>> ? Array<CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData, TQueryKey>> : Array<CreateQueryOptionsForCreateQueries>;
|
|
151
151
|
/**
|
|
152
152
|
* QueriesResults reducer recursively maps type param to results
|
|
153
153
|
*/
|
|
154
|
-
type QueriesResults<T extends Array<any>,
|
|
154
|
+
type QueriesResults<T extends Array<any>, TResult extends Array<any> = [], TDepth extends ReadonlyArray<number> = []> = TDepth['length'] extends MAXIMUM_DEPTH ? Array<CreateQueryResult> : T extends [] ? [] : T extends [infer Head] ? [...TResult, GetResults<Head>] : T extends [infer Head, ...infer Tail] ? QueriesResults<[
|
|
155
155
|
...Tail
|
|
156
156
|
], [
|
|
157
|
-
...
|
|
157
|
+
...TResult,
|
|
158
158
|
GetResults<Head>
|
|
159
159
|
], [
|
|
160
|
-
...
|
|
160
|
+
...TDepth,
|
|
161
161
|
1
|
|
162
162
|
]> : T extends Array<CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, any>> ? Array<CreateQueryResult<unknown extends TData ? TQueryFnData : TData, unknown extends TError ? DefaultError : TError>> : Array<CreateQueryResult>;
|
|
163
163
|
declare function createQueries<T extends Array<any>, TCombinedResult extends QueriesResults<T> = QueriesResults<T>>(queriesOptions: Accessor<{
|
package/build/index.d.ts
CHANGED
|
@@ -59,8 +59,8 @@ type CreateBaseMutationResult<TData = unknown, TError = DefaultError, TVariables
|
|
|
59
59
|
mutateAsync: CreateMutateAsyncFunction<TData, TError, TVariables, TContext>;
|
|
60
60
|
};
|
|
61
61
|
type CreateMutationResult<TData = unknown, TError = DefaultError, TVariables = unknown, TContext = unknown> = CreateBaseMutationResult<TData, TError, TVariables, TContext>;
|
|
62
|
-
type Override<
|
|
63
|
-
[
|
|
62
|
+
type Override<TTargetA, TTargetB> = {
|
|
63
|
+
[AKey in keyof TTargetA]: AKey extends keyof TTargetB ? TTargetB[AKey] : TTargetA[AKey];
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
type UndefinedInitialDataOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = FunctionedParams<SolidQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
|
|
@@ -139,25 +139,25 @@ type GetResults<T> = T extends {
|
|
|
139
139
|
/**
|
|
140
140
|
* QueriesOptions reducer recursively unwraps function arguments to infer/enforce type param
|
|
141
141
|
*/
|
|
142
|
-
type QueriesOptions<T extends Array<any>,
|
|
142
|
+
type QueriesOptions<T extends Array<any>, TResult extends Array<any> = [], TDepth extends ReadonlyArray<number> = []> = TDepth['length'] extends MAXIMUM_DEPTH ? Array<CreateQueryOptionsForCreateQueries> : T extends [] ? [] : T extends [infer Head] ? [...TResult, GetOptions<Head>] : T extends [infer Head, ...infer Tail] ? QueriesOptions<[
|
|
143
143
|
...Tail
|
|
144
144
|
], [
|
|
145
|
-
...
|
|
145
|
+
...TResult,
|
|
146
146
|
GetOptions<Head>
|
|
147
147
|
], [
|
|
148
|
-
...
|
|
148
|
+
...TDepth,
|
|
149
149
|
1
|
|
150
150
|
]> : Array<unknown> extends T ? T : T extends Array<CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, infer TQueryKey>> ? Array<CreateQueryOptionsForCreateQueries<TQueryFnData, TError, TData, TQueryKey>> : Array<CreateQueryOptionsForCreateQueries>;
|
|
151
151
|
/**
|
|
152
152
|
* QueriesResults reducer recursively maps type param to results
|
|
153
153
|
*/
|
|
154
|
-
type QueriesResults<T extends Array<any>,
|
|
154
|
+
type QueriesResults<T extends Array<any>, TResult extends Array<any> = [], TDepth extends ReadonlyArray<number> = []> = TDepth['length'] extends MAXIMUM_DEPTH ? Array<CreateQueryResult> : T extends [] ? [] : T extends [infer Head] ? [...TResult, GetResults<Head>] : T extends [infer Head, ...infer Tail] ? QueriesResults<[
|
|
155
155
|
...Tail
|
|
156
156
|
], [
|
|
157
|
-
...
|
|
157
|
+
...TResult,
|
|
158
158
|
GetResults<Head>
|
|
159
159
|
], [
|
|
160
|
-
...
|
|
160
|
+
...TDepth,
|
|
161
161
|
1
|
|
162
162
|
]> : T extends Array<CreateQueryOptionsForCreateQueries<infer TQueryFnData, infer TError, infer TData, any>> ? Array<CreateQueryResult<unknown extends TData ? TQueryFnData : TData, unknown extends TError ? DefaultError : TError>> : Array<CreateQueryResult>;
|
|
163
163
|
declare function createQueries<T extends Array<any>, TCombinedResult extends QueriesResults<T> = QueriesResults<T>>(queriesOptions: Accessor<{
|
package/build/index.js
CHANGED
|
@@ -59,7 +59,7 @@ function reconcileFn(store, result, reconcileOption) {
|
|
|
59
59
|
const newData = reconcile(result.data, { key: reconcileOption })(store.data);
|
|
60
60
|
return { ...result, data: newData };
|
|
61
61
|
}
|
|
62
|
-
var
|
|
62
|
+
var hydratableObserverResult = (query, result) => {
|
|
63
63
|
if (!isServer)
|
|
64
64
|
return result;
|
|
65
65
|
return {
|
|
@@ -105,7 +105,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
105
105
|
return observer().subscribe((result) => {
|
|
106
106
|
notifyManager.batchCalls(() => {
|
|
107
107
|
const query = observer().getCurrentQuery();
|
|
108
|
-
const unwrappedResult =
|
|
108
|
+
const unwrappedResult = hydratableObserverResult(query, result);
|
|
109
109
|
if (unwrappedResult.isError) {
|
|
110
110
|
reject(unwrappedResult.error);
|
|
111
111
|
} else {
|
|
@@ -145,7 +145,7 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
145
145
|
obs.updateResult();
|
|
146
146
|
if (!state.isLoading && !isRestoring()) {
|
|
147
147
|
const query = obs.getCurrentQuery();
|
|
148
|
-
resolve(
|
|
148
|
+
resolve(hydratableObserverResult(query, state));
|
|
149
149
|
}
|
|
150
150
|
});
|
|
151
151
|
},
|
|
@@ -195,8 +195,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
195
195
|
on(
|
|
196
196
|
[isRestoring, observer],
|
|
197
197
|
([restoring]) => {
|
|
198
|
-
const
|
|
199
|
-
queueMicrotask(() =>
|
|
198
|
+
const _unsubscribe = unsubscribe;
|
|
199
|
+
queueMicrotask(() => _unsubscribe?.());
|
|
200
200
|
unsubscribe = null;
|
|
201
201
|
if (!restoring)
|
|
202
202
|
refetch();
|
|
@@ -468,9 +468,9 @@ function createQueries(queriesOptions, queryClient) {
|
|
|
468
468
|
const getProxies = () => state.map((s, index) => {
|
|
469
469
|
return new Proxy(s, handler(index));
|
|
470
470
|
});
|
|
471
|
-
const [
|
|
472
|
-
createRenderEffect(() =>
|
|
473
|
-
return
|
|
471
|
+
const [proxyState, setProxyState] = createStore(getProxies());
|
|
472
|
+
createRenderEffect(() => setProxyState(getProxies()));
|
|
473
|
+
return proxyState;
|
|
474
474
|
}
|
|
475
475
|
|
|
476
476
|
export { IsRestoringProvider, QueryClient, QueryClientContext, QueryClientProvider, createInfiniteQuery, createMutation, createQueries, createQuery, queryOptions, useIsFetching, useIsMutating, useIsRestoring, useMutationState, useQueryClient };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-query",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.18.1",
|
|
4
4
|
"description": "Primitives for managing, caching and syncing asynchronous and remote data in Solid",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"solid-js": "^1.8.7",
|
|
51
|
-
"@tanstack/query-core": "5.
|
|
51
|
+
"@tanstack/query-core": "5.18.1"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"tsup-preset-solid": "^2.2.0",
|
|
@@ -1214,7 +1214,7 @@ describe('createQuery', () => {
|
|
|
1214
1214
|
})
|
|
1215
1215
|
})
|
|
1216
1216
|
|
|
1217
|
-
it('should not update disabled query when
|
|
1217
|
+
it('should not update disabled query when refetch with refetchQueries', async () => {
|
|
1218
1218
|
const key = queryKey()
|
|
1219
1219
|
const states: Array<CreateQueryResult<number>> = []
|
|
1220
1220
|
let count = 0
|
|
@@ -1941,7 +1941,7 @@ describe('createQuery', () => {
|
|
|
1941
1941
|
await sleep(20)
|
|
1942
1942
|
|
|
1943
1943
|
// Since components are rendered once
|
|
1944
|
-
// There
|
|
1944
|
+
// There will only be one pass
|
|
1945
1945
|
expect(renders).toBe(1)
|
|
1946
1946
|
})
|
|
1947
1947
|
|
|
@@ -2215,7 +2215,7 @@ describe('createQuery', () => {
|
|
|
2215
2215
|
expect(states[3]).toMatchObject({ data: 1, isFetching: false })
|
|
2216
2216
|
})
|
|
2217
2217
|
|
|
2218
|
-
it('should calculate focus
|
|
2218
|
+
it('should calculate focus behavior for refetchOnWindowFocus depending on function', async () => {
|
|
2219
2219
|
const key = queryKey()
|
|
2220
2220
|
const states: Array<CreateQueryResult<number>> = []
|
|
2221
2221
|
let count = 0
|
|
@@ -2364,7 +2364,7 @@ describe('createQuery', () => {
|
|
|
2364
2364
|
const state = createQuery(() => ({
|
|
2365
2365
|
queryKey: key,
|
|
2366
2366
|
queryFn: () => {
|
|
2367
|
-
return Promise.reject(new Error('Error test
|
|
2367
|
+
return Promise.reject(new Error('Error test'))
|
|
2368
2368
|
},
|
|
2369
2369
|
retry: false,
|
|
2370
2370
|
}))
|
|
@@ -2384,7 +2384,7 @@ describe('createQuery', () => {
|
|
|
2384
2384
|
))
|
|
2385
2385
|
|
|
2386
2386
|
await waitFor(() => rendered.getByText('error'))
|
|
2387
|
-
await waitFor(() => rendered.getByText('Error test
|
|
2387
|
+
await waitFor(() => rendered.getByText('Error test'))
|
|
2388
2388
|
|
|
2389
2389
|
consoleMock.mockRestore()
|
|
2390
2390
|
})
|
|
@@ -2399,7 +2399,7 @@ describe('createQuery', () => {
|
|
|
2399
2399
|
function Page() {
|
|
2400
2400
|
const state = createQuery(() => ({
|
|
2401
2401
|
queryKey: key,
|
|
2402
|
-
queryFn: () => Promise.reject(new Error('Error test
|
|
2402
|
+
queryFn: () => Promise.reject(new Error('Error test')),
|
|
2403
2403
|
retry: false,
|
|
2404
2404
|
throwOnError: true,
|
|
2405
2405
|
}))
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { describe, it } from 'vitest'
|
|
2
2
|
import { createQuery, queryOptions } from '../index'
|
|
3
3
|
|
|
4
|
-
export type Equal<
|
|
5
|
-
|
|
6
|
-
>() => T extends
|
|
4
|
+
export type Equal<TTargetA, TTargetB> = (<T>() => T extends TTargetA
|
|
5
|
+
? 1
|
|
6
|
+
: 2) extends <T>() => T extends TTargetB ? 1 : 2
|
|
7
7
|
? true
|
|
8
8
|
: false
|
|
9
9
|
|
|
@@ -121,6 +121,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
121
121
|
|
|
122
122
|
await waitFor(() => rendered.getByText('data: 1'))
|
|
123
123
|
|
|
124
|
+
// eslint-disable-next-line @cspell/spellchecker
|
|
124
125
|
// TODO(lukemurray): in react this is 1 in solid this is 2 because suspense
|
|
125
126
|
// occurs on read.
|
|
126
127
|
expect(states.length).toBe(2)
|
|
@@ -132,6 +133,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
132
133
|
fireEvent.click(rendered.getByText('next'))
|
|
133
134
|
await waitFor(() => rendered.getByText('data: 2'))
|
|
134
135
|
|
|
136
|
+
// eslint-disable-next-line @cspell/spellchecker
|
|
135
137
|
// TODO(lukemurray): in react this is 2 and in solid it is 4
|
|
136
138
|
expect(states.length).toBe(4)
|
|
137
139
|
expect(states[3]).toMatchObject({
|
|
@@ -705,7 +707,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
705
707
|
expect(queryFn).toHaveBeenCalledTimes(1)
|
|
706
708
|
})
|
|
707
709
|
|
|
708
|
-
it('should error
|
|
710
|
+
it('should error caught in error boundary without infinite loop', async () => {
|
|
709
711
|
const key = queryKey()
|
|
710
712
|
|
|
711
713
|
const consoleMock = vi
|
|
@@ -776,7 +778,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
776
778
|
consoleMock.mockRestore()
|
|
777
779
|
})
|
|
778
780
|
|
|
779
|
-
it('should error
|
|
781
|
+
it('should error caught in error boundary without infinite loop when query keys changed', async () => {
|
|
780
782
|
let succeed = true
|
|
781
783
|
|
|
782
784
|
const consoleMock = vi
|
|
@@ -840,7 +842,7 @@ describe("useQuery's in Suspense mode", () => {
|
|
|
840
842
|
consoleMock.mockRestore()
|
|
841
843
|
})
|
|
842
844
|
|
|
843
|
-
it('should error
|
|
845
|
+
it('should error caught in error boundary without infinite loop when enabled changed', async () => {
|
|
844
846
|
const consoleMock = vi
|
|
845
847
|
.spyOn(console, 'error')
|
|
846
848
|
.mockImplementation(() => undefined)
|
|
@@ -59,12 +59,12 @@ describe('useIsFetching', () => {
|
|
|
59
59
|
const key1 = queryKey()
|
|
60
60
|
const key2 = queryKey()
|
|
61
61
|
|
|
62
|
-
const
|
|
62
|
+
const isFetchingArray: Array<number> = []
|
|
63
63
|
|
|
64
64
|
function IsFetching() {
|
|
65
65
|
const isFetching = useIsFetching()
|
|
66
66
|
createRenderEffect(() => {
|
|
67
|
-
|
|
67
|
+
isFetchingArray.push(isFetching())
|
|
68
68
|
})
|
|
69
69
|
return null
|
|
70
70
|
}
|
|
@@ -117,7 +117,7 @@ describe('useIsFetching', () => {
|
|
|
117
117
|
</QueryClientProvider>
|
|
118
118
|
))
|
|
119
119
|
// unlike react, Updating renderSecond wont cause a rerender for FirstQuery
|
|
120
|
-
await waitFor(() => expect(
|
|
120
|
+
await waitFor(() => expect(isFetchingArray).toEqual([0, 1, 2, 1, 0]))
|
|
121
121
|
})
|
|
122
122
|
|
|
123
123
|
it('should be able to filter', async () => {
|
|
@@ -125,7 +125,7 @@ describe('useIsFetching', () => {
|
|
|
125
125
|
const key1 = queryKey()
|
|
126
126
|
const key2 = queryKey()
|
|
127
127
|
|
|
128
|
-
const
|
|
128
|
+
const isFetchingArray: Array<number> = []
|
|
129
129
|
|
|
130
130
|
function One() {
|
|
131
131
|
createQuery(() => ({
|
|
@@ -156,7 +156,7 @@ describe('useIsFetching', () => {
|
|
|
156
156
|
}))
|
|
157
157
|
|
|
158
158
|
createRenderEffect(() => {
|
|
159
|
-
|
|
159
|
+
isFetchingArray.push(isFetching())
|
|
160
160
|
})
|
|
161
161
|
|
|
162
162
|
return (
|
|
@@ -184,7 +184,7 @@ describe('useIsFetching', () => {
|
|
|
184
184
|
await rendered.findByText('isFetching: 1')
|
|
185
185
|
await rendered.findByText('isFetching: 0')
|
|
186
186
|
// at no point should we have isFetching: 2
|
|
187
|
-
expect(
|
|
187
|
+
expect(isFetchingArray).toEqual(expect.not.arrayContaining([2]))
|
|
188
188
|
})
|
|
189
189
|
|
|
190
190
|
it('should show the correct fetching state when mounted after a query', async () => {
|
|
@@ -7,13 +7,13 @@ import { createQueryClient, setActTimeout, sleep } from './utils'
|
|
|
7
7
|
|
|
8
8
|
describe('useIsMutating', () => {
|
|
9
9
|
it('should return the number of fetching mutations', async () => {
|
|
10
|
-
const
|
|
10
|
+
const isMutatingArray: Array<number> = []
|
|
11
11
|
const queryClient = createQueryClient()
|
|
12
12
|
|
|
13
13
|
function IsMutating() {
|
|
14
14
|
const isMutating = useIsMutating()
|
|
15
15
|
createRenderEffect(() => {
|
|
16
|
-
|
|
16
|
+
isMutatingArray.push(isMutating())
|
|
17
17
|
})
|
|
18
18
|
return null
|
|
19
19
|
}
|
|
@@ -58,17 +58,17 @@ describe('useIsMutating', () => {
|
|
|
58
58
|
<Page />
|
|
59
59
|
</QueryClientProvider>
|
|
60
60
|
))
|
|
61
|
-
await waitFor(() => expect(
|
|
61
|
+
await waitFor(() => expect(isMutatingArray).toEqual([0, 1, 2, 1, 0]))
|
|
62
62
|
})
|
|
63
63
|
|
|
64
64
|
it('should filter correctly by mutationKey', async () => {
|
|
65
|
-
const
|
|
65
|
+
const isMutatingArray: Array<number> = []
|
|
66
66
|
const queryClient = createQueryClient()
|
|
67
67
|
|
|
68
68
|
function IsMutating() {
|
|
69
69
|
const isMutating = useIsMutating(() => ({ mutationKey: ['mutation1'] }))
|
|
70
70
|
createRenderEffect(() => {
|
|
71
|
-
|
|
71
|
+
isMutatingArray.push(isMutating())
|
|
72
72
|
})
|
|
73
73
|
return null
|
|
74
74
|
}
|
|
@@ -103,11 +103,11 @@ describe('useIsMutating', () => {
|
|
|
103
103
|
</QueryClientProvider>
|
|
104
104
|
))
|
|
105
105
|
// Unlike React, IsMutating Wont re-render twice with mutation2
|
|
106
|
-
await waitFor(() => expect(
|
|
106
|
+
await waitFor(() => expect(isMutatingArray).toEqual([0, 1, 0]))
|
|
107
107
|
})
|
|
108
108
|
|
|
109
109
|
it('should filter correctly by predicate', async () => {
|
|
110
|
-
const
|
|
110
|
+
const isMutatingArray: Array<number> = []
|
|
111
111
|
const queryClient = createQueryClient()
|
|
112
112
|
|
|
113
113
|
function IsMutating() {
|
|
@@ -116,7 +116,7 @@ describe('useIsMutating', () => {
|
|
|
116
116
|
mutation.options.mutationKey?.[0] === 'mutation1',
|
|
117
117
|
}))
|
|
118
118
|
createRenderEffect(() => {
|
|
119
|
-
|
|
119
|
+
isMutatingArray.push(isMutating())
|
|
120
120
|
})
|
|
121
121
|
return null
|
|
122
122
|
}
|
|
@@ -152,7 +152,7 @@ describe('useIsMutating', () => {
|
|
|
152
152
|
))
|
|
153
153
|
|
|
154
154
|
// Again, No unnecessary re-renders like React
|
|
155
|
-
await waitFor(() => expect(
|
|
155
|
+
await waitFor(() => expect(isMutatingArray).toEqual([0, 1, 0]))
|
|
156
156
|
})
|
|
157
157
|
|
|
158
158
|
it('should use provided custom queryClient', async () => {
|
package/src/createBaseQuery.ts
CHANGED
|
@@ -46,33 +46,33 @@ function reconcileFn<TData, TError>(
|
|
|
46
46
|
return { ...result, data: newData } as typeof result
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
type
|
|
49
|
+
type HydratableQueryState<TData, TError> = QueryObserverResult<TData, TError> &
|
|
50
50
|
QueryState<TData, TError>
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
53
|
* Solid's `onHydrated` functionality will silently "fail" (hydrate with an empty object)
|
|
54
54
|
* if the resource data is not serializable.
|
|
55
55
|
*/
|
|
56
|
-
const
|
|
56
|
+
const hydratableObserverResult = <
|
|
57
57
|
TQueryFnData,
|
|
58
58
|
TError,
|
|
59
59
|
TData,
|
|
60
60
|
TQueryKey extends QueryKey,
|
|
61
|
-
|
|
61
|
+
TDataHydratable,
|
|
62
62
|
>(
|
|
63
63
|
query: Query<TQueryFnData, TError, TData, TQueryKey>,
|
|
64
|
-
result: QueryObserverResult<
|
|
65
|
-
):
|
|
64
|
+
result: QueryObserverResult<TDataHydratable, TError>,
|
|
65
|
+
): HydratableQueryState<TDataHydratable, TError> => {
|
|
66
66
|
// Including the extra properties is only relevant on the server
|
|
67
|
-
if (!isServer) return result as
|
|
67
|
+
if (!isServer) return result as HydratableQueryState<TDataHydratable, TError>
|
|
68
68
|
|
|
69
69
|
return {
|
|
70
70
|
...unwrap(result),
|
|
71
71
|
|
|
72
72
|
// cast to refetch function should be safe, since we only remove it on the server,
|
|
73
73
|
// and refetch is not relevant on the server
|
|
74
|
-
refetch: undefined as unknown as
|
|
75
|
-
|
|
74
|
+
refetch: undefined as unknown as HydratableQueryState<
|
|
75
|
+
TDataHydratable,
|
|
76
76
|
TError
|
|
77
77
|
>['refetch'],
|
|
78
78
|
|
|
@@ -104,7 +104,7 @@ export function createBaseQuery<
|
|
|
104
104
|
queryClient?: Accessor<QueryClient>,
|
|
105
105
|
) {
|
|
106
106
|
type ResourceData =
|
|
107
|
-
|
|
|
107
|
+
| HydratableQueryState<TData, TError>
|
|
108
108
|
| QueryObserverResult<TData, TError>
|
|
109
109
|
|
|
110
110
|
const client = createMemo(() => useQueryClient(queryClient?.()))
|
|
@@ -144,7 +144,7 @@ export function createBaseQuery<
|
|
|
144
144
|
return observer().subscribe((result) => {
|
|
145
145
|
notifyManager.batchCalls(() => {
|
|
146
146
|
const query = observer().getCurrentQuery()
|
|
147
|
-
const unwrappedResult =
|
|
147
|
+
const unwrappedResult = hydratableObserverResult(query, result)
|
|
148
148
|
|
|
149
149
|
if (unwrappedResult.isError) {
|
|
150
150
|
reject(unwrappedResult.error)
|
|
@@ -170,7 +170,7 @@ export function createBaseQuery<
|
|
|
170
170
|
reconcileOptions === undefined ? false : reconcileOptions,
|
|
171
171
|
)
|
|
172
172
|
})
|
|
173
|
-
// If the query has data we
|
|
173
|
+
// If the query has data we don't suspend but instead mutate the resource
|
|
174
174
|
// This could happen when placeholderData/initialData is defined
|
|
175
175
|
if (
|
|
176
176
|
queryResource()?.data &&
|
|
@@ -203,7 +203,7 @@ export function createBaseQuery<
|
|
|
203
203
|
|
|
204
204
|
if (!state.isLoading && !isRestoring()) {
|
|
205
205
|
const query = obs.getCurrentQuery()
|
|
206
|
-
resolve(
|
|
206
|
+
resolve(hydratableObserverResult(query, state))
|
|
207
207
|
}
|
|
208
208
|
})
|
|
209
209
|
},
|
|
@@ -263,8 +263,8 @@ export function createBaseQuery<
|
|
|
263
263
|
on(
|
|
264
264
|
[isRestoring, observer],
|
|
265
265
|
([restoring]) => {
|
|
266
|
-
const
|
|
267
|
-
queueMicrotask(() =>
|
|
266
|
+
const _unsubscribe = unsubscribe
|
|
267
|
+
queueMicrotask(() => _unsubscribe?.())
|
|
268
268
|
unsubscribe = null
|
|
269
269
|
if (!restoring) refetch()
|
|
270
270
|
},
|
package/src/createQueries.ts
CHANGED
|
@@ -131,19 +131,19 @@ type GetResults<T> =
|
|
|
131
131
|
*/
|
|
132
132
|
type QueriesOptions<
|
|
133
133
|
T extends Array<any>,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
> =
|
|
134
|
+
TResult extends Array<any> = [],
|
|
135
|
+
TDepth extends ReadonlyArray<number> = [],
|
|
136
|
+
> = TDepth['length'] extends MAXIMUM_DEPTH
|
|
137
137
|
? Array<CreateQueryOptionsForCreateQueries>
|
|
138
138
|
: T extends []
|
|
139
139
|
? []
|
|
140
140
|
: T extends [infer Head]
|
|
141
|
-
? [...
|
|
141
|
+
? [...TResult, GetOptions<Head>]
|
|
142
142
|
: T extends [infer Head, ...infer Tail]
|
|
143
143
|
? QueriesOptions<
|
|
144
144
|
[...Tail],
|
|
145
|
-
[...
|
|
146
|
-
[...
|
|
145
|
+
[...TResult, GetOptions<Head>],
|
|
146
|
+
[...TDepth, 1]
|
|
147
147
|
>
|
|
148
148
|
: Array<unknown> extends T
|
|
149
149
|
? T
|
|
@@ -173,19 +173,19 @@ type QueriesOptions<
|
|
|
173
173
|
*/
|
|
174
174
|
type QueriesResults<
|
|
175
175
|
T extends Array<any>,
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
> =
|
|
176
|
+
TResult extends Array<any> = [],
|
|
177
|
+
TDepth extends ReadonlyArray<number> = [],
|
|
178
|
+
> = TDepth['length'] extends MAXIMUM_DEPTH
|
|
179
179
|
? Array<CreateQueryResult>
|
|
180
180
|
: T extends []
|
|
181
181
|
? []
|
|
182
182
|
: T extends [infer Head]
|
|
183
|
-
? [...
|
|
183
|
+
? [...TResult, GetResults<Head>]
|
|
184
184
|
: T extends [infer Head, ...infer Tail]
|
|
185
185
|
? QueriesResults<
|
|
186
186
|
[...Tail],
|
|
187
|
-
[...
|
|
188
|
-
[...
|
|
187
|
+
[...TResult, GetResults<Head>],
|
|
188
|
+
[...TDepth, 1]
|
|
189
189
|
>
|
|
190
190
|
: T extends Array<
|
|
191
191
|
CreateQueryOptionsForCreateQueries<
|
|
@@ -354,8 +354,8 @@ export function createQueries<
|
|
|
354
354
|
return new Proxy(s, handler(index))
|
|
355
355
|
})
|
|
356
356
|
|
|
357
|
-
const [
|
|
358
|
-
createRenderEffect(() =>
|
|
357
|
+
const [proxyState, setProxyState] = createStore(getProxies())
|
|
358
|
+
createRenderEffect(() => setProxyState(getProxies()))
|
|
359
359
|
|
|
360
|
-
return
|
|
360
|
+
return proxyState as TCombinedResult
|
|
361
361
|
}
|
package/src/types.ts
CHANGED
|
@@ -174,4 +174,8 @@ export type CreateMutationResult<
|
|
|
174
174
|
TContext = unknown,
|
|
175
175
|
> = CreateBaseMutationResult<TData, TError, TVariables, TContext>
|
|
176
176
|
|
|
177
|
-
type Override<
|
|
177
|
+
type Override<TTargetA, TTargetB> = {
|
|
178
|
+
[AKey in keyof TTargetA]: AKey extends keyof TTargetB
|
|
179
|
+
? TTargetB[AKey]
|
|
180
|
+
: TTargetA[AKey]
|
|
181
|
+
}
|