From edc203a10b3f753004bd991fe1e4515e064f8708 Mon Sep 17 00:00:00 2001 From: farion1231 Date: Thu, 7 Aug 2025 10:09:17 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=A4=A7=E6=94=B9=E8=BF=9B=EF=BC=9A?= =?UTF-8?q?=E7=94=A8=E5=8E=9F=E7=94=9F=20JSON=20=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=20electron-store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现 SimpleStore 类,使用原生 fs 操作 JSON 文件 - 解决 "Cannot find module 'conf'" 的依赖问题 - 移除 electron-store 依赖,减少包体积 - 配置文件存储在 ~/.cc-switch/config.json - 数据格式透明,便于备份和调试 - 修复 TypeScript 类型问题 - 测试通过:构建、打包、运行正常 --- package.json | 1 - src/main/index.ts | 28 +++++++++++------------- src/main/store.ts | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 src/main/store.ts diff --git a/package.json b/package.json index 31577fe..55ecca4 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "vite": "^5.0.0" }, "dependencies": { - "electron-store": "^8.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/src/main/index.ts b/src/main/index.ts index b83e801..acb48c7 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,10 +1,8 @@ import { app, BrowserWindow, ipcMain, dialog, shell } from 'electron' import path from 'path' -import Store from 'electron-store' -import { Provider, AppConfig } from '../shared/types' +import { Provider } from '../shared/types' import { switchProvider, getClaudeCodeConfig } from './services' - -const store = new Store() +import { store } from './store' let mainWindow: BrowserWindow | null = null @@ -51,33 +49,33 @@ app.on('window-all-closed', () => { // IPC handlers ipcMain.handle('getProviders', () => { - return store.get('providers', {}) + return store.get('providers', {} as Record) }) ipcMain.handle('getCurrentProvider', () => { return store.get('current', '') }) -ipcMain.handle('addProvider', (_, provider: Provider) => { - const providers = store.get('providers', {}) +ipcMain.handle('addProvider', async (_, provider: Provider) => { + const providers = store.get('providers', {} as Record) providers[provider.id] = provider - store.set('providers', providers) + await store.set('providers', providers) return true }) -ipcMain.handle('deleteProvider', (_, id: string) => { - const providers = store.get('providers', {}) +ipcMain.handle('deleteProvider', async (_, id: string) => { + const providers = store.get('providers', {} as Record) delete providers[id] - store.set('providers', providers) + await store.set('providers', providers) return true }) ipcMain.handle('updateProvider', async (_, provider: Provider) => { - const providers = store.get('providers', {}) + const providers = store.get('providers', {} as Record) const currentProviderId = store.get('current', '') providers[provider.id] = provider - store.set('providers', providers) + await store.set('providers', providers) // 如果编辑的是当前激活的供应商,同时更新Claude Code配置 if (provider.id === currentProviderId) { @@ -92,12 +90,12 @@ ipcMain.handle('updateProvider', async (_, provider: Provider) => { }) ipcMain.handle('switchProvider', async (_, providerId: string) => { - const providers = store.get('providers', {}) + const providers = store.get('providers', {} as Record) const provider = providers[providerId] if (provider) { const success = await switchProvider(provider) if (success) { - store.set('current', providerId) + await store.set('current', providerId) } return success } diff --git a/src/main/store.ts b/src/main/store.ts new file mode 100644 index 0000000..322cd5a --- /dev/null +++ b/src/main/store.ts @@ -0,0 +1,56 @@ +import fs from 'fs/promises' +import path from 'path' +import os from 'os' +import { AppConfig } from '../shared/types' + +export class SimpleStore { + private configPath: string + private configDir: string + private data: AppConfig = { providers: {}, current: '' } + + constructor() { + this.configDir = path.join(os.homedir(), '.cc-switch') + this.configPath = path.join(this.configDir, 'config.json') + this.loadData() + } + + private async loadData(): Promise { + try { + const content = await fs.readFile(this.configPath, 'utf-8') + this.data = JSON.parse(content) + } catch (error) { + // 文件不存在或格式错误,使用默认数据 + this.data = { providers: {}, current: '' } + await this.saveData() + } + } + + private async saveData(): Promise { + try { + // 确保目录存在 + await fs.mkdir(this.configDir, { recursive: true }) + // 写入配置文件 + await fs.writeFile(this.configPath, JSON.stringify(this.data, null, 2), 'utf-8') + } catch (error) { + console.error('保存配置失败:', error) + } + } + + get(key: keyof AppConfig, defaultValue?: T): T { + const value = this.data[key] as T + return value !== undefined ? value : (defaultValue as T) + } + + async set(key: keyof AppConfig, value: T): Promise { + this.data[key] = value as any + await this.saveData() + } + + // 获取配置文件路径,用于调试 + getConfigPath(): string { + return this.configPath + } +} + +// 创建单例 +export const store = new SimpleStore() \ No newline at end of file