@wordpress/core-data 4.0.3 → 4.0.7

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 (99) hide show
  1. package/README.md +2 -4
  2. package/build/actions.js +321 -247
  3. package/build/actions.js.map +1 -1
  4. package/build/batch/create-batch.js +17 -9
  5. package/build/batch/create-batch.js.map +1 -1
  6. package/build/entities.js +58 -14
  7. package/build/entities.js.map +1 -1
  8. package/build/entity-provider.js +18 -13
  9. package/build/entity-provider.js.map +1 -1
  10. package/build/fetch/__experimental-fetch-link-suggestions.js +3 -1
  11. package/build/fetch/__experimental-fetch-link-suggestions.js.map +1 -1
  12. package/build/fetch/__experimental-fetch-url-data.js +3 -2
  13. package/build/fetch/__experimental-fetch-url-data.js.map +1 -1
  14. package/build/index.js +25 -5
  15. package/build/index.js.map +1 -1
  16. package/build/locks/actions.js +4 -3
  17. package/build/locks/actions.js.map +1 -1
  18. package/build/locks/reducer.js +4 -1
  19. package/build/locks/reducer.js.map +1 -1
  20. package/build/locks/selectors.js +4 -3
  21. package/build/locks/selectors.js.map +1 -1
  22. package/build/locks/utils.js +7 -5
  23. package/build/locks/utils.js.map +1 -1
  24. package/build/queried-data/actions.js +6 -3
  25. package/build/queried-data/actions.js.map +1 -1
  26. package/build/queried-data/get-query-parts.js +1 -1
  27. package/build/queried-data/reducer.js +17 -6
  28. package/build/queried-data/reducer.js.map +1 -1
  29. package/build/queried-data/selectors.js +2 -1
  30. package/build/queried-data/selectors.js.map +1 -1
  31. package/build/reducer.js +90 -43
  32. package/build/reducer.js.map +1 -1
  33. package/build/resolvers.js +216 -163
  34. package/build/resolvers.js.map +1 -1
  35. package/build/selectors.js +75 -22
  36. package/build/selectors.js.map +1 -1
  37. package/build/utils/forward-resolver.js +30 -0
  38. package/build/utils/forward-resolver.js.map +1 -0
  39. package/build/utils/index.js +9 -9
  40. package/build/utils/index.js.map +1 -1
  41. package/build/utils/on-sub-key.js +4 -2
  42. package/build/utils/on-sub-key.js.map +1 -1
  43. package/build-module/actions.js +306 -240
  44. package/build-module/actions.js.map +1 -1
  45. package/build-module/batch/create-batch.js +17 -9
  46. package/build-module/batch/create-batch.js.map +1 -1
  47. package/build-module/entities.js +57 -13
  48. package/build-module/entities.js.map +1 -1
  49. package/build-module/entity-provider.js +17 -12
  50. package/build-module/entity-provider.js.map +1 -1
  51. package/build-module/fetch/__experimental-fetch-link-suggestions.js +3 -1
  52. package/build-module/fetch/__experimental-fetch-link-suggestions.js.map +1 -1
  53. package/build-module/fetch/__experimental-fetch-url-data.js +3 -2
  54. package/build-module/fetch/__experimental-fetch-url-data.js.map +1 -1
  55. package/build-module/index.js +21 -3
  56. package/build-module/index.js.map +1 -1
  57. package/build-module/locks/actions.js +4 -3
  58. package/build-module/locks/actions.js.map +1 -1
  59. package/build-module/locks/reducer.js +4 -1
  60. package/build-module/locks/reducer.js.map +1 -1
  61. package/build-module/locks/selectors.js +4 -3
  62. package/build-module/locks/selectors.js.map +1 -1
  63. package/build-module/locks/utils.js +5 -3
  64. package/build-module/locks/utils.js.map +1 -1
  65. package/build-module/queried-data/actions.js +5 -2
  66. package/build-module/queried-data/actions.js.map +1 -1
  67. package/build-module/queried-data/reducer.js +15 -4
  68. package/build-module/queried-data/reducer.js.map +1 -1
  69. package/build-module/queried-data/selectors.js +2 -1
  70. package/build-module/queried-data/selectors.js.map +1 -1
  71. package/build-module/reducer.js +80 -34
  72. package/build-module/reducer.js.map +1 -1
  73. package/build-module/resolvers.js +211 -161
  74. package/build-module/resolvers.js.map +1 -1
  75. package/build-module/selectors.js +44 -3
  76. package/build-module/selectors.js.map +1 -1
  77. package/build-module/utils/forward-resolver.js +22 -0
  78. package/build-module/utils/forward-resolver.js.map +1 -0
  79. package/build-module/utils/index.js +1 -1
  80. package/build-module/utils/index.js.map +1 -1
  81. package/build-module/utils/on-sub-key.js +3 -1
  82. package/build-module/utils/on-sub-key.js.map +1 -1
  83. package/package.json +12 -12
  84. package/src/actions.js +51 -5
  85. package/src/entities.js +35 -6
  86. package/src/fetch/__experimental-fetch-url-data.js +1 -1
  87. package/src/reducer.js +14 -17
  88. package/src/resolvers.js +57 -20
  89. package/src/selectors.js +43 -4
  90. package/src/test/actions.js +89 -0
  91. package/src/test/selectors.js +56 -1
  92. package/src/utils/forward-resolver.js +14 -0
  93. package/src/utils/index.js +1 -1
  94. package/build/utils/if-not-resolved.js +0 -31
  95. package/build/utils/if-not-resolved.js.map +0 -1
  96. package/build-module/utils/if-not-resolved.js +0 -23
  97. package/build-module/utils/if-not-resolved.js.map +0 -1
  98. package/src/utils/if-not-resolved.js +0 -22
  99. package/src/utils/test/if-not-resolved.js +0 -76
