From 9906d73a50f99253ce7b8db1473d8e3ff4e6caf3 Mon Sep 17 00:00:00 2001 From: Jarda Snajdr Date: Thu, 1 Jun 2023 13:40:27 +0200 Subject: [PATCH] Data: fix a bug where private selectors on a store with resolvers are inaccessible --- packages/data/src/redux-store/index.js | 23 ++++++++++--------- packages/data/src/test/privateAPIs.js | 31 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/packages/data/src/redux-store/index.js b/packages/data/src/redux-store/index.js index 11bda27c128ac1..942efcadb00be4 100644 --- a/packages/data/src/redux-store/index.js +++ b/packages/data/src/redux-store/index.js @@ -214,6 +214,18 @@ export default function createReduxStore( key, options ) { }, store ); + + let resolvers; + if ( options.resolvers ) { + resolvers = mapResolvers( options.resolvers ); + selectors = mapSelectorsWithResolvers( + selectors, + resolvers, + store, + resolversCache + ); + } + lock( selectors, new Proxy( privateSelectors, { @@ -235,17 +247,6 @@ export default function createReduxStore( key, options ) { } ) ); - let resolvers; - if ( options.resolvers ) { - resolvers = mapResolvers( options.resolvers ); - selectors = mapSelectorsWithResolvers( - selectors, - resolvers, - store, - resolversCache - ); - } - const resolveSelectors = mapResolveSelectors( selectors, store ); const suspendSelectors = mapSuspendSelectors( selectors, store ); diff --git a/packages/data/src/test/privateAPIs.js b/packages/data/src/test/privateAPIs.js index 93df00d287d600..1ccf6adb0c5115 100644 --- a/packages/data/src/test/privateAPIs.js +++ b/packages/data/src/test/privateAPIs.js @@ -96,6 +96,37 @@ describe( 'Private data APIs', () => { ); } ); + it( 'should support combination of private selectors and resolvers', async () => { + const testStore = createReduxStore( 'test', { + reducer: ( state = {}, action ) => { + if ( action.type === 'RECEIVE' ) { + return { ...state, [ action.key ]: action.value }; + } + return state; + }, + selectors: { + get: ( state, key ) => state[ key ], + }, + resolvers: { + get: + ( key ) => + async ( { dispatch } ) => { + const value = await ( 'resolved-' + key ); + dispatch( { type: 'RECEIVE', key, value } ); + }, + }, + } ); + unlock( testStore ).registerPrivateSelectors( { + peek: ( state, key ) => state[ key ], + } ); + registry.register( testStore ); + + await registry.resolveSelect( testStore ).get( 'x' ); + expect( unlock( registry.select( testStore ) ).peek( 'x' ) ).toBe( + 'resolved-x' + ); + } ); + it( 'should give private selectors access to the state', () => { const groceryStore = createStore(); unlock( groceryStore ).registerPrivateSelectors( {