You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.4 KiB
168 lines
4.4 KiB
const { readFileSync, writeFileSync } = require('fs') |
|
const path = require('path') |
|
|
|
/** |
|
* 数据清理器 |
|
* 清理direct-route-mappings.js中的数据结构 |
|
*/ |
|
class DataCleaner { |
|
constructor() { |
|
this.mappingsPath = path.join(__dirname, '../../src/renderer/modules/route-sync/direct-route-mappings.js') |
|
} |
|
|
|
/** |
|
* 清理数据结构 |
|
*/ |
|
cleanData() { |
|
try { |
|
// 读取direct-route-mappings.js |
|
const content = readFileSync(this.mappingsPath, 'utf-8') |
|
|
|
// 解析mappings内容 |
|
const mappings = this.parseMappings(content) |
|
|
|
// 清理数据 |
|
const cleanedMappings = this.cleanMappings(mappings) |
|
|
|
// 生成新的文件内容 |
|
const newContent = this.generateNewContent(cleanedMappings) |
|
|
|
// 写回文件 |
|
writeFileSync(this.mappingsPath, newContent, 'utf-8') |
|
|
|
// 返回清理后的数据,供后续处理 |
|
return cleanedMappings |
|
|
|
} catch (error) { |
|
console.error('❌ 清理数据结构失败:', error.message) |
|
return null |
|
} |
|
} |
|
|
|
/** |
|
* 解析mappings内容 |
|
*/ |
|
parseMappings(content) { |
|
// 提取export default部分,文件可能没有以分号结尾 |
|
const mappingsMatch = content.match(/export default ([\s\S]*?)(?:;|$)/) |
|
if (!mappingsMatch) { |
|
throw new Error('无法解析direct-route-mappings.js') |
|
} |
|
|
|
// 使用eval解析(在生产环境中应该使用更安全的方式) |
|
const mappings = eval(`(${mappingsMatch[1]})`) |
|
return mappings |
|
} |
|
|
|
/** |
|
* 清理mappings数据 |
|
*/ |
|
cleanMappings(mappings) { |
|
// 保持原有的结构,只清理apiMappings部分 |
|
const cleanedMappings = { |
|
routes: mappings.routes || [], |
|
apiMappings: [] |
|
} |
|
|
|
if (!mappings.apiMappings || mappings.apiMappings.length === 0) { |
|
return cleanedMappings |
|
} |
|
|
|
mappings.apiMappings.forEach(module => { |
|
if (!module.apiMappings || module.apiMappings.length === 0) { |
|
return |
|
} |
|
|
|
const cleanedApiMappings = [] |
|
|
|
module.apiMappings.forEach(api => { |
|
if (!api.triggerSources || api.triggerSources.length === 0) { |
|
return |
|
} |
|
|
|
// 1. 只保留triggerType为button的triggerSources |
|
const buttonTriggerSources = api.triggerSources.filter(trigger => { |
|
return trigger.triggerType === 'button' |
|
}) |
|
|
|
// 2. 如果还有button类型的triggerSources,保留这个API |
|
if (buttonTriggerSources.length > 0) { |
|
const cleanedApi = { |
|
...api, |
|
triggerSources: buttonTriggerSources |
|
} |
|
cleanedApiMappings.push(cleanedApi) |
|
} |
|
}) |
|
|
|
// 3. 如果还有apiMappings,保留这个模块 |
|
if (cleanedApiMappings.length > 0) { |
|
const cleanedModule = { |
|
...module, |
|
apiMappings: cleanedApiMappings |
|
} |
|
cleanedMappings.apiMappings.push(cleanedModule) |
|
} |
|
}) |
|
|
|
return cleanedMappings |
|
} |
|
|
|
/** |
|
* 生成新的文件内容 |
|
*/ |
|
generateNewContent(cleanedMappings) { |
|
const header = `// 路由映射数据 - 构建时生成 |
|
export default ${JSON.stringify(cleanedMappings, null, 2)};` |
|
|
|
return header |
|
} |
|
|
|
/** |
|
* 统计清理结果 |
|
*/ |
|
getCleanupStats(originalMappings, cleanedMappings) { |
|
const stats = { |
|
original: { |
|
modules: originalMappings.length, |
|
apis: 0, |
|
triggerSources: 0, |
|
buttonTriggerSources: 0 |
|
}, |
|
cleaned: { |
|
modules: cleanedMappings.length, |
|
apis: 0, |
|
triggerSources: 0 |
|
} |
|
} |
|
|
|
// 统计原始数据 |
|
originalMappings.forEach(module => { |
|
if (module.apiMappings) { |
|
stats.original.apis += module.apiMappings.length |
|
module.apiMappings.forEach(api => { |
|
if (api.triggerSources) { |
|
stats.original.triggerSources += api.triggerSources.length |
|
stats.original.buttonTriggerSources += api.triggerSources.filter(t => t.triggerType === 'button').length |
|
} |
|
}) |
|
} |
|
}) |
|
|
|
// 统计清理后数据 |
|
cleanedMappings.forEach(module => { |
|
if (module.apiMappings) { |
|
stats.cleaned.apis += module.apiMappings.length |
|
module.apiMappings.forEach(api => { |
|
if (api.triggerSources) { |
|
stats.cleaned.triggerSources += api.triggerSources.length |
|
} |
|
}) |
|
} |
|
}) |
|
|
|
return stats |
|
} |
|
} |
|
|
|
module.exports = DataCleaner
|
|
|