From 04f3b82d59668a2ebb3fcaebce397366ff6e0435 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Mon, 8 Jun 2026 20:47:25 -0400 Subject: [PATCH] fix(stores): merge defaults on PersistedState deserialize so new fields get defaults MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit runed PersistedState hydrates raw stored JSON without merging defaults, so any field added after a user's first session is undefined rather than its default value. Apply a shallow spread (defaults → stored) in the custom serializer for badges, leads, and pres_mgmt stores so new fields always fall back to defaults for existing sessions — without disrupting any previously saved preferences. Co-Authored-By: Claude Sonnet 4.6 --- src/lib/stores/ae_events_stores__badges.svelte.ts | 9 ++++++++- src/lib/stores/ae_events_stores__leads.svelte.ts | 7 ++++++- src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts | 7 ++++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/lib/stores/ae_events_stores__badges.svelte.ts b/src/lib/stores/ae_events_stores__badges.svelte.ts index e7cb7af8..968ff229 100644 --- a/src/lib/stores/ae_events_stores__badges.svelte.ts +++ b/src/lib/stores/ae_events_stores__badges.svelte.ts @@ -15,4 +15,11 @@ import { PersistedState } from 'runed'; import { badges_loc_defaults } from './ae_events_stores__badges_defaults'; -export const badges_loc = new PersistedState('ae_badges_loc', badges_loc_defaults); +// Custom deserializer merges stored JSON with defaults so that new fields added +// after a user's first session get their default values rather than undefined. +export const badges_loc = new PersistedState('ae_badges_loc', badges_loc_defaults, { + serializer: { + serialize: JSON.stringify, + deserialize: (raw: string) => ({ ...badges_loc_defaults, ...JSON.parse(raw) }) + } +}); diff --git a/src/lib/stores/ae_events_stores__leads.svelte.ts b/src/lib/stores/ae_events_stores__leads.svelte.ts index 33625fe8..d23d2388 100644 --- a/src/lib/stores/ae_events_stores__leads.svelte.ts +++ b/src/lib/stores/ae_events_stores__leads.svelte.ts @@ -18,4 +18,9 @@ import { PersistedState } from 'runed'; import { leads_loc_defaults } from './ae_events_stores__leads_defaults'; -export const leads_loc = new PersistedState('ae_leads_loc', leads_loc_defaults); +export const leads_loc = new PersistedState('ae_leads_loc', leads_loc_defaults, { + serializer: { + serialize: JSON.stringify, + deserialize: (raw: string) => ({ ...leads_loc_defaults, ...JSON.parse(raw) }) + } +}); diff --git a/src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts b/src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts index 67815c12..3694a587 100644 --- a/src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts +++ b/src/lib/stores/ae_events_stores__pres_mgmt.svelte.ts @@ -15,4 +15,9 @@ import { PersistedState } from 'runed'; import { pres_mgmt_loc_defaults } from './ae_events_stores__pres_mgmt_defaults'; -export const pres_mgmt_loc = new PersistedState('ae_pres_mgmt_loc', pres_mgmt_loc_defaults); +export const pres_mgmt_loc = new PersistedState('ae_pres_mgmt_loc', pres_mgmt_loc_defaults, { + serializer: { + serialize: JSON.stringify, + deserialize: (raw: string) => ({ ...pres_mgmt_loc_defaults, ...JSON.parse(raw) }) + } +});