109 lines
3.2 KiB
TypeScript
109 lines
3.2 KiB
TypeScript
/**
|
||
* 生成预渲染路由列表
|
||
* 从工具 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 }
|