| /******/ (() => { // webpackBootstrap | |
| /******/ "use strict"; | |
| /******/ var __webpack_modules__ = ({ | |
| /***/ 66: | |
| /***/ ((module) => { | |
| var isMergeableObject = function isMergeableObject(value) { | |
| return isNonNullObject(value) | |
| && !isSpecial(value) | |
| }; | |
| function isNonNullObject(value) { | |
| return !!value && typeof value === 'object' | |
| } | |
| function isSpecial(value) { | |
| var stringValue = Object.prototype.toString.call(value); | |
| return stringValue === '[object RegExp]' | |
| || stringValue === '[object Date]' | |
| || isReactElement(value) | |
| } | |
| // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25 | |
| var canUseSymbol = typeof Symbol === 'function' && Symbol.for; | |
| var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7; | |
| function isReactElement(value) { | |
| return value.$$typeof === REACT_ELEMENT_TYPE | |
| } | |
| function emptyTarget(val) { | |
| return Array.isArray(val) ? [] : {} | |
| } | |
| function cloneUnlessOtherwiseSpecified(value, options) { | |
| return (options.clone !== false && options.isMergeableObject(value)) | |
| ? deepmerge(emptyTarget(value), value, options) | |
| : value | |
| } | |
| function defaultArrayMerge(target, source, options) { | |
| return target.concat(source).map(function(element) { | |
| return cloneUnlessOtherwiseSpecified(element, options) | |
| }) | |
| } | |
| function getMergeFunction(key, options) { | |
| if (!options.customMerge) { | |
| return deepmerge | |
| } | |
| var customMerge = options.customMerge(key); | |
| return typeof customMerge === 'function' ? customMerge : deepmerge | |
| } | |
| function getEnumerableOwnPropertySymbols(target) { | |
| return Object.getOwnPropertySymbols | |
| ? Object.getOwnPropertySymbols(target).filter(function(symbol) { | |
| return Object.propertyIsEnumerable.call(target, symbol) | |
| }) | |
| : [] | |
| } | |
| function getKeys(target) { | |
| return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target)) | |
| } | |
| function propertyIsOnObject(object, property) { | |
| try { | |
| return property in object | |
| } catch(_) { | |
| return false | |
| } | |
| } | |
| // Protects from prototype poisoning and unexpected merging up the prototype chain. | |
| function propertyIsUnsafe(target, key) { | |
| return propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet, | |
| && !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain, | |
| && Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable. | |
| } | |
| function mergeObject(target, source, options) { | |
| var destination = {}; | |
| if (options.isMergeableObject(target)) { | |
| getKeys(target).forEach(function(key) { | |
| destination[key] = cloneUnlessOtherwiseSpecified(target[key], options); | |
| }); | |
| } | |
| getKeys(source).forEach(function(key) { | |
| if (propertyIsUnsafe(target, key)) { | |
| return | |
| } | |
| if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) { | |
| destination[key] = getMergeFunction(key, options)(target[key], source[key], options); | |
| } else { | |
| destination[key] = cloneUnlessOtherwiseSpecified(source[key], options); | |
| } | |
| }); | |
| return destination | |
| } | |
| function deepmerge(target, source, options) { | |
| options = options || {}; | |
| options.arrayMerge = options.arrayMerge || defaultArrayMerge; | |
| options.isMergeableObject = options.isMergeableObject || isMergeableObject; | |
| // cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge() | |
| // implementations can use it. The caller may not replace it. | |
| options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified; | |
| var sourceIsArray = Array.isArray(source); | |
| var targetIsArray = Array.isArray(target); | |
| var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray; | |
| if (!sourceAndTargetTypesMatch) { | |
| return cloneUnlessOtherwiseSpecified(source, options) | |
| } else if (sourceIsArray) { | |
| return options.arrayMerge(target, source, options) | |
| } else { | |
| return mergeObject(target, source, options) | |
| } | |
| } | |
| deepmerge.all = function deepmergeAll(array, options) { | |
| if (!Array.isArray(array)) { | |
| throw new Error('first argument should be an array') | |
| } | |
| return array.reduce(function(prev, next) { | |
| return deepmerge(prev, next, options) | |
| }, {}) | |
| }; | |
| var deepmerge_1 = deepmerge; | |
| module.exports = deepmerge_1; | |
| /***/ }), | |
| /***/ 3249: | |
| /***/ ((module) => { | |
| function _typeof(obj) { | |
| if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { | |
| _typeof = function (obj) { | |
| return typeof obj; | |
| }; | |
| } else { | |
| _typeof = function (obj) { | |
| return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; | |
| }; | |
| } | |
| return _typeof(obj); | |
| } | |
| function _classCallCheck(instance, Constructor) { | |
| if (!(instance instanceof Constructor)) { | |
| throw new TypeError("Cannot call a class as a function"); | |
| } | |
| } | |
| function _defineProperties(target, props) { | |
| for (var i = 0; i < props.length; i++) { | |
| var descriptor = props[i]; | |
| descriptor.enumerable = descriptor.enumerable || false; | |
| descriptor.configurable = true; | |
| if ("value" in descriptor) descriptor.writable = true; | |
| Object.defineProperty(target, descriptor.key, descriptor); | |
| } | |
| } | |
| function _createClass(Constructor, protoProps, staticProps) { | |
| if (protoProps) _defineProperties(Constructor.prototype, protoProps); | |
| if (staticProps) _defineProperties(Constructor, staticProps); | |
| return Constructor; | |
| } | |
| /** | |
| * Given an instance of EquivalentKeyMap, returns its internal value pair tuple | |
| * for a key, if one exists. The tuple members consist of the last reference | |
| * value for the key (used in efficient subsequent lookups) and the value | |
| * assigned for the key at the leaf node. | |
| * | |
| * @param {EquivalentKeyMap} instance EquivalentKeyMap instance. | |
| * @param {*} key The key for which to return value pair. | |
| * | |
| * @return {?Array} Value pair, if exists. | |
| */ | |
| function getValuePair(instance, key) { | |
| var _map = instance._map, | |
| _arrayTreeMap = instance._arrayTreeMap, | |
| _objectTreeMap = instance._objectTreeMap; // Map keeps a reference to the last object-like key used to set the | |
| // value, which can be used to shortcut immediately to the value. | |
| if (_map.has(key)) { | |
| return _map.get(key); | |
| } // Sort keys to ensure stable retrieval from tree. | |
| var properties = Object.keys(key).sort(); // Tree by type to avoid conflicts on numeric object keys, empty value. | |
| var map = Array.isArray(key) ? _arrayTreeMap : _objectTreeMap; | |
| for (var i = 0; i < properties.length; i++) { | |
| var property = properties[i]; | |
| map = map.get(property); | |
| if (map === undefined) { | |
| return; | |
| } | |
| var propertyValue = key[property]; | |
| map = map.get(propertyValue); | |
| if (map === undefined) { | |
| return; | |
| } | |
| } | |
| var valuePair = map.get('_ekm_value'); | |
| if (!valuePair) { | |
| return; | |
| } // If reached, it implies that an object-like key was set with another | |
| // reference, so delete the reference and replace with the current. | |
| _map.delete(valuePair[0]); | |
| valuePair[0] = key; | |
| map.set('_ekm_value', valuePair); | |
| _map.set(key, valuePair); | |
| return valuePair; | |
| } | |
| /** | |
| * Variant of a Map object which enables lookup by equivalent (deeply equal) | |
| * object and array keys. | |
| */ | |
| var EquivalentKeyMap = | |
| /*#__PURE__*/ | |
| function () { | |
| /** | |
| * Constructs a new instance of EquivalentKeyMap. | |
| * | |
| * @param {Iterable.<*>} iterable Initial pair of key, value for map. | |
| */ | |
| function EquivalentKeyMap(iterable) { | |
| _classCallCheck(this, EquivalentKeyMap); | |
| this.clear(); | |
| if (iterable instanceof EquivalentKeyMap) { | |
| // Map#forEach is only means of iterating with support for IE11. | |
| var iterablePairs = []; | |
| iterable.forEach(function (value, key) { | |
| iterablePairs.push([key, value]); | |
| }); | |
| iterable = iterablePairs; | |
| } | |
| if (iterable != null) { | |
| for (var i = 0; i < iterable.length; i++) { | |
| this.set(iterable[i][0], iterable[i][1]); | |
| } | |
| } | |
| } | |
| /** | |
| * Accessor property returning the number of elements. | |
| * | |
| * @return {number} Number of elements. | |
| */ | |
| _createClass(EquivalentKeyMap, [{ | |
| key: "set", | |
| /** | |
| * Add or update an element with a specified key and value. | |
| * | |
| * @param {*} key The key of the element to add. | |
| * @param {*} value The value of the element to add. | |
| * | |
| * @return {EquivalentKeyMap} Map instance. | |
| */ | |
| value: function set(key, value) { | |
| // Shortcut non-object-like to set on internal Map. | |
| if (key === null || _typeof(key) !== 'object') { | |
| this._map.set(key, value); | |
| return this; | |
| } // Sort keys to ensure stable assignment into tree. | |
| var properties = Object.keys(key).sort(); | |
| var valuePair = [key, value]; // Tree by type to avoid conflicts on numeric object keys, empty value. | |
| var map = Array.isArray(key) ? this._arrayTreeMap : this._objectTreeMap; | |
| for (var i = 0; i < properties.length; i++) { | |
| var property = properties[i]; | |
| if (!map.has(property)) { | |
| map.set(property, new EquivalentKeyMap()); | |
| } | |
| map = map.get(property); | |
| var propertyValue = key[property]; | |
| if (!map.has(propertyValue)) { | |
| map.set(propertyValue, new EquivalentKeyMap()); | |
| } | |
| map = map.get(propertyValue); | |
| } // If an _ekm_value exists, there was already an equivalent key. Before | |
| // overriding, ensure that the old key reference is removed from map to | |
| // avoid memory leak of accumulating equivalent keys. This is, in a | |
| // sense, a poor man's WeakMap, while still enabling iterability. | |
| var previousValuePair = map.get('_ekm_value'); | |
| if (previousValuePair) { | |
| this._map.delete(previousValuePair[0]); | |
| } | |
| map.set('_ekm_value', valuePair); | |
| this._map.set(key, valuePair); | |
| return this; | |
| } | |
| /** | |
| * Returns a specified element. | |
| * | |
| * @param {*} key The key of the element to return. | |
| * | |
| * @return {?*} The element associated with the specified key or undefined | |
| * if the key can't be found. | |
| */ | |
| }, { | |
| key: "get", | |
| value: function get(key) { | |
| // Shortcut non-object-like to get from internal Map. | |
| if (key === null || _typeof(key) !== 'object') { | |
| return this._map.get(key); | |
| } | |
| var valuePair = getValuePair(this, key); | |
| if (valuePair) { | |
| return valuePair[1]; | |
| } | |
| } | |
| /** | |
| * Returns a boolean indicating whether an element with the specified key | |
| * exists or not. | |
| * | |
| * @param {*} key The key of the element to test for presence. | |
| * | |
| * @return {boolean} Whether an element with the specified key exists. | |
| */ | |
| }, { | |
| key: "has", | |
| value: function has(key) { | |
| if (key === null || _typeof(key) !== 'object') { | |
| return this._map.has(key); | |
| } // Test on the _presence_ of the pair, not its value, as even undefined | |
| // can be a valid member value for a key. | |
| return getValuePair(this, key) !== undefined; | |
| } | |
| /** | |
| * Removes the specified element. | |
| * | |
| * @param {*} key The key of the element to remove. | |
| * | |
| * @return {boolean} Returns true if an element existed and has been | |
| * removed, or false if the element does not exist. | |
| */ | |
| }, { | |
| key: "delete", | |
| value: function _delete(key) { | |
| if (!this.has(key)) { | |
| return false; | |
| } // This naive implementation will leave orphaned child trees. A better | |
| // implementation should traverse and remove orphans. | |
| this.set(key, undefined); | |
| return true; | |
| } | |
| /** | |
| * Executes a provided function once per each key/value pair, in insertion | |
| * order. | |
| * | |
| * @param {Function} callback Function to execute for each element. | |
| * @param {*} thisArg Value to use as `this` when executing | |
| * `callback`. | |
| */ | |
| }, { | |
| key: "forEach", | |
| value: function forEach(callback) { | |
| var _this = this; | |
| var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this; | |
| this._map.forEach(function (value, key) { | |
| // Unwrap value from object-like value pair. | |
| if (key !== null && _typeof(key) === 'object') { | |
| value = value[1]; | |
| } | |
| callback.call(thisArg, value, key, _this); | |
| }); | |
| } | |
| /** | |
| * Removes all elements. | |
| */ | |
| }, { | |
| key: "clear", | |
| value: function clear() { | |
| this._map = new Map(); | |
| this._arrayTreeMap = new Map(); | |
| this._objectTreeMap = new Map(); | |
| } | |
| }, { | |
| key: "size", | |
| get: function get() { | |
| return this._map.size; | |
| } | |
| }]); | |
| return EquivalentKeyMap; | |
| }(); | |
| module.exports = EquivalentKeyMap; | |
| /***/ }) | |
| /******/ }); | |
| /************************************************************************/ | |
| /******/ // The module cache | |
| /******/ var __webpack_module_cache__ = {}; | |
| /******/ | |
| /******/ // The require function | |
| /******/ function __webpack_require__(moduleId) { | |
| /******/ // Check if module is in cache | |
| /******/ var cachedModule = __webpack_module_cache__[moduleId]; | |
| /******/ if (cachedModule !== undefined) { | |
| /******/ return cachedModule.exports; | |
| /******/ } | |
| /******/ // Create a new module (and put it into the cache) | |
| /******/ var module = __webpack_module_cache__[moduleId] = { | |
| /******/ // no module.id needed | |
| /******/ // no module.loaded needed | |
| /******/ exports: {} | |
| /******/ }; | |
| /******/ | |
| /******/ // Execute the module function | |
| /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); | |
| /******/ | |
| /******/ // Return the exports of the module | |
| /******/ return module.exports; | |
| /******/ } | |
| /******/ | |
| /************************************************************************/ | |
| /******/ /* webpack/runtime/compat get default export */ | |
| /******/ (() => { | |
| /******/ // getDefaultExport function for compatibility with non-harmony modules | |
| /******/ __webpack_require__.n = (module) => { | |
| /******/ var getter = module && module.__esModule ? | |
| /******/ () => (module['default']) : | |
| /******/ () => (module); | |
| /******/ __webpack_require__.d(getter, { a: getter }); | |
| /******/ return getter; | |
| /******/ }; | |
| /******/ })(); | |
| /******/ | |
| /******/ /* webpack/runtime/define property getters */ | |
| /******/ (() => { | |
| /******/ // define getter functions for harmony exports | |
| /******/ __webpack_require__.d = (exports, definition) => { | |
| /******/ for(var key in definition) { | |
| /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { | |
| /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); | |
| /******/ } | |
| /******/ } | |
| /******/ }; | |
| /******/ })(); | |
| /******/ | |
| /******/ /* webpack/runtime/hasOwnProperty shorthand */ | |
| /******/ (() => { | |
| /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) | |
| /******/ })(); | |
| /******/ | |
| /******/ /* webpack/runtime/make namespace object */ | |
| /******/ (() => { | |
| /******/ // define __esModule on exports | |
| /******/ __webpack_require__.r = (exports) => { | |
| /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { | |
| /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | |
| /******/ } | |
| /******/ Object.defineProperty(exports, '__esModule', { value: true }); | |
| /******/ }; | |
| /******/ })(); | |
| /******/ | |
| /************************************************************************/ | |
| var __webpack_exports__ = {}; | |
| // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. | |
| (() => { | |
| // ESM COMPAT FLAG | |
| __webpack_require__.r(__webpack_exports__); | |
| // EXPORTS | |
| __webpack_require__.d(__webpack_exports__, { | |
| AsyncModeProvider: () => (/* reexport */ async_mode_provider_context), | |
| RegistryConsumer: () => (/* reexport */ RegistryConsumer), | |
| RegistryProvider: () => (/* reexport */ context), | |
| combineReducers: () => (/* binding */ build_module_combineReducers), | |
| controls: () => (/* reexport */ controls), | |
| createReduxStore: () => (/* reexport */ createReduxStore), | |
| createRegistry: () => (/* reexport */ createRegistry), | |
| createRegistryControl: () => (/* reexport */ createRegistryControl), | |
| createRegistrySelector: () => (/* reexport */ createRegistrySelector), | |
| createSelector: () => (/* reexport */ rememo), | |
| dispatch: () => (/* reexport */ dispatch_dispatch), | |
| plugins: () => (/* reexport */ plugins_namespaceObject), | |
| register: () => (/* binding */ register), | |
| registerGenericStore: () => (/* binding */ registerGenericStore), | |
| registerStore: () => (/* binding */ registerStore), | |
| resolveSelect: () => (/* binding */ build_module_resolveSelect), | |
| select: () => (/* reexport */ select_select), | |
| subscribe: () => (/* binding */ subscribe), | |
| suspendSelect: () => (/* binding */ suspendSelect), | |
| use: () => (/* binding */ use), | |
| useDispatch: () => (/* reexport */ use_dispatch), | |
| useRegistry: () => (/* reexport */ useRegistry), | |
| useSelect: () => (/* reexport */ useSelect), | |
| useSuspenseSelect: () => (/* reexport */ useSuspenseSelect), | |
| withDispatch: () => (/* reexport */ with_dispatch), | |
| withRegistry: () => (/* reexport */ with_registry), | |
| withSelect: () => (/* reexport */ with_select) | |
| }); | |
| // NAMESPACE OBJECT: ./node_modules/@wordpress/data/build-module/redux-store/metadata/selectors.js | |
| var selectors_namespaceObject = {}; | |
| __webpack_require__.r(selectors_namespaceObject); | |
| __webpack_require__.d(selectors_namespaceObject, { | |
| countSelectorsByStatus: () => (countSelectorsByStatus), | |
| getCachedResolvers: () => (getCachedResolvers), | |
| getIsResolving: () => (getIsResolving), | |
| getResolutionError: () => (getResolutionError), | |
| getResolutionState: () => (getResolutionState), | |
| hasFinishedResolution: () => (hasFinishedResolution), | |
| hasResolutionFailed: () => (hasResolutionFailed), | |
| hasResolvingSelectors: () => (hasResolvingSelectors), | |
| hasStartedResolution: () => (hasStartedResolution), | |
| isResolving: () => (isResolving) | |
| }); | |
| // NAMESPACE OBJECT: ./node_modules/@wordpress/data/build-module/redux-store/metadata/actions.js | |
| var actions_namespaceObject = {}; | |
| __webpack_require__.r(actions_namespaceObject); | |
| __webpack_require__.d(actions_namespaceObject, { | |
| failResolution: () => (failResolution), | |
| failResolutions: () => (failResolutions), | |
| finishResolution: () => (finishResolution), | |
| finishResolutions: () => (finishResolutions), | |
| invalidateResolution: () => (invalidateResolution), | |
| invalidateResolutionForStore: () => (invalidateResolutionForStore), | |
| invalidateResolutionForStoreSelector: () => (invalidateResolutionForStoreSelector), | |
| startResolution: () => (startResolution), | |
| startResolutions: () => (startResolutions) | |
| }); | |
| // NAMESPACE OBJECT: ./node_modules/@wordpress/data/build-module/plugins/index.js | |
| var plugins_namespaceObject = {}; | |
| __webpack_require__.r(plugins_namespaceObject); | |
| __webpack_require__.d(plugins_namespaceObject, { | |
| persistence: () => (persistence) | |
| }); | |
| ;// CONCATENATED MODULE: external ["wp","deprecated"] | |
| const external_wp_deprecated_namespaceObject = window["wp"]["deprecated"]; | |
| var external_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_wp_deprecated_namespaceObject); | |
| ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js | |
| function _typeof(o) { | |
| "@babel/helpers - typeof"; | |
| return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { | |
| return typeof o; | |
| } : function (o) { | |
| return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; | |
| }, _typeof(o); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toPrimitive.js | |
| function _toPrimitive(input, hint) { | |
| if (_typeof(input) !== "object" || input === null) return input; | |
| var prim = input[Symbol.toPrimitive]; | |
| if (prim !== undefined) { | |
| var res = prim.call(input, hint || "default"); | |
| if (_typeof(res) !== "object") return res; | |
| throw new TypeError("@@toPrimitive must return a primitive value."); | |
| } | |
| return (hint === "string" ? String : Number)(input); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toPropertyKey.js | |
| function _toPropertyKey(arg) { | |
| var key = _toPrimitive(arg, "string"); | |
| return _typeof(key) === "symbol" ? key : String(key); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js | |
| function _defineProperty(obj, key, value) { | |
| key = _toPropertyKey(key); | |
| if (key in obj) { | |
| Object.defineProperty(obj, key, { | |
| value: value, | |
| enumerable: true, | |
| configurable: true, | |
| writable: true | |
| }); | |
| } else { | |
| obj[key] = value; | |
| } | |
| return obj; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js | |
| function ownKeys(e, r) { | |
| var t = Object.keys(e); | |
| if (Object.getOwnPropertySymbols) { | |
| var o = Object.getOwnPropertySymbols(e); | |
| r && (o = o.filter(function (r) { | |
| return Object.getOwnPropertyDescriptor(e, r).enumerable; | |
| })), t.push.apply(t, o); | |
| } | |
| return t; | |
| } | |
| function _objectSpread2(e) { | |
| for (var r = 1; r < arguments.length; r++) { | |
| var t = null != arguments[r] ? arguments[r] : {}; | |
| r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { | |
| _defineProperty(e, r, t[r]); | |
| }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { | |
| Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); | |
| }); | |
| } | |
| return e; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/redux/es/redux.js | |
| /** | |
| * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js | |
| * | |
| * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes | |
| * during build. | |
| * @param {number} code | |
| */ | |
| function formatProdErrorMessage(code) { | |
| return "Minified Redux error #" + code + "; visit https://redux.js.org/Errors?code=" + code + " for the full message or " + 'use the non-minified dev environment for full errors. '; | |
| } | |
| // Inlined version of the `symbol-observable` polyfill | |
| var $$observable = (function () { | |
| return typeof Symbol === 'function' && Symbol.observable || '@@observable'; | |
| })(); | |
| /** | |
| * These are private action types reserved by Redux. | |
| * For any unknown actions, you must return the current state. | |
| * If the current state is undefined, you must return the initial state. | |
| * Do not reference these action types directly in your code. | |
| */ | |
| var randomString = function randomString() { | |
| return Math.random().toString(36).substring(7).split('').join('.'); | |
| }; | |
| var ActionTypes = { | |
| INIT: "@@redux/INIT" + randomString(), | |
| REPLACE: "@@redux/REPLACE" + randomString(), | |
| PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() { | |
| return "@@redux/PROBE_UNKNOWN_ACTION" + randomString(); | |
| } | |
| }; | |
| /** | |
| * @param {any} obj The object to inspect. | |
| * @returns {boolean} True if the argument appears to be a plain object. | |
| */ | |
| function isPlainObject(obj) { | |
| if (typeof obj !== 'object' || obj === null) return false; | |
| var proto = obj; | |
| while (Object.getPrototypeOf(proto) !== null) { | |
| proto = Object.getPrototypeOf(proto); | |
| } | |
| return Object.getPrototypeOf(obj) === proto; | |
| } | |
| // Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of | |
| function miniKindOf(val) { | |
| if (val === void 0) return 'undefined'; | |
| if (val === null) return 'null'; | |
| var type = typeof val; | |
| switch (type) { | |
| case 'boolean': | |
| case 'string': | |
| case 'number': | |
| case 'symbol': | |
| case 'function': | |
| { | |
| return type; | |
| } | |
| } | |
| if (Array.isArray(val)) return 'array'; | |
| if (isDate(val)) return 'date'; | |
| if (isError(val)) return 'error'; | |
| var constructorName = ctorName(val); | |
| switch (constructorName) { | |
| case 'Symbol': | |
| case 'Promise': | |
| case 'WeakMap': | |
| case 'WeakSet': | |
| case 'Map': | |
| case 'Set': | |
| return constructorName; | |
| } // other | |
| return type.slice(8, -1).toLowerCase().replace(/\s/g, ''); | |
| } | |
| function ctorName(val) { | |
| return typeof val.constructor === 'function' ? val.constructor.name : null; | |
| } | |
| function isError(val) { | |
| return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number'; | |
| } | |
| function isDate(val) { | |
| if (val instanceof Date) return true; | |
| return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function'; | |
| } | |
| function kindOf(val) { | |
| var typeOfVal = typeof val; | |
| if (false) {} | |
| return typeOfVal; | |
| } | |
| /** | |
| * @deprecated | |
| * | |
| * **We recommend using the `configureStore` method | |
| * of the `@reduxjs/toolkit` package**, which replaces `createStore`. | |
| * | |
| * Redux Toolkit is our recommended approach for writing Redux logic today, | |
| * including store setup, reducers, data fetching, and more. | |
| * | |
| * **For more details, please read this Redux docs page:** | |
| * **https://redux.js.org/introduction/why-rtk-is-redux-today** | |
| * | |
| * `configureStore` from Redux Toolkit is an improved version of `createStore` that | |
| * simplifies setup and helps avoid common bugs. | |
| * | |
| * You should not be using the `redux` core package by itself today, except for learning purposes. | |
| * The `createStore` method from the core `redux` package will not be removed, but we encourage | |
| * all users to migrate to using Redux Toolkit for all Redux code. | |
| * | |
| * If you want to use `createStore` without this visual deprecation warning, use | |
| * the `legacy_createStore` import instead: | |
| * | |
| * `import { legacy_createStore as createStore} from 'redux'` | |
| * | |
| */ | |
| function createStore(reducer, preloadedState, enhancer) { | |
| var _ref2; | |
| if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') { | |
| throw new Error( true ? formatProdErrorMessage(0) : 0); | |
| } | |
| if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') { | |
| enhancer = preloadedState; | |
| preloadedState = undefined; | |
| } | |
| if (typeof enhancer !== 'undefined') { | |
| if (typeof enhancer !== 'function') { | |
| throw new Error( true ? formatProdErrorMessage(1) : 0); | |
| } | |
| return enhancer(createStore)(reducer, preloadedState); | |
| } | |
| if (typeof reducer !== 'function') { | |
| throw new Error( true ? formatProdErrorMessage(2) : 0); | |
| } | |
| var currentReducer = reducer; | |
| var currentState = preloadedState; | |
| var currentListeners = []; | |
| var nextListeners = currentListeners; | |
| var isDispatching = false; | |
| /** | |
| * This makes a shallow copy of currentListeners so we can use | |
| * nextListeners as a temporary list while dispatching. | |
| * | |
| * This prevents any bugs around consumers calling | |
| * subscribe/unsubscribe in the middle of a dispatch. | |
| */ | |
| function ensureCanMutateNextListeners() { | |
| if (nextListeners === currentListeners) { | |
| nextListeners = currentListeners.slice(); | |
| } | |
| } | |
| /** | |
| * Reads the state tree managed by the store. | |
| * | |
| * @returns {any} The current state tree of your application. | |
| */ | |
| function getState() { | |
| if (isDispatching) { | |
| throw new Error( true ? formatProdErrorMessage(3) : 0); | |
| } | |
| return currentState; | |
| } | |
| /** | |
| * Adds a change listener. It will be called any time an action is dispatched, | |
| * and some part of the state tree may potentially have changed. You may then | |
| * call `getState()` to read the current state tree inside the callback. | |
| * | |
| * You may call `dispatch()` from a change listener, with the following | |
| * caveats: | |
| * | |
| * 1. The subscriptions are snapshotted just before every `dispatch()` call. | |
| * If you subscribe or unsubscribe while the listeners are being invoked, this | |
| * will not have any effect on the `dispatch()` that is currently in progress. | |
| * However, the next `dispatch()` call, whether nested or not, will use a more | |
| * recent snapshot of the subscription list. | |
| * | |
| * 2. The listener should not expect to see all state changes, as the state | |
| * might have been updated multiple times during a nested `dispatch()` before | |
| * the listener is called. It is, however, guaranteed that all subscribers | |
| * registered before the `dispatch()` started will be called with the latest | |
| * state by the time it exits. | |
| * | |
| * @param {Function} listener A callback to be invoked on every dispatch. | |
| * @returns {Function} A function to remove this change listener. | |
| */ | |
| function subscribe(listener) { | |
| if (typeof listener !== 'function') { | |
| throw new Error( true ? formatProdErrorMessage(4) : 0); | |
| } | |
| if (isDispatching) { | |
| throw new Error( true ? formatProdErrorMessage(5) : 0); | |
| } | |
| var isSubscribed = true; | |
| ensureCanMutateNextListeners(); | |
| nextListeners.push(listener); | |
| return function unsubscribe() { | |
| if (!isSubscribed) { | |
| return; | |
| } | |
| if (isDispatching) { | |
| throw new Error( true ? formatProdErrorMessage(6) : 0); | |
| } | |
| isSubscribed = false; | |
| ensureCanMutateNextListeners(); | |
| var index = nextListeners.indexOf(listener); | |
| nextListeners.splice(index, 1); | |
| currentListeners = null; | |
| }; | |
| } | |
| /** | |
| * Dispatches an action. It is the only way to trigger a state change. | |
| * | |
| * The `reducer` function, used to create the store, will be called with the | |
| * current state tree and the given `action`. Its return value will | |
| * be considered the **next** state of the tree, and the change listeners | |
| * will be notified. | |
| * | |
| * The base implementation only supports plain object actions. If you want to | |
| * dispatch a Promise, an Observable, a thunk, or something else, you need to | |
| * wrap your store creating function into the corresponding middleware. For | |
| * example, see the documentation for the `redux-thunk` package. Even the | |
| * middleware will eventually dispatch plain object actions using this method. | |
| * | |
| * @param {Object} action A plain object representing “what changed”. It is | |
| * a good idea to keep actions serializable so you can record and replay user | |
| * sessions, or use the time travelling `redux-devtools`. An action must have | |
| * a `type` property which may not be `undefined`. It is a good idea to use | |
| * string constants for action types. | |
| * | |
| * @returns {Object} For convenience, the same action object you dispatched. | |
| * | |
| * Note that, if you use a custom middleware, it may wrap `dispatch()` to | |
| * return something else (for example, a Promise you can await). | |
| */ | |
| function dispatch(action) { | |
| if (!isPlainObject(action)) { | |
| throw new Error( true ? formatProdErrorMessage(7) : 0); | |
| } | |
| if (typeof action.type === 'undefined') { | |
| throw new Error( true ? formatProdErrorMessage(8) : 0); | |
| } | |
| if (isDispatching) { | |
| throw new Error( true ? formatProdErrorMessage(9) : 0); | |
| } | |
| try { | |
| isDispatching = true; | |
| currentState = currentReducer(currentState, action); | |
| } finally { | |
| isDispatching = false; | |
| } | |
| var listeners = currentListeners = nextListeners; | |
| for (var i = 0; i < listeners.length; i++) { | |
| var listener = listeners[i]; | |
| listener(); | |
| } | |
| return action; | |
| } | |
| /** | |
| * Replaces the reducer currently used by the store to calculate the state. | |
| * | |
| * You might need this if your app implements code splitting and you want to | |
| * load some of the reducers dynamically. You might also need this if you | |
| * implement a hot reloading mechanism for Redux. | |
| * | |
| * @param {Function} nextReducer The reducer for the store to use instead. | |
| * @returns {void} | |
| */ | |
| function replaceReducer(nextReducer) { | |
| if (typeof nextReducer !== 'function') { | |
| throw new Error( true ? formatProdErrorMessage(10) : 0); | |
| } | |
| currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT. | |
| // Any reducers that existed in both the new and old rootReducer | |
| // will receive the previous state. This effectively populates | |
| // the new state tree with any relevant data from the old one. | |
| dispatch({ | |
| type: ActionTypes.REPLACE | |
| }); | |
| } | |
| /** | |
| * Interoperability point for observable/reactive libraries. | |
| * @returns {observable} A minimal observable of state changes. | |
| * For more information, see the observable proposal: | |
| * https://github.com/tc39/proposal-observable | |
| */ | |
| function observable() { | |
| var _ref; | |
| var outerSubscribe = subscribe; | |
| return _ref = { | |
| /** | |
| * The minimal observable subscription method. | |
| * @param {Object} observer Any object that can be used as an observer. | |
| * The observer object should have a `next` method. | |
| * @returns {subscription} An object with an `unsubscribe` method that can | |
| * be used to unsubscribe the observable from the store, and prevent further | |
| * emission of values from the observable. | |
| */ | |
| subscribe: function subscribe(observer) { | |
| if (typeof observer !== 'object' || observer === null) { | |
| throw new Error( true ? formatProdErrorMessage(11) : 0); | |
| } | |
| function observeState() { | |
| if (observer.next) { | |
| observer.next(getState()); | |
| } | |
| } | |
| observeState(); | |
| var unsubscribe = outerSubscribe(observeState); | |
| return { | |
| unsubscribe: unsubscribe | |
| }; | |
| } | |
| }, _ref[$$observable] = function () { | |
| return this; | |
| }, _ref; | |
| } // When a store is created, an "INIT" action is dispatched so that every | |
| // reducer returns their initial state. This effectively populates | |
| // the initial state tree. | |
| dispatch({ | |
| type: ActionTypes.INIT | |
| }); | |
| return _ref2 = { | |
| dispatch: dispatch, | |
| subscribe: subscribe, | |
| getState: getState, | |
| replaceReducer: replaceReducer | |
| }, _ref2[$$observable] = observable, _ref2; | |
| } | |
| /** | |
| * Creates a Redux store that holds the state tree. | |
| * | |
| * **We recommend using `configureStore` from the | |
| * `@reduxjs/toolkit` package**, which replaces `createStore`: | |
| * **https://redux.js.org/introduction/why-rtk-is-redux-today** | |
| * | |
| * The only way to change the data in the store is to call `dispatch()` on it. | |
| * | |
| * There should only be a single store in your app. To specify how different | |
| * parts of the state tree respond to actions, you may combine several reducers | |
| * into a single reducer function by using `combineReducers`. | |
| * | |
| * @param {Function} reducer A function that returns the next state tree, given | |
| * the current state tree and the action to handle. | |
| * | |
| * @param {any} [preloadedState] The initial state. You may optionally specify it | |
| * to hydrate the state from the server in universal apps, or to restore a | |
| * previously serialized user session. | |
| * If you use `combineReducers` to produce the root reducer function, this must be | |
| * an object with the same shape as `combineReducers` keys. | |
| * | |
| * @param {Function} [enhancer] The store enhancer. You may optionally specify it | |
| * to enhance the store with third-party capabilities such as middleware, | |
| * time travel, persistence, etc. The only store enhancer that ships with Redux | |
| * is `applyMiddleware()`. | |
| * | |
| * @returns {Store} A Redux store that lets you read the state, dispatch actions | |
| * and subscribe to changes. | |
| */ | |
| var legacy_createStore = (/* unused pure expression or super */ null && (createStore)); | |
| /** | |
| * Prints a warning in the console if it exists. | |
| * | |
| * @param {String} message The warning message. | |
| * @returns {void} | |
| */ | |
| function warning(message) { | |
| /* eslint-disable no-console */ | |
| if (typeof console !== 'undefined' && typeof console.error === 'function') { | |
| console.error(message); | |
| } | |
| /* eslint-enable no-console */ | |
| try { | |
| // This error was thrown as a convenience so that if you enable | |
| // "break on all exceptions" in your console, | |
| // it would pause the execution at this line. | |
| throw new Error(message); | |
| } catch (e) {} // eslint-disable-line no-empty | |
| } | |
| function getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) { | |
| var reducerKeys = Object.keys(reducers); | |
| var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer'; | |
| if (reducerKeys.length === 0) { | |
| return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'; | |
| } | |
| if (!isPlainObject(inputState)) { | |
| return "The " + argumentName + " has unexpected type of \"" + kindOf(inputState) + "\". Expected argument to be an object with the following " + ("keys: \"" + reducerKeys.join('", "') + "\""); | |
| } | |
| var unexpectedKeys = Object.keys(inputState).filter(function (key) { | |
| return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key]; | |
| }); | |
| unexpectedKeys.forEach(function (key) { | |
| unexpectedKeyCache[key] = true; | |
| }); | |
| if (action && action.type === ActionTypes.REPLACE) return; | |
| if (unexpectedKeys.length > 0) { | |
| return "Unexpected " + (unexpectedKeys.length > 1 ? 'keys' : 'key') + " " + ("\"" + unexpectedKeys.join('", "') + "\" found in " + argumentName + ". ") + "Expected to find one of the known reducer keys instead: " + ("\"" + reducerKeys.join('", "') + "\". Unexpected keys will be ignored."); | |
| } | |
| } | |
| function assertReducerShape(reducers) { | |
| Object.keys(reducers).forEach(function (key) { | |
| var reducer = reducers[key]; | |
| var initialState = reducer(undefined, { | |
| type: ActionTypes.INIT | |
| }); | |
| if (typeof initialState === 'undefined') { | |
| throw new Error( true ? formatProdErrorMessage(12) : 0); | |
| } | |
| if (typeof reducer(undefined, { | |
| type: ActionTypes.PROBE_UNKNOWN_ACTION() | |
| }) === 'undefined') { | |
| throw new Error( true ? formatProdErrorMessage(13) : 0); | |
| } | |
| }); | |
| } | |
| /** | |
| * Turns an object whose values are different reducer functions, into a single | |
| * reducer function. It will call every child reducer, and gather their results | |
| * into a single state object, whose keys correspond to the keys of the passed | |
| * reducer functions. | |
| * | |
| * @param {Object} reducers An object whose values correspond to different | |
| * reducer functions that need to be combined into one. One handy way to obtain | |
| * it is to use ES6 `import * as reducers` syntax. The reducers may never return | |
| * undefined for any action. Instead, they should return their initial state | |
| * if the state passed to them was undefined, and the current state for any | |
| * unrecognized action. | |
| * | |
| * @returns {Function} A reducer function that invokes every reducer inside the | |
| * passed object, and builds a state object with the same shape. | |
| */ | |
| function combineReducers(reducers) { | |
| var reducerKeys = Object.keys(reducers); | |
| var finalReducers = {}; | |
| for (var i = 0; i < reducerKeys.length; i++) { | |
| var key = reducerKeys[i]; | |
| if (false) {} | |
| if (typeof reducers[key] === 'function') { | |
| finalReducers[key] = reducers[key]; | |
| } | |
| } | |
| var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same | |
| // keys multiple times. | |
| var unexpectedKeyCache; | |
| if (false) {} | |
| var shapeAssertionError; | |
| try { | |
| assertReducerShape(finalReducers); | |
| } catch (e) { | |
| shapeAssertionError = e; | |
| } | |
| return function combination(state, action) { | |
| if (state === void 0) { | |
| state = {}; | |
| } | |
| if (shapeAssertionError) { | |
| throw shapeAssertionError; | |
| } | |
| if (false) { var warningMessage; } | |
| var hasChanged = false; | |
| var nextState = {}; | |
| for (var _i = 0; _i < finalReducerKeys.length; _i++) { | |
| var _key = finalReducerKeys[_i]; | |
| var reducer = finalReducers[_key]; | |
| var previousStateForKey = state[_key]; | |
| var nextStateForKey = reducer(previousStateForKey, action); | |
| if (typeof nextStateForKey === 'undefined') { | |
| var actionType = action && action.type; | |
| throw new Error( true ? formatProdErrorMessage(14) : 0); | |
| } | |
| nextState[_key] = nextStateForKey; | |
| hasChanged = hasChanged || nextStateForKey !== previousStateForKey; | |
| } | |
| hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length; | |
| return hasChanged ? nextState : state; | |
| }; | |
| } | |
| function bindActionCreator(actionCreator, dispatch) { | |
| return function () { | |
| return dispatch(actionCreator.apply(this, arguments)); | |
| }; | |
| } | |
| /** | |
| * Turns an object whose values are action creators, into an object with the | |
| * same keys, but with every function wrapped into a `dispatch` call so they | |
| * may be invoked directly. This is just a convenience method, as you can call | |
| * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. | |
| * | |
| * For convenience, you can also pass an action creator as the first argument, | |
| * and get a dispatch wrapped function in return. | |
| * | |
| * @param {Function|Object} actionCreators An object whose values are action | |
| * creator functions. One handy way to obtain it is to use ES6 `import * as` | |
| * syntax. You may also pass a single function. | |
| * | |
| * @param {Function} dispatch The `dispatch` function available on your Redux | |
| * store. | |
| * | |
| * @returns {Function|Object} The object mimicking the original object, but with | |
| * every action creator wrapped into the `dispatch` call. If you passed a | |
| * function as `actionCreators`, the return value will also be a single | |
| * function. | |
| */ | |
| function bindActionCreators(actionCreators, dispatch) { | |
| if (typeof actionCreators === 'function') { | |
| return bindActionCreator(actionCreators, dispatch); | |
| } | |
| if (typeof actionCreators !== 'object' || actionCreators === null) { | |
| throw new Error( true ? formatProdErrorMessage(16) : 0); | |
| } | |
| var boundActionCreators = {}; | |
| for (var key in actionCreators) { | |
| var actionCreator = actionCreators[key]; | |
| if (typeof actionCreator === 'function') { | |
| boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); | |
| } | |
| } | |
| return boundActionCreators; | |
| } | |
| /** | |
| * Composes single-argument functions from right to left. The rightmost | |
| * function can take multiple arguments as it provides the signature for | |
| * the resulting composite function. | |
| * | |
| * @param {...Function} funcs The functions to compose. | |
| * @returns {Function} A function obtained by composing the argument functions | |
| * from right to left. For example, compose(f, g, h) is identical to doing | |
| * (...args) => f(g(h(...args))). | |
| */ | |
| function compose() { | |
| for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) { | |
| funcs[_key] = arguments[_key]; | |
| } | |
| if (funcs.length === 0) { | |
| return function (arg) { | |
| return arg; | |
| }; | |
| } | |
| if (funcs.length === 1) { | |
| return funcs[0]; | |
| } | |
| return funcs.reduce(function (a, b) { | |
| return function () { | |
| return a(b.apply(void 0, arguments)); | |
| }; | |
| }); | |
| } | |
| /** | |
| * Creates a store enhancer that applies middleware to the dispatch method | |
| * of the Redux store. This is handy for a variety of tasks, such as expressing | |
| * asynchronous actions in a concise manner, or logging every action payload. | |
| * | |
| * See `redux-thunk` package as an example of the Redux middleware. | |
| * | |
| * Because middleware is potentially asynchronous, this should be the first | |
| * store enhancer in the composition chain. | |
| * | |
| * Note that each middleware will be given the `dispatch` and `getState` functions | |
| * as named arguments. | |
| * | |
| * @param {...Function} middlewares The middleware chain to be applied. | |
| * @returns {Function} A store enhancer applying the middleware. | |
| */ | |
| function applyMiddleware() { | |
| for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) { | |
| middlewares[_key] = arguments[_key]; | |
| } | |
| return function (createStore) { | |
| return function () { | |
| var store = createStore.apply(void 0, arguments); | |
| var _dispatch = function dispatch() { | |
| throw new Error( true ? formatProdErrorMessage(15) : 0); | |
| }; | |
| var middlewareAPI = { | |
| getState: store.getState, | |
| dispatch: function dispatch() { | |
| return _dispatch.apply(void 0, arguments); | |
| } | |
| }; | |
| var chain = middlewares.map(function (middleware) { | |
| return middleware(middlewareAPI); | |
| }); | |
| _dispatch = compose.apply(void 0, chain)(store.dispatch); | |
| return _objectSpread2(_objectSpread2({}, store), {}, { | |
| dispatch: _dispatch | |
| }); | |
| }; | |
| }; | |
| } | |
| // EXTERNAL MODULE: ./node_modules/equivalent-key-map/equivalent-key-map.js | |
| var equivalent_key_map = __webpack_require__(3249); | |
| var equivalent_key_map_default = /*#__PURE__*/__webpack_require__.n(equivalent_key_map); | |
| ;// CONCATENATED MODULE: external ["wp","reduxRoutine"] | |
| const external_wp_reduxRoutine_namespaceObject = window["wp"]["reduxRoutine"]; | |
| var external_wp_reduxRoutine_default = /*#__PURE__*/__webpack_require__.n(external_wp_reduxRoutine_namespaceObject); | |
| ;// CONCATENATED MODULE: external ["wp","compose"] | |
| const external_wp_compose_namespaceObject = window["wp"]["compose"]; | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/combine-reducers.js | |
| function combine_reducers_combineReducers(reducers) { | |
| const keys = Object.keys(reducers); | |
| return function combinedReducer(state = {}, action) { | |
| const nextState = {}; | |
| let hasChanged = false; | |
| for (const key of keys) { | |
| const reducer = reducers[key]; | |
| const prevStateForKey = state[key]; | |
| const nextStateForKey = reducer(prevStateForKey, action); | |
| nextState[key] = nextStateForKey; | |
| hasChanged = hasChanged || nextStateForKey !== prevStateForKey; | |
| } | |
| return hasChanged ? nextState : state; | |
| }; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/factory.js | |
| /** | |
| * Creates a selector function that takes additional curried argument with the | |
| * registry `select` function. While a regular selector has signature | |
| * ```js | |
| * ( state, ...selectorArgs ) => ( result ) | |
| * ``` | |
| * that allows to select data from the store's `state`, a registry selector | |
| * has signature: | |
| * ```js | |
| * ( select ) => ( state, ...selectorArgs ) => ( result ) | |
| * ``` | |
| * that supports also selecting from other registered stores. | |
| * | |
| * @example | |
| * ```js | |
| * import { store as coreStore } from '@wordpress/core-data'; | |
| * import { store as editorStore } from '@wordpress/editor'; | |
| * | |
| * const getCurrentPostId = createRegistrySelector( ( select ) => ( state ) => { | |
| * return select( editorStore ).getCurrentPostId(); | |
| * } ); | |
| * | |
| * const getPostEdits = createRegistrySelector( ( select ) => ( state ) => { | |
| * // calling another registry selector just like any other function | |
| * const postType = getCurrentPostType( state ); | |
| * const postId = getCurrentPostId( state ); | |
| * return select( coreStore ).getEntityRecordEdits( 'postType', postType, postId ); | |
| * } ); | |
| * ``` | |
| * | |
| * Note how the `getCurrentPostId` selector can be called just like any other function, | |
| * (it works even inside a regular non-registry selector) and we don't need to pass the | |
| * registry as argument. The registry binding happens automatically when registering the selector | |
| * with a store. | |
| * | |
| * @param {Function} registrySelector Function receiving a registry `select` | |
| * function and returning a state selector. | |
| * | |
| * @return {Function} Registry selector that can be registered with a store. | |
| */ | |
| function createRegistrySelector(registrySelector) { | |
| const selectorsByRegistry = new WeakMap(); | |
| // Create a selector function that is bound to the registry referenced by `selector.registry` | |
| // and that has the same API as a regular selector. Binding it in such a way makes it | |
| // possible to call the selector directly from another selector. | |
| const wrappedSelector = (...args) => { | |
| let selector = selectorsByRegistry.get(wrappedSelector.registry); | |
| // We want to make sure the cache persists even when new registry | |
| // instances are created. For example patterns create their own editors | |
| // with their own core/block-editor stores, so we should keep track of | |
| // the cache for each registry instance. | |
| if (!selector) { | |
| selector = registrySelector(wrappedSelector.registry.select); | |
| selectorsByRegistry.set(wrappedSelector.registry, selector); | |
| } | |
| return selector(...args); | |
| }; | |
| /** | |
| * Flag indicating that the selector is a registry selector that needs the correct registry | |
| * reference to be assigned to `selector.registry` to make it work correctly. | |
| * be mapped as a registry selector. | |
| * | |
| * @type {boolean} | |
| */ | |
| wrappedSelector.isRegistrySelector = true; | |
| return wrappedSelector; | |
| } | |
| /** | |
| * Creates a control function that takes additional curried argument with the `registry` object. | |
| * While a regular control has signature | |
| * ```js | |
| * ( action ) => ( iteratorOrPromise ) | |
| * ``` | |
| * where the control works with the `action` that it's bound to, a registry control has signature: | |
| * ```js | |
| * ( registry ) => ( action ) => ( iteratorOrPromise ) | |
| * ``` | |
| * A registry control is typically used to select data or dispatch an action to a registered | |
| * store. | |
| * | |
| * When registering a control created with `createRegistryControl` with a store, the store | |
| * knows which calling convention to use when executing the control. | |
| * | |
| * @param {Function} registryControl Function receiving a registry object and returning a control. | |
| * | |
| * @return {Function} Registry control that can be registered with a store. | |
| */ | |
| function createRegistryControl(registryControl) { | |
| registryControl.isRegistryControl = true; | |
| return registryControl; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/controls.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('./types').StoreDescriptor} StoreDescriptor */ | |
| const SELECT = '@@data/SELECT'; | |
| const RESOLVE_SELECT = '@@data/RESOLVE_SELECT'; | |
| const DISPATCH = '@@data/DISPATCH'; | |
| function isObject(object) { | |
| return object !== null && typeof object === 'object'; | |
| } | |
| /** | |
| * Dispatches a control action for triggering a synchronous registry select. | |
| * | |
| * Note: This control synchronously returns the current selector value, triggering the | |
| * resolution, but not waiting for it. | |
| * | |
| * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store | |
| * @param {string} selectorName The name of the selector. | |
| * @param {Array} args Arguments for the selector. | |
| * | |
| * @example | |
| * ```js | |
| * import { controls } from '@wordpress/data'; | |
| * | |
| * // Action generator using `select`. | |
| * export function* myAction() { | |
| * const isEditorSideBarOpened = yield controls.select( 'core/edit-post', 'isEditorSideBarOpened' ); | |
| * // Do stuff with the result from the `select`. | |
| * } | |
| * ``` | |
| * | |
| * @return {Object} The control descriptor. | |
| */ | |
| function controls_select(storeNameOrDescriptor, selectorName, ...args) { | |
| return { | |
| type: SELECT, | |
| storeKey: isObject(storeNameOrDescriptor) ? storeNameOrDescriptor.name : storeNameOrDescriptor, | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Dispatches a control action for triggering and resolving a registry select. | |
| * | |
| * Note: when this control action is handled, it automatically considers | |
| * selectors that may have a resolver. In such case, it will return a `Promise` that resolves | |
| * after the selector finishes resolving, with the final result value. | |
| * | |
| * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store | |
| * @param {string} selectorName The name of the selector | |
| * @param {Array} args Arguments for the selector. | |
| * | |
| * @example | |
| * ```js | |
| * import { controls } from '@wordpress/data'; | |
| * | |
| * // Action generator using resolveSelect | |
| * export function* myAction() { | |
| * const isSidebarOpened = yield controls.resolveSelect( 'core/edit-post', 'isEditorSideBarOpened' ); | |
| * // do stuff with the result from the select. | |
| * } | |
| * ``` | |
| * | |
| * @return {Object} The control descriptor. | |
| */ | |
| function resolveSelect(storeNameOrDescriptor, selectorName, ...args) { | |
| return { | |
| type: RESOLVE_SELECT, | |
| storeKey: isObject(storeNameOrDescriptor) ? storeNameOrDescriptor.name : storeNameOrDescriptor, | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Dispatches a control action for triggering a registry dispatch. | |
| * | |
| * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store | |
| * @param {string} actionName The name of the action to dispatch | |
| * @param {Array} args Arguments for the dispatch action. | |
| * | |
| * @example | |
| * ```js | |
| * import { controls } from '@wordpress/data-controls'; | |
| * | |
| * // Action generator using dispatch | |
| * export function* myAction() { | |
| * yield controls.dispatch( 'core/editor', 'togglePublishSidebar' ); | |
| * // do some other things. | |
| * } | |
| * ``` | |
| * | |
| * @return {Object} The control descriptor. | |
| */ | |
| function dispatch(storeNameOrDescriptor, actionName, ...args) { | |
| return { | |
| type: DISPATCH, | |
| storeKey: isObject(storeNameOrDescriptor) ? storeNameOrDescriptor.name : storeNameOrDescriptor, | |
| actionName, | |
| args | |
| }; | |
| } | |
| const controls = { | |
| select: controls_select, | |
| resolveSelect, | |
| dispatch | |
| }; | |
| const builtinControls = { | |
| [SELECT]: createRegistryControl(registry => ({ | |
| storeKey, | |
| selectorName, | |
| args | |
| }) => registry.select(storeKey)[selectorName](...args)), | |
| [RESOLVE_SELECT]: createRegistryControl(registry => ({ | |
| storeKey, | |
| selectorName, | |
| args | |
| }) => { | |
| const method = registry.select(storeKey)[selectorName].hasResolver ? 'resolveSelect' : 'select'; | |
| return registry[method](storeKey)[selectorName](...args); | |
| }), | |
| [DISPATCH]: createRegistryControl(registry => ({ | |
| storeKey, | |
| actionName, | |
| args | |
| }) => registry.dispatch(storeKey)[actionName](...args)) | |
| }; | |
| ;// CONCATENATED MODULE: external ["wp","privateApis"] | |
| const external_wp_privateApis_namespaceObject = window["wp"]["privateApis"]; | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/lock-unlock.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| const { | |
| lock, | |
| unlock | |
| } = (0,external_wp_privateApis_namespaceObject.__dangerousOptInToUnstableAPIsOnlyForCoreModules)('I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.', '@wordpress/data'); | |
| ;// CONCATENATED MODULE: ./node_modules/is-promise/index.mjs | |
| function isPromise(obj) { | |
| return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/promise-middleware.js | |
| /** | |
| * External dependencies | |
| */ | |
| /** | |
| * Simplest possible promise redux middleware. | |
| * | |
| * @type {import('redux').Middleware} | |
| */ | |
| const promiseMiddleware = () => next => action => { | |
| if (isPromise(action)) { | |
| return action.then(resolvedAction => { | |
| if (resolvedAction) { | |
| return next(resolvedAction); | |
| } | |
| }); | |
| } | |
| return next(action); | |
| }; | |
| /* harmony default export */ const promise_middleware = (promiseMiddleware); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/resolvers-cache-middleware.js | |
| /** @typedef {import('./registry').WPDataRegistry} WPDataRegistry */ | |
| /** | |
| * Creates a middleware handling resolvers cache invalidation. | |
| * | |
| * @param {WPDataRegistry} registry Registry for which to create the middleware. | |
| * @param {string} storeName Name of the store for which to create the middleware. | |
| * | |
| * @return {Function} Middleware function. | |
| */ | |
| const createResolversCacheMiddleware = (registry, storeName) => () => next => action => { | |
| const resolvers = registry.select(storeName).getCachedResolvers(); | |
| const resolverEntries = Object.entries(resolvers); | |
| resolverEntries.forEach(([selectorName, resolversByArgs]) => { | |
| const resolver = registry.stores[storeName]?.resolvers?.[selectorName]; | |
| if (!resolver || !resolver.shouldInvalidate) { | |
| return; | |
| } | |
| resolversByArgs.forEach((value, args) => { | |
| // Works around a bug in `EquivalentKeyMap` where `map.delete` merely sets an entry value | |
| // to `undefined` and `map.forEach` then iterates also over these orphaned entries. | |
| if (value === undefined) { | |
| return; | |
| } | |
| // resolversByArgs is the map Map([ args ] => boolean) storing the cache resolution status for a given selector. | |
| // If the value is "finished" or "error" it means this resolver has finished its resolution which means we need | |
| // to invalidate it, if it's true it means it's inflight and the invalidation is not necessary. | |
| if (value.status !== 'finished' && value.status !== 'error') { | |
| return; | |
| } | |
| if (!resolver.shouldInvalidate(action, ...args)) { | |
| return; | |
| } | |
| // Trigger cache invalidation | |
| registry.dispatch(storeName).invalidateResolution(selectorName, args); | |
| }); | |
| }); | |
| return next(action); | |
| }; | |
| /* harmony default export */ const resolvers_cache_middleware = (createResolversCacheMiddleware); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/thunk-middleware.js | |
| function createThunkMiddleware(args) { | |
| return () => next => action => { | |
| if (typeof action === 'function') { | |
| return action(args); | |
| } | |
| return next(action); | |
| }; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/metadata/utils.js | |
| /** | |
| * External dependencies | |
| */ | |
| /** | |
| * Higher-order reducer creator which creates a combined reducer object, keyed | |
| * by a property on the action object. | |
| * | |
| * @param actionProperty Action property by which to key object. | |
| * @return Higher-order reducer. | |
| */ | |
| const onSubKey = actionProperty => reducer => (state = {}, action) => { | |
| // Retrieve subkey from action. Do not track if undefined; useful for cases | |
| // where reducer is scoped by action shape. | |
| const key = action[actionProperty]; | |
| if (key === undefined) { | |
| return state; | |
| } | |
| // Avoid updating state if unchanged. Note that this also accounts for a | |
| // reducer which returns undefined on a key which is not yet tracked. | |
| const nextKeyState = reducer(state[key], action); | |
| if (nextKeyState === state[key]) { | |
| return state; | |
| } | |
| return { | |
| ...state, | |
| [key]: nextKeyState | |
| }; | |
| }; | |
| /** | |
| * Normalize selector argument array by defaulting `undefined` value to an empty array | |
| * and removing trailing `undefined` values. | |
| * | |
| * @param args Selector argument array | |
| * @return Normalized state key array | |
| */ | |
| function selectorArgsToStateKey(args) { | |
| if (args === undefined || args === null) { | |
| return []; | |
| } | |
| const len = args.length; | |
| let idx = len; | |
| while (idx > 0 && args[idx - 1] === undefined) { | |
| idx--; | |
| } | |
| return idx === len ? args : args.slice(0, idx); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/metadata/reducer.js | |
| /** | |
| * External dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * Reducer function returning next state for selector resolution of | |
| * subkeys, object form: | |
| * | |
| * selectorName -> EquivalentKeyMap<Array,boolean> | |
| */ | |
| const subKeysIsResolved = onSubKey('selectorName')((state = new (equivalent_key_map_default())(), action) => { | |
| switch (action.type) { | |
| case 'START_RESOLUTION': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| nextState.set(selectorArgsToStateKey(action.args), { | |
| status: 'resolving' | |
| }); | |
| return nextState; | |
| } | |
| case 'FINISH_RESOLUTION': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| nextState.set(selectorArgsToStateKey(action.args), { | |
| status: 'finished' | |
| }); | |
| return nextState; | |
| } | |
| case 'FAIL_RESOLUTION': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| nextState.set(selectorArgsToStateKey(action.args), { | |
| status: 'error', | |
| error: action.error | |
| }); | |
| return nextState; | |
| } | |
| case 'START_RESOLUTIONS': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| for (const resolutionArgs of action.args) { | |
| nextState.set(selectorArgsToStateKey(resolutionArgs), { | |
| status: 'resolving' | |
| }); | |
| } | |
| return nextState; | |
| } | |
| case 'FINISH_RESOLUTIONS': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| for (const resolutionArgs of action.args) { | |
| nextState.set(selectorArgsToStateKey(resolutionArgs), { | |
| status: 'finished' | |
| }); | |
| } | |
| return nextState; | |
| } | |
| case 'FAIL_RESOLUTIONS': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| action.args.forEach((resolutionArgs, idx) => { | |
| const resolutionState = { | |
| status: 'error', | |
| error: undefined | |
| }; | |
| const error = action.errors[idx]; | |
| if (error) { | |
| resolutionState.error = error; | |
| } | |
| nextState.set(selectorArgsToStateKey(resolutionArgs), resolutionState); | |
| }); | |
| return nextState; | |
| } | |
| case 'INVALIDATE_RESOLUTION': | |
| { | |
| const nextState = new (equivalent_key_map_default())(state); | |
| nextState.delete(selectorArgsToStateKey(action.args)); | |
| return nextState; | |
| } | |
| } | |
| return state; | |
| }); | |
| /** | |
| * Reducer function returning next state for selector resolution, object form: | |
| * | |
| * selectorName -> EquivalentKeyMap<Array, boolean> | |
| * | |
| * @param state Current state. | |
| * @param action Dispatched action. | |
| * | |
| * @return Next state. | |
| */ | |
| const isResolved = (state = {}, action) => { | |
| switch (action.type) { | |
| case 'INVALIDATE_RESOLUTION_FOR_STORE': | |
| return {}; | |
| case 'INVALIDATE_RESOLUTION_FOR_STORE_SELECTOR': | |
| { | |
| if (action.selectorName in state) { | |
| const { | |
| [action.selectorName]: removedSelector, | |
| ...restState | |
| } = state; | |
| return restState; | |
| } | |
| return state; | |
| } | |
| case 'START_RESOLUTION': | |
| case 'FINISH_RESOLUTION': | |
| case 'FAIL_RESOLUTION': | |
| case 'START_RESOLUTIONS': | |
| case 'FINISH_RESOLUTIONS': | |
| case 'FAIL_RESOLUTIONS': | |
| case 'INVALIDATE_RESOLUTION': | |
| return subKeysIsResolved(state, action); | |
| } | |
| return state; | |
| }; | |
| /* harmony default export */ const metadata_reducer = (isResolved); | |
| ;// CONCATENATED MODULE: ./node_modules/rememo/rememo.js | |
| /** @typedef {(...args: any[]) => *[]} GetDependants */ | |
| /** @typedef {() => void} Clear */ | |
| /** | |
| * @typedef {{ | |
| * getDependants: GetDependants, | |
| * clear: Clear | |
| * }} EnhancedSelector | |
| */ | |
| /** | |
| * Internal cache entry. | |
| * | |
| * @typedef CacheNode | |
| * | |
| * @property {?CacheNode|undefined} [prev] Previous node. | |
| * @property {?CacheNode|undefined} [next] Next node. | |
| * @property {*[]} args Function arguments for cache entry. | |
| * @property {*} val Function result. | |
| */ | |
| /** | |
| * @typedef Cache | |
| * | |
| * @property {Clear} clear Function to clear cache. | |
| * @property {boolean} [isUniqueByDependants] Whether dependants are valid in | |
| * considering cache uniqueness. A cache is unique if dependents are all arrays | |
| * or objects. | |
| * @property {CacheNode?} [head] Cache head. | |
| * @property {*[]} [lastDependants] Dependants from previous invocation. | |
| */ | |
| /** | |
| * Arbitrary value used as key for referencing cache object in WeakMap tree. | |
| * | |
| * @type {{}} | |
| */ | |
| var LEAF_KEY = {}; | |
| /** | |
| * Returns the first argument as the sole entry in an array. | |
| * | |
| * @template T | |
| * | |
| * @param {T} value Value to return. | |
| * | |
| * @return {[T]} Value returned as entry in array. | |
| */ | |
| function arrayOf(value) { | |
| return [value]; | |
| } | |
| /** | |
| * Returns true if the value passed is object-like, or false otherwise. A value | |
| * is object-like if it can support property assignment, e.g. object or array. | |
| * | |
| * @param {*} value Value to test. | |
| * | |
| * @return {boolean} Whether value is object-like. | |
| */ | |
| function isObjectLike(value) { | |
| return !!value && 'object' === typeof value; | |
| } | |
| /** | |
| * Creates and returns a new cache object. | |
| * | |
| * @return {Cache} Cache object. | |
| */ | |
| function createCache() { | |
| /** @type {Cache} */ | |
| var cache = { | |
| clear: function () { | |
| cache.head = null; | |
| }, | |
| }; | |
| return cache; | |
| } | |
| /** | |
| * Returns true if entries within the two arrays are strictly equal by | |
| * reference from a starting index. | |
| * | |
| * @param {*[]} a First array. | |
| * @param {*[]} b Second array. | |
| * @param {number} fromIndex Index from which to start comparison. | |
| * | |
| * @return {boolean} Whether arrays are shallowly equal. | |
| */ | |
| function isShallowEqual(a, b, fromIndex) { | |
| var i; | |
| if (a.length !== b.length) { | |
| return false; | |
| } | |
| for (i = fromIndex; i < a.length; i++) { | |
| if (a[i] !== b[i]) { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| /** | |
| * Returns a memoized selector function. The getDependants function argument is | |
| * called before the memoized selector and is expected to return an immutable | |
| * reference or array of references on which the selector depends for computing | |
| * its own return value. The memoize cache is preserved only as long as those | |
| * dependant references remain the same. If getDependants returns a different | |
| * reference(s), the cache is cleared and the selector value regenerated. | |
| * | |
| * @template {(...args: *[]) => *} S | |
| * | |
| * @param {S} selector Selector function. | |
| * @param {GetDependants=} getDependants Dependant getter returning an array of | |
| * references used in cache bust consideration. | |
| */ | |
| /* harmony default export */ function rememo(selector, getDependants) { | |
| /** @type {WeakMap<*,*>} */ | |
| var rootCache; | |
| /** @type {GetDependants} */ | |
| var normalizedGetDependants = getDependants ? getDependants : arrayOf; | |
| /** | |
| * Returns the cache for a given dependants array. When possible, a WeakMap | |
| * will be used to create a unique cache for each set of dependants. This | |
| * is feasible due to the nature of WeakMap in allowing garbage collection | |
| * to occur on entries where the key object is no longer referenced. Since | |
| * WeakMap requires the key to be an object, this is only possible when the | |
| * dependant is object-like. The root cache is created as a hierarchy where | |
| * each top-level key is the first entry in a dependants set, the value a | |
| * WeakMap where each key is the next dependant, and so on. This continues | |
| * so long as the dependants are object-like. If no dependants are object- | |
| * like, then the cache is shared across all invocations. | |
| * | |
| * @see isObjectLike | |
| * | |
| * @param {*[]} dependants Selector dependants. | |
| * | |
| * @return {Cache} Cache object. | |
| */ | |
| function getCache(dependants) { | |
| var caches = rootCache, | |
| isUniqueByDependants = true, | |
| i, | |
| dependant, | |
| map, | |
| cache; | |
| for (i = 0; i < dependants.length; i++) { | |
| dependant = dependants[i]; | |
| // Can only compose WeakMap from object-like key. | |
| if (!isObjectLike(dependant)) { | |
| isUniqueByDependants = false; | |
| break; | |
| } | |
| // Does current segment of cache already have a WeakMap? | |
| if (caches.has(dependant)) { | |
| // Traverse into nested WeakMap. | |
| caches = caches.get(dependant); | |
| } else { | |
| // Create, set, and traverse into a new one. | |
| map = new WeakMap(); | |
| caches.set(dependant, map); | |
| caches = map; | |
| } | |
| } | |
| // We use an arbitrary (but consistent) object as key for the last item | |
| // in the WeakMap to serve as our running cache. | |
| if (!caches.has(LEAF_KEY)) { | |
| cache = createCache(); | |
| cache.isUniqueByDependants = isUniqueByDependants; | |
| caches.set(LEAF_KEY, cache); | |
| } | |
| return caches.get(LEAF_KEY); | |
| } | |
| /** | |
| * Resets root memoization cache. | |
| */ | |
| function clear() { | |
| rootCache = new WeakMap(); | |
| } | |
| /* eslint-disable jsdoc/check-param-names */ | |
| /** | |
| * The augmented selector call, considering first whether dependants have | |
| * changed before passing it to underlying memoize function. | |
| * | |
| * @param {*} source Source object for derivation. | |
| * @param {...*} extraArgs Additional arguments to pass to selector. | |
| * | |
| * @return {*} Selector result. | |
| */ | |
| /* eslint-enable jsdoc/check-param-names */ | |
| function callSelector(/* source, ...extraArgs */) { | |
| var len = arguments.length, | |
| cache, | |
| node, | |
| i, | |
| args, | |
| dependants; | |
| // Create copy of arguments (avoid leaking deoptimization). | |
| args = new Array(len); | |
| for (i = 0; i < len; i++) { | |
| args[i] = arguments[i]; | |
| } | |
| dependants = normalizedGetDependants.apply(null, args); | |
| cache = getCache(dependants); | |
| // If not guaranteed uniqueness by dependants (primitive type), shallow | |
| // compare against last dependants and, if references have changed, | |
| // destroy cache to recalculate result. | |
| if (!cache.isUniqueByDependants) { | |
| if ( | |
| cache.lastDependants && | |
| !isShallowEqual(dependants, cache.lastDependants, 0) | |
| ) { | |
| cache.clear(); | |
| } | |
| cache.lastDependants = dependants; | |
| } | |
| node = cache.head; | |
| while (node) { | |
| // Check whether node arguments match arguments | |
| if (!isShallowEqual(node.args, args, 1)) { | |
| node = node.next; | |
| continue; | |
| } | |
| // At this point we can assume we've found a match | |
| // Surface matched node to head if not already | |
| if (node !== cache.head) { | |
| // Adjust siblings to point to each other. | |
| /** @type {CacheNode} */ (node.prev).next = node.next; | |
| if (node.next) { | |
| node.next.prev = node.prev; | |
| } | |
| node.next = cache.head; | |
| node.prev = null; | |
| /** @type {CacheNode} */ (cache.head).prev = node; | |
| cache.head = node; | |
| } | |
| // Return immediately | |
| return node.val; | |
| } | |
| // No cached value found. Continue to insertion phase: | |
| node = /** @type {CacheNode} */ ({ | |
| // Generate the result from original function | |
| val: selector.apply(null, args), | |
| }); | |
| // Avoid including the source object in the cache. | |
| args[0] = null; | |
| node.args = args; | |
| // Don't need to check whether node is already head, since it would | |
| // have been returned above already if it was | |
| // Shift existing head down list | |
| if (cache.head) { | |
| cache.head.prev = node; | |
| node.next = cache.head; | |
| } | |
| cache.head = node; | |
| return node.val; | |
| } | |
| callSelector.getDependants = normalizedGetDependants; | |
| callSelector.clear = clear; | |
| clear(); | |
| return /** @type {S & EnhancedSelector} */ (callSelector); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/metadata/selectors.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {Record<string, import('./reducer').State>} State */ | |
| /** @typedef {import('./reducer').StateValue} StateValue */ | |
| /** @typedef {import('./reducer').Status} Status */ | |
| /** | |
| * Returns the raw resolution state value for a given selector name, | |
| * and arguments set. May be undefined if the selector has never been resolved | |
| * or not resolved for the given set of arguments, otherwise true or false for | |
| * resolution started and completed respectively. | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {StateValue|undefined} isResolving value. | |
| */ | |
| function getResolutionState(state, selectorName, args) { | |
| const map = state[selectorName]; | |
| if (!map) { | |
| return; | |
| } | |
| return map.get(selectorArgsToStateKey(args)); | |
| } | |
| /** | |
| * Returns an `isResolving`-like value for a given selector name and arguments set. | |
| * Its value is either `undefined` if the selector has never been resolved or has been | |
| * invalidated, or a `true`/`false` boolean value if the resolution is in progress or | |
| * has finished, respectively. | |
| * | |
| * This is a legacy selector that was implemented when the "raw" internal data had | |
| * this `undefined | boolean` format. Nowadays the internal value is an object that | |
| * can be retrieved with `getResolutionState`. | |
| * | |
| * @deprecated | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {boolean | undefined} isResolving value. | |
| */ | |
| function getIsResolving(state, selectorName, args) { | |
| external_wp_deprecated_default()('wp.data.select( store ).getIsResolving', { | |
| since: '6.6', | |
| version: '6.8', | |
| alternative: 'wp.data.select( store ).getResolutionState' | |
| }); | |
| const resolutionState = getResolutionState(state, selectorName, args); | |
| return resolutionState && resolutionState.status === 'resolving'; | |
| } | |
| /** | |
| * Returns true if resolution has already been triggered for a given | |
| * selector name, and arguments set. | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {boolean} Whether resolution has been triggered. | |
| */ | |
| function hasStartedResolution(state, selectorName, args) { | |
| return getResolutionState(state, selectorName, args) !== undefined; | |
| } | |
| /** | |
| * Returns true if resolution has completed for a given selector | |
| * name, and arguments set. | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {boolean} Whether resolution has completed. | |
| */ | |
| function hasFinishedResolution(state, selectorName, args) { | |
| const status = getResolutionState(state, selectorName, args)?.status; | |
| return status === 'finished' || status === 'error'; | |
| } | |
| /** | |
| * Returns true if resolution has failed for a given selector | |
| * name, and arguments set. | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {boolean} Has resolution failed | |
| */ | |
| function hasResolutionFailed(state, selectorName, args) { | |
| return getResolutionState(state, selectorName, args)?.status === 'error'; | |
| } | |
| /** | |
| * Returns the resolution error for a given selector name, and arguments set. | |
| * Note it may be of an Error type, but may also be null, undefined, or anything else | |
| * that can be `throw`-n. | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {Error|unknown} Last resolution error | |
| */ | |
| function getResolutionError(state, selectorName, args) { | |
| const resolutionState = getResolutionState(state, selectorName, args); | |
| return resolutionState?.status === 'error' ? resolutionState.error : null; | |
| } | |
| /** | |
| * Returns true if resolution has been triggered but has not yet completed for | |
| * a given selector name, and arguments set. | |
| * | |
| * @param {State} state Data state. | |
| * @param {string} selectorName Selector name. | |
| * @param {unknown[]?} args Arguments passed to selector. | |
| * | |
| * @return {boolean} Whether resolution is in progress. | |
| */ | |
| function isResolving(state, selectorName, args) { | |
| return getResolutionState(state, selectorName, args)?.status === 'resolving'; | |
| } | |
| /** | |
| * Returns the list of the cached resolvers. | |
| * | |
| * @param {State} state Data state. | |
| * | |
| * @return {State} Resolvers mapped by args and selectorName. | |
| */ | |
| function getCachedResolvers(state) { | |
| return state; | |
| } | |
| /** | |
| * Whether the store has any currently resolving selectors. | |
| * | |
| * @param {State} state Data state. | |
| * | |
| * @return {boolean} True if one or more selectors are resolving, false otherwise. | |
| */ | |
| function hasResolvingSelectors(state) { | |
| return Object.values(state).some(selectorState => | |
| /** | |
| * This uses the internal `_map` property of `EquivalentKeyMap` for | |
| * optimization purposes, since the `EquivalentKeyMap` implementation | |
| * does not support a `.values()` implementation. | |
| * | |
| * @see https://github.com/aduth/equivalent-key-map | |
| */ | |
| Array.from(selectorState._map.values()).some(resolution => resolution[1]?.status === 'resolving')); | |
| } | |
| /** | |
| * Retrieves the total number of selectors, grouped per status. | |
| * | |
| * @param {State} state Data state. | |
| * | |
| * @return {Object} Object, containing selector totals by status. | |
| */ | |
| const countSelectorsByStatus = rememo(state => { | |
| const selectorsByStatus = {}; | |
| Object.values(state).forEach(selectorState => | |
| /** | |
| * This uses the internal `_map` property of `EquivalentKeyMap` for | |
| * optimization purposes, since the `EquivalentKeyMap` implementation | |
| * does not support a `.values()` implementation. | |
| * | |
| * @see https://github.com/aduth/equivalent-key-map | |
| */ | |
| Array.from(selectorState._map.values()).forEach(resolution => { | |
| var _resolution$1$status; | |
| const currentStatus = (_resolution$1$status = resolution[1]?.status) !== null && _resolution$1$status !== void 0 ? _resolution$1$status : 'error'; | |
| if (!selectorsByStatus[currentStatus]) { | |
| selectorsByStatus[currentStatus] = 0; | |
| } | |
| selectorsByStatus[currentStatus]++; | |
| })); | |
| return selectorsByStatus; | |
| }, state => [state]); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/metadata/actions.js | |
| /** | |
| * Returns an action object used in signalling that selector resolution has | |
| * started. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver triggered. | |
| * @param {unknown[]} args Arguments to associate for uniqueness. | |
| * | |
| * @return {{ type: 'START_RESOLUTION', selectorName: string, args: unknown[] }} Action object. | |
| */ | |
| function startResolution(selectorName, args) { | |
| return { | |
| type: 'START_RESOLUTION', | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that selector resolution has | |
| * completed. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver triggered. | |
| * @param {unknown[]} args Arguments to associate for uniqueness. | |
| * | |
| * @return {{ type: 'FINISH_RESOLUTION', selectorName: string, args: unknown[] }} Action object. | |
| */ | |
| function finishResolution(selectorName, args) { | |
| return { | |
| type: 'FINISH_RESOLUTION', | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that selector resolution has | |
| * failed. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver triggered. | |
| * @param {unknown[]} args Arguments to associate for uniqueness. | |
| * @param {Error|unknown} error The error that caused the failure. | |
| * | |
| * @return {{ type: 'FAIL_RESOLUTION', selectorName: string, args: unknown[], error: Error|unknown }} Action object. | |
| */ | |
| function failResolution(selectorName, args, error) { | |
| return { | |
| type: 'FAIL_RESOLUTION', | |
| selectorName, | |
| args, | |
| error | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that a batch of selector resolutions has | |
| * started. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver triggered. | |
| * @param {unknown[][]} args Array of arguments to associate for uniqueness, each item | |
| * is associated to a resolution. | |
| * | |
| * @return {{ type: 'START_RESOLUTIONS', selectorName: string, args: unknown[][] }} Action object. | |
| */ | |
| function startResolutions(selectorName, args) { | |
| return { | |
| type: 'START_RESOLUTIONS', | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that a batch of selector resolutions has | |
| * completed. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver triggered. | |
| * @param {unknown[][]} args Array of arguments to associate for uniqueness, each item | |
| * is associated to a resolution. | |
| * | |
| * @return {{ type: 'FINISH_RESOLUTIONS', selectorName: string, args: unknown[][] }} Action object. | |
| */ | |
| function finishResolutions(selectorName, args) { | |
| return { | |
| type: 'FINISH_RESOLUTIONS', | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that a batch of selector resolutions has | |
| * completed and at least one of them has failed. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver triggered. | |
| * @param {unknown[]} args Array of arguments to associate for uniqueness, each item | |
| * is associated to a resolution. | |
| * @param {(Error|unknown)[]} errors Array of errors to associate for uniqueness, each item | |
| * is associated to a resolution. | |
| * @return {{ type: 'FAIL_RESOLUTIONS', selectorName: string, args: unknown[], errors: Array<Error|unknown> }} Action object. | |
| */ | |
| function failResolutions(selectorName, args, errors) { | |
| return { | |
| type: 'FAIL_RESOLUTIONS', | |
| selectorName, | |
| args, | |
| errors | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that we should invalidate the resolution cache. | |
| * | |
| * @param {string} selectorName Name of selector for which resolver should be invalidated. | |
| * @param {unknown[]} args Arguments to associate for uniqueness. | |
| * | |
| * @return {{ type: 'INVALIDATE_RESOLUTION', selectorName: string, args: any[] }} Action object. | |
| */ | |
| function invalidateResolution(selectorName, args) { | |
| return { | |
| type: 'INVALIDATE_RESOLUTION', | |
| selectorName, | |
| args | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that the resolution | |
| * should be invalidated. | |
| * | |
| * @return {{ type: 'INVALIDATE_RESOLUTION_FOR_STORE' }} Action object. | |
| */ | |
| function invalidateResolutionForStore() { | |
| return { | |
| type: 'INVALIDATE_RESOLUTION_FOR_STORE' | |
| }; | |
| } | |
| /** | |
| * Returns an action object used in signalling that the resolution cache for a | |
| * given selectorName should be invalidated. | |
| * | |
| * @param {string} selectorName Name of selector for which all resolvers should | |
| * be invalidated. | |
| * | |
| * @return {{ type: 'INVALIDATE_RESOLUTION_FOR_STORE_SELECTOR', selectorName: string }} Action object. | |
| */ | |
| function invalidateResolutionForStoreSelector(selectorName) { | |
| return { | |
| type: 'INVALIDATE_RESOLUTION_FOR_STORE_SELECTOR', | |
| selectorName | |
| }; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/redux-store/index.js | |
| /** | |
| * External dependencies | |
| */ | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('../types').DataRegistry} DataRegistry */ | |
| /** @typedef {import('../types').ListenerFunction} ListenerFunction */ | |
| /** | |
| * @typedef {import('../types').StoreDescriptor<C>} StoreDescriptor | |
| * @template {import('../types').AnyConfig} C | |
| */ | |
| /** | |
| * @typedef {import('../types').ReduxStoreConfig<State,Actions,Selectors>} ReduxStoreConfig | |
| * @template State | |
| * @template {Record<string,import('../types').ActionCreator>} Actions | |
| * @template Selectors | |
| */ | |
| const trimUndefinedValues = array => { | |
| const result = [...array]; | |
| for (let i = result.length - 1; i >= 0; i--) { | |
| if (result[i] === undefined) { | |
| result.splice(i, 1); | |
| } | |
| } | |
| return result; | |
| }; | |
| /** | |
| * Creates a new object with the same keys, but with `callback()` called as | |
| * a transformer function on each of the values. | |
| * | |
| * @param {Object} obj The object to transform. | |
| * @param {Function} callback The function to transform each object value. | |
| * @return {Array} Transformed object. | |
| */ | |
| const mapValues = (obj, callback) => Object.fromEntries(Object.entries(obj !== null && obj !== void 0 ? obj : {}).map(([key, value]) => [key, callback(value, key)])); | |
| // Convert non serializable types to plain objects | |
| const devToolsReplacer = (key, state) => { | |
| if (state instanceof Map) { | |
| return Object.fromEntries(state); | |
| } | |
| if (state instanceof window.HTMLElement) { | |
| return null; | |
| } | |
| return state; | |
| }; | |
| /** | |
| * Create a cache to track whether resolvers started running or not. | |
| * | |
| * @return {Object} Resolvers Cache. | |
| */ | |
| function createResolversCache() { | |
| const cache = {}; | |
| return { | |
| isRunning(selectorName, args) { | |
| return cache[selectorName] && cache[selectorName].get(trimUndefinedValues(args)); | |
| }, | |
| clear(selectorName, args) { | |
| if (cache[selectorName]) { | |
| cache[selectorName].delete(trimUndefinedValues(args)); | |
| } | |
| }, | |
| markAsRunning(selectorName, args) { | |
| if (!cache[selectorName]) { | |
| cache[selectorName] = new (equivalent_key_map_default())(); | |
| } | |
| cache[selectorName].set(trimUndefinedValues(args), true); | |
| } | |
| }; | |
| } | |
| function createBindingCache(bind) { | |
| const cache = new WeakMap(); | |
| return { | |
| get(item, itemName) { | |
| let boundItem = cache.get(item); | |
| if (!boundItem) { | |
| boundItem = bind(item, itemName); | |
| cache.set(item, boundItem); | |
| } | |
| return boundItem; | |
| } | |
| }; | |
| } | |
| /** | |
| * Creates a data store descriptor for the provided Redux store configuration containing | |
| * properties describing reducer, actions, selectors, controls and resolvers. | |
| * | |
| * @example | |
| * ```js | |
| * import { createReduxStore } from '@wordpress/data'; | |
| * | |
| * const store = createReduxStore( 'demo', { | |
| * reducer: ( state = 'OK' ) => state, | |
| * selectors: { | |
| * getValue: ( state ) => state, | |
| * }, | |
| * } ); | |
| * ``` | |
| * | |
| * @template State | |
| * @template {Record<string,import('../types').ActionCreator>} Actions | |
| * @template Selectors | |
| * @param {string} key Unique namespace identifier. | |
| * @param {ReduxStoreConfig<State,Actions,Selectors>} options Registered store options, with properties | |
| * describing reducer, actions, selectors, | |
| * and resolvers. | |
| * | |
| * @return {StoreDescriptor<ReduxStoreConfig<State,Actions,Selectors>>} Store Object. | |
| */ | |
| function createReduxStore(key, options) { | |
| const privateActions = {}; | |
| const privateSelectors = {}; | |
| const privateRegistrationFunctions = { | |
| privateActions, | |
| registerPrivateActions: actions => { | |
| Object.assign(privateActions, actions); | |
| }, | |
| privateSelectors, | |
| registerPrivateSelectors: selectors => { | |
| Object.assign(privateSelectors, selectors); | |
| } | |
| }; | |
| const storeDescriptor = { | |
| name: key, | |
| instantiate: registry => { | |
| /** | |
| * Stores listener functions registered with `subscribe()`. | |
| * | |
| * When functions register to listen to store changes with | |
| * `subscribe()` they get added here. Although Redux offers | |
| * its own `subscribe()` function directly, by wrapping the | |
| * subscription in this store instance it's possible to | |
| * optimize checking if the state has changed before calling | |
| * each listener. | |
| * | |
| * @type {Set<ListenerFunction>} | |
| */ | |
| const listeners = new Set(); | |
| const reducer = options.reducer; | |
| const thunkArgs = { | |
| registry, | |
| get dispatch() { | |
| return thunkActions; | |
| }, | |
| get select() { | |
| return thunkSelectors; | |
| }, | |
| get resolveSelect() { | |
| return getResolveSelectors(); | |
| } | |
| }; | |
| const store = instantiateReduxStore(key, options, registry, thunkArgs); | |
| // Expose the private registration functions on the store | |
| // so they can be copied to a sub registry in registry.js. | |
| lock(store, privateRegistrationFunctions); | |
| const resolversCache = createResolversCache(); | |
| function bindAction(action) { | |
| return (...args) => Promise.resolve(store.dispatch(action(...args))); | |
| } | |
| const actions = { | |
| ...mapValues(actions_namespaceObject, bindAction), | |
| ...mapValues(options.actions, bindAction) | |
| }; | |
| const boundPrivateActions = createBindingCache(bindAction); | |
| const allActions = new Proxy(() => {}, { | |
| get: (target, prop) => { | |
| const privateAction = privateActions[prop]; | |
| return privateAction ? boundPrivateActions.get(privateAction, prop) : actions[prop]; | |
| } | |
| }); | |
| const thunkActions = new Proxy(allActions, { | |
| apply: (target, thisArg, [action]) => store.dispatch(action) | |
| }); | |
| lock(actions, allActions); | |
| const resolvers = options.resolvers ? mapResolvers(options.resolvers) : {}; | |
| function bindSelector(selector, selectorName) { | |
| if (selector.isRegistrySelector) { | |
| selector.registry = registry; | |
| } | |
| const boundSelector = (...args) => { | |
| args = normalize(selector, args); | |
| const state = store.__unstableOriginalGetState(); | |
| // Before calling the selector, switch to the correct | |
| // registry. | |
| if (selector.isRegistrySelector) { | |
| selector.registry = registry; | |
| } | |
| return selector(state.root, ...args); | |
| }; | |
| // Expose normalization method on the bound selector | |
| // in order that it can be called when fullfilling | |
| // the resolver. | |
| boundSelector.__unstableNormalizeArgs = selector.__unstableNormalizeArgs; | |
| const resolver = resolvers[selectorName]; | |
| if (!resolver) { | |
| boundSelector.hasResolver = false; | |
| return boundSelector; | |
| } | |
| return mapSelectorWithResolver(boundSelector, selectorName, resolver, store, resolversCache); | |
| } | |
| function bindMetadataSelector(metaDataSelector) { | |
| const boundSelector = (...args) => { | |
| const state = store.__unstableOriginalGetState(); | |
| const originalSelectorName = args && args[0]; | |
| const originalSelectorArgs = args && args[1]; | |
| const targetSelector = options?.selectors?.[originalSelectorName]; | |
| // Normalize the arguments passed to the target selector. | |
| if (originalSelectorName && targetSelector) { | |
| args[1] = normalize(targetSelector, originalSelectorArgs); | |
| } | |
| return metaDataSelector(state.metadata, ...args); | |
| }; | |
| boundSelector.hasResolver = false; | |
| return boundSelector; | |
| } | |
| const selectors = { | |
| ...mapValues(selectors_namespaceObject, bindMetadataSelector), | |
| ...mapValues(options.selectors, bindSelector) | |
| }; | |
| const boundPrivateSelectors = createBindingCache(bindSelector); | |
| // Pre-bind the private selectors that have been registered by the time of | |
| // instantiation, so that registry selectors are bound to the registry. | |
| for (const [selectorName, selector] of Object.entries(privateSelectors)) { | |
| boundPrivateSelectors.get(selector, selectorName); | |
| } | |
| const allSelectors = new Proxy(() => {}, { | |
| get: (target, prop) => { | |
| const privateSelector = privateSelectors[prop]; | |
| return privateSelector ? boundPrivateSelectors.get(privateSelector, prop) : selectors[prop]; | |
| } | |
| }); | |
| const thunkSelectors = new Proxy(allSelectors, { | |
| apply: (target, thisArg, [selector]) => selector(store.__unstableOriginalGetState()) | |
| }); | |
| lock(selectors, allSelectors); | |
| const resolveSelectors = mapResolveSelectors(selectors, store); | |
| const suspendSelectors = mapSuspendSelectors(selectors, store); | |
| const getSelectors = () => selectors; | |
| const getActions = () => actions; | |
| const getResolveSelectors = () => resolveSelectors; | |
| const getSuspendSelectors = () => suspendSelectors; | |
| // We have some modules monkey-patching the store object | |
| // It's wrong to do so but until we refactor all of our effects to controls | |
| // We need to keep the same "store" instance here. | |
| store.__unstableOriginalGetState = store.getState; | |
| store.getState = () => store.__unstableOriginalGetState().root; | |
| // Customize subscribe behavior to call listeners only on effective change, | |
| // not on every dispatch. | |
| const subscribe = store && (listener => { | |
| listeners.add(listener); | |
| return () => listeners.delete(listener); | |
| }); | |
| let lastState = store.__unstableOriginalGetState(); | |
| store.subscribe(() => { | |
| const state = store.__unstableOriginalGetState(); | |
| const hasChanged = state !== lastState; | |
| lastState = state; | |
| if (hasChanged) { | |
| for (const listener of listeners) { | |
| listener(); | |
| } | |
| } | |
| }); | |
| // This can be simplified to just { subscribe, getSelectors, getActions } | |
| // Once we remove the use function. | |
| return { | |
| reducer, | |
| store, | |
| actions, | |
| selectors, | |
| resolvers, | |
| getSelectors, | |
| getResolveSelectors, | |
| getSuspendSelectors, | |
| getActions, | |
| subscribe | |
| }; | |
| } | |
| }; | |
| // Expose the private registration functions on the store | |
| // descriptor. That's a natural choice since that's where the | |
| // public actions and selectors are stored . | |
| lock(storeDescriptor, privateRegistrationFunctions); | |
| return storeDescriptor; | |
| } | |
| /** | |
| * Creates a redux store for a namespace. | |
| * | |
| * @param {string} key Unique namespace identifier. | |
| * @param {Object} options Registered store options, with properties | |
| * describing reducer, actions, selectors, | |
| * and resolvers. | |
| * @param {DataRegistry} registry Registry reference. | |
| * @param {Object} thunkArgs Argument object for the thunk middleware. | |
| * @return {Object} Newly created redux store. | |
| */ | |
| function instantiateReduxStore(key, options, registry, thunkArgs) { | |
| const controls = { | |
| ...options.controls, | |
| ...builtinControls | |
| }; | |
| const normalizedControls = mapValues(controls, control => control.isRegistryControl ? control(registry) : control); | |
| const middlewares = [resolvers_cache_middleware(registry, key), promise_middleware, external_wp_reduxRoutine_default()(normalizedControls), createThunkMiddleware(thunkArgs)]; | |
| const enhancers = [applyMiddleware(...middlewares)]; | |
| if (typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__) { | |
| enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION__({ | |
| name: key, | |
| instanceId: key, | |
| serialize: { | |
| replacer: devToolsReplacer | |
| } | |
| })); | |
| } | |
| const { | |
| reducer, | |
| initialState | |
| } = options; | |
| const enhancedReducer = combine_reducers_combineReducers({ | |
| metadata: metadata_reducer, | |
| root: reducer | |
| }); | |
| return createStore(enhancedReducer, { | |
| root: initialState | |
| }, (0,external_wp_compose_namespaceObject.compose)(enhancers)); | |
| } | |
| /** | |
| * Maps selectors to functions that return a resolution promise for them | |
| * | |
| * @param {Object} selectors Selectors to map. | |
| * @param {Object} store The redux store the selectors select from. | |
| * | |
| * @return {Object} Selectors mapped to their resolution functions. | |
| */ | |
| function mapResolveSelectors(selectors, store) { | |
| const { | |
| getIsResolving, | |
| hasStartedResolution, | |
| hasFinishedResolution, | |
| hasResolutionFailed, | |
| isResolving, | |
| getCachedResolvers, | |
| getResolutionState, | |
| getResolutionError, | |
| hasResolvingSelectors, | |
| countSelectorsByStatus, | |
| ...storeSelectors | |
| } = selectors; | |
| return mapValues(storeSelectors, (selector, selectorName) => { | |
| // If the selector doesn't have a resolver, just convert the return value | |
| // (including exceptions) to a Promise, no additional extra behavior is needed. | |
| if (!selector.hasResolver) { | |
| return async (...args) => selector.apply(null, args); | |
| } | |
| return (...args) => { | |
| return new Promise((resolve, reject) => { | |
| const hasFinished = () => selectors.hasFinishedResolution(selectorName, args); | |
| const finalize = result => { | |
| const hasFailed = selectors.hasResolutionFailed(selectorName, args); | |
| if (hasFailed) { | |
| const error = selectors.getResolutionError(selectorName, args); | |
| reject(error); | |
| } else { | |
| resolve(result); | |
| } | |
| }; | |
| const getResult = () => selector.apply(null, args); | |
| // Trigger the selector (to trigger the resolver) | |
| const result = getResult(); | |
| if (hasFinished()) { | |
| return finalize(result); | |
| } | |
| const unsubscribe = store.subscribe(() => { | |
| if (hasFinished()) { | |
| unsubscribe(); | |
| finalize(getResult()); | |
| } | |
| }); | |
| }); | |
| }; | |
| }); | |
| } | |
| /** | |
| * Maps selectors to functions that throw a suspense promise if not yet resolved. | |
| * | |
| * @param {Object} selectors Selectors to map. | |
| * @param {Object} store The redux store the selectors select from. | |
| * | |
| * @return {Object} Selectors mapped to their suspense functions. | |
| */ | |
| function mapSuspendSelectors(selectors, store) { | |
| return mapValues(selectors, (selector, selectorName) => { | |
| // Selector without a resolver doesn't have any extra suspense behavior. | |
| if (!selector.hasResolver) { | |
| return selector; | |
| } | |
| return (...args) => { | |
| const result = selector.apply(null, args); | |
| if (selectors.hasFinishedResolution(selectorName, args)) { | |
| if (selectors.hasResolutionFailed(selectorName, args)) { | |
| throw selectors.getResolutionError(selectorName, args); | |
| } | |
| return result; | |
| } | |
| throw new Promise(resolve => { | |
| const unsubscribe = store.subscribe(() => { | |
| if (selectors.hasFinishedResolution(selectorName, args)) { | |
| resolve(); | |
| unsubscribe(); | |
| } | |
| }); | |
| }); | |
| }; | |
| }); | |
| } | |
| /** | |
| * Convert resolvers to a normalized form, an object with `fulfill` method and | |
| * optional methods like `isFulfilled`. | |
| * | |
| * @param {Object} resolvers Resolver to convert | |
| */ | |
| function mapResolvers(resolvers) { | |
| return mapValues(resolvers, resolver => { | |
| if (resolver.fulfill) { | |
| return resolver; | |
| } | |
| return { | |
| ...resolver, | |
| // Copy the enumerable properties of the resolver function. | |
| fulfill: resolver // Add the fulfill method. | |
| }; | |
| }); | |
| } | |
| /** | |
| * Returns a selector with a matched resolver. | |
| * Resolvers are side effects invoked once per argument set of a given selector call, | |
| * used in ensuring that the data needs for the selector are satisfied. | |
| * | |
| * @param {Object} selector The selector function to be bound. | |
| * @param {string} selectorName The selector name. | |
| * @param {Object} resolver Resolver to call. | |
| * @param {Object} store The redux store to which the resolvers should be mapped. | |
| * @param {Object} resolversCache Resolvers Cache. | |
| */ | |
| function mapSelectorWithResolver(selector, selectorName, resolver, store, resolversCache) { | |
| function fulfillSelector(args) { | |
| const state = store.getState(); | |
| if (resolversCache.isRunning(selectorName, args) || typeof resolver.isFulfilled === 'function' && resolver.isFulfilled(state, ...args)) { | |
| return; | |
| } | |
| const { | |
| metadata | |
| } = store.__unstableOriginalGetState(); | |
| if (hasStartedResolution(metadata, selectorName, args)) { | |
| return; | |
| } | |
| resolversCache.markAsRunning(selectorName, args); | |
| setTimeout(async () => { | |
| resolversCache.clear(selectorName, args); | |
| store.dispatch(startResolution(selectorName, args)); | |
| try { | |
| const action = resolver.fulfill(...args); | |
| if (action) { | |
| await store.dispatch(action); | |
| } | |
| store.dispatch(finishResolution(selectorName, args)); | |
| } catch (error) { | |
| store.dispatch(failResolution(selectorName, args, error)); | |
| } | |
| }, 0); | |
| } | |
| const selectorResolver = (...args) => { | |
| args = normalize(selector, args); | |
| fulfillSelector(args); | |
| return selector(...args); | |
| }; | |
| selectorResolver.hasResolver = true; | |
| return selectorResolver; | |
| } | |
| /** | |
| * Applies selector's normalization function to the given arguments | |
| * if it exists. | |
| * | |
| * @param {Object} selector The selector potentially with a normalization method property. | |
| * @param {Array} args selector arguments to normalize. | |
| * @return {Array} Potentially normalized arguments. | |
| */ | |
| function normalize(selector, args) { | |
| if (selector.__unstableNormalizeArgs && typeof selector.__unstableNormalizeArgs === 'function' && args?.length) { | |
| return selector.__unstableNormalizeArgs(args); | |
| } | |
| return args; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/store/index.js | |
| const coreDataStore = { | |
| name: 'core/data', | |
| instantiate(registry) { | |
| const getCoreDataSelector = selectorName => (key, ...args) => { | |
| return registry.select(key)[selectorName](...args); | |
| }; | |
| const getCoreDataAction = actionName => (key, ...args) => { | |
| return registry.dispatch(key)[actionName](...args); | |
| }; | |
| return { | |
| getSelectors() { | |
| return Object.fromEntries(['getIsResolving', 'hasStartedResolution', 'hasFinishedResolution', 'isResolving', 'getCachedResolvers'].map(selectorName => [selectorName, getCoreDataSelector(selectorName)])); | |
| }, | |
| getActions() { | |
| return Object.fromEntries(['startResolution', 'finishResolution', 'invalidateResolution', 'invalidateResolutionForStore', 'invalidateResolutionForStoreSelector'].map(actionName => [actionName, getCoreDataAction(actionName)])); | |
| }, | |
| subscribe() { | |
| // There's no reasons to trigger any listener when we subscribe to this store | |
| // because there's no state stored in this store that need to retrigger selectors | |
| // if a change happens, the corresponding store where the tracking stated live | |
| // would have already triggered a "subscribe" call. | |
| return () => () => {}; | |
| } | |
| }; | |
| } | |
| }; | |
| /* harmony default export */ const store = (coreDataStore); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/utils/emitter.js | |
| /** | |
| * Create an event emitter. | |
| * | |
| * @return {import("../types").DataEmitter} Emitter. | |
| */ | |
| function createEmitter() { | |
| let isPaused = false; | |
| let isPending = false; | |
| const listeners = new Set(); | |
| const notifyListeners = () => | |
| // We use Array.from to clone the listeners Set | |
| // This ensures that we don't run a listener | |
| // that was added as a response to another listener. | |
| Array.from(listeners).forEach(listener => listener()); | |
| return { | |
| get isPaused() { | |
| return isPaused; | |
| }, | |
| subscribe(listener) { | |
| listeners.add(listener); | |
| return () => listeners.delete(listener); | |
| }, | |
| pause() { | |
| isPaused = true; | |
| }, | |
| resume() { | |
| isPaused = false; | |
| if (isPending) { | |
| isPending = false; | |
| notifyListeners(); | |
| } | |
| }, | |
| emit() { | |
| if (isPaused) { | |
| isPending = true; | |
| return; | |
| } | |
| notifyListeners(); | |
| } | |
| }; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/registry.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('./types').StoreDescriptor} StoreDescriptor */ | |
| /** | |
| * @typedef {Object} WPDataRegistry An isolated orchestrator of store registrations. | |
| * | |
| * @property {Function} registerGenericStore Given a namespace key and settings | |
| * object, registers a new generic | |
| * store. | |
| * @property {Function} registerStore Given a namespace key and settings | |
| * object, registers a new namespace | |
| * store. | |
| * @property {Function} subscribe Given a function callback, invokes | |
| * the callback on any change to state | |
| * within any registered store. | |
| * @property {Function} select Given a namespace key, returns an | |
| * object of the store's registered | |
| * selectors. | |
| * @property {Function} dispatch Given a namespace key, returns an | |
| * object of the store's registered | |
| * action dispatchers. | |
| */ | |
| /** | |
| * @typedef {Object} WPDataPlugin An object of registry function overrides. | |
| * | |
| * @property {Function} registerStore registers store. | |
| */ | |
| function getStoreName(storeNameOrDescriptor) { | |
| return typeof storeNameOrDescriptor === 'string' ? storeNameOrDescriptor : storeNameOrDescriptor.name; | |
| } | |
| /** | |
| * Creates a new store registry, given an optional object of initial store | |
| * configurations. | |
| * | |
| * @param {Object} storeConfigs Initial store configurations. | |
| * @param {Object?} parent Parent registry. | |
| * | |
| * @return {WPDataRegistry} Data registry. | |
| */ | |
| function createRegistry(storeConfigs = {}, parent = null) { | |
| const stores = {}; | |
| const emitter = createEmitter(); | |
| let listeningStores = null; | |
| /** | |
| * Global listener called for each store's update. | |
| */ | |
| function globalListener() { | |
| emitter.emit(); | |
| } | |
| /** | |
| * Subscribe to changes to any data, either in all stores in registry, or | |
| * in one specific store. | |
| * | |
| * @param {Function} listener Listener function. | |
| * @param {string|StoreDescriptor?} storeNameOrDescriptor Optional store name. | |
| * | |
| * @return {Function} Unsubscribe function. | |
| */ | |
| const subscribe = (listener, storeNameOrDescriptor) => { | |
| // subscribe to all stores | |
| if (!storeNameOrDescriptor) { | |
| return emitter.subscribe(listener); | |
| } | |
| // subscribe to one store | |
| const storeName = getStoreName(storeNameOrDescriptor); | |
| const store = stores[storeName]; | |
| if (store) { | |
| return store.subscribe(listener); | |
| } | |
| // Trying to access a store that hasn't been registered, | |
| // this is a pattern rarely used but seen in some places. | |
| // We fallback to global `subscribe` here for backward-compatibility for now. | |
| // See https://github.com/WordPress/gutenberg/pull/27466 for more info. | |
| if (!parent) { | |
| return emitter.subscribe(listener); | |
| } | |
| return parent.subscribe(listener, storeNameOrDescriptor); | |
| }; | |
| /** | |
| * Calls a selector given the current state and extra arguments. | |
| * | |
| * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store | |
| * or the store descriptor. | |
| * | |
| * @return {*} The selector's returned value. | |
| */ | |
| function select(storeNameOrDescriptor) { | |
| const storeName = getStoreName(storeNameOrDescriptor); | |
| listeningStores?.add(storeName); | |
| const store = stores[storeName]; | |
| if (store) { | |
| return store.getSelectors(); | |
| } | |
| return parent?.select(storeName); | |
| } | |
| function __unstableMarkListeningStores(callback, ref) { | |
| listeningStores = new Set(); | |
| try { | |
| return callback.call(this); | |
| } finally { | |
| ref.current = Array.from(listeningStores); | |
| listeningStores = null; | |
| } | |
| } | |
| /** | |
| * Given a store descriptor, returns an object containing the store's selectors pre-bound to | |
| * state so that you only need to supply additional arguments, and modified so that they return | |
| * promises that resolve to their eventual values, after any resolvers have ran. | |
| * | |
| * @param {StoreDescriptor|string} storeNameOrDescriptor The store descriptor. The legacy calling | |
| * convention of passing the store name is | |
| * also supported. | |
| * | |
| * @return {Object} Each key of the object matches the name of a selector. | |
| */ | |
| function resolveSelect(storeNameOrDescriptor) { | |
| const storeName = getStoreName(storeNameOrDescriptor); | |
| listeningStores?.add(storeName); | |
| const store = stores[storeName]; | |
| if (store) { | |
| return store.getResolveSelectors(); | |
| } | |
| return parent && parent.resolveSelect(storeName); | |
| } | |
| /** | |
| * Given a store descriptor, returns an object containing the store's selectors pre-bound to | |
| * state so that you only need to supply additional arguments, and modified so that they throw | |
| * promises in case the selector is not resolved yet. | |
| * | |
| * @param {StoreDescriptor|string} storeNameOrDescriptor The store descriptor. The legacy calling | |
| * convention of passing the store name is | |
| * also supported. | |
| * | |
| * @return {Object} Object containing the store's suspense-wrapped selectors. | |
| */ | |
| function suspendSelect(storeNameOrDescriptor) { | |
| const storeName = getStoreName(storeNameOrDescriptor); | |
| listeningStores?.add(storeName); | |
| const store = stores[storeName]; | |
| if (store) { | |
| return store.getSuspendSelectors(); | |
| } | |
| return parent && parent.suspendSelect(storeName); | |
| } | |
| /** | |
| * Returns the available actions for a part of the state. | |
| * | |
| * @param {string|StoreDescriptor} storeNameOrDescriptor Unique namespace identifier for the store | |
| * or the store descriptor. | |
| * | |
| * @return {*} The action's returned value. | |
| */ | |
| function dispatch(storeNameOrDescriptor) { | |
| const storeName = getStoreName(storeNameOrDescriptor); | |
| const store = stores[storeName]; | |
| if (store) { | |
| return store.getActions(); | |
| } | |
| return parent && parent.dispatch(storeName); | |
| } | |
| // | |
| // Deprecated | |
| // TODO: Remove this after `use()` is removed. | |
| function withPlugins(attributes) { | |
| return Object.fromEntries(Object.entries(attributes).map(([key, attribute]) => { | |
| if (typeof attribute !== 'function') { | |
| return [key, attribute]; | |
| } | |
| return [key, function () { | |
| return registry[key].apply(null, arguments); | |
| }]; | |
| })); | |
| } | |
| /** | |
| * Registers a store instance. | |
| * | |
| * @param {string} name Store registry name. | |
| * @param {Function} createStore Function that creates a store object (getSelectors, getActions, subscribe). | |
| */ | |
| function registerStoreInstance(name, createStore) { | |
| if (stores[name]) { | |
| // eslint-disable-next-line no-console | |
| console.error('Store "' + name + '" is already registered.'); | |
| return stores[name]; | |
| } | |
| const store = createStore(); | |
| if (typeof store.getSelectors !== 'function') { | |
| throw new TypeError('store.getSelectors must be a function'); | |
| } | |
| if (typeof store.getActions !== 'function') { | |
| throw new TypeError('store.getActions must be a function'); | |
| } | |
| if (typeof store.subscribe !== 'function') { | |
| throw new TypeError('store.subscribe must be a function'); | |
| } | |
| // The emitter is used to keep track of active listeners when the registry | |
| // get paused, that way, when resumed we should be able to call all these | |
| // pending listeners. | |
| store.emitter = createEmitter(); | |
| const currentSubscribe = store.subscribe; | |
| store.subscribe = listener => { | |
| const unsubscribeFromEmitter = store.emitter.subscribe(listener); | |
| const unsubscribeFromStore = currentSubscribe(() => { | |
| if (store.emitter.isPaused) { | |
| store.emitter.emit(); | |
| return; | |
| } | |
| listener(); | |
| }); | |
| return () => { | |
| unsubscribeFromStore?.(); | |
| unsubscribeFromEmitter?.(); | |
| }; | |
| }; | |
| stores[name] = store; | |
| store.subscribe(globalListener); | |
| // Copy private actions and selectors from the parent store. | |
| if (parent) { | |
| try { | |
| unlock(store.store).registerPrivateActions(unlock(parent).privateActionsOf(name)); | |
| unlock(store.store).registerPrivateSelectors(unlock(parent).privateSelectorsOf(name)); | |
| } catch (e) { | |
| // unlock() throws if store.store was not locked. | |
| // The error indicates there's nothing to do here so let's | |
| // ignore it. | |
| } | |
| } | |
| return store; | |
| } | |
| /** | |
| * Registers a new store given a store descriptor. | |
| * | |
| * @param {StoreDescriptor} store Store descriptor. | |
| */ | |
| function register(store) { | |
| registerStoreInstance(store.name, () => store.instantiate(registry)); | |
| } | |
| function registerGenericStore(name, store) { | |
| external_wp_deprecated_default()('wp.data.registerGenericStore', { | |
| since: '5.9', | |
| alternative: 'wp.data.register( storeDescriptor )' | |
| }); | |
| registerStoreInstance(name, () => store); | |
| } | |
| /** | |
| * Registers a standard `@wordpress/data` store. | |
| * | |
| * @param {string} storeName Unique namespace identifier. | |
| * @param {Object} options Store description (reducer, actions, selectors, resolvers). | |
| * | |
| * @return {Object} Registered store object. | |
| */ | |
| function registerStore(storeName, options) { | |
| if (!options.reducer) { | |
| throw new TypeError('Must specify store reducer'); | |
| } | |
| const store = registerStoreInstance(storeName, () => createReduxStore(storeName, options).instantiate(registry)); | |
| return store.store; | |
| } | |
| function batch(callback) { | |
| // If we're already batching, just call the callback. | |
| if (emitter.isPaused) { | |
| callback(); | |
| return; | |
| } | |
| emitter.pause(); | |
| Object.values(stores).forEach(store => store.emitter.pause()); | |
| try { | |
| callback(); | |
| } finally { | |
| emitter.resume(); | |
| Object.values(stores).forEach(store => store.emitter.resume()); | |
| } | |
| } | |
| let registry = { | |
| batch, | |
| stores, | |
| namespaces: stores, | |
| // TODO: Deprecate/remove this. | |
| subscribe, | |
| select, | |
| resolveSelect, | |
| suspendSelect, | |
| dispatch, | |
| use, | |
| register, | |
| registerGenericStore, | |
| registerStore, | |
| __unstableMarkListeningStores | |
| }; | |
| // | |
| // TODO: | |
| // This function will be deprecated as soon as it is no longer internally referenced. | |
| function use(plugin, options) { | |
| if (!plugin) { | |
| return; | |
| } | |
| registry = { | |
| ...registry, | |
| ...plugin(registry, options) | |
| }; | |
| return registry; | |
| } | |
| registry.register(store); | |
| for (const [name, config] of Object.entries(storeConfigs)) { | |
| registry.register(createReduxStore(name, config)); | |
| } | |
| if (parent) { | |
| parent.subscribe(globalListener); | |
| } | |
| const registryWithPlugins = withPlugins(registry); | |
| lock(registryWithPlugins, { | |
| privateActionsOf: name => { | |
| try { | |
| return unlock(stores[name].store).privateActions; | |
| } catch (e) { | |
| // unlock() throws an error the store was not locked – this means | |
| // there no private actions are available | |
| return {}; | |
| } | |
| }, | |
| privateSelectorsOf: name => { | |
| try { | |
| return unlock(stores[name].store).privateSelectors; | |
| } catch (e) { | |
| return {}; | |
| } | |
| } | |
| }); | |
| return registryWithPlugins; | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/default-registry.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| /* harmony default export */ const default_registry = (createRegistry()); | |
| ;// CONCATENATED MODULE: ./node_modules/is-plain-object/dist/is-plain-object.mjs | |
| /*! | |
| * is-plain-object <https://github.com/jonschlinkert/is-plain-object> | |
| * | |
| * Copyright (c) 2014-2017, Jon Schlinkert. | |
| * Released under the MIT License. | |
| */ | |
| function is_plain_object_isObject(o) { | |
| return Object.prototype.toString.call(o) === '[object Object]'; | |
| } | |
| function is_plain_object_isPlainObject(o) { | |
| var ctor,prot; | |
| if (is_plain_object_isObject(o) === false) return false; | |
| // If has modified constructor | |
| ctor = o.constructor; | |
| if (ctor === undefined) return true; | |
| // If has modified prototype | |
| prot = ctor.prototype; | |
| if (is_plain_object_isObject(prot) === false) return false; | |
| // If constructor does not have an Object-specific method | |
| if (prot.hasOwnProperty('isPrototypeOf') === false) { | |
| return false; | |
| } | |
| // Most likely a plain Object | |
| return true; | |
| } | |
| // EXTERNAL MODULE: ./node_modules/deepmerge/dist/cjs.js | |
| var cjs = __webpack_require__(66); | |
| var cjs_default = /*#__PURE__*/__webpack_require__.n(cjs); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/plugins/persistence/storage/object.js | |
| let objectStorage; | |
| const storage = { | |
| getItem(key) { | |
| if (!objectStorage || !objectStorage[key]) { | |
| return null; | |
| } | |
| return objectStorage[key]; | |
| }, | |
| setItem(key, value) { | |
| if (!objectStorage) { | |
| storage.clear(); | |
| } | |
| objectStorage[key] = String(value); | |
| }, | |
| clear() { | |
| objectStorage = Object.create(null); | |
| } | |
| }; | |
| /* harmony default export */ const object = (storage); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/plugins/persistence/storage/default.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| let default_storage; | |
| try { | |
| // Private Browsing in Safari 10 and earlier will throw an error when | |
| // attempting to set into localStorage. The test here is intentional in | |
| // causing a thrown error as condition for using fallback object storage. | |
| default_storage = window.localStorage; | |
| default_storage.setItem('__wpDataTestLocalStorage', ''); | |
| default_storage.removeItem('__wpDataTestLocalStorage'); | |
| } catch (error) { | |
| default_storage = object; | |
| } | |
| /* harmony default export */ const storage_default = (default_storage); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/plugins/persistence/index.js | |
| /** | |
| * External dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('../../registry').WPDataRegistry} WPDataRegistry */ | |
| /** @typedef {import('../../registry').WPDataPlugin} WPDataPlugin */ | |
| /** | |
| * @typedef {Object} WPDataPersistencePluginOptions Persistence plugin options. | |
| * | |
| * @property {Storage} storage Persistent storage implementation. This must | |
| * at least implement `getItem` and `setItem` of | |
| * the Web Storage API. | |
| * @property {string} storageKey Key on which to set in persistent storage. | |
| */ | |
| /** | |
| * Default plugin storage. | |
| * | |
| * @type {Storage} | |
| */ | |
| const DEFAULT_STORAGE = storage_default; | |
| /** | |
| * Default plugin storage key. | |
| * | |
| * @type {string} | |
| */ | |
| const DEFAULT_STORAGE_KEY = 'WP_DATA'; | |
| /** | |
| * Higher-order reducer which invokes the original reducer only if state is | |
| * inequal from that of the action's `nextState` property, otherwise returning | |
| * the original state reference. | |
| * | |
| * @param {Function} reducer Original reducer. | |
| * | |
| * @return {Function} Enhanced reducer. | |
| */ | |
| const withLazySameState = reducer => (state, action) => { | |
| if (action.nextState === state) { | |
| return state; | |
| } | |
| return reducer(state, action); | |
| }; | |
| /** | |
| * Creates a persistence interface, exposing getter and setter methods (`get` | |
| * and `set` respectively). | |
| * | |
| * @param {WPDataPersistencePluginOptions} options Plugin options. | |
| * | |
| * @return {Object} Persistence interface. | |
| */ | |
| function createPersistenceInterface(options) { | |
| const { | |
| storage = DEFAULT_STORAGE, | |
| storageKey = DEFAULT_STORAGE_KEY | |
| } = options; | |
| let data; | |
| /** | |
| * Returns the persisted data as an object, defaulting to an empty object. | |
| * | |
| * @return {Object} Persisted data. | |
| */ | |
| function getData() { | |
| if (data === undefined) { | |
| // If unset, getItem is expected to return null. Fall back to | |
| // empty object. | |
| const persisted = storage.getItem(storageKey); | |
| if (persisted === null) { | |
| data = {}; | |
| } else { | |
| try { | |
| data = JSON.parse(persisted); | |
| } catch (error) { | |
| // Similarly, should any error be thrown during parse of | |
| // the string (malformed JSON), fall back to empty object. | |
| data = {}; | |
| } | |
| } | |
| } | |
| return data; | |
| } | |
| /** | |
| * Merges an updated reducer state into the persisted data. | |
| * | |
| * @param {string} key Key to update. | |
| * @param {*} value Updated value. | |
| */ | |
| function setData(key, value) { | |
| data = { | |
| ...data, | |
| [key]: value | |
| }; | |
| storage.setItem(storageKey, JSON.stringify(data)); | |
| } | |
| return { | |
| get: getData, | |
| set: setData | |
| }; | |
| } | |
| /** | |
| * Data plugin to persist store state into a single storage key. | |
| * | |
| * @param {WPDataRegistry} registry Data registry. | |
| * @param {?WPDataPersistencePluginOptions} pluginOptions Plugin options. | |
| * | |
| * @return {WPDataPlugin} Data plugin. | |
| */ | |
| function persistencePlugin(registry, pluginOptions) { | |
| const persistence = createPersistenceInterface(pluginOptions); | |
| /** | |
| * Creates an enhanced store dispatch function, triggering the state of the | |
| * given store name to be persisted when changed. | |
| * | |
| * @param {Function} getState Function which returns current state. | |
| * @param {string} storeName Store name. | |
| * @param {?Array<string>} keys Optional subset of keys to save. | |
| * | |
| * @return {Function} Enhanced dispatch function. | |
| */ | |
| function createPersistOnChange(getState, storeName, keys) { | |
| let getPersistedState; | |
| if (Array.isArray(keys)) { | |
| // Given keys, the persisted state should by produced as an object | |
| // of the subset of keys. This implementation uses combineReducers | |
| // to leverage its behavior of returning the same object when none | |
| // of the property values changes. This allows a strict reference | |
| // equality to bypass a persistence set on an unchanging state. | |
| const reducers = keys.reduce((accumulator, key) => Object.assign(accumulator, { | |
| [key]: (state, action) => action.nextState[key] | |
| }), {}); | |
| getPersistedState = withLazySameState(build_module_combineReducers(reducers)); | |
| } else { | |
| getPersistedState = (state, action) => action.nextState; | |
| } | |
| let lastState = getPersistedState(undefined, { | |
| nextState: getState() | |
| }); | |
| return () => { | |
| const state = getPersistedState(lastState, { | |
| nextState: getState() | |
| }); | |
| if (state !== lastState) { | |
| persistence.set(storeName, state); | |
| lastState = state; | |
| } | |
| }; | |
| } | |
| return { | |
| registerStore(storeName, options) { | |
| if (!options.persist) { | |
| return registry.registerStore(storeName, options); | |
| } | |
| // Load from persistence to use as initial state. | |
| const persistedState = persistence.get()[storeName]; | |
| if (persistedState !== undefined) { | |
| let initialState = options.reducer(options.initialState, { | |
| type: '@@WP/PERSISTENCE_RESTORE' | |
| }); | |
| if (is_plain_object_isPlainObject(initialState) && is_plain_object_isPlainObject(persistedState)) { | |
| // If state is an object, ensure that: | |
| // - Other keys are left intact when persisting only a | |
| // subset of keys. | |
| // - New keys in what would otherwise be used as initial | |
| // state are deeply merged as base for persisted value. | |
| initialState = cjs_default()(initialState, persistedState, { | |
| isMergeableObject: is_plain_object_isPlainObject | |
| }); | |
| } else { | |
| // If there is a mismatch in object-likeness of default | |
| // initial or persisted state, defer to persisted value. | |
| initialState = persistedState; | |
| } | |
| options = { | |
| ...options, | |
| initialState | |
| }; | |
| } | |
| const store = registry.registerStore(storeName, options); | |
| store.subscribe(createPersistOnChange(store.getState, storeName, options.persist)); | |
| return store; | |
| } | |
| }; | |
| } | |
| persistencePlugin.__unstableMigrate = () => {}; | |
| /* harmony default export */ const persistence = (persistencePlugin); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/plugins/index.js | |
| ;// CONCATENATED MODULE: external ["wp","priorityQueue"] | |
| const external_wp_priorityQueue_namespaceObject = window["wp"]["priorityQueue"]; | |
| ;// CONCATENATED MODULE: external ["wp","element"] | |
| const external_wp_element_namespaceObject = window["wp"]["element"]; | |
| ;// CONCATENATED MODULE: external ["wp","isShallowEqual"] | |
| const external_wp_isShallowEqual_namespaceObject = window["wp"]["isShallowEqual"]; | |
| var external_wp_isShallowEqual_default = /*#__PURE__*/__webpack_require__.n(external_wp_isShallowEqual_namespaceObject); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/registry-provider/context.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| const Context = (0,external_wp_element_namespaceObject.createContext)(default_registry); | |
| const { | |
| Consumer, | |
| Provider | |
| } = Context; | |
| /** | |
| * A custom react Context consumer exposing the provided `registry` to | |
| * children components. Used along with the RegistryProvider. | |
| * | |
| * You can read more about the react context api here: | |
| * https://reactjs.org/docs/context.html#contextprovider | |
| * | |
| * @example | |
| * ```js | |
| * import { | |
| * RegistryProvider, | |
| * RegistryConsumer, | |
| * createRegistry | |
| * } from '@wordpress/data'; | |
| * | |
| * const registry = createRegistry( {} ); | |
| * | |
| * const App = ( { props } ) => { | |
| * return <RegistryProvider value={ registry }> | |
| * <div>Hello There</div> | |
| * <RegistryConsumer> | |
| * { ( registry ) => ( | |
| * <ComponentUsingRegistry | |
| * { ...props } | |
| * registry={ registry } | |
| * ) } | |
| * </RegistryConsumer> | |
| * </RegistryProvider> | |
| * } | |
| * ``` | |
| */ | |
| const RegistryConsumer = Consumer; | |
| /** | |
| * A custom Context provider for exposing the provided `registry` to children | |
| * components via a consumer. | |
| * | |
| * See <a name="#RegistryConsumer">RegistryConsumer</a> documentation for | |
| * example. | |
| */ | |
| /* harmony default export */ const context = (Provider); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/registry-provider/use-registry.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * A custom react hook exposing the registry context for use. | |
| * | |
| * This exposes the `registry` value provided via the | |
| * <a href="#RegistryProvider">Registry Provider</a> to a component implementing | |
| * this hook. | |
| * | |
| * It acts similarly to the `useContext` react hook. | |
| * | |
| * Note: Generally speaking, `useRegistry` is a low level hook that in most cases | |
| * won't be needed for implementation. Most interactions with the `@wordpress/data` | |
| * API can be performed via the `useSelect` hook, or the `withSelect` and | |
| * `withDispatch` higher order components. | |
| * | |
| * @example | |
| * ```js | |
| * import { | |
| * RegistryProvider, | |
| * createRegistry, | |
| * useRegistry, | |
| * } from '@wordpress/data'; | |
| * | |
| * const registry = createRegistry( {} ); | |
| * | |
| * const SomeChildUsingRegistry = ( props ) => { | |
| * const registry = useRegistry(); | |
| * // ...logic implementing the registry in other react hooks. | |
| * }; | |
| * | |
| * | |
| * const ParentProvidingRegistry = ( props ) => { | |
| * return <RegistryProvider value={ registry }> | |
| * <SomeChildUsingRegistry { ...props } /> | |
| * </RegistryProvider> | |
| * }; | |
| * ``` | |
| * | |
| * @return {Function} A custom react hook exposing the registry context value. | |
| */ | |
| function useRegistry() { | |
| return (0,external_wp_element_namespaceObject.useContext)(Context); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/async-mode-provider/context.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| const context_Context = (0,external_wp_element_namespaceObject.createContext)(false); | |
| const { | |
| Consumer: context_Consumer, | |
| Provider: context_Provider | |
| } = context_Context; | |
| const AsyncModeConsumer = (/* unused pure expression or super */ null && (context_Consumer)); | |
| /** | |
| * Context Provider Component used to switch the data module component rerendering | |
| * between Sync and Async modes. | |
| * | |
| * @example | |
| * | |
| * ```js | |
| * import { useSelect, AsyncModeProvider } from '@wordpress/data'; | |
| * import { store as blockEditorStore } from '@wordpress/block-editor'; | |
| * | |
| * function BlockCount() { | |
| * const count = useSelect( ( select ) => { | |
| * return select( blockEditorStore ).getBlockCount() | |
| * }, [] ); | |
| * | |
| * return count; | |
| * } | |
| * | |
| * function App() { | |
| * return ( | |
| * <AsyncModeProvider value={ true }> | |
| * <BlockCount /> | |
| * </AsyncModeProvider> | |
| * ); | |
| * } | |
| * ``` | |
| * | |
| * In this example, the BlockCount component is rerendered asynchronously. | |
| * It means if a more critical task is being performed (like typing in an input), | |
| * the rerendering is delayed until the browser becomes IDLE. | |
| * It is possible to nest multiple levels of AsyncModeProvider to fine-tune the rendering behavior. | |
| * | |
| * @param {boolean} props.value Enable Async Mode. | |
| * @return {Component} The component to be rendered. | |
| */ | |
| /* harmony default export */ const async_mode_provider_context = (context_Provider); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/async-mode-provider/use-async-mode.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| function useAsyncMode() { | |
| return (0,external_wp_element_namespaceObject.useContext)(context_Context); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/use-select/index.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| const renderQueue = (0,external_wp_priorityQueue_namespaceObject.createQueue)(); | |
| /** | |
| * @typedef {import('../../types').StoreDescriptor<C>} StoreDescriptor | |
| * @template {import('../../types').AnyConfig} C | |
| */ | |
| /** | |
| * @typedef {import('../../types').ReduxStoreConfig<State,Actions,Selectors>} ReduxStoreConfig | |
| * @template State | |
| * @template {Record<string,import('../../types').ActionCreator>} Actions | |
| * @template Selectors | |
| */ | |
| /** @typedef {import('../../types').MapSelect} MapSelect */ | |
| /** | |
| * @typedef {import('../../types').UseSelectReturn<T>} UseSelectReturn | |
| * @template {MapSelect|StoreDescriptor<any>} T | |
| */ | |
| function Store(registry, suspense) { | |
| const select = suspense ? registry.suspendSelect : registry.select; | |
| const queueContext = {}; | |
| let lastMapSelect; | |
| let lastMapResult; | |
| let lastMapResultValid = false; | |
| let lastIsAsync; | |
| let subscriber; | |
| let didWarnUnstableReference; | |
| const storeStatesOnMount = new Map(); | |
| function getStoreState(name) { | |
| var _registry$stores$name; | |
| // If there's no store property (custom generic store), return an empty | |
| // object. When comparing the state, the empty objects will cause the | |
| // equality check to fail, setting `lastMapResultValid` to false. | |
| return (_registry$stores$name = registry.stores[name]?.store?.getState?.()) !== null && _registry$stores$name !== void 0 ? _registry$stores$name : {}; | |
| } | |
| const createSubscriber = stores => { | |
| // The set of stores the `subscribe` function is supposed to subscribe to. Here it is | |
| // initialized, and then the `updateStores` function can add new stores to it. | |
| const activeStores = [...stores]; | |
| // The `subscribe` function, which is passed to the `useSyncExternalStore` hook, could | |
| // be called multiple times to establish multiple subscriptions. That's why we need to | |
| // keep a set of active subscriptions; | |
| const activeSubscriptions = new Set(); | |
| function subscribe(listener) { | |
| // Maybe invalidate the value right after subscription was created. | |
| // React will call `getValue` after subscribing, to detect store | |
| // updates that happened in the interval between the `getValue` call | |
| // during render and creating the subscription, which is slightly | |
| // delayed. We need to ensure that this second `getValue` call will | |
| // compute a fresh value only if any of the store states have | |
| // changed in the meantime. | |
| if (lastMapResultValid) { | |
| for (const name of activeStores) { | |
| if (storeStatesOnMount.get(name) !== getStoreState(name)) { | |
| lastMapResultValid = false; | |
| } | |
| } | |
| } | |
| storeStatesOnMount.clear(); | |
| const onStoreChange = () => { | |
| // Invalidate the value on store update, so that a fresh value is computed. | |
| lastMapResultValid = false; | |
| listener(); | |
| }; | |
| const onChange = () => { | |
| if (lastIsAsync) { | |
| renderQueue.add(queueContext, onStoreChange); | |
| } else { | |
| onStoreChange(); | |
| } | |
| }; | |
| const unsubs = []; | |
| function subscribeStore(storeName) { | |
| unsubs.push(registry.subscribe(onChange, storeName)); | |
| } | |
| for (const storeName of activeStores) { | |
| subscribeStore(storeName); | |
| } | |
| activeSubscriptions.add(subscribeStore); | |
| return () => { | |
| activeSubscriptions.delete(subscribeStore); | |
| for (const unsub of unsubs.values()) { | |
| // The return value of the subscribe function could be undefined if the store is a custom generic store. | |
| unsub?.(); | |
| } | |
| // Cancel existing store updates that were already scheduled. | |
| renderQueue.cancel(queueContext); | |
| }; | |
| } | |
| // Check if `newStores` contains some stores we're not subscribed to yet, and add them. | |
| function updateStores(newStores) { | |
| for (const newStore of newStores) { | |
| if (activeStores.includes(newStore)) { | |
| continue; | |
| } | |
| // New `subscribe` calls will subscribe to `newStore`, too. | |
| activeStores.push(newStore); | |
| // Add `newStore` to existing subscriptions. | |
| for (const subscription of activeSubscriptions) { | |
| subscription(newStore); | |
| } | |
| } | |
| } | |
| return { | |
| subscribe, | |
| updateStores | |
| }; | |
| }; | |
| return (mapSelect, isAsync) => { | |
| function updateValue() { | |
| // If the last value is valid, and the `mapSelect` callback hasn't changed, | |
| // then we can safely return the cached value. The value can change only on | |
| // store update, and in that case value will be invalidated by the listener. | |
| if (lastMapResultValid && mapSelect === lastMapSelect) { | |
| return lastMapResult; | |
| } | |
| const listeningStores = { | |
| current: null | |
| }; | |
| const mapResult = registry.__unstableMarkListeningStores(() => mapSelect(select, registry), listeningStores); | |
| if (false) {} | |
| if (!subscriber) { | |
| for (const name of listeningStores.current) { | |
| storeStatesOnMount.set(name, getStoreState(name)); | |
| } | |
| subscriber = createSubscriber(listeningStores.current); | |
| } else { | |
| subscriber.updateStores(listeningStores.current); | |
| } | |
| // If the new value is shallow-equal to the old one, keep the old one so | |
| // that we don't trigger unwanted updates that do a `===` check. | |
| if (!external_wp_isShallowEqual_default()(lastMapResult, mapResult)) { | |
| lastMapResult = mapResult; | |
| } | |
| lastMapSelect = mapSelect; | |
| lastMapResultValid = true; | |
| } | |
| function getValue() { | |
| // Update the value in case it's been invalidated or `mapSelect` has changed. | |
| updateValue(); | |
| return lastMapResult; | |
| } | |
| // When transitioning from async to sync mode, cancel existing store updates | |
| // that have been scheduled, and invalidate the value so that it's freshly | |
| // computed. It might have been changed by the update we just cancelled. | |
| if (lastIsAsync && !isAsync) { | |
| lastMapResultValid = false; | |
| renderQueue.cancel(queueContext); | |
| } | |
| updateValue(); | |
| lastIsAsync = isAsync; | |
| // Return a pair of functions that can be passed to `useSyncExternalStore`. | |
| return { | |
| subscribe: subscriber.subscribe, | |
| getValue | |
| }; | |
| }; | |
| } | |
| function useStaticSelect(storeName) { | |
| return useRegistry().select(storeName); | |
| } | |
| function useMappingSelect(suspense, mapSelect, deps) { | |
| const registry = useRegistry(); | |
| const isAsync = useAsyncMode(); | |
| const store = (0,external_wp_element_namespaceObject.useMemo)(() => Store(registry, suspense), [registry, suspense]); | |
| // These are "pass-through" dependencies from the parent hook, | |
| // and the parent should catch any hook rule violations. | |
| // eslint-disable-next-line react-hooks/exhaustive-deps | |
| const selector = (0,external_wp_element_namespaceObject.useCallback)(mapSelect, deps); | |
| const { | |
| subscribe, | |
| getValue | |
| } = store(selector, isAsync); | |
| const result = (0,external_wp_element_namespaceObject.useSyncExternalStore)(subscribe, getValue, getValue); | |
| (0,external_wp_element_namespaceObject.useDebugValue)(result); | |
| return result; | |
| } | |
| /** | |
| * Custom react hook for retrieving props from registered selectors. | |
| * | |
| * In general, this custom React hook follows the | |
| * [rules of hooks](https://reactjs.org/docs/hooks-rules.html). | |
| * | |
| * @template {MapSelect | StoreDescriptor<any>} T | |
| * @param {T} mapSelect Function called on every state change. The returned value is | |
| * exposed to the component implementing this hook. The function | |
| * receives the `registry.select` method on the first argument | |
| * and the `registry` on the second argument. | |
| * When a store key is passed, all selectors for the store will be | |
| * returned. This is only meant for usage of these selectors in event | |
| * callbacks, not for data needed to create the element tree. | |
| * @param {unknown[]} deps If provided, this memoizes the mapSelect so the same `mapSelect` is | |
| * invoked on every state change unless the dependencies change. | |
| * | |
| * @example | |
| * ```js | |
| * import { useSelect } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * function HammerPriceDisplay( { currency } ) { | |
| * const price = useSelect( ( select ) => { | |
| * return select( myCustomStore ).getPrice( 'hammer', currency ); | |
| * }, [ currency ] ); | |
| * return new Intl.NumberFormat( 'en-US', { | |
| * style: 'currency', | |
| * currency, | |
| * } ).format( price ); | |
| * } | |
| * | |
| * // Rendered in the application: | |
| * // <HammerPriceDisplay currency="USD" /> | |
| * ``` | |
| * | |
| * In the above example, when `HammerPriceDisplay` is rendered into an | |
| * application, the price will be retrieved from the store state using the | |
| * `mapSelect` callback on `useSelect`. If the currency prop changes then | |
| * any price in the state for that currency is retrieved. If the currency prop | |
| * doesn't change and other props are passed in that do change, the price will | |
| * not change because the dependency is just the currency. | |
| * | |
| * When data is only used in an event callback, the data should not be retrieved | |
| * on render, so it may be useful to get the selectors function instead. | |
| * | |
| * **Don't use `useSelect` this way when calling the selectors in the render | |
| * function because your component won't re-render on a data change.** | |
| * | |
| * ```js | |
| * import { useSelect } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * function Paste( { children } ) { | |
| * const { getSettings } = useSelect( myCustomStore ); | |
| * function onPaste() { | |
| * // Do something with the settings. | |
| * const settings = getSettings(); | |
| * } | |
| * return <div onPaste={ onPaste }>{ children }</div>; | |
| * } | |
| * ``` | |
| * @return {UseSelectReturn<T>} A custom react hook. | |
| */ | |
| function useSelect(mapSelect, deps) { | |
| // On initial call, on mount, determine the mode of this `useSelect` call | |
| // and then never allow it to change on subsequent updates. | |
| const staticSelectMode = typeof mapSelect !== 'function'; | |
| const staticSelectModeRef = (0,external_wp_element_namespaceObject.useRef)(staticSelectMode); | |
| if (staticSelectMode !== staticSelectModeRef.current) { | |
| const prevMode = staticSelectModeRef.current ? 'static' : 'mapping'; | |
| const nextMode = staticSelectMode ? 'static' : 'mapping'; | |
| throw new Error(`Switching useSelect from ${prevMode} to ${nextMode} is not allowed`); | |
| } | |
| /* eslint-disable react-hooks/rules-of-hooks */ | |
| // `staticSelectMode` is not allowed to change during the hook instance's, | |
| // lifetime, so the rules of hooks are not really violated. | |
| return staticSelectMode ? useStaticSelect(mapSelect) : useMappingSelect(false, mapSelect, deps); | |
| /* eslint-enable react-hooks/rules-of-hooks */ | |
| } | |
| /** | |
| * A variant of the `useSelect` hook that has the same API, but is a compatible | |
| * Suspense-enabled data source. | |
| * | |
| * @template {MapSelect} T | |
| * @param {T} mapSelect Function called on every state change. The | |
| * returned value is exposed to the component | |
| * using this hook. The function receives the | |
| * `registry.suspendSelect` method as the first | |
| * argument and the `registry` as the second one. | |
| * @param {Array} deps A dependency array used to memoize the `mapSelect` | |
| * so that the same `mapSelect` is invoked on every | |
| * state change unless the dependencies change. | |
| * | |
| * @throws {Promise} A suspense Promise that is thrown if any of the called | |
| * selectors is in an unresolved state. | |
| * | |
| * @return {ReturnType<T>} Data object returned by the `mapSelect` function. | |
| */ | |
| function useSuspenseSelect(mapSelect, deps) { | |
| return useMappingSelect(true, mapSelect, deps); | |
| } | |
| ;// CONCATENATED MODULE: external "ReactJSXRuntime" | |
| const external_ReactJSXRuntime_namespaceObject = window["ReactJSXRuntime"]; | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/with-select/index.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('react').ComponentType} ComponentType */ | |
| /** | |
| * Higher-order component used to inject state-derived props using registered | |
| * selectors. | |
| * | |
| * @param {Function} mapSelectToProps Function called on every state change, | |
| * expected to return object of props to | |
| * merge with the component's own props. | |
| * | |
| * @example | |
| * ```js | |
| * import { withSelect } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * function PriceDisplay( { price, currency } ) { | |
| * return new Intl.NumberFormat( 'en-US', { | |
| * style: 'currency', | |
| * currency, | |
| * } ).format( price ); | |
| * } | |
| * | |
| * const HammerPriceDisplay = withSelect( ( select, ownProps ) => { | |
| * const { getPrice } = select( myCustomStore ); | |
| * const { currency } = ownProps; | |
| * | |
| * return { | |
| * price: getPrice( 'hammer', currency ), | |
| * }; | |
| * } )( PriceDisplay ); | |
| * | |
| * // Rendered in the application: | |
| * // | |
| * // <HammerPriceDisplay currency="USD" /> | |
| * ``` | |
| * In the above example, when `HammerPriceDisplay` is rendered into an | |
| * application, it will pass the price into the underlying `PriceDisplay` | |
| * component and update automatically if the price of a hammer ever changes in | |
| * the store. | |
| * | |
| * @return {ComponentType} Enhanced component with merged state data props. | |
| */ | |
| const withSelect = mapSelectToProps => (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => (0,external_wp_compose_namespaceObject.pure)(ownProps => { | |
| const mapSelect = (select, registry) => mapSelectToProps(select, ownProps, registry); | |
| const mergeProps = useSelect(mapSelect); | |
| return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WrappedComponent, { | |
| ...ownProps, | |
| ...mergeProps | |
| }); | |
| }), 'withSelect'); | |
| /* harmony default export */ const with_select = (withSelect); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/use-dispatch/use-dispatch-with-map.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * Custom react hook for returning aggregate dispatch actions using the provided | |
| * dispatchMap. | |
| * | |
| * Currently this is an internal api only and is implemented by `withDispatch` | |
| * | |
| * @param {Function} dispatchMap Receives the `registry.dispatch` function as | |
| * the first argument and the `registry` object | |
| * as the second argument. Should return an | |
| * object mapping props to functions. | |
| * @param {Array} deps An array of dependencies for the hook. | |
| * @return {Object} An object mapping props to functions created by the passed | |
| * in dispatchMap. | |
| */ | |
| const useDispatchWithMap = (dispatchMap, deps) => { | |
| const registry = useRegistry(); | |
| const currentDispatchMap = (0,external_wp_element_namespaceObject.useRef)(dispatchMap); | |
| (0,external_wp_compose_namespaceObject.useIsomorphicLayoutEffect)(() => { | |
| currentDispatchMap.current = dispatchMap; | |
| }); | |
| return (0,external_wp_element_namespaceObject.useMemo)(() => { | |
| const currentDispatchProps = currentDispatchMap.current(registry.dispatch, registry); | |
| return Object.fromEntries(Object.entries(currentDispatchProps).map(([propName, dispatcher]) => { | |
| if (typeof dispatcher !== 'function') { | |
| // eslint-disable-next-line no-console | |
| console.warn(`Property ${propName} returned from dispatchMap in useDispatchWithMap must be a function.`); | |
| } | |
| return [propName, (...args) => currentDispatchMap.current(registry.dispatch, registry)[propName](...args)]; | |
| })); | |
| }, [registry, ...deps]); | |
| }; | |
| /* harmony default export */ const use_dispatch_with_map = (useDispatchWithMap); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/with-dispatch/index.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('react').ComponentType} ComponentType */ | |
| /** | |
| * Higher-order component used to add dispatch props using registered action | |
| * creators. | |
| * | |
| * @param {Function} mapDispatchToProps A function of returning an object of | |
| * prop names where value is a | |
| * dispatch-bound action creator, or a | |
| * function to be called with the | |
| * component's props and returning an | |
| * action creator. | |
| * | |
| * @example | |
| * ```jsx | |
| * function Button( { onClick, children } ) { | |
| * return <button type="button" onClick={ onClick }>{ children }</button>; | |
| * } | |
| * | |
| * import { withDispatch } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * const SaleButton = withDispatch( ( dispatch, ownProps ) => { | |
| * const { startSale } = dispatch( myCustomStore ); | |
| * const { discountPercent } = ownProps; | |
| * | |
| * return { | |
| * onClick() { | |
| * startSale( discountPercent ); | |
| * }, | |
| * }; | |
| * } )( Button ); | |
| * | |
| * // Rendered in the application: | |
| * // | |
| * // <SaleButton discountPercent="20">Start Sale!</SaleButton> | |
| * ``` | |
| * | |
| * @example | |
| * In the majority of cases, it will be sufficient to use only two first params | |
| * passed to `mapDispatchToProps` as illustrated in the previous example. | |
| * However, there might be some very advanced use cases where using the | |
| * `registry` object might be used as a tool to optimize the performance of | |
| * your component. Using `select` function from the registry might be useful | |
| * when you need to fetch some dynamic data from the store at the time when the | |
| * event is fired, but at the same time, you never use it to render your | |
| * component. In such scenario, you can avoid using the `withSelect` higher | |
| * order component to compute such prop, which might lead to unnecessary | |
| * re-renders of your component caused by its frequent value change. | |
| * Keep in mind, that `mapDispatchToProps` must return an object with functions | |
| * only. | |
| * | |
| * ```jsx | |
| * function Button( { onClick, children } ) { | |
| * return <button type="button" onClick={ onClick }>{ children }</button>; | |
| * } | |
| * | |
| * import { withDispatch } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * const SaleButton = withDispatch( ( dispatch, ownProps, { select } ) => { | |
| * // Stock number changes frequently. | |
| * const { getStockNumber } = select( myCustomStore ); | |
| * const { startSale } = dispatch( myCustomStore ); | |
| * return { | |
| * onClick() { | |
| * const discountPercent = getStockNumber() > 50 ? 10 : 20; | |
| * startSale( discountPercent ); | |
| * }, | |
| * }; | |
| * } )( Button ); | |
| * | |
| * // Rendered in the application: | |
| * // | |
| * // <SaleButton>Start Sale!</SaleButton> | |
| * ``` | |
| * | |
| * _Note:_ It is important that the `mapDispatchToProps` function always | |
| * returns an object with the same keys. For example, it should not contain | |
| * conditions under which a different value would be returned. | |
| * | |
| * @return {ComponentType} Enhanced component with merged dispatcher props. | |
| */ | |
| const withDispatch = mapDispatchToProps => (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(WrappedComponent => ownProps => { | |
| const mapDispatch = (dispatch, registry) => mapDispatchToProps(dispatch, ownProps, registry); | |
| const dispatchProps = use_dispatch_with_map(mapDispatch, []); | |
| return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(WrappedComponent, { | |
| ...ownProps, | |
| ...dispatchProps | |
| }); | |
| }, 'withDispatch'); | |
| /* harmony default export */ const with_dispatch = (withDispatch); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/with-registry/index.js | |
| /** | |
| * WordPress dependencies | |
| */ | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * Higher-order component which renders the original component with the current | |
| * registry context passed as its `registry` prop. | |
| * | |
| * @param {Component} OriginalComponent Original component. | |
| * | |
| * @return {Component} Enhanced component. | |
| */ | |
| const withRegistry = (0,external_wp_compose_namespaceObject.createHigherOrderComponent)(OriginalComponent => props => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RegistryConsumer, { | |
| children: registry => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(OriginalComponent, { | |
| ...props, | |
| registry: registry | |
| }) | |
| }), 'withRegistry'); | |
| /* harmony default export */ const with_registry = (withRegistry); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/components/use-dispatch/use-dispatch.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * @typedef {import('../../types').StoreDescriptor<StoreConfig>} StoreDescriptor | |
| * @template {import('../../types').AnyConfig} StoreConfig | |
| */ | |
| /** | |
| * @typedef {import('../../types').UseDispatchReturn<StoreNameOrDescriptor>} UseDispatchReturn | |
| * @template StoreNameOrDescriptor | |
| */ | |
| /** | |
| * A custom react hook returning the current registry dispatch actions creators. | |
| * | |
| * Note: The component using this hook must be within the context of a | |
| * RegistryProvider. | |
| * | |
| * @template {undefined | string | StoreDescriptor<any>} StoreNameOrDescriptor | |
| * @param {StoreNameOrDescriptor} [storeNameOrDescriptor] Optionally provide the name of the | |
| * store or its descriptor from which to | |
| * retrieve action creators. If not | |
| * provided, the registry.dispatch | |
| * function is returned instead. | |
| * | |
| * @example | |
| * This illustrates a pattern where you may need to retrieve dynamic data from | |
| * the server via the `useSelect` hook to use in combination with the dispatch | |
| * action. | |
| * | |
| * ```jsx | |
| * import { useCallback } from 'react'; | |
| * import { useDispatch, useSelect } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * function Button( { onClick, children } ) { | |
| * return <button type="button" onClick={ onClick }>{ children }</button> | |
| * } | |
| * | |
| * const SaleButton = ( { children } ) => { | |
| * const { stockNumber } = useSelect( | |
| * ( select ) => select( myCustomStore ).getStockNumber(), | |
| * [] | |
| * ); | |
| * const { startSale } = useDispatch( myCustomStore ); | |
| * const onClick = useCallback( () => { | |
| * const discountPercent = stockNumber > 50 ? 10: 20; | |
| * startSale( discountPercent ); | |
| * }, [ stockNumber ] ); | |
| * return <Button onClick={ onClick }>{ children }</Button> | |
| * } | |
| * | |
| * // Rendered somewhere in the application: | |
| * // | |
| * // <SaleButton>Start Sale!</SaleButton> | |
| * ``` | |
| * @return {UseDispatchReturn<StoreNameOrDescriptor>} A custom react hook. | |
| */ | |
| const useDispatch = storeNameOrDescriptor => { | |
| const { | |
| dispatch | |
| } = useRegistry(); | |
| return storeNameOrDescriptor === void 0 ? dispatch : dispatch(storeNameOrDescriptor); | |
| }; | |
| /* harmony default export */ const use_dispatch = (useDispatch); | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/dispatch.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * Given a store descriptor, returns an object of the store's action creators. | |
| * Calling an action creator will cause it to be dispatched, updating the state value accordingly. | |
| * | |
| * Note: Action creators returned by the dispatch will return a promise when | |
| * they are called. | |
| * | |
| * @param storeNameOrDescriptor The store descriptor. The legacy calling convention of passing | |
| * the store name is also supported. | |
| * | |
| * @example | |
| * ```js | |
| * import { dispatch } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * dispatch( myCustomStore ).setPrice( 'hammer', 9.75 ); | |
| * ``` | |
| * @return Object containing the action creators. | |
| */ | |
| function dispatch_dispatch(storeNameOrDescriptor) { | |
| return default_registry.dispatch(storeNameOrDescriptor); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/select.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** | |
| * Given a store descriptor, returns an object of the store's selectors. | |
| * The selector functions are been pre-bound to pass the current state automatically. | |
| * As a consumer, you need only pass arguments of the selector, if applicable. | |
| * | |
| * | |
| * @param storeNameOrDescriptor The store descriptor. The legacy calling convention | |
| * of passing the store name is also supported. | |
| * | |
| * @example | |
| * ```js | |
| * import { select } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * select( myCustomStore ).getPrice( 'hammer' ); | |
| * ``` | |
| * | |
| * @return Object containing the store's selectors. | |
| */ | |
| function select_select(storeNameOrDescriptor) { | |
| return default_registry.select(storeNameOrDescriptor); | |
| } | |
| ;// CONCATENATED MODULE: ./node_modules/@wordpress/data/build-module/index.js | |
| /** | |
| * Internal dependencies | |
| */ | |
| /** @typedef {import('./types').StoreDescriptor} StoreDescriptor */ | |
| /** | |
| * Object of available plugins to use with a registry. | |
| * | |
| * @see [use](#use) | |
| * | |
| * @type {Object} | |
| */ | |
| /** | |
| * The combineReducers helper function turns an object whose values are different | |
| * reducing functions into a single reducing function you can pass to registerReducer. | |
| * | |
| * @type {import('./types').combineReducers} | |
| * @param {Object} reducers An object whose values correspond to different reducing | |
| * functions that need to be combined into one. | |
| * | |
| * @example | |
| * ```js | |
| * import { combineReducers, createReduxStore, register } from '@wordpress/data'; | |
| * | |
| * const prices = ( state = {}, action ) => { | |
| * return action.type === 'SET_PRICE' ? | |
| * { | |
| * ...state, | |
| * [ action.item ]: action.price, | |
| * } : | |
| * state; | |
| * }; | |
| * | |
| * const discountPercent = ( state = 0, action ) => { | |
| * return action.type === 'START_SALE' ? | |
| * action.discountPercent : | |
| * state; | |
| * }; | |
| * | |
| * const store = createReduxStore( 'my-shop', { | |
| * reducer: combineReducers( { | |
| * prices, | |
| * discountPercent, | |
| * } ), | |
| * } ); | |
| * register( store ); | |
| * ``` | |
| * | |
| * @return {Function} A reducer that invokes every reducer inside the reducers | |
| * object, and constructs a state object with the same shape. | |
| */ | |
| const build_module_combineReducers = combine_reducers_combineReducers; | |
| /** | |
| * Given a store descriptor, returns an object containing the store's selectors pre-bound to state | |
| * so that you only need to supply additional arguments, and modified so that they return promises | |
| * that resolve to their eventual values, after any resolvers have ran. | |
| * | |
| * @param {StoreDescriptor|string} storeNameOrDescriptor The store descriptor. The legacy calling | |
| * convention of passing the store name is | |
| * also supported. | |
| * | |
| * @example | |
| * ```js | |
| * import { resolveSelect } from '@wordpress/data'; | |
| * import { store as myCustomStore } from 'my-custom-store'; | |
| * | |
| * resolveSelect( myCustomStore ).getPrice( 'hammer' ).then(console.log) | |
| * ``` | |
| * | |
| * @return {Object} Object containing the store's promise-wrapped selectors. | |
| */ | |
| const build_module_resolveSelect = default_registry.resolveSelect; | |
| /** | |
| * Given a store descriptor, returns an object containing the store's selectors pre-bound to state | |
| * so that you only need to supply additional arguments, and modified so that they throw promises | |
| * in case the selector is not resolved yet. | |
| * | |
| * @param {StoreDescriptor|string} storeNameOrDescriptor The store descriptor. The legacy calling | |
| * convention of passing the store name is | |
| * also supported. | |
| * | |
| * @return {Object} Object containing the store's suspense-wrapped selectors. | |
| */ | |
| const suspendSelect = default_registry.suspendSelect; | |
| /** | |
| * Given a listener function, the function will be called any time the state value | |
| * of one of the registered stores has changed. If you specify the optional | |
| * `storeNameOrDescriptor` parameter, the listener function will be called only | |
| * on updates on that one specific registered store. | |
| * | |
| * This function returns an `unsubscribe` function used to stop the subscription. | |
| * | |
| * @param {Function} listener Callback function. | |
| * @param {string|StoreDescriptor?} storeNameOrDescriptor Optional store name. | |
| * | |
| * @example | |
| * ```js | |
| * import { subscribe } from '@wordpress/data'; | |
| * | |
| * const unsubscribe = subscribe( () => { | |
| * // You could use this opportunity to test whether the derived result of a | |
| * // selector has subsequently changed as the result of a state update. | |
| * } ); | |
| * | |
| * // Later, if necessary... | |
| * unsubscribe(); | |
| * ``` | |
| */ | |
| const subscribe = default_registry.subscribe; | |
| /** | |
| * Registers a generic store instance. | |
| * | |
| * @deprecated Use `register( storeDescriptor )` instead. | |
| * | |
| * @param {string} name Store registry name. | |
| * @param {Object} store Store instance (`{ getSelectors, getActions, subscribe }`). | |
| */ | |
| const registerGenericStore = default_registry.registerGenericStore; | |
| /** | |
| * Registers a standard `@wordpress/data` store. | |
| * | |
| * @deprecated Use `register` instead. | |
| * | |
| * @param {string} storeName Unique namespace identifier for the store. | |
| * @param {Object} options Store description (reducer, actions, selectors, resolvers). | |
| * | |
| * @return {Object} Registered store object. | |
| */ | |
| const registerStore = default_registry.registerStore; | |
| /** | |
| * Extends a registry to inherit functionality provided by a given plugin. A | |
| * plugin is an object with properties aligning to that of a registry, merged | |
| * to extend the default registry behavior. | |
| * | |
| * @param {Object} plugin Plugin object. | |
| */ | |
| const use = default_registry.use; | |
| /** | |
| * Registers a standard `@wordpress/data` store descriptor. | |
| * | |
| * @example | |
| * ```js | |
| * import { createReduxStore, register } from '@wordpress/data'; | |
| * | |
| * const store = createReduxStore( 'demo', { | |
| * reducer: ( state = 'OK' ) => state, | |
| * selectors: { | |
| * getValue: ( state ) => state, | |
| * }, | |
| * } ); | |
| * register( store ); | |
| * ``` | |
| * | |
| * @param {StoreDescriptor} store Store descriptor. | |
| */ | |
| const register = default_registry.register; | |
| })(); | |
| (window.wp = window.wp || {}).data = __webpack_exports__; | |
| /******/ })() | |
| ; |