[Snyk] Upgrade @reduxjs/toolkit from 2.8.2 to 2.9.0 #527
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Snyk has created this PR to upgrade @reduxjs/toolkit from 2.8.2 to 2.9.0.
ℹ️ Keep your dependencies up-to-date. This makes it easier to fix existing vulnerabilities and to more quickly identify and fix newly disclosed vulnerabilities when they affect your project.
The recommended version is 1 version ahead of your current version.
The recommended version was released 25 days ago.
Release notes
Package name: @reduxjs/toolkit
This feature release rewrites RTK Query's internal subscription and polling systems and the
useStableQueryArgs
hook for better perf, adds automaticAbortSignal
handling to requests still in progress when a cache entry is removed, fixes a bug with thetransformResponse
option for queries, adds a newbuilder.addAsyncThunk
method, and fixes assorted other issues.Changelog
RTK Query Performance Improvements
We had reports that RTK Query could get very slow when there were thousands of subscriptions to the same cache entry. After investigation, we found that the internal polling logic was attempting to recalculate the minimum polling time after every new subscription was added. This was highly inefficient, as most subscriptions don't change polling settings, and it required repeated O(n) iteration over the growing list of subscriptions. We've rewritten that logic to debounce the update check and ensure a max of one polling value update per tick for the entire API instance.
Related, while working on the request abort changes, testing showed that use of plain
Record
s to hold subscription data was inefficient because we have to iterate keys to check size. We've rewritten the subscription handling internals to useMap
s instead, as well as restructuring some additional checks around in-flight requests.These two improvements drastically improved runtime perf for the thousands-of-subscriptions-one-cache-entry repro, eliminating RTK methods as visible hotspots in the perf profiles. It likely also improves perf for general usage as well.
We've also changed the implementation of our internal
useStableQueryArgs
hook to avoid callingserializeQueryArgs
on its value, which can avoid potential perf issues when a query takes a very large object as its cache key.Note
The internal logic switched from serializing the query arg to doing reference checks on nested values. This means that if you are passing a non-POJO value in a query arg, such as
useSomeQuery({a: new Set()})
, and you haverefetchOnMountOrArgChange
enabled, this will now trigger refeteches each time as theSet
references are now considered different based on equality instead of serialization.Abort Signal Handling on Cleanup
We've had numerous requests over time for various forms of "abort in-progress requests when the data is no longer needed / params change / component unmounts / some expensive request is taking too long". This is a complex topic with multiple potential use cases, and our standard answer has been that we don't want to abort those requests - after all, cache entries default to staying in memory for 1 minute after the last subscription is removed, so RTKQ's cache can still be updated when the request completes. That also means that it doesn't make sense to abort a request "on unmount".
However, it does then make sense to abort an in-progress request if the cache entry itself is removed. Given that, we've updated our cache handling to automatically call the existing
resPromise.abort()
method in that case, triggering theAbortSignal
attached to thebaseQuery
. The handling at that point depends on your app -fetchBaseQuery
should handle that, a custombaseQuery
orqueryFn
would need to listen to theAbortSignal
.We do have an open issue asking for further discussions of potential abort / cancelation use cases and would appreciate further feedback.
New Options
The builder callback used in
createReducer
andcreateSlice.extraReducers
now hasbuilder.addAsyncThunk
available, which allows handling specific actions from a thunk in the same way that you could define a thunk insidecreateSlice.reducers
:createApi
and individual endpoint definitions now accept askipSchemaValidation
option with an array of schema types to skip, ortrue
to skip validation entirely (in case you want to use a schema for its types, but the actual validation is expensive).Bug Fixes
The infinite query implementation accidentally changed the query internals to always run
transformResponse
if provided, including if you were usingupsertQueryData()
, which then broke. It's been fixed to only run on an actual query request.The internal changes to the structure of the
state.api.provided
structure broke our handling ofextractRehydrationInfo
- we've updated that to handle the changed structure.The infinite query status fields like
hasNextPage
are now a looser type ofboolean
initially, rather than strictlyfalse
.TS Types
We now export Immer's
WritableDraft
type to fix another non-portable types issue.We've added an
api.endpoints.myEndpoint.types.RawResultType
types-only field to match the other available fields.What's Changed
transformResponse
when aquery
is used by @ markerikson in #5049Full Changelog: v2.8.2...v2.9.0
This bugfix release fixes a bundle size regression in RTK Query from the build and packaging changes in v2.8.0.
If you're using v2.8.0 or v2.8.1, please upgrade to v2.8.2 right away to resolve that bundle size issue!
Changelog
RTK Query Bundle Size
In v2.8.0, we reworked our packaging setup to better support React Native. While there weren't many meaningful code changes, we did alter our bundling build config file. In the process, we lost the config options to externalize the
@ reduxjs/toolkit
core when building the RTK Query nested entry points. This resulted in a regression where the RTK core code also got bundled directly into the RTK Query artifacts, resulting in a significant size increase.This release fixes the build config and restores the previous RTKQ build artifact sizes.
What's Changed
Full Changelog: v2.8.1...v2.8.2
Important
Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open upgrade PRs.
For more information: