From f645a19da1e4efc4ba8badd9ce592c7c62b887dd Mon Sep 17 00:00:00 2001 From: Justin Reiners Date: Thu, 26 Mar 2026 17:02:16 -0500 Subject: [PATCH] fix: parse JSON string values from MariaDB in org_config loader MariaDB returns JSON columns as strings via mysql2 driver. Added parseJsonValue() to handle both string and object values. Fixes config not loading on production (always showing defaults). Co-Authored-By: Claude Opus 4.6 (1M context) --- src/lib/server/config.ts | 13 +++++++++++-- tests/unit/config.test.ts | 13 +++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/lib/server/config.ts b/src/lib/server/config.ts index bff30ca..fc1e5d1 100644 --- a/src/lib/server/config.ts +++ b/src/lib/server/config.ts @@ -87,6 +87,13 @@ const KEY_MAP: Record = { setup_complete: 'setupComplete' }; +function parseJsonValue(value: unknown): unknown { + if (typeof value === 'string') { + try { return JSON.parse(value); } catch { return value; } + } + return value; +} + export function parseOrgConfig(rows: { key: string; value: unknown }[]): OrgConfig { const config = structuredClone(DEFAULTS); @@ -94,12 +101,14 @@ export function parseOrgConfig(rows: { key: string; value: unknown }[]): OrgConf const configKey = KEY_MAP[row.key]; if (!configKey) continue; + const parsed = parseJsonValue(row.value); + if (configKey === 'setupComplete') { - config.setupComplete = Boolean(row.value); + config.setupComplete = Boolean(parsed); } else { config[configKey] = { ...config[configKey], - ...(row.value as Record) + ...(parsed as Record) } as any; } } diff --git a/tests/unit/config.test.ts b/tests/unit/config.test.ts index 2e989d7..24e1571 100644 --- a/tests/unit/config.test.ts +++ b/tests/unit/config.test.ts @@ -15,6 +15,19 @@ describe('config', () => { expect(config.locale.language).toBe('en'); }); + it('handles JSON string values from MariaDB', () => { + const rows = [ + { key: 'branding', value: '{"primaryColor":"#ea580c","accentColor":"#0d9488","logoUrl":""}' }, + { key: 'org_info', value: '{"name":"Sunny Paws Rescue","city":"Austin","state":"TX"}' }, + { key: 'setup_complete', value: 'true' } + ]; + + const config = parseOrgConfig(rows); + expect(config.branding.primaryColor).toBe('#ea580c'); + expect(config.orgInfo.name).toBe('Sunny Paws Rescue'); + expect(config.setupComplete).toBe(true); + }); + it('provides defaults for missing keys', () => { const config = parseOrgConfig([]); expect(config.branding.primaryColor).toBe('#0d9488');