Skip to content

chore(deps): update frontend-deps - #643

Merged
renovate[bot] merged 1 commit into
developfrom
renovate/frontend-deps
Nov 7, 2026
Merged

renovate[bot] merged 1 commit into
developfrom
renovate/frontend-deps

Conversation

@renovate

@renovate renovate Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@reduxjs/toolkit (source) 2.13.0 → 2.14.0 age confidence
@tailwindcss/postcss (source) 4.3.3 → 4.3.5 age confidence
@vitejs/plugin-react (source) 6.1.2 → 6.2.1 age confidence
globals 17.13.0 → 17.14.0 age confidence
tailwindcss (source) 4.3.3 → 4.3.5 age confidence
vite (source) 8.3.5 → 8.3.6 age confidence

Release Notes

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

v2.14.0

Compare Source

This feature release speeds up the dispatch path and RTK Query's Api type checking, shrinks createSlice in esbuild bundles, adds RTK-owned Draft and Patch types so emitted declarations no longer reference Immer, adds removeMany({ where }) and selectByIds to the entity adapter, adds RTK Query cache entry selectors and a DevTools action sanitizer, and fixes a very long list of RTK Query lifecycle, polling, upsert, timer, hook and fetchBaseQuery bugs.

Note that we just announced our roadmap to Redux Toolkit 3.0, which includes both a large set of planned 2.x features and improvements, and planned 3.0 breaking changes. The fixes and updates in this release help pave the way for all of those efforts. We'd also appreciate feedback on the linked RTK Query usage patterns and 3.0 planned breaking changes discussion threads.

Changelog

Dispatch Performance

Every dispatched action runs through every reducer and middleware, so small costs on that path add up. We added a benchmark harness for the dispatch path and used it to find several places where RTK did work for actions it didn't care about.

createAction(...).match now compares action.type before calling isAction, so a non-matching action costs a property read. createReducer no longer allocates arrays on every dispatch to collect case and matcher reducers. Since createSlice builds its reducer with createReducer, every slice reducer gets this improvement.

The listener middleware used to copy its listener list and call every predicate for every action. It now keeps a snapshot that is rebuilt only when listeners are added or removed, and that snapshot knows which action types have type or actionCreator listeners. If an action's type isn't in that set and there are no matcher or predicate listeners, the middleware skips the loop entirely.

The RTK Query root reducer now returns the existing state for actions that none of its slices handle, instead of running all five slice reducers. It also skips rewriting a query's provided tags when the new tags are the same as the stored ones, so re-fetching a query that returns the same tags no longer creates new provided state.

Some numbers from the PR benchmarks (Node 26, ops/sec unless noted):

Scenario Before After
Listener middleware, 200 listeners, unrelated action 108K 5.34M
Listener middleware, 200 actionCreator listeners, matching action 100K 612K
createSlice, 20 slices, unrelated action 320K 394K
RTKQ store, unrelated action 352K 468K
RTKQ re-dispatch of a fulfilled query with unchanged tags, 1000 entries (ms per dispatch) 2.50 0.55

The listener middleware numbers are the biggest change, because the old cost grew with the number of listeners. Apps with a handful of listeners will see much smaller gains.

The RTK Query middleware also does less work keeping the store's subscriptions state in sync (#​5499). It used to JSON-copy the whole subscriptions object and diff it with Immer every 500ms while subscriptions were changing. It now records which cache keys changed and writes one patch per key. Keys that didn't change keep their object references, so the Redux DevTools no longer receive a full copy of subscriptions on every sync. Polls, refetch() calls and tag invalidation refetches don't add subscribers, so they no longer schedule a sync at all. The visible difference: a cache key that only ever had subscribe: false requests no longer shows up as an empty {} in subscriptions.

Smaller createSlice Bundles With esbuild

