@meng-xi/vite-plugin 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README-en.md +34 -20
  2. package/README.md +33 -19
  3. package/dist/common/format/index.cjs +1 -1
  4. package/dist/common/format/index.d.cts +19 -114
  5. package/dist/common/format/index.d.mts +19 -114
  6. package/dist/common/format/index.d.ts +19 -114
  7. package/dist/common/format/index.mjs +1 -1
  8. package/dist/common/fs/index.cjs +1 -1
  9. package/dist/common/fs/index.d.cts +36 -89
  10. package/dist/common/fs/index.d.mts +36 -89
  11. package/dist/common/fs/index.d.ts +36 -89
  12. package/dist/common/fs/index.mjs +1 -1
  13. package/dist/common/html/index.cjs +2 -2
  14. package/dist/common/html/index.d.cts +12 -307
  15. package/dist/common/html/index.d.mts +12 -307
  16. package/dist/common/html/index.d.ts +12 -307
  17. package/dist/common/html/index.mjs +2 -2
  18. package/dist/common/index.cjs +1 -1
  19. package/dist/common/index.d.cts +7 -11
  20. package/dist/common/index.d.mts +7 -11
  21. package/dist/common/index.d.ts +7 -11
  22. package/dist/common/index.mjs +1 -1
  23. package/dist/common/script/index.cjs +1 -1
  24. package/dist/common/script/index.d.cts +1 -44
  25. package/dist/common/script/index.d.mts +1 -44
  26. package/dist/common/script/index.d.ts +1 -44
  27. package/dist/common/script/index.mjs +1 -1
  28. package/dist/common/ui/index.cjs +1 -1
  29. package/dist/common/ui/index.d.cts +1 -111
  30. package/dist/common/ui/index.d.mts +1 -111
  31. package/dist/common/ui/index.d.ts +1 -111
  32. package/dist/common/ui/index.mjs +1 -1
  33. package/dist/common/validation/index.cjs +1 -1
  34. package/dist/common/validation/index.d.cts +2 -80
  35. package/dist/common/validation/index.d.mts +2 -80
  36. package/dist/common/validation/index.d.ts +2 -80
  37. package/dist/common/validation/index.mjs +1 -1
  38. package/dist/factory/index.cjs +1 -1
  39. package/dist/factory/index.d.cts +1 -1
  40. package/dist/factory/index.d.mts +1 -1
  41. package/dist/factory/index.d.ts +1 -1
  42. package/dist/factory/index.mjs +1 -1
  43. package/dist/index.cjs +1 -1
  44. package/dist/index.d.cts +10 -12
  45. package/dist/index.d.mts +10 -12
  46. package/dist/index.d.ts +10 -12
  47. package/dist/index.mjs +1 -1
  48. package/dist/logger/index.d.cts +92 -1
  49. package/dist/logger/index.d.mts +92 -1
  50. package/dist/logger/index.d.ts +92 -1
  51. package/dist/plugins/autoImport/index.cjs +19 -0
  52. package/dist/plugins/autoImport/index.d.cts +291 -0
  53. package/dist/plugins/autoImport/index.d.mts +291 -0
  54. package/dist/plugins/autoImport/index.d.ts +291 -0
  55. package/dist/plugins/autoImport/index.mjs +19 -0
  56. package/dist/plugins/buildProgress/index.cjs +1 -1
  57. package/dist/plugins/buildProgress/index.d.cts +1 -1
  58. package/dist/plugins/buildProgress/index.d.mts +1 -1
  59. package/dist/plugins/buildProgress/index.d.ts +1 -1
  60. package/dist/plugins/buildProgress/index.mjs +2 -2
  61. package/dist/plugins/bundleAnalyzer/index.cjs +21 -21
  62. package/dist/plugins/bundleAnalyzer/index.d.cts +1 -1
  63. package/dist/plugins/bundleAnalyzer/index.d.mts +1 -1
  64. package/dist/plugins/bundleAnalyzer/index.d.ts +1 -1
  65. package/dist/plugins/bundleAnalyzer/index.mjs +18 -18
  66. package/dist/plugins/compressAssets/index.cjs +1 -1
  67. package/dist/plugins/compressAssets/index.d.cts +1 -1
  68. package/dist/plugins/compressAssets/index.d.mts +1 -1
  69. package/dist/plugins/compressAssets/index.d.ts +1 -1
  70. package/dist/plugins/compressAssets/index.mjs +1 -1
  71. package/dist/plugins/copyFile/index.cjs +1 -1
  72. package/dist/plugins/copyFile/index.d.cts +1 -1
  73. package/dist/plugins/copyFile/index.d.mts +1 -1
  74. package/dist/plugins/copyFile/index.d.ts +1 -1
  75. package/dist/plugins/copyFile/index.mjs +1 -1
  76. package/dist/plugins/envGuard/index.cjs +11 -11
  77. package/dist/plugins/envGuard/index.d.cts +101 -2
  78. package/dist/plugins/envGuard/index.d.mts +101 -2
  79. package/dist/plugins/envGuard/index.d.ts +101 -2
  80. package/dist/plugins/envGuard/index.mjs +9 -9
  81. package/dist/plugins/faviconManager/index.cjs +1 -1
  82. package/dist/plugins/faviconManager/index.d.cts +1 -1
  83. package/dist/plugins/faviconManager/index.d.mts +1 -1
  84. package/dist/plugins/faviconManager/index.d.ts +1 -1
  85. package/dist/plugins/faviconManager/index.mjs +1 -1
  86. package/dist/plugins/generateRouter/index.cjs +5 -4
  87. package/dist/plugins/generateRouter/index.d.cts +34 -1
  88. package/dist/plugins/generateRouter/index.d.mts +34 -1
  89. package/dist/plugins/generateRouter/index.d.ts +34 -1
  90. package/dist/plugins/generateRouter/index.mjs +5 -4
  91. package/dist/plugins/generateVersion/index.cjs +1 -1
  92. package/dist/plugins/generateVersion/index.d.cts +1 -1
  93. package/dist/plugins/generateVersion/index.d.mts +1 -1
  94. package/dist/plugins/generateVersion/index.d.ts +1 -1
  95. package/dist/plugins/generateVersion/index.mjs +1 -1
  96. package/dist/plugins/htmlInject/index.cjs +7 -1
  97. package/dist/plugins/htmlInject/index.d.cts +2 -2
  98. package/dist/plugins/htmlInject/index.d.mts +2 -2
  99. package/dist/plugins/htmlInject/index.d.ts +2 -2
  100. package/dist/plugins/htmlInject/index.mjs +7 -1
  101. package/dist/plugins/index.cjs +1 -1
  102. package/dist/plugins/index.d.cts +3 -3
  103. package/dist/plugins/index.d.mts +3 -3
  104. package/dist/plugins/index.d.ts +3 -3
  105. package/dist/plugins/index.mjs +1 -1
  106. package/dist/plugins/loadingManager/index.cjs +26 -26
  107. package/dist/plugins/loadingManager/index.d.cts +1 -1
  108. package/dist/plugins/loadingManager/index.d.mts +1 -1
  109. package/dist/plugins/loadingManager/index.d.ts +1 -1
  110. package/dist/plugins/loadingManager/index.mjs +10 -10
  111. package/dist/plugins/versionUpdateChecker/index.cjs +5 -5
  112. package/dist/plugins/versionUpdateChecker/index.d.cts +1 -1
  113. package/dist/plugins/versionUpdateChecker/index.d.mts +1 -1
  114. package/dist/plugins/versionUpdateChecker/index.d.ts +1 -1
  115. package/dist/plugins/versionUpdateChecker/index.mjs +6 -6
  116. package/dist/shared/vite-plugin.B8FuZce1.d.cts +45 -0
  117. package/dist/shared/vite-plugin.B8FuZce1.d.mts +45 -0
  118. package/dist/shared/vite-plugin.B8FuZce1.d.ts +45 -0
  119. package/dist/shared/{vite-plugin.FfJ-Wwfu.d.cts → vite-plugin.BI9taN75.d.cts} +1 -22
  120. package/dist/shared/{vite-plugin.FfJ-Wwfu.d.mts → vite-plugin.BI9taN75.d.mts} +1 -22
  121. package/dist/shared/{vite-plugin.FfJ-Wwfu.d.ts → vite-plugin.BI9taN75.d.ts} +1 -22
  122. package/dist/shared/vite-plugin.CcvHfrL8.cjs +1 -0
  123. package/dist/shared/vite-plugin.CuXEJAWX.mjs +1 -0
  124. package/package.json +7 -17
  125. package/dist/common/compress/index.cjs +0 -1
  126. package/dist/common/compress/index.d.cts +0 -23
  127. package/dist/common/compress/index.d.mts +0 -23
  128. package/dist/common/compress/index.d.ts +0 -23
  129. package/dist/common/compress/index.mjs +0 -1
  130. package/dist/common/object/index.cjs +0 -1
  131. package/dist/common/object/index.d.cts +0 -30
  132. package/dist/common/object/index.d.mts +0 -30
  133. package/dist/common/object/index.d.ts +0 -30
  134. package/dist/common/object/index.mjs +0 -1
  135. package/dist/common/path/index.cjs +0 -1
  136. package/dist/common/path/index.d.cts +0 -22
  137. package/dist/common/path/index.d.mts +0 -22
  138. package/dist/common/path/index.d.ts +0 -22
  139. package/dist/common/path/index.mjs +0 -1
  140. package/dist/shared/vite-plugin.BCuhU1au.mjs +0 -7
  141. package/dist/shared/vite-plugin.BrI73DHA.cjs +0 -7
  142. package/dist/shared/vite-plugin.CLr0ttuO.d.cts +0 -135
  143. package/dist/shared/vite-plugin.CLr0ttuO.d.mts +0 -135
  144. package/dist/shared/vite-plugin.CLr0ttuO.d.ts +0 -135
  145. package/dist/shared/vite-plugin.CmtcnItg.d.cts +0 -261
  146. package/dist/shared/vite-plugin.CmtcnItg.d.mts +0 -261
  147. package/dist/shared/vite-plugin.CmtcnItg.d.ts +0 -261
  148. package/dist/shared/vite-plugin.DnFDPjNf.mjs +0 -1
  149. package/dist/shared/vite-plugin.Dumot0up.mjs +0 -1
  150. package/dist/shared/vite-plugin.soT9a-KD.cjs +0 -1
  151. package/dist/shared/vite-plugin.vwox4bU0.cjs +0 -1
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.cjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.cjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.mjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.mjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.js';
3
+ import '../../shared/vite-plugin.B8FuZce1.js';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
5
5
 
