diff --git a/fission/package.json b/fission/package.json index 7a69e93113..9def6fd35b 100644 --- a/fission/package.json +++ b/fission/package.json @@ -1,7 +1,7 @@ { "name": "synthesis-fission", "private": false, - "version": "0.0.1", + "version": "7.2.0", "type": "module", "scripts": { "init": "(bun run assetpack && bun run playwright:install) || (npm run assetpack && npm run playwright:install)", diff --git a/fission/src/systems/preferences/PreferenceMigrations.ts b/fission/src/systems/preferences/PreferenceMigrations.ts new file mode 100644 index 0000000000..7453045053 --- /dev/null +++ b/fission/src/systems/preferences/PreferenceMigrations.ts @@ -0,0 +1,27 @@ + +import { Preferences } from "./PreferenceTypes" + +type Migration = (prefs: any) => any + +// Migrations are written to be forward-compatible +const migrations: { [key: string]: Migration } = { + "7.2.0": prefs => { + prefs.version = "7.2.0" + return prefs + }, +} + +export function migratePreferences(prefs: Partial): Partial { + const version = prefs.version ?? "0.0.0" + + const versionsToMigrate = Object.keys(migrations).sort() + + let migratedPrefs = { ...prefs } + for (const v of versionsToMigrate) { + if (version < v) { + migratedPrefs = migrations[v](migratedPrefs) + } + } + + return migratedPrefs +} diff --git a/fission/src/systems/preferences/PreferenceTypes.ts b/fission/src/systems/preferences/PreferenceTypes.ts index f97b9e35d2..ad789c9a60 100644 --- a/fission/src/systems/preferences/PreferenceTypes.ts +++ b/fission/src/systems/preferences/PreferenceTypes.ts @@ -31,6 +31,7 @@ export type GlobalPreferences = { export type GlobalPreference = keyof GlobalPreferences export type Preferences = GlobalPreferences & { + version: string [ROBOT_PREFERENCE_KEY]: Record [FIELD_PREFERENCE_KEY]: Record [MOTOR_PREFERENCES_KEY]: Record diff --git a/fission/src/systems/preferences/PreferencesSystem.ts b/fission/src/systems/preferences/PreferencesSystem.ts index cde72ef211..8f7f7d62d7 100644 --- a/fission/src/systems/preferences/PreferencesSystem.ts +++ b/fission/src/systems/preferences/PreferencesSystem.ts @@ -1,3 +1,5 @@ +import { migratePreferences } from "./PreferenceMigrations" +import { version } from "../../../package.json" import { defaultFieldPreferences, defaultGlobalPreferences, @@ -210,15 +212,17 @@ class PreferencesSystem { const loadedPrefs = window.localStorage.getItem(this._localStorageKey) if (loadedPrefs == undefined) { - this._preferences = {} + this._preferences = { version: version } return } try { - this._preferences = JSON.parse(loadedPrefs) + const parsed = JSON.parse(loadedPrefs) + this._preferences = migratePreferences(parsed) + this._preferences.version = version } catch (e) { console.error(e) - this._preferences = {} + this._preferences = { version: version } } }