← Files BranchaARCHIVED FILE
skills/brancha/app/src/server/settings/settings.store.ts
1.24 KB · Oct 5, 2026 · 18:29 UTC
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';
import type { AppSettings } from '../../shared/types.js';
import { isLocale, isThemePreference } from '../../shared/types.js';
import { dataDirectory } from '../data-directory.js';
const DEFAULT_SETTINGS: AppSettings = { theme: 'system', locale: 'zh-CN' };
export class SettingsStore {
private readonly file: string;
constructor(directory = dataDirectory) {
mkdirSync(directory, { recursive: true });
this.file = join(directory, 'settings.json');
}
read(): AppSettings {
if (!existsSync(this.file)) return { ...DEFAULT_SETTINGS };
try {
const value = JSON.parse(readFileSync(this.file, 'utf8')) as Record<string, unknown>;
return {
theme: isThemePreference(value.theme) ? value.theme : DEFAULT_SETTINGS.theme,
locale: isLocale(value.locale) ? value.locale : DEFAULT_SETTINGS.locale,
};
} catch {
return { ...DEFAULT_SETTINGS };
}
}
write(settings: AppSettings): AppSettings {
const temporary = `${this.file}.tmp`;
writeFileSync(temporary, `${JSON.stringify(settings, null, 2)}\n`, 'utf8');
renameSync(temporary, this.file);
return settings;
}
}
SHA-256: 63a77f65161be6aca764e88b555aff7e720031ec8f88cc0232300616900a0121