diff --git a/packages/main/src/backend/commonTypes.ts b/packages/main/src/backend/commonTypes.ts index 78def43e..439612b5 100644 --- a/packages/main/src/backend/commonTypes.ts +++ b/packages/main/src/backend/commonTypes.ts @@ -11,6 +11,7 @@ export type { Spreadsheet, } from './export/outputVendors/googleSheets/googleSheetsInternalAPI'; export interface Config { + version: number; outputVendors: { [OutputVendorName.GOOGLE_SHEETS]?: GoogleSheetsConfig; [OutputVendorName.YNAB]?: YnabConfig; diff --git a/packages/main/src/backend/configManager/configManager.ts b/packages/main/src/backend/configManager/configManager.ts index 4e618d5f..71dd5f98 100644 --- a/packages/main/src/backend/configManager/configManager.ts +++ b/packages/main/src/backend/configManager/configManager.ts @@ -2,6 +2,7 @@ import { configFilePath } from '@/app-globals'; import { type Config } from '@/backend/commonTypes'; import { decrypt, encrypt } from '@/backend/configManager/encryption/crypto'; import { existsSync, promises as fs } from 'fs'; +import { migrateConfig } from './configMigration/configMigrator'; import configExample from './defaultConfig'; import logger from '/@/logging/logger'; @@ -19,7 +20,7 @@ export async function getConfig(configPath: string = configFilePath): Promise any> = { + 0: migrateV0ToV1, +}; + +export function migrateConfig(config: any): Config { + let currentConfig = config; + let currentVersion = getConfigVersion(currentConfig); + + while (migrations[currentVersion]) { + currentConfig = migrations[currentVersion](currentConfig); + currentVersion = getConfigVersion(currentConfig); + } + + return currentConfig as Config; +} + +function getConfigVersion(config: any): keyof typeof migrations { + // Prior to v1, the config didn't have a version field. + // In that case, we treat it as v0. + return config.version ?? 0; +} diff --git a/packages/main/src/backend/configManager/configMigration/migrations/v1.ts b/packages/main/src/backend/configManager/configMigration/migrations/v1.ts new file mode 100644 index 00000000..83a07d92 --- /dev/null +++ b/packages/main/src/backend/configManager/configMigration/migrations/v1.ts @@ -0,0 +1,9 @@ +// V1 adds the version field to the config object + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function migrateV0ToV1(v0Config: any): any { + return { + ...v0Config, + version: 1, + }; +} diff --git a/packages/main/src/backend/configManager/defaultConfig.ts b/packages/main/src/backend/configManager/defaultConfig.ts index df8f7034..11c2b416 100644 --- a/packages/main/src/backend/configManager/defaultConfig.ts +++ b/packages/main/src/backend/configManager/defaultConfig.ts @@ -1,6 +1,7 @@ import { type Config } from '../commonTypes'; const DEFAULT_CONFIG: Config = { + version: 1, scraping: { numDaysBack: 40, showBrowser: false, diff --git a/packages/preload/src/commonTypes.ts b/packages/preload/src/commonTypes.ts index bac6c7c2..d04265f2 100644 --- a/packages/preload/src/commonTypes.ts +++ b/packages/preload/src/commonTypes.ts @@ -15,6 +15,7 @@ export enum OutputVendorName { } export interface Config { + version: number; outputVendors: { [OutputVendorName.GOOGLE_SHEETS]?: GoogleSheetsConfig; [OutputVendorName.YNAB]?: YnabConfig; diff --git a/packages/renderer/src/store/Store.test.tsx b/packages/renderer/src/store/Store.test.tsx index 1ae4f397..9fddb1ce 100644 --- a/packages/renderer/src/store/Store.test.tsx +++ b/packages/renderer/src/store/Store.test.tsx @@ -99,6 +99,7 @@ describe('Store', () => { }); export const dummyConfig: Config = { + version: 1, scraping: { numDaysBack: 40, showBrowser: false, diff --git a/packages/renderer/src/types.tsx b/packages/renderer/src/types.tsx index f24fb543..1bd944b9 100644 --- a/packages/renderer/src/types.tsx +++ b/packages/renderer/src/types.tsx @@ -17,6 +17,7 @@ export enum OutputVendorName { } export interface Config { + version: number; outputVendors: { [OutputVendorName.GOOGLE_SHEETS]?: GoogleSheetsConfig; [OutputVendorName.YNAB]?: YnabConfig;