env.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import type { ApplicationPluginOptions } from '../typing';
  2. import { join } from 'node:path';
  3. import { fs } from '@vben/node-utils';
  4. import dotenv from 'dotenv';
  5. const getBoolean = (value: string | undefined) => value === 'true';
  6. const getString = (value: string | undefined, fallback: string) =>
  7. value ?? fallback;
  8. const getNumber = (value: string | undefined, fallback: number) =>
  9. Number(value) || fallback;
  10. /**
  11. * 获取当前环境下生效的配置文件名
  12. */
  13. function getConfFiles() {
  14. const script = process.env.npm_lifecycle_script as string;
  15. const reg = /--mode ([\d_a-z]+)/;
  16. const result = reg.exec(script);
  17. if (result) {
  18. const mode = result[1];
  19. return ['.env', `.env.${mode}`];
  20. }
  21. return ['.env', '.env.production'];
  22. }
  23. /**
  24. * Get the environment variables starting with the specified prefix
  25. * @param match prefix
  26. * @param confFiles ext
  27. */
  28. async function loadEnv<T = Record<string, string>>(
  29. match = 'VITE_GLOB_',
  30. confFiles = getConfFiles(),
  31. ) {
  32. let envConfig = {};
  33. for (const confFile of confFiles) {
  34. try {
  35. const envPath = await fs.readFile(join(process.cwd(), confFile), {
  36. encoding: 'utf8',
  37. });
  38. const env = dotenv.parse(envPath);
  39. envConfig = { ...envConfig, ...env };
  40. } catch (error) {
  41. console.error(`Error while parsing ${confFile}`, error);
  42. }
  43. }
  44. const reg = new RegExp(`^(${match})`);
  45. Object.keys(envConfig).forEach((key) => {
  46. if (!reg.test(key)) {
  47. Reflect.deleteProperty(envConfig, key);
  48. }
  49. });
  50. return envConfig as T;
  51. }
  52. async function loadAndConvertEnv(
  53. match = 'VITE_',
  54. confFiles = getConfFiles(),
  55. ): Promise<
  56. {
  57. appTitle: string;
  58. base: string;
  59. port: number;
  60. } & Partial<ApplicationPluginOptions>
  61. > {
  62. const envConfig = await loadEnv(match, confFiles);
  63. const {
  64. VITE_APP_TITLE,
  65. VITE_ARCHIVER,
  66. VITE_BASE,
  67. VITE_COMPRESS,
  68. VITE_DEVTOOLS,
  69. VITE_INJECT_APP_LOADING,
  70. VITE_NITRO_MOCK,
  71. VITE_PORT,
  72. VITE_PWA,
  73. VITE_VISUALIZER,
  74. } = envConfig;
  75. const compressTypes = (VITE_COMPRESS ?? '')
  76. .split(',')
  77. .filter((item) => item === 'brotli' || item === 'gzip');
  78. return {
  79. appTitle: getString(VITE_APP_TITLE, 'Vben Admin'),
  80. archiver: getBoolean(VITE_ARCHIVER),
  81. base: getString(VITE_BASE, '/'),
  82. compress: compressTypes.length > 0,
  83. compressTypes,
  84. devtools: getBoolean(VITE_DEVTOOLS),
  85. injectAppLoading: getBoolean(VITE_INJECT_APP_LOADING),
  86. nitroMock: getBoolean(VITE_NITRO_MOCK),
  87. port: getNumber(VITE_PORT, 5173),
  88. pwa: getBoolean(VITE_PWA),
  89. visualizer: getBoolean(VITE_VISUALIZER),
  90. };
  91. }
  92. export { loadAndConvertEnv, loadEnv };