createSlice references asyncThunkCreator so that create.asyncThunk works in the reducers callback. esbuild couldn't tell that the asyncThunkCreator object was free of side effects, so it always bundled createAsyncThunk along with createSlice. webpack already dropped it. We've marked it as pure, and an esbuild bundle that imports only createSlice is now about 1 kB smaller (brotli).

Faster RTK Query Api Type Checking

The Api type combines every registered module (core, React hooks, and any third-party modules) by running UnionToIntersection over the module names. TanStack Table hit the same cost with the same design, and found that writing out the known intersection and adding variance annotations helped a lot.

We've done the same thing here: Api uses the core module type directly, and ApiModules has in out variance annotations. On a test app with one ~50-endpoint createApi, type instantiations dropped 22% and check time dropped about 25% on TS 6, and about 18% on the TS 7 native preview. Third-party modules like ngrx-rtk-query saw 7-8% fewer instantiations. There are no runtime changes.

RTK-Owned Draft and Patch Types

RTK used to re-export Immer's Draft type, and used Immer's types in signatures like CaseReducer and PatchCollection. That meant the .d.ts files TypeScript generated for your slices referenced immer. With a package manager layout where immer isn't hoisted, those declarations failed to build with TS2883 (#​5516). Re-exporting doesn't fix that, so RTK now declares its own Draft, WritableDraft and Patch types with the same shapes as Immer's. Emitted declarations now point at @reduxjs/toolkit instead. Our type tests check that RTK's Draft and Immer's Draft stay interchangeable, so code that mixes castDraft or current with RTK's types keeps working. We also bumped the immer dependency to ^11.2.9.

There are a few other type additions in this release:

  • ApiRootState replaces RTK Query's RootState type, which is now deprecated. RootState will be removed in 3.0.
  • TypedAddListenerAction and TypedRemoveListenerAction describe the actions that addListener and removeListener actually dispatch. The default payload type of TypedAddListener and TypedRemoveListener is now the listener options object, so addListener.match(action) no longer claims action.payload has fields like id and unsubscribe that don't exist at runtime.
  • dispatch(removeListener(...)) is typed as returning boolean and dispatch(clearAllListeners()) as returning void, matching the runtime.
  • UseQueryStateDefaultResult and UseInfiniteQueryStateDefaultResult are exported from @reduxjs/toolkit/query/react, for wrapping hooks with a generic selectFromResult.
RTK Query Cache Entry Selectors

We've had requests for a way to list everything in the cache for an endpoint (#​2995). api.util.selectEntriesForEndpoint(state, endpointName) returns all cache entries for one query or infinite query endpoint, and api.util.selectAllQueryEntries(state) returns them for every endpoint. Each item has the entry's fields plus its queryCacheKey, and is typed for its endpoint. Both selectors are memoized. There's also a new exported QueryCacheEntry<Definition> type.

const postEntries = api.util.selectEntriesForEndpoint(state, 'getPost')
const loadedPostIds = postEntries
  .filter((entry) => entry.status === 'fulfilled')
  .map((entry) => entry.originalArgs)
DevTools Action Sanitizer

All RTK Query requests use the same few action types, so the Redux DevTools show a long list of api/executeQuery/fulfilled actions, and you have to open each one to see which endpoint it was for. The new createApiActionSanitizer(api) returns a function for the DevTools actionSanitizer option that renames those actions for display, like api/executeQuery/fulfilled (getPosts). The dispatched actions aren't modified.

import { configureStore } from '@reduxjs/toolkit'
import { createApiActionSanitizer } from '@reduxjs/toolkit/query'
import { api } from './api'

