Bluesky app fork with some witchin' additions 💫 witchsky.app
bluesky fork client
117
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: improve schema parsing/stringifying

hopefully fix crash https://tangled.org/jollywhoppers.com/witchsky.app/issues/138

xan.lol d9d617be 4d34fb1f

+53 -4
+6 -1
src/alf/util/material3/Monet/Palette.ts
··· 29 29 static NEUTRAL1_CHROMA = 4 30 30 static NEUTRAL2_CHROMA = 8 31 31 static GOOGLE_BLUE = 0xff1b6ef3 32 + static DEFAULT_SEED = '#EE6300' 32 33 33 34 static getStyle(hue: number, chroma: number): StyleType { 34 35 return { ··· 204 205 style: GenerationStyle = 'TONAL_SPOT', 205 206 ): MaterialYouPalette { 206 207 // Parse the HEX seed color string into an integer 207 - seed = seed.toUpperCase().substring(1, 7) 208 + const normalizedSeed = 209 + typeof seed === 'string' && /^#[0-9a-fA-F]{6}$/.test(seed) 210 + ? seed 211 + : Palette.DEFAULT_SEED 212 + seed = normalizedSeed.toUpperCase().substring(1, 7) 208 213 const colorInt = parseInt('0xff' + seed, 16) 209 214 210 215 let seedArgb
+44
src/state/persisted/__tests__/schema.test.ts
··· 1 + import {defaults, tryParse, tryStringify} from '../schema' 2 + 3 + describe('persisted schema helpers', () => { 4 + it('applies schema defaults when reading partial data', () => { 5 + const parsed = tryParse( 6 + JSON.stringify({ 7 + colorMode: 'system', 8 + darkTheme: 'dim', 9 + colorScheme: 'material3', 10 + hue: 0, 11 + session: {accounts: []}, 12 + reminders: {}, 13 + languagePrefs: defaults.languagePrefs, 14 + requireAltTextEnabled: true, 15 + invites: {copiedInvites: []}, 16 + onboarding: {step: 'Home'}, 17 + mutedThreads: [], 18 + translationServicePreference: 'google', 19 + postReplacement: { 20 + enabled: false, 21 + postName: 'skeet', 22 + postsName: 'skeets', 23 + }, 24 + }), 25 + ) 26 + 27 + expect(parsed?.material3Accent).toBe('#ee6300') 28 + expect(parsed?.material3Style).toBe('TONAL_SPOT') 29 + }) 30 + 31 + it('writes schema defaults back into storage payloads', () => { 32 + const raw = tryStringify({ 33 + ...defaults, 34 + material3Accent: undefined as never, 35 + material3Style: undefined as never, 36 + }) 37 + 38 + expect(raw).toBeDefined() 39 + 40 + const reparsed = JSON.parse(raw!) 41 + expect(reparsed.material3Accent).toBe('#ee6300') 42 + expect(reparsed.material3Style).toBe('TONAL_SPOT') 43 + }) 44 + })
+3 -3
src/state/persisted/schema.ts
··· 394 394 } 395 395 const parsed = schema.safeParse(objData) 396 396 if (parsed.success) { 397 - return objData 397 + return parsed.data 398 398 } else { 399 399 const errors = 400 400 parsed.error?.errors?.map(e => ({ ··· 410 410 411 411 export function tryStringify(value: Schema): string | undefined { 412 412 try { 413 - schema.parse(value) 414 - return JSON.stringify(value) 413 + const parsed = schema.parse(value) 414 + return JSON.stringify(parsed) 415 415 } catch (e) { 416 416 logger.error(`persisted state: failed stringifying root state`, { 417 417 message: e,