balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

keyboard-shortcuts.js (23415B)


      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 /******/ });