export const store = configureStore({
  reducer: {
    [api.reducerPath]: api.reducer,
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(api.middleware),
  devTools: {
    actionSanitizer: createApiActionSanitizer(api),
  },
})

See the createApiActionSanitizer docs for combining sanitizers for multiple APIs.

Entity Adapter Additions

adapter.removeMany now accepts a { where } object, and removes every entity whose fields match all the given values (#​5524):

postsAdapter.removeMany(state, { where: { authorId: 5 } })

The match object is typed as Partial<T>, and values are compared with ===. A where object with no keys removes nothing, so a filter built at runtime that ends up empty can't clear the collection by accident. Use removeAll for that. There's also a new exported RemoveManyFilter<T> type.

getSelectors() now includes selectByIds(state, ids), which returns the entities for the given ids in the order of ids, skipping ids that don't exist.

removeMany is also faster. It used to filter the Immer draft of the ids array, which reads every element through the draft proxy. It now filters a plain copy against a Set of removed ids.

RTK Query Fixes

Lifecycles: cacheDataLoaded now only resolves for a response from a request that started while that lifecycle was waiting. A late response from before a removeQueryResult no longer resolves the next lifecycle on the same key with discarded data. Re-triggering a mutation with the same fixedCacheKey now ends the previous onCacheEntryAdded lifecycle, so its cacheEntryRemoved cleanup runs instead of leaking. If that earlier trigger is still in flight, its cacheDataLoaded now rejects instead of never settling. Thanks to @​hamarshehmhmd for the analysis in #​5539. getCacheEntry() in a mutation's onQueryStarted now finds the entry for fixedCacheKey mutations instead of always returning uninitialized.

Synchronous throws from onQueryStarted and onCacheEntryAdded are now caught and logged with console.error. Before, a sync throw in onQueryStarted escaped the pending dispatch and failed the request without ever calling queryFn. We also added a dev warning when updateCachedData is called before the entry has any data, since that call does nothing.

Polling: Polling now stops after the last unsubscribe even if the subscription cleanup hasn't run yet (thanks to @​LeulTew for the original fix in #​5444). A due poll re-reads skipPollingIfUnfocused instead of using the value from when the timer was set, and skips the poll if a request for that entry is already pending. pollingInterval values above 2^31-1 ms are now clamped with a dev warning, since larger values overflow setTimeout and fire after 1ms. Removing a cache entry with removeQueryResult now stops its poll timer right away, and switching a subscriber to a slower pollingInterval now reschedules the pending poll instead of letting the old, faster one fire once more. We also fixed a stale internal poll record that could block updatePollingInterval, and fetchBaseQuery now clears its timeout timer when the request finishes.

Upserts: A failed upsertQueryData over an existing entry (for example, from a responseSchema validation error) no longer leaves that entry stuck in pending. upsertQueryEntries now skips bad entries one at a time instead of failing the whole batch: unknown or mutation endpoint names and throwing providesTags callbacks are skipped, with dev warnings.

Timers and multiple stores: resetApiState now clears the subscription sync timer and the state for delayed tag invalidation, so work scheduled before the reset can't fire afterward. A keepUnusedDataFor removal timer is now cleared when the key gets a new subscriber or is removed with removeQueryResult, so an old timer can't remove a newer entry for the same key. Repeated initiate(arg, { subscribe: false }) calls that hit the cache no longer push back the keepUnusedDataFor removal, which could keep unused data around indefinitely (#​4480, thanks @​veksa!). setupListeners now works with more than one store. Before, only the first store got focus and online events.

Hooks: A query that failed before it ever got data now reports isLoading: true when it refetches, instead of having isLoading, isError and data all falsy while the request is pending (#​4449, thanks @​AnimeshPandey!). This undoes a change from 2.2.4 (#​4364) that kept isLoading false when a second hook subscribed to an errored entry. If a parent renders null while isLoading is true and a child mounts the same query, the parent now unmounts the child on each refetch, and the two can loop. Render the child based on data or isError instead. Query args containing NaN no longer cause an endless refetch loop when the query errors. This was a regression from 2.9.0, where arg comparison treated NaN as never equal to itself (#​5338, thanks @​aagostino31!). fetchNextPage() and fetchPreviousPage() no longer send a request when the infinite query hook's arg is skipToken, and initiate(skipToken) no longer sends a request for any query or infinite query endpoint (#​5028, thanks @​haigou-web!).

fetchBaseQuery: A null body no longer throws Cannot read properties of null before the request is sent (thanks @​dfedoryshchev!). An explicit content-type header is now kept for ArrayBuffer, typed array and Blob bodies, which broke presigned S3 and GCS uploads. It's still removed for FormData and for a JSON content type on a non-JSON body, and that JSON content type check is now case-insensitive (thanks @​tad-bit-better!). A custom responseHandler that throws or rejects with a falsy value like undefined now produces a PARSING_ERROR, instead of being treated as a successful response (#​5480, thanks @​JunaidAhamed-7777!). A timeout that fires while the response body is being read is now reported as TIMEOUT_ERROR instead of PARSING_ERROR (thanks @​Gurmehar-git!).

Other RTKQ fixes: An overlapping refetch now stays registered as the running query, so later calls join it and aborting it works (thanks @​tedy69!). Apps with many createApi middlewares could hit a "Maximum call stack size exceeded" error when the middlewares registered themselves on the first query. Registration no longer restarts dispatch from the start of the middleware chain (thanks @​PabloJoan!). api.enhanceEndpoints({ endpoints }) now logs an error in development when it names an endpoint that doesn't exist, which usually means a typo.

RTK Query thunk actions now include startedTimeStamp and a per-store seq counter in the fulfilled and rejected-with-value meta, matching the request's pending action, so you can tell which request a response belongs to and in what order requests started. Rejections for aborted requests and unhandled errors don't include these fields yet.

Other Fixes

The listener middleware's take(), condition() and delay() no longer leave their timers running after the listener is cancelled or the action arrives first.

The autoBatchEnhancer raf fallback no longer throws a cancelAnimationFrame ReferenceError in test environments that delete window globals during teardown (thanks @​msutkowski!).

RTK Query hooks now log a dev warning when they render with a different store than the one they first subscribed to. If you swap the store passed to <Provider>, give the Provider a key that changes with the store so the tree remounts.

The serializability check middleware now reports a circular reference in state or actions as a non-serializable value, instead of overflowing the stack (thanks @​OskarEichler!).

@types/react is now declared as an optional peer dependency. RTK's React entry points import React types, and with pnpm's isolated linker or a global virtual store, TypeScript couldn't find them and those types became any (thanks @​unrevised6419!).

What's Changed

Full Changelog: reduxjs/redux-toolkit@v2.13.0...v2.14.0

tailwindlabs/tailwindcss (@​tailwindcss/postcss)

v4.3.5

Compare Source

Fixed
  • Canonicalization: improve performance in projects with many functional variant values (e.g. a matchVariant plugin with thousands of values) (#​20663)
  • Don't crash or create a fallback with the wrong color for a color-mix(…) without a color interpolation method (e.g. color-mix(var(--color-red-500)) or color-mix(currentcolor 50%, transparent)) (#​20658, #​20666)
  • Ensure @tailwindcss/oxide-wasm32-wasi loads instead of hanging forever (e.g. with NAPI_RS_FORCE_WASI=error or in WebContainers) (#​20667)
  • Remove as: '*.css' from the @tailwindcss/turbopack setup in its README, because it breaks CSS modules (#​20660)
  • Ignore <!-- and --> between top-level rules in CSS instead of throwing or swallowing the next rule (e.g. a { color: red } --> b { color: blue }) (#​20665)
  • Ensure @tailwindcss/oxide-wasm32-wasi detects changed and new source files after the first scan (e.g. in WebContainers) (#​20487)
  • Prevent type errors with skipLibCheck: false caused by imports of unshipped modules in the @tailwindcss/node type declarations (#​20632)

v4.3.4

Compare Source

Added
  • Add @tailwindcss/turbopack, a Turbopack loader for using Tailwind CSS with Next.js (#​20367)
Fixed
  • Ensure watch mode detects changes to symlinked @source files whose real paths aren't otherwise scanned (#​20356)
  • Ensure variants using @scope wrap generated utilities instead of nesting inside them (#​20369)
  • Ensure nested @scope rules preserve their scoping semantics when flattened (#​20369)
  • Preserve declarations directly inside @scope by wrapping them in :where(:scope) (#​20369)
  • Ensure generated utilities include a space in empty var() fallbacks (e.g. var(--tw-blur,) → var(--tw-blur, )) (#​20373)
  • Canonicalization: convert arbitrary breakpoint and container query variants to named equivalents (e.g. max-[64rem]:flex → max-lg:flex) (#​20380)
  • Prevent @tailwindcss/vite from crashing on every edit under Vite's experimental bundledDev mode (#​20379)
  • Ensure @tailwindcss/oxide falls back to WASM on platforms without native bindings (#​20383)
  • Extract class candidates from Ruby %w and %W literals using angle brackets or custom delimiters (e.g. %w<flex>, %w|flex|), including in Slim and Haml templates (#​20387)
  • Preserve whitespace in --default(…) values in functional @utility definitions (e.g. --default(box alphabetic) no longer becomes boxalphabetic) (#​20392)
  • Ensure automatic source detection respects negation-based .gitignore files (e.g. /* followed by !/… patterns) (#​20397)
  • Ensure root theme('…') namespace lookups in JavaScript plugins and config files return the full namespace object instead of the value of its DEFAULT key (#​20399)
  • Skip ignored directories when generating watch globs instead of walking their contents on every rebuild (#​20408)
  • Drop invalid UTF-8 candidates during class detection (#​20389)
  • Prevent @tailwindcss/vite from forcing full-page reloads for scanned files that Vite does not handle as modules (e.g. .php files) (#​20414)
  • Canonicalization: don't merge utilities that reference different theme variables set to CSS-wide keywords like unset (#​20417)
  • Don't generate utilities when a modifier is used that would otherwise be silently ignored (e.g. rounded-sm/[5], shadow-sm/foo, stroke-2/50) (#​20419)
  • Preserve and, or, and not inside selectors in supports-[…] variants (e.g. supports-[selector(a:not(.foo))]:flex) (#​20420)
  • Don't warn about Angular's ::ng-deep and :host-context() when optimizing CSS (#​20434)
  • Don't generate CSS for candidates containing an empty additional modifier (e.g. bg-red-500/50/ and group-hover/foo//bar:flex) (#​20466)
  • Ensure min-*, max-*, and container query variants with decimal values are sorted numerically (e.g. min-[40.25rem] before min-[40.5rem]) (#​20512)
  • Ensure CSS comments ending with \*/ are closed correctly instead of swallowing the CSS that follows (e.g. /* C:\temp\*/) (#​20508)
  • Improve style invalidation performance of group-* and peer-* variants (#​20513)
  • Ensure cached compilers release their loadModule and loadStylesheet callbacks after compilation (#​20531)
  • Canonicalization: preserve & when moving a pseudo-element into * or ** (e.g. [&_::before]:flex → **:[&::before]:flex) (#​20550)
  • Ensure the Set.prototype.intersection polyfill in canonicalizeCandidates(…) returns the intersection instead of the first set on Node.js < 22 (#​20562)
  • Canonicalization: ensure inline theme(…) alphas with more than 2 decimals migrate to a percentage modifier with the same opacity (e.g. theme(colors.red.500/.12345) → text-red-500/[12.345%], not text-red-500/[12.345]) (#​20563)
  • Canonicalization: preserve inline theme(…) alphas as an arbitrary percentage when a custom --opacity-* theme value would change the opacity (e.g. theme(colors.red.500/50%) → text-red-500/[50%] with --opacity-50: 10%) (#​20563)
  • Ensure the @property fallback isn't applied in Safari versions that no longer support margin-trim: inline (#​20569)
  • Treat viewport units like dvmin and svi and font-relative units like cap and rex as lengths in arbitrary values (e.g. text-[10dvmin] generates font-size instead of color) (#​20516)
  • Write plugin logs to stderr in tailwindcss canonicalize so they don't end up in the results on stdout (#​20561)
  • Extract class shorthands on later lines when Pug text, comments, or quoted attribute values contain unbalanced brackets, or a quote that doesn't start a string (e.g. input(pattern=/"/.source)) (#​20547, #​20572)
  • Underline the correct occurrence of an unsupported data type in --value(…) warnings (#​20554)
  • Canonicalization: prefer an existing candidate when collapsing utilities over another utility with the same default theme value (e.g. text-foreground text-primary → text-primary, not text-card-checked-border) (#​20540)
  • Canonicalization: don't collapse utilities into a utility that uses another theme variable with the same default value (e.g. mt-card mb-card → my-card, not my-4) (#​20574)
  • Ensure @tailwindcss/postcss rewrites relative url(…)s of stylesheets that are inlined before it runs (e.g. @imports in Vite) in optimized builds (#​20576)
  • Drop nested rules that put a combinator after a pseudo-element when using pseudo-element variants (e.g. selection:* on a utility with a nested & > * rule) (#​20575)
  • Don't generate CSS for arbitrary values with unbalanced parentheses or brackets (e.g. w-[calc(1px] or [--x:a[b]) (#​20577)
  • Canonicalization: prevent collapse: true from taking exponentially longer when classes are linked through a utility that sets many properties (e.g. sr-only) (#​20558)
  • Ensure & is substituted inside :-moz-any(…) and :-webkit-any(…) in custom variants (e.g. @custom-variant firefox (:-moz-any(&));) (#​20486)
  • Ensure the standalone macOS binaries have a valid code signature, so macOS 27 no longer kills them at launch (#​20578)
  • Ensure @tailwindcss/turbopack and @tailwindcss/webpack rebuild when the input CSS changes (e.g. next dev with Turbopack no longer serves the CSS of the previous edit) (#​20582)
  • Canonicalization: don't drop a utility that sets a --tw-* variable when an unrelated property has the same value (e.g. link mt-4 no longer becomes mt-4 when link sets margin-top: 16px and --tw-translate-x: 16px) (#​20593)
  • Decode single-digit hexadecimal escapes in theme variable and @utility names as the CSS spec does (e.g. @theme { --color-\0: red; } no longer registers --color-0) (#​20591)
  • Don't treat !important inside strings, comments or url() in declaration values as the important flag (e.g. content: "a !important b") (#​20627)
  • Parse a custom property at the end of the input when it has no trailing ; (e.g. --foo: bar as the last declaration) (#​20653)
  • Keep a declaration without a ; at the end of the CSS input (e.g. color: red) (#​20655)
vitejs/vite-plugin-react (@​vitejs/plugin-react)

v6.2.1

Compare Source

Fix refreshInclude and refreshExclude options not working (#​1543)

Fix mistake from #​1516

v6.2.0

Compare Source

Add refreshInclude and refreshExclude options (#​1516)

Add refreshInclude and refreshExclude options to skip fast refresh for certain files that won't run in the browser.

Expand oxc-transform-react peer dependency range (#​1540)

The peer dependency version range for oxc-transform-react was expanded from ^0.152.0 to >=0.152.0 <0.157.0.

Expand @rolldown/plugin-babel peer dependency range (#​1541)

The peer dependency version range for @rolldown/plugin-babel was expanded from ^0.1.7 || ^0.2.0 to ^0.1.7 || ^0.2.0 || ^0.3.0.

sindresorhus/globals (globals)

v17.14.0

Compare Source


vitejs/vite (vite)

v8.3.6

Compare Source

Bug Fixes
Performance Improvements

[!IMPORTANT]
✂ PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • "every weekend"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

♻ Rebasing: Whenever PR is behind base branch, 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.

@renovate
renovate Bot merged commit cb75f8b into develop Nov 7, 2026
2 checks passed
@renovate
renovate Bot deleted the renovate/frontend-deps branch November 7, 2026 05:12
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