Bilibili-Evolved/webpack/inject-metadata/description.ts
2022-10-12 23:25:10 +08:00

50 lines
1.3 KiB
TypeScript

import { existsSync } from 'fs'
import { dirname, join } from 'path'
import { objectProperty, identifier } from '@babel/types'
import { parseExpression } from '@babel/parser'
import { InjectMetadataAction } from './types'
/**
* 当入口文件 index.ts 旁边还有 index.md 时, 将其作为中文的 description 注入.
* 如果还有 index.{language}.md, 也会一并作为多语言的 description 注入.
* 注意 index.ts 中原有的 description 会被覆盖.
*
* 例子:
* - index.ts
* - index.md
* - index.en-US.md
*
* 可以自动在 index.ts 中的定义中注入 zh-CN 和 en-US 的 description
*/
export const injectDescription: InjectMetadataAction = ({ filename }) => {
const folder = dirname(filename)
const defaultDesc = join(folder, 'index.md')
if (!existsSync(defaultDesc)) {
return []
}
const regex = /index\.(.+)\.md$/
return [
objectProperty(
identifier('description'),
parseExpression(
`
(() => {
const context = require.context('./', false, ${regex})
return {
...Object.fromEntries(context
.keys()
.map(path => {
const key = path.match(${regex})[1]
const value = context(path)
return [key, value]
})),
'zh-CN': () => import('./index.md').then(m => m.default),
}
})()
`,
{ plugins: ['typescript'] },
),
),
]
}