inject-metadata.ts 2.8 KB

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