Skip to content

Commit

Permalink
Add setting migrations for new theme system
Browse files Browse the repository at this point in the history
  • Loading branch information
RunDevelopment committed May 7, 2024
1 parent f8a8e60 commit e407e6a
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 9 deletions.
23 changes: 23 additions & 0 deletions src/common/settings/migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,26 @@ export const migrateOldStorageSettings = (settings: ReadonlyStorage): Partial<Ch
},
};
};

const newThemeSystem: SettingsMigration = (settings) => {
const themeMap: Record<string, string> = {
dark: 'default-dark',
light: 'default-light',
system: 'default-dark',
};
if (settings.theme && Object.hasOwn(themeMap, settings.theme)) {
// eslint-disable-next-line no-param-reassign
settings.theme = themeMap[settings.theme];
}
return settings;
};

type SettingsMigration = (settings: Partial<ChainnerSettings>) => Partial<ChainnerSettings>;
const migrations: SettingsMigration[] = [newThemeSystem];
export const migrateSettings = (settings: Partial<ChainnerSettings>): ChainnerSettings => {
for (const migration of migrations) {
// eslint-disable-next-line no-param-reassign
settings = migration(settings);
}
return { ...defaultSettings, ...settings };
};
20 changes: 14 additions & 6 deletions src/main/setting-storage.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import deepEqual from 'fast-deep-equal';
import { existsSync, readFileSync, renameSync, writeFileSync } from 'fs';
import { LocalStorage } from 'node-localstorage';
import path from 'path';
import { migrateOldStorageSettings } from '../common/settings/migration';
import { migrateOldStorageSettings, migrateSettings } from '../common/settings/migration';
import { ChainnerSettings, defaultSettings } from '../common/settings/settings';
import { getRootDir } from './platform';

Expand All @@ -14,7 +15,17 @@ export const writeSettings = (settings: ChainnerSettings) => {
export const readSettings = (): ChainnerSettings => {
if (existsSync(settingsJson)) {
// settings.json
return JSON.parse(readFileSync(settingsJson, 'utf-8')) as ChainnerSettings;
const fileContent = readFileSync(settingsJson, 'utf-8');
const partialSettings = JSON.parse(fileContent) as Partial<ChainnerSettings>;
const originalPartialSettings = { ...partialSettings };
const settings = migrateSettings(partialSettings);

if (!deepEqual(originalPartialSettings, settings)) {
// write settings if they aren't up to date
writeSettings(settings);
}

return settings;
}

// legacy settings
Expand All @@ -29,10 +40,7 @@ export const readSettings = (): ChainnerSettings => {
keys: Array.from({ length: storage.length }, (_, i) => storage.key(i)),
getItem: (key: string) => storage.getItem(key),
});
const settings: ChainnerSettings = {
...defaultSettings,
...partialSettings,
};
const settings = migrateSettings(partialSettings);

// write a new settings.json we'll use form now on
writeSettings(settings);
Expand Down
3 changes: 2 additions & 1 deletion tests/common/__snapshots__/settings.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ exports[`Migrate settings 1`] = `
"use_fp16": false,
},
},
"showMinimap": false,
"snapToGrid": true,
"snapToGridAmount": 16,
"startupTemplate": "",
Expand Down Expand Up @@ -91,7 +92,7 @@ exports[`Migrate settings 1`] = `
],
},
"systemPythonLocation": "",
"theme": "dark",
"theme": "default-dark",
"useSystemPython": false,
"viewportExportPadding": 20,
}
Expand Down
5 changes: 3 additions & 2 deletions tests/common/settings.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { expect, test } from 'vitest';
import { migrateOldStorageSettings } from '../../src/common/settings/migration';
import { migrateOldStorageSettings, migrateSettings } from '../../src/common/settings/migration';

const oldSettingData: Partial<Record<string, string>> = {
'allow-multiple-instances': 'false',
Expand Down Expand Up @@ -78,13 +78,14 @@ const oldSettingData: Partial<Record<string, string>> = {

test(`Migrate settings`, () => {
const unusedKeys = new Set(Object.keys(oldSettingData));
const settings = migrateOldStorageSettings({
let settings = migrateOldStorageSettings({
keys: Object.keys(oldSettingData),
getItem: (key: string) => {
unusedKeys.delete(key);
return oldSettingData[key] ?? null;
},
});
settings = migrateSettings(settings);

expect(settings).toMatchSnapshot();
expect(unusedKeys).toMatchSnapshot();
Expand Down

0 comments on commit e407e6a

Please sign in to comment.