UNPKG

25.5 kBSource Map (JSON)View Raw
1{"version":3,"file":"persist.esm.js","sources":["../src/browser.js","../src/consts.js","../src/storageManager.js","../src/utils.js","../src/Persist.js"],"sourcesContent":["const win = (typeof window !== `undefined` && window) || {};\n\nexport {win as window};\nexport const console = win.console;\nexport const document = win.document;\nexport const history = win.history;\nexport const location = win.location;\nexport const navigator = win.navigator;\nexport const parseFloat = win.parseFloat;\nexport const performance = win.performance;\n\nlet localStorage = null;\n\nlet sessionStorage = null;\n\ntry {\n\tlocalStorage = win.localStorage;\n\tsessionStorage = win.sessionStorage;\n} catch (e) {\n}\n\nexport {\n\tlocalStorage,\n\tsessionStorage,\n};\n","import {performance} from \"./browser\";\n\nexport const CONST_PERSIST = \"___persist___\";\nexport const CONST_PERSIST_STATE = `state${CONST_PERSIST}`;\nexport const CONST_DEPTHS = \"depths\";\nexport const CONST_LAST_URL = \"lastUrl\";\nconst navigation = performance && performance.navigation;\n\nexport const TYPE_NAVIGATE = (navigation && navigation.TYPE_NAVIGATE) || 0;\nexport const TYPE_RELOAD = (navigation && navigation.TYPE_RELOAD) || 1;\nexport const TYPE_BACK_FORWARD = (navigation && navigation.TYPE_BACK_FORWARD) || 2;\n","import {window, history, location, sessionStorage, localStorage} from \"./browser\";\nimport {CONST_PERSIST} from \"./consts\";\n\nconst isSupportState = history && \"replaceState\" in history && \"state\" in history;\n\nfunction isStorageAvailable(storage) {\n\tif (!storage) {\n\t\treturn undefined;\n\t}\n\tconst TMP_KEY = `__tmp__${CONST_PERSIST}`;\n\n\ttry {\n\t\t// In case of iOS safari private mode, calling setItem on storage throws error\n\t\tstorage.setItem(TMP_KEY, CONST_PERSIST);\n\n\t\t// In Chrome incognito mode, can not get saved value\n\t\t// In IE8, calling storage.getItem occasionally makes \"Permission denied\" error\n\t\treturn storage.getItem(TMP_KEY) === CONST_PERSIST;\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n\nconst storage = (function() {\n\tlet strg;\n\n\tif (isStorageAvailable(sessionStorage)) {\n\t\tstrg = sessionStorage;\n\t} else if (isStorageAvailable(localStorage)) {\n\t\tstrg = localStorage;\n\t}\n\n\treturn strg;\n})();\n\nfunction warnInvalidStorageValue() {\n\t/* eslint-disable no-console */\n\tconsole.warn(\"window.history or session/localStorage has no valid \" +\n\t\t\t\"format data to be handled in persist.\");\n\t/* eslint-enable no-console */\n}\n\nfunction getStorage() {\n\treturn storage;\n}\n\n/*\n * Get state value\n */\nfunction getState(key) {\n\tlet state;\n\n\tlet stateStr;\n\n\tif (storage) {\n\t\tstateStr = storage.getItem(key);\n\t} else if (history.state) {\n\t\tif (typeof history.state === \"object\" && history.state !== null) {\n\t\t\tstateStr = history.state[key];\n\t\t} else {\n\t\t\twarnInvalidStorageValue();\n\t\t}\n\t} else {\n\t\tstateStr = history.state;\n\t}\n\n\t// the storage is clean\n\tif (stateStr === null) {\n\t\treturn {};\n\t}\n\n\t// \"null\" is not a valid\n\tconst isValidStateStr = typeof stateStr === \"string\" &&\n\t\t\t\t\t\t\t\tstateStr.length > 0 && stateStr !== \"null\";\n\n\ttry {\n\t\tstate = JSON.parse(stateStr);\n\n\t\t// like '[ ... ]', '1', '1.234', '\"123\"' is also not valid\n\t\tconst isValidType = !(typeof state !== \"object\" || state instanceof Array);\n\n\t\tif (!isValidStateStr || !isValidType) {\n\t\t\tthrow new Error();\n\t\t}\n\t} catch (e) {\n\t\twarnInvalidStorageValue();\n\t\tstate = {};\n\t}\n\n\t// Note2 (Android 4.3) return value is null\n\treturn state;\n}\n\nfunction getStateByKey(key, valueKey) {\n\tif (!isSupportState && !storage) {\n\t\treturn undefined;\n\t}\n\n\tlet result = getState(key)[valueKey];\n\n\t// some device returns \"null\" or undefined\n\tif (result === \"null\" || typeof result === \"undefined\") {\n\t\tresult = null;\n\t}\n\treturn result;\n}\n\n/*\n * Set state value\n */\nfunction setState(key, state) {\n\tif (storage) {\n\t\tif (state) {\n\t\t\tstorage.setItem(\n\t\t\t\tkey, JSON.stringify(state));\n\t\t} else {\n\t\t\tstorage.removeItem(key);\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tconst historyState = !history || history.state == null ? {} : history.state;\n\n\t\t\tif (history && typeof historyState === \"object\") {\n\t\t\t\thistoryState[key] = JSON.stringify(state);\n\t\t\t\thistory.replaceState(\n\t\t\t\t\thistoryState,\n\t\t\t\t\tdocument.title,\n\t\t\t\t\tlocation.href\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t/* eslint-disable no-console */\n\t\t\t\tconsole.warn(\"To use a history object, it must be an object that is not a primitive type.\");\n\t\t\t\t/* eslint-enable no-console */\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t/* eslint-disable no-console */\n\t\t\tconsole.warn(e.message);\n\t\t\t/* eslint-enable no-console */\n\t\t}\n\t}\n\n\tstate ? window[CONST_PERSIST] = true : delete window[CONST_PERSIST];\n}\n\nfunction setStateByKey(key, valueKey, data) {\n\tif (!isSupportState && !storage) {\n\t\treturn;\n\t}\n\n\tconst beforeData = getState(key);\n\n\tbeforeData[valueKey] = data;\n\tsetState(key, beforeData);\n}\n\n/*\n * flush current history state\n */\nfunction reset(key) {\n\tsetState(key, null);\n}\n\nexport {\n\treset,\n\tsetStateByKey,\n\tgetStateByKey,\n\tgetStorage,\n};\n","import {navigator, parseFloat, performance, location} from \"./browser\";\nimport {CONST_PERSIST} from \"./consts\";\n\nconst userAgent = navigator ? navigator.userAgent : \"\";\n\nconst isNeeded = (function() {\n\tconst isIOS = (new RegExp(\"iPhone|iPad\", \"i\")).test(userAgent);\n\tconst isMacSafari = (new RegExp(\"Mac\", \"i\")).test(userAgent) &&\n\t\t!(new RegExp(\"Chrome\", \"i\")).test(userAgent) &&\n\t\t(new RegExp(\"Apple\", \"i\")).test(userAgent);\n\tconst isAndroid = (new RegExp(\"Android \", \"i\")).test(userAgent);\n\tconst isWebview = (new RegExp(\"wv; |inapp;\", \"i\")).test(userAgent);\n\tconst androidVersion = isAndroid ? parseFloat(new RegExp(\n\t\t\"(Android)\\\\s([\\\\d_\\\\.]+|\\\\d_0)\", \"i\"\n\t).exec(userAgent)[2]) : undefined;\n\n\treturn !(isIOS ||\n\t\t\tisMacSafari ||\n\t\t\t(isAndroid &&\n\t\t\t\t((androidVersion <= 4.3 && isWebview) || androidVersion < 3)));\n})();\n\n// In case of IE8, TYPE_BACK_FORWARD is undefined.\nfunction getNavigationType() {\n\treturn performance && performance.navigation &&\n\t\tperformance.navigation.type;\n}\nfunction getUrl() {\n\treturn location ? location.href.split(\"#\")[0] : \"\";\n}\nfunction getStorageKey(name) {\n\treturn name + CONST_PERSIST;\n}\n\nexport {\n\tgetUrl,\n\tgetStorageKey,\n\tgetNavigationType,\n\tisNeeded,\n};\n","/* eslint-disable no-use-before-define */\nimport {\n\treset,\n\tsetStateByKey,\n\tgetStateByKey,\n\tgetStorage,\n} from \"./storageManager\";\nimport {isNeeded, getUrl, getStorageKey, getNavigationType} from \"./utils\";\nimport {console, window} from \"./browser\";\nimport {TYPE_BACK_FORWARD, TYPE_NAVIGATE, CONST_PERSIST_STATE, CONST_DEPTHS, CONST_LAST_URL} from \"./consts\";\n\nlet currentUrl = \"\";\n\n\nfunction execRec(obj, path, func) {\n\tlet _obj = obj;\n\n\tif (!_obj) {\n\t\t_obj = isNaN(path[0]) ? {} : [];\n\t}\n\n\tconst head = path.shift();\n\n\tif (path.length === 0) {\n\t\tif (_obj instanceof Array && isNaN(head)) {\n\t\t\tconsole.warn(\"Don't use key string on array\");\n\t\t}\n\t\tfunc(_obj, head);\n\t\treturn _obj;\n\t}\n\n\t_obj[head] = execRec(_obj[head], path, func);\n\treturn _obj;\n}\n\nfunction setPersistState(key, value) {\n\ttry {\n\t\tsetStateByKey(CONST_PERSIST_STATE, key, value);\n\t} catch (e) {\n\t\tif (clearFirst()) {\n\t\t\tif (key === CONST_LAST_URL) {\n\t\t\t\tsetPersistState(key, value);\n\t\t\t} else if (key === CONST_DEPTHS) {\n\t\t\t\tsetPersistState(key, value && value.slice(1));\n\t\t\t}\n\t\t} else {\n\t\t\t// There is no more size to fit in.\n\t\t\tthrow e;\n\t\t}\n\t}\n}\nfunction getPersistState(key) {\n\treturn getStateByKey(CONST_PERSIST_STATE, key);\n}\nfunction updateDepth(type = 0) {\n\tconst url = getUrl();\n\n\tif (currentUrl === url) {\n\t\treturn;\n\t}\n\t// url is not the same for the first time, pushState, or replaceState.\n\tcurrentUrl = url;\n\tconst depths = getPersistState(CONST_DEPTHS) || [];\n\n\tif (type === TYPE_BACK_FORWARD) {\n\t\t// Change current url only\n\t\tconst currentIndex = depths.indexOf(currentUrl);\n\n\t\t~currentIndex && setPersistState(CONST_LAST_URL, currentUrl);\n\t} else {\n\t\tconst prevLastUrl = getPersistState(CONST_LAST_URL);\n\n\t\treset(getStorageKey(currentUrl));\n\n\t\tif (type === TYPE_NAVIGATE && url !== prevLastUrl) {\n\t\t\t// Remove all url lists with higher index than current index\n\t\t\tconst prevLastIndex = depths.indexOf(prevLastUrl);\n\t\t\tconst removedList = depths.splice(prevLastIndex + 1, depths.length);\n\n\t\t\tremovedList.forEach(removedUrl => {\n\t\t\t\treset(getStorageKey(removedUrl));\n\t\t\t});\n\t\t\t// If the type is NAVIGATE and there is information about current url, delete it.\n\t\t\tconst currentIndex = depths.indexOf(currentUrl);\n\n\t\t\t~currentIndex && depths.splice(currentIndex, 1);\n\t\t}\n\t\t// Add depth for new address.\n\t\tif (depths.indexOf(url) < 0) {\n\t\t\tdepths.push(url);\n\t\t}\n\t\tsetPersistState(CONST_DEPTHS, depths);\n\t\tsetPersistState(CONST_LAST_URL, url);\n\t}\n}\n\nfunction clearFirst() {\n\tconst depths = getPersistState(CONST_DEPTHS) || [];\n\tconst removed = depths.splice(0, 1);\n\n\tif (!removed.length) {\n\t\t// There is an error because there is no depth to add data.\n\t\treturn false;\n\t}\n\tconst removedUrl = removed[0];\n\n\treset(getStorageKey(removedUrl));\n\tif (currentUrl === removedUrl) {\n\t\tcurrentUrl = \"\";\n\t\tsetPersistState(CONST_LAST_URL, \"\");\n\t\tif (!depths.length) {\n\t\t\t// I tried to add myself, but it didn't add up, so I got an error.\n\t\t\treturn false;\n\t\t}\n\t}\n\tsetPersistState(CONST_DEPTHS, depths);\n\t// Clear the previous record and try to add data again.\n\treturn true;\n}\nfunction clear() {\n\tconst depths = getPersistState(CONST_DEPTHS) || [];\n\n\tdepths.forEach(url => {\n\t\treset(getStorageKey(url));\n\t});\n\n\treset(CONST_PERSIST_STATE);\n\n\tcurrentUrl = \"\";\n}\nif (\"onpopstate\" in window) {\n\twindow.addEventListener(\"popstate\", () => {\n\t\t// popstate event occurs when backward or forward\n\t\tupdateDepth(TYPE_BACK_FORWARD);\n\t});\n}\n\n/**\n * Get or store the current state of the web page using JSON.\n * @ko 웹 페이지의 현재 상태를 JSON 형식으로 저장하거나 읽는다.\n * @alias eg.Persist\n *\n * @support {\"ie\": \"9+\", \"ch\" : \"latest\", \"ff\" : \"latest\", \"sf\" : \"latest\" , \"edge\" : \"latest\", \"ios\" : \"7+\", \"an\" : \"2.3+ (except 3.x)\"}\n */\nclass Persist {\n\tstatic VERSION = \"#__VERSION__#\";\n\tstatic StorageManager = {\n\t\treset,\n\t\tsetStateByKey,\n\t\tgetStateByKey,\n\t\tgetStorage,\n\t};\n\t/**\n\t * @static\n\t * Clear all information in Persist\n\t */\n\tstatic clear() {\n\t\tclear();\n\t}\n\t/**\n\t * @static\n\t * Return whether you need \"Persist\" module by checking the bfCache support of the current browser\n\t * @return {Boolean}\n\t */\n\tstatic isNeeded() {\n\t\treturn isNeeded;\n\t}\n\t/**\n\t* Constructor\n\t* @param {String} key The key of the state information to be stored <ko>저장할 상태 정보의 키</ko>\n\t**/\n\tconstructor(key) {\n\t\tthis.key = key || \"\";\n\t}\n\n\t/**\n\t * Read value\n\t * @param {String?} path target path\n\t * @return {String|Number|Boolean|Object|Array}\n\t */\n\tget(path) {\n\t\t// update url for pushState, replaceState\n\t\tupdateDepth(TYPE_NAVIGATE);\n\n\t\t// find path\n\t\tconst urlKey = getStorageKey(getUrl());\n\t\tconst globalState =\tgetStateByKey(urlKey, this.key);\n\n\n\t\tif (!path || path.length === 0) {\n\t\t\treturn globalState;\n\t\t}\n\n\t\tconst pathToken = path.split(\".\");\n\n\t\tlet currentItem = globalState;\n\n\t\tlet isTargetExist = true;\n\n\t\tfor (let i = 0; i < pathToken.length; i++) {\n\t\t\tif (!currentItem) {\n\t\t\t\tisTargetExist = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrentItem = currentItem[pathToken[i]];\n\t\t}\n\t\tif (!isTargetExist || currentItem == null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn currentItem;\n\t}\n\t/**\n\t * Save value\n\t * @param {String} path target path\n\t * @param {String|Number|Boolean|Object|Array} value value to save\n\t * @return {Persist}\n\t */\n\tset(path, value) {\n\t\t// update url for pushState, replaceState\n\t\tupdateDepth(TYPE_NAVIGATE);\n\t\t// find path\n\t\tconst key = this.key;\n\t\tconst urlKey = getStorageKey(getUrl());\n\t\tconst globalState =\tgetStateByKey(urlKey, key);\n\n\t\ttry {\n\t\t\tif (path.length === 0) {\n\t\t\t\tsetStateByKey(urlKey, key, value);\n\t\t\t} else {\n\t\t\t\tconst allValue = execRec(globalState, path.split(\".\"), (obj, head) => {\n\t\t\t\t\tobj[head] = value;\n\t\t\t\t});\n\n\t\t\t\tsetStateByKey(\n\t\t\t\t\turlKey,\n\t\t\t\t\tkey,\n\t\t\t\t\tallValue\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (clearFirst(e)) {\n\t\t\t\tthis.set(path, value);\n\t\t\t} else {\n\t\t\t\t// There is no more size to fit in.\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\t/**\n\t * Remove value\n\t * @param {String} path target path\n\t * @return {Persist}\n\t */\n\tremove(path) {\n\t\t// update url for pushState, replaceState\n\t\tupdateDepth(TYPE_NAVIGATE);\n\n\t\t// find path\n\t\tconst key = this.key;\n\t\tconst urlKey = getStorageKey(getUrl());\n\t\tconst globalState =\tgetStateByKey(urlKey, key);\n\n\t\ttry {\n\t\t\tif (path.length === 0) {\n\t\t\t\tsetStateByKey(urlKey, key, null);\n\t\t\t} else {\n\t\t\t\tconst value = execRec(globalState, path.split(\".\"), (obj, head) => {\n\t\t\t\t\tif (typeof obj === \"object\") {\n\t\t\t\t\t\tdelete obj[head];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tsetStateByKey(\n\t\t\t\t\turlKey,\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (clearFirst(e)) {\n\t\t\t\tthis.remove(path);\n\t\t\t} else {\n\t\t\t\t// There is no more size to fit in.\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n}\n\n// If navigation's type is not TYPE_BACK_FORWARD, delete information about current url.\nupdateDepth(getNavigationType());\n\nexport {\n\tupdateDepth,\n};\n\nexport default Persist;\n"],"names":["win","window","console","document","history","location","navigator","parseFloat","performance","localStorage","sessionStorage","e","CONST_PERSIST","CONST_PERSIST_STATE","CONST_DEPTHS","CONST_LAST_URL","navigation","TYPE_NAVIGATE","TYPE_RELOAD","TYPE_BACK_FORWARD","isSupportState","isStorageAvailable","storage","undefined","TMP_KEY","setItem","getItem","strg","warnInvalidStorageValue","warn","getStorage","getState","key","state","stateStr","isValidStateStr","length","JSON","parse","isValidType","Array","Error","getStateByKey","valueKey","result","setState","stringify","removeItem","historyState","replaceState","title","href","message","setStateByKey","data","beforeData","reset","userAgent","isNeeded","isIOS","RegExp","test","isMacSafari","isAndroid","isWebview","androidVersion","exec","getNavigationType","type","getUrl","split","getStorageKey","name","currentUrl","execRec","obj","path","func","_obj","isNaN","head","shift","setPersistState","value","clearFirst","slice","getPersistState","updateDepth","url","depths","currentIndex","indexOf","prevLastUrl","prevLastIndex","removedList","splice","forEach","removedUrl","push","removed","clear","addEventListener","Persist","get","urlKey","globalState","pathToken","currentItem","isTargetExist","i","set","allValue","remove","VERSION","StorageManager"],"mappings":"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"}
\No newline at end of file