@wordpress/data 6.4.1 → 6.6.1

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.
@@ -321,16 +321,26 @@ function mapActions( actions, store ) {
321
321
  * @return {Object} Selectors mapped to their resolution functions.
322
322
  */
323
323
  function mapResolveSelectors( selectors, store ) {
324
- return mapValues(
325
- omit( selectors, [
326
- 'getIsResolving',
327
- 'hasStartedResolution',
328
- 'hasFinishedResolution',
329
- 'isResolving',
330
- 'getCachedResolvers',
331
- ] ),
332
- ( selector, selectorName ) => ( ...args ) =>
333
- new Promise( ( resolve, reject ) => {
324
+ const storeSelectors = omit( selectors, [
325
+ 'getIsResolving',
326
+ 'hasStartedResolution',
327
+ 'hasFinishedResolution',
328
+ 'hasResolutionFailed',
329
+ 'isResolving',
330
+ 'getCachedResolvers',
331
+ 'getResolutionState',
332
+ 'getResolutionError',
333
+ ] );
334
+
335
+ return mapValues( storeSelectors, ( selector, selectorName ) => {
336
+ // If the selector doesn't have a resolver, just convert the return value
337
+ // (including exceptions) to a Promise, no additional extra behavior is needed.
338
+ if ( ! selector.hasResolver ) {
339
+ return async ( ...args ) => selector.apply( null, args );
340
+ }
341
+
342
+ return ( ...args ) => {
343
+ return new Promise( ( resolve, reject ) => {
334
344
  const hasFinished = () =>
335
345
  selectors.hasFinishedResolution( selectorName, args );
336
346
  const finalize = ( result ) => {
@@ -361,8 +371,9 @@ function mapResolveSelectors( selectors, store ) {
361
371
  finalize( getResult() );
362
372
  }
363
373
  } );
364
- } )
365
- );
374
+ } );
375
+ };
376
+ } );
366
377
  }
367
378
 
