--- a/wp/wp-includes/js/dist/core-data.js Fri Sep 05 18:40:08 2025 +0200
+++ b/wp/wp-includes/js/dist/core-data.js Fri Sep 05 18:52:52 2025 +0200
@@ -2,188 +2,6 @@
/******/ "use strict";
/******/ var __webpack_modules__ = ({
-/***/ 6689:
-/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
-
-/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ createUndoManager: () => (/* binding */ createUndoManager)
-/* harmony export */ });
-/* harmony import */ var _wordpress_is_shallow_equal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(923);
-/* harmony import */ var _wordpress_is_shallow_equal__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_is_shallow_equal__WEBPACK_IMPORTED_MODULE_0__);
-/**
- * WordPress dependencies
- */
-
-
-/** @typedef {import('./types').HistoryRecord} HistoryRecord */
-/** @typedef {import('./types').HistoryChange} HistoryChange */
-/** @typedef {import('./types').HistoryChanges} HistoryChanges */
-/** @typedef {import('./types').UndoManager} UndoManager */
-
-/**
- * Merge changes for a single item into a record of changes.
- *
- * @param {Record< string, HistoryChange >} changes1 Previous changes
- * @param {Record< string, HistoryChange >} changes2 NextChanges
- *
- * @return {Record< string, HistoryChange >} Merged changes
- */
-function mergeHistoryChanges(changes1, changes2) {
- /**
- * @type {Record< string, HistoryChange >}
- */
- const newChanges = {
- ...changes1
- };
- Object.entries(changes2).forEach(([key, value]) => {
- if (newChanges[key]) {
- newChanges[key] = {
- ...newChanges[key],
- to: value.to
- };
- } else {
- newChanges[key] = value;
- }
- });
- return newChanges;
-}
-
-/**
- * Adds history changes for a single item into a record of changes.
- *
- * @param {HistoryRecord} record The record to merge into.
- * @param {HistoryChanges} changes The changes to merge.
- */
-const addHistoryChangesIntoRecord = (record, changes) => {
- const existingChangesIndex = record?.findIndex(({
- id: recordIdentifier
- }) => {
- return typeof recordIdentifier === 'string' ? recordIdentifier === changes.id : _wordpress_is_shallow_equal__WEBPACK_IMPORTED_MODULE_0___default()(recordIdentifier, changes.id);
- });
- const nextRecord = [...record];
- if (existingChangesIndex !== -1) {
- // If the edit is already in the stack leave the initial "from" value.
- nextRecord[existingChangesIndex] = {
- id: changes.id,
- changes: mergeHistoryChanges(nextRecord[existingChangesIndex].changes, changes.changes)
- };
- } else {
- nextRecord.push(changes);
- }
- return nextRecord;
-};
-
-/**
- * Creates an undo manager.
- *
- * @return {UndoManager} Undo manager.
- */
-function createUndoManager() {
- /**
- * @type {HistoryRecord[]}
- */
- let history = [];
- /**
- * @type {HistoryRecord}
- */
- let stagedRecord = [];
- /**
- * @type {number}
- */
- let offset = 0;
- const dropPendingRedos = () => {
- history = history.slice(0, offset || undefined);
- offset = 0;
- };
- const appendStagedRecordToLatestHistoryRecord = () => {
- var _history$index;
- const index = history.length === 0 ? 0 : history.length - 1;
- let latestRecord = (_history$index = history[index]) !== null && _history$index !== void 0 ? _history$index : [];
- stagedRecord.forEach(changes => {
- latestRecord = addHistoryChangesIntoRecord(latestRecord, changes);
- });
- stagedRecord = [];
- history[index] = latestRecord;
- };
-
- /**
- * Checks whether a record is empty.
- * A record is considered empty if it the changes keep the same values.
- * Also updates to function values are ignored.
- *
- * @param {HistoryRecord} record
- * @return {boolean} Whether the record is empty.
- */
- const isRecordEmpty = record => {
- const filteredRecord = record.filter(({
- changes
- }) => {
- return Object.values(changes).some(({
- from,
- to
- }) => typeof from !== 'function' && typeof to !== 'function' && !_wordpress_is_shallow_equal__WEBPACK_IMPORTED_MODULE_0___default()(from, to));
- });
- return !filteredRecord.length;
- };
- return {
- /**
- * Record changes into the history.
- *
- * @param {HistoryRecord=} record A record of changes to record.
- * @param {boolean} isStaged Whether to immediately create an undo point or not.
- */
- addRecord(record, isStaged = false) {
- const isEmpty = !record || isRecordEmpty(record);
- if (isStaged) {
- if (isEmpty) {
- return;
- }
- record.forEach(changes => {
- stagedRecord = addHistoryChangesIntoRecord(stagedRecord, changes);
- });
- } else {
- dropPendingRedos();
- if (stagedRecord.length) {
- appendStagedRecordToLatestHistoryRecord();
- }
- if (isEmpty) {
- return;
- }
- history.push(record);
- }
- },
- undo() {
- if (stagedRecord.length) {
- dropPendingRedos();
- appendStagedRecordToLatestHistoryRecord();
- }
- const undoRecord = history[history.length - 1 + offset];
- if (!undoRecord) {
- return;
- }
- offset -= 1;
- return undoRecord;
- },
- redo() {
- const redoRecord = history[history.length + offset];
- if (!redoRecord) {
- return;
- }
- offset += 1;
- return redoRecord;
- },
- hasUndo() {
- return !!history[history.length - 1 + offset];
- },
- hasRedo() {
- return !!history[history.length + offset];
- }
- };
-}
-
-
-/***/ }),
-
/***/ 3249:
/***/ ((module) => {
@@ -575,13 +393,6 @@
};
-/***/ }),
-
-/***/ 923:
-/***/ ((module) => {
-
-module.exports = window["wp"]["isShallowEqual"];
-
/***/ })
/******/ });
@@ -653,59 +464,26 @@
/******/
/************************************************************************/
var __webpack_exports__ = {};
-// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
-(() => {
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
EntityProvider: () => (/* reexport */ EntityProvider),
- __experimentalFetchLinkSuggestions: () => (/* reexport */ _experimental_fetch_link_suggestions),
+ __experimentalFetchLinkSuggestions: () => (/* reexport */ fetchLinkSuggestions),
__experimentalFetchUrlData: () => (/* reexport */ _experimental_fetch_url_data),
__experimentalUseEntityRecord: () => (/* reexport */ __experimentalUseEntityRecord),
__experimentalUseEntityRecords: () => (/* reexport */ __experimentalUseEntityRecords),
__experimentalUseResourcePermissions: () => (/* reexport */ __experimentalUseResourcePermissions),
fetchBlockPatterns: () => (/* reexport */ fetchBlockPatterns),
+ privateApis: () => (/* reexport */ privateApis),
store: () => (/* binding */ store),
useEntityBlockEditor: () => (/* reexport */ useEntityBlockEditor),
useEntityId: () => (/* reexport */ useEntityId),
useEntityProp: () => (/* reexport */ useEntityProp),
useEntityRecord: () => (/* reexport */ useEntityRecord),
useEntityRecords: () => (/* reexport */ useEntityRecords),
- useResourcePermissions: () => (/* reexport */ useResourcePermissions)
-});
-
-// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/actions.js
-var build_module_actions_namespaceObject = {};
-__webpack_require__.r(build_module_actions_namespaceObject);
-__webpack_require__.d(build_module_actions_namespaceObject, {
- __experimentalBatch: () => (__experimentalBatch),
- __experimentalReceiveCurrentGlobalStylesId: () => (__experimentalReceiveCurrentGlobalStylesId),
- __experimentalReceiveThemeBaseGlobalStyles: () => (__experimentalReceiveThemeBaseGlobalStyles),
- __experimentalReceiveThemeGlobalStyleVariations: () => (__experimentalReceiveThemeGlobalStyleVariations),
- __experimentalSaveSpecifiedEntityEdits: () => (__experimentalSaveSpecifiedEntityEdits),
- __unstableCreateUndoLevel: () => (__unstableCreateUndoLevel),
- addEntities: () => (addEntities),
- deleteEntityRecord: () => (deleteEntityRecord),
- editEntityRecord: () => (editEntityRecord),
- receiveAutosaves: () => (receiveAutosaves),
- receiveCurrentTheme: () => (receiveCurrentTheme),
- receiveCurrentUser: () => (receiveCurrentUser),
- receiveDefaultTemplateId: () => (receiveDefaultTemplateId),
- receiveEmbedPreview: () => (receiveEmbedPreview),
- receiveEntityRecords: () => (receiveEntityRecords),
- receiveNavigationFallbackId: () => (receiveNavigationFallbackId),
- receiveRevisions: () => (receiveRevisions),
- receiveThemeGlobalStyleRevisions: () => (receiveThemeGlobalStyleRevisions),
- receiveThemeSupports: () => (receiveThemeSupports),
- receiveUploadPermissions: () => (receiveUploadPermissions),
- receiveUserPermission: () => (receiveUserPermission),
- receiveUserQuery: () => (receiveUserQuery),
- redo: () => (redo),
- saveEditedEntityRecord: () => (saveEditedEntityRecord),
- saveEntityRecord: () => (saveEntityRecord),
- undo: () => (undo)
+ useResourcePermissions: () => (/* reexport */ use_resource_permissions)
});
// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/selectors.js
@@ -718,7 +496,6 @@
__experimentalGetDirtyEntityRecords: () => (__experimentalGetDirtyEntityRecords),
__experimentalGetEntitiesBeingSaved: () => (__experimentalGetEntitiesBeingSaved),
__experimentalGetEntityRecordNoResolver: () => (__experimentalGetEntityRecordNoResolver),
- __experimentalGetTemplateForLink: () => (__experimentalGetTemplateForLink),
canUser: () => (canUser),
canUserEditEntityRecord: () => (canUserEditEntityRecord),
getAuthors: () => (getAuthors),
@@ -770,10 +547,56 @@
__webpack_require__.r(private_selectors_namespaceObject);
__webpack_require__.d(private_selectors_namespaceObject, {
getBlockPatternsForPostType: () => (getBlockPatternsForPostType),
+ getEntityRecordPermissions: () => (getEntityRecordPermissions),
+ getEntityRecordsPermissions: () => (getEntityRecordsPermissions),
+ getHomePage: () => (getHomePage),
getNavigationFallbackId: () => (getNavigationFallbackId),
+ getPostsPageId: () => (getPostsPageId),
+ getRegisteredPostMeta: () => (getRegisteredPostMeta),
+ getTemplateId: () => (getTemplateId),
getUndoManager: () => (getUndoManager)
});
+// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/actions.js
+var build_module_actions_namespaceObject = {};
+__webpack_require__.r(build_module_actions_namespaceObject);
+__webpack_require__.d(build_module_actions_namespaceObject, {
+ __experimentalBatch: () => (__experimentalBatch),
+ __experimentalReceiveCurrentGlobalStylesId: () => (__experimentalReceiveCurrentGlobalStylesId),
+ __experimentalReceiveThemeBaseGlobalStyles: () => (__experimentalReceiveThemeBaseGlobalStyles),
+ __experimentalReceiveThemeGlobalStyleVariations: () => (__experimentalReceiveThemeGlobalStyleVariations),
+ __experimentalSaveSpecifiedEntityEdits: () => (__experimentalSaveSpecifiedEntityEdits),
+ __unstableCreateUndoLevel: () => (__unstableCreateUndoLevel),
+ addEntities: () => (addEntities),
+ deleteEntityRecord: () => (deleteEntityRecord),
+ editEntityRecord: () => (editEntityRecord),
+ receiveAutosaves: () => (receiveAutosaves),
+ receiveCurrentTheme: () => (receiveCurrentTheme),
+ receiveCurrentUser: () => (receiveCurrentUser),
+ receiveDefaultTemplateId: () => (receiveDefaultTemplateId),
+ receiveEmbedPreview: () => (receiveEmbedPreview),
+ receiveEntityRecords: () => (receiveEntityRecords),
+ receiveNavigationFallbackId: () => (receiveNavigationFallbackId),
+ receiveRevisions: () => (receiveRevisions),
+ receiveThemeGlobalStyleRevisions: () => (receiveThemeGlobalStyleRevisions),
+ receiveThemeSupports: () => (receiveThemeSupports),
+ receiveUploadPermissions: () => (receiveUploadPermissions),
+ receiveUserPermission: () => (receiveUserPermission),
+ receiveUserPermissions: () => (receiveUserPermissions),
+ receiveUserQuery: () => (receiveUserQuery),
+ redo: () => (redo),
+ saveEditedEntityRecord: () => (saveEditedEntityRecord),
+ saveEntityRecord: () => (saveEntityRecord),
+ undo: () => (undo)
+});
+
+// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/private-actions.js
+var private_actions_namespaceObject = {};
+__webpack_require__.r(private_actions_namespaceObject);
+__webpack_require__.d(private_actions_namespaceObject, {
+ receiveRegisteredPostMeta: () => (receiveRegisteredPostMeta)
+});
+
// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/resolvers.js
var resolvers_namespaceObject = {};
__webpack_require__.r(resolvers_namespaceObject);
@@ -781,7 +604,6 @@
__experimentalGetCurrentGlobalStylesId: () => (resolvers_experimentalGetCurrentGlobalStylesId),
__experimentalGetCurrentThemeBaseGlobalStyles: () => (resolvers_experimentalGetCurrentThemeBaseGlobalStyles),
__experimentalGetCurrentThemeGlobalStylesVariations: () => (resolvers_experimentalGetCurrentThemeGlobalStylesVariations),
- __experimentalGetTemplateForLink: () => (resolvers_experimentalGetTemplateForLink),
canUser: () => (resolvers_canUser),
canUserEditEntityRecord: () => (resolvers_canUserEditEntityRecord),
getAuthors: () => (resolvers_getAuthors),
@@ -795,26 +617,201 @@
getDefaultTemplateId: () => (resolvers_getDefaultTemplateId),
getEditedEntityRecord: () => (resolvers_getEditedEntityRecord),
getEmbedPreview: () => (resolvers_getEmbedPreview),
+ getEntitiesConfig: () => (resolvers_getEntitiesConfig),
getEntityRecord: () => (resolvers_getEntityRecord),
getEntityRecords: () => (resolvers_getEntityRecords),
getNavigationFallbackId: () => (resolvers_getNavigationFallbackId),
getRawEntityRecord: () => (resolvers_getRawEntityRecord),
+ getRegisteredPostMeta: () => (resolvers_getRegisteredPostMeta),
getRevision: () => (resolvers_getRevision),
getRevisions: () => (resolvers_getRevisions),
getThemeSupports: () => (resolvers_getThemeSupports),
getUserPatternCategories: () => (resolvers_getUserPatternCategories)
});
-;// CONCATENATED MODULE: external ["wp","data"]
+;// external ["wp","data"]
const external_wp_data_namespaceObject = window["wp"]["data"];
// EXTERNAL MODULE: ./node_modules/fast-deep-equal/es6/index.js
var es6 = __webpack_require__(7734);
var es6_default = /*#__PURE__*/__webpack_require__.n(es6);
-;// CONCATENATED MODULE: external ["wp","compose"]
+;// external ["wp","compose"]
const external_wp_compose_namespaceObject = window["wp"]["compose"];
-// EXTERNAL MODULE: ./node_modules/@wordpress/undo-manager/build-module/index.js
-var build_module = __webpack_require__(6689);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/if-matching-action.js
+;// external ["wp","isShallowEqual"]
+const external_wp_isShallowEqual_namespaceObject = window["wp"]["isShallowEqual"];
+var external_wp_isShallowEqual_default = /*#__PURE__*/__webpack_require__.n(external_wp_isShallowEqual_namespaceObject);
+;// ./node_modules/@wordpress/undo-manager/build-module/index.js
+/**
+ * WordPress dependencies
+ */
+
+
+/** @typedef {import('./types').HistoryRecord} HistoryRecord */
+/** @typedef {import('./types').HistoryChange} HistoryChange */
+/** @typedef {import('./types').HistoryChanges} HistoryChanges */
+/** @typedef {import('./types').UndoManager} UndoManager */
+
+/**
+ * Merge changes for a single item into a record of changes.
+ *
+ * @param {Record< string, HistoryChange >} changes1 Previous changes
+ * @param {Record< string, HistoryChange >} changes2 NextChanges
+ *
+ * @return {Record< string, HistoryChange >} Merged changes
+ */
+function mergeHistoryChanges(changes1, changes2) {
+ /**
+ * @type {Record< string, HistoryChange >}
+ */
+ const newChanges = {
+ ...changes1
+ };
+ Object.entries(changes2).forEach(([key, value]) => {
+ if (newChanges[key]) {
+ newChanges[key] = {
+ ...newChanges[key],
+ to: value.to
+ };
+ } else {
+ newChanges[key] = value;
+ }
+ });
+ return newChanges;
+}
+
+/**
+ * Adds history changes for a single item into a record of changes.
+ *
+ * @param {HistoryRecord} record The record to merge into.
+ * @param {HistoryChanges} changes The changes to merge.
+ */
+const addHistoryChangesIntoRecord = (record, changes) => {
+ const existingChangesIndex = record?.findIndex(({
+ id: recordIdentifier
+ }) => {
+ return typeof recordIdentifier === 'string' ? recordIdentifier === changes.id : external_wp_isShallowEqual_default()(recordIdentifier, changes.id);
+ });
+ const nextRecord = [...record];
+ if (existingChangesIndex !== -1) {
+ // If the edit is already in the stack leave the initial "from" value.
+ nextRecord[existingChangesIndex] = {
+ id: changes.id,
+ changes: mergeHistoryChanges(nextRecord[existingChangesIndex].changes, changes.changes)
+ };
+ } else {
+ nextRecord.push(changes);
+ }
+ return nextRecord;
+};
+
+/**
+ * Creates an undo manager.
+ *
+ * @return {UndoManager} Undo manager.
+ */
+function createUndoManager() {
+ /**
+ * @type {HistoryRecord[]}
+ */
+ let history = [];
+ /**
+ * @type {HistoryRecord}
+ */
+ let stagedRecord = [];
+ /**
+ * @type {number}
+ */
+ let offset = 0;
+ const dropPendingRedos = () => {
+ history = history.slice(0, offset || undefined);
+ offset = 0;
+ };
+ const appendStagedRecordToLatestHistoryRecord = () => {
+ var _history$index;
+ const index = history.length === 0 ? 0 : history.length - 1;
+ let latestRecord = (_history$index = history[index]) !== null && _history$index !== void 0 ? _history$index : [];
+ stagedRecord.forEach(changes => {
+ latestRecord = addHistoryChangesIntoRecord(latestRecord, changes);
+ });
+ stagedRecord = [];
+ history[index] = latestRecord;
+ };
+
+ /**
+ * Checks whether a record is empty.
+ * A record is considered empty if it the changes keep the same values.
+ * Also updates to function values are ignored.
+ *
+ * @param {HistoryRecord} record
+ * @return {boolean} Whether the record is empty.
+ */
+ const isRecordEmpty = record => {
+ const filteredRecord = record.filter(({
+ changes
+ }) => {
+ return Object.values(changes).some(({
+ from,
+ to
+ }) => typeof from !== 'function' && typeof to !== 'function' && !external_wp_isShallowEqual_default()(from, to));
+ });
+ return !filteredRecord.length;
+ };
+ return {
+ /**
+ * Record changes into the history.
+ *
+ * @param {HistoryRecord=} record A record of changes to record.
+ * @param {boolean} isStaged Whether to immediately create an undo point or not.
+ */
+ addRecord(record, isStaged = false) {
+ const isEmpty = !record || isRecordEmpty(record);
+ if (isStaged) {
+ if (isEmpty) {
+ return;
+ }
+ record.forEach(changes => {
+ stagedRecord = addHistoryChangesIntoRecord(stagedRecord, changes);
+ });
+ } else {
+ dropPendingRedos();
+ if (stagedRecord.length) {
+ appendStagedRecordToLatestHistoryRecord();
+ }
+ if (isEmpty) {
+ return;
+ }
+ history.push(record);
+ }
+ },
+ undo() {
+ if (stagedRecord.length) {
+ dropPendingRedos();
+ appendStagedRecordToLatestHistoryRecord();
+ }
+ const undoRecord = history[history.length - 1 + offset];
+ if (!undoRecord) {
+ return;
+ }
+ offset -= 1;
+ return undoRecord;
+ },
+ redo() {
+ const redoRecord = history[history.length + offset];
+ if (!redoRecord) {
+ return;
+ }
+ offset += 1;
+ return redoRecord;
+ },
+ hasUndo() {
+ return !!history[history.length - 1 + offset];
+ },
+ hasRedo() {
+ return !!history[history.length + offset];
+ }
+ };
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/utils/if-matching-action.js
/** @typedef {import('../types').AnyFunction} AnyFunction */
/**
@@ -834,7 +831,7 @@
};
/* harmony default export */ const if_matching_action = (ifMatchingAction);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/replace-action.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/replace-action.js
/** @typedef {import('../types').AnyFunction} AnyFunction */
/**
@@ -850,7 +847,7 @@
};
/* harmony default export */ const replace_action = (replaceAction);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/conservative-map-item.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/conservative-map-item.js
/**
* External dependencies
*/
@@ -896,7 +893,7 @@
return result;
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/on-sub-key.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/on-sub-key.js
/** @typedef {import('../types').AnyFunction} AnyFunction */
/**
@@ -928,7 +925,7 @@
};
/* harmony default export */ const on_sub_key = (onSubKey);
-;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.mjs
+;// ./node_modules/tslib/tslib.es6.mjs
/******************************************************************************
Copyright (c) Microsoft Corporation.
@@ -943,7 +940,7 @@
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
-/* global Reflect, Promise, SuppressedError, Symbol */
+/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
@@ -1054,8 +1051,8 @@
}
function __generator(thisArg, body) {
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
@@ -1159,8 +1156,9 @@
function __asyncGenerator(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
- function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
@@ -1193,10 +1191,19 @@
o["default"] = v;
};
+var ownKeys = function(o) {
+ ownKeys = Object.getOwnPropertyNames || function (o) {
+ var ar = [];
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
+ return ar;
+ };
+ return ownKeys(o);
+};
+
function __importStar(mod) {
if (mod && mod.__esModule) return mod;
var result = {};
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
}
@@ -1226,16 +1233,18 @@
function __addDisposableResource(env, value, async) {
if (value !== null && value !== void 0) {
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
- var dispose;
+ var dispose, inner;
if (async) {
- if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
- dispose = value[Symbol.asyncDispose];
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
+ dispose = value[Symbol.asyncDispose];
}
if (dispose === void 0) {
- if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
- dispose = value[Symbol.dispose];
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
+ dispose = value[Symbol.dispose];
+ if (async) inner = dispose;
}
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
env.stack.push({ value: value, dispose: dispose, async: async });
}
else if (async) {
@@ -1254,28 +1263,46 @@
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
env.hasError = true;
}
+ var r, s = 0;
function next() {
- while (env.stack.length) {
- var rec = env.stack.pop();
+ while (r = env.stack.pop()) {
try {
- var result = rec.dispose && rec.dispose.call(rec.value);
- if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
+ if (r.dispose) {
+ var result = r.dispose.call(r.value);
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
+ }
+ else s |= 1;
}
catch (e) {
- fail(e);
+ fail(e);
}
}
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
if (env.hasError) throw env.error;
}
return next();
}
+function __rewriteRelativeImportExtension(path, preserveJsx) {
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
+ });
+ }
+ return path;
+}
+
/* harmony default export */ const tslib_es6 = ({
__extends,
__assign,
__rest,
__decorate,
__param,
+ __esDecorate,
+ __runInitializers,
+ __propKey,
+ __setFunctionName,
__metadata,
__awaiter,
__generator,
@@ -1298,9 +1325,10 @@
__classPrivateFieldIn,
__addDisposableResource,
__disposeResources,
+ __rewriteRelativeImportExtension,
});
-;// CONCATENATED MODULE: ./node_modules/lower-case/dist.es2015/index.js
+;// ./node_modules/lower-case/dist.es2015/index.js
/**
* Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt
*/
@@ -1349,7 +1377,7 @@
return str.toLowerCase();
}
-;// CONCATENATED MODULE: ./node_modules/no-case/dist.es2015/index.js
+;// ./node_modules/no-case/dist.es2015/index.js
// Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case").
var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];
@@ -1381,7 +1409,7 @@
return re.reduce(function (input, re) { return input.replace(re, value); }, input);
}
-;// CONCATENATED MODULE: ./node_modules/upper-case-first/dist.es2015/index.js
+;// ./node_modules/upper-case-first/dist.es2015/index.js
/**
* Upper case the first character of an input string.
*/
@@ -1389,7 +1417,7 @@
return input.charAt(0).toUpperCase() + input.substr(1);
}
-;// CONCATENATED MODULE: ./node_modules/capital-case/dist.es2015/index.js
+;// ./node_modules/capital-case/dist.es2015/index.js
@@ -1401,7 +1429,7 @@
return noCase(input, __assign({ delimiter: " ", transform: capitalCaseTransform }, options));
}
-;// CONCATENATED MODULE: ./node_modules/pascal-case/dist.es2015/index.js
+;// ./node_modules/pascal-case/dist.es2015/index.js
function pascalCaseTransform(input, index) {
@@ -1420,1302 +1448,14 @@
return noCase(input, __assign({ delimiter: "", transform: pascalCaseTransform }, options));
}
-;// CONCATENATED MODULE: external ["wp","apiFetch"]
+;// external ["wp","apiFetch"]
const external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"];
var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject);
-;// CONCATENATED MODULE: external ["wp","i18n"]
+;// external ["wp","i18n"]
const external_wp_i18n_namespaceObject = window["wp"]["i18n"];
-;// CONCATENATED MODULE: external ["wp","richText"]
+;// external ["wp","richText"]
const external_wp_richText_namespaceObject = window["wp"]["richText"];
-;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/native.js
-const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
-/* harmony default export */ const esm_browser_native = ({
- randomUUID
-});
-;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/rng.js
-// Unique ID creation requires a high quality random # generator. In the browser we therefore
-// require the crypto API and do not support built-in fallback to lower quality random number
-// generators (like Math.random()).
-let getRandomValues;
-const rnds8 = new Uint8Array(16);
-function rng() {
- // lazy load so that environments that need to polyfill have a chance to do so
- if (!getRandomValues) {
- // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
- getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
-
- if (!getRandomValues) {
- throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
- }
- }
-
- return getRandomValues(rnds8);
-}
-;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/stringify.js
-
-/**
- * Convert array of 16 byte values to UUID string format of the form:
- * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
- */
-
-const byteToHex = [];
-
-for (let i = 0; i < 256; ++i) {
- byteToHex.push((i + 0x100).toString(16).slice(1));
-}
-
-function unsafeStringify(arr, offset = 0) {
- // Note: Be careful editing this code! It's been tuned for performance
- // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
- return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
-}
-
-function stringify(arr, offset = 0) {
- const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one
- // of the following:
- // - One or more input array values don't map to a hex octet (leading to
- // "undefined" in the uuid)
- // - Invalid input values for the RFC `version` or `variant` fields
-
- if (!validate(uuid)) {
- throw TypeError('Stringified UUID is invalid');
- }
-
- return uuid;
-}
-
-/* harmony default export */ const esm_browser_stringify = ((/* unused pure expression or super */ null && (stringify)));
-;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/v4.js
-
-
-
-
-function v4(options, buf, offset) {
- if (esm_browser_native.randomUUID && !buf && !options) {
- return esm_browser_native.randomUUID();
- }
-
- options = options || {};
- const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
-
- rnds[6] = rnds[6] & 0x0f | 0x40;
- rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
-
- if (buf) {
- offset = offset || 0;
-
- for (let i = 0; i < 16; ++i) {
- buf[offset + i] = rnds[i];
- }
-
- return buf;
- }
-
- return unsafeStringify(rnds);
-}
-
-/* harmony default export */ const esm_browser_v4 = (v4);
-;// CONCATENATED MODULE: external ["wp","url"]
-const external_wp_url_namespaceObject = window["wp"]["url"];
-;// CONCATENATED MODULE: external ["wp","deprecated"]
-const external_wp_deprecated_namespaceObject = window["wp"]["deprecated"];
-var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/set-nested-value.js
-/**
- * Sets the value at path of object.
- * If a portion of path doesn’t exist, it’s created.
- * Arrays are created for missing index properties while objects are created
- * for all other missing properties.
- *
- * Path is specified as either:
- * - a string of properties, separated by dots, for example: "x.y".
- * - an array of properties, for example `[ 'x', 'y' ]`.
- *
- * This function intentionally mutates the input object.
- *
- * Inspired by _.set().
- *
- * @see https://lodash.com/docs/4.17.15#set
- *
- * @todo Needs to be deduplicated with its copy in `@wordpress/edit-site`.
- *
- * @param {Object} object Object to modify
- * @param {Array|string} path Path of the property to set.
- * @param {*} value Value to set.
- */
-function setNestedValue(object, path, value) {
- if (!object || typeof object !== 'object') {
- return object;
- }
- const normalizedPath = Array.isArray(path) ? path : path.split('.');
- normalizedPath.reduce((acc, key, idx) => {
- if (acc[key] === undefined) {
- if (Number.isInteger(normalizedPath[idx + 1])) {
- acc[key] = [];
- } else {
- acc[key] = {};
- }
- }
- if (idx === normalizedPath.length - 1) {
- acc[key] = value;
- }
- return acc[key];
- }, object);
- return object;
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/get-nested-value.js
-/**
- * Helper util to return a value from a certain path of the object.
- * Path is specified as either:
- * - a string of properties, separated by dots, for example: "x.y".
- * - an array of properties, for example `[ 'x', 'y' ]`.
- * You can also specify a default value in case the result is nullish.
- *
- * @param {Object} object Input object.
- * @param {string|Array} path Path to the object property.
- * @param {*} defaultValue Default value if the value at the specified path is undefined.
- * @return {*} Value of the object property at the specified path.
- */
-function getNestedValue(object, path, defaultValue) {
- if (!object || typeof object !== 'object' || typeof path !== 'string' && !Array.isArray(path)) {
- return object;
- }
- const normalizedPath = Array.isArray(path) ? path : path.split('.');
- let value = object;
- normalizedPath.forEach(fieldName => {
- value = value?.[fieldName];
- });
- return value !== undefined ? value : defaultValue;
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/actions.js
-/**
- * Returns an action object used in signalling that items have been received.
- *
- * @param {Array} items Items received.
- * @param {?Object} edits Optional edits to reset.
- * @param {?Object} meta Meta information about pagination.
- *
- * @return {Object} Action object.
- */
-function receiveItems(items, edits, meta) {
- return {
- type: 'RECEIVE_ITEMS',
- items: Array.isArray(items) ? items : [items],
- persistedEdits: edits,
- meta
- };
-}
-
-/**
- * Returns an action object used in signalling that entity records have been
- * deleted and they need to be removed from entities state.
- *
- * @param {string} kind Kind of the removed entities.
- * @param {string} name Name of the removed entities.
- * @param {Array|number|string} records Record IDs of the removed entities.
- * @param {boolean} invalidateCache Controls whether we want to invalidate the cache.
- * @return {Object} Action object.
- */
-function removeItems(kind, name, records, invalidateCache = false) {
- return {
- type: 'REMOVE_ITEMS',
- itemIds: Array.isArray(records) ? records : [records],
- kind,
- name,
- invalidateCache
- };
-}
-
-/**
- * Returns an action object used in signalling that queried data has been
- * received.
- *
- * @param {Array} items Queried items received.
- * @param {?Object} query Optional query object.
- * @param {?Object} edits Optional edits to reset.
- * @param {?Object} meta Meta information about pagination.
- *
- * @return {Object} Action object.
- */
-function receiveQueriedItems(items, query = {}, edits, meta) {
- return {
- ...receiveItems(items, edits, meta),
- query
- };
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/batch/default-processor.js
-/**
- * WordPress dependencies
- */
-
-
-/**
- * Maximum number of requests to place in a single batch request. Obtained by
- * sending a preflight OPTIONS request to /batch/v1/.
- *
- * @type {number?}
- */
-let maxItems = null;
-function chunk(arr, chunkSize) {
- const tmp = [...arr];
- const cache = [];
- while (tmp.length) {
- cache.push(tmp.splice(0, chunkSize));
- }
- return cache;
-}
-
-/**
- * Default batch processor. Sends its input requests to /batch/v1.
- *
- * @param {Array} requests List of API requests to perform at once.
- *
- * @return {Promise} Promise that resolves to a list of objects containing
- * either `output` (if that request was successful) or `error`
- * (if not ).
- */
-async function defaultProcessor(requests) {
- if (maxItems === null) {
- const preflightResponse = await external_wp_apiFetch_default()({
- path: '/batch/v1',
- method: 'OPTIONS'
- });
- maxItems = preflightResponse.endpoints[0].args.requests.maxItems;
- }
- const results = [];
-
- // @ts-ignore We would have crashed or never gotten to this point if we hadn't received the maxItems count.
- for (const batchRequests of chunk(requests, maxItems)) {
- const batchResponse = await external_wp_apiFetch_default()({
- path: '/batch/v1',
- method: 'POST',
- data: {
- validation: 'require-all-validate',
- requests: batchRequests.map(request => ({
- path: request.path,
- body: request.data,
- // Rename 'data' to 'body'.
- method: request.method,
- headers: request.headers
- }))
- }
- });
- let batchResults;
- if (batchResponse.failed) {
- batchResults = batchResponse.responses.map(response => ({
- error: response?.body
- }));
- } else {
- batchResults = batchResponse.responses.map(response => {
- const result = {};
- if (response.status >= 200 && response.status < 300) {
- result.output = response.body;
- } else {
- result.error = response.body;
- }
- return result;
- });
- }
- results.push(...batchResults);
- }
- return results;
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/batch/create-batch.js
-/**
- * Internal dependencies
- */
-
-
-/**
- * Creates a batch, which can be used to combine multiple API requests into one
- * API request using the WordPress batch processing API (/v1/batch).
- *
- * ```
- * const batch = createBatch();
- * const dunePromise = batch.add( {
- * path: '/v1/books',
- * method: 'POST',
- * data: { title: 'Dune' }
- * } );
- * const lotrPromise = batch.add( {
- * path: '/v1/books',
- * method: 'POST',
- * data: { title: 'Lord of the Rings' }
- * } );
- * const isSuccess = await batch.run(); // Sends one POST to /v1/batch.
- * if ( isSuccess ) {
- * console.log(
- * 'Saved two books:',
- * await dunePromise,
- * await lotrPromise
- * );
- * }
- * ```
- *
- * @param {Function} [processor] Processor function. Can be used to replace the
- * default functionality which is to send an API
- * request to /v1/batch. Is given an array of
- * inputs and must return a promise that
- * resolves to an array of objects containing
- * either `output` or `error`.
- */
-function createBatch(processor = defaultProcessor) {
- let lastId = 0;
- /** @type {Array<{ input: any; resolve: ( value: any ) => void; reject: ( error: any ) => void }>} */
- let queue = [];
- const pending = new ObservableSet();
- return {
- /**
- * Adds an input to the batch and returns a promise that is resolved or
- * rejected when the input is processed by `batch.run()`.
- *
- * You may also pass a thunk which allows inputs to be added
- * asychronously.
- *
- * ```
- * // Both are allowed:
- * batch.add( { path: '/v1/books', ... } );
- * batch.add( ( add ) => add( { path: '/v1/books', ... } ) );
- * ```
- *
- * If a thunk is passed, `batch.run()` will pause until either:
- *
- * - The thunk calls its `add` argument, or;
- * - The thunk returns a promise and that promise resolves, or;
- * - The thunk returns a non-promise.
- *
- * @param {any|Function} inputOrThunk Input to add or thunk to execute.
- *
- * @return {Promise|any} If given an input, returns a promise that
- * is resolved or rejected when the batch is
- * processed. If given a thunk, returns the return
- * value of that thunk.
- */
- add(inputOrThunk) {
- const id = ++lastId;
- pending.add(id);
- const add = input => new Promise((resolve, reject) => {
- queue.push({
- input,
- resolve,
- reject
- });
- pending.delete(id);
- });
- if (typeof inputOrThunk === 'function') {
- return Promise.resolve(inputOrThunk(add)).finally(() => {
- pending.delete(id);
- });
- }
- return add(inputOrThunk);
- },
- /**
- * Runs the batch. This calls `batchProcessor` and resolves or rejects
- * all promises returned by `add()`.
- *
- * @return {Promise<boolean>} A promise that resolves to a boolean that is true
- * if the processor returned no errors.
- */
- async run() {
- if (pending.size) {
- await new Promise(resolve => {
- const unsubscribe = pending.subscribe(() => {
- if (!pending.size) {
- unsubscribe();
- resolve(undefined);
- }
- });
- });
- }
- let results;
- try {
- results = await processor(queue.map(({
- input
- }) => input));
- if (results.length !== queue.length) {
- throw new Error('run: Array returned by processor must be same size as input array.');
- }
- } catch (error) {
- for (const {
- reject
- } of queue) {
- reject(error);
- }
- throw error;
- }
- let isSuccess = true;
- results.forEach((result, key) => {
- const queueItem = queue[key];
- if (result?.error) {
- queueItem?.reject(result.error);
- isSuccess = false;
- } else {
- var _result$output;
- queueItem?.resolve((_result$output = result?.output) !== null && _result$output !== void 0 ? _result$output : result);
- }
- });
- queue = [];
- return isSuccess;
- }
- };
-}
-class ObservableSet {
- constructor(...args) {
- this.set = new Set(...args);
- this.subscribers = new Set();
- }
- get size() {
- return this.set.size;
- }
- add(value) {
- this.set.add(value);
- this.subscribers.forEach(subscriber => subscriber());
- return this;
- }
- delete(value) {
- const isSuccess = this.set.delete(value);
- this.subscribers.forEach(subscriber => subscriber());
- return isSuccess;
- }
- subscribe(subscriber) {
- this.subscribers.add(subscriber);
- return () => {
- this.subscribers.delete(subscriber);
- };
- }
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/name.js
-/**
- * The reducer key used by core data in store registration.
- * This is defined in a separate file to avoid cycle-dependency
- *
- * @type {string}
- */
-const STORE_NAME = 'core';
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/actions.js
-/**
- * External dependencies
- */
-
-
-
-/**
- * WordPress dependencies
- */
-
-
-
-
-/**
- * Internal dependencies
- */
-
-
-
-
-
-
-
-/**
- * Returns an action object used in signalling that authors have been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {string} queryID Query ID.
- * @param {Array|Object} users Users received.
- *
- * @return {Object} Action object.
- */
-function receiveUserQuery(queryID, users) {
- return {
- type: 'RECEIVE_USER_QUERY',
- users: Array.isArray(users) ? users : [users],
- queryID
- };
-}
-
-/**
- * Returns an action used in signalling that the current user has been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {Object} currentUser Current user object.
- *
- * @return {Object} Action object.
- */
-function receiveCurrentUser(currentUser) {
- return {
- type: 'RECEIVE_CURRENT_USER',
- currentUser
- };
-}
-
-/**
- * Returns an action object used in adding new entities.
- *
- * @param {Array} entities Entities received.
- *
- * @return {Object} Action object.
- */
-function addEntities(entities) {
- return {
- type: 'ADD_ENTITIES',
- entities
- };
-}
-
-/**
- * Returns an action object used in signalling that entity records have been received.
- *
- * @param {string} kind Kind of the received entity record.
- * @param {string} name Name of the received entity record.
- * @param {Array|Object} records Records received.
- * @param {?Object} query Query Object.
- * @param {?boolean} invalidateCache Should invalidate query caches.
- * @param {?Object} edits Edits to reset.
- * @param {?Object} meta Meta information about pagination.
- * @return {Object} Action object.
- */
-function receiveEntityRecords(kind, name, records, query, invalidateCache = false, edits, meta) {
- // Auto drafts should not have titles, but some plugins rely on them so we can't filter this
- // on the server.
- if (kind === 'postType') {
- records = (Array.isArray(records) ? records : [records]).map(record => record.status === 'auto-draft' ? {
- ...record,
- title: ''
- } : record);
- }
- let action;
- if (query) {
- action = receiveQueriedItems(records, query, edits, meta);
- } else {
- action = receiveItems(records, edits, meta);
- }
- return {
- ...action,
- kind,
- name,
- invalidateCache
- };
-}
-
-/**
- * Returns an action object used in signalling that the current theme has been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {Object} currentTheme The current theme.
- *
- * @return {Object} Action object.
- */
-function receiveCurrentTheme(currentTheme) {
- return {
- type: 'RECEIVE_CURRENT_THEME',
- currentTheme
- };
-}
-
-/**
- * Returns an action object used in signalling that the current global styles id has been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {string} currentGlobalStylesId The current global styles id.
- *
- * @return {Object} Action object.
- */
-function __experimentalReceiveCurrentGlobalStylesId(currentGlobalStylesId) {
- return {
- type: 'RECEIVE_CURRENT_GLOBAL_STYLES_ID',
- id: currentGlobalStylesId
- };
-}
-
-/**
- * Returns an action object used in signalling that the theme base global styles have been received
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {string} stylesheet The theme's identifier
- * @param {Object} globalStyles The global styles object.
- *
- * @return {Object} Action object.
- */
-function __experimentalReceiveThemeBaseGlobalStyles(stylesheet, globalStyles) {
- return {
- type: 'RECEIVE_THEME_GLOBAL_STYLES',
- stylesheet,
- globalStyles
- };
-}
-
-/**
- * Returns an action object used in signalling that the theme global styles variations have been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {string} stylesheet The theme's identifier
- * @param {Array} variations The global styles variations.
- *
- * @return {Object} Action object.
- */
-function __experimentalReceiveThemeGlobalStyleVariations(stylesheet, variations) {
- return {
- type: 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS',
- stylesheet,
- variations
- };
-}
-
-/**
- * Returns an action object used in signalling that the index has been received.
- *
- * @deprecated since WP 5.9, this is not useful anymore, use the selector direclty.
- *
- * @return {Object} Action object.
- */
-function receiveThemeSupports() {
- external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveThemeSupports", {
- since: '5.9'
- });
- return {
- type: 'DO_NOTHING'
- };
-}
-
-/**
- * Returns an action object used in signalling that the theme global styles CPT post revisions have been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @deprecated since WordPress 6.5.0. Callers should use `dispatch( 'core' ).receiveRevision` instead.
- *
- * @ignore
- *
- * @param {number} currentId The post id.
- * @param {Array} revisions The global styles revisions.
- *
- * @return {Object} Action object.
- */
-function receiveThemeGlobalStyleRevisions(currentId, revisions) {
- external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveThemeGlobalStyleRevisions()", {
- since: '6.5.0',
- alternative: "wp.data.dispatch( 'core' ).receiveRevisions"
- });
- return {
- type: 'RECEIVE_THEME_GLOBAL_STYLE_REVISIONS',
- currentId,
- revisions
- };
-}
-
-/**
- * Returns an action object used in signalling that the preview data for
- * a given URl has been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {string} url URL to preview the embed for.
- * @param {*} preview Preview data.
- *
- * @return {Object} Action object.
- */
-function receiveEmbedPreview(url, preview) {
- return {
- type: 'RECEIVE_EMBED_PREVIEW',
- url,
- preview
- };
-}
-
-/**
- * Action triggered to delete an entity record.
- *
- * @param {string} kind Kind of the deleted entity.
- * @param {string} name Name of the deleted entity.
- * @param {string} recordId Record ID of the deleted entity.
- * @param {?Object} query Special query parameters for the
- * DELETE API call.
- * @param {Object} [options] Delete options.
- * @param {Function} [options.__unstableFetch] Internal use only. Function to
- * call instead of `apiFetch()`.
- * Must return a promise.
- * @param {boolean} [options.throwOnError=false] If false, this action suppresses all
- * the exceptions. Defaults to false.
- */
-const deleteEntityRecord = (kind, name, recordId, query, {
- __unstableFetch = (external_wp_apiFetch_default()),
- throwOnError = false
-} = {}) => async ({
- dispatch
-}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
- const entityConfig = configs.find(config => config.kind === kind && config.name === name);
- let error;
- let deletedRecord = false;
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
- return;
- }
- const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, recordId], {
- exclusive: true
- });
- try {
- dispatch({
- type: 'DELETE_ENTITY_RECORD_START',
- kind,
- name,
- recordId
- });
- let hasError = false;
- try {
- let path = `${entityConfig.baseURL}/${recordId}`;
- if (query) {
- path = (0,external_wp_url_namespaceObject.addQueryArgs)(path, query);
- }
- deletedRecord = await __unstableFetch({
- path,
- method: 'DELETE'
- });
- await dispatch(removeItems(kind, name, recordId, true));
- } catch (_error) {
- hasError = true;
- error = _error;
- }
- dispatch({
- type: 'DELETE_ENTITY_RECORD_FINISH',
- kind,
- name,
- recordId,
- error
- });
- if (hasError && throwOnError) {
- throw error;
- }
- return deletedRecord;
- } finally {
- dispatch.__unstableReleaseStoreLock(lock);
- }
-};
-
-/**
- * Returns an action object that triggers an
- * edit to an entity record.
- *
- * @param {string} kind Kind of the edited entity record.
- * @param {string} name Name of the edited entity record.
- * @param {number|string} recordId Record ID of the edited entity record.
- * @param {Object} edits The edits.
- * @param {Object} options Options for the edit.
- * @param {boolean} [options.undoIgnore] Whether to ignore the edit in undo history or not.
- *
- * @return {Object} Action object.
- */
-const editEntityRecord = (kind, name, recordId, edits, options = {}) => ({
- select,
- dispatch
-}) => {
- const entityConfig = select.getEntityConfig(kind, name);
- if (!entityConfig) {
- throw new Error(`The entity being edited (${kind}, ${name}) does not have a loaded config.`);
- }
- const {
- mergedEdits = {}
- } = entityConfig;
- const record = select.getRawEntityRecord(kind, name, recordId);
- const editedRecord = select.getEditedEntityRecord(kind, name, recordId);
- const edit = {
- kind,
- name,
- recordId,
- // Clear edits when they are equal to their persisted counterparts
- // so that the property is not considered dirty.
- edits: Object.keys(edits).reduce((acc, key) => {
- const recordValue = record[key];
- const editedRecordValue = editedRecord[key];
- const value = mergedEdits[key] ? {
- ...editedRecordValue,
- ...edits[key]
- } : edits[key];
- acc[key] = es6_default()(recordValue, value) ? undefined : value;
- return acc;
- }, {})
- };
- if (window.__experimentalEnableSync && entityConfig.syncConfig) {
- if (false) {}
- } else {
- if (!options.undoIgnore) {
- select.getUndoManager().addRecord([{
- id: {
- kind,
- name,
- recordId
- },
- changes: Object.keys(edits).reduce((acc, key) => {
- acc[key] = {
- from: editedRecord[key],
- to: edits[key]
- };
- return acc;
- }, {})
- }], options.isCached);
- }
- dispatch({
- type: 'EDIT_ENTITY_RECORD',
- ...edit
- });
- }
-};
-
-/**
- * Action triggered to undo the last edit to
- * an entity record, if any.
- */
-const undo = () => ({
- select,
- dispatch
-}) => {
- const undoRecord = select.getUndoManager().undo();
- if (!undoRecord) {
- return;
- }
- dispatch({
- type: 'UNDO',
- record: undoRecord
- });
-};
-
-/**
- * Action triggered to redo the last undoed
- * edit to an entity record, if any.
- */
-const redo = () => ({
- select,
- dispatch
-}) => {
- const redoRecord = select.getUndoManager().redo();
- if (!redoRecord) {
- return;
- }
- dispatch({
- type: 'REDO',
- record: redoRecord
- });
-};
-
-/**
- * Forces the creation of a new undo level.
- *
- * @return {Object} Action object.
- */
-const __unstableCreateUndoLevel = () => ({
- select
-}) => {
- select.getUndoManager().addRecord();
-};
-
-/**
- * Action triggered to save an entity record.
- *
- * @param {string} kind Kind of the received entity.
- * @param {string} name Name of the received entity.
- * @param {Object} record Record to be saved.
- * @param {Object} options Saving options.
- * @param {boolean} [options.isAutosave=false] Whether this is an autosave.
- * @param {Function} [options.__unstableFetch] Internal use only. Function to
- * call instead of `apiFetch()`.
- * Must return a promise.
- * @param {boolean} [options.throwOnError=false] If false, this action suppresses all
- * the exceptions. Defaults to false.
- */
-const saveEntityRecord = (kind, name, record, {
- isAutosave = false,
- __unstableFetch = (external_wp_apiFetch_default()),
- throwOnError = false
-} = {}) => async ({
- select,
- resolveSelect,
- dispatch
-}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
- const entityConfig = configs.find(config => config.kind === kind && config.name === name);
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
- return;
- }
- const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY;
- const recordId = record[entityIdKey];
- const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, recordId || esm_browser_v4()], {
- exclusive: true
- });
- try {
- // Evaluate optimized edits.
- // (Function edits that should be evaluated on save to avoid expensive computations on every edit.)
- for (const [key, value] of Object.entries(record)) {
- if (typeof value === 'function') {
- const evaluatedValue = value(select.getEditedEntityRecord(kind, name, recordId));
- dispatch.editEntityRecord(kind, name, recordId, {
- [key]: evaluatedValue
- }, {
- undoIgnore: true
- });
- record[key] = evaluatedValue;
- }
- }
- dispatch({
- type: 'SAVE_ENTITY_RECORD_START',
- kind,
- name,
- recordId,
- isAutosave
- });
- let updatedRecord;
- let error;
- let hasError = false;
- try {
- const path = `${entityConfig.baseURL}${recordId ? '/' + recordId : ''}`;
- const persistedRecord = select.getRawEntityRecord(kind, name, recordId);
- if (isAutosave) {
- // Most of this autosave logic is very specific to posts.
- // This is fine for now as it is the only supported autosave,
- // but ideally this should all be handled in the back end,
- // so the client just sends and receives objects.
- const currentUser = select.getCurrentUser();
- const currentUserId = currentUser ? currentUser.id : undefined;
- const autosavePost = await resolveSelect.getAutosave(persistedRecord.type, persistedRecord.id, currentUserId);
- // Autosaves need all expected fields to be present.
- // So we fallback to the previous autosave and then
- // to the actual persisted entity if the edits don't
- // have a value.
- let data = {
- ...persistedRecord,
- ...autosavePost,
- ...record
- };
- data = Object.keys(data).reduce((acc, key) => {
- if (['title', 'excerpt', 'content', 'meta'].includes(key)) {
- acc[key] = data[key];
- }
- return acc;
- }, {
- // Do not update the `status` if we have edited it when auto saving.
- // It's very important to let the user explicitly save this change,
- // because it can lead to unexpected results. An example would be to
- // have a draft post and change the status to publish.
- status: data.status === 'auto-draft' ? 'draft' : undefined
- });
- updatedRecord = await __unstableFetch({
- path: `${path}/autosaves`,
- method: 'POST',
- data
- });
-
- // An autosave may be processed by the server as a regular save
- // when its update is requested by the author and the post had
- // draft or auto-draft status.
- if (persistedRecord.id === updatedRecord.id) {
- let newRecord = {
- ...persistedRecord,
- ...data,
- ...updatedRecord
- };
- newRecord = Object.keys(newRecord).reduce((acc, key) => {
- // These properties are persisted in autosaves.
- if (['title', 'excerpt', 'content'].includes(key)) {
- acc[key] = newRecord[key];
- } else if (key === 'status') {
- // Status is only persisted in autosaves when going from
- // "auto-draft" to "draft".
- acc[key] = persistedRecord.status === 'auto-draft' && newRecord.status === 'draft' ? newRecord.status : persistedRecord.status;
- } else {
- // These properties are not persisted in autosaves.
- acc[key] = persistedRecord[key];
- }
- return acc;
- }, {});
- dispatch.receiveEntityRecords(kind, name, newRecord, undefined, true);
- } else {
- dispatch.receiveAutosaves(persistedRecord.id, updatedRecord);
- }
- } else {
- let edits = record;
- if (entityConfig.__unstablePrePersist) {
- edits = {
- ...edits,
- ...entityConfig.__unstablePrePersist(persistedRecord, edits)
- };
- }
- updatedRecord = await __unstableFetch({
- path,
- method: recordId ? 'PUT' : 'POST',
- data: edits
- });
- dispatch.receiveEntityRecords(kind, name, updatedRecord, undefined, true, edits);
- }
- } catch (_error) {
- hasError = true;
- error = _error;
- }
- dispatch({
- type: 'SAVE_ENTITY_RECORD_FINISH',
- kind,
- name,
- recordId,
- error,
- isAutosave
- });
- if (hasError && throwOnError) {
- throw error;
- }
- return updatedRecord;
- } finally {
- dispatch.__unstableReleaseStoreLock(lock);
- }
-};
-
-/**
- * Runs multiple core-data actions at the same time using one API request.
- *
- * Example:
- *
- * ```
- * const [ savedRecord, updatedRecord, deletedRecord ] =
- * await dispatch( 'core' ).__experimentalBatch( [
- * ( { saveEntityRecord } ) => saveEntityRecord( 'root', 'widget', widget ),
- * ( { saveEditedEntityRecord } ) => saveEntityRecord( 'root', 'widget', 123 ),
- * ( { deleteEntityRecord } ) => deleteEntityRecord( 'root', 'widget', 123, null ),
- * ] );
- * ```
- *
- * @param {Array} requests Array of functions which are invoked simultaneously.
- * Each function is passed an object containing
- * `saveEntityRecord`, `saveEditedEntityRecord`, and
- * `deleteEntityRecord`.
- *
- * @return {(thunkArgs: Object) => Promise} A promise that resolves to an array containing the return
- * values of each function given in `requests`.
- */
-const __experimentalBatch = requests => async ({
- dispatch
-}) => {
- const batch = createBatch();
- const api = {
- saveEntityRecord(kind, name, record, options) {
- return batch.add(add => dispatch.saveEntityRecord(kind, name, record, {
- ...options,
- __unstableFetch: add
- }));
- },
- saveEditedEntityRecord(kind, name, recordId, options) {
- return batch.add(add => dispatch.saveEditedEntityRecord(kind, name, recordId, {
- ...options,
- __unstableFetch: add
- }));
- },
- deleteEntityRecord(kind, name, recordId, query, options) {
- return batch.add(add => dispatch.deleteEntityRecord(kind, name, recordId, query, {
- ...options,
- __unstableFetch: add
- }));
- }
- };
- const resultPromises = requests.map(request => request(api));
- const [, ...results] = await Promise.all([batch.run(), ...resultPromises]);
- return results;
-};
-
-/**
- * Action triggered to save an entity record's edits.
- *
- * @param {string} kind Kind of the entity.
- * @param {string} name Name of the entity.
- * @param {Object} recordId ID of the record.
- * @param {Object} options Saving options.
- */
-const saveEditedEntityRecord = (kind, name, recordId, options) => async ({
- select,
- dispatch
-}) => {
- if (!select.hasEditsForEntityRecord(kind, name, recordId)) {
- return;
- }
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
- const entityConfig = configs.find(config => config.kind === kind && config.name === name);
- if (!entityConfig) {
- return;
- }
- const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY;
- const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId);
- const record = {
- [entityIdKey]: recordId,
- ...edits
- };
- return await dispatch.saveEntityRecord(kind, name, record, options);
-};
-
-/**
- * Action triggered to save only specified properties for the entity.
- *
- * @param {string} kind Kind of the entity.
- * @param {string} name Name of the entity.
- * @param {Object} recordId ID of the record.
- * @param {Array} itemsToSave List of entity properties or property paths to save.
- * @param {Object} options Saving options.
- */
-const __experimentalSaveSpecifiedEntityEdits = (kind, name, recordId, itemsToSave, options) => async ({
- select,
- dispatch
-}) => {
- if (!select.hasEditsForEntityRecord(kind, name, recordId)) {
- return;
- }
- const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId);
- const editsToSave = {};
- for (const item of itemsToSave) {
- setNestedValue(editsToSave, item, getNestedValue(edits, item));
- }
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
- const entityConfig = configs.find(config => config.kind === kind && config.name === name);
- const entityIdKey = entityConfig?.key || DEFAULT_ENTITY_KEY;
-
- // If a record key is provided then update the existing record.
- // This necessitates providing `recordKey` to saveEntityRecord as part of the
- // `record` argument (here called `editsToSave`) to stop that action creating
- // a new record and instead cause it to update the existing record.
- if (recordId) {
- editsToSave[entityIdKey] = recordId;
- }
- return await dispatch.saveEntityRecord(kind, name, editsToSave, options);
-};
-
-/**
- * Returns an action object used in signalling that Upload permissions have been received.
- *
- * @deprecated since WP 5.9, use receiveUserPermission instead.
- *
- * @param {boolean} hasUploadPermissions Does the user have permission to upload files?
- *
- * @return {Object} Action object.
- */
-function receiveUploadPermissions(hasUploadPermissions) {
- external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveUploadPermissions", {
- since: '5.9',
- alternative: 'receiveUserPermission'
- });
- return receiveUserPermission('create/media', hasUploadPermissions);
-}
-
-/**
- * Returns an action object used in signalling that the current user has
- * permission to perform an action on a REST resource.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {string} key A key that represents the action and REST resource.
- * @param {boolean} isAllowed Whether or not the user can perform the action.
- *
- * @return {Object} Action object.
- */
-function receiveUserPermission(key, isAllowed) {
- return {
- type: 'RECEIVE_USER_PERMISSION',
- key,
- isAllowed
- };
-}
-
-/**
- * Returns an action object used in signalling that the autosaves for a
- * post have been received.
- * Ignored from documentation as it's internal to the data store.
- *
- * @ignore
- *
- * @param {number} postId The id of the post that is parent to the autosave.
- * @param {Array|Object} autosaves An array of autosaves or singular autosave object.
- *
- * @return {Object} Action object.
- */
-function receiveAutosaves(postId, autosaves) {
- return {
- type: 'RECEIVE_AUTOSAVES',
- postId,
- autosaves: Array.isArray(autosaves) ? autosaves : [autosaves]
- };
-}
-
-/**
- * Returns an action object signalling that the fallback Navigation
- * Menu id has been received.
- *
- * @param {integer} fallbackId the id of the fallback Navigation Menu
- * @return {Object} Action object.
- */
-function receiveNavigationFallbackId(fallbackId) {
- return {
- type: 'RECEIVE_NAVIGATION_FALLBACK_ID',
- fallbackId
- };
-}
-
-/**
- * Returns an action object used to set the template for a given query.
- *
- * @param {Object} query The lookup query.
- * @param {string} templateId The resolved template id.
- *
- * @return {Object} Action object.
- */
-function receiveDefaultTemplateId(query, templateId) {
- return {
- type: 'RECEIVE_DEFAULT_TEMPLATE',
- query,
- templateId
- };
-}
-
-/**
- * Action triggered to receive revision items.
- *
- * @param {string} kind Kind of the received entity record revisions.
- * @param {string} name Name of the received entity record revisions.
- * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.
- * @param {Array|Object} records Revisions received.
- * @param {?Object} query Query Object.
- * @param {?boolean} invalidateCache Should invalidate query caches.
- * @param {?Object} meta Meta information about pagination.
- */
-const receiveRevisions = (kind, name, recordKey, records, query, invalidateCache = false, meta) => async ({
- dispatch
-}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
- const entityConfig = configs.find(config => config.kind === kind && config.name === name);
- const key = entityConfig && entityConfig?.revisionKey ? entityConfig.revisionKey : DEFAULT_ENTITY_KEY;
- dispatch({
- type: 'RECEIVE_ITEM_REVISIONS',
- key,
- items: Array.isArray(records) ? records : [records],
- recordKey,
- meta,
- query,
- kind,
- name,
- invalidateCache
- });
-};
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/entities.js
+;// ./node_modules/@wordpress/core-data/build-module/entities.js
/**
* External dependencies
*/
@@ -2727,12 +1467,6 @@
-
-/**
- * Internal dependencies
- */
-
-
const DEFAULT_ENTITY_KEY = 'id';
const POST_RAW_ATTRIBUTES = ['title', 'excerpt', 'content'];
const rootEntitiesConfig = [{
@@ -2741,7 +1475,9 @@
name: '__unstableBase',
baseURL: '/',
baseURLParams: {
- _fields: ['description', 'gmt_offset', 'home', 'name', 'site_icon', 'site_icon_url', 'site_logo', 'timezone_string', 'url'].join(',')
+ // Please also change the preload path when changing this.
+ // @see lib/compat/wordpress-6.8/preload.php
+ _fields: ['description', 'gmt_offset', 'home', 'name', 'site_icon', 'site_icon_url', 'site_logo', 'timezone_string', 'url', 'page_for_posts', 'page_on_front', 'show_on_front'].join(',')
},
// The entity doesn't support selecting multiple records.
// The property is maintained for backward compatibility.
@@ -3173,59 +1909,10 @@
const suffix = pascalCase(name);
return `${prefix}${kindPrefix}${suffix}`;
};
-function registerSyncConfigs(configs) {
- configs.forEach(({
- syncObjectType,
- syncConfig
- }) => {
- getSyncProvider().register(syncObjectType, syncConfig);
- const editSyncConfig = {
- ...syncConfig
- };
- delete editSyncConfig.fetch;
- getSyncProvider().register(syncObjectType + '--edit', editSyncConfig);
- });
-}
-
-/**
- * Loads the entities into the store.
- *
- * Note: The `name` argument is used for `root` entities requiring additional server data.
- *
- * @param {string} kind Kind
- * @param {string} name Name
- * @return {(thunkArgs: object) => Promise<Array>} Entities
- */
-const getOrLoadEntitiesConfig = (kind, name) => async ({
- select,
- dispatch
-}) => {
- let configs = select.getEntitiesConfig(kind);
- const hasConfig = !!select.getEntityConfig(kind, name);
- if (configs?.length > 0 && hasConfig) {
- if (window.__experimentalEnableSync) {
- if (false) {}
- }
- return configs;
- }
- const loader = additionalEntityConfigLoaders.find(l => {
- if (!name || !l.name) {
- return l.kind === kind;
- }
- return l.kind === kind && l.name === name;
- });
- if (!loader) {
- return [];
- }
- configs = await loader.loadEntities();
- if (window.__experimentalEnableSync) {
- if (false) {}
- }
- dispatch(addEntities(configs));
- return configs;
-};
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/get-normalized-comma-separable.js
+
+;// external ["wp","url"]
+const external_wp_url_namespaceObject = window["wp"]["url"];
+;// ./node_modules/@wordpress/core-data/build-module/utils/get-normalized-comma-separable.js
/**
* Given a value which can be specified as one or the other of a comma-separated
* string or an array, returns a value normalized to an array of strings, or
@@ -3245,7 +1932,7 @@
}
/* harmony default export */ const get_normalized_comma_separable = (getNormalizedCommaSeparable);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/with-weak-map-cache.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/with-weak-map-cache.js
/**
* Given a function, returns an enhanced function which caches the result and
* tracks in WeakMap. The result is only cached if the original function is
@@ -3276,7 +1963,7 @@
}
/* harmony default export */ const with_weak_map_cache = (withWeakMapCache);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/get-query-parts.js
+;// ./node_modules/@wordpress/core-data/build-module/queried-data/get-query-parts.js
/**
* WordPress dependencies
*/
@@ -3380,7 +2067,7 @@
}
/* harmony default export */ const get_query_parts = (with_weak_map_cache(getQueryParts));
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/reducer.js
+;// ./node_modules/@wordpress/core-data/build-module/queried-data/reducer.js
/**
* WordPress dependencies
*/
@@ -3616,7 +2303,7 @@
queries
}));
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/reducer.js
+;// ./node_modules/@wordpress/core-data/build-module/reducer.js
/**
* External dependencies
*/
@@ -4025,7 +2712,7 @@
/**
* @type {UndoManager}
*/
-function undoManager(state = (0,build_module.createUndoManager)()) {
+function undoManager(state = createUndoManager()) {
return state;
}
function editsReference(state = {}, action) {
@@ -4077,6 +2764,11 @@
...state,
[action.key]: action.isAllowed
};
+ case 'RECEIVE_USER_PERMISSIONS':
+ return {
+ ...state,
+ ...action.permissions
+ };
}
return state;
}
@@ -4169,6 +2861,25 @@
}
return state;
}
+
+/**
+ * Reducer returning an object of registered post meta.
+ *
+ * @param {Object} state Current state.
+ * @param {Object} action Dispatched action.
+ *
+ * @return {Object} Updated state.
+ */
+function registeredPostMeta(state = {}, action) {
+ switch (action.type) {
+ case 'RECEIVE_REGISTERED_POST_META':
+ return {
+ ...state,
+ [action.postType]: action.registeredPostMeta
+ };
+ }
+ return state;
+}
/* harmony default export */ const build_module_reducer = ((0,external_wp_data_namespaceObject.combineReducers)({
terms,
users,
@@ -4189,13 +2900,70 @@
blockPatternCategories,
userPatternCategories,
navigationFallbackId,
- defaultTemplates
+ defaultTemplates,
+ registeredPostMeta
}));
+;// external ["wp","deprecated"]
+const external_wp_deprecated_namespaceObject = window["wp"]["deprecated"];
+var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject);
+;// ./node_modules/@wordpress/core-data/build-module/name.js
+/**
+ * The reducer key used by core data in store registration.
+ * This is defined in a separate file to avoid cycle-dependency
+ *
+ * @type {string}
+ */
+const STORE_NAME = 'core';
+
// EXTERNAL MODULE: ./node_modules/equivalent-key-map/equivalent-key-map.js
var equivalent_key_map = __webpack_require__(3249);
var equivalent_key_map_default = /*#__PURE__*/__webpack_require__.n(equivalent_key_map);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/selectors.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/set-nested-value.js
+/**
+ * Sets the value at path of object.
+ * If a portion of path doesn’t exist, it’s created.
+ * Arrays are created for missing index properties while objects are created
+ * for all other missing properties.
+ *
+ * Path is specified as either:
+ * - a string of properties, separated by dots, for example: "x.y".
+ * - an array of properties, for example `[ 'x', 'y' ]`.
+ *
+ * This function intentionally mutates the input object.
+ *
+ * Inspired by _.set().
+ *
+ * @see https://lodash.com/docs/4.17.15#set
+ *
+ * @todo Needs to be deduplicated with its copy in `@wordpress/edit-site`.
+ *
+ * @param {Object} object Object to modify
+ * @param {Array|string} path Path of the property to set.
+ * @param {*} value Value to set.
+ */
+function setNestedValue(object, path, value) {
+ if (!object || typeof object !== 'object') {
+ return object;
+ }
+ const normalizedPath = Array.isArray(path) ? path : path.split('.');
+ normalizedPath.reduce((acc, key, idx) => {
+ if (acc[key] === undefined) {
+ if (Number.isInteger(normalizedPath[idx + 1])) {
+ acc[key] = [];
+ } else {
+ acc[key] = {};
+ }
+ }
+ if (idx === normalizedPath.length - 1) {
+ acc[key] = value;
+ }
+ return acc[key];
+ }, object);
+ return object;
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/queried-data/selectors.js
/**
* External dependencies
*/
@@ -4330,7 +3098,7 @@
return (_state$queries$contex2 = state.queries?.[context]?.[stableKey]?.meta?.totalPages) !== null && _state$queries$contex2 !== void 0 ? _state$queries$contex2 : null;
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/is-numeric-id.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/is-numeric-id.js
/**
* Checks argument to determine if it's a numeric ID.
* For example, '123' is a numeric ID, but '123abc' is not.
@@ -4342,7 +3110,7 @@
return /^\s*\d+\s*$/.test(id);
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/is-raw-attribute.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/is-raw-attribute.js
/**
* Checks whether the attribute is a "raw" attribute or not.
*
@@ -4355,7 +3123,30 @@
return (entity.rawAttributes || []).includes(attribute);
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/selectors.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/user-permissions.js
+const ALLOWED_RESOURCE_ACTIONS = ['create', 'read', 'update', 'delete'];
+function getUserPermissionsFromAllowHeader(allowedMethods) {
+ const permissions = {};
+ if (!allowedMethods) {
+ return permissions;
+ }
+ const methods = {
+ create: 'POST',
+ read: 'GET',
+ update: 'PUT',
+ delete: 'DELETE'
+ };
+ for (const [actionName, methodName] of Object.entries(methods)) {
+ permissions[actionName] = allowedMethods.includes(methodName);
+ }
+ return permissions;
+}
+function getUserPermissionCacheKey(action, resource, id) {
+ const key = (typeof resource === 'object' ? [action, resource.kind, resource.name, resource.id] : [action, resource, id]).filter(Boolean).join('/');
+ return key;
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/selectors.js
/**
* WordPress dependencies
*/
@@ -4475,7 +3266,9 @@
*
* @return Array of entities with config matching kind.
*/
-const getEntitiesConfig = (0,external_wp_data_namespaceObject.createSelector)((state, kind) => state.entities.config.filter(entity => entity.kind === kind), (state, kind) => state.entities.config);
+const getEntitiesConfig = (0,external_wp_data_namespaceObject.createSelector)((state, kind) => state.entities.config.filter(entity => entity.kind === kind), /* eslint-disable @typescript-eslint/no-unused-vars */
+(state, kind) => state.entities.config
+/* eslint-enable @typescript-eslint/no-unused-vars */);
/**
* Returns the entity config given its kind and name.
*
@@ -4540,7 +3333,7 @@
* @param state State tree
* @param kind Entity kind.
* @param name Entity name.
- * @param key Record's key
+ * @param key Optional record's key. If requesting a global record (e.g. site settings), the key can be omitted. If requesting a specific item, the key must always be included.
* @param query Optional query. If requesting specific
* fields, fields must always include the ID. For valid query parameters see the [Reference](https://developer.wordpress.org/rest-api/reference/) in the REST API Handbook and select the entity kind. Then see the arguments available "Retrieve a [Entity kind]".
*
@@ -4626,11 +3419,10 @@
const record = getEntityRecord(state, kind, name, key);
return record && Object.keys(record).reduce((accumulator, _key) => {
if (isRawAttribute(getEntityConfig(state, kind, name), _key)) {
- var _record$_key$raw;
// Because edits are the "raw" attribute values,
// we return those from record selectors to make rendering,
// comparisons, and joins with edits easier.
- accumulator[_key] = (_record$_key$raw = record[_key]?.raw) !== null && _record$_key$raw !== void 0 ? _record$_key$raw : record[_key];
+ accumulator[_key] = record[_key]?.raw !== undefined ? record[_key]?.raw : record[_key];
} else {
accumulator[_key] = record[_key];
}
@@ -4981,6 +3773,7 @@
return state.entities.records?.[kind]?.[name]?.deleting?.[recordId]?.error;
}
+/* eslint-disable @typescript-eslint/no-unused-vars */
/**
* Returns the previous edit from the current undo offset
* for the entity records edits history, if any.
@@ -4997,7 +3790,9 @@
});
return undefined;
}
-
+/* eslint-enable @typescript-eslint/no-unused-vars */
+
+/* eslint-disable @typescript-eslint/no-unused-vars */
/**
* Returns the next edit from the current undo offset
* for the entity records edits history, if any.
@@ -5014,6 +3809,7 @@
});
return undefined;
}
+/* eslint-enable @typescript-eslint/no-unused-vars */
/**
* Returns true if there is a previous edit from the current undo offset
@@ -5120,14 +3916,19 @@
*
* @param state Data state.
* @param action Action to check. One of: 'create', 'read', 'update', 'delete'.
- * @param resource REST resource to check, e.g. 'media' or 'posts'.
+ * @param resource Entity resource to check. Accepts entity object `{ kind: 'root', name: 'media', id: 1 }`
+ * or REST base as a string - `media`.
* @param id Optional ID of the rest resource to check.
*
* @return Whether or not the user can perform the action,
* or `undefined` if the OPTIONS request is still being made.
*/
function canUser(state, action, resource, id) {
- const key = [action, resource, id].filter(Boolean).join('/');
+ const isEntity = typeof resource === 'object';
+ if (isEntity && (!resource.kind || !resource.name)) {
+ return false;
+ }
+ const key = getUserPermissionCacheKey(action, resource, id);
return state.userPermissions[key];
}
@@ -5147,12 +3948,15 @@
* or `undefined` if the OPTIONS request is still being made.
*/
function canUserEditEntityRecord(state, kind, name, recordId) {
- const entityConfig = getEntityConfig(state, kind, name);
- if (!entityConfig) {
- return false;
- }
- const resource = entityConfig.__unstable_rest_base;
- return canUser(state, 'update', resource, recordId);
+ external_wp_deprecated_default()(`wp.data.select( 'core' ).canUserEditEntityRecord()`, {
+ since: '6.7',
+ alternative: `wp.data.select( 'core' ).canUser( 'update', { kind, name, id } )`
+ });
+ return canUser(state, 'update', {
+ kind,
+ name,
+ id: recordId
+ });
}
/**
@@ -5225,24 +4029,6 @@
}
/**
- * Retrieve the frontend template used for a given link.
- *
- * @param state Editor state.
- * @param link Link.
- *
- * @return The template record.
- */
-function __experimentalGetTemplateForLink(state, link) {
- const records = getEntityRecords(state, 'postType', 'wp_template', {
- 'find-template': link
- });
- if (records?.length) {
- return getEditedEntityRecord(state, 'postType', 'wp_template', records[0].id);
- }
- return null;
-}
-
-/**
* Retrieve the current theme's base global styles
*
* @param state Editor state.
@@ -5408,7 +4194,19 @@
return [state.entities.records?.[kind]?.[name]?.revisions?.[recordKey]?.items?.[context]?.[revisionKey], state.entities.records?.[kind]?.[name]?.revisions?.[recordKey]?.itemIsComplete?.[context]?.[revisionKey]];
});
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/private-selectors.js
+;// external ["wp","privateApis"]
+const external_wp_privateApis_namespaceObject = window["wp"]["privateApis"];
+;// ./node_modules/@wordpress/core-data/build-module/lock-unlock.js
+/**
+ * WordPress dependencies
+ */
+
+const {
+ lock,
+ unlock
+} = (0,external_wp_privateApis_namespaceObject.__dangerousOptInToUnstableAPIsOnlyForCoreModules)('I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.', '@wordpress/core-data');
+
+;// ./node_modules/@wordpress/core-data/build-module/private-selectors.js
/**
* WordPress dependencies
*/
@@ -5419,6 +4217,7 @@
*/
+
/**
* Returns the previous edit from the current undo offset
* for the entity records edits history, if any.
@@ -5444,7 +4243,1430 @@
postTypes
}) => !postTypes || Array.isArray(postTypes) && postTypes.includes(postType)), () => [select(STORE_NAME).getBlockPatterns()]));
-;// CONCATENATED MODULE: ./node_modules/camel-case/dist.es2015/index.js
+/**
+ * Returns the entity records permissions for the given entity record ids.
+ */
+const getEntityRecordsPermissions = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (0,external_wp_data_namespaceObject.createSelector)((state, kind, name, ids) => {
+ const normalizedIds = Array.isArray(ids) ? ids : [ids];
+ return normalizedIds.map(id => ({
+ delete: select(STORE_NAME).canUser('delete', {
+ kind,
+ name,
+ id
+ }),
+ update: select(STORE_NAME).canUser('update', {
+ kind,
+ name,
+ id
+ })
+ }));
+}, state => [state.userPermissions]));
+
+/**
+ * Returns the entity record permissions for the given entity record id.
+ *
+ * @param state Data state.
+ * @param kind Entity kind.
+ * @param name Entity name.
+ * @param id Entity record id.
+ *
+ * @return The entity record permissions.
+ */
+function getEntityRecordPermissions(state, kind, name, id) {
+ return getEntityRecordsPermissions(state, kind, name, id)[0];
+}
+
+/**
+ * Returns the registered post meta fields for a given post type.
+ *
+ * @param state Data state.
+ * @param postType Post type.
+ *
+ * @return Registered post meta fields.
+ */
+function getRegisteredPostMeta(state, postType) {
+ var _state$registeredPost;
+ return (_state$registeredPost = state.registeredPostMeta?.[postType]) !== null && _state$registeredPost !== void 0 ? _state$registeredPost : {};
+}
+function normalizePageId(value) {
+ if (!value || !['number', 'string'].includes(typeof value)) {
+ return null;
+ }
+
+ // We also need to check if it's not zero (`'0'`).
+ if (Number(value) === 0) {
+ return null;
+ }
+ return value.toString();
+}
+const getHomePage = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (0,external_wp_data_namespaceObject.createSelector)(() => {
+ const siteData = select(STORE_NAME).getEntityRecord('root', '__unstableBase');
+ if (!siteData) {
+ return null;
+ }
+ const homepageId = siteData?.show_on_front === 'page' ? normalizePageId(siteData.page_on_front) : null;
+ if (homepageId) {
+ return {
+ postType: 'page',
+ postId: homepageId
+ };
+ }
+ const frontPageTemplateId = select(STORE_NAME).getDefaultTemplateId({
+ slug: 'front-page'
+ });
+ return {
+ postType: 'wp_template',
+ postId: frontPageTemplateId
+ };
+}, state => [getEntityRecord(state, 'root', '__unstableBase'), getDefaultTemplateId(state, {
+ slug: 'front-page'
+})]));
+const getPostsPageId = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => () => {
+ const siteData = select(STORE_NAME).getEntityRecord('root', '__unstableBase');
+ return siteData?.show_on_front === 'page' ? normalizePageId(siteData.page_for_posts) : null;
+});
+const getTemplateId = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, postType, postId) => {
+ const homepage = unlock(select(STORE_NAME)).getHomePage();
+ if (!homepage) {
+ return;
+ }
+
+ // For the front page, we always use the front page template if existing.
+ if (postType === 'page' && postType === homepage?.postType && postId.toString() === homepage?.postId) {
+ // The /lookup endpoint cannot currently handle a lookup
+ // when a page is set as the front page, so specifically in
+ // that case, we want to check if there is a front page
+ // template, and instead of falling back to the home
+ // template, we want to fall back to the page template.
+ const templates = select(STORE_NAME).getEntityRecords('postType', 'wp_template', {
+ per_page: -1
+ });
+ if (!templates) {
+ return;
+ }
+ const id = templates.find(({
+ slug
+ }) => slug === 'front-page')?.id;
+ if (id) {
+ return id;
+ }
+ // If no front page template is found, continue with the
+ // logic below (fetching the page template).
+ }
+ const editedEntity = select(STORE_NAME).getEditedEntityRecord('postType', postType, postId);
+ if (!editedEntity) {
+ return;
+ }
+ const postsPageId = unlock(select(STORE_NAME)).getPostsPageId();
+ // Check if the current page is the posts page.
+ if (postType === 'page' && postsPageId === postId.toString()) {
+ return select(STORE_NAME).getDefaultTemplateId({
+ slug: 'home'
+ });
+ }
+ // First see if the post/page has an assigned template and fetch it.
+ const currentTemplateSlug = editedEntity.template;
+ if (currentTemplateSlug) {
+ const currentTemplate = select(STORE_NAME).getEntityRecords('postType', 'wp_template', {
+ per_page: -1
+ })?.find(({
+ slug
+ }) => slug === currentTemplateSlug);
+ if (currentTemplate) {
+ return currentTemplate.id;
+ }
+ }
+ // If no template is assigned, use the default template.
+ let slugToCheck;
+ // In `draft` status we might not have a slug available, so we use the `single`
+ // post type templates slug(ex page, single-post, single-product etc..).
+ // Pages do not need the `single` prefix in the slug to be prioritized
+ // through template hierarchy.
+ if (editedEntity.slug) {
+ slugToCheck = postType === 'page' ? `${postType}-${editedEntity.slug}` : `single-${postType}-${editedEntity.slug}`;
+ } else {
+ slugToCheck = postType === 'page' ? 'page' : `single-${postType}`;
+ }
+ return select(STORE_NAME).getDefaultTemplateId({
+ slug: slugToCheck
+ });
+});
+
+;// ./node_modules/@wordpress/core-data/node_modules/uuid/dist/esm-browser/native.js
+const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
+/* harmony default export */ const esm_browser_native = ({
+ randomUUID
+});
+;// ./node_modules/@wordpress/core-data/node_modules/uuid/dist/esm-browser/rng.js
+// Unique ID creation requires a high quality random # generator. In the browser we therefore
+// require the crypto API and do not support built-in fallback to lower quality random number
+// generators (like Math.random()).
+let getRandomValues;
+const rnds8 = new Uint8Array(16);
+function rng() {
+ // lazy load so that environments that need to polyfill have a chance to do so
+ if (!getRandomValues) {
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
+
+ if (!getRandomValues) {
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
+ }
+ }
+
+ return getRandomValues(rnds8);
+}
+;// ./node_modules/@wordpress/core-data/node_modules/uuid/dist/esm-browser/stringify.js
+
+/**
+ * Convert array of 16 byte values to UUID string format of the form:
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ */
+
+const byteToHex = [];
+
+for (let i = 0; i < 256; ++i) {
+ byteToHex.push((i + 0x100).toString(16).slice(1));
+}
+
+function unsafeStringify(arr, offset = 0) {
+ // Note: Be careful editing this code! It's been tuned for performance
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
+ return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
+}
+
+function stringify(arr, offset = 0) {
+ const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one
+ // of the following:
+ // - One or more input array values don't map to a hex octet (leading to
+ // "undefined" in the uuid)
+ // - Invalid input values for the RFC `version` or `variant` fields
+
+ if (!validate(uuid)) {
+ throw TypeError('Stringified UUID is invalid');
+ }
+
+ return uuid;
+}
+
+/* harmony default export */ const esm_browser_stringify = ((/* unused pure expression or super */ null && (stringify)));
+;// ./node_modules/@wordpress/core-data/node_modules/uuid/dist/esm-browser/v4.js
+
+
+
+
+function v4(options, buf, offset) {
+ if (esm_browser_native.randomUUID && !buf && !options) {
+ return esm_browser_native.randomUUID();
+ }
+
+ options = options || {};
+ const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
+
+ rnds[6] = rnds[6] & 0x0f | 0x40;
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
+
+ if (buf) {
+ offset = offset || 0;
+
+ for (let i = 0; i < 16; ++i) {
+ buf[offset + i] = rnds[i];
+ }
+
+ return buf;
+ }
+
+ return unsafeStringify(rnds);
+}
+
+/* harmony default export */ const esm_browser_v4 = (v4);
+;// ./node_modules/@wordpress/core-data/build-module/utils/get-nested-value.js
+/**
+ * Helper util to return a value from a certain path of the object.
+ * Path is specified as either:
+ * - a string of properties, separated by dots, for example: "x.y".
+ * - an array of properties, for example `[ 'x', 'y' ]`.
+ * You can also specify a default value in case the result is nullish.
+ *
+ * @param {Object} object Input object.
+ * @param {string|Array} path Path to the object property.
+ * @param {*} defaultValue Default value if the value at the specified path is undefined.
+ * @return {*} Value of the object property at the specified path.
+ */
+function getNestedValue(object, path, defaultValue) {
+ if (!object || typeof object !== 'object' || typeof path !== 'string' && !Array.isArray(path)) {
+ return object;
+ }
+ const normalizedPath = Array.isArray(path) ? path : path.split('.');
+ let value = object;
+ normalizedPath.forEach(fieldName => {
+ value = value?.[fieldName];
+ });
+ return value !== undefined ? value : defaultValue;
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/queried-data/actions.js
+/**
+ * Returns an action object used in signalling that items have been received.
+ *
+ * @param {Array} items Items received.
+ * @param {?Object} edits Optional edits to reset.
+ * @param {?Object} meta Meta information about pagination.
+ *
+ * @return {Object} Action object.
+ */
+function receiveItems(items, edits, meta) {
+ return {
+ type: 'RECEIVE_ITEMS',
+ items: Array.isArray(items) ? items : [items],
+ persistedEdits: edits,
+ meta
+ };
+}
+
+/**
+ * Returns an action object used in signalling that entity records have been
+ * deleted and they need to be removed from entities state.
+ *
+ * @param {string} kind Kind of the removed entities.
+ * @param {string} name Name of the removed entities.
+ * @param {Array|number|string} records Record IDs of the removed entities.
+ * @param {boolean} invalidateCache Controls whether we want to invalidate the cache.
+ * @return {Object} Action object.
+ */
+function removeItems(kind, name, records, invalidateCache = false) {
+ return {
+ type: 'REMOVE_ITEMS',
+ itemIds: Array.isArray(records) ? records : [records],
+ kind,
+ name,
+ invalidateCache
+ };
+}
+
+/**
+ * Returns an action object used in signalling that queried data has been
+ * received.
+ *
+ * @param {Array} items Queried items received.
+ * @param {?Object} query Optional query object.
+ * @param {?Object} edits Optional edits to reset.
+ * @param {?Object} meta Meta information about pagination.
+ *
+ * @return {Object} Action object.
+ */
+function receiveQueriedItems(items, query = {}, edits, meta) {
+ return {
+ ...receiveItems(items, edits, meta),
+ query
+ };
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/batch/default-processor.js
+/**
+ * WordPress dependencies
+ */
+
+
+/**
+ * Maximum number of requests to place in a single batch request. Obtained by
+ * sending a preflight OPTIONS request to /batch/v1/.
+ *
+ * @type {number?}
+ */
+let maxItems = null;
+function chunk(arr, chunkSize) {
+ const tmp = [...arr];
+ const cache = [];
+ while (tmp.length) {
+ cache.push(tmp.splice(0, chunkSize));
+ }
+ return cache;
+}
+
+/**
+ * Default batch processor. Sends its input requests to /batch/v1.
+ *
+ * @param {Array} requests List of API requests to perform at once.
+ *
+ * @return {Promise} Promise that resolves to a list of objects containing
+ * either `output` (if that request was successful) or `error`
+ * (if not ).
+ */
+async function defaultProcessor(requests) {
+ if (maxItems === null) {
+ const preflightResponse = await external_wp_apiFetch_default()({
+ path: '/batch/v1',
+ method: 'OPTIONS'
+ });
+ maxItems = preflightResponse.endpoints[0].args.requests.maxItems;
+ }
+ const results = [];
+
+ // @ts-ignore We would have crashed or never gotten to this point if we hadn't received the maxItems count.
+ for (const batchRequests of chunk(requests, maxItems)) {
+ const batchResponse = await external_wp_apiFetch_default()({
+ path: '/batch/v1',
+ method: 'POST',
+ data: {
+ validation: 'require-all-validate',
+ requests: batchRequests.map(request => ({
+ path: request.path,
+ body: request.data,
+ // Rename 'data' to 'body'.
+ method: request.method,
+ headers: request.headers
+ }))
+ }
+ });
+ let batchResults;
+ if (batchResponse.failed) {
+ batchResults = batchResponse.responses.map(response => ({
+ error: response?.body
+ }));
+ } else {
+ batchResults = batchResponse.responses.map(response => {
+ const result = {};
+ if (response.status >= 200 && response.status < 300) {
+ result.output = response.body;
+ } else {
+ result.error = response.body;
+ }
+ return result;
+ });
+ }
+ results.push(...batchResults);
+ }
+ return results;
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/batch/create-batch.js
+/**
+ * Internal dependencies
+ */
+
+
+/**
+ * Creates a batch, which can be used to combine multiple API requests into one
+ * API request using the WordPress batch processing API (/v1/batch).
+ *
+ * ```
+ * const batch = createBatch();
+ * const dunePromise = batch.add( {
+ * path: '/v1/books',
+ * method: 'POST',
+ * data: { title: 'Dune' }
+ * } );
+ * const lotrPromise = batch.add( {
+ * path: '/v1/books',
+ * method: 'POST',
+ * data: { title: 'Lord of the Rings' }
+ * } );
+ * const isSuccess = await batch.run(); // Sends one POST to /v1/batch.
+ * if ( isSuccess ) {
+ * console.log(
+ * 'Saved two books:',
+ * await dunePromise,
+ * await lotrPromise
+ * );
+ * }
+ * ```
+ *
+ * @param {Function} [processor] Processor function. Can be used to replace the
+ * default functionality which is to send an API
+ * request to /v1/batch. Is given an array of
+ * inputs and must return a promise that
+ * resolves to an array of objects containing
+ * either `output` or `error`.
+ */
+function createBatch(processor = defaultProcessor) {
+ let lastId = 0;
+ /** @type {Array<{ input: any; resolve: ( value: any ) => void; reject: ( error: any ) => void }>} */
+ let queue = [];
+ const pending = new ObservableSet();
+ return {
+ /**
+ * Adds an input to the batch and returns a promise that is resolved or
+ * rejected when the input is processed by `batch.run()`.
+ *
+ * You may also pass a thunk which allows inputs to be added
+ * asynchronously.
+ *
+ * ```
+ * // Both are allowed:
+ * batch.add( { path: '/v1/books', ... } );
+ * batch.add( ( add ) => add( { path: '/v1/books', ... } ) );
+ * ```
+ *
+ * If a thunk is passed, `batch.run()` will pause until either:
+ *
+ * - The thunk calls its `add` argument, or;
+ * - The thunk returns a promise and that promise resolves, or;
+ * - The thunk returns a non-promise.
+ *
+ * @param {any|Function} inputOrThunk Input to add or thunk to execute.
+ *
+ * @return {Promise|any} If given an input, returns a promise that
+ * is resolved or rejected when the batch is
+ * processed. If given a thunk, returns the return
+ * value of that thunk.
+ */
+ add(inputOrThunk) {
+ const id = ++lastId;
+ pending.add(id);
+ const add = input => new Promise((resolve, reject) => {
+ queue.push({
+ input,
+ resolve,
+ reject
+ });
+ pending.delete(id);
+ });
+ if (typeof inputOrThunk === 'function') {
+ return Promise.resolve(inputOrThunk(add)).finally(() => {
+ pending.delete(id);
+ });
+ }
+ return add(inputOrThunk);
+ },
+ /**
+ * Runs the batch. This calls `batchProcessor` and resolves or rejects
+ * all promises returned by `add()`.
+ *
+ * @return {Promise<boolean>} A promise that resolves to a boolean that is true
+ * if the processor returned no errors.
+ */
+ async run() {
+ if (pending.size) {
+ await new Promise(resolve => {
+ const unsubscribe = pending.subscribe(() => {
+ if (!pending.size) {
+ unsubscribe();
+ resolve(undefined);
+ }
+ });
+ });
+ }
+ let results;
+ try {
+ results = await processor(queue.map(({
+ input
+ }) => input));
+ if (results.length !== queue.length) {
+ throw new Error('run: Array returned by processor must be same size as input array.');
+ }
+ } catch (error) {
+ for (const {
+ reject
+ } of queue) {
+ reject(error);
+ }
+ throw error;
+ }
+ let isSuccess = true;
+ results.forEach((result, key) => {
+ const queueItem = queue[key];
+ if (result?.error) {
+ queueItem?.reject(result.error);
+ isSuccess = false;
+ } else {
+ var _result$output;
+ queueItem?.resolve((_result$output = result?.output) !== null && _result$output !== void 0 ? _result$output : result);
+ }
+ });
+ queue = [];
+ return isSuccess;
+ }
+ };
+}
+class ObservableSet {
+ constructor(...args) {
+ this.set = new Set(...args);
+ this.subscribers = new Set();
+ }
+ get size() {
+ return this.set.size;
+ }
+ add(value) {
+ this.set.add(value);
+ this.subscribers.forEach(subscriber => subscriber());
+ return this;
+ }
+ delete(value) {
+ const isSuccess = this.set.delete(value);
+ this.subscribers.forEach(subscriber => subscriber());
+ return isSuccess;
+ }
+ subscribe(subscriber) {
+ this.subscribers.add(subscriber);
+ return () => {
+ this.subscribers.delete(subscriber);
+ };
+ }
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/actions.js
+/**
+ * External dependencies
+ */
+
+
+
+/**
+ * WordPress dependencies
+ */
+
+
+
+
+/**
+ * Internal dependencies
+ */
+
+
+
+
+
+
+
+/**
+ * Returns an action object used in signalling that authors have been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {string} queryID Query ID.
+ * @param {Array|Object} users Users received.
+ *
+ * @return {Object} Action object.
+ */
+function receiveUserQuery(queryID, users) {
+ return {
+ type: 'RECEIVE_USER_QUERY',
+ users: Array.isArray(users) ? users : [users],
+ queryID
+ };
+}
+
+/**
+ * Returns an action used in signalling that the current user has been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {Object} currentUser Current user object.
+ *
+ * @return {Object} Action object.
+ */
+function receiveCurrentUser(currentUser) {
+ return {
+ type: 'RECEIVE_CURRENT_USER',
+ currentUser
+ };
+}
+
+/**
+ * Returns an action object used in adding new entities.
+ *
+ * @param {Array} entities Entities received.
+ *
+ * @return {Object} Action object.
+ */
+function addEntities(entities) {
+ return {
+ type: 'ADD_ENTITIES',
+ entities
+ };
+}
+
+/**
+ * Returns an action object used in signalling that entity records have been received.
+ *
+ * @param {string} kind Kind of the received entity record.
+ * @param {string} name Name of the received entity record.
+ * @param {Array|Object} records Records received.
+ * @param {?Object} query Query Object.
+ * @param {?boolean} invalidateCache Should invalidate query caches.
+ * @param {?Object} edits Edits to reset.
+ * @param {?Object} meta Meta information about pagination.
+ * @return {Object} Action object.
+ */
+function receiveEntityRecords(kind, name, records, query, invalidateCache = false, edits, meta) {
+ // Auto drafts should not have titles, but some plugins rely on them so we can't filter this
+ // on the server.
+ if (kind === 'postType') {
+ records = (Array.isArray(records) ? records : [records]).map(record => record.status === 'auto-draft' ? {
+ ...record,
+ title: ''
+ } : record);
+ }
+ let action;
+ if (query) {
+ action = receiveQueriedItems(records, query, edits, meta);
+ } else {
+ action = receiveItems(records, edits, meta);
+ }
+ return {
+ ...action,
+ kind,
+ name,
+ invalidateCache
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the current theme has been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {Object} currentTheme The current theme.
+ *
+ * @return {Object} Action object.
+ */
+function receiveCurrentTheme(currentTheme) {
+ return {
+ type: 'RECEIVE_CURRENT_THEME',
+ currentTheme
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the current global styles id has been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {string} currentGlobalStylesId The current global styles id.
+ *
+ * @return {Object} Action object.
+ */
+function __experimentalReceiveCurrentGlobalStylesId(currentGlobalStylesId) {
+ return {
+ type: 'RECEIVE_CURRENT_GLOBAL_STYLES_ID',
+ id: currentGlobalStylesId
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the theme base global styles have been received
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {string} stylesheet The theme's identifier
+ * @param {Object} globalStyles The global styles object.
+ *
+ * @return {Object} Action object.
+ */
+function __experimentalReceiveThemeBaseGlobalStyles(stylesheet, globalStyles) {
+ return {
+ type: 'RECEIVE_THEME_GLOBAL_STYLES',
+ stylesheet,
+ globalStyles
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the theme global styles variations have been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {string} stylesheet The theme's identifier
+ * @param {Array} variations The global styles variations.
+ *
+ * @return {Object} Action object.
+ */
+function __experimentalReceiveThemeGlobalStyleVariations(stylesheet, variations) {
+ return {
+ type: 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS',
+ stylesheet,
+ variations
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the index has been received.
+ *
+ * @deprecated since WP 5.9, this is not useful anymore, use the selector directly.
+ *
+ * @return {Object} Action object.
+ */
+function receiveThemeSupports() {
+ external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveThemeSupports", {
+ since: '5.9'
+ });
+ return {
+ type: 'DO_NOTHING'
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the theme global styles CPT post revisions have been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @deprecated since WordPress 6.5.0. Callers should use `dispatch( 'core' ).receiveRevision` instead.
+ *
+ * @ignore
+ *
+ * @param {number} currentId The post id.
+ * @param {Array} revisions The global styles revisions.
+ *
+ * @return {Object} Action object.
+ */
+function receiveThemeGlobalStyleRevisions(currentId, revisions) {
+ external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveThemeGlobalStyleRevisions()", {
+ since: '6.5.0',
+ alternative: "wp.data.dispatch( 'core' ).receiveRevisions"
+ });
+ return {
+ type: 'RECEIVE_THEME_GLOBAL_STYLE_REVISIONS',
+ currentId,
+ revisions
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the preview data for
+ * a given URl has been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {string} url URL to preview the embed for.
+ * @param {*} preview Preview data.
+ *
+ * @return {Object} Action object.
+ */
+function receiveEmbedPreview(url, preview) {
+ return {
+ type: 'RECEIVE_EMBED_PREVIEW',
+ url,
+ preview
+ };
+}
+
+/**
+ * Action triggered to delete an entity record.
+ *
+ * @param {string} kind Kind of the deleted entity.
+ * @param {string} name Name of the deleted entity.
+ * @param {number|string} recordId Record ID of the deleted entity.
+ * @param {?Object} query Special query parameters for the
+ * DELETE API call.
+ * @param {Object} [options] Delete options.
+ * @param {Function} [options.__unstableFetch] Internal use only. Function to
+ * call instead of `apiFetch()`.
+ * Must return a promise.
+ * @param {boolean} [options.throwOnError=false] If false, this action suppresses all
+ * the exceptions. Defaults to false.
+ */
+const deleteEntityRecord = (kind, name, recordId, query, {
+ __unstableFetch = (external_wp_apiFetch_default()),
+ throwOnError = false
+} = {}) => async ({
+ dispatch,
+ resolveSelect
+}) => {
+ const configs = await resolveSelect.getEntitiesConfig(kind);
+ const entityConfig = configs.find(config => config.kind === kind && config.name === name);
+ let error;
+ let deletedRecord = false;
+ if (!entityConfig) {
+ return;
+ }
+ const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, recordId], {
+ exclusive: true
+ });
+ try {
+ dispatch({
+ type: 'DELETE_ENTITY_RECORD_START',
+ kind,
+ name,
+ recordId
+ });
+ let hasError = false;
+ try {
+ let path = `${entityConfig.baseURL}/${recordId}`;
+ if (query) {
+ path = (0,external_wp_url_namespaceObject.addQueryArgs)(path, query);
+ }
+ deletedRecord = await __unstableFetch({
+ path,
+ method: 'DELETE'
+ });
+ await dispatch(removeItems(kind, name, recordId, true));
+ } catch (_error) {
+ hasError = true;
+ error = _error;
+ }
+ dispatch({
+ type: 'DELETE_ENTITY_RECORD_FINISH',
+ kind,
+ name,
+ recordId,
+ error
+ });
+ if (hasError && throwOnError) {
+ throw error;
+ }
+ return deletedRecord;
+ } finally {
+ dispatch.__unstableReleaseStoreLock(lock);
+ }
+};
+
+/**
+ * Returns an action object that triggers an
+ * edit to an entity record.
+ *
+ * @param {string} kind Kind of the edited entity record.
+ * @param {string} name Name of the edited entity record.
+ * @param {number|string} recordId Record ID of the edited entity record.
+ * @param {Object} edits The edits.
+ * @param {Object} options Options for the edit.
+ * @param {boolean} [options.undoIgnore] Whether to ignore the edit in undo history or not.
+ *
+ * @return {Object} Action object.
+ */
+const editEntityRecord = (kind, name, recordId, edits, options = {}) => ({
+ select,
+ dispatch
+}) => {
+ const entityConfig = select.getEntityConfig(kind, name);
+ if (!entityConfig) {
+ throw new Error(`The entity being edited (${kind}, ${name}) does not have a loaded config.`);
+ }
+ const {
+ mergedEdits = {}
+ } = entityConfig;
+ const record = select.getRawEntityRecord(kind, name, recordId);
+ const editedRecord = select.getEditedEntityRecord(kind, name, recordId);
+ const edit = {
+ kind,
+ name,
+ recordId,
+ // Clear edits when they are equal to their persisted counterparts
+ // so that the property is not considered dirty.
+ edits: Object.keys(edits).reduce((acc, key) => {
+ const recordValue = record[key];
+ const editedRecordValue = editedRecord[key];
+ const value = mergedEdits[key] ? {
+ ...editedRecordValue,
+ ...edits[key]
+ } : edits[key];
+ acc[key] = es6_default()(recordValue, value) ? undefined : value;
+ return acc;
+ }, {})
+ };
+ if (window.__experimentalEnableSync && entityConfig.syncConfig) {
+ if (false) {}
+ } else {
+ if (!options.undoIgnore) {
+ select.getUndoManager().addRecord([{
+ id: {
+ kind,
+ name,
+ recordId
+ },
+ changes: Object.keys(edits).reduce((acc, key) => {
+ acc[key] = {
+ from: editedRecord[key],
+ to: edits[key]
+ };
+ return acc;
+ }, {})
+ }], options.isCached);
+ }
+ dispatch({
+ type: 'EDIT_ENTITY_RECORD',
+ ...edit
+ });
+ }
+};
+
+/**
+ * Action triggered to undo the last edit to
+ * an entity record, if any.
+ */
+const undo = () => ({
+ select,
+ dispatch
+}) => {
+ const undoRecord = select.getUndoManager().undo();
+ if (!undoRecord) {
+ return;
+ }
+ dispatch({
+ type: 'UNDO',
+ record: undoRecord
+ });
+};
+
+/**
+ * Action triggered to redo the last undone
+ * edit to an entity record, if any.
+ */
+const redo = () => ({
+ select,
+ dispatch
+}) => {
+ const redoRecord = select.getUndoManager().redo();
+ if (!redoRecord) {
+ return;
+ }
+ dispatch({
+ type: 'REDO',
+ record: redoRecord
+ });
+};
+
+/**
+ * Forces the creation of a new undo level.
+ *
+ * @return {Object} Action object.
+ */
+const __unstableCreateUndoLevel = () => ({
+ select
+}) => {
+ select.getUndoManager().addRecord();
+};
+
+/**
+ * Action triggered to save an entity record.
+ *
+ * @param {string} kind Kind of the received entity.
+ * @param {string} name Name of the received entity.
+ * @param {Object} record Record to be saved.
+ * @param {Object} options Saving options.
+ * @param {boolean} [options.isAutosave=false] Whether this is an autosave.
+ * @param {Function} [options.__unstableFetch] Internal use only. Function to
+ * call instead of `apiFetch()`.
+ * Must return a promise.
+ * @param {boolean} [options.throwOnError=false] If false, this action suppresses all
+ * the exceptions. Defaults to false.
+ */
+const saveEntityRecord = (kind, name, record, {
+ isAutosave = false,
+ __unstableFetch = (external_wp_apiFetch_default()),
+ throwOnError = false
+} = {}) => async ({
+ select,
+ resolveSelect,
+ dispatch
+}) => {
+ const configs = await resolveSelect.getEntitiesConfig(kind);
+ const entityConfig = configs.find(config => config.kind === kind && config.name === name);
+ if (!entityConfig) {
+ return;
+ }
+ const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY;
+ const recordId = record[entityIdKey];
+ const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, recordId || esm_browser_v4()], {
+ exclusive: true
+ });
+ try {
+ // Evaluate optimized edits.
+ // (Function edits that should be evaluated on save to avoid expensive computations on every edit.)
+ for (const [key, value] of Object.entries(record)) {
+ if (typeof value === 'function') {
+ const evaluatedValue = value(select.getEditedEntityRecord(kind, name, recordId));
+ dispatch.editEntityRecord(kind, name, recordId, {
+ [key]: evaluatedValue
+ }, {
+ undoIgnore: true
+ });
+ record[key] = evaluatedValue;
+ }
+ }
+ dispatch({
+ type: 'SAVE_ENTITY_RECORD_START',
+ kind,
+ name,
+ recordId,
+ isAutosave
+ });
+ let updatedRecord;
+ let error;
+ let hasError = false;
+ try {
+ const path = `${entityConfig.baseURL}${recordId ? '/' + recordId : ''}`;
+ const persistedRecord = select.getRawEntityRecord(kind, name, recordId);
+ if (isAutosave) {
+ // Most of this autosave logic is very specific to posts.
+ // This is fine for now as it is the only supported autosave,
+ // but ideally this should all be handled in the back end,
+ // so the client just sends and receives objects.
+ const currentUser = select.getCurrentUser();
+ const currentUserId = currentUser ? currentUser.id : undefined;
+ const autosavePost = await resolveSelect.getAutosave(persistedRecord.type, persistedRecord.id, currentUserId);
+ // Autosaves need all expected fields to be present.
+ // So we fallback to the previous autosave and then
+ // to the actual persisted entity if the edits don't
+ // have a value.
+ let data = {
+ ...persistedRecord,
+ ...autosavePost,
+ ...record
+ };
+ data = Object.keys(data).reduce((acc, key) => {
+ if (['title', 'excerpt', 'content', 'meta'].includes(key)) {
+ acc[key] = data[key];
+ }
+ return acc;
+ }, {
+ // Do not update the `status` if we have edited it when auto saving.
+ // It's very important to let the user explicitly save this change,
+ // because it can lead to unexpected results. An example would be to
+ // have a draft post and change the status to publish.
+ status: data.status === 'auto-draft' ? 'draft' : undefined
+ });
+ updatedRecord = await __unstableFetch({
+ path: `${path}/autosaves`,
+ method: 'POST',
+ data
+ });
+
+ // An autosave may be processed by the server as a regular save
+ // when its update is requested by the author and the post had
+ // draft or auto-draft status.
+ if (persistedRecord.id === updatedRecord.id) {
+ let newRecord = {
+ ...persistedRecord,
+ ...data,
+ ...updatedRecord
+ };
+ newRecord = Object.keys(newRecord).reduce((acc, key) => {
+ // These properties are persisted in autosaves.
+ if (['title', 'excerpt', 'content'].includes(key)) {
+ acc[key] = newRecord[key];
+ } else if (key === 'status') {
+ // Status is only persisted in autosaves when going from
+ // "auto-draft" to "draft".
+ acc[key] = persistedRecord.status === 'auto-draft' && newRecord.status === 'draft' ? newRecord.status : persistedRecord.status;
+ } else {
+ // These properties are not persisted in autosaves.
+ acc[key] = persistedRecord[key];
+ }
+ return acc;
+ }, {});
+ dispatch.receiveEntityRecords(kind, name, newRecord, undefined, true);
+ } else {
+ dispatch.receiveAutosaves(persistedRecord.id, updatedRecord);
+ }
+ } else {
+ let edits = record;
+ if (entityConfig.__unstablePrePersist) {
+ edits = {
+ ...edits,
+ ...entityConfig.__unstablePrePersist(persistedRecord, edits)
+ };
+ }
+ updatedRecord = await __unstableFetch({
+ path,
+ method: recordId ? 'PUT' : 'POST',
+ data: edits
+ });
+ dispatch.receiveEntityRecords(kind, name, updatedRecord, undefined, true, edits);
+ }
+ } catch (_error) {
+ hasError = true;
+ error = _error;
+ }
+ dispatch({
+ type: 'SAVE_ENTITY_RECORD_FINISH',
+ kind,
+ name,
+ recordId,
+ error,
+ isAutosave
+ });
+ if (hasError && throwOnError) {
+ throw error;
+ }
+ return updatedRecord;
+ } finally {
+ dispatch.__unstableReleaseStoreLock(lock);
+ }
+};
+
+/**
+ * Runs multiple core-data actions at the same time using one API request.
+ *
+ * Example:
+ *
+ * ```
+ * const [ savedRecord, updatedRecord, deletedRecord ] =
+ * await dispatch( 'core' ).__experimentalBatch( [
+ * ( { saveEntityRecord } ) => saveEntityRecord( 'root', 'widget', widget ),
+ * ( { saveEditedEntityRecord } ) => saveEntityRecord( 'root', 'widget', 123 ),
+ * ( { deleteEntityRecord } ) => deleteEntityRecord( 'root', 'widget', 123, null ),
+ * ] );
+ * ```
+ *
+ * @param {Array} requests Array of functions which are invoked simultaneously.
+ * Each function is passed an object containing
+ * `saveEntityRecord`, `saveEditedEntityRecord`, and
+ * `deleteEntityRecord`.
+ *
+ * @return {(thunkArgs: Object) => Promise} A promise that resolves to an array containing the return
+ * values of each function given in `requests`.
+ */
+const __experimentalBatch = requests => async ({
+ dispatch
+}) => {
+ const batch = createBatch();
+ const api = {
+ saveEntityRecord(kind, name, record, options) {
+ return batch.add(add => dispatch.saveEntityRecord(kind, name, record, {
+ ...options,
+ __unstableFetch: add
+ }));
+ },
+ saveEditedEntityRecord(kind, name, recordId, options) {
+ return batch.add(add => dispatch.saveEditedEntityRecord(kind, name, recordId, {
+ ...options,
+ __unstableFetch: add
+ }));
+ },
+ deleteEntityRecord(kind, name, recordId, query, options) {
+ return batch.add(add => dispatch.deleteEntityRecord(kind, name, recordId, query, {
+ ...options,
+ __unstableFetch: add
+ }));
+ }
+ };
+ const resultPromises = requests.map(request => request(api));
+ const [, ...results] = await Promise.all([batch.run(), ...resultPromises]);
+ return results;
+};
+
+/**
+ * Action triggered to save an entity record's edits.
+ *
+ * @param {string} kind Kind of the entity.
+ * @param {string} name Name of the entity.
+ * @param {Object} recordId ID of the record.
+ * @param {Object=} options Saving options.
+ */
+const saveEditedEntityRecord = (kind, name, recordId, options) => async ({
+ select,
+ dispatch,
+ resolveSelect
+}) => {
+ if (!select.hasEditsForEntityRecord(kind, name, recordId)) {
+ return;
+ }
+ const configs = await resolveSelect.getEntitiesConfig(kind);
+ const entityConfig = configs.find(config => config.kind === kind && config.name === name);
+ if (!entityConfig) {
+ return;
+ }
+ const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY;
+ const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId);
+ const record = {
+ [entityIdKey]: recordId,
+ ...edits
+ };
+ return await dispatch.saveEntityRecord(kind, name, record, options);
+};
+
+/**
+ * Action triggered to save only specified properties for the entity.
+ *
+ * @param {string} kind Kind of the entity.
+ * @param {string} name Name of the entity.
+ * @param {number|string} recordId ID of the record.
+ * @param {Array} itemsToSave List of entity properties or property paths to save.
+ * @param {Object} options Saving options.
+ */
+const __experimentalSaveSpecifiedEntityEdits = (kind, name, recordId, itemsToSave, options) => async ({
+ select,
+ dispatch,
+ resolveSelect
+}) => {
+ if (!select.hasEditsForEntityRecord(kind, name, recordId)) {
+ return;
+ }
+ const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId);
+ const editsToSave = {};
+ for (const item of itemsToSave) {
+ setNestedValue(editsToSave, item, getNestedValue(edits, item));
+ }
+ const configs = await resolveSelect.getEntitiesConfig(kind);
+ const entityConfig = configs.find(config => config.kind === kind && config.name === name);
+ const entityIdKey = entityConfig?.key || DEFAULT_ENTITY_KEY;
+
+ // If a record key is provided then update the existing record.
+ // This necessitates providing `recordKey` to saveEntityRecord as part of the
+ // `record` argument (here called `editsToSave`) to stop that action creating
+ // a new record and instead cause it to update the existing record.
+ if (recordId) {
+ editsToSave[entityIdKey] = recordId;
+ }
+ return await dispatch.saveEntityRecord(kind, name, editsToSave, options);
+};
+
+/**
+ * Returns an action object used in signalling that Upload permissions have been received.
+ *
+ * @deprecated since WP 5.9, use receiveUserPermission instead.
+ *
+ * @param {boolean} hasUploadPermissions Does the user have permission to upload files?
+ *
+ * @return {Object} Action object.
+ */
+function receiveUploadPermissions(hasUploadPermissions) {
+ external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveUploadPermissions", {
+ since: '5.9',
+ alternative: 'receiveUserPermission'
+ });
+ return receiveUserPermission('create/media', hasUploadPermissions);
+}
+
+/**
+ * Returns an action object used in signalling that the current user has
+ * permission to perform an action on a REST resource.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {string} key A key that represents the action and REST resource.
+ * @param {boolean} isAllowed Whether or not the user can perform the action.
+ *
+ * @return {Object} Action object.
+ */
+function receiveUserPermission(key, isAllowed) {
+ return {
+ type: 'RECEIVE_USER_PERMISSION',
+ key,
+ isAllowed
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the current user has
+ * permission to perform an action on a REST resource. Ignored from
+ * documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {Object<string, boolean>} permissions An object where keys represent
+ * actions and REST resources, and
+ * values indicate whether the user
+ * is allowed to perform the
+ * action.
+ *
+ * @return {Object} Action object.
+ */
+function receiveUserPermissions(permissions) {
+ return {
+ type: 'RECEIVE_USER_PERMISSIONS',
+ permissions
+ };
+}
+
+/**
+ * Returns an action object used in signalling that the autosaves for a
+ * post have been received.
+ * Ignored from documentation as it's internal to the data store.
+ *
+ * @ignore
+ *
+ * @param {number} postId The id of the post that is parent to the autosave.
+ * @param {Array|Object} autosaves An array of autosaves or singular autosave object.
+ *
+ * @return {Object} Action object.
+ */
+function receiveAutosaves(postId, autosaves) {
+ return {
+ type: 'RECEIVE_AUTOSAVES',
+ postId,
+ autosaves: Array.isArray(autosaves) ? autosaves : [autosaves]
+ };
+}
+
+/**
+ * Returns an action object signalling that the fallback Navigation
+ * Menu id has been received.
+ *
+ * @param {integer} fallbackId the id of the fallback Navigation Menu
+ * @return {Object} Action object.
+ */
+function receiveNavigationFallbackId(fallbackId) {
+ return {
+ type: 'RECEIVE_NAVIGATION_FALLBACK_ID',
+ fallbackId
+ };
+}
+
+/**
+ * Returns an action object used to set the template for a given query.
+ *
+ * @param {Object} query The lookup query.
+ * @param {string} templateId The resolved template id.
+ *
+ * @return {Object} Action object.
+ */
+function receiveDefaultTemplateId(query, templateId) {
+ return {
+ type: 'RECEIVE_DEFAULT_TEMPLATE',
+ query,
+ templateId
+ };
+}
+
+/**
+ * Action triggered to receive revision items.
+ *
+ * @param {string} kind Kind of the received entity record revisions.
+ * @param {string} name Name of the received entity record revisions.
+ * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.
+ * @param {Array|Object} records Revisions received.
+ * @param {?Object} query Query Object.
+ * @param {?boolean} invalidateCache Should invalidate query caches.
+ * @param {?Object} meta Meta information about pagination.
+ */
+const receiveRevisions = (kind, name, recordKey, records, query, invalidateCache = false, meta) => async ({
+ dispatch,
+ resolveSelect
+}) => {
+ const configs = await resolveSelect.getEntitiesConfig(kind);
+ const entityConfig = configs.find(config => config.kind === kind && config.name === name);
+ const key = entityConfig && entityConfig?.revisionKey ? entityConfig.revisionKey : DEFAULT_ENTITY_KEY;
+ dispatch({
+ type: 'RECEIVE_ITEM_REVISIONS',
+ key,
+ items: Array.isArray(records) ? records : [records],
+ recordKey,
+ meta,
+ query,
+ kind,
+ name,
+ invalidateCache
+ });
+};
+
+;// ./node_modules/@wordpress/core-data/build-module/private-actions.js
+/**
+ * Returns an action object used in signalling that the registered post meta
+ * fields for a post type have been received.
+ *
+ * @param {string} postType Post type slug.
+ * @param {Object} registeredPostMeta Registered post meta.
+ *
+ * @return {Object} Action object.
+ */
+function receiveRegisteredPostMeta(postType, registeredPostMeta) {
+ return {
+ type: 'RECEIVE_REGISTERED_POST_META',
+ postType,
+ registeredPostMeta
+ };
+}
+
+;// ./node_modules/camel-case/dist.es2015/index.js
function camelCaseTransform(input, index) {
@@ -5462,9 +5684,9 @@
return pascalCase(input, __assign({ transform: camelCaseTransform }, options));
}
-;// CONCATENATED MODULE: external ["wp","htmlEntities"]
+;// external ["wp","htmlEntities"]
const external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"];
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/forward-resolver.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/forward-resolver.js
/**
* Higher-order function which forward the resolution to another resolver with the same arguments.
*
@@ -5479,7 +5701,10 @@
};
/* harmony default export */ const forward_resolver = (forwardResolver);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-link-suggestions.js
+;// ./node_modules/@wordpress/core-data/build-module/utils/receive-intermediate-results.js
+const RECEIVE_INTERMEDIATE_RESULTS = Symbol('RECEIVE_INTERMEDIATE_RESULTS');
+
+;// ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-link-suggestions.js
/**
* WordPress dependencies
*/
@@ -5487,63 +5712,15 @@
-
-/**
- * Filters the search by type
- *
- * @typedef { 'attachment' | 'post' | 'term' | 'post-format' } WPLinkSearchType
- */
-
-/**
- * A link with an id may be of kind post-type or taxonomy
- *
- * @typedef { 'post-type' | 'taxonomy' } WPKind
- */
-
-/**
- * @typedef WPLinkSearchOptions
- *
- * @property {boolean} [isInitialSuggestions] Displays initial search suggestions, when true.
- * @property {WPLinkSearchType} [type] Filters by search type.
- * @property {string} [subtype] Slug of the post-type or taxonomy.
- * @property {number} [page] Which page of results to return.
- * @property {number} [perPage] Search results per page.
- */
-
-/**
- * @typedef WPLinkSearchResult
- *
- * @property {number} id Post or term id.
- * @property {string} url Link url.
- * @property {string} title Title of the link.
- * @property {string} type The taxonomy or post type slug or type URL.
- * @property {WPKind} [kind] Link kind of post-type or taxonomy
- */
-
-/**
- * @typedef WPLinkSearchResultAugments
- *
- * @property {{kind: WPKind}} [meta] Contains kind information.
- * @property {WPKind} [subtype] Optional subtype if it exists.
- */
-
-/**
- * @typedef {WPLinkSearchResult & WPLinkSearchResultAugments} WPLinkSearchResultAugmented
- */
-
-/**
- * @typedef WPEditorSettings
- *
- * @property {boolean} [ disablePostFormats ] Disables post formats, when true.
- */
-
-/**
- * Fetches link suggestions from the API.
- *
- * @async
- * @param {string} search
- * @param {WPLinkSearchOptions} [searchOptions]
- * @param {WPEditorSettings} [settings]
+/**
+ * Fetches link suggestions from the WordPress API.
+ *
+ * WordPress does not support searching multiple tables at once, e.g. posts and terms, so we
+ * perform multiple queries at the same time and then merge the results together.
+ *
+ * @param search
+ * @param searchOptions
+ * @param editorSettings
*
* @example
* ```js
@@ -5558,31 +5735,22 @@
* searchOptions
* ) => fetchLinkSuggestions( search, searchOptions, settings );
* ```
- * @return {Promise< WPLinkSearchResult[] >} List of search suggestions
- */
-const fetchLinkSuggestions = async (search, searchOptions = {}, settings = {}) => {
+ */
+async function fetchLinkSuggestions(search, searchOptions = {}, editorSettings = {}) {
+ const searchOptionsToUse = searchOptions.isInitialSuggestions && searchOptions.initialSuggestionsSearchOptions ? {
+ ...searchOptions,
+ ...searchOptions.initialSuggestionsSearchOptions
+ } : searchOptions;
const {
- isInitialSuggestions = false,
- initialSuggestionsSearchOptions = undefined
- } = searchOptions;
+ type,
+ subtype,
+ page,
+ perPage = searchOptions.isInitialSuggestions ? 3 : 20
+ } = searchOptionsToUse;
const {
disablePostFormats = false
- } = settings;
- let {
- type = undefined,
- subtype = undefined,
- page = undefined,
- perPage = isInitialSuggestions ? 3 : 20
- } = searchOptions;
-
- /** @type {Promise<WPLinkSearchResult>[]} */
+ } = editorSettings;
const queries = [];
- if (isInitialSuggestions && initialSuggestionsSearchOptions) {
- type = initialSuggestionsSearchOptions.type || type;
- subtype = initialSuggestionsSearchOptions.subtype || subtype;
- page = initialSuggestionsSearchOptions.page || page;
- perPage = initialSuggestionsSearchOptions.perPage || perPage;
- }
if (!type || type === 'post') {
queries.push(external_wp_apiFetch_default()({
path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', {
@@ -5595,11 +5763,11 @@
}).then(results => {
return results.map(result => {
return {
- ...result,
- meta: {
- kind: 'post-type',
- subtype
- }
+ id: result.id,
+ url: result.url,
+ title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(result.title || '') || (0,external_wp_i18n_namespaceObject.__)('(no title)'),
+ type: result.subtype || result.type,
+ kind: 'post-type'
};
});
}).catch(() => []) // Fail by returning no results.
@@ -5617,11 +5785,11 @@
}).then(results => {
return results.map(result => {
return {
- ...result,
- meta: {
- kind: 'taxonomy',
- subtype
- }
+ id: result.id,
+ url: result.url,
+ title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(result.title || '') || (0,external_wp_i18n_namespaceObject.__)('(no title)'),
+ type: result.subtype || result.type,
+ kind: 'taxonomy'
};
});
}).catch(() => []) // Fail by returning no results.
@@ -5639,11 +5807,11 @@
}).then(results => {
return results.map(result => {
return {
- ...result,
- meta: {
- kind: 'taxonomy',
- subtype
- }
+ id: result.id,
+ url: result.url,
+ title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(result.title || '') || (0,external_wp_i18n_namespaceObject.__)('(no title)'),
+ type: result.subtype || result.type,
+ kind: 'taxonomy'
};
});
}).catch(() => []) // Fail by returning no results.
@@ -5659,42 +5827,75 @@
}).then(results => {
return results.map(result => {
return {
- ...result,
- meta: {
- kind: 'media'
- }
+ id: result.id,
+ url: result.source_url,
+ title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(result.title.rendered || '') || (0,external_wp_i18n_namespaceObject.__)('(no title)'),
+ type: result.type,
+ kind: 'media'
};
});
}).catch(() => []) // Fail by returning no results.
);
}
- return Promise.all(queries).then(results => {
- return results.reduce(( /** @type {WPLinkSearchResult[]} */accumulator, current) => accumulator.concat(current),
- // Flatten list.
- []).filter(
- /**
- * @param {{ id: number }} result
- */
- result => {
- return !!result.id;
- }).slice(0, perPage).map(( /** @type {WPLinkSearchResultAugmented} */result) => {
- const isMedia = result.type === 'attachment';
- return {
- id: result.id,
- // @ts-ignore fix when we make this a TS file
- url: isMedia ? result.source_url : result.url,
- title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(isMedia ?
- // @ts-ignore fix when we make this a TS file
- result.title.rendered : result.title || '') || (0,external_wp_i18n_namespaceObject.__)('(no title)'),
- type: result.subtype || result.type,
- kind: result?.meta?.kind
- };
- });
- });
-};
-/* harmony default export */ const _experimental_fetch_link_suggestions = (fetchLinkSuggestions);
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-url-data.js
+ const responses = await Promise.all(queries);
+ let results = responses.flat();
+ results = results.filter(result => !!result.id);
+ results = sortResults(results, search);
+ results = results.slice(0, perPage);
+ return results;
+}
+
+/**
+ * Sort search results by relevance to the given query.
+ *
+ * Sorting is necessary as we're querying multiple endpoints and merging the results. For example
+ * a taxonomy title might be more relevant than a post title, but by default taxonomy results will
+ * be ordered after all the (potentially irrelevant) post results.
+ *
+ * We sort by scoring each result, where the score is the number of tokens in the title that are
+ * also in the search query, divided by the total number of tokens in the title. This gives us a
+ * score between 0 and 1, where 1 is a perfect match.
+ *
+ * @param results
+ * @param search
+ */
+function sortResults(results, search) {
+ const searchTokens = tokenize(search);
+ const scores = {};
+ for (const result of results) {
+ if (result.title) {
+ const titleTokens = tokenize(result.title);
+ const exactMatchingTokens = titleTokens.filter(titleToken => searchTokens.some(searchToken => titleToken === searchToken));
+ const subMatchingTokens = titleTokens.filter(titleToken => searchTokens.some(searchToken => titleToken !== searchToken && titleToken.includes(searchToken)));
+
+ // The score is a combination of exact matches and sub-matches.
+ // More weight is given to exact matches, as they are more relevant (e.g. "cat" vs "caterpillar").
+ // Diving by the total number of tokens in the title normalizes the score and skews
+ // the results towards shorter titles.
+ const exactMatchScore = exactMatchingTokens.length / titleTokens.length * 10;
+ const subMatchScore = subMatchingTokens.length / titleTokens.length;
+ scores[result.id] = exactMatchScore + subMatchScore;
+ } else {
+ scores[result.id] = 0;
+ }
+ }
+ return results.sort((a, b) => scores[b.id] - scores[a.id]);
+}
+
+/**
+ * Turns text into an array of tokens, with whitespace and punctuation removed.
+ *
+ * For example, `"I'm having a ball."` becomes `[ "im", "having", "a", "ball" ]`.
+ *
+ * @param text
+ */
+function tokenize(text) {
+ // \p{L} matches any kind of letter from any language.
+ // \p{N} matches any kind of numeric character.
+ return text.toLowerCase().match(/[\p{L}\p{N}]+/gu) || [];
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-url-data.js
/**
* WordPress dependencies
*/
@@ -5720,7 +5921,7 @@
*
* @async
* @param {string} url the URL to request details from.
- * @param {Object?} options any options to pass to the underlying fetch.
+ * @param {?Object} options any options to pass to the underlying fetch.
* @example
* ```js
* import { __experimentalFetchUrlData as fetchUrlData } from '@wordpress/core-data';
@@ -5763,7 +5964,7 @@
};
/* harmony default export */ const _experimental_fetch_url_data = (fetchUrlData);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/index.js
+;// ./node_modules/@wordpress/core-data/build-module/fetch/index.js
/**
* External dependencies
*/
@@ -5785,7 +5986,7 @@
return restPatterns.map(pattern => Object.fromEntries(Object.entries(pattern).map(([key, value]) => [camelCase(key), value])));
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/resolvers.js
+;// ./node_modules/@wordpress/core-data/build-module/resolvers.js
/**
* External dependencies
*/
@@ -5847,11 +6048,13 @@
*/
const resolvers_getEntityRecord = (kind, name, key = '', query) => async ({
select,
- dispatch
+ dispatch,
+ registry,
+ resolveSelect
}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
+ const configs = await resolveSelect.getEntitiesConfig(kind);
const entityConfig = configs.find(config => config.name === name && config.kind === kind);
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
+ if (!entityConfig) {
return;
}
const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, key], {
@@ -5884,7 +6087,7 @@
...entityConfig.baseURLParams,
...query
});
- if (query !== undefined) {
+ if (query !== undefined && query._fields) {
query = {
...query,
include: [key]
@@ -5898,10 +6101,31 @@
return;
}
}
- const record = await external_wp_apiFetch_default()({
- path
+ const response = await external_wp_apiFetch_default()({
+ path,
+ parse: false
});
- dispatch.receiveEntityRecords(kind, name, record, query);
+ const record = await response.json();
+ const permissions = getUserPermissionsFromAllowHeader(response.headers?.get('allow'));
+ const canUserResolutionsArgs = [];
+ const receiveUserPermissionArgs = {};
+ for (const action of ALLOWED_RESOURCE_ACTIONS) {
+ receiveUserPermissionArgs[getUserPermissionCacheKey(action, {
+ kind,
+ name,
+ id: key
+ })] = permissions[action];
+ canUserResolutionsArgs.push([action, {
+ kind,
+ name,
+ id: key
+ }]);
+ }
+ registry.batch(() => {
+ dispatch.receiveEntityRecords(kind, name, record, query);
+ dispatch.receiveUserPermissions(receiveUserPermissionArgs);
+ dispatch.finishResolutions('canUser', canUserResolutionsArgs);
+ });
}
} finally {
dispatch.__unstableReleaseStoreLock(lock);
@@ -5923,21 +6147,26 @@
*
* @param {string} kind Entity kind.
* @param {string} name Entity name.
- * @param {Object?} query Query Object. If requesting specific fields, fields
+ * @param {?Object} query Query Object. If requesting specific fields, fields
* must always include the ID.
*/
const resolvers_getEntityRecords = (kind, name, query = {}) => async ({
dispatch,
- registry
+ registry,
+ resolveSelect
}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
+ const configs = await resolveSelect.getEntitiesConfig(kind);
const entityConfig = configs.find(config => config.name === name && config.kind === kind);
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
+ if (!entityConfig) {
return;
}
const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name], {
exclusive: false
});
+ const key = entityConfig.key || DEFAULT_ENTITY_KEY;
+ function getResolutionsArgs(records) {
+ return records.filter(record => record?.[key]).map(record => [kind, name, record[key]]);
+ }
try {
if (query._fields) {
// If requesting specific fields, items and query association to said
@@ -5952,7 +6181,8 @@
...entityConfig.baseURLParams,
...query
});
- let records, meta;
+ let records = [],
+ meta;
if (entityConfig.supportsPagination && query.per_page !== -1) {
const response = await external_wp_apiFetch_default()({
path,
@@ -5963,10 +6193,38 @@
totalItems: parseInt(response.headers.get('X-WP-Total')),
totalPages: parseInt(response.headers.get('X-WP-TotalPages'))
};
+ } else if (query.per_page === -1 && query[RECEIVE_INTERMEDIATE_RESULTS] === true) {
+ let page = 1;
+ let totalPages;
+ do {
+ const response = await external_wp_apiFetch_default()({
+ path: (0,external_wp_url_namespaceObject.addQueryArgs)(path, {
+ page,
+ per_page: 100
+ }),
+ parse: false
+ });
+ const pageRecords = Object.values(await response.json());
+ totalPages = parseInt(response.headers.get('X-WP-TotalPages'));
+ records.push(...pageRecords);
+ registry.batch(() => {
+ dispatch.receiveEntityRecords(kind, name, records, query);
+ dispatch.finishResolutions('getEntityRecord', getResolutionsArgs(pageRecords));
+ });
+ page++;
+ } while (page <= totalPages);
+ meta = {
+ totalItems: records.length,
+ totalPages: 1
+ };
} else {
records = Object.values(await external_wp_apiFetch_default()({
path
}));
+ meta = {
+ totalItems: records.length,
+ totalPages: 1
+ };
}
// If we request fields but the result doesn't contain the fields,
@@ -5985,22 +6243,34 @@
registry.batch(() => {
dispatch.receiveEntityRecords(kind, name, records, query, false, undefined, meta);
- // When requesting all fields, the list of results can be used to
- // resolve the `getEntityRecord` selector in addition to `getEntityRecords`.
+ // When requesting all fields, the list of results can be used to resolve
+ // the `getEntityRecord` and `canUser` selectors in addition to `getEntityRecords`.
// See https://github.com/WordPress/gutenberg/pull/26575
+ // See https://github.com/WordPress/gutenberg/pull/64504
if (!query?._fields && !query.context) {
- const key = entityConfig.key || DEFAULT_ENTITY_KEY;
- const resolutionsArgs = records.filter(record => record?.[key]).map(record => [kind, name, record[key]]);
- dispatch({
- type: 'START_RESOLUTIONS',
- selectorName: 'getEntityRecord',
- args: resolutionsArgs
- });
- dispatch({
- type: 'FINISH_RESOLUTIONS',
- selectorName: 'getEntityRecord',
- args: resolutionsArgs
- });
+ const targetHints = records.filter(record => record?.[key]).map(record => ({
+ id: record[key],
+ permissions: getUserPermissionsFromAllowHeader(record?._links?.self?.[0].targetHints.allow)
+ }));
+ const canUserResolutionsArgs = [];
+ const receiveUserPermissionArgs = {};
+ for (const targetHint of targetHints) {
+ for (const action of ALLOWED_RESOURCE_ACTIONS) {
+ canUserResolutionsArgs.push([action, {
+ kind,
+ name,
+ id: targetHint.id
+ }]);
+ receiveUserPermissionArgs[getUserPermissionCacheKey(action, {
+ kind,
+ name,
+ id: targetHint.id
+ })] = targetHint.permissions[action];
+ }
+ }
+ dispatch.receiveUserPermissions(receiveUserPermissionArgs);
+ dispatch.finishResolutions('getEntityRecord', getResolutionsArgs(records));
+ dispatch.finishResolutions('canUser', canUserResolutionsArgs);
}
dispatch.__unstableReleaseStoreLock(lock);
});
@@ -6055,26 +6325,26 @@
* Checks whether the current user can perform the given action on the given
* REST resource.
*
- * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',
- * 'delete'.
- * @param {string} resource REST resource to check, e.g. 'media' or 'posts'.
- * @param {?string} id ID of the rest resource to check.
+ * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',
+ * 'delete'.
+ * @param {string|Object} resource Entity resource to check. Accepts entity object `{ kind: 'root', name: 'media', id: 1 }`
+ * or REST base as a string - `media`.
+ * @param {?string} id ID of the rest resource to check.
*/
const resolvers_canUser = (requestedAction, resource, id) => async ({
dispatch,
- registry
+ registry,
+ resolveSelect
}) => {
+ if (!ALLOWED_RESOURCE_ACTIONS.includes(requestedAction)) {
+ throw new Error(`'${requestedAction}' is not a valid action.`);
+ }
const {
hasStartedResolution
} = registry.select(STORE_NAME);
- const resourcePath = id ? `${resource}/${id}` : resource;
- const retrievedActions = ['create', 'read', 'update', 'delete'];
- if (!retrievedActions.includes(requestedAction)) {
- throw new Error(`'${requestedAction}' is not a valid action.`);
- }
// Prevent resolving the same resource twice.
- for (const relatedAction of retrievedActions) {
+ for (const relatedAction of ALLOWED_RESOURCE_ACTIONS) {
if (relatedAction === requestedAction) {
continue;
}
@@ -6083,10 +6353,24 @@
return;
}
}
+ let resourcePath = null;
+ if (typeof resource === 'object') {
+ if (!resource.kind || !resource.name) {
+ throw new Error('The entity resource object is not valid.');
+ }
+ const configs = await resolveSelect.getEntitiesConfig(resource.kind);
+ const entityConfig = configs.find(config => config.name === resource.name && config.kind === resource.kind);
+ if (!entityConfig) {
+ return;
+ }
+ resourcePath = entityConfig.baseURL + (resource.id ? '/' + resource.id : '');
+ } else {
+ resourcePath = `/wp/v2/${resource}` + (id ? '/' + id : '');
+ }
let response;
try {
response = await external_wp_apiFetch_default()({
- path: `/wp/v2/${resourcePath}`,
+ path: resourcePath,
method: 'OPTIONS',
parse: false
});
@@ -6097,43 +6381,38 @@
}
// Optional chaining operator is used here because the API requests don't
- // return the expected result in the native version. Instead, API requests
+ // return the expected result in the React native version. Instead, API requests
// only return the result, without including response properties like the headers.
- const allowHeader = response.headers?.get('allow');
- const allowedMethods = allowHeader?.allow || allowHeader || '';
- const permissions = {};
- const methods = {
- create: 'POST',
- read: 'GET',
- update: 'PUT',
- delete: 'DELETE'
- };
- for (const [actionName, methodName] of Object.entries(methods)) {
- permissions[actionName] = allowedMethods.includes(methodName);
- }
- for (const action of retrievedActions) {
- dispatch.receiveUserPermission(`${action}/${resourcePath}`, permissions[action]);
- }
+ const permissions = getUserPermissionsFromAllowHeader(response.headers?.get('allow'));
+ registry.batch(() => {
+ for (const action of ALLOWED_RESOURCE_ACTIONS) {
+ const key = getUserPermissionCacheKey(action, resource, id);
+ dispatch.receiveUserPermission(key, permissions[action]);
+
+ // Mark related action resolutions as finished.
+ if (action !== requestedAction) {
+ dispatch.finishResolution('canUser', [action, resource, id]);
+ }
+ }
+ });
};
/**
* Checks whether the current user can perform the given action on the given
* REST resource.
*
- * @param {string} kind Entity kind.
- * @param {string} name Entity name.
- * @param {string} recordId Record's id.
+ * @param {string} kind Entity kind.
+ * @param {string} name Entity name.
+ * @param {number|string} recordId Record's id.
*/
const resolvers_canUserEditEntityRecord = (kind, name, recordId) => async ({
dispatch
}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
- const entityConfig = configs.find(config => config.name === name && config.kind === kind);
- if (!entityConfig) {
- return;
- }
- const resource = entityConfig.__unstable_rest_base;
- await dispatch(resolvers_canUser('update', resource, recordId));
+ await dispatch(resolvers_canUser('update', {
+ kind,
+ name,
+ id: recordId
+ }));
};
/**
@@ -6148,8 +6427,12 @@
}) => {
const {
rest_base: restBase,
- rest_namespace: restNamespace = 'wp/v2'
+ rest_namespace: restNamespace = 'wp/v2',
+ supports
} = await resolveSelect.getPostType(postType);
+ if (!supports?.autosave) {
+ return;
+ }
const autosaves = await external_wp_apiFetch_default()({
path: `/${restNamespace}/${restBase}/${postId}/autosaves?context=edit`
});
@@ -6172,43 +6455,6 @@
}) => {
await resolveSelect.getAutosaves(postType, postId);
};
-
-/**
- * Retrieve the frontend template used for a given link.
- *
- * @param {string} link Link.
- */
-const resolvers_experimentalGetTemplateForLink = link => async ({
- dispatch,
- resolveSelect
-}) => {
- let template;
- try {
- // This is NOT calling a REST endpoint but rather ends up with a response from
- // an Ajax function which has a different shape from a WP_REST_Response.
- template = await external_wp_apiFetch_default()({
- url: (0,external_wp_url_namespaceObject.addQueryArgs)(link, {
- '_wp-find-template': true
- })
- }).then(({
- data
- }) => data);
- } catch (e) {
- // For non-FSE themes, it is possible that this request returns an error.
- }
- if (!template) {
- return;
- }
- const record = await resolveSelect.getEntityRecord('postType', 'wp_template', template.id);
- if (record) {
- dispatch.receiveEntityRecords('postType', 'wp_template', [record], {
- 'find-template': link
- });
- }
-};
-resolvers_experimentalGetTemplateForLink.shouldInvalidate = action => {
- return (action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS') && action.invalidateCache && action.kind === 'postType' && action.name === 'wp_template';
-};
const resolvers_experimentalGetCurrentGlobalStylesId = () => async ({
dispatch,
resolveSelect
@@ -6234,8 +6480,9 @@
dispatch
}) => {
const currentTheme = await resolveSelect.getCurrentTheme();
+ // Please adjust the preloaded requests if this changes!
const themeGlobalStyles = await external_wp_apiFetch_default()({
- path: `/wp/v2/global-styles/themes/${currentTheme.stylesheet}`
+ path: `/wp/v2/global-styles/themes/${currentTheme.stylesheet}?context=view`
});
dispatch.__experimentalReceiveThemeBaseGlobalStyles(currentTheme.stylesheet, themeGlobalStyles);
};
@@ -6244,8 +6491,9 @@
dispatch
}) => {
const currentTheme = await resolveSelect.getCurrentTheme();
+ // Please adjust the preloaded requests if this changes!
const variations = await external_wp_apiFetch_default()({
- path: `/wp/v2/global-styles/themes/${currentTheme.stylesheet}/variations`
+ path: `/wp/v2/global-styles/themes/${currentTheme.stylesheet}/variations?context=view`
});
dispatch.__experimentalReceiveThemeGlobalStyleVariations(currentTheme.stylesheet, variations);
};
@@ -6312,7 +6560,8 @@
};
const resolvers_getNavigationFallbackId = () => async ({
dispatch,
- select
+ select,
+ registry
}) => {
const fallback = await external_wp_apiFetch_default()({
path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp-block-editor/v1/navigation-fallback', {
@@ -6320,8 +6569,12 @@
})
});
const record = fallback?._embedded?.self;
- dispatch.receiveNavigationFallbackId(fallback?.id);
- if (record) {
+ registry.batch(() => {
+ dispatch.receiveNavigationFallbackId(fallback?.id);
+ if (!record) {
+ return;
+ }
+
// If the fallback is already in the store, don't invalidate navigation queries.
// Otherwise, invalidate the cache for the scenario where there were no Navigation
// posts in the state and the fallback created one.
@@ -6331,17 +6584,27 @@
// Resolve to avoid further network requests.
dispatch.finishResolution('getEntityRecord', ['postType', 'wp_navigation', fallback.id]);
- }
+ });
};
const resolvers_getDefaultTemplateId = query => async ({
- dispatch
+ dispatch,
+ registry,
+ resolveSelect
}) => {
const template = await external_wp_apiFetch_default()({
path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/templates/lookup', query)
});
+ // Wait for the the entities config to be loaded, otherwise receiving
+ // the template as an entity will not work.
+ await resolveSelect.getEntitiesConfig('postType');
// Endpoint may return an empty object if no template is found.
if (template?.id) {
- dispatch.receiveDefaultTemplateId(query, template.id);
+ registry.batch(() => {
+ dispatch.receiveDefaultTemplateId(query, template.id);
+ dispatch.receiveEntityRecords('postType', 'wp_template', [template]);
+ // Avoid further network requests.
+ dispatch.finishResolution('getEntityRecord', ['postType', 'wp_template', template.id]);
+ });
}
};
@@ -6356,11 +6619,13 @@
* fields, fields must always include the ID.
*/
const resolvers_getRevisions = (kind, name, recordKey, query = {}) => async ({
- dispatch
+ dispatch,
+ registry,
+ resolveSelect
}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
+ const configs = await resolveSelect.getEntitiesConfig(kind);
const entityConfig = configs.find(config => config.name === name && config.kind === kind);
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
+ if (!entityConfig) {
return;
}
if (query._fields) {
@@ -6406,24 +6671,17 @@
return record;
});
}
- dispatch.receiveRevisions(kind, name, recordKey, records, query, false, meta);
-
- // When requesting all fields, the list of results can be used to
- // resolve the `getRevision` selector in addition to `getRevisions`.
- if (!query?._fields && !query.context) {
- const key = entityConfig.key || DEFAULT_ENTITY_KEY;
- const resolutionsArgs = records.filter(record => record[key]).map(record => [kind, name, recordKey, record[key]]);
- dispatch({
- type: 'START_RESOLUTIONS',
- selectorName: 'getRevision',
- args: resolutionsArgs
- });
- dispatch({
- type: 'FINISH_RESOLUTIONS',
- selectorName: 'getRevision',
- args: resolutionsArgs
- });
- }
+ registry.batch(() => {
+ dispatch.receiveRevisions(kind, name, recordKey, records, query, false, meta);
+
+ // When requesting all fields, the list of results can be used to
+ // resolve the `getRevision` selector in addition to `getRevisions`.
+ if (!query?._fields && !query.context) {
+ const key = entityConfig.key || DEFAULT_ENTITY_KEY;
+ const resolutionsArgs = records.filter(record => record[key]).map(record => [kind, name, recordKey, record[key]]);
+ dispatch.finishResolutions('getRevision', resolutionsArgs);
+ }
+ });
}
};
@@ -6442,11 +6700,12 @@
* fields, fields must always include the ID.
*/
const resolvers_getRevision = (kind, name, recordKey, revisionKey, query) => async ({
- dispatch
+ dispatch,
+ resolveSelect
}) => {
- const configs = await dispatch(getOrLoadEntitiesConfig(kind, name));
+ const configs = await resolveSelect.getEntitiesConfig(kind);
const entityConfig = configs.find(config => config.name === name && config.kind === kind);
- if (!entityConfig || entityConfig?.__experimentalNoFetch) {
+ if (!entityConfig) {
return;
}
if (query !== undefined && query._fields) {
@@ -6473,7 +6732,58 @@
}
};
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/utils.js
+/**
+ * Requests a specific post type options from the REST API.
+ *
+ * @param {string} postType Post type slug.
+ */
+const resolvers_getRegisteredPostMeta = postType => async ({
+ dispatch,
+ resolveSelect
+}) => {
+ let options;
+ try {
+ const {
+ rest_namespace: restNamespace = 'wp/v2',
+ rest_base: restBase
+ } = (await resolveSelect.getPostType(postType)) || {};
+ options = await external_wp_apiFetch_default()({
+ path: `${restNamespace}/${restBase}/?context=edit`,
+ method: 'OPTIONS'
+ });
+ } catch (error) {
+ // Do nothing if the request comes back with an API error.
+ return;
+ }
+ if (options) {
+ dispatch.receiveRegisteredPostMeta(postType, options?.schema?.properties?.meta?.properties);
+ }
+};
+
+/**
+ * Requests entity configs for the given kind from the REST API.
+ *
+ * @param {string} kind Entity kind.
+ */
+const resolvers_getEntitiesConfig = kind => async ({
+ dispatch
+}) => {
+ const loader = additionalEntityConfigLoaders.find(l => l.kind === kind);
+ if (!loader) {
+ return;
+ }
+ try {
+ const configs = await loader.loadEntities();
+ if (!configs.length) {
+ return;
+ }
+ dispatch.addEntities(configs);
+ } catch {
+ // Do nothing if the request comes back with an API error.
+ }
+};
+
+;// ./node_modules/@wordpress/core-data/build-module/locks/utils.js
function deepCopyLocksTreePath(tree, path) {
const newTree = {
...tree
@@ -6535,7 +6845,7 @@
return false;
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/reducer.js
+;// ./node_modules/@wordpress/core-data/build-module/locks/reducer.js
/**
* Internal dependencies
*/
@@ -6606,7 +6916,7 @@
return state;
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/selectors.js
+;// ./node_modules/@wordpress/core-data/build-module/locks/selectors.js
/**
* Internal dependencies
*/
@@ -6647,7 +6957,7 @@
return true;
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/engine.js
+;// ./node_modules/@wordpress/core-data/build-module/locks/engine.js
/**
* Internal dependencies
*/
@@ -6709,7 +7019,7 @@
};
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/actions.js
+;// ./node_modules/@wordpress/core-data/build-module/locks/actions.js
/**
* Internal dependencies
*/
@@ -6730,95 +7040,47 @@
};
}
-;// CONCATENATED MODULE: external ["wp","privateApis"]
-const external_wp_privateApis_namespaceObject = window["wp"]["privateApis"];
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/private-apis.js
-/**
- * WordPress dependencies
- */
-
-const {
- lock,
- unlock
-} = (0,external_wp_privateApis_namespaceObject.__dangerousOptInToUnstableAPIsOnlyForCoreModules)('I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.', '@wordpress/core-data');
-
-;// CONCATENATED MODULE: external ["wp","element"]
-const external_wp_element_namespaceObject = window["wp"]["element"];
-;// CONCATENATED MODULE: external ["wp","blocks"]
-const external_wp_blocks_namespaceObject = window["wp"]["blocks"];
-;// CONCATENATED MODULE: external ["wp","blockEditor"]
-const external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/footnotes/get-rich-text-values-cached.js
-/**
- * WordPress dependencies
- */
-
-
+;// ./node_modules/@wordpress/core-data/build-module/dynamic-entities.js
/**
* Internal dependencies
*/
-
-// TODO: The following line should have been:
-//
-// const unlockedApis = unlock( blockEditorPrivateApis );
-//
-// But there are hidden circular dependencies in RNMobile code, specifically in
-// certain native components in the `components` package that depend on
-// `block-editor`. What follows is a workaround that defers the `unlock` call
-// to prevent native code from failing.
-//
-// Fix once https://github.com/WordPress/gutenberg/issues/52692 is closed.
-let unlockedApis;
-const cache = new WeakMap();
-function getRichTextValuesCached(block) {
- if (!unlockedApis) {
- unlockedApis = unlock(external_wp_blockEditor_namespaceObject.privateApis);
- }
- if (!cache.has(block)) {
- const values = unlockedApis.getRichTextValues([block]);
- cache.set(block, values);
- }
- return cache.get(block);
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/footnotes/get-footnotes-order.js
-/**
- * Internal dependencies
- */
-
-const get_footnotes_order_cache = new WeakMap();
-function getBlockFootnotesOrder(block) {
- if (!get_footnotes_order_cache.has(block)) {
- const order = [];
- for (const value of getRichTextValuesCached(block)) {
- if (!value) {
- continue;
- }
-
- // replacements is a sparse array, use forEach to skip empty slots.
- value.replacements.forEach(({
- type,
- attributes
- }) => {
- if (type === 'core/footnote') {
- order.push(attributes['data-fn']);
- }
- });
- }
- get_footnotes_order_cache.set(block, order);
- }
- return get_footnotes_order_cache.get(block);
-}
-function getFootnotesOrder(blocks) {
- // We can only separate getting order from blocks at the root level. For
- // deeper inner blocks, this will not work since it's possible to have both
- // inner blocks and block attributes, so order needs to be computed from the
- // Edit functions as a whole.
- return blocks.flatMap(getBlockFootnotesOrder);
-}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/footnotes/index.js
+/**
+ * A simple utility that pluralizes a string.
+ * Converts:
+ * - "post" to "posts"
+ * - "taxonomy" to "taxonomies"
+ * - "media" to "mediaItems"
+ * - "status" to "statuses"
+ *
+ * It does not pluralize "GlobalStyles" due to lack of clarity about it at time of writing.
+ */
+
+/**
+ * A simple utility that singularizes a string.
+ *
+ * Converts:
+ * - "posts" to "post"
+ * - "taxonomies" to "taxonomy"
+ * - "mediaItems" to "media"
+ * - "statuses" to "status"
+ */
+
+let dynamicActions;
+let dynamicSelectors;
+
+;// external ["wp","element"]
+const external_wp_element_namespaceObject = window["wp"]["element"];
+;// ./node_modules/@wordpress/core-data/build-module/entity-context.js
+/**
+ * WordPress dependencies
+ */
+
+const EntityContext = (0,external_wp_element_namespaceObject.createContext)({});
+
+;// external "ReactJSXRuntime"
+const external_ReactJSXRuntime_namespaceObject = window["ReactJSXRuntime"];
+;// ./node_modules/@wordpress/core-data/build-module/entity-provider.js
/**
* WordPress dependencies
*/
@@ -6828,124 +7090,6 @@
* Internal dependencies
*/
-let oldFootnotes = {};
-function updateFootnotesFromMeta(blocks, meta) {
- const output = {
- blocks
- };
- if (!meta) {
- return output;
- }
-
- // If meta.footnotes is empty, it means the meta is not registered.
- if (meta.footnotes === undefined) {
- return output;
- }
- const newOrder = getFootnotesOrder(blocks);
- const footnotes = meta.footnotes ? JSON.parse(meta.footnotes) : [];
- const currentOrder = footnotes.map(fn => fn.id);
- if (currentOrder.join('') === newOrder.join('')) {
- return output;
- }
- const newFootnotes = newOrder.map(fnId => footnotes.find(fn => fn.id === fnId) || oldFootnotes[fnId] || {
- id: fnId,
- content: ''
- });
- function updateAttributes(attributes) {
- // Only attempt to update attributes, if attributes is an object.
- if (!attributes || Array.isArray(attributes) || typeof attributes !== 'object') {
- return attributes;
- }
- attributes = {
- ...attributes
- };
- for (const key in attributes) {
- const value = attributes[key];
- if (Array.isArray(value)) {
- attributes[key] = value.map(updateAttributes);
- continue;
- }
-
- // To do, remove support for string values?
- if (typeof value !== 'string' && !(value instanceof external_wp_richText_namespaceObject.RichTextData)) {
- continue;
- }
- const richTextValue = typeof value === 'string' ? external_wp_richText_namespaceObject.RichTextData.fromHTMLString(value) : new external_wp_richText_namespaceObject.RichTextData(value);
- richTextValue.replacements.forEach(replacement => {
- if (replacement.type === 'core/footnote') {
- const id = replacement.attributes['data-fn'];
- const index = newOrder.indexOf(id);
- // The innerHTML contains the count wrapped in a link.
- const countValue = (0,external_wp_richText_namespaceObject.create)({
- html: replacement.innerHTML
- });
- countValue.text = String(index + 1);
- countValue.formats = Array.from({
- length: countValue.text.length
- }, () => countValue.formats[0]);
- countValue.replacements = Array.from({
- length: countValue.text.length
- }, () => countValue.replacements[0]);
- replacement.innerHTML = (0,external_wp_richText_namespaceObject.toHTMLString)({
- value: countValue
- });
- }
- });
- attributes[key] = typeof value === 'string' ? richTextValue.toHTMLString() : richTextValue;
- }
- return attributes;
- }
- function updateBlocksAttributes(__blocks) {
- return __blocks.map(block => {
- return {
- ...block,
- attributes: updateAttributes(block.attributes),
- innerBlocks: updateBlocksAttributes(block.innerBlocks)
- };
- });
- }
-
- // We need to go through all block attributes deeply and update the
- // footnote anchor numbering (textContent) to match the new order.
- const newBlocks = updateBlocksAttributes(blocks);
- oldFootnotes = {
- ...oldFootnotes,
- ...footnotes.reduce((acc, fn) => {
- if (!newOrder.includes(fn.id)) {
- acc[fn.id] = fn;
- }
- return acc;
- }, {})
- };
- return {
- meta: {
- ...meta,
- footnotes: JSON.stringify(newFootnotes)
- },
- blocks: newBlocks
- };
-}
-
-;// CONCATENATED MODULE: external "ReactJSXRuntime"
-const external_ReactJSXRuntime_namespaceObject = window["ReactJSXRuntime"];
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/entity-provider.js
-/**
- * WordPress dependencies
- */
-
-
-
-
-/**
- * Internal dependencies
- */
-
-
-
-/** @typedef {import('@wordpress/blocks').WPBlock} WPBlock */
-
-const EMPTY_ARRAY = [];
-const EntityContext = (0,external_wp_element_namespaceObject.createContext)({});
/**
* Context provider component for providing
@@ -6960,6 +7104,7 @@
* @return {Object} The provided children, wrapped with
* the entity's context provider.
*/
+
function EntityProvider({
kind,
type: name,
@@ -6980,182 +7125,7 @@
});
}
-/**
- * Hook that returns the ID for the nearest
- * provided entity of the specified type.
- *
- * @param {string} kind The entity kind.
- * @param {string} name The entity name.
- */
-function useEntityId(kind, name) {
- const context = (0,external_wp_element_namespaceObject.useContext)(EntityContext);
- return context?.[kind]?.[name];
-}
-
-/**
- * Hook that returns the value and a setter for the
- * specified property of the nearest provided
- * entity of the specified type.
- *
- * @param {string} kind The entity kind.
- * @param {string} name The entity name.
- * @param {string} prop The property name.
- * @param {string} [_id] An entity ID to use instead of the context-provided one.
- *
- * @return {[*, Function, *]} An array where the first item is the
- * property value, the second is the
- * setter and the third is the full value
- * object from REST API containing more
- * information like `raw`, `rendered` and
- * `protected` props.
- */
-function useEntityProp(kind, name, prop, _id) {
- const providerId = useEntityId(kind, name);
- const id = _id !== null && _id !== void 0 ? _id : providerId;
- const {
- value,
- fullValue
- } = (0,external_wp_data_namespaceObject.useSelect)(select => {
- const {
- getEntityRecord,
- getEditedEntityRecord
- } = select(STORE_NAME);
- const record = getEntityRecord(kind, name, id); // Trigger resolver.
- const editedRecord = getEditedEntityRecord(kind, name, id);
- return record && editedRecord ? {
- value: editedRecord[prop],
- fullValue: record[prop]
- } : {};
- }, [kind, name, id, prop]);
- const {
- editEntityRecord
- } = (0,external_wp_data_namespaceObject.useDispatch)(STORE_NAME);
- const setValue = (0,external_wp_element_namespaceObject.useCallback)(newValue => {
- editEntityRecord(kind, name, id, {
- [prop]: newValue
- });
- }, [editEntityRecord, kind, name, id, prop]);
- return [value, setValue, fullValue];
-}
-const parsedBlocksCache = new WeakMap();
-
-/**
- * Hook that returns block content getters and setters for
- * the nearest provided entity of the specified type.
- *
- * The return value has the shape `[ blocks, onInput, onChange ]`.
- * `onInput` is for block changes that don't create undo levels
- * or dirty the post, non-persistent changes, and `onChange` is for
- * persistent changes. They map directly to the props of a
- * `BlockEditorProvider` and are intended to be used with it,
- * or similar components or hooks.
- *
- * @param {string} kind The entity kind.
- * @param {string} name The entity name.
- * @param {Object} options
- * @param {string} [options.id] An entity ID to use instead of the context-provided one.
- *
- * @return {[WPBlock[], Function, Function]} The block array and setters.
- */
-function useEntityBlockEditor(kind, name, {
- id: _id
-} = {}) {
- const providerId = useEntityId(kind, name);
- const id = _id !== null && _id !== void 0 ? _id : providerId;
- const {
- getEntityRecord,
- getEntityRecordEdits
- } = (0,external_wp_data_namespaceObject.useSelect)(STORE_NAME);
- const {
- content,
- editedBlocks,
- meta
- } = (0,external_wp_data_namespaceObject.useSelect)(select => {
- if (!id) {
- return {};
- }
- const {
- getEditedEntityRecord
- } = select(STORE_NAME);
- const editedRecord = getEditedEntityRecord(kind, name, id);
- return {
- editedBlocks: editedRecord.blocks,
- content: editedRecord.content,
- meta: editedRecord.meta
- };
- }, [kind, name, id]);
- const {
- __unstableCreateUndoLevel,
- editEntityRecord
- } = (0,external_wp_data_namespaceObject.useDispatch)(STORE_NAME);
- const blocks = (0,external_wp_element_namespaceObject.useMemo)(() => {
- if (!id) {
- return undefined;
- }
- if (editedBlocks) {
- return editedBlocks;
- }
- if (!content || typeof content !== 'string') {
- return EMPTY_ARRAY;
- }
-
- // If there's an edit, cache the parsed blocks by the edit.
- // If not, cache by the original enity record.
- const edits = getEntityRecordEdits(kind, name, id);
- const isUnedited = !edits || !Object.keys(edits).length;
- const cackeKey = isUnedited ? getEntityRecord(kind, name, id) : edits;
- let _blocks = parsedBlocksCache.get(cackeKey);
- if (!_blocks) {
- _blocks = (0,external_wp_blocks_namespaceObject.parse)(content);
- parsedBlocksCache.set(cackeKey, _blocks);
- }
- return _blocks;
- }, [kind, name, id, editedBlocks, content, getEntityRecord, getEntityRecordEdits]);
- const updateFootnotes = (0,external_wp_element_namespaceObject.useCallback)(_blocks => updateFootnotesFromMeta(_blocks, meta), [meta]);
- const onChange = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => {
- const noChange = blocks === newBlocks;
- if (noChange) {
- return __unstableCreateUndoLevel(kind, name, id);
- }
- const {
- selection,
- ...rest
- } = options;
-
- // We create a new function here on every persistent edit
- // to make sure the edit makes the post dirty and creates
- // a new undo level.
- const edits = {
- selection,
- content: ({
- blocks: blocksForSerialization = []
- }) => (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocksForSerialization),
- ...updateFootnotes(newBlocks)
- };
- editEntityRecord(kind, name, id, edits, {
- isCached: false,
- ...rest
- });
- }, [kind, name, id, blocks, updateFootnotes, __unstableCreateUndoLevel, editEntityRecord]);
- const onInput = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => {
- const {
- selection,
- ...rest
- } = options;
- const footnotesChanges = updateFootnotes(newBlocks);
- const edits = {
- selection,
- ...footnotesChanges
- };
- editEntityRecord(kind, name, id, edits, {
- isCached: true,
- ...rest
- });
- }, [kind, name, id, updateFootnotes, editEntityRecord]);
- return [blocks, onInput, onChange];
-}
-
-;// CONCATENATED MODULE: ./node_modules/memize/dist/index.js
+;// ./node_modules/memize/dist/index.js
/**
* Memize options object.
*
@@ -7317,7 +7287,7 @@
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/memoize.js
+;// ./node_modules/@wordpress/core-data/build-module/hooks/memoize.js
/**
* External dependencies
*/
@@ -7326,7 +7296,7 @@
// re-export due to restrictive esModuleInterop setting
/* harmony default export */ const memoize = (memize);
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/constants.js
+;// ./node_modules/@wordpress/core-data/build-module/hooks/constants.js
let Status = /*#__PURE__*/function (Status) {
Status["Idle"] = "IDLE";
Status["Resolving"] = "RESOLVING";
@@ -7335,7 +7305,7 @@
return Status;
}({});
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-query-select.js
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-query-select.js
/**
* WordPress dependencies
*/
@@ -7441,7 +7411,7 @@
return resolvers;
});
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-record.js
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-record.js
/**
* WordPress dependencies
*/
@@ -7524,6 +7494,8 @@
* return (
* <form onSubmit={ onRename }>
* <TextControl
+ * __nextHasNoMarginBottom
+ * __next40pxDefaultSize
* label={ __( 'Name' ) }
* value={ page.editedRecord.title }
* onChange={ setTitle }
@@ -7604,7 +7576,7 @@
return useEntityRecord(kind, name, recordId, options);
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-records.js
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-records.js
/**
* WordPress dependencies
*/
@@ -7612,12 +7584,14 @@
+
/**
* Internal dependencies
*/
-const use_entity_records_EMPTY_ARRAY = [];
+
+const EMPTY_ARRAY = [];
/**
* Resolves the specified entity records.
@@ -7674,7 +7648,7 @@
if (!options.enabled) {
return {
// Avoiding returning a new reference on every execution.
- data: use_entity_records_EMPTY_ARRAY
+ data: EMPTY_ARRAY
};
}
return query(store).getEntityRecords(kind, name, queryArgs);
@@ -7708,13 +7682,53 @@
});
return useEntityRecords(kind, name, queryArgs, options);
}
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-resource-permissions.js
+function useEntityRecordsWithPermissions(kind, name, queryArgs = {}, options = {
+ enabled: true
+}) {
+ const entityConfig = (0,external_wp_data_namespaceObject.useSelect)(select => select(store).getEntityConfig(kind, name), [kind, name]);
+ const {
+ records: data,
+ ...ret
+ } = useEntityRecords(kind, name, queryArgs, options);
+ const ids = (0,external_wp_element_namespaceObject.useMemo)(() => {
+ var _data$map;
+ return (_data$map = data?.map(
+ // @ts-ignore
+ record => {
+ var _entityConfig$key;
+ return record[(_entityConfig$key = entityConfig?.key) !== null && _entityConfig$key !== void 0 ? _entityConfig$key : 'id'];
+ })) !== null && _data$map !== void 0 ? _data$map : [];
+ }, [data, entityConfig?.key]);
+ const permissions = (0,external_wp_data_namespaceObject.useSelect)(select => {
+ const {
+ getEntityRecordsPermissions
+ } = unlock(select(store));
+ return getEntityRecordsPermissions(kind, name, ids);
+ }, [ids, kind, name]);
+ const dataWithPermissions = (0,external_wp_element_namespaceObject.useMemo)(() => {
+ var _data$map2;
+ return (_data$map2 = data?.map((record, index) => ({
+ // @ts-ignore
+ ...record,
+ permissions: permissions[index]
+ }))) !== null && _data$map2 !== void 0 ? _data$map2 : [];
+ }, [data, permissions]);
+ return {
+ records: dataWithPermissions,
+ ...ret
+ };
+}
+
+;// external ["wp","warning"]
+const external_wp_warning_namespaceObject = window["wp"]["warning"];
+var external_wp_warning_default = /*#__PURE__*/__webpack_require__.n(external_wp_warning_namespaceObject);
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-resource-permissions.js
/**
* WordPress dependencies
*/
+
/**
* Internal dependencies
*/
@@ -7731,15 +7745,17 @@
*
* @since 6.1.0 Introduced in WordPress core.
*
- * @param resource The resource in question, e.g. media.
- * @param id ID of a specific resource entry, if needed, e.g. 10.
+ * @param resource Entity resource to check. Accepts entity object `{ kind: 'root', name: 'media', id: 1 }`
+ * or REST base as a string - `media`.
+ * @param id Optional ID of the resource to check, e.g. 10. Note: This argument is discouraged
+ * when using an entity object as a resource to check permissions and will be ignored.
*
* @example
* ```js
* import { useResourcePermissions } from '@wordpress/core-data';
*
* function PagesList() {
- * const { canCreate, isResolving } = useResourcePermissions( 'pages' );
+ * const { canCreate, isResolving } = useResourcePermissions( { kind: 'postType', name: 'page' } );
*
* if ( isResolving ) {
* return 'Loading ...';
@@ -7767,7 +7783,7 @@
* canUpdate,
* canDelete,
* isResolving
- * } = useResourcePermissions( 'pages', pageId );
+ * } = useResourcePermissions( { kind: 'postType', name: 'page', id: pageId } );
*
* if ( isResolving ) {
* return 'Loading ...';
@@ -7795,12 +7811,25 @@
* @template IdType
*/
function useResourcePermissions(resource, id) {
+ // Serialize `resource` to a string that can be safely used as a React dep.
+ // We can't just pass `resource` as one of the deps, because if it is passed
+ // as an object literal, then it will be a different object on each call even
+ // if the values remain the same.
+ const isEntity = typeof resource === 'object';
+ const resourceAsString = isEntity ? JSON.stringify(resource) : resource;
+ if (isEntity && typeof id !== 'undefined') {
+ true ? external_wp_warning_default()(`When 'resource' is an entity object, passing 'id' as a separate argument isn't supported.`) : 0;
+ }
return useQuerySelect(resolve => {
+ const hasId = isEntity ? !!resource.id : !!id;
const {
canUser
} = resolve(store);
- const create = canUser('create', resource);
- if (!id) {
+ const create = canUser('create', isEntity ? {
+ kind: resource.kind,
+ name: resource.name
+ } : resource);
+ if (!hasId) {
const read = canUser('read', resource);
const isResolving = create.isResolving || read.isResolving;
const hasResolved = create.hasResolved && read.hasResolved;
@@ -7838,8 +7867,9 @@
canUpdate: hasResolved && update.data,
canDelete: hasResolved && _delete.data
};
- }, [resource, id]);
-}
+ }, [resourceAsString, id]);
+}
+/* harmony default export */ const use_resource_permissions = (useResourcePermissions);
function __experimentalUseResourcePermissions(resource, id) {
external_wp_deprecated_default()(`wp.data.__experimentalUseResourcePermissions`, {
alternative: 'wp.data.useResourcePermissions',
@@ -7848,12 +7878,104 @@
return useResourcePermissions(resource, id);
}
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/index.js
-
-
-
-
-;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/index.js
+;// external ["wp","blocks"]
+const external_wp_blocks_namespaceObject = window["wp"]["blocks"];
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-id.js
+/**
+ * WordPress dependencies
+ */
+
+
+/**
+ * Internal dependencies
+ */
+
+
+/**
+ * Hook that returns the ID for the nearest
+ * provided entity of the specified type.
+ *
+ * @param {string} kind The entity kind.
+ * @param {string} name The entity name.
+ */
+function useEntityId(kind, name) {
+ const context = (0,external_wp_element_namespaceObject.useContext)(EntityContext);
+ return context?.[kind]?.[name];
+}
+
+;// external ["wp","blockEditor"]
+const external_wp_blockEditor_namespaceObject = window["wp"]["blockEditor"];
+;// ./node_modules/@wordpress/core-data/build-module/footnotes/get-rich-text-values-cached.js
+/**
+ * WordPress dependencies
+ */
+
+
+/**
+ * Internal dependencies
+ */
+
+
+// TODO: The following line should have been:
+//
+// const unlockedApis = unlock( blockEditorPrivateApis );
+//
+// But there are hidden circular dependencies in RNMobile code, specifically in
+// certain native components in the `components` package that depend on
+// `block-editor`. What follows is a workaround that defers the `unlock` call
+// to prevent native code from failing.
+//
+// Fix once https://github.com/WordPress/gutenberg/issues/52692 is closed.
+let unlockedApis;
+const cache = new WeakMap();
+function getRichTextValuesCached(block) {
+ if (!unlockedApis) {
+ unlockedApis = unlock(external_wp_blockEditor_namespaceObject.privateApis);
+ }
+ if (!cache.has(block)) {
+ const values = unlockedApis.getRichTextValues([block]);
+ cache.set(block, values);
+ }
+ return cache.get(block);
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/footnotes/get-footnotes-order.js
+/**
+ * Internal dependencies
+ */
+
+const get_footnotes_order_cache = new WeakMap();
+function getBlockFootnotesOrder(block) {
+ if (!get_footnotes_order_cache.has(block)) {
+ const order = [];
+ for (const value of getRichTextValuesCached(block)) {
+ if (!value) {
+ continue;
+ }
+
+ // replacements is a sparse array, use forEach to skip empty slots.
+ value.replacements.forEach(({
+ type,
+ attributes
+ }) => {
+ if (type === 'core/footnote') {
+ order.push(attributes['data-fn']);
+ }
+ });
+ }
+ get_footnotes_order_cache.set(block, order);
+ }
+ return get_footnotes_order_cache.get(block);
+}
+function getFootnotesOrder(blocks) {
+ // We can only separate getting order from blocks at the root level. For
+ // deeper inner blocks, this will not work since it's possible to have both
+ // inner blocks and block attributes, so order needs to be computed from the
+ // Edit functions as a whole.
+ return blocks.flatMap(getBlockFootnotesOrder);
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/footnotes/index.js
/**
* WordPress dependencies
*/
@@ -7863,6 +7985,332 @@
* Internal dependencies
*/
+let oldFootnotes = {};
+function updateFootnotesFromMeta(blocks, meta) {
+ const output = {
+ blocks
+ };
+ if (!meta) {
+ return output;
+ }
+
+ // If meta.footnotes is empty, it means the meta is not registered.
+ if (meta.footnotes === undefined) {
+ return output;
+ }
+ const newOrder = getFootnotesOrder(blocks);
+ const footnotes = meta.footnotes ? JSON.parse(meta.footnotes) : [];
+ const currentOrder = footnotes.map(fn => fn.id);
+ if (currentOrder.join('') === newOrder.join('')) {
+ return output;
+ }
+ const newFootnotes = newOrder.map(fnId => footnotes.find(fn => fn.id === fnId) || oldFootnotes[fnId] || {
+ id: fnId,
+ content: ''
+ });
+ function updateAttributes(attributes) {
+ // Only attempt to update attributes, if attributes is an object.
+ if (!attributes || Array.isArray(attributes) || typeof attributes !== 'object') {
+ return attributes;
+ }
+ attributes = {
+ ...attributes
+ };
+ for (const key in attributes) {
+ const value = attributes[key];
+ if (Array.isArray(value)) {
+ attributes[key] = value.map(updateAttributes);
+ continue;
+ }
+
+ // To do, remove support for string values?
+ if (typeof value !== 'string' && !(value instanceof external_wp_richText_namespaceObject.RichTextData)) {
+ continue;
+ }
+ const richTextValue = typeof value === 'string' ? external_wp_richText_namespaceObject.RichTextData.fromHTMLString(value) : new external_wp_richText_namespaceObject.RichTextData(value);
+ let hasFootnotes = false;
+ richTextValue.replacements.forEach(replacement => {
+ if (replacement.type === 'core/footnote') {
+ const id = replacement.attributes['data-fn'];
+ const index = newOrder.indexOf(id);
+ // The innerHTML contains the count wrapped in a link.
+ const countValue = (0,external_wp_richText_namespaceObject.create)({
+ html: replacement.innerHTML
+ });
+ countValue.text = String(index + 1);
+ countValue.formats = Array.from({
+ length: countValue.text.length
+ }, () => countValue.formats[0]);
+ countValue.replacements = Array.from({
+ length: countValue.text.length
+ }, () => countValue.replacements[0]);
+ replacement.innerHTML = (0,external_wp_richText_namespaceObject.toHTMLString)({
+ value: countValue
+ });
+ hasFootnotes = true;
+ }
+ });
+ if (hasFootnotes) {
+ attributes[key] = typeof value === 'string' ? richTextValue.toHTMLString() : richTextValue;
+ }
+ }
+ return attributes;
+ }
+ function updateBlocksAttributes(__blocks) {
+ return __blocks.map(block => {
+ return {
+ ...block,
+ attributes: updateAttributes(block.attributes),
+ innerBlocks: updateBlocksAttributes(block.innerBlocks)
+ };
+ });
+ }
+
+ // We need to go through all block attributes deeply and update the
+ // footnote anchor numbering (textContent) to match the new order.
+ const newBlocks = updateBlocksAttributes(blocks);
+ oldFootnotes = {
+ ...oldFootnotes,
+ ...footnotes.reduce((acc, fn) => {
+ if (!newOrder.includes(fn.id)) {
+ acc[fn.id] = fn;
+ }
+ return acc;
+ }, {})
+ };
+ return {
+ meta: {
+ ...meta,
+ footnotes: JSON.stringify(newFootnotes)
+ },
+ blocks: newBlocks
+ };
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-block-editor.js
+/**
+ * WordPress dependencies
+ */
+
+
+
+
+/**
+ * Internal dependencies
+ */
+
+
+
+const use_entity_block_editor_EMPTY_ARRAY = [];
+const parsedBlocksCache = new WeakMap();
+
+/**
+ * Hook that returns block content getters and setters for
+ * the nearest provided entity of the specified type.
+ *
+ * The return value has the shape `[ blocks, onInput, onChange ]`.
+ * `onInput` is for block changes that don't create undo levels
+ * or dirty the post, non-persistent changes, and `onChange` is for
+ * persistent changes. They map directly to the props of a
+ * `BlockEditorProvider` and are intended to be used with it,
+ * or similar components or hooks.
+ *
+ * @param {string} kind The entity kind.
+ * @param {string} name The entity name.
+ * @param {Object} options
+ * @param {string} [options.id] An entity ID to use instead of the context-provided one.
+ *
+ * @return {[unknown[], Function, Function]} The block array and setters.
+ */
+function useEntityBlockEditor(kind, name, {
+ id: _id
+} = {}) {
+ const providerId = useEntityId(kind, name);
+ const id = _id !== null && _id !== void 0 ? _id : providerId;
+ const {
+ getEntityRecord,
+ getEntityRecordEdits
+ } = (0,external_wp_data_namespaceObject.useSelect)(STORE_NAME);
+ const {
+ content,
+ editedBlocks,
+ meta
+ } = (0,external_wp_data_namespaceObject.useSelect)(select => {
+ if (!id) {
+ return {};
+ }
+ const {
+ getEditedEntityRecord
+ } = select(STORE_NAME);
+ const editedRecord = getEditedEntityRecord(kind, name, id);
+ return {
+ editedBlocks: editedRecord.blocks,
+ content: editedRecord.content,
+ meta: editedRecord.meta
+ };
+ }, [kind, name, id]);
+ const {
+ __unstableCreateUndoLevel,
+ editEntityRecord
+ } = (0,external_wp_data_namespaceObject.useDispatch)(STORE_NAME);
+ const blocks = (0,external_wp_element_namespaceObject.useMemo)(() => {
+ if (!id) {
+ return undefined;
+ }
+ if (editedBlocks) {
+ return editedBlocks;
+ }
+ if (!content || typeof content !== 'string') {
+ return use_entity_block_editor_EMPTY_ARRAY;
+ }
+
+ // If there's an edit, cache the parsed blocks by the edit.
+ // If not, cache by the original entity record.
+ const edits = getEntityRecordEdits(kind, name, id);
+ const isUnedited = !edits || !Object.keys(edits).length;
+ const cackeKey = isUnedited ? getEntityRecord(kind, name, id) : edits;
+ let _blocks = parsedBlocksCache.get(cackeKey);
+ if (!_blocks) {
+ _blocks = (0,external_wp_blocks_namespaceObject.parse)(content);
+ parsedBlocksCache.set(cackeKey, _blocks);
+ }
+ return _blocks;
+ }, [kind, name, id, editedBlocks, content, getEntityRecord, getEntityRecordEdits]);
+ const onChange = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => {
+ const noChange = blocks === newBlocks;
+ if (noChange) {
+ return __unstableCreateUndoLevel(kind, name, id);
+ }
+ const {
+ selection,
+ ...rest
+ } = options;
+
+ // We create a new function here on every persistent edit
+ // to make sure the edit makes the post dirty and creates
+ // a new undo level.
+ const edits = {
+ selection,
+ content: ({
+ blocks: blocksForSerialization = []
+ }) => (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocksForSerialization),
+ ...updateFootnotesFromMeta(newBlocks, meta)
+ };
+ editEntityRecord(kind, name, id, edits, {
+ isCached: false,
+ ...rest
+ });
+ }, [kind, name, id, blocks, meta, __unstableCreateUndoLevel, editEntityRecord]);
+ const onInput = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => {
+ const {
+ selection,
+ ...rest
+ } = options;
+ const footnotesChanges = updateFootnotesFromMeta(newBlocks, meta);
+ const edits = {
+ selection,
+ ...footnotesChanges
+ };
+ editEntityRecord(kind, name, id, edits, {
+ isCached: true,
+ ...rest
+ });
+ }, [kind, name, id, meta, editEntityRecord]);
+ return [blocks, onInput, onChange];
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-prop.js
+/**
+ * WordPress dependencies
+ */
+
+
+
+/**
+ * Internal dependencies
+ */
+
+
+
+/**
+ * Hook that returns the value and a setter for the
+ * specified property of the nearest provided
+ * entity of the specified type.
+ *
+ * @param {string} kind The entity kind.
+ * @param {string} name The entity name.
+ * @param {string} prop The property name.
+ * @param {number|string} [_id] An entity ID to use instead of the context-provided one.
+ *
+ * @return {[*, Function, *]} An array where the first item is the
+ * property value, the second is the
+ * setter and the third is the full value
+ * object from REST API containing more
+ * information like `raw`, `rendered` and
+ * `protected` props.
+ */
+function useEntityProp(kind, name, prop, _id) {
+ const providerId = useEntityId(kind, name);
+ const id = _id !== null && _id !== void 0 ? _id : providerId;
+ const {
+ value,
+ fullValue
+ } = (0,external_wp_data_namespaceObject.useSelect)(select => {
+ const {
+ getEntityRecord,
+ getEditedEntityRecord
+ } = select(STORE_NAME);
+ const record = getEntityRecord(kind, name, id); // Trigger resolver.
+ const editedRecord = getEditedEntityRecord(kind, name, id);
+ return record && editedRecord ? {
+ value: editedRecord[prop],
+ fullValue: record[prop]
+ } : {};
+ }, [kind, name, id, prop]);
+ const {
+ editEntityRecord
+ } = (0,external_wp_data_namespaceObject.useDispatch)(STORE_NAME);
+ const setValue = (0,external_wp_element_namespaceObject.useCallback)(newValue => {
+ editEntityRecord(kind, name, id, {
+ [prop]: newValue
+ });
+ }, [editEntityRecord, kind, name, id, prop]);
+ return [value, setValue, fullValue];
+}
+
+;// ./node_modules/@wordpress/core-data/build-module/hooks/index.js
+
+
+
+
+
+
+
+;// ./node_modules/@wordpress/core-data/build-module/private-apis.js
+/**
+ * Internal dependencies
+ */
+
+
+
+const privateApis = {};
+lock(privateApis, {
+ useEntityRecordsWithPermissions: useEntityRecordsWithPermissions,
+ RECEIVE_INTERMEDIATE_RESULTS: RECEIVE_INTERMEDIATE_RESULTS
+});
+
+;// ./node_modules/@wordpress/core-data/build-module/index.js
+/**
+ * WordPress dependencies
+ */
+
+
+/**
+ * Internal dependencies
+ */
+
+
+
@@ -7915,11 +8363,13 @@
const storeConfig = () => ({
reducer: build_module_reducer,
actions: {
+ ...dynamicActions,
...build_module_actions_namespaceObject,
...entityActions,
...createLocksActions()
},
selectors: {
+ ...dynamicSelectors,
...build_module_selectors_namespaceObject,
...entitySelectors
},
@@ -7936,6 +8386,7 @@
*/
const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, storeConfig());
unlock(store).registerPrivateSelectors(private_selectors_namespaceObject);
+unlock(store).registerPrivateActions(private_actions_namespaceObject);
(0,external_wp_data_namespaceObject.register)(store); // Register store after unlocking private selectors to allow resolvers to use them.
@@ -7944,7 +8395,6 @@
-})();
(window.wp = window.wp || {}).coreData = __webpack_exports__;
/******/ })()