Wrapper for reselect to allow deferring creation of selectors.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.gitignore
README.md
package-lock.json
package.json
test.js

README.md

create-selector

No Maintenance Intended

Simple util that wraps reselect's createSelector but adds the ability to define selector dependencies as strings, then resolve them later.

This makes it easier to compose selectors from different parts of your app or combine functionality from different app bundles without having to have direct references to input functions when you're defining them.

In this way you can defer the creation of a selector and populate it later without needing to have direct references to the input selectors when you're first defining it.

Just like reselect, it also attaches the last function as a .resultFunc property for easy testing without needing all the input functions.

example

import { createSelector, resolveSelectors } from 'create-selector'

export const selectUserData = state => state.user
export const shouldFetchData = createSelector(
  'selectIsLoggedIn',
  selectUserData,
  (loggedIn, userData) => {
    if (loggedIn && !userData) {
      return true
    }
  }
)
import { shouldFetchData } from './other-selectors'
import { selectIsLoggedIn } from './auth-selectors'

// later, you can aggregate them
const selectorAggregator = {
  selectIsLoggedIn,
  shouldFetchData
}

// resolves all the string references with the real ones recursively
// until you've got an object with all your selectors combined
resolveSelectors(selectorAggregator)

that's it!

Notes

  • There's some tests to show this does what it's supposed to but most of the actual work happens in reselect.
  • It tolerates mixing in real selectors too (even if they were created with reselect, directly).

install

npm install create-selector

changes

  • 4.0.1 building with microbundle (should fix issues with module field in package.json)
  • 2.2.0
    • added support for fully resolved input selectors not having to be on the final object
    • improved error handling
    • more test coverage
    • updated dependencies

credits

If you like this follow @HenrikJoreteg on twitter. But in terms of credit, this is just a simple util on top of reselect all the real magic is in there.

license

MIT