@wordpress/core-data 7.2.0 → 7.4.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 (131) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +54 -6
  3. package/build/actions.js +6 -6
  4. package/build/actions.js.map +1 -1
  5. package/build/entity-context.js +13 -0
  6. package/build/entity-context.js.map +1 -0
  7. package/build/entity-provider.js +4 -189
  8. package/build/entity-provider.js.map +1 -1
  9. package/build/entity-types/menu-location.js.map +1 -1
  10. package/build/entity-types/settings.js.map +1 -1
  11. package/build/entity-types/theme.js.map +1 -1
  12. package/build/entity-types/widget-type.js.map +1 -1
  13. package/build/hooks/index.js +22 -0
  14. package/build/hooks/index.js.map +1 -1
  15. package/build/hooks/use-entity-block-editor.js +140 -0
  16. package/build/hooks/use-entity-block-editor.js.map +1 -0
  17. package/build/hooks/use-entity-id.js +28 -0
  18. package/build/hooks/use-entity-id.js.map +1 -0
  19. package/build/hooks/use-entity-prop.js +65 -0
  20. package/build/hooks/use-entity-prop.js.map +1 -0
  21. package/build/hooks/use-resource-permissions.js +25 -8
  22. package/build/hooks/use-resource-permissions.js.map +1 -1
  23. package/build/resolvers.js +81 -70
  24. package/build/resolvers.js.map +1 -1
  25. package/build/selectors.js +23 -9
  26. package/build/selectors.js.map +1 -1
  27. package/build/utils/index.js +19 -0
  28. package/build/utils/index.js.map +1 -1
  29. package/build/utils/user-permissions.js +32 -0
  30. package/build/utils/user-permissions.js.map +1 -0
  31. package/build-module/actions.js +6 -6
  32. package/build-module/actions.js.map +1 -1
  33. package/build-module/entity-context.js +6 -0
  34. package/build-module/entity-context.js.map +1 -0
  35. package/build-module/entity-provider.js +3 -185
  36. package/build-module/entity-provider.js.map +1 -1
  37. package/build-module/entity-types/menu-location.js.map +1 -1
  38. package/build-module/entity-types/settings.js.map +1 -1
  39. package/build-module/entity-types/theme.js.map +1 -1
  40. package/build-module/entity-types/widget-type.js.map +1 -1
  41. package/build-module/hooks/index.js +3 -0
  42. package/build-module/hooks/index.js.map +1 -1
  43. package/build-module/hooks/use-entity-block-editor.js +132 -0
  44. package/build-module/hooks/use-entity-block-editor.js.map +1 -0
  45. package/build-module/hooks/use-entity-id.js +22 -0
  46. package/build-module/hooks/use-entity-id.js.map +1 -0
  47. package/build-module/hooks/use-entity-prop.js +58 -0
  48. package/build-module/hooks/use-entity-prop.js.map +1 -0
  49. package/build-module/hooks/use-resource-permissions.js +25 -8
  50. package/build-module/hooks/use-resource-permissions.js.map +1 -1
  51. package/build-module/resolvers.js +82 -71
  52. package/build-module/resolvers.js.map +1 -1
  53. package/build-module/selectors.js +24 -10
  54. package/build-module/selectors.js.map +1 -1
  55. package/build-module/utils/index.js +1 -0
  56. package/build-module/utils/index.js.map +1 -1
  57. package/build-module/utils/user-permissions.js +24 -0
  58. package/build-module/utils/user-permissions.js.map +1 -0
  59. package/build-types/actions.d.ts +3 -3
  60. package/build-types/actions.d.ts.map +1 -1
  61. package/build-types/batch/create-batch.d.ts.map +1 -1
  62. package/build-types/entities.d.ts.map +1 -1
  63. package/build-types/entity-context.d.ts +2 -0
  64. package/build-types/entity-context.d.ts.map +1 -0
  65. package/build-types/entity-provider.d.ts +0 -48
  66. package/build-types/entity-provider.d.ts.map +1 -1
  67. package/build-types/entity-types/menu-location.d.ts.map +1 -1
  68. package/build-types/entity-types/settings.d.ts.map +1 -1
  69. package/build-types/entity-types/theme.d.ts.map +1 -1
  70. package/build-types/entity-types/widget-type.d.ts.map +1 -1
  71. package/build-types/fetch/__experimental-fetch-url-data.d.ts.map +1 -1
  72. package/build-types/hooks/index.d.ts +3 -0
  73. package/build-types/hooks/index.d.ts.map +1 -1
  74. package/build-types/hooks/use-entity-block-editor.d.ts +22 -0
  75. package/build-types/hooks/use-entity-block-editor.d.ts.map +1 -0
  76. package/build-types/hooks/use-entity-id.d.ts +9 -0
  77. package/build-types/hooks/use-entity-id.d.ts.map +1 -0
  78. package/build-types/hooks/use-entity-prop.d.ts +19 -0
  79. package/build-types/hooks/use-entity-prop.d.ts.map +1 -0
  80. package/build-types/hooks/use-resource-permissions.d.ts +8 -70
  81. package/build-types/hooks/use-resource-permissions.d.ts.map +1 -1
  82. package/build-types/index.d.ts +35 -32
  83. package/build-types/index.d.ts.map +1 -1
  84. package/build-types/locks/reducer.d.ts +1 -1
  85. package/build-types/locks/reducer.d.ts.map +1 -1
  86. package/build-types/queried-data/actions.d.ts +1 -1
  87. package/build-types/queried-data/actions.d.ts.map +1 -1
  88. package/build-types/queried-data/get-query-parts.d.ts.map +1 -1
  89. package/build-types/queried-data/reducer.d.ts +1 -1
  90. package/build-types/queried-data/reducer.d.ts.map +1 -1
  91. package/build-types/queried-data/selectors.d.ts +0 -1
  92. package/build-types/queried-data/selectors.d.ts.map +1 -1
  93. package/build-types/reducer.d.ts +13 -13
  94. package/build-types/reducer.d.ts.map +1 -1
  95. package/build-types/resolvers.d.ts +3 -2
  96. package/build-types/resolvers.d.ts.map +1 -1
  97. package/build-types/selectors.d.ts +11 -6
  98. package/build-types/selectors.d.ts.map +1 -1
  99. package/build-types/utils/get-nested-value.d.ts.map +1 -1
  100. package/build-types/utils/get-normalized-comma-separable.d.ts.map +1 -1
  101. package/build-types/utils/if-matching-action.d.ts +1 -1
  102. package/build-types/utils/index.d.ts +1 -0
  103. package/build-types/utils/on-sub-key.d.ts +1 -1
  104. package/build-types/utils/replace-action.d.ts +1 -1
  105. package/build-types/utils/set-nested-value.d.ts.map +1 -1
  106. package/build-types/utils/user-permissions.d.ts +4 -0
  107. package/build-types/utils/user-permissions.d.ts.map +1 -0
  108. package/package.json +18 -17
  109. package/src/actions.js +6 -6
  110. package/src/entity-context.js +6 -0
  111. package/src/entity-provider.js +2 -211
  112. package/src/entity-types/menu-location.ts +1 -0
  113. package/src/entity-types/settings.ts +1 -0
  114. package/src/entity-types/theme.ts +1 -0
  115. package/src/entity-types/widget-type.ts +1 -0
  116. package/src/hooks/index.ts +3 -0
  117. package/src/hooks/test/use-entity-record.js +5 -3
  118. package/src/hooks/test/use-resource-permissions.js +96 -5
  119. package/src/hooks/use-entity-block-editor.js +148 -0
  120. package/src/hooks/use-entity-id.js +21 -0
  121. package/src/hooks/use-entity-prop.js +60 -0
  122. package/src/hooks/use-resource-permissions.ts +46 -9
  123. package/src/resolvers.js +102 -78
  124. package/src/selectors.ts +24 -9
  125. package/src/test/entity-provider.js +6 -2
  126. package/src/test/resolvers.js +221 -50
  127. package/src/test/selectors.js +18 -55
  128. package/src/utils/index.js +5 -0
  129. package/src/utils/user-permissions.js +39 -0
  130. package/tsconfig.json +2 -2
  131. package/tsconfig.tsbuildinfo +1 -1
