Skip to content

Commit 5ec40d8

Browse files
authored
Merge pull request #4315 from rkofman/master
2 parents 3e021de + e22da96 commit 5ec40d8

File tree

3 files changed

+54
-7
lines changed

3 files changed

+54
-7
lines changed

packages/toolkit/src/query/defaultSerializeQueryArgs.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,25 @@ export const defaultSerializeQueryArgs: SerializeQueryArgs<any> = ({
1717
if (typeof cached === 'string') {
1818
serialized = cached
1919
} else {
20-
const stringified = JSON.stringify(queryArgs, (key, value) =>
21-
isPlainObject(value)
20+
const stringified = JSON.stringify(queryArgs, (key, value) => {
21+
// Handle bigints
22+
value = typeof value === 'bigint' ? { $bigint: value.toString() } : value
23+
// Sort the object keys before stringifying, to prevent useQuery({ a: 1, b: 2 }) having a different cache key than useQuery({ b: 2, a: 1 })
24+
value = isPlainObject(value)
2225
? Object.keys(value)
2326
.sort()
2427
.reduce<any>((acc, key) => {
2528
acc[key] = (value as any)[key]
2629
return acc
2730
}, {})
28-
: value,
29-
)
31+
: value
32+
return value
33+
})
3034
if (isPlainObject(queryArgs)) {
3135
cache?.set(queryArgs, stringified)
3236
}
3337
serialized = stringified
3438
}
35-
// Sort the object keys before stringifying, to prevent useQuery({ a: 1, b: 2 }) having a different cache key than useQuery({ b: 2, a: 1 })
3639
return `${endpointName}(${serialized})`
3740
}
3841

packages/toolkit/src/query/tests/buildHooks.test.tsx

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ const api = createApi({
100100
getError: build.query({
101101
query: () => '/error',
102102
}),
103-
listItems: build.query<Item[], { pageNumber: number }>({
103+
listItems: build.query<Item[], { pageNumber: number | bigint }>({
104104
serializeQueryArgs: ({ endpointName }) => {
105105
return endpointName
106106
},
@@ -151,6 +151,7 @@ beforeEach(() => {
151151
})
152152

153153
afterEach(() => {
154+
nextItemId = 0
154155
amount = 0
155156
listenerMiddleware.clearListeners()
156157
})
@@ -630,7 +631,40 @@ describe('hooks tests', () => {
630631
test(`useQuery refetches when query args object changes even if serialized args don't change`, async () => {
631632
function ItemList() {
632633
const [pageNumber, setPageNumber] = useState(0)
633-
const { data = [] } = api.useListItemsQuery({ pageNumber })
634+
const { data = [] } = api.useListItemsQuery({
635+
pageNumber: pageNumber,
636+
})
637+
638+
const renderedItems = data.map((item) => (
639+
<li key={item.id}>ID: {item.id}</li>
640+
))
641+
return (
642+
<div>
643+
<button onClick={() => setPageNumber(pageNumber + 1)}>
644+
Next Page
645+
</button>
646+
<ul>{renderedItems}</ul>
647+
</div>
648+
)
649+
}
650+
651+
render(<ItemList />, { wrapper: storeRef.wrapper })
652+
653+
await screen.findByText('ID: 0')
654+
655+
await act(async () => {
656+
screen.getByText('Next Page').click()
657+
})
658+
659+
await screen.findByText('ID: 3')
660+
})
661+
662+
test(`useQuery gracefully handles bigint types`, async () => {
663+
function ItemList() {
664+
const [pageNumber, setPageNumber] = useState(0)
665+
const { data = [] } = api.useListItemsQuery({
666+
pageNumber: BigInt(pageNumber),
667+
})
634668

635669
const renderedItems = data.map((item) => (
636670
<li key={item.id}>ID: {item.id}</li>

packages/toolkit/src/query/tests/defaultSerializeQueryArgs.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ test('number arg', () => {
2323
).toMatchInlineSnapshot(`"test(5)"`)
2424
})
2525

26+
test('bigint arg has non-default serialization (intead of throwing)', () => {
27+
expect(
28+
defaultSerializeQueryArgs({
29+
endpointDefinition,
30+
endpointName,
31+
queryArgs: BigInt(10),
32+
}),
33+
).toMatchInlineSnapshot(`"test({"$bigint":"10"})"`)
34+
})
35+
2636
test('simple object arg is sorted', () => {
2737
expect(
2838
defaultSerializeQueryArgs({

0 commit comments

Comments
 (0)