@wordpress/data 6.2.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +9 -3
  3. package/build/plugins/index.js +0 -8
  4. package/build/plugins/index.js.map +1 -1
  5. package/build/redux-store/index.js +1 -6
  6. package/build/redux-store/index.js.map +1 -1
  7. package/build/redux-store/metadata/actions.js +4 -4
  8. package/build/redux-store/metadata/actions.js.map +1 -1
  9. package/build/redux-store/metadata/reducer.js +3 -3
  10. package/build/redux-store/metadata/reducer.js.map +1 -1
  11. package/build/redux-store/metadata/selectors.js +22 -19
  12. package/build/redux-store/metadata/selectors.js.map +1 -1
  13. package/build/redux-store/metadata/utils.js +31 -13
  14. package/build/redux-store/metadata/utils.js.map +1 -1
  15. package/build/registry.js +4 -0
  16. package/build/registry.js.map +1 -1
  17. package/build-module/plugins/index.js +0 -1
  18. package/build-module/plugins/index.js.map +1 -1
  19. package/build-module/redux-store/index.js +1 -6
  20. package/build-module/redux-store/index.js.map +1 -1
  21. package/build-module/redux-store/metadata/actions.js +4 -4
  22. package/build-module/redux-store/metadata/actions.js.map +1 -1
  23. package/build-module/redux-store/metadata/reducer.js +4 -4
  24. package/build-module/redux-store/metadata/reducer.js.map +1 -1
  25. package/build-module/redux-store/metadata/selectors.js +21 -19
  26. package/build-module/redux-store/metadata/selectors.js.map +1 -1
  27. package/build-module/redux-store/metadata/utils.js +29 -13
  28. package/build-module/redux-store/metadata/utils.js.map +1 -1
  29. package/build-module/registry.js +4 -0
  30. package/build-module/registry.js.map +1 -1
  31. package/build-types/redux-store/metadata/actions.d.ts +8 -8
  32. package/build-types/redux-store/metadata/actions.d.ts.map +1 -1
  33. package/build-types/redux-store/metadata/reducer.d.ts.map +1 -1
  34. package/build-types/redux-store/metadata/selectors.d.ts +16 -16
  35. package/build-types/redux-store/metadata/selectors.d.ts.map +1 -1
  36. package/build-types/redux-store/metadata/utils.d.ts +20 -1
  37. package/build-types/redux-store/metadata/utils.d.ts.map +1 -1
  38. package/package.json +8 -9
  39. package/src/plugins/index.js +0 -1
  40. package/src/redux-store/index.js +1 -4
  41. package/src/redux-store/metadata/actions.js +4 -4
  42. package/src/redux-store/metadata/reducer.ts +7 -4
  43. package/src/redux-store/metadata/selectors.js +21 -16
  44. package/src/redux-store/metadata/test/reducer.js +40 -0
  45. package/src/redux-store/metadata/test/selectors.js +11 -0
  46. package/src/redux-store/metadata/test/utils.js +28 -1
  47. package/src/redux-store/metadata/utils.ts +59 -0
  48. package/src/registry.js +4 -0
  49. package/tsconfig.tsbuildinfo +1 -1
  50. package/build/plugins/controls/index.js +0 -24
  51. package/build/plugins/controls/index.js.map +0 -1
  52. package/build-module/plugins/controls/index.js +0 -12
  53. package/build-module/plugins/controls/index.js.map +0 -1
  54. package/src/plugins/controls/index.js +0 -12
  55. package/src/redux-store/metadata/utils.js +0 -37
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/data/src/registry.js"],"names":["mapValues","isObject","forEach","deprecated","createReduxStore","coreDataStore","createEmitter","createRegistry","storeConfigs","parent","stores","emitter","__experimentalListeningStores","Set","globalListener","emit","subscribe","listener","select","storeNameOrDescriptor","storeName","name","add","store","getSelectors","__experimentalMarkListeningStores","callback","ref","clear","result","call","current","Array","from","resolveSelect","getResolveSelectors","dispatch","getActions","withPlugins","attributes","attribute","key","registry","apply","arguments","registerStoreInstance","TypeError","currentSubscribe","unsubscribeFromEmitter","unsubscribeFromStore","isPaused","register","instantiate","registerGenericStore","since","alternative","registerStore","options","reducer","__experimentalSubscribeStore","handler","batch","pause","resume","namespaces","use","plugin","config","Object","entries"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { mapValues, isObject, forEach } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport createReduxStore from './redux-store';\nimport coreDataStore from './store';\nimport { createEmitter } from './utils/emitter';\n\n/** @typedef {import('./types').StoreDescriptor} StoreDescriptor */\n\n/**\n * @typedef {Object} WPDataRegistry An isolated orchestrator of store registrations.\n *\n * @property {Function} registerGenericStore Given a namespace key and settings\n * object, registers a new generic\n * store.\n * @property {Function} registerStore Given a namespace key and settings\n * object, registers a new namespace\n * store.\n * @property {Function} subscribe Given a function callback, invokes\n * the callback on any change to state\n * within any registered store.\n * @property {Function} select Given a namespace key, returns an\n * object of the store's registered\n * selectors.\n * @property {Function} dispatch Given a namespace key, returns an\n * object of the store's registered\n * action dispatchers.\n */\n\n/**\n * @typedef {Object} WPDataPlugin An object of registry function overrides.\n *\n * @property {Function} registerStore registers store.\n */\n\n/**\n * Creates a new store registry, given an optional object of initial store\n * configurations.\n *\n * @param {Object} storeConfigs Initial store configurations.\n * @param {Object?} parent Parent registry.\n *\n * @return {WPDataRegistry} Data registry.\n */\nexport function createRegistry( storeConfigs = {}, parent = null ) {\n\tconst stores = {};\n\tconst emitter = createEmitter();\n\tconst __experimentalListeningStores = new Set();\n\n\t/**\n\t * Global listener called for each store's update.\n\t */\n\tfunction globalListener() {\n\t\temitter.emit();\n\t}\n\n\t/**\n\t * Subscribe to changes to any data.\n\t *\n\t * @param {Function} listener Listener function.\n\t *\n\t * @return {Function} Unsubscribe function.\n\t */\n\tconst subscribe = ( listener ) => {\n\t\treturn emitter.subscribe( listener );\n\t};\n\n\t/**\n\t * Calls a selector given the current state and extra arguments.\n\t *\n\t * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n\t * or the store descriptor.\n\t *\n\t * @return {*} The selector's returned value.\n\t */\n\tfunction select( storeNameOrDescriptor ) {\n\t\tconst storeName = isObject( storeNameOrDescriptor )\n\t\t\t? storeNameOrDescriptor.name\n\t\t\t: storeNameOrDescriptor;\n\t\t__experimentalListeningStores.add( storeName );\n\t\tconst store = stores[ storeName ];\n\t\tif ( store ) {\n\t\t\treturn store.getSelectors();\n\t\t}\n\n\t\treturn parent && parent.select( storeName );\n\t}\n\n\tfunction __experimentalMarkListeningStores( callback, ref ) {\n\t\t__experimentalListeningStores.clear();\n\t\tconst result = callback.call( this );\n\t\tref.current = Array.from( __experimentalListeningStores );\n\t\treturn result;\n\t}\n\n\t/**\n\t * Given the name of a registered store, returns an object containing the store's\n\t * selectors pre-bound to state so that you only need to supply additional arguments,\n\t * and modified so that they return promises that resolve to their eventual values,\n\t * after any resolvers have ran.\n\t *\n\t * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n\t * or the store descriptor.\n\t *\n\t * @return {Object} Each key of the object matches the name of a selector.\n\t */\n\tfunction resolveSelect( storeNameOrDescriptor ) {\n\t\tconst storeName = isObject( storeNameOrDescriptor )\n\t\t\t? storeNameOrDescriptor.name\n\t\t\t: storeNameOrDescriptor;\n\t\t__experimentalListeningStores.add( storeName );\n\t\tconst store = stores[ storeName ];\n\t\tif ( store ) {\n\t\t\treturn store.getResolveSelectors();\n\t\t}\n\n\t\treturn parent && parent.resolveSelect( storeName );\n\t}\n\n\t/**\n\t * Returns the available actions for a part of the state.\n\t *\n\t * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n\t * or the store descriptor.\n\t *\n\t * @return {*} The action's returned value.\n\t */\n\tfunction dispatch( storeNameOrDescriptor ) {\n\t\tconst storeName = isObject( storeNameOrDescriptor )\n\t\t\t? storeNameOrDescriptor.name\n\t\t\t: storeNameOrDescriptor;\n\t\tconst store = stores[ storeName ];\n\t\tif ( store ) {\n\t\t\treturn store.getActions();\n\t\t}\n\n\t\treturn parent && parent.dispatch( storeName );\n\t}\n\n\t//\n\t// Deprecated\n\t// TODO: Remove this after `use()` is removed.\n\t//\n\tfunction withPlugins( attributes ) {\n\t\treturn mapValues( attributes, ( attribute, key ) => {\n\t\t\tif ( typeof attribute !== 'function' ) {\n\t\t\t\treturn attribute;\n\t\t\t}\n\t\t\treturn function () {\n\t\t\t\treturn registry[ key ].apply( null, arguments );\n\t\t\t};\n\t\t} );\n\t}\n\n\t/**\n\t * Registers a store instance.\n\t *\n\t * @param {string} name Store registry name.\n\t * @param {Object} store Store instance object (getSelectors, getActions, subscribe).\n\t */\n\tfunction registerStoreInstance( name, store ) {\n\t\tif ( typeof store.getSelectors !== 'function' ) {\n\t\t\tthrow new TypeError( 'store.getSelectors must be a function' );\n\t\t}\n\t\tif ( typeof store.getActions !== 'function' ) {\n\t\t\tthrow new TypeError( 'store.getActions must be a function' );\n\t\t}\n\t\tif ( typeof store.subscribe !== 'function' ) {\n\t\t\tthrow new TypeError( 'store.subscribe must be a function' );\n\t\t}\n\t\t// The emitter is used to keep track of active listeners when the registry\n\t\t// get paused, that way, when resumed we should be able to call all these\n\t\t// pending listeners.\n\t\tstore.emitter = createEmitter();\n\t\tconst currentSubscribe = store.subscribe;\n\t\tstore.subscribe = ( listener ) => {\n\t\t\tconst unsubscribeFromEmitter = store.emitter.subscribe( listener );\n\t\t\tconst unsubscribeFromStore = currentSubscribe( () => {\n\t\t\t\tif ( store.emitter.isPaused ) {\n\t\t\t\t\tstore.emitter.emit();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlistener();\n\t\t\t} );\n\n\t\t\treturn () => {\n\t\t\t\tunsubscribeFromStore?.();\n\t\t\t\tunsubscribeFromEmitter?.();\n\t\t\t};\n\t\t};\n\t\tstores[ name ] = store;\n\t\tstore.subscribe( globalListener );\n\t}\n\n\t/**\n\t * Registers a new store given a store descriptor.\n\t *\n\t * @param {StoreDescriptor} store Store descriptor.\n\t */\n\tfunction register( store ) {\n\t\tregisterStoreInstance( store.name, store.instantiate( registry ) );\n\t}\n\n\tfunction registerGenericStore( name, store ) {\n\t\tdeprecated( 'wp.data.registerGenericStore', {\n\t\t\tsince: '5.9',\n\t\t\talternative: 'wp.data.register( storeDescriptor )',\n\t\t} );\n\t\tregisterStoreInstance( name, store );\n\t}\n\n\t/**\n\t * Registers a standard `@wordpress/data` store.\n\t *\n\t * @param {string} storeName Unique namespace identifier.\n\t * @param {Object} options Store description (reducer, actions, selectors, resolvers).\n\t *\n\t * @return {Object} Registered store object.\n\t */\n\tfunction registerStore( storeName, options ) {\n\t\tif ( ! options.reducer ) {\n\t\t\tthrow new TypeError( 'Must specify store reducer' );\n\t\t}\n\n\t\tconst store = createReduxStore( storeName, options ).instantiate(\n\t\t\tregistry\n\t\t);\n\t\tregisterStoreInstance( storeName, store );\n\t\treturn store.store;\n\t}\n\n\t/**\n\t * Subscribe handler to a store.\n\t *\n\t * @param {string[]} storeName The store name.\n\t * @param {Function} handler The function subscribed to the store.\n\t * @return {Function} A function to unsubscribe the handler.\n\t */\n\tfunction __experimentalSubscribeStore( storeName, handler ) {\n\t\tif ( storeName in stores ) {\n\t\t\treturn stores[ storeName ].subscribe( handler );\n\t\t}\n\n\t\t// Trying to access a store that hasn't been registered,\n\t\t// this is a pattern rarely used but seen in some places.\n\t\t// We fallback to regular `subscribe` here for backward-compatibility for now.\n\t\t// See https://github.com/WordPress/gutenberg/pull/27466 for more info.\n\t\tif ( ! parent ) {\n\t\t\treturn subscribe( handler );\n\t\t}\n\n\t\treturn parent.__experimentalSubscribeStore( storeName, handler );\n\t}\n\n\tfunction batch( callback ) {\n\t\temitter.pause();\n\t\tforEach( stores, ( store ) => store.emitter.pause() );\n\t\tcallback();\n\t\temitter.resume();\n\t\tforEach( stores, ( store ) => store.emitter.resume() );\n\t}\n\n\tlet registry = {\n\t\tbatch,\n\t\tstores,\n\t\tnamespaces: stores, // TODO: Deprecate/remove this.\n\t\tsubscribe,\n\t\tselect,\n\t\tresolveSelect,\n\t\tdispatch,\n\t\tuse,\n\t\tregister,\n\t\tregisterGenericStore,\n\t\tregisterStore,\n\t\t__experimentalMarkListeningStores,\n\t\t__experimentalSubscribeStore,\n\t};\n\n\t//\n\t// TODO:\n\t// This function will be deprecated as soon as it is no longer internally referenced.\n\t//\n\tfunction use( plugin, options ) {\n\t\tregistry = {\n\t\t\t...registry,\n\t\t\t...plugin( registry, options ),\n\t\t};\n\n\t\treturn registry;\n\t}\n\n\tregistry.register( coreDataStore );\n\n\tfor ( const [ name, config ] of Object.entries( storeConfigs ) ) {\n\t\tregistry.register( createReduxStore( name, config ) );\n\t}\n\n\tif ( parent ) {\n\t\tparent.subscribe( globalListener );\n\t}\n\n\treturn withPlugins( registry );\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/data/src/registry.js"],"names":["mapValues","isObject","forEach","deprecated","createReduxStore","coreDataStore","createEmitter","createRegistry","storeConfigs","parent","stores","emitter","__experimentalListeningStores","Set","globalListener","emit","subscribe","listener","select","storeNameOrDescriptor","storeName","name","add","store","getSelectors","__experimentalMarkListeningStores","callback","ref","clear","result","call","current","Array","from","resolveSelect","getResolveSelectors","dispatch","getActions","withPlugins","attributes","attribute","key","registry","apply","arguments","registerStoreInstance","TypeError","currentSubscribe","unsubscribeFromEmitter","unsubscribeFromStore","isPaused","register","instantiate","registerGenericStore","since","alternative","registerStore","options","reducer","__experimentalSubscribeStore","handler","batch","pause","resume","namespaces","use","plugin","config","Object","entries"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { mapValues, isObject, forEach } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport deprecated from '@wordpress/deprecated';\n\n/**\n * Internal dependencies\n */\nimport createReduxStore from './redux-store';\nimport coreDataStore from './store';\nimport { createEmitter } from './utils/emitter';\n\n/** @typedef {import('./types').StoreDescriptor} StoreDescriptor */\n\n/**\n * @typedef {Object} WPDataRegistry An isolated orchestrator of store registrations.\n *\n * @property {Function} registerGenericStore Given a namespace key and settings\n * object, registers a new generic\n * store.\n * @property {Function} registerStore Given a namespace key and settings\n * object, registers a new namespace\n * store.\n * @property {Function} subscribe Given a function callback, invokes\n * the callback on any change to state\n * within any registered store.\n * @property {Function} select Given a namespace key, returns an\n * object of the store's registered\n * selectors.\n * @property {Function} dispatch Given a namespace key, returns an\n * object of the store's registered\n * action dispatchers.\n */\n\n/**\n * @typedef {Object} WPDataPlugin An object of registry function overrides.\n *\n * @property {Function} registerStore registers store.\n */\n\n/**\n * Creates a new store registry, given an optional object of initial store\n * configurations.\n *\n * @param {Object} storeConfigs Initial store configurations.\n * @param {Object?} parent Parent registry.\n *\n * @return {WPDataRegistry} Data registry.\n */\nexport function createRegistry( storeConfigs = {}, parent = null ) {\n\tconst stores = {};\n\tconst emitter = createEmitter();\n\tconst __experimentalListeningStores = new Set();\n\n\t/**\n\t * Global listener called for each store's update.\n\t */\n\tfunction globalListener() {\n\t\temitter.emit();\n\t}\n\n\t/**\n\t * Subscribe to changes to any data.\n\t *\n\t * @param {Function} listener Listener function.\n\t *\n\t * @return {Function} Unsubscribe function.\n\t */\n\tconst subscribe = ( listener ) => {\n\t\treturn emitter.subscribe( listener );\n\t};\n\n\t/**\n\t * Calls a selector given the current state and extra arguments.\n\t *\n\t * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n\t * or the store descriptor.\n\t *\n\t * @return {*} The selector's returned value.\n\t */\n\tfunction select( storeNameOrDescriptor ) {\n\t\tconst storeName = isObject( storeNameOrDescriptor )\n\t\t\t? storeNameOrDescriptor.name\n\t\t\t: storeNameOrDescriptor;\n\t\t__experimentalListeningStores.add( storeName );\n\t\tconst store = stores[ storeName ];\n\t\tif ( store ) {\n\t\t\treturn store.getSelectors();\n\t\t}\n\n\t\treturn parent && parent.select( storeName );\n\t}\n\n\tfunction __experimentalMarkListeningStores( callback, ref ) {\n\t\t__experimentalListeningStores.clear();\n\t\tconst result = callback.call( this );\n\t\tref.current = Array.from( __experimentalListeningStores );\n\t\treturn result;\n\t}\n\n\t/**\n\t * Given the name of a registered store, returns an object containing the store's\n\t * selectors pre-bound to state so that you only need to supply additional arguments,\n\t * and modified so that they return promises that resolve to their eventual values,\n\t * after any resolvers have ran.\n\t *\n\t * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n\t * or the store descriptor.\n\t *\n\t * @return {Object} Each key of the object matches the name of a selector.\n\t */\n\tfunction resolveSelect( storeNameOrDescriptor ) {\n\t\tconst storeName = isObject( storeNameOrDescriptor )\n\t\t\t? storeNameOrDescriptor.name\n\t\t\t: storeNameOrDescriptor;\n\t\t__experimentalListeningStores.add( storeName );\n\t\tconst store = stores[ storeName ];\n\t\tif ( store ) {\n\t\t\treturn store.getResolveSelectors();\n\t\t}\n\n\t\treturn parent && parent.resolveSelect( storeName );\n\t}\n\n\t/**\n\t * Returns the available actions for a part of the state.\n\t *\n\t * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store\n\t * or the store descriptor.\n\t *\n\t * @return {*} The action's returned value.\n\t */\n\tfunction dispatch( storeNameOrDescriptor ) {\n\t\tconst storeName = isObject( storeNameOrDescriptor )\n\t\t\t? storeNameOrDescriptor.name\n\t\t\t: storeNameOrDescriptor;\n\t\tconst store = stores[ storeName ];\n\t\tif ( store ) {\n\t\t\treturn store.getActions();\n\t\t}\n\n\t\treturn parent && parent.dispatch( storeName );\n\t}\n\n\t//\n\t// Deprecated\n\t// TODO: Remove this after `use()` is removed.\n\t//\n\tfunction withPlugins( attributes ) {\n\t\treturn mapValues( attributes, ( attribute, key ) => {\n\t\t\tif ( typeof attribute !== 'function' ) {\n\t\t\t\treturn attribute;\n\t\t\t}\n\t\t\treturn function () {\n\t\t\t\treturn registry[ key ].apply( null, arguments );\n\t\t\t};\n\t\t} );\n\t}\n\n\t/**\n\t * Registers a store instance.\n\t *\n\t * @param {string} name Store registry name.\n\t * @param {Object} store Store instance object (getSelectors, getActions, subscribe).\n\t */\n\tfunction registerStoreInstance( name, store ) {\n\t\tif ( typeof store.getSelectors !== 'function' ) {\n\t\t\tthrow new TypeError( 'store.getSelectors must be a function' );\n\t\t}\n\t\tif ( typeof store.getActions !== 'function' ) {\n\t\t\tthrow new TypeError( 'store.getActions must be a function' );\n\t\t}\n\t\tif ( typeof store.subscribe !== 'function' ) {\n\t\t\tthrow new TypeError( 'store.subscribe must be a function' );\n\t\t}\n\t\t// The emitter is used to keep track of active listeners when the registry\n\t\t// get paused, that way, when resumed we should be able to call all these\n\t\t// pending listeners.\n\t\tstore.emitter = createEmitter();\n\t\tconst currentSubscribe = store.subscribe;\n\t\tstore.subscribe = ( listener ) => {\n\t\t\tconst unsubscribeFromEmitter = store.emitter.subscribe( listener );\n\t\t\tconst unsubscribeFromStore = currentSubscribe( () => {\n\t\t\t\tif ( store.emitter.isPaused ) {\n\t\t\t\t\tstore.emitter.emit();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlistener();\n\t\t\t} );\n\n\t\t\treturn () => {\n\t\t\t\tunsubscribeFromStore?.();\n\t\t\t\tunsubscribeFromEmitter?.();\n\t\t\t};\n\t\t};\n\t\tstores[ name ] = store;\n\t\tstore.subscribe( globalListener );\n\t}\n\n\t/**\n\t * Registers a new store given a store descriptor.\n\t *\n\t * @param {StoreDescriptor} store Store descriptor.\n\t */\n\tfunction register( store ) {\n\t\tregisterStoreInstance( store.name, store.instantiate( registry ) );\n\t}\n\n\tfunction registerGenericStore( name, store ) {\n\t\tdeprecated( 'wp.data.registerGenericStore', {\n\t\t\tsince: '5.9',\n\t\t\talternative: 'wp.data.register( storeDescriptor )',\n\t\t} );\n\t\tregisterStoreInstance( name, store );\n\t}\n\n\t/**\n\t * Registers a standard `@wordpress/data` store.\n\t *\n\t * @param {string} storeName Unique namespace identifier.\n\t * @param {Object} options Store description (reducer, actions, selectors, resolvers).\n\t *\n\t * @return {Object} Registered store object.\n\t */\n\tfunction registerStore( storeName, options ) {\n\t\tif ( ! options.reducer ) {\n\t\t\tthrow new TypeError( 'Must specify store reducer' );\n\t\t}\n\n\t\tconst store = createReduxStore( storeName, options ).instantiate(\n\t\t\tregistry\n\t\t);\n\t\tregisterStoreInstance( storeName, store );\n\t\treturn store.store;\n\t}\n\n\t/**\n\t * Subscribe handler to a store.\n\t *\n\t * @param {string[]} storeName The store name.\n\t * @param {Function} handler The function subscribed to the store.\n\t * @return {Function} A function to unsubscribe the handler.\n\t */\n\tfunction __experimentalSubscribeStore( storeName, handler ) {\n\t\tif ( storeName in stores ) {\n\t\t\treturn stores[ storeName ].subscribe( handler );\n\t\t}\n\n\t\t// Trying to access a store that hasn't been registered,\n\t\t// this is a pattern rarely used but seen in some places.\n\t\t// We fallback to regular `subscribe` here for backward-compatibility for now.\n\t\t// See https://github.com/WordPress/gutenberg/pull/27466 for more info.\n\t\tif ( ! parent ) {\n\t\t\treturn subscribe( handler );\n\t\t}\n\n\t\treturn parent.__experimentalSubscribeStore( storeName, handler );\n\t}\n\n\tfunction batch( callback ) {\n\t\temitter.pause();\n\t\tforEach( stores, ( store ) => store.emitter.pause() );\n\t\tcallback();\n\t\temitter.resume();\n\t\tforEach( stores, ( store ) => store.emitter.resume() );\n\t}\n\n\tlet registry = {\n\t\tbatch,\n\t\tstores,\n\t\tnamespaces: stores, // TODO: Deprecate/remove this.\n\t\tsubscribe,\n\t\tselect,\n\t\tresolveSelect,\n\t\tdispatch,\n\t\tuse,\n\t\tregister,\n\t\tregisterGenericStore,\n\t\tregisterStore,\n\t\t__experimentalMarkListeningStores,\n\t\t__experimentalSubscribeStore,\n\t};\n\n\t//\n\t// TODO:\n\t// This function will be deprecated as soon as it is no longer internally referenced.\n\t//\n\tfunction use( plugin, options ) {\n\t\tif ( ! plugin ) {\n\t\t\treturn;\n\t\t}\n\n\t\tregistry = {\n\t\t\t...registry,\n\t\t\t...plugin( registry, options ),\n\t\t};\n\n\t\treturn registry;\n\t}\n\n\tregistry.register( coreDataStore );\n\n\tfor ( const [ name, config ] of Object.entries( storeConfigs ) ) {\n\t\tregistry.register( createReduxStore( name, config ) );\n\t}\n\n\tif ( parent ) {\n\t\tparent.subscribe( globalListener );\n\t}\n\n\treturn withPlugins( registry );\n}\n"]}
@@ -31,30 +31,30 @@ export function finishResolution(selectorName: string, args: unknown[]): {
31
31
  * started.
32
32
  *
33
33
  * @param {string} selectorName Name of selector for which resolver triggered.
34
- * @param {unknown[]} args Array of arguments to associate for uniqueness, each item
34
+ * @param {unknown[][]} args Array of arguments to associate for uniqueness, each item
35
35
  * is associated to a resolution.
36
36
  *
37
- * @return {{ type: 'START_RESOLUTIONS', selectorName: string, args: unknown[] }} Action object.
37
+ * @return {{ type: 'START_RESOLUTIONS', selectorName: string, args: unknown[][] }} Action object.
38
38
  */
39
- export function startResolutions(selectorName: string, args: unknown[]): {
39
+ export function startResolutions(selectorName: string, args: unknown[][]): {
40
40
  type: 'START_RESOLUTIONS';
41
41
  selectorName: string;
42
- args: unknown[];
42
+ args: unknown[][];
43
43
  };
44
44
  /**
45
45
  * Returns an action object used in signalling that a batch of selector resolutions has
46
46
  * completed.
47
47
  *
48
48
  * @param {string} selectorName Name of selector for which resolver triggered.
49
- * @param {unknown[]} args Array of arguments to associate for uniqueness, each item
49
+ * @param {unknown[][]} args Array of arguments to associate for uniqueness, each item
50
50
  * is associated to a resolution.
51
51
  *
52
- * @return {{ type: 'FINISH_RESOLUTIONS', selectorName: string, args: unknown[] }} Action object.
52
+ * @return {{ type: 'FINISH_RESOLUTIONS', selectorName: string, args: unknown[][] }} Action object.
53
53
  */
54
- export function finishResolutions(selectorName: string, args: unknown[]): {
54
+ export function finishResolutions(selectorName: string, args: unknown[][]): {
55
55
  type: 'FINISH_RESOLUTIONS';
56
56
  selectorName: string;
57
- args: unknown[];
57
+ args: unknown[][];
58
58
  };
59
59
  /**
60
60
  * Returns an action object used in signalling that we should invalidate the resolution cache.
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/actions.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,8CALW,MAAM,QACN,OAAO,EAAE,GAER;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAQ9E;AAED;;;;;;;;GAQG;AACH,+CALW,MAAM,QACN,OAAO,EAAE,GAER;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAQ/E;AAED;;;;;;;;;GASG;AACH,+CANW,MAAM,QACN,OAAO,EAAE,GAGR;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAQ/E;AAED;;;;;;;;;GASG;AACH,gDANW,MAAM,QACN,OAAO,EAAE,GAGR;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAQhF;AAED;;;;;;;GAOG;AACH,mDALW,MAAM,QACN,OAAO,EAAE,GAER;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAQ/E;AAED;;;;;GAKG;AACH,gDAFY;IAAE,IAAI,EAAE,iCAAiC,CAAA;CAAE,CAMtD;AAED;;;;;;;;GAQG;AACH,mEALW,MAAM,GAGJ;IAAE,IAAI,EAAE,0CAA0C,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAOtF"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/actions.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,8CALW,MAAM,QACN,OAAO,EAAE,GAER;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAQ9E;AAED;;;;;;;;GAQG;AACH,+CALW,MAAM,QACN,OAAO,EAAE,GAER;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAQ/E;AAED;;;;;;;;;GASG;AACH,+CANW,MAAM,QACN,OAAO,EAAE,EAAE,GAGV;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;CAAE,CAQjF;AAED;;;;;;;;;GASG;AACH,gDANW,MAAM,QACN,OAAO,EAAE,EAAE,GAGV;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;CAAE,CAQlF;AAED;;;;;;;GAOG;AACH,mDALW,MAAM,QACN,OAAO,EAAE,GAER;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,CAQ/E;AAED;;;;;GAKG;AACH,gDAFY;IAAE,IAAI,EAAE,iCAAiC,CAAA;CAAE,CAMtD;AAED;;;;;;;;GAQG;AACH,mEALW,MAAM,GAGJ;IAAE,IAAI,EAAE,0CAA0C,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAOtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/reducer.ts"],"names":[],"mappings":"AAIA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAQlD,aAAK,MAAM,GACR,UAAU,CAAE,cAAc,WAAW,EAAE,eAAe,CAAE,GACxD,UAAU,CAAE,cAAc,WAAW,EAAE,gBAAgB,CAAE,GACzD,UAAU,CAAE,cAAc,WAAW,EAAE,gBAAgB,CAAE,GACzD,UAAU,CAAE,cAAc,WAAW,EAAE,iBAAiB,CAAE,GAC1D,UAAU,CAAE,cAAc,WAAW,EAAE,oBAAoB,CAAE,GAC7D,UAAU,CAAE,cAAc,WAAW,EAAE,4BAA4B,CAAE,GACrE,UAAU,CACV,cAAc,WAAW,EAAE,oCAAoC,CAC9D,CAAC;AAEL,oBAAY,KAAK,GAAG,gBAAgB,CAAE,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,CAAE,CAAC;AAsCrE;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,qDAAkD,MAAM,0BAgBvE,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/reducer.ts"],"names":[],"mappings":"AAIA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAQlD,aAAK,MAAM,GACR,UAAU,CAAE,cAAc,WAAW,EAAE,eAAe,CAAE,GACxD,UAAU,CAAE,cAAc,WAAW,EAAE,gBAAgB,CAAE,GACzD,UAAU,CAAE,cAAc,WAAW,EAAE,gBAAgB,CAAE,GACzD,UAAU,CAAE,cAAc,WAAW,EAAE,iBAAiB,CAAE,GAC1D,UAAU,CAAE,cAAc,WAAW,EAAE,oBAAoB,CAAE,GAC7D,UAAU,CAAE,cAAc,WAAW,EAAE,4BAA4B,CAAE,GACrE,UAAU,CACV,cAAc,WAAW,EAAE,oCAAoC,CAC9D,CAAC;AAEL,oBAAY,KAAK,GAAG,gBAAgB,CAAE,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,CAAE,CAAC;AAyCrE;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,qDAAkD,MAAM,0BAgBvE,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -5,46 +5,46 @@
5
5
  * or not resolved for the given set of arguments, otherwise true or false for
6
6
  * resolution started and completed respectively.
7
7
  *
8
- * @param {State} state Data state.
9
- * @param {string} selectorName Selector name.
10
- * @param {unknown[]} args Arguments passed to selector.
8
+ * @param {State} state Data state.
9
+ * @param {string} selectorName Selector name.
10
+ * @param {unknown[]?} args Arguments passed to selector.
11
11
  *
12
12
  * @return {boolean | undefined} isResolving value.
13
13
  */
14
- export function getIsResolving(state: State, selectorName: string, args: unknown[]): boolean | undefined;
14
+ export function getIsResolving(state: State, selectorName: string, args: unknown[] | null): boolean | undefined;
15
15
  /**
16
16
  * Returns true if resolution has already been triggered for a given
17
17
  * selector name, and arguments set.
18
18
  *
19
- * @param {State} state Data state.
20
- * @param {string} selectorName Selector name.
21
- * @param {unknown[]} [args] Arguments passed to selector (default `[]`).
19
+ * @param {State} state Data state.
20
+ * @param {string} selectorName Selector name.
21
+ * @param {unknown[]?} args Arguments passed to selector.
22
22
  *
23
23
  * @return {boolean} Whether resolution has been triggered.
24
24
  */
25
- export function hasStartedResolution(state: State, selectorName: string, args?: unknown[] | undefined): boolean;
25
+ export function hasStartedResolution(state: State, selectorName: string, args: unknown[] | null): boolean;
26
26
  /**
27
27
  * Returns true if resolution has completed for a given selector
28
28
  * name, and arguments set.
29
29
  *
30
- * @param {State} state Data state.
31
- * @param {string} selectorName Selector name.
32
- * @param {unknown[]} [args] Arguments passed to selector.
30
+ * @param {State} state Data state.
31
+ * @param {string} selectorName Selector name.
32
+ * @param {unknown[]?} args Arguments passed to selector.
33
33
  *
34
34
  * @return {boolean} Whether resolution has completed.
35
35
  */
36
- export function hasFinishedResolution(state: State, selectorName: string, args?: unknown[] | undefined): boolean;
36
+ export function hasFinishedResolution(state: State, selectorName: string, args: unknown[] | null): boolean;
37
37
  /**
38
38
  * Returns true if resolution has been triggered but has not yet completed for
39
39
  * a given selector name, and arguments set.
40
40
  *
41
- * @param {State} state Data state.
42
- * @param {string} selectorName Selector name.
43
- * @param {unknown[]} [args] Arguments passed to selector.
41
+ * @param {State} state Data state.
42
+ * @param {string} selectorName Selector name.
43
+ * @param {unknown[]?} args Arguments passed to selector.
44
44
  *
45
45
  * @return {boolean} Whether resolution is in progress.
46
46
  */
47
- export function isResolving(state: State, selectorName: string, args?: unknown[] | undefined): boolean;
47
+ export function isResolving(state: State, selectorName: string, args: unknown[] | null): boolean;
48
48
  /**
49
49
  * Returns the list of the cached resolvers.
50
50
  *
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/selectors.js"],"names":[],"mappings":"AAKA,iEAAiE;AAEjE;;;;;;;;;;;GAWG;AACH,sCANW,KAAK,gBACL,MAAM,QACN,OAAO,EAAE,GAER,OAAO,GAAG,SAAS,CAS9B;AAED;;;;;;;;;GASG;AACH,4CANW,KAAK,gBACL,MAAM,iCAGL,OAAO,CAIlB;AAED;;;;;;;;;GASG;AACH,6CANW,KAAK,gBACL,MAAM,iCAGL,OAAO,CAIlB;AAED;;;;;;;;;GASG;AACH,mCANW,KAAK,gBACL,MAAM,iCAGL,OAAO,CAIlB;AAED;;;;;;GAMG;AACH,0CAJW,KAAK,GAEJ,KAAK,CAIhB;oBA1Ea,OAAO,MAAM,EAAE,OAAO,WAAW,EAAE,KAAK,CAAC"}
1
+ {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/selectors.js"],"names":[],"mappings":"AAUA,iEAAiE;AAEjE;;;;;;;;;;;GAWG;AACH,sCANW,KAAK,gBACL,MAAM,QACN,OAAO,EAAE,UAER,OAAO,GAAG,SAAS,CAS9B;AAED;;;;;;;;;GASG;AACH,4CANW,KAAK,gBACL,MAAM,QACN,OAAO,EAAE,UAER,OAAO,CAIlB;AAED;;;;;;;;;GASG;AACH,6CANW,KAAK,gBACL,MAAM,QACN,OAAO,EAAE,UAER,OAAO,CAIlB;AAED;;;;;;;;;GASG;AACH,mCANW,KAAK,gBACL,MAAM,QACN,OAAO,EAAE,UAER,OAAO,CAIlB;AAED;;;;;;GAMG;AACH,0CAJW,KAAK,GAEJ,KAAK,CAIhB;oBA1Ea,OAAO,MAAM,EAAE,OAAO,WAAW,EAAE,KAAK,CAAC"}
@@ -1,2 +1,21 @@
1
- export function onSubKey<TState extends unknown, TAction extends import("redux").AnyAction>(actionProperty: string): (reducer: import("redux").Reducer<TState, TAction>) => import("redux").Reducer<Record<string, TState>, TAction>;
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { AnyAction, Reducer } from 'redux';
5
+ /**
6
+ * Higher-order reducer creator which creates a combined reducer object, keyed
7
+ * by a property on the action object.
8
+ *
9
+ * @param actionProperty Action property by which to key object.
10
+ * @return Higher-order reducer.
11
+ */
12
+ export declare const onSubKey: <TState extends unknown, TAction extends AnyAction>(actionProperty: string) => (reducer: Reducer<TState, TAction>) => Reducer<Record<string, TState>, TAction>;
13
+ /**
14
+ * Normalize selector argument array by defaulting `undefined` value to an empty array
15
+ * and removing trailing `undefined` values.
16
+ *
17
+ * @param args Selector argument array
18
+ * @return Normalized state key array
19
+ */
20
+ export declare function selectorArgsToStateKey(args: unknown[] | null | undefined): unknown[];
2
21
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/utils.js"],"names":[],"mappings":"AAWO,4GAJI,MAAM,mHA6BhB"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/redux-store/metadata/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,sEACJ,MAAM,oFAyBtB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,aAWzE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/data",
3
- "version": "6.2.0",
3
+ "version": "6.3.0",
4
4
  "description": "Data module for WordPress.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -28,16 +28,15 @@
28
28
  "sideEffects": false,
29
29
  "dependencies": {
30
30
  "@babel/runtime": "^7.16.0",
31
- "@wordpress/compose": "^5.1.0",
32
- "@wordpress/deprecated": "^3.3.0",
33
- "@wordpress/element": "^4.1.0",
34
- "@wordpress/is-shallow-equal": "^4.3.0",
35
- "@wordpress/priority-queue": "^2.3.0",
36
- "@wordpress/redux-routine": "^4.3.0",
31
+ "@wordpress/compose": "^5.1.2",
32
+ "@wordpress/deprecated": "^3.3.1",
33
+ "@wordpress/element": "^4.1.1",
34
+ "@wordpress/is-shallow-equal": "^4.3.1",
35
+ "@wordpress/priority-queue": "^2.3.1",
36
+ "@wordpress/redux-routine": "^4.3.1",
37
37
  "equivalent-key-map": "^0.2.2",
38
38
  "is-promise": "^4.0.0",
39
39
  "lodash": "^4.17.21",
40
- "memize": "^1.1.0",
41
40
  "redux": "^4.1.2",
42
41
  "turbo-combine-reducers": "^1.0.2",
43
42
  "use-memo-one": "^1.1.1"
@@ -48,5 +47,5 @@
48
47
  "publishConfig": {
49
48
  "access": "public"
50
49
  },
51
- "gitHead": "d95ccb9366e249133cdb1d7b25c382446b9ee502"
50
+ "gitHead": "4566ac290359553d04de4eb574545309343f790b"
52
51
  }
@@ -1,2 +1 @@
1
- export { default as controls } from './controls';
2
1
  export { default as persistence } from './persistence';
@@ -232,12 +232,9 @@ function instantiateReduxStore( key, options, registry, thunkArgs ) {
232
232
  createResolversCacheMiddleware( registry, key ),
233
233
  promise,
234
234
  createReduxRoutineMiddleware( normalizedControls ),
235
+ createThunkMiddleware( thunkArgs ),
235
236
  ];
236
237
 
237
- if ( options.__experimentalUseThunks ) {
238
- middlewares.push( createThunkMiddleware( thunkArgs ) );
239
- }
240
-
241
238
  const enhancers = [ applyMiddleware( ...middlewares ) ];
242
239
  if (
243
240
  typeof window !== 'undefined' &&
@@ -37,10 +37,10 @@ export function finishResolution( selectorName, args ) {
37
37
  * started.
38
38
  *
39
39
  * @param {string} selectorName Name of selector for which resolver triggered.
40
- * @param {unknown[]} args Array of arguments to associate for uniqueness, each item
40
+ * @param {unknown[][]} args Array of arguments to associate for uniqueness, each item
41
41
  * is associated to a resolution.
42
42
  *
43
- * @return {{ type: 'START_RESOLUTIONS', selectorName: string, args: unknown[] }} Action object.
43
+ * @return {{ type: 'START_RESOLUTIONS', selectorName: string, args: unknown[][] }} Action object.
44
44
  */
45
45
  export function startResolutions( selectorName, args ) {
46
46
  return {
@@ -55,10 +55,10 @@ export function startResolutions( selectorName, args ) {
55
55
  * completed.
56
56
  *
57
57
  * @param {string} selectorName Name of selector for which resolver triggered.
58
- * @param {unknown[]} args Array of arguments to associate for uniqueness, each item
58
+ * @param {unknown[][]} args Array of arguments to associate for uniqueness, each item
59
59
  * is associated to a resolution.
60
60
  *
61
- * @return {{ type: 'FINISH_RESOLUTIONS', selectorName: string, args: unknown[] }} Action object.
61
+ * @return {{ type: 'FINISH_RESOLUTIONS', selectorName: string, args: unknown[][] }} Action object.
62
62
  */
63
63
  export function finishResolutions( selectorName, args ) {
64
64
  return {
@@ -8,7 +8,7 @@ import type { Reducer } from 'redux';
8
8
  /**
9
9
  * Internal dependencies
10
10
  */
11
- import { onSubKey } from './utils';
11
+ import { selectorArgsToStateKey, onSubKey } from './utils';
12
12
 
13
13
  type Action =
14
14
  | ReturnType< typeof import('./actions').startResolution >
@@ -38,7 +38,7 @@ const subKeysIsResolved: Reducer< Record< string, State >, Action > = onSubKey<
38
38
  case 'FINISH_RESOLUTION': {
39
39
  const isStarting = action.type === 'START_RESOLUTION';
40
40
  const nextState = new EquivalentKeyMap( state );
41
- nextState.set( action.args, isStarting );
41
+ nextState.set( selectorArgsToStateKey( action.args ), isStarting );
42
42
  return nextState;
43
43
  }
44
44
  case 'START_RESOLUTIONS':
@@ -46,13 +46,16 @@ const subKeysIsResolved: Reducer< Record< string, State >, Action > = onSubKey<
46
46
  const isStarting = action.type === 'START_RESOLUTIONS';
47
47
  const nextState = new EquivalentKeyMap( state );
48
48
  for ( const resolutionArgs of action.args ) {
49
- nextState.set( resolutionArgs, isStarting );
49
+ nextState.set(
50
+ selectorArgsToStateKey( resolutionArgs ),
51
+ isStarting
52
+ );
50
53
  }
51
54
  return nextState;
52
55
  }
53
56
  case 'INVALIDATE_RESOLUTION': {
54
57
  const nextState = new EquivalentKeyMap( state );
55
- nextState.delete( action.args );
58
+ nextState.delete( selectorArgsToStateKey( action.args ) );
56
59
  return nextState;
57
60
  }
58
61
  }
@@ -3,6 +3,11 @@
3
3
  */
4
4
  import { get } from 'lodash';
5
5
 
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { selectorArgsToStateKey } from './utils';
10
+
6
11
  /** @typedef {Record<string, import('./reducer').State>} State */
7
12
 
8
13
  /**
@@ -11,9 +16,9 @@ import { get } from 'lodash';
11
16
  * or not resolved for the given set of arguments, otherwise true or false for
12
17
  * resolution started and completed respectively.
13
18
  *
14
- * @param {State} state Data state.
15
- * @param {string} selectorName Selector name.
16
- * @param {unknown[]} args Arguments passed to selector.
19
+ * @param {State} state Data state.
20
+ * @param {string} selectorName Selector name.
21
+ * @param {unknown[]?} args Arguments passed to selector.
17
22
  *
18
23
  * @return {boolean | undefined} isResolving value.
19
24
  */
@@ -23,20 +28,20 @@ export function getIsResolving( state, selectorName, args ) {
23
28
  return undefined;
24
29
  }
25
30
 
26
- return map.get( args );
31
+ return map.get( selectorArgsToStateKey( args ) );
27
32
  }
28
33
 
29
34
  /**
30
35
  * Returns true if resolution has already been triggered for a given
31
36
  * selector name, and arguments set.
32
37
  *
33
- * @param {State} state Data state.
34
- * @param {string} selectorName Selector name.
35
- * @param {unknown[]} [args] Arguments passed to selector (default `[]`).
38
+ * @param {State} state Data state.
39
+ * @param {string} selectorName Selector name.
40
+ * @param {unknown[]?} args Arguments passed to selector.
36
41
  *
37
42
  * @return {boolean} Whether resolution has been triggered.
38
43
  */
39
- export function hasStartedResolution( state, selectorName, args = [] ) {
44
+ export function hasStartedResolution( state, selectorName, args ) {
40
45
  return getIsResolving( state, selectorName, args ) !== undefined;
41
46
  }
42
47
 
@@ -44,13 +49,13 @@ export function hasStartedResolution( state, selectorName, args = [] ) {
44
49
  * Returns true if resolution has completed for a given selector
45
50
  * name, and arguments set.
46
51
  *
47
- * @param {State} state Data state.
48
- * @param {string} selectorName Selector name.
49
- * @param {unknown[]} [args] Arguments passed to selector.
52
+ * @param {State} state Data state.
53
+ * @param {string} selectorName Selector name.
54
+ * @param {unknown[]?} args Arguments passed to selector.
50
55
  *
51
56
  * @return {boolean} Whether resolution has completed.
52
57
  */
53
- export function hasFinishedResolution( state, selectorName, args = [] ) {
58
+ export function hasFinishedResolution( state, selectorName, args ) {
54
59
  return getIsResolving( state, selectorName, args ) === false;
55
60
  }
56
61
 
@@ -58,13 +63,13 @@ export function hasFinishedResolution( state, selectorName, args = [] ) {
58
63
  * Returns true if resolution has been triggered but has not yet completed for
59
64
  * a given selector name, and arguments set.
60
65
  *
61
- * @param {State} state Data state.
62
- * @param {string} selectorName Selector name.
63
- * @param {unknown[]} [args] Arguments passed to selector.
66
+ * @param {State} state Data state.
67
+ * @param {string} selectorName Selector name.
68
+ * @param {unknown[]?} args Arguments passed to selector.
64
69
  *
65
70
  * @return {boolean} Whether resolution is in progress.
66
71
  */
67
- export function isResolving( state, selectorName, args = [] ) {
72
+ export function isResolving( state, selectorName, args ) {
68
73
  return getIsResolving( state, selectorName, args ) === true;
69
74
  }
70
75
 
@@ -127,6 +127,22 @@ describe( 'reducer', () => {
127
127
  expect( state.getFoo.get( [ 'post' ] ) ).toBe( false );
128
128
  }
129
129
  );
130
+
131
+ it( 'should normalize args array when dispatching actions', () => {
132
+ const started = reducer( undefined, {
133
+ type: 'START_RESOLUTION',
134
+ selectorName: 'getFoo',
135
+ args: [ 1, undefined ],
136
+ } );
137
+ expect( started.getFoo.get( [ 1 ] ) ).toBe( true );
138
+
139
+ const finished = reducer( started, {
140
+ type: 'FINISH_RESOLUTION',
141
+ selectorName: 'getFoo',
142
+ args: [ 1, undefined, undefined ],
143
+ } );
144
+ expect( finished.getFoo.get( [ 1 ] ) ).toBe( false );
145
+ } );
130
146
  } );
131
147
 
132
148
  describe( 'resolution batch', () => {
@@ -240,5 +256,29 @@ describe( 'reducer', () => {
240
256
  expect( state.getFoo.get( [ 'block' ] ) ).toBe( false );
241
257
  }
242
258
  );
259
+
260
+ it( 'should normalize args array when dispatching actions', () => {
261
+ const started = reducer( undefined, {
262
+ type: 'START_RESOLUTIONS',
263
+ selectorName: 'getFoo',
264
+ args: [
265
+ [ 1, undefined ],
266
+ [ 2, undefined, undefined ],
267
+ ],
268
+ } );
269
+ expect( started.getFoo.get( [ 1 ] ) ).toBe( true );
270
+ expect( started.getFoo.get( [ 2 ] ) ).toBe( true );
271
+
272
+ const finished = reducer( started, {
273
+ type: 'FINISH_RESOLUTIONS',
274
+ selectorName: 'getFoo',
275
+ args: [
276
+ [ 1, undefined, undefined ],
277
+ [ 2, undefined ],
278
+ ],
279
+ } );
280
+ expect( finished.getFoo.get( [ 1 ] ) ).toBe( false );
281
+ expect( finished.getFoo.get( [ 2 ] ) ).toBe( false );
282
+ } );
243
283
  } );
244
284
  } );
@@ -38,6 +38,17 @@ describe( 'getIsResolving', () => {
38
38
 
39
39
  expect( result ).toBe( true );
40
40
  } );
41
+
42
+ it( 'should normalize args ard return the right value', () => {
43
+ const state = {
44
+ getFoo: new EquivalentKeyMap( [ [ [], true ] ] ),
45
+ };
46
+ expect( getIsResolving( state, 'getFoo' ) ).toBe( true );
47
+ expect( getIsResolving( state, 'getFoo', [ undefined ] ) ).toBe( true );
48
+ expect(
49
+ getIsResolving( state, 'getFoo', [ undefined, undefined ] )
50
+ ).toBe( true );
51
+ } );
41
52
  } );
42
53
 
43
54
  describe( 'hasStartedResolution', () => {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import { onSubKey } from '../utils';
4
+ import { selectorArgsToStateKey, onSubKey } from '../utils';
5
5
 
6
6
  describe( 'onSubKey', () => {
7
7
  function createEnhancedReducer( actionProperty ) {
@@ -39,3 +39,30 @@ describe( 'onSubKey', () => {
39
39
  } );
40
40
  } );
41
41
  } );
42
+
43
+ describe( 'selectorArgsToStateKey', () => {
44
+ it( 'should default to an empty array', () => {
45
+ expect( selectorArgsToStateKey( undefined ) ).toEqual( [] );
46
+ } );
47
+
48
+ it( 'should remove trailing undefined values', () => {
49
+ expect( selectorArgsToStateKey( [ 1, 2, undefined ] ) ).toEqual( [
50
+ 1,
51
+ 2,
52
+ ] );
53
+ expect(
54
+ selectorArgsToStateKey( [ 1, 2, undefined, undefined ] )
55
+ ).toEqual( [ 1, 2 ] );
56
+ } );
57
+
58
+ it( 'should leave non-trailing undefined values alone', () => {
59
+ expect(
60
+ selectorArgsToStateKey( [ 1, undefined, 2, undefined ] )
61
+ ).toEqual( [ 1, undefined, 2 ] );
62
+ } );
63
+
64
+ it( 'should return already normalized array unchanged', () => {
65
+ const args = [ 1, 2, 3 ];
66
+ expect( selectorArgsToStateKey( args ) ).toBe( args );
67
+ } );
68
+ } );
@@ -0,0 +1,59 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import type { AnyAction, Reducer } from 'redux';
5
+
6
+ /**
7
+ * Higher-order reducer creator which creates a combined reducer object, keyed
8
+ * by a property on the action object.
9
+ *
10
+ * @param actionProperty Action property by which to key object.
11
+ * @return Higher-order reducer.
12
+ */
13
+ export const onSubKey = < TState extends unknown, TAction extends AnyAction >(
14
+ actionProperty: string
15
+ ) => (
16
+ reducer: Reducer< TState, TAction >
17
+ ): Reducer< Record< string, TState >, TAction > => (
18
+ state: Record< string, TState > = {},
19
+ action
20
+ ) => {
21
+ // Retrieve subkey from action. Do not track if undefined; useful for cases
22
+ // where reducer is scoped by action shape.
23
+ const key = action[ actionProperty ];
24
+ if ( key === undefined ) {
25
+ return state;
26
+ }
27
+
28
+ // Avoid updating state if unchanged. Note that this also accounts for a
29
+ // reducer which returns undefined on a key which is not yet tracked.
30
+ const nextKeyState = reducer( state[ key ], action );
31
+ if ( nextKeyState === state[ key ] ) {
32
+ return state;
33
+ }
34
+
35
+ return {
36
+ ...state,
37
+ [ key ]: nextKeyState,
38
+ };
39
+ };
40
+
41
+ /**
42
+ * Normalize selector argument array by defaulting `undefined` value to an empty array
43
+ * and removing trailing `undefined` values.
44
+ *
45
+ * @param args Selector argument array
46
+ * @return Normalized state key array
47
+ */
48
+ export function selectorArgsToStateKey( args: unknown[] | null | undefined ) {
49
+ if ( args === undefined || args === null ) {
50
+ return [];
51
+ }
52
+
53
+ const len = args.length;
54
+ let idx = len;
55
+ while ( idx > 0 && args[ idx - 1 ] === undefined ) {
56
+ idx--;
57
+ }
58
+ return idx === len ? args : args.slice( 0, idx );
59
+ }
package/src/registry.js CHANGED
@@ -291,6 +291,10 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
291
291
  // This function will be deprecated as soon as it is no longer internally referenced.
292
292
  //
293
293
  function use( plugin, options ) {
294
+ if ( ! plugin ) {
295
+ return;
296
+ }
297
+
294
298
  registry = {
295
299
  ...registry,
296
300
  ...plugin( registry, options ),