@wordpress/core-data 4.0.2 → 4.0.6

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 (65) hide show
  1. package/README.md +3 -5
  2. package/build/actions.js +79 -34
  3. package/build/actions.js.map +1 -1
  4. package/build/entities.js +51 -9
  5. package/build/entities.js.map +1 -1
  6. package/build/fetch/__experimental-fetch-url-data.js +1 -1
  7. package/build/fetch/__experimental-fetch-url-data.js.map +1 -1
  8. package/build/index.js +0 -7
  9. package/build/index.js.map +1 -1
  10. package/build/queried-data/get-query-parts.js +2 -0
  11. package/build/queried-data/get-query-parts.js.map +1 -1
  12. package/build/reducer.js +16 -18
  13. package/build/reducer.js.map +1 -1
  14. package/build/resolvers.js +48 -31
  15. package/build/resolvers.js.map +1 -1
  16. package/build/selectors.js +70 -10
  17. package/build/selectors.js.map +1 -1
  18. package/build/utils/forward-resolver.js +23 -0
  19. package/build/utils/forward-resolver.js.map +1 -0
  20. package/build/utils/index.js +3 -3
  21. package/build/utils/index.js.map +1 -1
  22. package/build-module/actions.js +74 -33
  23. package/build-module/actions.js.map +1 -1
  24. package/build-module/entities.js +51 -9
  25. package/build-module/entities.js.map +1 -1
  26. package/build-module/fetch/__experimental-fetch-url-data.js +1 -1
  27. package/build-module/fetch/__experimental-fetch-url-data.js.map +1 -1
  28. package/build-module/index.js +0 -5
  29. package/build-module/index.js.map +1 -1
  30. package/build-module/queried-data/get-query-parts.js +2 -0
  31. package/build-module/queried-data/get-query-parts.js.map +1 -1
  32. package/build-module/reducer.js +14 -16
  33. package/build-module/reducer.js.map +1 -1
  34. package/build-module/resolvers.js +51 -37
  35. package/build-module/resolvers.js.map +1 -1
  36. package/build-module/selectors.js +64 -8
  37. package/build-module/selectors.js.map +1 -1
  38. package/build-module/utils/forward-resolver.js +15 -0
  39. package/build-module/utils/forward-resolver.js.map +1 -0
  40. package/build-module/utils/index.js +1 -1
  41. package/build-module/utils/index.js.map +1 -1
  42. package/package.json +10 -11
  43. package/src/actions.js +83 -52
  44. package/src/entities.js +36 -6
  45. package/src/fetch/__experimental-fetch-url-data.js +1 -1
  46. package/src/index.js +0 -3
  47. package/src/queried-data/get-query-parts.js +2 -0
  48. package/src/reducer.js +14 -17
  49. package/src/resolvers.js +67 -42
  50. package/src/selectors.js +143 -35
  51. package/src/test/actions.js +116 -37
  52. package/src/test/selectors.js +56 -1
  53. package/src/utils/forward-resolver.js +14 -0
  54. package/src/utils/index.js +1 -1
  55. package/build/controls.js +0 -44
  56. package/build/controls.js.map +0 -1
  57. package/build/utils/if-not-resolved.js +0 -31
  58. package/build/utils/if-not-resolved.js.map +0 -1
  59. package/build-module/controls.js +0 -31
  60. package/build-module/controls.js.map +0 -1
  61. package/build-module/utils/if-not-resolved.js +0 -23
  62. package/build-module/utils/if-not-resolved.js.map +0 -1
  63. package/src/controls.js +0 -31
  64. package/src/utils/if-not-resolved.js +0 -22
  65. package/src/utils/test/if-not-resolved.js +0 -76
@@ -418,7 +418,7 @@ describe( 'getEntityRecords', () => {
418
418
  } );
419
419
 
