From 09b2daf7c812840717add4bc0f3a72e3e32c66e8 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Mon, 16 Nov 2020 11:29:50 +0100 Subject: [PATCH] Decouple store definition from the registry object --- packages/annotations/src/store/index.js | 13 +- packages/block-directory/src/store/index.js | 14 +- packages/block-editor/README.md | 2 +- packages/block-editor/src/store/index.js | 16 +- packages/blocks/README.md | 2 +- packages/blocks/src/store/index.js | 15 +- packages/core-data/src/index.js | 17 +- packages/core-data/src/test/integration.js | 6 +- packages/data/README.md | 21 ++ packages/data/src/factory.js | 21 -- packages/data/src/index.js | 14 +- .../{namespace-store => redux-store}/index.js | 183 +++++++++--------- .../metadata/actions.js | 0 .../metadata/reducer.js | 0 .../metadata/selectors.js | 0 .../metadata/test/reducer.js | 0 .../metadata/test/selectors.js | 0 .../metadata/test/utils.js | 0 .../metadata/utils.js | 0 .../test/index.js | 0 packages/data/src/registry.js | 46 +++-- packages/data/src/test/factory.js | 18 -- packages/data/src/test/registry.js | 18 +- packages/data/src/types.d.ts | 36 ++++ packages/edit-navigation/src/store/index.js | 16 +- packages/edit-post/src/store/index.js | 31 +-- .../src/store/batch-processing/index.js | 2 +- packages/edit-widgets/src/store/index.js | 18 +- packages/editor/src/store/index.js | 13 +- packages/interface/src/store/index.js | 13 +- packages/keyboard-shortcuts/README.md | 2 +- .../keyboard-shortcuts/src/store/index.js | 13 +- packages/notices/src/store/index.js | 13 +- packages/nux/src/store/index.js | 13 +- packages/reusable-blocks/src/store/index.js | 13 +- packages/rich-text/README.md | 2 +- packages/rich-text/src/store/index.js | 13 +- packages/viewport/README.md | 2 +- packages/viewport/src/store/index.js | 13 +- 39 files changed, 315 insertions(+), 304 deletions(-) rename packages/data/src/{namespace-store => redux-store}/index.js (70%) rename packages/data/src/{namespace-store => redux-store}/metadata/actions.js (100%) rename packages/data/src/{namespace-store => redux-store}/metadata/reducer.js (100%) rename packages/data/src/{namespace-store => redux-store}/metadata/selectors.js (100%) rename packages/data/src/{namespace-store => redux-store}/metadata/test/reducer.js (100%) rename packages/data/src/{namespace-store => redux-store}/metadata/test/selectors.js (100%) rename packages/data/src/{namespace-store => redux-store}/metadata/test/utils.js (100%) rename packages/data/src/{namespace-store => redux-store}/metadata/utils.js (100%) rename packages/data/src/{namespace-store => redux-store}/test/index.js (100%) delete mode 100644 packages/data/src/test/factory.js create mode 100644 packages/data/src/types.d.ts diff --git a/packages/annotations/src/store/index.js b/packages/annotations/src/store/index.js index c50d25eff3872..ca8dc5b5e5cc2 100644 --- a/packages/annotations/src/store/index.js +++ b/packages/annotations/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { register, createReduxStoreDefinition } from '@wordpress/data'; /** * Internal dependencies @@ -21,14 +18,14 @@ const STORE_NAME = 'core/annotations'; /** * Store definition for the annotations namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, selectors, actions, } ); + +register( storeDefinition ); diff --git a/packages/block-directory/src/store/index.js b/packages/block-directory/src/store/index.js index fd37ab9901b77..cf5a162ebfd67 100644 --- a/packages/block-directory/src/store/index.js +++ b/packages/block-directory/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; import { controls as dataControls } from '@wordpress/data-controls'; /** @@ -39,10 +36,13 @@ export const storeConfig = { /** * Store definition for the block directory namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); +export const storeDefinition = createReduxStoreDefinition( + STORE_NAME, + storeConfig +); -export default registerStore( STORE_NAME, storeConfig ); +register( storeDefinition ); diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md index 1aa5361b480e4..9db71da2fea39 100644 --- a/packages/block-editor/README.md +++ b/packages/block-editor/README.md @@ -522,7 +522,7 @@ Store definition for the block editor namespace. _Related_ -- +- _Type_ diff --git a/packages/block-editor/src/store/index.js b/packages/block-editor/src/store/index.js index 8dd9162d5ca27..c998d36fdd7e4 100644 --- a/packages/block-editor/src/store/index.js +++ b/packages/block-editor/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, registerStore } from '@wordpress/data'; /** * Internal dependencies @@ -37,16 +34,19 @@ export const storeConfig = { /** * Store definition for the block editor namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { + ...storeConfig, + persist: [ 'preferences' ], +} ); +// Ideally we'd use register instead of register stores. +// We should be able to make the switch once we remove the "effects" middleware. const store = registerStore( STORE_NAME, { ...storeConfig, persist: [ 'preferences' ], } ); applyMiddlewares( store ); - -export default store; diff --git a/packages/blocks/README.md b/packages/blocks/README.md index 9392d8fad392d..09a15ed4eb88d 100644 --- a/packages/blocks/README.md +++ b/packages/blocks/README.md @@ -746,7 +746,7 @@ Store definition for the blocks namespace. _Related_ -- +- _Type_ diff --git a/packages/blocks/src/store/index.js b/packages/blocks/src/store/index.js index 52feae11b46ec..6bdd726c02302 100644 --- a/packages/blocks/src/store/index.js +++ b/packages/blocks/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -18,10 +15,14 @@ const STORE_NAME = 'core/blocks'; /** * Store definition for the blocks namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { + reducer, + selectors, + actions, +} ); -export default registerStore( STORE_NAME, { reducer, selectors, actions } ); +register( storeDefinition ); diff --git a/packages/core-data/src/index.js b/packages/core-data/src/index.js index b87f7b8e90f2b..989e94b35ecba 100644 --- a/packages/core-data/src/index.js +++ b/packages/core-data/src/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; import { controls } from '@wordpress/data-controls'; /** @@ -59,23 +56,27 @@ const entityActions = defaultEntities.reduce( ( result, entity ) => { return result; }, {} ); -export const storeConfig = { +const storeConfig = { reducer, controls, actions: { ...actions, ...entityActions, ...locksActions }, selectors: { ...selectors, ...entitySelectors, ...locksSelectors }, resolvers: { ...resolvers, ...entityResolvers }, }; + /** * Store definition for the code data namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); +export const storeDefinition = createReduxStoreDefinition( + STORE_NAME, + storeConfig +); -registerStore( STORE_NAME, storeConfig ); +register( storeDefinition ); export { default as EntityProvider } from './entity-provider'; export * from './entity-provider'; diff --git a/packages/core-data/src/test/integration.js b/packages/core-data/src/test/integration.js index d0b04dac3cc70..979198d391c0d 100644 --- a/packages/core-data/src/test/integration.js +++ b/packages/core-data/src/test/integration.js @@ -9,7 +9,7 @@ import { createRegistry, controls } from '@wordpress/data'; import * as actions from '../actions'; import * as selectors from '../selectors'; import * as resolvers from '../resolvers'; -import { storeConfig as coreStoreConfig } from '../'; +import { storeDefinition } from '../'; // Mock to prevent calling window.fetch in test environment jest.mock( '@wordpress/data-controls', () => { @@ -52,7 +52,7 @@ describe( 'receiveEntityRecord', () => { data: {}, }, }; - registry.registerStore( 'core', coreStoreConfig ); + registry.register( storeDefinition ); registry.registerStore( 'test/resolution', { actions: { receiveEntityRecords: actions.receiveEntityRecords, @@ -160,7 +160,7 @@ describe( 'receiveEntityRecord', () => { describe( 'saveEntityRecord', () => { function createTestRegistry() { const registry = createRegistry(); - registry.registerStore( 'core', coreStoreConfig ); + registry.registerStore( storeDefinition ); return registry; } diff --git a/packages/data/README.md b/packages/data/README.md index de84b640c1cb8..a89673fb8d0ee 100644 --- a/packages/data/README.md +++ b/packages/data/README.md @@ -345,6 +345,19 @@ _Returns_ Undocumented declaration. +# **createReduxStoreDefinition** + +Creates a namespace object with a store derived from the reducer given. + +_Parameters_ + +- _key_ `string`: Unique namespace identifier. +- _options_ (unknown type): Registered store options, with properties describing reducer, actions, selectors, and resolvers. + +_Returns_ + +- (unknown type): Store Object. + # **createRegistry** Creates a new store registry, given an optional object of initial store @@ -470,6 +483,14 @@ _Type_ - `Object` +# **register** + +Registers a standard `@wordpress/data` store definition. + +_Parameters_ + +- _storeDefinition_ (unknown type): Store definition. + # **registerGenericStore** Registers a generic store. diff --git a/packages/data/src/factory.js b/packages/data/src/factory.js index 86c42c461ac97..400f4ffe15c0a 100644 --- a/packages/data/src/factory.js +++ b/packages/data/src/factory.js @@ -79,24 +79,3 @@ export function createRegistryControl( registryControl ) { return registryControl; } - -/** - * Creates a store definition to pass to store API methods. - * - * @example - * ```js - * const storeDefinition = __unstableCreateStoreDefinition( 'my-shop' ); - * ``` - * - * @param {string} storeName Unique namespace identifier for the store. - * - * @return {Object} Store definition object. - */ -export function __unstableCreateStoreDefinition( storeName ) { - return { - name: storeName, - toString() { - return this.name; - }, - }; -} diff --git a/packages/data/src/index.js b/packages/data/src/index.js index 56d5b68d70173..b26336cde328d 100644 --- a/packages/data/src/index.js +++ b/packages/data/src/index.js @@ -21,12 +21,9 @@ export { default as useSelect } from './components/use-select'; export { useDispatch } from './components/use-dispatch'; export { AsyncModeProvider } from './components/async-mode-provider'; export { createRegistry } from './registry'; -export { - createRegistrySelector, - createRegistryControl, - __unstableCreateStoreDefinition, -} from './factory'; +export { createRegistrySelector, createRegistryControl } from './factory'; export { controls } from './controls'; +export { default as createReduxStoreDefinition } from './redux-store'; /** * Object of available plugins to use with a registry. @@ -181,3 +178,10 @@ export const registerStore = defaultRegistry.registerStore; * @param {Object} plugin Plugin object. */ export const use = defaultRegistry.use; + +/** + * Registers a standard `@wordpress/data` store definition. + * + * @param {import('./types').WPDataStoreDefinition} storeDefinition Store definition. + */ +export const register = defaultRegistry.register; diff --git a/packages/data/src/namespace-store/index.js b/packages/data/src/redux-store/index.js similarity index 70% rename from packages/data/src/namespace-store/index.js rename to packages/data/src/redux-store/index.js index 8ce882f0e6be8..4abc86efed8de 100644 --- a/packages/data/src/namespace-store/index.js +++ b/packages/data/src/redux-store/index.js @@ -49,110 +49,111 @@ function createResolversCache() { }; } -/** - * @typedef {WPDataRegistry} WPDataRegistry - */ - /** * Creates a namespace object with a store derived from the reducer given. * - * @param {string} key Unique namespace identifier. - * @param {Object} options Registered store options, with properties - * describing reducer, actions, selectors, and - * resolvers. - * @param {WPDataRegistry} registry Registry reference. + * @param {string} key Unique namespace identifier. + * @param {import('../types').WPDataReduxStoreConfig} options Registered store options, with properties + * describing reducer, actions, selectors, and + * resolvers. * - * @return {Object} Store Object. + * @return {import('../types').WPDataStoreDefinition} Store Object. */ -export default function createNamespace( key, options, registry ) { - const reducer = options.reducer; - const store = createReduxStore( key, options, registry ); - const resolversCache = createResolversCache(); - - let resolvers; - const actions = mapActions( - { - ...metadataActions, - ...options.actions, - }, - store - ); - let selectors = mapSelectors( - { - ...mapValues( - metadataSelectors, - ( selector ) => ( state, ...args ) => - selector( state.metadata, ...args ) - ), - ...mapValues( options.selectors, ( selector ) => { - if ( selector.isRegistrySelector ) { - selector.registry = registry; - } - - return ( state, ...args ) => selector( state.root, ...args ); - } ), - }, - store - ); - if ( options.resolvers ) { - const result = mapResolvers( - options.resolvers, - selectors, - store, - resolversCache - ); - resolvers = result.resolvers; - selectors = result.selectors; - } +export default function createReduxStoreDefinition( key, options ) { + return { + name: key, + __internalAttach: ( registry ) => { + const reducer = options.reducer; + const store = createReduxStore( key, options, registry ); + const resolversCache = createResolversCache(); + + let resolvers; + const actions = mapActions( + { + ...metadataActions, + ...options.actions, + }, + store + ); + let selectors = mapSelectors( + { + ...mapValues( + metadataSelectors, + ( selector ) => ( state, ...args ) => + selector( state.metadata, ...args ) + ), + ...mapValues( options.selectors, ( selector ) => { + if ( selector.isRegistrySelector ) { + selector.registry = registry; + } + + return ( state, ...args ) => + selector( state.root, ...args ); + } ), + }, + store + ); + if ( options.resolvers ) { + const result = mapResolvers( + options.resolvers, + selectors, + store, + resolversCache + ); + resolvers = result.resolvers; + selectors = result.selectors; + } - const getSelectors = () => selectors; - const getActions = () => actions; - - // We have some modules monkey-patching the store object - // It's wrong to do so but until we refactor all of our effects to controls - // We need to keep the same "store" instance here. - store.__unstableOriginalGetState = store.getState; - store.getState = () => store.__unstableOriginalGetState().root; - - // Customize subscribe behavior to call listeners only on effective change, - // not on every dispatch. - const subscribe = - store && - ( ( listener ) => { - let lastState = store.__unstableOriginalGetState(); - store.subscribe( () => { - const state = store.__unstableOriginalGetState(); - const hasChanged = state !== lastState; - lastState = state; - - if ( hasChanged ) { - listener(); - } - } ); - } ); + const getSelectors = () => selectors; + const getActions = () => actions; + + // We have some modules monkey-patching the store object + // It's wrong to do so but until we refactor all of our effects to controls + // We need to keep the same "store" instance here. + store.__unstableOriginalGetState = store.getState; + store.getState = () => store.__unstableOriginalGetState().root; + + // Customize subscribe behavior to call listeners only on effective change, + // not on every dispatch. + const subscribe = + store && + ( ( listener ) => { + let lastState = store.__unstableOriginalGetState(); + store.subscribe( () => { + const state = store.__unstableOriginalGetState(); + const hasChanged = state !== lastState; + lastState = state; + + if ( hasChanged ) { + listener(); + } + } ); + } ); - // This can be simplified to just { subscribe, getSelectors, getActions } - // Once we remove the use function. - return { - reducer, - store, - actions, - selectors, - resolvers, - getSelectors, - getActions, - subscribe, + // This can be simplified to just { subscribe, getSelectors, getActions } + // Once we remove the use function. + return { + reducer, + store, + actions, + selectors, + resolvers, + getSelectors, + getActions, + subscribe, + }; + }, }; } /** * Creates a redux store for a namespace. * - * @param {string} key Unique namespace identifier. - * @param {Object} options Registered store options, with properties - * describing reducer, actions, selectors, and - * resolvers. - * @param {WPDataRegistry} registry Registry reference. + * @param {string} key Unique namespace identifier. + * @param {Object} options Registered store options, with properties + * describing reducer, actions, selectors, and + * resolvers. + * @param {import('../types').WPDataRegistry} registry Registry reference. * * @return {Object} Newly created redux store. */ diff --git a/packages/data/src/namespace-store/metadata/actions.js b/packages/data/src/redux-store/metadata/actions.js similarity index 100% rename from packages/data/src/namespace-store/metadata/actions.js rename to packages/data/src/redux-store/metadata/actions.js diff --git a/packages/data/src/namespace-store/metadata/reducer.js b/packages/data/src/redux-store/metadata/reducer.js similarity index 100% rename from packages/data/src/namespace-store/metadata/reducer.js rename to packages/data/src/redux-store/metadata/reducer.js diff --git a/packages/data/src/namespace-store/metadata/selectors.js b/packages/data/src/redux-store/metadata/selectors.js similarity index 100% rename from packages/data/src/namespace-store/metadata/selectors.js rename to packages/data/src/redux-store/metadata/selectors.js diff --git a/packages/data/src/namespace-store/metadata/test/reducer.js b/packages/data/src/redux-store/metadata/test/reducer.js similarity index 100% rename from packages/data/src/namespace-store/metadata/test/reducer.js rename to packages/data/src/redux-store/metadata/test/reducer.js diff --git a/packages/data/src/namespace-store/metadata/test/selectors.js b/packages/data/src/redux-store/metadata/test/selectors.js similarity index 100% rename from packages/data/src/namespace-store/metadata/test/selectors.js rename to packages/data/src/redux-store/metadata/test/selectors.js diff --git a/packages/data/src/namespace-store/metadata/test/utils.js b/packages/data/src/redux-store/metadata/test/utils.js similarity index 100% rename from packages/data/src/namespace-store/metadata/test/utils.js rename to packages/data/src/redux-store/metadata/test/utils.js diff --git a/packages/data/src/namespace-store/metadata/utils.js b/packages/data/src/redux-store/metadata/utils.js similarity index 100% rename from packages/data/src/namespace-store/metadata/utils.js rename to packages/data/src/redux-store/metadata/utils.js diff --git a/packages/data/src/namespace-store/test/index.js b/packages/data/src/redux-store/test/index.js similarity index 100% rename from packages/data/src/namespace-store/test/index.js rename to packages/data/src/redux-store/test/index.js diff --git a/packages/data/src/registry.js b/packages/data/src/registry.js index d2661ba13265f..f173c35147515 100644 --- a/packages/data/src/registry.js +++ b/packages/data/src/registry.js @@ -1,13 +1,13 @@ /** * External dependencies */ -import { omit, without, mapValues } from 'lodash'; +import { omit, without, mapValues, isObject } from 'lodash'; import memize from 'memize'; /** * Internal dependencies */ -import createNamespace from './namespace-store'; +import createReduxStoreDefinition from './redux-store'; import createCoreDataStore from './store'; /** @@ -74,13 +74,15 @@ export function createRegistry( storeConfigs = {}, parent = null ) { /** * Calls a selector given the current state and extra arguments. * - * @param {string|Object} storeName Unique namespace identifier for the store - * or the store definition. + * @param {string|import('./types').WPDataStoreDefinition} storeNameOrDefinition Unique namespace identifier for the store + * or the store definition. * * @return {*} The selector's returned value. */ - function select( storeName ) { - storeName = String( storeName ); + function select( storeNameOrDefinition ) { + const storeName = isObject( storeNameOrDefinition ) + ? storeNameOrDefinition.name + : storeNameOrDefinition; const store = stores[ storeName ]; if ( store ) { return store.getSelectors(); @@ -148,13 +150,15 @@ export function createRegistry( storeConfigs = {}, parent = null ) { /** * Returns the available actions for a part of the state. * - * @param {string|Object} storeName Unique namespace identifier for the store - * or the store definition. + * @param {string|import('./types').WPDataStoreDefinition} storeNameOrDefinition Unique namespace identifier for the store + * or the store definition. * * @return {*} The action's returned value. */ - function dispatch( storeName ) { - storeName = String( storeName ); + function dispatch( storeNameOrDefinition ) { + const storeName = isObject( storeNameOrDefinition ) + ? storeNameOrDefinition.name + : storeNameOrDefinition; const store = stores[ storeName ]; if ( store ) { return store.getActions(); @@ -198,6 +202,18 @@ export function createRegistry( storeConfigs = {}, parent = null ) { config.subscribe( globalListener ); } + /** + * Registers a new store. + * + * @param {import('./types').WPDataStoreDefinition} storeDefinition Store definition. + */ + function register( storeDefinition ) { + registerGenericStore( + storeDefinition.name, + storeDefinition.__internalAttach( registry ) + ); + } + let registry = { registerGenericStore, stores, @@ -207,6 +223,7 @@ export function createRegistry( storeConfigs = {}, parent = null ) { __experimentalResolveSelect, dispatch, use, + register, }; /** @@ -222,9 +239,12 @@ export function createRegistry( storeConfigs = {}, parent = null ) { throw new TypeError( 'Must specify store reducer' ); } - const namespace = createNamespace( storeName, options, registry ); - registerGenericStore( storeName, namespace ); - return namespace.store; + const store = createReduxStoreDefinition( + storeName, + options + ).__internalAttach( registry ); + registerGenericStore( storeName, store ); + return store.store; }; // diff --git a/packages/data/src/test/factory.js b/packages/data/src/test/factory.js deleted file mode 100644 index b20b49d09dc36..0000000000000 --- a/packages/data/src/test/factory.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Internal dependencies - */ -import { __unstableCreateStoreDefinition } from '../factory'; - -describe( '__unstableCreateStoreDefinition', () => { - it( 'creates store definition', () => { - const result = __unstableCreateStoreDefinition( 'my-shop' ); - - expect( result.name ).toBe( 'my-shop' ); - } ); - - it( 'casts the definition to string', () => { - const result = __unstableCreateStoreDefinition( 'my-shop' ); - - expect( String( result ) ).toBe( 'my-shop' ); - } ); -} ); diff --git a/packages/data/src/test/registry.js b/packages/data/src/test/registry.js index 7edf965ec1c36..7ce5f6ef3388a 100644 --- a/packages/data/src/test/registry.js +++ b/packages/data/src/test/registry.js @@ -7,10 +7,8 @@ import { castArray, mapValues } from 'lodash'; * Internal dependencies */ import { createRegistry } from '../registry'; -import { - createRegistrySelector, - __unstableCreateStoreDefinition, -} from '../factory'; +import { createRegistrySelector } from '../factory'; +import createReduxStoreDefinition from '../redux-store'; jest.useFakeTimers(); @@ -556,16 +554,14 @@ describe( 'createRegistry', () => { it( 'should work with the store definition as param for select', () => { const STORE_NAME = 'demo'; - const storeDefinition = __unstableCreateStoreDefinition( - STORE_NAME - ); - registry.registerStore( STORE_NAME, { + const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer: ( state = 'OK' ) => state, selectors: { getValue: ( state ) => state, }, resolvers: {}, } ); + registry.registry( storeDefinition ); expect( registry.select( storeDefinition ).getValue() ).toBe( 'OK' @@ -704,10 +700,7 @@ describe( 'createRegistry', () => { it( 'should work with the store object as param for dispatch', async () => { const STORE_NAME = 'demo'; - const storeDefinition = __unstableCreateStoreDefinition( - STORE_NAME - ); - const store = registry.registerStore( STORE_NAME, { + const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer( state = 'OK', action ) { if ( action.type === 'UPDATE' ) { return 'UPDATED'; @@ -720,6 +713,7 @@ describe( 'createRegistry', () => { }, }, } ); + const store = registry.register( storeDefinition ); expect( store.getState() ).toBe( 'OK' ); await registry.dispatch( storeDefinition ).update(); diff --git a/packages/data/src/types.d.ts b/packages/data/src/types.d.ts new file mode 100644 index 0000000000000..1939a80d97565 --- /dev/null +++ b/packages/data/src/types.d.ts @@ -0,0 +1,36 @@ +export type WPDataFunctionOrGeneratorArray = { + [index: number]: Function|Generator; +}; +export type WPDataFunctionArray = { + [index: number]: Function; +}; + +export type WPDataAttachedStore = { + getSelectors: () => WPDataFunctionArray, + getActions: () => WPDataFunctionArray, + subscribe: (listener: () => void) => (() => void) +}; + +export type WPDataStoreDefinition = { + /** + * Store Name + */ + name: string, + + /** + * Store configuration object. + */ + __internalAttach: (registry: WPDataRegistry) => WPDataAttachedStore, +}; + +export type WPDataReduxStoreConfig = { + reducer: ( state: any, action: any ) => any, + actions?: WPDataFunctionOrGeneratorArray, + resolvers?: WPDataFunctionOrGeneratorArray, + selectors?: WPDataFunctionArray, + controls?: WPDataFunctionArray, +} + +export type WPDataRegistry = { + register: ( storeDefinition: WPDataStoreDefinition ) => void, +} \ No newline at end of file diff --git a/packages/edit-navigation/src/store/index.js b/packages/edit-navigation/src/store/index.js index efc941df568ac..d640f0d46e838 100644 --- a/packages/edit-navigation/src/store/index.js +++ b/packages/edit-navigation/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -27,7 +24,7 @@ const STORE_NAME = 'core/edit-navigation'; * * @type {Object} */ -export const storeConfig = { +const storeConfig = { reducer, controls, selectors, @@ -38,10 +35,13 @@ export const storeConfig = { /** * Store definition for the edit navigation namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); +export const storeDefinition = createReduxStoreDefinition( + STORE_NAME, + storeConfig +); -export default registerStore( STORE_NAME, storeConfig ); +register( storeDefinition ); diff --git a/packages/edit-post/src/store/index.js b/packages/edit-post/src/store/index.js index ae49f41e99b61..30d7babfbaa60 100644 --- a/packages/edit-post/src/store/index.js +++ b/packages/edit-post/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, registerStore } from '@wordpress/data'; /** * Internal dependencies @@ -15,22 +12,26 @@ import * as actions from './actions'; import * as selectors from './selectors'; import { STORE_NAME } from './constants'; +const storeConfig = { + reducer, + actions, + selectors, + persist: [ 'preferences' ], +}; + /** * Store definition for the edit post namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -const store = registerStore( STORE_NAME, { - reducer, - actions, - selectors, - persist: [ 'preferences' ], -} ); +export const storeDefinition = createReduxStoreDefinition( + STORE_NAME, + storeConfig +); +// Ideally we use register instead of register store. +// We shouuld be able to make the switch once we remove the effects. +const store = registerStore( STORE_NAME, storeConfig ); applyMiddlewares( store ); - -export default store; diff --git a/packages/edit-widgets/src/store/batch-processing/index.js b/packages/edit-widgets/src/store/batch-processing/index.js index 00a89ad757357..c50ae697ed998 100644 --- a/packages/edit-widgets/src/store/batch-processing/index.js +++ b/packages/edit-widgets/src/store/batch-processing/index.js @@ -19,7 +19,7 @@ import { STORE_NAME } from './constants'; * * @type {Object} */ -export const storeConfig = { +const storeConfig = { actions, reducer, controls, diff --git a/packages/edit-widgets/src/store/index.js b/packages/edit-widgets/src/store/index.js index 43035dd9d737b..9af8c27b404bd 100644 --- a/packages/edit-widgets/src/store/index.js +++ b/packages/edit-widgets/src/store/index.js @@ -2,10 +2,7 @@ * WordPress dependencies */ import apiFetch from '@wordpress/api-fetch'; -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -29,7 +26,7 @@ const STORE_NAME = 'core/edit-widgets'; * * @type {Object} */ -export const storeConfig = { +const storeConfig = { reducer, controls, selectors, @@ -40,13 +37,16 @@ export const storeConfig = { /** * Store definition for the edit widgets namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); +export const storeDefinition = createReduxStoreDefinition( + STORE_NAME, + storeConfig +); -const store = registerStore( STORE_NAME, storeConfig ); +register( storeDefinition ); // This package uses a few in-memory post types as wrappers for convenience. // This middleware prevents any network requests related to these types as they are @@ -58,5 +58,3 @@ apiFetch.use( function ( options, next ) { return next( options ); } ); - -export default store; diff --git a/packages/editor/src/store/index.js b/packages/editor/src/store/index.js index c828de0bf8f2d..42123133aa345 100644 --- a/packages/editor/src/store/index.js +++ b/packages/editor/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; import { controls as dataControls } from '@wordpress/data-controls'; /** @@ -36,13 +33,13 @@ export const storeConfig = { /** * Store definition for the editor namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { ...storeConfig, persist: [ 'preferences' ], } ); + +register( storeDefinition ); diff --git a/packages/interface/src/store/index.js b/packages/interface/src/store/index.js index cd61db476eab3..a6677e6407190 100644 --- a/packages/interface/src/store/index.js +++ b/packages/interface/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -17,15 +14,15 @@ import { STORE_NAME } from './constants'; /** * Store definition for the interface namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, actions, selectors, persist: [ 'enableItems' ], } ); + +register( storeDefinition ); diff --git a/packages/keyboard-shortcuts/README.md b/packages/keyboard-shortcuts/README.md index 21c32545de666..b6ae0c198e78a 100644 --- a/packages/keyboard-shortcuts/README.md +++ b/packages/keyboard-shortcuts/README.md @@ -22,7 +22,7 @@ Store definition for the keyboard shortcuts namespace. _Related_ -- +- _Type_ diff --git a/packages/keyboard-shortcuts/src/store/index.js b/packages/keyboard-shortcuts/src/store/index.js index 0302155d2304b..fbe65655afe50 100644 --- a/packages/keyboard-shortcuts/src/store/index.js +++ b/packages/keyboard-shortcuts/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -18,14 +15,14 @@ const STORE_NAME = 'core/keyboard-shortcuts'; /** * Store definition for the keyboard shortcuts namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, actions, selectors, } ); + +register( storeDefinition ); diff --git a/packages/notices/src/store/index.js b/packages/notices/src/store/index.js index 62fbaf44ddcb9..054637d3c2c37 100644 --- a/packages/notices/src/store/index.js +++ b/packages/notices/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -18,14 +15,14 @@ const STORE_NAME = 'core/notices'; /** * Store definition for the notices namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, actions, selectors, } ); + +register( storeDefinition ); diff --git a/packages/nux/src/store/index.js b/packages/nux/src/store/index.js index e85a0ccd1f18a..94b8b60dd8109 100644 --- a/packages/nux/src/store/index.js +++ b/packages/nux/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -18,15 +15,15 @@ const STORE_NAME = 'core/nux'; /** * Store definition for the nux namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, actions, selectors, persist: [ 'preferences' ], } ); + +register( storeDefinition ); diff --git a/packages/reusable-blocks/src/store/index.js b/packages/reusable-blocks/src/store/index.js index 78407be7a094d..228fac5f54d76 100644 --- a/packages/reusable-blocks/src/store/index.js +++ b/packages/reusable-blocks/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -19,15 +16,15 @@ const STORE_NAME = 'core/reusable-blocks'; /** * Store definition for the reusable blocks namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { actions, controls, reducer, selectors, } ); + +register( storeDefinition ); diff --git a/packages/rich-text/README.md b/packages/rich-text/README.md index 99332a01f38d5..09473c272cb90 100644 --- a/packages/rich-text/README.md +++ b/packages/rich-text/README.md @@ -308,7 +308,7 @@ Store definition for the rich-text namespace. _Related_ -- +- _Type_ diff --git a/packages/rich-text/src/store/index.js b/packages/rich-text/src/store/index.js index 0c885ec2408f5..a34ec22c074c4 100644 --- a/packages/rich-text/src/store/index.js +++ b/packages/rich-text/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -18,14 +15,14 @@ const STORE_NAME = 'core/rich-text'; /** * Store definition for the rich-text namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, selectors, actions, } ); + +register( storeDefinition ); diff --git a/packages/viewport/README.md b/packages/viewport/README.md index c806ad7e2381a..a9e343d1ae8f8 100644 --- a/packages/viewport/README.md +++ b/packages/viewport/README.md @@ -82,7 +82,7 @@ Store definition for the viewport namespace. _Related_ -- +- _Type_ diff --git a/packages/viewport/src/store/index.js b/packages/viewport/src/store/index.js index b86310cae7491..11fb948e8bdd0 100644 --- a/packages/viewport/src/store/index.js +++ b/packages/viewport/src/store/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - __unstableCreateStoreDefinition, - registerStore, -} from '@wordpress/data'; +import { createReduxStoreDefinition, register } from '@wordpress/data'; /** * Internal dependencies @@ -18,14 +15,14 @@ const STORE_NAME = 'core/viewport'; /** * Store definition for the viewport namespace. * - * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createStoreDefinition + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#createReduxStoreDefinition * * @type {Object} */ -export const storeDefinition = __unstableCreateStoreDefinition( STORE_NAME ); - -export default registerStore( STORE_NAME, { +export const storeDefinition = createReduxStoreDefinition( STORE_NAME, { reducer, actions, selectors, } ); + +register( storeDefinition );