From 7e71a41e5229126d404f56598c624709961dbf3b Mon Sep 17 00:00:00 2001 From: release-bot Date: Thu, 12 Feb 2026 12:50:58 +0100 Subject: [PATCH] feat: merge localState recursively with initial Closes #17 --- app/src/lib/helpers/localState.svelte.ts | 37 +++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/app/src/lib/helpers/localState.svelte.ts b/app/src/lib/helpers/localState.svelte.ts index cb23dfb..88feafd 100644 --- a/app/src/lib/helpers/localState.svelte.ts +++ b/app/src/lib/helpers/localState.svelte.ts @@ -1,5 +1,37 @@ import { browser } from '$app/environment'; +function mergeRecursive(current: T, initial: T): T { + if (typeof initial === 'number') { + if (typeof current === 'number') return current; + return initial; + } + + if (typeof initial === 'boolean') { + if (typeof current === 'boolean') return current; + return initial; + } + + if (Array.isArray(initial)) { + if (Array.isArray(current)) return current; + return initial; + } + + if (typeof initial === 'object' && initial) { + const merged = initial; + if (typeof current === 'object' && current) { + for (const key of Object.keys(initial)) { + if (key in current) { + // @ts-expect-error It's safe dont worry about it + merged[key] = mergeRecursive(current[key], initial[key]); + } + } + } + return merged; + } + + return current; +} + export class LocalStore { value = $state() as T; key = ''; @@ -10,7 +42,10 @@ export class LocalStore { if (browser) { const item = localStorage.getItem(key); - if (item) this.value = this.deserialize(item); + if (item) { + const storedValue = this.deserialize(item); + this.value = mergeRecursive(storedValue, value); + } } $effect.root(() => { -- 2.49.1