Skip to content

HenrikJoreteg/create-selector

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
src
 
 
 
 
 
 
 
 
 
 

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

  • 5.0.0 Removed source maps from build. Fixed npm security warnings w/ audit.
  • 4.0.3 Optimizing selector resolution algorithm. Huge thanks to @rudionrails and @layflags.
  • 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

About

Wrapper for reselect to allow deferring creation of selectors.

Resources

Stars

Watchers

Forks

Packages

No packages published