chore: format

This commit is contained in:
fullex 2025-09-06 18:32:33 +08:00
parent 9da3e82c47
commit d321cd23ef
6 changed files with 210 additions and 207 deletions

View File

@ -1,6 +1,6 @@
**THIS DIRECTORY IS NOT FOR RUNTIME USE** **THIS DIRECTORY IS NOT FOR RUNTIME USE**
- Using `libsql` as the `sqlite3` driver, and `drizzle` as the ORM and database migration tool - Using `libsql` as the `sqlite3` driver, and `drizzle` as the ORM and database migration tool
- `migrations/sqlite-drizzle` contains auto-generated migration data. Please **DO NOT** modify it. - `migrations/sqlite-drizzle` contains auto-generated migration data. Please **DO NOT** modify it.
- If table structure changes, we should run migrations. - If table structure changes, we should run migrations.
- To generate migrations, use the command `yarn run migrations:generate` - To generate migrations, use the command `yarn run migrations:generate`

View File

@ -1,117 +1,114 @@
{ {
"version": "6", "_meta": {
"columns": {},
"schemas": {},
"tables": {}
},
"dialect": "sqlite", "dialect": "sqlite",
"enums": {},
"id": "de8009d7-95b9-4f99-99fa-4b8795708f21", "id": "de8009d7-95b9-4f99-99fa-4b8795708f21",
"internal": {
"indexes": {}
},
"prevId": "00000000-0000-0000-0000-000000000000", "prevId": "00000000-0000-0000-0000-000000000000",
"tables": { "tables": {
"app_state": { "app_state": {
"name": "app_state", "checkConstraints": {},
"columns": { "columns": {
"key": { "created_at": {
"name": "key", "autoincrement": false,
"type": "text", "name": "created_at",
"primaryKey": true, "notNull": false,
"notNull": true,
"autoincrement": false
},
"value": {
"name": "value",
"type": "text",
"primaryKey": false, "primaryKey": false,
"notNull": true, "type": "integer"
"autoincrement": false
}, },
"description": { "description": {
"autoincrement": false,
"name": "description", "name": "description",
"type": "text",
"primaryKey": false,
"notNull": false, "notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "integer",
"primaryKey": false, "primaryKey": false,
"notNull": false, "type": "text"
"autoincrement": false
},
"updated_at": {
"name": "updated_at",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"checkConstraints": {}
},
"preference": {
"name": "preference",
"columns": {
"scope": {
"name": "scope",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}, },
"key": { "key": {
"autoincrement": false,
"name": "key", "name": "key",
"type": "text",
"primaryKey": false,
"notNull": true, "notNull": true,
"autoincrement": false "primaryKey": true,
}, "type": "text"
"value": {
"name": "value",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"created_at": {
"name": "created_at",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}, },
"updated_at": { "updated_at": {
"autoincrement": false,
"name": "updated_at", "name": "updated_at",
"type": "integer",
"primaryKey": false,
"notNull": false, "notNull": false,
"autoincrement": false "primaryKey": false,
"type": "integer"
},
"value": {
"autoincrement": false,
"name": "value",
"notNull": true,
"primaryKey": false,
"type": "text"
} }
}, },
"compositePrimaryKeys": {},
"foreignKeys": {},
"indexes": {},
"name": "app_state",
"uniqueConstraints": {}
},
"preference": {
"checkConstraints": {},
"columns": {
"created_at": {
"autoincrement": false,
"name": "created_at",
"notNull": false,
"primaryKey": false,
"type": "integer"
},
"key": {
"autoincrement": false,
"name": "key",
"notNull": true,
"primaryKey": false,
"type": "text"
},
"scope": {
"autoincrement": false,
"name": "scope",
"notNull": true,
"primaryKey": false,
"type": "text"
},
"updated_at": {
"autoincrement": false,
"name": "updated_at",
"notNull": false,
"primaryKey": false,
"type": "integer"
},
"value": {
"autoincrement": false,
"name": "value",
"notNull": false,
"primaryKey": false,
"type": "text"
}
},
"compositePrimaryKeys": {},
"foreignKeys": {},
"indexes": { "indexes": {
"scope_name_idx": { "scope_name_idx": {
"name": "scope_name_idx", "columns": ["scope", "key"],
"columns": [ "isUnique": false,
"scope", "name": "scope_name_idx"
"key"
],
"isUnique": false
} }
}, },
"foreignKeys": {}, "name": "preference",
"compositePrimaryKeys": {}, "uniqueConstraints": {}
"uniqueConstraints": {},
"checkConstraints": {}
} }
}, },
"views": {}, "version": "6",
"enums": {}, "views": {}
"_meta": { }
"schemas": {},
"tables": {},
"columns": {}
},
"internal": {
"indexes": {}
}
}

View File

@ -1,13 +1,13 @@
{ {
"version": "7",
"dialect": "sqlite", "dialect": "sqlite",
"entries": [ "entries": [
{ {
"breakpoints": true,
"idx": 0, "idx": 0,
"version": "6",
"when": 1754745234572,
"tag": "0000_solid_lord_hawal", "tag": "0000_solid_lord_hawal",
"breakpoints": true "version": "6",
"when": 1754745234572
} }
] ],
} "version": "7"
}

View File

@ -1,62 +1,61 @@
<!DOCTYPE html> <!doctype html>
<html> <html>
<head>
<meta charset="UTF-8" />
<title>Cherry Studio - Data Refactor Migration</title>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:;" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<head> <body id="root" theme-mode="light">
<meta charset="UTF-8" /> <script type="module" src="/src/windows/dataRefactorMigrate/entryPoint.tsx"></script>
<title>Cherry Studio - Data Refactor Migration</title> <style>
<meta http-equiv="Content-Security-Policy" html {
content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:;" /> margin: 0;
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> padding: 0;
</head> box-sizing: border-box;
}
<body id="root" theme-mode="light"> body {
<script type="module" src="/src/windows/dataRefactorMigrate/entryPoint.tsx"></script> width: 100vw;
<style> height: 100vh;
html { margin: 0;
margin: 0; padding: 0;
padding: 0; box-sizing: border-box;
box-sizing: border-box; }
}
body { #root {
width: 100vw; margin: 0;
height: 100vh; padding: 0;
margin: 0; width: 100%;
padding: 0; height: 100%;
box-sizing: border-box; box-sizing: border-box;
} }
#root { /* Custom button styles */
margin: 0; .ant-btn-primary {
padding: 0; background-color: var(--color-primary);
width: 100%; border-color: var(--color-primary);
height: 100%; }
box-sizing: border-box;
}
/* Custom button styles */ .ant-btn-primary:hover {
.ant-btn-primary { background-color: var(--color-primary-soft) !important;
background-color: var(--color-primary); border-color: var(--color-primary-soft) !important;
border-color: var(--color-primary); }
}
.ant-btn-primary:hover { .ant-btn-primary:active,
background-color: var(--color-primary-soft) !important; .ant-btn-primary:focus {
border-color: var(--color-primary-soft) !important; background-color: var(--color-primary) !important;
} border-color: var(--color-primary) !important;
}
.ant-btn-primary:active, /* Non-primary button hover styles */
.ant-btn-primary:focus { .ant-btn:not(.ant-btn-primary):hover {
background-color: var(--color-primary) !important; border-color: var(--color-primary-soft) !important;
border-color: var(--color-primary) !important; color: var(--color-primary) !important;
} }
</style>
/* Non-primary button hover styles */ </body>
.ant-btn:not(.ant-btn-primary):hover { </html>
border-color: var(--color-primary-soft) !important;
color: var(--color-primary) !important;
}
</style>
</body>
</html>

View File

@ -1,63 +1,62 @@
<!DOCTYPE html> <!doctype html>
<html> <html>
<head>
<meta charset="UTF-8" />
<title>Data Refactor Test Window - PreferenceService Testing</title>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:;" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<head> <body id="root" theme-mode="light">
<meta charset="UTF-8" /> <script type="module" src="/src/windows/dataRefactorTest/entryPoint.tsx"></script>
<title>Data Refactor Test Window - PreferenceService Testing</title> <style>
<meta http-equiv="Content-Security-Policy" html {
content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:;" /> margin: 0;
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> padding: 0;
</head> box-sizing: border-box;
}
<body id="root" theme-mode="light"> body {
<script type="module" src="/src/windows/dataRefactorTest/entryPoint.tsx"></script> width: 100vw;
<style> height: 100vh;
html { margin: 0;
margin: 0; padding: 0;
padding: 0; box-sizing: border-box;
box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
} }
body { #root {
width: 100vw; margin: 0;
height: 100vh; padding: 0;
margin: 0; width: 100%;
padding: 0; height: 100%;
box-sizing: border-box; box-sizing: border-box;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; }
}
#root { /* Custom button styles */
margin: 0; .ant-btn-primary {
padding: 0; background-color: var(--color-primary);
width: 100%; border-color: var(--color-primary);
height: 100%; }
box-sizing: border-box;
}
/* Custom button styles */ .ant-btn-primary:hover {
.ant-btn-primary { background-color: var(--color-primary-soft) !important;
background-color: var(--color-primary); border-color: var(--color-primary-soft) !important;
border-color: var(--color-primary); }
}
.ant-btn-primary:hover { .ant-btn-primary:active,
background-color: var(--color-primary-soft) !important; .ant-btn-primary:focus {
border-color: var(--color-primary-soft) !important; background-color: var(--color-primary) !important;
} border-color: var(--color-primary) !important;
}
.ant-btn-primary:active, /* Non-primary button hover styles */
.ant-btn-primary:focus { .ant-btn:not(.ant-btn-primary):hover {
background-color: var(--color-primary) !important; border-color: var(--color-primary-soft) !important;
border-color: var(--color-primary) !important; color: var(--color-primary) !important;
} }
</style>
/* Non-primary button hover styles */ </body>
.ant-btn:not(.ant-btn-primary):hover { </html>
border-color: var(--color-primary-soft) !important;
color: var(--color-primary) !important;
}
</style>
</body>
</html>

