Skip to content

Commit 65f9f12

Browse files
committed
fix: match query key correctly when setting defaults
1 parent 4e762db commit 65f9f12

File tree

6 files changed

+39
-21
lines changed

6 files changed

+39
-21
lines changed

src/core/queryClient.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
QueryFilters,
33
Updater,
4+
hashQueryKey,
45
noop,
56
parseFilterArgs,
67
parseQueryArgs,
@@ -303,8 +304,8 @@ export class QueryClient {
303304
queryKey: QueryKey,
304305
options: QueryOptions<any, any, any>
305306
): void {
306-
const result = this.queryDefaults.find(x =>
307-
partialMatchKey(x.queryKey, queryKey)
307+
const result = this.queryDefaults.find(
308+
x => hashQueryKey(queryKey) === hashQueryKey(x.queryKey)
308309
)
309310
if (result) {
310311
result.defaultOptions = options
@@ -316,16 +317,16 @@ export class QueryClient {
316317
getQueryDefaults(
317318
queryKey: QueryKey
318319
): QueryOptions<any, any, any> | undefined {
319-
return this.queryDefaults.find(x => partialMatchKey(x.queryKey, queryKey))
320+
return this.queryDefaults.find(x => partialMatchKey(queryKey, x.queryKey))
320321
?.defaultOptions
321322
}
322323

323324
setMutationDefaults(
324325
mutationKey: MutationKey,
325326
options: MutationOptions<any, any, any, any>
326327
): void {
327-
const result = this.mutationDefaults.find(x =>
328-
partialMatchKey(x.mutationKey, mutationKey)
328+
const result = this.mutationDefaults.find(
329+
x => hashQueryKey(mutationKey) === hashQueryKey(x.mutationKey)
329330
)
330331
if (result) {
331332
result.defaultOptions = options
@@ -338,7 +339,7 @@ export class QueryClient {
338339
mutationKey: MutationKey
339340
): MutationOptions<any, any, any, any> | undefined {
340341
return this.mutationDefaults.find(x =>
341-
partialMatchKey(x.mutationKey, mutationKey)
342+
partialMatchKey(mutationKey, x.mutationKey)
342343
)?.defaultOptions
343344
}
344345

src/core/queryObserver.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,12 +236,16 @@ export class QueryObserver<
236236
this.updateQuery()
237237

238238
// Fetch
239-
return this.currentQuery
240-
.fetch(
241-
this.options as QueryOptions<TQueryData, TError, TQueryFnData>,
242-
fetchOptions
243-
)
244-
.catch(noop)
239+
let promise: Promise<TQueryData | undefined> = this.currentQuery.fetch(
240+
this.options as QueryOptions<TQueryData, TError, TQueryFnData>,
241+
fetchOptions
242+
)
243+
244+
if (!fetchOptions?.throwOnError) {
245+
promise = promise.catch(noop)
246+
}
247+
248+
return promise
245249
}
246250

247251
private updateStaleTimeout(): void {

src/core/tests/queryCache.test.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,21 @@ describe('queryCache', () => {
3030
})
3131

3232
test('setQueryDefaults should be able to override defaults', async () => {
33-
const consoleMock = mockConsoleError()
3433
const key = queryKey()
35-
const queryFn = jest.fn().mockRejectedValue('reject')
36-
queryClient.setQueryDefaults(key, { queryFn, retry: 1 })
34+
queryClient.setQueryDefaults(key, { queryFn: () => 'data' })
3735
const observer = new QueryObserver(queryClient, { queryKey: key })
38-
const { error } = await observer.getNextResult({ throwOnError: false })
39-
expect(error).toBe('reject')
40-
expect(queryFn).toHaveBeenCalledTimes(2)
41-
consoleMock.mockRestore()
36+
const { data } = await observer.refetch()
37+
expect(data).toBe('data')
38+
})
39+
40+
test('setQueryDefaults should match the query key partially', async () => {
41+
const key = queryKey()
42+
queryClient.setQueryDefaults([key], { queryFn: () => 'data' })
43+
const observer = new QueryObserver(queryClient, {
44+
queryKey: [key, 'a'],
45+
})
46+
const { data } = await observer.refetch()
47+
expect(data).toBe('data')
4248
})
4349

4450
test('setQueryData does not crash if query could not be found', () => {

src/core/tests/utils.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ describe('core/utils', () => {
6262
const b = { a: { b: 'b' }, c: 'c', d: [{ d: 'd ' }] }
6363
expect(partialDeepEqual(a, b)).toEqual(false)
6464
})
65+
66+
it('should return `true` if array a includes array b', () => {
67+
const a = [1, 2, 3]
68+
const b = [1, 2]
69+
expect(partialDeepEqual(a, b)).toEqual(true)
70+
})
6571
})
6672

6773
describe('replaceEqualDeep', () => {

src/core/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export function partialDeepEqual(a: any, b: any): boolean {
241241
return false
242242
}
243243

244-
if (typeof a === 'object') {
244+
if (typeof a === 'object' && typeof b === 'object') {
245245
return !Object.keys(b).some(key => !partialDeepEqual(a[key], b[key]))
246246
}
247247

src/react/useBaseQuery.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ export function useBaseQuery<TData, TError, TQueryFnData, TQueryData>(
7575
observer.willFetchOnMount()
7676
) {
7777
errorResetBoundary.clearReset()
78-
throw observer.getNextResult({ throwOnError: true })
78+
const unsubscribe = observer.subscribe()
79+
throw observer.refetch().finally(unsubscribe)
7980
}
8081
}
8182

0 commit comments

Comments
 (0)