@@ -68,11 +68,12 @@ const getCurrentUser = () => async ({
68
68
  exports.getCurrentUser = getCurrentUser;
69
69
  const getEntityRecord = (kind, name, key = '', query) => async ({
70
70
  select,
71
- dispatch
71
+ dispatch,
72
+ registry
72
73
  }) => {
73
74
  const configs = await dispatch((0, _entities.getOrLoadEntitiesConfig)(kind, name));
74
75
  const entityConfig = configs.find(config => config.name === name && config.kind === kind);
75
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
76
+ if (!entityConfig) {
76
77
  return;
77
78
  }
78
79
  const lock = await dispatch.__unstableAcquireStoreLock(_name.STORE_NAME, ['entities', 'records', kind, name, key], {
@@ -140,10 +141,28 @@ const getEntityRecord = (kind, name, key = '', query) => async ({
140
141
  return;
141
142
  }
142
143
  }
143
- const record = await (0, _apiFetch.default)({
144
- path
144
+ const response = await (0, _apiFetch.default)({
145
+ path,
146
+ parse: false
147
+ });
148
+ const record = await response.json();
149
+ const permissions = (0, _utils.getUserPermissionsFromResponse)(response);
150
+ registry.batch(() => {
151
+ dispatch.receiveEntityRecords(kind, name, record, query);
152
+ for (const action of _utils.ALLOWED_RESOURCE_ACTIONS) {
153
+ const permissionKey = (0, _utils.getUserPermissionCacheKey)(action, {
154
+ kind,
155
+ name,
156
+ id: key
157
+ });
158
+ dispatch.receiveUserPermission(permissionKey, permissions[action]);
159
+ dispatch.finishResolution('canUser', [action, {
160
+ kind,
161
+ name,
162
+ id: key
163
+ }]);
164
+ }
145
165
  });
146
- dispatch.receiveEntityRecords(kind, name, record, query);
147
166
  }
148
167
  } finally {
149
168
  dispatch.__unstableReleaseStoreLock(lock);
@@ -175,7 +194,7 @@ const getEntityRecords = (kind, name, query = {}) => async ({
175
194
  }) => {
176
195
  const configs = await dispatch((0, _entities.getOrLoadEntitiesConfig)(kind, name));
177
196
  const entityConfig = configs.find(config => config.name === name && config.kind === kind);
178
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
197
+ if (!entityConfig) {
179
198
  return;
180
199
  }
181
200
  const lock = await dispatch.__unstableAcquireStoreLock(_name.STORE_NAME, ['entities', 'records', kind, name], {
@@ -234,16 +253,7 @@ const getEntityRecords = (kind, name, query = {}) => async ({
234
253
  if (!query?._fields && !query.context) {
235
254
  const key = entityConfig.key || _entities.DEFAULT_ENTITY_KEY;
236
255
  const resolutionsArgs = records.filter(record => record?.[key]).map(record => [kind, name, record[key]]);
237
- dispatch({
238
- type: 'START_RESOLUTIONS',
239
- selectorName: 'getEntityRecord',
240
- args: resolutionsArgs
241
- });
242
- dispatch({
243
- type: 'FINISH_RESOLUTIONS',
244
- selectorName: 'getEntityRecord',
245
- args: resolutionsArgs
246
- });
256
+ dispatch.finishResolutions('getEntityRecord', resolutionsArgs);
247
257
  }
248
258
  dispatch.__unstableReleaseStoreLock(lock);
249
259
  });
@@ -300,27 +310,40 @@ const getEmbedPreview = url => async ({
300
310
  * Checks whether the current user can perform the given action on the given
301
311
  * REST resource.
302
312
  *
303
- * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',
304
- * 'delete'.
305
- * @param {string} resource REST resource to check, e.g. 'media' or 'posts'.
306
- * @param {?string} id ID of the rest resource to check.
313
+ * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',
314
+ * 'delete'.
315
+ * @param {string|Object} resource Entity resource to check. Accepts entity object `{ kind: 'root', name: 'media', id: 1 }`
316
+ * or REST base as a string - `media`.
317
+ * @param {?string} id ID of the rest resource to check.
307
318
  */
308
319
  exports.getEmbedPreview = getEmbedPreview;
309
320
  const canUser = (requestedAction, resource, id) => async ({
310
321
  dispatch,
311
322
  registry
312
323
  }) => {
324
+ if (!_utils.ALLOWED_RESOURCE_ACTIONS.includes(requestedAction)) {
325
+ throw new Error(`'${requestedAction}' is not a valid action.`);
326
+ }
327
+ let resourcePath = null;
328
+ if (typeof resource === 'object') {
329
+ if (!resource.kind || !resource.name) {
330
+ throw new Error('The entity resource object is not valid.');
331
+ }
332
+ const configs = await dispatch((0, _entities.getOrLoadEntitiesConfig)(resource.kind, resource.name));
333
+ const entityConfig = configs.find(config => config.name === resource.name && config.kind === resource.kind);
334
+ if (!entityConfig) {
335
+ return;
336
+ }
337
+ resourcePath = entityConfig.baseURL + (resource.id ? '/' + resource.id : '');
338
+ } else {
339
+ resourcePath = `/wp/v2/${resource}` + (id ? '/' + id : '');
340
+ }
313
341
  const {
314
342
  hasStartedResolution
315
343
  } = registry.select(_name.STORE_NAME);
316
- const resourcePath = id ? `${resource}/${id}` : resource;
317
- const retrievedActions = ['create', 'read', 'update', 'delete'];
318
- if (!retrievedActions.includes(requestedAction)) {
319
- throw new Error(`'${requestedAction}' is not a valid action.`);
320
- }
321
344
 
322
345
  // Prevent resolving the same resource twice.
323
- for (const relatedAction of retrievedActions) {
346
+ for (const relatedAction of _utils.ALLOWED_RESOURCE_ACTIONS) {
324
347
  if (relatedAction === requestedAction) {
325
348
  continue;
326
349
  }
@@ -332,7 +355,7 @@ const canUser = (requestedAction, resource, id) => async ({
332
355
  let response;
333
356
  try {
334
357
  response = await (0, _apiFetch.default)({
335
- path: `/wp/v2/${resourcePath}`,
358
+ path: resourcePath,
336
359
  method: 'OPTIONS',
337
360
  parse: false
338
361
  });
@@ -341,25 +364,18 @@ const canUser = (requestedAction, resource, id) => async ({
341
364
  // 5xx). The previously determined isAllowed value will remain in the store.
342
365
  return;
343
366
  }
344
-
345
- // Optional chaining operator is used here because the API requests don't
346
- // return the expected result in the native version. Instead, API requests
347
- // only return the result, without including response properties like the headers.
348
- const allowHeader = response.headers?.get('allow');
349
- const allowedMethods = allowHeader?.allow || allowHeader || '';
350
- const permissions = {};
351
- const methods = {
352
- create: 'POST',
353
- read: 'GET',
354
- update: 'PUT',
355
- delete: 'DELETE'
356
- };
357
- for (const [actionName, methodName] of Object.entries(methods)) {
358
- permissions[actionName] = allowedMethods.includes(methodName);
359
- }
360
- for (const action of retrievedActions) {
361
- dispatch.receiveUserPermission(`${action}/${resourcePath}`, permissions[action]);
362
- }
367
+ const permissions = (0, _utils.getUserPermissionsFromResponse)(response);
368
+ registry.batch(() => {
369
+ for (const action of _utils.ALLOWED_RESOURCE_ACTIONS) {
370
+ const key = (0, _utils.getUserPermissionCacheKey)(action, resource, id);
371
+ dispatch.receiveUserPermission(key, permissions[action]);
372
+
373
+ // Mark related action resolutions as finished.
374
+ if (action !== requestedAction) {
375
+ dispatch.finishResolution('canUser', [action, resource, id]);
376
+ }
377
+ }
378
+ });
363
379
  };
364
380
 
365
381
  /**
@@ -374,13 +390,11 @@ exports.canUser = canUser;
374
390
  const canUserEditEntityRecord = (kind, name, recordId) => async ({
375
391
  dispatch
376
392
  }) => {
377
- const configs = await dispatch((0, _entities.getOrLoadEntitiesConfig)(kind, name));
378
- const entityConfig = configs.find(config => config.name === name && config.kind === kind);
379
- if (!entityConfig) {
380
- return;
381
- }
382
- const resource = entityConfig.__unstable_rest_base;
383
- await dispatch(canUser('update', resource, recordId));
393
+ await dispatch(canUser('update', {
394
+ kind,
395
+ name,
396
+ id: recordId
397
+ }));
384
398
  };
385
399
 
386
400
  /**
@@ -468,11 +482,16 @@ const __experimentalGetCurrentGlobalStylesId = () => async ({
468
482
  status: 'active'
469
483
  });
470
484
  const globalStylesURL = activeThemes?.[0]?._links?.['wp:user-global-styles']?.[0]?.href;
471
- if (globalStylesURL) {
472
- const globalStylesObject = await (0, _apiFetch.default)({
473
- url: globalStylesURL
474
- });
475
- dispatch.__experimentalReceiveCurrentGlobalStylesId(globalStylesObject.id);
485
+ if (!globalStylesURL) {
486
+ return;
487
+ }
488
+
489
+ // Regex matches the ID at the end of a URL or immediately before
490
+ // the query string.
491
+ const matches = globalStylesURL.match(/\/(\d+)(?:\?|$)/);
492
+ const id = matches ? Number(matches[1]) : null;
493
+ if (id) {
494
+ dispatch.__experimentalReceiveCurrentGlobalStylesId(id);
476
495
  }
477
496
  };
478
497
  exports.__experimentalGetCurrentGlobalStylesId = __experimentalGetCurrentGlobalStylesId;
@@ -615,7 +634,7 @@ const getRevisions = (kind, name, recordKey, query = {}) => async ({
615
634
  }) => {
616
635
  const configs = await dispatch((0, _entities.getOrLoadEntitiesConfig)(kind, name));
617
636
  const entityConfig = configs.find(config => config.name === name && config.kind === kind);
618
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
637
+ if (!entityConfig) {
619
638
  return;
620
639
  }
621
640
  if (query._fields) {
@@ -668,16 +687,8 @@ const getRevisions = (kind, name, recordKey, query = {}) => async ({
668
687
  if (!query?._fields && !query.context) {
669
688
  const key = entityConfig.key || _entities.DEFAULT_ENTITY_KEY;
670
689
  const resolutionsArgs = records.filter(record => record[key]).map(record => [kind, name, recordKey, record[key]]);
671
- dispatch({
672
- type: 'START_RESOLUTIONS',
673
- selectorName: 'getRevision',
674
- args: resolutionsArgs
675
- });
676
- dispatch({
677
- type: 'FINISH_RESOLUTIONS',
678
- selectorName: 'getRevision',
679
- args: resolutionsArgs
680
- });
690
+ dispatch.startResolutions('getRevision', resolutionsArgs);
691
+ dispatch.finishResolutions('getRevision', resolutionsArgs);
681
692
  }
682
693
  }
683
694
  };
@@ -702,7 +713,7 @@ const getRevision = (kind, name, recordKey, revisionKey, query) => async ({
702
713
  }) => {
703
714
  const configs = await dispatch((0, _entities.getOrLoadEntitiesConfig)(kind, name));
704
715
  const entityConfig = configs.find(config => config.name === name && config.kind === kind);
705
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
716
+ if (!entityConfig) {
706
717
  return;
707
718
  }
708
719
  if (query !== undefined && query._fields) {
@@ -1 +1 @@
1
- {"version":3,"names":["_changeCase","require","_url","_htmlEntities","_apiFetch","_interopRequireDefault","_name","_entities","_utils","_sync","_fetch","getAuthors","query","dispatch","path","addQueryArgs","users","apiFetch","receiveUserQuery","exports","getCurrentUser","currentUser","receiveCurrentUser","getEntityRecord","kind","name","key","select","configs","getOrLoadEntitiesConfig","entityConfig","find","config","__experimentalNoFetch","lock","__unstableAcquireStoreLock","STORE_NAME","exclusive","window","__experimentalEnableSync","syncConfig","globalThis","IS_GUTENBERG_PLUGIN","objectId","getSyncObjectId","getSyncProvider","bootstrap","syncObjectType","record","receiveEntityRecords","type","recordId","edits","meta","undo","undefined","_fields","Set","getNormalizedCommaSeparable","DEFAULT_ENTITY_KEY","join","baseURL","baseURLParams","include","hasRecords","hasEntityRecords","__unstableReleaseStoreLock","getRawEntityRecord","forwardResolver","getEditedEntityRecord","getEntityRecords","registry","records","supportsPagination","per_page","response","parse","Object","values","json","totalItems","parseInt","headers","get","totalPages","map","split","forEach","field","hasOwnProperty","batch","context","resolutionsArgs","filter","selectorName","args","e","shouldInvalidate","action","invalidateCache","getCurrentTheme","resolveSelect","activeThemes","status","receiveCurrentTheme","getThemeSupports","getEmbedPreview","url","embedProxyResponse","receiveEmbedPreview","error","canUser","requestedAction","resource","id","hasStartedResolution","resourcePath","retrievedActions","includes","Error","relatedAction","isAlreadyResolving","method","allowHeader","allowedMethods","allow","permissions","methods","create","read","update","delete","actionName","methodName","entries","receiveUserPermission","canUserEditEntityRecord","__unstable_rest_base","getAutosaves","postType","postId","rest_base","restBase","rest_namespace","restNamespace","getPostType","autosaves","length","receiveAutosaves","getAutosave","__experimentalGetTemplateForLink","link","template","then","data","__experimentalGetCurrentGlobalStylesId","globalStylesURL","_links","href","globalStylesObject","__experimentalReceiveCurrentGlobalStylesId","__experimentalGetCurrentThemeBaseGlobalStyles","currentTheme","themeGlobalStyles","stylesheet","__experimentalReceiveThemeBaseGlobalStyles","__experimentalGetCurrentThemeGlobalStylesVariations","variations","__experimentalReceiveThemeGlobalStyleVariations","getCurrentThemeGlobalStylesRevisions","globalStylesId","revisionsURL","resetRevisions","revisions","revision","fromEntries","value","camelCase","receiveThemeGlobalStyleRevisions","getBlockPatterns","patterns","fetchBlockPatterns","getBlockPatternCategories","categories","getUserPatternCategories","patternCategories","mappedPatternCategories","userCategory","label","decodeEntities","slug","getNavigationFallbackId","fallback","_embed","_embedded","self","receiveNavigationFallbackId","existingFallbackEntityRecord","invalidateNavigationQueries","finishResolution","getDefaultTemplateId","receiveDefaultTemplateId","getRevisions","recordKey","revisionKey","getRevisionsUrl","isPaginated","receiveRevisions","getRevision"],"sources":["@wordpress/core-data/src/resolvers.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { getOrLoadEntitiesConfig, DEFAULT_ENTITY_KEY } from './entities';\nimport { forwardResolver, getNormalizedCommaSeparable } from './utils';\nimport { getSyncProvider } from './sync';\nimport { fetchBlockPatterns } from './fetch';\n\n/**\n * Requests authors from the REST API.\n *\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request.\n */\nexport const getAuthors =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst path = addQueryArgs(\n\t\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\t\tquery\n\t\t);\n\t\tconst users = await apiFetch( { path } );\n\t\tdispatch.receiveUserQuery( path, users );\n\t};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\t\tdispatch.receiveCurrentUser( currentUser );\n\t};\n\n/**\n * Requests an entity's record from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} key Record's key\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getEntityRecord =\n\t( kind, name, key = '', query ) =>\n\tasync ( { select, dispatch } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig || entityConfig?.__experimentalNoFetch ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, key ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\t// Entity supports configs,\n\t\t\t// use the sync algorithm instead of the old fetch behavior.\n\t\t\tif (\n\t\t\t\twindow.__experimentalEnableSync &&\n\t\t\t\tentityConfig.syncConfig &&\n\t\t\t\t! query\n\t\t\t) {\n\t\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\t\tconst objectId = entityConfig.getSyncObjectId( key );\n\n\t\t\t\t\t// Loads the persisted document.\n\t\t\t\t\tawait getSyncProvider().bootstrap(\n\t\t\t\t\t\tentityConfig.syncObjectType,\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\t( record ) => {\n\t\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\trecord,\n\t\t\t\t\t\t\t\tquery\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// Boostraps the edited document as well (and load from peers).\n\t\t\t\t\tawait getSyncProvider().bootstrap(\n\t\t\t\t\t\tentityConfig.syncObjectType + '--edit',\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\t( record ) => {\n\t\t\t\t\t\t\tdispatch( {\n\t\t\t\t\t\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\trecordId: key,\n\t\t\t\t\t\t\t\tedits: record,\n\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\tundo: undefined,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t\t// the ID.\n\t\t\t\t\tquery = {\n\t\t\t\t\t\t...query,\n\t\t\t\t\t\t_fields: [\n\t\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t\t...( getNormalizedCommaSeparable(\n\t\t\t\t\t\t\t\t\tquery._fields\n\t\t\t\t\t\t\t\t) || [] ),\n\t\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t\t] ),\n\t\t\t\t\t\t].join(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Disable reason: While true that an early return could leave `path`\n\t\t\t\t// unused, it's important that path is derived using the query prior to\n\t\t\t\t// additional query modifications in the condition below, since those\n\t\t\t\t// modifications are relevant to how the data is tracked in state, and not\n\t\t\t\t// for how the request is made to the REST API.\n\n\t\t\t\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\t\t\t\tconst path = addQueryArgs(\n\t\t\t\t\tentityConfig.baseURL + ( key ? '/' + key : '' ),\n\t\t\t\t\t{\n\t\t\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t\t\t...query,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tif ( query !== undefined ) {\n\t\t\t\t\tquery = { ...query, include: [ key ] };\n\n\t\t\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t\t\t// and without causing `getEntityRecords` resolution to occur.\n\t\t\t\t\tconst hasRecords = select.hasEntityRecords(\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tquery\n\t\t\t\t\t);\n\t\t\t\t\tif ( hasRecords ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst record = await apiFetch( { path } );\n\t\t\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\t\t\t}\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getRawEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getEditedEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests the entity's records from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {Object?} query Query Object. If requesting specific fields, fields\n * must always include the ID.\n */\nexport const getEntityRecords =\n\t( kind, name, query = {} ) =>\n\tasync ( { dispatch, registry } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig || entityConfig?.__experimentalNoFetch ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\tif ( query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( entityConfig.baseURL, {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\n\t\t\tlet records, meta;\n\t\t\tif ( entityConfig.supportsPagination && query.per_page !== -1 ) {\n\t\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t),\n\t\t\t\t\ttotalPages: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\trecords = Object.values( await apiFetch( { path } ) );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t\t// resolve the `getEntityRecord` selector in addition to `getEntityRecords`.\n\t\t\t\t// See https://github.com/WordPress/gutenberg/pull/26575\n\t\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t\t.filter( ( record ) => record?.[ key ] )\n\t\t\t\t\t\t.map( ( record ) => [ kind, name, record[ key ] ] );\n\n\t\t\t\t\tdispatch( {\n\t\t\t\t\t\ttype: 'START_RESOLUTIONS',\n\t\t\t\t\t\tselectorName: 'getEntityRecord',\n\t\t\t\t\t\targs: resolutionsArgs,\n\t\t\t\t\t} );\n\t\t\t\t\tdispatch( {\n\t\t\t\t\t\ttype: 'FINISH_RESOLUTIONS',\n\t\t\t\t\t\tselectorName: 'getEntityRecord',\n\t\t\t\t\t\targs: resolutionsArgs,\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t\t} );\n\t\t} catch ( e ) {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\ngetEntityRecords.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\tkind === action.kind &&\n\t\tname === action.name\n\t);\n};\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\n\t\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n\t};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview =\n\t( url ) =>\n\tasync ( { dispatch } ) => {\n\t\ttry {\n\t\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t\t} );\n\t\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t\t} catch ( error ) {\n\t\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\t\tdispatch.receiveEmbedPreview( url, false );\n\t\t}\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',\n * 'delete'.\n * @param {string} resource REST resource to check, e.g. 'media' or 'posts'.\n * @param {?string} id ID of the rest resource to check.\n */\nexport const canUser =\n\t( requestedAction, resource, id ) =>\n\tasync ( { dispatch, registry } ) => {\n\t\tconst { hasStartedResolution } = registry.select( STORE_NAME );\n\n\t\tconst resourcePath = id ? `${ resource }/${ id }` : resource;\n\t\tconst retrievedActions = [ 'create', 'read', 'update', 'delete' ];\n\n\t\tif ( ! retrievedActions.includes( requestedAction ) ) {\n\t\t\tthrow new Error( `'${ requestedAction }' is not a valid action.` );\n\t\t}\n\n\t\t// Prevent resolving the same resource twice.\n\t\tfor ( const relatedAction of retrievedActions ) {\n\t\t\tif ( relatedAction === requestedAction ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isAlreadyResolving = hasStartedResolution( 'canUser', [\n\t\t\t\trelatedAction,\n\t\t\t\tresource,\n\t\t\t\tid,\n\t\t\t] );\n\t\t\tif ( isAlreadyResolving ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await apiFetch( {\n\t\t\t\tpath: `/wp/v2/${ resourcePath }`,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t\tparse: false,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\t\treturn;\n\t\t}\n\n\t\t// Optional chaining operator is used here because the API requests don't\n\t\t// return the expected result in the native version. Instead, API requests\n\t\t// only return the result, without including response properties like the headers.\n\t\tconst allowHeader = response.headers?.get( 'allow' );\n\t\tconst allowedMethods = allowHeader?.allow || allowHeader || '';\n\n\t\tconst permissions = {};\n\t\tconst methods = {\n\t\t\tcreate: 'POST',\n\t\t\tread: 'GET',\n\t\t\tupdate: 'PUT',\n\t\t\tdelete: 'DELETE',\n\t\t};\n\t\tfor ( const [ actionName, methodName ] of Object.entries( methods ) ) {\n\t\t\tpermissions[ actionName ] = allowedMethods.includes( methodName );\n\t\t}\n\n\t\tfor ( const action of retrievedActions ) {\n\t\t\tdispatch.receiveUserPermission(\n\t\t\t\t`${ action }/${ resourcePath }`,\n\t\t\t\tpermissions[ action ]\n\t\t\t);\n\t\t}\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {string} recordId Record's id.\n */\nexport const canUserEditEntityRecord =\n\t( kind, name, recordId ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst resource = entityConfig.__unstable_rest_base;\n\t\tawait dispatch( canUser( 'update', resource, recordId ) );\n\t};\n\n/**\n * Request autosave data from the REST API.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosaves =\n\t( postType, postId ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst { rest_base: restBase, rest_namespace: restNamespace = 'wp/v2' } =\n\t\t\tawait resolveSelect.getPostType( postType );\n\t\tconst autosaves = await apiFetch( {\n\t\t\tpath: `/${ restNamespace }/${ restBase }/${ postId }/autosaves?context=edit`,\n\t\t} );\n\n\t\tif ( autosaves && autosaves.length ) {\n\t\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t\t}\n\t};\n\n/**\n * Request autosave data from the REST API.\n *\n * This resolver exists to ensure the underlying autosaves are fetched via\n * `getAutosaves` when a call to the `getAutosave` selector is made.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosave =\n\t( postType, postId ) =>\n\tasync ( { resolveSelect } ) => {\n\t\tawait resolveSelect.getAutosaves( postType, postId );\n\t};\n\n/**\n * Retrieve the frontend template used for a given link.\n *\n * @param {string} link Link.\n */\nexport const __experimentalGetTemplateForLink =\n\t( link ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlet template;\n\t\ttry {\n\t\t\t// This is NOT calling a REST endpoint but rather ends up with a response from\n\t\t\t// an Ajax function which has a different shape from a WP_REST_Response.\n\t\t\ttemplate = await apiFetch( {\n\t\t\t\turl: addQueryArgs( link, {\n\t\t\t\t\t'_wp-find-template': true,\n\t\t\t\t} ),\n\t\t\t} ).then( ( { data } ) => data );\n\t\t} catch ( e ) {\n\t\t\t// For non-FSE themes, it is possible that this request returns an error.\n\t\t}\n\n\t\tif ( ! template ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst record = await resolveSelect.getEntityRecord(\n\t\t\t'postType',\n\t\t\t'wp_template',\n\t\t\ttemplate.id\n\t\t);\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_template',\n\t\t\t\t[ record ],\n\t\t\t\t{\n\t\t\t\t\t'find-template': link,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t};\n\n__experimentalGetTemplateForLink.shouldInvalidate = ( action ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\n\t);\n};\n\nexport const __experimentalGetCurrentGlobalStylesId =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\t\tconst globalStylesURL =\n\t\t\tactiveThemes?.[ 0 ]?._links?.[ 'wp:user-global-styles' ]?.[ 0 ]\n\t\t\t\t?.href;\n\t\tif ( globalStylesURL ) {\n\t\t\tconst globalStylesObject = await apiFetch( {\n\t\t\t\turl: globalStylesURL,\n\t\t\t} );\n\t\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId(\n\t\t\t\tglobalStylesObject.id\n\t\t\t);\n\t\t}\n\t};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\tconst themeGlobalStyles = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tthemeGlobalStyles\n\t\t);\n\t};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\tconst variations = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tvariations\n\t\t);\n\t};\n\n/**\n * Fetches and returns the revisions of the current global styles theme.\n */\nexport const getCurrentThemeGlobalStylesRevisions =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst globalStylesId =\n\t\t\tawait resolveSelect.__experimentalGetCurrentGlobalStylesId();\n\t\tconst record = globalStylesId\n\t\t\t? await resolveSelect.getEntityRecord(\n\t\t\t\t\t'root',\n\t\t\t\t\t'globalStyles',\n\t\t\t\t\tglobalStylesId\n\t\t\t )\n\t\t\t: undefined;\n\t\tconst revisionsURL = record?._links?.[ 'version-history' ]?.[ 0 ]?.href;\n\n\t\tif ( revisionsURL ) {\n\t\t\tconst resetRevisions = await apiFetch( {\n\t\t\t\turl: revisionsURL,\n\t\t\t} );\n\t\t\tconst revisions = resetRevisions?.map( ( revision ) =>\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tObject.entries( revision ).map( ( [ key, value ] ) => [\n\t\t\t\t\t\tcamelCase( key ),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t] )\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch.receiveThemeGlobalStyleRevisions(\n\t\t\t\tglobalStylesId,\n\t\t\t\trevisions\n\t\t\t);\n\t\t}\n\t};\n\ngetCurrentThemeGlobalStylesRevisions.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\t\taction.kind === 'root' &&\n\t\t! action.error &&\n\t\taction.name === 'globalStyles'\n\t);\n};\n\nexport const getBlockPatterns =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst patterns = await fetchBlockPatterns();\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERNS', patterns } );\n\t};\n\nexport const getBlockPatternCategories =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst categories = await apiFetch( {\n\t\t\tpath: '/wp/v2/block-patterns/categories',\n\t\t} );\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', categories } );\n\t};\n\nexport const getUserPatternCategories =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst patternCategories = await resolveSelect.getEntityRecords(\n\t\t\t'taxonomy',\n\t\t\t'wp_pattern_category',\n\t\t\t{\n\t\t\t\tper_page: -1,\n\t\t\t\t_fields: 'id,name,description,slug',\n\t\t\t\tcontext: 'view',\n\t\t\t}\n\t\t);\n\n\t\tconst mappedPatternCategories =\n\t\t\tpatternCategories?.map( ( userCategory ) => ( {\n\t\t\t\t...userCategory,\n\t\t\t\tlabel: decodeEntities( userCategory.name ),\n\t\t\t\tname: userCategory.slug,\n\t\t\t} ) ) || [];\n\n\t\tdispatch( {\n\t\t\ttype: 'RECEIVE_USER_PATTERN_CATEGORIES',\n\t\t\tpatternCategories: mappedPatternCategories,\n\t\t} );\n\t};\n\nexport const getNavigationFallbackId =\n\t() =>\n\tasync ( { dispatch, select } ) => {\n\t\tconst fallback = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp-block-editor/v1/navigation-fallback', {\n\t\t\t\t_embed: true,\n\t\t\t} ),\n\t\t} );\n\n\t\tconst record = fallback?._embedded?.self;\n\n\t\tdispatch.receiveNavigationFallbackId( fallback?.id );\n\n\t\tif ( record ) {\n\t\t\t// If the fallback is already in the store, don't invalidate navigation queries.\n\t\t\t// Otherwise, invalidate the cache for the scenario where there were no Navigation\n\t\t\t// posts in the state and the fallback created one.\n\t\t\tconst existingFallbackEntityRecord = select.getEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id\n\t\t\t);\n\t\t\tconst invalidateNavigationQueries = ! existingFallbackEntityRecord;\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\trecord,\n\t\t\t\tundefined,\n\t\t\t\tinvalidateNavigationQueries\n\t\t\t);\n\n\t\t\t// Resolve to avoid further network requests.\n\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id,\n\t\t\t] );\n\t\t}\n\t};\n\nexport const getDefaultTemplateId =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst template = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/templates/lookup', query ),\n\t\t} );\n\t\t// Endpoint may return an empty object if no template is found.\n\t\tif ( template?.id ) {\n\t\t\tdispatch.receiveDefaultTemplateId( query, template.id );\n\t\t}\n\t};\n\n/**\n * Requests an entity's revisions from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevisions =\n\t( kind, name, recordKey, query = {} ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig || entityConfig?.__experimentalNoFetch ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet records, response;\n\t\tconst meta = {};\n\t\tconst isPaginated =\n\t\t\tentityConfig.supportsPagination && query.per_page !== -1;\n\t\ttry {\n\t\t\tresponse = await apiFetch( { path, parse: ! isPaginated } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( response ) {\n\t\t\tif ( isPaginated ) {\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta.totalItems = parseInt(\n\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecords = Object.values( response );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tdispatch.receiveRevisions(\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordKey,\n\t\t\t\trecords,\n\t\t\t\tquery,\n\t\t\t\tfalse,\n\t\t\t\tmeta\n\t\t\t);\n\n\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t// resolve the `getRevision` selector in addition to `getRevisions`.\n\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t\t.map( ( record ) => [\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\trecordKey,\n\t\t\t\t\t\trecord[ key ],\n\t\t\t\t\t] );\n\n\t\t\t\tdispatch( {\n\t\t\t\t\ttype: 'START_RESOLUTIONS',\n\t\t\t\t\tselectorName: 'getRevision',\n\t\t\t\t\targs: resolutionsArgs,\n\t\t\t\t} );\n\t\t\t\tdispatch( {\n\t\t\t\t\ttype: 'FINISH_RESOLUTIONS',\n\t\t\t\t\tselectorName: 'getRevision',\n\t\t\t\t\targs: resolutionsArgs,\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t};\n\n// Invalidate cache when a new revision is created.\ngetRevisions.shouldInvalidate = ( action, kind, name, recordKey ) =>\n\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\tname === action.name &&\n\tkind === action.kind &&\n\t! action.error &&\n\trecordKey === action.recordId;\n\n/**\n * Requests a specific Entity revision from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {number|string} revisionKey The revision's key.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevision =\n\t( kind, name, recordKey, revisionKey, query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig || entityConfig?.__experimentalNoFetch ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( query !== undefined && query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey, revisionKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet record;\n\t\ttry {\n\t\t\trecord = await apiFetch( { path } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveRevisions( kind, name, recordKey, record, query );\n\t\t}\n\t};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_changeCase","require","_url","_htmlEntities","_apiFetch","_interopRequireDefault","_name","_entities","_utils","_sync","_fetch","getAuthors","query","dispatch","path","addQueryArgs","users","apiFetch","receiveUserQuery","exports","getCurrentUser","currentUser","receiveCurrentUser","getEntityRecord","kind","name","key","select","registry","configs","getOrLoadEntitiesConfig","entityConfig","find","config","lock","__unstableAcquireStoreLock","STORE_NAME","exclusive","window","__experimentalEnableSync","syncConfig","globalThis","IS_GUTENBERG_PLUGIN","objectId","getSyncObjectId","getSyncProvider","bootstrap","syncObjectType","record","receiveEntityRecords","type","recordId","edits","meta","undo","undefined","_fields","Set","getNormalizedCommaSeparable","DEFAULT_ENTITY_KEY","join","baseURL","baseURLParams","include","hasRecords","hasEntityRecords","response","parse","json","permissions","getUserPermissionsFromResponse","batch","action","ALLOWED_RESOURCE_ACTIONS","permissionKey","getUserPermissionCacheKey","id","receiveUserPermission","finishResolution","__unstableReleaseStoreLock","getRawEntityRecord","forwardResolver","getEditedEntityRecord","getEntityRecords","records","supportsPagination","per_page","Object","values","totalItems","parseInt","headers","get","totalPages","map","split","forEach","field","hasOwnProperty","context","resolutionsArgs","filter","finishResolutions","e","shouldInvalidate","invalidateCache","getCurrentTheme","resolveSelect","activeThemes","status","receiveCurrentTheme","getThemeSupports","getEmbedPreview","url","embedProxyResponse","receiveEmbedPreview","error","canUser","requestedAction","resource","includes","Error","resourcePath","hasStartedResolution","relatedAction","isAlreadyResolving","method","canUserEditEntityRecord","getAutosaves","postType","postId","rest_base","restBase","rest_namespace","restNamespace","getPostType","autosaves","length","receiveAutosaves","getAutosave","__experimentalGetTemplateForLink","link","template","then","data","__experimentalGetCurrentGlobalStylesId","globalStylesURL","_links","href","matches","match","Number","__experimentalReceiveCurrentGlobalStylesId","__experimentalGetCurrentThemeBaseGlobalStyles","currentTheme","themeGlobalStyles","stylesheet","__experimentalReceiveThemeBaseGlobalStyles","__experimentalGetCurrentThemeGlobalStylesVariations","variations","__experimentalReceiveThemeGlobalStyleVariations","getCurrentThemeGlobalStylesRevisions","globalStylesId","revisionsURL","resetRevisions","revisions","revision","fromEntries","entries","value","camelCase","receiveThemeGlobalStyleRevisions","getBlockPatterns","patterns","fetchBlockPatterns","getBlockPatternCategories","categories","getUserPatternCategories","patternCategories","mappedPatternCategories","userCategory","label","decodeEntities","slug","getNavigationFallbackId","fallback","_embed","_embedded","self","receiveNavigationFallbackId","existingFallbackEntityRecord","invalidateNavigationQueries","getDefaultTemplateId","receiveDefaultTemplateId","getRevisions","recordKey","revisionKey","getRevisionsUrl","isPaginated","receiveRevisions","startResolutions","getRevision"],"sources":["@wordpress/core-data/src/resolvers.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { getOrLoadEntitiesConfig, DEFAULT_ENTITY_KEY } from './entities';\nimport {\n\tforwardResolver,\n\tgetNormalizedCommaSeparable,\n\tgetUserPermissionCacheKey,\n\tgetUserPermissionsFromResponse,\n\tALLOWED_RESOURCE_ACTIONS,\n} from './utils';\nimport { getSyncProvider } from './sync';\nimport { fetchBlockPatterns } from './fetch';\n\n/**\n * Requests authors from the REST API.\n *\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request.\n */\nexport const getAuthors =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst path = addQueryArgs(\n\t\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\t\tquery\n\t\t);\n\t\tconst users = await apiFetch( { path } );\n\t\tdispatch.receiveUserQuery( path, users );\n\t};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\t\tdispatch.receiveCurrentUser( currentUser );\n\t};\n\n/**\n * Requests an entity's record from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} key Record's key\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getEntityRecord =\n\t( kind, name, key = '', query ) =>\n\tasync ( { select, dispatch, registry } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, key ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\t// Entity supports configs,\n\t\t\t// use the sync algorithm instead of the old fetch behavior.\n\t\t\tif (\n\t\t\t\twindow.__experimentalEnableSync &&\n\t\t\t\tentityConfig.syncConfig &&\n\t\t\t\t! query\n\t\t\t) {\n\t\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\t\tconst objectId = entityConfig.getSyncObjectId( key );\n\n\t\t\t\t\t// Loads the persisted document.\n\t\t\t\t\tawait getSyncProvider().bootstrap(\n\t\t\t\t\t\tentityConfig.syncObjectType,\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\t( record ) => {\n\t\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\trecord,\n\t\t\t\t\t\t\t\tquery\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// Boostraps the edited document as well (and load from peers).\n\t\t\t\t\tawait getSyncProvider().bootstrap(\n\t\t\t\t\t\tentityConfig.syncObjectType + '--edit',\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\t( record ) => {\n\t\t\t\t\t\t\tdispatch( {\n\t\t\t\t\t\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\trecordId: key,\n\t\t\t\t\t\t\t\tedits: record,\n\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\tundo: undefined,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t\t// the ID.\n\t\t\t\t\tquery = {\n\t\t\t\t\t\t...query,\n\t\t\t\t\t\t_fields: [\n\t\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t\t...( getNormalizedCommaSeparable(\n\t\t\t\t\t\t\t\t\tquery._fields\n\t\t\t\t\t\t\t\t) || [] ),\n\t\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t\t] ),\n\t\t\t\t\t\t].join(),\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Disable reason: While true that an early return could leave `path`\n\t\t\t\t// unused, it's important that path is derived using the query prior to\n\t\t\t\t// additional query modifications in the condition below, since those\n\t\t\t\t// modifications are relevant to how the data is tracked in state, and not\n\t\t\t\t// for how the request is made to the REST API.\n\n\t\t\t\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\t\t\t\tconst path = addQueryArgs(\n\t\t\t\t\tentityConfig.baseURL + ( key ? '/' + key : '' ),\n\t\t\t\t\t{\n\t\t\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t\t\t...query,\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tif ( query !== undefined ) {\n\t\t\t\t\tquery = { ...query, include: [ key ] };\n\n\t\t\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t\t\t// and without causing `getEntityRecords` resolution to occur.\n\t\t\t\t\tconst hasRecords = select.hasEntityRecords(\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tquery\n\t\t\t\t\t);\n\t\t\t\t\tif ( hasRecords ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\t\tconst record = await response.json();\n\t\t\t\tconst permissions = getUserPermissionsFromResponse( response );\n\n\t\t\t\tregistry.batch( () => {\n\t\t\t\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\n\t\t\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\t\t\tconst permissionKey = getUserPermissionCacheKey(\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\t{ kind, name, id: key }\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tdispatch.receiveUserPermission(\n\t\t\t\t\t\t\tpermissionKey,\n\t\t\t\t\t\t\tpermissions[ action ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatch.finishResolution( 'canUser', [\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\t{ kind, name, id: key },\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getRawEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getEditedEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests the entity's records from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {Object?} query Query Object. If requesting specific fields, fields\n * must always include the ID.\n */\nexport const getEntityRecords =\n\t( kind, name, query = {} ) =>\n\tasync ( { dispatch, registry } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\tif ( query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( entityConfig.baseURL, {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\n\t\t\tlet records, meta;\n\t\t\tif ( entityConfig.supportsPagination && query.per_page !== -1 ) {\n\t\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t),\n\t\t\t\t\ttotalPages: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\trecords = Object.values( await apiFetch( { path } ) );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t\t// resolve the `getEntityRecord` selector in addition to `getEntityRecords`.\n\t\t\t\t// See https://github.com/WordPress/gutenberg/pull/26575\n\t\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t\t.filter( ( record ) => record?.[ key ] )\n\t\t\t\t\t\t.map( ( record ) => [ kind, name, record[ key ] ] );\n\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\t\tresolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t\t} );\n\t\t} catch ( e ) {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\ngetEntityRecords.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\tkind === action.kind &&\n\t\tname === action.name\n\t);\n};\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\n\t\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n\t};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview =\n\t( url ) =>\n\tasync ( { dispatch } ) => {\n\t\ttry {\n\t\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t\t} );\n\t\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t\t} catch ( error ) {\n\t\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\t\tdispatch.receiveEmbedPreview( url, false );\n\t\t}\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',\n * 'delete'.\n * @param {string|Object} resource Entity resource to check. Accepts entity object `{ kind: 'root', name: 'media', id: 1 }`\n * or REST base as a string - `media`.\n * @param {?string} id ID of the rest resource to check.\n */\nexport const canUser =\n\t( requestedAction, resource, id ) =>\n\tasync ( { dispatch, registry } ) => {\n\t\tif ( ! ALLOWED_RESOURCE_ACTIONS.includes( requestedAction ) ) {\n\t\t\tthrow new Error( `'${ requestedAction }' is not a valid action.` );\n\t\t}\n\n\t\tlet resourcePath = null;\n\t\tif ( typeof resource === 'object' ) {\n\t\t\tif ( ! resource.kind || ! resource.name ) {\n\t\t\t\tthrow new Error( 'The entity resource object is not valid.' );\n\t\t\t}\n\n\t\t\tconst configs = await dispatch(\n\t\t\t\tgetOrLoadEntitiesConfig( resource.kind, resource.name )\n\t\t\t);\n\t\t\tconst entityConfig = configs.find(\n\t\t\t\t( config ) =>\n\t\t\t\t\tconfig.name === resource.name &&\n\t\t\t\t\tconfig.kind === resource.kind\n\t\t\t);\n\t\t\tif ( ! entityConfig ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresourcePath =\n\t\t\t\tentityConfig.baseURL + ( resource.id ? '/' + resource.id : '' );\n\t\t} else {\n\t\t\tresourcePath = `/wp/v2/${ resource }` + ( id ? '/' + id : '' );\n\t\t}\n\n\t\tconst { hasStartedResolution } = registry.select( STORE_NAME );\n\n\t\t// Prevent resolving the same resource twice.\n\t\tfor ( const relatedAction of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\tif ( relatedAction === requestedAction ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isAlreadyResolving = hasStartedResolution( 'canUser', [\n\t\t\t\trelatedAction,\n\t\t\t\tresource,\n\t\t\t\tid,\n\t\t\t] );\n\t\t\tif ( isAlreadyResolving ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await apiFetch( {\n\t\t\t\tpath: resourcePath,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t\tparse: false,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\t\treturn;\n\t\t}\n\n\t\tconst permissions = getUserPermissionsFromResponse( response );\n\t\tregistry.batch( () => {\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\tconst key = getUserPermissionCacheKey( action, resource, id );\n\n\t\t\t\tdispatch.receiveUserPermission( key, permissions[ action ] );\n\n\t\t\t\t// Mark related action resolutions as finished.\n\t\t\t\tif ( action !== requestedAction ) {\n\t\t\t\t\tdispatch.finishResolution( 'canUser', [\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tresource,\n\t\t\t\t\t\tid,\n\t\t\t\t\t] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {string} recordId Record's id.\n */\nexport const canUserEditEntityRecord =\n\t( kind, name, recordId ) =>\n\tasync ( { dispatch } ) => {\n\t\tawait dispatch( canUser( 'update', { kind, name, id: recordId } ) );\n\t};\n\n/**\n * Request autosave data from the REST API.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosaves =\n\t( postType, postId ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst { rest_base: restBase, rest_namespace: restNamespace = 'wp/v2' } =\n\t\t\tawait resolveSelect.getPostType( postType );\n\t\tconst autosaves = await apiFetch( {\n\t\t\tpath: `/${ restNamespace }/${ restBase }/${ postId }/autosaves?context=edit`,\n\t\t} );\n\n\t\tif ( autosaves && autosaves.length ) {\n\t\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t\t}\n\t};\n\n/**\n * Request autosave data from the REST API.\n *\n * This resolver exists to ensure the underlying autosaves are fetched via\n * `getAutosaves` when a call to the `getAutosave` selector is made.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosave =\n\t( postType, postId ) =>\n\tasync ( { resolveSelect } ) => {\n\t\tawait resolveSelect.getAutosaves( postType, postId );\n\t};\n\n/**\n * Retrieve the frontend template used for a given link.\n *\n * @param {string} link Link.\n */\nexport const __experimentalGetTemplateForLink =\n\t( link ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlet template;\n\t\ttry {\n\t\t\t// This is NOT calling a REST endpoint but rather ends up with a response from\n\t\t\t// an Ajax function which has a different shape from a WP_REST_Response.\n\t\t\ttemplate = await apiFetch( {\n\t\t\t\turl: addQueryArgs( link, {\n\t\t\t\t\t'_wp-find-template': true,\n\t\t\t\t} ),\n\t\t\t} ).then( ( { data } ) => data );\n\t\t} catch ( e ) {\n\t\t\t// For non-FSE themes, it is possible that this request returns an error.\n\t\t}\n\n\t\tif ( ! template ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst record = await resolveSelect.getEntityRecord(\n\t\t\t'postType',\n\t\t\t'wp_template',\n\t\t\ttemplate.id\n\t\t);\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_template',\n\t\t\t\t[ record ],\n\t\t\t\t{\n\t\t\t\t\t'find-template': link,\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t};\n\n__experimentalGetTemplateForLink.shouldInvalidate = ( action ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\n\t);\n};\n\nexport const __experimentalGetCurrentGlobalStylesId =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\t\tconst globalStylesURL =\n\t\t\tactiveThemes?.[ 0 ]?._links?.[ 'wp:user-global-styles' ]?.[ 0 ]\n\t\t\t\t?.href;\n\t\tif ( ! globalStylesURL ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Regex matches the ID at the end of a URL or immediately before\n\t\t// the query string.\n\t\tconst matches = globalStylesURL.match( /\\/(\\d+)(?:\\?|$)/ );\n\t\tconst id = matches ? Number( matches[ 1 ] ) : null;\n\n\t\tif ( id ) {\n\t\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId( id );\n\t\t}\n\t};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\tconst themeGlobalStyles = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tthemeGlobalStyles\n\t\t);\n\t};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\tconst variations = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tvariations\n\t\t);\n\t};\n\n/**\n * Fetches and returns the revisions of the current global styles theme.\n */\nexport const getCurrentThemeGlobalStylesRevisions =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst globalStylesId =\n\t\t\tawait resolveSelect.__experimentalGetCurrentGlobalStylesId();\n\t\tconst record = globalStylesId\n\t\t\t? await resolveSelect.getEntityRecord(\n\t\t\t\t\t'root',\n\t\t\t\t\t'globalStyles',\n\t\t\t\t\tglobalStylesId\n\t\t\t )\n\t\t\t: undefined;\n\t\tconst revisionsURL = record?._links?.[ 'version-history' ]?.[ 0 ]?.href;\n\n\t\tif ( revisionsURL ) {\n\t\t\tconst resetRevisions = await apiFetch( {\n\t\t\t\turl: revisionsURL,\n\t\t\t} );\n\t\t\tconst revisions = resetRevisions?.map( ( revision ) =>\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tObject.entries( revision ).map( ( [ key, value ] ) => [\n\t\t\t\t\t\tcamelCase( key ),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t] )\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch.receiveThemeGlobalStyleRevisions(\n\t\t\t\tglobalStylesId,\n\t\t\t\trevisions\n\t\t\t);\n\t\t}\n\t};\n\ngetCurrentThemeGlobalStylesRevisions.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\t\taction.kind === 'root' &&\n\t\t! action.error &&\n\t\taction.name === 'globalStyles'\n\t);\n};\n\nexport const getBlockPatterns =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst patterns = await fetchBlockPatterns();\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERNS', patterns } );\n\t};\n\nexport const getBlockPatternCategories =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst categories = await apiFetch( {\n\t\t\tpath: '/wp/v2/block-patterns/categories',\n\t\t} );\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', categories } );\n\t};\n\nexport const getUserPatternCategories =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst patternCategories = await resolveSelect.getEntityRecords(\n\t\t\t'taxonomy',\n\t\t\t'wp_pattern_category',\n\t\t\t{\n\t\t\t\tper_page: -1,\n\t\t\t\t_fields: 'id,name,description,slug',\n\t\t\t\tcontext: 'view',\n\t\t\t}\n\t\t);\n\n\t\tconst mappedPatternCategories =\n\t\t\tpatternCategories?.map( ( userCategory ) => ( {\n\t\t\t\t...userCategory,\n\t\t\t\tlabel: decodeEntities( userCategory.name ),\n\t\t\t\tname: userCategory.slug,\n\t\t\t} ) ) || [];\n\n\t\tdispatch( {\n\t\t\ttype: 'RECEIVE_USER_PATTERN_CATEGORIES',\n\t\t\tpatternCategories: mappedPatternCategories,\n\t\t} );\n\t};\n\nexport const getNavigationFallbackId =\n\t() =>\n\tasync ( { dispatch, select } ) => {\n\t\tconst fallback = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp-block-editor/v1/navigation-fallback', {\n\t\t\t\t_embed: true,\n\t\t\t} ),\n\t\t} );\n\n\t\tconst record = fallback?._embedded?.self;\n\n\t\tdispatch.receiveNavigationFallbackId( fallback?.id );\n\n\t\tif ( record ) {\n\t\t\t// If the fallback is already in the store, don't invalidate navigation queries.\n\t\t\t// Otherwise, invalidate the cache for the scenario where there were no Navigation\n\t\t\t// posts in the state and the fallback created one.\n\t\t\tconst existingFallbackEntityRecord = select.getEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id\n\t\t\t);\n\t\t\tconst invalidateNavigationQueries = ! existingFallbackEntityRecord;\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\trecord,\n\t\t\t\tundefined,\n\t\t\t\tinvalidateNavigationQueries\n\t\t\t);\n\n\t\t\t// Resolve to avoid further network requests.\n\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id,\n\t\t\t] );\n\t\t}\n\t};\n\nexport const getDefaultTemplateId =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst template = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/templates/lookup', query ),\n\t\t} );\n\t\t// Endpoint may return an empty object if no template is found.\n\t\tif ( template?.id ) {\n\t\t\tdispatch.receiveDefaultTemplateId( query, template.id );\n\t\t}\n\t};\n\n/**\n * Requests an entity's revisions from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevisions =\n\t( kind, name, recordKey, query = {} ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet records, response;\n\t\tconst meta = {};\n\t\tconst isPaginated =\n\t\t\tentityConfig.supportsPagination && query.per_page !== -1;\n\t\ttry {\n\t\t\tresponse = await apiFetch( { path, parse: ! isPaginated } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( response ) {\n\t\t\tif ( isPaginated ) {\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta.totalItems = parseInt(\n\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecords = Object.values( response );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tdispatch.receiveRevisions(\n\t\t\t\tkind,\n\t\t\t\tname,\n\t\t\t\trecordKey,\n\t\t\t\trecords,\n\t\t\t\tquery,\n\t\t\t\tfalse,\n\t\t\t\tmeta\n\t\t\t);\n\n\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t// resolve the `getRevision` selector in addition to `getRevisions`.\n\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t\t.map( ( record ) => [\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\trecordKey,\n\t\t\t\t\t\trecord[ key ],\n\t\t\t\t\t] );\n\n\t\t\t\tdispatch.startResolutions( 'getRevision', resolutionsArgs );\n\t\t\t\tdispatch.finishResolutions( 'getRevision', resolutionsArgs );\n\t\t\t}\n\t\t}\n\t};\n\n// Invalidate cache when a new revision is created.\ngetRevisions.shouldInvalidate = ( action, kind, name, recordKey ) =>\n\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\tname === action.name &&\n\tkind === action.kind &&\n\t! action.error &&\n\trecordKey === action.recordId;\n\n/**\n * Requests a specific Entity revision from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {number|string} revisionKey The revision's key.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevision =\n\t( kind, name, recordKey, revisionKey, query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst configs = await dispatch( getOrLoadEntitiesConfig( kind, name ) );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( query !== undefined && query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey, revisionKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet record;\n\t\ttry {\n\t\t\trecord = await apiFetch( { path } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveRevisions( kind, name, recordKey, record, query );\n\t\t}\n\t};\n"],"mappings":"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","ignoreList":[]}
@@ -169,7 +169,9 @@ function getEntitiesByKind(state, kind) {
169
169
  *
170
170
  * @return Array of entities with config matching kind.
171
171
  */
172
- const getEntitiesConfig = exports.getEntitiesConfig = (0, _data.createSelector)((state, kind) => state.entities.config.filter(entity => entity.kind === kind), (state, kind) => state.entities.config);
172
+ const getEntitiesConfig = exports.getEntitiesConfig = (0, _data.createSelector)((state, kind) => state.entities.config.filter(entity => entity.kind === kind), /* eslint-disable @typescript-eslint/no-unused-vars */
173
+ (state, kind) => state.entities.config
174
+ /* eslint-enable @typescript-eslint/no-unused-vars */);
173
175
  /**
174
176
  * Returns the entity config given its kind and name.
175
177
  *
@@ -678,6 +680,7 @@ function getLastEntityDeleteError(state, kind, name, recordId) {
678
680
  return state.entities.records?.[kind]?.[name]?.deleting?.[recordId]?.error;
679
681
  }
680
682
 
683
+ /* eslint-disable @typescript-eslint/no-unused-vars */
681
684
  /**
682
685
  * Returns the previous edit from the current undo offset
683
686
  * for the entity records edits history, if any.
@@ -694,7 +697,9 @@ function getUndoEdit(state) {
694
697
  });
695
698
  return undefined;
696
699
  }
700
+ /* eslint-enable @typescript-eslint/no-unused-vars */
697
701
 
702
+ /* eslint-disable @typescript-eslint/no-unused-vars */
698
703
  /**
699
704
  * Returns the next edit from the current undo offset
700
705
  * for the entity records edits history, if any.
@@ -711,6 +716,7 @@ function getRedoEdit(state) {
711
716
  });
712
717
  return undefined;
713
718
  }
719
+ /* eslint-enable @typescript-eslint/no-unused-vars */
714
720
 
715
721
  /**
716
722
  * Returns true if there is a previous edit from the current undo offset
@@ -817,14 +823,19 @@ function isPreviewEmbedFallback(state, url) {
817
823
  *
818
824
  * @param state Data state.
819
825
  * @param action Action to check. One of: 'create', 'read', 'update', 'delete'.
820
- * @param resource REST resource to check, e.g. 'media' or 'posts'.
826
+ * @param resource Entity resource to check. Accepts entity object `{ kind: 'root', name: 'media', id: 1 }`
827
+ * or REST base as a string - `media`.
821
828
  * @param id Optional ID of the rest resource to check.
822
829
  *
823
830
  * @return Whether or not the user can perform the action,
824
831
  * or `undefined` if the OPTIONS request is still being made.
825
832
  */
826
833
  function canUser(state, action, resource, id) {
827
- const key = [action, resource, id].filter(Boolean).join('/');
834
+ const isEntity = typeof resource === 'object';
835
+ if (isEntity && (!resource.kind || !resource.name)) {
836
+ return false;
837
+ }
838
+ const key = (0, _utils.getUserPermissionCacheKey)(action, resource, id);
828
839
  return state.userPermissions[key];
829
840
  }
830
841
 
@@ -844,12 +855,15 @@ function canUser(state, action, resource, id) {
844
855
  * or `undefined` if the OPTIONS request is still being made.
845
856
  */
846
857
  function canUserEditEntityRecord(state, kind, name, recordId) {
847
- const entityConfig = getEntityConfig(state, kind, name);
848
- if (!entityConfig) {
849
- return false;
850
- }
851
- const resource = entityConfig.__unstable_rest_base;
852
- return canUser(state, 'update', resource, recordId);
858
+ (0, _deprecated.default)(`wp.data.select( 'core' ).canUserEditEntityRecord()`, {
859
+ since: '6.7',
860
+ alternative: `wp.data.select( 'core' ).canUser( 'update', { kind, name, id } )`
861
+ });
862
+ return canUser(state, 'update', {
863
+ kind,
864
+ name,
865
+ id: recordId
866
+ });
853
867
  }
854
868
 
855
869
  /**