sa2kit 1.4.2 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/ConfigService-7MEZXKJ5.js +21 -0
  2. package/dist/ConfigService-7MEZXKJ5.js.map +1 -0
  3. package/dist/ConfigService-BV57YYFW.mjs +4 -0
  4. package/dist/ConfigService-BV57YYFW.mjs.map +1 -0
  5. package/dist/ConfigService-BxK06xP6.d.mts +262 -0
  6. package/dist/ConfigService-BxK06xP6.d.ts +262 -0
  7. package/dist/audioDetection/index.d.mts +449 -0
  8. package/dist/audioDetection/index.d.ts +449 -0
  9. package/dist/audioDetection/index.js +1244 -0
  10. package/dist/audioDetection/index.js.map +1 -0
  11. package/dist/audioDetection/index.mjs +1227 -0
  12. package/dist/audioDetection/index.mjs.map +1 -0
  13. package/dist/chunk-5XUE72Y3.mjs +1001 -0
  14. package/dist/chunk-5XUE72Y3.mjs.map +1 -0
  15. package/dist/chunk-DQVPZTVC.js +1009 -0
  16. package/dist/chunk-DQVPZTVC.js.map +1 -0
  17. package/dist/chunk-NEPD75MX.mjs +467 -0
  18. package/dist/chunk-NEPD75MX.mjs.map +1 -0
  19. package/dist/chunk-OEDY7GI4.js +473 -0
  20. package/dist/chunk-OEDY7GI4.js.map +1 -0
  21. package/dist/chunk-TFQF2HDO.mjs +354 -0
  22. package/dist/chunk-TFQF2HDO.mjs.map +1 -0
  23. package/dist/chunk-TOC5FSHP.js +358 -0
  24. package/dist/chunk-TOC5FSHP.js.map +1 -0
  25. package/dist/imageCrop/index.d.mts +165 -0
  26. package/dist/imageCrop/index.d.ts +165 -0
  27. package/dist/imageCrop/index.js +559 -0
  28. package/dist/imageCrop/index.js.map +1 -0
  29. package/dist/imageCrop/index.mjs +540 -0
  30. package/dist/imageCrop/index.mjs.map +1 -0
  31. package/dist/index.d.mts +139 -0
  32. package/dist/index.d.ts +139 -0
  33. package/dist/index.js +670 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/index.mjs +662 -0
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/mmd/index.d.mts +113 -2
  38. package/dist/mmd/index.d.ts +113 -2
  39. package/dist/mmd/index.js +484 -2
  40. package/dist/mmd/index.js.map +1 -1
  41. package/dist/mmd/index.mjs +482 -4
  42. package/dist/mmd/index.mjs.map +1 -1
  43. package/dist/testYourself/admin/index.d.mts +58 -0
  44. package/dist/testYourself/admin/index.d.ts +58 -0
  45. package/dist/testYourself/admin/index.js +17 -0
  46. package/dist/testYourself/admin/index.js.map +1 -0
  47. package/dist/testYourself/admin/index.mjs +4 -0
  48. package/dist/testYourself/admin/index.mjs.map +1 -0
  49. package/dist/testYourself/index.d.mts +6 -98
  50. package/dist/testYourself/index.d.ts +6 -98
  51. package/dist/testYourself/index.js +90 -334
  52. package/dist/testYourself/index.js.map +1 -1
  53. package/dist/testYourself/index.mjs +47 -333
  54. package/dist/testYourself/index.mjs.map +1 -1
  55. package/dist/testYourself/server/index.d.mts +1029 -0
  56. package/dist/testYourself/server/index.d.ts +1029 -0
  57. package/dist/testYourself/server/index.js +42 -0
  58. package/dist/testYourself/server/index.js.map +1 -0
  59. package/dist/testYourself/server/index.mjs +5 -0
  60. package/dist/testYourself/server/index.mjs.map +1 -0
  61. package/dist/universalFile/server/index.js +5 -5
  62. package/dist/universalFile/server/index.mjs +1 -1
  63. package/package.json +62 -20
