Skip to content

Commit

Permalink
Add config migration mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
whatuserever committed Feb 15, 2025
1 parent c2f73f3 commit 101a1db
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
3 changes: 2 additions & 1 deletion packages/main/src/backend/configManager/configManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -19,7 +20,7 @@ export async function getConfig(configPath: string = configFilePath): Promise<Co
logger.log('Empty config file found, returning default config');
return configExample;
}
return config;
return migrateConfig(config);
} catch (e) {
logger.error('Failed to parse config file, returning default config', e);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { z } from 'zod';
import { type Config } from '../../commonTypes';
import { isOriginalConfig } from './versions/original';
import { v1ConfigSchema } from './versions/v1';

const latestConfigSchema = v1ConfigSchema;

// migrations[n] should be a function that converts version n to version n+1
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const migrations: Record<number, (config: any) => any> = {};

export function migrateConfig(config: unknown): Config {
let currentConfig = config;
// original config does not have version key and must be handled separately
if (isOriginalConfig(config)) {
return config as Config;
}
let currentVersion = getConfigVersion(currentConfig);

while (migrations[currentVersion]) {
currentConfig = migrations[currentVersion](currentConfig);
currentVersion = getConfigVersion(currentConfig);
}

return latestConfigSchema.parse(currentConfig) as Config;
}

function getConfigVersion(config: unknown): keyof typeof migrations {
const versionSchema = z.object({ version: z.number().int().positive() });
return versionSchema.parse(config).version;
}

0 comments on commit 101a1db

Please sign in to comment.