6
6
  /**
@@ -1,4 +1,4 @@
1
- import{createPluginFactory as x,BasePlugin as b}from"../../factory/index.mjs";import m from"node:fs";import f from"node:path";import{calculateGzipSize as v}from"../../common/compress/index.mjs";import{isNodeModule as z}from"../../common/path/index.mjs";import{scanDirectory as S,writeJsonReport as w,writeFileContent as $}from"../../common/fs/index.mjs";import{formatFileSize as c}from"../../common/format/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"node:zlib";import"node:stream/promises";import"node:stream";import"fs";import"path";import"crypto";async function F(r,s={}){return S(r,{includeExtensions:s.includeExtensions,excludePatterns:s.excludePatterns})}function A(r){const s=r.reduce((a,n)=>a+n.size,0),e=new Map;for(const a of r){const n=a.extension||"(no ext)",t=e.get(n)||{count:0,totalSize:0};t.count++,t.totalSize+=a.size,e.set(n,t)}return Array.from(e.entries()).map(([a,{count:n,totalSize:t}])=>({extension:a,count:n,totalSize:t,percentage:s>0?Number((t/s*100).toFixed(1)):0})).sort((a,n)=>n.totalSize-a.totalSize)}function M(r,s){const e=[],a=s*1024;for(const n of r){n.size>a&&e.push({level:"chunk",name:n.name,sizeKB:Number((n.size/1024).toFixed(1)),thresholdKB:s,message:`Chunk "${n.name}" \u8D85\u8FC7\u9608\u503C: ${(n.size/1024).toFixed(1)}KB > ${s}KB`});for(const t of n.modules)t.size>a&&e.push({level:"module",name:t.id,sizeKB:Number((t.size/1024).toFixed(1)),thresholdKB:s,message:`\u6A21\u5757 "${t.id}" \u8D85\u8FC7\u9608\u503C: ${(t.size/1024).toFixed(1)}KB > ${s}KB`})}return e}function C(r,s,e){const a=[];for(const n of r)for(const t of n.modules)e&&t.isNodeModule||a.push(t);return a.sort((n,t)=>t.size-n.size).slice(0,s)}async function k(r,s,e={}){const{gzipSize:a=!0,excludeNodeModules:n=!1}=e,t=[];for(const o of s){const d=f.relative(r,o.filePath),l=d.replace(/\\/g,"/"),i=o.extension;let u="chunk";i===".html"?u="entry":[".js",".mjs",".cjs",".css",".html"].includes(i)||(u="asset");let h=0;if(a)try{const y=await m.promises.readFile(o.filePath);h=await v(y)}catch{h=0}const p=z(d),g={id:l,size:o.size,gzipSize:h,chunks:[l],imports:[],isEntry:u==="entry",isNodeModule:p};n&&p||t.push({name:l,size:o.size,gzipSize:h,modules:[g],type:u,fileCount:1})}return t.sort((o,d)=>d.size-o.size)}async function B(r,s){const e=Date.now(),a=await F(r,{includeExtensions:s.includeExtensions,excludePatterns:s.excludePatterns}),n=await k(r,a,{gzipSize:s.gzipSize,excludeNodeModules:s.excludeNodeModules}),t=s.excludeNodeModules?a.filter(p=>!z(f.relative(r,p.filePath))):a,o=A(t),d=C(n,s.topModules,s.excludeNodeModules),l=M(n,s.sizeThreshold),i=n.reduce((p,g)=>p+g.size,0),u=n.reduce((p,g)=>p+g.gzipSize,0),h=Date.now()-e;return{timestamp:new Date().toISOString(),totalSize:i,totalGzipSize:u,chunks:n,topModules:d,fileTypeDistribution:o,warnings:l,comparisonDiffs:[],analysisTime:h}}async function D(r){try{const s=f.isAbsolute(r)?r:f.resolve(process.cwd(),r);if(!await m.promises.access(s,m.constants.F_OK).then(()=>!0).catch(()=>!1))return null;const e=await m.promises.readFile(s,"utf-8");return JSON.parse(e)}catch{return null}}function E(r,s){const e=[],a=new Map;for(const t of s.chunks)a.set(t.name,t.size);const n=new Map;for(const t of r.chunks)n.set(t.name,t.size);for(const[t,o]of n){const d=a.get(t);if(d===void 0)e.push({name:t,previousSize:-1,currentSize:o,diff:o,diffPercentage:100,trend:"added"});else{const l=o-d,i=d>0?Number((l/d*100).toFixed(1)):0;e.push({name:t,previousSize:d,currentSize:o,diff:l,diffPercentage:i,trend:l>0?"increased":l<0?"decreased":"unchanged"})}}for(const[t,o]of a)n.has(t)||e.push({name:t,previousSize:o,currentSize:-1,diff:-o,diffPercentage:-100,trend:"removed"});return e.sort((t,o)=>Math.abs(o.diff)-Math.abs(t.diff))}async function T(r,s,e){const a=f.join(r,`${s}.json`),n={timestamp:e.timestamp,summary:{totalSize:e.totalSize,totalGzipSize:e.totalGzipSize,totalSizeFormatted:c(e.totalSize),totalGzipSizeFormatted:c(e.totalGzipSize),chunkCount:e.chunks.length,warningCount:e.warnings.length,analysisTime:e.analysisTime},chunks:e.chunks.map(t=>({name:t.name,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),type:t.type,fileCount:t.fileCount,modules:t.modules.map(o=>({id:o.id,size:o.size,sizeFormatted:c(o.size),gzipSize:o.gzipSize,gzipSizeFormatted:c(o.gzipSize),isEntry:o.isEntry,isNodeModule:o.isNodeModule,imports:o.imports}))})),topModules:e.topModules.map(t=>({id:t.id,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),isNodeModule:t.isNodeModule})),fileTypeDistribution:e.fileTypeDistribution,warnings:e.warnings,comparisonDiffs:e.comparisonDiffs};return await w(a,n),a}async function R(r,s,e,a={}){const n=f.join(r,`${s}.html`),t=a.defaultChartType||"treemap",o=e.chunks.map(p=>({name:p.name,size:p.size,gzipSize:p.gzipSize,type:p.type})),d=e.fileTypeDistribution,l=e.warnings,i=e.comparisonDiffs,u=e.topModules.slice(0,10),h=P(e,o,d,l,i,u,t);return await $(n,h),n}function P(r,s,e,a,n,t,o){const d=c(r.totalSize),l=c(r.totalGzipSize);return`<!DOCTYPE html>
1
+ import{createPluginFactory as x,BasePlugin as b}from"../../factory/index.mjs";import m from"node:fs";import f from"node:path";import v from"node:zlib";import{promisify as S}from"node:util";import{scanDirectory as w,writeJsonReport as $,writeFileContent as F}from"../../common/fs/index.mjs";import{formatFileSize as c}from"../../common/format/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";const A=S(v.gzip);async function M(a){const i=Buffer.isBuffer(a)?a:Buffer.from(a,"utf-8");return(await A(i)).length}function z(a){return a.includes("node_modules")||a.startsWith("\0")||a.startsWith("virtual:")}async function C(a,i={}){return w(a,{includeExtensions:i.includeExtensions,excludePatterns:i.excludePatterns})}function B(a){const i=a.reduce((o,n)=>o+n.size,0),e=new Map;for(const o of a){const n=o.extension||"(no ext)",t=e.get(n)||{count:0,totalSize:0};t.count++,t.totalSize+=o.size,e.set(n,t)}return Array.from(e.entries()).map(([o,{count:n,totalSize:t}])=>({extension:o,count:n,totalSize:t,percentage:i>0?Number((t/i*100).toFixed(1)):0})).sort((o,n)=>n.totalSize-o.totalSize)}function k(a,i){const e=[],o=i*1024;for(const n of a){n.size>o&&e.push({level:"chunk",name:n.name,sizeKB:Number((n.size/1024).toFixed(1)),thresholdKB:i,message:`Chunk "${n.name}" \u8D85\u8FC7\u9608\u503C: ${(n.size/1024).toFixed(1)}KB > ${i}KB`});for(const t of n.modules)t.size>o&&e.push({level:"module",name:t.id,sizeKB:Number((t.size/1024).toFixed(1)),thresholdKB:i,message:`\u6A21\u5757 "${t.id}" \u8D85\u8FC7\u9608\u503C: ${(t.size/1024).toFixed(1)}KB > ${i}KB`})}return e}function D(a,i,e){const o=[];for(const n of a)for(const t of n.modules)e&&t.isNodeModule||o.push(t);return o.sort((n,t)=>t.size-n.size).slice(0,i)}async function E(a,i,e={}){const{gzipSize:o=!0,excludeNodeModules:n=!1}=e,t=[];for(const r of i){const d=f.relative(a,r.filePath),l=d.replace(/\\/g,"/"),s=r.extension;let u="chunk";s===".html"?u="entry":[".js",".mjs",".cjs",".css",".html"].includes(s)||(u="asset");let h=0;if(o)try{const y=await m.promises.readFile(r.filePath);h=await M(y)}catch{h=0}const p=z(d),g={id:l,size:r.size,gzipSize:h,chunks:[l],imports:[],isEntry:u==="entry",isNodeModule:p};n&&p||t.push({name:l,size:r.size,gzipSize:h,modules:[g],type:u,fileCount:1})}return t.sort((r,d)=>d.size-r.size)}async function T(a,i){const e=Date.now(),o=await C(a,{includeExtensions:i.includeExtensions,excludePatterns:i.excludePatterns}),n=await E(a,o,{gzipSize:i.gzipSize,excludeNodeModules:i.excludeNodeModules}),t=i.excludeNodeModules?o.filter(p=>!z(f.relative(a,p.filePath))):o,r=B(t),d=D(n,i.topModules,i.excludeNodeModules),l=k(n,i.sizeThreshold),s=n.reduce((p,g)=>p+g.size,0),u=n.reduce((p,g)=>p+g.gzipSize,0),h=Date.now()-e;return{timestamp:new Date().toISOString(),totalSize:s,totalGzipSize:u,chunks:n,topModules:d,fileTypeDistribution:r,warnings:l,comparisonDiffs:[],analysisTime:h}}async function R(a){try{const i=f.isAbsolute(a)?a:f.resolve(process.cwd(),a);if(!await m.promises.access(i,m.constants.F_OK).then(()=>!0).catch(()=>!1))return null;const e=await m.promises.readFile(i,"utf-8");return JSON.parse(e)}catch{return null}}function P(a,i){const e=[],o=new Map;for(const t of i.chunks)o.set(t.name,t.size);const n=new Map;for(const t of a.chunks)n.set(t.name,t.size);for(const[t,r]of n){const d=o.get(t);if(d===void 0)e.push({name:t,previousSize:-1,currentSize:r,diff:r,diffPercentage:100,trend:"added"});else{const l=r-d,s=d>0?Number((l/d*100).toFixed(1)):0;e.push({name:t,previousSize:d,currentSize:r,diff:l,diffPercentage:s,trend:l>0?"increased":l<0?"decreased":"unchanged"})}}for(const[t,r]of o)n.has(t)||e.push({name:t,previousSize:r,currentSize:-1,diff:-r,diffPercentage:-100,trend:"removed"});return e.sort((t,r)=>Math.abs(r.diff)-Math.abs(t.diff))}async function N(a,i,e){const o=f.join(a,`${i}.json`),n={timestamp:e.timestamp,summary:{totalSize:e.totalSize,totalGzipSize:e.totalGzipSize,totalSizeFormatted:c(e.totalSize),totalGzipSizeFormatted:c(e.totalGzipSize),chunkCount:e.chunks.length,warningCount:e.warnings.length,analysisTime:e.analysisTime},chunks:e.chunks.map(t=>({name:t.name,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),type:t.type,fileCount:t.fileCount,modules:t.modules.map(r=>({id:r.id,size:r.size,sizeFormatted:c(r.size),gzipSize:r.gzipSize,gzipSizeFormatted:c(r.gzipSize),isEntry:r.isEntry,isNodeModule:r.isNodeModule,imports:r.imports}))})),topModules:e.topModules.map(t=>({id:t.id,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),isNodeModule:t.isNodeModule})),fileTypeDistribution:e.fileTypeDistribution,warnings:e.warnings,comparisonDiffs:e.comparisonDiffs};return await $(o,n),o}async function O(a,i,e,o={}){const n=f.join(a,`${i}.html`),t=o.defaultChartType||"treemap",r=e.chunks.map(p=>({name:p.name,size:p.size,gzipSize:p.gzipSize,type:p.type})),d=e.fileTypeDistribution,l=e.warnings,s=e.comparisonDiffs,u=e.topModules.slice(0,10),h=L(e,r,d,l,s,u,t);return await F(n,h),n}function L(a,i,e,o,n,t,r){const d=c(a.totalSize),l=c(a.totalGzipSize);return`<!DOCTYPE html>
2
2
  <html lang="zh-CN">
3
3
  <head>
4
4
  <meta charset="UTF-8">
@@ -53,7 +53,7 @@ tr:hover { background: #f8f9ff; }
53
53
  <div class="container">
54
54
  <div class="header">
55
55
  <h1>Bundle Analysis Report</h1>
56
- <div class="meta">Generated: ${r.timestamp} | Analysis time: ${r.analysisTime}ms</div>
56
+ <div class="meta">Generated: ${a.timestamp} | Analysis time: ${a.analysisTime}ms</div>
57
57
  </div>
58
58
 
59
59
  <div class="summary-cards">
@@ -64,13 +64,13 @@ tr:hover { background: #f8f9ff; }
64
64
  </div>
65
65
  <div class="card">
66
66
  <div class="label">Chunks</div>
67
- <div class="value">${r.chunks.length}</div>
68
- <div class="sub">entry: ${r.chunks.filter(i=>i.type==="entry").length} | chunk: ${r.chunks.filter(i=>i.type==="chunk").length} | asset: ${r.chunks.filter(i=>i.type==="asset").length}</div>
67
+ <div class="value">${a.chunks.length}</div>
68
+ <div class="sub">entry: ${a.chunks.filter(s=>s.type==="entry").length} | chunk: ${a.chunks.filter(s=>s.type==="chunk").length} | asset: ${a.chunks.filter(s=>s.type==="asset").length}</div>
69
69
  </div>
70
70
  <div class="card">
71
71
  <div class="label">Warnings</div>
72
- <div class="value">${a.length}</div>
73
- <div class="sub">${a.length>0?"threshold exceeded":"all within limits"}</div>
72
+ <div class="value">${o.length}</div>
73
+ <div class="sub">${o.length>0?"threshold exceeded":"all within limits"}</div>
74
74
  </div>
75
75
  <div class="card">
76
76
  <div class="label">File Types</div>
@@ -79,19 +79,19 @@ tr:hover { background: #f8f9ff; }
79
79
  </div>
80
80
  </div>
81
81
 
82
- ${a.length>0?`
82
+ ${o.length>0?`
83
83
  <div class="section">
84
84
  <h2>Warnings</h2>
85
- ${a.map(i=>`<div class="warning ${i.sizeKB>i.thresholdKB*2?"critical":""}"><strong>${i.level.toUpperCase()}</strong>: ${i.message}</div>`).join("")}
85
+ ${o.map(s=>`<div class="warning ${s.sizeKB>s.thresholdKB*2?"critical":""}"><strong>${s.level.toUpperCase()}</strong>: ${s.message}</div>`).join("")}
86
86
  </div>
87
87
  `:""}
88
88
 
89
89
  <div class="section">
90
90
  <h2>Size Distribution</h2>
91
91
  <div class="chart-tabs">
92
- <button class="chart-tab ${o==="treemap"?"active":""}" onclick="switchChart('treemap')">Treemap</button>
93
- <button class="chart-tab ${o==="sunburst"?"active":""}" onclick="switchChart('sunburst')">Sunburst</button>
94
- <button class="chart-tab ${o==="list"?"active":""}" onclick="switchChart('list')">List</button>
92
+ <button class="chart-tab ${r==="treemap"?"active":""}" onclick="switchChart('treemap')">Treemap</button>
93
+ <button class="chart-tab ${r==="sunburst"?"active":""}" onclick="switchChart('sunburst')">Sunburst</button>
94
+ <button class="chart-tab ${r==="list"?"active":""}" onclick="switchChart('list')">List</button>
95
95
  </div>
96
96
  <div class="chart-container" id="chartContainer"></div>
97
97
  </div>
@@ -109,7 +109,7 @@ ${a.map(i=>`<div class="warning ${i.sizeKB>i.thresholdKB*2?"critical":""}"><stro
109
109
  <table>
110
110
  <thead><tr><th>#</th><th>Module</th><th>Size</th><th>gzip</th><th>Type</th></tr></thead>
111
111
  <tbody>
112
- ${t.map((i,u)=>`<tr><td>${u+1}</td><td title="${i.id}">${i.id.length>60?i.id.slice(0,57)+"...":i.id}</td><td>${c(i.size)}</td><td>${c(i.gzipSize)}</td><td>${i.isNodeModule?"node_modules":"source"}</td></tr>`).join("")}
112
+ ${t.map((s,u)=>`<tr><td>${u+1}</td><td title="${s.id}">${s.id.length>60?s.id.slice(0,57)+"...":s.id}</td><td>${c(s.size)}</td><td>${c(s.gzipSize)}</td><td>${s.isNodeModule?"node_modules":"source"}</td></tr>`).join("")}
113
113
  </tbody>
114
114
  </table>
115
115
  </div>
@@ -120,7 +120,7 @@ ${n.length>0?`
120
120
  <table>
121
121
  <thead><tr><th>Name</th><th>Previous</th><th>Current</th><th>Diff</th><th>Trend</th></tr></thead>
122
122
  <tbody>
123
- ${n.slice(0,20).map(i=>{const u=i.trend==="increased"?"diff-positive":i.trend==="decreased"?"diff-negative":i.trend==="added"?"diff-added":i.trend==="removed"?"diff-removed":"diff-unchanged",h=i.trend==="increased"?"&#9650;":i.trend==="decreased"?"&#9660;":i.trend==="added"?"&#10010;":i.trend==="removed"?"&#10006;":"&#9644;";return`<tr><td>${i.name}</td><td>${i.previousSize>=0?c(i.previousSize):"-"}</td><td>${i.currentSize>=0?c(i.currentSize):"-"}</td><td class="${u}">${i.diff>=0?"+":""}${c(Math.abs(i.diff))} (${i.diffPercentage}%)</td><td class="${u}">${h} ${i.trend}</td></tr>`}).join("")}
123
+ ${n.slice(0,20).map(s=>{const u=s.trend==="increased"?"diff-positive":s.trend==="decreased"?"diff-negative":s.trend==="added"?"diff-added":s.trend==="removed"?"diff-removed":"diff-unchanged",h=s.trend==="increased"?"&#9650;":s.trend==="decreased"?"&#9660;":s.trend==="added"?"&#10010;":s.trend==="removed"?"&#10006;":"&#9644;";return`<tr><td>${s.name}</td><td>${s.previousSize>=0?c(s.previousSize):"-"}</td><td>${s.currentSize>=0?c(s.currentSize):"-"}</td><td class="${u}">${s.diff>=0?"+":""}${c(Math.abs(s.diff))} (${s.diffPercentage}%)</td><td class="${u}">${h} ${s.trend}</td></tr>`}).join("")}
124
124
  </tbody>
125
125
  </table>
126
126
  </div>
@@ -131,15 +131,15 @@ ${n.slice(0,20).map(i=>{const u=i.trend==="increased"?"diff-positive":i.trend===
131
131
  <table>
132
132
  <thead><tr><th>Name</th><th>Size</th><th>gzip</th><th>Type</th><th>Proportion</th></tr></thead>
133
133
  <tbody>
134
- ${r.chunks.map(i=>{const u=r.totalSize>0?i.size/r.totalSize*100:0;return`<tr><td title="${i.name}">${i.name.length>50?i.name.slice(0,47)+"...":i.name}</td><td>${c(i.size)}</td><td>${c(i.gzipSize)}</td><td>${i.type}</td><td><div class="bar-bg"><div class="bar" style="width:${u}%"></div></div><span style="font-size:11px;color:#888;">${u.toFixed(1)}%</span></td></tr>`}).join("")}
134
+ ${a.chunks.map(s=>{const u=a.totalSize>0?s.size/a.totalSize*100:0;return`<tr><td title="${s.name}">${s.name.length>50?s.name.slice(0,47)+"...":s.name}</td><td>${c(s.size)}</td><td>${c(s.gzipSize)}</td><td>${s.type}</td><td><div class="bar-bg"><div class="bar" style="width:${u}%"></div></div><span style="font-size:11px;color:#888;">${u.toFixed(1)}%</span></td></tr>`}).join("")}
135
135
  </tbody>
136
136
  </table>
137
137
  </div>
138
138
  </div>
139
139
 
140
140
  <script>
141
- const chartData = ${JSON.stringify(s)};
142
- const totalSize = ${r.totalSize};
141
+ const chartData = ${JSON.stringify(i)};
142
+ const totalSize = ${a.totalSize};
143
143
  const distributionData = ${JSON.stringify(e)};
144
144
  const COLORS = ['#667eea','#764ba2','#f093fb','#f5576c','#4facfe','#00f2fe','#43e97b','#fa709a','#fee140','#a18cd1','#fbc2eb','#a6c1ee','#ffecd2','#fcb69f','#ff9a9e','#fad0c4'];
145
145
 
@@ -228,8 +228,8 @@ function renderPieChart() {
228
228
  legend.innerHTML = items.map((d, i) => '<div class="legend-item"><div class="legend-color" style="background:' + COLORS[i % COLORS.length] + '"></div><span>' + d.extension + ' (' + d.percentage.toFixed(1) + '%)</span></div>').join('');
229
229
  }
230
230
 
231
- renderChart('${o}');
231
+ renderChart('${r}');
232
232
  renderPieChart();
233
233
  <\/script>
234
234
  </body>
235
- </html>`}class N extends b{analysisResult=null;getDefaultOptions(){return{outputFormat:"json",outputFile:"bundle-analysis",openAnalyzer:!1,sizeThreshold:100,topModules:20,compareWith:null,gzipSize:!0,excludeNodeModules:!1,excludePatterns:[],includeExtensions:[],defaultChartType:"treemap"}}validateOptions(){this.validator.field("outputFormat").enum(["json","html","both"]).field("openAnalyzer").boolean().field("sizeThreshold").number().minValue(0).field("topModules").number().minValue(1).field("gzipSize").boolean().field("excludeNodeModules").boolean().field("defaultChartType").enum(["treemap","sunburst","list"]).validate()}getPluginName(){return"bundle-analyzer"}getEnforce(){return"post"}addPluginHooks(s){s.writeBundle={order:"post",handler:async()=>{await this.safeExecute(()=>this.runAnalysis(),"\u5206\u6790\u6784\u5EFA\u4EA7\u7269")}}}async runAnalysis(){if(!this.viteConfig)return;const s=this.viteConfig.build.outDir;this.analysisResult=await B(s,this.options),this.options.compareWith&&await this.performComparison(),this.logSummary(),this.logWarnings(),await this.generateReports(s),this.options.openAnalyzer&&(this.options.outputFormat==="html"||this.options.outputFormat==="both")&&await this.openHtmlReport(s)}async performComparison(){if(!this.analysisResult||!this.options.compareWith)return;const s=await D(this.options.compareWith);if(!s){this.logger.info(`\u672A\u627E\u5230\u5BF9\u6BD4\u62A5\u544A: ${this.options.compareWith}\uFF0C\u8DF3\u8FC7\u5BF9\u6BD4\u5206\u6790`);return}const e=E(this.analysisResult,s);if(this.analysisResult.comparisonDiffs=e,e.length>0){const a=e.filter(d=>d.trend==="increased").length,n=e.filter(d=>d.trend==="decreased").length,t=e.filter(d=>d.trend==="added").length,o=e.filter(d=>d.trend==="removed").length;this.logger.info(`\u6784\u5EFA\u5BF9\u6BD4: ${a} \u4E2A\u589E\u5927, ${n} \u4E2A\u51CF\u5C0F, ${t} \u4E2A\u65B0\u589E, ${o} \u4E2A\u79FB\u9664`)}}async generateReports(s){if(!this.analysisResult)return;const{outputFormat:e,outputFile:a}=this.options;if(e==="json"||e==="both"){const n=await T(s,a,this.analysisResult);this.logger.info(`JSON \u62A5\u544A\u5DF2\u751F\u6210: ${n}`)}if(e==="html"||e==="both"){const n=await R(s,a,this.analysisResult,{defaultChartType:this.options.defaultChartType});this.logger.info(`HTML \u62A5\u544A\u5DF2\u751F\u6210: ${n}`)}}async openHtmlReport(s){const e=`${s}/${this.options.outputFile}.html`;try{const{exec:a}=await import("node:child_process"),n=process.platform;a(n==="win32"?`start "" "${e}"`:n==="darwin"?`open "${e}"`:`xdg-open "${e}"`),this.logger.info(`\u5DF2\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u62A5\u544A: ${e}`)}catch{this.logger.warn(`\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00: ${e}`)}}logSummary(){if(!this.analysisResult)return;const{chunks:s,totalSize:e,totalGzipSize:a,analysisTime:n}=this.analysisResult;this.logger.success(`\u4EA7\u7269\u5206\u6790\u5B8C\u6210: ${s.length} \u4E2A chunk, \u603B\u4F53\u79EF: ${c(e)} (gzip: ${c(a)}), \u5206\u6790\u8017\u65F6: ${n}ms`);const t=s.filter(l=>l.type==="entry").length,o=s.filter(l=>l.type==="chunk").length,d=s.filter(l=>l.type==="asset").length;if((t>0||o>0||d>0)&&this.logger.info(` \u5165\u53E3: ${t} | \u4EE3\u7801\u5757: ${o} | \u8D44\u6E90: ${d}`),this.analysisResult.topModules.length>0){this.logger.info("\u4F53\u79EF Top 5 \u6A21\u5757:");const l=this.analysisResult.topModules.slice(0,5);for(let i=0;i<l.length;i++){const u=l[i],h=u.isNodeModule?"node_modules":"source";this.logger.info(` ${i+1}. ${c(u.size)} (${h}) ${u.id}`)}}}logWarnings(){if(!(!this.analysisResult||this.analysisResult.warnings.length===0)){this.logger.warn(`\u53D1\u73B0 ${this.analysisResult.warnings.length} \u4E2A\u4F53\u79EF\u544A\u8B66:`);for(const s of this.analysisResult.warnings){const e=s.sizeKB>s.thresholdKB*2?"\u{1F534}":"\u{1F7E1}";this.logger.warn(` ${e} ${s.message}`)}}}getResult(){return this.analysisResult}}const O=x(N);export{O as bundleAnalyzer};
235
+ </html>`}class j extends b{analysisResult=null;getDefaultOptions(){return{outputFormat:"json",outputFile:"bundle-analysis",openAnalyzer:!1,sizeThreshold:100,topModules:20,compareWith:null,gzipSize:!0,excludeNodeModules:!1,excludePatterns:[],includeExtensions:[],defaultChartType:"treemap"}}validateOptions(){this.validator.field("outputFormat").enum(["json","html","both"]).field("openAnalyzer").boolean().field("sizeThreshold").number().minValue(0).field("topModules").number().minValue(1).field("gzipSize").boolean().field("excludeNodeModules").boolean().field("defaultChartType").enum(["treemap","sunburst","list"]).validate()}getPluginName(){return"bundle-analyzer"}getEnforce(){return"post"}addPluginHooks(i){i.writeBundle={order:"post",handler:async()=>{await this.safeExecute(()=>this.runAnalysis(),"\u5206\u6790\u6784\u5EFA\u4EA7\u7269")}}}async runAnalysis(){if(!this.viteConfig)return;const i=this.viteConfig.build.outDir;this.analysisResult=await T(i,this.options),this.options.compareWith&&await this.performComparison(),this.logSummary(),this.logWarnings(),await this.generateReports(i),this.options.openAnalyzer&&(this.options.outputFormat==="html"||this.options.outputFormat==="both")&&await this.openHtmlReport(i)}async performComparison(){if(!this.analysisResult||!this.options.compareWith)return;const i=await R(this.options.compareWith);if(!i){this.logger.info(`\u672A\u627E\u5230\u5BF9\u6BD4\u62A5\u544A: ${this.options.compareWith}\uFF0C\u8DF3\u8FC7\u5BF9\u6BD4\u5206\u6790`);return}const e=P(this.analysisResult,i);if(this.analysisResult.comparisonDiffs=e,e.length>0){const o=e.filter(d=>d.trend==="increased").length,n=e.filter(d=>d.trend==="decreased").length,t=e.filter(d=>d.trend==="added").length,r=e.filter(d=>d.trend==="removed").length;this.logger.info(`\u6784\u5EFA\u5BF9\u6BD4: ${o} \u4E2A\u589E\u5927, ${n} \u4E2A\u51CF\u5C0F, ${t} \u4E2A\u65B0\u589E, ${r} \u4E2A\u79FB\u9664`)}}async generateReports(i){if(!this.analysisResult)return;const{outputFormat:e,outputFile:o}=this.options;if(e==="json"||e==="both"){const n=await N(i,o,this.analysisResult);this.logger.info(`JSON \u62A5\u544A\u5DF2\u751F\u6210: ${n}`)}if(e==="html"||e==="both"){const n=await O(i,o,this.analysisResult,{defaultChartType:this.options.defaultChartType});this.logger.info(`HTML \u62A5\u544A\u5DF2\u751F\u6210: ${n}`)}}async openHtmlReport(i){const e=`${i}/${this.options.outputFile}.html`;try{const{exec:o}=await import("node:child_process"),n=process.platform;o(n==="win32"?`start "" "${e}"`:n==="darwin"?`open "${e}"`:`xdg-open "${e}"`),this.logger.info(`\u5DF2\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u62A5\u544A: ${e}`)}catch{this.logger.warn(`\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u6253\u5F00: ${e}`)}}logSummary(){if(!this.analysisResult)return;const{chunks:i,totalSize:e,totalGzipSize:o,analysisTime:n}=this.analysisResult;this.logger.success(`\u4EA7\u7269\u5206\u6790\u5B8C\u6210: ${i.length} \u4E2A chunk, \u603B\u4F53\u79EF: ${c(e)} (gzip: ${c(o)}), \u5206\u6790\u8017\u65F6: ${n}ms`);const t=i.filter(l=>l.type==="entry").length,r=i.filter(l=>l.type==="chunk").length,d=i.filter(l=>l.type==="asset").length;if((t>0||r>0||d>0)&&this.logger.info(` \u5165\u53E3: ${t} | \u4EE3\u7801\u5757: ${r} | \u8D44\u6E90: ${d}`),this.analysisResult.topModules.length>0){this.logger.info("\u4F53\u79EF Top 5 \u6A21\u5757:");const l=this.analysisResult.topModules.slice(0,5);for(let s=0;s<l.length;s++){const u=l[s],h=u.isNodeModule?"node_modules":"source";this.logger.info(` ${s+1}. ${c(u.size)} (${h}) ${u.id}`)}}}logWarnings(){if(!(!this.analysisResult||this.analysisResult.warnings.length===0)){this.logger.warn(`\u53D1\u73B0 ${this.analysisResult.warnings.length} \u4E2A\u4F53\u79EF\u544A\u8B66:`);for(const i of this.analysisResult.warnings){const e=i.sizeKB>i.thresholdKB*2?"\u{1F534}":"\u{1F7E1}";this.logger.warn(` ${e} ${i.message}`)}}}getResult(){return this.analysisResult}}const K=x(j);export{K as bundleAnalyzer};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),node_zlib=require("node:zlib"),a=require("node:fs"),promises=require("node:stream/promises"),a$1=require("node:path"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path"),require("crypto");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const a__default=_interopDefaultCompat(a$1);async function compressFileGzip(e,t,i){const s=(await a.promises.stat(e)).size,r=node_zlib.createGzip({level:i});await promises.pipeline(a.createReadStream(e),r,a.createWriteStream(t));const o=(await a.promises.stat(t)).size;return{file:e,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"gzip"}}async function compressFileBrotli(e,t,i){const s=(await a.promises.stat(e)).size,r=node_zlib.createBrotliCompress({params:{[node_zlib.constants.BROTLI_PARAM_QUALITY]:i}});await promises.pipeline(a.createReadStream(e),r,a.createWriteStream(t));const o=(await a.promises.stat(t)).size;return{file:e,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"brotli"}}async function compressFile(e,t,i,s){const r=e+(t==="gzip"?".gz":".br");return t==="gzip"?compressFileGzip(e,r,i):compressFileBrotli(e,r,s)}function shouldCompressFile(e,t,i,s){const r=e.replace(/\\/g,"/");if(i<s.threshold||s.excludeExtensions.length>0&&s.excludeExtensions.includes(t)||s.includeExtensions.length>0&&!s.includeExtensions.includes(t))return!1;if(s.excludePaths.length>0)for(const o of s.excludePaths){const l=o.replace(/\\/g,"/");if(r.startsWith(l)||r.includes(l))return!1}return!(t===".gz"||t===".br")}async function scanDirectory(e,t){return(await common_fs_index.scanDirectory(e,{filter:(i,s,r)=>{const o=a__default.relative(e,i);return shouldCompressFile(o,s,r,t)}})).map(i=>({filePath:i.filePath,relativePath:a__default.relative(e,i.filePath),size:i.size,ext:i.extension}))}function buildSummary(e,t){const i=e.reduce((o,l)=>o+l.originalSize,0),s=e.reduce((o,l)=>o+l.compressedSize,0),r=i>0?Number(((1-s/i)*100).toFixed(1)):0;return{totalFiles:e.length,totalOriginalSize:i,totalCompressedSize:s,totalRatio:r,gzipFiles:e.filter(o=>o.algorithm==="gzip").length,brotliFiles:e.filter(o=>o.algorithm==="brotli").length,executionTime:t,stats:e}}async function writeReport(e,t,i){if(!t)return;const s=a__default.isAbsolute(t)?t:a__default.join(e,t),r={timestamp:new Date().toISOString(),summary:{totalFiles:i.totalFiles,totalOriginalSize:i.totalOriginalSize,totalCompressedSize:i.totalCompressedSize,totalRatio:i.totalRatio,gzipFiles:i.gzipFiles,brotliFiles:i.brotliFiles,executionTime:i.executionTime},files:i.stats.map(o=>({file:o.file,originalSize:o.originalSize,compressedSize:o.compressedSize,ratio:o.ratio,algorithm:o.algorithm}))};await common_fs_index.writeJsonReport(s,r)}async function deleteOriginalFiles(e){const t=[...new Set(e.map(i=>i.file))];for(const i of t)try{await a.promises.unlink(i)}catch{}}class y extends factory_index.BasePlugin{allStats=[];summary=null;getDefaultOptions(){return{algorithm:"gzip",threshold:1024,deleteOriginalFile:!1,includeExtensions:[".js",".css",".html",".svg",".json",".xml",".txt"],excludeExtensions:[],excludePaths:[],compressionLevel:9,brotliQuality:11,reportOutput:"compress-report.json",parallelLimit:10}}validateOptions(){this.validator.field("algorithm").enum(["gzip","brotli","both"]).field("threshold").number().minValue(0).field("deleteOriginalFile").boolean().field("includeExtensions").array().field("excludeExtensions").array().field("excludePaths").array().field("compressionLevel").number().minValue(1).maxValue(9).field("brotliQuality").number().minValue(1).maxValue(11).field("reportOutput").custom(t=>t===!1||typeof t=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("parallelLimit").number().minValue(1).maxValue(50).validate()}getPluginName(){return"compress-assets"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const t=this.viteConfig.build.outDir,i=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${t}`);const s=await scanDirectory(t,this.options);if(s.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${s.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const r=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const l of r){const u=await common_fs_index.runWithConcurrency(s,async n=>compressFile(n.filePath,l,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...u)}const o=Date.now()-i;this.summary=buildSummary(this.allStats,o),this.options.deleteOriginalFile&&(await deleteOriginalFiles(this.allStats),this.logger.info("\u5DF2\u5220\u9664\u539F\u59CB\u6587\u4EF6\uFF0C\u4EC5\u4FDD\u7559\u538B\u7F29\u7248\u672C")),this.options.reportOutput&&(await writeReport(t,this.options.reportOutput,this.summary),this.logger.info(`\u538B\u7F29\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)),this.logSummary()}logSummary(){if(!this.summary)return;const{totalFiles:t,totalOriginalSize:i,totalCompressedSize:s,totalRatio:r,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${common_format_index.formatFileSize(i)} \u2192 \u538B\u7F29\u540E: ${common_format_index.formatFileSize(s)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${o}ms`);const l=[...this.allStats].sort((u,n)=>n.ratio-u.ratio).slice(0,5);if(l.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const u of l)this.logger.info(` ${u.algorithm.toUpperCase().padEnd(6)} ${u.ratio}% ${common_format_index.formatFileSize(u.originalSize)} \u2192 ${common_format_index.formatFileSize(u.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const compressAssets=factory_index.createPluginFactory(y);exports.compressAssets=compressAssets;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),g=require("node:zlib"),u=require("node:fs"),promises=require("node:stream/promises"),l=require("node:path"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const l__default=_interopDefaultCompat(l);async function compressFileGzip(e,t,i){const s=(await u.promises.stat(e)).size,r=g.createGzip({level:i});await promises.pipeline(u.createReadStream(e),r,u.createWriteStream(t));const o=(await u.promises.stat(t)).size;return{file:e,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"gzip"}}async function compressFileBrotli(e,t,i){const s=(await u.promises.stat(e)).size,r=g.createBrotliCompress({params:{[g.constants.BROTLI_PARAM_QUALITY]:i}});await promises.pipeline(u.createReadStream(e),r,u.createWriteStream(t));const o=(await u.promises.stat(t)).size;return{file:e,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"brotli"}}async function compressFile(e,t,i,s){const r=e+(t==="gzip"?".gz":".br");return t==="gzip"?compressFileGzip(e,r,i):compressFileBrotli(e,r,s)}function shouldCompressFile(e,t,i,s){const r=e.replace(/\\/g,"/");if(i<s.threshold||s.excludeExtensions.length>0&&s.excludeExtensions.includes(t)||s.includeExtensions.length>0&&!s.includeExtensions.includes(t))return!1;if(s.excludePaths.length>0)for(const o of s.excludePaths){const a=o.replace(/\\/g,"/");if(r.startsWith(a)||r.includes(a))return!1}return!(t===".gz"||t===".br")}async function scanDirectory(e,t){return(await common_fs_index.scanDirectory(e,{filter:(i,s,r)=>{const o=l__default.relative(e,i);return shouldCompressFile(o,s,r,t)}})).map(i=>({filePath:i.filePath,relativePath:l__default.relative(e,i.filePath),size:i.size,ext:i.extension}))}function buildSummary(e,t){const i=e.reduce((o,a)=>o+a.originalSize,0),s=e.reduce((o,a)=>o+a.compressedSize,0),r=i>0?Number(((1-s/i)*100).toFixed(1)):0;return{totalFiles:e.length,totalOriginalSize:i,totalCompressedSize:s,totalRatio:r,gzipFiles:e.filter(o=>o.algorithm==="gzip").length,brotliFiles:e.filter(o=>o.algorithm==="brotli").length,executionTime:t,stats:e}}async function writeReport(e,t,i){if(!t)return;const s=l__default.isAbsolute(t)?t:l__default.join(e,t),r={timestamp:new Date().toISOString(),summary:{totalFiles:i.totalFiles,totalOriginalSize:i.totalOriginalSize,totalCompressedSize:i.totalCompressedSize,totalRatio:i.totalRatio,gzipFiles:i.gzipFiles,brotliFiles:i.brotliFiles,executionTime:i.executionTime},files:i.stats.map(o=>({file:o.file,originalSize:o.originalSize,compressedSize:o.compressedSize,ratio:o.ratio,algorithm:o.algorithm}))};await common_fs_index.writeJsonReport(s,r)}async function deleteOriginalFiles(e){const t=[...new Set(e.map(i=>i.file))];for(const i of t)try{await u.promises.unlink(i)}catch{}}async function y(e,t,i){const s=[];let r=0;async function o(){for(;r<e.length;){const n=r++,c=await t(e[n]);s[n]=c}}const a=Array(Math.min(i,e.length)).fill(null).map(()=>o());return await Promise.all(a),s}class S extends factory_index.BasePlugin{allStats=[];summary=null;getDefaultOptions(){return{algorithm:"gzip",threshold:1024,deleteOriginalFile:!1,includeExtensions:[".js",".css",".html",".svg",".json",".xml",".txt"],excludeExtensions:[],excludePaths:[],compressionLevel:9,brotliQuality:11,reportOutput:"compress-report.json",parallelLimit:10}}validateOptions(){this.validator.field("algorithm").enum(["gzip","brotli","both"]).field("threshold").number().minValue(0).field("deleteOriginalFile").boolean().field("includeExtensions").array().field("excludeExtensions").array().field("excludePaths").array().field("compressionLevel").number().minValue(1).maxValue(9).field("brotliQuality").number().minValue(1).maxValue(11).field("reportOutput").custom(t=>t===!1||typeof t=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("parallelLimit").number().minValue(1).maxValue(50).validate()}getPluginName(){return"compress-assets"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const t=this.viteConfig.build.outDir,i=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${t}`);const s=await scanDirectory(t,this.options);if(s.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${s.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const r=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const a of r){const n=await y(s,async c=>compressFile(c.filePath,a,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...n)}const o=Date.now()-i;this.summary=buildSummary(this.allStats,o),this.options.deleteOriginalFile&&(await deleteOriginalFiles(this.allStats),this.logger.info("\u5DF2\u5220\u9664\u539F\u59CB\u6587\u4EF6\uFF0C\u4EC5\u4FDD\u7559\u538B\u7F29\u7248\u672C")),this.options.reportOutput&&(await writeReport(t,this.options.reportOutput,this.summary),this.logger.info(`\u538B\u7F29\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)),this.logSummary()}logSummary(){if(!this.summary)return;const{totalFiles:t,totalOriginalSize:i,totalCompressedSize:s,totalRatio:r,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${common_format_index.formatFileSize(i)} \u2192 \u538B\u7F29\u540E: ${common_format_index.formatFileSize(s)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${o}ms`);const a=[...this.allStats].sort((n,c)=>c.ratio-n.ratio).slice(0,5);if(a.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const n of a)this.logger.info(` ${n.algorithm.toUpperCase().padEnd(6)} ${n.ratio}% ${common_format_index.formatFileSize(n.originalSize)} \u2192 ${common_format_index.formatFileSize(n.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const compressAssets=factory_index.createPluginFactory(S);exports.compressAssets=compressAssets;
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.cjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.cjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.mjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.mjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.js';
3
+ import '../../shared/vite-plugin.B8FuZce1.js';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
5
5
 
6
6
  /**
@@ -1 +1 @@
1
- import{createPluginFactory as f,BasePlugin as F}from"../../factory/index.mjs";import{createGzip as d,createBrotliCompress as z,constants as S}from"node:zlib";import{promises as u,createReadStream as p,createWriteStream as g}from"node:fs";import{pipeline as h}from"node:stream/promises";import n from"node:path";import{scanDirectory as y,writeJsonReport as x,runWithConcurrency as E}from"../../common/fs/index.mjs";import{formatFileSize as m}from"../../common/format/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";import"crypto";async function b(s,t,i){const e=(await u.stat(s)).size,r=d({level:i});await h(p(s),r,g(t));const o=(await u.stat(t)).size;return{file:s,originalSize:e,compressedSize:o,ratio:e>0?Number(((1-o/e)*100).toFixed(1)):0,algorithm:"gzip"}}async function B(s,t,i){const e=(await u.stat(s)).size,r=z({params:{[S.BROTLI_PARAM_QUALITY]:i}});await h(p(s),r,g(t));const o=(await u.stat(t)).size;return{file:s,originalSize:e,compressedSize:o,ratio:e>0?Number(((1-o/e)*100).toFixed(1)):0,algorithm:"brotli"}}async function w(s,t,i,e){const r=s+(t==="gzip"?".gz":".br");return t==="gzip"?b(s,r,i):B(s,r,e)}function C(s,t,i,e){const r=s.replace(/\\/g,"/");if(i<e.threshold||e.excludeExtensions.length>0&&e.excludeExtensions.includes(t)||e.includeExtensions.length>0&&!e.includeExtensions.includes(t))return!1;if(e.excludePaths.length>0)for(const o of e.excludePaths){const l=o.replace(/\\/g,"/");if(r.startsWith(l)||r.includes(l))return!1}return!(t===".gz"||t===".br")}async function O(s,t){return(await y(s,{filter:(i,e,r)=>{const o=n.relative(s,i);return C(o,e,r,t)}})).map(i=>({filePath:i.filePath,relativePath:n.relative(s,i.filePath),size:i.size,ext:i.extension}))}function A(s,t){const i=s.reduce((o,l)=>o+l.originalSize,0),e=s.reduce((o,l)=>o+l.compressedSize,0),r=i>0?Number(((1-e/i)*100).toFixed(1)):0;return{totalFiles:s.length,totalOriginalSize:i,totalCompressedSize:e,totalRatio:r,gzipFiles:s.filter(o=>o.algorithm==="gzip").length,brotliFiles:s.filter(o=>o.algorithm==="brotli").length,executionTime:t,stats:s}}async function D(s,t,i){if(!t)return;const e=n.isAbsolute(t)?t:n.join(s,t),r={timestamp:new Date().toISOString(),summary:{totalFiles:i.totalFiles,totalOriginalSize:i.totalOriginalSize,totalCompressedSize:i.totalCompressedSize,totalRatio:i.totalRatio,gzipFiles:i.gzipFiles,brotliFiles:i.brotliFiles,executionTime:i.executionTime},files:i.stats.map(o=>({file:o.file,originalSize:o.originalSize,compressedSize:o.compressedSize,ratio:o.ratio,algorithm:o.algorithm}))};await x(e,r)}async function P(s){const t=[...new Set(s.map(i=>i.file))];for(const i of t)try{await u.unlink(i)}catch{}}class v extends F{allStats=[];summary=null;getDefaultOptions(){return{algorithm:"gzip",threshold:1024,deleteOriginalFile:!1,includeExtensions:[".js",".css",".html",".svg",".json",".xml",".txt"],excludeExtensions:[],excludePaths:[],compressionLevel:9,brotliQuality:11,reportOutput:"compress-report.json",parallelLimit:10}}validateOptions(){this.validator.field("algorithm").enum(["gzip","brotli","both"]).field("threshold").number().minValue(0).field("deleteOriginalFile").boolean().field("includeExtensions").array().field("excludeExtensions").array().field("excludePaths").array().field("compressionLevel").number().minValue(1).maxValue(9).field("brotliQuality").number().minValue(1).maxValue(11).field("reportOutput").custom(t=>t===!1||typeof t=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("parallelLimit").number().minValue(1).maxValue(50).validate()}getPluginName(){return"compress-assets"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const t=this.viteConfig.build.outDir,i=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${t}`);const e=await O(t,this.options);if(e.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${e.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const r=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const l of r){const a=await E(e,async c=>w(c.filePath,l,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...a)}const o=Date.now()-i;this.summary=A(this.allStats,o),this.options.deleteOriginalFile&&(await P(this.allStats),this.logger.info("\u5DF2\u5220\u9664\u539F\u59CB\u6587\u4EF6\uFF0C\u4EC5\u4FDD\u7559\u538B\u7F29\u7248\u672C")),this.options.reportOutput&&(await D(t,this.options.reportOutput,this.summary),this.logger.info(`\u538B\u7F29\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)),this.logSummary()}logSummary(){if(!this.summary)return;const{totalFiles:t,totalOriginalSize:i,totalCompressedSize:e,totalRatio:r,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${m(i)} \u2192 \u538B\u7F29\u540E: ${m(e)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${o}ms`);const l=[...this.allStats].sort((a,c)=>c.ratio-a.ratio).slice(0,5);if(l.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const a of l)this.logger.info(` ${a.algorithm.toUpperCase().padEnd(6)} ${a.ratio}% ${m(a.originalSize)} \u2192 ${m(a.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const $=f(v);export{$ as compressAssets};
1
+ import{createPluginFactory as f,BasePlugin as F}from"../../factory/index.mjs";import{createGzip as d,createBrotliCompress as z,constants as S}from"node:zlib";import{promises as n,createReadStream as p,createWriteStream as g}from"node:fs";import{pipeline as h}from"node:stream/promises";import m from"node:path";import{scanDirectory as y,writeJsonReport as x}from"../../common/fs/index.mjs";import{formatFileSize as c}from"../../common/format/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";async function E(e,t,i){const s=(await n.stat(e)).size,l=d({level:i});await h(p(e),l,g(t));const o=(await n.stat(t)).size;return{file:e,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"gzip"}}async function b(e,t,i){const s=(await n.stat(e)).size,l=z({params:{[S.BROTLI_PARAM_QUALITY]:i}});await h(p(e),l,g(t));const o=(await n.stat(t)).size;return{file:e,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"brotli"}}async function w(e,t,i,s){const l=e+(t==="gzip"?".gz":".br");return t==="gzip"?E(e,l,i):b(e,l,s)}function B(e,t,i,s){const l=e.replace(/\\/g,"/");if(i<s.threshold||s.excludeExtensions.length>0&&s.excludeExtensions.includes(t)||s.includeExtensions.length>0&&!s.includeExtensions.includes(t))return!1;if(s.excludePaths.length>0)for(const o of s.excludePaths){const r=o.replace(/\\/g,"/");if(l.startsWith(r)||l.includes(r))return!1}return!(t===".gz"||t===".br")}async function C(e,t){return(await y(e,{filter:(i,s,l)=>{const o=m.relative(e,i);return B(o,s,l,t)}})).map(i=>({filePath:i.filePath,relativePath:m.relative(e,i.filePath),size:i.size,ext:i.extension}))}function A(e,t){const i=e.reduce((o,r)=>o+r.originalSize,0),s=e.reduce((o,r)=>o+r.compressedSize,0),l=i>0?Number(((1-s/i)*100).toFixed(1)):0;return{totalFiles:e.length,totalOriginalSize:i,totalCompressedSize:s,totalRatio:l,gzipFiles:e.filter(o=>o.algorithm==="gzip").length,brotliFiles:e.filter(o=>o.algorithm==="brotli").length,executionTime:t,stats:e}}async function O(e,t,i){if(!t)return;const s=m.isAbsolute(t)?t:m.join(e,t),l={timestamp:new Date().toISOString(),summary:{totalFiles:i.totalFiles,totalOriginalSize:i.totalOriginalSize,totalCompressedSize:i.totalCompressedSize,totalRatio:i.totalRatio,gzipFiles:i.gzipFiles,brotliFiles:i.brotliFiles,executionTime:i.executionTime},files:i.stats.map(o=>({file:o.file,originalSize:o.originalSize,compressedSize:o.compressedSize,ratio:o.ratio,algorithm:o.algorithm}))};await x(s,l)}async function P(e){const t=[...new Set(e.map(i=>i.file))];for(const i of t)try{await n.unlink(i)}catch{}}async function D(e,t,i){const s=[];let l=0;async function o(){for(;l<e.length;){const a=l++,u=await t(e[a]);s[a]=u}}const r=Array(Math.min(i,e.length)).fill(null).map(()=>o());return await Promise.all(r),s}class $ extends F{allStats=[];summary=null;getDefaultOptions(){return{algorithm:"gzip",threshold:1024,deleteOriginalFile:!1,includeExtensions:[".js",".css",".html",".svg",".json",".xml",".txt"],excludeExtensions:[],excludePaths:[],compressionLevel:9,brotliQuality:11,reportOutput:"compress-report.json",parallelLimit:10}}validateOptions(){this.validator.field("algorithm").enum(["gzip","brotli","both"]).field("threshold").number().minValue(0).field("deleteOriginalFile").boolean().field("includeExtensions").array().field("excludeExtensions").array().field("excludePaths").array().field("compressionLevel").number().minValue(1).maxValue(9).field("brotliQuality").number().minValue(1).maxValue(11).field("reportOutput").custom(t=>t===!1||typeof t=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("parallelLimit").number().minValue(1).maxValue(50).validate()}getPluginName(){return"compress-assets"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const t=this.viteConfig.build.outDir,i=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${t}`);const s=await C(t,this.options);if(s.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${s.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const l=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const r of l){const a=await D(s,async u=>w(u.filePath,r,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...a)}const o=Date.now()-i;this.summary=A(this.allStats,o),this.options.deleteOriginalFile&&(await P(this.allStats),this.logger.info("\u5DF2\u5220\u9664\u539F\u59CB\u6587\u4EF6\uFF0C\u4EC5\u4FDD\u7559\u538B\u7F29\u7248\u672C")),this.options.reportOutput&&(await O(t,this.options.reportOutput,this.summary),this.logger.info(`\u538B\u7F29\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)),this.logSummary()}logSummary(){if(!this.summary)return;const{totalFiles:t,totalOriginalSize:i,totalCompressedSize:s,totalRatio:l,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${c(i)} \u2192 \u538B\u7F29\u540E: ${c(s)}\uFF0C\u538B\u7F29\u7387: ${l}%\uFF0C\u8017\u65F6: ${o}ms`);const r=[...this.allStats].sort((a,u)=>u.ratio-a.ratio).slice(0,5);if(r.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const a of r)this.logger.info(` ${a.algorithm.toUpperCase().padEnd(6)} ${a.ratio}% ${c(a.originalSize)} \u2192 ${c(a.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const v=f($);export{v as compressAssets};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path");class p extends factory_index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:i=!0,recursive:t=!0,incremental:s=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await common_fs_index.checkSourceExists(e);const r=await common_fs_index.copySourceToTarget(e,u,{recursive:t,overwrite:i,incremental:s});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=factory_index.createPluginFactory(p);exports.copyFile=copyFile;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path");class p extends factory_index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:i=!0,recursive:t=!0,incremental:s=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await common_fs_index.checkSourceExists(e);const r=await common_fs_index.copySourceToTarget(e,u,{recursive:t,overwrite:i,incremental:s});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=factory_index.createPluginFactory(p);exports.copyFile=copyFile;
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.cjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.cjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.mjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.mjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.js';
3
+ import '../../shared/vite-plugin.B8FuZce1.js';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
5
5
 
6
6
  /**
@@ -1 +1 @@
1
- import{createPluginFactory as c,BasePlugin as n}from"../../factory/index.mjs";import{checkSourceExists as a,copySourceToTarget as l}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";class F extends n{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:t=!0,recursive:i=!0,incremental:o=!0,enabled:s=!0}=this.options;if(!s){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await a(e);const r=await l(e,u,{recursive:i,overwrite:t,incremental:o});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const E=c(F);export{E as copyFile};
1
+ import{createPluginFactory as c,BasePlugin as n}from"../../factory/index.mjs";import{checkSourceExists as a,copySourceToTarget as l}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";class F extends n{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:t=!0,recursive:i=!0,incremental:o=!0,enabled:s=!0}=this.options;if(!s){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await a(e);const r=await l(e,u,{recursive:i,overwrite:t,incremental:o});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const E=c(F);export{E as copyFile};
@@ -1,12 +1,12 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),env=require("../../shared/vite-plugin.vwox4bU0.cjs"),common_html_index=require("../../common/html/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs"),a=require("node:path"),a$1=require("node:fs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../shared/vite-plugin.BrI73DHA.cjs"),require("../../common/script/index.cjs"),require("fs"),require("path"),require("crypto");function _interopDefaultCompat(n){return n&&typeof n=="object"&&"default"in n?n.default:n}const a__default=_interopDefaultCompat(a),a__default$1=_interopDefaultCompat(a$1);function generateTemplate(n){const i=new Map,s=[];for(const[e,t]of Object.entries(n)){const l={type:"string",required:!0,...t};if(l.group){const r=i.get(l.group)||[];r.push({key:e,rule:l}),i.set(l.group,r)}else s.push({key:e,rule:l})}const u=[];u.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),u.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),u.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),u.push(""),s.length>0&&o(u,"\u901A\u7528\u914D\u7F6E",s);for(const[e,t]of i)o(u,e,t);return u.join(`
2
- `)}function o(n,i,s){n.push("# =============================="),n.push(`# ${i}`),n.push("# =============================="),n.push("");for(const{key:u,rule:e}of s){e.description&&n.push(`# ${e.description}`);const t=[];t.push(`\u7C7B\u578B: ${e.type||"string"}`),t.push(e.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),e.enumValues&&e.enumValues.length>0&&t.push(`\u679A\u4E3E\u503C: ${e.enumValues.join(" | ")}`),e.minValue!==void 0&&t.push(`\u6700\u5C0F\u503C: ${e.minValue}`),e.maxValue!==void 0&&t.push(`\u6700\u5927\u503C: ${e.maxValue}`),e.minLength!==void 0&&t.push(`\u6700\u5C0F\u957F\u5EA6: ${e.minLength}`),e.maxLength!==void 0&&t.push(`\u6700\u5927\u957F\u5EA6: ${e.maxLength}`),e.sensitive&&t.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),n.push(`# [${t.join(" | ")}]`),e.default!==void 0?n.push(`${u}=${e.sensitive?"********":e.default}`):n.push(`${u}=`),n.push("")}}function generateRuntimeGuard(n,i,s,u){const e=[];for(const[d,h]of Object.entries(n))h.required!==!1&&e.push({key:d,rule:{type:"string",required:!0,...h}});if(e.length===0)return"";const t=u.filter(d=>d.status!=="pass"),l=e.map(({key:d,rule:h})=>({key:d,type:h.type||"string",description:h.description||""})),r=JSON.stringify(l,null,2),c=t.map(d=>d.key),p=JSON.stringify(c),g=m(s);return`<script>
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),l$1=require("node:path"),u=require("node:fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs"),require("fs"),require("path");function _interopDefaultCompat(s){return s&&typeof s=="object"&&"default"in s?s.default:s}const l__default=_interopDefaultCompat(l$1),u__default=_interopDefaultCompat(u),g=new Set(["string","url","path","enum","semver",void 0]);function o$1(s,e){switch(e.type){case"number":{if(isNaN(Number(s))||s.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(s)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=s.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!e.enumValues||e.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!e.enumValues.includes(s))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${e.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(s)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function l(s,e){if(e.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(s);return e.minValue!==void 0&&r<e.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${e.minValue}`}:e.maxValue!==void 0&&r>e.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${e.maxValue}`}:{valid:!0,status:"pass",message:""}}function d(s,e){return g.has(e.type)?e.minLength!==void 0&&s.length<e.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${e.minLength}`}:e.maxLength!==void 0&&s.length>e.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${e.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function validateValue(s,e,r){const t={type:"string",required:!0,...r};if(e===void 0||e==="")return t.required!==!1?{key:s,status:"missing",message:t.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${s}`,value:e,rule:t}:{key:s,status:"pass",message:"",value:t.default??e,rule:t};const i=o$1(e,t);if(!i.valid)return{key:s,status:i.status,message:t.message||i.message,value:e,rule:t};const n=l(e,t);if(!n.valid)return{key:s,status:n.status,message:t.message||n.message,value:e,rule:t};const m=d(e,t);if(!m.valid)return{key:s,status:m.status,message:t.message||m.message,value:e,rule:t};if(t.pattern&&!t.pattern.test(e))return{key:s,status:"custom_error",message:t.message||`\u73AF\u5883\u53D8\u91CF ${s} \u4E0D\u5339\u914D\u6B63\u5219: ${t.pattern.source}`,value:e,rule:t};if(t.validator){const a=t.validator(e);if(a!==!0){const h=typeof a=="string"?a:"";return{key:s,status:"custom_error",message:t.message||h||`\u73AF\u5883\u53D8\u91CF ${s} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:e,rule:t}}}return{key:s,status:"pass",message:"",value:e,rule:t}}function validateEnvironment(s,e){const r=[];for(const[t,i]of Object.entries(e)){const n=s[t];r.push(validateValue(t,n,i))}return r}function generateTemplate(s){const e=new Map,r=[];for(const[i,n]of Object.entries(s)){const m={type:"string",required:!0,...n};if(m.group){const a=e.get(m.group)||[];a.push({key:i,rule:m}),e.set(m.group,a)}else r.push({key:i,rule:m})}const t=[];t.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),t.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),t.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),t.push(""),r.length>0&&o(t,"\u901A\u7528\u914D\u7F6E",r);for(const[i,n]of e)o(t,i,n);return t.join(`
2
+ `)}function o(s,e,r){s.push("# =============================="),s.push(`# ${e}`),s.push("# =============================="),s.push("");for(const{key:t,rule:i}of r){i.description&&s.push(`# ${i.description}`);const n=[];n.push(`\u7C7B\u578B: ${i.type||"string"}`),n.push(i.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),i.enumValues&&i.enumValues.length>0&&n.push(`\u679A\u4E3E\u503C: ${i.enumValues.join(" | ")}`),i.minValue!==void 0&&n.push(`\u6700\u5C0F\u503C: ${i.minValue}`),i.maxValue!==void 0&&n.push(`\u6700\u5927\u503C: ${i.maxValue}`),i.minLength!==void 0&&n.push(`\u6700\u5C0F\u957F\u5EA6: ${i.minLength}`),i.maxLength!==void 0&&n.push(`\u6700\u5927\u957F\u5EA6: ${i.maxLength}`),i.sensitive&&n.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),s.push(`# [${n.join(" | ")}]`),i.default!==void 0?s.push(`${t}=${i.sensitive?"********":i.default}`):s.push(`${t}=`),s.push("")}}function generateRuntimeGuard(s,e,r,t){const i=[];for(const[c,p]of Object.entries(s))p.required!==!1&&i.push({key:c,rule:{type:"string",required:!0,...p}});if(i.length===0)return"";const n=t.filter(c=>c.status!=="pass"),m=i.map(({key:c,rule:p})=>({key:c,type:p.type||"string",description:p.description||""})),a=JSON.stringify(m,null,2),h=n.map(c=>c.key),v=JSON.stringify(h),F=f(r);return`<script>
3
3
  ${`
4
4
  (function() {
5
5
  'use strict';
6
- var GUARD_NAME = ${JSON.stringify(i)};
7
- var GUARD_DATA = ${r};
8
- var FAILED_KEYS = ${p};
9
- var MODE = ${JSON.stringify(s)};
6
+ var GUARD_NAME = ${JSON.stringify(e)};
7
+ var GUARD_DATA = ${a};
8
+ var FAILED_KEYS = ${v};
9
+ var MODE = ${JSON.stringify(r)};
10
10
 
11
11
  var missing = [];
12
12
  var invalid = [];
@@ -42,11 +42,11 @@ ${`
42
42
  }
43
43
 
44
44
  if (hasIssues) {
45
- ${g}
45
+ ${F}
46
46
  }
47
47
  })();
48
48
  `.trim()}
49
- <\/script>`}function m(n){switch(n){case"console":return`
49
+ <\/script>`}function f(s){switch(s){case"console":return`
50
50
  var msgs = [];
51
51
  if (missing.length > 0) msgs.push('[EnvGuard] \u7F3A\u5C11\u73AF\u5883\u53D8\u91CF: ' + missing.join(', '));
52
52
  if (invalid.length > 0) msgs.push('[EnvGuard] \u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', '));
@@ -62,6 +62,6 @@ ${`
62
62
  if (missing.length > 0) html += '\u7F3A\u5C11: ' + missing.join(', ') + '<br>';
63
63
  if (invalid.length > 0) html += '\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', ');
64
64
  overlay.innerHTML = html;
65
- document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}class R extends factory_index.BasePlugin{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(i=>i===!1||typeof i=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(i){this.options.validateBeforeBuild&&(i.configResolved=s=>{this.viteConfig=s,this.runValidation()}),this.options.runtimeGuard&&(i.transformIndexHtml={order:"post",handler:s=>this.safeExecuteSync(()=>this.injectRuntimeGuard(s),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||s})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=env.validateEnvironment(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const i=this.viteConfig.root||process.cwd();for(const s of this.options.envFiles){const u=a__default.resolve(i,s);if(a__default$1.existsSync(u))try{this.parseAndLoadEnvFile(u)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${u}`)}}}parseAndLoadEnvFile(i){const s=a__default$1.readFileSync(i,"utf-8").split(`
66
- `);for(const u of s){const e=u.trim();if(!e||e.startsWith("#"))continue;const t=e.indexOf("=");if(t===-1)continue;const l=e.slice(0,t).trim();let r=e.slice(t+1).trim();(r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'"))&&(r=r.slice(1,-1)),l.startsWith("VITE_")&&process.env[l]===void 0&&(process.env[l]=r)}}buildResult(){const i=this.validationResults.length,s=this.validationResults.filter(t=>t.status==="pass").length,u=this.validationResults.filter(t=>t.status==="missing").length,e=this.validationResults.filter(t=>t.status!=="pass"&&t.status!=="missing").length;return{timestamp:common_format_index.formatDate(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:i,passed:s,missing:u,invalid:e,results:this.validationResults,allPassed:u===0&&e===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const i=this.validationResults.filter(t=>t.status==="missing").map(t=>t.key),s=this.validationResults.filter(t=>t.status!=="pass"&&t.status!=="missing"),u=[];i.length>0&&u.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${i.join(", ")}`);for(const t of s)u.push(`${t.key}: ${t.message}`);const e=u.join(`
67
- `);switch(this.options.failAction){case"error":throw new Error(e);case"warn":this.logger.warn(e);break}}writeEnvTemplate(){const i=this.viteConfig?.root||process.cwd(),s=a__default.resolve(i,this.options.templateOutput),u=generateTemplate(this.options.required);this.safeExecuteSync(()=>{common_fs_index.writeFileContent(s,u),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const i=this.viteConfig?.build?.outDir||"dist",s=a__default.resolve(i,this.options.reportOutput);this.safeExecuteSync(()=>{const u=JSON.stringify(this.guardResult,(e,t)=>t instanceof RegExp?t.toString():typeof t=="function"?"[Function]":t,2);common_fs_index.writeFileContent(s,u),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:i,passed:s,missing:u,invalid:e,allPassed:t}=this.guardResult;if(t){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${i} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${i} | \u901A\u8FC7 ${s} | \u7F3A\u5931 ${u} | \u5931\u8D25 ${e}`);const l=this.validationResults.filter(r=>r.status!=="pass");for(const r of l){const c=r.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${c}] ${r.key}: ${r.message}`)}}injectRuntimeGuard(i){const s=generateRuntimeGuard(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!s)return i;const u=common_html_index.injectBeforeTag(i,"</head>",s);return u.injected?u.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),i)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const envGuard=factory_index.createPluginFactory(R);exports.envGuard=envGuard;
65
+ document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}class R extends factory_index.BasePlugin{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(e=>e===!1||typeof e=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(e){this.options.validateBeforeBuild&&(e.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(e.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=validateEnvironment(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const e=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const t=l__default.resolve(e,r);if(u__default.existsSync(t))try{this.parseAndLoadEnvFile(t)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${t}`)}}}parseAndLoadEnvFile(e){const r=u__default.readFileSync(e,"utf-8").split(`
66
+ `);for(const t of r){const i=t.trim();if(!i||i.startsWith("#"))continue;const n=i.indexOf("=");if(n===-1)continue;const m=i.slice(0,n).trim();let a=i.slice(n+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),m.startsWith("VITE_")&&process.env[m]===void 0&&(process.env[m]=a)}}buildResult(){const e=this.validationResults.length,r=this.validationResults.filter(n=>n.status==="pass").length,t=this.validationResults.filter(n=>n.status==="missing").length,i=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing").length;return{timestamp:common_format_index.formatDate(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:e,passed:r,missing:t,invalid:i,results:this.validationResults,allPassed:t===0&&i===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const e=this.validationResults.filter(n=>n.status==="missing").map(n=>n.key),r=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing"),t=[];e.length>0&&t.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${e.join(", ")}`);for(const n of r)t.push(`${n.key}: ${n.message}`);const i=t.join(`
67
+ `);switch(this.options.failAction){case"error":throw new Error(i);case"warn":this.logger.warn(i);break}}writeEnvTemplate(){const e=this.viteConfig?.root||process.cwd(),r=l__default.resolve(e,this.options.templateOutput),t=generateTemplate(this.options.required);this.safeExecuteSync(()=>{common_fs_index.writeFileContent(r,t),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const e=this.viteConfig?.build?.outDir||"dist",r=l__default.resolve(e,this.options.reportOutput);this.safeExecuteSync(()=>{const t=JSON.stringify(this.guardResult,(i,n)=>n instanceof RegExp?n.toString():typeof n=="function"?"[Function]":n,2);common_fs_index.writeFileContent(r,t),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:e,passed:r,missing:t,invalid:i,allPassed:n}=this.guardResult;if(n){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${e} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${e} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${t} | \u5931\u8D25 ${i}`);const m=this.validationResults.filter(a=>a.status!=="pass");for(const a of m){const h=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${h}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(e){const r=generateRuntimeGuard(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return e;const t=common_html_index.injectBeforeTag(e,"</head>",r);return t.injected?t.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),e)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const envGuard=factory_index.createPluginFactory(R);exports.envGuard=envGuard;
@@ -1,9 +1,108 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
- import { E as EnvFieldRule, b as EnvValidationResult } from '../../shared/vite-plugin.CmtcnItg.cjs';
3
2
  import 'vite';
4
- import '../../shared/vite-plugin.CLr0ttuO.cjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.cjs';
5
4
  import '../../shared/vite-plugin.DRRlWY8P.cjs';
6
5
 
6
+ /**
7
+ * 环境变量值类型
8
+ *
9
+ * @description 定义环境变量支持的所有值类型:
10
+ * - `string`:普通字符串(默认类型)
11
+ * - `number`:数字类型
12
+ * - `url`:URL 地址
13
+ * - `boolean`:布尔值
14
+ * - `enum`:枚举值
15
+ * - `json`:JSON 字符串
16
+ * - `semver`:语义化版本号
17
+ * - `path`:文件路径
18
+ */
19
+ type EnvType = 'string' | 'number' | 'url' | 'boolean' | 'enum' | 'json' | 'semver' | 'path';
20
+ /**
21
+ * 环境变量字段校验规则
22
+ *
23
+ * @description 定义单个环境变量的校验规则,包括类型约束、范围限制、
24
+ * 自定义验证函数和元数据信息等。
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // 基本字符串字段
29
+ * const rule: EnvFieldRule = { type: 'string', required: true }
30
+ *
31
+ * // 带范围的数字字段
32
+ * const portRule: EnvFieldRule = { type: 'number', required: true, minValue: 1, maxValue: 65535 }
33
+ *
34
+ * // 枚举字段
35
+ * const envRule: EnvFieldRule = { type: 'enum', required: true, enumValues: ['development', 'staging', 'production'] }
36
+ *
37
+ * // 自定义验证
38
+ * const customRule: EnvFieldRule = {
39
+ * type: 'string',
40
+ * required: true,
41
+ * validator: (v) => v.startsWith('https://') || '必须使用 HTTPS'
42
+ * }
43
+ * ```
44
+ */
45
+ interface EnvFieldRule {
46
+ /** 值类型,默认为 `'string'` */
47
+ type?: EnvType;
48
+ /** 是否为必需字段,默认为 `true` */
49
+ required?: boolean;
50
+ /** 正则表达式,值必须匹配此模式 */
51
+ pattern?: RegExp;
52
+ /**
53
+ * 自定义验证函数
54
+ *
55
+ * @description 返回 `true` 表示验证通过,返回字符串表示验证失败且字符串为错误消息
56
+ */
57
+ validator?: (value: string) => boolean | string;
58
+ /** 自定义错误消息,覆盖默认的错误提示 */
59
+ message?: string;
60
+ /** 当值为空时使用的默认值 */
61
+ default?: string;
62
+ /** 枚举值列表(仅 `enum` 类型需要) */
63
+ enumValues?: string[];
64
+ /** 数值最小值(仅 `number` 类型) */
65
+ minValue?: number;
66
+ /** 数值最大值(仅 `number` 类型) */
67
+ maxValue?: number;
68
+ /** 字符串最小长度(仅字符串类类型) */
69
+ minLength?: number;
70
+ /** 字符串最大长度(仅字符串类类型) */
71
+ maxLength?: number;
72
+ /** 变量分组名称,用于模板生成时的分组显示 */
73
+ group?: string;
74
+ /** 变量描述信息,用于模板生成时的说明文本 */
75
+ description?: string;
76
+ /** 是否为敏感变量,模板中会隐藏实际值 */
77
+ sensitive?: boolean;
78
+ }
79
+ /**
80
+ * 环境变量验证结果
81
+ *
82
+ * @description 表示单个环境变量的验证结果,包含验证状态、错误消息和有效值。
83
+ */
84
+ interface EnvValidationResult {
85
+ /** 环境变量名 */
86
+ key: string;
87
+ /**
88
+ * 验证状态:
89
+ * - `pass`:验证通过
90
+ * - `missing`:必需变量缺失
91
+ * - `type_error`:类型不匹配
92
+ * - `custom_error`:自定义验证失败或正则不匹配
93
+ * - `enum_mismatch`:枚举值不匹配
94
+ * - `range_error`:数值超出范围
95
+ * - `length_error`:字符串长度不符合要求
96
+ */
97
+ status: 'pass' | 'missing' | 'type_error' | 'custom_error' | 'enum_mismatch' | 'range_error' | 'length_error';
98
+ /** 验证消息(验证通过时为空字符串,失败时为错误描述) */
99
+ message: string;
100
+ /** 环境变量的有效值(缺失时可能为 `undefined` 或默认值) */
101
+ value: string | undefined;
102
+ /** 应用的校验规则(含默认值填充后的完整规则) */
103
+ rule: EnvFieldRule;
104
+ }
105
+
7
106
  /**
8
107
  * 环境变量校验失败时的处理动作
9
108
  *