@@ -0,0 +1,354 @@
1
+ // src/testYourself/server/ConfigService.ts
2
+ var LocalStorageAdapter = class {
3
+ constructor() {
4
+ this.STORAGE_KEY = "test-yourself-configs";
5
+ this.DEFAULT_KEY = "test-yourself-default-config";
6
+ }
7
+ async getAllConfigsData() {
8
+ if (typeof window === "undefined") return [];
9
+ try {
10
+ const data = localStorage.getItem(this.STORAGE_KEY);
11
+ return data ? JSON.parse(data) : [];
12
+ } catch (error) {
13
+ console.error("\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25:", error);
14
+ return [];
15
+ }
16
+ }
17
+ async saveAllConfigsData(configs) {
18
+ if (typeof window === "undefined") return;
19
+ try {
20
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(configs));
21
+ } catch (error) {
22
+ console.error("\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25:", error);
23
+ throw error;
24
+ }
25
+ }
26
+ async saveConfig(config) {
27
+ const configs = await this.getAllConfigsData();
28
+ const existingIndex = configs.findIndex((c) => c.id === config.id);
29
+ if (existingIndex >= 0) {
30
+ configs[existingIndex] = config;
31
+ } else {
32
+ configs.push(config);
33
+ }
34
+ await this.saveAllConfigsData(configs);
35
+ }
36
+ async getConfig(id) {
37
+ const configs = await this.getAllConfigsData();
38
+ return configs.find((c) => c.id === id) || null;
39
+ }
40
+ async getAllConfigs() {
41
+ return this.getAllConfigsData();
42
+ }
43
+ async deleteConfig(id) {
44
+ const configs = await this.getAllConfigsData();
45
+ const filtered = configs.filter((c) => c.id !== id);
46
+ await this.saveAllConfigsData(filtered);
47
+ }
48
+ async updateConfig(id, config) {
49
+ const configs = await this.getAllConfigsData();
50
+ const index = configs.findIndex((c) => c.id === id);
51
+ if (index >= 0) {
52
+ configs[index] = { ...config, updatedAt: Date.now() };
53
+ await this.saveAllConfigsData(configs);
54
+ } else {
55
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
56
+ }
57
+ }
58
+ async setDefaultConfig(id) {
59
+ if (typeof window === "undefined") return;
60
+ const config = await this.getConfig(id);
61
+ if (!config) {
62
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
63
+ }
64
+ const configs = await this.getAllConfigsData();
65
+ configs.forEach((c) => c.isDefault = c.id === id);
66
+ await this.saveAllConfigsData(configs);
67
+ localStorage.setItem(this.DEFAULT_KEY, id);
68
+ }
69
+ async getDefaultConfig() {
70
+ if (typeof window === "undefined") return null;
71
+ try {
72
+ const defaultId = localStorage.getItem(this.DEFAULT_KEY);
73
+ if (defaultId) {
74
+ return await this.getConfig(defaultId);
75
+ }
76
+ const configs = await this.getAllConfigsData();
77
+ return configs.find((c) => c.isDefault) || null;
78
+ } catch (error) {
79
+ console.error("\u83B7\u53D6\u9ED8\u8BA4\u914D\u7F6E\u5931\u8D25:", error);
80
+ return null;
81
+ }
82
+ }
83
+ };
84
+ var MemoryStorageAdapter = class {
85
+ constructor() {
86
+ this.configs = /* @__PURE__ */ new Map();
87
+ this.defaultConfigId = null;
88
+ }
89
+ async saveConfig(config) {
90
+ this.configs.set(config.id, config);
91
+ }
92
+ async getConfig(id) {
93
+ return this.configs.get(id) || null;
94
+ }
95
+ async getAllConfigs() {
96
+ return Array.from(this.configs.values());
97
+ }
98
+ async deleteConfig(id) {
99
+ this.configs.delete(id);
100
+ if (this.defaultConfigId === id) {
101
+ this.defaultConfigId = null;
102
+ }
103
+ }
104
+ async updateConfig(id, config) {
105
+ if (!this.configs.has(id)) {
106
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
107
+ }
108
+ this.configs.set(id, { ...config, updatedAt: Date.now() });
109
+ }
110
+ async setDefaultConfig(id) {
111
+ if (!this.configs.has(id)) {
112
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
113
+ }
114
+ this.configs.forEach((c) => c.isDefault = c.id === id);
115
+ this.defaultConfigId = id;
116
+ }
117
+ async getDefaultConfig() {
118
+ if (this.defaultConfigId) {
119
+ return this.configs.get(this.defaultConfigId) || null;
120
+ }
121
+ for (const config of this.configs.values()) {
122
+ if (config.isDefault) {
123
+ return config;
124
+ }
125
+ }
126
+ return null;
127
+ }
128
+ };
129
+ var ConfigService = class {
130
+ constructor(options = {}) {
131
+ this.cache = /* @__PURE__ */ new Map();
132
+ const {
133
+ storageType = "localStorage",
134
+ customStorage,
135
+ enableCache = true
136
+ } = options;
137
+ this.enableCache = enableCache;
138
+ if (customStorage) {
139
+ this.storage = customStorage;
140
+ } else if (storageType === "memory") {
141
+ this.storage = new MemoryStorageAdapter();
142
+ } else {
143
+ this.storage = new LocalStorageAdapter();
144
+ }
145
+ }
146
+ /**
147
+ * 初始化服务(如果需要)
148
+ */
149
+ async init() {
150
+ }
151
+ /**
152
+ * 生成唯一ID
153
+ */
154
+ generateId() {
155
+ return `config_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
156
+ }
157
+ /**
158
+ * 保存配置
159
+ */
160
+ async saveConfig(config) {
161
+ await this.storage.saveConfig(config);
162
+ if (config.isDefault) {
163
+ await this.storage.setDefaultConfig(config.id);
164
+ }
165
+ if (this.enableCache) {
166
+ this.cache.set(config.id, config);
167
+ }
168
+ }
169
+ /**
170
+ * 创建新配置
171
+ */
172
+ async createConfig(name, config, description, isDefault = false) {
173
+ const savedConfig = {
174
+ id: this.generateId(),
175
+ name,
176
+ description,
177
+ config,
178
+ createdAt: Date.now(),
179
+ updatedAt: Date.now(),
180
+ isDefault
181
+ };
182
+ await this.storage.saveConfig(savedConfig);
183
+ if (isDefault) {
184
+ await this.storage.setDefaultConfig(savedConfig.id);
185
+ }
186
+ if (this.enableCache) {
187
+ this.cache.set(savedConfig.id, savedConfig);
188
+ }
189
+ return savedConfig;
190
+ }
191
+ /**
192
+ * 获取配置
193
+ */
194
+ async getConfig(id) {
195
+ if (this.enableCache && this.cache.has(id)) {
196
+ return this.cache.get(id);
197
+ }
198
+ const config = await this.storage.getConfig(id);
199
+ if (config && this.enableCache) {
200
+ this.cache.set(id, config);
201
+ }
202
+ return config;
203
+ }
204
+ /**
205
+ * 获取所有配置列表
206
+ */
207
+ async getAllConfigs() {
208
+ return await this.storage.getAllConfigs();
209
+ }
210
+ /**
211
+ * 获取配置列表(精简版)
212
+ */
213
+ async getConfigList() {
214
+ const configs = await this.getAllConfigs();
215
+ return configs.map((c) => ({
216
+ id: c.id,
217
+ name: c.name,
218
+ description: c.description,
219
+ resultCount: c.config.results.length,
220
+ createdAt: c.createdAt,
221
+ updatedAt: c.updatedAt,
222
+ isDefault: c.isDefault
223
+ }));
224
+ }
225
+ /**
226
+ * 更新配置
227
+ */
228
+ async updateConfig(id, updates) {
229
+ const existing = await this.getConfig(id);
230
+ if (!existing) {
231
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
232
+ }
233
+ const updated = {
234
+ ...existing,
235
+ ...updates,
236
+ updatedAt: Date.now()
237
+ };
238
+ await this.storage.updateConfig(id, updated);
239
+ if (updates.isDefault) {
240
+ await this.storage.setDefaultConfig(id);
241
+ }
242
+ if (this.enableCache) {
243
+ this.cache.set(id, updated);
244
+ }
245
+ return updated;
246
+ }
247
+ /**
248
+ * 删除配置
249
+ */
250
+ async deleteConfig(id) {
251
+ await this.storage.deleteConfig(id);
252
+ if (this.enableCache) {
253
+ this.cache.delete(id);
254
+ }
255
+ }
256
+ /**
257
+ * 设置默认配置
258
+ */
259
+ async setDefaultConfig(id) {
260
+ await this.storage.setDefaultConfig(id);
261
+ if (this.enableCache) {
262
+ this.cache.clear();
263
+ }
264
+ }
265
+ /**
266
+ * 获取默认配置
267
+ */
268
+ async getDefaultConfig() {
269
+ return await this.storage.getDefaultConfig();
270
+ }
271
+ /**
272
+ * 清空缓存
273
+ */
274
+ clearCache() {
275
+ this.cache.clear();
276
+ }
277
+ /**
278
+ * 导出配置(JSON格式)
279
+ */
280
+ async exportConfig(id) {
281
+ const config = await this.getConfig(id);
282
+ if (!config) {
283
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
284
+ }
285
+ return JSON.stringify(config, null, 2);
286
+ }
287
+ /**
288
+ * 导入配置
289
+ */
290
+ async importConfig(jsonString) {
291
+ try {
292
+ const data = JSON.parse(jsonString);
293
+ const newConfig = {
294
+ ...data,
295
+ id: this.generateId(),
296
+ createdAt: Date.now(),
297
+ updatedAt: Date.now(),
298
+ isDefault: false
299
+ // 导入的配置不设为默认
300
+ };
301
+ await this.storage.saveConfig(newConfig);
302
+ if (this.enableCache) {
303
+ this.cache.set(newConfig.id, newConfig);
304
+ }
305
+ return newConfig;
306
+ } catch (error) {
307
+ throw new Error(`\u5BFC\u5165\u914D\u7F6E\u5931\u8D25: ${error}`);
308
+ }
309
+ }
310
+ /**
311
+ * 复制配置
312
+ */
313
+ async duplicateConfig(id, newName) {
314
+ const original = await this.getConfig(id);
315
+ if (!original) {
316
+ throw new Error(`\u914D\u7F6E\u4E0D\u5B58\u5728: ${id}`);
317
+ }
318
+ const duplicated = {
319
+ ...original,
320
+ id: this.generateId(),
321
+ name: newName || `${original.name} (\u526F\u672C)`,
322
+ createdAt: Date.now(),
323
+ updatedAt: Date.now(),
324
+ isDefault: false
325
+ };
326
+ await this.storage.saveConfig(duplicated);
327
+ if (this.enableCache) {
328
+ this.cache.set(duplicated.id, duplicated);
329
+ }
330
+ return duplicated;
331
+ }
332
+ /**
333
+ * 批量删除配置
334
+ */
335
+ async deleteConfigs(ids) {
336
+ for (const id of ids) {
337
+ await this.deleteConfig(id);
338
+ }
339
+ }
340
+ };
341
+ function createConfigService(options) {
342
+ return new ConfigService(options);
343
+ }
344
+ var defaultServiceInstance = null;
345
+ function getDefaultConfigService() {
346
+ if (!defaultServiceInstance) {
347
+ defaultServiceInstance = createConfigService();
348
+ }
349
+ return defaultServiceInstance;
350
+ }
351
+
352
+ export { ConfigService, createConfigService, getDefaultConfigService };
353
+ //# sourceMappingURL=chunk-TFQF2HDO.mjs.map
354
+ //# sourceMappingURL=chunk-TFQF2HDO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testYourself/server/ConfigService.ts"],"names":[],"mappings":"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","file":"chunk-TFQF2HDO.mjs","sourcesContent":["/**\n * 测测你是什么 - 配置管理服务\n * Test Yourself - Configuration Management Service\n * \n * 服务端逻辑:配置的增删改查\n */\n\nimport type { SavedConfig, TestConfig, ConfigListItem } from '../types';\n\nexport interface ConfigServiceOptions {\n /** 存储类型 */\n storageType?: 'localStorage' | 'memory' | 'custom';\n /** 自定义存储适配器 */\n customStorage?: IConfigStorage;\n /** 是否启用缓存 */\n enableCache?: boolean;\n}\n\n/**\n * 配置存储适配器接口\n */\nexport interface IConfigStorage {\n /** 保存配置 */\n saveConfig(config: SavedConfig): Promise<void>;\n /** 获取配置 */\n getConfig(id: string): Promise<SavedConfig | null>;\n /** 获取所有配置列表 */\n getAllConfigs(): Promise<SavedConfig[]>;\n /** 删除配置 */\n deleteConfig(id: string): Promise<void>;\n /** 更新配置 */\n updateConfig(id: string, config: SavedConfig): Promise<void>;\n /** 设置默认配置 */\n setDefaultConfig(id: string): Promise<void>;\n /** 获取默认配置 */\n getDefaultConfig(): Promise<SavedConfig | null>;\n}\n\n/**\n * LocalStorage 存储适配器\n */\nclass LocalStorageAdapter implements IConfigStorage {\n private readonly STORAGE_KEY = 'test-yourself-configs';\n private readonly DEFAULT_KEY = 'test-yourself-default-config';\n\n private async getAllConfigsData(): Promise<SavedConfig[]> {\n if (typeof window === 'undefined') return [];\n \n try {\n const data = localStorage.getItem(this.STORAGE_KEY);\n return data ? JSON.parse(data) : [];\n } catch (error) {\n console.error('读取配置失败:', error);\n return [];\n }\n }\n\n private async saveAllConfigsData(configs: SavedConfig[]): Promise<void> {\n if (typeof window === 'undefined') return;\n \n try {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(configs));\n } catch (error) {\n console.error('保存配置失败:', error);\n throw error;\n }\n }\n\n async saveConfig(config: SavedConfig): Promise<void> {\n const configs = await this.getAllConfigsData();\n const existingIndex = configs.findIndex(c => c.id === config.id);\n \n if (existingIndex >= 0) {\n configs[existingIndex] = config;\n } else {\n configs.push(config);\n }\n \n await this.saveAllConfigsData(configs);\n }\n\n async getConfig(id: string): Promise<SavedConfig | null> {\n const configs = await this.getAllConfigsData();\n return configs.find(c => c.id === id) || null;\n }\n\n async getAllConfigs(): Promise<SavedConfig[]> {\n return this.getAllConfigsData();\n }\n\n async deleteConfig(id: string): Promise<void> {\n const configs = await this.getAllConfigsData();\n const filtered = configs.filter(c => c.id !== id);\n await this.saveAllConfigsData(filtered);\n }\n\n async updateConfig(id: string, config: SavedConfig): Promise<void> {\n const configs = await this.getAllConfigsData();\n const index = configs.findIndex(c => c.id === id);\n \n if (index >= 0) {\n configs[index] = { ...config, updatedAt: Date.now() };\n await this.saveAllConfigsData(configs);\n } else {\n throw new Error(`配置不存在: ${id}`);\n }\n }\n\n async setDefaultConfig(id: string): Promise<void> {\n if (typeof window === 'undefined') return;\n \n const config = await this.getConfig(id);\n if (!config) {\n throw new Error(`配置不存在: ${id}`);\n }\n \n // 清除其他配置的默认标记\n const configs = await this.getAllConfigsData();\n configs.forEach(c => c.isDefault = c.id === id);\n await this.saveAllConfigsData(configs);\n \n // 保存默认配置ID\n localStorage.setItem(this.DEFAULT_KEY, id);\n }\n\n async getDefaultConfig(): Promise<SavedConfig | null> {\n if (typeof window === 'undefined') return null;\n \n try {\n const defaultId = localStorage.getItem(this.DEFAULT_KEY);\n if (defaultId) {\n return await this.getConfig(defaultId);\n }\n \n // 如果没有设置默认配置,返回第一个标记为默认的配置\n const configs = await this.getAllConfigsData();\n return configs.find(c => c.isDefault) || null;\n } catch (error) {\n console.error('获取默认配置失败:', error);\n return null;\n }\n }\n}\n\n/**\n * 内存存储适配器(用于测试或SSR)\n */\nclass MemoryStorageAdapter implements IConfigStorage {\n private configs: Map<string, SavedConfig> = new Map();\n private defaultConfigId: string | null = null;\n\n async saveConfig(config: SavedConfig): Promise<void> {\n this.configs.set(config.id, config);\n }\n\n async getConfig(id: string): Promise<SavedConfig | null> {\n return this.configs.get(id) || null;\n }\n\n async getAllConfigs(): Promise<SavedConfig[]> {\n return Array.from(this.configs.values());\n }\n\n async deleteConfig(id: string): Promise<void> {\n this.configs.delete(id);\n if (this.defaultConfigId === id) {\n this.defaultConfigId = null;\n }\n }\n\n async updateConfig(id: string, config: SavedConfig): Promise<void> {\n if (!this.configs.has(id)) {\n throw new Error(`配置不存在: ${id}`);\n }\n this.configs.set(id, { ...config, updatedAt: Date.now() });\n }\n\n async setDefaultConfig(id: string): Promise<void> {\n if (!this.configs.has(id)) {\n throw new Error(`配置不存在: ${id}`);\n }\n \n // 清除其他配置的默认标记\n this.configs.forEach(c => c.isDefault = c.id === id);\n this.defaultConfigId = id;\n }\n\n async getDefaultConfig(): Promise<SavedConfig | null> {\n if (this.defaultConfigId) {\n return this.configs.get(this.defaultConfigId) || null;\n }\n \n // 返回第一个标记为默认的配置\n for (const config of this.configs.values()) {\n if (config.isDefault) {\n return config;\n }\n }\n \n return null;\n }\n}\n\n/**\n * 配置管理服务\n */\nexport class ConfigService {\n private storage: IConfigStorage;\n private cache: Map<string, SavedConfig> = new Map();\n private enableCache: boolean;\n\n constructor(options: ConfigServiceOptions = {}) {\n const {\n storageType = 'localStorage',\n customStorage,\n enableCache = true,\n } = options;\n\n this.enableCache = enableCache;\n\n if (customStorage) {\n this.storage = customStorage;\n } else if (storageType === 'memory') {\n this.storage = new MemoryStorageAdapter();\n } else {\n this.storage = new LocalStorageAdapter();\n }\n }\n\n /**\n * 初始化服务(如果需要)\n */\n async init(): Promise<void> {\n // 基础类不需要初始化,但子类或适配器可能需要\n }\n\n /**\n * 生成唯一ID\n */\n private generateId(): string {\n return `config_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * 保存配置\n */\n async saveConfig(config: SavedConfig): Promise<void> {\n await this.storage.saveConfig(config);\n\n if (config.isDefault) {\n await this.storage.setDefaultConfig(config.id);\n }\n\n if (this.enableCache) {\n this.cache.set(config.id, config);\n }\n }\n\n /**\n * 创建新配置\n */\n async createConfig(\n name: string,\n config: TestConfig,\n description?: string,\n isDefault = false\n ): Promise<SavedConfig> {\n const savedConfig: SavedConfig = {\n id: this.generateId(),\n name,\n description,\n config,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isDefault,\n };\n\n await this.storage.saveConfig(savedConfig);\n\n if (isDefault) {\n await this.storage.setDefaultConfig(savedConfig.id);\n }\n\n if (this.enableCache) {\n this.cache.set(savedConfig.id, savedConfig);\n }\n\n return savedConfig;\n }\n\n /**\n * 获取配置\n */\n async getConfig(id: string): Promise<SavedConfig | null> {\n // 先查缓存\n if (this.enableCache && this.cache.has(id)) {\n return this.cache.get(id)!;\n }\n\n const config = await this.storage.getConfig(id);\n\n if (config && this.enableCache) {\n this.cache.set(id, config);\n }\n\n return config;\n }\n\n /**\n * 获取所有配置列表\n */\n async getAllConfigs(): Promise<SavedConfig[]> {\n return await this.storage.getAllConfigs();\n }\n\n /**\n * 获取配置列表(精简版)\n */\n async getConfigList(): Promise<ConfigListItem[]> {\n const configs = await this.getAllConfigs();\n return configs.map(c => ({\n id: c.id,\n name: c.name,\n description: c.description,\n resultCount: c.config.results.length,\n createdAt: c.createdAt,\n updatedAt: c.updatedAt,\n isDefault: c.isDefault,\n }));\n }\n\n /**\n * 更新配置\n */\n async updateConfig(\n id: string,\n updates: {\n name?: string;\n description?: string;\n config?: TestConfig;\n isDefault?: boolean;\n }\n ): Promise<SavedConfig> {\n const existing = await this.getConfig(id);\n if (!existing) {\n throw new Error(`配置不存在: ${id}`);\n }\n\n const updated: SavedConfig = {\n ...existing,\n ...updates,\n updatedAt: Date.now(),\n };\n\n await this.storage.updateConfig(id, updated);\n\n if (updates.isDefault) {\n await this.storage.setDefaultConfig(id);\n }\n\n if (this.enableCache) {\n this.cache.set(id, updated);\n }\n\n return updated;\n }\n\n /**\n * 删除配置\n */\n async deleteConfig(id: string): Promise<void> {\n await this.storage.deleteConfig(id);\n\n if (this.enableCache) {\n this.cache.delete(id);\n }\n }\n\n /**\n * 设置默认配置\n */\n async setDefaultConfig(id: string): Promise<void> {\n await this.storage.setDefaultConfig(id);\n\n // 清理缓存,让下次获取时重新加载\n if (this.enableCache) {\n this.cache.clear();\n }\n }\n\n /**\n * 获取默认配置\n */\n async getDefaultConfig(): Promise<SavedConfig | null> {\n return await this.storage.getDefaultConfig();\n }\n\n /**\n * 清空缓存\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * 导出配置(JSON格式)\n */\n async exportConfig(id: string): Promise<string> {\n const config = await this.getConfig(id);\n if (!config) {\n throw new Error(`配置不存在: ${id}`);\n }\n return JSON.stringify(config, null, 2);\n }\n\n /**\n * 导入配置\n */\n async importConfig(jsonString: string): Promise<SavedConfig> {\n try {\n const data = JSON.parse(jsonString) as SavedConfig;\n \n // 生成新ID,避免冲突\n const newConfig: SavedConfig = {\n ...data,\n id: this.generateId(),\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isDefault: false, // 导入的配置不设为默认\n };\n\n await this.storage.saveConfig(newConfig);\n\n if (this.enableCache) {\n this.cache.set(newConfig.id, newConfig);\n }\n\n return newConfig;\n } catch (error) {\n throw new Error(`导入配置失败: ${error}`);\n }\n }\n\n /**\n * 复制配置\n */\n async duplicateConfig(id: string, newName?: string): Promise<SavedConfig> {\n const original = await this.getConfig(id);\n if (!original) {\n throw new Error(`配置不存在: ${id}`);\n }\n\n const duplicated: SavedConfig = {\n ...original,\n id: this.generateId(),\n name: newName || `${original.name} (副本)`,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n isDefault: false,\n };\n\n await this.storage.saveConfig(duplicated);\n\n if (this.enableCache) {\n this.cache.set(duplicated.id, duplicated);\n }\n\n return duplicated;\n }\n\n /**\n * 批量删除配置\n */\n async deleteConfigs(ids: string[]): Promise<void> {\n for (const id of ids) {\n await this.deleteConfig(id);\n }\n }\n}\n\n/**\n * 创建默认配置服务实例\n */\nexport function createConfigService(options?: ConfigServiceOptions): ConfigService {\n return new ConfigService(options);\n}\n\n/**\n * 默认配置服务实例(单例)\n */\nlet defaultServiceInstance: ConfigService | null = null;\n\nexport function getDefaultConfigService(): ConfigService {\n if (!defaultServiceInstance) {\n defaultServiceInstance = createConfigService();\n }\n return defaultServiceInstance;\n}\n\n\n"]}