import type { PluginOption } from 'vite'; import { dateUtil, getPackages, readPackageJSON } from '@vben/node-utils'; function resolvePackageVersion( pkgsMeta: Record, name: string, value: string, ) { if (value.includes('workspace')) { return pkgsMeta[name]; } return value; } async function resolveMonorepoDependencies() { const { packages } = await getPackages(); const resultDevDependencies: Record = {}; const resultDependencies: Record = {}; const pkgsMeta: Record = {}; for (const { packageJson } of packages) { pkgsMeta[packageJson.name] = packageJson.version; } for (const { packageJson } of packages) { const { dependencies = {}, devDependencies = {} } = packageJson; for (const [key, value] of Object.entries(dependencies)) { resultDependencies[key] = resolvePackageVersion(pkgsMeta, key, value); } for (const [key, value] of Object.entries(devDependencies)) { resultDevDependencies[key] = resolvePackageVersion(pkgsMeta, key, value); } } return { dependencies: resultDependencies, devDependencies: resultDevDependencies, }; } /** * 用于注入项目信息 */ async function viteMetadataPlugin( root = process.cwd(), ): Promise { const { author, description, homepage, license, repository, version } = await readPackageJSON(root); const buildTime = dateUtil().format('YYYY-MM-DD HH:mm:ss'); return { async config() { const { dependencies, devDependencies } = await resolveMonorepoDependencies(); const repositoryUrl = typeof repository === 'object' ? repository.url : repository; const isAuthorObject = typeof author === 'object'; const authorName = isAuthorObject ? author.name : author; const authorEmail = isAuthorObject ? author.email : null; const authorUrl = isAuthorObject ? author.url : null; return { define: { __VBEN_ADMIN_METADATA__: JSON.stringify({ authorEmail, authorName, authorUrl, buildTime, dependencies, description, devDependencies, homepage, license, repositoryUrl, version, }), }, }; }, enforce: 'post', name: 'vite:inject-metadata', }; } export { viteMetadataPlugin };