package/build/actions.js CHANGED
@@ -5,18 +5,23 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.receiveUserQuery = receiveUserQuery;
9
- exports.receiveCurrentUser = receiveCurrentUser;
8
+ exports.__experimentalBatch = void 0;
9
+ exports.__experimentalReceiveCurrentGlobalStylesId = __experimentalReceiveCurrentGlobalStylesId;
10
+ exports.__experimentalReceiveThemeBaseGlobalStyles = __experimentalReceiveThemeBaseGlobalStyles;
11
+ exports.__experimentalSaveSpecifiedEntityEdits = void 0;
12
+ exports.__unstableCreateUndoLevel = __unstableCreateUndoLevel;
10
13
  exports.addEntities = addEntities;
11
- exports.receiveEntityRecords = receiveEntityRecords;
14
+ exports.editEntityRecord = exports.deleteEntityRecord = void 0;
15
+ exports.receiveAutosaves = receiveAutosaves;
12
16
  exports.receiveCurrentTheme = receiveCurrentTheme;
13
- exports.receiveThemeSupports = receiveThemeSupports;
17
+ exports.receiveCurrentUser = receiveCurrentUser;
14
18
  exports.receiveEmbedPreview = receiveEmbedPreview;
15
- exports.__unstableCreateUndoLevel = __unstableCreateUndoLevel;
19
+ exports.receiveEntityRecords = receiveEntityRecords;
20
+ exports.receiveThemeSupports = receiveThemeSupports;
16
21
  exports.receiveUploadPermissions = receiveUploadPermissions;
17
22
  exports.receiveUserPermission = receiveUserPermission;
18
- exports.receiveAutosaves = receiveAutosaves;
19
- exports.__experimentalSaveSpecifiedEntityEdits = exports.saveEditedEntityRecord = exports.__experimentalBatch = exports.saveEntityRecord = exports.redo = exports.undo = exports.editEntityRecord = exports.deleteEntityRecord = void 0;
23
+ exports.receiveUserQuery = receiveUserQuery;
24
+ exports.undo = exports.saveEntityRecord = exports.saveEditedEntityRecord = exports.redo = void 0;
20
25
 
21
26
  var _lodash = require("lodash");
22
27
 
@@ -26,6 +31,8 @@ var _apiFetch = _interopRequireDefault(require("@wordpress/api-fetch"));
26
31
 
27
32
  var _url = require("@wordpress/url");
28
33
 
34
+ var _deprecated = _interopRequireDefault(require("@wordpress/deprecated"));
35
+
29
36
  var _queriedData = require("./queried-data");
