[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
1 /******/ (function() { // webpackBootstrap 2 /******/ var __webpack_modules__ = ({ 3 4 /***/ 2167: 5 /***/ (function(module) { 6 7 "use strict"; 8 9 10 function _typeof(obj) { 11 if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { 12 _typeof = function (obj) { 13 return typeof obj; 14 }; 15 } else { 16 _typeof = function (obj) { 17 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; 18 }; 19 } 20 21 return _typeof(obj); 22 } 23 24 function _classCallCheck(instance, Constructor) { 25 if (!(instance instanceof Constructor)) { 26 throw new TypeError("Cannot call a class as a function"); 27 } 28 } 29 30 function _defineProperties(target, props) { 31 for (var i = 0; i < props.length; i++) { 32 var descriptor = props[i]; 33 descriptor.enumerable = descriptor.enumerable || false; 34 descriptor.configurable = true; 35 if ("value" in descriptor) descriptor.writable = true; 36 Object.defineProperty(target, descriptor.key, descriptor); 37 } 38 } 39 40 function _createClass(Constructor, protoProps, staticProps) { 41 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 42 if (staticProps) _defineProperties(Constructor, staticProps); 43 return Constructor; 44 } 45 46 /** 47 * Given an instance of EquivalentKeyMap, returns its internal value pair tuple 48 * for a key, if one exists. The tuple members consist of the last reference 49 * value for the key (used in efficient subsequent lookups) and the value 50 * assigned for the key at the leaf node. 51 * 52 * @param {EquivalentKeyMap} instance EquivalentKeyMap instance. 53 * @param {*} key The key for which to return value pair. 54 * 55 * @return {?Array} Value pair, if exists. 56 */ 57 function getValuePair(instance, key) { 58 var _map = instance._map, 59 _arrayTreeMap = instance._arrayTreeMap, 60 _objectTreeMap = instance._objectTreeMap; // Map keeps a reference to the last object-like key used to set the 61 // value, which can be used to shortcut immediately to the value. 62 63 if (_map.has(key)) { 64 return _map.get(key); 65 } // Sort keys to ensure stable retrieval from tree. 66 67 68 var properties = Object.keys(key).sort(); // Tree by type to avoid conflicts on numeric object keys, empty value. 69 70 var map = Array.isArray(key) ? _arrayTreeMap : _objectTreeMap; 71 72 for (var i = 0; i < properties.length; i++) { 73 var property = properties[i]; 74 map = map.get(property); 75 76 if (map === undefined) { 77 return; 78 } 79 80 var propertyValue = key[property]; 81 map = map.get(propertyValue); 82 83 if (map === undefined) { 84 return; 85 } 86 } 87 88 var valuePair = map.get('_ekm_value'); 89 90 if (!valuePair) { 91 return; 92 } // If reached, it implies that an object-like key was set with another 93 // reference, so delete the reference and replace with the current. 94 95 96 _map.delete(valuePair[0]); 97 98 valuePair[0] = key; 99 map.set('_ekm_value', valuePair); 100 101 _map.set(key, valuePair); 102 103 return valuePair; 104 } 105 /** 106 * Variant of a Map object which enables lookup by equivalent (deeply equal) 107 * object and array keys. 108 */ 109 110 111 var EquivalentKeyMap = 112 /*#__PURE__*/ 113 function () { 114 /** 115 * Constructs a new instance of EquivalentKeyMap. 116 * 117 * @param {Iterable.<*>} iterable Initial pair of key, value for map. 118 */ 119 function EquivalentKeyMap(iterable) { 120 _classCallCheck(this, EquivalentKeyMap); 121 122 this.clear(); 123 124 if (iterable instanceof EquivalentKeyMap) { 125 // Map#forEach is only means of iterating with support for IE11. 126 var iterablePairs = []; 127 iterable.forEach(function (value, key) { 128 iterablePairs.push([key, value]); 129 }); 130 iterable = iterablePairs; 131 } 132 133 if (iterable != null) { 134 for (var i = 0; i < iterable.length; i++) { 135 this.set(iterable[i][0], iterable[i][1]); 136 } 137 } 138 } 139 /** 140 * Accessor property returning the number of elements. 141 * 142 * @return {number} Number of elements. 143 */ 144 145 146 _createClass(EquivalentKeyMap, [{ 147 key: "set", 148 149 /** 150 * Add or update an element with a specified key and value. 151 * 152 * @param {*} key The key of the element to add. 153 * @param {*} value The value of the element to add. 154 * 155 * @return {EquivalentKeyMap} Map instance. 156 */ 157 value: function set(key, value) { 158 // Shortcut non-object-like to set on internal Map. 159 if (key === null || _typeof(key) !== 'object') { 160 this._map.set(key, value); 161 162 return this; 163 } // Sort keys to ensure stable assignment into tree. 164 165 166 var properties = Object.keys(key).sort(); 167 var valuePair = [key, value]; // Tree by type to avoid conflicts on numeric object keys, empty value. 168 169 var map = Array.isArray(key) ? this._arrayTreeMap : this._objectTreeMap; 170 171 for (var i = 0; i < properties.length; i++) { 172 var property = properties[i]; 173 174 if (!map.has(property)) { 175 map.set(property, new EquivalentKeyMap()); 176 } 177 178 map = map.get(property); 179 var propertyValue = key[property]; 180 181 if (!map.has(propertyValue)) { 182 map.set(propertyValue, new EquivalentKeyMap()); 183 } 184 185 map = map.get(propertyValue); 186 } // If an _ekm_value exists, there was already an equivalent key. Before 187 // overriding, ensure that the old key reference is removed from map to 188 // avoid memory leak of accumulating equivalent keys. This is, in a 189 // sense, a poor man's WeakMap, while still enabling iterability. 190 191 192 var previousValuePair = map.get('_ekm_value'); 193 194 if (previousValuePair) { 195 this._map.delete(previousValuePair[0]); 196 } 197 198 map.set('_ekm_value', valuePair); 199 200 this._map.set(key, valuePair); 201 202 return this; 203 } 204 /** 205 * Returns a specified element. 206 * 207 * @param {*} key The key of the element to return. 208 * 209 * @return {?*} The element associated with the specified key or undefined 210 * if the key can't be found. 211 */ 212 213 }, { 214 key: "get", 215 value: function get(key) { 216 // Shortcut non-object-like to get from internal Map. 217 if (key === null || _typeof(key) !== 'object') { 218 return this._map.get(key); 219 } 220 221 var valuePair = getValuePair(this, key); 222 223 if (valuePair) { 224 return valuePair[1]; 225 } 226 } 227 /** 228 * Returns a boolean indicating whether an element with the specified key 229 * exists or not. 230 * 231 * @param {*} key The key of the element to test for presence. 232 * 233 * @return {boolean} Whether an element with the specified key exists. 234 */ 235 236 }, { 237 key: "has", 238 value: function has(key) { 239 if (key === null || _typeof(key) !== 'object') { 240 return this._map.has(key); 241 } // Test on the _presence_ of the pair, not its value, as even undefined 242 // can be a valid member value for a key. 243 244 245 return getValuePair(this, key) !== undefined; 246 } 247 /** 248 * Removes the specified element. 249 * 250 * @param {*} key The key of the element to remove. 251 * 252 * @return {boolean} Returns true if an element existed and has been 253 * removed, or false if the element does not exist. 254 */ 255 256 }, { 257 key: "delete", 258 value: function _delete(key) { 259 if (!this.has(key)) { 260 return false; 261 } // This naive implementation will leave orphaned child trees. A better 262 // implementation should traverse and remove orphans. 263 264 265 this.set(key, undefined); 266 return true; 267 } 268 /** 269 * Executes a provided function once per each key/value pair, in insertion 270 * order. 271 * 272 * @param {Function} callback Function to execute for each element. 273 * @param {*} thisArg Value to use as `this` when executing 274 * `callback`. 275 */ 276 277 }, { 278 key: "forEach", 279 value: function forEach(callback) { 280 var _this = this; 281 282 var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this; 283 284 this._map.forEach(function (value, key) { 285 // Unwrap value from object-like value pair. 286 if (key !== null && _typeof(key) === 'object') { 287 value = value[1]; 288 } 289 290 callback.call(thisArg, value, key, _this); 291 }); 292 } 293 /** 294 * Removes all elements. 295 */ 296 297 }, { 298 key: "clear", 299 value: function clear() { 300 this._map = new Map(); 301 this._arrayTreeMap = new Map(); 302 this._objectTreeMap = new Map(); 303 } 304 }, { 305 key: "size", 306 get: function get() { 307 return this._map.size; 308 } 309 }]); 310 311 return EquivalentKeyMap; 312 }(); 313 314 module.exports = EquivalentKeyMap; 315 316 317 /***/ }), 318 319 /***/ 9756: 320 /***/ (function(module) { 321 322 /** 323 * Memize options object. 324 * 325 * @typedef MemizeOptions 326 * 327 * @property {number} [maxSize] Maximum size of the cache. 328 */ 329 330 /** 331 * Internal cache entry. 332 * 333 * @typedef MemizeCacheNode 334 * 335 * @property {?MemizeCacheNode|undefined} [prev] Previous node. 336 * @property {?MemizeCacheNode|undefined} [next] Next node. 337 * @property {Array<*>} args Function arguments for cache 338 * entry. 339 * @property {*} val Function result. 340 */ 341 342 /** 343 * Properties of the enhanced function for controlling cache. 344 * 345 * @typedef MemizeMemoizedFunction 346 * 347 * @property {()=>void} clear Clear the cache. 348 */ 349 350 /** 351 * Accepts a function to be memoized, and returns a new memoized function, with 352 * optional options. 353 * 354 * @template {Function} F 355 * 356 * @param {F} fn Function to memoize. 357 * @param {MemizeOptions} [options] Options object. 358 * 359 * @return {F & MemizeMemoizedFunction} Memoized function. 360 */ 361 function memize( fn, options ) { 362 var size = 0; 363 364 /** @type {?MemizeCacheNode|undefined} */ 365 var head; 366 367 /** @type {?MemizeCacheNode|undefined} */ 368 var tail; 369 370 options = options || {}; 371 372 function memoized( /* ...args */ ) { 373 var node = head, 374 len = arguments.length, 375 args, i; 376 377 searchCache: while ( node ) { 378 // Perform a shallow equality test to confirm that whether the node 379 // under test is a candidate for the arguments passed. Two arrays 380 // are shallowly equal if their length matches and each entry is 381 // strictly equal between the two sets. Avoid abstracting to a 382 // function which could incur an arguments leaking deoptimization. 383 384 // Check whether node arguments match arguments length 385 if ( node.args.length !== arguments.length ) { 386 node = node.next; 387 continue; 388 } 389 390 // Check whether node arguments match arguments values 391 for ( i = 0; i < len; i++ ) { 392 if ( node.args[ i ] !== arguments[ i ] ) { 393 node = node.next; 394 continue searchCache; 395 } 396 } 397 398 // At this point we can assume we've found a match 399 400 // Surface matched node to head if not already 401 if ( node !== head ) { 402 // As tail, shift to previous. Must only shift if not also 403 // head, since if both head and tail, there is no previous. 404 if ( node === tail ) { 405 tail = node.prev; 406 } 407 408 // Adjust siblings to point to each other. If node was tail, 409 // this also handles new tail's empty `next` assignment. 410 /** @type {MemizeCacheNode} */ ( node.prev ).next = node.next; 411 if ( node.next ) { 412 node.next.prev = node.prev; 413 } 414 415 node.next = head; 416 node.prev = null; 417 /** @type {MemizeCacheNode} */ ( head ).prev = node; 418 head = node; 419 } 420 421 // Return immediately 422 return node.val; 423 } 424 425 // No cached value found. Continue to insertion phase: 426 427 // Create a copy of arguments (avoid leaking deoptimization) 428 args = new Array( len ); 429 for ( i = 0; i < len; i++ ) { 430 args[ i ] = arguments[ i ]; 431 } 432 433 node = { 434 args: args, 435 436 // Generate the result from original function 437 val: fn.apply( null, args ), 438 }; 439 440 // Don't need to check whether node is already head, since it would 441 // have been returned above already if it was 442 443 // Shift existing head down list 444 if ( head ) { 445 head.prev = node; 446 node.next = head; 447 } else { 448 // If no head, follows that there's no tail (at initial or reset) 449 tail = node; 450 } 451 452 // Trim tail if we're reached max size and are pending cache insertion 453 if ( size === /** @type {MemizeOptions} */ ( options ).maxSize ) { 454 tail = /** @type {MemizeCacheNode} */ ( tail ).prev; 455 /** @type {MemizeCacheNode} */ ( tail ).next = null; 456 } else { 457 size++; 458 } 459 460 head = node; 461 462 return node.val; 463 } 464 465 memoized.clear = function() { 466 head = null; 467 tail = null; 468 size = 0; 469 }; 470 471 if ( false ) {} 472 473 // Ignore reason: There's not a clear solution to create an intersection of 474 // the function with additional properties, where the goal is to retain the 475 // function signature of the incoming argument and add control properties 476 // on the return value. 477 478 // @ts-ignore 479 return memoized; 480 } 481 482 module.exports = memize; 483 484 485 /***/ }) 486 487 /******/ }); 488 /************************************************************************/ 489 /******/ // The module cache 490 /******/ var __webpack_module_cache__ = {}; 491 /******/ 492 /******/ // The require function 493 /******/ function __webpack_require__(moduleId) { 494 /******/ // Check if module is in cache 495 /******/ var cachedModule = __webpack_module_cache__[moduleId]; 496 /******/ if (cachedModule !== undefined) { 497 /******/ return cachedModule.exports; 498 /******/ } 499 /******/ // Create a new module (and put it into the cache) 500 /******/ var module = __webpack_module_cache__[moduleId] = { 501 /******/ // no module.id needed 502 /******/ // no module.loaded needed 503 /******/ exports: {} 504 /******/ }; 505 /******/ 506 /******/ // Execute the module function 507 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 508 /******/ 509 /******/ // Return the exports of the module 510 /******/ return module.exports; 511 /******/ } 512 /******/ 513 /************************************************************************/ 514 /******/ /* webpack/runtime/compat get default export */ 515 /******/ !function() { 516 /******/ // getDefaultExport function for compatibility with non-harmony modules 517 /******/ __webpack_require__.n = function(module) { 518 /******/ var getter = module && module.__esModule ? 519 /******/ function() { return module['default']; } : 520 /******/ function() { return module; }; 521 /******/ __webpack_require__.d(getter, { a: getter }); 522 /******/ return getter; 523 /******/ }; 524 /******/ }(); 525 /******/ 526 /******/ /* webpack/runtime/define property getters */ 527 /******/ !function() { 528 /******/ // define getter functions for harmony exports 529 /******/ __webpack_require__.d = function(exports, definition) { 530 /******/ for(var key in definition) { 531 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 532 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 533 /******/ } 534 /******/ } 535 /******/ }; 536 /******/ }(); 537 /******/ 538 /******/ /* webpack/runtime/hasOwnProperty shorthand */ 539 /******/ !function() { 540 /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 541 /******/ }(); 542 /******/ 543 /******/ /* webpack/runtime/make namespace object */ 544 /******/ !function() { 545 /******/ // define __esModule on exports 546 /******/ __webpack_require__.r = function(exports) { 547 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 548 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 549 /******/ } 550 /******/ Object.defineProperty(exports, '__esModule', { value: true }); 551 /******/ }; 552 /******/ }(); 553 /******/ 554 /************************************************************************/ 555 var __webpack_exports__ = {}; 556 // This entry need to be wrapped in an IIFE because it need to be in strict mode. 557 !function() { 558 "use strict"; 559 // ESM COMPAT FLAG 560 __webpack_require__.r(__webpack_exports__); 561 562 // EXPORTS 563 __webpack_require__.d(__webpack_exports__, { 564 "EntityProvider": function() { return /* reexport */ EntityProvider; }, 565 "__experimentalFetchLinkSuggestions": function() { return /* reexport */ _experimental_fetch_link_suggestions; }, 566 "__experimentalFetchUrlData": function() { return /* reexport */ _experimental_fetch_url_data; }, 567 "__experimentalUseEntityRecord": function() { return /* reexport */ __experimentalUseEntityRecord; }, 568 "__experimentalUseEntityRecords": function() { return /* reexport */ __experimentalUseEntityRecords; }, 569 "store": function() { return /* binding */ store; }, 570 "useEntityBlockEditor": function() { return /* reexport */ useEntityBlockEditor; }, 571 "useEntityId": function() { return /* reexport */ useEntityId; }, 572 "useEntityProp": function() { return /* reexport */ useEntityProp; } 573 }); 574 575 // NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/actions.js 576 var build_module_actions_namespaceObject = {}; 577 __webpack_require__.r(build_module_actions_namespaceObject); 578 __webpack_require__.d(build_module_actions_namespaceObject, { 579 "__experimentalBatch": function() { return __experimentalBatch; }, 580 "__experimentalReceiveCurrentGlobalStylesId": function() { return __experimentalReceiveCurrentGlobalStylesId; }, 581 "__experimentalReceiveThemeBaseGlobalStyles": function() { return __experimentalReceiveThemeBaseGlobalStyles; }, 582 "__experimentalReceiveThemeGlobalStyleVariations": function() { return __experimentalReceiveThemeGlobalStyleVariations; }, 583 "__experimentalSaveSpecifiedEntityEdits": function() { return __experimentalSaveSpecifiedEntityEdits; }, 584 "__unstableCreateUndoLevel": function() { return __unstableCreateUndoLevel; }, 585 "addEntities": function() { return addEntities; }, 586 "deleteEntityRecord": function() { return deleteEntityRecord; }, 587 "editEntityRecord": function() { return editEntityRecord; }, 588 "receiveAutosaves": function() { return receiveAutosaves; }, 589 "receiveCurrentTheme": function() { return receiveCurrentTheme; }, 590 "receiveCurrentUser": function() { return receiveCurrentUser; }, 591 "receiveEmbedPreview": function() { return receiveEmbedPreview; }, 592 "receiveEntityRecords": function() { return receiveEntityRecords; }, 593 "receiveThemeSupports": function() { return receiveThemeSupports; }, 594 "receiveUploadPermissions": function() { return receiveUploadPermissions; }, 595 "receiveUserPermission": function() { return receiveUserPermission; }, 596 "receiveUserQuery": function() { return receiveUserQuery; }, 597 "redo": function() { return redo; }, 598 "saveEditedEntityRecord": function() { return saveEditedEntityRecord; }, 599 "saveEntityRecord": function() { return saveEntityRecord; }, 600 "undo": function() { return undo; } 601 }); 602 603 // NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/selectors.js 604 var build_module_selectors_namespaceObject = {}; 605 __webpack_require__.r(build_module_selectors_namespaceObject); 606 __webpack_require__.d(build_module_selectors_namespaceObject, { 607 "__experimentalGetCurrentGlobalStylesId": function() { return __experimentalGetCurrentGlobalStylesId; }, 608 "__experimentalGetCurrentThemeBaseGlobalStyles": function() { return __experimentalGetCurrentThemeBaseGlobalStyles; }, 609 "__experimentalGetCurrentThemeGlobalStylesVariations": function() { return __experimentalGetCurrentThemeGlobalStylesVariations; }, 610 "__experimentalGetDirtyEntityRecords": function() { return __experimentalGetDirtyEntityRecords; }, 611 "__experimentalGetEntitiesBeingSaved": function() { return __experimentalGetEntitiesBeingSaved; }, 612 "__experimentalGetEntityRecordNoResolver": function() { return __experimentalGetEntityRecordNoResolver; }, 613 "__experimentalGetTemplateForLink": function() { return __experimentalGetTemplateForLink; }, 614 "canUser": function() { return canUser; }, 615 "canUserEditEntityRecord": function() { return canUserEditEntityRecord; }, 616 "getAuthors": function() { return getAuthors; }, 617 "getAutosave": function() { return getAutosave; }, 618 "getAutosaves": function() { return getAutosaves; }, 619 "getBlockPatternCategories": function() { return getBlockPatternCategories; }, 620 "getBlockPatterns": function() { return getBlockPatterns; }, 621 "getCurrentTheme": function() { return getCurrentTheme; }, 622 "getCurrentUser": function() { return getCurrentUser; }, 623 "getEditedEntityRecord": function() { return getEditedEntityRecord; }, 624 "getEmbedPreview": function() { return getEmbedPreview; }, 625 "getEntitiesByKind": function() { return getEntitiesByKind; }, 626 "getEntitiesConfig": function() { return getEntitiesConfig; }, 627 "getEntity": function() { return getEntity; }, 628 "getEntityConfig": function() { return getEntityConfig; }, 629 "getEntityRecord": function() { return getEntityRecord; }, 630 "getEntityRecordEdits": function() { return getEntityRecordEdits; }, 631 "getEntityRecordNonTransientEdits": function() { return getEntityRecordNonTransientEdits; }, 632 "getEntityRecords": function() { return getEntityRecords; }, 633 "getLastEntityDeleteError": function() { return getLastEntityDeleteError; }, 634 "getLastEntitySaveError": function() { return getLastEntitySaveError; }, 635 "getRawEntityRecord": function() { return getRawEntityRecord; }, 636 "getRedoEdit": function() { return getRedoEdit; }, 637 "getReferenceByDistinctEdits": function() { return getReferenceByDistinctEdits; }, 638 "getThemeSupports": function() { return getThemeSupports; }, 639 "getUndoEdit": function() { return getUndoEdit; }, 640 "getUserQueryResults": function() { return getUserQueryResults; }, 641 "hasEditsForEntityRecord": function() { return hasEditsForEntityRecord; }, 642 "hasEntityRecords": function() { return hasEntityRecords; }, 643 "hasFetchedAutosaves": function() { return hasFetchedAutosaves; }, 644 "hasRedo": function() { return hasRedo; }, 645 "hasUndo": function() { return hasUndo; }, 646 "isAutosavingEntityRecord": function() { return isAutosavingEntityRecord; }, 647 "isDeletingEntityRecord": function() { return isDeletingEntityRecord; }, 648 "isPreviewEmbedFallback": function() { return isPreviewEmbedFallback; }, 649 "isRequestingEmbedPreview": function() { return isRequestingEmbedPreview; }, 650 "isSavingEntityRecord": function() { return isSavingEntityRecord; } 651 }); 652 653 // NAMESPACE OBJECT: ./node_modules/@wordpress/core-data/build-module/resolvers.js 654 var resolvers_namespaceObject = {}; 655 __webpack_require__.r(resolvers_namespaceObject); 656 __webpack_require__.d(resolvers_namespaceObject, { 657 "__experimentalGetCurrentGlobalStylesId": function() { return resolvers_experimentalGetCurrentGlobalStylesId; }, 658 "__experimentalGetCurrentThemeBaseGlobalStyles": function() { return resolvers_experimentalGetCurrentThemeBaseGlobalStyles; }, 659 "__experimentalGetCurrentThemeGlobalStylesVariations": function() { return resolvers_experimentalGetCurrentThemeGlobalStylesVariations; }, 660 "__experimentalGetTemplateForLink": function() { return resolvers_experimentalGetTemplateForLink; }, 661 "canUser": function() { return resolvers_canUser; }, 662 "canUserEditEntityRecord": function() { return resolvers_canUserEditEntityRecord; }, 663 "getAuthors": function() { return resolvers_getAuthors; }, 664 "getAutosave": function() { return resolvers_getAutosave; }, 665 "getAutosaves": function() { return resolvers_getAutosaves; }, 666 "getBlockPatternCategories": function() { return resolvers_getBlockPatternCategories; }, 667 "getBlockPatterns": function() { return resolvers_getBlockPatterns; }, 668 "getCurrentTheme": function() { return resolvers_getCurrentTheme; }, 669 "getCurrentUser": function() { return resolvers_getCurrentUser; }, 670 "getEditedEntityRecord": function() { return resolvers_getEditedEntityRecord; }, 671 "getEmbedPreview": function() { return resolvers_getEmbedPreview; }, 672 "getEntityRecord": function() { return resolvers_getEntityRecord; }, 673 "getEntityRecords": function() { return resolvers_getEntityRecords; }, 674 "getRawEntityRecord": function() { return resolvers_getRawEntityRecord; }, 675 "getThemeSupports": function() { return resolvers_getThemeSupports; } 676 }); 677 678 ;// CONCATENATED MODULE: external ["wp","data"] 679 var external_wp_data_namespaceObject = window["wp"]["data"]; 680 ;// CONCATENATED MODULE: external "lodash" 681 var external_lodash_namespaceObject = window["lodash"]; 682 ;// CONCATENATED MODULE: external ["wp","isShallowEqual"] 683 var external_wp_isShallowEqual_namespaceObject = window["wp"]["isShallowEqual"]; 684 var external_wp_isShallowEqual_default = /*#__PURE__*/__webpack_require__.n(external_wp_isShallowEqual_namespaceObject); 685 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/if-matching-action.js 686 /** @typedef {import('../types').AnyFunction} AnyFunction */ 687 688 /** 689 * A higher-order reducer creator which invokes the original reducer only if 690 * the dispatching action matches the given predicate, **OR** if state is 691 * initializing (undefined). 692 * 693 * @param {AnyFunction} isMatch Function predicate for allowing reducer call. 694 * 695 * @return {AnyFunction} Higher-order reducer. 696 */ 697 const ifMatchingAction = isMatch => reducer => (state, action) => { 698 if (state === undefined || isMatch(action)) { 699 return reducer(state, action); 700 } 701 702 return state; 703 }; 704 705 /* harmony default export */ var if_matching_action = (ifMatchingAction); 706 707 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/replace-action.js 708 /** @typedef {import('../types').AnyFunction} AnyFunction */ 709 710 /** 711 * Higher-order reducer creator which substitutes the action object before 712 * passing to the original reducer. 713 * 714 * @param {AnyFunction} replacer Function mapping original action to replacement. 715 * 716 * @return {AnyFunction} Higher-order reducer. 717 */ 718 const replaceAction = replacer => reducer => (state, action) => { 719 return reducer(state, replacer(action)); 720 }; 721 722 /* harmony default export */ var replace_action = (replaceAction); 723 724 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/conservative-map-item.js 725 /** 726 * External dependencies 727 */ 728 729 /** 730 * Given the current and next item entity record, returns the minimally "modified" 731 * result of the next item, preferring value references from the original item 732 * if equal. If all values match, the original item is returned. 733 * 734 * @param {Object} item Original item. 735 * @param {Object} nextItem Next item. 736 * 737 * @return {Object} Minimally modified merged item. 738 */ 739 740 function conservativeMapItem(item, nextItem) { 741 // Return next item in its entirety if there is no original item. 742 if (!item) { 743 return nextItem; 744 } 745 746 let hasChanges = false; 747 const result = {}; 748 749 for (const key in nextItem) { 750 if ((0,external_lodash_namespaceObject.isEqual)(item[key], nextItem[key])) { 751 result[key] = item[key]; 752 } else { 753 hasChanges = true; 754 result[key] = nextItem[key]; 755 } 756 } 757 758 if (!hasChanges) { 759 return item; 760 } // Only at this point, backfill properties from the original item which 761 // weren't explicitly set into the result above. This is an optimization 762 // to allow `hasChanges` to return early. 763 764 765 for (const key in item) { 766 if (!result.hasOwnProperty(key)) { 767 result[key] = item[key]; 768 } 769 } 770 771 return result; 772 } 773 774 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/on-sub-key.js 775 /** @typedef {import('../types').AnyFunction} AnyFunction */ 776 777 /** 778 * Higher-order reducer creator which creates a combined reducer object, keyed 779 * by a property on the action object. 780 * 781 * @param {string} actionProperty Action property by which to key object. 782 * 783 * @return {AnyFunction} Higher-order reducer. 784 */ 785 const onSubKey = actionProperty => reducer => function () { 786 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 787 let action = arguments.length > 1 ? arguments[1] : undefined; 788 // Retrieve subkey from action. Do not track if undefined; useful for cases 789 // where reducer is scoped by action shape. 790 const key = action[actionProperty]; 791 792 if (key === undefined) { 793 return state; 794 } // Avoid updating state if unchanged. Note that this also accounts for a 795 // reducer which returns undefined on a key which is not yet tracked. 796 797 798 const nextKeyState = reducer(state[key], action); 799 800 if (nextKeyState === state[key]) { 801 return state; 802 } 803 804 return { ...state, 805 [key]: nextKeyState 806 }; 807 }; 808 /* harmony default export */ var on_sub_key = (onSubKey); 809 810 ;// CONCATENATED MODULE: external ["wp","apiFetch"] 811 var external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"]; 812 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject); 813 ;// CONCATENATED MODULE: external ["wp","i18n"] 814 var external_wp_i18n_namespaceObject = window["wp"]["i18n"]; 815 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/rng.js 816 // Unique ID creation requires a high quality random # generator. In the browser we therefore 817 // require the crypto API and do not support built-in fallback to lower quality random number 818 // generators (like Math.random()). 819 var getRandomValues; 820 var rnds8 = new Uint8Array(16); 821 function rng() { 822 // lazy load so that environments that need to polyfill have a chance to do so 823 if (!getRandomValues) { 824 // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, 825 // find the complete implementation of crypto (msCrypto) on IE11. 826 getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); 827 828 if (!getRandomValues) { 829 throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); 830 } 831 } 832 833 return getRandomValues(rnds8); 834 } 835 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/regex.js 836 /* harmony default export */ var regex = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); 837 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/validate.js 838 839 840 function validate(uuid) { 841 return typeof uuid === 'string' && regex.test(uuid); 842 } 843 844 /* harmony default export */ var esm_browser_validate = (validate); 845 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/stringify.js 846 847 /** 848 * Convert array of 16 byte values to UUID string format of the form: 849 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 850 */ 851 852 var byteToHex = []; 853 854 for (var i = 0; i < 256; ++i) { 855 byteToHex.push((i + 0x100).toString(16).substr(1)); 856 } 857 858 function stringify(arr) { 859 var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; 860 // Note: Be careful editing this code! It's been tuned for performance 861 // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 862 var uuid = (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]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one 863 // of the following: 864 // - One or more input array values don't map to a hex octet (leading to 865 // "undefined" in the uuid) 866 // - Invalid input values for the RFC `version` or `variant` fields 867 868 if (!esm_browser_validate(uuid)) { 869 throw TypeError('Stringified UUID is invalid'); 870 } 871 872 return uuid; 873 } 874 875 /* harmony default export */ var esm_browser_stringify = (stringify); 876 ;// CONCATENATED MODULE: ./node_modules/uuid/dist/esm-browser/v4.js 877 878 879 880 function v4(options, buf, offset) { 881 options = options || {}; 882 var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` 883 884 rnds[6] = rnds[6] & 0x0f | 0x40; 885 rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided 886 887 if (buf) { 888 offset = offset || 0; 889 890 for (var i = 0; i < 16; ++i) { 891 buf[offset + i] = rnds[i]; 892 } 893 894 return buf; 895 } 896 897 return esm_browser_stringify(rnds); 898 } 899 900 /* harmony default export */ var esm_browser_v4 = (v4); 901 ;// CONCATENATED MODULE: external ["wp","url"] 902 var external_wp_url_namespaceObject = window["wp"]["url"]; 903 ;// CONCATENATED MODULE: external ["wp","deprecated"] 904 var external_wp_deprecated_namespaceObject = window["wp"]["deprecated"]; 905 var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject); 906 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/actions.js 907 /** 908 * External dependencies 909 */ 910 911 /** 912 * Returns an action object used in signalling that items have been received. 913 * 914 * @param {Array} items Items received. 915 * @param {?Object} edits Optional edits to reset. 916 * 917 * @return {Object} Action object. 918 */ 919 920 function receiveItems(items, edits) { 921 return { 922 type: 'RECEIVE_ITEMS', 923 items: (0,external_lodash_namespaceObject.castArray)(items), 924 persistedEdits: edits 925 }; 926 } 927 /** 928 * Returns an action object used in signalling that entity records have been 929 * deleted and they need to be removed from entities state. 930 * 931 * @param {string} kind Kind of the removed entities. 932 * @param {string} name Name of the removed entities. 933 * @param {Array|number|string} records Record IDs of the removed entities. 934 * @param {boolean} invalidateCache Controls whether we want to invalidate the cache. 935 * @return {Object} Action object. 936 */ 937 938 function removeItems(kind, name, records) { 939 let invalidateCache = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; 940 return { 941 type: 'REMOVE_ITEMS', 942 itemIds: (0,external_lodash_namespaceObject.castArray)(records), 943 kind, 944 name, 945 invalidateCache 946 }; 947 } 948 /** 949 * Returns an action object used in signalling that queried data has been 950 * received. 951 * 952 * @param {Array} items Queried items received. 953 * @param {?Object} query Optional query object. 954 * @param {?Object} edits Optional edits to reset. 955 * 956 * @return {Object} Action object. 957 */ 958 959 function receiveQueriedItems(items) { 960 let query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 961 let edits = arguments.length > 2 ? arguments[2] : undefined; 962 return { ...receiveItems(items, edits), 963 query 964 }; 965 } 966 967 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/batch/default-processor.js 968 /** 969 * External dependencies 970 */ 971 972 /** 973 * WordPress dependencies 974 */ 975 976 977 /** 978 * Maximum number of requests to place in a single batch request. Obtained by 979 * sending a preflight OPTIONS request to /batch/v1/. 980 * 981 * @type {number?} 982 */ 983 984 let maxItems = null; 985 /** 986 * Default batch processor. Sends its input requests to /batch/v1. 987 * 988 * @param {Array} requests List of API requests to perform at once. 989 * 990 * @return {Promise} Promise that resolves to a list of objects containing 991 * either `output` (if that request was succesful) or `error` 992 * (if not ). 993 */ 994 995 async function defaultProcessor(requests) { 996 if (maxItems === null) { 997 const preflightResponse = await external_wp_apiFetch_default()({ 998 path: '/batch/v1', 999 method: 'OPTIONS' 1000 }); 1001 maxItems = preflightResponse.endpoints[0].args.requests.maxItems; 1002 } 1003 1004 const results = []; // @ts-ignore We would have crashed or never gotten to this point if we hadn't received the maxItems count. 1005 1006 for (const batchRequests of (0,external_lodash_namespaceObject.chunk)(requests, maxItems)) { 1007 const batchResponse = await external_wp_apiFetch_default()({ 1008 path: '/batch/v1', 1009 method: 'POST', 1010 data: { 1011 validation: 'require-all-validate', 1012 requests: batchRequests.map(request => ({ 1013 path: request.path, 1014 body: request.data, 1015 // Rename 'data' to 'body'. 1016 method: request.method, 1017 headers: request.headers 1018 })) 1019 } 1020 }); 1021 let batchResults; 1022 1023 if (batchResponse.failed) { 1024 batchResults = batchResponse.responses.map(response => ({ 1025 error: response === null || response === void 0 ? void 0 : response.body 1026 })); 1027 } else { 1028 batchResults = batchResponse.responses.map(response => { 1029 const result = {}; 1030 1031 if (response.status >= 200 && response.status < 300) { 1032 result.output = response.body; 1033 } else { 1034 result.error = response.body; 1035 } 1036 1037 return result; 1038 }); 1039 } 1040 1041 results.push(...batchResults); 1042 } 1043 1044 return results; 1045 } 1046 1047 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/batch/create-batch.js 1048 /** 1049 * External dependencies 1050 */ 1051 1052 /** 1053 * Internal dependencies 1054 */ 1055 1056 1057 /** 1058 * Creates a batch, which can be used to combine multiple API requests into one 1059 * API request using the WordPress batch processing API (/v1/batch). 1060 * 1061 * ``` 1062 * const batch = createBatch(); 1063 * const dunePromise = batch.add( { 1064 * path: '/v1/books', 1065 * method: 'POST', 1066 * data: { title: 'Dune' } 1067 * } ); 1068 * const lotrPromise = batch.add( { 1069 * path: '/v1/books', 1070 * method: 'POST', 1071 * data: { title: 'Lord of the Rings' } 1072 * } ); 1073 * const isSuccess = await batch.run(); // Sends one POST to /v1/batch. 1074 * if ( isSuccess ) { 1075 * console.log( 1076 * 'Saved two books:', 1077 * await dunePromise, 1078 * await lotrPromise 1079 * ); 1080 * } 1081 * ``` 1082 * 1083 * @param {Function} [processor] Processor function. Can be used to replace the 1084 * default functionality which is to send an API 1085 * request to /v1/batch. Is given an array of 1086 * inputs and must return a promise that 1087 * resolves to an array of objects containing 1088 * either `output` or `error`. 1089 */ 1090 1091 function createBatch() { 1092 let processor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultProcessor; 1093 let lastId = 0; 1094 /** @type {Array<{ input: any; resolve: ( value: any ) => void; reject: ( error: any ) => void }>} */ 1095 1096 let queue = []; 1097 const pending = new ObservableSet(); 1098 return { 1099 /** 1100 * Adds an input to the batch and returns a promise that is resolved or 1101 * rejected when the input is processed by `batch.run()`. 1102 * 1103 * You may also pass a thunk which allows inputs to be added 1104 * asychronously. 1105 * 1106 * ``` 1107 * // Both are allowed: 1108 * batch.add( { path: '/v1/books', ... } ); 1109 * batch.add( ( add ) => add( { path: '/v1/books', ... } ) ); 1110 * ``` 1111 * 1112 * If a thunk is passed, `batch.run()` will pause until either: 1113 * 1114 * - The thunk calls its `add` argument, or; 1115 * - The thunk returns a promise and that promise resolves, or; 1116 * - The thunk returns a non-promise. 1117 * 1118 * @param {any|Function} inputOrThunk Input to add or thunk to execute. 1119 * 1120 * @return {Promise|any} If given an input, returns a promise that 1121 * is resolved or rejected when the batch is 1122 * processed. If given a thunk, returns the return 1123 * value of that thunk. 1124 */ 1125 add(inputOrThunk) { 1126 const id = ++lastId; 1127 pending.add(id); 1128 1129 const add = input => new Promise((resolve, reject) => { 1130 queue.push({ 1131 input, 1132 resolve, 1133 reject 1134 }); 1135 pending.delete(id); 1136 }); 1137 1138 if ((0,external_lodash_namespaceObject.isFunction)(inputOrThunk)) { 1139 return Promise.resolve(inputOrThunk(add)).finally(() => { 1140 pending.delete(id); 1141 }); 1142 } 1143 1144 return add(inputOrThunk); 1145 }, 1146 1147 /** 1148 * Runs the batch. This calls `batchProcessor` and resolves or rejects 1149 * all promises returned by `add()`. 1150 * 1151 * @return {Promise<boolean>} A promise that resolves to a boolean that is true 1152 * if the processor returned no errors. 1153 */ 1154 async run() { 1155 if (pending.size) { 1156 await new Promise(resolve => { 1157 const unsubscribe = pending.subscribe(() => { 1158 if (!pending.size) { 1159 unsubscribe(); 1160 resolve(undefined); 1161 } 1162 }); 1163 }); 1164 } 1165 1166 let results; 1167 1168 try { 1169 results = await processor(queue.map(_ref => { 1170 let { 1171 input 1172 } = _ref; 1173 return input; 1174 })); 1175 1176 if (results.length !== queue.length) { 1177 throw new Error('run: Array returned by processor must be same size as input array.'); 1178 } 1179 } catch (error) { 1180 for (const { 1181 reject 1182 } of queue) { 1183 reject(error); 1184 } 1185 1186 throw error; 1187 } 1188 1189 let isSuccess = true; 1190 1191 for (const pair of (0,external_lodash_namespaceObject.zip)(results, queue)) { 1192 /** @type {{error?: unknown, output?: unknown}} */ 1193 const result = pair[0]; 1194 /** @type {{resolve: (value: any) => void; reject: (error: any) => void} | undefined} */ 1195 1196 const queueItem = pair[1]; 1197 1198 if (result !== null && result !== void 0 && result.error) { 1199 queueItem === null || queueItem === void 0 ? void 0 : queueItem.reject(result.error); 1200 isSuccess = false; 1201 } else { 1202 var _result$output; 1203 1204 queueItem === null || queueItem === void 0 ? void 0 : queueItem.resolve((_result$output = result === null || result === void 0 ? void 0 : result.output) !== null && _result$output !== void 0 ? _result$output : result); 1205 } 1206 } 1207 1208 queue = []; 1209 return isSuccess; 1210 } 1211 1212 }; 1213 } 1214 1215 class ObservableSet { 1216 constructor() { 1217 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 1218 args[_key] = arguments[_key]; 1219 } 1220 1221 this.set = new Set(...args); 1222 this.subscribers = new Set(); 1223 } 1224 1225 get size() { 1226 return this.set.size; 1227 } 1228 1229 add(value) { 1230 this.set.add(value); 1231 this.subscribers.forEach(subscriber => subscriber()); 1232 return this; 1233 } 1234 1235 delete(value) { 1236 const isSuccess = this.set.delete(value); 1237 this.subscribers.forEach(subscriber => subscriber()); 1238 return isSuccess; 1239 } 1240 1241 subscribe(subscriber) { 1242 this.subscribers.add(subscriber); 1243 return () => { 1244 this.subscribers.delete(subscriber); 1245 }; 1246 } 1247 1248 } 1249 1250 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/name.js 1251 /** 1252 * The reducer key used by core data in store registration. 1253 * This is defined in a separate file to avoid cycle-dependency 1254 * 1255 * @type {string} 1256 */ 1257 const STORE_NAME = 'core'; 1258 1259 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/actions.js 1260 /** 1261 * External dependencies 1262 */ 1263 1264 1265 /** 1266 * WordPress dependencies 1267 */ 1268 1269 1270 1271 1272 /** 1273 * Internal dependencies 1274 */ 1275 1276 1277 1278 1279 1280 /** 1281 * Returns an action object used in signalling that authors have been received. 1282 * 1283 * @param {string} queryID Query ID. 1284 * @param {Array|Object} users Users received. 1285 * 1286 * @return {Object} Action object. 1287 */ 1288 1289 function receiveUserQuery(queryID, users) { 1290 return { 1291 type: 'RECEIVE_USER_QUERY', 1292 users: (0,external_lodash_namespaceObject.castArray)(users), 1293 queryID 1294 }; 1295 } 1296 /** 1297 * Returns an action used in signalling that the current user has been received. 1298 * 1299 * @param {Object} currentUser Current user object. 1300 * 1301 * @return {Object} Action object. 1302 */ 1303 1304 function receiveCurrentUser(currentUser) { 1305 return { 1306 type: 'RECEIVE_CURRENT_USER', 1307 currentUser 1308 }; 1309 } 1310 /** 1311 * Returns an action object used in adding new entities. 1312 * 1313 * @param {Array} entities Entities received. 1314 * 1315 * @return {Object} Action object. 1316 */ 1317 1318 function addEntities(entities) { 1319 return { 1320 type: 'ADD_ENTITIES', 1321 entities 1322 }; 1323 } 1324 /** 1325 * Returns an action object used in signalling that entity records have been received. 1326 * 1327 * @param {string} kind Kind of the received entity record. 1328 * @param {string} name Name of the received entity record. 1329 * @param {Array|Object} records Records received. 1330 * @param {?Object} query Query Object. 1331 * @param {?boolean} invalidateCache Should invalidate query caches. 1332 * @param {?Object} edits Edits to reset. 1333 * @return {Object} Action object. 1334 */ 1335 1336 function receiveEntityRecords(kind, name, records, query) { 1337 let invalidateCache = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; 1338 let edits = arguments.length > 5 ? arguments[5] : undefined; 1339 1340 // Auto drafts should not have titles, but some plugins rely on them so we can't filter this 1341 // on the server. 1342 if (kind === 'postType') { 1343 records = (0,external_lodash_namespaceObject.castArray)(records).map(record => record.status === 'auto-draft' ? { ...record, 1344 title: '' 1345 } : record); 1346 } 1347 1348 let action; 1349 1350 if (query) { 1351 action = receiveQueriedItems(records, query, edits); 1352 } else { 1353 action = receiveItems(records, edits); 1354 } 1355 1356 return { ...action, 1357 kind, 1358 name, 1359 invalidateCache 1360 }; 1361 } 1362 /** 1363 * Returns an action object used in signalling that the current theme has been received. 1364 * 1365 * @param {Object} currentTheme The current theme. 1366 * 1367 * @return {Object} Action object. 1368 */ 1369 1370 function receiveCurrentTheme(currentTheme) { 1371 return { 1372 type: 'RECEIVE_CURRENT_THEME', 1373 currentTheme 1374 }; 1375 } 1376 /** 1377 * Returns an action object used in signalling that the current global styles id has been received. 1378 * 1379 * @param {string} currentGlobalStylesId The current global styles id. 1380 * 1381 * @return {Object} Action object. 1382 */ 1383 1384 function __experimentalReceiveCurrentGlobalStylesId(currentGlobalStylesId) { 1385 return { 1386 type: 'RECEIVE_CURRENT_GLOBAL_STYLES_ID', 1387 id: currentGlobalStylesId 1388 }; 1389 } 1390 /** 1391 * Returns an action object used in signalling that the theme base global styles have been received 1392 * 1393 * @param {string} stylesheet The theme's identifier 1394 * @param {Object} globalStyles The global styles object. 1395 * 1396 * @return {Object} Action object. 1397 */ 1398 1399 function __experimentalReceiveThemeBaseGlobalStyles(stylesheet, globalStyles) { 1400 return { 1401 type: 'RECEIVE_THEME_GLOBAL_STYLES', 1402 stylesheet, 1403 globalStyles 1404 }; 1405 } 1406 /** 1407 * Returns an action object used in signalling that the theme global styles variations have been received. 1408 * 1409 * @param {string} stylesheet The theme's identifier 1410 * @param {Array} variations The global styles variations. 1411 * 1412 * @return {Object} Action object. 1413 */ 1414 1415 function __experimentalReceiveThemeGlobalStyleVariations(stylesheet, variations) { 1416 return { 1417 type: 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS', 1418 stylesheet, 1419 variations 1420 }; 1421 } 1422 /** 1423 * Returns an action object used in signalling that the index has been received. 1424 * 1425 * @deprecated since WP 5.9, this is not useful anymore, use the selector direclty. 1426 * 1427 * @return {Object} Action object. 1428 */ 1429 1430 function receiveThemeSupports() { 1431 external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveThemeSupports", { 1432 since: '5.9' 1433 }); 1434 return { 1435 type: 'DO_NOTHING' 1436 }; 1437 } 1438 /** 1439 * Returns an action object used in signalling that the preview data for 1440 * a given URl has been received. 1441 * 1442 * @param {string} url URL to preview the embed for. 1443 * @param {*} preview Preview data. 1444 * 1445 * @return {Object} Action object. 1446 */ 1447 1448 function receiveEmbedPreview(url, preview) { 1449 return { 1450 type: 'RECEIVE_EMBED_PREVIEW', 1451 url, 1452 preview 1453 }; 1454 } 1455 /** 1456 * Action triggered to delete an entity record. 1457 * 1458 * @param {string} kind Kind of the deleted entity. 1459 * @param {string} name Name of the deleted entity. 1460 * @param {string} recordId Record ID of the deleted entity. 1461 * @param {?Object} query Special query parameters for the 1462 * DELETE API call. 1463 * @param {Object} [options] Delete options. 1464 * @param {Function} [options.__unstableFetch] Internal use only. Function to 1465 * call instead of `apiFetch()`. 1466 * Must return a promise. 1467 * @param {boolean} [options.throwOnError=false] If false, this action suppresses all 1468 * the exceptions. Defaults to false. 1469 */ 1470 1471 const deleteEntityRecord = function (kind, name, recordId, query) { 1472 let { 1473 __unstableFetch = (external_wp_apiFetch_default()), 1474 throwOnError = false 1475 } = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; 1476 return async _ref => { 1477 let { 1478 dispatch 1479 } = _ref; 1480 const configs = await dispatch(getOrLoadEntitiesConfig(kind)); 1481 const entityConfig = (0,external_lodash_namespaceObject.find)(configs, { 1482 kind, 1483 name 1484 }); 1485 let error; 1486 let deletedRecord = false; 1487 1488 if (!entityConfig || entityConfig !== null && entityConfig !== void 0 && entityConfig.__experimentalNoFetch) { 1489 return; 1490 } 1491 1492 const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, recordId], { 1493 exclusive: true 1494 }); 1495 1496 try { 1497 dispatch({ 1498 type: 'DELETE_ENTITY_RECORD_START', 1499 kind, 1500 name, 1501 recordId 1502 }); 1503 let hasError = false; 1504 1505 try { 1506 let path = `$entityConfig.baseURL}/$recordId}`; 1507 1508 if (query) { 1509 path = (0,external_wp_url_namespaceObject.addQueryArgs)(path, query); 1510 } 1511 1512 deletedRecord = await __unstableFetch({ 1513 path, 1514 method: 'DELETE' 1515 }); 1516 await dispatch(removeItems(kind, name, recordId, true)); 1517 } catch (_error) { 1518 hasError = true; 1519 error = _error; 1520 } 1521 1522 dispatch({ 1523 type: 'DELETE_ENTITY_RECORD_FINISH', 1524 kind, 1525 name, 1526 recordId, 1527 error 1528 }); 1529 1530 if (hasError && throwOnError) { 1531 throw error; 1532 } 1533 1534 return deletedRecord; 1535 } finally { 1536 dispatch.__unstableReleaseStoreLock(lock); 1537 } 1538 }; 1539 }; 1540 /** 1541 * Returns an action object that triggers an 1542 * edit to an entity record. 1543 * 1544 * @param {string} kind Kind of the edited entity record. 1545 * @param {string} name Name of the edited entity record. 1546 * @param {number} recordId Record ID of the edited entity record. 1547 * @param {Object} edits The edits. 1548 * @param {Object} options Options for the edit. 1549 * @param {boolean} [options.undoIgnore] Whether to ignore the edit in undo history or not. 1550 * 1551 * @return {Object} Action object. 1552 */ 1553 1554 const editEntityRecord = function (kind, name, recordId, edits) { 1555 let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; 1556 return _ref2 => { 1557 let { 1558 select, 1559 dispatch 1560 } = _ref2; 1561 const entityConfig = select.getEntityConfig(kind, name); 1562 1563 if (!entityConfig) { 1564 throw new Error(`The entity being edited ($kind}, $name}) does not have a loaded config.`); 1565 } 1566 1567 const { 1568 transientEdits = {}, 1569 mergedEdits = {} 1570 } = entityConfig; 1571 const record = select.getRawEntityRecord(kind, name, recordId); 1572 const editedRecord = select.getEditedEntityRecord(kind, name, recordId); 1573 const edit = { 1574 kind, 1575 name, 1576 recordId, 1577 // Clear edits when they are equal to their persisted counterparts 1578 // so that the property is not considered dirty. 1579 edits: Object.keys(edits).reduce((acc, key) => { 1580 const recordValue = record[key]; 1581 const editedRecordValue = editedRecord[key]; 1582 const value = mergedEdits[key] ? { ...editedRecordValue, 1583 ...edits[key] 1584 } : edits[key]; 1585 acc[key] = (0,external_lodash_namespaceObject.isEqual)(recordValue, value) ? undefined : value; 1586 return acc; 1587 }, {}), 1588 transientEdits 1589 }; 1590 dispatch({ 1591 type: 'EDIT_ENTITY_RECORD', 1592 ...edit, 1593 meta: { 1594 undo: !options.undoIgnore && { ...edit, 1595 // Send the current values for things like the first undo stack entry. 1596 edits: Object.keys(edits).reduce((acc, key) => { 1597 acc[key] = editedRecord[key]; 1598 return acc; 1599 }, {}) 1600 } 1601 } 1602 }); 1603 }; 1604 }; 1605 /** 1606 * Action triggered to undo the last edit to 1607 * an entity record, if any. 1608 */ 1609 1610 const undo = () => _ref3 => { 1611 let { 1612 select, 1613 dispatch 1614 } = _ref3; 1615 const undoEdit = select.getUndoEdit(); 1616 1617 if (!undoEdit) { 1618 return; 1619 } 1620 1621 dispatch({ 1622 type: 'EDIT_ENTITY_RECORD', 1623 ...undoEdit, 1624 meta: { 1625 isUndo: true 1626 } 1627 }); 1628 }; 1629 /** 1630 * Action triggered to redo the last undoed 1631 * edit to an entity record, if any. 1632 */ 1633 1634 const redo = () => _ref4 => { 1635 let { 1636 select, 1637 dispatch 1638 } = _ref4; 1639 const redoEdit = select.getRedoEdit(); 1640 1641 if (!redoEdit) { 1642 return; 1643 } 1644 1645 dispatch({ 1646 type: 'EDIT_ENTITY_RECORD', 1647 ...redoEdit, 1648 meta: { 1649 isRedo: true 1650 } 1651 }); 1652 }; 1653 /** 1654 * Forces the creation of a new undo level. 1655 * 1656 * @return {Object} Action object. 1657 */ 1658 1659 function __unstableCreateUndoLevel() { 1660 return { 1661 type: 'CREATE_UNDO_LEVEL' 1662 }; 1663 } 1664 /** 1665 * Action triggered to save an entity record. 1666 * 1667 * @param {string} kind Kind of the received entity. 1668 * @param {string} name Name of the received entity. 1669 * @param {Object} record Record to be saved. 1670 * @param {Object} options Saving options. 1671 * @param {boolean} [options.isAutosave=false] Whether this is an autosave. 1672 * @param {Function} [options.__unstableFetch] Internal use only. Function to 1673 * call instead of `apiFetch()`. 1674 * Must return a promise. 1675 * @param {boolean} [options.throwOnError=false] If false, this action suppresses all 1676 * the exceptions. Defaults to false. 1677 */ 1678 1679 const saveEntityRecord = function (kind, name, record) { 1680 let { 1681 isAutosave = false, 1682 __unstableFetch = (external_wp_apiFetch_default()), 1683 throwOnError = false 1684 } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 1685 return async _ref5 => { 1686 let { 1687 select, 1688 resolveSelect, 1689 dispatch 1690 } = _ref5; 1691 const configs = await dispatch(getOrLoadEntitiesConfig(kind)); 1692 const entityConfig = (0,external_lodash_namespaceObject.find)(configs, { 1693 kind, 1694 name 1695 }); 1696 1697 if (!entityConfig || entityConfig !== null && entityConfig !== void 0 && entityConfig.__experimentalNoFetch) { 1698 return; 1699 } 1700 1701 const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY; 1702 const recordId = record[entityIdKey]; 1703 const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, recordId || esm_browser_v4()], { 1704 exclusive: true 1705 }); 1706 1707 try { 1708 // Evaluate optimized edits. 1709 // (Function edits that should be evaluated on save to avoid expensive computations on every edit.) 1710 for (const [key, value] of Object.entries(record)) { 1711 if (typeof value === 'function') { 1712 const evaluatedValue = value(select.getEditedEntityRecord(kind, name, recordId)); 1713 dispatch.editEntityRecord(kind, name, recordId, { 1714 [key]: evaluatedValue 1715 }, { 1716 undoIgnore: true 1717 }); 1718 record[key] = evaluatedValue; 1719 } 1720 } 1721 1722 dispatch({ 1723 type: 'SAVE_ENTITY_RECORD_START', 1724 kind, 1725 name, 1726 recordId, 1727 isAutosave 1728 }); 1729 let updatedRecord; 1730 let error; 1731 let hasError = false; 1732 1733 try { 1734 const path = `$entityConfig.baseURL}$recordId ? '/' + recordId : ''}`; 1735 const persistedRecord = select.getRawEntityRecord(kind, name, recordId); 1736 1737 if (isAutosave) { 1738 // Most of this autosave logic is very specific to posts. 1739 // This is fine for now as it is the only supported autosave, 1740 // but ideally this should all be handled in the back end, 1741 // so the client just sends and receives objects. 1742 const currentUser = select.getCurrentUser(); 1743 const currentUserId = currentUser ? currentUser.id : undefined; 1744 const autosavePost = await resolveSelect.getAutosave(persistedRecord.type, persistedRecord.id, currentUserId); // Autosaves need all expected fields to be present. 1745 // So we fallback to the previous autosave and then 1746 // to the actual persisted entity if the edits don't 1747 // have a value. 1748 1749 let data = { ...persistedRecord, 1750 ...autosavePost, 1751 ...record 1752 }; 1753 data = Object.keys(data).reduce((acc, key) => { 1754 if (['title', 'excerpt', 'content'].includes(key)) { 1755 acc[key] = data[key]; 1756 } 1757 1758 return acc; 1759 }, { 1760 status: data.status === 'auto-draft' ? 'draft' : data.status 1761 }); 1762 updatedRecord = await __unstableFetch({ 1763 path: `$path}/autosaves`, 1764 method: 'POST', 1765 data 1766 }); // An autosave may be processed by the server as a regular save 1767 // when its update is requested by the author and the post had 1768 // draft or auto-draft status. 1769 1770 if (persistedRecord.id === updatedRecord.id) { 1771 let newRecord = { ...persistedRecord, 1772 ...data, 1773 ...updatedRecord 1774 }; 1775 newRecord = Object.keys(newRecord).reduce((acc, key) => { 1776 // These properties are persisted in autosaves. 1777 if (['title', 'excerpt', 'content'].includes(key)) { 1778 acc[key] = newRecord[key]; 1779 } else if (key === 'status') { 1780 // Status is only persisted in autosaves when going from 1781 // "auto-draft" to "draft". 1782 acc[key] = persistedRecord.status === 'auto-draft' && newRecord.status === 'draft' ? newRecord.status : persistedRecord.status; 1783 } else { 1784 // These properties are not persisted in autosaves. 1785 acc[key] = persistedRecord[key]; 1786 } 1787 1788 return acc; 1789 }, {}); 1790 dispatch.receiveEntityRecords(kind, name, newRecord, undefined, true); 1791 } else { 1792 dispatch.receiveAutosaves(persistedRecord.id, updatedRecord); 1793 } 1794 } else { 1795 let edits = record; 1796 1797 if (entityConfig.__unstablePrePersist) { 1798 edits = { ...edits, 1799 ...entityConfig.__unstablePrePersist(persistedRecord, edits) 1800 }; 1801 } 1802 1803 updatedRecord = await __unstableFetch({ 1804 path, 1805 method: recordId ? 'PUT' : 'POST', 1806 data: edits 1807 }); 1808 dispatch.receiveEntityRecords(kind, name, updatedRecord, undefined, true, edits); 1809 } 1810 } catch (_error) { 1811 hasError = true; 1812 error = _error; 1813 } 1814 1815 dispatch({ 1816 type: 'SAVE_ENTITY_RECORD_FINISH', 1817 kind, 1818 name, 1819 recordId, 1820 error, 1821 isAutosave 1822 }); 1823 1824 if (hasError && throwOnError) { 1825 throw error; 1826 } 1827 1828 return updatedRecord; 1829 } finally { 1830 dispatch.__unstableReleaseStoreLock(lock); 1831 } 1832 }; 1833 }; 1834 /** 1835 * Runs multiple core-data actions at the same time using one API request. 1836 * 1837 * Example: 1838 * 1839 * ``` 1840 * const [ savedRecord, updatedRecord, deletedRecord ] = 1841 * await dispatch( 'core' ).__experimentalBatch( [ 1842 * ( { saveEntityRecord } ) => saveEntityRecord( 'root', 'widget', widget ), 1843 * ( { saveEditedEntityRecord } ) => saveEntityRecord( 'root', 'widget', 123 ), 1844 * ( { deleteEntityRecord } ) => deleteEntityRecord( 'root', 'widget', 123, null ), 1845 * ] ); 1846 * ``` 1847 * 1848 * @param {Array} requests Array of functions which are invoked simultaneously. 1849 * Each function is passed an object containing 1850 * `saveEntityRecord`, `saveEditedEntityRecord`, and 1851 * `deleteEntityRecord`. 1852 * 1853 * @return {(thunkArgs: Object) => Promise} A promise that resolves to an array containing the return 1854 * values of each function given in `requests`. 1855 */ 1856 1857 const __experimentalBatch = requests => async _ref6 => { 1858 let { 1859 dispatch 1860 } = _ref6; 1861 const batch = createBatch(); 1862 const api = { 1863 saveEntityRecord(kind, name, record, options) { 1864 return batch.add(add => dispatch.saveEntityRecord(kind, name, record, { ...options, 1865 __unstableFetch: add 1866 })); 1867 }, 1868 1869 saveEditedEntityRecord(kind, name, recordId, options) { 1870 return batch.add(add => dispatch.saveEditedEntityRecord(kind, name, recordId, { ...options, 1871 __unstableFetch: add 1872 })); 1873 }, 1874 1875 deleteEntityRecord(kind, name, recordId, query, options) { 1876 return batch.add(add => dispatch.deleteEntityRecord(kind, name, recordId, query, { ...options, 1877 __unstableFetch: add 1878 })); 1879 } 1880 1881 }; 1882 const resultPromises = requests.map(request => request(api)); 1883 const [, ...results] = await Promise.all([batch.run(), ...resultPromises]); 1884 return results; 1885 }; 1886 /** 1887 * Action triggered to save an entity record's edits. 1888 * 1889 * @param {string} kind Kind of the entity. 1890 * @param {string} name Name of the entity. 1891 * @param {Object} recordId ID of the record. 1892 * @param {Object} options Saving options. 1893 */ 1894 1895 const saveEditedEntityRecord = (kind, name, recordId, options) => async _ref7 => { 1896 let { 1897 select, 1898 dispatch 1899 } = _ref7; 1900 1901 if (!select.hasEditsForEntityRecord(kind, name, recordId)) { 1902 return; 1903 } 1904 1905 const configs = await dispatch(getOrLoadEntitiesConfig(kind)); 1906 const entityConfig = (0,external_lodash_namespaceObject.find)(configs, { 1907 kind, 1908 name 1909 }); 1910 1911 if (!entityConfig) { 1912 return; 1913 } 1914 1915 const entityIdKey = entityConfig.key || DEFAULT_ENTITY_KEY; 1916 const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId); 1917 const record = { 1918 [entityIdKey]: recordId, 1919 ...edits 1920 }; 1921 return await dispatch.saveEntityRecord(kind, name, record, options); 1922 }; 1923 /** 1924 * Action triggered to save only specified properties for the entity. 1925 * 1926 * @param {string} kind Kind of the entity. 1927 * @param {string} name Name of the entity. 1928 * @param {Object} recordId ID of the record. 1929 * @param {Array} itemsToSave List of entity properties to save. 1930 * @param {Object} options Saving options. 1931 */ 1932 1933 const __experimentalSaveSpecifiedEntityEdits = (kind, name, recordId, itemsToSave, options) => async _ref8 => { 1934 let { 1935 select, 1936 dispatch 1937 } = _ref8; 1938 1939 if (!select.hasEditsForEntityRecord(kind, name, recordId)) { 1940 return; 1941 } 1942 1943 const edits = select.getEntityRecordNonTransientEdits(kind, name, recordId); 1944 const editsToSave = {}; 1945 1946 for (const edit in edits) { 1947 if (itemsToSave.some(item => item === edit)) { 1948 editsToSave[edit] = edits[edit]; 1949 } 1950 } 1951 1952 return await dispatch.saveEntityRecord(kind, name, editsToSave, options); 1953 }; 1954 /** 1955 * Returns an action object used in signalling that Upload permissions have been received. 1956 * 1957 * @deprecated since WP 5.9, use receiveUserPermission instead. 1958 * 1959 * @param {boolean} hasUploadPermissions Does the user have permission to upload files? 1960 * 1961 * @return {Object} Action object. 1962 */ 1963 1964 function receiveUploadPermissions(hasUploadPermissions) { 1965 external_wp_deprecated_default()("wp.data.dispatch( 'core' ).receiveUploadPermissions", { 1966 since: '5.9', 1967 alternative: 'receiveUserPermission' 1968 }); 1969 return receiveUserPermission('create/media', hasUploadPermissions); 1970 } 1971 /** 1972 * Returns an action object used in signalling that the current user has 1973 * permission to perform an action on a REST resource. 1974 * 1975 * @param {string} key A key that represents the action and REST resource. 1976 * @param {boolean} isAllowed Whether or not the user can perform the action. 1977 * 1978 * @return {Object} Action object. 1979 */ 1980 1981 function receiveUserPermission(key, isAllowed) { 1982 return { 1983 type: 'RECEIVE_USER_PERMISSION', 1984 key, 1985 isAllowed 1986 }; 1987 } 1988 /** 1989 * Returns an action object used in signalling that the autosaves for a 1990 * post have been received. 1991 * 1992 * @param {number} postId The id of the post that is parent to the autosave. 1993 * @param {Array|Object} autosaves An array of autosaves or singular autosave object. 1994 * 1995 * @return {Object} Action object. 1996 */ 1997 1998 function receiveAutosaves(postId, autosaves) { 1999 return { 2000 type: 'RECEIVE_AUTOSAVES', 2001 postId, 2002 autosaves: (0,external_lodash_namespaceObject.castArray)(autosaves) 2003 }; 2004 } 2005 2006 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/entities.js 2007 /** 2008 * External dependencies 2009 */ 2010 2011 /** 2012 * WordPress dependencies 2013 */ 2014 2015 2016 2017 /** 2018 * Internal dependencies 2019 */ 2020 2021 2022 const DEFAULT_ENTITY_KEY = 'id'; 2023 const POST_RAW_ATTRIBUTES = ['title', 'excerpt', 'content']; 2024 const rootEntitiesConfig = [{ 2025 label: (0,external_wp_i18n_namespaceObject.__)('Base'), 2026 name: '__unstableBase', 2027 kind: 'root', 2028 baseURL: '/', 2029 baseURLParams: { 2030 _fields: ['description', 'gmt_offset', 'home', 'name', 'site_icon', 'site_icon_url', 'site_logo', 'timezone_string', 'url'].join(',') 2031 } 2032 }, { 2033 label: (0,external_wp_i18n_namespaceObject.__)('Site'), 2034 name: 'site', 2035 kind: 'root', 2036 baseURL: '/wp/v2/settings', 2037 getTitle: record => { 2038 return (0,external_lodash_namespaceObject.get)(record, ['title'], (0,external_wp_i18n_namespaceObject.__)('Site Title')); 2039 } 2040 }, { 2041 label: (0,external_wp_i18n_namespaceObject.__)('Post Type'), 2042 name: 'postType', 2043 kind: 'root', 2044 key: 'slug', 2045 baseURL: '/wp/v2/types', 2046 baseURLParams: { 2047 context: 'edit' 2048 }, 2049 rawAttributes: POST_RAW_ATTRIBUTES 2050 }, { 2051 name: 'media', 2052 kind: 'root', 2053 baseURL: '/wp/v2/media', 2054 baseURLParams: { 2055 context: 'edit' 2056 }, 2057 plural: 'mediaItems', 2058 label: (0,external_wp_i18n_namespaceObject.__)('Media'), 2059 rawAttributes: ['caption', 'title', 'description'] 2060 }, { 2061 name: 'taxonomy', 2062 kind: 'root', 2063 key: 'slug', 2064 baseURL: '/wp/v2/taxonomies', 2065 baseURLParams: { 2066 context: 'edit' 2067 }, 2068 plural: 'taxonomies', 2069 label: (0,external_wp_i18n_namespaceObject.__)('Taxonomy') 2070 }, { 2071 name: 'sidebar', 2072 kind: 'root', 2073 baseURL: '/wp/v2/sidebars', 2074 plural: 'sidebars', 2075 transientEdits: { 2076 blocks: true 2077 }, 2078 label: (0,external_wp_i18n_namespaceObject.__)('Widget areas') 2079 }, { 2080 name: 'widget', 2081 kind: 'root', 2082 baseURL: '/wp/v2/widgets', 2083 baseURLParams: { 2084 context: 'edit' 2085 }, 2086 plural: 'widgets', 2087 transientEdits: { 2088 blocks: true 2089 }, 2090 label: (0,external_wp_i18n_namespaceObject.__)('Widgets') 2091 }, { 2092 name: 'widgetType', 2093 kind: 'root', 2094 baseURL: '/wp/v2/widget-types', 2095 baseURLParams: { 2096 context: 'edit' 2097 }, 2098 plural: 'widgetTypes', 2099 label: (0,external_wp_i18n_namespaceObject.__)('Widget types') 2100 }, { 2101 label: (0,external_wp_i18n_namespaceObject.__)('User'), 2102 name: 'user', 2103 kind: 'root', 2104 baseURL: '/wp/v2/users', 2105 baseURLParams: { 2106 context: 'edit' 2107 }, 2108 plural: 'users' 2109 }, { 2110 name: 'comment', 2111 kind: 'root', 2112 baseURL: '/wp/v2/comments', 2113 baseURLParams: { 2114 context: 'edit' 2115 }, 2116 plural: 'comments', 2117 label: (0,external_wp_i18n_namespaceObject.__)('Comment') 2118 }, { 2119 name: 'menu', 2120 kind: 'root', 2121 baseURL: '/wp/v2/menus', 2122 baseURLParams: { 2123 context: 'edit' 2124 }, 2125 plural: 'menus', 2126 label: (0,external_wp_i18n_namespaceObject.__)('Menu') 2127 }, { 2128 name: 'menuItem', 2129 kind: 'root', 2130 baseURL: '/wp/v2/menu-items', 2131 baseURLParams: { 2132 context: 'edit' 2133 }, 2134 plural: 'menuItems', 2135 label: (0,external_wp_i18n_namespaceObject.__)('Menu Item'), 2136 rawAttributes: ['title', 'content'] 2137 }, { 2138 name: 'menuLocation', 2139 kind: 'root', 2140 baseURL: '/wp/v2/menu-locations', 2141 baseURLParams: { 2142 context: 'edit' 2143 }, 2144 plural: 'menuLocations', 2145 label: (0,external_wp_i18n_namespaceObject.__)('Menu Location'), 2146 key: 'name' 2147 }, { 2148 label: (0,external_wp_i18n_namespaceObject.__)('Global Styles'), 2149 name: 'globalStyles', 2150 kind: 'root', 2151 baseURL: '/wp/v2/global-styles', 2152 baseURLParams: { 2153 context: 'edit' 2154 }, 2155 plural: 'globalStylesVariations', 2156 // Should be different than name. 2157 getTitle: record => { 2158 var _record$title; 2159 2160 return (record === null || record === void 0 ? void 0 : (_record$title = record.title) === null || _record$title === void 0 ? void 0 : _record$title.rendered) || (record === null || record === void 0 ? void 0 : record.title); 2161 } 2162 }, { 2163 label: (0,external_wp_i18n_namespaceObject.__)('Themes'), 2164 name: 'theme', 2165 kind: 'root', 2166 baseURL: '/wp/v2/themes', 2167 baseURLParams: { 2168 context: 'edit' 2169 }, 2170 key: 'stylesheet' 2171 }, { 2172 label: (0,external_wp_i18n_namespaceObject.__)('Plugins'), 2173 name: 'plugin', 2174 kind: 'root', 2175 baseURL: '/wp/v2/plugins', 2176 baseURLParams: { 2177 context: 'edit' 2178 }, 2179 key: 'plugin' 2180 }]; 2181 const additionalEntityConfigLoaders = [{ 2182 kind: 'postType', 2183 loadEntities: loadPostTypeEntities 2184 }, { 2185 kind: 'taxonomy', 2186 loadEntities: loadTaxonomyEntities 2187 }]; 2188 /** 2189 * Returns a function to be used to retrieve extra edits to apply before persisting a post type. 2190 * 2191 * @param {Object} persistedRecord Already persisted Post 2192 * @param {Object} edits Edits. 2193 * @return {Object} Updated edits. 2194 */ 2195 2196 const prePersistPostType = (persistedRecord, edits) => { 2197 const newEdits = {}; 2198 2199 if ((persistedRecord === null || persistedRecord === void 0 ? void 0 : persistedRecord.status) === 'auto-draft') { 2200 // Saving an auto-draft should create a draft by default. 2201 if (!edits.status && !newEdits.status) { 2202 newEdits.status = 'draft'; 2203 } // Fix the auto-draft default title. 2204 2205 2206 if ((!edits.title || edits.title === 'Auto Draft') && !newEdits.title && (!(persistedRecord !== null && persistedRecord !== void 0 && persistedRecord.title) || (persistedRecord === null || persistedRecord === void 0 ? void 0 : persistedRecord.title) === 'Auto Draft')) { 2207 newEdits.title = ''; 2208 } 2209 } 2210 2211 return newEdits; 2212 }; 2213 /** 2214 * Returns the list of post type entities. 2215 * 2216 * @return {Promise} Entities promise 2217 */ 2218 2219 async function loadPostTypeEntities() { 2220 const postTypes = await external_wp_apiFetch_default()({ 2221 path: '/wp/v2/types?context=view' 2222 }); 2223 return (0,external_lodash_namespaceObject.map)(postTypes, (postType, name) => { 2224 var _postType$rest_namesp; 2225 2226 const isTemplate = ['wp_template', 'wp_template_part'].includes(name); 2227 const namespace = (_postType$rest_namesp = postType === null || postType === void 0 ? void 0 : postType.rest_namespace) !== null && _postType$rest_namesp !== void 0 ? _postType$rest_namesp : 'wp/v2'; 2228 return { 2229 kind: 'postType', 2230 baseURL: `/$namespace}/$postType.rest_base}`, 2231 baseURLParams: { 2232 context: 'edit' 2233 }, 2234 name, 2235 label: postType.name, 2236 transientEdits: { 2237 blocks: true, 2238 selection: true 2239 }, 2240 mergedEdits: { 2241 meta: true 2242 }, 2243 rawAttributes: POST_RAW_ATTRIBUTES, 2244 getTitle: record => { 2245 var _record$title2; 2246 2247 return (record === null || record === void 0 ? void 0 : (_record$title2 = record.title) === null || _record$title2 === void 0 ? void 0 : _record$title2.rendered) || (record === null || record === void 0 ? void 0 : record.title) || (isTemplate ? (0,external_lodash_namespaceObject.startCase)(record.slug) : String(record.id)); 2248 }, 2249 __unstablePrePersist: isTemplate ? undefined : prePersistPostType, 2250 __unstable_rest_base: postType.rest_base 2251 }; 2252 }); 2253 } 2254 /** 2255 * Returns the list of the taxonomies entities. 2256 * 2257 * @return {Promise} Entities promise 2258 */ 2259 2260 2261 async function loadTaxonomyEntities() { 2262 const taxonomies = await external_wp_apiFetch_default()({ 2263 path: '/wp/v2/taxonomies?context=view' 2264 }); 2265 return (0,external_lodash_namespaceObject.map)(taxonomies, (taxonomy, name) => { 2266 var _taxonomy$rest_namesp; 2267 2268 const namespace = (_taxonomy$rest_namesp = taxonomy === null || taxonomy === void 0 ? void 0 : taxonomy.rest_namespace) !== null && _taxonomy$rest_namesp !== void 0 ? _taxonomy$rest_namesp : 'wp/v2'; 2269 return { 2270 kind: 'taxonomy', 2271 baseURL: `/$namespace}/$taxonomy.rest_base}`, 2272 baseURLParams: { 2273 context: 'edit' 2274 }, 2275 name, 2276 label: taxonomy.name 2277 }; 2278 }); 2279 } 2280 /** 2281 * Returns the entity's getter method name given its kind and name. 2282 * 2283 * @example 2284 * ```js 2285 * const nameSingular = getMethodName( 'root', 'theme', 'get' ); 2286 * // nameSingular is getRootTheme 2287 * 2288 * const namePlural = getMethodName( 'root', 'theme', 'set' ); 2289 * // namePlural is setRootThemes 2290 * ``` 2291 * 2292 * @param {string} kind Entity kind. 2293 * @param {string} name Entity name. 2294 * @param {string} prefix Function prefix. 2295 * @param {boolean} usePlural Whether to use the plural form or not. 2296 * 2297 * @return {string} Method name 2298 */ 2299 2300 2301 const getMethodName = function (kind, name) { 2302 let prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'get'; 2303 let usePlural = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; 2304 const entityConfig = (0,external_lodash_namespaceObject.find)(rootEntitiesConfig, { 2305 kind, 2306 name 2307 }); 2308 const kindPrefix = kind === 'root' ? '' : (0,external_lodash_namespaceObject.upperFirst)((0,external_lodash_namespaceObject.camelCase)(kind)); 2309 const nameSuffix = (0,external_lodash_namespaceObject.upperFirst)((0,external_lodash_namespaceObject.camelCase)(name)) + (usePlural ? 's' : ''); 2310 const suffix = usePlural && entityConfig !== null && entityConfig !== void 0 && entityConfig.plural ? (0,external_lodash_namespaceObject.upperFirst)((0,external_lodash_namespaceObject.camelCase)(entityConfig.plural)) : nameSuffix; 2311 return `$prefix}$kindPrefix}$suffix}`; 2312 }; 2313 /** 2314 * Loads the kind entities into the store. 2315 * 2316 * @param {string} kind Kind 2317 * 2318 * @return {(thunkArgs: object) => Promise<Array>} Entities 2319 */ 2320 2321 const getOrLoadEntitiesConfig = kind => async _ref => { 2322 let { 2323 select, 2324 dispatch 2325 } = _ref; 2326 let configs = select.getEntitiesConfig(kind); 2327 2328 if (configs && configs.length !== 0) { 2329 return configs; 2330 } 2331 2332 const loader = (0,external_lodash_namespaceObject.find)(additionalEntityConfigLoaders, { 2333 kind 2334 }); 2335 2336 if (!loader) { 2337 return []; 2338 } 2339 2340 configs = await loader.loadEntities(); 2341 dispatch(addEntities(configs)); 2342 return configs; 2343 }; 2344 2345 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/get-normalized-comma-separable.js 2346 /** 2347 * Given a value which can be specified as one or the other of a comma-separated 2348 * string or an array, returns a value normalized to an array of strings, or 2349 * null if the value cannot be interpreted as either. 2350 * 2351 * @param {string|string[]|*} value 2352 * 2353 * @return {?(string[])} Normalized field value. 2354 */ 2355 function getNormalizedCommaSeparable(value) { 2356 if (typeof value === 'string') { 2357 return value.split(','); 2358 } else if (Array.isArray(value)) { 2359 return value; 2360 } 2361 2362 return null; 2363 } 2364 2365 /* harmony default export */ var get_normalized_comma_separable = (getNormalizedCommaSeparable); 2366 2367 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/with-weak-map-cache.js 2368 /** 2369 * External dependencies 2370 */ 2371 2372 /** 2373 * Given a function, returns an enhanced function which caches the result and 2374 * tracks in WeakMap. The result is only cached if the original function is 2375 * passed a valid object-like argument (requirement for WeakMap key). 2376 * 2377 * @param {Function} fn Original function. 2378 * 2379 * @return {Function} Enhanced caching function. 2380 */ 2381 2382 function withWeakMapCache(fn) { 2383 const cache = new WeakMap(); 2384 return key => { 2385 let value; 2386 2387 if (cache.has(key)) { 2388 value = cache.get(key); 2389 } else { 2390 value = fn(key); // Can reach here if key is not valid for WeakMap, since `has` 2391 // will return false for invalid key. Since `set` will throw, 2392 // ensure that key is valid before setting into cache. 2393 2394 if ((0,external_lodash_namespaceObject.isObjectLike)(key)) { 2395 cache.set(key, value); 2396 } 2397 } 2398 2399 return value; 2400 }; 2401 } 2402 2403 /* harmony default export */ var with_weak_map_cache = (withWeakMapCache); 2404 2405 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/get-query-parts.js 2406 /** 2407 * WordPress dependencies 2408 */ 2409 2410 /** 2411 * Internal dependencies 2412 */ 2413 2414 2415 /** 2416 * An object of properties describing a specific query. 2417 * 2418 * @typedef {Object} WPQueriedDataQueryParts 2419 * 2420 * @property {number} page The query page (1-based index, default 1). 2421 * @property {number} perPage Items per page for query (default 10). 2422 * @property {string} stableKey An encoded stable string of all non- 2423 * pagination, non-fields query parameters. 2424 * @property {?(string[])} fields Target subset of fields to derive from 2425 * item objects. 2426 * @property {?(number[])} include Specific item IDs to include. 2427 * @property {string} context Scope under which the request is made; 2428 * determines returned fields in response. 2429 */ 2430 2431 /** 2432 * Given a query object, returns an object of parts, including pagination 2433 * details (`page` and `perPage`, or default values). All other properties are 2434 * encoded into a stable (idempotent) `stableKey` value. 2435 * 2436 * @param {Object} query Optional query object. 2437 * 2438 * @return {WPQueriedDataQueryParts} Query parts. 2439 */ 2440 2441 function getQueryParts(query) { 2442 /** 2443 * @type {WPQueriedDataQueryParts} 2444 */ 2445 const parts = { 2446 stableKey: '', 2447 page: 1, 2448 perPage: 10, 2449 fields: null, 2450 include: null, 2451 context: 'default' 2452 }; // Ensure stable key by sorting keys. Also more efficient for iterating. 2453 2454 const keys = Object.keys(query).sort(); 2455 2456 for (let i = 0; i < keys.length; i++) { 2457 const key = keys[i]; 2458 let value = query[key]; 2459 2460 switch (key) { 2461 case 'page': 2462 parts[key] = Number(value); 2463 break; 2464 2465 case 'per_page': 2466 parts.perPage = Number(value); 2467 break; 2468 2469 case 'context': 2470 parts.context = value; 2471 break; 2472 2473 default: 2474 // While in theory, we could exclude "_fields" from the stableKey 2475 // because two request with different fields have the same results 2476 // We're not able to ensure that because the server can decide to omit 2477 // fields from the response even if we explicitly asked for it. 2478 // Example: Asking for titles in posts without title support. 2479 if (key === '_fields') { 2480 var _getNormalizedCommaSe; 2481 2482 parts.fields = (_getNormalizedCommaSe = get_normalized_comma_separable(value)) !== null && _getNormalizedCommaSe !== void 0 ? _getNormalizedCommaSe : []; // Make sure to normalize value for `stableKey` 2483 2484 value = parts.fields.join(); 2485 } // Two requests with different include values cannot have same results. 2486 2487 2488 if (key === 'include') { 2489 var _getNormalizedCommaSe2; 2490 2491 if (typeof value === 'number') { 2492 value = value.toString(); 2493 } 2494 2495 parts.include = ((_getNormalizedCommaSe2 = get_normalized_comma_separable(value)) !== null && _getNormalizedCommaSe2 !== void 0 ? _getNormalizedCommaSe2 : []).map(Number); // Normalize value for `stableKey`. 2496 2497 value = parts.include.join(); 2498 } // While it could be any deterministic string, for simplicity's 2499 // sake mimic querystring encoding for stable key. 2500 // 2501 // TODO: For consistency with PHP implementation, addQueryArgs 2502 // should accept a key value pair, which may optimize its 2503 // implementation for our use here, vs. iterating an object 2504 // with only a single key. 2505 2506 2507 parts.stableKey += (parts.stableKey ? '&' : '') + (0,external_wp_url_namespaceObject.addQueryArgs)('', { 2508 [key]: value 2509 }).slice(1); 2510 } 2511 } 2512 2513 return parts; 2514 } 2515 /* harmony default export */ var get_query_parts = (with_weak_map_cache(getQueryParts)); 2516 2517 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/reducer.js 2518 /** 2519 * External dependencies 2520 */ 2521 2522 /** 2523 * WordPress dependencies 2524 */ 2525 2526 2527 /** 2528 * Internal dependencies 2529 */ 2530 2531 2532 2533 2534 2535 function getContextFromAction(action) { 2536 const { 2537 query 2538 } = action; 2539 2540 if (!query) { 2541 return 'default'; 2542 } 2543 2544 const queryParts = get_query_parts(query); 2545 return queryParts.context; 2546 } 2547 /** 2548 * Returns a merged array of item IDs, given details of the received paginated 2549 * items. The array is sparse-like with `undefined` entries where holes exist. 2550 * 2551 * @param {?Array<number>} itemIds Original item IDs (default empty array). 2552 * @param {number[]} nextItemIds Item IDs to merge. 2553 * @param {number} page Page of items merged. 2554 * @param {number} perPage Number of items per page. 2555 * 2556 * @return {number[]} Merged array of item IDs. 2557 */ 2558 2559 2560 function getMergedItemIds(itemIds, nextItemIds, page, perPage) { 2561 var _itemIds$length; 2562 2563 const receivedAllIds = page === 1 && perPage === -1; 2564 2565 if (receivedAllIds) { 2566 return nextItemIds; 2567 } 2568 2569 const nextItemIdsStartIndex = (page - 1) * perPage; // If later page has already been received, default to the larger known 2570 // size of the existing array, else calculate as extending the existing. 2571 2572 const size = Math.max((_itemIds$length = itemIds === null || itemIds === void 0 ? void 0 : itemIds.length) !== null && _itemIds$length !== void 0 ? _itemIds$length : 0, nextItemIdsStartIndex + nextItemIds.length); // Preallocate array since size is known. 2573 2574 const mergedItemIds = new Array(size); 2575 2576 for (let i = 0; i < size; i++) { 2577 // Preserve existing item ID except for subset of range of next items. 2578 const isInNextItemsRange = i >= nextItemIdsStartIndex && i < nextItemIdsStartIndex + nextItemIds.length; 2579 mergedItemIds[i] = isInNextItemsRange ? nextItemIds[i - nextItemIdsStartIndex] : itemIds === null || itemIds === void 0 ? void 0 : itemIds[i]; 2580 } 2581 2582 return mergedItemIds; 2583 } 2584 /** 2585 * Reducer tracking items state, keyed by ID. Items are assumed to be normal, 2586 * where identifiers are common across all queries. 2587 * 2588 * @param {Object} state Current state. 2589 * @param {Object} action Dispatched action. 2590 * 2591 * @return {Object} Next state. 2592 */ 2593 2594 function items() { 2595 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2596 let action = arguments.length > 1 ? arguments[1] : undefined; 2597 2598 switch (action.type) { 2599 case 'RECEIVE_ITEMS': 2600 { 2601 const context = getContextFromAction(action); 2602 const key = action.key || DEFAULT_ENTITY_KEY; 2603 return { ...state, 2604 [context]: { ...state[context], 2605 ...action.items.reduce((accumulator, value) => { 2606 var _state$context; 2607 2608 const itemId = value[key]; 2609 accumulator[itemId] = conservativeMapItem(state === null || state === void 0 ? void 0 : (_state$context = state[context]) === null || _state$context === void 0 ? void 0 : _state$context[itemId], value); 2610 return accumulator; 2611 }, {}) 2612 } 2613 }; 2614 } 2615 2616 case 'REMOVE_ITEMS': 2617 return (0,external_lodash_namespaceObject.mapValues)(state, contextState => (0,external_lodash_namespaceObject.omit)(contextState, action.itemIds)); 2618 } 2619 2620 return state; 2621 } 2622 /** 2623 * Reducer tracking item completeness, keyed by ID. A complete item is one for 2624 * which all fields are known. This is used in supporting `_fields` queries, 2625 * where not all properties associated with an entity are necessarily returned. 2626 * In such cases, completeness is used as an indication of whether it would be 2627 * safe to use queried data for a non-`_fields`-limited request. 2628 * 2629 * @param {Object<string,Object<string,boolean>>} state Current state. 2630 * @param {Object} action Dispatched action. 2631 * 2632 * @return {Object<string,Object<string,boolean>>} Next state. 2633 */ 2634 2635 function itemIsComplete() { 2636 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2637 let action = arguments.length > 1 ? arguments[1] : undefined; 2638 2639 switch (action.type) { 2640 case 'RECEIVE_ITEMS': 2641 { 2642 const context = getContextFromAction(action); 2643 const { 2644 query, 2645 key = DEFAULT_ENTITY_KEY 2646 } = action; // An item is considered complete if it is received without an associated 2647 // fields query. Ideally, this would be implemented in such a way where the 2648 // complete aggregate of all fields would satisfy completeness. Since the 2649 // fields are not consistent across all entities, this would require 2650 // introspection on the REST schema for each entity to know which fields 2651 // compose a complete item for that entity. 2652 2653 const queryParts = query ? get_query_parts(query) : {}; 2654 const isCompleteQuery = !query || !Array.isArray(queryParts.fields); 2655 return { ...state, 2656 [context]: { ...state[context], 2657 ...action.items.reduce((result, item) => { 2658 var _state$context2; 2659 2660 const itemId = item[key]; // Defer to completeness if already assigned. Technically the 2661 // data may be outdated if receiving items for a field subset. 2662 2663 result[itemId] = (state === null || state === void 0 ? void 0 : (_state$context2 = state[context]) === null || _state$context2 === void 0 ? void 0 : _state$context2[itemId]) || isCompleteQuery; 2664 return result; 2665 }, {}) 2666 } 2667 }; 2668 } 2669 2670 case 'REMOVE_ITEMS': 2671 return (0,external_lodash_namespaceObject.mapValues)(state, contextState => (0,external_lodash_namespaceObject.omit)(contextState, action.itemIds)); 2672 } 2673 2674 return state; 2675 } 2676 /** 2677 * Reducer tracking queries state, keyed by stable query key. Each reducer 2678 * query object includes `itemIds` and `requestingPageByPerPage`. 2679 * 2680 * @param {Object} state Current state. 2681 * @param {Object} action Dispatched action. 2682 * 2683 * @return {Object} Next state. 2684 */ 2685 2686 const receiveQueries = (0,external_lodash_namespaceObject.flowRight)([// Limit to matching action type so we don't attempt to replace action on 2687 // an unhandled action. 2688 if_matching_action(action => 'query' in action), // Inject query parts into action for use both in `onSubKey` and reducer. 2689 replace_action(action => { 2690 // `ifMatchingAction` still passes on initialization, where state is 2691 // undefined and a query is not assigned. Avoid attempting to parse 2692 // parts. `onSubKey` will omit by lack of `stableKey`. 2693 if (action.query) { 2694 return { ...action, 2695 ...get_query_parts(action.query) 2696 }; 2697 } 2698 2699 return action; 2700 }), on_sub_key('context'), // Queries shape is shared, but keyed by query `stableKey` part. Original 2701 // reducer tracks only a single query object. 2702 on_sub_key('stableKey')])(function () { 2703 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; 2704 let action = arguments.length > 1 ? arguments[1] : undefined; 2705 const { 2706 type, 2707 page, 2708 perPage, 2709 key = DEFAULT_ENTITY_KEY 2710 } = action; 2711 2712 if (type !== 'RECEIVE_ITEMS') { 2713 return state; 2714 } 2715 2716 return getMergedItemIds(state || [], (0,external_lodash_namespaceObject.map)(action.items, key), page, perPage); 2717 }); 2718 /** 2719 * Reducer tracking queries state. 2720 * 2721 * @param {Object} state Current state. 2722 * @param {Object} action Dispatched action. 2723 * 2724 * @return {Object} Next state. 2725 */ 2726 2727 const queries = function () { 2728 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2729 let action = arguments.length > 1 ? arguments[1] : undefined; 2730 2731 switch (action.type) { 2732 case 'RECEIVE_ITEMS': 2733 return receiveQueries(state, action); 2734 2735 case 'REMOVE_ITEMS': 2736 const removedItems = action.itemIds.reduce((result, itemId) => { 2737 result[itemId] = true; 2738 return result; 2739 }, {}); 2740 return (0,external_lodash_namespaceObject.mapValues)(state, contextQueries => { 2741 return (0,external_lodash_namespaceObject.mapValues)(contextQueries, queryItems => { 2742 return (0,external_lodash_namespaceObject.filter)(queryItems, queryId => { 2743 return !removedItems[queryId]; 2744 }); 2745 }); 2746 }); 2747 2748 default: 2749 return state; 2750 } 2751 }; 2752 2753 /* harmony default export */ var reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ 2754 items, 2755 itemIsComplete, 2756 queries 2757 })); 2758 2759 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/reducer.js 2760 /** 2761 * External dependencies 2762 */ 2763 2764 /** 2765 * WordPress dependencies 2766 */ 2767 2768 2769 2770 /** 2771 * Internal dependencies 2772 */ 2773 2774 2775 2776 2777 /** @typedef {import('./types').AnyFunction} AnyFunction */ 2778 2779 /** 2780 * Reducer managing terms state. Keyed by taxonomy slug, the value is either 2781 * undefined (if no request has been made for given taxonomy), null (if a 2782 * request is in-flight for given taxonomy), or the array of terms for the 2783 * taxonomy. 2784 * 2785 * @param {Object} state Current state. 2786 * @param {Object} action Dispatched action. 2787 * 2788 * @return {Object} Updated state. 2789 */ 2790 2791 function terms() { 2792 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2793 let action = arguments.length > 1 ? arguments[1] : undefined; 2794 2795 switch (action.type) { 2796 case 'RECEIVE_TERMS': 2797 return { ...state, 2798 [action.taxonomy]: action.terms 2799 }; 2800 } 2801 2802 return state; 2803 } 2804 /** 2805 * Reducer managing authors state. Keyed by id. 2806 * 2807 * @param {Object} state Current state. 2808 * @param {Object} action Dispatched action. 2809 * 2810 * @return {Object} Updated state. 2811 */ 2812 2813 function users() { 2814 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { 2815 byId: {}, 2816 queries: {} 2817 }; 2818 let action = arguments.length > 1 ? arguments[1] : undefined; 2819 2820 switch (action.type) { 2821 case 'RECEIVE_USER_QUERY': 2822 return { 2823 byId: { ...state.byId, 2824 ...(0,external_lodash_namespaceObject.keyBy)(action.users, 'id') 2825 }, 2826 queries: { ...state.queries, 2827 [action.queryID]: (0,external_lodash_namespaceObject.map)(action.users, user => user.id) 2828 } 2829 }; 2830 } 2831 2832 return state; 2833 } 2834 /** 2835 * Reducer managing current user state. 2836 * 2837 * @param {Object} state Current state. 2838 * @param {Object} action Dispatched action. 2839 * 2840 * @return {Object} Updated state. 2841 */ 2842 2843 function currentUser() { 2844 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2845 let action = arguments.length > 1 ? arguments[1] : undefined; 2846 2847 switch (action.type) { 2848 case 'RECEIVE_CURRENT_USER': 2849 return action.currentUser; 2850 } 2851 2852 return state; 2853 } 2854 /** 2855 * Reducer managing taxonomies. 2856 * 2857 * @param {Object} state Current state. 2858 * @param {Object} action Dispatched action. 2859 * 2860 * @return {Object} Updated state. 2861 */ 2862 2863 function taxonomies() { 2864 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; 2865 let action = arguments.length > 1 ? arguments[1] : undefined; 2866 2867 switch (action.type) { 2868 case 'RECEIVE_TAXONOMIES': 2869 return action.taxonomies; 2870 } 2871 2872 return state; 2873 } 2874 /** 2875 * Reducer managing the current theme. 2876 * 2877 * @param {string|undefined} state Current state. 2878 * @param {Object} action Dispatched action. 2879 * 2880 * @return {string|undefined} Updated state. 2881 */ 2882 2883 function currentTheme() { 2884 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; 2885 let action = arguments.length > 1 ? arguments[1] : undefined; 2886 2887 switch (action.type) { 2888 case 'RECEIVE_CURRENT_THEME': 2889 return action.currentTheme.stylesheet; 2890 } 2891 2892 return state; 2893 } 2894 /** 2895 * Reducer managing the current global styles id. 2896 * 2897 * @param {string|undefined} state Current state. 2898 * @param {Object} action Dispatched action. 2899 * 2900 * @return {string|undefined} Updated state. 2901 */ 2902 2903 function currentGlobalStylesId() { 2904 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; 2905 let action = arguments.length > 1 ? arguments[1] : undefined; 2906 2907 switch (action.type) { 2908 case 'RECEIVE_CURRENT_GLOBAL_STYLES_ID': 2909 return action.id; 2910 } 2911 2912 return state; 2913 } 2914 /** 2915 * Reducer managing the theme base global styles. 2916 * 2917 * @param {Record<string, object>} state Current state. 2918 * @param {Object} action Dispatched action. 2919 * 2920 * @return {Record<string, object>} Updated state. 2921 */ 2922 2923 function themeBaseGlobalStyles() { 2924 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2925 let action = arguments.length > 1 ? arguments[1] : undefined; 2926 2927 switch (action.type) { 2928 case 'RECEIVE_THEME_GLOBAL_STYLES': 2929 return { ...state, 2930 [action.stylesheet]: action.globalStyles 2931 }; 2932 } 2933 2934 return state; 2935 } 2936 /** 2937 * Reducer managing the theme global styles variations. 2938 * 2939 * @param {Record<string, object>} state Current state. 2940 * @param {Object} action Dispatched action. 2941 * 2942 * @return {Record<string, object>} Updated state. 2943 */ 2944 2945 function themeGlobalStyleVariations() { 2946 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2947 let action = arguments.length > 1 ? arguments[1] : undefined; 2948 2949 switch (action.type) { 2950 case 'RECEIVE_THEME_GLOBAL_STYLE_VARIATIONS': 2951 return { ...state, 2952 [action.stylesheet]: action.variations 2953 }; 2954 } 2955 2956 return state; 2957 } 2958 /** 2959 * Higher Order Reducer for a given entity config. It supports: 2960 * 2961 * - Fetching 2962 * - Editing 2963 * - Saving 2964 * 2965 * @param {Object} entityConfig Entity config. 2966 * 2967 * @return {AnyFunction} Reducer. 2968 */ 2969 2970 function entity(entityConfig) { 2971 return (0,external_lodash_namespaceObject.flowRight)([// Limit to matching action type so we don't attempt to replace action on 2972 // an unhandled action. 2973 if_matching_action(action => action.name && action.kind && action.name === entityConfig.name && action.kind === entityConfig.kind), // Inject the entity config into the action. 2974 replace_action(action => { 2975 return { ...action, 2976 key: entityConfig.key || DEFAULT_ENTITY_KEY 2977 }; 2978 })])((0,external_wp_data_namespaceObject.combineReducers)({ 2979 queriedData: reducer, 2980 edits: function () { 2981 var _action$query$context, _action$query; 2982 2983 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 2984 let action = arguments.length > 1 ? arguments[1] : undefined; 2985 2986 switch (action.type) { 2987 case 'RECEIVE_ITEMS': 2988 const context = (_action$query$context = action === null || action === void 0 ? void 0 : (_action$query = action.query) === null || _action$query === void 0 ? void 0 : _action$query.context) !== null && _action$query$context !== void 0 ? _action$query$context : 'default'; 2989 2990 if (context !== 'default') { 2991 return state; 2992 } 2993 2994 const nextState = { ...state 2995 }; 2996 2997 for (const record of action.items) { 2998 const recordId = record[action.key]; 2999 const edits = nextState[recordId]; 3000 3001 if (!edits) { 3002 continue; 3003 } 3004 3005 const nextEdits = Object.keys(edits).reduce((acc, key) => { 3006 // If the edited value is still different to the persisted value, 3007 // keep the edited value in edits. 3008 if ( // Edits are the "raw" attribute values, but records may have 3009 // objects with more properties, so we use `get` here for the 3010 // comparison. 3011 !(0,external_lodash_namespaceObject.isEqual)(edits[key], (0,external_lodash_namespaceObject.get)(record[key], 'raw', record[key])) && ( // Sometimes the server alters the sent value which means 3012 // we need to also remove the edits before the api request. 3013 !action.persistedEdits || !(0,external_lodash_namespaceObject.isEqual)(edits[key], action.persistedEdits[key]))) { 3014 acc[key] = edits[key]; 3015 } 3016 3017 return acc; 3018 }, {}); 3019 3020 if (Object.keys(nextEdits).length) { 3021 nextState[recordId] = nextEdits; 3022 } else { 3023 delete nextState[recordId]; 3024 } 3025 } 3026 3027 return nextState; 3028 3029 case 'EDIT_ENTITY_RECORD': 3030 const nextEdits = { ...state[action.recordId], 3031 ...action.edits 3032 }; 3033 Object.keys(nextEdits).forEach(key => { 3034 // Delete cleared edits so that the properties 3035 // are not considered dirty. 3036 if (nextEdits[key] === undefined) { 3037 delete nextEdits[key]; 3038 } 3039 }); 3040 return { ...state, 3041 [action.recordId]: nextEdits 3042 }; 3043 } 3044 3045 return state; 3046 }, 3047 saving: function () { 3048 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 3049 let action = arguments.length > 1 ? arguments[1] : undefined; 3050 3051 switch (action.type) { 3052 case 'SAVE_ENTITY_RECORD_START': 3053 case 'SAVE_ENTITY_RECORD_FINISH': 3054 return { ...state, 3055 [action.recordId]: { 3056 pending: action.type === 'SAVE_ENTITY_RECORD_START', 3057 error: action.error, 3058 isAutosave: action.isAutosave 3059 } 3060 }; 3061 } 3062 3063 return state; 3064 }, 3065 deleting: function () { 3066 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 3067 let action = arguments.length > 1 ? arguments[1] : undefined; 3068 3069 switch (action.type) { 3070 case 'DELETE_ENTITY_RECORD_START': 3071 case 'DELETE_ENTITY_RECORD_FINISH': 3072 return { ...state, 3073 [action.recordId]: { 3074 pending: action.type === 'DELETE_ENTITY_RECORD_START', 3075 error: action.error 3076 } 3077 }; 3078 } 3079 3080 return state; 3081 } 3082 })); 3083 } 3084 /** 3085 * Reducer keeping track of the registered entities. 3086 * 3087 * @param {Object} state Current state. 3088 * @param {Object} action Dispatched action. 3089 * 3090 * @return {Object} Updated state. 3091 */ 3092 3093 3094 function entitiesConfig() { 3095 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : rootEntitiesConfig; 3096 let action = arguments.length > 1 ? arguments[1] : undefined; 3097 3098 switch (action.type) { 3099 case 'ADD_ENTITIES': 3100 return [...state, ...action.entities]; 3101 } 3102 3103 return state; 3104 } 3105 /** 3106 * Reducer keeping track of the registered entities config and data. 3107 * 3108 * @param {Object} state Current state. 3109 * @param {Object} action Dispatched action. 3110 * 3111 * @return {Object} Updated state. 3112 */ 3113 3114 const entities = function () { 3115 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 3116 let action = arguments.length > 1 ? arguments[1] : undefined; 3117 const newConfig = entitiesConfig(state.config, action); // Generates a dynamic reducer for the entities. 3118 3119 let entitiesDataReducer = state.reducer; 3120 3121 if (!entitiesDataReducer || newConfig !== state.config) { 3122 const entitiesByKind = (0,external_lodash_namespaceObject.groupBy)(newConfig, 'kind'); 3123 entitiesDataReducer = (0,external_wp_data_namespaceObject.combineReducers)(Object.entries(entitiesByKind).reduce((memo, _ref) => { 3124 let [kind, subEntities] = _ref; 3125 const kindReducer = (0,external_wp_data_namespaceObject.combineReducers)(subEntities.reduce((kindMemo, entityConfig) => ({ ...kindMemo, 3126 [entityConfig.name]: entity(entityConfig) 3127 }), {})); 3128 memo[kind] = kindReducer; 3129 return memo; 3130 }, {})); 3131 } 3132 3133 const newData = entitiesDataReducer(state.records, action); 3134 3135 if (newData === state.records && newConfig === state.config && entitiesDataReducer === state.reducer) { 3136 return state; 3137 } 3138 3139 return { 3140 reducer: entitiesDataReducer, 3141 records: newData, 3142 config: newConfig 3143 }; 3144 }; 3145 /** 3146 * @typedef {Object} UndoStateMeta 3147 * 3148 * @property {number} offset Where in the undo stack we are. 3149 * @property {Object} [flattenedUndo] Flattened form of undo stack. 3150 */ 3151 3152 /** @typedef {Array<Object> & UndoStateMeta} UndoState */ 3153 3154 /** 3155 * @type {UndoState} 3156 * 3157 * @todo Given how we use this we might want to make a custom class for it. 3158 */ 3159 3160 const UNDO_INITIAL_STATE = Object.assign([], { 3161 offset: 0 3162 }); 3163 /** @type {Object} */ 3164 3165 let lastEditAction; 3166 /** 3167 * Reducer keeping track of entity edit undo history. 3168 * 3169 * @param {UndoState} state Current state. 3170 * @param {Object} action Dispatched action. 3171 * 3172 * @return {UndoState} Updated state. 3173 */ 3174 3175 function reducer_undo() { 3176 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : UNDO_INITIAL_STATE; 3177 let action = arguments.length > 1 ? arguments[1] : undefined; 3178 3179 switch (action.type) { 3180 case 'EDIT_ENTITY_RECORD': 3181 case 'CREATE_UNDO_LEVEL': 3182 let isCreateUndoLevel = action.type === 'CREATE_UNDO_LEVEL'; 3183 const isUndoOrRedo = !isCreateUndoLevel && (action.meta.isUndo || action.meta.isRedo); 3184 3185 if (isCreateUndoLevel) { 3186 action = lastEditAction; 3187 } else if (!isUndoOrRedo) { 3188 // Don't lose the last edit cache if the new one only has transient edits. 3189 // Transient edits don't create new levels so updating the cache would make 3190 // us skip an edit later when creating levels explicitly. 3191 if (Object.keys(action.edits).some(key => !action.transientEdits[key])) { 3192 lastEditAction = action; 3193 } else { 3194 lastEditAction = { ...action, 3195 edits: { ...(lastEditAction && lastEditAction.edits), 3196 ...action.edits 3197 } 3198 }; 3199 } 3200 } 3201 /** @type {UndoState} */ 3202 3203 3204 let nextState; 3205 3206 if (isUndoOrRedo) { 3207 // @ts-ignore we might consider using Object.assign({}, state) 3208 nextState = [...state]; 3209 nextState.offset = state.offset + (action.meta.isUndo ? -1 : 1); 3210 3211 if (state.flattenedUndo) { 3212 // The first undo in a sequence of undos might happen while we have 3213 // flattened undos in state. If this is the case, we want execution 3214 // to continue as if we were creating an explicit undo level. This 3215 // will result in an extra undo level being appended with the flattened 3216 // undo values. 3217 // We also have to take into account if the `lastEditAction` had opted out 3218 // of being tracked in undo history, like the action that persists the latest 3219 // content right before saving. In that case we have to update the `lastEditAction` 3220 // to avoid returning early before applying the existing flattened undos. 3221 isCreateUndoLevel = true; 3222 3223 if (!lastEditAction.meta.undo) { 3224 lastEditAction.meta.undo = { 3225 edits: {} 3226 }; 3227 } 3228 3229 action = lastEditAction; 3230 } else { 3231 return nextState; 3232 } 3233 } 3234 3235 if (!action.meta.undo) { 3236 return state; 3237 } // Transient edits don't create an undo level, but are 3238 // reachable in the next meaningful edit to which they 3239 // are merged. They are defined in the entity's config. 3240 3241 3242 if (!isCreateUndoLevel && !Object.keys(action.edits).some(key => !action.transientEdits[key])) { 3243 // @ts-ignore we might consider using Object.assign({}, state) 3244 nextState = [...state]; 3245 nextState.flattenedUndo = { ...state.flattenedUndo, 3246 ...action.edits 3247 }; 3248 nextState.offset = state.offset; 3249 return nextState; 3250 } // Clear potential redos, because this only supports linear history. 3251 3252 3253 nextState = // @ts-ignore this needs additional cleanup, probably involving code-level changes 3254 nextState || state.slice(0, state.offset || undefined); 3255 nextState.offset = nextState.offset || 0; 3256 nextState.pop(); 3257 3258 if (!isCreateUndoLevel) { 3259 nextState.push({ 3260 kind: action.meta.undo.kind, 3261 name: action.meta.undo.name, 3262 recordId: action.meta.undo.recordId, 3263 edits: { ...state.flattenedUndo, 3264 ...action.meta.undo.edits 3265 } 3266 }); 3267 } // When an edit is a function it's an optimization to avoid running some expensive operation. 3268 // We can't rely on the function references being the same so we opt out of comparing them here. 3269 3270 3271 const comparisonUndoEdits = Object.values(action.meta.undo.edits).filter(edit => typeof edit !== 'function'); 3272 const comparisonEdits = Object.values(action.edits).filter(edit => typeof edit !== 'function'); 3273 3274 if (!external_wp_isShallowEqual_default()(comparisonUndoEdits, comparisonEdits)) { 3275 nextState.push({ 3276 kind: action.kind, 3277 name: action.name, 3278 recordId: action.recordId, 3279 edits: isCreateUndoLevel ? { ...state.flattenedUndo, 3280 ...action.edits 3281 } : action.edits 3282 }); 3283 } 3284 3285 return nextState; 3286 } 3287 3288 return state; 3289 } 3290 /** 3291 * Reducer managing embed preview data. 3292 * 3293 * @param {Object} state Current state. 3294 * @param {Object} action Dispatched action. 3295 * 3296 * @return {Object} Updated state. 3297 */ 3298 3299 function embedPreviews() { 3300 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 3301 let action = arguments.length > 1 ? arguments[1] : undefined; 3302 3303 switch (action.type) { 3304 case 'RECEIVE_EMBED_PREVIEW': 3305 const { 3306 url, 3307 preview 3308 } = action; 3309 return { ...state, 3310 [url]: preview 3311 }; 3312 } 3313 3314 return state; 3315 } 3316 /** 3317 * State which tracks whether the user can perform an action on a REST 3318 * resource. 3319 * 3320 * @param {Object} state Current state. 3321 * @param {Object} action Dispatched action. 3322 * 3323 * @return {Object} Updated state. 3324 */ 3325 3326 function userPermissions() { 3327 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 3328 let action = arguments.length > 1 ? arguments[1] : undefined; 3329 3330 switch (action.type) { 3331 case 'RECEIVE_USER_PERMISSION': 3332 return { ...state, 3333 [action.key]: action.isAllowed 3334 }; 3335 } 3336 3337 return state; 3338 } 3339 /** 3340 * Reducer returning autosaves keyed by their parent's post id. 3341 * 3342 * @param {Object} state Current state. 3343 * @param {Object} action Dispatched action. 3344 * 3345 * @return {Object} Updated state. 3346 */ 3347 3348 function autosaves() { 3349 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 3350 let action = arguments.length > 1 ? arguments[1] : undefined; 3351 3352 switch (action.type) { 3353 case 'RECEIVE_AUTOSAVES': 3354 const { 3355 postId, 3356 autosaves: autosavesData 3357 } = action; 3358 return { ...state, 3359 [postId]: autosavesData 3360 }; 3361 } 3362 3363 return state; 3364 } 3365 function blockPatterns() { 3366 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; 3367 let action = arguments.length > 1 ? arguments[1] : undefined; 3368 3369 switch (action.type) { 3370 case 'RECEIVE_BLOCK_PATTERNS': 3371 return action.patterns; 3372 } 3373 3374 return state; 3375 } 3376 function blockPatternCategories() { 3377 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; 3378 let action = arguments.length > 1 ? arguments[1] : undefined; 3379 3380 switch (action.type) { 3381 case 'RECEIVE_BLOCK_PATTERN_CATEGORIES': 3382 return action.categories; 3383 } 3384 3385 return state; 3386 } 3387 /* harmony default export */ var build_module_reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ 3388 terms, 3389 users, 3390 currentTheme, 3391 currentGlobalStylesId, 3392 currentUser, 3393 themeGlobalStyleVariations, 3394 themeBaseGlobalStyles, 3395 taxonomies, 3396 entities, 3397 undo: reducer_undo, 3398 embedPreviews, 3399 userPermissions, 3400 autosaves, 3401 blockPatterns, 3402 blockPatternCategories 3403 })); 3404 3405 ;// CONCATENATED MODULE: ./node_modules/rememo/es/rememo.js 3406 3407 3408 var LEAF_KEY, hasWeakMap; 3409 3410 /** 3411 * Arbitrary value used as key for referencing cache object in WeakMap tree. 3412 * 3413 * @type {Object} 3414 */ 3415 LEAF_KEY = {}; 3416 3417 /** 3418 * Whether environment supports WeakMap. 3419 * 3420 * @type {boolean} 3421 */ 3422 hasWeakMap = typeof WeakMap !== 'undefined'; 3423 3424 /** 3425 * Returns the first argument as the sole entry in an array. 3426 * 3427 * @param {*} value Value to return. 3428 * 3429 * @return {Array} Value returned as entry in array. 3430 */ 3431 function arrayOf( value ) { 3432 return [ value ]; 3433 } 3434 3435 /** 3436 * Returns true if the value passed is object-like, or false otherwise. A value 3437 * is object-like if it can support property assignment, e.g. object or array. 3438 * 3439 * @param {*} value Value to test. 3440 * 3441 * @return {boolean} Whether value is object-like. 3442 */ 3443 function isObjectLike( value ) { 3444 return !! value && 'object' === typeof value; 3445 } 3446 3447 /** 3448 * Creates and returns a new cache object. 3449 * 3450 * @return {Object} Cache object. 3451 */ 3452 function createCache() { 3453 var cache = { 3454 clear: function() { 3455 cache.head = null; 3456 }, 3457 }; 3458 3459 return cache; 3460 } 3461 3462 /** 3463 * Returns true if entries within the two arrays are strictly equal by 3464 * reference from a starting index. 3465 * 3466 * @param {Array} a First array. 3467 * @param {Array} b Second array. 3468 * @param {number} fromIndex Index from which to start comparison. 3469 * 3470 * @return {boolean} Whether arrays are shallowly equal. 3471 */ 3472 function isShallowEqual( a, b, fromIndex ) { 3473 var i; 3474 3475 if ( a.length !== b.length ) { 3476 return false; 3477 } 3478 3479 for ( i = fromIndex; i < a.length; i++ ) { 3480 if ( a[ i ] !== b[ i ] ) { 3481 return false; 3482 } 3483 } 3484 3485 return true; 3486 } 3487 3488 /** 3489 * Returns a memoized selector function. The getDependants function argument is 3490 * called before the memoized selector and is expected to return an immutable 3491 * reference or array of references on which the selector depends for computing 3492 * its own return value. The memoize cache is preserved only as long as those 3493 * dependant references remain the same. If getDependants returns a different 3494 * reference(s), the cache is cleared and the selector value regenerated. 3495 * 3496 * @param {Function} selector Selector function. 3497 * @param {Function} getDependants Dependant getter returning an immutable 3498 * reference or array of reference used in 3499 * cache bust consideration. 3500 * 3501 * @return {Function} Memoized selector. 3502 */ 3503 /* harmony default export */ function rememo(selector, getDependants ) { 3504 var rootCache, getCache; 3505 3506 // Use object source as dependant if getter not provided 3507 if ( ! getDependants ) { 3508 getDependants = arrayOf; 3509 } 3510 3511 /** 3512 * Returns the root cache. If WeakMap is supported, this is assigned to the 3513 * root WeakMap cache set, otherwise it is a shared instance of the default 3514 * cache object. 3515 * 3516 * @return {(WeakMap|Object)} Root cache object. 3517 */ 3518 function getRootCache() { 3519 return rootCache; 3520 } 3521 3522 /** 3523 * Returns the cache for a given dependants array. When possible, a WeakMap 3524 * will be used to create a unique cache for each set of dependants. This 3525 * is feasible due to the nature of WeakMap in allowing garbage collection 3526 * to occur on entries where the key object is no longer referenced. Since 3527 * WeakMap requires the key to be an object, this is only possible when the 3528 * dependant is object-like. The root cache is created as a hierarchy where 3529 * each top-level key is the first entry in a dependants set, the value a 3530 * WeakMap where each key is the next dependant, and so on. This continues 3531 * so long as the dependants are object-like. If no dependants are object- 3532 * like, then the cache is shared across all invocations. 3533 * 3534 * @see isObjectLike 3535 * 3536 * @param {Array} dependants Selector dependants. 3537 * 3538 * @return {Object} Cache object. 3539 */ 3540 function getWeakMapCache( dependants ) { 3541 var caches = rootCache, 3542 isUniqueByDependants = true, 3543 i, dependant, map, cache; 3544 3545 for ( i = 0; i < dependants.length; i++ ) { 3546 dependant = dependants[ i ]; 3547 3548 // Can only compose WeakMap from object-like key. 3549 if ( ! isObjectLike( dependant ) ) { 3550 isUniqueByDependants = false; 3551 break; 3552 } 3553 3554 // Does current segment of cache already have a WeakMap? 3555 if ( caches.has( dependant ) ) { 3556 // Traverse into nested WeakMap. 3557 caches = caches.get( dependant ); 3558 } else { 3559 // Create, set, and traverse into a new one. 3560 map = new WeakMap(); 3561 caches.set( dependant, map ); 3562 caches = map; 3563 } 3564 } 3565 3566 // We use an arbitrary (but consistent) object as key for the last item 3567 // in the WeakMap to serve as our running cache. 3568 if ( ! caches.has( LEAF_KEY ) ) { 3569 cache = createCache(); 3570 cache.isUniqueByDependants = isUniqueByDependants; 3571 caches.set( LEAF_KEY, cache ); 3572 } 3573 3574 return caches.get( LEAF_KEY ); 3575 } 3576 3577 // Assign cache handler by availability of WeakMap 3578 getCache = hasWeakMap ? getWeakMapCache : getRootCache; 3579 3580 /** 3581 * Resets root memoization cache. 3582 */ 3583 function clear() { 3584 rootCache = hasWeakMap ? new WeakMap() : createCache(); 3585 } 3586 3587 // eslint-disable-next-line jsdoc/check-param-names 3588 /** 3589 * The augmented selector call, considering first whether dependants have 3590 * changed before passing it to underlying memoize function. 3591 * 3592 * @param {Object} source Source object for derivation. 3593 * @param {...*} extraArgs Additional arguments to pass to selector. 3594 * 3595 * @return {*} Selector result. 3596 */ 3597 function callSelector( /* source, ...extraArgs */ ) { 3598 var len = arguments.length, 3599 cache, node, i, args, dependants; 3600 3601 // Create copy of arguments (avoid leaking deoptimization). 3602 args = new Array( len ); 3603 for ( i = 0; i < len; i++ ) { 3604 args[ i ] = arguments[ i ]; 3605 } 3606 3607 dependants = getDependants.apply( null, args ); 3608 cache = getCache( dependants ); 3609 3610 // If not guaranteed uniqueness by dependants (primitive type or lack 3611 // of WeakMap support), shallow compare against last dependants and, if 3612 // references have changed, destroy cache to recalculate result. 3613 if ( ! cache.isUniqueByDependants ) { 3614 if ( cache.lastDependants && ! isShallowEqual( dependants, cache.lastDependants, 0 ) ) { 3615 cache.clear(); 3616 } 3617 3618 cache.lastDependants = dependants; 3619 } 3620 3621 node = cache.head; 3622 while ( node ) { 3623 // Check whether node arguments match arguments 3624 if ( ! isShallowEqual( node.args, args, 1 ) ) { 3625 node = node.next; 3626 continue; 3627 } 3628 3629 // At this point we can assume we've found a match 3630 3631 // Surface matched node to head if not already 3632 if ( node !== cache.head ) { 3633 // Adjust siblings to point to each other. 3634 node.prev.next = node.next; 3635 if ( node.next ) { 3636 node.next.prev = node.prev; 3637 } 3638 3639 node.next = cache.head; 3640 node.prev = null; 3641 cache.head.prev = node; 3642 cache.head = node; 3643 } 3644 3645 // Return immediately 3646 return node.val; 3647 } 3648 3649 // No cached value found. Continue to insertion phase: 3650 3651 node = { 3652 // Generate the result from original function 3653 val: selector.apply( null, args ), 3654 }; 3655 3656 // Avoid including the source object in the cache. 3657 args[ 0 ] = null; 3658 node.args = args; 3659 3660 // Don't need to check whether node is already head, since it would 3661 // have been returned above already if it was 3662 3663 // Shift existing head down list 3664 if ( cache.head ) { 3665 cache.head.prev = node; 3666 node.next = cache.head; 3667 } 3668 3669 cache.head = node; 3670 3671 return node.val; 3672 } 3673 3674 callSelector.getDependants = getDependants; 3675 callSelector.clear = clear; 3676 clear(); 3677 3678 return callSelector; 3679 } 3680 3681 // EXTERNAL MODULE: ./node_modules/equivalent-key-map/equivalent-key-map.js 3682 var equivalent_key_map = __webpack_require__(2167); 3683 var equivalent_key_map_default = /*#__PURE__*/__webpack_require__.n(equivalent_key_map); 3684 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/queried-data/selectors.js 3685 /** 3686 * External dependencies 3687 */ 3688 3689 3690 3691 /** 3692 * Internal dependencies 3693 */ 3694 3695 3696 /** 3697 * Cache of state keys to EquivalentKeyMap where the inner map tracks queries 3698 * to their resulting items set. WeakMap allows garbage collection on expired 3699 * state references. 3700 * 3701 * @type {WeakMap<Object,EquivalentKeyMap>} 3702 */ 3703 3704 const queriedItemsCacheByState = new WeakMap(); 3705 /** 3706 * Returns items for a given query, or null if the items are not known. 3707 * 3708 * @param {Object} state State object. 3709 * @param {?Object} query Optional query. 3710 * 3711 * @return {?Array} Query items. 3712 */ 3713 3714 function getQueriedItemsUncached(state, query) { 3715 var _state$queries, _state$queries$contex; 3716 3717 const { 3718 stableKey, 3719 page, 3720 perPage, 3721 include, 3722 fields, 3723 context 3724 } = get_query_parts(query); 3725 let itemIds; 3726 3727 if ((_state$queries = state.queries) !== null && _state$queries !== void 0 && (_state$queries$contex = _state$queries[context]) !== null && _state$queries$contex !== void 0 && _state$queries$contex[stableKey]) { 3728 itemIds = state.queries[context][stableKey]; 3729 } 3730 3731 if (!itemIds) { 3732 return null; 3733 } 3734 3735 const startOffset = perPage === -1 ? 0 : (page - 1) * perPage; 3736 const endOffset = perPage === -1 ? itemIds.length : Math.min(startOffset + perPage, itemIds.length); 3737 const items = []; 3738 3739 for (let i = startOffset; i < endOffset; i++) { 3740 var _state$items$context; 3741 3742 const itemId = itemIds[i]; 3743 3744 if (Array.isArray(include) && !include.includes(itemId)) { 3745 continue; 3746 } // Having a target item ID doesn't guarantee that this object has been queried. 3747 3748 3749 if (!((_state$items$context = state.items[context]) !== null && _state$items$context !== void 0 && _state$items$context.hasOwnProperty(itemId))) { 3750 return null; 3751 } 3752 3753 const item = state.items[context][itemId]; 3754 let filteredItem; 3755 3756 if (Array.isArray(fields)) { 3757 filteredItem = {}; 3758 3759 for (let f = 0; f < fields.length; f++) { 3760 const field = fields[f].split('.'); 3761 const value = (0,external_lodash_namespaceObject.get)(item, field); 3762 (0,external_lodash_namespaceObject.set)(filteredItem, field, value); 3763 } 3764 } else { 3765 var _state$itemIsComplete; 3766 3767 // If expecting a complete item, validate that completeness, or 3768 // otherwise abort. 3769 if (!((_state$itemIsComplete = state.itemIsComplete[context]) !== null && _state$itemIsComplete !== void 0 && _state$itemIsComplete[itemId])) { 3770 return null; 3771 } 3772 3773 filteredItem = item; 3774 } 3775 3776 items.push(filteredItem); 3777 } 3778 3779 return items; 3780 } 3781 /** 3782 * Returns items for a given query, or null if the items are not known. Caches 3783 * result both per state (by reference) and per query (by deep equality). 3784 * The caching approach is intended to be durable to query objects which are 3785 * deeply but not referentially equal, since otherwise: 3786 * 3787 * `getQueriedItems( state, {} ) !== getQueriedItems( state, {} )` 3788 * 3789 * @param {Object} state State object. 3790 * @param {?Object} query Optional query. 3791 * 3792 * @return {?Array} Query items. 3793 */ 3794 3795 3796 const getQueriedItems = rememo(function (state) { 3797 let query = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 3798 let queriedItemsCache = queriedItemsCacheByState.get(state); 3799 3800 if (queriedItemsCache) { 3801 const queriedItems = queriedItemsCache.get(query); 3802 3803 if (queriedItems !== undefined) { 3804 return queriedItems; 3805 } 3806 } else { 3807 queriedItemsCache = new (equivalent_key_map_default())(); 3808 queriedItemsCacheByState.set(state, queriedItemsCache); 3809 } 3810 3811 const items = getQueriedItemsUncached(state, query); 3812 queriedItemsCache.set(query, items); 3813 return items; 3814 }); 3815 3816 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/is-raw-attribute.js 3817 /** 3818 * Checks whether the attribute is a "raw" attribute or not. 3819 * 3820 * @param {Object} entity Entity record. 3821 * @param {string} attribute Attribute name. 3822 * 3823 * @return {boolean} Is the attribute raw 3824 */ 3825 function isRawAttribute(entity, attribute) { 3826 return (entity.rawAttributes || []).includes(attribute); 3827 } 3828 3829 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/selectors.js 3830 /** 3831 * External dependencies 3832 */ 3833 3834 3835 /** 3836 * WordPress dependencies 3837 */ 3838 3839 3840 3841 3842 /** 3843 * Internal dependencies 3844 */ 3845 3846 3847 3848 3849 3850 /** 3851 * Shared reference to an empty object for cases where it is important to avoid 3852 * returning a new object reference on every invocation, as in a connected or 3853 * other pure component which performs `shouldComponentUpdate` check on props. 3854 * This should be used as a last resort, since the normalized data should be 3855 * maintained by the reducer result in state. 3856 */ 3857 3858 const EMPTY_OBJECT = {}; 3859 /** 3860 * Returns true if a request is in progress for embed preview data, or false 3861 * otherwise. 3862 * 3863 * @param {Object} state Data state. 3864 * @param {string} url URL the preview would be for. 3865 * 3866 * @return {boolean} Whether a request is in progress for an embed preview. 3867 */ 3868 3869 const isRequestingEmbedPreview = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, url) => { 3870 return select(STORE_NAME).isResolving('getEmbedPreview', [url]); 3871 }); 3872 /** 3873 * Returns all available authors. 3874 * 3875 * @deprecated since 11.3. Callers should use `select( 'core' ).getUsers({ who: 'authors' })` instead. 3876 * 3877 * @param {Object} state Data state. 3878 * @param {Object|undefined} query Optional object of query parameters to 3879 * include with request. 3880 * @return {Array} Authors list. 3881 */ 3882 3883 function getAuthors(state, query) { 3884 external_wp_deprecated_default()("select( 'core' ).getAuthors()", { 3885 since: '5.9', 3886 alternative: "select( 'core' ).getUsers({ who: 'authors' })" 3887 }); 3888 const path = (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/users/?who=authors&per_page=100', query); 3889 return getUserQueryResults(state, path); 3890 } 3891 /** 3892 * Returns the current user. 3893 * 3894 * @param {Object} state Data state. 3895 * 3896 * @return {Object} Current user object. 3897 */ 3898 3899 function getCurrentUser(state) { 3900 return state.currentUser; 3901 } 3902 /** 3903 * Returns all the users returned by a query ID. 3904 * 3905 * @param {Object} state Data state. 3906 * @param {string} queryID Query ID. 3907 * 3908 * @return {Array} Users list. 3909 */ 3910 3911 const getUserQueryResults = rememo((state, queryID) => { 3912 const queryResults = state.users.queries[queryID]; 3913 return (0,external_lodash_namespaceObject.map)(queryResults, id => state.users.byId[id]); 3914 }, (state, queryID) => [state.users.queries[queryID], state.users.byId]); 3915 /** 3916 * Returns the loaded entities for the given kind. 3917 * 3918 * @deprecated since WordPress 6.0. Use getEntitiesConfig instead 3919 * @param {Object} state Data state. 3920 * @param {string} kind Entity kind. 3921 * 3922 * @return {Array<Object>} Array of entities with config matching kind. 3923 */ 3924 3925 function getEntitiesByKind(state, kind) { 3926 external_wp_deprecated_default()("wp.data.select( 'core' ).getEntitiesByKind()", { 3927 since: '6.0', 3928 alternative: "wp.data.select( 'core' ).getEntitiesConfig()" 3929 }); 3930 return getEntitiesConfig(state, kind); 3931 } 3932 /** 3933 * Returns the loaded entities for the given kind. 3934 * 3935 * @param {Object} state Data state. 3936 * @param {string} kind Entity kind. 3937 * 3938 * @return {Array<Object>} Array of entities with config matching kind. 3939 */ 3940 3941 function getEntitiesConfig(state, kind) { 3942 return (0,external_lodash_namespaceObject.filter)(state.entities.config, { 3943 kind 3944 }); 3945 } 3946 /** 3947 * Returns the entity config given its kind and name. 3948 * 3949 * @deprecated since WordPress 6.0. Use getEntityConfig instead 3950 * @param {Object} state Data state. 3951 * @param {string} kind Entity kind. 3952 * @param {string} name Entity name. 3953 * 3954 * @return {Object} Entity config 3955 */ 3956 3957 function getEntity(state, kind, name) { 3958 external_wp_deprecated_default()("wp.data.select( 'core' ).getEntity()", { 3959 since: '6.0', 3960 alternative: "wp.data.select( 'core' ).getEntityConfig()" 3961 }); 3962 return getEntityConfig(state, kind, name); 3963 } 3964 /** 3965 * Returns the entity config given its kind and name. 3966 * 3967 * @param {Object} state Data state. 3968 * @param {string} kind Entity kind. 3969 * @param {string} name Entity name. 3970 * 3971 * @return {Object} Entity config 3972 */ 3973 3974 function getEntityConfig(state, kind, name) { 3975 return (0,external_lodash_namespaceObject.find)(state.entities.config, { 3976 kind, 3977 name 3978 }); 3979 } 3980 /** 3981 * Returns the Entity's record object by key. Returns `null` if the value is not 3982 * yet received, undefined if the value entity is known to not exist, or the 3983 * entity object if it exists and is received. 3984 * 3985 * @param {Object} state State tree 3986 * @param {string} kind Entity kind. 3987 * @param {string} name Entity name. 3988 * @param {number} key Record's key 3989 * @param {?Object} query Optional query. 3990 * 3991 * @return {Object|undefined} Record. 3992 */ 3993 3994 const getEntityRecord = rememo((state, kind, name, key, query) => { 3995 var _query$context, _queriedState$items$c; 3996 3997 const queriedState = (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData']); 3998 3999 if (!queriedState) { 4000 return undefined; 4001 } 4002 4003 const context = (_query$context = query === null || query === void 0 ? void 0 : query.context) !== null && _query$context !== void 0 ? _query$context : 'default'; 4004 4005 if (query === undefined) { 4006 var _queriedState$itemIsC; 4007 4008 // If expecting a complete item, validate that completeness. 4009 if (!((_queriedState$itemIsC = queriedState.itemIsComplete[context]) !== null && _queriedState$itemIsC !== void 0 && _queriedState$itemIsC[key])) { 4010 return undefined; 4011 } 4012 4013 return queriedState.items[context][key]; 4014 } 4015 4016 const item = (_queriedState$items$c = queriedState.items[context]) === null || _queriedState$items$c === void 0 ? void 0 : _queriedState$items$c[key]; 4017 4018 if (item && query._fields) { 4019 var _getNormalizedCommaSe; 4020 4021 const filteredItem = {}; 4022 const fields = (_getNormalizedCommaSe = get_normalized_comma_separable(query._fields)) !== null && _getNormalizedCommaSe !== void 0 ? _getNormalizedCommaSe : []; 4023 4024 for (let f = 0; f < fields.length; f++) { 4025 const field = fields[f].split('.'); 4026 const value = (0,external_lodash_namespaceObject.get)(item, field); 4027 (0,external_lodash_namespaceObject.set)(filteredItem, field, value); 4028 } 4029 4030 return filteredItem; 4031 } 4032 4033 return item; 4034 }, (state, kind, name, recordId, query) => { 4035 var _query$context2; 4036 4037 const context = (_query$context2 = query === null || query === void 0 ? void 0 : query.context) !== null && _query$context2 !== void 0 ? _query$context2 : 'default'; 4038 return [(0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData', 'items', context, recordId]), (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData', 'itemIsComplete', context, recordId])]; 4039 }); 4040 /** 4041 * 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. 4042 * 4043 * @param {Object} state State tree 4044 * @param {string} kind Entity kind. 4045 * @param {string} name Entity name. 4046 * @param {number} key Record's key 4047 * 4048 * @return {Object|null} Record. 4049 */ 4050 4051 function __experimentalGetEntityRecordNoResolver(state, kind, name, key) { 4052 return getEntityRecord(state, kind, name, key); 4053 } 4054 /** 4055 * Returns the entity's record object by key, 4056 * with its attributes mapped to their raw values. 4057 * 4058 * @param {Object} state State tree. 4059 * @param {string} kind Entity kind. 4060 * @param {string} name Entity name. 4061 * @param {number} key Record's key. 4062 * 4063 * @return {Object?} Object with the entity's raw attributes. 4064 */ 4065 4066 const getRawEntityRecord = rememo((state, kind, name, key) => { 4067 const record = getEntityRecord(state, kind, name, key); 4068 return record && Object.keys(record).reduce((accumulator, _key) => { 4069 if (isRawAttribute(getEntityConfig(state, kind, name), _key)) { 4070 // Because edits are the "raw" attribute values, 4071 // we return those from record selectors to make rendering, 4072 // comparisons, and joins with edits easier. 4073 accumulator[_key] = (0,external_lodash_namespaceObject.get)(record[_key], 'raw', record[_key]); 4074 } else { 4075 accumulator[_key] = record[_key]; 4076 } 4077 4078 return accumulator; 4079 }, {}); 4080 }, (state, kind, name, recordId, query) => { 4081 var _query$context3; 4082 4083 const context = (_query$context3 = query === null || query === void 0 ? void 0 : query.context) !== null && _query$context3 !== void 0 ? _query$context3 : 'default'; 4084 return [state.entities.config, (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData', 'items', context, recordId]), (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData', 'itemIsComplete', context, recordId])]; 4085 }); 4086 /** 4087 * Returns true if records have been received for the given set of parameters, 4088 * or false otherwise. 4089 * 4090 * @param {Object} state State tree 4091 * @param {string} kind Entity kind. 4092 * @param {string} name Entity name. 4093 * @param {?Object} query Optional terms query. 4094 * 4095 * @return {boolean} Whether entity records have been received. 4096 */ 4097 4098 function hasEntityRecords(state, kind, name, query) { 4099 return Array.isArray(getEntityRecords(state, kind, name, query)); 4100 } 4101 /** 4102 * Returns the Entity's records. 4103 * 4104 * @param {Object} state State tree 4105 * @param {string} kind Entity kind. 4106 * @param {string} name Entity name. 4107 * @param {?Object} query Optional terms query. 4108 * 4109 * @return {?Array} Records. 4110 */ 4111 4112 function getEntityRecords(state, kind, name, query) { 4113 // Queried data state is prepopulated for all known entities. If this is not 4114 // assigned for the given parameters, then it is known to not exist. 4115 const queriedState = (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData']); 4116 4117 if (!queriedState) { 4118 return null; 4119 } 4120 4121 return getQueriedItems(queriedState, query); 4122 } 4123 /** 4124 * Returns the list of dirty entity records. 4125 * 4126 * @param {Object} state State tree. 4127 * 4128 * @return {[{ title: string, key: string, name: string, kind: string }]} The list of updated records 4129 */ 4130 4131 const __experimentalGetDirtyEntityRecords = rememo(state => { 4132 const { 4133 entities: { 4134 records 4135 } 4136 } = state; 4137 const dirtyRecords = []; 4138 Object.keys(records).forEach(kind => { 4139 Object.keys(records[kind]).forEach(name => { 4140 const primaryKeys = Object.keys(records[kind][name].edits).filter(primaryKey => // The entity record must exist (not be deleted), 4141 // and it must have edits. 4142 getEntityRecord(state, kind, name, primaryKey) && hasEditsForEntityRecord(state, kind, name, primaryKey)); 4143 4144 if (primaryKeys.length) { 4145 const entityConfig = getEntityConfig(state, kind, name); 4146 primaryKeys.forEach(primaryKey => { 4147 var _entityConfig$getTitl; 4148 4149 const entityRecord = getEditedEntityRecord(state, kind, name, primaryKey); 4150 dirtyRecords.push({ 4151 // We avoid using primaryKey because it's transformed into a string 4152 // when it's used as an object key. 4153 key: entityRecord[entityConfig.key || DEFAULT_ENTITY_KEY], 4154 title: (entityConfig === null || entityConfig === void 0 ? void 0 : (_entityConfig$getTitl = entityConfig.getTitle) === null || _entityConfig$getTitl === void 0 ? void 0 : _entityConfig$getTitl.call(entityConfig, entityRecord)) || '', 4155 name, 4156 kind 4157 }); 4158 }); 4159 } 4160 }); 4161 }); 4162 return dirtyRecords; 4163 }, state => [state.entities.records]); 4164 /** 4165 * Returns the list of entities currently being saved. 4166 * 4167 * @param {Object} state State tree. 4168 * 4169 * @return {[{ title: string, key: string, name: string, kind: string }]} The list of records being saved. 4170 */ 4171 4172 const __experimentalGetEntitiesBeingSaved = rememo(state => { 4173 const { 4174 entities: { 4175 records 4176 } 4177 } = state; 4178 const recordsBeingSaved = []; 4179 Object.keys(records).forEach(kind => { 4180 Object.keys(records[kind]).forEach(name => { 4181 const primaryKeys = Object.keys(records[kind][name].saving).filter(primaryKey => isSavingEntityRecord(state, kind, name, primaryKey)); 4182 4183 if (primaryKeys.length) { 4184 const entityConfig = getEntityConfig(state, kind, name); 4185 primaryKeys.forEach(primaryKey => { 4186 var _entityConfig$getTitl2; 4187 4188 const entityRecord = getEditedEntityRecord(state, kind, name, primaryKey); 4189 recordsBeingSaved.push({ 4190 // We avoid using primaryKey because it's transformed into a string 4191 // when it's used as an object key. 4192 key: entityRecord[entityConfig.key || DEFAULT_ENTITY_KEY], 4193 title: (entityConfig === null || entityConfig === void 0 ? void 0 : (_entityConfig$getTitl2 = entityConfig.getTitle) === null || _entityConfig$getTitl2 === void 0 ? void 0 : _entityConfig$getTitl2.call(entityConfig, entityRecord)) || '', 4194 name, 4195 kind 4196 }); 4197 }); 4198 } 4199 }); 4200 }); 4201 return recordsBeingSaved; 4202 }, state => [state.entities.records]); 4203 /** 4204 * Returns the specified entity record's edits. 4205 * 4206 * @param {Object} state State tree. 4207 * @param {string} kind Entity kind. 4208 * @param {string} name Entity name. 4209 * @param {number} recordId Record ID. 4210 * 4211 * @return {Object?} The entity record's edits. 4212 */ 4213 4214 function getEntityRecordEdits(state, kind, name, recordId) { 4215 return (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'edits', recordId]); 4216 } 4217 /** 4218 * Returns the specified entity record's non transient edits. 4219 * 4220 * Transient edits don't create an undo level, and 4221 * are not considered for change detection. 4222 * They are defined in the entity's config. 4223 * 4224 * @param {Object} state State tree. 4225 * @param {string} kind Entity kind. 4226 * @param {string} name Entity name. 4227 * @param {number} recordId Record ID. 4228 * 4229 * @return {Object?} The entity record's non transient edits. 4230 */ 4231 4232 const getEntityRecordNonTransientEdits = rememo((state, kind, name, recordId) => { 4233 const { 4234 transientEdits 4235 } = getEntityConfig(state, kind, name) || {}; 4236 const edits = getEntityRecordEdits(state, kind, name, recordId) || {}; 4237 4238 if (!transientEdits) { 4239 return edits; 4240 } 4241 4242 return Object.keys(edits).reduce((acc, key) => { 4243 if (!transientEdits[key]) { 4244 acc[key] = edits[key]; 4245 } 4246 4247 return acc; 4248 }, {}); 4249 }, (state, kind, name, recordId) => [state.entities.config, (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'edits', recordId])]); 4250 /** 4251 * Returns true if the specified entity record has edits, 4252 * and false otherwise. 4253 * 4254 * @param {Object} state State tree. 4255 * @param {string} kind Entity kind. 4256 * @param {string} name Entity name. 4257 * @param {number|string} recordId Record ID. 4258 * 4259 * @return {boolean} Whether the entity record has edits or not. 4260 */ 4261 4262 function hasEditsForEntityRecord(state, kind, name, recordId) { 4263 return isSavingEntityRecord(state, kind, name, recordId) || Object.keys(getEntityRecordNonTransientEdits(state, kind, name, recordId)).length > 0; 4264 } 4265 /** 4266 * Returns the specified entity record, merged with its edits. 4267 * 4268 * @param {Object} state State tree. 4269 * @param {string} kind Entity kind. 4270 * @param {string} name Entity name. 4271 * @param {number|string} recordId Record ID. 4272 * 4273 * @return {Object?} The entity record, merged with its edits. 4274 */ 4275 4276 const getEditedEntityRecord = rememo((state, kind, name, recordId) => ({ ...getRawEntityRecord(state, kind, name, recordId), 4277 ...getEntityRecordEdits(state, kind, name, recordId) 4278 }), (state, kind, name, recordId, query) => { 4279 var _query$context4; 4280 4281 const context = (_query$context4 = query === null || query === void 0 ? void 0 : query.context) !== null && _query$context4 !== void 0 ? _query$context4 : 'default'; 4282 return [state.entities.config, (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData', 'items', context, recordId]), (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'queriedData', 'itemIsComplete', context, recordId]), (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'edits', recordId])]; 4283 }); 4284 /** 4285 * Returns true if the specified entity record is autosaving, and false otherwise. 4286 * 4287 * @param {Object} state State tree. 4288 * @param {string} kind Entity kind. 4289 * @param {string} name Entity name. 4290 * @param {number} recordId Record ID. 4291 * 4292 * @return {boolean} Whether the entity record is autosaving or not. 4293 */ 4294 4295 function isAutosavingEntityRecord(state, kind, name, recordId) { 4296 const { 4297 pending, 4298 isAutosave 4299 } = (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'saving', recordId], {}); 4300 return Boolean(pending && isAutosave); 4301 } 4302 /** 4303 * Returns true if the specified entity record is saving, and false otherwise. 4304 * 4305 * @param {Object} state State tree. 4306 * @param {string} kind Entity kind. 4307 * @param {string} name Entity name. 4308 * @param {number|string} recordId Record ID. 4309 * 4310 * @return {boolean} Whether the entity record is saving or not. 4311 */ 4312 4313 function isSavingEntityRecord(state, kind, name, recordId) { 4314 return (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'saving', recordId, 'pending'], false); 4315 } 4316 /** 4317 * Returns true if the specified entity record is deleting, and false otherwise. 4318 * 4319 * @param {Object} state State tree. 4320 * @param {string} kind Entity kind. 4321 * @param {string} name Entity name. 4322 * @param {number} recordId Record ID. 4323 * 4324 * @return {boolean} Whether the entity record is deleting or not. 4325 */ 4326 4327 function isDeletingEntityRecord(state, kind, name, recordId) { 4328 return (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'deleting', recordId, 'pending'], false); 4329 } 4330 /** 4331 * Returns the specified entity record's last save error. 4332 * 4333 * @param {Object} state State tree. 4334 * @param {string} kind Entity kind. 4335 * @param {string} name Entity name. 4336 * @param {number} recordId Record ID. 4337 * 4338 * @return {Object?} The entity record's save error. 4339 */ 4340 4341 function getLastEntitySaveError(state, kind, name, recordId) { 4342 return (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'saving', recordId, 'error']); 4343 } 4344 /** 4345 * Returns the specified entity record's last delete error. 4346 * 4347 * @param {Object} state State tree. 4348 * @param {string} kind Entity kind. 4349 * @param {string} name Entity name. 4350 * @param {number} recordId Record ID. 4351 * 4352 * @return {Object?} The entity record's save error. 4353 */ 4354 4355 function getLastEntityDeleteError(state, kind, name, recordId) { 4356 return (0,external_lodash_namespaceObject.get)(state.entities.records, [kind, name, 'deleting', recordId, 'error']); 4357 } 4358 /** 4359 * Returns the current undo offset for the 4360 * entity records edits history. The offset 4361 * represents how many items from the end 4362 * of the history stack we are at. 0 is the 4363 * last edit, -1 is the second last, and so on. 4364 * 4365 * @param {Object} state State tree. 4366 * 4367 * @return {number} The current undo offset. 4368 */ 4369 4370 function getCurrentUndoOffset(state) { 4371 return state.undo.offset; 4372 } 4373 /** 4374 * Returns the previous edit from the current undo offset 4375 * for the entity records edits history, if any. 4376 * 4377 * @param {Object} state State tree. 4378 * 4379 * @return {Object?} The edit. 4380 */ 4381 4382 4383 function getUndoEdit(state) { 4384 return state.undo[state.undo.length - 2 + getCurrentUndoOffset(state)]; 4385 } 4386 /** 4387 * Returns the next edit from the current undo offset 4388 * for the entity records edits history, if any. 4389 * 4390 * @param {Object} state State tree. 4391 * 4392 * @return {Object?} The edit. 4393 */ 4394 4395 function getRedoEdit(state) { 4396 return state.undo[state.undo.length + getCurrentUndoOffset(state)]; 4397 } 4398 /** 4399 * Returns true if there is a previous edit from the current undo offset 4400 * for the entity records edits history, and false otherwise. 4401 * 4402 * @param {Object} state State tree. 4403 * 4404 * @return {boolean} Whether there is a previous edit or not. 4405 */ 4406 4407 function hasUndo(state) { 4408 return Boolean(getUndoEdit(state)); 4409 } 4410 /** 4411 * Returns true if there is a next edit from the current undo offset 4412 * for the entity records edits history, and false otherwise. 4413 * 4414 * @param {Object} state State tree. 4415 * 4416 * @return {boolean} Whether there is a next edit or not. 4417 */ 4418 4419 function hasRedo(state) { 4420 return Boolean(getRedoEdit(state)); 4421 } 4422 /** 4423 * Return the current theme. 4424 * 4425 * @param {Object} state Data state. 4426 * 4427 * @return {Object} The current theme. 4428 */ 4429 4430 function getCurrentTheme(state) { 4431 return getEntityRecord(state, 'root', 'theme', state.currentTheme); 4432 } 4433 /** 4434 * Return the ID of the current global styles object. 4435 * 4436 * @param {Object} state Data state. 4437 * 4438 * @return {string} The current global styles ID. 4439 */ 4440 4441 function __experimentalGetCurrentGlobalStylesId(state) { 4442 return state.currentGlobalStylesId; 4443 } 4444 /** 4445 * Return theme supports data in the index. 4446 * 4447 * @param {Object} state Data state. 4448 * 4449 * @return {*} Index data. 4450 */ 4451 4452 function getThemeSupports(state) { 4453 var _getCurrentTheme$them, _getCurrentTheme; 4454 4455 return (_getCurrentTheme$them = (_getCurrentTheme = getCurrentTheme(state)) === null || _getCurrentTheme === void 0 ? void 0 : _getCurrentTheme.theme_supports) !== null && _getCurrentTheme$them !== void 0 ? _getCurrentTheme$them : EMPTY_OBJECT; 4456 } 4457 /** 4458 * Returns the embed preview for the given URL. 4459 * 4460 * @param {Object} state Data state. 4461 * @param {string} url Embedded URL. 4462 * 4463 * @return {*} Undefined if the preview has not been fetched, otherwise, the preview fetched from the embed preview API. 4464 */ 4465 4466 function getEmbedPreview(state, url) { 4467 return state.embedPreviews[url]; 4468 } 4469 /** 4470 * Determines if the returned preview is an oEmbed link fallback. 4471 * 4472 * WordPress can be configured to return a simple link to a URL if it is not embeddable. 4473 * We need to be able to determine if a URL is embeddable or not, based on what we 4474 * get back from the oEmbed preview API. 4475 * 4476 * @param {Object} state Data state. 4477 * @param {string} url Embedded URL. 4478 * 4479 * @return {boolean} Is the preview for the URL an oEmbed link fallback. 4480 */ 4481 4482 function isPreviewEmbedFallback(state, url) { 4483 const preview = state.embedPreviews[url]; 4484 const oEmbedLinkCheck = '<a href="' + url + '">' + url + '</a>'; 4485 4486 if (!preview) { 4487 return false; 4488 } 4489 4490 return preview.html === oEmbedLinkCheck; 4491 } 4492 /** 4493 * Returns whether the current user can perform the given action on the given 4494 * REST resource. 4495 * 4496 * Calling this may trigger an OPTIONS request to the REST API via the 4497 * `canUser()` resolver. 4498 * 4499 * https://developer.wordpress.org/rest-api/reference/ 4500 * 4501 * @param {Object} state Data state. 4502 * @param {string} action Action to check. One of: 'create', 'read', 'update', 'delete'. 4503 * @param {string} resource REST resource to check, e.g. 'media' or 'posts'. 4504 * @param {string=} id Optional ID of the rest resource to check. 4505 * 4506 * @return {boolean|undefined} Whether or not the user can perform the action, 4507 * or `undefined` if the OPTIONS request is still being made. 4508 */ 4509 4510 function canUser(state, action, resource, id) { 4511 const key = (0,external_lodash_namespaceObject.compact)([action, resource, id]).join('/'); 4512 return (0,external_lodash_namespaceObject.get)(state, ['userPermissions', key]); 4513 } 4514 /** 4515 * Returns whether the current user can edit the given entity. 4516 * 4517 * Calling this may trigger an OPTIONS request to the REST API via the 4518 * `canUser()` resolver. 4519 * 4520 * https://developer.wordpress.org/rest-api/reference/ 4521 * 4522 * @param {Object} state Data state. 4523 * @param {string} kind Entity kind. 4524 * @param {string} name Entity name. 4525 * @param {string} recordId Record's id. 4526 * @return {boolean|undefined} Whether or not the user can edit, 4527 * or `undefined` if the OPTIONS request is still being made. 4528 */ 4529 4530 function canUserEditEntityRecord(state, kind, name, recordId) { 4531 const entityConfig = getEntityConfig(state, kind, name); 4532 4533 if (!entityConfig) { 4534 return false; 4535 } 4536 4537 const resource = entityConfig.__unstable_rest_base; 4538 return canUser(state, 'update', resource, recordId); 4539 } 4540 /** 4541 * Returns the latest autosaves for the post. 4542 * 4543 * May return multiple autosaves since the backend stores one autosave per 4544 * author for each post. 4545 * 4546 * @param {Object} state State tree. 4547 * @param {string} postType The type of the parent post. 4548 * @param {number} postId The id of the parent post. 4549 * 4550 * @return {?Array} An array of autosaves for the post, or undefined if there is none. 4551 */ 4552 4553 function getAutosaves(state, postType, postId) { 4554 return state.autosaves[postId]; 4555 } 4556 /** 4557 * Returns the autosave for the post and author. 4558 * 4559 * @param {Object} state State tree. 4560 * @param {string} postType The type of the parent post. 4561 * @param {number} postId The id of the parent post. 4562 * @param {number} authorId The id of the author. 4563 * 4564 * @return {?Object} The autosave for the post and author. 4565 */ 4566 4567 function getAutosave(state, postType, postId, authorId) { 4568 if (authorId === undefined) { 4569 return; 4570 } 4571 4572 const autosaves = state.autosaves[postId]; 4573 return (0,external_lodash_namespaceObject.find)(autosaves, { 4574 author: authorId 4575 }); 4576 } 4577 /** 4578 * Returns true if the REST request for autosaves has completed. 4579 * 4580 * @param {Object} state State tree. 4581 * @param {string} postType The type of the parent post. 4582 * @param {number} postId The id of the parent post. 4583 * 4584 * @return {boolean} True if the REST request was completed. False otherwise. 4585 */ 4586 4587 const hasFetchedAutosaves = (0,external_wp_data_namespaceObject.createRegistrySelector)(select => (state, postType, postId) => { 4588 return select(STORE_NAME).hasFinishedResolution('getAutosaves', [postType, postId]); 4589 }); 4590 /** 4591 * Returns a new reference when edited values have changed. This is useful in 4592 * inferring where an edit has been made between states by comparison of the 4593 * return values using strict equality. 4594 * 4595 * @example 4596 * 4597 * ``` 4598 * const hasEditOccurred = ( 4599 * getReferenceByDistinctEdits( beforeState ) !== 4600 * getReferenceByDistinctEdits( afterState ) 4601 * ); 4602 * ``` 4603 * 4604 * @param {Object} state Editor state. 4605 * 4606 * @return {*} A value whose reference will change only when an edit occurs. 4607 */ 4608 4609 const getReferenceByDistinctEdits = rememo(() => [], state => [state.undo.length, state.undo.offset, state.undo.flattenedUndo]); 4610 /** 4611 * Retrieve the frontend template used for a given link. 4612 * 4613 * @param {Object} state Editor state. 4614 * @param {string} link Link. 4615 * 4616 * @return {Object?} The template record. 4617 */ 4618 4619 function __experimentalGetTemplateForLink(state, link) { 4620 const records = getEntityRecords(state, 'postType', 'wp_template', { 4621 'find-template': link 4622 }); 4623 const template = records !== null && records !== void 0 && records.length ? records[0] : null; 4624 4625 if (template) { 4626 return getEditedEntityRecord(state, 'postType', 'wp_template', template.id); 4627 } 4628 4629 return template; 4630 } 4631 /** 4632 * Retrieve the current theme's base global styles 4633 * 4634 * @param {Object} state Editor state. 4635 * 4636 * @return {Object|null} The Global Styles object. 4637 */ 4638 4639 function __experimentalGetCurrentThemeBaseGlobalStyles(state) { 4640 const currentTheme = getCurrentTheme(state); 4641 4642 if (!currentTheme) { 4643 return null; 4644 } 4645 4646 return state.themeBaseGlobalStyles[currentTheme.stylesheet]; 4647 } 4648 /** 4649 * Return the ID of the current global styles object. 4650 * 4651 * @param {Object} state Data state. 4652 * 4653 * @return {string|null} The current global styles ID. 4654 */ 4655 4656 function __experimentalGetCurrentThemeGlobalStylesVariations(state) { 4657 const currentTheme = getCurrentTheme(state); 4658 4659 if (!currentTheme) { 4660 return null; 4661 } 4662 4663 return state.themeGlobalStyleVariations[currentTheme.stylesheet]; 4664 } 4665 /** 4666 * Retrieve the list of registered block patterns. 4667 * 4668 * @param {Object} state Data state. 4669 * 4670 * @return {Array} Block pattern list. 4671 */ 4672 4673 function getBlockPatterns(state) { 4674 return state.blockPatterns; 4675 } 4676 /** 4677 * Retrieve the list of registered block pattern categories. 4678 * 4679 * @param {Object} state Data state. 4680 * 4681 * @return {Array} Block pattern category list. 4682 */ 4683 4684 function getBlockPatternCategories(state) { 4685 return state.blockPatternCategories; 4686 } 4687 4688 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/utils/forward-resolver.js 4689 /** 4690 * Higher-order function which forward the resolution to another resolver with the same arguments. 4691 * 4692 * @param {string} resolverName forwarded resolver. 4693 * 4694 * @return {Function} Enhanced resolver. 4695 */ 4696 const forwardResolver = resolverName => function () { 4697 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 4698 args[_key] = arguments[_key]; 4699 } 4700 4701 return async _ref => { 4702 let { 4703 resolveSelect 4704 } = _ref; 4705 await resolveSelect[resolverName](...args); 4706 }; 4707 }; 4708 4709 /* harmony default export */ var forward_resolver = (forwardResolver); 4710 4711 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/resolvers.js 4712 /** 4713 * External dependencies 4714 */ 4715 4716 /** 4717 * WordPress dependencies 4718 */ 4719 4720 4721 4722 /** 4723 * Internal dependencies 4724 */ 4725 4726 4727 4728 4729 /** 4730 * Requests authors from the REST API. 4731 * 4732 * @param {Object|undefined} query Optional object of query parameters to 4733 * include with request. 4734 */ 4735 4736 const resolvers_getAuthors = query => async _ref => { 4737 let { 4738 dispatch 4739 } = _ref; 4740 const path = (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/users/?who=authors&per_page=100', query); 4741 const users = await external_wp_apiFetch_default()({ 4742 path 4743 }); 4744 dispatch.receiveUserQuery(path, users); 4745 }; 4746 /** 4747 * Requests the current user from the REST API. 4748 */ 4749 4750 const resolvers_getCurrentUser = () => async _ref2 => { 4751 let { 4752 dispatch 4753 } = _ref2; 4754 const currentUser = await external_wp_apiFetch_default()({ 4755 path: '/wp/v2/users/me' 4756 }); 4757 dispatch.receiveCurrentUser(currentUser); 4758 }; 4759 /** 4760 * Requests an entity's record from the REST API. 4761 * 4762 * @param {string} kind Entity kind. 4763 * @param {string} name Entity name. 4764 * @param {number|string} key Record's key 4765 * @param {Object|undefined} query Optional object of query parameters to 4766 * include with request. 4767 */ 4768 4769 const resolvers_getEntityRecord = function (kind, name) { 4770 let key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; 4771 let query = arguments.length > 3 ? arguments[3] : undefined; 4772 return async _ref3 => { 4773 let { 4774 select, 4775 dispatch 4776 } = _ref3; 4777 const configs = await dispatch(getOrLoadEntitiesConfig(kind)); 4778 const entityConfig = (0,external_lodash_namespaceObject.find)(configs, { 4779 kind, 4780 name 4781 }); 4782 4783 if (!entityConfig || entityConfig !== null && entityConfig !== void 0 && entityConfig.__experimentalNoFetch) { 4784 return; 4785 } 4786 4787 const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name, key], { 4788 exclusive: false 4789 }); 4790 4791 try { 4792 if (query !== undefined && query._fields) { 4793 // If requesting specific fields, items and query association to said 4794 // records are stored by ID reference. Thus, fields must always include 4795 // the ID. 4796 query = { ...query, 4797 _fields: (0,external_lodash_namespaceObject.uniq)([...(get_normalized_comma_separable(query._fields) || []), entityConfig.key || DEFAULT_ENTITY_KEY]).join() 4798 }; 4799 } // Disable reason: While true that an early return could leave `path` 4800 // unused, it's important that path is derived using the query prior to 4801 // additional query modifications in the condition below, since those 4802 // modifications are relevant to how the data is tracked in state, and not 4803 // for how the request is made to the REST API. 4804 // eslint-disable-next-line @wordpress/no-unused-vars-before-return 4805 4806 4807 const path = (0,external_wp_url_namespaceObject.addQueryArgs)(entityConfig.baseURL + (key ? '/' + key : ''), { ...entityConfig.baseURLParams, 4808 ...query 4809 }); 4810 4811 if (query !== undefined) { 4812 query = { ...query, 4813 include: [key] 4814 }; // The resolution cache won't consider query as reusable based on the 4815 // fields, so it's tested here, prior to initiating the REST request, 4816 // and without causing `getEntityRecords` resolution to occur. 4817 4818 const hasRecords = select.hasEntityRecords(kind, name, query); 4819 4820 if (hasRecords) { 4821 return; 4822 } 4823 } 4824 4825 const record = await external_wp_apiFetch_default()({ 4826 path 4827 }); 4828 dispatch.receiveEntityRecords(kind, name, record, query); 4829 } finally { 4830 dispatch.__unstableReleaseStoreLock(lock); 4831 } 4832 }; 4833 }; 4834 /** 4835 * Requests an entity's record from the REST API. 4836 */ 4837 4838 const resolvers_getRawEntityRecord = forward_resolver('getEntityRecord'); 4839 /** 4840 * Requests an entity's record from the REST API. 4841 */ 4842 4843 const resolvers_getEditedEntityRecord = forward_resolver('getEntityRecord'); 4844 /** 4845 * Requests the entity's records from the REST API. 4846 * 4847 * @param {string} kind Entity kind. 4848 * @param {string} name Entity name. 4849 * @param {Object?} query Query Object. 4850 */ 4851 4852 const resolvers_getEntityRecords = function (kind, name) { 4853 let query = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 4854 return async _ref4 => { 4855 let { 4856 dispatch 4857 } = _ref4; 4858 const configs = await dispatch(getOrLoadEntitiesConfig(kind)); 4859 const entityConfig = (0,external_lodash_namespaceObject.find)(configs, { 4860 kind, 4861 name 4862 }); 4863 4864 if (!entityConfig || entityConfig !== null && entityConfig !== void 0 && entityConfig.__experimentalNoFetch) { 4865 return; 4866 } 4867 4868 const lock = await dispatch.__unstableAcquireStoreLock(STORE_NAME, ['entities', 'records', kind, name], { 4869 exclusive: false 4870 }); 4871 4872 try { 4873 var _query; 4874 4875 if (query._fields) { 4876 // If requesting specific fields, items and query association to said 4877 // records are stored by ID reference. Thus, fields must always include 4878 // the ID. 4879 query = { ...query, 4880 _fields: (0,external_lodash_namespaceObject.uniq)([...(get_normalized_comma_separable(query._fields) || []), entityConfig.key || DEFAULT_ENTITY_KEY]).join() 4881 }; 4882 } 4883 4884 const path = (0,external_wp_url_namespaceObject.addQueryArgs)(entityConfig.baseURL, { ...entityConfig.baseURLParams, 4885 ...query 4886 }); 4887 let records = Object.values(await external_wp_apiFetch_default()({ 4888 path 4889 })); // If we request fields but the result doesn't contain the fields, 4890 // explicitely set these fields as "undefined" 4891 // that way we consider the query "fullfilled". 4892 4893 if (query._fields) { 4894 records = records.map(record => { 4895 query._fields.split(',').forEach(field => { 4896 if (!record.hasOwnProperty(field)) { 4897 record[field] = undefined; 4898 } 4899 }); 4900 4901 return record; 4902 }); 4903 } 4904 4905 dispatch.receiveEntityRecords(kind, name, records, query); // When requesting all fields, the list of results can be used to 4906 // resolve the `getEntityRecord` selector in addition to `getEntityRecords`. 4907 // See https://github.com/WordPress/gutenberg/pull/26575 4908 4909 if (!((_query = query) !== null && _query !== void 0 && _query._fields) && !query.context) { 4910 const key = entityConfig.key || DEFAULT_ENTITY_KEY; 4911 const resolutionsArgs = records.filter(record => record[key]).map(record => [kind, name, record[key]]); 4912 dispatch({ 4913 type: 'START_RESOLUTIONS', 4914 selectorName: 'getEntityRecord', 4915 args: resolutionsArgs 4916 }); 4917 dispatch({ 4918 type: 'FINISH_RESOLUTIONS', 4919 selectorName: 'getEntityRecord', 4920 args: resolutionsArgs 4921 }); 4922 } 4923 } finally { 4924 dispatch.__unstableReleaseStoreLock(lock); 4925 } 4926 }; 4927 }; 4928 4929 resolvers_getEntityRecords.shouldInvalidate = (action, kind, name) => { 4930 return (action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS') && action.invalidateCache && kind === action.kind && name === action.name; 4931 }; 4932 /** 4933 * Requests the current theme. 4934 */ 4935 4936 4937 const resolvers_getCurrentTheme = () => async _ref5 => { 4938 let { 4939 dispatch, 4940 resolveSelect 4941 } = _ref5; 4942 const activeThemes = await resolveSelect.getEntityRecords('root', 'theme', { 4943 status: 'active' 4944 }); 4945 dispatch.receiveCurrentTheme(activeThemes[0]); 4946 }; 4947 /** 4948 * Requests theme supports data from the index. 4949 */ 4950 4951 const resolvers_getThemeSupports = forward_resolver('getCurrentTheme'); 4952 /** 4953 * Requests a preview from the from the Embed API. 4954 * 4955 * @param {string} url URL to get the preview for. 4956 */ 4957 4958 const resolvers_getEmbedPreview = url => async _ref6 => { 4959 let { 4960 dispatch 4961 } = _ref6; 4962 4963 try { 4964 const embedProxyResponse = await external_wp_apiFetch_default()({ 4965 path: (0,external_wp_url_namespaceObject.addQueryArgs)('/oembed/1.0/proxy', { 4966 url 4967 }) 4968 }); 4969 dispatch.receiveEmbedPreview(url, embedProxyResponse); 4970 } catch (error) { 4971 // Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here. 4972 dispatch.receiveEmbedPreview(url, false); 4973 } 4974 }; 4975 /** 4976 * Checks whether the current user can perform the given action on the given 4977 * REST resource. 4978 * 4979 * @param {string} action Action to check. One of: 'create', 'read', 'update', 4980 * 'delete'. 4981 * @param {string} resource REST resource to check, e.g. 'media' or 'posts'. 4982 * @param {?string} id ID of the rest resource to check. 4983 */ 4984 4985 const resolvers_canUser = (action, resource, id) => async _ref7 => { 4986 var _response$headers; 4987 4988 let { 4989 dispatch 4990 } = _ref7; 4991 const methods = { 4992 create: 'POST', 4993 read: 'GET', 4994 update: 'PUT', 4995 delete: 'DELETE' 4996 }; 4997 const method = methods[action]; 4998 4999 if (!method) { 5000 throw new Error(`'$action}' is not a valid action.`); 5001 } 5002 5003 const path = id ? `/wp/v2/$resource}/$id}` : `/wp/v2/$resource}`; 5004 let response; 5005 5006 try { 5007 response = await external_wp_apiFetch_default()({ 5008 path, 5009 method: 'OPTIONS', 5010 parse: false 5011 }); 5012 } catch (error) { 5013 // Do nothing if our OPTIONS request comes back with an API error (4xx or 5014 // 5xx). The previously determined isAllowed value will remain in the store. 5015 return; 5016 } // Optional chaining operator is used here because the API requests don't 5017 // return the expected result in the native version. Instead, API requests 5018 // only return the result, without including response properties like the headers. 5019 5020 5021 const allowHeader = (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers.get('allow'); 5022 const key = (0,external_lodash_namespaceObject.compact)([action, resource, id]).join('/'); 5023 const isAllowed = (0,external_lodash_namespaceObject.includes)(allowHeader, method); 5024 dispatch.receiveUserPermission(key, isAllowed); 5025 }; 5026 /** 5027 * Checks whether the current user can perform the given action on the given 5028 * REST resource. 5029 * 5030 * @param {string} kind Entity kind. 5031 * @param {string} name Entity name. 5032 * @param {string} recordId Record's id. 5033 */ 5034 5035 const resolvers_canUserEditEntityRecord = (kind, name, recordId) => async _ref8 => { 5036 let { 5037 dispatch 5038 } = _ref8; 5039 const configs = await dispatch(getOrLoadEntitiesConfig(kind)); 5040 const entityConfig = (0,external_lodash_namespaceObject.find)(configs, { 5041 kind, 5042 name 5043 }); 5044 5045 if (!entityConfig) { 5046 return; 5047 } 5048 5049 const resource = entityConfig.__unstable_rest_base; 5050 await dispatch(resolvers_canUser('update', resource, recordId)); 5051 }; 5052 /** 5053 * Request autosave data from the REST API. 5054 * 5055 * @param {string} postType The type of the parent post. 5056 * @param {number} postId The id of the parent post. 5057 */ 5058 5059 const resolvers_getAutosaves = (postType, postId) => async _ref9 => { 5060 let { 5061 dispatch, 5062 resolveSelect 5063 } = _ref9; 5064 const { 5065 rest_base: restBase 5066 } = await resolveSelect.getPostType(postType); 5067 const autosaves = await external_wp_apiFetch_default()({ 5068 path: `/wp/v2/$restBase}/$postId}/autosaves?context=edit` 5069 }); 5070 5071 if (autosaves && autosaves.length) { 5072 dispatch.receiveAutosaves(postId, autosaves); 5073 } 5074 }; 5075 /** 5076 * Request autosave data from the REST API. 5077 * 5078 * This resolver exists to ensure the underlying autosaves are fetched via 5079 * `getAutosaves` when a call to the `getAutosave` selector is made. 5080 * 5081 * @param {string} postType The type of the parent post. 5082 * @param {number} postId The id of the parent post. 5083 */ 5084 5085 const resolvers_getAutosave = (postType, postId) => async _ref10 => { 5086 let { 5087 resolveSelect 5088 } = _ref10; 5089 await resolveSelect.getAutosaves(postType, postId); 5090 }; 5091 /** 5092 * Retrieve the frontend template used for a given link. 5093 * 5094 * @param {string} link Link. 5095 */ 5096 5097 const resolvers_experimentalGetTemplateForLink = link => async _ref11 => { 5098 let { 5099 dispatch, 5100 resolveSelect 5101 } = _ref11; 5102 // Ideally this should be using an apiFetch call 5103 // We could potentially do so by adding a "filter" to the `wp_template` end point. 5104 // Also it seems the returned object is not a regular REST API post type. 5105 let template; 5106 5107 try { 5108 template = await window.fetch((0,external_wp_url_namespaceObject.addQueryArgs)(link, { 5109 '_wp-find-template': true 5110 })).then(res => res.json()).then(_ref12 => { 5111 let { 5112 data 5113 } = _ref12; 5114 return data; 5115 }); 5116 } catch (e) {// For non-FSE themes, it is possible that this request returns an error. 5117 } 5118 5119 if (!template) { 5120 return; 5121 } 5122 5123 const record = await resolveSelect.getEntityRecord('postType', 'wp_template', template.id); 5124 5125 if (record) { 5126 dispatch.receiveEntityRecords('postType', 'wp_template', [record], { 5127 'find-template': link 5128 }); 5129 } 5130 }; 5131 5132 resolvers_experimentalGetTemplateForLink.shouldInvalidate = action => { 5133 return (action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS') && action.invalidateCache && action.kind === 'postType' && action.name === 'wp_template'; 5134 }; 5135 5136 const resolvers_experimentalGetCurrentGlobalStylesId = () => async _ref13 => { 5137 let { 5138 dispatch, 5139 resolveSelect 5140 } = _ref13; 5141 const activeThemes = await resolveSelect.getEntityRecords('root', 'theme', { 5142 status: 'active' 5143 }); 5144 const globalStylesURL = (0,external_lodash_namespaceObject.get)(activeThemes, [0, '_links', 'wp:user-global-styles', 0, 'href']); 5145 5146 if (globalStylesURL) { 5147 const globalStylesObject = await external_wp_apiFetch_default()({ 5148 url: globalStylesURL 5149 }); 5150 5151 dispatch.__experimentalReceiveCurrentGlobalStylesId(globalStylesObject.id); 5152 } 5153 }; 5154 const resolvers_experimentalGetCurrentThemeBaseGlobalStyles = () => async _ref14 => { 5155 let { 5156 resolveSelect, 5157 dispatch 5158 } = _ref14; 5159 const currentTheme = await resolveSelect.getCurrentTheme(); 5160 const themeGlobalStyles = await external_wp_apiFetch_default()({ 5161 path: `/wp/v2/global-styles/themes/$currentTheme.stylesheet}` 5162 }); 5163 5164 dispatch.__experimentalReceiveThemeBaseGlobalStyles(currentTheme.stylesheet, themeGlobalStyles); 5165 }; 5166 const resolvers_experimentalGetCurrentThemeGlobalStylesVariations = () => async _ref15 => { 5167 let { 5168 resolveSelect, 5169 dispatch 5170 } = _ref15; 5171 const currentTheme = await resolveSelect.getCurrentTheme(); 5172 const variations = await external_wp_apiFetch_default()({ 5173 path: `/wp/v2/global-styles/themes/$currentTheme.stylesheet}/variations` 5174 }); 5175 5176 dispatch.__experimentalReceiveThemeGlobalStyleVariations(currentTheme.stylesheet, variations); 5177 }; 5178 const resolvers_getBlockPatterns = () => async _ref16 => { 5179 let { 5180 dispatch 5181 } = _ref16; 5182 const restPatterns = await external_wp_apiFetch_default()({ 5183 path: '/wp/v2/block-patterns/patterns' 5184 }); 5185 const patterns = (0,external_lodash_namespaceObject.map)(restPatterns, pattern => (0,external_lodash_namespaceObject.mapKeys)(pattern, (value, key) => { 5186 switch (key) { 5187 case 'block_types': 5188 return 'blockTypes'; 5189 5190 case 'viewport_width': 5191 return 'viewportWidth'; 5192 5193 default: 5194 return key; 5195 } 5196 })); 5197 dispatch({ 5198 type: 'RECEIVE_BLOCK_PATTERNS', 5199 patterns 5200 }); 5201 }; 5202 const resolvers_getBlockPatternCategories = () => async _ref17 => { 5203 let { 5204 dispatch 5205 } = _ref17; 5206 const categories = await external_wp_apiFetch_default()({ 5207 path: '/wp/v2/block-patterns/categories' 5208 }); 5209 dispatch({ 5210 type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', 5211 categories 5212 }); 5213 }; 5214 5215 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/utils.js 5216 function deepCopyLocksTreePath(tree, path) { 5217 const newTree = { ...tree 5218 }; 5219 let currentNode = newTree; 5220 5221 for (const branchName of path) { 5222 currentNode.children = { ...currentNode.children, 5223 [branchName]: { 5224 locks: [], 5225 children: {}, 5226 ...currentNode.children[branchName] 5227 } 5228 }; 5229 currentNode = currentNode.children[branchName]; 5230 } 5231 5232 return newTree; 5233 } 5234 function getNode(tree, path) { 5235 let currentNode = tree; 5236 5237 for (const branchName of path) { 5238 const nextNode = currentNode.children[branchName]; 5239 5240 if (!nextNode) { 5241 return null; 5242 } 5243 5244 currentNode = nextNode; 5245 } 5246 5247 return currentNode; 5248 } 5249 function* iteratePath(tree, path) { 5250 let currentNode = tree; 5251 yield currentNode; 5252 5253 for (const branchName of path) { 5254 const nextNode = currentNode.children[branchName]; 5255 5256 if (!nextNode) { 5257 break; 5258 } 5259 5260 yield nextNode; 5261 currentNode = nextNode; 5262 } 5263 } 5264 function* iterateDescendants(node) { 5265 const stack = Object.values(node.children); 5266 5267 while (stack.length) { 5268 const childNode = stack.pop(); 5269 yield childNode; 5270 stack.push(...Object.values(childNode.children)); 5271 } 5272 } 5273 function hasConflictingLock(_ref, locks) { 5274 let { 5275 exclusive 5276 } = _ref; 5277 5278 if (exclusive && locks.length) { 5279 return true; 5280 } 5281 5282 if (!exclusive && locks.filter(lock => lock.exclusive).length) { 5283 return true; 5284 } 5285 5286 return false; 5287 } 5288 5289 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/reducer.js 5290 /** 5291 * Internal dependencies 5292 */ 5293 5294 const DEFAULT_STATE = { 5295 requests: [], 5296 tree: { 5297 locks: [], 5298 children: {} 5299 } 5300 }; 5301 /** 5302 * Reducer returning locks. 5303 * 5304 * @param {Object} state Current state. 5305 * @param {Object} action Dispatched action. 5306 * 5307 * @return {Object} Updated state. 5308 */ 5309 5310 function locks() { 5311 let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_STATE; 5312 let action = arguments.length > 1 ? arguments[1] : undefined; 5313 5314 switch (action.type) { 5315 case 'ENQUEUE_LOCK_REQUEST': 5316 { 5317 const { 5318 request 5319 } = action; 5320 return { ...state, 5321 requests: [request, ...state.requests] 5322 }; 5323 } 5324 5325 case 'GRANT_LOCK_REQUEST': 5326 { 5327 const { 5328 lock, 5329 request 5330 } = action; 5331 const { 5332 store, 5333 path 5334 } = request; 5335 const storePath = [store, ...path]; 5336 const newTree = deepCopyLocksTreePath(state.tree, storePath); 5337 const node = getNode(newTree, storePath); 5338 node.locks = [...node.locks, lock]; 5339 return { ...state, 5340 requests: state.requests.filter(r => r !== request), 5341 tree: newTree 5342 }; 5343 } 5344 5345 case 'RELEASE_LOCK': 5346 { 5347 const { 5348 lock 5349 } = action; 5350 const storePath = [lock.store, ...lock.path]; 5351 const newTree = deepCopyLocksTreePath(state.tree, storePath); 5352 const node = getNode(newTree, storePath); 5353 node.locks = node.locks.filter(l => l !== lock); 5354 return { ...state, 5355 tree: newTree 5356 }; 5357 } 5358 } 5359 5360 return state; 5361 } 5362 5363 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/selectors.js 5364 /** 5365 * Internal dependencies 5366 */ 5367 5368 function getPendingLockRequests(state) { 5369 return state.requests; 5370 } 5371 function isLockAvailable(state, store, path, _ref) { 5372 let { 5373 exclusive 5374 } = _ref; 5375 const storePath = [store, ...path]; 5376 const locks = state.tree; // Validate all parents and the node itself 5377 5378 for (const node of iteratePath(locks, storePath)) { 5379 if (hasConflictingLock({ 5380 exclusive 5381 }, node.locks)) { 5382 return false; 5383 } 5384 } // iteratePath terminates early if path is unreachable, let's 5385 // re-fetch the node and check it exists in the tree. 5386 5387 5388 const node = getNode(locks, storePath); 5389 5390 if (!node) { 5391 return true; 5392 } // Validate all nested nodes 5393 5394 5395 for (const descendant of iterateDescendants(node)) { 5396 if (hasConflictingLock({ 5397 exclusive 5398 }, descendant.locks)) { 5399 return false; 5400 } 5401 } 5402 5403 return true; 5404 } 5405 5406 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/engine.js 5407 /** 5408 * Internal dependencies 5409 */ 5410 5411 5412 function createLocks() { 5413 let state = locks(undefined, { 5414 type: '@@INIT' 5415 }); 5416 5417 function processPendingLockRequests() { 5418 for (const request of getPendingLockRequests(state)) { 5419 const { 5420 store, 5421 path, 5422 exclusive, 5423 notifyAcquired 5424 } = request; 5425 5426 if (isLockAvailable(state, store, path, { 5427 exclusive 5428 })) { 5429 const lock = { 5430 store, 5431 path, 5432 exclusive 5433 }; 5434 state = locks(state, { 5435 type: 'GRANT_LOCK_REQUEST', 5436 lock, 5437 request 5438 }); 5439 notifyAcquired(lock); 5440 } 5441 } 5442 } 5443 5444 function acquire(store, path, exclusive) { 5445 return new Promise(resolve => { 5446 state = locks(state, { 5447 type: 'ENQUEUE_LOCK_REQUEST', 5448 request: { 5449 store, 5450 path, 5451 exclusive, 5452 notifyAcquired: resolve 5453 } 5454 }); 5455 processPendingLockRequests(); 5456 }); 5457 } 5458 5459 function release(lock) { 5460 state = locks(state, { 5461 type: 'RELEASE_LOCK', 5462 lock 5463 }); 5464 processPendingLockRequests(); 5465 } 5466 5467 return { 5468 acquire, 5469 release 5470 }; 5471 } 5472 5473 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/locks/actions.js 5474 /** 5475 * Internal dependencies 5476 */ 5477 5478 function createLocksActions() { 5479 const locks = createLocks(); 5480 5481 function __unstableAcquireStoreLock(store, path, _ref) { 5482 let { 5483 exclusive 5484 } = _ref; 5485 return () => locks.acquire(store, path, exclusive); 5486 } 5487 5488 function __unstableReleaseStoreLock(lock) { 5489 return () => locks.release(lock); 5490 } 5491 5492 return { 5493 __unstableAcquireStoreLock, 5494 __unstableReleaseStoreLock 5495 }; 5496 } 5497 5498 ;// CONCATENATED MODULE: external ["wp","element"] 5499 var external_wp_element_namespaceObject = window["wp"]["element"]; 5500 ;// CONCATENATED MODULE: external ["wp","blocks"] 5501 var external_wp_blocks_namespaceObject = window["wp"]["blocks"]; 5502 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/entity-provider.js 5503 5504 5505 /** 5506 * WordPress dependencies 5507 */ 5508 5509 5510 5511 /** 5512 * Internal dependencies 5513 */ 5514 5515 5516 /** @typedef {import('@wordpress/blocks').WPBlock} WPBlock */ 5517 5518 const EMPTY_ARRAY = []; 5519 /** 5520 * Internal dependencies 5521 */ 5522 5523 5524 const entityContexts = { ...rootEntitiesConfig.reduce((acc, loader) => { 5525 if (!acc[loader.kind]) { 5526 acc[loader.kind] = {}; 5527 } 5528 5529 acc[loader.kind][loader.name] = { 5530 context: (0,external_wp_element_namespaceObject.createContext)(undefined) 5531 }; 5532 return acc; 5533 }, {}), 5534 ...additionalEntityConfigLoaders.reduce((acc, loader) => { 5535 acc[loader.kind] = {}; 5536 return acc; 5537 }, {}) 5538 }; 5539 5540 const getEntityContext = (kind, name) => { 5541 if (!entityContexts[kind]) { 5542 throw new Error(`Missing entity config for kind: $kind}.`); 5543 } 5544 5545 if (!entityContexts[kind][name]) { 5546 entityContexts[kind][name] = { 5547 context: (0,external_wp_element_namespaceObject.createContext)(undefined) 5548 }; 5549 } 5550 5551 return entityContexts[kind][name].context; 5552 }; 5553 /** 5554 * Context provider component for providing 5555 * an entity for a specific entity. 5556 * 5557 * @param {Object} props The component's props. 5558 * @param {string} props.kind The entity kind. 5559 * @param {string} props.type The entity name. 5560 * @param {number} props.id The entity ID. 5561 * @param {*} props.children The children to wrap. 5562 * 5563 * @return {Object} The provided children, wrapped with 5564 * the entity's context provider. 5565 */ 5566 5567 5568 function EntityProvider(_ref) { 5569 let { 5570 kind, 5571 type: name, 5572 id, 5573 children 5574 } = _ref; 5575 const Provider = getEntityContext(kind, name).Provider; 5576 return (0,external_wp_element_namespaceObject.createElement)(Provider, { 5577 value: id 5578 }, children); 5579 } 5580 /** 5581 * Hook that returns the ID for the nearest 5582 * provided entity of the specified type. 5583 * 5584 * @param {string} kind The entity kind. 5585 * @param {string} name The entity name. 5586 */ 5587 5588 function useEntityId(kind, name) { 5589 return (0,external_wp_element_namespaceObject.useContext)(getEntityContext(kind, name)); 5590 } 5591 /** 5592 * Hook that returns the value and a setter for the 5593 * specified property of the nearest provided 5594 * entity of the specified type. 5595 * 5596 * @param {string} kind The entity kind. 5597 * @param {string} name The entity name. 5598 * @param {string} prop The property name. 5599 * @param {string} [_id] An entity ID to use instead of the context-provided one. 5600 * 5601 * @return {[*, Function, *]} An array where the first item is the 5602 * property value, the second is the 5603 * setter and the third is the full value 5604 * object from REST API containing more 5605 * information like `raw`, `rendered` and 5606 * `protected` props. 5607 */ 5608 5609 function useEntityProp(kind, name, prop, _id) { 5610 const providerId = useEntityId(kind, name); 5611 const id = _id !== null && _id !== void 0 ? _id : providerId; 5612 const { 5613 value, 5614 fullValue 5615 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 5616 const { 5617 getEntityRecord, 5618 getEditedEntityRecord 5619 } = select(STORE_NAME); 5620 const record = getEntityRecord(kind, name, id); // Trigger resolver. 5621 5622 const editedRecord = getEditedEntityRecord(kind, name, id); 5623 return record && editedRecord ? { 5624 value: editedRecord[prop], 5625 fullValue: record[prop] 5626 } : {}; 5627 }, [kind, name, id, prop]); 5628 const { 5629 editEntityRecord 5630 } = (0,external_wp_data_namespaceObject.useDispatch)(STORE_NAME); 5631 const setValue = (0,external_wp_element_namespaceObject.useCallback)(newValue => { 5632 editEntityRecord(kind, name, id, { 5633 [prop]: newValue 5634 }); 5635 }, [kind, name, id, prop]); 5636 return [value, setValue, fullValue]; 5637 } 5638 /** 5639 * Hook that returns block content getters and setters for 5640 * the nearest provided entity of the specified type. 5641 * 5642 * The return value has the shape `[ blocks, onInput, onChange ]`. 5643 * `onInput` is for block changes that don't create undo levels 5644 * or dirty the post, non-persistent changes, and `onChange` is for 5645 * peristent changes. They map directly to the props of a 5646 * `BlockEditorProvider` and are intended to be used with it, 5647 * or similar components or hooks. 5648 * 5649 * @param {string} kind The entity kind. 5650 * @param {string} name The entity name. 5651 * @param {Object} options 5652 * @param {string} [options.id] An entity ID to use instead of the context-provided one. 5653 * 5654 * @return {[WPBlock[], Function, Function]} The block array and setters. 5655 */ 5656 5657 function useEntityBlockEditor(kind, name) { 5658 let { 5659 id: _id 5660 } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 5661 const providerId = useEntityId(kind, name); 5662 const id = _id !== null && _id !== void 0 ? _id : providerId; 5663 const { 5664 content, 5665 blocks 5666 } = (0,external_wp_data_namespaceObject.useSelect)(select => { 5667 const { 5668 getEditedEntityRecord 5669 } = select(STORE_NAME); 5670 const editedRecord = getEditedEntityRecord(kind, name, id); 5671 return { 5672 blocks: editedRecord.blocks, 5673 content: editedRecord.content 5674 }; 5675 }, [kind, name, id]); 5676 const { 5677 __unstableCreateUndoLevel, 5678 editEntityRecord 5679 } = (0,external_wp_data_namespaceObject.useDispatch)(STORE_NAME); 5680 (0,external_wp_element_namespaceObject.useEffect)(() => { 5681 // Load the blocks from the content if not already in state 5682 // Guard against other instances that might have 5683 // set content to a function already or the blocks are already in state. 5684 if (content && typeof content !== 'function' && !blocks) { 5685 const parsedContent = (0,external_wp_blocks_namespaceObject.parse)(content); 5686 editEntityRecord(kind, name, id, { 5687 blocks: parsedContent 5688 }, { 5689 undoIgnore: true 5690 }); 5691 } 5692 }, [content]); 5693 const onChange = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => { 5694 const { 5695 selection 5696 } = options; 5697 const edits = { 5698 blocks: newBlocks, 5699 selection 5700 }; 5701 const noChange = blocks === edits.blocks; 5702 5703 if (noChange) { 5704 return __unstableCreateUndoLevel(kind, name, id); 5705 } // We create a new function here on every persistent edit 5706 // to make sure the edit makes the post dirty and creates 5707 // a new undo level. 5708 5709 5710 edits.content = _ref2 => { 5711 let { 5712 blocks: blocksForSerialization = [] 5713 } = _ref2; 5714 return (0,external_wp_blocks_namespaceObject.__unstableSerializeAndClean)(blocksForSerialization); 5715 }; 5716 5717 editEntityRecord(kind, name, id, edits); 5718 }, [kind, name, id, blocks]); 5719 const onInput = (0,external_wp_element_namespaceObject.useCallback)((newBlocks, options) => { 5720 const { 5721 selection 5722 } = options; 5723 const edits = { 5724 blocks: newBlocks, 5725 selection 5726 }; 5727 editEntityRecord(kind, name, id, edits); 5728 }, [kind, name, id]); 5729 return [blocks !== null && blocks !== void 0 ? blocks : EMPTY_ARRAY, onInput, onChange]; 5730 } 5731 5732 // EXTERNAL MODULE: ./node_modules/memize/index.js 5733 var memize = __webpack_require__(9756); 5734 var memize_default = /*#__PURE__*/__webpack_require__.n(memize); 5735 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/memoize.js 5736 /** 5737 * External dependencies 5738 */ 5739 // re-export due to restrictive esModuleInterop setting 5740 5741 /* harmony default export */ var memoize = ((memize_default())); 5742 5743 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/constants.js 5744 /* eslint-disable-next-line no-shadow */ 5745 let Status; 5746 5747 (function (Status) { 5748 Status["Idle"] = "IDLE"; 5749 Status["Resolving"] = "RESOLVING"; 5750 Status["Error"] = "ERROR"; 5751 Status["Success"] = "SUCCESS"; 5752 })(Status || (Status = {})); 5753 5754 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-query-select.js 5755 /** 5756 * WordPress dependencies 5757 */ 5758 5759 /** 5760 * Internal dependencies 5761 */ 5762 5763 5764 5765 const META_SELECTORS = ['getIsResolving', 'hasStartedResolution', 'hasFinishedResolution', 'isResolving', 'getCachedResolvers']; 5766 5767 /** 5768 * Like useSelect, but the selectors return objects containing 5769 * both the original data AND the resolution info. 5770 * 5771 * @param {Function} mapQuerySelect see useSelect 5772 * @param {Array} deps see useSelect 5773 * 5774 * @example 5775 * ```js 5776 * import { useQuerySelect } from '@wordpress/data'; 5777 * import { store as coreDataStore } from '@wordpress/core-data'; 5778 * 5779 * function PageTitleDisplay( { id } ) { 5780 * const { data: page, isResolving } = useQuerySelect( ( query ) => { 5781 * return query( coreDataStore ).getEntityRecord( 'postType', 'page', id ) 5782 * }, [ id ] ); 5783 * 5784 * if ( isResolving ) { 5785 * return 'Loading...'; 5786 * } 5787 * 5788 * return page.title; 5789 * } 5790 * 5791 * // Rendered in the application: 5792 * // <PageTitleDisplay id={ 10 } /> 5793 * ``` 5794 * 5795 * In the above example, when `PageTitleDisplay` is rendered into an 5796 * application, the page and the resolution details will be retrieved from 5797 * the store state using the `mapSelect` callback on `useQuerySelect`. 5798 * 5799 * If the id prop changes then any page in the state for that id is 5800 * retrieved. If the id prop doesn't change and other props are passed in 5801 * that do change, the title will not change because the dependency is just 5802 * the id. 5803 * @see useSelect 5804 * 5805 * @return {QuerySelectResponse} Queried data. 5806 */ 5807 function __experimentalUseQuerySelect(mapQuerySelect, deps) { 5808 return (0,external_wp_data_namespaceObject.useSelect)((select, registry) => { 5809 const resolve = store => enrichSelectors(select(store)); 5810 5811 return mapQuerySelect(resolve, registry); 5812 }, deps); 5813 } 5814 5815 /** 5816 * Transform simple selectors into ones that return an object with the 5817 * original return value AND the resolution info. 5818 * 5819 * @param {Object} selectors Selectors to enrich 5820 * @return {EnrichedSelectors} Enriched selectors 5821 */ 5822 const enrichSelectors = memoize(selectors => { 5823 const resolvers = {}; 5824 5825 for (const selectorName in selectors) { 5826 if (META_SELECTORS.includes(selectorName)) { 5827 continue; 5828 } 5829 5830 Object.defineProperty(resolvers, selectorName, { 5831 get: () => function () { 5832 const { 5833 getIsResolving, 5834 hasFinishedResolution 5835 } = selectors; 5836 5837 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 5838 args[_key] = arguments[_key]; 5839 } 5840 5841 const isResolving = !!getIsResolving(selectorName, args); 5842 const hasResolved = !isResolving && hasFinishedResolution(selectorName, args); 5843 const data = selectors[selectorName](...args); 5844 let status; 5845 5846 if (isResolving) { 5847 status = Status.Resolving; 5848 } else if (hasResolved) { 5849 if (data) { 5850 status = Status.Success; 5851 } else { 5852 status = Status.Error; 5853 } 5854 } else { 5855 status = Status.Idle; 5856 } 5857 5858 return { 5859 data, 5860 status, 5861 isResolving, 5862 hasResolved 5863 }; 5864 } 5865 }); 5866 } 5867 5868 return resolvers; 5869 }); 5870 5871 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-record.js 5872 /** 5873 * Internal dependencies 5874 */ 5875 5876 5877 5878 /** 5879 * Resolves the specified entity record. 5880 * 5881 * @param kind Kind of the requested entity. 5882 * @param name Name of the requested entity. 5883 * @param recordId Record ID of the requested entity. 5884 * @param options Hook options. 5885 * @param [options.enabled=true] Whether to run the query or short-circuit and return null. Defaults to true. 5886 * @example 5887 * ```js 5888 * import { useEntityRecord } from '@wordpress/core-data'; 5889 * 5890 * function PageTitleDisplay( { id } ) { 5891 * const { record, isResolving } = useEntityRecord( 'postType', 'page', id ); 5892 * 5893 * if ( isResolving ) { 5894 * return 'Loading...'; 5895 * } 5896 * 5897 * return record.title; 5898 * } 5899 * 5900 * // Rendered in the application: 5901 * // <PageTitleDisplay id={ 1 } /> 5902 * ``` 5903 * 5904 * In the above example, when `PageTitleDisplay` is rendered into an 5905 * application, the page and the resolution details will be retrieved from 5906 * the store state using `getEntityRecord()`, or resolved if missing. 5907 * 5908 * @return {EntityRecordResolution<RecordType>} Entity record data. 5909 * @template RecordType 5910 */ 5911 function __experimentalUseEntityRecord(kind, name, recordId) { 5912 let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { 5913 enabled: true 5914 }; 5915 const { 5916 data: record, 5917 ...rest 5918 } = __experimentalUseQuerySelect(query => { 5919 if (!options.enabled) { 5920 return null; 5921 } 5922 5923 return query(store).getEntityRecord(kind, name, recordId); 5924 }, [kind, name, recordId, options.enabled]); 5925 return { 5926 record, 5927 ...rest 5928 }; 5929 } 5930 5931 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/hooks/use-entity-records.js 5932 /** 5933 * WordPress dependencies 5934 */ 5935 5936 /** 5937 * Internal dependencies 5938 */ 5939 5940 5941 5942 5943 /** 5944 * Resolves the specified entity records. 5945 * 5946 * @param kind Kind of the requested entities. 5947 * @param name Name of the requested entities. 5948 * @param queryArgs HTTP query for the requested entities. 5949 * @param options Hook options. 5950 * @example 5951 * ```js 5952 * import { useEntityRecord } from '@wordpress/core-data'; 5953 * 5954 * function PageTitlesList() { 5955 * const { records, isResolving } = useEntityRecords( 'postType', 'page' ); 5956 * 5957 * if ( isResolving ) { 5958 * return 'Loading...'; 5959 * } 5960 * 5961 * return ( 5962 * <ul> 5963 * {records.map(( page ) => ( 5964 * <li>{ page.title }</li> 5965 * ))} 5966 * </ul> 5967 * ); 5968 * } 5969 * 5970 * // Rendered in the application: 5971 * // <PageTitlesList /> 5972 * ``` 5973 * 5974 * In the above example, when `PageTitlesList` is rendered into an 5975 * application, the list of records and the resolution details will be retrieved from 5976 * the store state using `getEntityRecords()`, or resolved if missing. 5977 * 5978 * @return Entity records data. 5979 * @template RecordType 5980 */ 5981 function __experimentalUseEntityRecords(kind, name) { 5982 let queryArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 5983 let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { 5984 enabled: true 5985 }; 5986 // Serialize queryArgs to a string that can be safely used as a React dep. 5987 // We can't just pass queryArgs as one of the deps, because if it is passed 5988 // as an object literal, then it will be a different object on each call even 5989 // if the values remain the same. 5990 const queryAsString = (0,external_wp_url_namespaceObject.addQueryArgs)('', queryArgs); 5991 const { 5992 data: records, 5993 ...rest 5994 } = __experimentalUseQuerySelect(query => { 5995 if (!options.enabled) { 5996 return { 5997 data: [] 5998 }; 5999 } 6000 6001 return query(store).getEntityRecords(kind, name, queryArgs); 6002 }, [kind, name, queryAsString, options.enabled]); 6003 return { 6004 records, 6005 ...rest 6006 }; 6007 } 6008 6009 ;// CONCATENATED MODULE: external ["wp","htmlEntities"] 6010 var external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"]; 6011 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-link-suggestions.js 6012 /** 6013 * WordPress dependencies 6014 */ 6015 6016 6017 6018 6019 /** 6020 * Filters the search by type 6021 * 6022 * @typedef { 'attachment' | 'post' | 'term' | 'post-format' } WPLinkSearchType 6023 */ 6024 6025 /** 6026 * A link with an id may be of kind post-type or taxonomy 6027 * 6028 * @typedef { 'post-type' | 'taxonomy' } WPKind 6029 */ 6030 6031 /** 6032 * @typedef WPLinkSearchOptions 6033 * 6034 * @property {boolean} [isInitialSuggestions] Displays initial search suggestions, when true. 6035 * @property {WPLinkSearchType} [type] Filters by search type. 6036 * @property {string} [subtype] Slug of the post-type or taxonomy. 6037 * @property {number} [page] Which page of results to return. 6038 * @property {number} [perPage] Search results per page. 6039 */ 6040 6041 /** 6042 * @typedef WPLinkSearchResult 6043 * 6044 * @property {number} id Post or term id. 6045 * @property {string} url Link url. 6046 * @property {string} title Title of the link. 6047 * @property {string} type The taxonomy or post type slug or type URL. 6048 * @property {WPKind} [kind] Link kind of post-type or taxonomy 6049 */ 6050 6051 /** 6052 * @typedef WPLinkSearchResultAugments 6053 * 6054 * @property {{kind: WPKind}} [meta] Contains kind information. 6055 * @property {WPKind} [subtype] Optional subtype if it exists. 6056 */ 6057 6058 /** 6059 * @typedef {WPLinkSearchResult & WPLinkSearchResultAugments} WPLinkSearchResultAugmented 6060 */ 6061 6062 /** 6063 * @typedef WPEditorSettings 6064 * 6065 * @property {boolean} [ disablePostFormats ] Disables post formats, when true. 6066 */ 6067 6068 /** 6069 * Fetches link suggestions from the API. 6070 * 6071 * @async 6072 * @param {string} search 6073 * @param {WPLinkSearchOptions} [searchOptions] 6074 * @param {WPEditorSettings} [settings] 6075 * 6076 * @example 6077 * ```js 6078 * import { __experimentalFetchLinkSuggestions as fetchLinkSuggestions } from '@wordpress/core-data'; 6079 * 6080 * //... 6081 * 6082 * export function initialize( id, settings ) { 6083 * 6084 * settings.__experimentalFetchLinkSuggestions = ( 6085 * search, 6086 * searchOptions 6087 * ) => fetchLinkSuggestions( search, searchOptions, settings ); 6088 * ``` 6089 * @return {Promise< WPLinkSearchResult[] >} List of search suggestions 6090 */ 6091 6092 const fetchLinkSuggestions = async function (search) { 6093 let searchOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 6094 let settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 6095 const { 6096 isInitialSuggestions = false, 6097 type = undefined, 6098 subtype = undefined, 6099 page = undefined, 6100 perPage = isInitialSuggestions ? 3 : 20 6101 } = searchOptions; 6102 const { 6103 disablePostFormats = false 6104 } = settings; 6105 /** @type {Promise<WPLinkSearchResult>[]} */ 6106 6107 const queries = []; 6108 6109 if (!type || type === 'post') { 6110 queries.push(external_wp_apiFetch_default()({ 6111 path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', { 6112 search, 6113 page, 6114 per_page: perPage, 6115 type: 'post', 6116 subtype 6117 }) 6118 }).then(results => { 6119 return results.map(result => { 6120 return { ...result, 6121 meta: { 6122 kind: 'post-type', 6123 subtype 6124 } 6125 }; 6126 }); 6127 }).catch(() => []) // Fail by returning no results. 6128 ); 6129 } 6130 6131 if (!type || type === 'term') { 6132 queries.push(external_wp_apiFetch_default()({ 6133 path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', { 6134 search, 6135 page, 6136 per_page: perPage, 6137 type: 'term', 6138 subtype 6139 }) 6140 }).then(results => { 6141 return results.map(result => { 6142 return { ...result, 6143 meta: { 6144 kind: 'taxonomy', 6145 subtype 6146 } 6147 }; 6148 }); 6149 }).catch(() => []) // Fail by returning no results. 6150 ); 6151 } 6152 6153 if (!disablePostFormats && (!type || type === 'post-format')) { 6154 queries.push(external_wp_apiFetch_default()({ 6155 path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/search', { 6156 search, 6157 page, 6158 per_page: perPage, 6159 type: 'post-format', 6160 subtype 6161 }) 6162 }).then(results => { 6163 return results.map(result => { 6164 return { ...result, 6165 meta: { 6166 kind: 'taxonomy', 6167 subtype 6168 } 6169 }; 6170 }); 6171 }).catch(() => []) // Fail by returning no results. 6172 ); 6173 } 6174 6175 if (!type || type === 'attachment') { 6176 queries.push(external_wp_apiFetch_default()({ 6177 path: (0,external_wp_url_namespaceObject.addQueryArgs)('/wp/v2/media', { 6178 search, 6179 page, 6180 per_page: perPage 6181 }) 6182 }).then(results => { 6183 return results.map(result => { 6184 return { ...result, 6185 meta: { 6186 kind: 'media' 6187 } 6188 }; 6189 }); 6190 }).catch(() => []) // Fail by returning no results. 6191 ); 6192 } 6193 6194 return Promise.all(queries).then(results => { 6195 return results.reduce(( 6196 /** @type {WPLinkSearchResult[]} */ 6197 accumulator, current) => accumulator.concat(current), // Flatten list. 6198 []).filter( 6199 /** 6200 * @param {{ id: number }} result 6201 */ 6202 result => { 6203 return !!result.id; 6204 }).slice(0, perPage).map(( 6205 /** @type {WPLinkSearchResultAugmented} */ 6206 result) => { 6207 var _result$meta; 6208 6209 const isMedia = result.type === 'attachment'; 6210 return { 6211 id: result.id, 6212 // @ts-ignore fix when we make this a TS file 6213 url: isMedia ? result.source_url : result.url, 6214 title: (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(isMedia ? // @ts-ignore fix when we make this a TS file 6215 result.title.rendered : result.title || '') || (0,external_wp_i18n_namespaceObject.__)('(no title)'), 6216 type: result.subtype || result.type, 6217 kind: result === null || result === void 0 ? void 0 : (_result$meta = result.meta) === null || _result$meta === void 0 ? void 0 : _result$meta.kind 6218 }; 6219 }); 6220 }); 6221 }; 6222 6223 /* harmony default export */ var _experimental_fetch_link_suggestions = (fetchLinkSuggestions); 6224 6225 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/__experimental-fetch-url-data.js 6226 /** 6227 * WordPress dependencies 6228 */ 6229 6230 6231 /** 6232 * A simple in-memory cache for requests. 6233 * This avoids repeat HTTP requests which may be beneficial 6234 * for those wishing to preserve low-bandwidth. 6235 */ 6236 6237 const CACHE = new Map(); 6238 /** 6239 * @typedef WPRemoteUrlData 6240 * 6241 * @property {string} title contents of the remote URL's `<title>` tag. 6242 */ 6243 6244 /** 6245 * Fetches data about a remote URL. 6246 * eg: <title> tag, favicon...etc. 6247 * 6248 * @async 6249 * @param {string} url the URL to request details from. 6250 * @param {Object?} options any options to pass to the underlying fetch. 6251 * @example 6252 * ```js 6253 * import { __experimentalFetchUrlData as fetchUrlData } from '@wordpress/core-data'; 6254 * 6255 * //... 6256 * 6257 * export function initialize( id, settings ) { 6258 * 6259 * settings.__experimentalFetchUrlData = ( 6260 * url 6261 * ) => fetchUrlData( url ); 6262 * ``` 6263 * @return {Promise< WPRemoteUrlData[] >} Remote URL data. 6264 */ 6265 6266 const fetchUrlData = async function (url) { 6267 let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 6268 const endpoint = '/wp-block-editor/v1/url-details'; 6269 const args = { 6270 url: (0,external_wp_url_namespaceObject.prependHTTP)(url) 6271 }; 6272 6273 if (!(0,external_wp_url_namespaceObject.isURL)(url)) { 6274 return Promise.reject(`$url} is not a valid URL.`); 6275 } // Test for "http" based URL as it is possible for valid 6276 // yet unusable URLs such as `tel:123456` to be passed. 6277 6278 6279 const protocol = (0,external_wp_url_namespaceObject.getProtocol)(url); 6280 6281 if (!protocol || !(0,external_wp_url_namespaceObject.isValidProtocol)(protocol) || !protocol.startsWith('http') || !/^https?:\/\/[^\/\s]/i.test(url)) { 6282 return Promise.reject(`$url} does not have a valid protocol. URLs must be "http" based`); 6283 } 6284 6285 if (CACHE.has(url)) { 6286 return CACHE.get(url); 6287 } 6288 6289 return external_wp_apiFetch_default()({ 6290 path: (0,external_wp_url_namespaceObject.addQueryArgs)(endpoint, args), 6291 ...options 6292 }).then(res => { 6293 CACHE.set(url, res); 6294 return res; 6295 }); 6296 }; 6297 6298 /* harmony default export */ var _experimental_fetch_url_data = (fetchUrlData); 6299 6300 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/fetch/index.js 6301 6302 6303 6304 ;// CONCATENATED MODULE: ./node_modules/@wordpress/core-data/build-module/index.js 6305 /** 6306 * WordPress dependencies 6307 */ 6308 6309 /** 6310 * Internal dependencies 6311 */ 6312 6313 6314 6315 6316 6317 6318 6319 // The entity selectors/resolvers and actions are shortcuts to their generic equivalents 6320 // (getEntityRecord, getEntityRecords, updateEntityRecord, updateEntityRecords) 6321 // Instead of getEntityRecord, the consumer could use more user-friendly named selector: getPostType, getTaxonomy... 6322 // The "kind" and the "name" of the entity are combined to generate these shortcuts. 6323 6324 const entitySelectors = rootEntitiesConfig.reduce((result, entity) => { 6325 const { 6326 kind, 6327 name 6328 } = entity; 6329 6330 result[getMethodName(kind, name)] = (state, key, query) => getEntityRecord(state, kind, name, key, query); 6331 6332 result[getMethodName(kind, name, 'get', true)] = (state, query) => getEntityRecords(state, kind, name, query); 6333 6334 return result; 6335 }, {}); 6336 const entityResolvers = rootEntitiesConfig.reduce((result, entity) => { 6337 const { 6338 kind, 6339 name 6340 } = entity; 6341 6342 result[getMethodName(kind, name)] = (key, query) => resolvers_getEntityRecord(kind, name, key, query); 6343 6344 const pluralMethodName = getMethodName(kind, name, 'get', true); 6345 6346 result[pluralMethodName] = function () { 6347 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 6348 args[_key] = arguments[_key]; 6349 } 6350 6351 return resolvers_getEntityRecords(kind, name, ...args); 6352 }; 6353 6354 result[pluralMethodName].shouldInvalidate = action => resolvers_getEntityRecords.shouldInvalidate(action, kind, name); 6355 6356 return result; 6357 }, {}); 6358 const entityActions = rootEntitiesConfig.reduce((result, entity) => { 6359 const { 6360 kind, 6361 name 6362 } = entity; 6363 6364 result[getMethodName(kind, name, 'save')] = key => saveEntityRecord(kind, name, key); 6365 6366 result[getMethodName(kind, name, 'delete')] = (key, query) => deleteEntityRecord(kind, name, key, query); 6367 6368 return result; 6369 }, {}); 6370 6371 const storeConfig = () => ({ 6372 reducer: build_module_reducer, 6373 actions: { ...build_module_actions_namespaceObject, 6374 ...entityActions, 6375 ...createLocksActions() 6376 }, 6377 selectors: { ...build_module_selectors_namespaceObject, 6378 ...entitySelectors 6379 }, 6380 resolvers: { ...resolvers_namespaceObject, 6381 ...entityResolvers 6382 } 6383 }); 6384 /** 6385 * Store definition for the code data namespace. 6386 * 6387 * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore 6388 * 6389 * @type {Object} 6390 */ 6391 6392 6393 const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, storeConfig()); 6394 (0,external_wp_data_namespaceObject.register)(store); 6395 6396 6397 6398 6399 6400 6401 6402 }(); 6403 (window.wp = window.wp || {}).coreData = __webpack_exports__; 6404 /******/ })() 6405 ;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Nov 21 01:00:03 2024 | Cross-referenced by PHPXref 0.7.1 |