inject-metadata.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import type { PluginOption } from 'vite';
  2. import { dateUtil, getPackages, readPackageJSON } from '@vben/node-utils';
  3. function resolvePackageVersion(
  4. pkgsMeta: Record<string, string>,
  5. name: string,
  6. value: string,
  7. ) {
  8. if (value.includes('workspace')) {
  9. return pkgsMeta[name];
  10. }
  11. return value;
  12. }
  13. async function resolveMonorepoDependencies() {
  14. const { packages } = await getPackages();
  15. const resultDevDependencies: Record<string, string | undefined> = {};
  16. const resultDependencies: Record<string, string | undefined> = {};
  17. const pkgsMeta: Record<string, string> = {};
  18. for (const { packageJson } of packages) {
  19. pkgsMeta[packageJson.name] = packageJson.version;
  20. }
  21. for (const { packageJson } of packages) {
  22. const { dependencies = {}, devDependencies = {} } = packageJson;
  23. for (const [key, value] of Object.entries(dependencies)) {
  24. resultDependencies[key] = resolvePackageVersion(pkgsMeta, key, value);
  25. }
  26. for (const [key, value] of Object.entries(devDependencies)) {
  27. resultDevDependencies[key] = resolvePackageVersion(pkgsMeta, key, value);
  28. }
  29. }
  30. return {
  31. dependencies: resultDependencies,
  32. devDependencies: resultDevDependencies,
  33. };
  34. }
  35. /**
  36. * 用于注入项目信息
  37. */
  38. async function viteMetadataPlugin(
  39. root = process.cwd(),
  40. ): Promise<PluginOption | undefined> {
  41. const { author, description, homepage, license, version } =
  42. await readPackageJSON(root);
  43. const buildTime = dateUtil().format('YYYY-MM-DD HH:mm:ss');
  44. return {
  45. async config() {
  46. const { dependencies, devDependencies } =
  47. await resolveMonorepoDependencies();
  48. const isAuthorObject = typeof author === 'object';
  49. const authorName = isAuthorObject ? author.name : author;
  50. const authorEmail = isAuthorObject ? author.email : null;
  51. const authorUrl = isAuthorObject ? author.url : null;
  52. return {
  53. define: {
  54. __VBEN_ADMIN_METADATA__: JSON.stringify({
  55. authorEmail,
  56. authorName,
  57. authorUrl,
  58. buildTime,
  59. dependencies,
  60. description,
  61. devDependencies,
  62. homepage,
  63. license,
  64. version,
  65. }),
  66. 'import.meta.env.VITE_APP_VERSION': JSON.stringify(version),
  67. },
  68. };
  69. },
  70. enforce: 'post',
  71. name: 'vite:inject-metadata',
  72. };
  73. }
  74. export { viteMetadataPlugin };