Skip to content

Conversation

renovate[bot]
Copy link
Contributor

@renovate renovate bot commented Sep 2, 2025

This PR contains the following updates:

Package Change Age Confidence
@babel/code-frame (source) ^8.0.0-beta.1 -> ^8.0.0-beta.2 age confidence
@babel/core (source) ^7.28.3 -> ^7.28.4 age confidence
@babel/eslint-parser (source) ^7.28.0 -> ^7.28.4 age confidence
@babel/runtime (source) ^7.28.3 -> ^7.28.4 age confidence
@eslint/js (source) ^9.34.0 -> ^9.35.0 age confidence
@reduxjs/toolkit (source) ^2.8.2 -> ^2.9.0 age confidence
@storybook/addon-onboarding (source) ^9.1.3 -> ^9.1.5 age confidence
@storybook/react-vite (source) ^9.1.3 -> ^9.1.5 age confidence
@types/chrome (source) ^0.1.4 -> ^0.1.6 age confidence
@types/node (source) ^22.18.0 -> ^22.18.1 age confidence
@types/semver (source) ^7.7.0 -> ^7.7.1 age confidence
@typescript-eslint/eslint-plugin (source) ^8.41.0 -> ^8.42.0 age confidence
@typescript-eslint/parser (source) ^8.41.0 -> ^8.42.0 age confidence
eslint (source) ^9.34.0 -> ^9.35.0 age confidence
jest (source) ^30.1.2 -> ^30.1.3 age confidence
storybook (source) ^9.1.3 -> ^9.1.5 age confidence
typescript-eslint (source) ^8.41.0 -> ^8.42.0 age confidence

Release Notes

babel/babel (@​babel/code-frame)

v8.0.0-beta.2

Compare Source

v8.0.0-beta.2 (2025-09-05)

💥 Breaking Change
🐛 Bug Fix
💅 Polish
🏠 Internal
Committers: 9
babel/babel (@​babel/core)

v7.28.4

Compare Source

🏠 Internal
eslint/eslint (@​eslint/js)

v9.35.0

Compare Source

reduxjs/redux-toolkit (@​reduxjs/toolkit)

v2.9.0

Compare Source

This feature release rewrites RTK Query's internal subscription and polling systems and the useStableQueryArgs hook for better perf, adds automatic AbortSignal handling to requests still in progress when a cache entry is removed, fixes a bug with the transformResponse option for queries, adds a new builder.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 Records to hold subscription data was inefficient because we have to iterate keys to check size. We've rewritten the subscription handling internals to use Maps 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 calling serializeQueryArgs 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 have refetchOnMountOrArgChange enabled, this will now trigger refeteches each time as the Set 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 the AbortSignal attached to the baseQuery. The handling at that point depends on your app - fetchBaseQuery should handle that, a custom baseQuery or queryFn would need to listen to the AbortSignal.

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 and createSlice.extraReducers now has builder.addAsyncThunk available, which allows handling specific actions from a thunk in the same way that you could define a thunk inside createSlice.reducers:

        const slice = createSlice({
          name: 'counter',
          initialState: {
            loading: false,
            errored: false,
            value: 0,
          },
          reducers: {},
          extraReducers: (builder) =>
            builder.addAsyncThunk(asyncThunk, {
              pending(state) {
                state.loading = true
              },
              fulfilled(state, action) {
                state.value = action.payload
              },
              rejected(state) {
                state.errored = true
              },
              settled(state) {
                state.loading = false
              },
            }),
        })

createApi and individual endpoint definitions now accept a skipSchemaValidation option with an array of schema types to skip, or true 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 using upsertQueryData(), 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 of extractRehydrationInfo - we've updated that to handle the changed structure.

The infinite query status fields like hasNextPage are now a looser type of boolean initially, rather than strictly false.

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

Full Changelog: reduxjs/redux-toolkit@v2.8.2...v2.9.0

storybookjs/storybook (@​storybook/addon-onboarding)

v9.1.5

Compare Source

9.1.5

v9.1.4

Compare Source

9.1.4

storybookjs/storybook (@​storybook/react-vite)

v9.1.5

Compare Source

v9.1.4

Compare Source

typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)

v8.42.0

Compare Source

🩹 Fixes
  • deps: update eslint monorepo to v9.33.0 (#​11482)

You can read about our versioning strategy and releases on our website.

typescript-eslint/typescript-eslint (@​typescript-eslint/parser)

v8.42.0

Compare Source

This was a version bump only for parser to align it with other projects, there were no code changes.

You can read about our versioning strategy and releases on our website.

eslint/eslint (eslint)

v9.35.0

Compare Source

jestjs/jest (jest)

v30.1.3

Compare Source

Fixes
  • Fix unstable_mockModule with node: prefixed core modules.
typescript-eslint/typescript-eslint (typescript-eslint)

v8.42.0

Compare Source

🚀 Features
🩹 Fixes
  • typescript-eslint: handle non-normalized windows paths produced by jiti (#​11546)
❤️ Thank You

You can read about our versioning strategy and releases on our website.


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

Copy link

changeset-bot bot commented Sep 2, 2025

⚠️ No Changeset found

Latest commit: 7a0971a

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@renovate renovate bot force-pushed the renovate/all-minor-patch branch from 31ee1dd to 1b43f8d Compare September 2, 2025 13:25
@renovate renovate bot changed the title chore(deps): update dependency storybook to ^9.1.4 chore(deps): update all non-major dependencies Sep 2, 2025
@renovate renovate bot force-pushed the renovate/all-minor-patch branch 2 times, most recently from 6b37801 to 6dd0fab Compare September 3, 2025 05:02
@renovate renovate bot changed the title chore(deps): update all non-major dependencies fix(deps): update all non-major dependencies Sep 3, 2025
@renovate renovate bot force-pushed the renovate/all-minor-patch branch 5 times, most recently from 59d8c0d to f64e113 Compare September 5, 2025 18:10
@renovate renovate bot force-pushed the renovate/all-minor-patch branch from f64e113 to 7a0971a Compare September 6, 2025 05:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

0 participants