From f7861bd75e9a21e1ad02b065610771b030551b1c Mon Sep 17 00:00:00 2001 From: Ermad Date: Mon, 23 Feb 2026 11:31:13 -0500 Subject: [PATCH 1/2] Added an option to set storage engine per store, #63 --- index.d.ts | 1 + index.js | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/index.d.ts b/index.d.ts index 0aaae47..bdac514 100644 --- a/index.d.ts +++ b/index.d.ts @@ -57,6 +57,7 @@ interface PersistentSimpleOptions { * Does not synchronize changes from other browser tabs */ listen?: boolean + storage?: PersistentStore } export type PersistentOptions = diff --git a/index.js b/index.js index 3e00aa5..6477fbb 100644 --- a/index.js +++ b/index.js @@ -38,20 +38,21 @@ export function setPersistentEngine(storage, events) { } export function persistentAtom(name, initial = undefined, opts = {}) { + let storage = opts.storage || storageEngine let encode = opts.encode || identity let decode = opts.decode || identity - let prevValue = storageEngine[name] - let store = atom(name in storageEngine ? decode(prevValue) : initial) + let prevValue = storage[name] + let store = atom(name in storage ? decode(prevValue) : initial) let set = store.set store.set = newValue => { prevValue = encode(newValue) if (typeof prevValue === 'undefined') { - delete storageEngine[name] + delete storage[name] } else { - storageEngine[name] = prevValue + storage[name] = prevValue } set(newValue) @@ -64,14 +65,14 @@ export function persistentAtom(name, initial = undefined, opts = {}) { } else { set(decode(e.newValue)) } - } else if (!storageEngine[name]) { + } else if (!storage[name]) { set(initial) } } function restore() { - if (prevValue === storageEngine[name]) return - store.set(name in storageEngine ? decode(storageEngine[name]) : initial) + if (prevValue === storage[name]) return + store.set(name in storage ? decode(storage[name]) : initial) } onMount(store, () => { @@ -114,6 +115,7 @@ export function persistentJSON(key, initial = null, opts = {}) { } export function persistentMap(prefix, initial = {}, opts = {}) { + let storage = opts.storage || storageEngine let encode = opts.encode || identity let decode = opts.decode || identity @@ -125,7 +127,7 @@ export function persistentMap(prefix, initial = {}, opts = {}) { if (opts.listen !== false && eventsEngine.perKey) { eventsEngine.removeEventListener(prefix + key, listener, restore) } - delete storageEngine[prefix + key] + delete storage[prefix + key] } else { if ( opts.listen !== false && @@ -134,7 +136,7 @@ export function persistentMap(prefix, initial = {}, opts = {}) { ) { eventsEngine.addEventListener(prefix + key, listener, restore) } - storageEngine[prefix + key] = encode(newValue) + storage[prefix + key] = encode(newValue) } } @@ -170,9 +172,9 @@ export function persistentMap(prefix, initial = {}, opts = {}) { function restore() { let data = { ...initial } - for (let key in storageEngine) { + for (let key in storage) { if (key.startsWith(prefix)) { - data[key.slice(prefix.length)] = decode(storageEngine[key]) + data[key.slice(prefix.length)] = decode(storage[key]) } } for (let key in data) { From 93482d5c5ad8e46e8961444158d3b1255c68952f Mon Sep 17 00:00:00 2001 From: Ermad Date: Mon, 23 Feb 2026 14:40:42 -0500 Subject: [PATCH 2/2] Adjusted size limit for storage option change Adjusted persistentMap test to set storage option before initilization --- package.json | 2 +- test/map.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ff09056..327624f 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "import": { "./index.js": "{ persistentAtom }" }, - "limit": "296 B" + "limit": "308 B" }, { "name": "Map", diff --git a/test/map.test.ts b/test/map.test.ts index 1e23b2f..69e384e 100644 --- a/test/map.test.ts +++ b/test/map.test.ts @@ -153,10 +153,10 @@ describe('persistentMap', () => { }) test('has test API', async () => { + useTestStorageEngine() let settings = persistentMap<{ lang: string }>('settings:', { lang: 'en' }) - useTestStorageEngine() let events: string[] = [] let unbind = settings.listen(value => {