utils.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import dayjs from "dayjs";
  2. import { readdir, stat } from "node:fs";
  3. import { fileURLToPath } from "node:url";
  4. import { dirname, resolve } from "node:path";
  5. import { sum, formatBytes } from "@pureadmin/utils";
  6. import { dependencies, devDependencies, name, version } from "../package.json";
  7. /** 启动`node`进程时所在工作目录的绝对路径 */
  8. const root: string = process.cwd();
  9. /**
  10. * @description 根据可选的路径片段生成一个新的绝对路径
  11. * @param dir 路径片段,默认`build`
  12. * @param metaUrl 模块的完整`url`,如果在`build`目录外调用必传`import.meta.url`
  13. */
  14. const pathResolve = (dir = ".", metaUrl = import.meta.url) => {
  15. // 当前文件目录的绝对路径
  16. const currentFileDir = dirname(fileURLToPath(metaUrl));
  17. // build 目录的绝对路径
  18. const buildDir = resolve(currentFileDir, "build");
  19. // 解析的绝对路径
  20. const resolvedPath = resolve(currentFileDir, dir);
  21. // 检查解析的绝对路径是否在 build 目录内
  22. if (resolvedPath.startsWith(buildDir)) {
  23. // 在 build 目录内,返回当前文件路径
  24. return fileURLToPath(metaUrl);
  25. }
  26. // 不在 build 目录内,返回解析后的绝对路径
  27. return resolvedPath;
  28. };
  29. /** 设置别名 */
  30. const alias: Record<string, string> = {
  31. "@": pathResolve("../src"),
  32. "@build": pathResolve()
  33. };
  34. /** 平台的名称、版本、依赖、最后构建时间 */
  35. const __APP_INFO__ = {
  36. pkg: { name, version, dependencies, devDependencies },
  37. lastBuildTime: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss")
  38. };
  39. /** 处理环境变量 */
  40. const warpperEnv = (envConf: Recordable): ViteEnv => {
  41. // 默认值
  42. const ret: ViteEnv = {
  43. VITE_PORT: 8848,
  44. VITE_PUBLIC_PATH: "",
  45. VITE_ROUTER_HISTORY: "",
  46. VITE_CDN: false,
  47. VITE_HIDE_HOME: "false",
  48. VITE_COMPRESSION: "none"
  49. };
  50. for (const envName of Object.keys(envConf)) {
  51. let realName = envConf[envName].replace(/\\n/g, "\n");
  52. realName =
  53. realName === "true" ? true : realName === "false" ? false : realName;
  54. if (envName === "VITE_PORT") {
  55. realName = Number(realName);
  56. }
  57. ret[envName] = realName;
  58. if (typeof realName === "string") {
  59. process.env[envName] = realName;
  60. } else if (typeof realName === "object") {
  61. process.env[envName] = JSON.stringify(realName);
  62. }
  63. }
  64. return ret;
  65. };
  66. const fileListTotal: number[] = [];
  67. /** 获取指定文件夹中所有文件的总大小 */
  68. const getPackageSize = options => {
  69. const { folder = "dist", callback, format = true } = options;
  70. readdir(folder, (err, files: string[]) => {
  71. if (err) throw err;
  72. let count = 0;
  73. const checkEnd = () => {
  74. ++count == files.length &&
  75. callback(format ? formatBytes(sum(fileListTotal)) : sum(fileListTotal));
  76. };
  77. files.forEach((item: string) => {
  78. stat(`${folder}/${item}`, async (err, stats) => {
  79. if (err) throw err;
  80. if (stats.isFile()) {
  81. fileListTotal.push(stats.size);
  82. checkEnd();
  83. } else if (stats.isDirectory()) {
  84. getPackageSize({
  85. folder: `${folder}/${item}/`,
  86. callback: checkEnd
  87. });
  88. }
  89. });
  90. });
  91. files.length === 0 && callback(0);
  92. });
  93. };
  94. export { root, pathResolve, alias, __APP_INFO__, warpperEnv, getPackageSize };