v2.13.0
This feature release updates our build tooling to TSDown and PNPM, adds official TypeScript 7 support, and includes a long list of bugfixes across RTK Query, createAsyncThunk, createEntityAdapter, and combineSlices.
We've fully modernizing modernized our build tooling across all of the Redux repos. That included switching from Yarn to PNPM, ESLint to Oxlint, Prettier to Oxfmt, and TSUp to TSDown.
The part that matters for users is that we now build the package with TSDown instead of tsup. The package layout, exports definitions, and exported APIs are all unchanged from 2.12. We've checked the new build with attw, and verified that CJS and ESM entry points load in both dev and prod builds, and that the legacy-esm artifacts still target ES2017. The contents of the bundles do look a bit different (smaller CJS artifacts, slightly different helper output in the legacy-esm files). If you see any behavior differences that look build-related, please file an issue!
This is also our first release published via the updated PNPM-based workflow, still using NPM Trusted Publishing. We've also added pkg.pr.new previews for every commit, so you can try out a PR build before it's released.
We've shipped a new combined Redux libraries docs site! The core docs site at https://redux.js.org now contains the docs for all of our libraries: Redux core and usage guides, Redux Toolkit, React Redux, and Reselect. The prior standalone docs sites for RTK, R-R, and Reselect now redirect to their respective sections of the combined docs. We've also done a major cleanup pass on the docs, deduplicating pages that had similarities (like the Next.js or RTK2 migration pages that lived in both the core and RTK docs), and updating outdated content (modernizing example code snippets, deleting dead links, and making RTK and hooks the default patterns shown). The RTK content now lives at https://redux.js.org/toolkit/ .
TS 7.0 (the native Go port) is now out! We fixed the remaining type errors in RTK when checked by TS 7.0 and 7.1, and TS 7.0 is now part of our CI test matrix.
Per our TS support policy of matching DefinitelyTyped's support window, we've also updated our support matrix to TS 5.6+. As always, RTK may still work with earlier versions, but we no longer test against them.
useQueryState (and thus useQuery) was passing a new inline selector to useSelector on every render, and also reading the store directly during render. The selector is now memoized, and the direct store read is gone. This also fixes a bug where isSuccess could flip from false to true on an unrelated re-render while a query was refetching after an error. isSuccess now correctly stays false in that case.
data now reflects cache updates made via updateQueryData while a refetch is in flight, instead of showing the previous result.
Polling now reads the current cache state when each poll fires, rather than the state at the time the poll was scheduled. This means skipPollingIfUnfocused respects focus loss that happens after scheduling, and polls stop if their cache entry was removed.
We fixed a race where a duplicate query request rejected by the thunk condition could cause queued tag invalidations to run too early and be lost, leaving stale data in the cache.
Tags with falsy ids like 0 now invalidate and clean up correctly.
Lazy query hooks now re-subscribe correctly when effects restart while the hook state is preserved, such as with Fast Refresh or <Activity>.
Infinite queries no longer trigger onQueryStarted when fetching past the end of the list, and the infinite query hook result type now includes the page error flags.
fetchBaseQuery only treats a URL as absolute if it starts with a scheme.
We also fixed an error when rehydrating state for an endpoint name that has no definition.
createAsyncThunk no longer swallows aborts that happen before the pending action is dispatched, and now correctly sets rejectedWithValue when rejectWithValue is called with a falsy payload.
createEntityAdapter's setAll now keeps the last item when given duplicate IDs, matching setMany. The sorted adapter's updateMany now merges multiple updates for the same ID before applying them.
combineSlices now keeps its internal state proxy cache per instance, so multiple combined reducers no longer interfere with each other.
The immutability check middleware now handles circular references in state.
The dynamic middleware now caches its composed middleware chains when the list of middleware hasn't changed.
- Additional publishing hardening by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5297
- ci: fix Playwright e2e tests in publish-ci examples by @aryaemami59 in https://github.com/reduxjs/redux-toolkit/pull/5310
- ci: publish preview packages on every commit via
pkg.pr.newby @aryaemami59 in https://github.com/reduxjs/redux-toolkit/pull/5256 - feat(codegen): migrate to oazapfts v7 by @Suto-Michimasa in https://github.com/reduxjs/redux-toolkit/pull/5228
- fix(combineSlices): scope stateProxyMap per instance to prevent cross-instance proxy collisions by @JSap0914 in https://github.com/reduxjs/redux-toolkit/pull/5319
- fix(entityAdapter): pre-merge same-ID updates in sorted adapter's updateMany by @JSap0914 in https://github.com/reduxjs/redux-toolkit/pull/5323
- fix(
entityAdapter):setAllwith duplicate IDs keeps last occurrence (consistent withsetMany) by @JSap0914 in https://github.com/reduxjs/redux-toolkit/pull/5321 - fix(query): reflect cache updates in hook data by @jtiret in https://github.com/reduxjs/redux-toolkit/pull/5327
- fix: don't swallow
createAsyncThunkaborts that happen before pending by @chatman-media in https://github.com/reduxjs/redux-toolkit/pull/5314 - Simplify
useRef<T | undefined>(undefined)usages in RTK Query hooks by @DucMinhNe in https://github.com/reduxjs/redux-toolkit/pull/5315 - fix(query): prevent
onQueryStartedfrom triggering at end-of-list by @joseph0926 in https://github.com/reduxjs/redux-toolkit/pull/5182 - fix(types): fix tsgo (TS 7.0) type errors and re-enable the native-preview CI job by @veksa in https://github.com/reduxjs/redux-toolkit/pull/5344
- ci: bump GitHub Actions to their latest versions by @aryaemami59 in https://github.com/reduxjs/redux-toolkit/pull/5358
- chore(toolkit): remove redundant and unused type declarations by @aryaemami59 in https://github.com/reduxjs/redux-toolkit/pull/5356
- Modernize CI examples by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5363
- fix(rtk-query): only treat a url as absolute when it starts with a scheme by @MahinAnowar in https://github.com/reduxjs/redux-toolkit/pull/5428
- Modern Tooling, Part 1: Oxlint by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5384
- Modern Tooling, Part 2: Oxfmt by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5385
- Modern Tooling, Part 3: TSDown and TS6 by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5386
- Modern Tooling, Part 4: Vitest type assertions by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5387
- Modern Tooling, Part 5: PNPM by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5388
- Modern Tooling, Part 6: TS7 by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5389
- Modern Tooling, Part 7: vendor
remark-typescript-toolsand update to TS7 by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5390 - Modern Tooling, Part 8: Vitest 5 by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5436
- Remove redundant RTK Query example projects by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5443
- Type the reducer builder implementation explicitly for TS 7.1 by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5446
- fix(toolkit): flag
rejectedWithValuefor falsyrejectWithValuepayloads by @dfedoryshchev in https://github.com/reduxjs/redux-toolkit/pull/5395 - Cache unchanged dynamic middleware chains by @OskarEichler in https://github.com/reduxjs/redux-toolkit/pull/5415
- Preserve delayed invalidations after duplicate query rejection by @OskarEichler in https://github.com/reduxjs/redux-toolkit/pull/5406
- Read current query state when scheduled polls fire by @OskarEichler in https://github.com/reduxjs/redux-toolkit/pull/5412
- fix(toolkit): prevent undefined endpoint reference by @adamaveray in https://github.com/reduxjs/redux-toolkit/pull/5377
- fix(toolkit): tag with a falsy id invalidation and cleanup by @petr-kratochvil in https://github.com/reduxjs/redux-toolkit/pull/5398
- fix(rtk-query): add infinite query page error flags to hook result type by @mvpowers in https://github.com/reduxjs/redux-toolkit/pull/5441
- Reinstate lazy queries after preserved effects restart by @OskarEichler in https://github.com/reduxjs/redux-toolkit/pull/5424
- fix(toolkit): handle circular references in
immutableStateInvariantMiddlewareby @hamed-bavar in https://github.com/reduxjs/redux-toolkit/pull/5433 - Fix TS7 errors and update TS matrix by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5455
- Fix unstable selector reference inside of
useQueryStateandisSuccessduring refetch-after-error by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5456
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.12.0...v2.13.0
v2.12.0
This feature release adds RTK usage skills files (via TanStack Intent) exports the RTK Query hook options types for reusability, fixes issues with infinite query status flags and batching handling, and makes some small TS improvements.
We've generated agent skill files that are now included in the RTK package itself in a skills folder. They cover using and migrating to modern RTK, client and server state management, and handling side effects. You can point your agent at these skills yourself, or use TanStack Intent to pick them up.
The types for our RTK Query hook options are now exported, which lets you stop using Parameters to extract those types for use in your own code.
The types for listener middleware matchers were tweaked to allow interface-based type guards, not just type-based definitions.
The internal IgnorePaths type was renamed to IgnoredPaths for consistency.
We now use the built-in NoInfer util that comes with TS 5.4+.
We fixed handling of the isSuccess status flag when switching infinite query cache entries. This should prevent accidental UI flashes that were occurring due to this flag accidentally flipping.
We've added a 100ms timeout fallback to the autoBatch enhancer's requestAnimationFrame timer. We had several reports that rAF didn't work correctly when used in background tabs / opened windows, and that RTK never updated the UI. This should ensure that the updates flush correctly.
- Export hook options types for RTK Query hooks by @veeceey in https://github.com/reduxjs/redux-toolkit/pull/5218
- Add TanStack Intent skills for Redux Toolkit by @phryneas in https://github.com/reduxjs/redux-toolkit/pull/5249
- Keep isSuccess: true when switching infinite query cache entries by @riqts in https://github.com/reduxjs/redux-toolkit/pull/5268
- fix: allow interface-based type guards as listener matcher by @riqts in https://github.com/reduxjs/redux-toolkit/pull/5269
- fix: add setTimeout fallback to raf autoBatch strategy for background tabs by @riqts in https://github.com/reduxjs/redux-toolkit/pull/5273
- chore(toolkit): rename
IgnorePathstype toIgnoredPathsby @Ri5ha6h in https://github.com/reduxjs/redux-toolkit/pull/5284 - feat(toolkit)!: switch to native
NoInferutility type by @aryaemami59 in https://github.com/reduxjs/redux-toolkit/pull/5289
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.11.2...v2.12.0
v2.11.2
This bugfix release updates the AbortSignal handling to fall back if DOMException isn't available (such as RN environments), and updates the TypedUseInfiniteQueryHookResult type to correctly include fetchNextPage/fetchPreviousPage fields.
The AbortSignal changes in 2.11.1 used DOMException in a couple places to match the expected behavior of AbortSignal, but turns out that's not available in environments like React Native. We've updated the logic to fall back to a plain Error if DOMException isn't available.
The TypedUseInfiniteQueryHookResult type wasn't correctly including the fetchNextPage/fetchPreviousPage fields, and now it does.
- fix: use a normal Error when DOMException isn't available by @EskiMojo14 in https://github.com/reduxjs/redux-toolkit/pull/5161
- Include page functions in
TypedUseInfiniteQueryHookResultby @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5165
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.11.1...v2.11.2
v2.11.1
This bugfix release fixes an issue with our internal AbortSignal handling that was reported as causing an error in a rare reset situation. We've also restructured our publishing process to use NPM Trusted Publishing, and updated our TS support matrix to only support TS 5.4+.
We've previously done most of our releases semi-manually locally, with various release process CLI tools. With the changes to NPM publishing security and the recent wave of NPM attacks, we've updated our publishing process to solely use NPM Trusted Publishing via workflows. We've also done a hardening pass on our own CI setup.
We had done a couple releases via CI workflows previously, and later semi-manual releases caused PNPM to warn that RTK was no longer trusted. This release should be trusted and will resolve that issue.
Thanks to the e18e folks and their excellent guide at https://e18e.dev/docs/publishing for making this process easier!
We've previously mentioned rolling changes to our TS support matrix in release notes, but didn't officially document our support policy. We've added a description of the support policy (last 2 years of TS releases, matching DefinitelyTyped) and the current oldest TS version we support in the docs:
- https://redux-toolkit.js.org/introduction/getting-started#typescript
- https://redux-toolkit.js.org/usage/usage-with-typescript#introduction
As of today, we've updated the support matrix to be TS 5.4+ . As always, it's possible RTK will work if you're using an earlier version of TS, but we don't test against earlier versions and don't support any issues with those versions.
We have run an initial test with the upcoming TS 7.0 native tsgo release. We found a couple minor issues with our own TS build and test setup, but no obvious issues with using RTK with TS 7.0.
A user reported a rare edge case where the combination of resetApiState and retry() could lead to an error calling an AbortController. We've restructured our AbortController handling logic to avoid that (and simplified a bit of our internals in the process).
- Use trusted publishing and harden workflows by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5152
- Update TS typecheck matrix and add TS native job by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5155
- Officially document TS support by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5158
- Tweaks to AbortSignal logic by @EskiMojo14 in https://github.com/reduxjs/redux-toolkit/pull/5150
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.11.0...v2.11.1
@rtk-query/codegen-openapi@2.2.0
This feature release adds new RTKQ codegen config options for outputting regex constants when the pattern keyword is used in an OpenAPI definition, and defining explicit tag overrides on a per-endpoint basis as part of the codegen config.
- feat: (codegen) output regex patterns for generated schemas by @RhysOnlyBetter in https://github.com/reduxjs/redux-toolkit/pull/5146
- feat(codegen): support explicit tag overrides without altering defaults by @w3di in https://github.com/reduxjs/redux-toolkit/pull/5135
- Add test for #3369 by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5154
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/@rtk-query/codegen-openapi@2.1.0...@rtk-query/codegen-openapi@2.2.0
v2.11.0
This feature release upgrades our Immer dependency to v11 to pick up the additional recent performance optimizations, adds a new refetchCachedPages option to allow only fetching the first cached page, and fixes an issue with regex ignore paths in the immutability middleware.
As described in the release notes for v2.10.0, we recently put significant effort into profiling Immer, and contributed several PRs that aimed to optimize its update performance.
v2.10.0 updated to use Immer 10.2.0, which added the first smaller set of perf updates. That included a new Immer option to disable "strict iteration" to speed up iterating copied objects, and we specifically applied that change in RTK under the assumption that standard plain JS objects as Redux state shouldn't have unusual keys anyway. Overall, this appears to boost Immer update perf by ~+20% over v10.1 depending on update scenario.
Immer v11.0.0 was just released and contains the second perf PR, a major internal architectural rewrite to change the update finalization implementation from a recursive tree traversal to a set of targeted updates based on accessed and updated fields. Based on the benchmarks in the PR, this adds another ~+5% perf boost over the improvements in v10.2, again with variations depending on update scenario. In practice, the actual improvement may be better than that - the benchmarks list includes some array update cases which actually got a bit slower (and thus drag down the overall average), and a majority of update scenarios show anywhere from +25% to +60% faster than Immer v10.1!
As a practical example, we have an RTK Query stress test benchmark where we mount 1000 components with query hooks at once, unmount, then remount them. We ran the same benchmark steps for RTK 2.9 and Immer 10.1, and then RTK 2.10+ and Immer 11. The overall scripting time dropped by about 30% (3330ms -> 2350ms), and the amount of time spent in Immer methods and the RTK reducers dropped significantly:
Based on this, it appears to be a major improvement overall.
As with the instructions in v2.10.0: if by some chance your Redux app state relies on non-string keys, you can still manually call setUseStrictIteration(true) in your app code to retain compatibility there, but we don't expect that standard Redux apps will have to worry about that.
There are still two outstanding Immer perf PRs that may offer further improvements: one that adds an optional plugin to override array methods to avoid proxy creation overhead, and another experimental tweak to shallow copying that may be better with larger object sizes.
RTK Query's infinite query API was directly based on React Query's approach, including the pages cache structure and refetching behavior. By default, that means that when you trigger a refetch, both R-Q and RTKQ will try to sequentially refetch all pages currently in that cache entry. So, if there were 5 pages cached for an entry, they will try to fetch pages 0...4, in turn.
Some users have asked for the ability to only refetch the first page. This can be accomplished somewhat manually by directly updating the cache entry to eliminate the old pages and then triggering a refetch, but that's admittedly not very ergonomic.
We've merged a contributed PR that adds a new refetchCachedPages flag. This can be defined as part of infinite query endpoints, passed as an option to infinite query hooks, or passed as an option in initiate() calls or hook refetch() methods. If set to refetchCachedPages: false, it will only refetch the first page in the cache and not the remaining pages, thus shrinking the cache from N pages to 1 page.
We merged a fix to the immutability dev middleware where it was treating ignoredPath regexes as strings and not actually testing them correctly.
- Update Immer to v11 for better update performance by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5141
- fix: compare paths against Regex instances in ignoredPaths by @johnste in https://github.com/reduxjs/redux-toolkit/pull/5124
- Add refetchCachedPages option for infinite query by @rossmartin in https://github.com/reduxjs/redux-toolkit/pull/5016
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.10.1...v2.11.0
v2.10.1
This bugfix release fixes an issue with window access breaking in SSR due to the byte-shaving work in 2.10.
- Fix window SSR breakage by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5132
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.10.0...v2.10.1
v2.10.0
This feature release updates our Immer dep to 10.2 to pick up its performance improvements, has additional byte-shaving and internal performance updates, and fixes a combineSlices type issue.
Redux Toolkit has been built around Immer since the very first prototype in 2018. Use of Immer as the default in createSlice directly eliminated accidental mutations as a class of errors in Redux apps, and drastically simplified writing immutable updates in reducers.
We've had various issues filed over the years asking to make Immer optional, or raising concerns about Immer's perf. Immer is indeed slower than writing immutable updates by hand, but our stance has always been that Immer's DX is absolutely worth whatever modest perf cost it might incur, and that reducers are usually not the bottleneck in Redux apps anyway - it's usually the cost of updating the UI that's more expensive.
However, a year ago an issue was filed with some specific complaints about Immer perf being very slow. We investigated, ran benchmarks, and filed an Immer issue confirming that it had gotten noticeably slower over time. Immer author Michel Weststrate agreed, and said there were some potential tweaks and architectural changes that could be made, but didn't have time to look into them himself.
A couple months ago, we started investigating possible Immer perf improvements ourselves, including profiling various scenarios and comparing implementations of other similar immutable update libraries. After extensive research and development, we were able to file several PRs to improve Immer's perf: a set of smaller tweaks around iteration and caching, a couple much larger architectural changes, and a potential change to copying objects.
Immer 10.2.0 contains the first set of smaller perf improvements, and this RTK release updates our dependency to 10.2 to pick up those changes.
One important behavior note here: Earlier versions of Immer (8, 9, 10.1) added more handling for edge cases like symbol keys in objects. These changes made sense for correctness, but also contributed to the slowdown. Immer 10.2 now includes a new setUseStrictIteration option to allow only copying string keys in objects (using Object.keys() instead of Reflect.ownKeys()), but keeps the option as strict: true for compatibility with its own users. That default will likely change in Immer 11.
For RTK 2.10.0, we specifically import and call setUseStrictIteration(false), under the assumption that standard Redux state usage only involves string keys in plain JS objects! This should provide a ~10% speedup for Immer update operations. Given that expectation, we believe this is a reasonable feature change and only needs a minor version bump.
If by some chance you are using symbol keys in your Redux state, or in other Immer-powered updates in your Redux app, you can easily revert to the previous behavior by calling setUseStrictIteration(true) in your own app code.
Based on discussions with Michel, Immer v11 should come out in the near future with additional architectural changes for better perf, including optional support for faster array methods that would be available as an Immer plugin adding ~2KB bundle size. We will likely not turn that plugin on by default, but recommend that users enable it if they do frequent array ops in reducers.
We're happy to have contributed these perf improvements to Immer, and that they will benefit not just RTK users but all Immer users everywhere!
You can follow the additional discussion and progress updates in the main Immer perf update tracking issue.
We've tweaked some places where we were doing repeated filter().map().map() calls to micro-optimize those loops.
RTKQ tag invalidation was always reading from proxy-wrapped arrays when rewriting provided tags. It now reads from the plain arrays instead, providing a modest speedup.
We previously found that ESBuild wasn't deduplicating imports from the same libraries in separate files bundled together (ie import { useEffect as useEffect2/3/4/ } from 'react'). We've restructured our internals to ensure all external imports are only pulled in once.
We've done some extensive byte-shaving in various places in the codebase. The byte-shaving and import deduplication saves about 0.6K min from the RTKQ core, and 0.2K min from the RTKQ React bundle.
combineSlices now better handles cases where PreloadedState might not match the incoming type, such as persisted values.
- Improve perf for internal map/filter ops by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5126
- Update Immer dep to 10.2 and disable strict iteration for perf by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5127
- Deduplicate imports by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5128
- Byte-shave various chunks of code by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5129
- fix(combineSlices): Infer PreloadedState properly from provided slice by @EskiMojo14 in https://github.com/reduxjs/redux-toolkit/pull/5125
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.9.2...v2.10.0
v2.9.2
This bugfix release fixes a potential internal data leak in SSR environments, improves handling of headers in fetchBaseQuery, improves retry handling for unexpected errors and request aborts, and fixes a longstanding issue with prefetch leaving an unused subscription. We've also shipped a new graphqlRequestBaseQuery release with updated dependencies and better error handling.
We had a report that a Redux SSR app had internal subscription data showing up across different requests. After investigation, this was a bug introduced by the recent RTKQ perf optimizations, where the internal subscription fields were hoisted outside of the middleware setup and into createApi itself. This meant they existed outside of the per-store-instance lifecycle. We've reworked the logic to ensure the data is per-store again. We also fixed another issue that miscalculated when there was an active request while checking for cache entry cleanup.
Note that no actual app data was leaked in this case, just the internal subscription IDs that RTKQ uses in its own middleware to track the existence of subscriptions per cache entry.
We've updated fetchBaseQuery to avoid setting content-type in cases where a non-JSONifiable value like FormData is being passed as the request body, so that the browser can set that content type itself. It also now sets the accept header based on the selected responseHandler (JSON or text).
The retry util now respects the maxRetries option when catching unknown errors in addition to the existing known errors logic. It also now checks the request's AbortSignal and will stop retrying if aborted.
In conjunction with that, dispatching resetApiState will now abort all in-flight requests.
The prefetch util and usePrefetch hook had a long-standing issue where they would create a subscription for a cache entry, but there was no way to clean up that subscription. This meant that the cache entry was effectively permanent. They now initiate the request without adding a subscription. This will fetch the cache entry and leave it in the store for the keepUnusedDataFor period as intended, giving your app time to actually subscribe to the value (such as prefetching the cache entry in a route handler, and then subscribing in a component).
We've published @rtk-query/graphql-request-base-query v2.3.2, which updates the graphql-request dep to ^7. We also fixed an issue where the error handling rethrew unknown errors - it now returns {error} as a base query is supposed to.
- Fix potential subscription leakage in SSR environments by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5111
- Improve
fetchBaseQuerydefault headers handling by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5112 - Respect maxRetries for unexpected errors by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5113
- fix: update graphql-request dependency to include version ^7.0.0 by @eyesfocus in https://github.com/reduxjs/redux-toolkit/pull/4987
- Add
retryabort handling and abort onresetApiStateby @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5114 - Don't create subscriptions for prefetch calls by @markerikson in https://github.com/reduxjs/redux-toolkit/pull/5116
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.9.1...v2.9.2
v2.9.1
This bugfix release fixes how sorted entity adapters handle duplicate IDs, tweaks the TS types for RTKQ query state cache entries to improve how the data field is handled, and adds better cleanup for long-running listener middleware effects.
- fix(entityAdapter): ensure sorted addMany keeps first occurrence of duplicate ids by @demyanm in https://github.com/reduxjs/redux-toolkit/pull/5097
- fix(entityAdapter): ensure sorted setMany keeps just unique IDs in state.ids by @demyanm in https://github.com/reduxjs/redux-toolkit/pull/5107
- fix(types): ensure non-undefined
dataon isSuccess withexactOptionalPropertyTypesby @CO0Ki3 in https://github.com/reduxjs/redux-toolkit/pull/5088 - Allow executing effects that have become unsubscribed to be canceled by
listenerMiddleware.clearListenersby @chris-chambers in https://github.com/reduxjs/redux-toolkit/pull/5102
Full Changelog: https://github.com/reduxjs/redux-toolkit/compare/v2.9.0...v2.9.1