web/settings: types for preparation for future migrations

This commit is contained in:
dumbmoron 2024-07-22 08:38:06 +00:00 committed by wukko
parent 66bac03e30
commit 4e4f7af437
No known key found for this signature in database
GPG Key ID: 3E30B3F26C7B4AA2
3 changed files with 21 additions and 12 deletions

View File

@ -1,15 +1,15 @@
import { derived, readable, type Updater } from 'svelte/store'; import { derived, readable, type Updater } from 'svelte/store';
import { merge } from 'ts-deepmerge'; import { merge } from 'ts-deepmerge';
import type { RecursivePartial } from '../types/generic'; import type {
import type { CobaltSettings } from '../types/settings'; CobaltSettings,
PartialSettings,
AllPartialSettingsWithSchema
} from '../types/settings';
import { migrateOldSettings } from '../settings/migrate'; import { migrateOldSettings } from '../settings/migrate';
import defaultSettings from '../settings/defaults'; import defaultSettings from '../settings/defaults';
type PartialSettings = RecursivePartial<CobaltSettings>;
type PartialSettingsWithSchema = RecursivePartial<CobaltSettings> & { schemaVersion: number };
const updatePlausiblePreference = (settings: PartialSettings) => { const updatePlausiblePreference = (settings: PartialSettings) => {
if (settings.privacy?.disableAnalytics) { if (settings.privacy?.disableAnalytics) {
localStorage.setItem('plausible_ignore', 'true'); localStorage.setItem('plausible_ignore', 'true');
@ -27,18 +27,18 @@ const writeToStorage = (settings: PartialSettings) => {
return settings; return settings;
} }
type Migrator = (s: PartialSettings) => PartialSettings; type Migrator = (s: AllPartialSettingsWithSchema) => AllPartialSettingsWithSchema;
const migrations: Record<number, Migrator> = { const migrations: Record<number, Migrator> = {
} }
const migrate = (settings: PartialSettingsWithSchema) => { const migrate = (settings: AllPartialSettingsWithSchema): PartialSettings => {
return Object.keys(migrations) return Object.keys(migrations)
.map(Number) .map(Number)
.filter(version => version > settings.schemaVersion) .filter(version => version > settings.schemaVersion)
.reduce((settings, migrationVersion) => { .reduce((settings, migrationVersion) => {
return migrations[migrationVersion](settings); return migrations[migrationVersion](settings);
}, settings as PartialSettings); }, settings as AllPartialSettingsWithSchema);
} }
const loadFromStorage = () => { const loadFromStorage = () => {
@ -52,7 +52,7 @@ const loadFromStorage = () => {
return {}; return {};
} }
const parsed = JSON.parse(settings) as PartialSettingsWithSchema; const parsed = JSON.parse(settings) as AllPartialSettingsWithSchema;
if (parsed.schemaVersion < defaultSettings.schemaVersion) { if (parsed.schemaVersion < defaultSettings.schemaVersion) {
return migrate(parsed); return migrate(parsed);
} }

View File

@ -8,4 +8,4 @@ export type RecursivePartial<Type> = {
}; };
export type DefaultImport<T> = () => Promise<{ default: T }>; export type DefaultImport<T> = () => Promise<{ default: T }>;
export type Optional<T> = T | undefined; export type Optional<T> = T | undefined;

View File

@ -1,4 +1,5 @@
import languages from '$i18n/languages.json'; import languages from '$i18n/languages.json';
import type { RecursivePartial } from './generic';
export const themeOptions = ["auto", "light", "dark"] as const; export const themeOptions = ["auto", "light", "dark"] as const;
export const audioFormatOptions = ["best", "mp3", "ogg", "wav", "opus"] as const; export const audioFormatOptions = ["best", "mp3", "ogg", "wav", "opus"] as const;
@ -37,12 +38,20 @@ type CobaltSettingsSave = {
youtubeDubBrowserLang: boolean, youtubeDubBrowserLang: boolean,
}; };
export type CobaltSettings = { export type CurrentCobaltSettings = {
schemaVersion: number, schemaVersion: 2,
advanced: CobaltSettingsAdvanced, advanced: CobaltSettingsAdvanced,
appearance: CobaltSettingsAppearance, appearance: CobaltSettingsAppearance,
save: CobaltSettingsSave, save: CobaltSettingsSave,
privacy: CobaltSettingsPrivacy privacy: CobaltSettingsPrivacy
}; };
export type CobaltSettings = CurrentCobaltSettings;
export type PartialSettings = RecursivePartial<CobaltSettings>;
export type PartialSettingsWithSchema = RecursivePartial<CobaltSettings> & { schemaVersion: number };
export type AllSchemaVersions = CurrentCobaltSettings;
export type AllPartialSettingsWithSchema = RecursivePartial<CobaltSettings> & { schemaVersion: number };
export type DownloadModeOption = CobaltSettings['save']['downloadMode']; export type DownloadModeOption = CobaltSettings['save']['downloadMode'];