diff options
Diffstat (limited to 'wp-includes/js/dist/core-data.js')
-rw-r--r-- | wp-includes/js/dist/core-data.js | 7553 |
1 files changed, 7553 insertions, 0 deletions
diff --git a/wp-includes/js/dist/core-data.js b/wp-includes/js/dist/core-data.js new file mode 100644 index 0000000..ff7c744 --- /dev/null +++ b/wp-includes/js/dist/core-data.js @@ -0,0 +1,7553 @@ +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 5360: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createUndoManager: function() { return /* binding */ createUndoManager; } +/* harmony export */ }); +/* harmony import */ var _wordpress_is_shallow_equal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9127); +/* 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]; + } + }; +} + + +/***/ }), + +/***/ 2167: +/***/ (function(module) { + + + +function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +/** + * Given an instance of EquivalentKeyMap, returns its internal value pair tuple + * for a key, if one exists. The tuple members consist of the last reference + * value for the key (used in efficient subsequent lookups) and the value + * assigned for the key at the leaf node. + * + * @param {EquivalentKeyMap} instance EquivalentKeyMap instance. + * @param {*} key The key for which to return value pair. + * + * @return {?Array} Value pair, if exists. + */ +function getValuePair(instance, key) { + var _map = instance._map, + _arrayTreeMap = instance._arrayTreeMap, + _objectTreeMap = instance._objectTreeMap; // Map keeps a reference to the last object-like key used to set the + // value, which can be used to shortcut immediately to the value. + + if (_map.has(key)) { + return _map.get(key); + } // Sort keys to ensure stable retrieval from tree. + + + var properties = Object.keys(key).sort(); // Tree by type to avoid conflicts on numeric object keys, empty value. + + var map = Array.isArray(key) ? _arrayTreeMap : _objectTreeMap; + + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + map = map.get(property); + + if (map === undefined) { + return; + } + + var propertyValue = key[property]; + map = map.get(propertyValue); + + if (map === undefined) { + return; + } + } + + var valuePair = map.get('_ekm_value'); + + if (!valuePair) { + return; + } // If reached, it implies that an object-like key was set with another + // reference, so delete the reference and replace with the current. + + + _map.delete(valuePair[0]); + + valuePair[0] = key; + map.set('_ekm_value', valuePair); + + _map.set(key, valuePair); + + return valuePair; +} +/** + * Variant of a Map object which enables lookup by equivalent (deeply equal) + * object and array keys. + */ + + +var EquivalentKeyMap = +/*#__PURE__*/ +function () { + /** + * Constructs a new instance of EquivalentKeyMap. + * + * @param {Iterable.<*>} iterable Initial pair of key, value for map. + */ + function EquivalentKeyMap(iterable) { + _classCallCheck(this, EquivalentKeyMap); + + this.clear(); + + if (iterable instanceof EquivalentKeyMap) { + // Map#forEach is only means of iterating with support for IE11. + var iterablePairs = []; + iterable.forEach(function (value, key) { + iterablePairs.push([key, value]); + }); + iterable = iterablePairs; + } + + if (iterable != null) { + for (var i = 0; i < iterable.length; i++) { + this.set(iterable[i][0], iterable[i][1]); + } + } + } + /** + * Accessor property returning the number of elements. + * + * @return {number} Number of elements. + */ + + + _createClass(EquivalentKeyMap, [{ + key: "set", + + /** + * Add or update an element with a specified key and value. + * + * @param {*} key The key of the element to add. + * @param {*} value The value of the element to add. + * + * @return {EquivalentKeyMap} Map instance. + */ + value: function set(key, value) { + // Shortcut non-object-like to set on internal Map. + if (key === null || _typeof(key) !== 'object') { + this._map.set(key, value); + + return this; + } // Sort keys to ensure stable assignment into tree. + + + var properties = Object.keys(key).sort(); + var valuePair = [key, value]; // Tree by type to avoid conflicts on numeric object keys, empty value. + + var map = Array.isArray(key) ? this._arrayTreeMap : this._objectTreeMap; + + for (var i = 0; i < properties.length; i++) { + var property = properties[i]; + + if (!map.has(property)) { + map.set(property, new EquivalentKeyMap()); + } + + map = map.get(property); + var propertyValue = key[property]; + + if (!map.has(propertyValue)) { + map.set(propertyValue, new EquivalentKeyMap()); + } + + map = map.get(propertyValue); + } // If an _ekm_value exists, there was already an equivalent key. Before + // overriding, ensure that the old key reference is removed from map to + // avoid memory leak of accumulating equivalent keys. This is, in a + // sense, a poor man's WeakMap, while still enabling iterability. + + + var previousValuePair = map.get('_ekm_value'); + + if (previousValuePair) { + this._map.delete(previousValuePair[0]); + } + + map.set('_ekm_value', valuePair); + + this._map.set(key, valuePair); + + return this; + } + /** + * Returns a specified element. + * + * @param {*} key The key of the element to return. + * + * @return {?*} The element associated with the specified key or undefined + * if the key can't be found. + */ + + }, { + key: "get", + value: function get(key) { + // Shortcut non-object-like to get from internal Map. + if (key === null || _typeof(key) !== 'object') { + return this._map.get(key); + } + + var valuePair = getValuePair(this, key); + + if (valuePair) { + return valuePair[1]; + } + } + /** + * Returns a boolean indicating whether an element with the specified key + * exists or not. + * + * @param {*} key The key of the element to test for presence. + * + * @return {boolean} Whether an element with the specified key exists. + */ + + }, { + key: "has", + value: function has(key) { + if (key === null || _typeof(key) !== 'object') { + return this._map.has(key); + } // Test on the _presence_ of the pair, not its value, as even undefined + // can be a valid member value for a key. + + + return getValuePair(this, key) !== undefined; + } + /** + * Removes the specified element. + * + * @param {*} key The key of the element to remove. + * + * @return {boolean} Returns true if an element existed and has been + * removed, or false if the element does not exist. + */ + + }, { + key: "delete", + value: function _delete(key) { + if (!this.has(key)) { + return false; + } // This naive implementation will leave orphaned child trees. A better + // implementation should traverse and remove orphans. + + + this.set(key, undefined); + return true; + } + /** + * Executes a provided function once per each key/value pair, in insertion + * order. + * + * @param {Function} callback Function to execute for each element. + * @param {*} thisArg Value to use as `this` when executing + * `callback`. + */ + + }, { + key: "forEach", + value: function forEach(callback) { + var _this = this; + + var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this; + + this._map.forEach(function (value, key) { + // Unwrap value from object-like value pair. + if (key !== null && _typeof(key) === 'object') { + value = value[1]; + } + + callback.call(thisArg, value, key, _this); + }); + } + /** + * Removes all elements. + */ + + }, { + key: "clear", + value: function clear() { + this._map = new Map(); + this._arrayTreeMap = new Map(); + this._objectTreeMap = new Map(); + } + }, { + key: "size", + get: function get() { + return this._map.size; + } + }]); + + return EquivalentKeyMap; +}(); + +module.exports = EquivalentKeyMap; + + +/***/ }), + +/***/ 5619: +/***/ (function(module) { + + + +// do not edit .js files directly - edit src/index.jst + + + var envHasBigInt64Array = typeof BigInt64Array !== 'undefined'; + + +module.exports = function equal(a, b) { + if (a === b) return true; + + if (a && b && typeof a == 'object' && typeof b == 'object') { + if (a.constructor !== b.constructor) return false; + + var length, i, keys; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (!equal(a[i], b[i])) return false; + return true; + } + + + if ((a instanceof Map) && (b instanceof Map)) { + if (a.size !== b.size) return false; + for (i of a.entries()) + if (!b.has(i[0])) return false; + for (i of a.entries()) + if (!equal(i[1], b.get(i[0]))) return false; + return true; + } + + if ((a instanceof Set) && (b instanceof Set)) { + if (a.size !== b.size) return false; + for (i of a.entries()) + if (!b.has(i[0])) return false; + return true; + } + + if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (a[i] !== b[i]) return false; + return true; + } + + + if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); + + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) return false; + + for (i = length; i-- !== 0;) + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + + for (i = length; i-- !== 0;) { + var key = keys[i]; + + if (!equal(a[key], b[key])) return false; + } + + return true; + } + + // true if both NaN, false otherwise + return a!==a && b!==b; +}; + + +/***/ }), + +/***/ 9127: +/***/ (function(module) { + +module.exports = window["wp"]["isShallowEqual"]; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + EntityProvider: function() { return /* reexport */ EntityProvider; }, + __experimentalFetchLinkSuggestions: function() { return /* reexport */ _experimental_fetch_link_suggestions; }, + __experimentalFetchUrlData: function() { return /* reexport */ _experimental_fetch_url_data; }, + __experimentalUseEntityRecord: function() { return /* reexport */ __experimentalUseEntityRecord; }, + __experimentalUseEntityRecords: function() { return /* reexport */ __experimentalUseEntityRecords; }, + __experimentalUseResourcePermissions: function() { return /* reexport */ __experimentalUseResourcePermissions; }, + store: function() { return /* binding */ store; }, + useEntityBlockEditor: function() { return /* reexport */ useEntityBlockEditor; }, + useEntityId: function() { return /* reexport */ useEntityId; }, + useEntityProp: function() { return /* reexport */ useEntityProp; }, + useEntityRecord: function() { return /* reexport */ useEntityRecord; }, + useEntityRecords: function() { return /* reexport */ useEntityRecords; }, + useResourcePermissions: function() { return /* 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: function() { return __experimentalBatch; }, + __experimentalReceiveCurrentGlobalStylesId: function() { return __experimentalReceiveCurrentGlobalStylesId; }, + __experimentalReceiveThemeBaseGlobalStyles: function() { return __experimentalReceiveThemeBaseGlobalStyles; }, + __experimentalReceiveThemeGlobalStyleVariations: function() { return __experimentalReceiveThemeGlobalStyleVariations; }, + __experimentalSaveSpecifiedEntityEdits: function() { return __experimentalSaveSpecifiedEntityEdits; }, + __unstableCreateUndoLevel: function() { return __unstableCreateUndoLevel; }, + addEntities: function() { return addEntities; }, + deleteEntityRecord: function() { return deleteEntityRecord; }, + editEntityRecord: function() { return editEntityRecord; }, + receiveAutosaves: function() { return receiveAutosaves; }, + receiveCurrentTheme: function() { return receiveCurrentTheme; }, + receiveCurrentUser: function() { return receiveCurrentUser; }, + receiveEmbedPreview: function() { return receiveEmbedPreview; }, + receiveEntityRecords: function() { return receiveEntityRecords; }, + receiveNavigationFallbackId: function() { return receiveNavigationFallbackId; }, + receiveThemeGlobalStyleRevisions: function() { return receiveThemeGlobalStyleRevisions; }, + receiveThemeSupports: function() { return receiveThemeSupports; }, + receiveUploadPermissions: function() { return receiveUploadPermissions; }, + receiveUserPermission: function() { return receiveUserPermission; }, + receiveUserQuery: function() { return receiveUserQuery; }, + redo: function() { return redo; }, + saveEditedEntityRecord: function() { return saveEditedEntityRecord; }, + saveEntityRecord: function() { return saveEntityRecord; }, + undo: function() { return undo; } +}); + +// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/selectors.js +var build_module_selectors_namespaceObject = {}; +__webpack_require__.r(build_module_selectors_namespaceObject); +__webpack_require__.d(build_module_selectors_namespaceObject, { + __experimentalGetCurrentGlobalStylesId: function() { return __experimentalGetCurrentGlobalStylesId; }, + __experimentalGetCurrentThemeBaseGlobalStyles: function() { return __experimentalGetCurrentThemeBaseGlobalStyles; }, + __experimentalGetCurrentThemeGlobalStylesVariations: function() { return __experimentalGetCurrentThemeGlobalStylesVariations; }, + __experimentalGetDirtyEntityRecords: function() { return __experimentalGetDirtyEntityRecords; }, + __experimentalGetEntitiesBeingSaved: function() { return __experimentalGetEntitiesBeingSaved; }, + __experimentalGetEntityRecordNoResolver: function() { return __experimentalGetEntityRecordNoResolver; }, + __experimentalGetTemplateForLink: function() { return __experimentalGetTemplateForLink; }, + canUser: function() { return canUser; }, + canUserEditEntityRecord: function() { return canUserEditEntityRecord; }, + getAuthors: function() { return getAuthors; }, + getAutosave: function() { return getAutosave; }, + getAutosaves: function() { return getAutosaves; }, + getBlockPatternCategories: function() { return getBlockPatternCategories; }, + getBlockPatterns: function() { return getBlockPatterns; }, + getCurrentTheme: function() { return getCurrentTheme; }, + getCurrentThemeGlobalStylesRevisions: function() { return getCurrentThemeGlobalStylesRevisions; }, + getCurrentUser: function() { return getCurrentUser; }, + getEditedEntityRecord: function() { return getEditedEntityRecord; }, + getEmbedPreview: function() { return getEmbedPreview; }, + getEntitiesByKind: function() { return getEntitiesByKind; }, + getEntitiesConfig: function() { return getEntitiesConfig; }, + getEntity: function() { return getEntity; }, + getEntityConfig: function() { return getEntityConfig; }, + getEntityRecord: function() { return getEntityRecord; }, + getEntityRecordEdits: function() { return getEntityRecordEdits; }, + getEntityRecordNonTransientEdits: function() { return getEntityRecordNonTransientEdits; }, + getEntityRecords: function() { return getEntityRecords; }, + getLastEntityDeleteError: function() { return getLastEntityDeleteError; }, + getLastEntitySaveError: function() { return getLastEntitySaveError; }, + getRawEntityRecord: function() { return getRawEntityRecord; }, + getRedoEdit: function() { return getRedoEdit; }, + getReferenceByDistinctEdits: function() { return getReferenceByDistinctEdits; }, + getThemeSupports: function() { return getThemeSupports; }, + getUndoEdit: function() { return getUndoEdit; }, + getUserPatternCategories: function() { return getUserPatternCategories; }, + getUserQueryResults: function() { return getUserQueryResults; }, + hasEditsForEntityRecord: function() { return hasEditsForEntityRecord; }, + hasEntityRecords: function() { return hasEntityRecords; }, + hasFetchedAutosaves: function() { return hasFetchedAutosaves; }, + hasRedo: function() { return hasRedo; }, + hasUndo: function() { return hasUndo; }, + isAutosavingEntityRecord: function() { return isAutosavingEntityRecord; }, + isDeletingEntityRecord: function() { return isDeletingEntityRecord; }, + isPreviewEmbedFallback: function() { return isPreviewEmbedFallback; }, + isRequestingEmbedPreview: function() { return isRequestingEmbedPreview; }, + isSavingEntityRecord: function() { return isSavingEntityRecord; } +}); + +// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/private-selectors.js +var private_selectors_namespaceObject = {}; +__webpack_require__.r(private_selectors_namespaceObject); +__webpack_require__.d(private_selectors_namespaceObject, { + getNavigationFallbackId: function() { return getNavigationFallbackId; }, + getUndoManager: function() { return getUndoManager; } +}); + +// NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/resolvers.js +var resolvers_namespaceObject = {}; +__webpack_require__.r(resolvers_namespaceObject); +__webpack_require__.d(resolvers_namespaceObject, { + __experimentalGetCurrentGlobalStylesId: function() { return resolvers_experimentalGetCurrentGlobalStylesId; }, + __experimentalGetCurrentThemeBaseGlobalStyles: function() { return resolvers_experimentalGetCurrentThemeBaseGlobalStyles; }, + __experimentalGetCurrentThemeGlobalStylesVariations: function() { return resolvers_experimentalGetCurrentThemeGlobalStylesVariations; }, + __experimentalGetTemplateForLink: function() { return resolvers_experimentalGetTemplateForLink; }, + canUser: function() { return resolvers_canUser; }, + canUserEditEntityRecord: function() { return resolvers_canUserEditEntityRecord; }, + getAuthors: function() { return resolvers_getAuthors; }, + getAutosave: function() { return resolvers_getAutosave; }, + getAutosaves: function() { return resolvers_getAutosaves; }, + getBlockPatternCategories: function() { return resolvers_getBlockPatternCategories; }, + getBlockPatterns: function() { return resolvers_getBlockPatterns; }, + getCurrentTheme: function() { return resolvers_getCurrentTheme; }, + getCurrentThemeGlobalStylesRevisions: function() { return resolvers_getCurrentThemeGlobalStylesRevisions; }, + getCurrentUser: function() { return resolvers_getCurrentUser; }, + getEditedEntityRecord: function() { return resolvers_getEditedEntityRecord; }, + getEmbedPreview: function() { return resolvers_getEmbedPreview; }, + getEntityRecord: function() { return resolvers_getEntityRecord; }, + getEntityRecords: function() { return resolvers_getEntityRecords; }, + getNavigationFallbackId: function() { return resolvers_getNavigationFallbackId; }, + getRawEntityRecord: function() { return resolvers_getRawEntityRecord; }, + getThemeSupports: function() { return resolvers_getThemeSupports; }, + getUserPatternCategories: function() { return resolvers_getUserPatternCategories; } +}); + +;// CONCATENATED MODULE: external ["wp","data"] +var external_wp_data_namespaceObject = window["wp"]["data"]; +// EXTERNAL MODULE: ./node_modules/fast-deep-equal/es6/index.js +var es6 = __webpack_require__(5619); +var es6_default = /*#__PURE__*/__webpack_require__.n(es6); +;// CONCATENATED MODULE: external ["wp","compose"] +var external_wp_compose_namespaceObject = window["wp"]["compose"]; +// EXTERNAL MODULE: ./node_modules/@wordpress/undo-manager/build-module/index.js +var build_module = __webpack_require__(5360); +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/if-matching-action.js +/** @typedef {import('../types').AnyFunction} AnyFunction */ + +/** + * A higher-order reducer creator which invokes the original reducer only if + * the dispatching action matches the given predicate, **OR** if state is + * initializing (undefined). + * + * @param {AnyFunction} isMatch Function predicate for allowing reducer call. + * + * @return {AnyFunction} Higher-order reducer. + */ +const ifMatchingAction = isMatch => reducer => (state, action) => { + if (state === undefined || isMatch(action)) { + return reducer(state, action); + } + return state; +}; +/* harmony default export */ var if_matching_action = (ifMatchingAction); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/replace-action.js +/** @typedef {import('../types').AnyFunction} AnyFunction */ + +/** + * Higher-order reducer creator which substitutes the action object before + * passing to the original reducer. + * + * @param {AnyFunction} replacer Function mapping original action to replacement. + * + * @return {AnyFunction} Higher-order reducer. + */ +const replaceAction = replacer => reducer => (state, action) => { + return reducer(state, replacer(action)); +}; +/* harmony default export */ var replace_action = (replaceAction); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/conservative-map-item.js +/** + * External dependencies + */ + + +/** + * Given the current and next item entity record, returns the minimally "modified" + * result of the next item, preferring value references from the original item + * if equal. If all values match, the original item is returned. + * + * @param {Object} item Original item. + * @param {Object} nextItem Next item. + * + * @return {Object} Minimally modified merged item. + */ +function conservativeMapItem(item, nextItem) { + // Return next item in its entirety if there is no original item. + if (!item) { + return nextItem; + } + let hasChanges = false; + const result = {}; + for (const key in nextItem) { + if (es6_default()(item[key], nextItem[key])) { + result[key] = item[key]; + } else { + hasChanges = true; + result[key] = nextItem[key]; + } + } + if (!hasChanges) { + return item; + } + + // Only at this point, backfill properties from the original item which + // weren't explicitly set into the result above. This is an optimization + // to allow `hasChanges` to return early. + for (const key in item) { + if (!result.hasOwnProperty(key)) { + result[key] = item[key]; + } + } + return result; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/on-sub-key.js +/** @typedef {import('../types').AnyFunction} AnyFunction */ + +/** + * Higher-order reducer creator which creates a combined reducer object, keyed + * by a property on the action object. + * + * @param {string} actionProperty Action property by which to key object. + * + * @return {AnyFunction} Higher-order reducer. + */ +const onSubKey = actionProperty => reducer => (state = {}, action) => { + // Retrieve subkey from action. Do not track if undefined; useful for cases + // where reducer is scoped by action shape. + const key = action[actionProperty]; + if (key === undefined) { + return state; + } + + // Avoid updating state if unchanged. Note that this also accounts for a + // reducer which returns undefined on a key which is not yet tracked. + const nextKeyState = reducer(state[key], action); + if (nextKeyState === state[key]) { + return state; + } + return { + ...state, + [key]: nextKeyState + }; +}; +/* harmony default export */ var on_sub_key = (onSubKey); + +;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.mjs +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _, done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; + context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); + } + else if (_ = accept(result)) { + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; + } + } + if (target) Object.defineProperty(target, contextIn.name, descriptor); + done = true; +}; + +function __runInitializers(thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; +}; + +function __propKey(x) { + return typeof x === "symbol" ? x : "".concat(x); +}; + +function __setFunctionName(f, name, prefix) { + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); +}; + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +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; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var __createBinding = Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +}); + +function __exportStar(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); +} + +function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +/** @deprecated */ +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +/** @deprecated */ +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +} + +function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +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); }); }; } + 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); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +var __setModuleDefault = Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}; + +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); + __setModuleDefault(result, mod); + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +function __classPrivateFieldIn(state, receiver) { + if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); +} + +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; + if (async) { + 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 (typeof dispose !== "function") throw new TypeError("Object not disposable."); + env.stack.push({ value: value, dispose: dispose, async: async }); + } + else if (async) { + env.stack.push({ async: true }); + } + return value; +} + +var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +function __disposeResources(env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + function next() { + while (env.stack.length) { + var rec = 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(); }); + } + catch (e) { + fail(e); + } + } + if (env.hasError) throw env.error; + } + return next(); +} + +/* harmony default export */ var tslib_es6 = ({ + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __createBinding, + __exportStar, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __addDisposableResource, + __disposeResources, +}); + +;// CONCATENATED MODULE: ./node_modules/lower-case/dist.es2015/index.js +/** + * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt + */ +var SUPPORTED_LOCALE = { + tr: { + regexp: /\u0130|\u0049|\u0049\u0307/g, + map: { + İ: "\u0069", + I: "\u0131", + İ: "\u0069", + }, + }, + az: { + regexp: /\u0130/g, + map: { + İ: "\u0069", + I: "\u0131", + İ: "\u0069", + }, + }, + lt: { + regexp: /\u0049|\u004A|\u012E|\u00CC|\u00CD|\u0128/g, + map: { + I: "\u0069\u0307", + J: "\u006A\u0307", + Į: "\u012F\u0307", + Ì: "\u0069\u0307\u0300", + Í: "\u0069\u0307\u0301", + Ĩ: "\u0069\u0307\u0303", + }, + }, +}; +/** + * Localized lower case. + */ +function localeLowerCase(str, locale) { + var lang = SUPPORTED_LOCALE[locale.toLowerCase()]; + if (lang) + return lowerCase(str.replace(lang.regexp, function (m) { return lang.map[m]; })); + return lowerCase(str); +} +/** + * Lower case as a function. + */ +function lowerCase(str) { + return str.toLowerCase(); +} + +;// CONCATENATED MODULE: ./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]; +// Remove all non-word characters. +var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; +/** + * Normalize the string into something other libraries can manipulate easier. + */ +function noCase(input, options) { + if (options === void 0) { options = {}; } + var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d; + var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0"); + var start = 0; + var end = result.length; + // Trim the delimiter from around the output string. + while (result.charAt(start) === "\0") + start++; + while (result.charAt(end - 1) === "\0") + end--; + // Transform each token independently. + return result.slice(start, end).split("\0").map(transform).join(delimiter); +} +/** + * Replace `re` in the input string with the replacement value. + */ +function replace(input, re, value) { + if (re instanceof RegExp) + return input.replace(re, value); + return re.reduce(function (input, re) { return input.replace(re, value); }, input); +} + +;// CONCATENATED MODULE: ./node_modules/upper-case-first/dist.es2015/index.js +/** + * Upper case the first character of an input string. + */ +function upperCaseFirst(input) { + return input.charAt(0).toUpperCase() + input.substr(1); +} + +;// CONCATENATED MODULE: ./node_modules/capital-case/dist.es2015/index.js + + + +function capitalCaseTransform(input) { + return upperCaseFirst(input.toLowerCase()); +} +function capitalCase(input, options) { + if (options === void 0) { options = {}; } + return noCase(input, __assign({ delimiter: " ", transform: capitalCaseTransform }, options)); +} + +;// CONCATENATED MODULE: ./node_modules/pascal-case/dist.es2015/index.js + + +function pascalCaseTransform(input, index) { + var firstChar = input.charAt(0); + var lowerChars = input.substr(1).toLowerCase(); + if (index > 0 && firstChar >= "0" && firstChar <= "9") { + return "_" + firstChar + lowerChars; + } + return "" + firstChar.toUpperCase() + lowerChars; +} +function dist_es2015_pascalCaseTransformMerge(input) { + return input.charAt(0).toUpperCase() + input.slice(1).toLowerCase(); +} +function pascalCase(input, options) { + if (options === void 0) { options = {}; } + return noCase(input, __assign({ delimiter: "", transform: pascalCaseTransform }, options)); +} + +;// CONCATENATED MODULE: external ["wp","apiFetch"] +var 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"] +var external_wp_i18n_namespaceObject = window["wp"]["i18n"]; +;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/native.js +const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto); +/* harmony default export */ var 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 */ var 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 */ var esm_browser_v4 = (v4); +;// CONCATENATED MODULE: external ["wp","url"] +var external_wp_url_namespaceObject = window["wp"]["url"]; +;// CONCATENATED MODULE: external ["wp","deprecated"] +var 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. + * + * @return {Object} Action object. + */ +function receiveItems(items, edits) { + return { + type: 'RECEIVE_ITEMS', + items: Array.isArray(items) ? items : [items], + persistedEdits: edits + }; +} + +/** + * 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. + * + * @return {Object} Action object. + */ +function receiveQueriedItems(items, query = {}, edits) { + return { + ...receiveItems(items, edits), + 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. + * @return {Object} Action object. + */ +function receiveEntityRecords(kind, name, records, query, invalidateCache = false, edits) { + // 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); + } else { + action = receiveItems(records, edits); + } + 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. + * + * @ignore + * + * @param {number} currentId The post id. + * @param {Array} revisions The global styles revisions. + * + * @return {Object} Action object. + */ +function receiveThemeGlobalStyleRevisions(currentId, revisions) { + 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)); + 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)); + 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; + }, { + status: data.status === 'auto-draft' ? 'draft' : data.status + }); + 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)); + 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)); + 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 + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/entities.js +/** + * External dependencies + */ + + +/** + * WordPress dependencies + */ + + + +/** + * Internal dependencies + */ + + +const DEFAULT_ENTITY_KEY = 'id'; +const POST_RAW_ATTRIBUTES = ['title', 'excerpt', 'content']; +const rootEntitiesConfig = [{ + label: (0,external_wp_i18n_namespaceObject.__)('Base'), + kind: 'root', + name: '__unstableBase', + baseURL: '/', + baseURLParams: { + _fields: ['description', 'gmt_offset', 'home', 'name', 'site_icon', 'site_icon_url', 'site_logo', 'timezone_string', 'url'].join(',') + }, + syncConfig: { + fetch: async () => { + return external_wp_apiFetch_default()({ + path: '/' + }); + }, + applyChangesToDoc: (doc, changes) => { + const document = doc.getMap('document'); + Object.entries(changes).forEach(([key, value]) => { + if (document.get(key) !== value) { + document.set(key, value); + } + }); + }, + fromCRDTDoc: doc => { + return doc.getMap('document').toJSON(); + } + }, + syncObjectType: 'root/base', + getSyncObjectId: () => 'index' +}, { + label: (0,external_wp_i18n_namespaceObject.__)('Site'), + name: 'site', + kind: 'root', + baseURL: '/wp/v2/settings', + getTitle: record => { + var _record$title; + return (_record$title = record?.title) !== null && _record$title !== void 0 ? _record$title : (0,external_wp_i18n_namespaceObject.__)('Site Title'); + }, + syncConfig: { + fetch: async () => { + return external_wp_apiFetch_default()({ + path: '/wp/v2/settings' + }); + }, + applyChangesToDoc: (doc, changes) => { + const document = doc.getMap('document'); + Object.entries(changes).forEach(([key, value]) => { + if (document.get(key) !== value) { + document.set(key, value); + } + }); + }, + fromCRDTDoc: doc => { + return doc.getMap('document').toJSON(); + } + }, + syncObjectType: 'root/site', + getSyncObjectId: () => 'index' +}, { + label: (0,external_wp_i18n_namespaceObject.__)('Post Type'), + name: 'postType', + kind: 'root', + key: 'slug', + baseURL: '/wp/v2/types', + baseURLParams: { + context: 'edit' + }, + syncConfig: { + fetch: async id => { + return external_wp_apiFetch_default()({ + path: `/wp/v2/types/${id}?context=edit` + }); + }, + applyChangesToDoc: (doc, changes) => { + const document = doc.getMap('document'); + Object.entries(changes).forEach(([key, value]) => { + if (document.get(key) !== value) { + document.set(key, value); + } + }); + }, + fromCRDTDoc: doc => { + return doc.getMap('document').toJSON(); + } + }, + syncObjectType: 'root/postType', + getSyncObjectId: id => id +}, { + name: 'media', + kind: 'root', + baseURL: '/wp/v2/media', + baseURLParams: { + context: 'edit' + }, + plural: 'mediaItems', + label: (0,external_wp_i18n_namespaceObject.__)('Media'), + rawAttributes: ['caption', 'title', 'description'] +}, { + name: 'taxonomy', + kind: 'root', + key: 'slug', + baseURL: '/wp/v2/taxonomies', + baseURLParams: { + context: 'edit' + }, + plural: 'taxonomies', + label: (0,external_wp_i18n_namespaceObject.__)('Taxonomy') +}, { + name: 'sidebar', + kind: 'root', + baseURL: '/wp/v2/sidebars', + baseURLParams: { + context: 'edit' + }, + plural: 'sidebars', + transientEdits: { + blocks: true + }, + label: (0,external_wp_i18n_namespaceObject.__)('Widget areas') +}, { + name: 'widget', + kind: 'root', + baseURL: '/wp/v2/widgets', + baseURLParams: { + context: 'edit' + }, + plural: 'widgets', + transientEdits: { + blocks: true + }, + label: (0,external_wp_i18n_namespaceObject.__)('Widgets') +}, { + name: 'widgetType', + kind: 'root', + baseURL: '/wp/v2/widget-types', + baseURLParams: { + context: 'edit' + }, + plural: 'widgetTypes', + label: (0,external_wp_i18n_namespaceObject.__)('Widget types') +}, { + label: (0,external_wp_i18n_namespaceObject.__)('User'), + name: 'user', + kind: 'root', + baseURL: '/wp/v2/users', + baseURLParams: { + context: 'edit' + }, + plural: 'users' +}, { + name: 'comment', + kind: 'root', + baseURL: '/wp/v2/comments', + baseURLParams: { + context: 'edit' + }, + plural: 'comments', + label: (0,external_wp_i18n_namespaceObject.__)('Comment') +}, { + name: 'menu', + kind: 'root', + baseURL: '/wp/v2/menus', + baseURLParams: { + context: 'edit' + }, + plural: 'menus', + label: (0,external_wp_i18n_namespaceObject.__)('Menu') +}, { + name: 'menuItem', + kind: 'root', + baseURL: '/wp/v2/menu-items', + baseURLParams: { + context: 'edit' + }, + plural: 'menuItems', + label: (0,external_wp_i18n_namespaceObject.__)('Menu Item'), + rawAttributes: ['title'] +}, { + name: 'menuLocation', + kind: 'root', + baseURL: '/wp/v2/menu-locations', + baseURLParams: { + context: 'edit' + }, + plural: 'menuLocations', + label: (0,external_wp_i18n_namespaceObject.__)('Menu Location'), + key: 'name' +}, { + label: (0,external_wp_i18n_namespaceObject.__)('Global Styles'), + name: 'globalStyles', + kind: 'root', + baseURL: '/wp/v2/global-styles', + baseURLParams: { + context: 'edit' + }, + plural: 'globalStylesVariations', + // Should be different than name. + getTitle: record => record?.title?.rendered || record?.title +}, { + label: (0,external_wp_i18n_namespaceObject.__)('Themes'), + name: 'theme', + kind: 'root', + baseURL: '/wp/v2/themes', + baseURLParams: { + context: 'edit' + }, + key: 'stylesheet' +}, { + label: (0,external_wp_i18n_namespaceObject.__)('Plugins'), + name: 'plugin', + kind: 'root', + baseURL: '/wp/v2/plugins', + baseURLParams: { + context: 'edit' + }, + key: 'plugin' +}]; +const additionalEntityConfigLoaders = [{ + kind: 'postType', + loadEntities: loadPostTypeEntities +}, { + kind: 'taxonomy', + loadEntities: loadTaxonomyEntities +}]; + +/** + * Returns a function to be used to retrieve extra edits to apply before persisting a post type. + * + * @param {Object} persistedRecord Already persisted Post + * @param {Object} edits Edits. + * @return {Object} Updated edits. + */ +const prePersistPostType = (persistedRecord, edits) => { + const newEdits = {}; + if (persistedRecord?.status === 'auto-draft') { + // Saving an auto-draft should create a draft by default. + if (!edits.status && !newEdits.status) { + newEdits.status = 'draft'; + } + + // Fix the auto-draft default title. + if ((!edits.title || edits.title === 'Auto Draft') && !newEdits.title && (!persistedRecord?.title || persistedRecord?.title === 'Auto Draft')) { + newEdits.title = ''; + } + } + return newEdits; +}; + +/** + * Returns the list of post type entities. + * + * @return {Promise} Entities promise + */ +async function loadPostTypeEntities() { + const postTypes = await external_wp_apiFetch_default()({ + path: '/wp/v2/types?context=view' + }); + return Object.entries(postTypes !== null && postTypes !== void 0 ? postTypes : {}).map(([name, postType]) => { + var _postType$rest_namesp; + const isTemplate = ['wp_template', 'wp_template_part'].includes(name); + const namespace = (_postType$rest_namesp = postType?.rest_namespace) !== null && _postType$rest_namesp !== void 0 ? _postType$rest_namesp : 'wp/v2'; + return { + kind: 'postType', + baseURL: `/${namespace}/${postType.rest_base}`, + baseURLParams: { + context: 'edit' + }, + name, + label: postType.name, + transientEdits: { + blocks: true, + selection: true + }, + mergedEdits: { + meta: true + }, + rawAttributes: POST_RAW_ATTRIBUTES, + getTitle: record => { + var _record$slug; + return record?.title?.rendered || record?.title || (isTemplate ? capitalCase((_record$slug = record.slug) !== null && _record$slug !== void 0 ? _record$slug : '') : String(record.id)); + }, + __unstablePrePersist: isTemplate ? undefined : prePersistPostType, + __unstable_rest_base: postType.rest_base, + syncConfig: { + fetch: async id => { + return external_wp_apiFetch_default()({ + path: `/${namespace}/${postType.rest_base}/${id}?context=edit` + }); + }, + applyChangesToDoc: (doc, changes) => { + const document = doc.getMap('document'); + Object.entries(changes).forEach(([key, value]) => { + if (document.get(key) !== value && typeof value !== 'function') { + document.set(key, value); + } + }); + }, + fromCRDTDoc: doc => { + return doc.getMap('document').toJSON(); + } + }, + syncObjectType: 'postType/' + postType.name, + getSyncObjectId: id => id + }; + }); +} + +/** + * Returns the list of the taxonomies entities. + * + * @return {Promise} Entities promise + */ +async function loadTaxonomyEntities() { + const taxonomies = await external_wp_apiFetch_default()({ + path: '/wp/v2/taxonomies?context=view' + }); + return Object.entries(taxonomies !== null && taxonomies !== void 0 ? taxonomies : {}).map(([name, taxonomy]) => { + var _taxonomy$rest_namesp; + const namespace = (_taxonomy$rest_namesp = taxonomy?.rest_namespace) !== null && _taxonomy$rest_namesp !== void 0 ? _taxonomy$rest_namesp : 'wp/v2'; + return { + kind: 'taxonomy', + baseURL: `/${namespace}/${taxonomy.rest_base}`, + baseURLParams: { + context: 'edit' + }, + name, + label: taxonomy.name + }; + }); +} + +/** + * Returns the entity's getter method name given its kind and name. + * + * @example + * ```js + * const nameSingular = getMethodName( 'root', 'theme', 'get' ); + * // nameSingular is getRootTheme + * + * const namePlural = getMethodName( 'root', 'theme', 'set' ); + * // namePlural is setRootThemes + * ``` + * + * @param {string} kind Entity kind. + * @param {string} name Entity name. + * @param {string} prefix Function prefix. + * @param {boolean} usePlural Whether to use the plural form or not. + * + * @return {string} Method name + */ +const getMethodName = (kind, name, prefix = 'get', usePlural = false) => { + const entityConfig = rootEntitiesConfig.find(config => config.kind === kind && config.name === name); + const kindPrefix = kind === 'root' ? '' : pascalCase(kind); + const nameSuffix = pascalCase(name) + (usePlural ? 's' : ''); + const suffix = usePlural && 'plural' in entityConfig && entityConfig?.plural ? pascalCase(entityConfig.plural) : nameSuffix; + 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 kind entities into the store. + * + * @param {string} kind Kind + * + * @return {(thunkArgs: object) => Promise<Array>} Entities + */ +const getOrLoadEntitiesConfig = kind => async ({ + select, + dispatch +}) => { + let configs = select.getEntitiesConfig(kind); + if (configs && configs.length !== 0) { + if (window.__experimentalEnableSync) { + if (false) {} + } + return configs; + } + const loader = additionalEntityConfigLoaders.find(l => l.kind === kind); + 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 +/** + * 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 + * null if the value cannot be interpreted as either. + * + * @param {string|string[]|*} value + * + * @return {?(string[])} Normalized field value. + */ +function getNormalizedCommaSeparable(value) { + if (typeof value === 'string') { + return value.split(','); + } else if (Array.isArray(value)) { + return value; + } + return null; +} +/* harmony default export */ var get_normalized_comma_separable = (getNormalizedCommaSeparable); + +;// CONCATENATED MODULE: ./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 + * passed a valid object-like argument (requirement for WeakMap key). + * + * @param {Function} fn Original function. + * + * @return {Function} Enhanced caching function. + */ +function withWeakMapCache(fn) { + const cache = new WeakMap(); + return key => { + let value; + if (cache.has(key)) { + value = cache.get(key); + } else { + value = fn(key); + + // Can reach here if key is not valid for WeakMap, since `has` + // will return false for invalid key. Since `set` will throw, + // ensure that key is valid before setting into cache. + if (key !== null && typeof key === 'object') { + cache.set(key, value); + } + } + return value; + }; +} +/* harmony default export */ var with_weak_map_cache = (withWeakMapCache); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/get-query-parts.js +/** + * WordPress dependencies + */ + + +/** + * Internal dependencies + */ + + +/** + * An object of properties describing a specific query. + * + * @typedef {Object} WPQueriedDataQueryParts + * + * @property {number} page The query page (1-based index, default 1). + * @property {number} perPage Items per page for query (default 10). + * @property {string} stableKey An encoded stable string of all non- + * pagination, non-fields query parameters. + * @property {?(string[])} fields Target subset of fields to derive from + * item objects. + * @property {?(number[])} include Specific item IDs to include. + * @property {string} context Scope under which the request is made; + * determines returned fields in response. + */ + +/** + * Given a query object, returns an object of parts, including pagination + * details (`page` and `perPage`, or default values). All other properties are + * encoded into a stable (idempotent) `stableKey` value. + * + * @param {Object} query Optional query object. + * + * @return {WPQueriedDataQueryParts} Query parts. + */ +function getQueryParts(query) { + /** + * @type {WPQueriedDataQueryParts} + */ + const parts = { + stableKey: '', + page: 1, + perPage: 10, + fields: null, + include: null, + context: 'default' + }; + + // Ensure stable key by sorting keys. Also more efficient for iterating. + const keys = Object.keys(query).sort(); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + let value = query[key]; + switch (key) { + case 'page': + parts[key] = Number(value); + break; + case 'per_page': + parts.perPage = Number(value); + break; + case 'context': + parts.context = value; + break; + default: + // While in theory, we could exclude "_fields" from the stableKey + // because two request with different fields have the same results + // We're not able to ensure that because the server can decide to omit + // fields from the response even if we explicitly asked for it. + // Example: Asking for titles in posts without title support. + if (key === '_fields') { + var _getNormalizedCommaSe; + parts.fields = (_getNormalizedCommaSe = get_normalized_comma_separable(value)) !== null && _getNormalizedCommaSe !== void 0 ? _getNormalizedCommaSe : []; + // Make sure to normalize value for `stableKey` + value = parts.fields.join(); + } + + // Two requests with different include values cannot have same results. + if (key === 'include') { + var _getNormalizedCommaSe2; + if (typeof value === 'number') { + value = value.toString(); + } + parts.include = ((_getNormalizedCommaSe2 = get_normalized_comma_separable(value)) !== null && _getNormalizedCommaSe2 !== void 0 ? _getNormalizedCommaSe2 : []).map(Number); + // Normalize value for `stableKey`. + value = parts.include.join(); + } + + // While it could be any deterministic string, for simplicity's + // sake mimic querystring encoding for stable key. + // + // TODO: For consistency with PHP implementation, addQueryArgs + // should accept a key value pair, which may optimize its + // implementation for our use here, vs. iterating an object + // with only a single key. + parts.stableKey += (parts.stableKey ? '&' : '') + (0,external_wp_url_namespaceObject.addQueryArgs)('', { + [key]: value + }).slice(1); + } + } + return parts; +} +/* harmony default export */ var get_query_parts = (with_weak_map_cache(getQueryParts)); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/reducer.js +/** + * WordPress dependencies + */ + + + +/** + * Internal dependencies + */ + + + +function getContextFromAction(action) { + const { + query + } = action; + if (!query) { + return 'default'; + } + const queryParts = get_query_parts(query); + return queryParts.context; +} + +/** + * Returns a merged array of item IDs, given details of the received paginated + * items. The array is sparse-like with `undefined` entries where holes exist. + * + * @param {?Array<number>} itemIds Original item IDs (default empty array). + * @param {number[]} nextItemIds Item IDs to merge. + * @param {number} page Page of items merged. + * @param {number} perPage Number of items per page. + * + * @return {number[]} Merged array of item IDs. + */ +function getMergedItemIds(itemIds, nextItemIds, page, perPage) { + var _itemIds$length; + const receivedAllIds = page === 1 && perPage === -1; + if (receivedAllIds) { + return nextItemIds; + } + const nextItemIdsStartIndex = (page - 1) * perPage; + + // If later page has already been received, default to the larger known + // size of the existing array, else calculate as extending the existing. + const size = Math.max((_itemIds$length = itemIds?.length) !== null && _itemIds$length !== void 0 ? _itemIds$length : 0, nextItemIdsStartIndex + nextItemIds.length); + + // Preallocate array since size is known. + const mergedItemIds = new Array(size); + for (let i = 0; i < size; i++) { + // Preserve existing item ID except for subset of range of next items. + const isInNextItemsRange = i >= nextItemIdsStartIndex && i < nextItemIdsStartIndex + nextItemIds.length; + mergedItemIds[i] = isInNextItemsRange ? nextItemIds[i - nextItemIdsStartIndex] : itemIds?.[i]; + } + return mergedItemIds; +} + +/** + * Helper function to filter out entities with certain IDs. + * Entities are keyed by their ID. + * + * @param {Object} entities Entity objects, keyed by entity ID. + * @param {Array} ids Entity IDs to filter out. + * + * @return {Object} Filtered entities. + */ +function removeEntitiesById(entities, ids) { + return Object.fromEntries(Object.entries(entities).filter(([id]) => !ids.some(itemId => { + if (Number.isInteger(itemId)) { + return itemId === +id; + } + return itemId === id; + }))); +} + +/** + * Reducer tracking items state, keyed by ID. Items are assumed to be normal, + * where identifiers are common across all queries. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Next state. + */ +function items(state = {}, action) { + switch (action.type) { + case 'RECEIVE_ITEMS': + { + const context = getContextFromAction(action); + const key = action.key || DEFAULT_ENTITY_KEY; + return { + ...state, + [context]: { + ...state[context], + ...action.items.reduce((accumulator, value) => { + const itemId = value[key]; + accumulator[itemId] = conservativeMapItem(state?.[context]?.[itemId], value); + return accumulator; + }, {}) + } + }; + } + case 'REMOVE_ITEMS': + return Object.fromEntries(Object.entries(state).map(([itemId, contextState]) => [itemId, removeEntitiesById(contextState, action.itemIds)])); + } + return state; +} + +/** + * Reducer tracking item completeness, keyed by ID. A complete item is one for + * which all fields are known. This is used in supporting `_fields` queries, + * where not all properties associated with an entity are necessarily returned. + * In such cases, completeness is used as an indication of whether it would be + * safe to use queried data for a non-`_fields`-limited request. + * + * @param {Object<string,Object<string,boolean>>} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object<string,Object<string,boolean>>} Next state. + */ +function itemIsComplete(state = {}, action) { + switch (action.type) { + case 'RECEIVE_ITEMS': + { + const context = getContextFromAction(action); + const { + query, + key = DEFAULT_ENTITY_KEY + } = action; + + // An item is considered complete if it is received without an associated + // fields query. Ideally, this would be implemented in such a way where the + // complete aggregate of all fields would satisfy completeness. Since the + // fields are not consistent across all entities, this would require + // introspection on the REST schema for each entity to know which fields + // compose a complete item for that entity. + const queryParts = query ? get_query_parts(query) : {}; + const isCompleteQuery = !query || !Array.isArray(queryParts.fields); + return { + ...state, + [context]: { + ...state[context], + ...action.items.reduce((result, item) => { + const itemId = item[key]; + + // Defer to completeness if already assigned. Technically the + // data may be outdated if receiving items for a field subset. + result[itemId] = state?.[context]?.[itemId] || isCompleteQuery; + return result; + }, {}) + } + }; + } + case 'REMOVE_ITEMS': + return Object.fromEntries(Object.entries(state).map(([itemId, contextState]) => [itemId, removeEntitiesById(contextState, action.itemIds)])); + } + return state; +} + +/** + * Reducer tracking queries state, keyed by stable query key. Each reducer + * query object includes `itemIds` and `requestingPageByPerPage`. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Next state. + */ +const receiveQueries = (0,external_wp_compose_namespaceObject.compose)([ +// Limit to matching action type so we don't attempt to replace action on +// an unhandled action. +if_matching_action(action => 'query' in action), +// Inject query parts into action for use both in `onSubKey` and reducer. +replace_action(action => { + // `ifMatchingAction` still passes on initialization, where state is + // undefined and a query is not assigned. Avoid attempting to parse + // parts. `onSubKey` will omit by lack of `stableKey`. + if (action.query) { + return { + ...action, + ...get_query_parts(action.query) + }; + } + return action; +}), on_sub_key('context'), +// Queries shape is shared, but keyed by query `stableKey` part. Original +// reducer tracks only a single query object. +on_sub_key('stableKey')])((state = null, action) => { + const { + type, + page, + perPage, + key = DEFAULT_ENTITY_KEY + } = action; + if (type !== 'RECEIVE_ITEMS') { + return state; + } + return getMergedItemIds(state || [], action.items.map(item => item[key]), page, perPage); +}); + +/** + * Reducer tracking queries state. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Next state. + */ +const queries = (state = {}, action) => { + switch (action.type) { + case 'RECEIVE_ITEMS': + return receiveQueries(state, action); + case 'REMOVE_ITEMS': + const removedItems = action.itemIds.reduce((result, itemId) => { + result[itemId] = true; + return result; + }, {}); + return Object.fromEntries(Object.entries(state).map(([queryGroup, contextQueries]) => [queryGroup, Object.fromEntries(Object.entries(contextQueries).map(([query, queryItems]) => [query, queryItems.filter(queryId => !removedItems[queryId])]))])); + default: + return state; + } +}; +/* harmony default export */ var reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ + items, + itemIsComplete, + queries +})); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/reducer.js +/** + * External dependencies + */ + + +/** + * WordPress dependencies + */ + + + + +/** + * Internal dependencies + */ + + + + +/** @typedef {import('./types').AnyFunction} AnyFunction */ + +/** + * Reducer managing terms state. Keyed by taxonomy slug, the value is either + * undefined (if no request has been made for given taxonomy), null (if a + * request is in-flight for given taxonomy), or the array of terms for the + * taxonomy. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function terms(state = {}, action) { + switch (action.type) { + case 'RECEIVE_TERMS': + return { + ...state, + [action.taxonomy]: action.terms + }; + } + return state; +} + +/** + * Reducer managing authors state. Keyed by id. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function users(state = { + byId: {}, + queries: {} +}, action) { + switch (action.type) { + case 'RECEIVE_USER_QUERY': + return { + byId: { + ...state.byId, + // Key users by their ID. + ...action.users.reduce((newUsers, user) => ({ + ...newUsers, + [user.id]: user + }), {}) + }, + queries: { + ...state.queries, + [action.queryID]: action.users.map(user => user.id) + } + }; + } + return state; +} + +/** + * Reducer managing current user state. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function currentUser(state = {}, action) { + switch (action.type) { + case 'RECEIVE_CURRENT_USER': + return action.currentUser; + } + return state; +} + +/** + * Reducer managing taxonomies. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function taxonomies(state = [], action) { + switch (action.type) { + case 'RECEIVE_TAXONOMIES': + return action.taxonomies; + } + return state; +} + +/** + * Reducer managing the current theme. + * + * @param {string|undefined} state Current state. + * @param {Object} action Dispatched action. + * + * @return {string|undefined} Updated state. + */ +function currentTheme(state = undefined, action) { + switch (action.type) { + case 'RECEIVE_CURRENT_THEME': + return action.currentTheme.stylesheet; + } + return state; +} + +/** + * Reducer managing the current global styles id. + * + * @param {string|undefined} state Current state. + * @param {Object} action Dispatched action. + * + * @return {string|undefined} Updated state. + */ +function currentGlobalStylesId(state = undefined, action) { + switch (action.type) { + case 'RECEIVE_CURRENT_GLOBAL_STYLES_ID': + return action.id; + } + return state; +} + +/** + * Reducer managing the theme base global styles. + * + * @param {Record<string, object>} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Record<string, object>} Updated state. + */ +function themeBaseGlobalStyles(state = {}, action) { + switch (action.type) { + case 'RECEIVE_THEME_GLOBAL_STYLES': + return { + ...state, + [action.stylesheet]: action.globalStyles + }; + } + return state; +} + +/** + * Reducer managing the theme global styles variations. + * + * @param {Record<string, object>} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Record<string, object>} Updated state. + */ +function themeGlobalStyleVariations(state = {}, action) { + switch (action.type) { + case 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS': + return { + ...state, + [action.stylesheet]: action.variations + }; + } + return state; +} +const withMultiEntityRecordEdits = reducer => (state, action) => { + if (action.type === 'UNDO' || action.type === 'REDO') { + const { + record + } = action; + let newState = state; + record.forEach(({ + id: { + kind, + name, + recordId + }, + changes + }) => { + newState = reducer(newState, { + type: 'EDIT_ENTITY_RECORD', + kind, + name, + recordId, + edits: Object.entries(changes).reduce((acc, [key, value]) => { + acc[key] = action.type === 'UNDO' ? value.from : value.to; + return acc; + }, {}) + }); + }); + return newState; + } + return reducer(state, action); +}; + +/** + * Higher Order Reducer for a given entity config. It supports: + * + * - Fetching + * - Editing + * - Saving + * + * @param {Object} entityConfig Entity config. + * + * @return {AnyFunction} Reducer. + */ +function entity(entityConfig) { + return (0,external_wp_compose_namespaceObject.compose)([withMultiEntityRecordEdits, + // Limit to matching action type so we don't attempt to replace action on + // an unhandled action. + if_matching_action(action => action.name && action.kind && action.name === entityConfig.name && action.kind === entityConfig.kind), + // Inject the entity config into the action. + replace_action(action => { + return { + ...action, + key: entityConfig.key || DEFAULT_ENTITY_KEY + }; + })])((0,external_wp_data_namespaceObject.combineReducers)({ + queriedData: reducer, + edits: (state = {}, action) => { + var _action$query$context; + switch (action.type) { + case 'RECEIVE_ITEMS': + const context = (_action$query$context = action?.query?.context) !== null && _action$query$context !== void 0 ? _action$query$context : 'default'; + if (context !== 'default') { + return state; + } + const nextState = { + ...state + }; + for (const record of action.items) { + const recordId = record[action.key]; + const edits = nextState[recordId]; + if (!edits) { + continue; + } + const nextEdits = Object.keys(edits).reduce((acc, key) => { + var _record$key$raw; + // If the edited value is still different to the persisted value, + // keep the edited value in edits. + if ( + // Edits are the "raw" attribute values, but records may have + // objects with more properties, so we use `get` here for the + // comparison. + !es6_default()(edits[key], (_record$key$raw = record[key]?.raw) !== null && _record$key$raw !== void 0 ? _record$key$raw : record[key]) && ( + // Sometimes the server alters the sent value which means + // we need to also remove the edits before the api request. + !action.persistedEdits || !es6_default()(edits[key], action.persistedEdits[key]))) { + acc[key] = edits[key]; + } + return acc; + }, {}); + if (Object.keys(nextEdits).length) { + nextState[recordId] = nextEdits; + } else { + delete nextState[recordId]; + } + } + return nextState; + case 'EDIT_ENTITY_RECORD': + const nextEdits = { + ...state[action.recordId], + ...action.edits + }; + Object.keys(nextEdits).forEach(key => { + // Delete cleared edits so that the properties + // are not considered dirty. + if (nextEdits[key] === undefined) { + delete nextEdits[key]; + } + }); + return { + ...state, + [action.recordId]: nextEdits + }; + } + return state; + }, + saving: (state = {}, action) => { + switch (action.type) { + case 'SAVE_ENTITY_RECORD_START': + case 'SAVE_ENTITY_RECORD_FINISH': + return { + ...state, + [action.recordId]: { + pending: action.type === 'SAVE_ENTITY_RECORD_START', + error: action.error, + isAutosave: action.isAutosave + } + }; + } + return state; + }, + deleting: (state = {}, action) => { + switch (action.type) { + case 'DELETE_ENTITY_RECORD_START': + case 'DELETE_ENTITY_RECORD_FINISH': + return { + ...state, + [action.recordId]: { + pending: action.type === 'DELETE_ENTITY_RECORD_START', + error: action.error + } + }; + } + return state; + } + })); +} + +/** + * Reducer keeping track of the registered entities. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function entitiesConfig(state = rootEntitiesConfig, action) { + switch (action.type) { + case 'ADD_ENTITIES': + return [...state, ...action.entities]; + } + return state; +} + +/** + * Reducer keeping track of the registered entities config and data. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +const entities = (state = {}, action) => { + const newConfig = entitiesConfig(state.config, action); + + // Generates a dynamic reducer for the entities. + let entitiesDataReducer = state.reducer; + if (!entitiesDataReducer || newConfig !== state.config) { + const entitiesByKind = newConfig.reduce((acc, record) => { + const { + kind + } = record; + if (!acc[kind]) { + acc[kind] = []; + } + acc[kind].push(record); + return acc; + }, {}); + entitiesDataReducer = (0,external_wp_data_namespaceObject.combineReducers)(Object.entries(entitiesByKind).reduce((memo, [kind, subEntities]) => { + const kindReducer = (0,external_wp_data_namespaceObject.combineReducers)(subEntities.reduce((kindMemo, entityConfig) => ({ + ...kindMemo, + [entityConfig.name]: entity(entityConfig) + }), {})); + memo[kind] = kindReducer; + return memo; + }, {})); + } + const newData = entitiesDataReducer(state.records, action); + if (newData === state.records && newConfig === state.config && entitiesDataReducer === state.reducer) { + return state; + } + return { + reducer: entitiesDataReducer, + records: newData, + config: newConfig + }; +}; + +/** + * @type {UndoManager} + */ +function undoManager(state = (0,build_module.createUndoManager)()) { + return state; +} +function editsReference(state = {}, action) { + switch (action.type) { + case 'EDIT_ENTITY_RECORD': + case 'UNDO': + case 'REDO': + return {}; + } + return state; +} + +/** + * Reducer managing embed preview data. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function embedPreviews(state = {}, action) { + switch (action.type) { + case 'RECEIVE_EMBED_PREVIEW': + const { + url, + preview + } = action; + return { + ...state, + [url]: preview + }; + } + return state; +} + +/** + * State which tracks whether the user can perform an action on a REST + * resource. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function userPermissions(state = {}, action) { + switch (action.type) { + case 'RECEIVE_USER_PERMISSION': + return { + ...state, + [action.key]: action.isAllowed + }; + } + return state; +} + +/** + * Reducer returning autosaves keyed by their parent's post id. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function autosaves(state = {}, action) { + switch (action.type) { + case 'RECEIVE_AUTOSAVES': + const { + postId, + autosaves: autosavesData + } = action; + return { + ...state, + [postId]: autosavesData + }; + } + return state; +} +function blockPatterns(state = [], action) { + switch (action.type) { + case 'RECEIVE_BLOCK_PATTERNS': + return action.patterns; + } + return state; +} +function blockPatternCategories(state = [], action) { + switch (action.type) { + case 'RECEIVE_BLOCK_PATTERN_CATEGORIES': + return action.categories; + } + return state; +} +function userPatternCategories(state = [], action) { + switch (action.type) { + case 'RECEIVE_USER_PATTERN_CATEGORIES': + return action.patternCategories; + } + return state; +} +function navigationFallbackId(state = null, action) { + switch (action.type) { + case 'RECEIVE_NAVIGATION_FALLBACK_ID': + return action.fallbackId; + } + return state; +} + +/** + * Reducer managing the theme global styles revisions. + * + * @param {Record<string, object>} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Record<string, object>} Updated state. + */ +function themeGlobalStyleRevisions(state = {}, action) { + switch (action.type) { + case 'RECEIVE_THEME_GLOBAL_STYLE_REVISIONS': + return { + ...state, + [action.currentId]: action.revisions + }; + } + return state; +} +/* harmony default export */ var build_module_reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ + terms, + users, + currentTheme, + currentGlobalStylesId, + currentUser, + themeGlobalStyleVariations, + themeBaseGlobalStyles, + themeGlobalStyleRevisions, + taxonomies, + entities, + editsReference, + undoManager, + embedPreviews, + userPermissions, + autosaves, + blockPatterns, + blockPatternCategories, + userPatternCategories, + navigationFallbackId +})); + +;// CONCATENATED MODULE: ./node_modules/rememo/rememo.js + + +/** @typedef {(...args: any[]) => *[]} GetDependants */ + +/** @typedef {() => void} Clear */ + +/** + * @typedef {{ + * getDependants: GetDependants, + * clear: Clear + * }} EnhancedSelector + */ + +/** + * Internal cache entry. + * + * @typedef CacheNode + * + * @property {?CacheNode|undefined} [prev] Previous node. + * @property {?CacheNode|undefined} [next] Next node. + * @property {*[]} args Function arguments for cache entry. + * @property {*} val Function result. + */ + +/** + * @typedef Cache + * + * @property {Clear} clear Function to clear cache. + * @property {boolean} [isUniqueByDependants] Whether dependants are valid in + * considering cache uniqueness. A cache is unique if dependents are all arrays + * or objects. + * @property {CacheNode?} [head] Cache head. + * @property {*[]} [lastDependants] Dependants from previous invocation. + */ + +/** + * Arbitrary value used as key for referencing cache object in WeakMap tree. + * + * @type {{}} + */ +var LEAF_KEY = {}; + +/** + * Returns the first argument as the sole entry in an array. + * + * @template T + * + * @param {T} value Value to return. + * + * @return {[T]} Value returned as entry in array. + */ +function arrayOf(value) { + return [value]; +} + +/** + * Returns true if the value passed is object-like, or false otherwise. A value + * is object-like if it can support property assignment, e.g. object or array. + * + * @param {*} value Value to test. + * + * @return {boolean} Whether value is object-like. + */ +function isObjectLike(value) { + return !!value && 'object' === typeof value; +} + +/** + * Creates and returns a new cache object. + * + * @return {Cache} Cache object. + */ +function createCache() { + /** @type {Cache} */ + var cache = { + clear: function () { + cache.head = null; + }, + }; + + return cache; +} + +/** + * Returns true if entries within the two arrays are strictly equal by + * reference from a starting index. + * + * @param {*[]} a First array. + * @param {*[]} b Second array. + * @param {number} fromIndex Index from which to start comparison. + * + * @return {boolean} Whether arrays are shallowly equal. + */ +function isShallowEqual(a, b, fromIndex) { + var i; + + if (a.length !== b.length) { + return false; + } + + for (i = fromIndex; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + + return true; +} + +/** + * Returns a memoized selector function. The getDependants function argument is + * called before the memoized selector and is expected to return an immutable + * reference or array of references on which the selector depends for computing + * its own return value. The memoize cache is preserved only as long as those + * dependant references remain the same. If getDependants returns a different + * reference(s), the cache is cleared and the selector value regenerated. + * + * @template {(...args: *[]) => *} S + * + * @param {S} selector Selector function. + * @param {GetDependants=} getDependants Dependant getter returning an array of + * references used in cache bust consideration. + */ +/* harmony default export */ function rememo(selector, getDependants) { + /** @type {WeakMap<*,*>} */ + var rootCache; + + /** @type {GetDependants} */ + var normalizedGetDependants = getDependants ? getDependants : arrayOf; + + /** + * Returns the cache for a given dependants array. When possible, a WeakMap + * will be used to create a unique cache for each set of dependants. This + * is feasible due to the nature of WeakMap in allowing garbage collection + * to occur on entries where the key object is no longer referenced. Since + * WeakMap requires the key to be an object, this is only possible when the + * dependant is object-like. The root cache is created as a hierarchy where + * each top-level key is the first entry in a dependants set, the value a + * WeakMap where each key is the next dependant, and so on. This continues + * so long as the dependants are object-like. If no dependants are object- + * like, then the cache is shared across all invocations. + * + * @see isObjectLike + * + * @param {*[]} dependants Selector dependants. + * + * @return {Cache} Cache object. + */ + function getCache(dependants) { + var caches = rootCache, + isUniqueByDependants = true, + i, + dependant, + map, + cache; + + for (i = 0; i < dependants.length; i++) { + dependant = dependants[i]; + + // Can only compose WeakMap from object-like key. + if (!isObjectLike(dependant)) { + isUniqueByDependants = false; + break; + } + + // Does current segment of cache already have a WeakMap? + if (caches.has(dependant)) { + // Traverse into nested WeakMap. + caches = caches.get(dependant); + } else { + // Create, set, and traverse into a new one. + map = new WeakMap(); + caches.set(dependant, map); + caches = map; + } + } + + // We use an arbitrary (but consistent) object as key for the last item + // in the WeakMap to serve as our running cache. + if (!caches.has(LEAF_KEY)) { + cache = createCache(); + cache.isUniqueByDependants = isUniqueByDependants; + caches.set(LEAF_KEY, cache); + } + + return caches.get(LEAF_KEY); + } + + /** + * Resets root memoization cache. + */ + function clear() { + rootCache = new WeakMap(); + } + + /* eslint-disable jsdoc/check-param-names */ + /** + * The augmented selector call, considering first whether dependants have + * changed before passing it to underlying memoize function. + * + * @param {*} source Source object for derivation. + * @param {...*} extraArgs Additional arguments to pass to selector. + * + * @return {*} Selector result. + */ + /* eslint-enable jsdoc/check-param-names */ + function callSelector(/* source, ...extraArgs */) { + var len = arguments.length, + cache, + node, + i, + args, + dependants; + + // Create copy of arguments (avoid leaking deoptimization). + args = new Array(len); + for (i = 0; i < len; i++) { + args[i] = arguments[i]; + } + + dependants = normalizedGetDependants.apply(null, args); + cache = getCache(dependants); + + // If not guaranteed uniqueness by dependants (primitive type), shallow + // compare against last dependants and, if references have changed, + // destroy cache to recalculate result. + if (!cache.isUniqueByDependants) { + if ( + cache.lastDependants && + !isShallowEqual(dependants, cache.lastDependants, 0) + ) { + cache.clear(); + } + + cache.lastDependants = dependants; + } + + node = cache.head; + while (node) { + // Check whether node arguments match arguments + if (!isShallowEqual(node.args, args, 1)) { + node = node.next; + continue; + } + + // At this point we can assume we've found a match + + // Surface matched node to head if not already + if (node !== cache.head) { + // Adjust siblings to point to each other. + /** @type {CacheNode} */ (node.prev).next = node.next; + if (node.next) { + node.next.prev = node.prev; + } + + node.next = cache.head; + node.prev = null; + /** @type {CacheNode} */ (cache.head).prev = node; + cache.head = node; + } + + // Return immediately + return node.val; + } + + // No cached value found. Continue to insertion phase: + + node = /** @type {CacheNode} */ ({ + // Generate the result from original function + val: selector.apply(null, args), + }); + + // Avoid including the source object in the cache. + args[0] = null; + node.args = args; + + // Don't need to check whether node is already head, since it would + // have been returned above already if it was + + // Shift existing head down list + if (cache.head) { + cache.head.prev = node; + node.next = cache.head; + } + + cache.head = node; + + return node.val; + } + + callSelector.getDependants = normalizedGetDependants; + callSelector.clear = clear; + clear(); + + return /** @type {S & EnhancedSelector} */ (callSelector); +} + +// EXTERNAL MODULE: ./node_modules/equivalent-key-map/equivalent-key-map.js +var equivalent_key_map = __webpack_require__(2167); +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 +/** + * External dependencies + */ + + + +/** + * Internal dependencies + */ + + + +/** + * Cache of state keys to EquivalentKeyMap where the inner map tracks queries + * to their resulting items set. WeakMap allows garbage collection on expired + * state references. + * + * @type {WeakMap<Object,EquivalentKeyMap>} + */ +const queriedItemsCacheByState = new WeakMap(); + +/** + * Returns items for a given query, or null if the items are not known. + * + * @param {Object} state State object. + * @param {?Object} query Optional query. + * + * @return {?Array} Query items. + */ +function getQueriedItemsUncached(state, query) { + const { + stableKey, + page, + perPage, + include, + fields, + context + } = get_query_parts(query); + let itemIds; + if (state.queries?.[context]?.[stableKey]) { + itemIds = state.queries[context][stableKey]; + } + if (!itemIds) { + return null; + } + const startOffset = perPage === -1 ? 0 : (page - 1) * perPage; + const endOffset = perPage === -1 ? itemIds.length : Math.min(startOffset + perPage, itemIds.length); + const items = []; + for (let i = startOffset; i < endOffset; i++) { + const itemId = itemIds[i]; + if (Array.isArray(include) && !include.includes(itemId)) { + continue; + } + + // Having a target item ID doesn't guarantee that this object has been queried. + if (!state.items[context]?.hasOwnProperty(itemId)) { + return null; + } + const item = state.items[context][itemId]; + let filteredItem; + if (Array.isArray(fields)) { + filteredItem = {}; + for (let f = 0; f < fields.length; f++) { + const field = fields[f].split('.'); + let value = item; + field.forEach(fieldName => { + value = value?.[fieldName]; + }); + setNestedValue(filteredItem, field, value); + } + } else { + // If expecting a complete item, validate that completeness, or + // otherwise abort. + if (!state.itemIsComplete[context]?.[itemId]) { + return null; + } + filteredItem = item; + } + items.push(filteredItem); + } + return items; +} + +/** + * Returns items for a given query, or null if the items are not known. Caches + * result both per state (by reference) and per query (by deep equality). + * The caching approach is intended to be durable to query objects which are + * deeply but not referentially equal, since otherwise: + * + * `getQueriedItems( state, {} ) !== getQueriedItems( state, {} )` + * + * @param {Object} state State object. + * @param {?Object} query Optional query. + * + * @return {?Array} Query items. + */ +const getQueriedItems = rememo((state, query = {}) => { + let queriedItemsCache = queriedItemsCacheByState.get(state); + if (queriedItemsCache) { + const queriedItems = queriedItemsCache.get(query); + if (queriedItems !== undefined) { + return queriedItems; + } + } else { + queriedItemsCache = new (equivalent_key_map_default())(); + queriedItemsCacheByState.set(state, queriedItemsCache); + } + const items = getQueriedItemsUncached(state, query); + queriedItemsCache.set(query, items); + return items; +}); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/is-raw-attribute.js +/** + * Checks whether the attribute is a "raw" attribute or not. + * + * @param {Object} entity Entity record. + * @param {string} attribute Attribute name. + * + * @return {boolean} Is the attribute raw + */ +function isRawAttribute(entity, attribute) { + return (entity.rawAttributes || []).includes(attribute); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/selectors.js +/** + * External dependencies + */ + + +/** + * WordPress dependencies + */ + + + + +/** + * Internal dependencies + */ + + + + +/** + * Shared reference to an empty object for cases where it is important to avoid + * returning a new object reference on every invocation, as in a connected or + * other pure component which performs `shouldComponentUpdate` check on props. + * This should be used as a last resort, since the normalized data should be + * maintained by the reducer result in state. + */ +const EMPTY_OBJECT = {}; + +/** + * Returns true if a request is in progress for embed preview data, or false + * otherwise. + * + * @param state Data state. + * @param url URL the preview would be for. + * + * @return Whether a request is in progress for an embed preview. + */ +const isRequestingEmbedPreview = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, url) => { + return select(STORE_NAME).isResolving('getEmbedPreview', [url]); +}); + +/** + * Returns all available authors. + * + * @deprecated since 11.3. Callers should use `select( 'core' ).getUsers({ who: 'authors' })` instead. + * + * @param state Data state. + * @param query Optional object of query parameters to + * include with request. For valid query parameters see the [Users page](https://developer.wordpress.org/rest-api/reference/users/) in the REST API Handbook and see the arguments for [List Users](https://developer.wordpress.org/rest-api/reference/users/#list-users) and [Retrieve a User](https://developer.wordpress.org/rest-api/reference/users/#retrieve-a-user). + * @return Authors list. + */ +function getAuthors(state, query) { + external_wp_deprecated_default()("select( 'core' ).getAuthors()", { + since: '5.9', + alternative: "select( 'core' ).getUsers({ who: 'authors' })" + }); + const path = (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/users/?who=authors&per_page=100', query); + return getUserQueryResults(state, path); +} + +/** + * Returns the current user. + * + * @param state Data state. + * + * @return Current user object. + */ +function getCurrentUser(state) { + return state.currentUser; +} + +/** + * Returns all the users returned by a query ID. + * + * @param state Data state. + * @param queryID Query ID. + * + * @return Users list. + */ +const getUserQueryResults = rememo((state, queryID) => { + var _state$users$queries$; + const queryResults = (_state$users$queries$ = state.users.queries[queryID]) !== null && _state$users$queries$ !== void 0 ? _state$users$queries$ : []; + return queryResults.map(id => state.users.byId[id]); +}, (state, queryID) => [state.users.queries[queryID], state.users.byId]); + +/** + * Returns the loaded entities for the given kind. + * + * @deprecated since WordPress 6.0. Use getEntitiesConfig instead + * @param state Data state. + * @param kind Entity kind. + * + * @return Array of entities with config matching kind. + */ +function getEntitiesByKind(state, kind) { + external_wp_deprecated_default()("wp.data.select( 'core' ).getEntitiesByKind()", { + since: '6.0', + alternative: "wp.data.select( 'core' ).getEntitiesConfig()" + }); + return getEntitiesConfig(state, kind); +} + +/** + * Returns the loaded entities for the given kind. + * + * @param state Data state. + * @param kind Entity kind. + * + * @return Array of entities with config matching kind. + */ +function getEntitiesConfig(state, kind) { + return state.entities.config.filter(entity => entity.kind === kind); +} + +/** + * Returns the entity config given its kind and name. + * + * @deprecated since WordPress 6.0. Use getEntityConfig instead + * @param state Data state. + * @param kind Entity kind. + * @param name Entity name. + * + * @return Entity config + */ +function getEntity(state, kind, name) { + external_wp_deprecated_default()("wp.data.select( 'core' ).getEntity()", { + since: '6.0', + alternative: "wp.data.select( 'core' ).getEntityConfig()" + }); + return getEntityConfig(state, kind, name); +} + +/** + * Returns the entity config given its kind and name. + * + * @param state Data state. + * @param kind Entity kind. + * @param name Entity name. + * + * @return Entity config + */ +function getEntityConfig(state, kind, name) { + return state.entities.config?.find(config => config.kind === kind && config.name === name); +} + +/** + * GetEntityRecord is declared as a *callable interface* with + * two signatures to work around the fact that TypeScript doesn't + * allow currying generic functions: + * + * ```ts + * type CurriedState = F extends ( state: any, ...args: infer P ) => infer R + * ? ( ...args: P ) => R + * : F; + * type Selector = <K extends string | number>( + * state: any, + * kind: K, + * key: K extends string ? 'string value' : false + * ) => K; + * type BadlyInferredSignature = CurriedState< Selector > + * // BadlyInferredSignature evaluates to: + * // (kind: string number, key: false | "string value") => string number + * ``` + * + * The signature without the state parameter shipped as CurriedSignature + * is used in the return value of `select( coreStore )`. + * + * See https://github.com/WordPress/gutenberg/pull/41578 for more details. + */ + +/** + * Returns the Entity's record object by key. Returns `null` if the value is not + * yet received, undefined if the value entity is known to not exist, or the + * entity object if it exists and is received. + * + * @param state State tree + * @param kind Entity kind. + * @param name Entity name. + * @param key Record's key + * @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]". + * + * @return Record. + */ +const getEntityRecord = rememo((state, kind, name, key, query) => { + var _query$context; + const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; + if (!queriedState) { + return undefined; + } + const context = (_query$context = query?.context) !== null && _query$context !== void 0 ? _query$context : 'default'; + if (query === undefined) { + // If expecting a complete item, validate that completeness. + if (!queriedState.itemIsComplete[context]?.[key]) { + return undefined; + } + return queriedState.items[context][key]; + } + const item = queriedState.items[context]?.[key]; + if (item && query._fields) { + var _getNormalizedCommaSe; + const filteredItem = {}; + const fields = (_getNormalizedCommaSe = get_normalized_comma_separable(query._fields)) !== null && _getNormalizedCommaSe !== void 0 ? _getNormalizedCommaSe : []; + for (let f = 0; f < fields.length; f++) { + const field = fields[f].split('.'); + let value = item; + field.forEach(fieldName => { + value = value?.[fieldName]; + }); + setNestedValue(filteredItem, field, value); + } + return filteredItem; + } + return item; +}, (state, kind, name, recordId, query) => { + var _query$context2; + const context = (_query$context2 = query?.context) !== null && _query$context2 !== void 0 ? _query$context2 : 'default'; + return [state.entities.records?.[kind]?.[name]?.queriedData?.items[context]?.[recordId], state.entities.records?.[kind]?.[name]?.queriedData?.itemIsComplete[context]?.[recordId]]; +}); + +/** + * Returns the Entity's record object by key. Doesn't trigger a resolver nor requests the entity records from the API if the entity record isn't available in the local state. + * + * @param state State tree + * @param kind Entity kind. + * @param name Entity name. + * @param key Record's key + * + * @return Record. + */ +function __experimentalGetEntityRecordNoResolver(state, kind, name, key) { + return getEntityRecord(state, kind, name, key); +} + +/** + * Returns the entity's record object by key, + * with its attributes mapped to their raw values. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param key Record's key. + * + * @return Object with the entity's raw attributes. + */ +const getRawEntityRecord = rememo((state, kind, name, key) => { + 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]; + } else { + accumulator[_key] = record[_key]; + } + return accumulator; + }, {}); +}, (state, kind, name, recordId, query) => { + var _query$context3; + const context = (_query$context3 = query?.context) !== null && _query$context3 !== void 0 ? _query$context3 : 'default'; + return [state.entities.config, state.entities.records?.[kind]?.[name]?.queriedData?.items[context]?.[recordId], state.entities.records?.[kind]?.[name]?.queriedData?.itemIsComplete[context]?.[recordId]]; +}); + +/** + * Returns true if records have been received for the given set of parameters, + * or false otherwise. + * + * @param state State tree + * @param kind Entity kind. + * @param name Entity name. + * @param query Optional terms query. 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 for "List [Entity kind]s". + * + * @return Whether entity records have been received. + */ +function hasEntityRecords(state, kind, name, query) { + return Array.isArray(getEntityRecords(state, kind, name, query)); +} + +/** + * GetEntityRecord is declared as a *callable interface* with + * two signatures to work around the fact that TypeScript doesn't + * allow currying generic functions. + * + * @see GetEntityRecord + * @see https://github.com/WordPress/gutenberg/pull/41578 + */ + +/** + * Returns the Entity's records. + * + * @param state State tree + * @param kind Entity kind. + * @param name Entity name. + * @param query Optional terms 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 for "List [Entity kind]s". + * + * @return Records. + */ +const getEntityRecords = (state, kind, name, query) => { + // Queried data state is prepopulated for all known entities. If this is not + // assigned for the given parameters, then it is known to not exist. + const queriedState = state.entities.records?.[kind]?.[name]?.queriedData; + if (!queriedState) { + return null; + } + return getQueriedItems(queriedState, query); +}; +/** + * Returns the list of dirty entity records. + * + * @param state State tree. + * + * @return The list of updated records + */ +const __experimentalGetDirtyEntityRecords = rememo(state => { + const { + entities: { + records + } + } = state; + const dirtyRecords = []; + Object.keys(records).forEach(kind => { + Object.keys(records[kind]).forEach(name => { + const primaryKeys = Object.keys(records[kind][name].edits).filter(primaryKey => + // The entity record must exist (not be deleted), + // and it must have edits. + getEntityRecord(state, kind, name, primaryKey) && hasEditsForEntityRecord(state, kind, name, primaryKey)); + if (primaryKeys.length) { + const entityConfig = getEntityConfig(state, kind, name); + primaryKeys.forEach(primaryKey => { + const entityRecord = getEditedEntityRecord(state, kind, name, primaryKey); + dirtyRecords.push({ + // We avoid using primaryKey because it's transformed into a string + // when it's used as an object key. + key: entityRecord ? entityRecord[entityConfig.key || DEFAULT_ENTITY_KEY] : undefined, + title: entityConfig?.getTitle?.(entityRecord) || '', + name, + kind + }); + }); + } + }); + }); + return dirtyRecords; +}, state => [state.entities.records]); + +/** + * Returns the list of entities currently being saved. + * + * @param state State tree. + * + * @return The list of records being saved. + */ +const __experimentalGetEntitiesBeingSaved = rememo(state => { + const { + entities: { + records + } + } = state; + const recordsBeingSaved = []; + Object.keys(records).forEach(kind => { + Object.keys(records[kind]).forEach(name => { + const primaryKeys = Object.keys(records[kind][name].saving).filter(primaryKey => isSavingEntityRecord(state, kind, name, primaryKey)); + if (primaryKeys.length) { + const entityConfig = getEntityConfig(state, kind, name); + primaryKeys.forEach(primaryKey => { + const entityRecord = getEditedEntityRecord(state, kind, name, primaryKey); + recordsBeingSaved.push({ + // We avoid using primaryKey because it's transformed into a string + // when it's used as an object key. + key: entityRecord ? entityRecord[entityConfig.key || DEFAULT_ENTITY_KEY] : undefined, + title: entityConfig?.getTitle?.(entityRecord) || '', + name, + kind + }); + }); + } + }); + }); + return recordsBeingSaved; +}, state => [state.entities.records]); + +/** + * Returns the specified entity record's edits. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return The entity record's edits. + */ +function getEntityRecordEdits(state, kind, name, recordId) { + return state.entities.records?.[kind]?.[name]?.edits?.[recordId]; +} + +/** + * Returns the specified entity record's non transient edits. + * + * Transient edits don't create an undo level, and + * are not considered for change detection. + * They are defined in the entity's config. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return The entity record's non transient edits. + */ +const getEntityRecordNonTransientEdits = rememo((state, kind, name, recordId) => { + const { + transientEdits + } = getEntityConfig(state, kind, name) || {}; + const edits = getEntityRecordEdits(state, kind, name, recordId) || {}; + if (!transientEdits) { + return edits; + } + return Object.keys(edits).reduce((acc, key) => { + if (!transientEdits[key]) { + acc[key] = edits[key]; + } + return acc; + }, {}); +}, (state, kind, name, recordId) => [state.entities.config, state.entities.records?.[kind]?.[name]?.edits?.[recordId]]); + +/** + * Returns true if the specified entity record has edits, + * and false otherwise. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return Whether the entity record has edits or not. + */ +function hasEditsForEntityRecord(state, kind, name, recordId) { + return isSavingEntityRecord(state, kind, name, recordId) || Object.keys(getEntityRecordNonTransientEdits(state, kind, name, recordId)).length > 0; +} + +/** + * Returns the specified entity record, merged with its edits. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return The entity record, merged with its edits. + */ +const getEditedEntityRecord = rememo((state, kind, name, recordId) => ({ + ...getRawEntityRecord(state, kind, name, recordId), + ...getEntityRecordEdits(state, kind, name, recordId) +}), (state, kind, name, recordId, query) => { + var _query$context4; + const context = (_query$context4 = query?.context) !== null && _query$context4 !== void 0 ? _query$context4 : 'default'; + return [state.entities.config, state.entities.records?.[kind]?.[name]?.queriedData.items[context]?.[recordId], state.entities.records?.[kind]?.[name]?.queriedData.itemIsComplete[context]?.[recordId], state.entities.records?.[kind]?.[name]?.edits?.[recordId]]; +}); + +/** + * Returns true if the specified entity record is autosaving, and false otherwise. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return Whether the entity record is autosaving or not. + */ +function isAutosavingEntityRecord(state, kind, name, recordId) { + var _state$entities$recor; + const { + pending, + isAutosave + } = (_state$entities$recor = state.entities.records?.[kind]?.[name]?.saving?.[recordId]) !== null && _state$entities$recor !== void 0 ? _state$entities$recor : {}; + return Boolean(pending && isAutosave); +} + +/** + * Returns true if the specified entity record is saving, and false otherwise. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return Whether the entity record is saving or not. + */ +function isSavingEntityRecord(state, kind, name, recordId) { + var _state$entities$recor2; + return (_state$entities$recor2 = state.entities.records?.[kind]?.[name]?.saving?.[recordId]?.pending) !== null && _state$entities$recor2 !== void 0 ? _state$entities$recor2 : false; +} + +/** + * Returns true if the specified entity record is deleting, and false otherwise. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return Whether the entity record is deleting or not. + */ +function isDeletingEntityRecord(state, kind, name, recordId) { + var _state$entities$recor3; + return (_state$entities$recor3 = state.entities.records?.[kind]?.[name]?.deleting?.[recordId]?.pending) !== null && _state$entities$recor3 !== void 0 ? _state$entities$recor3 : false; +} + +/** + * Returns the specified entity record's last save error. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return The entity record's save error. + */ +function getLastEntitySaveError(state, kind, name, recordId) { + return state.entities.records?.[kind]?.[name]?.saving?.[recordId]?.error; +} + +/** + * Returns the specified entity record's last delete error. + * + * @param state State tree. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record ID. + * + * @return The entity record's save error. + */ +function getLastEntityDeleteError(state, kind, name, recordId) { + return state.entities.records?.[kind]?.[name]?.deleting?.[recordId]?.error; +} + +/** + * Returns the previous edit from the current undo offset + * for the entity records edits history, if any. + * + * @deprecated since 6.3 + * + * @param state State tree. + * + * @return The edit. + */ +function getUndoEdit(state) { + external_wp_deprecated_default()("select( 'core' ).getUndoEdit()", { + since: '6.3' + }); + return undefined; +} + +/** + * Returns the next edit from the current undo offset + * for the entity records edits history, if any. + * + * @deprecated since 6.3 + * + * @param state State tree. + * + * @return The edit. + */ +function getRedoEdit(state) { + external_wp_deprecated_default()("select( 'core' ).getRedoEdit()", { + since: '6.3' + }); + return undefined; +} + +/** + * Returns true if there is a previous edit from the current undo offset + * for the entity records edits history, and false otherwise. + * + * @param state State tree. + * + * @return Whether there is a previous edit or not. + */ +function hasUndo(state) { + return state.undoManager.hasUndo(); +} + +/** + * Returns true if there is a next edit from the current undo offset + * for the entity records edits history, and false otherwise. + * + * @param state State tree. + * + * @return Whether there is a next edit or not. + */ +function hasRedo(state) { + return state.undoManager.hasRedo(); +} + +/** + * Return the current theme. + * + * @param state Data state. + * + * @return The current theme. + */ +function getCurrentTheme(state) { + return getEntityRecord(state, 'root', 'theme', state.currentTheme); +} + +/** + * Return the ID of the current global styles object. + * + * @param state Data state. + * + * @return The current global styles ID. + */ +function __experimentalGetCurrentGlobalStylesId(state) { + return state.currentGlobalStylesId; +} + +/** + * Return theme supports data in the index. + * + * @param state Data state. + * + * @return Index data. + */ +function getThemeSupports(state) { + var _getCurrentTheme$them; + return (_getCurrentTheme$them = getCurrentTheme(state)?.theme_supports) !== null && _getCurrentTheme$them !== void 0 ? _getCurrentTheme$them : EMPTY_OBJECT; +} + +/** + * Returns the embed preview for the given URL. + * + * @param state Data state. + * @param url Embedded URL. + * + * @return Undefined if the preview has not been fetched, otherwise, the preview fetched from the embed preview API. + */ +function getEmbedPreview(state, url) { + return state.embedPreviews[url]; +} + +/** + * Determines if the returned preview is an oEmbed link fallback. + * + * WordPress can be configured to return a simple link to a URL if it is not embeddable. + * We need to be able to determine if a URL is embeddable or not, based on what we + * get back from the oEmbed preview API. + * + * @param state Data state. + * @param url Embedded URL. + * + * @return Is the preview for the URL an oEmbed link fallback. + */ +function isPreviewEmbedFallback(state, url) { + const preview = state.embedPreviews[url]; + const oEmbedLinkCheck = '<a href="' + url + '">' + url + '</a>'; + if (!preview) { + return false; + } + return preview.html === oEmbedLinkCheck; +} + +/** + * Returns whether the current user can perform the given action on the given + * REST resource. + * + * Calling this may trigger an OPTIONS request to the REST API via the + * `canUser()` resolver. + * + * https://developer.wordpress.org/rest-api/reference/ + * + * @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 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('/'); + return state.userPermissions[key]; +} + +/** + * Returns whether the current user can edit the given entity. + * + * Calling this may trigger an OPTIONS request to the REST API via the + * `canUser()` resolver. + * + * https://developer.wordpress.org/rest-api/reference/ + * + * @param state Data state. + * @param kind Entity kind. + * @param name Entity name. + * @param recordId Record's id. + * @return Whether or not the user can edit, + * 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); +} + +/** + * Returns the latest autosaves for the post. + * + * May return multiple autosaves since the backend stores one autosave per + * author for each post. + * + * @param state State tree. + * @param postType The type of the parent post. + * @param postId The id of the parent post. + * + * @return An array of autosaves for the post, or undefined if there is none. + */ +function getAutosaves(state, postType, postId) { + return state.autosaves[postId]; +} + +/** + * Returns the autosave for the post and author. + * + * @param state State tree. + * @param postType The type of the parent post. + * @param postId The id of the parent post. + * @param authorId The id of the author. + * + * @return The autosave for the post and author. + */ +function getAutosave(state, postType, postId, authorId) { + if (authorId === undefined) { + return; + } + const autosaves = state.autosaves[postId]; + return autosaves?.find(autosave => autosave.author === authorId); +} + +/** + * Returns true if the REST request for autosaves has completed. + * + * @param state State tree. + * @param postType The type of the parent post. + * @param postId The id of the parent post. + * + * @return True if the REST request was completed. False otherwise. + */ +const hasFetchedAutosaves = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, postType, postId) => { + return select(STORE_NAME).hasFinishedResolution('getAutosaves', [postType, postId]); +}); + +/** + * Returns a new reference when edited values have changed. This is useful in + * inferring where an edit has been made between states by comparison of the + * return values using strict equality. + * + * @example + * + * ``` + * const hasEditOccurred = ( + * getReferenceByDistinctEdits( beforeState ) !== + * getReferenceByDistinctEdits( afterState ) + * ); + * ``` + * + * @param state Editor state. + * + * @return A value whose reference will change only when an edit occurs. + */ +function getReferenceByDistinctEdits(state) { + return state.editsReference; +} + +/** + * 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. + * + * @return The Global Styles object. + */ +function __experimentalGetCurrentThemeBaseGlobalStyles(state) { + const currentTheme = getCurrentTheme(state); + if (!currentTheme) { + return null; + } + return state.themeBaseGlobalStyles[currentTheme.stylesheet]; +} + +/** + * Return the ID of the current global styles object. + * + * @param state Data state. + * + * @return The current global styles ID. + */ +function __experimentalGetCurrentThemeGlobalStylesVariations(state) { + const currentTheme = getCurrentTheme(state); + if (!currentTheme) { + return null; + } + return state.themeGlobalStyleVariations[currentTheme.stylesheet]; +} + +/** + * Retrieve the list of registered block patterns. + * + * @param state Data state. + * + * @return Block pattern list. + */ +function getBlockPatterns(state) { + return state.blockPatterns; +} + +/** + * Retrieve the list of registered block pattern categories. + * + * @param state Data state. + * + * @return Block pattern category list. + */ +function getBlockPatternCategories(state) { + return state.blockPatternCategories; +} + +/** + * Retrieve the registered user pattern categories. + * + * @param state Data state. + * + * @return User patterns category array. + */ + +function getUserPatternCategories(state) { + return state.userPatternCategories; +} + +/** + * Returns the revisions of the current global styles theme. + * + * @param state Data state. + * + * @return The current global styles. + */ +function getCurrentThemeGlobalStylesRevisions(state) { + const currentGlobalStylesId = __experimentalGetCurrentGlobalStylesId(state); + if (!currentGlobalStylesId) { + return null; + } + return state.themeGlobalStyleRevisions[currentGlobalStylesId]; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/private-selectors.js +/** + * Internal dependencies + */ + +/** + * Returns the previous edit from the current undo offset + * for the entity records edits history, if any. + * + * @param state State tree. + * + * @return The undo manager. + */ +function getUndoManager(state) { + return state.undoManager; +} + +/** + * Retrieve the fallback Navigation. + * + * @param state Data state. + * @return The ID for the fallback Navigation post. + */ +function getNavigationFallbackId(state) { + return state.navigationFallbackId; +} + +;// CONCATENATED MODULE: ./node_modules/camel-case/dist.es2015/index.js + + +function camelCaseTransform(input, index) { + if (index === 0) + return input.toLowerCase(); + return pascalCaseTransform(input, index); +} +function camelCaseTransformMerge(input, index) { + if (index === 0) + return input.toLowerCase(); + return pascalCaseTransformMerge(input); +} +function camelCase(input, options) { + if (options === void 0) { options = {}; } + return pascalCase(input, __assign({ transform: camelCaseTransform }, options)); +} + +;// CONCATENATED MODULE: ./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. + * + * @param {string} resolverName forwarded resolver. + * + * @return {Function} Enhanced resolver. + */ +const forwardResolver = resolverName => (...args) => async ({ + resolveSelect +}) => { + await resolveSelect[resolverName](...args); +}; +/* harmony default export */ var forward_resolver = (forwardResolver); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/resolvers.js +/** + * External dependencies + */ + + +/** + * WordPress dependencies + */ + + + +/** + * Internal dependencies + */ + + + + + +/** + * Requests authors from the REST API. + * + * @param {Object|undefined} query Optional object of query parameters to + * include with request. + */ +const resolvers_getAuthors = query => async ({ + dispatch +}) => { + const path = (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/users/?who=authors&per_page=100', query); + const users = await external_wp_apiFetch_default()({ + path + }); + dispatch.receiveUserQuery(path, users); +}; + +/** + * Requests the current user from the REST API. + */ +const resolvers_getCurrentUser = () => async ({ + dispatch +}) => { + const currentUser = await external_wp_apiFetch_default()({ + path: '/wp/v2/users/me' + }); + dispatch.receiveCurrentUser(currentUser); +}; + +/** + * Requests an entity's record from the REST API. + * + * @param {string} kind Entity kind. + * @param {string} name Entity name. + * @param {number|string} key Record's key + * @param {Object|undefined} query Optional object of query parameters to + * include with request. If requesting specific + * fields, fields must always include the ID. + */ +const resolvers_getEntityRecord = (kind, name, key = '', query) => async ({ + select, + dispatch +}) => { + const configs = await dispatch(getOrLoadEntitiesConfig(kind)); + const entityConfig = configs.find(config => config.name === name && config.kind === kind); + if (!entityConfig || entityConfig?.__experimentalNoFetch) { + return; + } + const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, key], { + exclusive: false + }); + try { + // Entity supports configs, + // use the sync algorithm instead of the old fetch behavior. + if (window.__experimentalEnableSync && entityConfig.syncConfig && !query) { + if (false) {} + } else { + if (query !== undefined && query._fields) { + // If requesting specific fields, items and query association to said + // records are stored by ID reference. Thus, fields must always include + // the ID. + query = { + ...query, + _fields: [...new Set([...(get_normalized_comma_separable(query._fields) || []), entityConfig.key || DEFAULT_ENTITY_KEY])].join() + }; + } + + // Disable reason: While true that an early return could leave `path` + // unused, it's important that path is derived using the query prior to + // additional query modifications in the condition below, since those + // modifications are relevant to how the data is tracked in state, and not + // for how the request is made to the REST API. + + // eslint-disable-next-line @wordpress/no-unused-vars-before-return + const path = (0,external_wp_url_namespaceObject.addQueryArgs)(entityConfig.baseURL + (key ? '/' + key : ''), { + ...entityConfig.baseURLParams, + ...query + }); + if (query !== undefined) { + query = { + ...query, + include: [key] + }; + + // The resolution cache won't consider query as reusable based on the + // fields, so it's tested here, prior to initiating the REST request, + // and without causing `getEntityRecords` resolution to occur. + const hasRecords = select.hasEntityRecords(kind, name, query); + if (hasRecords) { + return; + } + } + const record = await external_wp_apiFetch_default()({ + path + }); + dispatch.receiveEntityRecords(kind, name, record, query); + } + } finally { + dispatch.__unstableReleaseStoreLock(lock); + } +}; + +/** + * Requests an entity's record from the REST API. + */ +const resolvers_getRawEntityRecord = forward_resolver('getEntityRecord'); + +/** + * Requests an entity's record from the REST API. + */ +const resolvers_getEditedEntityRecord = forward_resolver('getEntityRecord'); + +/** + * Requests the entity's records from the REST API. + * + * @param {string} kind Entity kind. + * @param {string} name Entity name. + * @param {Object?} query Query Object. If requesting specific fields, fields + * must always include the ID. + */ +const resolvers_getEntityRecords = (kind, name, query = {}) => async ({ + dispatch +}) => { + const configs = await dispatch(getOrLoadEntitiesConfig(kind)); + const entityConfig = configs.find(config => config.name === name && config.kind === kind); + if (!entityConfig || entityConfig?.__experimentalNoFetch) { + return; + } + const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name], { + exclusive: false + }); + try { + if (query._fields) { + // If requesting specific fields, items and query association to said + // records are stored by ID reference. Thus, fields must always include + // the ID. + query = { + ...query, + _fields: [...new Set([...(get_normalized_comma_separable(query._fields) || []), entityConfig.key || DEFAULT_ENTITY_KEY])].join() + }; + } + const path = (0,external_wp_url_namespaceObject.addQueryArgs)(entityConfig.baseURL, { + ...entityConfig.baseURLParams, + ...query + }); + let records = Object.values(await external_wp_apiFetch_default()({ + path + })); + // If we request fields but the result doesn't contain the fields, + // explicitly set these fields as "undefined" + // that way we consider the query "fullfilled". + if (query._fields) { + records = records.map(record => { + query._fields.split(',').forEach(field => { + if (!record.hasOwnProperty(field)) { + record[field] = undefined; + } + }); + return record; + }); + } + dispatch.receiveEntityRecords(kind, name, records, query); + + // When requesting all fields, the list of results can be used to + // resolve the `getEntityRecord` selector in addition to `getEntityRecords`. + // See https://github.com/WordPress/gutenberg/pull/26575 + 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 + }); + } + } finally { + dispatch.__unstableReleaseStoreLock(lock); + } +}; +resolvers_getEntityRecords.shouldInvalidate = (action, kind, name) => { + return (action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS') && action.invalidateCache && kind === action.kind && name === action.name; +}; + +/** + * Requests the current theme. + */ +const resolvers_getCurrentTheme = () => async ({ + dispatch, + resolveSelect +}) => { + const activeThemes = await resolveSelect.getEntityRecords('root', 'theme', { + status: 'active' + }); + dispatch.receiveCurrentTheme(activeThemes[0]); +}; + +/** + * Requests theme supports data from the index. + */ +const resolvers_getThemeSupports = forward_resolver('getCurrentTheme'); + +/** + * Requests a preview from the from the Embed API. + * + * @param {string} url URL to get the preview for. + */ +const resolvers_getEmbedPreview = url => async ({ + dispatch +}) => { + try { + const embedProxyResponse = await external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)('/oembed/1.0/proxy', { + url + }) + }); + dispatch.receiveEmbedPreview(url, embedProxyResponse); + } catch (error) { + // Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here. + dispatch.receiveEmbedPreview(url, false); + } +}; + +/** + * 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. + */ +const resolvers_canUser = (requestedAction, resource, id) => async ({ + dispatch, + registry +}) => { + 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) { + if (relatedAction === requestedAction) { + continue; + } + const isAlreadyResolving = hasStartedResolution('canUser', [relatedAction, resource, id]); + if (isAlreadyResolving) { + return; + } + } + let response; + try { + response = await external_wp_apiFetch_default()({ + path: `/wp/v2/${resourcePath}`, + method: 'OPTIONS', + parse: false + }); + } catch (error) { + // Do nothing if our OPTIONS request comes back with an API error (4xx or + // 5xx). The previously determined isAllowed value will remain in the store. + return; + } + + // Optional chaining operator is used here because the API requests don't + // return the expected result in the 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]); + } +}; + +/** + * 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. + */ +const resolvers_canUserEditEntityRecord = (kind, name, recordId) => async ({ + dispatch +}) => { + const configs = await dispatch(getOrLoadEntitiesConfig(kind)); + 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)); +}; + +/** + * Request autosave data from the REST API. + * + * @param {string} postType The type of the parent post. + * @param {number} postId The id of the parent post. + */ +const resolvers_getAutosaves = (postType, postId) => async ({ + dispatch, + resolveSelect +}) => { + const { + rest_base: restBase, + rest_namespace: restNamespace = 'wp/v2' + } = await resolveSelect.getPostType(postType); + const autosaves = await external_wp_apiFetch_default()({ + path: `/${restNamespace}/${restBase}/${postId}/autosaves?context=edit` + }); + if (autosaves && autosaves.length) { + dispatch.receiveAutosaves(postId, autosaves); + } +}; + +/** + * Request autosave data from the REST API. + * + * This resolver exists to ensure the underlying autosaves are fetched via + * `getAutosaves` when a call to the `getAutosave` selector is made. + * + * @param {string} postType The type of the parent post. + * @param {number} postId The id of the parent post. + */ +const resolvers_getAutosave = (postType, postId) => async ({ + resolveSelect +}) => { + 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 +}) => { + const activeThemes = await resolveSelect.getEntityRecords('root', 'theme', { + status: 'active' + }); + const globalStylesURL = activeThemes?.[0]?._links?.['wp:user-global-styles']?.[0]?.href; + if (globalStylesURL) { + const globalStylesObject = await external_wp_apiFetch_default()({ + url: globalStylesURL + }); + dispatch.__experimentalReceiveCurrentGlobalStylesId(globalStylesObject.id); + } +}; +const resolvers_experimentalGetCurrentThemeBaseGlobalStyles = () => async ({ + resolveSelect, + dispatch +}) => { + const currentTheme = await resolveSelect.getCurrentTheme(); + const themeGlobalStyles = await external_wp_apiFetch_default()({ + path: `/wp/v2/global-styles/themes/${currentTheme.stylesheet}` + }); + dispatch.__experimentalReceiveThemeBaseGlobalStyles(currentTheme.stylesheet, themeGlobalStyles); +}; +const resolvers_experimentalGetCurrentThemeGlobalStylesVariations = () => async ({ + resolveSelect, + dispatch +}) => { + const currentTheme = await resolveSelect.getCurrentTheme(); + const variations = await external_wp_apiFetch_default()({ + path: `/wp/v2/global-styles/themes/${currentTheme.stylesheet}/variations` + }); + dispatch.__experimentalReceiveThemeGlobalStyleVariations(currentTheme.stylesheet, variations); +}; + +/** + * Fetches and returns the revisions of the current global styles theme. + */ +const resolvers_getCurrentThemeGlobalStylesRevisions = () => async ({ + resolveSelect, + dispatch +}) => { + const globalStylesId = await resolveSelect.__experimentalGetCurrentGlobalStylesId(); + const record = globalStylesId ? await resolveSelect.getEntityRecord('root', 'globalStyles', globalStylesId) : undefined; + const revisionsURL = record?._links?.['version-history']?.[0]?.href; + if (revisionsURL) { + const resetRevisions = await external_wp_apiFetch_default()({ + url: revisionsURL + }); + const revisions = resetRevisions?.map(revision => Object.fromEntries(Object.entries(revision).map(([key, value]) => [camelCase(key), value]))); + dispatch.receiveThemeGlobalStyleRevisions(globalStylesId, revisions); + } +}; +resolvers_getCurrentThemeGlobalStylesRevisions.shouldInvalidate = action => { + return action.type === 'SAVE_ENTITY_RECORD_FINISH' && action.kind === 'root' && !action.error && action.name === 'globalStyles'; +}; +const resolvers_getBlockPatterns = () => async ({ + dispatch +}) => { + const restPatterns = await external_wp_apiFetch_default()({ + path: '/wp/v2/block-patterns/patterns' + }); + const patterns = restPatterns?.map(pattern => Object.fromEntries(Object.entries(pattern).map(([key, value]) => [camelCase(key), value]))); + dispatch({ + type: 'RECEIVE_BLOCK_PATTERNS', + patterns + }); +}; +const resolvers_getBlockPatternCategories = () => async ({ + dispatch +}) => { + const categories = await external_wp_apiFetch_default()({ + path: '/wp/v2/block-patterns/categories' + }); + dispatch({ + type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', + categories + }); +}; +const resolvers_getUserPatternCategories = () => async ({ + dispatch, + resolveSelect +}) => { + const patternCategories = await resolveSelect.getEntityRecords('taxonomy', 'wp_pattern_category', { + per_page: -1, + _fields: 'id,name,description,slug', + context: 'view' + }); + const mappedPatternCategories = patternCategories?.map(userCategory => ({ + ...userCategory, + label: userCategory.name, + name: userCategory.slug + })) || []; + dispatch({ + type: 'RECEIVE_USER_PATTERN_CATEGORIES', + patternCategories: mappedPatternCategories + }); +}; +const resolvers_getNavigationFallbackId = () => async ({ + dispatch, + select +}) => { + const fallback = await external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp-block-editor/v1/navigation-fallback', { + _embed: true + }) + }); + const record = fallback?._embedded?.self; + dispatch.receiveNavigationFallbackId(fallback?.id); + if (record) { + // 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. + const existingFallbackEntityRecord = select.getEntityRecord('postType', 'wp_navigation', fallback?.id); + const invalidateNavigationQueries = !existingFallbackEntityRecord; + dispatch.receiveEntityRecords('postType', 'wp_navigation', record, undefined, invalidateNavigationQueries); + + // Resolve to avoid further network requests. + dispatch.finishResolution('getEntityRecord', ['postType', 'wp_navigation', fallback?.id]); + } +}; + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/utils.js +function deepCopyLocksTreePath(tree, path) { + const newTree = { + ...tree + }; + let currentNode = newTree; + for (const branchName of path) { + currentNode.children = { + ...currentNode.children, + [branchName]: { + locks: [], + children: {}, + ...currentNode.children[branchName] + } + }; + currentNode = currentNode.children[branchName]; + } + return newTree; +} +function getNode(tree, path) { + let currentNode = tree; + for (const branchName of path) { + const nextNode = currentNode.children[branchName]; + if (!nextNode) { + return null; + } + currentNode = nextNode; + } + return currentNode; +} +function* iteratePath(tree, path) { + let currentNode = tree; + yield currentNode; + for (const branchName of path) { + const nextNode = currentNode.children[branchName]; + if (!nextNode) { + break; + } + yield nextNode; + currentNode = nextNode; + } +} +function* iterateDescendants(node) { + const stack = Object.values(node.children); + while (stack.length) { + const childNode = stack.pop(); + yield childNode; + stack.push(...Object.values(childNode.children)); + } +} +function hasConflictingLock({ + exclusive +}, locks) { + if (exclusive && locks.length) { + return true; + } + if (!exclusive && locks.filter(lock => lock.exclusive).length) { + return true; + } + return false; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/reducer.js +/** + * Internal dependencies + */ + +const DEFAULT_STATE = { + requests: [], + tree: { + locks: [], + children: {} + } +}; + +/** + * Reducer returning locks. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +function locks(state = DEFAULT_STATE, action) { + switch (action.type) { + case 'ENQUEUE_LOCK_REQUEST': + { + const { + request + } = action; + return { + ...state, + requests: [request, ...state.requests] + }; + } + case 'GRANT_LOCK_REQUEST': + { + const { + lock, + request + } = action; + const { + store, + path + } = request; + const storePath = [store, ...path]; + const newTree = deepCopyLocksTreePath(state.tree, storePath); + const node = getNode(newTree, storePath); + node.locks = [...node.locks, lock]; + return { + ...state, + requests: state.requests.filter(r => r !== request), + tree: newTree + }; + } + case 'RELEASE_LOCK': + { + const { + lock + } = action; + const storePath = [lock.store, ...lock.path]; + const newTree = deepCopyLocksTreePath(state.tree, storePath); + const node = getNode(newTree, storePath); + node.locks = node.locks.filter(l => l !== lock); + return { + ...state, + tree: newTree + }; + } + } + return state; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/selectors.js +/** + * Internal dependencies + */ + +function getPendingLockRequests(state) { + return state.requests; +} +function isLockAvailable(state, store, path, { + exclusive +}) { + const storePath = [store, ...path]; + const locks = state.tree; + + // Validate all parents and the node itself + for (const node of iteratePath(locks, storePath)) { + if (hasConflictingLock({ + exclusive + }, node.locks)) { + return false; + } + } + + // iteratePath terminates early if path is unreachable, let's + // re-fetch the node and check it exists in the tree. + const node = getNode(locks, storePath); + if (!node) { + return true; + } + + // Validate all nested nodes + for (const descendant of iterateDescendants(node)) { + if (hasConflictingLock({ + exclusive + }, descendant.locks)) { + return false; + } + } + return true; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/engine.js +/** + * Internal dependencies + */ + + +function createLocks() { + let state = locks(undefined, { + type: '@@INIT' + }); + function processPendingLockRequests() { + for (const request of getPendingLockRequests(state)) { + const { + store, + path, + exclusive, + notifyAcquired + } = request; + if (isLockAvailable(state, store, path, { + exclusive + })) { + const lock = { + store, + path, + exclusive + }; + state = locks(state, { + type: 'GRANT_LOCK_REQUEST', + lock, + request + }); + notifyAcquired(lock); + } + } + } + function acquire(store, path, exclusive) { + return new Promise(resolve => { + state = locks(state, { + type: 'ENQUEUE_LOCK_REQUEST', + request: { + store, + path, + exclusive, + notifyAcquired: resolve + } + }); + processPendingLockRequests(); + }); + } + function release(lock) { + state = locks(state, { + type: 'RELEASE_LOCK', + lock + }); + processPendingLockRequests(); + } + return { + acquire, + release + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/actions.js +/** + * Internal dependencies + */ + +function createLocksActions() { + const locks = createLocks(); + function __unstableAcquireStoreLock(store, path, { + exclusive + }) { + return () => locks.acquire(store, path, exclusive); + } + function __unstableReleaseStoreLock(lock) { + return () => locks.release(lock); + } + return { + __unstableAcquireStoreLock, + __unstableReleaseStoreLock + }; +} + +;// CONCATENATED MODULE: external ["wp","privateApis"] +var 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 know using unstable features means my theme or plugin will inevitably break in the next version of WordPress.', '@wordpress/core-data'); + +;// CONCATENATED MODULE: external ["wp","element"] +var external_wp_element_namespaceObject = window["wp"]["element"]; +;// CONCATENATED MODULE: external ["wp","blocks"] +var external_wp_blocks_namespaceObject = window["wp"]["blocks"]; +;// CONCATENATED MODULE: external ["wp","blockEditor"] +var 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 + */ + + +/** + * 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 content = getRichTextValuesCached(block).join(''); + const newOrder = []; + + // https://github.com/WordPress/gutenberg/pull/43204 lands. We can then + // get the order directly from the rich text values. + if (content.indexOf('data-fn') !== -1) { + const regex = /data-fn="([^"]+)"/g; + let match; + while ((match = regex.exec(content)) !== null) { + newOrder.push(match[1]); + } + } + get_footnotes_order_cache.set(block, newOrder); + } + return get_footnotes_order_cache.get(block); +} +function getFootnotesOrder(blocks) { + return blocks.flatMap(getBlockFootnotesOrder); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/footnotes/index.js +/** + * 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; + } + if (typeof value !== 'string') { + continue; + } + if (value.indexOf('data-fn') === -1) { + continue; + } + + // When we store rich text values, this would no longer + // require a regex. + const regex = /(<sup[^>]+data-fn="([^"]+)"[^>]*><a[^>]*>)[\d*]*<\/a><\/sup>/g; + attributes[key] = value.replace(regex, (match, opening, fnId) => { + const index = newOrder.indexOf(fnId); + return `${opening}${index + 1}</a></sup>`; + }); + const compatRegex = /<a[^>]+data-fn="([^"]+)"[^>]*>\*<\/a>/g; + attributes[key] = attributes[key].replace(compatRegex, (match, fnId) => { + const index = newOrder.indexOf(fnId); + return `<sup data-fn="${fnId}" class="fn"><a href="#${fnId}" id="${fnId}-link">${index + 1}</a></sup>`; + }); + } + 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: ./node_modules/@wordpress/core-data/build-module/entity-provider.js + +/** + * WordPress dependencies + */ + + + + +/** + * Internal dependencies + */ + + + +/** @typedef {import('@wordpress/blocks').WPBlock} WPBlock */ + +const EMPTY_ARRAY = []; + +/** + * Internal dependencies + */ + +const entityContexts = { + ...rootEntitiesConfig.reduce((acc, loader) => { + if (!acc[loader.kind]) { + acc[loader.kind] = {}; + } + acc[loader.kind][loader.name] = { + context: (0,external_wp_element_namespaceObject.createContext)(undefined) + }; + return acc; + }, {}), + ...additionalEntityConfigLoaders.reduce((acc, loader) => { + acc[loader.kind] = {}; + return acc; + }, {}) +}; +const getEntityContext = (kind, name) => { + if (!entityContexts[kind]) { + throw new Error(`Missing entity config for kind: ${kind}.`); + } + if (!entityContexts[kind][name]) { + entityContexts[kind][name] = { + context: (0,external_wp_element_namespaceObject.createContext)(undefined) + }; + } + return entityContexts[kind][name].context; +}; + +/** + * Context provider component for providing + * an entity for a specific entity. + * + * @param {Object} props The component's props. + * @param {string} props.kind The entity kind. + * @param {string} props.type The entity name. + * @param {number} props.id The entity ID. + * @param {*} props.children The children to wrap. + * + * @return {Object} The provided children, wrapped with + * the entity's context provider. + */ +function EntityProvider({ + kind, + type: name, + id, + children +}) { + const Provider = getEntityContext(kind, name).Provider; + return (0,external_wp_element_namespaceObject.createElement)(Provider, { + value: id + }, children); +} + +/** + * 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) { + return (0,external_wp_element_namespaceObject.useContext)(getEntityContext(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]; +} + +/** + * 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 { + content, + editedBlocks, + meta + } = (0,external_wp_data_namespaceObject.useSelect)(select => { + 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 (editedBlocks) { + return editedBlocks; + } + return content && typeof content !== 'function' ? (0,external_wp_blocks_namespaceObject.parse)(content) : EMPTY_ARRAY; + }, [editedBlocks, content]); + 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 + } = 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 + }); + }, [kind, name, id, blocks, updateFootnotes, __unstableCreateUndoLevel, editEntityRecord]); + const onInput = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => { + const { + selection + } = options; + const footnotesChanges = updateFootnotes(newBlocks); + const edits = { + selection, + ...footnotesChanges + }; + editEntityRecord(kind, name, id, edits, { + isCached: true + }); + }, [kind, name, id, updateFootnotes, editEntityRecord]); + return [blocks, onInput, onChange]; +} + +;// CONCATENATED MODULE: external ["wp","htmlEntities"] +var external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"]; +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-link-suggestions.js +/** + * WordPress dependencies + */ + + + + + +/** + * 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] + * + * @example + * ```js + * import { __experimentalFetchLinkSuggestions as fetchLinkSuggestions } from '@wordpress/core-data'; + * + * //... + * + * export function initialize( id, settings ) { + * + * settings.__experimentalFetchLinkSuggestions = ( + * search, + * searchOptions + * ) => fetchLinkSuggestions( search, searchOptions, settings ); + * ``` + * @return {Promise< WPLinkSearchResult[] >} List of search suggestions + */ +const fetchLinkSuggestions = async (search, searchOptions = {}, settings = {}) => { + const { + isInitialSuggestions = false, + type = undefined, + subtype = undefined, + page = undefined, + perPage = isInitialSuggestions ? 3 : 20 + } = searchOptions; + const { + disablePostFormats = false + } = settings; + + /** @type {Promise<WPLinkSearchResult>[]} */ + const queries = []; + if (!type || type === 'post') { + queries.push(external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', { + search, + page, + per_page: perPage, + type: 'post', + subtype + }) + }).then(results => { + return results.map(result => { + return { + ...result, + meta: { + kind: 'post-type', + subtype + } + }; + }); + }).catch(() => []) // Fail by returning no results. + ); + } + + if (!type || type === 'term') { + queries.push(external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', { + search, + page, + per_page: perPage, + type: 'term', + subtype + }) + }).then(results => { + return results.map(result => { + return { + ...result, + meta: { + kind: 'taxonomy', + subtype + } + }; + }); + }).catch(() => []) // Fail by returning no results. + ); + } + + if (!disablePostFormats && (!type || type === 'post-format')) { + queries.push(external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', { + search, + page, + per_page: perPage, + type: 'post-format', + subtype + }) + }).then(results => { + return results.map(result => { + return { + ...result, + meta: { + kind: 'taxonomy', + subtype + } + }; + }); + }).catch(() => []) // Fail by returning no results. + ); + } + + if (!type || type === 'attachment') { + queries.push(external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/media', { + search, + page, + per_page: perPage + }) + }).then(results => { + return results.map(result => { + return { + ...result, + meta: { + 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 */ var _experimental_fetch_link_suggestions = (fetchLinkSuggestions); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-url-data.js +/** + * WordPress dependencies + */ + + + +/** + * A simple in-memory cache for requests. + * This avoids repeat HTTP requests which may be beneficial + * for those wishing to preserve low-bandwidth. + */ +const CACHE = new Map(); + +/** + * @typedef WPRemoteUrlData + * + * @property {string} title contents of the remote URL's `<title>` tag. + */ + +/** + * Fetches data about a remote URL. + * eg: <title> tag, favicon...etc. + * + * @async + * @param {string} url the URL to request details from. + * @param {Object?} options any options to pass to the underlying fetch. + * @example + * ```js + * import { __experimentalFetchUrlData as fetchUrlData } from '@wordpress/core-data'; + * + * //... + * + * export function initialize( id, settings ) { + * + * settings.__experimentalFetchUrlData = ( + * url + * ) => fetchUrlData( url ); + * ``` + * @return {Promise< WPRemoteUrlData[] >} Remote URL data. + */ +const fetchUrlData = async (url, options = {}) => { + const endpoint = '/wp-block-editor/v1/url-details'; + const args = { + url: (0,external_wp_url_namespaceObject.prependHTTP)(url) + }; + if (!(0,external_wp_url_namespaceObject.isURL)(url)) { + return Promise.reject(`${url} is not a valid URL.`); + } + + // Test for "http" based URL as it is possible for valid + // yet unusable URLs such as `tel:123456` to be passed. + const protocol = (0,external_wp_url_namespaceObject.getProtocol)(url); + if (!protocol || !(0,external_wp_url_namespaceObject.isValidProtocol)(protocol) || !protocol.startsWith('http') || !/^https?:\/\/[^\/\s]/i.test(url)) { + return Promise.reject(`${url} does not have a valid protocol. URLs must be "http" based`); + } + if (CACHE.has(url)) { + return CACHE.get(url); + } + return external_wp_apiFetch_default()({ + path: (0,external_wp_url_namespaceObject.addQueryArgs)(endpoint, args), + ...options + }).then(res => { + CACHE.set(url, res); + return res; + }); +}; +/* harmony default export */ var _experimental_fetch_url_data = (fetchUrlData); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/index.js + + + +;// CONCATENATED MODULE: ./node_modules/memize/dist/index.js +/** + * Memize options object. + * + * @typedef MemizeOptions + * + * @property {number} [maxSize] Maximum size of the cache. + */ + +/** + * Internal cache entry. + * + * @typedef MemizeCacheNode + * + * @property {?MemizeCacheNode|undefined} [prev] Previous node. + * @property {?MemizeCacheNode|undefined} [next] Next node. + * @property {Array<*>} args Function arguments for cache + * entry. + * @property {*} val Function result. + */ + +/** + * Properties of the enhanced function for controlling cache. + * + * @typedef MemizeMemoizedFunction + * + * @property {()=>void} clear Clear the cache. + */ + +/** + * Accepts a function to be memoized, and returns a new memoized function, with + * optional options. + * + * @template {(...args: any[]) => any} F + * + * @param {F} fn Function to memoize. + * @param {MemizeOptions} [options] Options object. + * + * @return {((...args: Parameters<F>) => ReturnType<F>) & MemizeMemoizedFunction} Memoized function. + */ +function memize(fn, options) { + var size = 0; + + /** @type {?MemizeCacheNode|undefined} */ + var head; + + /** @type {?MemizeCacheNode|undefined} */ + var tail; + + options = options || {}; + + function memoized(/* ...args */) { + var node = head, + len = arguments.length, + args, + i; + + searchCache: while (node) { + // Perform a shallow equality test to confirm that whether the node + // under test is a candidate for the arguments passed. Two arrays + // are shallowly equal if their length matches and each entry is + // strictly equal between the two sets. Avoid abstracting to a + // function which could incur an arguments leaking deoptimization. + + // Check whether node arguments match arguments length + if (node.args.length !== arguments.length) { + node = node.next; + continue; + } + + // Check whether node arguments match arguments values + for (i = 0; i < len; i++) { + if (node.args[i] !== arguments[i]) { + node = node.next; + continue searchCache; + } + } + + // At this point we can assume we've found a match + + // Surface matched node to head if not already + if (node !== head) { + // As tail, shift to previous. Must only shift if not also + // head, since if both head and tail, there is no previous. + if (node === tail) { + tail = node.prev; + } + + // Adjust siblings to point to each other. If node was tail, + // this also handles new tail's empty `next` assignment. + /** @type {MemizeCacheNode} */ (node.prev).next = node.next; + if (node.next) { + node.next.prev = node.prev; + } + + node.next = head; + node.prev = null; + /** @type {MemizeCacheNode} */ (head).prev = node; + head = node; + } + + // Return immediately + return node.val; + } + + // No cached value found. Continue to insertion phase: + + // Create a copy of arguments (avoid leaking deoptimization) + args = new Array(len); + for (i = 0; i < len; i++) { + args[i] = arguments[i]; + } + + node = { + args: args, + + // Generate the result from original function + val: fn.apply(null, args), + }; + + // Don't need to check whether node is already head, since it would + // have been returned above already if it was + + // Shift existing head down list + if (head) { + head.prev = node; + node.next = head; + } else { + // If no head, follows that there's no tail (at initial or reset) + tail = node; + } + + // Trim tail if we're reached max size and are pending cache insertion + if (size === /** @type {MemizeOptions} */ (options).maxSize) { + tail = /** @type {MemizeCacheNode} */ (tail).prev; + /** @type {MemizeCacheNode} */ (tail).next = null; + } else { + size++; + } + + head = node; + + return node.val; + } + + memoized.clear = function () { + head = null; + tail = null; + size = 0; + }; + + // Ignore reason: There's not a clear solution to create an intersection of + // the function with additional properties, where the goal is to retain the + // function signature of the incoming argument and add control properties + // on the return value. + + // @ts-ignore + return memoized; +} + + + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/memoize.js +/** + * External dependencies + */ + + +// re-export due to restrictive esModuleInterop setting +/* harmony default export */ var memoize = (memize); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/constants.js +let Status = /*#__PURE__*/function (Status) { + Status["Idle"] = "IDLE"; + Status["Resolving"] = "RESOLVING"; + Status["Error"] = "ERROR"; + Status["Success"] = "SUCCESS"; + return Status; +}({}); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-query-select.js +/** + * WordPress dependencies + */ + + +/** + * Internal dependencies + */ + + +const META_SELECTORS = ['getIsResolving', 'hasStartedResolution', 'hasFinishedResolution', 'isResolving', 'getCachedResolvers']; +/** + * Like useSelect, but the selectors return objects containing + * both the original data AND the resolution info. + * + * @since 6.1.0 Introduced in WordPress core. + * @private + * + * @param {Function} mapQuerySelect see useSelect + * @param {Array} deps see useSelect + * + * @example + * ```js + * import { useQuerySelect } from '@wordpress/data'; + * import { store as coreDataStore } from '@wordpress/core-data'; + * + * function PageTitleDisplay( { id } ) { + * const { data: page, isResolving } = useQuerySelect( ( query ) => { + * return query( coreDataStore ).getEntityRecord( 'postType', 'page', id ) + * }, [ id ] ); + * + * if ( isResolving ) { + * return 'Loading...'; + * } + * + * return page.title; + * } + * + * // Rendered in the application: + * // <PageTitleDisplay id={ 10 } /> + * ``` + * + * In the above example, when `PageTitleDisplay` is rendered into an + * application, the page and the resolution details will be retrieved from + * the store state using the `mapSelect` callback on `useQuerySelect`. + * + * If the id prop changes then any page in the state for that id is + * retrieved. If the id prop doesn't change and other props are passed in + * that do change, the title will not change because the dependency is just + * the id. + * @see useSelect + * + * @return {QuerySelectResponse} Queried data. + */ +function useQuerySelect(mapQuerySelect, deps) { + return (0,external_wp_data_namespaceObject.useSelect)((select, registry) => { + const resolve = store => enrichSelectors(select(store)); + return mapQuerySelect(resolve, registry); + }, deps); +} +/** + * Transform simple selectors into ones that return an object with the + * original return value AND the resolution info. + * + * @param {Object} selectors Selectors to enrich + * @return {EnrichedSelectors} Enriched selectors + */ +const enrichSelectors = memoize(selectors => { + const resolvers = {}; + for (const selectorName in selectors) { + if (META_SELECTORS.includes(selectorName)) { + continue; + } + Object.defineProperty(resolvers, selectorName, { + get: () => (...args) => { + const { + getIsResolving, + hasFinishedResolution + } = selectors; + const isResolving = !!getIsResolving(selectorName, args); + const hasResolved = !isResolving && hasFinishedResolution(selectorName, args); + const data = selectors[selectorName](...args); + let status; + if (isResolving) { + status = Status.Resolving; + } else if (hasResolved) { + if (data) { + status = Status.Success; + } else { + status = Status.Error; + } + } else { + status = Status.Idle; + } + return { + data, + status, + isResolving, + hasResolved + }; + } + }); + } + return resolvers; +}); + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-record.js +/** + * WordPress dependencies + */ + + + + +/** + * Internal dependencies + */ + + +/** + * Resolves the specified entity record. + * + * @since 6.1.0 Introduced in WordPress core. + * + * @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds. + * @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names. + * @param recordId ID of the requested entity record. + * @param options Optional hook options. + * @example + * ```js + * import { useEntityRecord } from '@wordpress/core-data'; + * + * function PageTitleDisplay( { id } ) { + * const { record, isResolving } = useEntityRecord( 'postType', 'page', id ); + * + * if ( isResolving ) { + * return 'Loading...'; + * } + * + * return record.title; + * } + * + * // Rendered in the application: + * // <PageTitleDisplay id={ 1 } /> + * ``` + * + * In the above example, when `PageTitleDisplay` is rendered into an + * application, the page and the resolution details will be retrieved from + * the store state using `getEntityRecord()`, or resolved if missing. + * + * @example + * ```js + * import { useDispatch } from '@wordpress/data'; + * import { useCallback } from '@wordpress/element'; + * import { __ } from '@wordpress/i18n'; + * import { TextControl } from '@wordpress/components'; + * import { store as noticeStore } from '@wordpress/notices'; + * import { useEntityRecord } from '@wordpress/core-data'; + * + * function PageRenameForm( { id } ) { + * const page = useEntityRecord( 'postType', 'page', id ); + * const { createSuccessNotice, createErrorNotice } = + * useDispatch( noticeStore ); + * + * const setTitle = useCallback( ( title ) => { + * page.edit( { title } ); + * }, [ page.edit ] ); + * + * if ( page.isResolving ) { + * return 'Loading...'; + * } + * + * async function onRename( event ) { + * event.preventDefault(); + * try { + * await page.save(); + * createSuccessNotice( __( 'Page renamed.' ), { + * type: 'snackbar', + * } ); + * } catch ( error ) { + * createErrorNotice( error.message, { type: 'snackbar' } ); + * } + * } + * + * return ( + * <form onSubmit={ onRename }> + * <TextControl + * label={ __( 'Name' ) } + * value={ page.editedRecord.title } + * onChange={ setTitle } + * /> + * <button type="submit">{ __( 'Save' ) }</button> + * </form> + * ); + * } + * + * // Rendered in the application: + * // <PageRenameForm id={ 1 } /> + * ``` + * + * In the above example, updating and saving the page title is handled + * via the `edit()` and `save()` mutation helpers provided by + * `useEntityRecord()`; + * + * @return Entity record data. + * @template RecordType + */ +function useEntityRecord(kind, name, recordId, options = { + enabled: true +}) { + const { + editEntityRecord, + saveEditedEntityRecord + } = (0,external_wp_data_namespaceObject.useDispatch)(store); + const mutations = (0,external_wp_element_namespaceObject.useMemo)(() => ({ + edit: (record, editOptions = {}) => editEntityRecord(kind, name, recordId, record, editOptions), + save: (saveOptions = {}) => saveEditedEntityRecord(kind, name, recordId, { + throwOnError: true, + ...saveOptions + }) + }), [editEntityRecord, kind, name, recordId, saveEditedEntityRecord]); + const { + editedRecord, + hasEdits, + edits + } = (0,external_wp_data_namespaceObject.useSelect)(select => ({ + editedRecord: select(store).getEditedEntityRecord(kind, name, recordId), + hasEdits: select(store).hasEditsForEntityRecord(kind, name, recordId), + edits: select(store).getEntityRecordNonTransientEdits(kind, name, recordId) + }), [kind, name, recordId]); + const { + data: record, + ...querySelectRest + } = useQuerySelect(query => { + if (!options.enabled) { + return { + data: null + }; + } + return query(store).getEntityRecord(kind, name, recordId); + }, [kind, name, recordId, options.enabled]); + return { + record, + editedRecord, + hasEdits, + edits, + ...querySelectRest, + ...mutations + }; +} +function __experimentalUseEntityRecord(kind, name, recordId, options) { + external_wp_deprecated_default()(`wp.data.__experimentalUseEntityRecord`, { + alternative: 'wp.data.useEntityRecord', + since: '6.1' + }); + return useEntityRecord(kind, name, recordId, options); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-records.js +/** + * WordPress dependencies + */ + + + +/** + * Internal dependencies + */ + + +const use_entity_records_EMPTY_ARRAY = []; + +/** + * Resolves the specified entity records. + * + * @since 6.1.0 Introduced in WordPress core. + * + * @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds. + * @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names. + * @param queryArgs Optional HTTP query description for how to fetch the data, passed to the requested API endpoint. + * @param options Optional hook options. + * @example + * ```js + * import { useEntityRecords } from '@wordpress/core-data'; + * + * function PageTitlesList() { + * const { records, isResolving } = useEntityRecords( 'postType', 'page' ); + * + * if ( isResolving ) { + * return 'Loading...'; + * } + * + * return ( + * <ul> + * {records.map(( page ) => ( + * <li>{ page.title }</li> + * ))} + * </ul> + * ); + * } + * + * // Rendered in the application: + * // <PageTitlesList /> + * ``` + * + * In the above example, when `PageTitlesList` is rendered into an + * application, the list of records and the resolution details will be retrieved from + * the store state using `getEntityRecords()`, or resolved if missing. + * + * @return Entity records data. + * @template RecordType + */ +function useEntityRecords(kind, name, queryArgs = {}, options = { + enabled: true +}) { + // Serialize queryArgs to a string that can be safely used as a React dep. + // We can't just pass queryArgs 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 queryAsString = (0,external_wp_url_namespaceObject.addQueryArgs)('', queryArgs); + const { + data: records, + ...rest + } = useQuerySelect(query => { + if (!options.enabled) { + return { + // Avoiding returning a new reference on every execution. + data: use_entity_records_EMPTY_ARRAY + }; + } + return query(store).getEntityRecords(kind, name, queryArgs); + }, [kind, name, queryAsString, options.enabled]); + return { + records, + ...rest + }; +} +function __experimentalUseEntityRecords(kind, name, queryArgs, options) { + external_wp_deprecated_default()(`wp.data.__experimentalUseEntityRecords`, { + alternative: 'wp.data.useEntityRecords', + since: '6.1' + }); + return useEntityRecords(kind, name, queryArgs, options); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-resource-permissions.js +/** + * WordPress dependencies + */ + + +/** + * Internal dependencies + */ + + + +/** + * Resolves resource permissions. + * + * @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. + * + * @example + * ```js + * import { useResourcePermissions } from '@wordpress/core-data'; + * + * function PagesList() { + * const { canCreate, isResolving } = useResourcePermissions( 'pages' ); + * + * if ( isResolving ) { + * return 'Loading ...'; + * } + * + * return ( + * <div> + * {canCreate ? (<button>+ Create a new page</button>) : false} + * // ... + * </div> + * ); + * } + * + * // Rendered in the application: + * // <PagesList /> + * ``` + * + * @example + * ```js + * import { useResourcePermissions } from '@wordpress/core-data'; + * + * function Page({ pageId }) { + * const { + * canCreate, + * canUpdate, + * canDelete, + * isResolving + * } = useResourcePermissions( 'pages', pageId ); + * + * if ( isResolving ) { + * return 'Loading ...'; + * } + * + * return ( + * <div> + * {canCreate ? (<button>+ Create a new page</button>) : false} + * {canUpdate ? (<button>Edit page</button>) : false} + * {canDelete ? (<button>Delete page</button>) : false} + * // ... + * </div> + * ); + * } + * + * // Rendered in the application: + * // <Page pageId={ 15 } /> + * ``` + * + * In the above example, when `PagesList` is rendered into an + * application, the appropriate permissions and the resolution details will be retrieved from + * the store state using `canUser()`, or resolved if missing. + * + * @return Entity records data. + * @template IdType + */ +function useResourcePermissions(resource, id) { + return useQuerySelect(resolve => { + const { + canUser + } = resolve(store); + const create = canUser('create', resource); + if (!id) { + const read = canUser('read', resource); + const isResolving = create.isResolving || read.isResolving; + const hasResolved = create.hasResolved && read.hasResolved; + let status = Status.Idle; + if (isResolving) { + status = Status.Resolving; + } else if (hasResolved) { + status = Status.Success; + } + return { + status, + isResolving, + hasResolved, + canCreate: create.hasResolved && create.data, + canRead: read.hasResolved && read.data + }; + } + const read = canUser('read', resource, id); + const update = canUser('update', resource, id); + const _delete = canUser('delete', resource, id); + const isResolving = read.isResolving || create.isResolving || update.isResolving || _delete.isResolving; + const hasResolved = read.hasResolved && create.hasResolved && update.hasResolved && _delete.hasResolved; + let status = Status.Idle; + if (isResolving) { + status = Status.Resolving; + } else if (hasResolved) { + status = Status.Success; + } + return { + status, + isResolving, + hasResolved, + canRead: hasResolved && read.data, + canCreate: hasResolved && create.data, + canUpdate: hasResolved && update.data, + canDelete: hasResolved && _delete.data + }; + }, [resource, id]); +} +function __experimentalUseResourcePermissions(resource, id) { + external_wp_deprecated_default()(`wp.data.__experimentalUseResourcePermissions`, { + alternative: 'wp.data.useResourcePermissions', + since: '6.1' + }); + 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 +/** + * WordPress dependencies + */ + + +/** + * Internal dependencies + */ + + + + + + + + + + +// The entity selectors/resolvers and actions are shortcuts to their generic equivalents +// (getEntityRecord, getEntityRecords, updateEntityRecord, updateEntityRecords) +// Instead of getEntityRecord, the consumer could use more user-friendly named selector: getPostType, getTaxonomy... +// The "kind" and the "name" of the entity are combined to generate these shortcuts. + +const entitySelectors = rootEntitiesConfig.reduce((result, entity) => { + const { + kind, + name + } = entity; + result[getMethodName(kind, name)] = (state, key, query) => getEntityRecord(state, kind, name, key, query); + result[getMethodName(kind, name, 'get', true)] = (state, query) => getEntityRecords(state, kind, name, query); + return result; +}, {}); +const entityResolvers = rootEntitiesConfig.reduce((result, entity) => { + const { + kind, + name + } = entity; + result[getMethodName(kind, name)] = (key, query) => resolvers_getEntityRecord(kind, name, key, query); + const pluralMethodName = getMethodName(kind, name, 'get', true); + result[pluralMethodName] = (...args) => resolvers_getEntityRecords(kind, name, ...args); + result[pluralMethodName].shouldInvalidate = action => resolvers_getEntityRecords.shouldInvalidate(action, kind, name); + return result; +}, {}); +const entityActions = rootEntitiesConfig.reduce((result, entity) => { + const { + kind, + name + } = entity; + result[getMethodName(kind, name, 'save')] = key => saveEntityRecord(kind, name, key); + result[getMethodName(kind, name, 'delete')] = (key, query) => deleteEntityRecord(kind, name, key, query); + return result; +}, {}); +const storeConfig = () => ({ + reducer: build_module_reducer, + actions: { + ...build_module_actions_namespaceObject, + ...entityActions, + ...createLocksActions() + }, + selectors: { + ...build_module_selectors_namespaceObject, + ...entitySelectors + }, + resolvers: { + ...resolvers_namespaceObject, + ...entityResolvers + } +}); + +/** + * Store definition for the code data namespace. + * + * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore + */ +const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, storeConfig()); +unlock(store).registerPrivateSelectors(private_selectors_namespaceObject); +(0,external_wp_data_namespaceObject.register)(store); // Register store after unlocking private selectors to allow resolvers to use them. + + + + + + + +}(); +(window.wp = window.wp || {}).coreData = __webpack_exports__; +/******/ })() +;
\ No newline at end of file |