368
379
  /**
@@ -4,7 +4,7 @@
4
4
  import { createRegistry } from '../../registry';
5
5
  import { createRegistryControl } from '../../factory';
6
6
 
7
- jest.useFakeTimers();
7
+ jest.useRealTimers();
8
8
 
9
9
  describe( 'controls', () => {
10
10
  let registry;
@@ -90,7 +90,6 @@ describe( 'controls', () => {
90
90
  } );
91
91
 
92
92
  registry.select( 'store' ).getItems();
93
- jest.runAllTimers();
94
93
  } );
95
94
  } );
96
95
  describe( 'selectors have expected value for the `hasResolver` property', () => {
@@ -250,6 +249,7 @@ describe( 'resolveSelect', () => {
250
249
  },
251
250
  selectors: {
252
251
  getItems: () => 'items',
252
+ getItemsNoResolver: () => 'items-no-resolver',
253
253
  },
254
254
  resolvers: {
255
255
  getItems: () => {
@@ -264,16 +264,26 @@ describe( 'resolveSelect', () => {
264
264
  it( 'resolves when the resolution succeeded', async () => {
265
265
  shouldFail = false;
266
266
  const promise = registry.resolveSelect( 'store' ).getItems();
267
- jest.runAllTimers();
268
- await expect( promise ).resolves.toEqual( 'items' );
267
+ await expect( promise ).resolves.toBe( 'items' );
269
268
  } );
270
269
 
271
270
  it( 'rejects when the resolution failed', async () => {
272
271
  shouldFail = true;
273
272
  const promise = registry.resolveSelect( 'store' ).getItems();
274
- jest.runAllTimers();
275
273
  await expect( promise ).rejects.toEqual(
276
274
  new Error( 'cannot fetch items' )
277
275
  );
278
276
  } );
277
+
278
+ it( 'resolves when calling a sync selector without resolver', async () => {
279
+ const promise = registry.resolveSelect( 'store' ).getItemsNoResolver();
280
+ await expect( promise ).resolves.toBe( 'items-no-resolver' );
281
+ } );
282
+
283
+ it( 'returns only store native selectors and excludes all meta ones', () => {
284
+ expect( Object.keys( registry.resolveSelect( 'store' ) ) ).toEqual( [
285
+ 'getItems',
286
+ 'getItemsNoResolver',
287
+ ] );
288
+ } );
279
289
  } );
package/src/registry.js CHANGED
@@ -55,7 +55,7 @@ import { createEmitter } from './utils/emitter';
55
55
  export function createRegistry( storeConfigs = {}, parent = null ) {
56
56
  const stores = {};
57
57
  const emitter = createEmitter();
58
- const __experimentalListeningStores = new Set();
58
+ const listeningStores = new Set();
59
59
 
60
60
  /**
61
61
  * Global listener called for each store's update.
@@ -87,7 +87,7 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
87
87
  const storeName = isObject( storeNameOrDescriptor )
88
88
  ? storeNameOrDescriptor.name
89
89
  : storeNameOrDescriptor;
90
- __experimentalListeningStores.add( storeName );
90
+ listeningStores.add( storeName );
91
91
  const store = stores[ storeName ];
92
92
  if ( store ) {
93
93
  return store.getSelectors();
@@ -96,10 +96,10 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
96
96
  return parent && parent.select( storeName );
97
97
  }
98
98
 
99
- function __experimentalMarkListeningStores( callback, ref ) {
100
- __experimentalListeningStores.clear();
99
+ function __unstableMarkListeningStores( callback, ref ) {
100
+ listeningStores.clear();
101
101
  const result = callback.call( this );
102
- ref.current = Array.from( __experimentalListeningStores );
102
+ ref.current = Array.from( listeningStores );
103
103
  return result;
104
104
  }
105
105
 
@@ -118,7 +118,7 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
118
118
  const storeName = isObject( storeNameOrDescriptor )
119
119
  ? storeNameOrDescriptor.name
120
120
  : storeNameOrDescriptor;
121
- __experimentalListeningStores.add( storeName );
121
+ listeningStores.add( storeName );
122
122
  const store = stores[ storeName ];
123
123
  if ( store ) {
124
124
  return store.getResolveSelectors();
@@ -245,7 +245,7 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
245
245
  * @param {Function} handler The function subscribed to the store.
246
246
  * @return {Function} A function to unsubscribe the handler.
247
247
  */
248
- function __experimentalSubscribeStore( storeName, handler ) {
248
+ function __unstableSubscribeStore( storeName, handler ) {
249
249
  if ( storeName in stores ) {
250
250
  return stores[ storeName ].subscribe( handler );
251
251
  }
@@ -258,7 +258,7 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
258
258
  return subscribe( handler );
259
259
  }
260
260
 
261
- return parent.__experimentalSubscribeStore( storeName, handler );
261
+ return parent.__unstableSubscribeStore( storeName, handler );
262
262
  }
263
263
 
264
264
  function batch( callback ) {
@@ -281,8 +281,8 @@ export function createRegistry( storeConfigs = {}, parent = null ) {
281
281
  register,
282
282
  registerGenericStore,
283
283
  registerStore,
284
- __experimentalMarkListeningStores,
285
- __experimentalSubscribeStore,
284
+ __unstableMarkListeningStores,
285
+ __unstableSubscribeStore,
286
286
  };
287
287
 
288
288
  //
@@ -718,7 +718,7 @@ describe( 'createRegistry', () => {
718
718
  const listener2 = jest.fn();
719
719
  // useSelect subscribes to the stores differently,
720
720
  // This test ensures batching works in this case as well.
721
- const unsubscribe = registry.__experimentalSubscribeStore(
721
+ const unsubscribe = registry.__unstableSubscribeStore(
722
722
  'myAwesomeReducer',
723
723
  listener2
724
724
  );