[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/js/dist/ -> keyboard-shortcuts.js (source)

   1  this["wp"] = this["wp"] || {}; this["wp"]["keyboardShortcuts"] =
   2  /******/ (function(modules) { // webpackBootstrap
   3  /******/     // The module cache
   4  /******/     var installedModules = {};
   5  /******/
   6  /******/     // The require function
   7  /******/ 	function __webpack_require__(moduleId) {
   8  /******/
   9  /******/         // Check if module is in cache
  10  /******/         if(installedModules[moduleId]) {
  11  /******/             return installedModules[moduleId].exports;
  12  /******/         }
  13  /******/         // Create a new module (and put it into the cache)
  14  /******/         var module = installedModules[moduleId] = {
  15  /******/             i: moduleId,
  16  /******/             l: false,
  17  /******/             exports: {}
  18  /******/         };
  19  /******/
  20  /******/         // Execute the module function
  21  /******/         modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  22  /******/
  23  /******/         // Flag the module as loaded
  24  /******/         module.l = true;
  25  /******/
  26  /******/         // Return the exports of the module
  27  /******/         return module.exports;
  28  /******/     }
  29  /******/
  30  /******/
  31  /******/     // expose the modules object (__webpack_modules__)
  32  /******/     __webpack_require__.m = modules;
  33  /******/
  34  /******/     // expose the module cache
  35  /******/     __webpack_require__.c = installedModules;
  36  /******/
  37  /******/     // define getter function for harmony exports
  38  /******/     __webpack_require__.d = function(exports, name, getter) {
  39  /******/         if(!__webpack_require__.o(exports, name)) {
  40  /******/             Object.defineProperty(exports, name, { enumerable: true, get: getter });
  41  /******/         }
  42  /******/     };
  43  /******/
  44  /******/     // define __esModule on exports
  45  /******/     __webpack_require__.r = function(exports) {
  46  /******/         if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  47  /******/             Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  48  /******/         }
  49  /******/         Object.defineProperty(exports, '__esModule', { value: true });
  50  /******/     };
  51  /******/
  52  /******/     // create a fake namespace object
  53  /******/     // mode & 1: value is a module id, require it
  54  /******/     // mode & 2: merge all properties of value into the ns
  55  /******/     // mode & 4: return value when already ns object
  56  /******/     // mode & 8|1: behave like require
  57  /******/     __webpack_require__.t = function(value, mode) {
  58  /******/         if(mode & 1) value = __webpack_require__(value);
  59  /******/         if(mode & 8) return value;
  60  /******/         if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  61  /******/         var ns = Object.create(null);
  62  /******/         __webpack_require__.r(ns);
  63  /******/         Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  64  /******/         if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  65  /******/         return ns;
  66  /******/     };
  67  /******/
  68  /******/     // getDefaultExport function for compatibility with non-harmony modules
  69  /******/     __webpack_require__.n = function(module) {
  70  /******/         var getter = module && module.__esModule ?
  71  /******/ 			function getDefault() { return module['default']; } :
  72  /******/ 			function getModuleExports() { return module; };
  73  /******/         __webpack_require__.d(getter, 'a', getter);
  74  /******/         return getter;
  75  /******/     };
  76  /******/
  77  /******/     // Object.prototype.hasOwnProperty.call
  78  /******/     __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  79  /******/
  80  /******/     // __webpack_public_path__
  81  /******/     __webpack_require__.p = "";
  82  /******/
  83  /******/
  84  /******/     // Load entry module and return exports
  85  /******/     return __webpack_require__(__webpack_require__.s = "cFS5");
  86  /******/ })
  87  /************************************************************************/
  88  /******/ ({
  89  
  90  /***/ "1ZqX":
  91  /***/ (function(module, exports) {
  92  
  93  (function() { module.exports = window["wp"]["data"]; }());
  94  
  95  /***/ }),
  96  
  97  /***/ "K9lf":
  98  /***/ (function(module, exports) {
  99  
 100  (function() { module.exports = window["wp"]["compose"]; }());
 101  
 102  /***/ }),
 103  
 104  /***/ "RxS6":
 105  /***/ (function(module, exports) {
 106  
 107  (function() { module.exports = window["wp"]["keycodes"]; }());
 108  
 109  /***/ }),
 110  
 111  /***/ "YLtl":
 112  /***/ (function(module, exports) {
 113  
 114  (function() { module.exports = window["lodash"]; }());
 115  
 116  /***/ }),
 117  
 118  /***/ "cFS5":
 119  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 120  
 121  "use strict";
 122  // ESM COMPAT FLAG
 123  __webpack_require__.r(__webpack_exports__);
 124  
 125  // EXPORTS
 126  __webpack_require__.d(__webpack_exports__, "store", function() { return /* reexport */ store; });
 127  __webpack_require__.d(__webpack_exports__, "useShortcut", function() { return /* reexport */ use_shortcut; });
 128  __webpack_require__.d(__webpack_exports__, "__unstableUseShortcutEventMatch", function() { return /* reexport */ useShortcutEventMatch; });
 129  
 130  // NAMESPACE OBJECT: ./node_modules/@wordpress/keyboard-shortcuts/build-module/store/actions.js
 131  var actions_namespaceObject = {};
 132  __webpack_require__.r(actions_namespaceObject);
 133  __webpack_require__.d(actions_namespaceObject, "registerShortcut", function() { return registerShortcut; });
 134  __webpack_require__.d(actions_namespaceObject, "unregisterShortcut", function() { return unregisterShortcut; });
 135  
 136  // NAMESPACE OBJECT: ./node_modules/@wordpress/keyboard-shortcuts/build-module/store/selectors.js
 137  var selectors_namespaceObject = {};
 138  __webpack_require__.r(selectors_namespaceObject);
 139  __webpack_require__.d(selectors_namespaceObject, "getShortcutKeyCombination", function() { return getShortcutKeyCombination; });
 140  __webpack_require__.d(selectors_namespaceObject, "getShortcutRepresentation", function() { return getShortcutRepresentation; });
 141  __webpack_require__.d(selectors_namespaceObject, "getShortcutDescription", function() { return getShortcutDescription; });
 142  __webpack_require__.d(selectors_namespaceObject, "getShortcutAliases", function() { return getShortcutAliases; });
 143  __webpack_require__.d(selectors_namespaceObject, "getAllShortcutKeyCombinations", function() { return selectors_getAllShortcutKeyCombinations; });
 144  __webpack_require__.d(selectors_namespaceObject, "getAllShortcutRawKeyCombinations", function() { return getAllShortcutRawKeyCombinations; });
 145  __webpack_require__.d(selectors_namespaceObject, "getCategoryShortcuts", function() { return getCategoryShortcuts; });
 146  
 147  // EXTERNAL MODULE: external ["wp","data"]
 148  var external_wp_data_ = __webpack_require__("1ZqX");
 149  
 150  // EXTERNAL MODULE: external "lodash"
 151  var external_lodash_ = __webpack_require__("YLtl");
 152  
 153  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/store/reducer.js
 154  /**
 155   * External dependencies
 156   */
 157  
 158  /**
 159   * Reducer returning the registered shortcuts
 160   *
 161   * @param {Object} state  Current state.
 162   * @param {Object} action Dispatched action.
 163   *
 164   * @return {Object} Updated state.
 165   */
 166  
 167  function reducer(state = {}, action) {
 168    switch (action.type) {
 169      case 'REGISTER_SHORTCUT':
 170        return { ...state,
 171          [action.name]: {
 172            category: action.category,
 173            keyCombination: action.keyCombination,
 174            aliases: action.aliases,
 175            description: action.description
 176          }
 177        };
 178  
 179      case 'UNREGISTER_SHORTCUT':
 180        return Object(external_lodash_["omit"])(state, action.name);
 181    }
 182  
 183    return state;
 184  }
 185  
 186  /* harmony default export */ var store_reducer = (reducer);
 187  
 188  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/store/actions.js
 189  /** @typedef {import('@wordpress/keycodes').WPKeycodeModifier} WPKeycodeModifier */
 190  
 191  /**
 192   * Keyboard key combination.
 193   *
 194   * @typedef {Object} WPShortcutKeyCombination
 195   *
 196   * @property {string}                      character Character.
 197   * @property {WPKeycodeModifier|undefined} modifier  Modifier.
 198   */
 199  
 200  /**
 201   * Configuration of a registered keyboard shortcut.
 202   *
 203   * @typedef {Object} WPShortcutConfig
 204   *
 205   * @property {string}                     name           Shortcut name.
 206   * @property {string}                     category       Shortcut category.
 207   * @property {string}                     description    Shortcut description.
 208   * @property {WPShortcutKeyCombination}   keyCombination Shortcut key combination.
 209   * @property {WPShortcutKeyCombination[]} [aliases]      Shortcut aliases.
 210   */
 211  
 212  /**
 213   * Returns an action object used to register a new keyboard shortcut.
 214   *
 215   * @param {WPShortcutConfig} config Shortcut config.
 216   *
 217   * @return {Object} action.
 218   */
 219  function registerShortcut({
 220    name,
 221    category,
 222    description,
 223    keyCombination,
 224    aliases
 225  }) {
 226    return {
 227      type: 'REGISTER_SHORTCUT',
 228      name,
 229      category,
 230      keyCombination,
 231      aliases,
 232      description
 233    };
 234  }
 235  /**
 236   * Returns an action object used to unregister a keyboard shortcut.
 237   *
 238   * @param {string} name Shortcut name.
 239   *
 240   * @return {Object} action.
 241   */
 242  
 243  function unregisterShortcut(name) {
 244    return {
 245      type: 'UNREGISTER_SHORTCUT',
 246      name
 247    };
 248  }
 249  
 250  // EXTERNAL MODULE: ./node_modules/rememo/es/rememo.js
 251  var rememo = __webpack_require__("pPDe");
 252  
 253  // EXTERNAL MODULE: external ["wp","keycodes"]
 254  var external_wp_keycodes_ = __webpack_require__("RxS6");
 255  
 256  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/store/selectors.js
 257  /**
 258   * External dependencies
 259   */
 260  
 261  
 262  /**
 263   * WordPress dependencies
 264   */
 265  
 266  
 267  /** @typedef {import('./actions').WPShortcutKeyCombination} WPShortcutKeyCombination */
 268  
 269  /** @typedef {import('@wordpress/keycodes').WPKeycodeHandlerByModifier} WPKeycodeHandlerByModifier */
 270  
 271  /**
 272   * Shared reference to an empty array for cases where it is important to avoid
 273   * returning a new array reference on every invocation.
 274   *
 275   * @type {Array<any>}
 276   */
 277  
 278  const EMPTY_ARRAY = [];
 279  /**
 280   * Shortcut formatting methods.
 281   *
 282   * @property {WPKeycodeHandlerByModifier} display     Display formatting.
 283   * @property {WPKeycodeHandlerByModifier} rawShortcut Raw shortcut formatting.
 284   * @property {WPKeycodeHandlerByModifier} ariaLabel   ARIA label formatting.
 285   */
 286  
 287  const FORMATTING_METHODS = {
 288    display: external_wp_keycodes_["displayShortcut"],
 289    raw: external_wp_keycodes_["rawShortcut"],
 290    ariaLabel: external_wp_keycodes_["shortcutAriaLabel"]
 291  };
 292  /**
 293   * Returns a string representing the key combination.
 294   *
 295   * @param {?WPShortcutKeyCombination} shortcut       Key combination.
 296   * @param {keyof FORMATTING_METHODS}  representation Type of representation
 297   *                                                   (display, raw, ariaLabel).
 298   *
 299   * @return {string?} Shortcut representation.
 300   */
 301  
 302  function getKeyCombinationRepresentation(shortcut, representation) {
 303    if (!shortcut) {
 304      return null;
 305    }
 306  
 307    return shortcut.modifier ? FORMATTING_METHODS[representation][shortcut.modifier](shortcut.character) : shortcut.character;
 308  }
 309  /**
 310   * Returns the main key combination for a given shortcut name.
 311   *
 312   * @param {Object} state Global state.
 313   * @param {string} name  Shortcut name.
 314   *
 315   * @return {WPShortcutKeyCombination?} Key combination.
 316   */
 317  
 318  
 319  function getShortcutKeyCombination(state, name) {
 320    return state[name] ? state[name].keyCombination : null;
 321  }
 322  /**
 323   * Returns a string representing the main key combination for a given shortcut name.
 324   *
 325   * @param {Object}                   state          Global state.
 326   * @param {string}                   name           Shortcut name.
 327   * @param {keyof FORMATTING_METHODS} representation Type of representation
 328   *                                                  (display, raw, ariaLabel).
 329   *
 330   * @return {string?} Shortcut representation.
 331   */
 332  
 333  function getShortcutRepresentation(state, name, representation = 'display') {
 334    const shortcut = getShortcutKeyCombination(state, name);
 335    return getKeyCombinationRepresentation(shortcut, representation);
 336  }
 337  /**
 338   * Returns the shortcut description given its name.
 339   *
 340   * @param {Object} state Global state.
 341   * @param {string} name  Shortcut name.
 342   *
 343   * @return {string?} Shortcut description.
 344   */
 345  
 346  function getShortcutDescription(state, name) {
 347    return state[name] ? state[name].description : null;
 348  }
 349  /**
 350   * Returns the aliases for a given shortcut name.
 351   *
 352   * @param {Object} state Global state.
 353   * @param {string} name  Shortcut name.
 354   *
 355   * @return {WPShortcutKeyCombination[]} Key combinations.
 356   */
 357  
 358  function getShortcutAliases(state, name) {
 359    return state[name] && state[name].aliases ? state[name].aliases : EMPTY_ARRAY;
 360  }
 361  const selectors_getAllShortcutKeyCombinations = Object(rememo["a" /* default */])((state, name) => {
 362    return Object(external_lodash_["compact"])([getShortcutKeyCombination(state, name), ...getShortcutAliases(state, name)]);
 363  }, (state, name) => [state[name]]);
 364  /**
 365   * Returns the raw representation of all the keyboard combinations of a given shortcut name.
 366   *
 367   * @param {Object} state Global state.
 368   * @param {string} name  Shortcut name.
 369   *
 370   * @return {string[]} Shortcuts.
 371   */
 372  
 373  const getAllShortcutRawKeyCombinations = Object(rememo["a" /* default */])((state, name) => {
 374    return selectors_getAllShortcutKeyCombinations(state, name).map(combination => getKeyCombinationRepresentation(combination, 'raw'));
 375  }, (state, name) => [state[name]]);
 376  /**
 377   * Returns the shortcut names list for a given category name.
 378   *
 379   * @param {Object} state Global state.
 380   * @param {string} name  Category name.
 381   *
 382   * @return {string[]} Shortcut names.
 383   */
 384  
 385  const getCategoryShortcuts = Object(rememo["a" /* default */])((state, categoryName) => {
 386    return Object.entries(state).filter(([, shortcut]) => shortcut.category === categoryName).map(([name]) => name);
 387  }, state => [state]);
 388  
 389  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/store/index.js
 390  /**
 391   * WordPress dependencies
 392   */
 393  
 394  /**
 395   * Internal dependencies
 396   */
 397  
 398  
 399  
 400  
 401  const STORE_NAME = 'core/keyboard-shortcuts';
 402  /**
 403   * Store definition for the keyboard shortcuts namespace.
 404   *
 405   * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore
 406   *
 407   * @type {Object}
 408   */
 409  
 410  const store = Object(external_wp_data_["createReduxStore"])(STORE_NAME, {
 411    reducer: store_reducer,
 412    actions: actions_namespaceObject,
 413    selectors: selectors_namespaceObject
 414  });
 415  Object(external_wp_data_["register"])(store);
 416  
 417  // EXTERNAL MODULE: external ["wp","compose"]
 418  var external_wp_compose_ = __webpack_require__("K9lf");
 419  
 420  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/hooks/use-shortcut.js
 421  /**
 422   * WordPress dependencies
 423   */
 424  
 425  
 426  /**
 427   * Internal dependencies
 428   */
 429  
 430  
 431  /**
 432   * Attach a keyboard shortcut handler.
 433   *
 434   * @param {string} name       Shortcut name.
 435   * @param {Function} callback Shortcut callback.
 436   * @param {Object} options    Shortcut options.
 437   */
 438  
 439  function useShortcut(name, callback, options) {
 440    const shortcuts = Object(external_wp_data_["useSelect"])(select => {
 441      return select(store).getAllShortcutRawKeyCombinations(name);
 442    }, [name]);
 443    Object(external_wp_compose_["useKeyboardShortcut"])(shortcuts, callback, options);
 444  }
 445  
 446  /* harmony default export */ var use_shortcut = (useShortcut);
 447  
 448  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/hooks/use-shortcut-event-match.js
 449  /**
 450   * WordPress dependencies
 451   */
 452  
 453  
 454  /**
 455   * Internal dependencies
 456   */
 457  
 458  
 459  /**
 460   * Returns a function to check if a keyboard event matches a shortcut name.
 461   *
 462   * @return {Function} A function to to check if a keyboard event matches a
 463   *                    predefined shortcut combination.
 464   */
 465  
 466  function useShortcutEventMatch() {
 467    const {
 468      getAllShortcutKeyCombinations
 469    } = Object(external_wp_data_["useSelect"])(store);
 470    /**
 471     * A function to check if a keyboard event matches a predefined shortcut
 472     * combination.
 473     *
 474     * @param {string}        name  Shortcut name.
 475     * @param {KeyboardEvent} event Event to check.
 476     *
 477     * @return {boolean} True if the event matches any shortcuts, false if not.
 478     */
 479  
 480    function isMatch(name, event) {
 481      return getAllShortcutKeyCombinations(name).some(({
 482        modifier,
 483        character
 484      }) => {
 485        return external_wp_keycodes_["isKeyboardEvent"][modifier](event, character);
 486      });
 487    }
 488  
 489    return isMatch;
 490  }
 491  
 492  // CONCATENATED MODULE: ./node_modules/@wordpress/keyboard-shortcuts/build-module/index.js
 493  
 494  
 495  
 496  
 497  
 498  /***/ }),
 499  
 500  /***/ "pPDe":
 501  /***/ (function(module, __webpack_exports__, __webpack_require__) {
 502  
 503  "use strict";
 504  
 505  
 506  var LEAF_KEY, hasWeakMap;
 507  
 508  /**
 509   * Arbitrary value used as key for referencing cache object in WeakMap tree.
 510   *
 511   * @type {Object}
 512   */
 513  LEAF_KEY = {};
 514  
 515  /**
 516   * Whether environment supports WeakMap.
 517   *
 518   * @type {boolean}
 519   */
 520  hasWeakMap = typeof WeakMap !== 'undefined';
 521  
 522  /**
 523   * Returns the first argument as the sole entry in an array.
 524   *
 525   * @param {*} value Value to return.
 526   *
 527   * @return {Array} Value returned as entry in array.
 528   */
 529  function arrayOf( value ) {
 530      return [ value ];
 531  }
 532  
 533  /**
 534   * Returns true if the value passed is object-like, or false otherwise. A value
 535   * is object-like if it can support property assignment, e.g. object or array.
 536   *
 537   * @param {*} value Value to test.
 538   *
 539   * @return {boolean} Whether value is object-like.
 540   */
 541  function isObjectLike( value ) {
 542      return !! value && 'object' === typeof value;
 543  }
 544  
 545  /**
 546   * Creates and returns a new cache object.
 547   *
 548   * @return {Object} Cache object.
 549   */
 550  function createCache() {
 551      var cache = {
 552          clear: function() {
 553              cache.head = null;
 554          },
 555      };
 556  
 557      return cache;
 558  }
 559  
 560  /**
 561   * Returns true if entries within the two arrays are strictly equal by
 562   * reference from a starting index.
 563   *
 564   * @param {Array}  a         First array.
 565   * @param {Array}  b         Second array.
 566   * @param {number} fromIndex Index from which to start comparison.
 567   *
 568   * @return {boolean} Whether arrays are shallowly equal.
 569   */
 570  function isShallowEqual( a, b, fromIndex ) {
 571      var i;
 572  
 573      if ( a.length !== b.length ) {
 574          return false;
 575      }
 576  
 577      for ( i = fromIndex; i < a.length; i++ ) {
 578          if ( a[ i ] !== b[ i ] ) {
 579              return false;
 580          }
 581      }
 582  
 583      return true;
 584  }
 585  
 586  /**
 587   * Returns a memoized selector function. The getDependants function argument is
 588   * called before the memoized selector and is expected to return an immutable
 589   * reference or array of references on which the selector depends for computing
 590   * its own return value. The memoize cache is preserved only as long as those
 591   * dependant references remain the same. If getDependants returns a different
 592   * reference(s), the cache is cleared and the selector value regenerated.
 593   *
 594   * @param {Function} selector      Selector function.
 595   * @param {Function} getDependants Dependant getter returning an immutable
 596   *                                 reference or array of reference used in
 597   *                                 cache bust consideration.
 598   *
 599   * @return {Function} Memoized selector.
 600   */
 601  /* harmony default export */ __webpack_exports__["a"] = (function( selector, getDependants ) {
 602      var rootCache, getCache;
 603  
 604      // Use object source as dependant if getter not provided
 605      if ( ! getDependants ) {
 606          getDependants = arrayOf;
 607      }
 608  
 609      /**
 610       * Returns the root cache. If WeakMap is supported, this is assigned to the
 611       * root WeakMap cache set, otherwise it is a shared instance of the default
 612       * cache object.
 613       *
 614       * @return {(WeakMap|Object)} Root cache object.
 615       */
 616  	function getRootCache() {
 617          return rootCache;
 618      }
 619  
 620      /**
 621       * Returns the cache for a given dependants array. When possible, a WeakMap
 622       * will be used to create a unique cache for each set of dependants. This
 623       * is feasible due to the nature of WeakMap in allowing garbage collection
 624       * to occur on entries where the key object is no longer referenced. Since
 625       * WeakMap requires the key to be an object, this is only possible when the
 626       * dependant is object-like. The root cache is created as a hierarchy where
 627       * each top-level key is the first entry in a dependants set, the value a
 628       * WeakMap where each key is the next dependant, and so on. This continues
 629       * so long as the dependants are object-like. If no dependants are object-
 630       * like, then the cache is shared across all invocations.
 631       *
 632       * @see isObjectLike
 633       *
 634       * @param {Array} dependants Selector dependants.
 635       *
 636       * @return {Object} Cache object.
 637       */
 638  	function getWeakMapCache( dependants ) {
 639          var caches = rootCache,
 640              isUniqueByDependants = true,
 641              i, dependant, map, cache;
 642  
 643          for ( i = 0; i < dependants.length; i++ ) {
 644              dependant = dependants[ i ];
 645  
 646              // Can only compose WeakMap from object-like key.
 647              if ( ! isObjectLike( dependant ) ) {
 648                  isUniqueByDependants = false;
 649                  break;
 650              }
 651  
 652              // Does current segment of cache already have a WeakMap?
 653              if ( caches.has( dependant ) ) {
 654                  // Traverse into nested WeakMap.
 655                  caches = caches.get( dependant );
 656              } else {
 657                  // Create, set, and traverse into a new one.
 658                  map = new WeakMap();
 659                  caches.set( dependant, map );
 660                  caches = map;
 661              }
 662          }
 663  
 664          // We use an arbitrary (but consistent) object as key for the last item
 665          // in the WeakMap to serve as our running cache.
 666          if ( ! caches.has( LEAF_KEY ) ) {
 667              cache = createCache();
 668              cache.isUniqueByDependants = isUniqueByDependants;
 669              caches.set( LEAF_KEY, cache );
 670          }
 671  
 672          return caches.get( LEAF_KEY );
 673      }
 674  
 675      // Assign cache handler by availability of WeakMap
 676      getCache = hasWeakMap ? getWeakMapCache : getRootCache;
 677  
 678      /**
 679       * Resets root memoization cache.
 680       */
 681  	function clear() {
 682          rootCache = hasWeakMap ? new WeakMap() : createCache();
 683      }
 684  
 685      // eslint-disable-next-line jsdoc/check-param-names
 686      /**
 687       * The augmented selector call, considering first whether dependants have
 688       * changed before passing it to underlying memoize function.
 689       *
 690       * @param {Object} source    Source object for derivation.
 691       * @param {...*}   extraArgs Additional arguments to pass to selector.
 692       *
 693       * @return {*} Selector result.
 694       */
 695  	function callSelector( /* source, ...extraArgs */ ) {
 696          var len = arguments.length,
 697              cache, node, i, args, dependants;
 698  
 699          // Create copy of arguments (avoid leaking deoptimization).
 700          args = new Array( len );
 701          for ( i = 0; i < len; i++ ) {
 702              args[ i ] = arguments[ i ];
 703          }
 704  
 705          dependants = getDependants.apply( null, args );
 706          cache = getCache( dependants );
 707  
 708          // If not guaranteed uniqueness by dependants (primitive type or lack
 709          // of WeakMap support), shallow compare against last dependants and, if
 710          // references have changed, destroy cache to recalculate result.
 711          if ( ! cache.isUniqueByDependants ) {
 712              if ( cache.lastDependants && ! isShallowEqual( dependants, cache.lastDependants, 0 ) ) {
 713                  cache.clear();
 714              }
 715  
 716              cache.lastDependants = dependants;
 717          }
 718  
 719          node = cache.head;
 720          while ( node ) {
 721              // Check whether node arguments match arguments
 722              if ( ! isShallowEqual( node.args, args, 1 ) ) {
 723                  node = node.next;
 724                  continue;
 725              }
 726  
 727              // At this point we can assume we've found a match
 728  
 729              // Surface matched node to head if not already
 730              if ( node !== cache.head ) {
 731                  // Adjust siblings to point to each other.
 732                  node.prev.next = node.next;
 733                  if ( node.next ) {
 734                      node.next.prev = node.prev;
 735                  }
 736  
 737                  node.next = cache.head;
 738                  node.prev = null;
 739                  cache.head.prev = node;
 740                  cache.head = node;
 741              }
 742  
 743              // Return immediately
 744              return node.val;
 745          }
 746  
 747          // No cached value found. Continue to insertion phase:
 748  
 749          node = {
 750              // Generate the result from original function
 751              val: selector.apply( null, args ),
 752          };
 753  
 754          // Avoid including the source object in the cache.
 755          args[ 0 ] = null;
 756          node.args = args;
 757  
 758          // Don't need to check whether node is already head, since it would
 759          // have been returned above already if it was
 760  
 761          // Shift existing head down list
 762          if ( cache.head ) {
 763              cache.head.prev = node;
 764              node.next = cache.head;
 765          }
 766  
 767          cache.head = node;
 768  
 769          return node.val;
 770      }
 771  
 772      callSelector.getDependants = getDependants;
 773      callSelector.clear = clear;
 774      clear();
 775  
 776      return callSelector;
 777  });
 778  
 779  
 780  /***/ })
 781  
 782  /******/ });


Generated: Sat Sep 18 01:00:04 2021 Cross-referenced by PHPXref 0.7.1