Bilibili-Evolved/webpack/inject-metadata/index.ts
2022-06-15 20:44:46 +08:00

53 lines
1.6 KiB
TypeScript

import nodePath from 'path'
import { PluginObj } from '@babel/core'
import { InjectMetadataAction } from './types'
import { injectCoreInfo } from './core-info'
import { injectDescription } from './description'
import { injectI18n } from './i18n'
const injectActions: InjectMetadataAction[] = [
injectCoreInfo,
injectDescription,
injectI18n,
]
export const injectMetadata = (): PluginObj => ({
visitor: {
ExportNamedDeclaration(path, state) {
const { filename } = state.file.opts
const isFromRegistry = filename.startsWith(
nodePath.resolve('./registry'),
)
const isFromCore = filename.startsWith(
nodePath.resolve('./src/components'),
) || filename.startsWith(
nodePath.resolve('./src/plugins'),
)
const isEntryFile = nodePath.basename(filename) === 'index.ts'
if (!((isFromRegistry || isFromCore) && isEntryFile)) {
return
}
const { node } = path
if (node.declaration?.type !== 'VariableDeclaration') {
return
}
node.declaration.declarations?.forEach(d => {
const isNameValid = d.id?.type === 'Identifier' && ['component', 'plugin'].includes(d.id.name)
if (!isNameValid) {
return
}
const targetExpression = d.init.type === 'CallExpression' ? d.init.arguments[0] : d.init
if (targetExpression.type !== 'ObjectExpression') {
return
}
targetExpression.properties.push(
...injectActions.flatMap(action => action({
expression: targetExpression,
filename,
})),
)
})
},
},
})