Skip to content

Latest commit

 

History

History
307 lines (204 loc) · 7.46 KB

CHANGELOG.md

File metadata and controls

307 lines (204 loc) · 7.46 KB

Change log

Changes in this project are primarily documented in the Github release notes:

Changes from v4.0.0 and earlier are documented in this file

This project adheres to Semantic Versioning.

v4.0.0 - 2018/09/30

New Features

Exposed selector dependencies (#251)
Use provided memoize function for selectors (#297)

Breaking Changes

Updated TypeScript typings (#274, #315)

v3.0.0 - 2017/03/24

New Features

Performance improvements (thanks to @johnhaley81)
Updated Typescript typings (thanks to everyone who helped)

Breaking Changes

For performance reasons, a selector is now not recalculated if its input is equal by reference (===).

Example:

import { createSelector } from 'reselect'

const mySelector = createSelector(
  state => state.values.filter(val => val < 5),
  values => {
    console.log('calling..')
    return values.reduce((acc, val) => acc + val, 0)
  }
)

var createSelector = require('./dist/reselect.js').createSelector

const mySelector = createSelector(
  state => state.values.filter(val => val < 5),
  values => {
    console.log('calling..')
    return values.reduce((acc, val) => acc + val, 0)
  }
)

var state1 = { values: [1, 2, 3, 4, 5, 6, 7, 8, 9] }
console.log(mySelector(state1))
state1.values = [3, 4, 5, 6, 7, 8, 9]
console.log(mySelector(state1))
var state2 = { values: [1, 2, 3, 4, 5, 6, 7, 8, 9] }
console.log(mySelector(state2))
var state3 = { values: [3, 4, 5, 6, 7] }
console.log(mySelector(state3))

Output in v2.5.4:

calling..
10
calling..
7
calling..
10
calling..
7

Output in v3.0.0:

calling..
10
10
calling..
10
calling..
7

v2.5.4 - 2016/09/17

Bug Fixes

Improve performance of defaultMemoize when using custom equality check. (#170)

v2.5.3 - 2016/07/04

Bug Fixes

Reverts a Typescript change that was a breaking change. It will be reinstated in a major release. (#145)

v2.5.2 - 2016/07/03

Bug Fixes

When a selector uses defaultMemoize, if an exception is thrown for a set of arguments then the selector should also throw when called again with those arguments. (#144)

v2.5.1 - 2016/04/21

Bug Fixes

Include es directory in package.json (#117)

v2.5.0 - 2016/04/21

New features

Add jsnext build (#116)

v2.4.0 - 2016/04/16

New features

Add umd build (#112)

v2.3.0 - 2016/04/07

New features

Add resultFunc property to selectors (#92)

v2.2.0 - 2016/03/15

New features

Add Typescript typings to package.json (#94)

v2.1.0 - 2016/03/03

New features

Add resetRecomputations method to selectors (#90)

v2.0.3 - 2016/02/01

New features

Fix bug (#78) in defaultMemoize which could cause the memoized value to be mistakenly returned for variadic functions.

v2.0.2 - 2016/01/14

New features

Fix IE8 support by compiling in 'loose' mode

v2.0.1 - 2015/11/08

Chore

Update README and github links since move to reduxjs.

v2.0.0 - 2015/10/02

Breaking Changes

createSelector, createStructuredSelector, and custom selector creators check arguments

Input selectors are now verified to be functions during selector creation. If verification fails an error is thrown, allowing for a useful stack trace

There is a small chance that this could cause a breaking change in code that contains a faulty selector that is never called.

v1.1.0 - 2015/09/16

New features

createStructuredSelector

createStructuredSelector is a convenience function that helps with a common pattern when using Reselect. The selector passed to a connect decorator often just takes other selectors and maps them to keys in an object:

const mySelectorA = state => state.a
const mySelectorB = state => state.b

const structuredSelector = createSelector(
  mySelectorA,
  mySelectorB,
  mySelectorC,
  (a, b, c) => ({
    a,
    b,
    c
  })
)

createStructuredSelector takes an object whose properties are input-selectors and returns a structured selector. The structured selector returns an object with the same keys as the inputSelectors argument, but with the selectors replaced with their values.

const mySelectorA = state => state.a
const mySelectorB = state => state.b

const structuredSelector = createStructuredSelector({
  x: mySelectorA,
  y: mySelectorB
})

const result = structuredSelector({ a: 1, b: 2 }) // will produce {x: 1, y: 2}

v1.0.0 - 2015/09/09

Breaking Changes

If upgrading from 0.0.2, see the release notes for v1.0.0-alpha

v1.0.0-alpha2 - 2015/09/01

New features

src directory included in npm package js:next field added to package.json

v1.0.0-alpha - 2015/09/01

Breaking Changes

createSelectorCreator takes a user specified memoize function instead of a custom valueEqualsFunc.

Before

import { isEqual } from 'lodash'
import { createSelectorCreator } from 'reselect'

const deepEqualsSelectorCreator = createSelectorCreator(isEqual)

After

import { isEqual } from 'lodash'
import { createSelectorCreator, defaultMemoize } from 'reselect'

const deepEqualsSelectorCreator = createSelectorCreator(defaultMemoize, isEqual)

New features

Variadic Dependencies

Selector creators can receive a variadic number of dependencies as well as an array of dependencies.

Before

const selector = createSelector(
  [state => state.a, state => state.b],
  (a, b) => a * b
)

After

const selector = createSelector(
  state => state.a,
  state => state.b,
  (a, b) => a * b
)

Access ownProps in Selector

Selector dependencies can receive a variadic number of parameters allowing a selector to receive ownProps passed from mapToProps in connect.

const selector = createSelector(
  state => state.a,
  (state, props) => state.b * props.c,
  (_, props) => props.d,
  (a, bc, d) => a + bc + d
)

Configurable Memoize Function

import { createSelectorCreator } from 'reselect'
import memoize from 'lodash.memoize'

let called = 0
const customSelectorCreator = createSelectorCreator(memoize, JSON.stringify)
const selector = customSelectorCreator(
  state => state.a,
  state => state.b,
  (a, b) => {
    called++
    return a + b
  }
)
assert.equal(selector({ a: 1, b: 2 }), 3)
assert.equal(selector({ a: 1, b: 2 }), 3)
assert.equal(called, 1)
assert.equal(selector({ a: 2, b: 3 }), 5)
assert.equal(called, 2)