chore(deps): update dependency redux to v5 #2282
Open
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.
This PR contains the following updates:
^3->^3 || ^5.0.03.7.2->5.0.1Release Notes
reduxjs/redux (redux)
v5.0.1Compare Source
This patch release adjusts the
isPlainObjectutil to allow objects created viaObject.create(null), and fixes a type issue which accidentally made the store state type non-nullable.What's Changed
Store['getState']by @exuanbo in https://github.com/reduxjs/redux/pull/4638Full Changelog: reduxjs/redux@v5.0.0...v5.0.1
v5.0.0Compare Source
This major release:
action.typemust be a stringcreateStoreas deprecatedAnyActiontype in favor of anUnknownActiontype that is used everywherePreloadedStatetype in favor of a new generic argument for theReducertype.This release has breaking changes.
This release is part of a wave of major versions of all the Redux packages: Redux Toolkit 2.0, Redux core 5.0, React-Redux 9.0, Reselect 5.0, and Redux Thunk 3.0.
For full details on all of the breaking changes and other significant changes to all of those packages, see the "Migrating to RTK 2.0 and Redux 5.0" migration guide in the Redux docs.
Changelog
ESM/CJS Package Compatibility
The biggest theme of the Redux v5 and RTK 2.0 releases is trying to get "true" ESM package publishing compatibility in place, while still supporting CJS in the published package.
The primary build artifact is now an ESM file,
dist/redux.mjs. Most build tools should pick this up. There's also a CJS artifact, and a second copy of the ESM file namedredux.legacy-esm.jsto support Webpack 4 (which does not recognize theexportsfield inpackage.json). Additionally, all of the build artifacts now live under./dist/in the published package.Modernized Build Output
We now publish modern JS syntax targeting ES2020, including optional chaining, object spread, and other modern syntax. If you need to
Build Tooling
We're now building the package using https://github.com/egoist/tsup. We also now include sourcemaps for the ESM and CJS artifacts.
Dropping UMD Builds
Redux has always shipped with UMD build artifacts. These are primarily meant for direct import as script tags, such as in a CodePen or a no-bundler build environment.
We've dropped those build artifacts from the published package, on the grounds that the use cases seem pretty rare today.
There's now a
redux.browser.mjsfile in the package that can be loaded from a CDN like Unpkg.If you have strong use cases for us continuing to include UMD build artifacts, please let us know!
createStoreMarked DeprecatedIn Redux 4.2.0, we marked the original
createStoremethod as@deprecated. Strictly speaking, this is not a breaking change, nor is it new in 5.0, but we're documenting it here for completeness.This deprecation is solely a visual indicator that is meant to encourage users to migrate their apps from legacy Redux patterns to use the modern Redux Toolkit APIs.
The deprecation results in a visual strikethrough when imported and used, like
, but with no runtime errors or warnings.createStorecreateStorewill continue to work indefinitely, and will not ever be removed. But, today we want all Redux users to be using Redux Toolkit for all of their Redux logic.To fix this, there are three options:
configureStorelegacy_createStoreAPI that is now exported, which is the exact same function but with no@deprecatedtag. The simplest option is to do an aliased import rename, likeimport { legacy_createStore as createStore } from 'redux'Action types must be strings
We've always specifically told our users that actions and state must be serializable, and that
action.typeshould be a string. This is both to ensure that actions are serializable, and to help provide a readable action history in the Redux DevTools.store.dispatch(action)now specifically enforces thataction.typemust be a string and will throw an error if not, in the same way it throws an error if the action is not a plain object.In practice, this was already true 99.99% of the time and shouldn't have any effect on users (especially those using Redux Toolkit and
createSlice), but there may be some legacy Redux codebases that opted to use Symbols as action types.TypeScript Changes
We've dropped support for TS 4.6 and earlier, and our support matrix is now TS 4.7+.
Typescript rewrite
In 2019, we began a community-powered conversion of the Redux codebase to TypeScript. The original effort was discussed in #3500: Port to TypeScript, and the work was integrated in PR #3536: Convert to TypeScript.
However, the TS-converted code sat around in the repo for several years, unused and unpublished, due to concerns about possible compatibility issues with the existing ecosystem (as well as general inertia on our part).
Redux core v5 is now built from that TS-converted source code. In theory, this should be almost identical in both runtime behavior and types to the 4.x build, but it's very likely that some of the changes may cause types issues.
Please report any unexpected compatibility issues!!
AnyActiondeprecated in favour ofUnknownActionThe Redux TS types have always exported an
AnyActiontype, which is defined to have{type: string}and treat any other field asany. This makes it easy to write uses likeconsole.log(action.whatever), but unfortunately does not provide any meaningful type safety.We now export an
UnknownActiontype, which treats all fields other thanaction.typeasunknown. This encourages users to write type guards that check the action object and assert its specific TS type. Inside of those checks, you can access a field with better type safety.UnknownActionis now the default any place in the Redux source that expects an action object.AnyActionstill exists for compatibility, but has been marked as deprecated.Note that Redux Toolkit's action creators have a
.match()method that acts as a useful type guard:You can also use the new
isActionutil to check if an unknown value is some kind of action object.Middlewaretype changed - Middlewareactionandnextare typed asunknownPreviously, the
nextparameter is typed as theDtype parameter passed, andactionis typed as theActionextracted from the dispatch type. Neither of these are a safe assumption:nextwould be typed to have all of the dispatch extensions, including the ones earlier in the chain that would no longer apply.nextas the default Dispatch implemented by the base redux store, however this would causenext(action)to error (as we cannot promiseactionis actually anAction) - and it wouldn't account for any following middlewares that return anything other than the action they're given when they see a specific action.actionis not necessarily a known action, it can be literally anything - for example a thunk would be a function with no.typeproperty (soAnyActionwould be inaccurate)We've changed
nextto be(action: unknown) => unknown(which is accurate, we have no idea whatnextexpects or will return), and changed theactionparameter to beunknown(which as above, is accurate).In order to safely interact with values or access fields inside of the
actionargument, you must first do a type guard check to narrow the type, such asisAction(action)orsomeActionCreator.match(action).This new type is incompatible with the v4
Middlewaretype, so if a package's middleware is saying it's incompatible, check which version of Redux it's getting its types from!PreloadedStatetype removed in favour ofReducergenericWe've made tweaks to the TS types to improve type safety and behavior.
First, the
Reducertype now has aPreloadedStatepossible generic:Per the explanation in #4491:
Why the need for this change? When the store is first created by
createStore/configureStore, the initial state is set to whatever is passed as thepreloadedStateargument (orundefinedif nothing is passed). That means that the first time that the reducer is called, it is called with thepreloadedState. After the first call, the reducer is always passed the current state (which isS).For most normal reducers,
S | undefinedaccurately describes what can be passed in for thepreloadedState. However thecombineReducersfunction allows for a preloaded state ofPartial<S> | undefined.The solution is to have a separate generic that represents what the reducer accepts for its preloaded state. That way
createStorecan then use that generic for itspreloadedStateargument.Previously, this was handled by a
$CombinedStatetype, but that complicated things and led to some user-reported issues. This removes the need for$CombinedStatealtogether.This change does include some breaking changes, but overall should not have a huge impact on users upgrading in user-land:
Reducer,ReducersMapObject, andcreateStore/configureStoretypes/function take an additionalPreloadedStategeneric which defaults toS.combineReducersare removed in favor of a single function definition that takes theReducersMapObjectas its generic parameter. Removing the overloads was necessary with these changes, since sometimes it was choosing the wrong overload.Other Changes
Internal Listener Implementation
The Redux store has always used an array to track listener callbacks, and used
listeners.findIndexto remove listeners on unsubscribe. As we found in React-Redux, that can have perf issues when many listeners are unsubscribing at once.In React-Redux, we fixed that with a more sophisticated linked list approach. Here, we've updated the
listenersto be stored in aMapinstead, which has better delete performance than an array.In practice this shouldn't have any real effect, because React-Redux sets up a subscription in
<Provider>, and all nested components subscribe to that. But, nice to fix it here as well.isActionPredicateWe recently added an
isActionpredicate to RTK, then realized it's better suited for the Redux core. This can be used anywhere you have a value that could be a Redux action object, and you need to check if it is actually an action. This is specifically useful for use with the updated Redux middleware TS types, where the default value is nowunknownand you need to use a type guard to tell TS that the current value is actually an action:We've also exported the
isPlainObjectutil that's been in the Redux codebase for years as well.What's Changed
Entirely too many PRs to list here, as it's been a few years since 4.2 was released :) See the diff below.
Full Changelog: reduxjs/redux@v4.2.1...v5.0.0
v4.2.1Compare Source
This bugfix release removes the
isMinifiedinternal check to fix a compat issue with Expo. That check has added in early 2016, soon after Redux 3.0 was released, at a time when it was still less common to use bundlers with proper production build settings. Today that check is irrelevant, so we've removed it.What's Changed
Full Changelog: reduxjs/redux@v4.2.0...v4.2.1
v4.2.0Compare Source
This release marks the original
createStoreAPI as@deprecatedto encourage users to migrate to Redux Toolkit, and adds a newlegacy_createStoreAPI as an alias without the deprecation warning.Goal
Redux Toolkit (the
@reduxjs/toolkitpackage) is the right way for Redux users to write Redux code today:https://redux.js.org/introduction/why-rtk-is-redux-today
Unfortunately, many tutorials are still showing legacy "hand-written" Redux patterns, which result in a much worse experience for users. New learners going through a bootcamp or an outdated Udemy course just follow the examples they're being shown, don't know that RTK is the better and recommended approach, and don't even think to look at our docs.
Given that, the goal is to provide them with a visual indicator in their editor, like
createStore. When users hover over thecreateStoreimport or function call, the doc tooltip recommends usingconfigureStorefrom RTK instead, and points them to that docs page. We hope that new learners will see the strikethrough, read the tooltip, read the docs page, learn about RTK, and begin using it.To be extremely clear:
WE ARE NOT GOING TO ACTUALLY REMOVE THE
createStoreAPI, AND ALL YOUR EXISTING CODE WILL STILL CONTINUE TO WORK AS-IS!We are just marking
createStoreas "deprecated":For additional details, see the extensive discussion in https://github.com/reduxjs/redux/issues/4325 .
Rationale
reduxcore package, or fully deprecate the entirereduxpackage and rename it to@reduxjs/core. Unfortunately, those bring up too many complexities:redux-starter-kitto@reduxjs/toolkit, and all of our docs and tutorials have pointed to it for the last three years. I don't want to put users through another whiplash package transition for no real benefitSo, this is the minimum possible approach we can take to reach out to users who otherwise would never know that they are following outdated patterns, while avoiding breaking running user code or having to completely rewrite our package and repo structure.
Results
When a user imports
createStorein their editor, they will see a visual strikethrough. Hovering over it will show a doc tooltip that encourages them to useconfigureStorefrom RTK, and points to an explanatory docs page:Again, no broken code, and no runtime warnings.
If users do not want to see that strikethrough, they have three options:
configureStorelegacy_createStoreAPI that is now exported, which is the exact same function but with no@deprecationtag. The simplest option is to do an aliased import rename:What's Changed
createStoreas deprecated, and addlegacy_createStorealias by @markerikson in https://github.com/reduxjs/redux/pull/4336Full Changelog: reduxjs/redux@v4.1.2...v4.2.0
v4.1.2Compare Source
This release fixes a small specific TS types issue where state types that had a nested
unknownfield inside would cause compilation failures when used as thepreloadedStateargument.What's Changed
Full Changelog: reduxjs/redux@v4.1.1...v4.1.2
v4.1.1Compare Source
Just a small fix for Safari users in development mode.
Changes
v4.1.0Compare Source
This release shrinks our bundle size via error message extraction, updates several error messages for clarity, and optimizes our list of runtime dependencies.
Overall, version 4.1 shrinks from 2.6K min+gz to 1.6K min+gz thanks to these changes.
Be sure to check out the Redux Toolkit 1.6 alpha containing our new "RTK Query" data fetching APIs! It also includes Redux 4.1 as a dependency.
Changelog
Error Message Extraction and Improvements
We now extract all of our error messages from production builds in order to save on bundle size, using a technique inspired from React's error code extraction. The error messages will still show as normal in development, but in production they will reference a specific numeric error code and provide a link to a Redux docs page that has the full error message.
An example of this is: https://redux.js.org/errors?code=5 , which shows the "can't subscribe while reducers are executing" error.
The error code extraction saves about 800 bytes out of a production build.
Thanks to @andrewmcgivery for doing all the hard work on implementing the error extraction!
We've also updated many of our error messages to provide additional details at runtime about what happened, especially runtime type checks such as "actions must be plain objects". They now provide a more specific type for the unexpected value, such as indicating
promiseorfunction:Dependency Updates
We've updated the list of runtime dependencies for Redux:
symbol-observablepolyfill. This shrinks bundle size by a few bytes,loose-envifydependency, which was only ever needed by Browserify users. If you still happen to be using Browserify, please review your build settings and see if you need to make any updates.@babel/runtimeto extract some additional helpers out of our bundle. It's likely that your app already is pulling in those helpers anyway, so that removes some potential duplication.Typing Tweaks
We've merged fixes for a couple edge cases in the 4.x TS typings related to state types.
Changes
v4.0.5Compare Source
This release includes a memory leak fix, and a fix for removing reducers with replaceReducer and combineReducers.
There are also some TypeScript changes, which require version 3.5 or higher. This also removes our
DeepPartialtype, which wasn't intended to be a public API. If you need this type, you can find an equivalent of likely higher quality in theutility-typespackage.Speaking of TypeScript, we are done with converting the code to TypeScript on
masterand are looking to get some TS improvements in before launching 5.0. If you're interested in helping, feel free to submit a PR with anything you'd like to contribute.Changes
v4.0.4Compare Source
This is a republish of 4.0.3 with an updated version of Babel to fix #3468
Changes
v4.0.3Compare Source
This is a quick revert of a change to our typings that broke compatibility. Apologies for the problems.
Also, if you are experiencing type errors related to
[Symbol.observable], please ensure you have the same version of redux installed for all your dependencies withnpm ls redux.Changes
combineReducers' type parameters (#3467 by @timdorr)v4.0.2Compare Source
This is a very minor release with some nice improvements to our TypeScript type definitions. Enjoy!
Changes
for in(#3371 by @pvorona)DeepPartialtype (#3369 by @OliverJAsh)combineReducers(#3411 by @appden)v4.0.1Compare Source
A very minor release. We've upgraded to Babel 7 internally and now provide a
.mjsfile which you can import cleanly into browsers that support ES modules natively. Enjoy!Changes
4a215fbby @timdorr)b9ee1cfby @timdorr)v4.0.0Compare Source
Redux 4 is here! 🎉
If you're a React user, this is going to be a lot like going from 15 to 16. Not a lot of user-facing changes, but some interesting improvements under the hood.
The major changes (#1342) are around our TypeScript definitions, bundled CommonJS and ES builds, throwing if you subscribe or getState from a reducer, and a bunch of other smaller things. The full changes are listed below.
Enjoy!
Changes
this(#2641 by @Parakleta)b62248bby @timdorr)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.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.