30
37
 
31
38
  var _entities = require("./entities");
@@ -104,7 +111,10 @@ function addEntities(entities) {
104
111
  */
105
112
 
106
113
 
107
- function receiveEntityRecords(kind, name, records, query, invalidateCache = false, edits) {
114
+ function receiveEntityRecords(kind, name, records, query) {
115
+ let invalidateCache = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
116
+ let edits = arguments.length > 5 ? arguments[5] : undefined;
117
+
108
118
  // Auto drafts should not have titles, but some plugins rely on them so we can't filter this
109
119
  // on the server.
110
120
  if (kind === 'postType') {
@@ -142,19 +152,53 @@ function receiveCurrentTheme(currentTheme) {
142
152
  currentTheme
143
153
  };
144
154
  }
155
+ /**
156
+ * Returns an action object used in signalling that the current global styles id has been received.
157
+ *
158
+ * @param {string} currentGlobalStylesId The current global styles id.
159
+ *
160
+ * @return {Object} Action object.
161
+ */
162
+
163
+
164
+ function __experimentalReceiveCurrentGlobalStylesId(currentGlobalStylesId) {
165
+ return {
166
+ type: 'RECEIVE_CURRENT_GLOBAL_STYLES_ID',
167
+ id: currentGlobalStylesId
168
+ };
169
+ }
170
+ /**
171
+ * Returns an action object used in signalling that the theme base global styles have been received
172
+ *
173
+ * @param {string} stylesheet The theme's identifier
174
+ * @param {Object} globalStyles The global styles object.
175
+ *
176
+ * @return {Object} Action object.
177
+ */
178
+
179
+
180
+ function __experimentalReceiveThemeBaseGlobalStyles(stylesheet, globalStyles) {
181
+ return {
182
+ type: 'RECEIVE_THEME_GLOBAL_STYLES',
183
+ stylesheet,
184
+ globalStyles
185
+ };
186
+ }
145
187
  /**
146
188
  * Returns an action object used in signalling that the index has been received.
147
189
  *
148
- * @param {Object} themeSupports Theme support for the current theme.
190
+ * @deprecated since WP 5.9, this is not useful anymore, use the selector direclty.
149
191
  *
150
192
  * @return {Object} Action object.
151
193
  */
152
194
 
153
195
 
154
- function receiveThemeSupports(themeSupports) {
196
+ function receiveThemeSupports() {
197
+ (0, _deprecated.default)("wp.data.dispatch( 'core' ).receiveThemeSupports", {
198
+ since: '5.9'
199
+ });
155
200
  return {
156
- type: 'RECEIVE_THEME_SUPPORTS',
157
- themeSupports
201
+ type: 'DO_NOTHING'
158
202
  };
159
203
  }
160
204
  /**
@@ -190,62 +234,66 @@ function receiveEmbedPreview(url, preview) {
190
234
  */
191
235
 
192
236
 
193
- const deleteEntityRecord = (kind, name, recordId, query, {
194
- __unstableFetch = _apiFetch.default
195
- } = {}) => async ({
196
- dispatch
197
- }) => {
198
- const entities = await dispatch((0, _entities.getKindEntities)(kind));
199
- const entity = (0, _lodash.find)(entities, {
200
- kind,
201
- name
202
- });
203
- let error;
204
- let deletedRecord = false;
205
-
206
- if (!entity || entity !== null && entity !== void 0 && entity.__experimentalNoFetch) {
207
- return;
208
- }
237
+ const deleteEntityRecord = function (kind, name, recordId, query) {
238
+ let {
239
+ __unstableFetch = _apiFetch.default
240
+ } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
241
+ return async _ref => {
242
+ let {
243
+ dispatch
244
+ } = _ref;
245
+ const entities = await dispatch((0, _entities.getKindEntities)(kind));
246
+ const entity = (0, _lodash.find)(entities, {
247
+ kind,
248
+ name
249
+ });
250
+ let error;
251
+ let deletedRecord = false;
209
252
 
210
- const lock = await dispatch.__unstableAcquireStoreLock(_name.STORE_NAME, ['entities', 'data', kind, name, recordId], {
211
- exclusive: true
212
- });
253
+ if (!entity || entity !== null && entity !== void 0 && entity.__experimentalNoFetch) {
254
+ return;
255
+ }
213
256
 
214
- try {
215
- dispatch({
216
- type: 'DELETE_ENTITY_RECORD_START',
217
- kind,
218
- name,
219
- recordId
257
+ const lock = await dispatch.__unstableAcquireStoreLock(_name.STORE_NAME, ['entities', 'data', kind, name, recordId], {
258
+ exclusive: true
220
259
  });
221
260
 
222
261
  try {
223
- let path = `${entity.baseURL}/${recordId}`;
262
+ dispatch({
263
+ type: 'DELETE_ENTITY_RECORD_START',
264
+ kind,
265
+ name,
266
+ recordId
267
+ });
224
268
 
225
- if (query) {
226
- path = (0, _url.addQueryArgs)(path, query);
269
+ try {
270
+ let path = `${entity.baseURL}/${recordId}`;
271
+
272
+ if (query) {
273
+ path = (0, _url.addQueryArgs)(path, query);
274
+ }
275
+
276
+ deletedRecord = await __unstableFetch({
277
+ path,
278
+ method: 'DELETE'
279
+ });
280
+ await dispatch((0, _queriedData.removeItems)(kind, name, recordId, true));
281
+ } catch (_error) {
282
+ error = _error;
227
283
  }
228
284
 
229
- deletedRecord = await __unstableFetch({
230
- path,
231
- method: 'DELETE'
285
+ dispatch({
286
+ type: 'DELETE_ENTITY_RECORD_FINISH',
287
+ kind,
288
+ name,
289
+ recordId,
290
+ error
232
291
  });
233
- await dispatch((0, _queriedData.removeItems)(kind, name, recordId, true));
234
- } catch (_error) {
235
- error = _error;
292
+ return deletedRecord;
293
+ } finally {
294
+ dispatch.__unstableReleaseStoreLock(lock);
236
295
  }
237
-
238
- dispatch({
239
- type: 'DELETE_ENTITY_RECORD_FINISH',
240
- kind,
241
- name,
242
- recordId,
243
- error
244
- });
245
- return deletedRecord;
246
- } finally {
247
- dispatch.__unstableReleaseStoreLock(lock);
248
- }
296
+ };
249
297
  };
250
298
  /**
251
299
  * Returns an action object that triggers an
@@ -264,52 +312,56 @@ const deleteEntityRecord = (kind, name, recordId, query, {
264
312
 
265
313
  exports.deleteEntityRecord = deleteEntityRecord;
266
314
 
267
- const editEntityRecord = (kind, name, recordId, edits, options = {}) => ({
268
- select,
269
- dispatch
270
- }) => {
271
- const entity = select.getEntity(kind, name);
272
-
273
- if (!entity) {
274
- throw new Error(`The entity being edited (${kind}, ${name}) does not have a loaded config.`);
275
- }
315
+ const editEntityRecord = function (kind, name, recordId, edits) {
316
+ let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
317
+ return _ref2 => {
318
+ let {
319
+ select,
320
+ dispatch
321
+ } = _ref2;
322
+ const entity = select.getEntity(kind, name);
323
+
324
+ if (!entity) {
325
+ throw new Error(`The entity being edited (${kind}, ${name}) does not have a loaded config.`);
326
+ }
276
327
 
277
- const {
278
- transientEdits = {},
279
- mergedEdits = {}
280
- } = entity;
281
- const record = select.getRawEntityRecord(kind, name, recordId);
282
- const editedRecord = select.getEditedEntityRecord(kind, name, recordId);
283
- const edit = {
284
- kind,
285
- name,
286
- recordId,
287
- // Clear edits when they are equal to their persisted counterparts
288
- // so that the property is not considered dirty.
289
- edits: Object.keys(edits).reduce((acc, key) => {
290
- const recordValue = record[key];
291
- const editedRecordValue = editedRecord[key];
292
- const value = mergedEdits[key] ? { ...editedRecordValue,
293
- ...edits[key]
294
- } : edits[key];
295
- acc[key] = (0, _lodash.isEqual)(recordValue, value) ? undefined : value;
296
- return acc;
297
- }, {}),
298
- transientEdits
299
- };
300
- dispatch({
301
- type: 'EDIT_ENTITY_RECORD',
302
- ...edit,
303
- meta: {
304
- undo: !options.undoIgnore && { ...edit,
305
- // Send the current values for things like the first undo stack entry.
306
- edits: Object.keys(edits).reduce((acc, key) => {
307
- acc[key] = editedRecord[key];
308
- return acc;
309
- }, {})
328
+ const {
329
+ transientEdits = {},
330
+ mergedEdits = {}
331
+ } = entity;
332
+ const record = select.getRawEntityRecord(kind, name, recordId);
333
+ const editedRecord = select.getEditedEntityRecord(kind, name, recordId);
334
+ const edit = {
335
+ kind,
336
+ name,
337
+ recordId,
338
+ // Clear edits when they are equal to their persisted counterparts
339
+ // so that the property is not considered dirty.
340
+ edits: Object.keys(edits).reduce((acc, key) => {
341
+ const recordValue = record[key];
342
+ const editedRecordValue = editedRecord[key];
343
+ const value = mergedEdits[key] ? { ...editedRecordValue,
344
+ ...edits[key]
345
+ } : edits[key];
346
+ acc[key] = (0, _lodash.isEqual)(recordValue, value) ? undefined : value;
347
+ return acc;
348
+ }, {}),
349
+ transientEdits
350
+ };
351
+ dispatch({
352
+ type: 'EDIT_ENTITY_RECORD',
353
+ ...edit,
354
+ meta: {
355
+ undo: !options.undoIgnore && { ...edit,
356
+ // Send the current values for things like the first undo stack entry.
357
+ edits: Object.keys(edits).reduce((acc, key) => {
358
+ acc[key] = editedRecord[key];
359
+ return acc;
360
+ }, {})
361
+ }
310
362
  }
311
- }
312
- });
363
+ });
364
+ };
313
365
  };
314
366
  /**
315
367
  * Action triggered to undo the last edit to
@@ -321,10 +373,11 @@ const editEntityRecord = (kind, name, recordId, edits, options = {}) => ({
321
373
 
322
374
  exports.editEntityRecord = editEntityRecord;
323
375
 
324
- const undo = () => ({
325
- select,
326
- dispatch
327
- }) => {
376
+ const undo = () => _ref3 => {
377
+ let {
378
+ select,
379
+ dispatch
380
+ } = _ref3;
328
381
  const undoEdit = select.getUndoEdit();
329
382
 
330
383
  if (!undoEdit) {
@@ -349,10 +402,11 @@ const undo = () => ({
349
402
 
350
403
  exports.undo = undo;
351
404
 
352
- const redo = () => ({
353
- select,
354
- dispatch
355
- }) => {
405
+ const redo = () => _ref4 => {
406
+ let {
407
+ select,
408
+ dispatch
409
+ } = _ref4;
356
410
  const redoEdit = select.getRedoEdit();
357
411
 
358
412
  if (!redoEdit) {
@@ -395,148 +449,152 @@ function __unstableCreateUndoLevel() {
395
449
  */
396
450
 
397
451
 
398
- const saveEntityRecord = (kind, name, record, {
399
- isAutosave = false,
400
- __unstableFetch = _apiFetch.default
401
- } = {}) => async ({
402
- select,
403
- resolveSelect,
404
- dispatch
405
- }) => {
406
- const entities = await dispatch((0, _entities.getKindEntities)(kind));
407
- const entity = (0, _lodash.find)(entities, {
408
- kind,
409
- name
410
- });
411
-
412
- if (!entity || entity !== null && entity !== void 0 && entity.__experimentalNoFetch) {
413
- return;
414
- }
415
-
416
- const entityIdKey = entity.key || _entities.DEFAULT_ENTITY_KEY;
417
- const recordId = record[entityIdKey];
418
- const lock = await dispatch.__unstableAcquireStoreLock(_name.STORE_NAME, ['entities', 'data', kind, name, recordId || (0, _uuid.v4)()], {
419
- exclusive: true
420
- });
452
+ const saveEntityRecord = function (kind, name, record) {
453
+ let {
454
+ isAutosave = false,
455
+ __unstableFetch = _apiFetch.default
456
+ } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
457
+ return async _ref5 => {
458
+ let {
459
+ select,
460
+ resolveSelect,
461
+ dispatch
462
+ } = _ref5;
463
+ const entities = await dispatch((0, _entities.getKindEntities)(kind));
464
+ const entity = (0, _lodash.find)(entities, {
465
+ kind,
466
+ name
467
+ });
421
468
 
422
- try {
423
- // Evaluate optimized edits.
424
- // (Function edits that should be evaluated on save to avoid expensive computations on every edit.)
425
- for (const [key, value] of Object.entries(record)) {
426
- if (typeof value === 'function') {
427
- const evaluatedValue = value(select.getEditedEntityRecord(kind, name, recordId));
428
- dispatch.editEntityRecord(kind, name, recordId, {
429
- [key]: evaluatedValue
430
- }, {
431
- undoIgnore: true
432
- });
433
- record[key] = evaluatedValue;
434
- }
469
+ if (!entity || entity !== null && entity !== void 0 && entity.__experimentalNoFetch) {
470
+ return;
435
471
  }
436
472
 
437
- dispatch({
438
- type: 'SAVE_ENTITY_RECORD_START',
439
- kind,
440
- name,
441
- recordId,
442
- isAutosave
473
+ const entityIdKey = entity.key || _entities.DEFAULT_ENTITY_KEY;
474
+ const recordId = record[entityIdKey];
475
+ const lock = await dispatch.__unstableAcquireStoreLock(_name.STORE_NAME, ['entities', 'data', kind, name, recordId || (0, _uuid.v4)()], {
476
+ exclusive: true
443
477
  });
444
- let updatedRecord;
445
- let error;
446
478
 
447
479
  try {
448
- const path = `${entity.baseURL}${recordId ? '/' + recordId : ''}`;
449
- const persistedRecord = select.getRawEntityRecord(kind, name, recordId);
450
-
451
- if (isAutosave) {
452
- // Most of this autosave logic is very specific to posts.
453
- // This is fine for now as it is the only supported autosave,
454
- // but ideally this should all be handled in the back end,
455
- // so the client just sends and receives objects.
456
- const currentUser = select.getCurrentUser();
457
- const currentUserId = currentUser ? currentUser.id : undefined;
458
- const autosavePost = resolveSelect.getAutosave(persistedRecord.type, persistedRecord.id, currentUserId); // Autosaves need all expected fields to be present.
459
- // So we fallback to the previous autosave and then
460
- // to the actual persisted entity if the edits don't
461
- // have a value.
462
-
463
- let data = { ...persistedRecord,
464
- ...autosavePost,
465
- ...record
466
- };
467
- data = Object.keys(data).reduce((acc, key) => {
468
- if (['title', 'excerpt', 'content'].includes(key)) {
469
- acc[key] = data[key];
470
- }
480
+ // Evaluate optimized edits.
481
+ // (Function edits that should be evaluated on save to avoid expensive computations on every edit.)
482
+ for (const [key, value] of Object.entries(record)) {
483
+ if (typeof value === 'function') {
484
+ const evaluatedValue = value(select.getEditedEntityRecord(kind, name, recordId));
485
+ dispatch.editEntityRecord(kind, name, recordId, {
486
+ [key]: evaluatedValue
487
+ }, {
488
+ undoIgnore: true
489
+ });
490
+ record[key] = evaluatedValue;
491
+ }
492
+ }
471
493
 
472
- return acc;
473
- }, {
474
- status: data.status === 'auto-draft' ? 'draft' : data.status
475
- });
476
- updatedRecord = await __unstableFetch({
477
- path: `${path}/autosaves`,
478
- method: 'POST',
479
- data
480
- }); // An autosave may be processed by the server as a regular save
481
- // when its update is requested by the author and the post had
482
- // draft or auto-draft status.
483
-
484
- if (persistedRecord.id === updatedRecord.id) {
485
- let newRecord = { ...persistedRecord,
486
- ...data,
487
- ...updatedRecord
494
+ dispatch({
495
+ type: 'SAVE_ENTITY_RECORD_START',
496
+ kind,
497
+ name,
498
+ recordId,
499
+ isAutosave
500
+ });
501
+ let updatedRecord;
502
+ let error;
503
+
504
+ try {
505
+ const path = `${entity.baseURL}${recordId ? '/' + recordId : ''}`;
506
+ const persistedRecord = select.getRawEntityRecord(kind, name, recordId);
507
+
508
+ if (isAutosave) {
509
+ // Most of this autosave logic is very specific to posts.
510
+ // This is fine for now as it is the only supported autosave,
511
+ // but ideally this should all be handled in the back end,
512
+ // so the client just sends and receives objects.
513
+ const currentUser = select.getCurrentUser();
514
+ const currentUserId = currentUser ? currentUser.id : undefined;
515
+ const autosavePost = resolveSelect.getAutosave(persistedRecord.type, persistedRecord.id, currentUserId); // Autosaves need all expected fields to be present.
516
+ // So we fallback to the previous autosave and then
517
+ // to the actual persisted entity if the edits don't
518
+ // have a value.
519
+
520
+ let data = { ...persistedRecord,
521
+ ...autosavePost,
522
+ ...record
488
523
  };
489
- newRecord = Object.keys(newRecord).reduce((acc, key) => {
490
- // These properties are persisted in autosaves.
524
+ data = Object.keys(data).reduce((acc, key) => {
491
525
  if (['title', 'excerpt', 'content'].includes(key)) {
492
- acc[key] = newRecord[key];
493
- } else if (key === 'status') {
494
- // Status is only persisted in autosaves when going from
495
- // "auto-draft" to "draft".
496
- acc[key] = persistedRecord.status === 'auto-draft' && newRecord.status === 'draft' ? newRecord.status : persistedRecord.status;
497
- } else {
498
- // These properties are not persisted in autosaves.
499
- acc[key] = persistedRecord[key];
526
+ acc[key] = data[key];
500
527
  }
501
528
 
502
529
  return acc;
503
- }, {});
504
- dispatch.receiveEntityRecords(kind, name, newRecord, undefined, true);
530
+ }, {
531
+ status: data.status === 'auto-draft' ? 'draft' : data.status
532
+ });
533
+ updatedRecord = await __unstableFetch({
534
+ path: `${path}/autosaves`,
535
+ method: 'POST',
536
+ data
537
+ }); // An autosave may be processed by the server as a regular save
538
+ // when its update is requested by the author and the post had
539
+ // draft or auto-draft status.
540
+
541
+ if (persistedRecord.id === updatedRecord.id) {
542
+ let newRecord = { ...persistedRecord,
543
+ ...data,
544
+ ...updatedRecord
545
+ };
546
+ newRecord = Object.keys(newRecord).reduce((acc, key) => {
547
+ // These properties are persisted in autosaves.
548
+ if (['title', 'excerpt', 'content'].includes(key)) {
549
+ acc[key] = newRecord[key];
550
+ } else if (key === 'status') {
551
+ // Status is only persisted in autosaves when going from
552
+ // "auto-draft" to "draft".
553
+ acc[key] = persistedRecord.status === 'auto-draft' && newRecord.status === 'draft' ? newRecord.status : persistedRecord.status;
554
+ } else {
555
+ // These properties are not persisted in autosaves.
556
+ acc[key] = persistedRecord[key];
557
+ }
558
+
559
+ return acc;
560
+ }, {});
561
+ dispatch.receiveEntityRecords(kind, name, newRecord, undefined, true);
562
+ } else {
563
+ dispatch.receiveAutosaves(persistedRecord.id, updatedRecord);
564
+ }
505
565
  } else {
506
- dispatch.receiveAutosaves(persistedRecord.id, updatedRecord);
507
- }
508
- } else {
509
- let edits = record;
566
+ let edits = record;
510
567
 
511
- if (entity.__unstablePrePersist) {
512
- edits = { ...edits,
513
- ...entity.__unstablePrePersist(persistedRecord, edits)
514
- };
515
- }
568
+ if (entity.__unstablePrePersist) {
569
+ edits = { ...edits,
570
+ ...entity.__unstablePrePersist(persistedRecord, edits)
571
+ };
572
+ }
516
573
 
517
- updatedRecord = await __unstableFetch({
518
- path,
519
- method: recordId ? 'PUT' : 'POST',
520
- data: edits
521
- });
522
- dispatch.receiveEntityRecords(kind, name, updatedRecord, undefined, true, edits);
574
+ updatedRecord = await __unstableFetch({
575
+ path,
576
+ method: recordId ? 'PUT' : 'POST',
577
+ data: edits
578
+ });
579
+ dispatch.receiveEntityRecords(kind, name, updatedRecord, undefined, true, edits);
580
+ }
581
+ } catch (_error) {
582
+ error = _error;
523
583
  }
524
- } catch (_error) {
525
- error = _error;
526
- }
527
584
 
528
- dispatch({
529
- type: 'SAVE_ENTITY_RECORD_FINISH',
530
- kind,
531
- name,
532
- recordId,
533
- error,
534
- isAutosave
535
- });
536
- return updatedRecord;
537
- } finally {
538
- dispatch.__unstableReleaseStoreLock(lock);
539
- }
585
+ dispatch({
586
+ type: 'SAVE_ENTITY_RECORD_FINISH',
587
+ kind,
588
+ name,
589
+ recordId,
590
+ error,
591
+ isAutosave
592
+ });
593
+ return updatedRecord;
594
+ } finally {
595
+ dispatch.__unstableReleaseStoreLock(lock);
596
+ }
597
+ };
540
598
  };
541
599
  /**
542
600
  * Runs multiple core-data actions at the same time using one API request.
@@ -564,9 +622,10 @@ const saveEntityRecord = (kind, name, record, {
564
622
 
565
623
  exports.saveEntityRecord = saveEntityRecord;
566
624
 
567
- const __experimentalBatch = requests => async ({
568
- dispatch
569
- }) => {
625
+ const __experimentalBatch = requests => async _ref6 => {
626
+ let {
627
+ dispatch
628
+ } = _ref6;
570
629
  const batch = (0, _batch.createBatch)();
571
630
  const api = {
572
631
  saveEntityRecord(kind, name, record, options) {
@@ -604,17 +663,30 @@ const __experimentalBatch = requests => async ({
604
663
 
605
664
  exports.__experimentalBatch = __experimentalBatch;
606
665
 
607
- const saveEditedEntityRecord = (kind, name, recordId, options) => async ({
608
- select,
609
- dispatch
610
- }) => {
666
+ const saveEditedEntityRecord = (kind, name, recordId, options) => async _ref7 => {
667
+ let {
668
+ select,
669
+ dispatch
670
+ } = _ref7;
671
+
611
672
  if (!select.hasEditsForEntityRecord(kind, name, recordId)) {
612
673
  return;
613
674
  }
614
675
 
676
+ const entities = await dispatch((0, _entities.getKindEntities)(kind));
677
+ const entity = (0, _lodash.find)(entities, {
678
+ kind,
679
+ name
680
+ });
681
+
682
+ if (!entity) {
683
+ return;
684
+ }
685
+
686
+ const entityIdKey = entity.key || _entities.DEFAULT_ENTITY_KEY;
615
687
  const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId);
616
688
  const record = {
617
- id: recordId,
689
+ [entityIdKey]: recordId,
618
690
  ...edits
619
691
  };
620
692
  return await dispatch.saveEntityRecord(kind, name, record, options);
@@ -632,10 +704,12 @@ const saveEditedEntityRecord = (kind, name, recordId, options) => async ({
632
704
 
633
705
  exports.saveEditedEntityRecord = saveEditedEntityRecord;
634
706
 
635
- const __experimentalSaveSpecifiedEntityEdits = (kind, name, recordId, itemsToSave, options) => async ({
636
- select,
637
- dispatch
638
- }) => {
707
+ const __experimentalSaveSpecifiedEntityEdits = (kind, name, recordId, itemsToSave, options) => async _ref8 => {
708
+ let {
709
+ select,
710
+ dispatch
711
+ } = _ref8;
712
+
639
713
  if (!select.hasEditsForEntityRecord(kind, name, recordId)) {
640
714
  return;
641
715
  }