420
420
  describe( '__experimentalGetDirtyEntityRecords', () => {
421
- it( 'should return a map of objects with each raw edited entity record and its corresponding edits', () => {
421
+ it( 'returns a map of objects with each raw edited entity record and its corresponding edits', () => {
422
422
  const state = deepFreeze( {
423
423
  entities: {
424
424
  config: [
@@ -466,6 +466,61 @@ describe( '__experimentalGetDirtyEntityRecords', () => {
466
466
  { kind: 'someKind', name: 'someName', key: 'someKey', title: '' },
467
467
  ] );
468
468
  } );
469
+
470
+ it( 'excludes entity records that no longer exist', () => {
471
+ const state = deepFreeze( {
472
+ entities: {
473
+ config: [
474
+ {
475
+ kind: 'someKind',
476
+ name: 'someName',
477
+ transientEdits: { someTransientEditProperty: true },
478
+ },
479
+ ],
480
+ data: {
481
+ someKind: {
482
+ someName: {
483
+ queriedData: {
484
+ items: {
485
+ default: {
486
+ someKey: {
487
+ someProperty: 'somePersistedValue',
488
+ someRawProperty: {
489
+ raw: 'somePersistedRawValue',
490
+ },
491
+ id: 'someKey',
492
+ },
493
+ },
494
+ },
495
+ itemIsComplete: {
496
+ default: {
497
+ someKey: true,
498
+ },
499
+ },
500
+ },
501
+ edits: {
502
+ someKey: {
503
+ someProperty: 'someEditedValue',
504
+ someRawProperty: 'someEditedRawValue',
505
+ someTransientEditProperty:
506
+ 'someEditedTransientEditValue',
507
+ },
508
+ deletedKey: {
509
+ someProperty: 'someEditedValue',
510
+ someRawProperty: 'someEditedRawValue',
511
+ someTransientEditProperty:
512
+ 'someEditedTransientEditValue',
513
+ },
514
+ },
515
+ },
516
+ },
517
+ },
518
+ },
519
+ } );
520
+ expect( __experimentalGetDirtyEntityRecords( state ) ).toEqual( [
521
+ { kind: 'someKind', name: 'someName', key: 'someKey', title: '' },
522
+ ] );
523
+ } );
469
524
  } );
470
525
 
471
526
  describe( '__experimentalGetEntitiesBeingSaved', () => {
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Higher-order function which forward the resolution to another resolver with the same arguments.
3
+ *
4
+ * @param {string} resolverName forwarded resolver.
5
+ *
6
+ * @return {Function} Enhanced resolver.
7
+ */
8
+ const forwardResolver = ( resolverName ) => ( ...args ) => async ( {
9
+ resolveSelect,
10
+ } ) => {
11
+ await resolveSelect[ resolverName ]( ...args );
12
+ };
13
+
14
+ export default forwardResolver;
@@ -1,7 +1,7 @@
1
1
  export { default as conservativeMapItem } from './conservative-map-item';
2
2
  export { default as getNormalizedCommaSeparable } from './get-normalized-comma-separable';
3
3
  export { default as ifMatchingAction } from './if-matching-action';
4
- export { default as ifNotResolved } from './if-not-resolved';
4
+ export { default as forwardResolver } from './forward-resolver';
5
5
  export { default as onSubKey } from './on-sub-key';
6
6
  export { default as replaceAction } from './replace-action';
7
7
  export { default as withWeakMapCache } from './with-weak-map-cache';
package/build/controls.js DELETED
@@ -1,44 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.regularFetch = regularFetch;
7
- exports.getDispatch = getDispatch;
8
- exports.default = void 0;
9
-
10
- var _data = require("@wordpress/data");
11
-
12
- /**
13
- * WordPress dependencies
14
- */
15
- function regularFetch(url) {
16
- return {
17
- type: 'REGULAR_FETCH',
18
- url
19
- };
20
- }
21
-
22
- function getDispatch() {
23
- return {
24
- type: 'GET_DISPATCH'
25
- };
26
- }
27
-
28
- const controls = {
29
- async REGULAR_FETCH({
30
- url
31
- }) {
32
- const {
33
- data
34
- } = await window.fetch(url).then(res => res.json());
35
- return data;
36
- },
37
-
38
- GET_DISPATCH: (0, _data.createRegistryControl)(({
39
- dispatch
40
- }) => () => dispatch)
41
- };
42
- var _default = controls;
43
- exports.default = _default;
44
- //# sourceMappingURL=controls.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["@wordpress/core-data/src/controls.js"],"names":["regularFetch","url","type","getDispatch","controls","REGULAR_FETCH","data","window","fetch","then","res","json","GET_DISPATCH","dispatch"],"mappings":";;;;;;;;;AAGA;;AAHA;AACA;AACA;AAGO,SAASA,YAAT,CAAuBC,GAAvB,EAA6B;AACnC,SAAO;AACNC,IAAAA,IAAI,EAAE,eADA;AAEND,IAAAA;AAFM,GAAP;AAIA;;AAEM,SAASE,WAAT,GAAuB;AAC7B,SAAO;AACND,IAAAA,IAAI,EAAE;AADA,GAAP;AAGA;;AAED,MAAME,QAAQ,GAAG;AAChB,QAAMC,aAAN,CAAqB;AAAEJ,IAAAA;AAAF,GAArB,EAA+B;AAC9B,UAAM;AAAEK,MAAAA;AAAF,QAAW,MAAMC,MAAM,CAC3BC,KADqB,CACdP,GADc,EAErBQ,IAFqB,CAEbC,GAAF,IAAWA,GAAG,CAACC,IAAJ,EAFI,CAAvB;AAIA,WAAOL,IAAP;AACA,GAPe;;AAShBM,EAAAA,YAAY,EAAE,iCAAuB,CAAE;AAAEC,IAAAA;AAAF,GAAF,KAAoB,MAAMA,QAAjD;AATE,CAAjB;eAYeT,Q","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { createRegistryControl } from '@wordpress/data';\n\nexport function regularFetch( url ) {\n\treturn {\n\t\ttype: 'REGULAR_FETCH',\n\t\turl,\n\t};\n}\n\nexport function getDispatch() {\n\treturn {\n\t\ttype: 'GET_DISPATCH',\n\t};\n}\n\nconst controls = {\n\tasync REGULAR_FETCH( { url } ) {\n\t\tconst { data } = await window\n\t\t\t.fetch( url )\n\t\t\t.then( ( res ) => res.json() );\n\n\t\treturn data;\n\t},\n\n\tGET_DISPATCH: createRegistryControl( ( { dispatch } ) => () => dispatch ),\n};\n\nexport default controls;\n"]}
@@ -1,31 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- /**
9
- * Higher-order function which invokes the given resolver only if it has not
10
- * already been resolved with the arguments passed to the enhanced function.
11
- *
12
- * This only considers resolution state, and notably does not support resolver
13
- * custom `isFulfilled` behavior.
14
- *
15
- * @param {Function} resolver Original resolver.
16
- * @param {string} selectorName Selector name associated with resolver.
17
- *
18
- * @return {Function} Enhanced resolver.
19
- */
20
- const ifNotResolved = (resolver, selectorName) => (...args) => async ({
21
- select,
22
- dispatch
23
- }) => {
24
- if (!select.hasStartedResolution(selectorName, args)) {
25
- await dispatch(resolver(...args));
26
- }
27
- };
28
-
29
- var _default = ifNotResolved;
30
- exports.default = _default;
31
- //# sourceMappingURL=if-not-resolved.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["@wordpress/core-data/src/utils/if-not-resolved.js"],"names":["ifNotResolved","resolver","selectorName","args","select","dispatch","hasStartedResolution"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMA,aAAa,GAAG,CAAEC,QAAF,EAAYC,YAAZ,KAA8B,CAAE,GAAGC,IAAL,KAAe,OAAQ;AAC1EC,EAAAA,MAD0E;AAE1EC,EAAAA;AAF0E,CAAR,KAG5D;AACN,MAAK,CAAED,MAAM,CAACE,oBAAP,CAA6BJ,YAA7B,EAA2CC,IAA3C,CAAP,EAA2D;AAC1D,UAAME,QAAQ,CAAEJ,QAAQ,CAAE,GAAGE,IAAL,CAAV,CAAd;AACA;AACD,CAPD;;eASeH,a","sourcesContent":["/**\n * Higher-order function which invokes the given resolver only if it has not\n * already been resolved with the arguments passed to the enhanced function.\n *\n * This only considers resolution state, and notably does not support resolver\n * custom `isFulfilled` behavior.\n *\n * @param {Function} resolver Original resolver.\n * @param {string} selectorName Selector name associated with resolver.\n *\n * @return {Function} Enhanced resolver.\n */\nconst ifNotResolved = ( resolver, selectorName ) => ( ...args ) => async ( {\n\tselect,\n\tdispatch,\n} ) => {\n\tif ( ! select.hasStartedResolution( selectorName, args ) ) {\n\t\tawait dispatch( resolver( ...args ) );\n\t}\n};\n\nexport default ifNotResolved;\n"]}
@@ -1,31 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { createRegistryControl } from '@wordpress/data';
5
- export function regularFetch(url) {
6
- return {
7
- type: 'REGULAR_FETCH',
8
- url
9
- };
10
- }
11
- export function getDispatch() {
12
- return {
13
- type: 'GET_DISPATCH'
14
- };
15
- }
16
- const controls = {
17
- async REGULAR_FETCH({
18
- url
19
- }) {
20
- const {
21
- data
22
- } = await window.fetch(url).then(res => res.json());
23
- return data;
24
- },
25
-
26
- GET_DISPATCH: createRegistryControl(({
27
- dispatch
28
- }) => () => dispatch)
29
- };
30
- export default controls;
31
- //# sourceMappingURL=controls.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["@wordpress/core-data/src/controls.js"],"names":["createRegistryControl","regularFetch","url","type","getDispatch","controls","REGULAR_FETCH","data","window","fetch","then","res","json","GET_DISPATCH","dispatch"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,qBAAT,QAAsC,iBAAtC;AAEA,OAAO,SAASC,YAAT,CAAuBC,GAAvB,EAA6B;AACnC,SAAO;AACNC,IAAAA,IAAI,EAAE,eADA;AAEND,IAAAA;AAFM,GAAP;AAIA;AAED,OAAO,SAASE,WAAT,GAAuB;AAC7B,SAAO;AACND,IAAAA,IAAI,EAAE;AADA,GAAP;AAGA;AAED,MAAME,QAAQ,GAAG;AAChB,QAAMC,aAAN,CAAqB;AAAEJ,IAAAA;AAAF,GAArB,EAA+B;AAC9B,UAAM;AAAEK,MAAAA;AAAF,QAAW,MAAMC,MAAM,CAC3BC,KADqB,CACdP,GADc,EAErBQ,IAFqB,CAEbC,GAAF,IAAWA,GAAG,CAACC,IAAJ,EAFI,CAAvB;AAIA,WAAOL,IAAP;AACA,GAPe;;AAShBM,EAAAA,YAAY,EAAEb,qBAAqB,CAAE,CAAE;AAAEc,IAAAA;AAAF,GAAF,KAAoB,MAAMA,QAA5B;AATnB,CAAjB;AAYA,eAAeT,QAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { createRegistryControl } from '@wordpress/data';\n\nexport function regularFetch( url ) {\n\treturn {\n\t\ttype: 'REGULAR_FETCH',\n\t\turl,\n\t};\n}\n\nexport function getDispatch() {\n\treturn {\n\t\ttype: 'GET_DISPATCH',\n\t};\n}\n\nconst controls = {\n\tasync REGULAR_FETCH( { url } ) {\n\t\tconst { data } = await window\n\t\t\t.fetch( url )\n\t\t\t.then( ( res ) => res.json() );\n\n\t\treturn data;\n\t},\n\n\tGET_DISPATCH: createRegistryControl( ( { dispatch } ) => () => dispatch ),\n};\n\nexport default controls;\n"]}
@@ -1,23 +0,0 @@
1
- /**
2
- * Higher-order function which invokes the given resolver only if it has not
3
- * already been resolved with the arguments passed to the enhanced function.
4
- *
5
- * This only considers resolution state, and notably does not support resolver
6
- * custom `isFulfilled` behavior.
7
- *
8
- * @param {Function} resolver Original resolver.
9
- * @param {string} selectorName Selector name associated with resolver.
10
- *
11
- * @return {Function} Enhanced resolver.
12
- */
13
- const ifNotResolved = (resolver, selectorName) => (...args) => async ({
14
- select,
15
- dispatch
16
- }) => {
17
- if (!select.hasStartedResolution(selectorName, args)) {
18
- await dispatch(resolver(...args));
19
- }
20
- };
21
-
22
- export default ifNotResolved;
23
- //# sourceMappingURL=if-not-resolved.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["@wordpress/core-data/src/utils/if-not-resolved.js"],"names":["ifNotResolved","resolver","selectorName","args","select","dispatch","hasStartedResolution"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMA,aAAa,GAAG,CAAEC,QAAF,EAAYC,YAAZ,KAA8B,CAAE,GAAGC,IAAL,KAAe,OAAQ;AAC1EC,EAAAA,MAD0E;AAE1EC,EAAAA;AAF0E,CAAR,KAG5D;AACN,MAAK,CAAED,MAAM,CAACE,oBAAP,CAA6BJ,YAA7B,EAA2CC,IAA3C,CAAP,EAA2D;AAC1D,UAAME,QAAQ,CAAEJ,QAAQ,CAAE,GAAGE,IAAL,CAAV,CAAd;AACA;AACD,CAPD;;AASA,eAAeH,aAAf","sourcesContent":["/**\n * Higher-order function which invokes the given resolver only if it has not\n * already been resolved with the arguments passed to the enhanced function.\n *\n * This only considers resolution state, and notably does not support resolver\n * custom `isFulfilled` behavior.\n *\n * @param {Function} resolver Original resolver.\n * @param {string} selectorName Selector name associated with resolver.\n *\n * @return {Function} Enhanced resolver.\n */\nconst ifNotResolved = ( resolver, selectorName ) => ( ...args ) => async ( {\n\tselect,\n\tdispatch,\n} ) => {\n\tif ( ! select.hasStartedResolution( selectorName, args ) ) {\n\t\tawait dispatch( resolver( ...args ) );\n\t}\n};\n\nexport default ifNotResolved;\n"]}
package/src/controls.js DELETED
@@ -1,31 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { createRegistryControl } from '@wordpress/data';
5
-
6
- export function regularFetch( url ) {
7
- return {
8
- type: 'REGULAR_FETCH',
9
- url,
10
- };
11
- }
12
-
13
- export function getDispatch() {
14
- return {
15
- type: 'GET_DISPATCH',
16
- };
17
- }
18
-
19
- const controls = {
20
- async REGULAR_FETCH( { url } ) {
21
- const { data } = await window
22
- .fetch( url )
23
- .then( ( res ) => res.json() );
24
-
25
- return data;
26
- },
27
-
28
- GET_DISPATCH: createRegistryControl( ( { dispatch } ) => () => dispatch ),
29
- };
30
-
31
- export default controls;
@@ -1,22 +0,0 @@
1
- /**
2
- * Higher-order function which invokes the given resolver only if it has not
3
- * already been resolved with the arguments passed to the enhanced function.
4
- *
5
- * This only considers resolution state, and notably does not support resolver
6
- * custom `isFulfilled` behavior.
7
- *
8
- * @param {Function} resolver Original resolver.
9
- * @param {string} selectorName Selector name associated with resolver.
10
- *
11
- * @return {Function} Enhanced resolver.
12
- */
13
- const ifNotResolved = ( resolver, selectorName ) => ( ...args ) => async ( {
14
- select,
15
- dispatch,
16
- } ) => {
17
- if ( ! select.hasStartedResolution( selectorName, args ) ) {
18
- await dispatch( resolver( ...args ) );
19
- }
20
- };
21
-
22
- export default ifNotResolved;
@@ -1,76 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { controls } from '@wordpress/data';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ifNotResolved from '../if-not-resolved';
10
-
11
- jest.mock( '@wordpress/data', () => ( {
12
- controls: {
13
- select: jest.fn(),
14
- },
15
- } ) );
16
-
17
- describe( 'ifNotResolved', () => {
18
- beforeEach( () => {
19
- controls.select.mockReset();
20
- } );
21
-
22
- it( 'returns a new function', () => {
23
- const originalResolver = () => {};
24
-
25
- const resolver = ifNotResolved( originalResolver, 'originalResolver' );
26
-
27
- expect( resolver ).toBeInstanceOf( Function );
28
- } );
29
-
30
- it( 'triggers original resolver if not already resolved', async () => {
31
- const select = { hasStartedResolution: () => false };
32
- const dispatch = () => {};
33
-
34
- const originalResolver = jest
35
- .fn()
36
- .mockImplementation( async function () {} );
37
-
38
- const resolver = ifNotResolved( originalResolver, 'originalResolver' );
39
- await resolver()( { select, dispatch } );
40
-
41
- expect( originalResolver ).toHaveBeenCalledTimes( 1 );
42
- } );
43
-
44
- it( 'does not trigger original resolver if already resolved', async () => {
45
- const select = { hasStartedResolution: () => true };
46
- const dispatch = () => {};
47
-
48
- const originalResolver = jest
49
- .fn()
50
- .mockImplementation( async function () {} );
51
-
52
- const resolver = ifNotResolved( originalResolver, 'originalResolver' );
53
- await resolver()( { select, dispatch } );
54
-
55
- expect( originalResolver ).toHaveBeenCalledTimes( 0 );
56
- } );
57
-
58
- it( 'returns a promise when the resolver was not already resolved', async () => {
59
- const select = { hasStartedResolution: () => false };
60
- let thunkRetval;
61
- const dispatch = jest.fn( ( thunk ) => {
62
- thunkRetval = thunk();
63
- return thunkRetval;
64
- } );
65
-
66
- const originalResolver = jest.fn( () => () =>
67
- Promise.resolve( 'success!' )
68
- );
69
-
70
- const resolver = ifNotResolved( originalResolver, 'originalResolver' );
71
- const result = resolver()( { select, dispatch } );
72
-
73
- await expect( result ).resolves.toBe( undefined );
74
- await expect( thunkRetval ).resolves.toBe( 'success!' );
75
- } );
76
- } );