browser-storage-adapter
Version:
Browser storage adapter to crud 1-n different stores simultaneously
1 lines • 22.4 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../node_modules/cookie-es/dist/index.mjs","../src/utils.ts","../src/constants.ts","../src/module.ts"],"sourcesContent":["const decode = decodeURIComponent;\nconst encode = encodeURIComponent;\nconst pairSplitRegExp = /; */;\nconst fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\nfunction parse(str, options) {\n if (typeof str !== \"string\") {\n throw new TypeError(\"argument str must be a string\");\n }\n let obj = {};\n let opt = options || {};\n let pairs = str.split(pairSplitRegExp);\n let dec = opt.decode || decode;\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i];\n let eq_idx = pair.indexOf(\"=\");\n if (eq_idx < 0) {\n continue;\n }\n let key = pair.substr(0, eq_idx).trim();\n let val = pair.substr(++eq_idx, pair.length).trim();\n if (val[0] == '\"') {\n val = val.slice(1, -1);\n }\n if (obj[key] == void 0) {\n obj[key] = tryDecode(val, dec);\n }\n }\n return obj;\n}\nfunction serialize(name, value, options) {\n let opt = options || {};\n let enc = opt.encode || encode;\n if (typeof enc !== \"function\") {\n throw new TypeError(\"option encode is invalid\");\n }\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n let encodedValue = enc(value);\n if (encodedValue && !fieldContentRegExp.test(encodedValue)) {\n throw new TypeError(\"argument val is invalid\");\n }\n let str = name + \"=\" + encodedValue;\n if (opt.maxAge != null) {\n let maxAge = opt.maxAge - 0;\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n str += \"; Max-Age=\" + Math.floor(maxAge);\n }\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n str += \"; Domain=\" + opt.domain;\n }\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n str += \"; Path=\" + opt.path;\n }\n if (opt.expires) {\n if (typeof opt.expires.toUTCString !== \"function\") {\n throw new TypeError(\"option expires is invalid\");\n }\n str += \"; Expires=\" + opt.expires.toUTCString();\n }\n if (opt.httpOnly) {\n str += \"; HttpOnly\";\n }\n if (opt.secure) {\n str += \"; Secure\";\n }\n if (opt.sameSite) {\n let sameSite = typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n switch (sameSite) {\n case true:\n str += \"; SameSite=Strict\";\n break;\n case \"lax\":\n str += \"; SameSite=Lax\";\n break;\n case \"strict\":\n str += \"; SameSite=Strict\";\n break;\n case \"none\":\n str += \"; SameSite=None\";\n break;\n default:\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n return str;\n}\nfunction tryDecode(str, decode2) {\n try {\n return decode2(str);\n } catch (e) {\n return str;\n }\n}\n\nexport { parse, serialize };\n","/*\n * Copyright (c) 2021-2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Options, OptionsInput } from './type';\n\nexport const isUnset = (o: any) => typeof o === 'undefined' || o === null;\nexport const isSet = (o: any) => !isUnset(o);\n\nexport function encodeValue(val: any) {\n if (typeof val === 'string') {\n return val;\n }\n return JSON.stringify(val);\n}\n\nexport function decodeValue(val: any) {\n // Try to parse as json\n if (typeof val === 'string') {\n try {\n return JSON.parse(val);\n } catch (_) {\n // ...\n }\n }\n\n // Return as is\n return val;\n}\n\nexport function buildOptions(input: OptionsInput) : Options {\n return {\n ...input,\n driver: input.driver || {},\n isServer: input.isServer || (() => false),\n };\n}\n","/*\n * Copyright (c) 2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum Driver {\n LOCAL_STORAGE = 'localStorage',\n SESSION_STORAGE = 'sessionStorage',\n COOKIE = 'cookie',\n}\n","/*\n * Copyright (c) 2021.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { CookieSerializeOptions, parse as parseCookie, serialize as serializeCookie } from 'cookie-es';\nimport { Options, OptionsInput } from './type';\nimport {\n buildOptions,\n decodeValue,\n encodeValue,\n isSet,\n isUnset,\n} from './utils';\nimport { Driver } from './constants';\n\nexport class Adapter {\n public readonly options: Options;\n\n protected state : Record<string, any>;\n\n // ------------------------------------\n\n constructor(options: OptionsInput) {\n this.options = buildOptions(options);\n this.state = {};\n\n this.initState();\n }\n\n // ------------------------------------\n\n getKeyWithNamespace(key: string) : string {\n let keyWithNamespace = '';\n\n if (typeof this.options.namespace !== 'undefined') {\n keyWithNamespace += `${this.options.namespace}_`;\n }\n\n return keyWithNamespace + key;\n }\n\n // ------------------------------------\n\n // ------------------------------------\n // Universal\n // ------------------------------------\n\n set(key: string, value: any) {\n // Unset null, undefined\n if (isUnset(value)) {\n return this.remove(key);\n }\n\n this.setState(key, value);\n\n this.setCookie(key, value);\n\n this.setLocalStorageItem(key, value);\n\n this.setSessionStorageItem(key, value);\n\n return value;\n }\n\n get(key: string) {\n let value : any = this.getState(key);\n\n // Cookies\n if (isUnset(value)) {\n value = this.getCookie(key);\n }\n\n // Local Storage\n if (isUnset(value)) {\n value = this.getLocalStorageItem(key);\n }\n\n // Session Storage\n if (isUnset(value)) {\n value = this.getSessionStorageItem(key);\n }\n\n if (isUnset(value)) {\n value = this.getState(key);\n }\n\n return value;\n }\n\n getAll() {\n let value : any = {};\n let storageValue : any;\n\n storageValue = this.getCookies();\n if (storageValue) {\n value = { ...value, ...storageValue };\n }\n\n storageValue = this.getLocalStorageItems();\n if (storageValue) {\n value = { ...value, ...storageValue };\n }\n\n storageValue = this.getSessionStorageItems();\n if (storageValue) {\n value = { ...value, ...storageValue };\n }\n\n return value;\n }\n\n sync(key: string, defaultValue?: any) {\n let value = this.get(key);\n\n if (isUnset(value) && isSet(defaultValue)) {\n value = defaultValue;\n }\n\n if (isSet(value)) {\n this.set(key, value);\n }\n\n return value;\n }\n\n remove(key: string) {\n this.removeState(key);\n this.removeSessionStorageItem(key);\n this.removeLocalStorageItem(key);\n this.removeCookie(key);\n }\n\n // ------------------------------------\n // State\n // ------------------------------------\n\n initState() {\n if (this.options.isServer()) {\n return;\n }\n\n this.state = {};\n }\n\n setState<T>(key: string, value: T) {\n if (this.options.isServer()) {\n return;\n }\n\n this.state[key] = value;\n }\n\n getState(key: string) {\n if (this.options.isServer()) {\n return undefined;\n }\n\n return this.state[key];\n }\n\n removeState(key: string) {\n this.setState(key, undefined);\n }\n\n // ------------------------------------\n // Browser Storage\n // ------------------------------------\n\n getBrowserStorageItems(type: `${Driver}`) : Record<string, any> {\n let storage : any;\n switch (type) {\n case Driver.SESSION_STORAGE:\n storage = sessionStorage;\n break;\n case Driver.LOCAL_STORAGE:\n storage = localStorage;\n break;\n }\n\n if (\n typeof storage === 'undefined' ||\n !this.options.driver[type]\n ) {\n return {};\n }\n\n const items : Record<string, any> = {};\n const keys = Object.keys(storage);\n let i = keys.length;\n\n while (i--) {\n let key = keys[i];\n if (typeof this.options.namespace !== 'undefined') {\n if (key.slice(0, this.options.namespace.length) !== this.options.namespace) {\n continue;\n }\n\n key = key.replace(`${this.options.namespace}_`, '');\n }\n\n items[key] = decodeValue(storage.getItem(keys[i]));\n }\n\n return items;\n }\n\n // ------------------------------------\n // Local storage\n // ------------------------------------\n\n setLocalStorageItem(key: string, value: any) : void {\n // Unset null, undefined\n if (isUnset(value)) {\n this.removeLocalStorageItem(key);\n return;\n }\n\n if (typeof localStorage === 'undefined' || !this.options.driver.localStorage) {\n return;\n }\n\n const keyFull = this.getKeyWithNamespace(key);\n\n localStorage.setItem(keyFull, encodeValue(value));\n }\n\n getLocalStorageItem(key: string) : any {\n if (\n typeof localStorage === 'undefined' ||\n !this.options.driver.localStorage\n ) {\n return undefined;\n }\n\n const keyFull = this.getKeyWithNamespace(key);\n\n const value = localStorage.getItem(keyFull);\n\n return decodeValue(value);\n }\n\n getLocalStorageItems() : any {\n return this.getBrowserStorageItems(Driver.LOCAL_STORAGE);\n }\n\n removeLocalStorageItem(key: string) {\n if (\n typeof localStorage === 'undefined' ||\n !this.options.driver.localStorage\n ) {\n return;\n }\n\n const keyWithNamespace = this.getKeyWithNamespace(key);\n localStorage.removeItem(keyWithNamespace);\n }\n\n // ------------------------------------\n // Session storage\n // ------------------------------------\n\n setSessionStorageItem(key: string, value: any) : any {\n // Unset null, undefined\n if (isUnset(value)) {\n this.removeSessionStorageItem(key);\n return;\n }\n\n if (\n typeof sessionStorage === 'undefined' ||\n !this.options.driver.sessionStorage\n ) {\n return;\n }\n\n const keyWithNamespace = this.getKeyWithNamespace(key);\n\n sessionStorage.setItem(keyWithNamespace, encodeValue(value));\n }\n\n getSessionStorageItem(key: string) {\n if (\n typeof sessionStorage === 'undefined' ||\n !this.options.driver.sessionStorage\n ) {\n return undefined;\n }\n\n const keyWithNamespace = this.getKeyWithNamespace(key);\n\n const value = sessionStorage.getItem(keyWithNamespace);\n\n return decodeValue(value);\n }\n\n getSessionStorageItems() : any {\n return this.getBrowserStorageItems(Driver.SESSION_STORAGE);\n }\n\n removeSessionStorageItem(key: string) {\n if (\n typeof sessionStorage === 'undefined' ||\n !this.options.driver.sessionStorage\n ) {\n return;\n }\n\n const keyWithNamespace = this.getKeyWithNamespace(key);\n sessionStorage.removeItem(keyWithNamespace);\n }\n\n // ------------------------------------\n // Cookies\n // ------------------------------------\n getCookies() {\n const isServer = this.options.isServer();\n\n const cookieStr = isServer ?\n (this.options.getServerCookies ? this.options.getServerCookies() : '') :\n document.cookie;\n\n const items : Record<string, any> = decodeValue(parseCookie(cookieStr || '') || {});\n const keys = Object.keys(items);\n for (let i = 0; i < keys.length; i++) {\n items[keys[i]] = decodeValue(decodeURIComponent(items[keys[i]]));\n }\n\n return items;\n }\n\n setCookie(key: string, value: any) {\n if (!this.options.driver.cookie) {\n return;\n }\n\n if (typeof this.options.setCookie === 'function') {\n this.options.setCookie(key, value);\n return;\n }\n\n const keyWithNamespace = this.getKeyWithNamespace(key);\n const options = <CookieSerializeOptions> ({\n ...(typeof this.options.driver.cookie === 'boolean' ? {} : this.options.driver.cookie),\n });\n\n const valueEncoded = encodeValue(value);\n\n // Unset null, undefined\n if (isUnset(value)) {\n options.maxAge = -1;\n }\n\n const serializedCookie = serializeCookie(keyWithNamespace, valueEncoded, options);\n\n const isServer = this.options.isServer();\n if (isServer) {\n if (typeof this.options.setServerCookie !== 'undefined') {\n this.options.setServerCookie(serializedCookie);\n }\n } else if (this.options.setServerCookie) {\n // Set in browser\n document.cookie = serializedCookie;\n }\n }\n\n getCookie(key: string) {\n if (\n !this.options.driver.cookie\n ) {\n return undefined;\n }\n\n if (typeof this.options.getCookie === 'function') {\n return this.options.getCookie(key);\n }\n\n const keyFull = this.getKeyWithNamespace(key);\n\n const cookies = this.getCookies();\n\n return cookies[keyFull] ?? undefined;\n }\n\n removeCookie(key: string) {\n this.setCookie(key, undefined);\n }\n}\n"],"names":["decode","decodeURIComponent","encode","encodeURIComponent","pairSplitRegExp","fieldContentRegExp","tryDecode","str","decode2","e","_extends","Driver","isUnset","o","isSet","encodeValue","val","JSON","stringify","decodeValue","parse","_","buildOptions","input","driver","isServer","Adapter","options","this","state","initState","getKeyWithNamespace","key","keyWithNamespace","namespace","set","value","remove","setState","setCookie","setLocalStorageItem","setSessionStorageItem","get","getState","getCookie","getLocalStorageItem","getSessionStorageItem","getAll","storageValue","getCookies","getLocalStorageItems","getSessionStorageItems","sync","defaultValue","removeState","removeSessionStorageItem","removeLocalStorageItem","removeCookie","undefined","getBrowserStorageItems","type","storage","SESSION_STORAGE","sessionStorage","LOCAL_STORAGE","localStorage","items","keys","Object","i","length","slice","replace","getItem","keyFull","setItem","removeItem","TypeError","obj","opt","pairs","split","dec","pair","eq_idx","indexOf","substr","trim","parseCookie","getServerCookies","document","cookie","valueEncoded","maxAge","serializedCookie","name","enc","test","encodedValue","isNaN","isFinite","Math","floor","domain","path","expires","toUTCString","httpOnly","secure","sameSite","toLowerCase","serializeCookie","setServerCookie","cookies"],"mappings":"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"}