Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update reselect: 4.1.1 → 4.1.4 (patch) #3668

Merged
merged 1 commit into from
Nov 24, 2021

Conversation

depfu[bot]
Copy link
Contributor

@depfu depfu bot commented Nov 24, 2021

Here is everything you need to know about this update. Please take a good look at what changed and the test results before merging this pull request.

What changed?

✳️ reselect (4.1.1 → 4.1.4) · Repo · Changelog

Release Notes

4.1.4

This release has (you guessed it) more fixes to the TS types: a change to parameter merging that fixes breakage with selectors and RTK Query's API state, a simplification of the OutputSelectorFields type to improve selector variable readability, another update to parameter merging to flag nested never fields as compile errors, and a fix to createStructuredSelector parameters to resolve a lib compilation problem.

Changelog

More TS Fixes

The parameter merging fixes in 4.1.3 tried to "unwrap/expand" the parameter types to make them more readable, such as showing intersected objects as {a, b, c} instead of {a} & {b} & {c}. This was done with a recursive expansion type. That turned out to break with the complex state types used by RTK Query. We've updated the type expansion to only be a single level instead, which fixes the compilation issue.

The OutputSelectorFields type previously took two generics: the Combiner function, and a Result type. This led to extra values being shown in hover previews for selectors. By inferring Result = ReturnType<Combiner>, we were able to drop the second generic and cut down on the amount of types shown in previews.

A user noted that intersected objects with top-level incompatible fields (like {a: string} & {a: number}) resulted in empty objects, but no compile error. We've updated the parameter merging to flag those as never and catch the problem at compile time. Deeper nested incompatible fields should already be caught by TS.

The previous fix to createStructuredSelector missed a step in the spreading process, which has now been fixed.

What's Changed

Full Changelog: v4.1.3...v4.1.4

4.1.3

This release rewrites the TS type inference of input selector parameters for correctness, fixes inference of createStructuredSelector inputs, and fixes an issue with the OutputSelectorFields type not being exported.

Changelog

Input Selector Parameter Inference Improvements

Reselect's types have always been extremely tricky, because it involves passing multiple input selectors with potentially heterogeneous, and then nested function composition of multiple selectors. Additionally, the input selectors can be passed as individual arguments or a single array of input selectors.

The 4.0.0 typedefs dealt with this by hand-writing dozens of overloads, which was absolutely impossible to maintain.

In 4.1, we took advantage of TS's improved abilities to infer array/tuple types to consolidate the typedefs.

One of the issues that happened as a result was that arguments at the same input parameter index were being "unioned" together, rather than "intersectioned". For example, in this complex selector:

  const input1 = (
    _: StateA,
    { testNumber }: { testNumber: number },
    c: number,
    d: string
  ) => testNumber

const input2 = (
_: StateA,
{ testString }: { testString: string },
c: number | string
) => testString

const input3 = (
_: StateA,
{ testBoolean }: { testBoolean: boolean },
c: number | string,
d: string
) => testBoolean

const input4 = (_: StateA, { testString2 }: { testString2: string }) =>
testString2

const testSelector = createSelector(
input1,
input2,
input3,
input4,
(testNumber, testString, testBoolean) => testNumber + testString
)

The second arg should end up as an object like {testNumber: number, testString: string, testBoolean: boolean, testString2: string}. However, it was ending up as four separate one-field objects. Similarly, the combination of number and number | string should be narrowed down to just number as an acceptable value.

We've rewritten the types to successfully accomplish that (although it took a lot of collective effort and headbanging to actually pull this off!) This should now give much more correct results when determining the final parameters that can be passed to a selector.

createStructuredSelector Fixes

Similarly, createStructuredSelector wasn't always inferring its arguments properly. We were able to reuse the parameter inference work here as well.

OutputSelectorFields Exported

The public OutputSelector type depended on an internal OutputSelectorFields type, but since OSF wasn't being exported, TS would throw errors when trying to generate declaration files that exported selectors. That is now public as well.

What's Changed

  • Rewrite function parameter type inference to fix assorted issues by @markerikson in #549

Full Changelog: v4.1.2...v4.1.3

4.1.2

This release updates the TS types to avoid TypeScript recursion limitations and improve backwards compatibility, adds doc comments to most of the TS types and field declarations, and fixes a bug with the behavior of the resultEqualityCheck option in defaultMemoize.

Changelog

TypeScript Updates

We saw cases where composition of selectors past 8-9 levels of nesting would cause TS to fail with a "Type instantiation is excessively deep and possibly infinite" error.

We've updated the types to allow additional recursion up to about 15 levels of nested selectors. Hopefully this is enough for most usages :)

The OutputSelector generic arguments had been swapped during the rewrite for 4.1, which made it incompatible with other code that attempted to import and use that type. We've reverted the generic arguments to their previous order to fix compatibility.

defaultMemoize adds a .clearCache() field to its return value. While the real caching is done by the memoizedResultFunc function, the actual returned selector has also been run through the memoizer and thus also has a .clearCache() field attached, but that wasn't captured in the types. We've updated the types to reflect that.

We've also added doc comments to almost all of the internal types for clarity, as well as comments to the returned fields on selectors.

resultEqualityCheck Behavior

The resultEqualityCheck option wasn't saving the result if there was a cache hit, which is now fixed.

What's Changed

  • Update defaultMemoize cache even if resultEqualityCheck is a hit by @tetslee in #535
  • Make OutputSelector backwards compatible w/ < 4.1.0 version by @eXamadeus in #536
  • Clarify description of createSelector by @acrollet in #539
  • Clean up OutputSelector typing and fix bug with memoize function types by @eXamadeus in #537

New Contributors

Full Changelog: v4.1.1...v4.1.2

Does any of this look wrong? Please let us know.

Commits

See the full diff on Github. The new version differs by 39 commits:


Depfu Status

Depfu will automatically keep this PR conflict-free, as long as you don't add any commits to this branch yourself. You can also trigger a rebase manually by commenting with @depfu rebase.

All Depfu comment commands
@​depfu rebase
Rebases against your default branch and redoes this update
@​depfu recreate
Recreates this PR, overwriting any edits that you've made to it
@​depfu merge
Merges this PR once your tests are passing and conflicts are resolved
@​depfu close
Closes this PR and deletes the branch
@​depfu reopen
Restores the branch and reopens this PR (if it's closed)
@​depfu pause
Ignores all future updates for this dependency and closes this PR
@​depfu pause [minor|major]
Ignores all future minor/major updates for this dependency and closes this PR
@​depfu resume
Future versions of this dependency will create PRs again (leaves this PR as is)

@depfu depfu bot added the dependencies Pull requests that update a dependency file label Nov 24, 2021
@depfu depfu bot requested review from canova and julienw November 24, 2021 04:58
@codecov
Copy link

codecov bot commented Nov 24, 2021

Codecov Report

Merging #3668 (059c796) into main (8da8e85) will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@           Coverage Diff           @@
##             main    #3668   +/-   ##
=======================================
  Coverage   88.77%   88.77%           
=======================================
  Files         259      259           
  Lines       21746    21746           
  Branches     5564     5564           
=======================================
  Hits        19305    19305           
  Misses       2262     2262           
  Partials      179      179           

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 8da8e85...059c796. Read the comment docs.

Copy link
Contributor

@julienw julienw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One perf fix, a lot of typescript fixes that we don't use, this looks good!

@julienw julienw merged commit 040c16f into main Nov 24, 2021
@depfu depfu bot deleted the depfu/update/yarn/reselect-4.1.4 branch November 24, 2021 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant