storage-manager-js
Version:
A little way to control Cookies, LocalStorage and SessionStorage without tears
1 lines • 9.58 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/utils.ts","../src/storages/cookie.ts","../src/storages/storage.ts"],"sourcesContent":["export const map = (object: object, callback: (x: string) => void): void => {\n\ttry {\n\t\tObject.keys(object).forEach(callback);\n\t} catch (error) {\n\t\twindow.console.log(error);\n\t}\n};\n\nexport const isNil = <T>(item: T) => item === null || item === undefined;\n\nexport const isPrimitive = (a: any) => {\n\tconst type = typeof a;\n\treturn type === \"string\" || type === \"number\" || type === \"boolean\" || isNil(a);\n};\n\nexport const getStorage = <T>(key: string, storage: Storage) => {\n\tconst str = storage.getItem(key);\n\ttry {\n\t\treturn JSON.parse(str as never) as T;\n\t} catch (error) {\n\t\treturn str ?? null;\n\t}\n};\n\nexport const json = <T extends {}>(storage: Storage): T =>\n\tObject.keys(storage).reduce<T>(\n\t\t(acc, key) => ({\n\t\t\t...acc,\n\t\t\t[key]: getStorage(key, storage),\n\t\t}),\n\t\t{} as T,\n\t);\n","import type { CookieStorage, SetCookies, SetCookiesParser } from \"../types\";\nimport { isNil, isPrimitive } from \"../utils\";\nimport { Subscribe } from \"../types\";\n\nconst fnDate = (str: number | string | Date) =>\n\tstr instanceof Date ? str : typeof str === \"number\" ? new Date((new Date() as any) * 1 + (str as number) * 864e5) : str;\n\nconst zeroEpoch = \"1969-12-31T23:59:59.000Z\";\n\nconst json = <T>(): T => {\n\tconst cookie = document.cookie;\n\tif (cookie === \"\") {\n\t\treturn {} as T;\n\t}\n\treturn document.cookie\n\t\t.split(\"; \")\n\t\t.map((v) => v.split(\"=\"))\n\t\t.reduce((acc: any, v: any) => {\n\t\t\tacc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim());\n\t\t\treturn acc;\n\t\t}, {});\n};\n\nconst listeners = new Set<Subscribe>();\nconst callListeners = () => {\n\tconst store = json();\n\tlisteners.forEach((fn) => fn(store));\n};\n\nconst parsers: SetCookiesParser = [\n\t{ name: \"expires\", parse: (opts) => `expires=${fnDate(opts.expires ?? zeroEpoch)}` },\n\t{ name: \"maxAge\", parse: (opts) => (opts.maxAge ? `max-age=${fnDate(opts.expires ?? zeroEpoch)}` : \"\") },\n\t{ name: \"path\", parse: (opts) => `path=${opts.path ?? \"/\"}` },\n\t{ name: \"sameSite\", parse: (opts) => `samesite=${opts.sameSite ?? \"strict\"}` },\n\t{ name: \"useSecure\", parse: (opts) => `${opts.useSecure ?? true ? \"secure\" : \"\"}` },\n\t{\n\t\tname: \"domain\",\n\t\tparse: (opts) => {\n\t\t\tconst domain = opts.domain ?? \"\";\n\t\t\tif (domain === \"\") return \"\";\n\t\t\treturn `domain=${opts.multiDomain ? \".\" : \"\"}${domain}`;\n\t\t},\n\t},\n\t{ name: \"partitioned\", parse: (opts) => (opts.partitioned ? `Partitioned` : \"\") },\n];\n\nexport const Cookie: CookieStorage = {\n\tjson,\n\tlistener: (fn) => {\n\t\tlisteners.add(fn);\n\t\treturn () => listeners.delete(fn);\n\t},\n\tclearListeners: () => listeners.clear(),\n\thas: (key) => document.cookie.split(\";\").some((item) => item.trim().startsWith(`${key}=`)),\n\tdeleteAll: () => {\n\t\tdocument.cookie.split(\";\").forEach((cookie) => {\n\t\t\tdocument.cookie = cookie.replace(/^ +/, \"\").replace(/=.*/, `=;expires=${new Date().toUTCString()};path=/`);\n\t\t});\n\t\tcallListeners();\n\t},\n\tget: <E>(key: string): E | null => {\n\t\tconst value = (Cookie.json<E>() as any)[key];\n\t\tif (isNil(value)) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn JSON.parse(decodeURIComponent(value)) as E;\n\t\t} catch (error) {\n\t\t\treturn value;\n\t\t}\n\t},\n\tdelete: (key: string) => {\n\t\tdocument.cookie = `${encodeURIComponent(key)}=;expires=${new Date().toUTCString()}`;\n\t\tcallListeners();\n\t},\n\tset: (key: string, object: unknown, opts: SetCookies = {}) => {\n\t\tconst value = isPrimitive(object) ? object : encodeURIComponent(JSON.stringify(object));\n\t\tconst cookies = parsers\n\t\t\t.reduce<string[]>(\n\t\t\t\t(acc, el) => {\n\t\t\t\t\tconst val = el.parse(opts);\n\t\t\t\t\treturn val === \"\" ? acc : acc.concat(val);\n\t\t\t\t},\n\t\t\t\t[`${encodeURIComponent(key)}=${value}`],\n\t\t\t)\n\t\t\t.join(\";\");\n\t\tdocument.cookie = cookies;\n\t\tcallListeners();\n\t},\n};\n\n","import { Subscribe, TypeStorage } from \"../types\";\nimport { getStorage, isNil, json, map } from \"../utils\";\n\nexport const createStorage = (getStorageProvider: () => Storage): TypeStorage => {\n\tconst listeners = new Set<Subscribe>();\n\n\tconst deleteItem = (key: string) => {\n\t\tgetStorageProvider().removeItem(key);\n\t\tconst store = json(getStorageProvider());\n\t\tlisteners.forEach((fn) => fn(store));\n\t};\n\n\treturn {\n\t\tdelete: deleteItem,\n\t\tlistener: (fn) => {\n\t\t\tlisteners.add(fn);\n\t\t\treturn () => listeners.delete(fn);\n\t\t},\n\t\tclearListeners: () => listeners.clear(),\n\t\tjson: <T>(parse: boolean = false) => (parse ? json(getStorageProvider()) : (getStorageProvider() as unknown as T)),\n\t\thas: (key: string) => {\n\t\t\tconst item = getStorageProvider().getItem(key);\n\t\t\treturn !isNil(item);\n\t\t},\n\t\tdeleteAll: () => {\n\t\t\tmap(getStorageProvider(), deleteItem);\n\t\t\tlisteners.forEach((fn) => fn(getStorageProvider()));\n\t\t},\n\t\tget: <T>(key: string) => getStorage<T>(key, getStorageProvider()),\n\t\tset: (key, object) => {\n\t\t\tgetStorageProvider().setItem(key, JSON.stringify(object));\n\t\t\tlisteners.forEach((fn) => fn(getStorageProvider()));\n\t\t},\n\t};\n};\n\nexport const SessionStorage: TypeStorage = createStorage(() => window.sessionStorage);\n\nexport const LocalStorage: TypeStorage = createStorage(() => window.localStorage);\n"],"names":["map","object","callback","error","isNil","item","isPrimitive","a","type","getStorage","key","storage","str","json","acc","fnDate","zeroEpoch","v","listeners","callListeners","store","fn","parsers","opts","domain","Cookie","cookie","value","cookies","el","val","createStorage","getStorageProvider","deleteItem","parse","SessionStorage","LocalStorage"],"mappings":"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"}