Skip to content

Commit 8c373d2

Browse files
authored
fix: all Promise rejections must be Errors (#4843)
* fix: make sure all promise rejections are Errors because our default TError type is now Error * fix: make sure all promise rejections are Errors because our default TError type is now Error * remove string promise rejection I can't say I fully understand this code, but whatever we reject here does not land up in our reducer because we have already rejected with a CancelledError the rejection here is just necessary to stop further pages from fetching after the AbortSignal has been consumed * fix another test * fix types * fix createQuery tests
1 parent 63943c6 commit 8c373d2

File tree

12 files changed

+118
-117
lines changed

12 files changed

+118
-117
lines changed

packages/query-core/src/infiniteQueryBehavior.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export function infiniteQueryBehavior<
4444

4545
// Get query function
4646
const queryFn =
47-
context.options.queryFn || (() => Promise.reject('Missing queryFn'))
47+
context.options.queryFn ||
48+
(() => Promise.reject(new Error('Missing queryFn')))
4849

4950
const buildNewPages = (
5051
pages: unknown[],
@@ -66,7 +67,7 @@ export function infiniteQueryBehavior<
6667
previous?: boolean,
6768
): Promise<unknown[]> => {
6869
if (cancelled) {
69-
return Promise.reject('Cancelled')
70+
return Promise.reject()
7071
}
7172

7273
if (typeof param === 'undefined' && !manual && pages.length) {

packages/query-core/src/mutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ export class Mutation<
162162
this.#retryer = createRetryer({
163163
fn: () => {
164164
if (!this.options.mutationFn) {
165-
return Promise.reject('No mutationFn found')
165+
return Promise.reject(new Error('No mutationFn found'))
166166
}
167167
return this.options.mutationFn(this.state.variables!)
168168
},

packages/query-core/src/query.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ export class Query<
389389
// Create fetch function
390390
const fetchFn = () => {
391391
if (!this.options.queryFn) {
392-
return Promise.reject('Missing queryFn')
392+
return Promise.reject(new Error('Missing queryFn'))
393393
}
394394
this.#abortSignalConsumed = false
395395
return this.options.queryFn(

packages/query-core/src/tests/hydration.test.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ describe('dehydration and rehydration', () => {
347347

348348
const serverAddTodo = jest
349349
.fn()
350-
.mockImplementation(() => Promise.reject('offline'))
350+
.mockImplementation(() => Promise.reject(new Error('offline')))
351351
const serverOnMutate = jest.fn().mockImplementation((variables) => {
352352
const optimisticTodo = { id: 1, text: variables.text }
353353
return { optimisticTodo }
@@ -424,7 +424,7 @@ describe('dehydration and rehydration', () => {
424424

425425
const serverAddTodo = jest
426426
.fn()
427-
.mockImplementation(() => Promise.reject('offline'))
427+
.mockImplementation(() => Promise.reject(new Error('offline')))
428428

429429
const queryClient = createQueryClient()
430430

@@ -453,7 +453,7 @@ describe('dehydration and rehydration', () => {
453453

454454
const serverAddTodo = jest
455455
.fn()
456-
.mockImplementation(() => Promise.reject('offline'))
456+
.mockImplementation(() => Promise.reject(new Error('offline')))
457457

458458
const queryClient = createQueryClient()
459459

packages/query-core/src/tests/infiniteQueryBehavior.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describe('InfiniteQueryBehavior', () => {
3737
await waitFor(() => {
3838
return expect(observerResult).toMatchObject({
3939
isError: true,
40-
error: 'Missing queryFn',
40+
error: new Error('Missing queryFn'),
4141
})
4242
})
4343

packages/query-core/src/tests/mutationCache.test.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ describe('mutationCache', () => {
1414
await executeMutation(testClient, {
1515
mutationKey: key,
1616
variables: 'vars',
17-
mutationFn: () => Promise.reject('error'),
17+
mutationFn: () => Promise.reject(new Error('error')),
1818
onMutate: () => 'context',
1919
})
2020
} catch {}
2121

2222
const mutation = testCache.getAll()[0]
23-
expect(onError).toHaveBeenCalledWith('error', 'vars', 'context', mutation)
23+
expect(onError).toHaveBeenCalledWith(
24+
new Error('error'),
25+
'vars',
26+
'context',
27+
mutation,
28+
)
2429
})
2530

2631
test('should be awaited', async () => {
@@ -38,7 +43,7 @@ describe('mutationCache', () => {
3843
await executeMutation(testClient, {
3944
mutationKey: key,
4045
variables: 'vars',
41-
mutationFn: () => Promise.reject('error'),
46+
mutationFn: () => Promise.reject(new Error('error')),
4247
onError: async () => {
4348
states.push(3)
4449
await sleep(1)

packages/query-core/src/tests/mutations.test.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ describe('mutations', () => {
153153
const mutation = new MutationObserver(queryClient, {
154154
mutationFn: async () => {
155155
await sleep(20)
156-
return Promise.reject('err')
156+
return Promise.reject(new Error('err'))
157157
},
158158
onMutate: (text) => text,
159159
variables: 'todo',
@@ -214,7 +214,7 @@ describe('mutations', () => {
214214
data: undefined,
215215
error: null,
216216
failureCount: 1,
217-
failureReason: 'err',
217+
failureReason: new Error('err'),
218218
isError: false,
219219
isIdle: false,
220220
isLoading: true,
@@ -231,9 +231,9 @@ describe('mutations', () => {
231231
expect(states[3]).toEqual({
232232
context: 'todo',
233233
data: undefined,
234-
error: 'err',
234+
error: new Error('err'),
235235
failureCount: 2,
236-
failureReason: 'err',
236+
failureReason: new Error('err'),
237237
isError: true,
238238
isIdle: false,
239239
isLoading: false,
@@ -340,6 +340,6 @@ describe('mutations', () => {
340340
} catch (err) {
341341
error = err
342342
}
343-
expect(error).toEqual('No mutationFn found')
343+
expect(error).toEqual(new Error('No mutationFn found'))
344344
})
345345
})

packages/query-core/src/tests/query.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ describe('query', () => {
761761

762762
const unsubscribe = observer.subscribe(() => undefined)
763763
await sleep(10)
764-
expect(mockLogger.error).toHaveBeenCalledWith('Missing queryFn')
764+
expect(mockLogger.error).toHaveBeenCalledWith(new Error('Missing queryFn'))
765765

766766
unsubscribe()
767767
})

packages/react-query/src/__tests__/useMutation.test.tsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ describe('useMutation', () => {
154154
const mutateFn = jest.fn<Promise<Value>, [value: Value]>()
155155

156156
mutateFn.mockImplementationOnce(() => {
157-
return Promise.reject('Error test Jonas')
157+
return Promise.reject(new Error('Error test Jonas'))
158158
})
159159

160160
mutateFn.mockImplementation(async (value) => {
@@ -163,18 +163,16 @@ describe('useMutation', () => {
163163
})
164164

165165
function Page() {
166-
const { mutate, failureCount, failureReason, data, status } = useMutation<
167-
Value,
168-
string,
169-
Value
170-
>({ mutationFn: mutateFn })
166+
const { mutate, failureCount, failureReason, data, status } = useMutation(
167+
{ mutationFn: mutateFn },
168+
)
171169

172170
return (
173171
<div>
174172
<h1>Data {data?.count}</h1>
175173
<h2>Status {status}</h2>
176174
<h2>Failed {failureCount} times</h2>
177-
<h2>Failed because {failureReason ?? 'null'}</h2>
175+
<h2>Failed because {failureReason?.message ?? 'null'}</h2>
178176
<button onClick={() => mutate({ count: ++count })}>mutate</button>
179177
</div>
180178
)
@@ -318,7 +316,7 @@ describe('useMutation', () => {
318316

319317
function Page() {
320318
const { mutateAsync } = useMutation({
321-
mutationFn: async (_text: string) => Promise.reject('oops'),
319+
mutationFn: async (_text: string) => Promise.reject(new Error('oops')),
322320
onError: async () => {
323321
callbacks.push('useMutation.onError')
324322
},
@@ -339,7 +337,7 @@ describe('useMutation', () => {
339337
},
340338
})
341339
} catch (error) {
342-
callbacks.push(`mutateAsync.error:${error}`)
340+
callbacks.push(`mutateAsync.error:${(error as Error).message}`)
343341
}
344342
}, 10)
345343
}, [mutateAsync])
@@ -405,7 +403,7 @@ describe('useMutation', () => {
405403
const { mutate } = useMutation({
406404
mutationFn: (_text: string) => {
407405
count++
408-
return Promise.reject('oops')
406+
return Promise.reject(new Error('oops'))
409407
},
410408
retry: 1,
411409
retryDelay: 5,
@@ -594,7 +592,9 @@ describe('useMutation', () => {
594592
mutationFn: async (_text: string) => {
595593
await sleep(1)
596594
count++
597-
return count > 1 ? Promise.resolve('data') : Promise.reject('oops')
595+
return count > 1
596+
? Promise.resolve('data')
597+
: Promise.reject(new Error('oops'))
598598
},
599599
retry: 1,
600600
retryDelay: 5,
@@ -635,13 +635,13 @@ describe('useMutation', () => {
635635
isLoading: true,
636636
isPaused: false,
637637
failureCount: 1,
638-
failureReason: 'oops',
638+
failureReason: new Error('oops'),
639639
})
640640
expect(states[3]).toMatchObject({
641641
isLoading: true,
642642
isPaused: true,
643643
failureCount: 1,
644-
failureReason: 'oops',
644+
failureReason: new Error('oops'),
645645
})
646646

647647
onlineMock.mockReturnValue(true)
@@ -654,7 +654,7 @@ describe('useMutation', () => {
654654
isLoading: true,
655655
isPaused: false,
656656
failureCount: 1,
657-
failureReason: 'oops',
657+
failureReason: new Error('oops'),
658658
})
659659
expect(states[5]).toMatchObject({
660660
isLoading: false,

0 commit comments

Comments
 (0)