@tanstack/solid-query 5.30.2 → 5.30.4
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 +30 -29
- package/build/dev.js +30 -29
- package/build/index.cjs +30 -29
- package/build/index.js +30 -29
- package/package.json +1 -1
- package/src/createBaseQuery.ts +46 -53
package/build/dev.cjs
CHANGED
|
@@ -78,27 +78,23 @@ function reconcileFn(store$1, result, reconcileOption, queryHash) {
|
|
|
78
78
|
return { ...result, data: newData };
|
|
79
79
|
}
|
|
80
80
|
var hydratableObserverResult = (query, result) => {
|
|
81
|
-
|
|
82
|
-
return result;
|
|
83
|
-
return {
|
|
81
|
+
const obj = {
|
|
84
82
|
...store.unwrap(result),
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
refetch: void 0
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
fetchPreviousPage
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
// Unsetting these properties on the server since they might not be serializable
|
|
99
|
-
fetchFailureReason: null,
|
|
100
|
-
fetchMeta: null
|
|
83
|
+
// During SSR, functions cannot be serialized, so we need to remove them
|
|
84
|
+
// This is safe because we will add these functions back when the query is hydrated
|
|
85
|
+
refetch: void 0
|
|
86
|
+
};
|
|
87
|
+
if ("fetchNextPage" in result) {
|
|
88
|
+
obj.fetchNextPage = void 0;
|
|
89
|
+
obj.fetchPreviousPage = void 0;
|
|
90
|
+
}
|
|
91
|
+
obj.hydrationData = {
|
|
92
|
+
state: query.state,
|
|
93
|
+
queryKey: query.queryKey,
|
|
94
|
+
queryHash: query.queryHash,
|
|
95
|
+
...query.meta && { meta: query.meta }
|
|
101
96
|
};
|
|
97
|
+
return obj;
|
|
102
98
|
};
|
|
103
99
|
function createBaseQuery(options, Observer, queryClient) {
|
|
104
100
|
const client = solidJs.createMemo(() => exports.useQueryClient(queryClient?.()));
|
|
@@ -168,15 +164,21 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
168
164
|
if (typeof v === "function") {
|
|
169
165
|
v = v(unwrapped);
|
|
170
166
|
}
|
|
167
|
+
if (v.hydrationData) {
|
|
168
|
+
const { hydrationData, ...rest } = v;
|
|
169
|
+
v = rest;
|
|
170
|
+
}
|
|
171
171
|
setStateWithReconciliation(v);
|
|
172
172
|
}
|
|
173
173
|
];
|
|
174
174
|
}
|
|
175
175
|
let unsubscribe = null;
|
|
176
|
+
let resolver = null;
|
|
176
177
|
const [queryResource, { refetch }] = solidJs.createResource(
|
|
177
178
|
() => {
|
|
178
179
|
const obs = observer();
|
|
179
180
|
return new Promise((resolve, reject) => {
|
|
181
|
+
resolver = resolve;
|
|
180
182
|
if (web.isServer) {
|
|
181
183
|
unsubscribe = createServerSubscriber(resolve, reject);
|
|
182
184
|
} else if (!unsubscribe && !isRestoring()) {
|
|
@@ -191,8 +193,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
191
193
|
return reject(observerResult.error);
|
|
192
194
|
}
|
|
193
195
|
if (!observerResult.isLoading) {
|
|
194
|
-
|
|
195
|
-
return resolve(
|
|
196
|
+
resolver = null;
|
|
197
|
+
return resolve(observerResult);
|
|
196
198
|
}
|
|
197
199
|
setStateWithReconciliation(observerResult);
|
|
198
200
|
});
|
|
@@ -211,15 +213,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
211
213
|
* Note that this is only invoked on the client, for queries that were originally run on the server.
|
|
212
214
|
*/
|
|
213
215
|
onHydrated(_k, info) {
|
|
214
|
-
if (info.value) {
|
|
216
|
+
if (info.value && "hydrationData" in info.value) {
|
|
215
217
|
queryCore.hydrate(client(), {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
queryKey: initialOptions.queryKey,
|
|
219
|
-
queryHash: initialOptions.queryHash,
|
|
220
|
-
state: info.value
|
|
221
|
-
}
|
|
222
|
-
]
|
|
218
|
+
// @ts-expect-error - hydrationData is not correctly typed internally
|
|
219
|
+
queries: [{ ...info.value.hydrationData }]
|
|
223
220
|
});
|
|
224
221
|
}
|
|
225
222
|
if (unsubscribe)
|
|
@@ -270,6 +267,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
270
267
|
unsubscribe();
|
|
271
268
|
unsubscribe = null;
|
|
272
269
|
}
|
|
270
|
+
if (resolver && !web.isServer) {
|
|
271
|
+
resolver(observerResult);
|
|
272
|
+
resolver = null;
|
|
273
|
+
}
|
|
273
274
|
});
|
|
274
275
|
solidJs.createComputed(
|
|
275
276
|
solidJs.on(
|
package/build/dev.js
CHANGED
|
@@ -77,27 +77,23 @@ function reconcileFn(store, result, reconcileOption, queryHash) {
|
|
|
77
77
|
return { ...result, data: newData };
|
|
78
78
|
}
|
|
79
79
|
var hydratableObserverResult = (query, result) => {
|
|
80
|
-
|
|
81
|
-
return result;
|
|
82
|
-
return {
|
|
80
|
+
const obj = {
|
|
83
81
|
...unwrap(result),
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
refetch: void 0
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
fetchPreviousPage
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// Unsetting these properties on the server since they might not be serializable
|
|
98
|
-
fetchFailureReason: null,
|
|
99
|
-
fetchMeta: null
|
|
82
|
+
// During SSR, functions cannot be serialized, so we need to remove them
|
|
83
|
+
// This is safe because we will add these functions back when the query is hydrated
|
|
84
|
+
refetch: void 0
|
|
85
|
+
};
|
|
86
|
+
if ("fetchNextPage" in result) {
|
|
87
|
+
obj.fetchNextPage = void 0;
|
|
88
|
+
obj.fetchPreviousPage = void 0;
|
|
89
|
+
}
|
|
90
|
+
obj.hydrationData = {
|
|
91
|
+
state: query.state,
|
|
92
|
+
queryKey: query.queryKey,
|
|
93
|
+
queryHash: query.queryHash,
|
|
94
|
+
...query.meta && { meta: query.meta }
|
|
100
95
|
};
|
|
96
|
+
return obj;
|
|
101
97
|
};
|
|
102
98
|
function createBaseQuery(options, Observer, queryClient) {
|
|
103
99
|
const client = createMemo(() => useQueryClient(queryClient?.()));
|
|
@@ -167,15 +163,21 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
167
163
|
if (typeof v === "function") {
|
|
168
164
|
v = v(unwrapped);
|
|
169
165
|
}
|
|
166
|
+
if (v.hydrationData) {
|
|
167
|
+
const { hydrationData, ...rest } = v;
|
|
168
|
+
v = rest;
|
|
169
|
+
}
|
|
170
170
|
setStateWithReconciliation(v);
|
|
171
171
|
}
|
|
172
172
|
];
|
|
173
173
|
}
|
|
174
174
|
let unsubscribe = null;
|
|
175
|
+
let resolver = null;
|
|
175
176
|
const [queryResource, { refetch }] = createResource(
|
|
176
177
|
() => {
|
|
177
178
|
const obs = observer();
|
|
178
179
|
return new Promise((resolve, reject) => {
|
|
180
|
+
resolver = resolve;
|
|
179
181
|
if (isServer) {
|
|
180
182
|
unsubscribe = createServerSubscriber(resolve, reject);
|
|
181
183
|
} else if (!unsubscribe && !isRestoring()) {
|
|
@@ -190,8 +192,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
190
192
|
return reject(observerResult.error);
|
|
191
193
|
}
|
|
192
194
|
if (!observerResult.isLoading) {
|
|
193
|
-
|
|
194
|
-
return resolve(
|
|
195
|
+
resolver = null;
|
|
196
|
+
return resolve(observerResult);
|
|
195
197
|
}
|
|
196
198
|
setStateWithReconciliation(observerResult);
|
|
197
199
|
});
|
|
@@ -210,15 +212,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
210
212
|
* Note that this is only invoked on the client, for queries that were originally run on the server.
|
|
211
213
|
*/
|
|
212
214
|
onHydrated(_k, info) {
|
|
213
|
-
if (info.value) {
|
|
215
|
+
if (info.value && "hydrationData" in info.value) {
|
|
214
216
|
hydrate(client(), {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
queryKey: initialOptions.queryKey,
|
|
218
|
-
queryHash: initialOptions.queryHash,
|
|
219
|
-
state: info.value
|
|
220
|
-
}
|
|
221
|
-
]
|
|
217
|
+
// @ts-expect-error - hydrationData is not correctly typed internally
|
|
218
|
+
queries: [{ ...info.value.hydrationData }]
|
|
222
219
|
});
|
|
223
220
|
}
|
|
224
221
|
if (unsubscribe)
|
|
@@ -269,6 +266,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
269
266
|
unsubscribe();
|
|
270
267
|
unsubscribe = null;
|
|
271
268
|
}
|
|
269
|
+
if (resolver && !isServer) {
|
|
270
|
+
resolver(observerResult);
|
|
271
|
+
resolver = null;
|
|
272
|
+
}
|
|
272
273
|
});
|
|
273
274
|
createComputed(
|
|
274
275
|
on(
|
package/build/index.cjs
CHANGED
|
@@ -69,27 +69,23 @@ function reconcileFn(store$1, result, reconcileOption, queryHash) {
|
|
|
69
69
|
return { ...result, data: newData };
|
|
70
70
|
}
|
|
71
71
|
var hydratableObserverResult = (query, result) => {
|
|
72
|
-
|
|
73
|
-
return result;
|
|
74
|
-
return {
|
|
72
|
+
const obj = {
|
|
75
73
|
...store.unwrap(result),
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
refetch: void 0
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
fetchPreviousPage
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// Unsetting these properties on the server since they might not be serializable
|
|
90
|
-
fetchFailureReason: null,
|
|
91
|
-
fetchMeta: null
|
|
74
|
+
// During SSR, functions cannot be serialized, so we need to remove them
|
|
75
|
+
// This is safe because we will add these functions back when the query is hydrated
|
|
76
|
+
refetch: void 0
|
|
77
|
+
};
|
|
78
|
+
if ("fetchNextPage" in result) {
|
|
79
|
+
obj.fetchNextPage = void 0;
|
|
80
|
+
obj.fetchPreviousPage = void 0;
|
|
81
|
+
}
|
|
82
|
+
obj.hydrationData = {
|
|
83
|
+
state: query.state,
|
|
84
|
+
queryKey: query.queryKey,
|
|
85
|
+
queryHash: query.queryHash,
|
|
86
|
+
...query.meta && { meta: query.meta }
|
|
92
87
|
};
|
|
88
|
+
return obj;
|
|
93
89
|
};
|
|
94
90
|
function createBaseQuery(options, Observer, queryClient) {
|
|
95
91
|
const client = solidJs.createMemo(() => exports.useQueryClient(queryClient?.()));
|
|
@@ -159,15 +155,21 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
159
155
|
if (typeof v === "function") {
|
|
160
156
|
v = v(unwrapped);
|
|
161
157
|
}
|
|
158
|
+
if (v.hydrationData) {
|
|
159
|
+
const { hydrationData, ...rest } = v;
|
|
160
|
+
v = rest;
|
|
161
|
+
}
|
|
162
162
|
setStateWithReconciliation(v);
|
|
163
163
|
}
|
|
164
164
|
];
|
|
165
165
|
}
|
|
166
166
|
let unsubscribe = null;
|
|
167
|
+
let resolver = null;
|
|
167
168
|
const [queryResource, { refetch }] = solidJs.createResource(
|
|
168
169
|
() => {
|
|
169
170
|
const obs = observer();
|
|
170
171
|
return new Promise((resolve, reject) => {
|
|
172
|
+
resolver = resolve;
|
|
171
173
|
if (web.isServer) {
|
|
172
174
|
unsubscribe = createServerSubscriber(resolve, reject);
|
|
173
175
|
} else if (!unsubscribe && !isRestoring()) {
|
|
@@ -182,8 +184,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
182
184
|
return reject(observerResult.error);
|
|
183
185
|
}
|
|
184
186
|
if (!observerResult.isLoading) {
|
|
185
|
-
|
|
186
|
-
return resolve(
|
|
187
|
+
resolver = null;
|
|
188
|
+
return resolve(observerResult);
|
|
187
189
|
}
|
|
188
190
|
setStateWithReconciliation(observerResult);
|
|
189
191
|
});
|
|
@@ -202,15 +204,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
202
204
|
* Note that this is only invoked on the client, for queries that were originally run on the server.
|
|
203
205
|
*/
|
|
204
206
|
onHydrated(_k, info) {
|
|
205
|
-
if (info.value) {
|
|
207
|
+
if (info.value && "hydrationData" in info.value) {
|
|
206
208
|
queryCore.hydrate(client(), {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
queryKey: initialOptions.queryKey,
|
|
210
|
-
queryHash: initialOptions.queryHash,
|
|
211
|
-
state: info.value
|
|
212
|
-
}
|
|
213
|
-
]
|
|
209
|
+
// @ts-expect-error - hydrationData is not correctly typed internally
|
|
210
|
+
queries: [{ ...info.value.hydrationData }]
|
|
214
211
|
});
|
|
215
212
|
}
|
|
216
213
|
if (unsubscribe)
|
|
@@ -261,6 +258,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
261
258
|
unsubscribe();
|
|
262
259
|
unsubscribe = null;
|
|
263
260
|
}
|
|
261
|
+
if (resolver && !web.isServer) {
|
|
262
|
+
resolver(observerResult);
|
|
263
|
+
resolver = null;
|
|
264
|
+
}
|
|
264
265
|
});
|
|
265
266
|
solidJs.createComputed(
|
|
266
267
|
solidJs.on(
|
package/build/index.js
CHANGED
|
@@ -68,27 +68,23 @@ function reconcileFn(store, result, reconcileOption, queryHash) {
|
|
|
68
68
|
return { ...result, data: newData };
|
|
69
69
|
}
|
|
70
70
|
var hydratableObserverResult = (query, result) => {
|
|
71
|
-
|
|
72
|
-
return result;
|
|
73
|
-
return {
|
|
71
|
+
const obj = {
|
|
74
72
|
...unwrap(result),
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
refetch: void 0
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
fetchPreviousPage
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
// Unsetting these properties on the server since they might not be serializable
|
|
89
|
-
fetchFailureReason: null,
|
|
90
|
-
fetchMeta: null
|
|
73
|
+
// During SSR, functions cannot be serialized, so we need to remove them
|
|
74
|
+
// This is safe because we will add these functions back when the query is hydrated
|
|
75
|
+
refetch: void 0
|
|
76
|
+
};
|
|
77
|
+
if ("fetchNextPage" in result) {
|
|
78
|
+
obj.fetchNextPage = void 0;
|
|
79
|
+
obj.fetchPreviousPage = void 0;
|
|
80
|
+
}
|
|
81
|
+
obj.hydrationData = {
|
|
82
|
+
state: query.state,
|
|
83
|
+
queryKey: query.queryKey,
|
|
84
|
+
queryHash: query.queryHash,
|
|
85
|
+
...query.meta && { meta: query.meta }
|
|
91
86
|
};
|
|
87
|
+
return obj;
|
|
92
88
|
};
|
|
93
89
|
function createBaseQuery(options, Observer, queryClient) {
|
|
94
90
|
const client = createMemo(() => useQueryClient(queryClient?.()));
|
|
@@ -158,15 +154,21 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
158
154
|
if (typeof v === "function") {
|
|
159
155
|
v = v(unwrapped);
|
|
160
156
|
}
|
|
157
|
+
if (v.hydrationData) {
|
|
158
|
+
const { hydrationData, ...rest } = v;
|
|
159
|
+
v = rest;
|
|
160
|
+
}
|
|
161
161
|
setStateWithReconciliation(v);
|
|
162
162
|
}
|
|
163
163
|
];
|
|
164
164
|
}
|
|
165
165
|
let unsubscribe = null;
|
|
166
|
+
let resolver = null;
|
|
166
167
|
const [queryResource, { refetch }] = createResource(
|
|
167
168
|
() => {
|
|
168
169
|
const obs = observer();
|
|
169
170
|
return new Promise((resolve, reject) => {
|
|
171
|
+
resolver = resolve;
|
|
170
172
|
if (isServer) {
|
|
171
173
|
unsubscribe = createServerSubscriber(resolve, reject);
|
|
172
174
|
} else if (!unsubscribe && !isRestoring()) {
|
|
@@ -181,8 +183,8 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
181
183
|
return reject(observerResult.error);
|
|
182
184
|
}
|
|
183
185
|
if (!observerResult.isLoading) {
|
|
184
|
-
|
|
185
|
-
return resolve(
|
|
186
|
+
resolver = null;
|
|
187
|
+
return resolve(observerResult);
|
|
186
188
|
}
|
|
187
189
|
setStateWithReconciliation(observerResult);
|
|
188
190
|
});
|
|
@@ -201,15 +203,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
201
203
|
* Note that this is only invoked on the client, for queries that were originally run on the server.
|
|
202
204
|
*/
|
|
203
205
|
onHydrated(_k, info) {
|
|
204
|
-
if (info.value) {
|
|
206
|
+
if (info.value && "hydrationData" in info.value) {
|
|
205
207
|
hydrate(client(), {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
queryKey: initialOptions.queryKey,
|
|
209
|
-
queryHash: initialOptions.queryHash,
|
|
210
|
-
state: info.value
|
|
211
|
-
}
|
|
212
|
-
]
|
|
208
|
+
// @ts-expect-error - hydrationData is not correctly typed internally
|
|
209
|
+
queries: [{ ...info.value.hydrationData }]
|
|
213
210
|
});
|
|
214
211
|
}
|
|
215
212
|
if (unsubscribe)
|
|
@@ -260,6 +257,10 @@ function createBaseQuery(options, Observer, queryClient) {
|
|
|
260
257
|
unsubscribe();
|
|
261
258
|
unsubscribe = null;
|
|
262
259
|
}
|
|
260
|
+
if (resolver && !isServer) {
|
|
261
|
+
resolver(observerResult);
|
|
262
|
+
resolver = null;
|
|
263
|
+
}
|
|
263
264
|
});
|
|
264
265
|
createComputed(
|
|
265
266
|
on(
|
package/package.json
CHANGED
package/src/createBaseQuery.ts
CHANGED
|
@@ -19,12 +19,10 @@ import type { CreateBaseQueryOptions } from './types'
|
|
|
19
19
|
import type { Accessor, Signal } from 'solid-js'
|
|
20
20
|
import type { QueryClient } from './QueryClient'
|
|
21
21
|
import type {
|
|
22
|
-
InfiniteQueryObserverResult,
|
|
23
22
|
Query,
|
|
24
23
|
QueryKey,
|
|
25
24
|
QueryObserver,
|
|
26
25
|
QueryObserverResult,
|
|
27
|
-
QueryState,
|
|
28
26
|
} from '@tanstack/query-core'
|
|
29
27
|
|
|
30
28
|
function reconcileFn<TData, TError>(
|
|
@@ -62,10 +60,6 @@ function reconcileFn<TData, TError>(
|
|
|
62
60
|
return { ...result, data: newData } as typeof result
|
|
63
61
|
}
|
|
64
62
|
|
|
65
|
-
type HydratableQueryState<TData, TError> = QueryObserverResult<TData, TError> &
|
|
66
|
-
QueryState<TData, TError> &
|
|
67
|
-
InfiniteQueryObserverResult<TData, TError>
|
|
68
|
-
|
|
69
63
|
/**
|
|
70
64
|
* Solid's `onHydrated` functionality will silently "fail" (hydrate with an empty object)
|
|
71
65
|
* if the resource data is not serializable.
|
|
@@ -80,42 +74,29 @@ const hydratableObserverResult = <
|
|
|
80
74
|
query: Query<TQueryFnData, TError, TData, TQueryKey>,
|
|
81
75
|
result: QueryObserverResult<TDataHydratable, TError>,
|
|
82
76
|
) => {
|
|
83
|
-
|
|
84
|
-
if (!isServer) return result as HydratableQueryState<TDataHydratable, TError>
|
|
85
|
-
|
|
86
|
-
return {
|
|
77
|
+
const obj: any = {
|
|
87
78
|
...unwrap(result),
|
|
79
|
+
// During SSR, functions cannot be serialized, so we need to remove them
|
|
80
|
+
// This is safe because we will add these functions back when the query is hydrated
|
|
81
|
+
refetch: undefined,
|
|
82
|
+
}
|
|
88
83
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
>['refetch'],
|
|
95
|
-
|
|
96
|
-
// cast to fetchNextPage function should be safe, since we only remove it on the server,
|
|
97
|
-
fetchNextPage: undefined as unknown as HydratableQueryState<
|
|
98
|
-
TDataHydratable,
|
|
99
|
-
TError
|
|
100
|
-
>['fetchNextPage'],
|
|
101
|
-
|
|
102
|
-
// cast to fetchPreviousPage function should be safe, since we only remove it on the server,
|
|
103
|
-
fetchPreviousPage: undefined as unknown as HydratableQueryState<
|
|
104
|
-
TDataHydratable,
|
|
105
|
-
TError
|
|
106
|
-
>['fetchPreviousPage'],
|
|
84
|
+
// If the query is an infinite query, we need to remove additional properties
|
|
85
|
+
if ('fetchNextPage' in result) {
|
|
86
|
+
obj.fetchNextPage = undefined
|
|
87
|
+
obj.fetchPreviousPage = undefined
|
|
88
|
+
}
|
|
107
89
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
90
|
+
// We will also attach the dehydrated state of the query to the result
|
|
91
|
+
// This will be removed on client after hydration
|
|
92
|
+
obj.hydrationData = {
|
|
93
|
+
state: query.state,
|
|
94
|
+
queryKey: query.queryKey,
|
|
95
|
+
queryHash: query.queryHash,
|
|
96
|
+
...(query.meta && { meta: query.meta }),
|
|
97
|
+
}
|
|
114
98
|
|
|
115
|
-
|
|
116
|
-
fetchFailureReason: null,
|
|
117
|
-
fetchMeta: null,
|
|
118
|
-
} as HydratableQueryState<TDataHydratable, TError>
|
|
99
|
+
return obj
|
|
119
100
|
}
|
|
120
101
|
|
|
121
102
|
// Base Query Function that is used to create the query.
|
|
@@ -132,9 +113,7 @@ export function createBaseQuery<
|
|
|
132
113
|
Observer: typeof QueryObserver,
|
|
133
114
|
queryClient?: Accessor<QueryClient>,
|
|
134
115
|
) {
|
|
135
|
-
type ResourceData =
|
|
136
|
-
| HydratableQueryState<TData, TError>
|
|
137
|
-
| QueryObserverResult<TData, TError>
|
|
116
|
+
type ResourceData = QueryObserverResult<TData, TError>
|
|
138
117
|
|
|
139
118
|
const client = createMemo(() => useQueryClient(queryClient?.()))
|
|
140
119
|
const isRestoring = useIsRestoring()
|
|
@@ -221,12 +200,18 @@ export function createBaseQuery<
|
|
|
221
200
|
function createDeepSignal<T>(): Signal<T> {
|
|
222
201
|
return [
|
|
223
202
|
() => state,
|
|
224
|
-
(v:
|
|
203
|
+
(v: any) => {
|
|
225
204
|
const unwrapped = unwrap(state)
|
|
226
205
|
if (typeof v === 'function') {
|
|
227
206
|
v = v(unwrapped)
|
|
228
207
|
}
|
|
229
|
-
|
|
208
|
+
// Hydration data exists on first load after SSR,
|
|
209
|
+
// and should be removed from the observer result
|
|
210
|
+
if (v.hydrationData) {
|
|
211
|
+
const { hydrationData, ...rest } = v
|
|
212
|
+
v = rest
|
|
213
|
+
}
|
|
214
|
+
setStateWithReconciliation(v)
|
|
230
215
|
},
|
|
231
216
|
] as Signal<T>
|
|
232
217
|
}
|
|
@@ -236,10 +221,19 @@ export function createBaseQuery<
|
|
|
236
221
|
*/
|
|
237
222
|
let unsubscribe: (() => void) | null = null
|
|
238
223
|
|
|
224
|
+
/*
|
|
225
|
+
Fixes #7275
|
|
226
|
+
In a few cases, the observer could unmount before the resource is loaded.
|
|
227
|
+
This leads to Suspense boundaries to be suspended indefinitely.
|
|
228
|
+
This resolver will be called when the observer is unmounting
|
|
229
|
+
but the resource is still in a loading state
|
|
230
|
+
*/
|
|
231
|
+
let resolver: ((value: ResourceData) => void) | null = null
|
|
239
232
|
const [queryResource, { refetch }] = createResource<ResourceData | undefined>(
|
|
240
233
|
() => {
|
|
241
234
|
const obs = observer()
|
|
242
235
|
return new Promise((resolve, reject) => {
|
|
236
|
+
resolver = resolve
|
|
243
237
|
if (isServer) {
|
|
244
238
|
unsubscribe = createServerSubscriber(resolve, reject)
|
|
245
239
|
} else if (!unsubscribe && !isRestoring()) {
|
|
@@ -260,8 +254,8 @@ export function createBaseQuery<
|
|
|
260
254
|
return reject(observerResult.error)
|
|
261
255
|
}
|
|
262
256
|
if (!observerResult.isLoading) {
|
|
263
|
-
|
|
264
|
-
return resolve(
|
|
257
|
+
resolver = null
|
|
258
|
+
return resolve(observerResult)
|
|
265
259
|
}
|
|
266
260
|
|
|
267
261
|
setStateWithReconciliation(observerResult)
|
|
@@ -283,15 +277,10 @@ export function createBaseQuery<
|
|
|
283
277
|
* Note that this is only invoked on the client, for queries that were originally run on the server.
|
|
284
278
|
*/
|
|
285
279
|
onHydrated(_k, info) {
|
|
286
|
-
if (info.value) {
|
|
280
|
+
if (info.value && 'hydrationData' in info.value) {
|
|
287
281
|
hydrate(client(), {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
queryKey: initialOptions.queryKey,
|
|
291
|
-
queryHash: initialOptions.queryHash,
|
|
292
|
-
state: info.value,
|
|
293
|
-
},
|
|
294
|
-
],
|
|
282
|
+
// @ts-expect-error - hydrationData is not correctly typed internally
|
|
283
|
+
queries: [{ ...info.value.hydrationData }],
|
|
295
284
|
})
|
|
296
285
|
}
|
|
297
286
|
|
|
@@ -354,6 +343,10 @@ export function createBaseQuery<
|
|
|
354
343
|
unsubscribe()
|
|
355
344
|
unsubscribe = null
|
|
356
345
|
}
|
|
346
|
+
if (resolver && !isServer) {
|
|
347
|
+
resolver(observerResult)
|
|
348
|
+
resolver = null
|
|
349
|
+
}
|
|
357
350
|
})
|
|
358
351
|
|
|
359
352
|
createComputed(
|