View File

@ -5,6 +5,7 @@
## 🎯 当前实现 ## 🎯 当前实现
**已完成的功能** **已完成的功能**
- 专用的测试窗口 (DataRefactorTestWindow) - 专用的测试窗口 (DataRefactorTestWindow)
- **双窗口启动**:应用启动时会同时打开主窗口和两个测试窗口 - **双窗口启动**:应用启动时会同时打开主窗口和两个测试窗口
- **跨窗口同步测试**:两个测试窗口可以相互验证偏好设置的实时同步 - **跨窗口同步测试**:两个测试窗口可以相互验证偏好设置的实时同步
@ -18,11 +19,13 @@
## 测试组件 ## 测试组件
### 1. PreferenceService 基础测试 ### 1. PreferenceService 基础测试
- 直接测试服务层APIget, set, getCachedValue, isCached, preload, getMultiple - 直接测试服务层APIget, set, getCachedValue, isCached, preload, getMultiple
- 支持各种数据类型字符串、数字、布尔值、JSON对象 - 支持各种数据类型字符串、数字、布尔值、JSON对象
- 实时显示操作结果 - 实时显示操作结果
### 2. usePreference Hook 测试 ### 2. usePreference Hook 测试
- 测试单个偏好设置的React hooks - 测试单个偏好设置的React hooks
- 支持的测试键: - 支持的测试键:
- `app.theme.mode` - 主题模式 - `app.theme.mode` - 主题模式
@ -35,6 +38,7 @@
- **Slider联动控制**:数值类型偏好设置提供交互式滑块,支持实时拖拽调整 - **Slider联动控制**:数值类型偏好设置提供交互式滑块,支持实时拖拽调整
### 3. usePreferences 批量操作测试 ### 3. usePreferences 批量操作测试
- 测试多个偏好设置的批量管理 - 测试多个偏好设置的批量管理
- 5种预设场景基础设置、UI设置、用户设置、🎛数值设置、自定义组合 - 5种预设场景基础设置、UI设置、用户设置、🎛数值设置、自定义组合
- **🎛️ 数值设置场景**专门的Slider联动控制区域包含缩放、字体、选择窗口透明度三个滑块 - **🎛️ 数值设置场景**专门的Slider联动控制区域包含缩放、字体、选择窗口透明度三个滑块
@ -42,6 +46,7 @@
- 快速切换操作 - 快速切换操作
### 4. Hook 高级功能测试 ### 4. Hook 高级功能测试
- 预加载机制测试 - 预加载机制测试
- 订阅机制验证 - 订阅机制验证
- 缓存管理测试 - 缓存管理测试
@ -53,6 +58,7 @@
**自动启动**:应用正常启动时会自动创建两个测试窗口,窗口会自动错位显示避免重叠 **自动启动**:应用正常启动时会自动创建两个测试窗口,窗口会自动错位显示避免重叠
**手动启动** **手动启动**
```javascript ```javascript
// 在开发者控制台中执行 - 创建单个测试窗口 // 在开发者控制台中执行 - 创建单个测试窗口
const { dataRefactorMigrateService } = require('./out/main/data/migrate/dataRefactor/DataRefactorMigrateService') const { dataRefactorMigrateService } = require('./out/main/data/migrate/dataRefactor/DataRefactorMigrateService')
@ -71,7 +77,7 @@ dataRefactorMigrateService.closeTestWindows()
``` ```
src/renderer/src/windows/dataRefactorTest/ src/renderer/src/windows/dataRefactorTest/
├── entryPoint.tsx # 窗口入口 ├── entryPoint.tsx # 窗口入口
├── TestApp.tsx # 主应用组件 ├── TestApp.tsx # 主应用组件
└── components/ └── components/
├── PreferenceServiceTests.tsx # 服务层测试 ├── PreferenceServiceTests.tsx # 服务层测试
├── PreferenceBasicTests.tsx # 基础Hook测试 ├── PreferenceBasicTests.tsx # 基础Hook测试
@ -82,12 +88,14 @@ src/renderer/src/windows/dataRefactorTest/
## 跨窗口同步测试 ## 跨窗口同步测试
🔄 **测试场景** 🔄 **测试场景**
1. **实时同步验证**:在窗口#1中修改某个偏好设置立即观察窗口#2是否同步更新 1. **实时同步验证**:在窗口#1中修改某个偏好设置立即观察窗口#2是否同步更新
2. **并发修改测试**:在两个窗口中快速连续修改同一设置,验证数据一致性 2. **并发修改测试**:在两个窗口中快速连续修改同一设置,验证数据一致性
3. **批量操作同步**:在一个窗口中批量更新多个设置,观察另一个窗口的同步表现 3. **批量操作同步**:在一个窗口中批量更新多个设置,观察另一个窗口的同步表现
4. **Hook实例同步**验证多个usePreference hook实例是否正确同步 4. **Hook实例同步**验证多个usePreference hook实例是否正确同步
📋 **测试步骤** 📋 **测试步骤**
1. 同时打开两个测试窗口(自动启动) 1. 同时打开两个测试窗口(自动启动)
2. 选择相同的偏好设置键进行测试 2. 选择相同的偏好设置键进行测试
3. 在窗口#1中修改值观察窗口#2的反应 3. 在窗口#1中修改值观察窗口#2的反应
@ -125,4 +133,4 @@ src/renderer/src/windows/dataRefactorTest/
- **实时主题**: 使用 useSyncExternalStore 实现主题、缩放等设置的实时UI响应 - **实时主题**: 使用 useSyncExternalStore 实现主题、缩放等设置的实时UI响应
- **跨窗口识别**: 多源窗口编号支持,确保每个窗口都有唯一标识 - **跨窗口识别**: 多源窗口编号支持,确保每个窗口都有唯一标识
- **UI框架**: Ant Design + styled-components + React 18 - **UI框架**: Ant Design + styled-components + React 18
- **类型安全**: 完整的 TypeScript 类型检查和偏好设置键约束 - **类型安全**: 完整的 TypeScript 类型检查和偏好设置键约束