UNPKG

svelte-local-storage-store

Version:

[![npm version](https://img.shields.io/npm/v/svelte-local-storage-store.svg)](https://www.npmjs.com/package/svelte-local-storage-store) [![license](https://img.shields.io/npm/l/svelte-local-storage-store.svg)](LICENSE.md) [![codecov](https://codecov.io/gh

1 lines 3.94 kB
{"version":3,"sources":["../index.ts"],"sourcesContent":["import {writable as internal, type Writable} from 'svelte/store'\n\ndeclare type Updater<T> = (value: T) => T;\ndeclare type StoreDict<T> = { [key: string]: Writable<T> }\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ninterface Stores {\n local: StoreDict<any>,\n session: StoreDict<any>,\n}\n\nconst stores : Stores = {\n local: {},\n session: {}\n}\n\ninterface Serializer<T> {\n parse(text: string): T\n stringify(object: T): string\n}\n\ntype StorageType = 'local' | 'session'\n\ninterface Options<T> {\n serializer?: Serializer<T>\n storage?: StorageType\n}\n\nfunction getStorage(type: StorageType) {\n return type === 'local' ? localStorage : sessionStorage\n}\n\n/** @deprecated `writable()` has been renamed to `persisted()` */\nexport function writable<T>(key: string, initialValue: T, options?: Options<T>): Writable<T> {\n console.warn(\"writable() has been deprecated. Please use persisted() instead.\\n\\nchange:\\n\\nimport { writable } from 'svelte-local-storage-store'\\n\\nto:\\n\\nimport { persisted } from 'svelte-local-storage-store'\")\n return persisted<T>(key, initialValue, options)\n}\nexport function persisted<T>(key: string, initialValue: T, options?: Options<T>): Writable<T> {\n const serializer = options?.serializer ?? JSON\n const storageType = options?.storage ?? 'local'\n const browser = typeof(window) !== 'undefined' && typeof(document) !== 'undefined'\n const storage = browser ? getStorage(storageType) : null\n\n function updateStorage(key: string, value: T) {\n storage?.setItem(key, serializer.stringify(value))\n }\n\n if (!stores[storageType][key]) {\n const store = internal(initialValue, (set) => {\n const json = storage?.getItem(key)\n\n if (json) {\n set(<T>serializer.parse(json))\n }\n\n if (browser && storageType == 'local') {\n const handleStorage = (event: StorageEvent) => {\n if (event.key === key)\n set(event.newValue ? serializer.parse(event.newValue) : null)\n }\n\n window.addEventListener(\"storage\", handleStorage)\n\n return () => window.removeEventListener(\"storage\", handleStorage)\n }\n })\n\n const {subscribe, set} = store\n\n stores[storageType][key] = {\n set(value: T) {\n updateStorage(key, value)\n set(value)\n },\n update(callback: Updater<T>) {\n return store.update((last) => {\n const value = callback(last)\n\n updateStorage(key, value)\n\n return value\n })\n },\n subscribe\n }\n }\n\n return stores[storageType][key]\n}\n"],"mappings":";AAAA,SAAQ,YAAY,gBAA8B;AAWlD,IAAM,SAAkB;AAAA,EACtB,OAAO,CAAC;AAAA,EACR,SAAS,CAAC;AACZ;AAcA,SAAS,WAAW,MAAmB;AACrC,SAAO,SAAS,UAAU,eAAe;AAC3C;AAGO,SAAS,SAAY,KAAa,cAAiB,SAAmC;AAC3F,UAAQ,KAAK,sMAAsM;AACnN,SAAO,UAAa,KAAK,cAAc,OAAO;AAChD;AACO,SAAS,UAAa,KAAa,cAAiB,SAAmC;AArC9F;AAsCE,QAAM,cAAa,wCAAS,eAAT,YAAuB;AAC1C,QAAM,eAAc,wCAAS,YAAT,YAAoB;AACxC,QAAM,UAAU,OAAO,WAAY,eAAe,OAAO,aAAc;AACvE,QAAM,UAAU,UAAU,WAAW,WAAW,IAAI;AAEpD,WAAS,cAAcA,MAAa,OAAU;AAC5C,uCAAS,QAAQA,MAAK,WAAW,UAAU,KAAK;AAAA,EAClD;AAEA,MAAI,CAAC,OAAO,WAAW,EAAE,GAAG,GAAG;AAC7B,UAAM,QAAQ,SAAS,cAAc,CAACC,SAAQ;AAC5C,YAAM,OAAO,mCAAS,QAAQ;AAE9B,UAAI,MAAM;AACR,QAAAA,KAAO,WAAW,MAAM,IAAI,CAAC;AAAA,MAC/B;AAEA,UAAI,WAAW,eAAe,SAAS;AACrC,cAAM,gBAAgB,CAAC,UAAwB;AAC7C,cAAI,MAAM,QAAQ;AAChB,YAAAA,KAAI,MAAM,WAAW,WAAW,MAAM,MAAM,QAAQ,IAAI,IAAI;AAAA,QAChE;AAEA,eAAO,iBAAiB,WAAW,aAAa;AAEhD,eAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,MAClE;AAAA,IACF,CAAC;AAED,UAAM,EAAC,WAAW,IAAG,IAAI;AAEzB,WAAO,WAAW,EAAE,GAAG,IAAI;AAAA,MACzB,IAAI,OAAU;AACZ,sBAAc,KAAK,KAAK;AACxB,YAAI,KAAK;AAAA,MACX;AAAA,MACA,OAAO,UAAsB;AAC3B,eAAO,MAAM,OAAO,CAAC,SAAS;AAC5B,gBAAM,QAAQ,SAAS,IAAI;AAE3B,wBAAc,KAAK,KAAK;AAExB,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,WAAW,EAAE,GAAG;AAChC;","names":["key","set"]}