diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index d18385c584..d8cd532692 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -62,13 +62,27 @@ jobs:
path: packages/toolkit/package.tgz
test-dist:
- name: Test against dist
+ name: Run local tests against build artifact (React ${{ matrix.react.version }})
needs: [build]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: ['20.x']
+ react:
+ [
+ {
+ version: '^18',
+ types: ^18,
+ react-dom: { version: '^18', types: '^18' },
+ },
+ {
+ version: '^19',
+ types: '^19',
+ react-dom: { version: '^19', types: '^19' },
+ },
+ ]
+
steps:
- name: Checkout repo
uses: actions/checkout@v4
@@ -82,17 +96,23 @@ jobs:
- name: Install deps
run: yarn install
- - uses: actions/download-artifact@v4
+ - name: Download build artifact
+ uses: actions/download-artifact@v4
with:
name: package
path: packages/toolkit
- - run: ls -lah
+ - name: Check folder contents
+ run: ls -lah
+
+ - name: Install React ${{ matrix.react.version }} and React-DOM ${{ matrix.react.react-dom.version }}
+ run: yarn up react@${{ matrix.react.version }} react-dom@${{ matrix.react.react-dom.version }} @types/react@${{ matrix.react.types }} @types/react-dom@${{ matrix.react.react-dom.types }}
- name: Install build artifact
run: yarn workspace @reduxjs/toolkit add $(pwd)/package.tgz
- - run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json
+ - name: Erase path aliases
+ run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json
- name: Run tests, against dist
env:
@@ -103,7 +123,7 @@ jobs:
run: rm -rf dist && yarn tsc -p . --moduleResolution Bundler --module ESNext --noEmit false --declaration --emitDeclarationOnly --outDir dist --target ESNext && rm -rf dist
test-types:
- name: 'Test Types: TS ${{ matrix.ts }}'
+ name: 'Test Types: TS ${{ matrix.ts }} and React ${{ matrix.react.version }}'
needs: [build]
runs-on: ubuntu-latest
@@ -112,6 +132,20 @@ jobs:
matrix:
node: ['20.x']
ts: ['5.0', '5.1', '5.2', '5.3', '5.4', '5.5']
+ react:
+ [
+ {
+ version: '^18',
+ types: ^18,
+ react-dom: { version: '^18', types: '^18' },
+ },
+ {
+ version: '^19',
+ types: '^19',
+ react-dom: { version: '^19', types: '^19' },
+ },
+ ]
+
steps:
- name: Checkout repo
uses: actions/checkout@v4
@@ -125,6 +159,9 @@ jobs:
- name: Install deps
run: yarn install
+ - name: Install React ${{ matrix.react.version }} and React-DOM ${{ matrix.react.react-dom.version }}
+ run: yarn up react@${{ matrix.react.version }} react-dom@${{ matrix.react.react-dom.version }} @types/react@${{ matrix.react.types }} @types/react-dom@${{ matrix.react.react-dom.types }}
+
- name: Install TypeScript ${{ matrix.ts }}
run: yarn add typescript@${{ matrix.ts }}
@@ -139,7 +176,8 @@ jobs:
- name: Show installed RTK versions
run: yarn info @reduxjs/toolkit
- - run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json
+ - name: Erase path aliases
+ run: sed -i -e /@remap-prod-remove-line/d ./tsconfig.base.json
- name: Test types
env:
diff --git a/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch b/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch
deleted file mode 100644
index 7f41eabd06..0000000000
--- a/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-diff --git a/package.json b/package.json
-index b924e066ecfdb30917b9c1056b360834da357698..15e155bd84f9d16537ffe36f9a87debcb0ec3591 100644
---- a/package.json
-+++ b/package.json
-@@ -8,12 +8,15 @@
- "type": "module",
- "main": "dist/index.js",
- "typings": "index.d.ts",
-+ "types": "index.d.ts",
- "exports": {
- ".": {
-+ "types": "./index.d.ts",
- "require": "./dist/index.js",
- "default": "./src/index.js"
- },
- "./pure": {
-+ "types": "./pure.d.ts",
- "require": "./dist/pure.js",
- "default": "./src/pure.js"
- }
-diff --git a/pure.d.ts b/pure.d.ts
-index b13bb4eb87d0b316bb51bd6094b2353c6fc8527d..ee01cc9bd3233f5e67b050d48e22202b495a4a0a 100644
---- a/pure.d.ts
-+++ b/pure.d.ts
-@@ -1 +1 @@
--export * from './';
-+export * from './index.js';
-diff --git a/src/index.js b/src/index.js
-index 90ff7fa3d7d4fa62dbbf638958ae4e28abd089a8..28434687b5163b7472e86bdb11bed69e0868e660 100644
---- a/src/index.js
-+++ b/src/index.js
-@@ -1,4 +1,4 @@
--import { mockConsole, createConsole } from './pure';
-+import { mockConsole, createConsole } from './pure.js';
-
- // Keep an instance of the original console and export it
- const originalConsole = global.console;
-diff --git a/src/pure.js b/src/pure.js
-index b00ea2abbaea833e336676aa46e7ced2d59d6d88..42b83ed83fa16cf2234571500fe09868debd9f01 100644
---- a/src/pure.js
-+++ b/src/pure.js
-@@ -228,10 +228,11 @@ export function restore() {
- global.console = global.originalConsole;
- }
-
-+/*
- if (typeof expect === 'function' && typeof expect.extend === 'function') {
- expect.extend({
- toMatchInlineSnapshot(received, ...args) {
-- /* ------- Workaround for custom inline snapshot matchers ------- */
-+ // Workaround for custom inline snapshot matchers
- const error = new Error();
- const stacks = error.stack.split('\n');
-
-@@ -245,7 +246,6 @@ if (typeof expect === 'function' && typeof expect.extend === 'function') {
- error.stack = stacks.join('\n');
-
- const context = Object.assign(this, { error });
-- /* -------------------------------------------------------------- */
-
- const testingConsoleInstance =
- (received && received.testingConsole) || received;
-@@ -270,3 +270,4 @@ if (typeof expect === 'function' && typeof expect.extend === 'function') {
- },
- });
- }
-+*/
-\ No newline at end of file
diff --git a/.yarn/patches/console-testing-library__npm_0.3.1.patch b/.yarn/patches/console-testing-library__npm_0.3.1.patch
deleted file mode 100644
index b0db4c6ca2..0000000000
--- a/.yarn/patches/console-testing-library__npm_0.3.1.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/index.d.ts b/index.d.ts
-index 1dbf70a6fdf4369188ad44166aee188c8efd2054..56b85e26b2b3030bc3407aab2b358fd4e5e39c6a 100644
---- a/index.d.ts
-+++ b/index.d.ts
-@@ -1,4 +1,4 @@
--export const originalConsole = Console;
-+export declare const originalConsole: Console;
-
- type Options = {
- isSilent?: boolean;
-@@ -24,14 +24,13 @@ export type TestingConsoleInstance = {
- };
- getRecord: (method: string) => string;
- silence: boolean;
-- private _targetConsole: TestingConsole | Console;
- };
-
- export function createConsole(options?: Options): TestingConsole;
-
- export function mockConsole(
- testingConsole: TestingConsole,
-- targetConsoleParent?: {} = global,
-+ targetConsoleParent?: typeof globalThis,
- targetConsoleKey?: string
- ): () => void;
-
diff --git a/docs/package.json b/docs/package.json
index 2eef2575c0..72b17dc4e2 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -3,7 +3,7 @@
"devDependencies": {
"@manaflair/redux-batch": "^1.0.0",
"@types/nanoid": "^2.1.0",
- "@types/react": "^18.0",
+ "@types/react": "^19.0.1",
"async-mutex": "^0.3.2",
"axios": "^0.20.0",
"formik": "^2.1.5",
diff --git a/docs/rtk-query/api/createApi.mdx b/docs/rtk-query/api/createApi.mdx
index 6e99e1476e..c3992c76e8 100644
--- a/docs/rtk-query/api/createApi.mdx
+++ b/docs/rtk-query/api/createApi.mdx
@@ -54,7 +54,7 @@ export const { useGetPokemonByNameQuery } = pokemonApi
// highlight-end
```
-## Parameters
+## `createApi` Parameters
`createApi` accepts a single configuration object parameter with the following options:
@@ -357,6 +357,10 @@ See also [Server Side Rendering](../usage/server-side-rendering.mdx) and
By default, this function will take the query arguments, sort object keys where applicable, stringify the result, and concatenate it with the endpoint name. This creates a cache key based on the combination of arguments + endpoint name (ignoring object key order), such that calling any given endpoint with the same arguments will result in the same cache key.
+### `invalidationBehavior`
+
+[summary](docblock://query/createApi.ts?token=CreateApiOptions.invalidationBehavior)
+
### `keepUnusedDataFor`
[summary](docblock://query/createApi.ts?token=CreateApiOptions.keepUnusedDataFor)
@@ -389,7 +393,7 @@ You can set this globally in `createApi`, but you can also override the default
If you specify `track: false` when manually dispatching queries, RTK Query will not be able to automatically refetch for you.
:::
-## Anatomy of an endpoint
+## Endpoint Definition Parameters
### `query`
diff --git a/docs/tutorials/quick-start.mdx b/docs/tutorials/quick-start.mdx
index 11c5a9aa44..b5ce4010fb 100644
--- a/docs/tutorials/quick-start.mdx
+++ b/docs/tutorials/quick-start.mdx
@@ -84,7 +84,7 @@ export const store = configureStore({
// file: index.tsx
import React from 'react'
-import ReactDOM from 'react-dom'
+import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App'
// highlight-start
@@ -92,13 +92,22 @@ import { store } from './app/store'
import { Provider } from 'react-redux'
// highlight-end
-ReactDOM.render(
- // highlight-next-line
-
-
- ,
- document.getElementById('root')
-)
+const container = document.getElementById('root')
+
+if (container) {
+ const root = createRoot(container)
+
+ root.render(
+ // highlight-next-line
+
+
+ ,
+ )
+} else {
+ throw new Error(
+ "Root element with ID 'root' was not found in the document. Ensure there is a corresponding HTML element with the ID 'root' in your HTML file.",
+ )
+}
```
### Create a Redux State Slice
@@ -214,18 +223,27 @@ export type RootState = ReturnType
// file: index.tsx noEmit
import React from 'react'
-import ReactDOM from 'react-dom'
+import { createRoot } from 'react-dom/client'
import { Counter } from './features/counter/Counter'
import { store } from './app/store'
import { Provider } from 'react-redux'
-ReactDOM.render(
- // highlight-next-line
-
-
- ,
- document.getElementById('root')
-)
+const container = document.getElementById('root')
+
+if (container) {
+ const root = createRoot(container)
+
+ root.render(
+ // highlight-next-line
+
+
+ ,
+ )
+} else {
+ throw new Error(
+ "Root element with ID 'root' was not found in the document. Ensure there is a corresponding HTML element with the ID 'root' in your HTML file.",
+ )
+}
// file: features/counter/Counter.tsx
import React from 'react'
diff --git a/docs/tutorials/rtk-query.mdx b/docs/tutorials/rtk-query.mdx
index 17dcbae065..52b404c99c 100644
--- a/docs/tutorials/rtk-query.mdx
+++ b/docs/tutorials/rtk-query.mdx
@@ -150,19 +150,27 @@ export const store = configureStore({
// file: index.tsx
import * as React from 'react'
-import { render } from 'react-dom'
+import { createRoot } from 'react-dom/client'
import { Provider } from 'react-redux'
import App from './App'
import { store } from './store'
-const rootElement = document.getElementById('root')
-render(
-
-
- ,
- rootElement
-)
+const container = document.getElementById('root')
+
+if (container) {
+ const root = createRoot(container)
+
+ root.render(
+
+
+ ,
+ )
+} else {
+ throw new Error(
+ "Root element with ID 'root' was not found in the document. Ensure there is a corresponding HTML element with the ID 'root' in your HTML file.",
+ )
+}
```
## Use the query in a component
diff --git a/docs/usage/nextjs.mdx b/docs/usage/nextjs.mdx
index 87bc531e89..62d7e6c5a0 100644
--- a/docs/usage/nextjs.mdx
+++ b/docs/usage/nextjs.mdx
@@ -181,7 +181,7 @@ export default function StoreProvider({
children: React.ReactNode
}) {
// highlight-start
- const storeRef = useRef()
+ const storeRef = useRef(undefined)
if (!storeRef.current) {
// Create the store instance the first time this renders
storeRef.current = makeStore()
diff --git a/docs/usage/usage-guide.md b/docs/usage/usage-guide.md
index 113c732a54..23268f93cd 100644
--- a/docs/usage/usage-guide.md
+++ b/docs/usage/usage-guide.md
@@ -1041,6 +1041,7 @@ configureStore({
If using Redux-Persist, you should specifically ignore all the action types it dispatches:
```jsx
+import { createRoot } from 'react-dom/client'
import { configureStore } from '@reduxjs/toolkit'
import {
persistStore,
@@ -1078,14 +1079,23 @@ const store = configureStore({
let persistor = persistStore(store)
-ReactDOM.render(
-
-
-
-
- ,
- document.getElementById('root'),
-)
+const container = document.getElementById('root')
+
+if (container) {
+ const root = createRoot(container)
+
+ root.render(
+
+
+
+
+ ,
+ )
+} else {
+ throw new Error(
+ "Root element with ID 'root' was not found in the document. Ensure there is a corresponding HTML element with the ID 'root' in your HTML file.",
+ )
+}
```
Additionally, you can purge any persisted state by adding an extra reducer to the specific slice that you would like to clear when calling persistor.purge(). This is especially helpful when you are looking to clear persisted state on a dispatched logout action.
diff --git a/examples/action-listener/counter/package.json b/examples/action-listener/counter/package.json
index 1743b64577..59dc4fd744 100644
--- a/examples/action-listener/counter/package.json
+++ b/examples/action-listener/counter/package.json
@@ -5,12 +5,12 @@
"dependencies": {
"@reduxjs/toolkit": "^1.8.0",
"@types/node": "^12.0.0",
- "@types/react": "^18.0.12",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"clsx": "1.1.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1",
"typescript": "~4.9"
},
diff --git a/examples/query/react/advanced/package.json b/examples/query/react/advanced/package.json
index d8c2e34b32..43f87042c8 100644
--- a/examples/query/react/advanced/package.json
+++ b/examples/query/react/advanced/package.json
@@ -7,14 +7,14 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "^1.6.0-rc.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"eslintConfig": {
diff --git a/examples/query/react/authentication-with-extrareducers/package.json b/examples/query/react/authentication-with-extrareducers/package.json
index d4b648e3ed..26a9995f37 100644
--- a/examples/query/react/authentication-with-extrareducers/package.json
+++ b/examples/query/react/authentication-with-extrareducers/package.json
@@ -12,16 +12,16 @@
"@reduxjs/toolkit": "^1.6.0-rc.1",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/authentication/package.json b/examples/query/react/authentication/package.json
index 01eaab4aec..c9f3d47819 100644
--- a/examples/query/react/authentication/package.json
+++ b/examples/query/react/authentication/package.json
@@ -12,16 +12,16 @@
"@reduxjs/toolkit": "^1.6.0-rc.1",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/basic/package.json b/examples/query/react/basic/package.json
index 709c27b6c8..ae87501caa 100644
--- a/examples/query/react/basic/package.json
+++ b/examples/query/react/basic/package.json
@@ -7,16 +7,17 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "^1.6.0-rc.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@testing-library/react": "^13.3.0",
+ "@testing-library/dom": "^10.4.0",
+ "@testing-library/react": "^16.1.0",
"@types/jest": "^26.0.23",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"msw": "^0.40.2",
"typescript": "~4.9"
},
diff --git a/examples/query/react/conditional-fetching/package.json b/examples/query/react/conditional-fetching/package.json
index 371d14db7e..b17e4369f2 100644
--- a/examples/query/react/conditional-fetching/package.json
+++ b/examples/query/react/conditional-fetching/package.json
@@ -7,14 +7,14 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "^1.6.0-rc.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"eslintConfig": {
diff --git a/examples/query/react/deduping-queries/package.json b/examples/query/react/deduping-queries/package.json
index 1db08cf570..4ef5204982 100644
--- a/examples/query/react/deduping-queries/package.json
+++ b/examples/query/react/deduping-queries/package.json
@@ -7,14 +7,14 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "^1.6.0-rc.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"eslintConfig": {
diff --git a/examples/query/react/graphql-codegen/package.json b/examples/query/react/graphql-codegen/package.json
index a3383139b5..f4ba5cae31 100644
--- a/examples/query/react/graphql-codegen/package.json
+++ b/examples/query/react/graphql-codegen/package.json
@@ -16,10 +16,10 @@
"graphql": "^15.5.0",
"graphql-request": "^3.4.0",
"msw": "0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
@@ -34,8 +34,8 @@
"@graphql-codegen/typescript-rtk-query": "^1.1.0",
"@graphql-typed-document-node/core": "^3.1.0",
"@types/faker": "^5.5.5",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"@types/webpack-env": "^1.16.0",
"concurrently": "^6.2.0",
"cross-env": "^7.0.3",
diff --git a/examples/query/react/graphql/package.json b/examples/query/react/graphql/package.json
index 17d65186a2..98055f6bb6 100644
--- a/examples/query/react/graphql/package.json
+++ b/examples/query/react/graphql/package.json
@@ -17,17 +17,17 @@
"graphql": "^15.5.0",
"graphql-request": "^3.4.0",
"msw": "0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/faker": "^5.5.5",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.2.4"
},
"scripts": {
diff --git a/examples/query/react/kitchen-sink/package.json b/examples/query/react/kitchen-sink/package.json
index 2e1675c6fc..18d5afde8d 100644
--- a/examples/query/react/kitchen-sink/package.json
+++ b/examples/query/react/kitchen-sink/package.json
@@ -8,19 +8,20 @@
"dependencies": {
"@reduxjs/toolkit": "1.8.1",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
+ "@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^5.11.5",
- "@testing-library/react": "^13.3.0",
+ "@testing-library/react": "^16.1.0",
"@types/jest": "^26.0.23",
"@types/node": "^14.14.6",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9",
"whatwg-fetch": "^3.4.1"
},
diff --git a/examples/query/react/mutations/package.json b/examples/query/react/mutations/package.json
index 1715dbb44b..4085e91b58 100644
--- a/examples/query/react/mutations/package.json
+++ b/examples/query/react/mutations/package.json
@@ -13,16 +13,16 @@
"@reduxjs/toolkit": "^1.6.0-rc.1",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/optimistic-update/package.json b/examples/query/react/optimistic-update/package.json
index 84317eb1b2..c5726798fa 100644
--- a/examples/query/react/optimistic-update/package.json
+++ b/examples/query/react/optimistic-update/package.json
@@ -13,17 +13,17 @@
"@reduxjs/toolkit": "^1.6.0-rc.1",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1",
"uuid": "^8.3.2"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9",
"whatwg-fetch": "^3.4.1"
},
diff --git a/examples/query/react/pagination/package.json b/examples/query/react/pagination/package.json
index edec3a9c0e..6d0d50692e 100644
--- a/examples/query/react/pagination/package.json
+++ b/examples/query/react/pagination/package.json
@@ -14,16 +14,16 @@
"faker": "^5.5.3",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "^5.0.1",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/faker": "^5.5.5",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/polling/package.json b/examples/query/react/polling/package.json
index 01db92d160..ca713c90ca 100644
--- a/examples/query/react/polling/package.json
+++ b/examples/query/react/polling/package.json
@@ -7,14 +7,14 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "^1.6.0-rc.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"eslintConfig": {
diff --git a/examples/query/react/prefetching-automatic-waterfall/package.json b/examples/query/react/prefetching-automatic-waterfall/package.json
index 16d3860cfb..1fa1f4d81e 100644
--- a/examples/query/react/prefetching-automatic-waterfall/package.json
+++ b/examples/query/react/prefetching-automatic-waterfall/package.json
@@ -14,17 +14,17 @@
"faker": "^5.5.3",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/faker": "^5.5.5",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/prefetching-automatic/package.json b/examples/query/react/prefetching-automatic/package.json
index d1daa496c3..963ff2b257 100644
--- a/examples/query/react/prefetching-automatic/package.json
+++ b/examples/query/react/prefetching-automatic/package.json
@@ -14,17 +14,17 @@
"faker": "^5.5.3",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/faker": "^5.5.5",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/prefetching/package.json b/examples/query/react/prefetching/package.json
index 5ef7c8a136..8b19c2f5eb 100644
--- a/examples/query/react/prefetching/package.json
+++ b/examples/query/react/prefetching/package.json
@@ -14,17 +14,17 @@
"faker": "^5.5.3",
"framer-motion": "^2.9.5",
"msw": "^0.40.2",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-icons": "3.11.0",
- "react-redux": "^9.1.0",
+ "react-redux": "^9.1.2",
"react-router-dom": "6.3.0",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/faker": "^5.5.5",
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"scripts": {
diff --git a/examples/query/react/with-apiprovider/package.json b/examples/query/react/with-apiprovider/package.json
index 6895d5981d..a86f59fdde 100644
--- a/examples/query/react/with-apiprovider/package.json
+++ b/examples/query/react/with-apiprovider/package.json
@@ -7,14 +7,14 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "^1.6.0-rc.1",
- "react": "^18.1.0",
- "react-dom": "^18.1.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"react-scripts": "5.0.1"
},
"devDependencies": {
- "@types/react": "^18.0.5",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "~4.9"
},
"eslintConfig": {
diff --git a/examples/type-portability/bundler/package.json b/examples/type-portability/bundler/package.json
index 895920e39a..404cbe3563 100644
--- a/examples/type-portability/bundler/package.json
+++ b/examples/type-portability/bundler/package.json
@@ -7,16 +7,16 @@
"main": "src/index.tsx",
"dependencies": {
"@reduxjs/toolkit": "workspace:^",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-redux": "^9.1.2",
"react-router-dom": "^6.25.1",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/node": "^20.14.11",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "^5.5.4"
},
"eslintConfig": {
diff --git a/examples/type-portability/nodenext-cjs/package.json b/examples/type-portability/nodenext-cjs/package.json
index 79ba210383..23427b4895 100644
--- a/examples/type-portability/nodenext-cjs/package.json
+++ b/examples/type-portability/nodenext-cjs/package.json
@@ -8,16 +8,16 @@
"type": "commonjs",
"dependencies": {
"@reduxjs/toolkit": "workspace:^",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-redux": "^9.1.2",
"react-router-dom": "^6.25.1",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/node": "^20.14.11",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "^5.5.4"
},
"eslintConfig": {
diff --git a/examples/type-portability/nodenext-esm/package.json b/examples/type-portability/nodenext-esm/package.json
index 95534bc103..004ab8d114 100644
--- a/examples/type-portability/nodenext-esm/package.json
+++ b/examples/type-portability/nodenext-esm/package.json
@@ -8,16 +8,16 @@
"type": "module",
"dependencies": {
"@reduxjs/toolkit": "workspace:^",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"react-redux": "^9.1.2",
"react-router-dom": "^6.25.1",
"react-scripts": "5.0.1"
},
"devDependencies": {
"@types/node": "^20.14.11",
- "@types/react": "^18.3.3",
- "@types/react-dom": "^18.3.0",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"typescript": "^5.5.4"
},
"eslintConfig": {
diff --git a/package.json b/package.json
index f02e67ff7f..a31c2b726a 100644
--- a/package.json
+++ b/package.json
@@ -30,8 +30,8 @@
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/traverse": "^7.24.1",
"@babel/types": "^7.24.0",
- "@types/react": "^18.2.77",
- "@types/react-dom": "^18.2.25",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"@typescript-eslint/eslint-plugin": "6.12.0",
"@typescript-eslint/parser": "6.12.0",
"eslint": "^7.25.0",
@@ -45,17 +45,14 @@
"eslint-plugin-react-hooks": "^4.2.0",
"netlify-plugin-cache": "^1.0.3",
"prettier": "^3.2.5",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-redux": "^9.1.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-redux": "^9.1.2",
"release-it": "^14.12.5",
"serve": "^14.2.0",
"ts-node": "^10.9.2",
"typescript": "^5.5.4"
},
- "resolutions": {
- "jest-snapshot": "29.3.1"
- },
"scripts": {
"build": "yarn build:packages",
"test": "yarn test:packages",
diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json
index e3c3c8b6f3..8db42f54ce 100644
--- a/packages/toolkit/package.json
+++ b/packages/toolkit/package.json
@@ -1,6 +1,6 @@
{
"name": "@reduxjs/toolkit",
- "version": "2.4.0",
+ "version": "2.5.0",
"description": "The official, opinionated, batteries-included toolset for efficient Redux development",
"author": "Mark Erikson ",
"license": "MIT",
@@ -56,21 +56,21 @@
"@phryneas/ts-version": "^1.0.2",
"@size-limit/file": "^11.0.1",
"@size-limit/webpack": "^11.0.1",
- "@testing-library/react": "^13.3.0",
- "@testing-library/user-event": "^13.1.5",
+ "@testing-library/dom": "^10.4.0",
+ "@testing-library/react": "^16.1.0",
+ "@testing-library/user-event": "^14.5.2",
"@types/babel__core": "^7.20.5",
"@types/babel__helper-module-imports": "^7.18.3",
"@types/json-stringify-safe": "^5.0.0",
"@types/nanoid": "^2.1.0",
"@types/node": "^20.11.0",
"@types/query-string": "^6.3.0",
- "@types/react": "^18.0.12",
- "@types/react-dom": "^18.0.5",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
"@types/yargs": "^16.0.1",
"@typescript-eslint/eslint-plugin": "^6",
"@typescript-eslint/parser": "^6",
"axios": "^0.19.2",
- "console-testing-library": "patch:console-testing-library@npm%3A0.6.1#~/.yarn/patches/console-testing-library-npm-0.6.1-4d9957d402.patch",
"esbuild": "^0.23.0",
"esbuild-extra": "^0.4.0",
"eslint": "^7.25.0",
@@ -84,12 +84,14 @@
"eslint-plugin-react-hooks": "^4.2.0",
"fs-extra": "^9.1.0",
"invariant": "^2.2.4",
- "jsdom": "^21.0.0",
+ "jsdom": "^25.0.1",
"json-stringify-safe": "^5.0.1",
"msw": "^2.1.4",
"node-fetch": "^3.3.2",
"prettier": "^3.2.5",
"query-string": "^7.0.1",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
"rimraf": "^3.0.2",
"size-limit": "^11.0.1",
"tslib": "^1.10.0",
@@ -127,7 +129,7 @@
"reselect": "^5.1.0"
},
"peerDependencies": {
- "react": "^16.9.0 || ^17.0.0 || ^18",
+ "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
"react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
},
"peerDependenciesMeta": {
diff --git a/packages/toolkit/src/entities/tests/utils.spec.ts b/packages/toolkit/src/entities/tests/utils.spec.ts
index cc4053cd18..27420e6de0 100644
--- a/packages/toolkit/src/entities/tests/utils.spec.ts
+++ b/packages/toolkit/src/entities/tests/utils.spec.ts
@@ -1,66 +1,71 @@
-import { vi } from 'vitest'
+import { noop } from '@internal/listenerMiddleware/utils'
import { AClockworkOrange } from './fixtures/book'
describe('Entity utils', () => {
describe(`selectIdValue()`, () => {
- const OLD_ENV = process.env
+ const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(noop)
beforeEach(() => {
vi.resetModules() // this is important - it clears the cache
- process.env = { ...OLD_ENV, NODE_ENV: 'development' }
+ vi.stubEnv('NODE_ENV', 'development')
})
afterEach(() => {
- process.env = OLD_ENV
- vi.resetAllMocks()
+ vi.unstubAllEnvs()
+ vi.clearAllMocks()
+ })
+
+ afterAll(() => {
+ vi.restoreAllMocks()
})
it('should not warn when key does exist', async () => {
const { selectIdValue } = await import('../utils')
- const spy = vi.spyOn(console, 'warn')
selectIdValue(AClockworkOrange, (book: any) => book.id)
- expect(spy).not.toHaveBeenCalled()
+ expect(consoleWarnSpy).not.toHaveBeenCalled()
})
it('should warn when key does not exist in dev mode', async () => {
const { selectIdValue } = await import('../utils')
- const spy = vi.spyOn(console, 'warn')
+
+ expect(process.env.NODE_ENV).toBe('development')
selectIdValue(AClockworkOrange, (book: any) => book.foo)
- expect(spy).toHaveBeenCalled()
+ expect(consoleWarnSpy).toHaveBeenCalledOnce()
})
it('should warn when key is undefined in dev mode', async () => {
const { selectIdValue } = await import('../utils')
- const spy = vi.spyOn(console, 'warn')
+
+ expect(process.env.NODE_ENV).toBe('development')
const undefinedAClockworkOrange = { ...AClockworkOrange, id: undefined }
selectIdValue(undefinedAClockworkOrange, (book: any) => book.id)
- expect(spy).toHaveBeenCalled()
+ expect(consoleWarnSpy).toHaveBeenCalledOnce()
})
it('should not warn when key does not exist in prod mode', async () => {
- process.env.NODE_ENV = 'production'
+ vi.stubEnv('NODE_ENV', 'production')
+
const { selectIdValue } = await import('../utils')
- const spy = vi.spyOn(console, 'warn')
selectIdValue(AClockworkOrange, (book: any) => book.foo)
- expect(spy).not.toHaveBeenCalled()
+ expect(consoleWarnSpy).not.toHaveBeenCalled()
})
it('should not warn when key is undefined in prod mode', async () => {
- process.env.NODE_ENV = 'production'
+ vi.stubEnv('NODE_ENV', 'production')
+
const { selectIdValue } = await import('../utils')
- const spy = vi.spyOn(console, 'warn')
const undefinedAClockworkOrange = { ...AClockworkOrange, id: undefined }
selectIdValue(undefinedAClockworkOrange, (book: any) => book.id)
- expect(spy).not.toHaveBeenCalled()
+ expect(consoleWarnSpy).not.toHaveBeenCalled()
})
})
})
diff --git a/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts b/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts
index 73e039cad8..ce55ac8092 100644
--- a/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts
+++ b/packages/toolkit/src/listenerMiddleware/tests/effectScenarios.test.ts
@@ -1,16 +1,13 @@
+import { noop } from '@internal/listenerMiddleware/utils'
+import type { PayloadAction } from '@reduxjs/toolkit'
import {
configureStore,
createAction,
+ createListenerMiddleware,
createSlice,
isAnyOf,
+ TaskAbortError,
} from '@reduxjs/toolkit'
-import { vi } from 'vitest'
-
-import type { PayloadAction } from '@reduxjs/toolkit'
-
-import { createListenerMiddleware, TaskAbortError } from '../index'
-
-import type { TypedAddListener } from '../index'
describe('Saga-style Effects Scenarios', () => {
interface CounterState {
@@ -57,10 +54,7 @@ describe('Saga-style Effects Scenarios', () => {
return new Promise((resolve) => setTimeout(resolve, ms))
}
- beforeAll(() => {
- const noop = () => {}
- vi.spyOn(console, 'error').mockImplementation(noop)
- })
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(noop)
beforeEach(() => {
listenerMiddleware = createListenerMiddleware()
@@ -72,6 +66,14 @@ describe('Saga-style Effects Scenarios', () => {
})
})
+ afterEach(() => {
+ vi.clearAllMocks()
+ })
+
+ afterAll(() => {
+ vi.restoreAllMocks()
+ })
+
test('throttle', async () => {
// Ignore incoming actions for a given period of time while processing a task.
// Ref: https://redux-saga.js.org/docs/api#throttlems-pattern-saga-args
diff --git a/packages/toolkit/src/listenerMiddleware/tests/fork.test.ts b/packages/toolkit/src/listenerMiddleware/tests/fork.test.ts
index 98e0c68461..cbb67f6348 100644
--- a/packages/toolkit/src/listenerMiddleware/tests/fork.test.ts
+++ b/packages/toolkit/src/listenerMiddleware/tests/fork.test.ts
@@ -179,7 +179,7 @@ describe('fork', () => {
})
store.dispatch(increment())
- expect(storeStateAfter).resolves.toEqual({ value: 1 })
+ await expect(storeStateAfter).resolves.toEqual({ value: 1 })
})
it.each<{
@@ -265,7 +265,7 @@ describe('fork', () => {
},
expected: { status: 'ok', value: 5 },
},
- ])('%# - %j', async ({ executor, expected, cancelAfterMs }) => {
+ ])('$desc', async ({ executor, expected, cancelAfterMs }) => {
let deferredResult = deferred()
let forkedTask: any = {}
diff --git a/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts b/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts
index ad657508e2..2b3980ad94 100644
--- a/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts
+++ b/packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts
@@ -1,3 +1,21 @@
+import {
+ listenerCancelled,
+ listenerCompleted,
+} from '@internal/listenerMiddleware/exceptions'
+import type {
+ AbortSignalWithReason,
+ AddListenerOverloads,
+} from '@internal/listenerMiddleware/types'
+import { noop } from '@internal/listenerMiddleware/utils'
+import type {
+ Action,
+ ListenerEffect,
+ ListenerEffectAPI,
+ PayloadAction,
+ TypedRemoveListener,
+ TypedStartListening,
+ UnknownAction,
+} from '@reduxjs/toolkit'
import {
TaskAbortError,
addListener,
@@ -10,28 +28,6 @@ import {
removeListener,
} from '@reduxjs/toolkit'
import type { Mock } from 'vitest'
-import { vi } from 'vitest'
-
-import type {
- Action,
- ListenerEffect,
- ListenerEffectAPI,
- PayloadAction,
- TypedAddListener,
- TypedRemoveListener,
- TypedStartListening,
- UnknownAction,
-} from '@reduxjs/toolkit'
-
-import {
- listenerCancelled,
- listenerCompleted,
-} from '@internal/listenerMiddleware/exceptions'
-
-import type {
- AbortSignalWithReason,
- AddListenerOverloads,
-} from '@internal/listenerMiddleware/types'
const middlewareApi = {
getState: expect.any(Function),
@@ -51,8 +47,6 @@ const middlewareApi = {
throwIfCancelled: expect.any(Function),
}
-const noop = () => {}
-
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
export interface Deferred extends Promise {
resolve(value?: T | PromiseLike): void
@@ -120,9 +114,7 @@ describe('createListenerMiddleware', () => {
type TestAction2 = ReturnType
const testAction3 = createAction('testAction3')
- beforeAll(() => {
- vi.spyOn(console, 'error').mockImplementation(noop)
- })
+ vi.spyOn(console, 'error').mockImplementation(noop)
beforeEach(() => {
listenerMiddleware = createListenerMiddleware()
@@ -137,6 +129,14 @@ describe('createListenerMiddleware', () => {
})
})
+ afterEach(() => {
+ vi.clearAllMocks()
+ })
+
+ afterAll(() => {
+ vi.restoreAllMocks()
+ })
+
describe('Middleware setup', () => {
test('Allows passing an extra argument on middleware creation', () => {
const originalExtra = 42
diff --git a/packages/toolkit/src/query/react/buildHooks.ts b/packages/toolkit/src/query/react/buildHooks.ts
index daec42efe2..63aadd94e1 100644
--- a/packages/toolkit/src/query/react/buildHooks.ts
+++ b/packages/toolkit/src/query/react/buildHooks.ts
@@ -905,16 +905,17 @@ export function buildHooks({
const { endpointName } = lastResult
const endpointDefinition = context.endpointDefinitions[endpointName]
if (
+ queryArgs !== skipToken &&
serializeQueryArgs({
queryArgs: lastResult.originalArgs,
endpointDefinition,
endpointName,
}) ===
- serializeQueryArgs({
- queryArgs,
- endpointDefinition,
- endpointName,
- })
+ serializeQueryArgs({
+ queryArgs,
+ endpointDefinition,
+ endpointName,
+ })
)
lastResult = undefined
}
diff --git a/packages/toolkit/src/query/tests/apiProvider.test.tsx b/packages/toolkit/src/query/tests/apiProvider.test.tsx
index f6a4cea10a..4fdf9de462 100644
--- a/packages/toolkit/src/query/tests/apiProvider.test.tsx
+++ b/packages/toolkit/src/query/tests/apiProvider.test.tsx
@@ -32,6 +32,10 @@ const api = createApi({
}),
})
+afterEach(() => {
+ vi.resetAllMocks()
+})
+
describe('ApiProvider', () => {
test('ApiProvider allows a user to make queries without a traditional Redux setup', async () => {
function User() {
@@ -72,6 +76,8 @@ describe('ApiProvider', () => {
expect(getByTestId('isFetching').textContent).toBe('false')
})
test('ApiProvider throws if nested inside a Redux context', () => {
+ // Intentionally swallow the "unhandled error" message
+ vi.spyOn(console, 'error').mockImplementation(() => {})
expect(() =>
render(
null })}>
diff --git a/packages/toolkit/src/query/tests/buildHooks.test.tsx b/packages/toolkit/src/query/tests/buildHooks.test.tsx
index 6810e75dd8..e3a0989300 100644
--- a/packages/toolkit/src/query/tests/buildHooks.test.tsx
+++ b/packages/toolkit/src/query/tests/buildHooks.test.tsx
@@ -1,3 +1,4 @@
+import { noop } from '@internal/listenerMiddleware/utils'
import type { SubscriptionOptions } from '@internal/query/core/apiState'
import type { SubscriptionSelectors } from '@internal/query/core/buildMiddleware/types'
import { server } from '@internal/query/tests/mocks/server'
@@ -6,6 +7,7 @@ import {
actionsReducer,
setupApiStore,
useRenderCounter,
+ waitForFakeTimer,
waitMs,
withProvider,
} from '@internal/tests/utils/helpers'
@@ -29,10 +31,9 @@ import {
screen,
waitFor,
} from '@testing-library/react'
-import userEvent from '@testing-library/user-event'
+import { userEvent } from '@testing-library/user-event'
import { HttpResponse, http } from 'msw'
import { useEffect, useState } from 'react'
-import type { MockInstance } from 'vitest'
// Just setup a temporary in-memory counter for tests that `getIncrementedAmount`.
// This can be used to test how many renders happen due to data changes or
@@ -47,7 +48,7 @@ interface Item {
const api = createApi({
baseQuery: async (arg: any) => {
- await waitMs(150)
+ await waitForFakeTimer(150)
if (arg?.body && 'amount' in arg.body) {
amount += 1
}
@@ -465,7 +466,6 @@ describe('hooks tests', () => {