{"version":3,"file":"externals/@devsnc/library-unified-cache/28.0.2-uxfdefects.5/index.min.js","mappings":"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","sources":["webpack:///@babel/runtime/7.25.7/helpers/classCallCheck.js","webpack:///@babel/runtime/7.25.7/helpers/createClass.js","webpack:///@babel/runtime/7.25.7/helpers/defineProperty.js","webpack:///@babel/runtime/7.25.7/helpers/extends.js","webpack:///@babel/runtime/7.25.7/helpers/objectWithoutPropertiesLoose.js","webpack:///@babel/runtime/7.25.7/helpers/toPrimitive.js","webpack:///@babel/runtime/7.25.7/helpers/toPropertyKey.js","webpack:///@babel/runtime/7.25.7/helpers/typeof.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/createBlob.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/serializer.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/normalizeKey.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/isWebStorageValid.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/runCallback.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/getCallback.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/constants.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/evictions/helpers/lru.adapter.helpers.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/evictions/lru.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/evictions/ttl.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/evictions/evictionPolicies.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/getKeyPrefix.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/localStorage.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/IndexedDBCache.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/indexedDB.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/sessionStorage.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/cacheAPI.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/InMemoryCache.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/adapters/inMemory.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/stats/cacheStatsProxyHandler.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/isArray.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/extend.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/includes.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/runTwoCallbacks.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/cacheVersion.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/setGlobalCacheStats.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/utils/sumObjectsByKey.js","webpack:///@devsnc/library-unified-cache/28.0.2-uxfdefects.5/src/cache/unifiedCache.js"],"sourcesContent":["function _classCallCheck(a, n) {\n  if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nmodule.exports = _classCallCheck, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperties(e, r) {\n  for (var t = 0; t < r.length; t++) {\n    var o = r[t];\n    o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n  }\n}\nfunction _createClass(e, r, t) {\n  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n    writable: !1\n  }), e;\n}\nmodule.exports = _createClass, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toPropertyKey = require(\"./toPropertyKey.js\");\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nmodule.exports = _defineProperty, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _extends() {\n  return module.exports = _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _extends.apply(null, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _objectWithoutPropertiesLoose(r, e) {\n  if (null == r) return {};\n  var t = {};\n  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n    if (e.includes(n)) continue;\n    t[n] = r[n];\n  }\n  return t;\n}\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nmodule.exports = toPrimitive, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var _typeof = require(\"./typeof.js\")[\"default\"];\nvar toPrimitive = require(\"./toPrimitive.js\");\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nmodule.exports = toPropertyKey, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(o);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\n * Abstracts constructing a Blob object, so it also works in across\n * all modern browsers.\n *\n * Reference: https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob\n *\n * @param parts\n * @param properties\n */\nfunction createBlob(parts, properties) {\n\tparts = parts || [];\n\tproperties = properties || {};\n\ttry {\n\t\treturn new Blob(parts, properties);\n\t} catch (e) {\n\t\tif (e.name !== 'TypeError') {\n\t\t\tconsole.error(\"Blob isn't supported! \");\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport default createBlob;\n","/* eslint-disable no-bitwise */\nimport createBlob from './createBlob';\n\n// TODO: move these constants later\n// The best way to save binary data in localStorage is serializing\n// it to Base64, it helps us to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nconst BASE_CHARS =\n\t'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nconst BLOB_TYPE_PREFIX = '~~nxui_unified_cache_type~';\nconst BLOB_TYPE_PREFIX_REGEX = /^~~nxui_unified_cache_type~([^~]+)~/;\n\nconst SERIALIZED_MARKER = '__nxui_sc__:';\nconst SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// let stack some pile of constants for the serializations!\nconst TYPE_ARRAYBUFFER = 'arbf';\nconst TYPE_BLOB = 'blob';\nconst TYPE_INT8ARRAY = 'si08';\nconst TYPE_UINT8ARRAY = 'ui08';\nconst TYPE_UINT8CLAMPEDARRAY = 'uic8';\nconst TYPE_INT16ARRAY = 'si16';\nconst TYPE_INT32ARRAY = 'si32';\nconst TYPE_UINT16ARRAY = 'ur16';\nconst TYPE_UINT32ARRAY = 'ui32';\nconst TYPE_FLOAT32ARRAY = 'fl32';\nconst TYPE_FLOAT64ARRAY = 'fl64';\nconst TYPE_SERIALIZED_MARKER_LENGTH =\n\tSERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nconst toString = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n\t// Fill the string into a ArrayBuffer.\n\tlet bufferLength = serializedString.length * 0.75;\n\tconst len = serializedString.length;\n\tlet p = 0;\n\tlet encoded1, encoded2, encoded3, encoded4;\n\n\tif (serializedString[serializedString.length - 1] === '=') {\n\t\tbufferLength--;\n\t\tif (serializedString[serializedString.length - 2] === '=') {\n\t\t\tbufferLength--;\n\t\t}\n\t}\n\n\tconst buffer = new ArrayBuffer(bufferLength);\n\tconst bytes = new Uint8Array(buffer);\n\n\tfor (let i = 0; i < len; i += 4) {\n\t\tencoded1 = BASE_CHARS.indexOf(serializedString[i]);\n\t\tencoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n\t\tencoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n\t\tencoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n\t\t/*jslint bitwise: true */\n\t\tbytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n\t\tbytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n\t\tbytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n\t}\n\treturn buffer;\n}\n\n// Converts a buffer to a string to browser storage,\n// serialized, in the unifiedCache library.\nfunction bufferToString(buffer) {\n\t// base64-arraybuffer\n\tconst bytes = new Uint8Array(buffer);\n\tlet base64String = '';\n\n\tfor (let i = 0; i < bytes.length; i += 3) {\n\t\tbase64String += BASE_CHARS[bytes[i] >> 2];\n\t\tbase64String += BASE_CHARS[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n\t\tbase64String +=\n\t\t\tBASE_CHARS[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n\t\tbase64String += BASE_CHARS[bytes[i + 2] & 63];\n\t}\n\n\tif (bytes.length % 3 === 2) {\n\t\tbase64String = base64String.substring(0, base64String.length - 1) + '=';\n\t} else if (bytes.length % 3 === 1) {\n\t\tbase64String = base64String.substring(0, base64String.length - 2) + '==';\n\t}\n\n\treturn base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we will be able to store binary data with localStorage.\n// TODO add more robust code to serialize all JS Object Types\nfunction serialize(value, callback) {\n\tlet valueType = '';\n\tif (value) {\n\t\tvalueType = toString.call(value);\n\t}\n\n\t// Cannot use `value instanceof ArrayBuffer` or such here, as these\n\t// checks fail when running the tests\n\tif (\n\t\tvalue &&\n\t\t(valueType === '[object ArrayBuffer]' ||\n\t\t\t(value.buffer && toString.call(value.buffer) === '[object ArrayBuffer]'))\n\t) {\n\t\t// Convert binary arrays to a string and prefix the string with\n\t\t// a special marker.\n\t\tlet buffer;\n\t\tlet marker = SERIALIZED_MARKER;\n\n\t\tif (value instanceof ArrayBuffer) {\n\t\t\tbuffer = value;\n\t\t\tmarker += TYPE_ARRAYBUFFER;\n\t\t} else {\n\t\t\tbuffer = value.buffer;\n\n\t\t\tif (valueType === '[object Int8Array]') {\n\t\t\t\tmarker += TYPE_INT8ARRAY;\n\t\t\t} else if (valueType === '[object Uint8Array]') {\n\t\t\t\tmarker += TYPE_UINT8ARRAY;\n\t\t\t} else if (valueType === '[object Uint8ClampedArray]') {\n\t\t\t\tmarker += TYPE_UINT8CLAMPEDARRAY;\n\t\t\t} else if (valueType === '[object Int16Array]') {\n\t\t\t\tmarker += TYPE_INT16ARRAY;\n\t\t\t} else if (valueType === '[object Uint16Array]') {\n\t\t\t\tmarker += TYPE_UINT16ARRAY;\n\t\t\t} else if (valueType === '[object Int32Array]') {\n\t\t\t\tmarker += TYPE_INT32ARRAY;\n\t\t\t} else if (valueType === '[object Uint32Array]') {\n\t\t\t\tmarker += TYPE_UINT32ARRAY;\n\t\t\t} else if (valueType === '[object Float32Array]') {\n\t\t\t\tmarker += TYPE_FLOAT32ARRAY;\n\t\t\t} else if (valueType === '[object Float64Array]') {\n\t\t\t\tmarker += TYPE_FLOAT64ARRAY;\n\t\t\t} else {\n\t\t\t\tcallback(new Error('Failed to get type for BinaryArray'));\n\t\t\t}\n\t\t}\n\n\t\tcallback(marker + bufferToString(buffer));\n\t} else if (valueType === '[object Blob]') {\n\t\t// Convert the blob to a binaryArray and then to a string.\n\t\tconst fileReader = new FileReader();\n\n\t\tfileReader.onload = function() {\n\t\t\t// Backwards-compatible prefix for the blob type.\n\t\t\tconst str =\n\t\t\t\tBLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n\t\t\tcallback(SERIALIZED_MARKER + TYPE_BLOB + str);\n\t\t};\n\n\t\tfileReader.readAsArrayBuffer(value);\n\t} else {\n\t\ttry {\n\t\t\tcallback(JSON.stringify(value));\n\t\t} catch (e) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\"Couldn't convert value into a JSON string: \", value);\n\n\t\t\tcallback(null, e);\n\t\t}\n\t}\n}\n\n//\n/**\n * Deserialize data that we've inserted into a value column/field.We place\n * special markers into our strings to mark them as encoded; treat it as a\n * meta field, but it's the only to keep localStorage support intact.\n *\n * Oftentimes this will just deserialize JSON content, but if we have a\n * special marker (SERIALIZED_MARKER, defined above), we will extract\n * some kind of arraybuffer/binary data/typed array out of the string.\n *\n * @param value\n * @returns {Float32Array|Uint8Array|Int8Array|Float64Array|Int32Array|module:buffer.Blob|Blob|Int16Array|Uint16Array|*|Uint32Array|Uint8ClampedArray}\n */\nfunction deserialize(value) {\n\t// haven't marked this string as being specially serialized\n\t// (i.e. something other than serialized JSON), we can just return it\n\tif (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n\t\treturn JSON.parse(value);\n\t}\n\n\t// below code deals with deserializing some kind of Blob or TypedArray.\n\t// First, we separate out the type of data we're dealing with from\n\t// the data itself.\n\tlet serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n\tconst type = value.substring(\n\t\tSERIALIZED_MARKER_LENGTH,\n\t\tTYPE_SERIALIZED_MARKER_LENGTH\n\t);\n\n\tlet blobType;\n\t// Blob type serialization strategy\n\tif (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n\t\tconst matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n\t\tblobType = matcher[1];\n\t\tserializedString = serializedString.substring(matcher[0].length);\n\t}\n\tconst buffer = stringToBuffer(serializedString);\n\n\t// Return the right type based on the code/type set during\n\t// serialization.\n\tswitch (type) {\n\t\tcase TYPE_ARRAYBUFFER:\n\t\t\treturn buffer;\n\t\tcase TYPE_BLOB:\n\t\t\treturn createBlob([buffer], {type: blobType});\n\t\tcase TYPE_INT8ARRAY:\n\t\t\treturn new Int8Array(buffer);\n\t\tcase TYPE_UINT8ARRAY:\n\t\t\treturn new Uint8Array(buffer);\n\t\tcase TYPE_UINT8CLAMPEDARRAY:\n\t\t\treturn new Uint8ClampedArray(buffer);\n\t\tcase TYPE_INT16ARRAY:\n\t\t\treturn new Int16Array(buffer);\n\t\tcase TYPE_UINT16ARRAY:\n\t\t\treturn new Uint16Array(buffer);\n\t\tcase TYPE_INT32ARRAY:\n\t\t\treturn new Int32Array(buffer);\n\t\tcase TYPE_UINT32ARRAY:\n\t\t\treturn new Uint32Array(buffer);\n\t\tcase TYPE_FLOAT32ARRAY:\n\t\t\treturn new Float32Array(buffer);\n\t\tcase TYPE_FLOAT64ARRAY:\n\t\t\treturn new Float64Array(buffer);\n\t\tdefault:\n\t\t\tthrow new Error('Unknown type: ' + type);\n\t}\n}\n\nconst serializer = {\n\tserialize,\n\tdeserialize,\n\tstringToBuffer: stringToBuffer,\n\tbufferToString: bufferToString\n};\n\nexport default serializer;\n","export default function normalizeKey(key) {\n\t// Cast the key to a string, as that's all we can set as a key.\n\tif (typeof key !== 'string') {\n\t\tconsole.warn(`${key} used as a key, but it is not a string.`);\n\t\tkey = String(key);\n\t}\n\n\treturn key;\n}\n","// detects whether web storage is both supported and available\nexport function isWebStorageValid(type) {\n\tlet storage;\n\ttry {\n\t\tstorage = window[type];\n\t\treturn (\n\t\t\ttypeof storage !== 'undefined' &&\n\t\t\t'setItem' in storage &&\n\t\t\t!!storage.setItem\n\t\t);\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n\nexport default isWebStorageValid;\n","function runCallback(promise, callback) {\n\tif (callback) {\n\t\tpromise.then(\n\t\t\tfunction(result) {\n\t\t\t\tcallback(null, result);\n\t\t\t},\n\t\t\tfunction(error) {\n\t\t\t\tcallback(error);\n\t\t\t}\n\t\t);\n\t}\n}\n\nexport default runCallback;\n","export default function getCallback() {\n\tif (\n\t\targuments.length &&\n\t\ttypeof arguments[arguments.length - 1] === 'function'\n\t) {\n\t\treturn arguments[arguments.length - 1];\n\t}\n}\n","/**\n *\n * @constant {{SESSIONSTORAGE: Storage, LOCALSTORAGE: Storage}}\n */\nexport const STORAGE = {\n\tLOCALSTORAGE: window.localStorage,\n\tSESSIONSTORAGE: window.sessionStorage,\n\tCACHE_API: window.caches,\n\tINDEXEDDB: window.indexedDB\n};\n\nconst  DEFAULT_TTL = 300000;\nlet ttl = DEFAULT_TTL;\n\nexport const KEY_DELIMITER = '__';\n\nexport const NXUI_UNIFIED_CACHE = 'nxui__unified_cache';\n\nexport const CACHE_VERSION = 'version';\n\nexport const STORAGE_KEYPREFIX = `${KEY_DELIMITER}${NXUI_UNIFIED_CACHE}${KEY_DELIMITER}`;\n\nexport const VERSION_KEY = `${STORAGE_KEYPREFIX}${CACHE_VERSION}`;\n\nexport function getTTL() {\n\treturn ttl;\n}\n\nexport function setTTL( newTtl = DEFAULT_TTL ) {\n\tttl = newTtl;\n}\n\nexport const TTL_EXPIRED_ITEM_KEYWORD = '__uc__ttl_expired_item';\n","import { VERSION_KEY } from '../../utils/constants';\n\nexport const isLRUItem = (result) => {\n    return (\n        Object.prototype.hasOwnProperty.call(result, 'value') &&\n        Object.prototype.hasOwnProperty.call(result, 'instancePrefix') &&\n        Object.prototype.hasOwnProperty.call(result, 'lastUsedTime')\n    );\n}\n\n\nexport const removeItemsByInstance = (adapter, instancePrefix) => {\n    if (instancePrefix === null) return;\n\n    let keys = [];\n    for (let i = 0; i < adapter.length; i++) {\n        const itemKey = adapter.key(i);\n        if (itemKey.startsWith(instancePrefix)) {\n            keys.push(itemKey);\n        }\n    }\n\n    for (const key of keys) {\n        adapter.removeItem(key);\n    }\n}\n\nexport const createInstanceAccessMap = (adapter, instancePrefix) => {\n    // Create a hash map instanceAccessMap to track the last used time of each instance except the instance of the current inserting item.\n    // Each instance is identified by its instance prefix, i.e., key prefix.\n    let instanceAccessMap = new Map();\n    for (let i = 0; i < adapter.length; i++) {\n        const itemKey = adapter.key(i);\n        if (itemKey === VERSION_KEY) {\n            continue;\n        }\n\n        let result = adapter.getItem(itemKey);\n        result = JSON.parse(result);\n\n        if (!isLRUItem(result)) {\n            continue;\n        }\n\n        // The instance of the current inserting item is considered as the most recently used instance\n        if (result.instancePrefix === instancePrefix) {\n            continue;\n        }\n\n        if (!instanceAccessMap.has(result.instancePrefix)) {\n            instanceAccessMap.set(result.instancePrefix, 0);\n        }\n\n        if (result.lastUsedTime > instanceAccessMap.get(result.instancePrefix)) {\n            instanceAccessMap.set(result.instancePrefix, result.lastUsedTime);\n        }\n    }\n\n    return instanceAccessMap;\n}\n","import { createInstanceAccessMap, removeItemsByInstance } from './helpers/lru.adapter.helpers';\n\n/**\n * Returns the current value associated with the given key, or null if the given key does not exist.\n * @param {string} key\n * @returns {string|null}\n */\nfunction getItem(key) {\n\tlet result = this.adapter.getItem(key);\n\tif (result == null) return null;\n\n\tresult = JSON.parse(result);\n\tresult.lastUsedTime = Date.now();\n\tthis.adapter.setItem(key, JSON.stringify(result));\n\n\treturn result.value;\n}\n\n/**\n * Wrap the value with a last used timestamp, a key prefix which identifies the instance that inserts the current item, and then sets the value of the pair \n * identified by key to value, creating a new key/value pair if none existed for key previously.\n *\n * If the new value couldn't be set due to a \"QuotaExceededError\" DOMException exception, remove all key/value pairs\n * from the least recently used instance, and then from the next least recently used instance until either the new value is set or no other LRU instance left.\n *\n * Throws a \"QuotaExceededError\" DOMException exception if the new value still couldn't be set.\n *\n * @param {string} keyPrefix \n * @param {string} key\n * @param {string} value\n\n */\nfunction setItem(keyPrefix, key, value) {\n    const data = {\n\t\tvalue: value,\n\t\tinstancePrefix: keyPrefix,\n\t\tlastUsedTime: Date.now()\n\t};\n\n    try {\n        this.adapter.setItem(keyPrefix + key, JSON.stringify(data));\n    } catch (e) {\n        if (e.name === 'QuotaExceededError'){\n            let instanceAccessMap = createInstanceAccessMap(this.adapter, keyPrefix);\n\n            // if there is no other LRU instances, we should not evict any LRU items\n            if (instanceAccessMap.size === 0) {\n                throw e;\n            }\n\n            let instanceAccessArray = [];\n            for (const instancePrefix of instanceAccessMap.keys()) {\n                instanceAccessArray.push({\n                    instancePrefix: instancePrefix,\n                    lastUsedTime: instanceAccessMap.get(instancePrefix)\n                });\n            }\n\n            let sorted = instanceAccessArray.sort(function(a, b) {\n                return a.lastUsedTime - b.lastUsedTime\n            });\n\n            let i = 0;\n            while(i < sorted.length) {\n                removeItemsByInstance(this.adapter, sorted[i].instancePrefix);\n                i++;\n                try {\n                    this.adapter.setItem(keyPrefix + key, JSON.stringify(data));\n                    break;\n                } catch (e) {\n                    if (e.name === 'QuotaExceededError' && i < sorted.length){\n                        continue;\n                    } else {\n                        throw e;\n                    }\n                }               \n            }\n        } else {\n            throw e;\n        }\n    }\n}\n\nexport default function (adapter) {\n    const lru = {\n        adapter: adapter,\n        getItem: getItem,\n        setItem: setItem\n    };\n\n    return lru;\n}\n","import {TTL_EXPIRED_ITEM_KEYWORD, VERSION_KEY, getTTL} from '../utils/constants';\n\n/**\n * Returns the current value associated with the given key,\n * null if the given key does not exist,\n * or the 'TTL_EXPIRED_ITEM_KEYWORD' if the entry has already expired.\n *\n * @param {object} adapter\n * @param {string} key\n * @returns {string|null}\n */\nfunction getItem(adapter, key) {\n    let originalResult = adapter.getItem(key);\n    if (originalResult == null)\n        return null;\n\n\tlet result = JSON.parse(originalResult);\n    if (Object.prototype.hasOwnProperty.call(result, 'value') && Object.prototype.hasOwnProperty.call(result, 'expiry')) {\n        var now = Date.now()\n        if (now > result.expiry) {\n            adapter.removeItem(key);\n            return `\"${TTL_EXPIRED_ITEM_KEYWORD}\"`;\n        }\n\t\treturn result.value;\n    }\n\n\treturn originalResult;\n}\n\n/**\n * Wrap the value with an expiration timestamp, and then sets the value of the pair identified by key to value, creating a new\n * key/value pair if none existed for key previously.\n *\n * If the new value couldn't be set due to a \"QuotaExceededError\" DOMException exception, remove all expired key/value pairs\n * and set the new value again.\n *\n * Throws a \"QuotaExceededError\" DOMException exception if the new value still couldn't be set.\n *\n * @param {object} adapter\n * @param {string} key\n * @param {string} value\n * @param {number} time to live in milliseconds\n */\nfunction setItem(adapter, key, value, ttl=getTTL()) {\n    function getKeysWithTTL() {\n        const length = adapter.length;\n        let keys = [];\n\n        for (let i = 0; i < length; i++) {\n            const itemKey = adapter.key(i);\n            if (itemKey === VERSION_KEY) {\n                continue;\n            }\n\n            let result = adapter.getItem(itemKey);\n            result = JSON.parse(result);\n            if (Object.prototype.hasOwnProperty.call(result, 'value') && Object.prototype.hasOwnProperty.call(result, 'expiry')) {\n                keys.push(itemKey);\n            }\n        }\n\n        return keys;\n    }\n\n    const data = {\n        value: value,\n        expiry: Date.now() + ttl\n    }\n\n    try {\n        adapter.setItem(key, JSON.stringify(data));\n    } catch (e) {\n        if (e.name === 'QuotaExceededError'){\n            let keys = getKeysWithTTL();\n            for (const itemKey of keys) {\n                //itemKey will be removed if it is expired\n                getItem(adapter, itemKey);\n            }\n\n            adapter.setItem(key, JSON.stringify(data));\n        } else {\n            throw e;\n        }\n    }\n}\n\nconst ttl = {\n\tgetItem: getItem,\n\tsetItem: setItem\n};\n\nexport default ttl;\n","import lru from \"./lru\";\nimport ttl from \"./ttl\";\n\n/**\n * Based on eviction policy of the merged adapter configuration, invoking the corresponding getItem(). No eviction policy is applied by default.\n * @param {string} adapter\n * @param {Object} config \n * @param {string} key\n * @returns {string|null} \n */\nfunction getItem(adapter, config, key) {\n    const evictionPolicy = config.evictionPolicy;\n\t\tlet result;\n\t\tswitch (evictionPolicy) {\n\t\t\tcase 'TTL':\n\t\t\t\tresult = ttl.getItem(adapter, key);\n\t\t\t\tbreak;\n\t\t\tcase 'LRU':\n\t\t\t\tresult = lru(adapter).getItem(key);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t//No eviction policy is applied by default.\n\t\t\t\tresult = adapter.getItem(key);\n\t\t}\n        return result;\n}\n\n/**\n * Based on eviction policy of the merged adapter configuration, invoking the corresponding setItem(). No eviction policy is applied by default.\n *\n * @param {string} adapter\n * @param {Object} config \n * @param {string} keyPrefix\n * @param {string} key\n * @param {string} value\n */\nfunction setItem(adapter, config, keyPrefix, key, value) {\n    const evictionPolicy = config.evictionPolicy;\n\tswitch (evictionPolicy) {\n\t\tcase 'TTL':\n\t\t\tttl.setItem(adapter, keyPrefix + key, value);\n\t\t\tbreak;\n\t\tcase 'LRU':\n\t\t\tlru(adapter).setItem(keyPrefix, key, value);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t//No eviction policy is applied by default.\n\t\t\tadapter.setItem(keyPrefix + key, value);\n\t}\n}\n    \nconst evictionPolicies = {\n\tgetItem: getItem,\n\tsetItem: setItem\n};\n\nexport default evictionPolicies;\n","import {KEY_DELIMITER, NXUI_UNIFIED_CACHE} from './constants';\n\n/**\n * builds the key prefix and returns it.\n * @param {object} options - configuration\n * @param {object} defaultConfig - default configuration\n * @returns {string} key prefix\n * @private\n */\nfunction getKeyPrefix(options, defaultConfig) {\n\t// keyPrefix string __nxui__unified_cache__keyvaluepairs__\n\tlet keyPrefix = `${KEY_DELIMITER}${NXUI_UNIFIED_CACHE}${KEY_DELIMITER}${options.name}${KEY_DELIMITER}`;\n\n\t// when configuration's storeName is different than the\n\t// default configuration's storeName prepend the keyPrefix\n\t// to build the generated keyPrefix\n\tif (options.storeName !== defaultConfig.storeName) {\n\t\tkeyPrefix += `${options.storeName}${KEY_DELIMITER}`;\n\t}\n\n\treturn keyPrefix;\n}\n\nexport default getKeyPrefix;\n","import serializer from '../utils/serializer';\nimport normalizeKey from '../utils/normalizeKey';\nimport isWebStorageValid from '../utils/isWebStorageValid';\nimport runCallback from '../utils/runCallback';\nimport getCallback from '../utils/getCallback';\nimport {\n\tSTORAGE,\n\tSTORAGE_KEYPREFIX,\n\tVERSION_KEY\n} from '../utils/constants';\nimport evictionPolicies from '../evictions/evictionPolicies';\nimport getKeyPrefix from '../utils/getKeyPrefix';\n\n/**\n * @constant {Storage} LOCALSTORAGE - window object's localStorage property\n */\nconst {LOCALSTORAGE} = STORAGE;\n\n/**\n * Check if localStorage throws when saving an item\n * @param {string} type\n * @returns {boolean} true if localStorage is successfully able to set value, otherwise false\n */\nfunction checkIfWebStorageThrows(type) {\n\tconst storage = window[type];\n\tconst localStorageTestKey = '_UnifiedCache_Support_Test';\n\n\ttry {\n\t\tstorage.setItem(localStorageTestKey, true);\n\t\tstorage.removeItem(localStorageTestKey);\n\n\t\treturn false;\n\t} catch (e) {\n\t\treturn true;\n\t}\n}\n\n/**\n * Checks if localStorage is usable and allows to save an item.\n *\n * It covers the use cases like:\n *   - safari private browsing mode\n *   - the available quota for localStorage is 0 and there wasn't any saved items yet\n * Reference: https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n *\n * @returns {boolean}\n * @private\n */\nfunction _isLocalStorageUsable() {\n\treturn !checkIfWebStorageThrows('localStorage') || LOCALSTORAGE.length > 0;\n}\n\n// Config the localStorage, using options set in the config.\nfunction _initStorage(options) {\n\tconst self = this;\n\tconst dbInfo = {};\n\tif (options) {\n\t\tfor (const i in options) {\n\t\t\tdbInfo[i] = options[i];\n\t\t}\n\t}\n\n\tdbInfo.keyPrefix = getKeyPrefix(options, self._defaultConfig);\n\n\tif (!_isLocalStorageUsable()) {\n\t\treturn Promise.reject();\n\t}\n\n\tself._dbInfo = dbInfo;\n\tdbInfo.serializer = serializer;\n\n\treturn Promise.resolve();\n}\n\nfunction _clear(dbInfo) {\n\tconst {keyPrefix} = dbInfo;\n\tconst storage = LOCALSTORAGE;\n\tfor (let i = storage.length - 1; i >= 0; i--) {\n\t\tconst key = storage.key(i);\n\n\t\tif (key.indexOf(keyPrefix) === 0) {\n\t\t\tstorage.removeItem(key);\n\t\t}\n\t}\n}\n\n/**\n * Remove all keys from the localStorage, effectively destroying\n * all data in the app's key/value\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction clear(callback) {\n\tconst self = this;\n\tconst promise = self.ready().then(function() {\n\t\t_clear(self._dbInfo);\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Retrieve an item from the localStorage. Unlike the default indexedDB,\n * we don't modify return values at all. If a key's value\n * is `undefined`, we pass that value to the Promise.\n * @param {string} key\n * @param {function} callback\n * @returns {Promise<*>} promise for the value stored\n */\nfunction getItem(key, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tlet result = evictionPolicies.getItem(\n\t\t\tLOCALSTORAGE,\n\t\t\tself._config,\n\t\t\tdbInfo.keyPrefix + normalizeKey(key)\n\t\t);\n\n\t\t// If a result was found, parse it from the serialized\n\t\t// string into a JS object. If result isn't truthy, the key\n\t\t// is likely undefined and we'll pass it straight to the promise.\n\t\tif (result) {\n\t\t\tresult = dbInfo.serializer.deserialize(result);\n\t\t}\n\n\t\treturn result;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Set a key's value in localStorage.\n *\n * callback support to address use cases like:\n *   - user want to operate on that value only after\n *   they're sure about value is set to the localStorage\n *   e.g. save, or something like that on the current form page\n *\n * @param {string} key\n * @param {*} value\n * @param {function} callback\n * @returns {*}\n */\nfunction setItem(key, value, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\t// TODO how should we handle undefined value\n\t\t//  - save null for undefined value??\n\n\t\t// Save the original value to pass to the callback.\n\t\tconst originalValue = value;\n\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tconst dbInfo = self._dbInfo;\n\t\t\tdbInfo.serializer.serialize(value, function(value, error) {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tevictionPolicies.setItem(\n\t\t\t\t\t\t\tLOCALSTORAGE,\n\t\t\t\t\t\t\tself._config,\n\t\t\t\t\t\t\tdbInfo.keyPrefix,\n\t\t\t\t\t\t\tnormalizeKey(key),\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresolve(originalValue);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// window.localStorage capacity exceeded.\n\t\t\t\t\t\t// TODO: Make this a specific error or\n\t\t\t\t\t\t//  a public event for page author to hook handlers on the page\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\te.name === 'QuotaExceededError' ||\n\t\t\t\t\t\t\te.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treject(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * when passed a number n, returns the name of the nth key\n * in a given localStorage object.\n * @param {number} n\n * @param {function} callback\n * @returns {Promise<*>} promise for a string containing the name of the key.\n * If the index does not exist, null is returned.\n */\nfunction key(n, callback) {\n\tconst self = this;\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = LOCALSTORAGE.key(n);\n\t\t} catch (error) {\n\t\t\tresult = null;\n\t\t}\n\n\t\t// remove the prefix from the key, if a key is found.\n\t\tif (result) {\n\t\t\tresult = result.substring(dbInfo.keyPrefix.length);\n\t\t}\n\n\t\treturn result;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * gets the list of keys in localStorage.\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction keys(callback) {\n\tconst self = this;\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tconst length = LOCALSTORAGE.length;\n\t\tlet keys = [];\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tconst itemKey = LOCALSTORAGE.key(i);\n\t\t\tif (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n\t\t\t\tkeys.push(itemKey.substring(dbInfo.keyPrefix.length));\n\t\t\t}\n\t\t}\n\n\t\treturn keys;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * supply the number of keys in the localStorage\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction length(callback) {\n\tconst self = this;\n\tconst promise = self.keys().then(function(keys) {\n\t\treturn keys.length;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Remove an item from the localStorage.\n * @param {string} key\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction removeItem(key, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tLOCALSTORAGE.removeItem(dbInfo.keyPrefix + normalizeKey(key));\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Iterate over all items in the localStorage.\n * @param {function} iterator callback\n * @param {function} success callback\n * @returns {Promise<*>}\n */\nfunction iterate(iterator, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tconst keyPrefix = dbInfo.keyPrefix;\n\t\tconst keyPrefixLength = keyPrefix.length;\n\t\tconst length = LOCALSTORAGE.length;\n\n\t\t// use a dedicated iterator instead of the `i` variable below\n\t\t// so other keys we fetch in localStorage aren't counted in\n\t\t// the `iterationNumber` argument passed to the `iterate()`\n\t\tlet iterationNumber = 1;\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tconst key = LOCALSTORAGE.key(i);\n\t\t\tif (key.indexOf(keyPrefix) !== 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet value = LOCALSTORAGE.getItem(key);\n\n\t\t\t// If a result was found, parse it from the serialized\n\t\t\t// string into a JS object. If result isn't truthy, the\n\t\t\t// key is likely undefined and we'll pass it straight\n\t\t\t// to the iterator.\n\t\t\tif (value) {\n\t\t\t\tvalue = dbInfo.serializer.deserialize(value);\n\t\t\t}\n\n\t\t\tvalue = iterator(\n\t\t\t\tvalue,\n\t\t\t\tkey.substring(keyPrefixLength),\n\t\t\t\titerationNumber++\n\t\t\t);\n\n\t\t\tif (value !== void 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * drops the localStorage instance\n * @param {object} options\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction dropInstance(options, callback) {\n\tcallback = getCallback.apply(this, arguments);\n\toptions = (typeof options !== 'function' && options) || {};\n\tif (!options.name) {\n\t\tconst currentConfig = this.config();\n\t\toptions.name = options.name || currentConfig.name;\n\t\toptions.storeName = options.storeName || currentConfig.storeName;\n\t}\n\n\tconst self = this;\n\tlet promise;\n\tif (!options.name) {\n\t\tpromise = Promise.reject('Invalid arguments');\n\t} else {\n\t\tpromise = new Promise(function(resolve) {\n\t\t\tif (!options.storeName) {\n\t\t\t\tresolve(`${options.name}__`);\n\t\t\t} else {\n\t\t\t\tresolve(getKeyPrefix(options, self._defaultConfig));\n\t\t\t}\n\t\t}).then(function(keyPrefix) {\n\t\t\tfor (let i = LOCALSTORAGE.length - 1; i >= 0; i--) {\n\t\t\t\tconst key = LOCALSTORAGE.key(i);\n\n\t\t\t\tif (key.indexOf(keyPrefix) === 0) {\n\t\t\t\t\tLOCALSTORAGE.removeItem(key);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\nfunction _clearAllInstances() {\n\tfor (let i = LOCALSTORAGE.length - 1; i >= 0; i--) {\n\t\tconst key = LOCALSTORAGE.key(i);\n\n\t\tif (key.indexOf(STORAGE_KEYPREFIX) === 0) {\n\t\t\tLOCALSTORAGE.removeItem(key);\n\t\t}\n\n\t}\n}\n\nexport function getCacheVersion() {\n\treturn LOCALSTORAGE.getItem(VERSION_KEY);\n}\n\nexport function setCacheVersion(version) {\n\treturn LOCALSTORAGE.setItem(VERSION_KEY, version);\n}\n\nconst localStorage = {\n\t_adapter: 'localStorage',\n\t_initStorage: _initStorage,\n\t_support: isWebStorageValid('localStorage'),\n\t_clearAllInstances: _clearAllInstances,\n\titerate: iterate,\n\tgetItem: getItem,\n\tsetItem: setItem,\n\tremoveItem: removeItem,\n\tclear: clear,\n\tlength: length,\n\tkey: key,\n\tkeys: keys,\n\tdropInstance: dropInstance\n};\n\nexport default localStorage;\n","import { STORAGE_KEYPREFIX, STORAGE } from '../utils/constants';\n\nconst READ_ONLY = 'readonly';\nconst READ_WRITE = 'readwrite';\n\nconst { INDEXEDDB } = STORAGE;\n\nfunction initStorage() {\n    const self = this;\n    if (!INDEXEDDB) {\n        return Promise.reject('IndexedDB not supported.');\n    }\n\n    return _connectToDB(`${STORAGE_KEYPREFIX}${self.name}`).then((db) => self.db = db);\n}\n\nfunction _connectToDB(database) {\n    try {\n        const openRequest = INDEXEDDB.open(database, 1);\n        openRequest.onupgradeneeded = () => openRequest.result.createObjectStore(STORAGE_KEYPREFIX);\n\n        return new Promise((resolve, reject) => {\n            openRequest.onsuccess = (event) => {\n                resolve(event.target.result);\n            };\n\n            openRequest.onerror = (event) => reject(event.target.error);\n        });\n    } catch (indexedDBError) {\n        return Promise.reject(indexedDBError);\n    }\n}\n\nfunction getObjectStore(indexedDBCache, mode = READ_ONLY) {\n    const transaction = indexedDBCache.db.transaction(STORAGE_KEYPREFIX, mode);\n    return transaction.objectStore(STORAGE_KEYPREFIX);\n}\n\nfunction processError(indexedDBRequestError) {\n    const error = {\n        retryable: true,\n        indexedDBErrorName: indexedDBRequestError.name,\n        indexedDBErrorMessage: indexedDBRequestError.message\n    };\n\n    //TODO: Extract error codes so they can be reused if needed.\n    switch (indexedDBRequestError.name) {\n        case 'AbortError':\n            error.name = 'ABORT';\n            error.message = 'Transaction aborted.';\n            break;\n        case 'ConstraintError':\n            error.name = 'INDEX_ERROR';\n            error.message = 'Index constraint violation.';\n            error.retryable = false;\n            break;\n        case 'QuotaExceededError':\n            error.name = 'DISK_FULL';\n            error.message = 'IndexedDB is full.';\n            break;\n        case 'VersionError':\n        case 'InvalidStateError':\n        case 'NotFoundError':\n            error.name = 'INVALID_DB';\n            error.message = 'Database in an inconsistent state.';\n            error.retryable = false;\n            break;\n        default:\n            error.name = 'UNKNOWN';\n            error.message = 'Unknown IndexedDB error';\n            break;\n    }\n\n    return error;\n}\n\nfunction makeRequest(indexedDBCache, request, mode = READ_ONLY) {\n    return new Promise((resolve, reject) => {\n        const objectStore = getObjectStore(indexedDBCache, mode);\n        const indexedDBRequest = request(objectStore);\n        indexedDBRequest.onsuccess = (event) => resolve(event.target.result);\n        indexedDBRequest.onerror = (event) => reject(event.target.error);\n    }).catch((error) => {\n        throw processError(error);\n    });\n}\n\nfunction getItem(key) {\n    return makeRequest(this, (objectStore) => objectStore.get(key));\n}\n\nfunction setItem(key, value) {\n    return makeRequest(\n        this,\n        (objectStore) => objectStore.put(value, key),\n        READ_WRITE\n    );\n}\n\nfunction removeItem(key) {\n    return makeRequest(\n        this,\n        (objectStore) => objectStore.delete(key),\n        READ_WRITE\n    );\n}\n\nfunction clear() {\n    return makeRequest(this, (objectStore) => objectStore.clear(), READ_WRITE);\n}\n\nfunction length() {\n    return makeRequest(this, (objectStore) => objectStore.count());\n}\n\nfunction keys() {\n    return makeRequest(this, (objectStore) => objectStore.getAllKeys());\n}\n\nfunction key(index) {\n    return this.keys().then((keys) => keys[index - 1]);\n}\n\nfunction iterate(iteratorCallback) {\n    return new Promise((resolve, reject) => {\n        const objectStore = getObjectStore(this);\n\n        let i = 1;\n        const cursorRequest = objectStore.openCursor();\n        cursorRequest.onsuccess = (event) => {\n            const cursor = event.target.result;\n            if (cursor) {\n                iteratorCallback(cursor.key, cursor.value, i++);\n                cursor.continue();\n            } else {\n                resolve();\n            }\n        };\n        cursorRequest.onerror = (event) => reject(event.target.error);\n    }).catch((error) => {\n        throw processError(error);\n    });\n}\n\n/**\n * Given a DB connection, start a new transaction and clear the cache.\n */\nfunction _clearDB(db) {\n    return new Promise((resolve, reject) => {\n        const transaction = db.transaction(STORAGE_KEYPREFIX, READ_WRITE);\n        const objectStore = transaction.objectStore(STORAGE_KEYPREFIX);\n        const clearRequest = objectStore.clear();\n\n        clearRequest.onsuccess = () => {\n            resolve();\n        };\n\n        clearRequest.onerror = (event) => {\n            console.debug(`Error clearing IndexedDB ${db.name}`);\n            reject(event.target.error);\n        }\n    });\n}\n\nexport function _clearAllInstances() {\n    return INDEXEDDB.databases().then((databases) => {\n        const clearPromises = [];\n        for (let i = databases.length - 1; i >= 0; i--) {\n            const database = databases[i].name;\n            if (database.indexOf(STORAGE_KEYPREFIX) === 0) {\n                clearPromises.push(_connectToDB(database).then((db) => _clearDB(db)));\n            }\n        }\n\n        return Promise.all(clearPromises);\n    });\n}\n\nexport default function (name) {\n    const IndexedDBCache = {\n        name: name,\n\n        initStorage: initStorage,\n        getItem: getItem,\n        setItem: setItem,\n        removeItem: removeItem,\n        clear: clear,\n        length: length,\n        key: key,\n        keys: keys,\n        iterate: iterate\n    };\n\n    //Export internal functions if we are in test environment.\n    if (typeof jest !== 'undefined') {\n        IndexedDBCache.testing = {\n            processError: processError,\n            makeRequest: makeRequest\n        };\n    }\n\n    return IndexedDBCache;\n}\n","import serializer from '../utils/serializer';\nimport runCallback from '../utils/runCallback';\nimport IndexedDBCache, { _clearAllInstances } from './IndexedDBCache';\nimport getKeyPrefix from '../utils/getKeyPrefix';\n\n/**\n *\n * @param {string} storeName The name to give to the database.\n * @param {array} options An object containing extra options to configure the cache\n * @returns A promise which is successful when the IndexedDB is initialized.\n */\nfunction initStorage({storeName = 'default', ...options}) {\n\tconst self = this;\n\tself._dbInfo = {\n\t\tserializer: serializer,\n\t\tindexedDBCache: IndexedDBCache(storeName),\n\t\tkeyPrefix: getKeyPrefix({storeName, ...options}, this._defaultConfig),\n\t\t...options\n\t};\n\n\treturn self._dbInfo.indexedDBCache.initStorage();\n}\n\n/**\n * Waits until the UnifiedCache is ready then calls the provided function.\n *\n * @param {UnifiedCache} unifiedCache The UnifiedCache instance to wait for\n * @param {function} callFunction The cache operation being called\n * @param {function} callback An optional callback function.\n * @returns a Promise from the callFunction\n */\nfunction makeDBCall(unifiedCache, callFunction, callback) {\n\tconst promise = unifiedCache\n\t\t.ready()\n\t\t.then(() => callFunction(unifiedCache._dbInfo.indexedDBCache));\n\trunCallback(promise, callback);\n\treturn promise;\n}\n\nfunction clear(callback) {\n\treturn makeDBCall(this, (indexedDBCache) => indexedDBCache.clear(), callback);\n}\n\nfunction getItem(key, callback) {\n\treturn makeDBCall(\n\t\tthis,\n\t\t(indexedDBCache) => indexedDBCache.getItem(key),\n\t\tcallback\n\t);\n}\n\nfunction setItem(key, value, callback) {\n\treturn makeDBCall(\n\t\tthis,\n\t\t(indexedDBCache) => indexedDBCache.setItem(key, value),\n\t\tcallback\n\t);\n}\n\nfunction removeItem(key, callback) {\n\treturn makeDBCall(\n\t\tthis,\n\t\t(indexedDBCache) => indexedDBCache.removeItem(key),\n\t\tcallback\n\t);\n}\n\nfunction key(index, callback) {\n\treturn makeDBCall(\n\t\tthis,\n\t\t(indexedDBCache) => indexedDBCache.key(index),\n\t\tcallback\n\t);\n}\n\nfunction keys(callback) {\n\treturn makeDBCall(this, (indexedDBCache) => indexedDBCache.keys(), callback);\n}\n\nfunction length(callback) {\n\treturn makeDBCall(\n\t\tthis,\n\t\t(indexedDBCache) => indexedDBCache.length(),\n\t\tcallback\n\t);\n}\n\nfunction iterate(iterator, callback) {\n\treturn makeDBCall(\n\t\tthis,\n\t\t(indexedDBCache) => indexedDBCache.iterate(iterator),\n\t\tcallback\n\t);\n}\n\nconst indexedDB = {\n\t_adapter: 'indexedDB',\n\t_initStorage: initStorage,\n\t_clearAllInstances: _clearAllInstances,\n\titerate: iterate,\n\tgetItem: getItem,\n\tsetItem: setItem,\n\tremoveItem: removeItem,\n\tclear: clear,\n\tlength: length,\n\tkey: key,\n\tkeys: keys\n};\n\nexport default indexedDB;\n","import serializer from '../utils/serializer';\nimport normalizeKey from '../utils/normalizeKey';\nimport isWebStorageValid from '../utils/isWebStorageValid';\nimport runCallback from '../utils/runCallback';\nimport getCallback from '../utils/getCallback';\nimport {\n\tSTORAGE_KEYPREFIX,\n\tSTORAGE,\n\tVERSION_KEY\n} from '../utils/constants';\nimport evictionPolicies from '../evictions/evictionPolicies';\nimport getKeyPrefix from '../utils/getKeyPrefix';\n\n/**\n * @constant {Storage} SESSIONSTORAGE - window object's sessionStorage property\n */\nconst {SESSIONSTORAGE} = STORAGE;\n\n/**\n * Check if sessionStorage throws when saving an item\n * @param {string} type\n * @returns {boolean} true if sessionStorage is successfully able to set value, otherwise false\n */\nfunction checkIfWebStorageThrows(type) {\n\tconst storage = window[type];\n\tconst sessionStorageTestKey = '_UnifiedCache_Support_Test';\n\n\ttry {\n\t\tstorage.setItem(sessionStorageTestKey, true);\n\t\tstorage.removeItem(sessionStorageTestKey);\n\n\t\treturn false;\n\t} catch (e) {\n\t\treturn true;\n\t}\n}\n\n/**\n * Checks if sessionStorage is usable and allows to save an item.\n *\n * It covers the use cases like:\n *   - safari private browsing mode\n *   - the available quota for sessionStorage is 0 and there wasn't any saved items yet\n * Reference: https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n *\n * @returns {boolean}\n * @private\n */\nfunction _isSessionStorageUsable() {\n\treturn (\n\t\t!checkIfWebStorageThrows('sessionStorage') || SESSIONSTORAGE.length > 0\n\t);\n}\n\n// Config the sessionStorage, using options set in the config.\nfunction _initStorage(options) {\n\tconst self = this;\n\tconst dbInfo = {};\n\tif (options) {\n\t\tfor (const i in options) {\n\t\t\tdbInfo[i] = options[i];\n\t\t}\n\t}\n\n\tdbInfo.keyPrefix = getKeyPrefix(options, self._defaultConfig);\n\n\tif (!_isSessionStorageUsable()) {\n\t\treturn Promise.reject();\n\t}\n\n\tself._dbInfo = dbInfo;\n\tdbInfo.serializer = serializer;\n\n\treturn Promise.resolve();\n}\n\n/**\n * Remove all keys from the sessionStorage, effectively destroying\n * all data in the app's key/value\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction clear(callback) {\n\tconst self = this;\n\tconst promise = self.ready().then(function() {\n\t\tconst {keyPrefix} = self._dbInfo;\n\t\tconst storage = SESSIONSTORAGE;\n\t\tfor (let i = storage.length - 1; i >= 0; i--) {\n\t\t\tconst key = storage.key(i);\n\n\t\t\tif (key.indexOf(keyPrefix) === 0) {\n\t\t\t\tstorage.removeItem(key);\n\t\t\t}\n\t\t}\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n/**\n * Retrieve an item from the sessionStorage. Unlike the default indexDB,\n * we don't modify return values at all. If a key's value\n * is `undefined`, we pass that value to the Promise.\n * @param {string} key\n * @param {function} callback\n * @returns {Promise<*>} promise for the value stored\n */\nfunction getItem(key, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tlet result = evictionPolicies.getItem(\n\t\t\tSESSIONSTORAGE,\n\t\t\tself._config,\n\t\t\tdbInfo.keyPrefix + normalizeKey(key)\n\t\t);\n\n\t\t// If a result was found, parse it from the serialized\n\t\t// string into a JS object. If result isn't truthy, the key\n\t\t// is likely undefined and we'll pass it straight to the promise.\n\t\tif (result) {\n\t\t\tresult = dbInfo.serializer.deserialize(result);\n\t\t}\n\n\t\treturn result;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Set a key's value in sessionStorage.\n *\n * callback support to address use cases like:\n *   - user want to operate on that value only after\n *   they're sure about value is set to the sessionStorage\n *   e.g. save, or something like that on the current form page\n *\n * @param {string} key\n * @param {*} value\n * @param {function} callback\n * @returns {*}\n */\nfunction setItem(key, value, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\t// TODO how should we handle undefined value\n\t\t//  - save null for undefined value??\n\n\t\t// Save the original value to pass to the callback.\n\t\tconst originalValue = value;\n\n\t\treturn new Promise(function(resolve, reject) {\n\t\t\tconst dbInfo = self._dbInfo;\n\t\t\tdbInfo.serializer.serialize(value, function(value, error) {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tevictionPolicies.setItem(\n\t\t\t\t\t\t\tSESSIONSTORAGE,\n\t\t\t\t\t\t\tself._config,\n\t\t\t\t\t\t\tdbInfo.keyPrefix,\n\t\t\t\t\t\t\tnormalizeKey(key),\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresolve(originalValue);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t// window.sessionStorage capacity exceeded.\n\t\t\t\t\t\t// TODO: Make this a specific error or\n\t\t\t\t\t\t//  a public event for page author to hook handlers on the page\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\te.name === 'QuotaExceededError' ||\n\t\t\t\t\t\t\te.name === 'NS_ERROR_DOM_QUOTA_REACHED'\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treject(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * when passed a number n, returns the name of the nth key\n * in a given sessionStorage object.\n * @param {number} n\n * @param {function} callback\n * @returns {Promise<*>} promise for a string containing the name of the key.\n * If the index does not exist, null is returned.\n */\nfunction key(n, callback) {\n\tconst self = this;\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = SESSIONSTORAGE.key(n);\n\t\t} catch (error) {\n\t\t\tresult = null;\n\t\t}\n\n\t\t// remove the prefix from the key, if a key is found.\n\t\tif (result) {\n\t\t\tresult = result.substring(dbInfo.keyPrefix.length);\n\t\t}\n\n\t\treturn result;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * gets the list of keys in sessionStorage.\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction keys(callback) {\n\tconst self = this;\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tconst length = SESSIONSTORAGE.length;\n\t\tlet keys = [];\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tconst itemKey = SESSIONSTORAGE.key(i);\n\t\t\tif (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n\t\t\t\tkeys.push(itemKey.substring(dbInfo.keyPrefix.length));\n\t\t\t}\n\t\t}\n\n\t\treturn keys;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * supply the number of keys in the sessionStorage\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction length(callback) {\n\tconst self = this;\n\tconst promise = self.keys().then(function(keys) {\n\t\treturn keys.length;\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Remove an item from the sessionStorage.\n * @param {string} key\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction removeItem(key, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tSESSIONSTORAGE.removeItem(dbInfo.keyPrefix + normalizeKey(key));\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * Iterate over all items in the sessionStorage.\n * @param iterator\n * @param callback\n * @returns {Promise<*>}\n */\nfunction iterate(iterator, callback) {\n\tconst self = this;\n\n\tconst promise = self.ready().then(function() {\n\t\tconst dbInfo = self._dbInfo;\n\t\tconst keyPrefix = dbInfo.keyPrefix;\n\t\tconst keyPrefixLength = keyPrefix.length;\n\t\tconst length = SESSIONSTORAGE.length;\n\n\t\t// use a dedicated iterator instead of the `i` variable below\n\t\t// so other keys we fetch in sessionStorage aren't counted in\n\t\t// the `iterationNumber` argument passed to the `iterate()`\n\t\tlet iterationNumber = 1;\n\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tconst key = SESSIONSTORAGE.key(i);\n\t\t\tif (key.indexOf(keyPrefix) !== 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet value = SESSIONSTORAGE.getItem(key);\n\n\t\t\t// If a result was found, parse it from the serialized\n\t\t\t// string into a JS object. If result isn't truthy, the\n\t\t\t// key is likely undefined and we'll pass it straight\n\t\t\t// to the iterator.\n\t\t\tif (value) {\n\t\t\t\tvalue = dbInfo.serializer.deserialize(value);\n\t\t\t}\n\n\t\t\tvalue = iterator(\n\t\t\t\tvalue,\n\t\t\t\tkey.substring(keyPrefixLength),\n\t\t\t\titerationNumber++\n\t\t\t);\n\n\t\t\tif (value !== void 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t});\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\n/**\n * drops the sessionStorage instance\n * @param {object} options\n * @param {function} callback\n * @returns {Promise<*>}\n */\nfunction dropInstance(options, callback) {\n\tcallback = getCallback.apply(this, arguments);\n\toptions = (typeof options !== 'function' && options) || {};\n\tif (!options.name) {\n\t\tconst currentConfig = this.config();\n\t\toptions.name = options.name || currentConfig.name;\n\t\toptions.storeName = options.storeName || currentConfig.storeName;\n\t}\n\n\tconst self = this;\n\tlet promise;\n\tif (!options.name) {\n\t\tpromise = Promise.reject('Invalid arguments');\n\t} else {\n\t\tpromise = new Promise(function(resolve) {\n\t\t\tif (!options.storeName) {\n\t\t\t\tresolve(`${options.name}__`);\n\t\t\t} else {\n\t\t\t\tresolve(getKeyPrefix(options, self._defaultConfig));\n\t\t\t}\n\t\t}).then(function(keyPrefix) {\n\t\t\tfor (let i = SESSIONSTORAGE.length - 1; i >= 0; i--) {\n\t\t\t\tconst key = SESSIONSTORAGE.key(i);\n\n\t\t\t\tif (key.indexOf(keyPrefix) === 0) {\n\t\t\t\t\tSESSIONSTORAGE.removeItem(key);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\trunCallback(promise, callback);\n\n\treturn promise;\n}\n\nfunction _clearAllInstances() {\n\tfor (let i = SESSIONSTORAGE.length - 1; i >= 0; i--) {\n\t\tconst key = SESSIONSTORAGE.key(i);\n\n\t\tif (key.indexOf(STORAGE_KEYPREFIX) === 0) {\n\t\t\tSESSIONSTORAGE.removeItem(key);\n\t\t}\n\t}\n}\n\nexport function getCacheVersion() {\n\treturn SESSIONSTORAGE.getItem(VERSION_KEY);\n}\n\nexport function setCacheVersion(version) {\n\treturn SESSIONSTORAGE.setItem(VERSION_KEY, version);\n}\n\nconst sessionStorage = {\n\t_adapter: 'sessionStorage',\n\t_initStorage: _initStorage,\n\t_support: isWebStorageValid('sessionStorage'),\n\t_clearAllInstances: _clearAllInstances,\n\titerate: iterate,\n\tgetItem: getItem,\n\tsetItem: setItem,\n\tremoveItem: removeItem,\n\tclear: clear,\n\tlength: length,\n\tkey: key,\n\tkeys: keys,\n\tdropInstance: dropInstance\n};\n\nexport default sessionStorage;\n","import {STORAGE_KEYPREFIX, STORAGE} from '../utils/constants';\nimport getKeyPrefix from \"../utils/getKeyPrefix\";\n\nconst {CACHE_API} = STORAGE;\n\n/**\n * Returns a Promise that resolves to true if the Cache Storage instance has been initialized.\n * Otherwise, it throws an Error.\n *\n * @param {object} options configuration used to initialize the Cache Storage instance\n * @return {Promise<boolean>}\n * @private\n */\nasync function _initStorage(options) {\n\ttry {\n\t\tthis._dbInfo = {\n\t\t\t...options,\n\t\t\tkeyPrefix: getKeyPrefix(options, this._defaultConfig),\n\t\t};\n\n\t\tthis._cacheStorage = await CACHE_API.open(this._dbInfo.keyPrefix);\n\t\treturn true;\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`InitError: Unable to initialize the Cache Storage instance - ${error}`\n\t\t);\n\t}\n}\n\n/**\n * Returns a Promise that resolves to the Response associated with the\n * first matching key in the Cache Storage instance.\n * If no match is found, the Promise resolves to undefined.\n *\n * @param {string|Request} key URL string, or a Request object containing the URL string\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<Response|undefined>}\n *\n */\nasync function getItem(key, callback) {\n\tconst fn = async () => {\n\t\tconst response = await this._cacheStorage.match(key);\n\t\tcallback?.(null, response);\n\t\treturn response;\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n/**\n * Adds key/value pairs to the Cache Storage instance overwriting any key/value pair previously stored\n * in the cache that matches the key.\n *\n * If no 'value' is provided, it will fetch from the 'key' URL\n * and add the resulting response object to the cache.\n *\n * It will return a Promise that resolves to undefined upon successful addition.\n *\n * @param {string|Request} key The Request object or URL string that you want to add to the cache.\n * @param {Response} value The value you want to match up to the key.\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<undefined>}\n */\nasync function setItem(key, value, callback) {\n\tconst fn = async () => {\n\t\tif (value == null) {\n\t\t\tawait this._cacheStorage.add(key);\n\t\t} else {\n\t\t\tawait this._cacheStorage.put(key, value.clone());\n\t\t}\n\t\tcallback?.(null);\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Invokes the provider iterator function for every entry in the Cache Storage instance.\n *\n * @param {function} iterator function to invoke for every entry. The function is invoked with the following\n * arguments: key, value, index (starts at 1)\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<undefined>}\n */\nasync function iterate(iterator, callback) {\n\tconst fn = async () => {\n\t\tconst requests = await this._cacheStorage.keys();\n\t\tlet index = 1;\n\t\tfor (const request of requests) {\n\t\t\tconst response = await this._cacheStorage.match(request);\n\t\t\titerator(request, response, index++);\n\t\t}\n\t\tcallback?.(null);\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Find the entry whose key is the request, and if found, deletes the entry and returns a Promise that\n * resolves to true. If no Cache entry is found, the Promise resolves to false.\n *\n * @param {string|Request} key URL string, or a Request Object containing the URL string.\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<boolean>}\n */\nasync function removeItem(key, callback) {\n\tconst fn = async () => {\n\t\tconst isDeleted = this._cacheStorage.delete(key);\n\t\tcallback?.(null, isDeleted);\n\t\treturn isDeleted;\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Removes all entries from the Cache Storage instance.\n * It will return a Promise that resolves to undefined upon successful\n * clearance.\n *\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<undefined>}\n */\nasync function clear(callback) {\n\tconst fn = async () => {\n\t\tconst requests = await this._cacheStorage.keys();\n\t\tconst promises = requests.map((request) =>\n\t\t\tthis._cacheStorage.delete(request)\n\t\t);\n\t\tawait Promise.all(promises);\n\t\tcallback?.(null);\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Returns a Promise that resolves to the number of entries in the Cache Storage instance.\n *\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<number>} Promise that resolves to the number of entries in the Cache Storage instance\n */\nasync function length(callback) {\n\tconst fn = async () => {\n\t\tconst requests = await this._cacheStorage.keys();\n\t\tconst length = requests.length;\n\t\tcallback?.(null, length);\n\t\treturn length;\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Returns a Promise that resolves to the nth Request Object\n * representing the key in the Cache Storage instance\n *\n * @param {number} index An integer representing the number of the key you want to get the name of. This is a zero-based\n * index.\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<Request>} A Promise that resolves to a Request object. If Request Object does not exist, a null\n * is returned\n */\nasync function key(index, callback) {\n\tconst fn = async () => {\n\t\tconst requests = await this._cacheStorage.keys();\n\t\tconst request = requests[index] || null;\n\t\tcallback?.(null, request);\n\t\treturn request;\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Returns a Promise that resolves to an array of Request objects representing the keys of the Cache Storage instance\n *\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<Request[]>}\n */\nasync function keys(callback) {\n\tconst fn = async () => {\n\t\tconst requests = await this._cacheStorage.keys();\n\t\tcallback?.(null, requests);\n\t\treturn requests;\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\n/**\n * Drops the Cache Storage instance.\n * Returns a Promise that resolves to true if the Cache Storage instance\n * was successfully deleted. Otherwise, the Promise resolves to false.\n *\n * @param {function} callback function to invoke upon completion or error\n * @return {Promise<boolean>}\n */\nasync function dropInstance(callback) {\n\tconst fn = async () => {\n\t\tconst isDeleted = await CACHE_API.delete(this._dbInfo.keyPrefix);\n\t\tcallback?.(null, isDeleted);\n\t\treturn isDeleted;\n\t};\n\n\treturn _runOnReady.call(this, fn, callback);\n}\n\nasync function _clearAllInstances() {\n\tconst keys = await CACHE_API.keys();\n\t\n\tfor (let i = keys.length - 1; i >= 0; i--) {\n\t\tconst key = keys[i];\n\t\tif (key.indexOf(STORAGE_KEYPREFIX) === 0) {\n\t\t\tconst cacheStorage = await CACHE_API.open(key);\n\t\t\tconst requests = await cacheStorage.keys();\n\t\t\tconst promises = requests.map((request) => cacheStorage.delete(request));\n\t\t\tawait Promise.all(promises);\n\t\t}\n\t}\n}\n\n/**\n * Returns true if Cache Storage is supported by the current browser.\n * Otherwise, it returns false.\n *\n * @return {boolean}\n * @private\n */\nfunction _isCacheAPISupported() {\n\treturn 'caches' in self;\n}\n\nasync function _runOnReady(fn, callback) {\n\ttry {\n\t\tif (await this.ready()) {\n\t\t\treturn fn();\n\t\t}\n\t} catch (error) {\n\t\tcallback?.(error);\n\t\tthrow error;\n\t}\n}\n\nconst cacheAPI = {\n\t_adapter: 'cacheAPI',\n\t_initStorage,\n\t_support: _isCacheAPISupported(),\n\t_clearAllInstances,\n\titerate,\n\tgetItem,\n\tsetItem,\n\tremoveItem,\n\tclear,\n\tlength,\n\tkey,\n\tkeys,\n\tdropInstance\n};\n\nexport default cacheAPI;\n","function initStorage() {\n    this.cache = new Map();\n}\n\nfunction getItem(key) {\n    const self = this;\n    return new Promise((resolve) => {\n        const value = self.cache.get(key);\n        resolve(value ? value : null);\n    });\n}\n\nfunction setItem(key, value) {\n    const self = this;\n    return new Promise((resolve) => {\n        self.cache.set(key, value);\n        resolve();\n    });\n}\n\nfunction removeItem(key) {\n    const self = this;\n    return new Promise((resolve) => {\n        self.cache.delete(key);\n        resolve();\n    });\n}\n\nfunction clear() {\n    const self = this;\n    return new Promise((resolve) => {\n        self.cache.clear();\n        resolve();\n    });\n}\n\nfunction length() {\n    const self = this;\n    return new Promise((resolve) => resolve(self.cache.size));\n}\n\nfunction key(keyIndex) {\n    const self = this;\n    return new Promise((resolve) => {\n        let i = 1;\n        for (const key of self.cache.keys()) {\n            if (i === keyIndex) {\n                resolve(key);\n                return;\n            }\n\n            i++;\n        }\n\n        resolve(null);\n    });\n}\n\nfunction keys() {\n    const self = this;\n    return new Promise((resolve) => {\n        const keys = [];\n        for (const key of self.cache.keys()) {\n            keys.push(key);\n        }\n\n        resolve(keys);\n    });\n}\n\nfunction iterate(iteratorCallback) {\n    const self = this;\n    new Promise((resolve) => {\n        let i = 1;\n        for (const entry of self.cache.entries()) {\n            iteratorCallback?.(entry[0], entry[1], i);\n            i++;\n        }\n\n        resolve();\n    });\n}\n\nexport default function () {\n    const inMemoryCache = {\n        initStorage: initStorage,\n        getItem: getItem,\n        setItem: setItem,\n        removeItem: removeItem,\n        clear: clear,\n        length: length,\n        key: key,\n        keys: keys,\n        iterate: iterate\n    };\n\n    return inMemoryCache;\n}\n","import serializer from '../utils/serializer';\nimport runCallback from '../utils/runCallback';\nimport InMemoryCache from './InMemoryCache';\nimport getKeyPrefix from '../utils/getKeyPrefix';\n\n/**\n * @param {array} options An object containing extra options to configure the cache\n * @returns A promise which is always successful.\n */\nfunction initStorage(options) {\n    this._dbInfo = {\n        serializer: serializer,\n\t\tinMemoryCache: InMemoryCache(),\n\t\tkeyPrefix: getKeyPrefix(options, this._defaultConfig),\n\t\t...options\n    };\n\n    return this._dbInfo.inMemoryCache.initStorage();\n}\n\n/**\n * Waits until the UnifiedCache is ready then calls the provided function.\n *\n * @param {UnifiedCache} unifiedCache The UnifiedCache instance to wait for\n * @param {function} callFunction The cache operation being called\n * @param {function} callback An optional callback function.\n * @returns a Promise from the callFunction\n */\nfunction makeInMemoryCall(unifiedCache, callFunction, callback) {\n    const promise = unifiedCache\n        .ready()\n        .then(() => callFunction(unifiedCache._dbInfo.inMemoryCache));\n    runCallback(promise, callback);\n    return promise;\n}\n\nfunction getItem(key, callback) {\n    return makeInMemoryCall(\n        this,\n        (inMemoryCache) => inMemoryCache.getItem(key),\n        callback\n    );\n}\n\nfunction setItem(key, value, callback) {\n    return makeInMemoryCall(\n        this,\n        (inMemoryCache) => inMemoryCache.setItem(key, value),\n        callback\n    );\n}\n\nfunction removeItem(key, callback) {\n    return makeInMemoryCall(\n        this,\n        (inMemoryCache) => inMemoryCache.removeItem(key),\n        callback\n    );\n}\n\nfunction clear(callback) {\n    return makeInMemoryCall(this, (inMemoryCache) => inMemoryCache.clear(), callback);\n}\n\nfunction key(index, callback) {\n    return makeInMemoryCall(\n        this,\n        (inMemoryCache) => inMemoryCache.key(index),\n        callback\n    );\n}\n\nfunction keys(callback) {\n    return makeInMemoryCall(this, (inMemoryCache) => inMemoryCache.keys(), callback);\n}\n\nfunction length(callback) {\n    return makeInMemoryCall(\n        this,\n        (inMemoryCache) => inMemoryCache.length(),\n        callback\n    );\n}\n\nfunction iterate(iterator, callback) {\n    return makeInMemoryCall(\n        this,\n        (inMemoryCache) => inMemoryCache.iterate(iterator),\n        callback\n    );\n}\n\nconst inMemory = {\n    _adapter: 'inMemory',\n    _initStorage: initStorage,\n    iterate: iterate,\n    getItem: getItem,\n    setItem: setItem,\n    removeItem: removeItem,\n    clear: clear,\n    length: length,\n    key: key,\n    keys: keys\n};\n\nexport default inMemory;\n","import {TTL_EXPIRED_ITEM_KEYWORD} from '../utils/constants';\n\nconst cacheStatsProxyHandler = {\n\tget(cacheInstance, prop) {\n\t\tif (prop === 'getItem') {\n\t\t\tconst originalMethod = cacheInstance[prop];\n\t\t\treturn new Proxy(originalMethod, {\n\t\t\t\tapply: async function (targetMethod, cacheInstanceProxy, args) {\n\t\t\t\t\tconst {_stats} = cacheInstanceProxy;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await targetMethod.apply(cacheInstanceProxy, args);\n\t\t\t\t\t\tif (result === TTL_EXPIRED_ITEM_KEYWORD) {\n\t\t\t\t\t\t\t_stats.stale++;\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t_stats.hit++;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_stats.miss++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t_stats.error++;\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (prop === 'setItem') {\n\t\t\tconst originalMethod = cacheInstance[prop];\n\t\t\treturn new Proxy(originalMethod, {\n\t\t\t\tapply: async function (targetMethod, cacheInstanceProxy, args) {\n\t\t\t\t\tconst {_stats} = cacheInstanceProxy;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst start = performance.now();\n\t\t\t\t\t\tconst result = await targetMethod.apply(cacheInstanceProxy, args);\n\t\t\t\t\t\tconst end = performance.now();\n\t\t\t\t\t\t_stats.buildTime += (end - start);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t_stats.error++;\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn cacheInstance[prop];\n\t},\n}\n\nexport default cacheStatsProxyHandler;\n","const isArray =\n\tArray.isArray ||\n\tfunction(arg) {\n\t\treturn Object.prototype.toString.call(arg) === '[object Array]';\n\t};\n\nexport default isArray;\n","import isArray from './isArray';\n\nexport function extend() {\n\tfor (let i = 1; i < arguments.length; i++) {\n\t\tconst arg = arguments[i];\n\n\t\tif (arg) {\n\t\t\tfor (let key in arg) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(arg, key)) {\n\t\t\t\t\tif (isArray(arg[key])) {\n\t\t\t\t\t\targuments[0][key] = arg[key].slice();\n\t\t\t\t\t} else {\n\t\t\t\t\t\targuments[0][key] = arg[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn arguments[0];\n}\n\nexport default extend;\n","const sameValue = (x, y) =>\n\tx === y ||\n\t(typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));\n\nconst includes = (array, searchElement) => {\n\tconst len = array.length;\n\tlet i = 0;\n\twhile (i < len) {\n\t\tif (sameValue(array[i], searchElement)) {\n\t\t\treturn true;\n\t\t}\n\t\ti++;\n\t}\n\n\treturn false;\n};\n\nexport default includes;\n","function runTwoCallbacks(promise, callback, errorCallback) {\n\tif (typeof callback === 'function') {\n\t\tpromise.then(callback);\n\t}\n\n\tif (typeof errorCallback === 'function') {\n\t\tpromise.catch(errorCallback);\n\t}\n}\n\nexport default runTwoCallbacks;\n","/**\n * @returns The cache version returned from the server.\n */\nexport function getServerCacheVersion() {\n    if (!window.NOW) {\n        return;\n    }\n\n    return window.NOW.unifiedCacheVersion;\n}\n\n/**\n * Checks if the cache version matches the current version. If the current version is undefined,\n * then this always returns false. If the provided version is undefined, this always returns true.\n *\n * @param cacheVersion The current version of the cache in the browser\n * @returns true if the cacheVersion matches the cache version defined by the server.\n */\nexport function isCacheVersionOld(cacheVersion) {\n    const serverCacheVersion = getServerCacheVersion();\n    return !cacheVersion || (serverCacheVersion && serverCacheVersion !== cacheVersion);\n}\n","function buildGlobalCacheStats(getAggregateCacheStats, getAllCacheStats) {\n\treturn Object.freeze({\n\t\tgetAggregateCacheStats,\n\t\tgetAllCacheStats\n\t});\n}\n\nfunction checkIfUxGlobalsExists() {\n\treturn window && window.ux_globals;\n}\n\n/**\n * Adds the cache stats methods that we want to expose globally in window.ux_globals\n *\n * @param {{getAggregateCacheStats: function, getAllCacheStats: function}} globalCacheStats\n */\nfunction setGlobalCacheStats({getAggregateCacheStats, getAllCacheStats}) {\n\tconst cacheStats = buildGlobalCacheStats(getAggregateCacheStats, getAllCacheStats);\n\tif (checkIfUxGlobalsExists()) {\n\t\twindow.ux_globals.__uc__cacheStats = cacheStats;\n\t} else {\n\t\twindow.ux_globals = {__uc__cacheStats: cacheStats};\n\t}\n}\n\nexport default setGlobalCacheStats;\n","/**\n * Returns a new object containing the sum of the values for every key in objects.\n *\n * @param {...object} objects objects with number values\n * @return {object}\n */\nfunction sumObjectsByKey(...objects) {\n\treturn objects.reduce((obj1, obj2) => {\n\t\tfor (let key in obj2) {\n\t\t\tif (Object.prototype.hasOwnProperty.call(obj2, key))\n\t\t\t\tobj1[key] = (obj1[key] || 0) + obj2[key];\n\t\t}\n\t\treturn obj1;\n\t}, {});\n}\n\nexport default sumObjectsByKey;\n","import localStorageAdapter, * as LocalStorage from './adapters/localStorage';\nimport indexedDBAdapter from './adapters/indexedDB';\nimport sessionStorageAdapter, * as SessionStorage from './adapters/sessionStorage';\nimport cacheAPIAdapter from './adapters/cacheAPI';\nimport inMemoryAdapter from './adapters/inMemory';\nimport cacheStatsProxyHandler from './stats/cacheStatsProxyHandler';\nimport extend from './utils/extend';\nimport includes from './utils/includes';\nimport runCallback from './utils/runCallback';\nimport runTwoCallbacks from './utils/runTwoCallbacks';\nimport serializer from './utils/serializer';\nimport {getServerCacheVersion, isCacheVersionOld} from './utils/cacheVersion';\nimport setGlobalCacheStats from './utils/setGlobalCacheStats';\nimport sumObjectsByKey from \"./utils/sumObjectsByKey\";\n\n/**\n * All defined adapters are stored here when `defineAdapter()` is called.\n * These defined adapters are shared across all instances of UnifiedCache.\n *\n * @type {Object} all defined adapters\n */\nconst DefinedAdapters = {};\n\n/**\n * List of supported adapter mappings.\n *\n * @type {Object} mappings of supported adapters\n */\nconst AdapterSupport = {};\n\n/**\n * List of Default adapters.\n *\n * @type {Object} default adapters\n */\nconst DefaultAdapters = {\n\tLOCALSTORAGE: localStorageAdapter,\n\tSESSIONSTORAGE: sessionStorageAdapter,\n\tINDEXEDDB: indexedDBAdapter,\n\tCACHE_API: cacheAPIAdapter,\n\tIN_MEMORY: inMemoryAdapter\n};\n\nconst dropAllInstancesPromises = [];\n\nfunction clearStorageInstances(adapter) {\n\tif (adapter._clearAllInstances) {\n\t\ttry {\n\t\t\t//Only drop adapters that support it\n\t\t\tdropAllInstancesPromises.push(adapter._clearAllInstances());\n\t\t} catch(error) {\n\t\t\tconsole.error(`Failed to clear cache ${adapter._adapter}.`, error); //Errors shouldn't block the cache\n\t\t}\n\t}\n}\n\nconst cacheVersionCheck = new Promise((resolve) => {\n\ttry {\n\t\t//Drop all persistent adapters except sessionstorage\n\t\tconst browserCacheVersion = LocalStorage.getCacheVersion();\n\t\tif (isCacheVersionOld(browserCacheVersion)) {\n\t\t\tclearStorageInstances(localStorageAdapter);\n\t\t\tclearStorageInstances(indexedDBAdapter);\n\t\t\tclearStorageInstances(cacheAPIAdapter);\n\n\t\t\tLocalStorage.setCacheVersion(getServerCacheVersion());\n\t\t}\n\n\t\t//Sessionstorage is a special case because each browser tab is a separate sessionstorage\n\t\t//instance. We keep a version in each session storage to track when it needs to be cleared.\n\t\tconst sessionStorageVersion = SessionStorage.getCacheVersion();\n\t\tif (isCacheVersionOld(sessionStorageVersion)) {\n\t\t\tclearStorageInstances(sessionStorageAdapter);\n\n\t\t\tSessionStorage.setCacheVersion(getServerCacheVersion());\n\t\t}\n\n\t\t//To prevent using the cache before the clear is done, we want all drop operations to\n\t\t//complete.\n\t\tPromise.all(dropAllInstancesPromises)\n\t\t\t.then(() => resolve())\n\t\t\t.catch(() => resolve()); //Errors shouldn't block the cache\n\t} catch (error) {\n\t\tconsole.error('Failed to clear all caches');\n\t\tresolve(); //Errors shouldn't block the cache\n\t}\n});\n\n/**\n * Default adapter order.\n * @type {string[]}  adapter order\n */\nconst DefaultAdapterOrder = [DefaultAdapters.LOCALSTORAGE._adapter];\n\n/**\n * Default adapter configuration.\n * @type {{adapter: string[], name: string, description: string, storeName: string}} adapter configuration\n */\nconst DefaultConfig = {\n\tdescription: 'NextUI web application unified cache',\n\tadapter: DefaultAdapterOrder.slice(),\n\tname: 'UnifiedCache',\n\tstoreName: 'keyvaluepairs'\n\t//\n\t// TODO: should we add more configuration details\n\t//  - size (default DB size _under_ 5MB, as it's the highest size we can use without any prompt),\n\t//  - version (1.0), etc\n};\n\nconst DefaultStats = {\n\thit: 0,\n\tmiss: 0,\n\terror: 0,\n\tstale: 0,\n\tbuildTime: 0\n};\n\n/**\n * List of supported eviction policies.\n * @type {string[]}  eviction policies\n */\nconst EvictionPolicies = ['TTL', 'LRU'];\n\n/**\n * Optional adapter API method.\n * @type {string[]} optional API methods\n */\nconst OptionalAdapterMethods = ['dropInstance'];\n\n/**\n * Adapter API methods for the UnifiedCache library.\n * @type {string[]} api methods\n */\nconst LibraryMethods = [\n\t'clear',\n\t'getItem',\n\t'iterate',\n\t'key',\n\t'keys',\n\t'length',\n\t'removeItem',\n\t'setItem'\n].concat(OptionalAdapterMethods);\n\n/**\n * Calls the unifiedCache instance adapter API methods, once the\n * adapter initialization is done.\n *\n * @param {UnifiedCache} unifiedCacheInstance\n * @param {LibraryMethods} libraryMethod\n */\nfunction callWhenReady(unifiedCacheInstance, libraryMethod) {\n\tunifiedCacheInstance[libraryMethod] = function() {\n\t\tconst _args = arguments;\n\t\t// once the unifiedCache instance is initialized with adapter\n\t\t// and ready, call the adapter API method with parameters\n\t\treturn unifiedCacheInstance.ready().then(function() {\n\t\t\treturn unifiedCacheInstance[libraryMethod].apply(\n\t\t\t\tunifiedCacheInstance,\n\t\t\t\t_args\n\t\t\t);\n\t\t});\n\t};\n}\n\n/**\n * Validate the eviction policy of the user provided configuration options.\n *\n * @param {{adapter: string[], evictionPolicy: string, name: string, description: string, storeName: string}} options\n * @returns {boolean}\n */\nfunction validateEvictionPolicy(options) {\n\tif (!options) return true;\n\n\tif (!Object.prototype.hasOwnProperty.call(options, 'evictionPolicy'))\n\t\treturn true;\n\n\tif (EvictionPolicies.includes(options.evictionPolicy)) return true;\n\n\tconst error = new Error(\n\t\t'Eviction policy ' +\n\t\t\toptions.evictionPolicy +\n\t\t\t' is not supported. No eviction policy will be applied.'\n\t);\n\tconsole.warn(error);\n\treturn false;\n}\n\n/**\n * An unifiedCache object\n * @param {DefaultConfig} _defaultConfig - default adapter configuration\n * @param {Object} _config - merged adapter configuration\n * @param {Promise<*>} _adapterSet - promise indicating adapter initialization\n * @param {function} _initAdapter - function that initialized the adapter\n * @param {Promise<*>} _ready - promise indicating adapter is ready to use\n * @param {{adapter: string, description: string, keyPrefix: string, name: string, storeName: string, serializer: object}} _dbInfo - adapter store information\n */\nclass UnifiedCache {\n\tstatic cacheInstances = [];\n\n\t/**\n\t * Returns the aggregate stats for all unified cache instances.\n\t *\n\t * @return {object}\n\t */\n\tstatic getAggregateCacheStats() {\n\t\tconst stats = UnifiedCache.cacheInstances.reduce((aggregateStats, cacheInstance) => {\n\t\t\treturn Object.entries(cacheInstance._stats)\n\t\t\t\t.reduce((accumulator, [attribute, currentValue]) => {\n\t\t\t\t\taccumulator[attribute] = (accumulator[attribute] || 0) + currentValue;\n\t\t\t\t\treturn accumulator;\n\t\t\t\t}, aggregateStats);\n\t\t}, {});\n\n\t\tconst {hit, miss} = stats;\n\t\treturn {\n\t\t\t...stats,\n\t\t\thitRate: (hit / (hit + miss)) || 0\n\t\t};\n\t}\n\n\n\t/**\n\t * Returns an object containing the stats for every unified cache namespace.\n\t *\n\t * @return {object}\n\t */\n\tstatic getAllCacheStats() {\n\t\treturn UnifiedCache.cacheInstances.reduce((allCacheStats, cacheInstance) => {\n\t\t\tif (cacheInstance._dbInfo) {\n\t\t\t\tconst {adapter, keyPrefix} = cacheInstance._dbInfo;\n\t\t\t\tconst key = `${adapter}${keyPrefix}`;\n\t\t\t\tallCacheStats[key] = sumObjectsByKey(allCacheStats[key] || {}, cacheInstance._stats);\n\t\t\t}\n\t\t\treturn allCacheStats;\n\t\t}, {})\n\t}\n\n\tconstructor(options) {\n\t\t// loop through the default adapters to define the\n\t\t// adapters in synchronous manner\n\t\tfor (let adapterTypeKey in DefaultAdapters) {\n\t\t\tif (\n\t\t\t\tObject.prototype.hasOwnProperty.call(DefaultAdapters, adapterTypeKey)\n\t\t\t) {\n\t\t\t\tconst adapter = DefaultAdapters[adapterTypeKey];\n\t\t\t\tconst adapterName = adapter._adapter;\n\t\t\t\tthis[adapterTypeKey] = adapterName;\n\n\t\t\t\tif (!DefinedAdapters[adapterName]) {\n\t\t\t\t\t// we don't need to wait for the promise,\n\t\t\t\t\t// since the default adapters can be defined\n\t\t\t\t\t// in a blocking manner\n\t\t\t\t\tthis.defineAdapter(adapter);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvalidateEvictionPolicy(options);\n\n\t\tthis._defaultConfig = extend({}, DefaultConfig);\n\t\tthis._stats = extend({}, DefaultStats);\n\t\tthis._config = extend({}, this._defaultConfig, options);\n\t\tthis._adapterSet = null;\n\t\tthis._initAdapter = null;\n\t\tthis._ready = false;\n\t\tthis._dbInfo = null;\n\n\t\tthis._wrapLibraryMethodsWithReady();\n\t\tthis.setAdapter(this._config.adapter).catch(() => {});\n\n\t\tconst unifiedCacheProxy = new Proxy(this, cacheStatsProxyHandler);\n\t\tUnifiedCache.cacheInstances.push(unifiedCacheProxy);\n\t\treturn unifiedCacheProxy;\n\t}\n\n\t/**\n\t * Set any config values for UnifiedCache; can be called anytime before\n\t * the first API call (e.g. `getItem`, `setItem`).\n\t * We loop through options so we don't overwrite existing config values.\n\t * @param {{adapter: string[], evictionPolicy: string, name: string, description: string, storeName: string}} options\n\t * @returns {Error|boolean|Promise<never>|*|null}\n\t */\n\tconfig(options) {\n\t\tvalidateEvictionPolicy(options);\n\t\t// If the options argument is an object, we use it to set values.\n\t\t// Otherwise, we return either a specified config value or all\n\t\t// config values.\n\t\tif (typeof options === 'object') {\n\t\t\t// If UnifiedCache is ready and fully initialized, we can't set\n\t\t\t// any new configuration values. Instead, we return an error.\n\t\t\tif (this._ready) {\n\t\t\t\treturn new Error(\n\t\t\t\t\t\"Can't call config() after UnifiedCache \" + 'has been used.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfor (let i in options) {\n\t\t\t\t// TODO: set additional configuration options like storeName, version etc.\n\t\t\t\tthis._config[i] = options[i];\n\t\t\t}\n\n\t\t\t// after all config options are set and\n\t\t\t// the adapter option is used, try setting it\n\t\t\tif ('adapter' in options && options.adapter) {\n\t\t\t\treturn this.setAdapter(this._config.adapter);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} else if (typeof options === 'string') {\n\t\t\treturn this._config[options];\n\t\t} else {\n\t\t\treturn this._config;\n\t\t}\n\t}\n\n\t/**\n\t * Returns the adapter in use.\n\t * @returns {string|null} adapter name in use or null during initialization\n\t * process or when unable to find adapter.\n\t */\n\tadapter() {\n\t\treturn this._adapter || null;\n\t}\n\n\t/**\n\t * Sets the adapter to the unifiedCache.\n\t * @param {string[]} adapters - list of adapter names\n\t * @param {function} callback - success callback\n\t * @param {function} errorCallback - error callback\n\t * @returns {null|Promise<never>|*}\n\t */\n\tsetAdapter(adapters, callback, errorCallback) {\n\t\tconst self = this;\n\t\tconst supportedAdapters = this._getSupportedAdapters(adapters);\n\n\t\tfunction setAdapterToConfig() {\n\t\t\tself._config.adapter = self.adapter();\n\t\t}\n\n\t\tfunction extendSelfWithAdapter(adapter) {\n\t\t\tself._extend(adapter);\n\t\t\tsetAdapterToConfig();\n\t\t\t// TODO initialize the indexedDB adapter when no adapter\n\t\t\t//  is passed to config\n\t\t\tself._ready = self._initStorage(self._config);\n\t\t\treturn self._ready;\n\t\t}\n\n\t\tfunction initAdapter(supportedAdapters) {\n\t\t\tlet currentAdapterIndex = 0;\n\t\t\treturn () => {\n\t\t\t\tfunction adapterPromiseLoop() {\n\t\t\t\t\twhile (currentAdapterIndex < supportedAdapters.length) {\n\t\t\t\t\t\tlet adapterName = supportedAdapters[currentAdapterIndex];\n\n\t\t\t\t\t\tself._dbInfo = null;\n\t\t\t\t\t\tself._ready = null;\n\n\t\t\t\t\t\tcurrentAdapterIndex++;\n\t\t\t\t\t\treturn self\n\t\t\t\t\t\t\t.getAdapter(adapterName)\n\t\t\t\t\t\t\t.then((adapter) => extendSelfWithAdapter(adapter))\n\t\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\t\tconsole.warn(error);\n\t\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(adapterPromiseLoop);\n\t\t\t\t\t}\n\n\t\t\t\t\tsetAdapterToConfig();\n\t\t\t\t\tconst error = new Error('No available storage method found.');\n\t\t\t\t\tself._adapterSet = Promise.reject(error);\n\t\t\t\t\treturn self._adapterSet;\n\t\t\t\t}\n\n\t\t\t\treturn adapterPromiseLoop();\n\t\t\t};\n\t\t}\n\n\t\t// There might be a adapter initialization in progress\n\t\t// so wait for it to finish in order to avoid a possible\n\t\t// race condition to set _dbInfo\n\t\tconst oldAdapterSetDone =\n\t\t\tthis._adapterSet !== null\n\t\t\t\t? this._adapterSet.catch(() => Promise.resolve())\n\t\t\t\t: Promise.resolve();\n\n\t\tthis._adapterSet = oldAdapterSetDone\n\t\t\t.then(() => {\n\t\t\t\tconst adapterName = supportedAdapters[0];\n\t\t\t\tif (adapterName) {\n\t\t\t\t\tself._dbInfo = null;\n\t\t\t\t\tself._ready = null;\n\n\t\t\t\t\treturn self.getAdapter(adapterName).then((adapter) => {\n\t\t\t\t\t\tself._adapter = adapter._adapter;\n\t\t\t\t\t\tsetAdapterToConfig();\n\t\t\t\t\t\tself._wrapLibraryMethodsWithReady();\n\t\t\t\t\t\tself._initAdapter = initAdapter(supportedAdapters);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tsetAdapterToConfig();\n\t\t\t\tconst error = new Error('No available storage method found.');\n\t\t\t\tself._adapterSet = Promise.reject(error);\n\t\t\t\treturn self._adapterSet;\n\t\t\t});\n\n\t\trunTwoCallbacks(this._adapterSet, callback, errorCallback);\n\t\treturn this._adapterSet;\n\t}\n\n\t/**\n\t * Returns the name of the adapter being used, null during the\n\t * asynchronous adapter initialization process, or\n\t * null if the asynchronous adapter initialization process failed\n\t * to find a usable adapter.\n\t * @param {string} adapterName - adapter name\n\t * @param {function} callback - success callback\n\t * @param {function} errorCallback - error callback\n\t * @returns {Promise<unknown> | Promise<never>} promise for the defined adapter\n\t */\n\tgetAdapter(adapterName, callback, errorCallback) {\n\t\tconst getAdapterPromise = DefinedAdapters[adapterName]\n\t\t\t? Promise.resolve(DefinedAdapters[adapterName])\n\t\t\t: Promise.reject(new Error('Adapter not found.'));\n\n\t\trunTwoCallbacks(getAdapterPromise, callback, errorCallback);\n\n\t\treturn getAdapterPromise;\n\t}\n\n\t/**\n\t * Returns the serializer object containing the serialization\n\t * & deserialization methods.\n\t * @param {function} callback\n\t * @returns {Promise<{serialize: function, deserialize: function}>} a promise for serializer object\n\t */\n\tgetSerializer(callback) {\n\t\tconst serializerPromise = Promise.resolve(serializer);\n\t\trunTwoCallbacks(serializerPromise, callback);\n\t\treturn serializerPromise;\n\t}\n\n\t/**\n\t * Defines adapter for the {@link UnifiedCache} and ensures adapter in compliance\n\t * with the API methods contract.\n\t * @param {object} adapterObject - Adapter object with library methods and properties\n\t * @param {function} callback - success callback\n\t * @param {function} errorCallback - error callback\n\t * @returns {Promise<*>}\n\t */\n\tdefineAdapter(adapterObject, callback, errorCallback) {\n\t\tconst promise = new Promise(function(resolve, reject) {\n\t\t\ttry {\n\t\t\t\tconst adapterName = adapterObject._adapter;\n\t\t\t\tconst complianceError = new Error('Custom adapter not compliant');\n\n\t\t\t\t// Adapter name should be defined and not overlap with the\n\t\t\t\t// library-defined, default adapters.\n\t\t\t\tif (!adapterObject._adapter) {\n\t\t\t\t\treject(complianceError);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst adapterMethods = LibraryMethods.concat('_initStorage');\n\t\t\t\tfor (let i = 0, len = adapterMethods.length; i < len; i++) {\n\t\t\t\t\tconst adapterMethodName = adapterMethods[i];\n\n\t\t\t\t\t// when the property is there,\n\t\t\t\t\t// it should be a method even when optional\n\t\t\t\t\tconst isRequired = !includes(\n\t\t\t\t\t\tOptionalAdapterMethods,\n\t\t\t\t\t\tadapterMethodName\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\t(isRequired || adapterObject[adapterMethodName]) &&\n\t\t\t\t\t\ttypeof adapterObject[adapterMethodName] !== 'function'\n\t\t\t\t\t) {\n\t\t\t\t\t\treject(complianceError);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst configureMissingMethods = function() {\n\t\t\t\t\tconst methodNotImplementedFactory = function(methodName) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tconst error = new Error(\n\t\t\t\t\t\t\t\t`Method ${methodName} is not implemented by the current adapter`\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tconst promise = Promise.reject(error);\n\n\t\t\t\t\t\t\trunCallback(promise, arguments[arguments.length - 1]);\n\n\t\t\t\t\t\t\treturn promise;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\n\t\t\t\t\tfor (let i = 0, len = OptionalAdapterMethods.length; i < len; i++) {\n\t\t\t\t\t\tconst optionalAdapterMethod = OptionalAdapterMethods[i];\n\t\t\t\t\t\tif (!adapterObject[optionalAdapterMethod]) {\n\t\t\t\t\t\t\tadapterObject[\n\t\t\t\t\t\t\t\toptionalAdapterMethod\n\t\t\t\t\t\t\t] = methodNotImplementedFactory(optionalAdapterMethod);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconfigureMissingMethods();\n\n\t\t\t\tconst setAdapterSupport = function(support) {\n\t\t\t\t\tif (DefinedAdapters[adapterName]) {\n\t\t\t\t\t\tconsole.info(`Redefining UnifiedCache adapter: ${adapterName}`);\n\t\t\t\t\t}\n\t\t\t\t\tDefinedAdapters[adapterName] = adapterObject;\n\t\t\t\t\tAdapterSupport[adapterName] = support;\n\t\t\t\t\t// don't use a then, so that we can define\n\t\t\t\t\t// adapters that have simple _support methods\n\t\t\t\t\t// in a blocking manner\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tif ('_support' in adapterObject) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tadapterObject._support &&\n\t\t\t\t\t\ttypeof adapterObject._support === 'function'\n\t\t\t\t\t) {\n\t\t\t\t\t\tadapterObject._support().then(setAdapterSupport, reject);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetAdapterSupport(!!adapterObject._support);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetAdapterSupport(true);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\n\t\trunTwoCallbacks(promise, callback, errorCallback);\n\t\treturn promise;\n\t}\n\n\t/**\n\t * checks for adapter support and returns true if supported, otherwise false\n\t * @param {string} adapterName\n\t * @returns {boolean}\n\t */\n\tsupports(adapterName) {\n\t\treturn !!AdapterSupport[adapterName];\n\t}\n\n\t/**\n\t * ready determine whether the asynchronous adapter\n\t * initialization process has finished.\n\t * @param {function} callback\n\t * @returns {Promise<*>} a promise indicating adapter initialization\n\t */\n\tready(callback) {\n\t\tconst self = this;\n\n\t\t//When cache version check is done, then we can initialize the adapter.\n\t\tconst promise = cacheVersionCheck.then(() => {\n\t\t\treturn self._adapterSet.then(() => {\n\t\t\t\tif (self._ready === null) {\n\t\t\t\t\tself._ready = self._initAdapter();\n\t\t\t\t}\n\n\t\t\t\treturn self._ready;\n\t\t\t});\n\t\t});\n\n\t\trunTwoCallbacks(promise, callback, callback);\n\t\treturn promise;\n\t}\n\n\t/**\n\t * List of supported adapters\n\t * @param {string[]} adapters - list of available adapter names\n\t * @returns {string[]} list of supported adapter names\n\t * @private\n\t */\n\t_getSupportedAdapters(adapters) {\n\t\tconst supportedAdapters = [];\n\t\tfor (let i = 0, len = adapters.length; i < len; i++) {\n\t\t\tconst adapterName = adapters[i];\n\t\t\tif (this.supports(adapterName)) {\n\t\t\t\tsupportedAdapters.push(adapterName);\n\t\t\t}\n\t\t}\n\t\treturn supportedAdapters;\n\t}\n\n\t/**\n\t * extends the instance of unifiedCache with initialized\n\t * adapter API methods and properties\n\t * @param {object} libraryMethodsAndProperties\n\t * @private\n\t */\n\t_extend(libraryMethodsAndProperties) {\n\t\textend(this, libraryMethodsAndProperties);\n\t}\n\n\t/**\n\t * Includes adapter API methods to the UnifiedCache object and replaced\n\t * by the adapter API methods once initialized successfully.\n\t * @private\n\t */\n\t_wrapLibraryMethodsWithReady() {\n\t\t// Add a stub for each adapter API method that delays the call to the\n\t\t// corresponding adapter method until UnifiedCache is ready. These stubs\n\t\t// will be replaced by the adapter methods as soon as the adapter is\n\t\t// loaded, so there is no performance impact.\n\t\tfor (let i = 0, len = LibraryMethods.length; i < len; i++) {\n\t\t\tcallWhenReady(this, LibraryMethods[i]);\n\t\t}\n\t}\n\n\t/**\n\t * creates an instance of {@link UnifiedCache} and returns it.\n\t * @param {{adapter: string[], name: string, description: string, storeName: string}} options - configuration options\n\t * @returns {UnifiedCache} an instance of {@link UnifiedCache}\n\t */\n\tcreateInstance(options) {\n\t\treturn new UnifiedCache(options);\n\t}\n}\n\n/**\n * The actual UnifiedCache object that we expose as a module or via a global.\n * It's extended by pulling in one of our other libraries.\n * @type {UnifiedCache} unifiedCache object\n */\nconst unifiedCache = new UnifiedCache();\n\n// Add cache stats to window.ux_globals\nsetGlobalCacheStats({\n\tgetAggregateCacheStats: UnifiedCache.getAggregateCacheStats,\n\tgetAllCacheStats: UnifiedCache.getAllCacheStats\n});\n\nexport default unifiedCache;\n"],"names":["module","exports","a","n","TypeError","__esModule","toPropertyKey","require","_defineProperties","e","r","t","length","o","enumerable","configurable","writable","Object","defineProperty","key","prototype","value","_extends","assign","bind","arguments","hasOwnProperty","call","apply","includes","_typeof","Symbol","toPrimitive","i","String","Number","iterator","constructor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","getter","d","definition","get","obj","prop","parts","properties","Blob","name","console","error","BASE_CHARS","BLOB_TYPE_PREFIX_REGEX","SERIALIZED_MARKER","TYPE_ARRAYBUFFER","TYPE_BLOB","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT16ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","toString","stringToBuffer","serializedString","bufferLength","len","encoded1","encoded2","encoded3","encoded4","p","buffer","ArrayBuffer","bytes","Uint8Array","indexOf","bufferToString","base64String","substring","serialize","callback","valueType","marker","Error","fileReader","FileReader","onload","str","type","this","result","readAsArrayBuffer","JSON","stringify","deserialize","parse","SERIALIZED_MARKER_LENGTH","blobType","test","matcher","match","createBlob","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","normalizeKey","warn","storage","window","setItem","promise","then","getCallback","STORAGE","LOCALSTORAGE","localStorage","SESSIONSTORAGE","sessionStorage","CACHE_API","caches","INDEXEDDB","indexedDB","DEFAULT_TTL","ttl","KEY_DELIMITER","NXUI_UNIFIED_CACHE","STORAGE_KEYPREFIX","VERSION_KEY","getTTL","TTL_EXPIRED_ITEM_KEYWORD","isLRUItem","removeItemsByInstance","adapter","instancePrefix","keys","itemKey","startsWith","push","removeItem","getItem","lastUsedTime","Date","now","keyPrefix","data","instanceAccessMap","createInstanceAccessMap","Map","has","set","size","instanceAccessArray","sorted","sort","b","originalResult","expiry","getKeysWithTTL","evictionPolicies","config","evictionPolicy","lru","options","defaultConfig","storeName","_isLocalStorageUsable","localStorageTestKey","checkIfWebStorageThrows","_adapter","_initStorage","dbInfo","getKeyPrefix","_defaultConfig","_dbInfo","serializer","Promise","resolve","reject","_support","isWebStorageValid","_clearAllInstances","iterate","self","ready","keyPrefixLength","iterationNumber","runCallback","_config","originalValue","clear","_clear","dropInstance","currentConfig","READ_ONLY","READ_WRITE","initStorage","_connectToDB","db","database","openRequest","open","onupgradeneeded","createObjectStore","onsuccess","event","target","onerror","indexedDBError","getObjectStore","indexedDBCache","mode","transaction","objectStore","processError","indexedDBRequestError","retryable","indexedDBErrorName","indexedDBErrorMessage","message","makeRequest","request","indexedDBRequest","catch","put","delete","count","getAllKeys","index","iteratorCallback","cursorRequest","openCursor","cursor","continue","_clearDB","clearRequest","debug","IndexedDBCache","jest","testing","makeDBCall","unifiedCache","callFunction","_ref","_objectWithoutPropertiesLoose","_excluded","databases","clearPromises","all","_isSessionStorageUsable","sessionStorageTestKey","async","_runOnReady","fn","cacheAPI","_cacheStorage","cacheStorage","promises","map","requests","response","add","clone","isDeleted","cache","keyIndex","entry","entries","makeInMemoryCall","inMemoryCache","inMemory","cacheInstance","originalMethod","Proxy","targetMethod","cacheInstanceProxy","args","_stats","stale","hit","miss","start","performance","end","buildTime","Array","isArray","arg","slice","array","searchElement","x","y","isNaN","sameValue","errorCallback","getServerCacheVersion","NOW","unifiedCacheVersion","isCacheVersionOld","cacheVersion","serverCacheVersion","getAggregateCacheStats","getAllCacheStats","cacheStats","freeze","buildGlobalCacheStats","ux_globals","__uc__cacheStats","_len","objects","_key","reduce","obj1","obj2","DefinedAdapters","AdapterSupport","DefaultAdapters","localStorageAdapter","sessionStorageAdapter","indexedDBAdapter","cacheAPIAdapter","IN_MEMORY","inMemoryAdapter","dropAllInstancesPromises","clearStorageInstances","cacheVersionCheck","version","SessionStorage","DefaultConfig","description","DefaultStats","EvictionPolicies","OptionalAdapterMethods","LibraryMethods","concat","callWhenReady","unifiedCacheInstance","libraryMethod","_args","validateEvictionPolicy","UnifiedCache","_classCallCheck","adapterTypeKey","adapterName","defineAdapter","extend","_adapterSet","_initAdapter","_ready","_wrapLibraryMethodsWithReady","setAdapter","unifiedCacheProxy","cacheStatsProxyHandler","cacheInstances","_createClass","adapters","supportedAdapters","_getSupportedAdapters","setAdapterToConfig","extendSelfWithAdapter","_extend","oldAdapterSetDone","getAdapter","currentAdapterIndex","adapterPromiseLoop","initAdapter","runTwoCallbacks","getAdapterPromise","serializerPromise","adapterObject","complianceError","adapterMethods","adapterMethodName","configureMissingMethods","methodNotImplementedFactory","methodName","optionalAdapterMethod","setAdapterSupport","support","info","supports","libraryMethodsAndProperties","stats","aggregateStats","accumulator","attribute","currentValue","hitRate","allCacheStats","sumObjectsByKey","_defineProperty","setGlobalCacheStats"]}