diff --git a/.gitignore b/.gitignore index 4cd00ab..4a4c1c6 100644 --- a/.gitignore +++ b/.gitignore @@ -208,4 +208,3 @@ temp/ doc/ demo/_data/version.yml demo/release -dist/ diff --git a/dist/persist-migrate.js b/dist/persist-migrate.js new file mode 100644 index 0000000..3d68f74 --- /dev/null +++ b/dist/persist-migrate.js @@ -0,0 +1,103 @@ +/* +Copyright (c) 2017 NAVER Corp. +@egjs/persist project is licensed under the MIT license + +@egjs/persist JavaScript library + + +@version 2.4.0 +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.eg = global.eg || {}, global.eg.Persist = factory()); +}(this, (function () { 'use strict'; + + var win = typeof window !== "undefined" && window || {}; + var console = win.console; + var document = win.document; + var history = win.history; + var location = win.location; + var navigator = win.navigator; + var parseFloat = win.parseFloat; + var performance = win.performance; + var localStorage = null; + var sessionStorage = null; + + try { + localStorage = win.localStorage; + sessionStorage = win.sessionStorage; + } catch (e) {} + + var CONST_PERSIST = "___persist___"; + var navigation = performance && performance.navigation; + var TYPE_NAVIGATE = navigation && navigation.TYPE_NAVIGATE || 0; + var TYPE_RELOAD = navigation && navigation.TYPE_RELOAD || 1; + var TYPE_BACK_FORWARD = navigation && navigation.TYPE_BACK_FORWARD || 2; + + var userAgent = navigator ? navigator.userAgent : ""; + + var isNeeded = function () { + var isIOS = new RegExp("iPhone|iPad", "i").test(userAgent); + var isMacSafari = new RegExp("Mac", "i").test(userAgent) && !new RegExp("Chrome", "i").test(userAgent) && new RegExp("Apple", "i").test(userAgent); + var isAndroid = new RegExp("Android ", "i").test(userAgent); + var isWebview = new RegExp("wv; |inapp;", "i").test(userAgent); + var androidVersion = isAndroid ? parseFloat(new RegExp("(Android)\\s([\\d_\\.]+|\\d_0)", "i").exec(userAgent)[2]) : undefined; + return !(isIOS || isMacSafari || isAndroid && (androidVersion <= 4.3 && isWebview || androidVersion < 3)); + }(); // In case of IE8, TYPE_BACK_FORWARD is undefined. + + function getUrl() { + return location ? location.href.split("#")[0] : ""; + } + + function getStorageKey(name) { + return name + CONST_PERSIST; + } + + /* eslint-disable */ + var persistMigrate = (function (eg) { + if (!eg || !eg.Persist) { + return; + } + + var GLOBAL_KEY = "KEY___persist___"; + var oldConstructor = eg.Persist.prototype; + var isNeeded$$1 = eg.Persist.isNeeded; + var StorageManager = eg.Persist.StorageManager; + + eg.Persist = function Persist(key, value) { + var urlKey = getStorageKey(getUrl()); // when called as plain method + + if (!(this instanceof Persist)) { + if (arguments.length === 0) { + return StorageManager.getStateByKey(urlKey, GLOBAL_KEY); + } + + if (arguments.length === 1 && typeof key !== "string") { + var value_ = key; + StorageManager.setStateByKey(urlKey, GLOBAL_KEY, value_); + return undefined; + } + + if (arguments.length === 2) { + StorageManager.setStateByKey(urlKey, key, value); + } + + return StorageManager.getStateByKey(urlKey, key); + } // when called as constructer + + + this.key = key; + return undefined; + }; + + eg.Persist.isNeeded = isNeeded$$1; + eg.Persist.prototype = oldConstructor; + return eg.Persist; + })(win.eg); + /* eslint-enable */ + + return persistMigrate; + +}))); +//# sourceMappingURL=persist-migrate.js.map diff --git a/dist/persist-migrate.js.map b/dist/persist-migrate.js.map new file mode 100644 index 0000000..b5d2451 --- /dev/null +++ b/dist/persist-migrate.js.map @@ -0,0 +1 @@ +{"version":3,"file":"persist-migrate.js","sources":["../src/browser.js","../src/consts.js","../src/utils.js","../src/persist-migrate.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 {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 */\nimport {window} from \"./browser\";\nimport { getStorageKey, getUrl } from \"./utils\";\n\nexport default (function(eg) {\n\tif (!eg || !eg.Persist) {\n\t\treturn;\n\t}\n\n\tvar GLOBAL_KEY = \"KEY___persist___\";\n\tvar oldConstructor = eg.Persist.prototype;\n\tvar isNeeded = eg.Persist.isNeeded;\n\tvar StorageManager = eg.Persist.StorageManager;\n\n\teg.Persist = function Persist(key, value) {\n\t\tconst urlKey = getStorageKey(getUrl());\n\t\t// when called as plain method\n\t\tif (!(this instanceof Persist)) {\n\t\t\tif (arguments.length === 0) {\n\t\t\t\treturn StorageManager.getStateByKey(urlKey, GLOBAL_KEY);\n\t\t\t}\n\n\t\t\tif (arguments.length === 1 && typeof key !== \"string\") {\n\t\t\t\tvar value_ = key;\n\n\t\t\t\tStorageManager.setStateByKey(urlKey, GLOBAL_KEY, value_);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (arguments.length === 2) {\n\t\t\t\tStorageManager.setStateByKey(urlKey, key, value);\n\t\t\t}\n\n\t\t\treturn StorageManager.getStateByKey(urlKey, key);\n\t\t}\n\n\t\t// when called as constructer\n\t\tthis.key = key;\n\t\treturn undefined;\n\t};\n\teg.Persist.isNeeded = isNeeded;\n\teg.Persist.prototype = oldConstructor;\n\treturn eg.Persist;\n})(window.eg);\n\n/* eslint-enable */\n"],"names":["win","window","console","document","history","location","navigator","parseFloat","performance","localStorage","sessionStorage","e","CONST_PERSIST","navigation","TYPE_NAVIGATE","TYPE_RELOAD","TYPE_BACK_FORWARD","userAgent","isNeeded","isIOS","RegExp","test","isMacSafari","isAndroid","isWebview","androidVersion","exec","undefined","getUrl","href","split","getStorageKey","name","eg","Persist","GLOBAL_KEY","oldConstructor","prototype","StorageManager","key","value","urlKey","arguments","length","getStateByKey","value_","setStateByKey"],"mappings":"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"} \ No newline at end of file diff --git a/dist/persist-migrate.min.js b/dist/persist-migrate.min.js new file mode 100644 index 0000000..65ca314 --- /dev/null +++ b/dist/persist-migrate.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e.eg=e.eg||{},e.eg.Persist=t())}(this,function(){"use strict";var e="undefined"!=typeof window&&window||{},a=(e.console,e.document,e.history,e.location),t=e.navigator,i=e.parseFloat,s=e.performance;try{e.localStorage,e.sessionStorage}catch(e){}var n,r,o,p,d,g=s&&s.navigation,f=(g&&g.TYPE_NAVIGATE,g&&g.TYPE_RELOAD,g&&g.TYPE_BACK_FORWARD,t?t.userAgent:"");n=new RegExp("iPhone|iPad","i").test(f),r=new RegExp("Mac","i").test(f)&&!new RegExp("Chrome","i").test(f)&&new RegExp("Apple","i").test(f),o=new RegExp("Android ","i").test(f),p=new RegExp("wv; |inapp;","i").test(f),d=o?i(new RegExp("(Android)\\s([\\d_\\.]+|\\d_0)","i").exec(f)[2]):void 0;return function(e){if(e&&e.Persist){var r="KEY___persist___",t=e.Persist.prototype,i=e.Persist.isNeeded,o=e.Persist.StorageManager;return e.Persist=function e(t,i){var s=(a?a.href.split("#")[0]:"")+"___persist___";if(this instanceof e)this.key=t;else{if(0===arguments.length)return o.getStateByKey(s,r);if(1!==arguments.length||"string"==typeof t)return 2===arguments.length&&o.setStateByKey(s,t,i),o.getStateByKey(s,t);var n=t;o.setStateByKey(s,r,n)}},e.Persist.isNeeded=i,e.Persist.prototype=t,e.Persist}}(e.eg)}); +//# sourceMappingURL=persist-migrate.min.js.map diff --git a/dist/persist-migrate.min.js.map b/dist/persist-migrate.min.js.map new file mode 100644 index 0000000..12b5f07 --- /dev/null +++ b/dist/persist-migrate.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"persist-migrate.min.js","sources":["../src/browser.js","../src/consts.js","../src/utils.js","../src/persist-migrate.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 {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 */\nimport {window} from \"./browser\";\nimport { getStorageKey, getUrl } from \"./utils\";\n\nexport default (function(eg) {\n\tif (!eg || !eg.Persist) {\n\t\treturn;\n\t}\n\n\tvar GLOBAL_KEY = \"KEY___persist___\";\n\tvar oldConstructor = eg.Persist.prototype;\n\tvar isNeeded = eg.Persist.isNeeded;\n\tvar StorageManager = eg.Persist.StorageManager;\n\n\teg.Persist = function Persist(key, value) {\n\t\tconst urlKey = getStorageKey(getUrl());\n\t\t// when called as plain method\n\t\tif (!(this instanceof Persist)) {\n\t\t\tif (arguments.length === 0) {\n\t\t\t\treturn StorageManager.getStateByKey(urlKey, GLOBAL_KEY);\n\t\t\t}\n\n\t\t\tif (arguments.length === 1 && typeof key !== \"string\") {\n\t\t\t\tvar value_ = key;\n\n\t\t\t\tStorageManager.setStateByKey(urlKey, GLOBAL_KEY, value_);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (arguments.length === 2) {\n\t\t\t\tStorageManager.setStateByKey(urlKey, key, value);\n\t\t\t}\n\n\t\t\treturn StorageManager.getStateByKey(urlKey, key);\n\t\t}\n\n\t\t// when called as constructer\n\t\tthis.key = key;\n\t\treturn undefined;\n\t};\n\teg.Persist.isNeeded = isNeeded;\n\teg.Persist.prototype = oldConstructor;\n\treturn eg.Persist;\n})(window.eg);\n\n/* eslint-enable */\n"],"names":["win","window","location","console","document","history","navigator","parseFloat","performance","localStorage","sessionStorage","e","isIOS","isMacSafari","isAndroid","isWebview","androidVersion","navigation","userAgent","TYPE_NAVIGATE","TYPE_RELOAD","TYPE_BACK_FORWARD","RegExp","test","exec","undefined","eg","Persist","GLOBAL_KEY","oldConstructor","prototype","isNeeded","StorageManager","key","value","urlKey","href","split","this","arguments","length","getStateByKey","setStateByKey","value_"],"mappings":"sMAAA,IAAMA,sBAAcC,QAA0BA,QAAW,GAM5CC,GAHUF,EAAIG,QACHH,EAAII,SACLJ,EAAIK,QACHL,EAAIE,UACfI,EAAYN,EAAIM,UAChBC,EAAaP,EAAIO,WACjBC,EAAcR,EAAIQ,YAM/B,IACgBR,EAAIS,aACFT,EAAIU,eACpB,MAAOC,IChBF,ICIAC,EACAC,EAGAC,EACAC,EACAC,EDNDC,EAAaT,GAAeA,EAAYS,WCHxCC,GDKwBD,GAAcA,EAAWE,cAC3BF,GAAcA,EAAWG,YACnBH,GAAcA,EAAWI,kBCPzCf,EAAYA,EAAUY,UAAY,IAG7CN,EAAS,IAAIU,OAAO,cAAe,KAAMC,KAAKL,GAC9CL,EAAe,IAAIS,OAAO,MAAO,KAAMC,KAAKL,KAC/C,IAAII,OAAO,SAAU,KAAMC,KAAKL,IACjC,IAAII,OAAO,QAAS,KAAMC,KAAKL,GAC3BJ,EAAa,IAAIQ,OAAO,WAAY,KAAMC,KAAKL,GAC/CH,EAAa,IAAIO,OAAO,cAAe,KAAMC,KAAKL,GAClDF,EAAiBF,EAAYP,EAAW,IAAIe,OACjD,iCAAkC,KACjCE,KAAKN,GAAW,SAAMO,SCVV,SAAUC,MACnBA,GAAOA,EAAGC,aAIXC,EAAa,mBACbC,EAAiBH,EAAGC,QAAQG,UAC5BC,EAAWL,EAAGC,QAAQI,SACtBC,EAAiBN,EAAGC,QAAQK,sBAEhCN,EAAGC,QAAU,SAASA,EAAQM,EAAKC,OAC5BC,GDaAjC,EAAWA,EAASkC,KAAKC,MAAM,KAAK,GAAK,ID1BpB,mBEerBC,gBAAgBX,OAoBjBM,IAAMA,UAnBe,IAArBM,UAAUC,cACNR,EAAeS,cAAcN,EAAQP,MAGpB,IAArBW,UAAUC,QAA+B,iBAARP,SAOZ,IAArBM,UAAUC,QACbR,EAAeU,cAAcP,EAAQF,EAAKC,GAGpCF,EAAeS,cAAcN,EAAQF,OAVvCU,EAASV,EAEbD,EAAeU,cAAcP,EAAQP,EAAYe,KAepDjB,EAAGC,QAAQI,SAAWA,EACtBL,EAAGC,QAAQG,UAAYD,EAChBH,EAAGC,SAtCI,CAuCZ1B,EAAOyB"} \ No newline at end of file diff --git a/dist/persist.esm.js b/dist/persist.esm.js new file mode 100644 index 0000000..ff433b7 --- /dev/null +++ b/dist/persist.esm.js @@ -0,0 +1,517 @@ +/* +Copyright (c) 2017 NAVER Corp. +@egjs/persist project is licensed under the MIT license + +@egjs/persist JavaScript library + + +@version 2.4.0 +*/ +var win = typeof window !== "undefined" && window || {}; +var console$1 = win.console; +var document$1 = win.document; +var history = win.history; +var location = win.location; +var navigator = win.navigator; +var parseFloat = win.parseFloat; +var performance = win.performance; +var localStorage = null; +var sessionStorage = null; + +try { + localStorage = win.localStorage; + sessionStorage = win.sessionStorage; +} catch (e) {} + +var CONST_PERSIST = "___persist___"; +var CONST_PERSIST_STATE = "state" + CONST_PERSIST; +var CONST_DEPTHS = "depths"; +var CONST_LAST_URL = "lastUrl"; +var navigation = performance && performance.navigation; +var TYPE_NAVIGATE = navigation && navigation.TYPE_NAVIGATE || 0; +var TYPE_RELOAD = navigation && navigation.TYPE_RELOAD || 1; +var TYPE_BACK_FORWARD = navigation && navigation.TYPE_BACK_FORWARD || 2; + +var isSupportState = history && "replaceState" in history && "state" in history; + +function isStorageAvailable(storage) { + if (!storage) { + return undefined; + } + + var TMP_KEY = "__tmp__" + CONST_PERSIST; + + try { + // In case of iOS safari private mode, calling setItem on storage throws error + storage.setItem(TMP_KEY, CONST_PERSIST); // In Chrome incognito mode, can not get saved value + // In IE8, calling storage.getItem occasionally makes "Permission denied" error + + return storage.getItem(TMP_KEY) === CONST_PERSIST; + } catch (e) { + return false; + } +} + +var storage = function () { + var strg; + + if (isStorageAvailable(sessionStorage)) { + strg = sessionStorage; + } else if (isStorageAvailable(localStorage)) { + strg = localStorage; + } + + return strg; +}(); + +function warnInvalidStorageValue() { + /* eslint-disable no-console */ + console.warn("window.history or session/localStorage has no valid " + "format data to be handled in persist."); + /* eslint-enable no-console */ +} + +function getStorage() { + return storage; +} +/* + * Get state value + */ + + +function getState(key) { + var state; + var stateStr; + + if (storage) { + stateStr = storage.getItem(key); + } else if (history.state) { + if (typeof history.state === "object" && history.state !== null) { + stateStr = history.state[key]; + } else { + warnInvalidStorageValue(); + } + } else { + stateStr = history.state; + } // the storage is clean + + + if (stateStr === null) { + return {}; + } // "null" is not a valid + + + var isValidStateStr = typeof stateStr === "string" && stateStr.length > 0 && stateStr !== "null"; + + try { + state = JSON.parse(stateStr); // like '[ ... ]', '1', '1.234', '"123"' is also not valid + + var isValidType = !(typeof state !== "object" || state instanceof Array); + + if (!isValidStateStr || !isValidType) { + throw new Error(); + } + } catch (e) { + warnInvalidStorageValue(); + state = {}; + } // Note2 (Android 4.3) return value is null + + + return state; +} + +function getStateByKey(key, valueKey) { + if (!isSupportState && !storage) { + return undefined; + } + + var result = getState(key)[valueKey]; // some device returns "null" or undefined + + if (result === "null" || typeof result === "undefined") { + result = null; + } + + return result; +} +/* + * Set state value + */ + + +function setState(key, state) { + if (storage) { + if (state) { + storage.setItem(key, JSON.stringify(state)); + } else { + storage.removeItem(key); + } + } else { + try { + var historyState = !history || history.state == null ? {} : history.state; + + if (history && typeof historyState === "object") { + historyState[key] = JSON.stringify(state); + history.replaceState(historyState, document.title, location.href); + } else { + /* eslint-disable no-console */ + console.warn("To use a history object, it must be an object that is not a primitive type."); + /* eslint-enable no-console */ + } + } catch (e) { + /* eslint-disable no-console */ + console.warn(e.message); + /* eslint-enable no-console */ + } + } + + state ? win[CONST_PERSIST] = true : delete win[CONST_PERSIST]; +} + +function setStateByKey(key, valueKey, data) { + if (!isSupportState && !storage) { + return; + } + + var beforeData = getState(key); + beforeData[valueKey] = data; + setState(key, beforeData); +} +/* + * flush current history state + */ + + +function reset(key) { + setState(key, null); +} + +var userAgent = navigator ? navigator.userAgent : ""; + +var isNeeded = function () { + var isIOS = new RegExp("iPhone|iPad", "i").test(userAgent); + var isMacSafari = new RegExp("Mac", "i").test(userAgent) && !new RegExp("Chrome", "i").test(userAgent) && new RegExp("Apple", "i").test(userAgent); + var isAndroid = new RegExp("Android ", "i").test(userAgent); + var isWebview = new RegExp("wv; |inapp;", "i").test(userAgent); + var androidVersion = isAndroid ? parseFloat(new RegExp("(Android)\\s([\\d_\\.]+|\\d_0)", "i").exec(userAgent)[2]) : undefined; + return !(isIOS || isMacSafari || isAndroid && (androidVersion <= 4.3 && isWebview || androidVersion < 3)); +}(); // In case of IE8, TYPE_BACK_FORWARD is undefined. + + +function getNavigationType() { + return performance && performance.navigation && performance.navigation.type; +} + +function getUrl() { + return location ? location.href.split("#")[0] : ""; +} + +function getStorageKey(name) { + return name + CONST_PERSIST; +} + +/* eslint-disable no-use-before-define */ +var currentUrl = ""; + +function execRec(obj, path, func) { + var _obj = obj; + + if (!_obj) { + _obj = isNaN(path[0]) ? {} : []; + } + + var head = path.shift(); + + if (path.length === 0) { + if (_obj instanceof Array && isNaN(head)) { + console$1.warn("Don't use key string on array"); + } + + func(_obj, head); + return _obj; + } + + _obj[head] = execRec(_obj[head], path, func); + return _obj; +} + +function setPersistState(key, value) { + try { + setStateByKey(CONST_PERSIST_STATE, key, value); + } catch (e) { + if (clearFirst()) { + if (key === CONST_LAST_URL) { + setPersistState(key, value); + } else if (key === CONST_DEPTHS) { + setPersistState(key, value && value.slice(1)); + } + } else { + // There is no more size to fit in. + throw e; + } + } +} + +function getPersistState(key) { + return getStateByKey(CONST_PERSIST_STATE, key); +} + +function updateDepth(type) { + if (type === void 0) { + type = 0; + } + + var url = getUrl(); + + if (currentUrl === url) { + return; + } // url is not the same for the first time, pushState, or replaceState. + + + currentUrl = url; + var depths = getPersistState(CONST_DEPTHS) || []; + + if (type === TYPE_BACK_FORWARD) { + // Change current url only + var currentIndex = depths.indexOf(currentUrl); + ~currentIndex && setPersistState(CONST_LAST_URL, currentUrl); + } else { + var prevLastUrl = getPersistState(CONST_LAST_URL); + reset(getStorageKey(currentUrl)); + + if (type === TYPE_NAVIGATE && url !== prevLastUrl) { + // Remove all url lists with higher index than current index + var prevLastIndex = depths.indexOf(prevLastUrl); + var removedList = depths.splice(prevLastIndex + 1, depths.length); + removedList.forEach(function (removedUrl) { + reset(getStorageKey(removedUrl)); + }); // If the type is NAVIGATE and there is information about current url, delete it. + + var _currentIndex = depths.indexOf(currentUrl); + + ~_currentIndex && depths.splice(_currentIndex, 1); + } // Add depth for new address. + + + if (depths.indexOf(url) < 0) { + depths.push(url); + } + + setPersistState(CONST_DEPTHS, depths); + setPersistState(CONST_LAST_URL, url); + } +} + +function clearFirst() { + var depths = getPersistState(CONST_DEPTHS) || []; + var removed = depths.splice(0, 1); + + if (!removed.length) { + // There is an error because there is no depth to add data. + return false; + } + + var removedUrl = removed[0]; + reset(getStorageKey(removedUrl)); + + if (currentUrl === removedUrl) { + currentUrl = ""; + setPersistState(CONST_LAST_URL, ""); + + if (!depths.length) { + // I tried to add myself, but it didn't add up, so I got an error. + return false; + } + } + + setPersistState(CONST_DEPTHS, depths); // Clear the previous record and try to add data again. + + return true; +} + +function _clear() { + var depths = getPersistState(CONST_DEPTHS) || []; + depths.forEach(function (url) { + reset(getStorageKey(url)); + }); + reset(CONST_PERSIST_STATE); + currentUrl = ""; +} + +if ("onpopstate" in win) { + win.addEventListener("popstate", function () { + // popstate event occurs when backward or forward + updateDepth(TYPE_BACK_FORWARD); + }); +} +/** + * Get or store the current state of the web page using JSON. + * @ko 웹 페이지의 현재 상태를 JSON 형식으로 저장하거나 읽는다. + * @alias eg.Persist + * + * @support {"ie": "9+", "ch" : "latest", "ff" : "latest", "sf" : "latest" , "edge" : "latest", "ios" : "7+", "an" : "2.3+ (except 3.x)"} + */ + + +var Persist = +/*#__PURE__*/ +function () { + var Persist = + /*#__PURE__*/ + function () { + /** + * @static + * Clear all information in Persist + */ + Persist.clear = function clear() { + _clear(); + }; + /** + * @static + * Return whether you need "Persist" module by checking the bfCache support of the current browser + * @return {Boolean} + */ + + + Persist.isNeeded = function isNeeded$$1() { + return isNeeded; + }; + /** + * Constructor + * @param {String} key The key of the state information to be stored 저장할 상태 정보의 키 + **/ + + + function Persist(key) { + this.key = key || ""; + } + /** + * Read value + * @param {String?} path target path + * @return {String|Number|Boolean|Object|Array} + */ + + + var _proto = Persist.prototype; + + _proto.get = function get(path) { + // update url for pushState, replaceState + updateDepth(TYPE_NAVIGATE); // find path + + var urlKey = getStorageKey(getUrl()); + var globalState = getStateByKey(urlKey, this.key); + + if (!path || path.length === 0) { + return globalState; + } + + var pathToken = path.split("."); + var currentItem = globalState; + var isTargetExist = true; + + for (var i = 0; i < pathToken.length; i++) { + if (!currentItem) { + isTargetExist = false; + break; + } + + currentItem = currentItem[pathToken[i]]; + } + + if (!isTargetExist || currentItem == null) { + return null; + } + + return currentItem; + }; + /** + * Save value + * @param {String} path target path + * @param {String|Number|Boolean|Object|Array} value value to save + * @return {Persist} + */ + + + _proto.set = function set(path, value) { + // update url for pushState, replaceState + updateDepth(TYPE_NAVIGATE); // find path + + var key = this.key; + var urlKey = getStorageKey(getUrl()); + var globalState = getStateByKey(urlKey, key); + + try { + if (path.length === 0) { + setStateByKey(urlKey, key, value); + } else { + var allValue = execRec(globalState, path.split("."), function (obj, head) { + obj[head] = value; + }); + setStateByKey(urlKey, key, allValue); + } + } catch (e) { + if (clearFirst(e)) { + this.set(path, value); + } else { + // There is no more size to fit in. + throw e; + } + } + + return this; + }; + /** + * Remove value + * @param {String} path target path + * @return {Persist} + */ + + + _proto.remove = function remove(path) { + // update url for pushState, replaceState + updateDepth(TYPE_NAVIGATE); // find path + + var key = this.key; + var urlKey = getStorageKey(getUrl()); + var globalState = getStateByKey(urlKey, key); + + try { + if (path.length === 0) { + setStateByKey(urlKey, key, null); + } else { + var value = execRec(globalState, path.split("."), function (obj, head) { + if (typeof obj === "object") { + delete obj[head]; + } + }); + setStateByKey(urlKey, key, value); + } + } catch (e) { + if (clearFirst(e)) { + this.remove(path); + } else { + // There is no more size to fit in. + throw e; + } + } + + return this; + }; + + return Persist; + }(); + + Persist.VERSION = "2.4.0"; + Persist.StorageManager = { + reset: reset, + setStateByKey: setStateByKey, + getStateByKey: getStateByKey, + getStorage: getStorage + }; + return Persist; +}(); // If navigation's type is not TYPE_BACK_FORWARD, delete information about current url. + + +updateDepth(getNavigationType()); + +export default Persist; +export { updateDepth }; +//# sourceMappingURL=persist.esm.js.map diff --git a/dist/persist.esm.js.map b/dist/persist.esm.js.map new file mode 100644 index 0000000..f1dff0e --- /dev/null +++ b/dist/persist.esm.js.map @@ -0,0 +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 저장할 상태 정보의 키\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":";;;;;;;;;AAAA,IAAMA,GAAG,GAAI,OAAOC,MAAP,oBAAiCA,MAAlC,IAA6C,EAAzD;AAEA,AACO,IAAMC,SAAO,GAAGF,GAAG,CAACE,OAApB;AACP,AAAO,IAAMC,UAAQ,GAAGH,GAAG,CAACG,QAArB;AACP,AAAO,IAAMC,OAAO,GAAGJ,GAAG,CAACI,OAApB;AACP,AAAO,IAAMC,QAAQ,GAAGL,GAAG,CAACK,QAArB;AACP,AAAO,IAAMC,SAAS,GAAGN,GAAG,CAACM,SAAtB;AACP,AAAO,IAAMC,UAAU,GAAGP,GAAG,CAACO,UAAvB;AACP,AAAO,IAAMC,WAAW,GAAGR,GAAG,CAACQ,WAAxB;AAEP,IAAIC,YAAY,GAAG,IAAnB;AAEA,IAAIC,cAAc,GAAG,IAArB;;AAEA,IAAI;EACHD,YAAY,GAAGT,GAAG,CAACS,YAAnB;EACAC,cAAc,GAAGV,GAAG,CAACU,cAArB;CAFD,CAGE,OAAOC,CAAP,EAAU;;AChBL,IAAMC,aAAa,GAAG,eAAtB;AACP,AAAO,IAAMC,mBAAmB,aAAWD,aAApC;AACP,AAAO,IAAME,YAAY,GAAG,QAArB;AACP,AAAO,IAAMC,cAAc,GAAG,SAAvB;AACP,IAAMC,UAAU,GAAGR,WAAW,IAAIA,WAAW,CAACQ,UAA9C;AAEA,AAAO,IAAMC,aAAa,GAAID,UAAU,IAAIA,UAAU,CAACC,aAA1B,IAA4C,CAAlE;AACP,AAAO,IAAMC,WAAW,GAAIF,UAAU,IAAIA,UAAU,CAACE,WAA1B,IAA0C,CAA9D;AACP,AAAO,IAAMC,iBAAiB,GAAIH,UAAU,IAAIA,UAAU,CAACG,iBAA1B,IAAgD,CAA1E;;ACPP,IAAMC,cAAc,GAAGhB,OAAO,IAAI,kBAAkBA,OAA7B,IAAwC,WAAWA,OAA1E;;AAEA,SAASiB,kBAAT,CAA4BC,OAA5B,EAAqC;MAChC,CAACA,OAAL,EAAc;WACNC,SAAP;;;MAEKC,OAAO,eAAaZ,aAA1B;;MAEI;;IAEHU,OAAO,CAACG,OAAR,CAAgBD,OAAhB,EAAyBZ,aAAzB,EAFG;;;WAMIU,OAAO,CAACI,OAAR,CAAgBF,OAAhB,MAA6BZ,aAApC;GAND,CAOE,OAAOD,CAAP,EAAU;WACJ,KAAP;;;;AAIF,IAAMW,OAAO,GAAI,YAAW;MACvBK,IAAJ;;MAEIN,kBAAkB,CAACX,cAAD,CAAtB,EAAwC;IACvCiB,IAAI,GAAGjB,cAAP;GADD,MAEO,IAAIW,kBAAkB,CAACZ,YAAD,CAAtB,EAAsC;IAC5CkB,IAAI,GAAGlB,YAAP;;;SAGMkB,IAAP;CATe,EAAhB;;AAYA,SAASC,uBAAT,GAAmC;;EAElC1B,OAAO,CAAC2B,IAAR,CAAa,yDACX,uCADF;;;;AAKD,SAASC,UAAT,GAAsB;SACdR,OAAP;;;;;;;AAMD,SAASS,QAAT,CAAkBC,GAAlB,EAAuB;MAClBC,KAAJ;MAEIC,QAAJ;;MAEIZ,OAAJ,EAAa;IACZY,QAAQ,GAAGZ,OAAO,CAACI,OAAR,CAAgBM,GAAhB,CAAX;GADD,MAEO,IAAI5B,OAAO,CAAC6B,KAAZ,EAAmB;QACrB,OAAO7B,OAAO,CAAC6B,KAAf,KAAyB,QAAzB,IAAqC7B,OAAO,CAAC6B,KAAR,KAAkB,IAA3D,EAAiE;MAChEC,QAAQ,GAAG9B,OAAO,CAAC6B,KAAR,CAAcD,GAAd,CAAX;KADD,MAEO;MACNJ,uBAAuB;;GAJlB,MAMA;IACNM,QAAQ,GAAG9B,OAAO,CAAC6B,KAAnB;GAdqB;;;MAkBlBC,QAAQ,KAAK,IAAjB,EAAuB;WACf,EAAP;GAnBqB;;;MAuBhBC,eAAe,GAAG,OAAOD,QAAP,KAAoB,QAApB,IACjBA,QAAQ,CAACE,MAAT,GAAkB,CADD,IACMF,QAAQ,KAAK,MAD3C;;MAGI;IACHD,KAAK,GAAGI,IAAI,CAACC,KAAL,CAAWJ,QAAX,CAAR,CADG;;QAIGK,WAAW,GAAG,EAAE,OAAON,KAAP,KAAiB,QAAjB,IAA6BA,KAAK,YAAYO,KAAhD,CAApB;;QAEI,CAACL,eAAD,IAAoB,CAACI,WAAzB,EAAsC;YAC/B,IAAIE,KAAJ,EAAN;;GAPF,CASE,OAAO9B,CAAP,EAAU;IACXiB,uBAAuB;IACvBK,KAAK,GAAG,EAAR;GArCqB;;;SAyCfA,KAAP;;;AAGD,SAASS,aAAT,CAAuBV,GAAvB,EAA4BW,QAA5B,EAAsC;MACjC,CAACvB,cAAD,IAAmB,CAACE,OAAxB,EAAiC;WACzBC,SAAP;;;MAGGqB,MAAM,GAAGb,QAAQ,CAACC,GAAD,CAAR,CAAcW,QAAd,CAAb,CALqC;;MAQjCC,MAAM,KAAK,MAAX,IAAqB,OAAOA,MAAP,KAAkB,WAA3C,EAAwD;IACvDA,MAAM,GAAG,IAAT;;;SAEMA,MAAP;;;;;;;AAMD,SAASC,QAAT,CAAkBb,GAAlB,EAAuBC,KAAvB,EAA8B;MACzBX,OAAJ,EAAa;QACRW,KAAJ,EAAW;MACVX,OAAO,CAACG,OAAR,CACCO,GADD,EACMK,IAAI,CAACS,SAAL,CAAeb,KAAf,CADN;KADD,MAGO;MACNX,OAAO,CAACyB,UAAR,CAAmBf,GAAnB;;GALF,MAOO;QACF;UACGgB,YAAY,GAAG,CAAC5C,OAAD,IAAYA,OAAO,CAAC6B,KAAR,IAAiB,IAA7B,GAAoC,EAApC,GAAyC7B,OAAO,CAAC6B,KAAtE;;UAEI7B,OAAO,IAAI,OAAO4C,YAAP,KAAwB,QAAvC,EAAiD;QAChDA,YAAY,CAAChB,GAAD,CAAZ,GAAoBK,IAAI,CAACS,SAAL,CAAeb,KAAf,CAApB;QACA7B,OAAO,CAAC6C,YAAR,CACCD,YADD,EAEC7C,QAAQ,CAAC+C,KAFV,EAGC7C,QAAQ,CAAC8C,IAHV;OAFD,MAOO;;QAENjD,OAAO,CAAC2B,IAAR,CAAa,6EAAb;;;KAZF,CAeE,OAAOlB,CAAP,EAAU;;MAEXT,OAAO,CAAC2B,IAAR,CAAalB,CAAC,CAACyC,OAAf;;;;;EAKFnB,KAAK,GAAGhC,GAAM,CAACW,aAAD,CAAN,GAAwB,IAA3B,GAAkC,OAAOX,GAAM,CAACW,aAAD,CAApD;;;AAGD,SAASyC,aAAT,CAAuBrB,GAAvB,EAA4BW,QAA5B,EAAsCW,IAAtC,EAA4C;MACvC,CAAClC,cAAD,IAAmB,CAACE,OAAxB,EAAiC;;;;MAI3BiC,UAAU,GAAGxB,QAAQ,CAACC,GAAD,CAA3B;EAEAuB,UAAU,CAACZ,QAAD,CAAV,GAAuBW,IAAvB;EACAT,QAAQ,CAACb,GAAD,EAAMuB,UAAN,CAAR;;;;;;;AAMD,SAASC,KAAT,CAAexB,GAAf,EAAoB;EACnBa,QAAQ,CAACb,GAAD,EAAM,IAAN,CAAR;;;AC5JD,IAAMyB,SAAS,GAAGnD,SAAS,GAAGA,SAAS,CAACmD,SAAb,GAAyB,EAApD;;AAEA,IAAMC,QAAQ,GAAI,YAAW;MACtBC,KAAK,GAAI,IAAIC,MAAJ,CAAW,aAAX,EAA0B,GAA1B,CAAD,CAAiCC,IAAjC,CAAsCJ,SAAtC,CAAd;MACMK,WAAW,GAAI,IAAIF,MAAJ,CAAW,KAAX,EAAkB,GAAlB,CAAD,CAAyBC,IAAzB,CAA8BJ,SAA9B,KACnB,CAAE,IAAIG,MAAJ,CAAW,QAAX,EAAqB,GAArB,CAAD,CAA4BC,IAA5B,CAAiCJ,SAAjC,CADkB,IAElB,IAAIG,MAAJ,CAAW,OAAX,EAAoB,GAApB,CAAD,CAA2BC,IAA3B,CAAgCJ,SAAhC,CAFD;MAGMM,SAAS,GAAI,IAAIH,MAAJ,CAAW,UAAX,EAAuB,GAAvB,CAAD,CAA8BC,IAA9B,CAAmCJ,SAAnC,CAAlB;MACMO,SAAS,GAAI,IAAIJ,MAAJ,CAAW,aAAX,EAA0B,GAA1B,CAAD,CAAiCC,IAAjC,CAAsCJ,SAAtC,CAAlB;MACMQ,cAAc,GAAGF,SAAS,GAAGxD,UAAU,CAAC,IAAIqD,MAAJ,CAC7C,gCAD6C,EACX,GADW,EAE5CM,IAF4C,CAEvCT,SAFuC,EAE5B,CAF4B,CAAD,CAAb,GAERlC,SAFxB;SAIO,EAAEoC,KAAK,IACZG,WADO,IAENC,SAAS,KACPE,cAAc,IAAI,GAAlB,IAAyBD,SAA1B,IAAwCC,cAAc,GAAG,CADjD,CAFL,CAAP;CAXgB,EAAjB;;;AAkBA,SAASE,iBAAT,GAA6B;SACrB3D,WAAW,IAAIA,WAAW,CAACQ,UAA3B,IACNR,WAAW,CAACQ,UAAZ,CAAuBoD,IADxB;;;AAGD,SAASC,MAAT,GAAkB;SACVhE,QAAQ,GAAGA,QAAQ,CAAC8C,IAAT,CAAcmB,KAAd,CAAoB,GAApB,EAAyB,CAAzB,CAAH,GAAiC,EAAhD;;;AAED,SAASC,aAAT,CAAuBC,IAAvB,EAA6B;SACrBA,IAAI,GAAG5D,aAAd;;;AC/BD;AACA,AAUA,IAAI6D,UAAU,GAAG,EAAjB;;AAGA,SAASC,OAAT,CAAiBC,GAAjB,EAAsBC,IAAtB,EAA4BC,IAA5B,EAAkC;MAC7BC,IAAI,GAAGH,GAAX;;MAEI,CAACG,IAAL,EAAW;IACVA,IAAI,GAAGC,KAAK,CAACH,IAAI,CAAC,CAAD,CAAL,CAAL,GAAiB,EAAjB,GAAsB,EAA7B;;;MAGKI,IAAI,GAAGJ,IAAI,CAACK,KAAL,EAAb;;MAEIL,IAAI,CAACxC,MAAL,KAAgB,CAApB,EAAuB;QAClB0C,IAAI,YAAYtC,KAAhB,IAAyBuC,KAAK,CAACC,IAAD,CAAlC,EAA0C;MACzC9E,SAAO,CAAC2B,IAAR,CAAa,+BAAb;;;IAEDgD,IAAI,CAACC,IAAD,EAAOE,IAAP,CAAJ;WACOF,IAAP;;;EAGDA,IAAI,CAACE,IAAD,CAAJ,GAAaN,OAAO,CAACI,IAAI,CAACE,IAAD,CAAL,EAAaJ,IAAb,EAAmBC,IAAnB,CAApB;SACOC,IAAP;;;AAGD,SAASI,eAAT,CAAyBlD,GAAzB,EAA8BmD,KAA9B,EAAqC;MAChC;IACH9B,aAAa,CAACxC,mBAAD,EAAsBmB,GAAtB,EAA2BmD,KAA3B,CAAb;GADD,CAEE,OAAOxE,CAAP,EAAU;QACPyE,UAAU,EAAd,EAAkB;UACbpD,GAAG,KAAKjB,cAAZ,EAA4B;QAC3BmE,eAAe,CAAClD,GAAD,EAAMmD,KAAN,CAAf;OADD,MAEO,IAAInD,GAAG,KAAKlB,YAAZ,EAA0B;QAChCoE,eAAe,CAAClD,GAAD,EAAMmD,KAAK,IAAIA,KAAK,CAACE,KAAN,CAAY,CAAZ,CAAf,CAAf;;KAJF,MAMO;;YAEA1E,CAAN;;;;;AAIH,SAAS2E,eAAT,CAAyBtD,GAAzB,EAA8B;SACtBU,aAAa,CAAC7B,mBAAD,EAAsBmB,GAAtB,CAApB;;;AAED,SAASuD,WAAT,CAAqBnB,IAArB,EAA+B;MAAVA,IAAU;IAAVA,IAAU,GAAH,CAAG;;;MACxBoB,GAAG,GAAGnB,MAAM,EAAlB;;MAEII,UAAU,KAAKe,GAAnB,EAAwB;;GAHM;;;EAO9Bf,UAAU,GAAGe,GAAb;MACMC,MAAM,GAAGH,eAAe,CAACxE,YAAD,CAAf,IAAiC,EAAhD;;MAEIsD,IAAI,KAAKjD,iBAAb,EAAgC;;QAEzBuE,YAAY,GAAGD,MAAM,CAACE,OAAP,CAAelB,UAAf,CAArB;KAECiB,YAAD,IAAiBR,eAAe,CAACnE,cAAD,EAAiB0D,UAAjB,CAAhC;GAJD,MAKO;QACAmB,WAAW,GAAGN,eAAe,CAACvE,cAAD,CAAnC;IAEAyC,KAAK,CAACe,aAAa,CAACE,UAAD,CAAd,CAAL;;QAEIL,IAAI,KAAKnD,aAAT,IAA0BuE,GAAG,KAAKI,WAAtC,EAAmD;;UAE5CC,aAAa,GAAGJ,MAAM,CAACE,OAAP,CAAeC,WAAf,CAAtB;UACME,WAAW,GAAGL,MAAM,CAACM,MAAP,CAAcF,aAAa,GAAG,CAA9B,EAAiCJ,MAAM,CAACrD,MAAxC,CAApB;MAEA0D,WAAW,CAACE,OAAZ,CAAoB,UAAAC,UAAU,EAAI;QACjCzC,KAAK,CAACe,aAAa,CAAC0B,UAAD,CAAd,CAAL;OADD,EALkD;;UAS5CP,aAAY,GAAGD,MAAM,CAACE,OAAP,CAAelB,UAAf,CAArB;;OAECiB,aAAD,IAAiBD,MAAM,CAACM,MAAP,CAAcL,aAAd,EAA4B,CAA5B,CAAjB;KAhBK;;;QAmBFD,MAAM,CAACE,OAAP,CAAeH,GAAf,IAAsB,CAA1B,EAA6B;MAC5BC,MAAM,CAACS,IAAP,CAAYV,GAAZ;;;IAEDN,eAAe,CAACpE,YAAD,EAAe2E,MAAf,CAAf;IACAP,eAAe,CAACnE,cAAD,EAAiByE,GAAjB,CAAf;;;;AAIF,SAASJ,UAAT,GAAsB;MACfK,MAAM,GAAGH,eAAe,CAACxE,YAAD,CAAf,IAAiC,EAAhD;MACMqF,OAAO,GAAGV,MAAM,CAACM,MAAP,CAAc,CAAd,EAAiB,CAAjB,CAAhB;;MAEI,CAACI,OAAO,CAAC/D,MAAb,EAAqB;;WAEb,KAAP;;;MAEK6D,UAAU,GAAGE,OAAO,CAAC,CAAD,CAA1B;EAEA3C,KAAK,CAACe,aAAa,CAAC0B,UAAD,CAAd,CAAL;;MACIxB,UAAU,KAAKwB,UAAnB,EAA+B;IAC9BxB,UAAU,GAAG,EAAb;IACAS,eAAe,CAACnE,cAAD,EAAiB,EAAjB,CAAf;;QACI,CAAC0E,MAAM,CAACrD,MAAZ,EAAoB;;aAEZ,KAAP;;;;EAGF8C,eAAe,CAACpE,YAAD,EAAe2E,MAAf,CAAf,CAnBqB;;SAqBd,IAAP;;;AAED,SAASW,MAAT,GAAiB;MACVX,MAAM,GAAGH,eAAe,CAACxE,YAAD,CAAf,IAAiC,EAAhD;EAEA2E,MAAM,CAACO,OAAP,CAAe,UAAAR,GAAG,EAAI;IACrBhC,KAAK,CAACe,aAAa,CAACiB,GAAD,CAAd,CAAL;GADD;EAIAhC,KAAK,CAAC3C,mBAAD,CAAL;EAEA4D,UAAU,GAAG,EAAb;;;AAED,IAAI,gBAAgBxE,GAApB,EAA4B;EAC3BA,GAAM,CAACoG,gBAAP,CAAwB,UAAxB,EAAoC,YAAM;;IAEzCd,WAAW,CAACpE,iBAAD,CAAX;GAFD;;;;;;;;;;;IAaKmF;;;MAAAA;;;;;;;YAYEF,yBAAQ;MACdA,MAAK;;;;;;;;;YAOC1C,kCAAW;aACVA,QAAP;;;;;;;;qBAMW1B,GAAZ,EAAiB;WACXA,GAAL,GAAWA,GAAG,IAAI,EAAlB;;;;;;;;;;;WAQDuE,mBAAI3B,MAAM;;MAETW,WAAW,CAACtE,aAAD,CAAX,CAFS;;UAKHuF,MAAM,GAAGjC,aAAa,CAACF,MAAM,EAAP,CAA5B;UACMoC,WAAW,GAAG/D,aAAa,CAAC8D,MAAD,EAAS,KAAKxE,GAAd,CAAjC;;UAGI,CAAC4C,IAAD,IAASA,IAAI,CAACxC,MAAL,KAAgB,CAA7B,EAAgC;eACxBqE,WAAP;;;UAGKC,SAAS,GAAG9B,IAAI,CAACN,KAAL,CAAW,GAAX,CAAlB;UAEIqC,WAAW,GAAGF,WAAlB;UAEIG,aAAa,GAAG,IAApB;;WAEK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,SAAS,CAACtE,MAA9B,EAAsCyE,CAAC,EAAvC,EAA2C;YACtC,CAACF,WAAL,EAAkB;UACjBC,aAAa,GAAG,KAAhB;;;;QAGDD,WAAW,GAAGA,WAAW,CAACD,SAAS,CAACG,CAAD,CAAV,CAAzB;;;UAEG,CAACD,aAAD,IAAkBD,WAAW,IAAI,IAArC,EAA2C;eACnC,IAAP;;;aAEMA,WAAP;;;;;;;;;;WAQDG,mBAAIlC,MAAMO,OAAO;;MAEhBI,WAAW,CAACtE,aAAD,CAAX,CAFgB;;UAIVe,GAAG,GAAG,KAAKA,GAAjB;UACMwE,MAAM,GAAGjC,aAAa,CAACF,MAAM,EAAP,CAA5B;UACMoC,WAAW,GAAG/D,aAAa,CAAC8D,MAAD,EAASxE,GAAT,CAAjC;;UAEI;YACC4C,IAAI,CAACxC,MAAL,KAAgB,CAApB,EAAuB;UACtBiB,aAAa,CAACmD,MAAD,EAASxE,GAAT,EAAcmD,KAAd,CAAb;SADD,MAEO;cACA4B,QAAQ,GAAGrC,OAAO,CAAC+B,WAAD,EAAc7B,IAAI,CAACN,KAAL,CAAW,GAAX,CAAd,EAA+B,UAACK,GAAD,EAAMK,IAAN,EAAe;YACrEL,GAAG,CAACK,IAAD,CAAH,GAAYG,KAAZ;WADuB,CAAxB;UAIA9B,aAAa,CACZmD,MADY,EAEZxE,GAFY,EAGZ+E,QAHY,CAAb;;OARF,CAcE,OAAOpG,CAAP,EAAU;YACPyE,UAAU,CAACzE,CAAD,CAAd,EAAmB;eACbmG,GAAL,CAASlC,IAAT,EAAeO,KAAf;SADD,MAEO;;gBAEAxE,CAAN;;;;aAGK,IAAP;;;;;;;;;WAODqG,yBAAOpC,MAAM;;MAEZW,WAAW,CAACtE,aAAD,CAAX,CAFY;;UAKNe,GAAG,GAAG,KAAKA,GAAjB;UACMwE,MAAM,GAAGjC,aAAa,CAACF,MAAM,EAAP,CAA5B;UACMoC,WAAW,GAAG/D,aAAa,CAAC8D,MAAD,EAASxE,GAAT,CAAjC;;UAEI;YACC4C,IAAI,CAACxC,MAAL,KAAgB,CAApB,EAAuB;UACtBiB,aAAa,CAACmD,MAAD,EAASxE,GAAT,EAAc,IAAd,CAAb;SADD,MAEO;cACAmD,KAAK,GAAGT,OAAO,CAAC+B,WAAD,EAAc7B,IAAI,CAACN,KAAL,CAAW,GAAX,CAAd,EAA+B,UAACK,GAAD,EAAMK,IAAN,EAAe;gBAC9D,OAAOL,GAAP,KAAe,QAAnB,EAA6B;qBACrBA,GAAG,CAACK,IAAD,CAAV;;WAFmB,CAArB;UAMA3B,aAAa,CACZmD,MADY,EAEZxE,GAFY,EAGZmD,KAHY,CAAb;;OAVF,CAgBE,OAAOxE,CAAP,EAAU;YACPyE,UAAU,CAACzE,CAAD,CAAd,EAAmB;eACbqG,MAAL,CAAYpC,IAAZ;SADD,MAEO;;gBAEAjE,CAAN;;;;aAGK,IAAP;;;;;;EA/II2F,QACEW,UAAU;EADZX,QAEEY,iBAAiB;IACvB1D,KAAK,EAALA,KADuB;IAEvBH,aAAa,EAAbA,aAFuB;IAGvBX,aAAa,EAAbA,aAHuB;IAIvBZ,UAAU,EAAVA;;SANIwE;;;;AAoJNf,WAAW,CAACpB,iBAAiB,EAAlB,CAAX;;;;;"} \ No newline at end of file diff --git a/dist/persist.js b/dist/persist.js new file mode 100644 index 0000000..6e2d5b2 --- /dev/null +++ b/dist/persist.js @@ -0,0 +1,526 @@ +/* +Copyright (c) 2017 NAVER Corp. +@egjs/persist project is licensed under the MIT license + +@egjs/persist JavaScript library + + +@version 2.4.0 +*/ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.eg = global.eg || {}, global.eg.Persist = factory()); +}(this, (function () { 'use strict'; + + var win = typeof window !== "undefined" && window || {}; + var console$1 = win.console; + var document$1 = win.document; + var history = win.history; + var location = win.location; + var navigator = win.navigator; + var parseFloat = win.parseFloat; + var performance = win.performance; + var localStorage = null; + var sessionStorage = null; + + try { + localStorage = win.localStorage; + sessionStorage = win.sessionStorage; + } catch (e) {} + + var CONST_PERSIST = "___persist___"; + var CONST_PERSIST_STATE = "state" + CONST_PERSIST; + var CONST_DEPTHS = "depths"; + var CONST_LAST_URL = "lastUrl"; + var navigation = performance && performance.navigation; + var TYPE_NAVIGATE = navigation && navigation.TYPE_NAVIGATE || 0; + var TYPE_RELOAD = navigation && navigation.TYPE_RELOAD || 1; + var TYPE_BACK_FORWARD = navigation && navigation.TYPE_BACK_FORWARD || 2; + + var isSupportState = history && "replaceState" in history && "state" in history; + + function isStorageAvailable(storage) { + if (!storage) { + return undefined; + } + + var TMP_KEY = "__tmp__" + CONST_PERSIST; + + try { + // In case of iOS safari private mode, calling setItem on storage throws error + storage.setItem(TMP_KEY, CONST_PERSIST); // In Chrome incognito mode, can not get saved value + // In IE8, calling storage.getItem occasionally makes "Permission denied" error + + return storage.getItem(TMP_KEY) === CONST_PERSIST; + } catch (e) { + return false; + } + } + + var storage = function () { + var strg; + + if (isStorageAvailable(sessionStorage)) { + strg = sessionStorage; + } else if (isStorageAvailable(localStorage)) { + strg = localStorage; + } + + return strg; + }(); + + function warnInvalidStorageValue() { + /* eslint-disable no-console */ + console.warn("window.history or session/localStorage has no valid " + "format data to be handled in persist."); + /* eslint-enable no-console */ + } + + function getStorage() { + return storage; + } + /* + * Get state value + */ + + + function getState(key) { + var state; + var stateStr; + + if (storage) { + stateStr = storage.getItem(key); + } else if (history.state) { + if (typeof history.state === "object" && history.state !== null) { + stateStr = history.state[key]; + } else { + warnInvalidStorageValue(); + } + } else { + stateStr = history.state; + } // the storage is clean + + + if (stateStr === null) { + return {}; + } // "null" is not a valid + + + var isValidStateStr = typeof stateStr === "string" && stateStr.length > 0 && stateStr !== "null"; + + try { + state = JSON.parse(stateStr); // like '[ ... ]', '1', '1.234', '"123"' is also not valid + + var isValidType = !(typeof state !== "object" || state instanceof Array); + + if (!isValidStateStr || !isValidType) { + throw new Error(); + } + } catch (e) { + warnInvalidStorageValue(); + state = {}; + } // Note2 (Android 4.3) return value is null + + + return state; + } + + function getStateByKey(key, valueKey) { + if (!isSupportState && !storage) { + return undefined; + } + + var result = getState(key)[valueKey]; // some device returns "null" or undefined + + if (result === "null" || typeof result === "undefined") { + result = null; + } + + return result; + } + /* + * Set state value + */ + + + function setState(key, state) { + if (storage) { + if (state) { + storage.setItem(key, JSON.stringify(state)); + } else { + storage.removeItem(key); + } + } else { + try { + var historyState = !history || history.state == null ? {} : history.state; + + if (history && typeof historyState === "object") { + historyState[key] = JSON.stringify(state); + history.replaceState(historyState, document.title, location.href); + } else { + /* eslint-disable no-console */ + console.warn("To use a history object, it must be an object that is not a primitive type."); + /* eslint-enable no-console */ + } + } catch (e) { + /* eslint-disable no-console */ + console.warn(e.message); + /* eslint-enable no-console */ + } + } + + state ? win[CONST_PERSIST] = true : delete win[CONST_PERSIST]; + } + + function setStateByKey(key, valueKey, data) { + if (!isSupportState && !storage) { + return; + } + + var beforeData = getState(key); + beforeData[valueKey] = data; + setState(key, beforeData); + } + /* + * flush current history state + */ + + + function reset(key) { + setState(key, null); + } + + var userAgent = navigator ? navigator.userAgent : ""; + + var isNeeded = function () { + var isIOS = new RegExp("iPhone|iPad", "i").test(userAgent); + var isMacSafari = new RegExp("Mac", "i").test(userAgent) && !new RegExp("Chrome", "i").test(userAgent) && new RegExp("Apple", "i").test(userAgent); + var isAndroid = new RegExp("Android ", "i").test(userAgent); + var isWebview = new RegExp("wv; |inapp;", "i").test(userAgent); + var androidVersion = isAndroid ? parseFloat(new RegExp("(Android)\\s([\\d_\\.]+|\\d_0)", "i").exec(userAgent)[2]) : undefined; + return !(isIOS || isMacSafari || isAndroid && (androidVersion <= 4.3 && isWebview || androidVersion < 3)); + }(); // In case of IE8, TYPE_BACK_FORWARD is undefined. + + + function getNavigationType() { + return performance && performance.navigation && performance.navigation.type; + } + + function getUrl() { + return location ? location.href.split("#")[0] : ""; + } + + function getStorageKey(name) { + return name + CONST_PERSIST; + } + + /* eslint-disable no-use-before-define */ + var currentUrl = ""; + + function execRec(obj, path, func) { + var _obj = obj; + + if (!_obj) { + _obj = isNaN(path[0]) ? {} : []; + } + + var head = path.shift(); + + if (path.length === 0) { + if (_obj instanceof Array && isNaN(head)) { + console$1.warn("Don't use key string on array"); + } + + func(_obj, head); + return _obj; + } + + _obj[head] = execRec(_obj[head], path, func); + return _obj; + } + + function setPersistState(key, value) { + try { + setStateByKey(CONST_PERSIST_STATE, key, value); + } catch (e) { + if (clearFirst()) { + if (key === CONST_LAST_URL) { + setPersistState(key, value); + } else if (key === CONST_DEPTHS) { + setPersistState(key, value && value.slice(1)); + } + } else { + // There is no more size to fit in. + throw e; + } + } + } + + function getPersistState(key) { + return getStateByKey(CONST_PERSIST_STATE, key); + } + + function updateDepth(type) { + if (type === void 0) { + type = 0; + } + + var url = getUrl(); + + if (currentUrl === url) { + return; + } // url is not the same for the first time, pushState, or replaceState. + + + currentUrl = url; + var depths = getPersistState(CONST_DEPTHS) || []; + + if (type === TYPE_BACK_FORWARD) { + // Change current url only + var currentIndex = depths.indexOf(currentUrl); + ~currentIndex && setPersistState(CONST_LAST_URL, currentUrl); + } else { + var prevLastUrl = getPersistState(CONST_LAST_URL); + reset(getStorageKey(currentUrl)); + + if (type === TYPE_NAVIGATE && url !== prevLastUrl) { + // Remove all url lists with higher index than current index + var prevLastIndex = depths.indexOf(prevLastUrl); + var removedList = depths.splice(prevLastIndex + 1, depths.length); + removedList.forEach(function (removedUrl) { + reset(getStorageKey(removedUrl)); + }); // If the type is NAVIGATE and there is information about current url, delete it. + + var _currentIndex = depths.indexOf(currentUrl); + + ~_currentIndex && depths.splice(_currentIndex, 1); + } // Add depth for new address. + + + if (depths.indexOf(url) < 0) { + depths.push(url); + } + + setPersistState(CONST_DEPTHS, depths); + setPersistState(CONST_LAST_URL, url); + } + } + + function clearFirst() { + var depths = getPersistState(CONST_DEPTHS) || []; + var removed = depths.splice(0, 1); + + if (!removed.length) { + // There is an error because there is no depth to add data. + return false; + } + + var removedUrl = removed[0]; + reset(getStorageKey(removedUrl)); + + if (currentUrl === removedUrl) { + currentUrl = ""; + setPersistState(CONST_LAST_URL, ""); + + if (!depths.length) { + // I tried to add myself, but it didn't add up, so I got an error. + return false; + } + } + + setPersistState(CONST_DEPTHS, depths); // Clear the previous record and try to add data again. + + return true; + } + + function _clear() { + var depths = getPersistState(CONST_DEPTHS) || []; + depths.forEach(function (url) { + reset(getStorageKey(url)); + }); + reset(CONST_PERSIST_STATE); + currentUrl = ""; + } + + if ("onpopstate" in win) { + win.addEventListener("popstate", function () { + // popstate event occurs when backward or forward + updateDepth(TYPE_BACK_FORWARD); + }); + } + /** + * Get or store the current state of the web page using JSON. + * @ko 웹 페이지의 현재 상태를 JSON 형식으로 저장하거나 읽는다. + * @alias eg.Persist + * + * @support {"ie": "9+", "ch" : "latest", "ff" : "latest", "sf" : "latest" , "edge" : "latest", "ios" : "7+", "an" : "2.3+ (except 3.x)"} + */ + + + var Persist = + /*#__PURE__*/ + function () { + var Persist = + /*#__PURE__*/ + function () { + /** + * @static + * Clear all information in Persist + */ + Persist.clear = function clear() { + _clear(); + }; + /** + * @static + * Return whether you need "Persist" module by checking the bfCache support of the current browser + * @return {Boolean} + */ + + + Persist.isNeeded = function isNeeded$$1() { + return isNeeded; + }; + /** + * Constructor + * @param {String} key The key of the state information to be stored 저장할 상태 정보의 키 + **/ + + + function Persist(key) { + this.key = key || ""; + } + /** + * Read value + * @param {String?} path target path + * @return {String|Number|Boolean|Object|Array} + */ + + + var _proto = Persist.prototype; + + _proto.get = function get(path) { + // update url for pushState, replaceState + updateDepth(TYPE_NAVIGATE); // find path + + var urlKey = getStorageKey(getUrl()); + var globalState = getStateByKey(urlKey, this.key); + + if (!path || path.length === 0) { + return globalState; + } + + var pathToken = path.split("."); + var currentItem = globalState; + var isTargetExist = true; + + for (var i = 0; i < pathToken.length; i++) { + if (!currentItem) { + isTargetExist = false; + break; + } + + currentItem = currentItem[pathToken[i]]; + } + + if (!isTargetExist || currentItem == null) { + return null; + } + + return currentItem; + }; + /** + * Save value + * @param {String} path target path + * @param {String|Number|Boolean|Object|Array} value value to save + * @return {Persist} + */ + + + _proto.set = function set(path, value) { + // update url for pushState, replaceState + updateDepth(TYPE_NAVIGATE); // find path + + var key = this.key; + var urlKey = getStorageKey(getUrl()); + var globalState = getStateByKey(urlKey, key); + + try { + if (path.length === 0) { + setStateByKey(urlKey, key, value); + } else { + var allValue = execRec(globalState, path.split("."), function (obj, head) { + obj[head] = value; + }); + setStateByKey(urlKey, key, allValue); + } + } catch (e) { + if (clearFirst(e)) { + this.set(path, value); + } else { + // There is no more size to fit in. + throw e; + } + } + + return this; + }; + /** + * Remove value + * @param {String} path target path + * @return {Persist} + */ + + + _proto.remove = function remove(path) { + // update url for pushState, replaceState + updateDepth(TYPE_NAVIGATE); // find path + + var key = this.key; + var urlKey = getStorageKey(getUrl()); + var globalState = getStateByKey(urlKey, key); + + try { + if (path.length === 0) { + setStateByKey(urlKey, key, null); + } else { + var value = execRec(globalState, path.split("."), function (obj, head) { + if (typeof obj === "object") { + delete obj[head]; + } + }); + setStateByKey(urlKey, key, value); + } + } catch (e) { + if (clearFirst(e)) { + this.remove(path); + } else { + // There is no more size to fit in. + throw e; + } + } + + return this; + }; + + return Persist; + }(); + + Persist.VERSION = "2.4.0"; + Persist.StorageManager = { + reset: reset, + setStateByKey: setStateByKey, + getStateByKey: getStateByKey, + getStorage: getStorage + }; + return Persist; + }(); // If navigation's type is not TYPE_BACK_FORWARD, delete information about current url. + + + updateDepth(getNavigationType()); + + Persist.updateDepth = updateDepth; + + return Persist; + +}))); +//# sourceMappingURL=persist.js.map diff --git a/dist/persist.js.map b/dist/persist.js.map new file mode 100644 index 0000000..e3fb252 --- /dev/null +++ b/dist/persist.js.map @@ -0,0 +1 @@ +{"version":3,"file":"persist.js","sources":["../src/browser.js","../src/consts.js","../src/storageManager.js","../src/utils.js","../src/Persist.js","../src/index.umd.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 저장할 상태 정보의 키\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","import Persist, {updateDepth} from \"./Persist\";\n\n// eslint-disable-next-line import/no-named-as-default-member\nPersist.updateDepth = updateDepth;\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 diff --git a/dist/persist.min.js b/dist/persist.min.js new file mode 100644 index 0000000..764e340 --- /dev/null +++ b/dist/persist.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t.eg=t.eg||{},t.eg.Persist=e())}(this,function(){"use strict";var r="undefined"!=typeof window&&window||{},o=r.console,a=(r.document,r.history),i=r.location,t=r.navigator,e=r.parseFloat,n=r.performance,s=null,f=null;try{s=r.localStorage,f=r.sessionStorage}catch(t){}var c="___persist___",u="state"+c,l="depths",p="lastUrl",h=n&&n.navigation,v=h&&h.TYPE_NAVIGATE||0,d=(h&&h.TYPE_RELOAD,h&&h.TYPE_BACK_FORWARD||2),g=a&&"replaceState"in a&&"state"in a;function y(t){if(t){var e="__tmp__"+c;try{return t.setItem(e,c),t.getItem(e)===c}catch(t){return!1}}}var w,m=(y(f)?w=f:y(s)&&(w=s),w);function E(){console.warn("window.history or session/localStorage has no valid format data to be handled in persist.")}function _(){return m}function x(t){var e,n;if(m?n=m.getItem(t):a.state?"object"==typeof a.state&&null!==a.state?n=a.state[t]:E():n=a.state,null===n)return{};var r="string"==typeof n&&0 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 저장할 상태 정보의 키\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","import Persist, {updateDepth} from \"./Persist\";\n\n// eslint-disable-next-line import/no-named-as-default-member\nPersist.updateDepth = updateDepth;\n\nexport default Persist;\n"],"names":["win","window","console","history","document","location","navigator","parseFloat","performance","localStorage","sessionStorage","e","CONST_PERSIST","CONST_PERSIST_STATE","CONST_DEPTHS","CONST_LAST_URL","navigation","TYPE_NAVIGATE","TYPE_BACK_FORWARD","TYPE_RELOAD","isSupportState","isStorageAvailable","storage","TMP_KEY","setItem","getItem","strg","warnInvalidStorageValue","warn","getStorage","getState","key","state","stateStr","isValidStateStr","length","isValidType","JSON","parse","Array","Error","getStateByKey","valueKey","result","setState","stringify","removeItem","historyState","replaceState","title","href","message","setStateByKey","data","beforeData","reset","isIOS","isMacSafari","isAndroid","isWebview","androidVersion","userAgent","isNeeded","RegExp","test","exec","undefined","getUrl","split","getStorageKey","name","currentUrl","execRec","obj","path","func","_obj","isNaN","head","shift","setPersistState","value","clearFirst","slice","getPersistState","updateDepth","type","url","depths","indexOf","prevLastUrl","prevLastIndex","splice","forEach","removedUrl","currentIndex","push","removed","addEventListener","Persist","clear","get","globalState","this","pathToken","currentItem","isTargetExist","i","set","urlKey","remove","VERSION","StorageManager"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 3b48c1d..ea35291 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@egjs/persist", - "version": "2.3.0-snapshot", + "version": "2.4.0", "description": "Provide cache interface to handle persisted data among history navigation.", "main": "dist/persist.js", "module": "dist/persist.esm.js",