/** * 生成预渲染路由列表 * 从工具 store 中读取所有工具并生成对应的路由路径 */ import { fileURLToPath } from 'node:url' import { dirname, resolve } from 'node:path' import fs from 'node:fs' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) // 工具接口定义(与 store 中的 Tool 接口保持一致) interface Tool { id: string toolName?: string routePath?: string type?: 'route' | 'url' hidden?: boolean } // 读取默认工具列表(从 store 文件中提取) function getDefaultTools(): Tool[] { const toolsStorePath = resolve(__dirname, '../src/shared/stores/tools.ts') const content = fs.readFileSync(toolsStorePath, 'utf-8') const tools: Tool[] = [] // 使用正则表达式匹配工具对象定义 // 匹配模式:{ id: 'xxx', ..., toolName: 'xxx', ... } const toolObjectRegex = /\{\s*id:\s*['"]([^'"]+)['"]([\s\S]*?)\}/g let match while ((match = toolObjectRegex.exec(content)) !== null) { const toolBlock = match[0] const id = match[1] // 提取 toolName const toolNameMatch = toolBlock.match(/toolName:\s*['"]([^'"]+)['"]/) const toolName = toolNameMatch ? toolNameMatch[1] : null // 提取 type(默认为 'route') const typeMatch = toolBlock.match(/type:\s*['"](route|url)['"]/) const type = (typeMatch ? typeMatch[1] : 'route') as 'route' | 'url' // 提取 hidden(默认为 false) const hiddenMatch = toolBlock.match(/hidden:\s*(true|false)/) const hidden = hiddenMatch ? hiddenMatch[1] === 'true' : false // 提取 routePath(如果存在) const routePathMatch = toolBlock.match(/routePath:\s*['"]([^'"]+)['"]/) const routePath = routePathMatch ? routePathMatch[1] : undefined if (toolName && type === 'route' && !hidden) { tools.push({ id, toolName, routePath, type, hidden }) } } return tools } // 生成所有需要预渲染的路由 function generatePrerenderRoutes(): string[] { const defaultTools = getDefaultTools() // 过滤出需要预渲染的工具(只包含 type 为 'route' 且未隐藏的工具) const routes = defaultTools .filter(tool => tool.type === 'route' && !tool.hidden) .map(tool => { // 使用 routePath 或根据 toolName 生成 if (tool.routePath) { return `/${tool.routePath}` } if (tool.toolName) { return `/tools/${tool.toolName.replace(/_/g, '-')}` } return `/tools/${tool.id.replace(/_/g, '-')}` }) .filter((route, index, self) => self.indexOf(route) === index) // 去重 // 添加基础路由 const baseRoutes = [ '/', '/tools' ] return [...baseRoutes, ...routes] } // 如果直接运行此脚本,输出路由列表(用于调试) if (import.meta.url === `file://${process.argv[1]}`) { try { const routes = generatePrerenderRoutes() console.log('预渲染路由列表:') routes.forEach(route => console.log(` - ${route}`)) console.log(`\n总共 ${routes.length} 个路由需要预渲染`) } catch (error) { console.error('生成预渲染路由失败:', error) process.exit(1) } } export { generatePrerenderRoutes }