@@ -105,10 +105,10 @@ function createBindingCache( bind ) {
105105 const cache = new WeakMap ( ) ;
106106
107107 return {
108- get ( item ) {
108+ get ( item , itemName ) {
109109 let boundItem = cache . get ( item ) ;
110110 if ( ! boundItem ) {
111- boundItem = bind ( item ) ;
111+ boundItem = bind ( item , itemName ) ;
112112 cache . set ( item , boundItem ) ;
113113 }
114114 return boundItem ;
@@ -198,7 +198,7 @@ export default function createReduxStore( key, options ) {
198198 get : ( target , prop ) => {
199199 const privateAction = privateActions [ prop ] ;
200200 return privateAction
201- ? boundPrivateActions . get ( privateAction )
201+ ? boundPrivateActions . get ( privateAction , prop )
202202 : actions [ prop ] ;
203203 } ,
204204 } ) ;
@@ -210,16 +210,32 @@ export default function createReduxStore( key, options ) {
210210
211211 lock ( actions , allActions ) ;
212212
213- function bindSelector ( selector ) {
213+ const resolvers = options . resolvers
214+ ? mapResolvers ( options . resolvers )
215+ : { } ;
216+
217+ function bindSelector ( selector , selectorName ) {
214218 if ( selector . isRegistrySelector ) {
215219 selector . registry = registry ;
216220 }
217221 const boundSelector = ( ...args ) => {
218222 const state = store . __unstableOriginalGetState ( ) ;
219223 return selector ( state . root , ...args ) ;
220224 } ;
221- boundSelector . hasResolver = false ;
222- return boundSelector ;
225+
226+ const resolver = resolvers [ selectorName ] ;
227+ if ( ! resolver ) {
228+ boundSelector . hasResolver = false ;
229+ return boundSelector ;
230+ }
231+
232+ return mapSelectorWithResolver (
233+ boundSelector ,
234+ selectorName ,
235+ resolver ,
236+ store ,
237+ resolversCache
238+ ) ;
223239 }
224240
225241 function bindMetadataSelector ( selector ) {
@@ -231,35 +247,26 @@ export default function createReduxStore( key, options ) {
231247 return boundSelector ;
232248 }
233249
234- let selectors = {
250+ const selectors = {
235251 ...mapValues ( metadataSelectors , bindMetadataSelector ) ,
236252 ...mapValues ( options . selectors , bindSelector ) ,
237253 } ;
238254
239- let resolvers ;
240- if ( options . resolvers ) {
241- resolvers = mapResolvers ( options . resolvers ) ;
242- selectors = mapSelectorsWithResolvers (
243- selectors ,
244- resolvers ,
245- store ,
246- resolversCache
247- ) ;
248- }
249-
250255 const boundPrivateSelectors = createBindingCache ( bindSelector ) ;
251256
252257 // Pre-bind the private selectors that have been registered by the time of
253258 // instantiation, so that registry selectors are bound to the registry.
254- for ( const privateSelector of Object . values ( privateSelectors ) ) {
255- boundPrivateSelectors . get ( privateSelector ) ;
259+ for ( const [ selectorName , selector ] of Object . entries (
260+ privateSelectors
261+ ) ) {
262+ boundPrivateSelectors . get ( selector , selectorName ) ;
256263 }
257264
258265 const allSelectors = new Proxy ( ( ) => { } , {
259266 get : ( target , prop ) => {
260267 const privateSelector = privateSelectors [ prop ] ;
261268 return privateSelector
262- ? boundPrivateSelectors . get ( privateSelector )
269+ ? boundPrivateSelectors . get ( privateSelector , prop )
263270 : selectors [ prop ] ;
264271 } ,
265272 } ) ;
@@ -509,22 +516,24 @@ function mapResolvers( resolvers ) {
509516}
510517
511518/**
512- * Returns resolvers with matched selectors for a given namespace .
519+ * Returns a selector with a matched resolver .
513520 * Resolvers are side effects invoked once per argument set of a given selector call,
514521 * used in ensuring that the data needs for the selector are satisfied.
515522 *
516- * @param {Object } selectors The current selectors to be modified.
517- * @param {Object } resolvers Resolvers to register.
523+ * @param {Object } selector The selector function to be bound.
524+ * @param {string } selectorName The selector name.
525+ * @param {Object } resolver Resolver to call.
518526 * @param {Object } store The redux store to which the resolvers should be mapped.
519527 * @param {Object } resolversCache Resolvers Cache.
520528 */
521- function mapSelectorsWithResolvers (
522- selectors ,
523- resolvers ,
529+ function mapSelectorWithResolver (
530+ selector ,
531+ selectorName ,
532+ resolver ,
524533 store ,
525534 resolversCache
526535) {
527- function fulfillSelector ( resolver , selectorName , args ) {
536+ function fulfillSelector ( args ) {
528537 const state = store . getState ( ) ;
529538
530539 if (
@@ -570,17 +579,10 @@ function mapSelectorsWithResolvers(
570579 } , 0 ) ;
571580 }
572581
573- return mapValues ( selectors , ( selector , selectorName ) => {
574- const resolver = resolvers [ selectorName ] ;
575- if ( ! resolver ) {
576- return selector ;
577- }
578-
579- const selectorResolver = ( ...args ) => {
580- fulfillSelector ( resolver , selectorName , args ) ;
581- return selector ( ...args ) ;
582- } ;
583- selectorResolver . hasResolver = true ;
584- return selectorResolver ;
585- } ) ;
582+ const selectorResolver = ( ...args ) => {
583+ fulfillSelector ( args ) ;
584+ return selector ( ...args ) ;
585+ } ;
586+ selectorResolver . hasResolver = true ;
587+ return selectorResolver ;
586588}
0 commit comments