Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import {parse} from 'bcp-47'
2
3import {dedupArray} from '#/lib/functions'
4import {logger} from '#/logger'
5import {type Schema} from '#/state/persisted/schema'
6
7export function normalizeData(data: Schema) {
8 const next = {...data}
9
10 /**
11 * Normalize language prefs to ensure that these values only contain 2-letter
12 * country codes without region.
13 */
14 try {
15 const langPrefs = {...next.languagePrefs}
16 langPrefs.primaryLanguage = normalizeLanguageTagToTwoLetterCode(
17 langPrefs.primaryLanguage,
18 )
19 langPrefs.contentLanguages = dedupArray(
20 langPrefs.contentLanguages.map(lang =>
21 normalizeLanguageTagToTwoLetterCode(lang),
22 ),
23 )
24 langPrefs.postLanguage = langPrefs.postLanguage
25 .split(',')
26 .map(lang => normalizeLanguageTagToTwoLetterCode(lang))
27 .filter(Boolean)
28 .join(',')
29 langPrefs.postLanguageHistory = dedupArray(
30 langPrefs.postLanguageHistory.map(postLanguage => {
31 return postLanguage
32 .split(',')
33 .map(lang => normalizeLanguageTagToTwoLetterCode(lang))
34 .filter(Boolean)
35 .join(',')
36 }),
37 )
38 next.languagePrefs = langPrefs
39 } catch (e: any) {
40 logger.error(`persisted state: failed to normalize language prefs`, {
41 safeMessage: e.message,
42 })
43 }
44
45 return next
46}
47
48export function normalizeLanguageTagToTwoLetterCode(lang: string) {
49 const result = parse(lang).language
50 return result ?? lang
51}