@meng-xi/vite-plugin 0.1.2 → 0.1.3

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 (53) hide show
  1. package/README-en.md +492 -190
  2. package/README.md +464 -163
  3. package/dist/common/compress/index.cjs +1 -0
  4. package/dist/common/compress/index.d.cts +23 -0
  5. package/dist/common/compress/index.d.mts +23 -0
  6. package/dist/common/compress/index.d.ts +23 -0
  7. package/dist/common/compress/index.mjs +1 -0
  8. package/dist/common/format/index.cjs +1 -1
  9. package/dist/common/format/index.d.cts +33 -1
  10. package/dist/common/format/index.d.mts +33 -1
  11. package/dist/common/format/index.d.ts +33 -1
  12. package/dist/common/format/index.mjs +1 -1
  13. package/dist/common/fs/index.cjs +1 -1
  14. package/dist/common/fs/index.d.cts +70 -2
  15. package/dist/common/fs/index.d.mts +70 -2
  16. package/dist/common/fs/index.d.ts +70 -2
  17. package/dist/common/fs/index.mjs +1 -1
  18. package/dist/common/index.cjs +1 -1
  19. package/dist/common/index.d.cts +4 -2
  20. package/dist/common/index.d.mts +4 -2
  21. package/dist/common/index.d.ts +4 -2
  22. package/dist/common/index.mjs +1 -1
  23. package/dist/common/path/index.cjs +1 -0
  24. package/dist/common/path/index.d.cts +22 -0
  25. package/dist/common/path/index.d.mts +22 -0
  26. package/dist/common/path/index.d.ts +22 -0
  27. package/dist/common/path/index.mjs +1 -0
  28. package/dist/index.cjs +1 -1
  29. package/dist/index.d.cts +5 -2
  30. package/dist/index.d.mts +5 -2
  31. package/dist/index.d.ts +5 -2
  32. package/dist/index.mjs +1 -1
  33. package/dist/plugins/bundleAnalyzer/index.cjs +235 -0
  34. package/dist/plugins/bundleAnalyzer/index.d.cts +215 -0
  35. package/dist/plugins/bundleAnalyzer/index.d.mts +215 -0
  36. package/dist/plugins/bundleAnalyzer/index.d.ts +215 -0
  37. package/dist/plugins/bundleAnalyzer/index.mjs +235 -0
  38. package/dist/plugins/compressAssets/index.cjs +1 -1
  39. package/dist/plugins/compressAssets/index.mjs +1 -1
  40. package/dist/plugins/generateRouter/index.cjs +4 -4
  41. package/dist/plugins/generateRouter/index.mjs +1 -1
  42. package/dist/plugins/generateVersion/index.cjs +1 -1
  43. package/dist/plugins/generateVersion/index.mjs +1 -1
  44. package/dist/plugins/htmlInject/index.cjs +7 -7
  45. package/dist/plugins/htmlInject/index.mjs +2 -2
  46. package/dist/plugins/index.cjs +1 -1
  47. package/dist/plugins/index.d.cts +1 -0
  48. package/dist/plugins/index.d.mts +1 -0
  49. package/dist/plugins/index.d.ts +1 -0
  50. package/dist/plugins/index.mjs +1 -1
  51. package/dist/plugins/loadingManager/index.cjs +1 -1
  52. package/dist/plugins/loadingManager/index.mjs +1 -1
  53. package/package.json +16 -1
@@ -0,0 +1,235 @@
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>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Bundle Analysis Report</title>
7
+ <style>
8
+ * { margin: 0; padding: 0; box-sizing: border-box; }
9
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f7fa; color: #333; line-height: 1.6; }
10
+ .container { max-width: 1200px; margin: 0 auto; padding: 20px; }
11
+ .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; border-radius: 12px; margin-bottom: 24px; }
12
+ .header h1 { font-size: 24px; margin-bottom: 8px; }
13
+ .header .meta { font-size: 14px; opacity: 0.9; }
14
+ .summary-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
15
+ .card { background: white; border-radius: 10px; padding: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
16
+ .card .label { font-size: 13px; color: #888; margin-bottom: 4px; }
17
+ .card .value { font-size: 24px; font-weight: 700; color: #333; }
18
+ .card .sub { font-size: 12px; color: #aaa; margin-top: 2px; }
19
+ .section { background: white; border-radius: 10px; padding: 24px; margin-bottom: 24px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); }
20
+ .section h2 { font-size: 18px; margin-bottom: 16px; padding-bottom: 8px; border-bottom: 2px solid #f0f0f0; }
21
+ .chart-tabs { display: flex; gap: 8px; margin-bottom: 16px; }
22
+ .chart-tab { padding: 6px 16px; border: 1px solid #ddd; border-radius: 6px; background: white; cursor: pointer; font-size: 13px; transition: all 0.2s; }
23
+ .chart-tab.active { background: #667eea; color: white; border-color: #667eea; }
24
+ .chart-container { min-height: 400px; position: relative; }
25
+ .treemap { display: flex; flex-wrap: wrap; gap: 2px; }
26
+ .treemap-item { border-radius: 4px; padding: 8px; color: white; font-size: 11px; overflow: hidden; display: flex; flex-direction: column; justify-content: center; align-items: center; cursor: pointer; transition: opacity 0.2s; min-width: 40px; min-height: 40px; }
27
+ .treemap-item:hover { opacity: 0.85; }
28
+ .treemap-item .name { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
29
+ .treemap-item .size { font-size: 10px; opacity: 0.9; }
30
+ table { width: 100%; border-collapse: collapse; font-size: 13px; }
31
+ th, td { padding: 10px 12px; text-align: left; border-bottom: 1px solid #f0f0f0; }
32
+ th { background: #fafafa; font-weight: 600; color: #555; position: sticky; top: 0; }
33
+ tr:hover { background: #f8f9ff; }
34
+ .bar { height: 8px; border-radius: 4px; background: #667eea; transition: width 0.3s; }
35
+ .bar-bg { width: 100%; height: 8px; border-radius: 4px; background: #f0f0f0; }
36
+ .warning { background: #fff8e1; border-left: 4px solid #ffc107; padding: 12px 16px; border-radius: 0 6px 6px 0; margin-bottom: 8px; font-size: 13px; }
37
+ .warning.critical { background: #ffebee; border-left-color: #f44336; }
38
+ .diff-positive { color: #f44336; }
39
+ .diff-negative { color: #4caf50; }
40
+ .diff-added { color: #2196f3; }
41
+ .diff-removed { color: #9e9e9e; }
42
+ .diff-unchanged { color: #bbb; }
43
+ .pie-chart { display: flex; align-items: center; gap: 24px; flex-wrap: wrap; }
44
+ .pie-svg { flex-shrink: 0; }
45
+ .pie-legend { flex: 1; min-width: 200px; }
46
+ .legend-item { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-size: 13px; }
47
+ .legend-color { width: 12px; height: 12px; border-radius: 3px; flex-shrink: 0; }
48
+ .empty-state { text-align: center; padding: 40px; color: #aaa; }
49
+ @media (max-width: 768px) { .container { padding: 12px; } .summary-cards { grid-template-columns: repeat(2, 1fr); } }
50
+ </style>
51
+ </head>
52
+ <body>
53
+ <div class="container">
54
+ <div class="header">
55
+ <h1>Bundle Analysis Report</h1>
56
+ <div class="meta">Generated: ${r.timestamp} | Analysis time: ${r.analysisTime}ms</div>
57
+ </div>
58
+
59
+ <div class="summary-cards">
60
+ <div class="card">
61
+ <div class="label">Total Size</div>
62
+ <div class="value">${d}</div>
63
+ <div class="sub">gzip: ${l}</div>
64
+ </div>
65
+ <div class="card">
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>
69
+ </div>
70
+ <div class="card">
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>
74
+ </div>
75
+ <div class="card">
76
+ <div class="label">File Types</div>
77
+ <div class="value">${e.length}</div>
78
+ <div class="sub">extensions detected</div>
79
+ </div>
80
+ </div>
81
+
82
+ ${a.length>0?`
83
+ <div class="section">
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("")}
86
+ </div>
87
+ `:""}
88
+
89
+ <div class="section">
90
+ <h2>Size Distribution</h2>
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>
95
+ </div>
96
+ <div class="chart-container" id="chartContainer"></div>
97
+ </div>
98
+
99
+ <div class="section">
100
+ <h2>File Type Distribution</h2>
101
+ <div class="pie-chart">
102
+ <div class="pie-svg" id="pieChart"></div>
103
+ <div class="pie-legend" id="pieLegend"></div>
104
+ </div>
105
+ </div>
106
+
107
+ <div class="section">
108
+ <h2>Top Modules</h2>
109
+ <table>
110
+ <thead><tr><th>#</th><th>Module</th><th>Size</th><th>gzip</th><th>Type</th></tr></thead>
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("")}
113
+ </tbody>
114
+ </table>
115
+ </div>
116
+
117
+ ${n.length>0?`
118
+ <div class="section">
119
+ <h2>Comparison with Previous Build</h2>
120
+ <table>
121
+ <thead><tr><th>Name</th><th>Previous</th><th>Current</th><th>Diff</th><th>Trend</th></tr></thead>
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("")}
124
+ </tbody>
125
+ </table>
126
+ </div>
127
+ `:""}
128
+
129
+ <div class="section">
130
+ <h2>All Chunks</h2>
131
+ <table>
132
+ <thead><tr><th>Name</th><th>Size</th><th>gzip</th><th>Type</th><th>Proportion</th></tr></thead>
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("")}
135
+ </tbody>
136
+ </table>
137
+ </div>
138
+ </div>
139
+
140
+ <script>
141
+ const chartData = ${JSON.stringify(s)};
142
+ const totalSize = ${r.totalSize};
143
+ const distributionData = ${JSON.stringify(e)};
144
+ const COLORS = ['#667eea','#764ba2','#f093fb','#f5576c','#4facfe','#00f2fe','#43e97b','#fa709a','#fee140','#a18cd1','#fbc2eb','#a6c1ee','#ffecd2','#fcb69f','#ff9a9e','#fad0c4'];
145
+
146
+ function switchChart(type) {
147
+ document.querySelectorAll('.chart-tab').forEach(t => t.classList.remove('active'));
148
+ event.target.classList.add('active');
149
+ renderChart(type);
150
+ }
151
+
152
+ function renderChart(type) {
153
+ const container = document.getElementById('chartContainer');
154
+ if (type === 'treemap') renderTreemap(container);
155
+ else if (type === 'sunburst') renderSunburst(container);
156
+ else renderList(container);
157
+ }
158
+
159
+ function renderTreemap(container) {
160
+ const items = chartData.map((d, i) => {
161
+ const pct = totalSize > 0 ? (d.size / totalSize * 100) : 0;
162
+ const flex = Math.max(pct * 3, 2);
163
+ return '<div class="treemap-item" style="flex:' + flex + ' ' + flex + ' 0;background:' + COLORS[i % COLORS.length] + ';" title="' + d.name + ': ${c(0)}'.replace('0B', formatBytes(d.size)) + '"><span class="name">' + d.name.split('/').pop() + '</span><span class="size">' + formatBytes(d.size) + '</span></div>';
164
+ });
165
+ container.innerHTML = '<div class="treemap">' + items.join('') + '</div>';
166
+ }
167
+
168
+ function renderSunburst(container) {
169
+ const cx = 200, cy = 200, r1 = 80, r2 = 160;
170
+ let paths = '';
171
+ let startAngle = 0;
172
+ const sorted = [...chartData].sort((a, b) => b.size - a.size);
173
+ sorted.forEach((d, i) => {
174
+ const angle = totalSize > 0 ? (d.size / totalSize) * Math.PI * 2 : 0;
175
+ const endAngle = startAngle + angle;
176
+ const x1 = cx + r1 * Math.cos(startAngle);
177
+ const y1 = cy + r1 * Math.sin(startAngle);
178
+ const x2 = cx + r2 * Math.cos(startAngle);
179
+ const y2 = cy + r2 * Math.sin(startAngle);
180
+ const x3 = cx + r2 * Math.cos(endAngle);
181
+ const y3 = cy + r2 * Math.sin(endAngle);
182
+ const x4 = cx + r1 * Math.cos(endAngle);
183
+ const y4 = cy + r1 * Math.sin(endAngle);
184
+ const largeArc = angle > Math.PI ? 1 : 0;
185
+ paths += '<path d="M' + x1 + ',' + y1 + 'L' + x2 + ',' + y2 + 'A' + r2 + ',' + r2 + ' 0 ' + largeArc + ',1 ' + x3 + ',' + y3 + 'L' + x4 + ',' + y4 + 'A' + r1 + ',' + r1 + ' 0 ' + largeArc + ',0 ' + x1 + ',' + y1 + '" fill="' + COLORS[i % COLORS.length] + '" opacity="0.85" style="cursor:pointer" title="' + d.name + ': ' + formatBytes(d.size) + '"/>';
186
+ startAngle = endAngle;
187
+ });
188
+ container.innerHTML = '<div style="text-align:center"><svg width="400" height="400" viewBox="0 0 400 400">' + paths + '<circle cx="' + cx + '" cy="' + cy + '" r="' + (r1 - 1) + '" fill="white"/><text x="' + cx + '" y="' + cy + '" text-anchor="middle" dy="-6" font-size="14" font-weight="600">${d}</text><text x="' + cx + '" y="' + cy + '" text-anchor="middle" dy="14" font-size="11" fill="#888">total</text></svg></div>';
189
+ }
190
+
191
+ function renderList(container) {
192
+ const rows = [...chartData].sort((a, b) => b.size - a.size).map((d, i) => {
193
+ const pct = totalSize > 0 ? (d.size / totalSize * 100).toFixed(1) : '0.0';
194
+ return '<tr><td>' + (i+1) + '</td><td title="' + d.name + '">' + d.name + '</td><td>' + formatBytes(d.size) + '</td><td>' + formatBytes(d.gzipSize) + '</td><td>' + d.type + '</td><td><div class="bar-bg"><div class="bar" style="width:' + pct + '%"></div></div>' + pct + '%</td></tr>';
195
+ });
196
+ container.innerHTML = '<table><thead><tr><th>#</th><th>Name</th><th>Size</th><th>gzip</th><th>Type</th><th>Proportion</th></tr></thead><tbody>' + rows.join('') + '</tbody></table>';
197
+ }
198
+
199
+ function formatBytes(bytes) {
200
+ if (bytes < 1024) return bytes + 'B';
201
+ if (bytes < 1048576) return (bytes / 1024).toFixed(1) + 'KB';
202
+ return (bytes / 1048576).toFixed(2) + 'MB';
203
+ }
204
+
205
+ function renderPieChart() {
206
+ const svg = document.getElementById('pieChart');
207
+ const legend = document.getElementById('pieLegend');
208
+ const cx = 100, cy = 100, r = 90;
209
+ let paths = '';
210
+ let startAngle = -Math.PI / 2;
211
+ const items = distributionData.slice(0, 8);
212
+ const otherPct = distributionData.slice(8).reduce((s, d) => s + d.percentage, 0);
213
+ if (otherPct > 0) items.push({ extension: '(other)', count: 0, totalSize: 0, percentage: otherPct });
214
+
215
+ items.forEach((d, i) => {
216
+ const angle = (d.percentage / 100) * Math.PI * 2;
217
+ const endAngle = startAngle + angle;
218
+ const x1 = cx + r * Math.cos(startAngle);
219
+ const y1 = cy + r * Math.sin(startAngle);
220
+ const x2 = cx + r * Math.cos(endAngle);
221
+ const y2 = cy + r * Math.sin(endAngle);
222
+ const largeArc = angle > Math.PI ? 1 : 0;
223
+ paths += '<path d="M' + cx + ',' + cy + 'L' + x1 + ',' + y1 + 'A' + r + ',' + r + ' 0 ' + largeArc + ',1 ' + x2 + ',' + y2 + 'Z" fill="' + COLORS[i % COLORS.length] + '" opacity="0.85"/>';
224
+ startAngle = endAngle;
225
+ });
226
+
227
+ svg.innerHTML = '<svg width="200" height="200" viewBox="0 0 200 200">' + paths + '</svg>';
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
+ }
230
+
231
+ renderChart('${o}');
232
+ renderPieChart();
233
+ <\/script>
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};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),node_zlib=require("node:zlib"),node_fs=require("node:fs"),promises=require("node:stream/promises"),o=require("node:path"),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");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const o__default=_interopDefaultCompat(o);async function compressFileGzip(e,t,i){const s=(await node_fs.promises.stat(e)).size,a=node_zlib.createGzip({level:i});await promises.pipeline(node_fs.createReadStream(e),a,node_fs.createWriteStream(t));const r=(await node_fs.promises.stat(t)).size;return{file:e,originalSize:s,compressedSize:r,ratio:s>0?Number(((1-r/s)*100).toFixed(1)):0,algorithm:"gzip"}}async function compressFileBrotli(e,t,i){const s=(await node_fs.promises.stat(e)).size,a=node_zlib.createBrotliCompress({params:{[node_zlib.constants.BROTLI_PARAM_QUALITY]:i}});await promises.pipeline(node_fs.createReadStream(e),a,node_fs.createWriteStream(t));const r=(await node_fs.promises.stat(t)).size;return{file:e,originalSize:s,compressedSize:r,ratio:s>0?Number(((1-r/s)*100).toFixed(1)):0,algorithm:"brotli"}}async function compressFile(e,t,i,s){const a=e+(t==="gzip"?".gz":".br");return t==="gzip"?compressFileGzip(e,a,i):compressFileBrotli(e,a,s)}function shouldCompressFile(e,t,i,s){const a=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 r of s.excludePaths){const l=r.replace(/\\/g,"/");if(a.startsWith(l)||a.includes(l))return!1}return!(t===".gz"||t===".br")}async function scanDirectory(e,t){const i=[];async function s(a){const r=await node_fs.promises.readdir(a,{withFileTypes:!0});for(const l of r){const u=o__default.join(a,l.name);if(l.isDirectory())await s(u);else if(l.isFile()){const n=await node_fs.promises.stat(u),c=o__default.relative(e,u),m=o__default.extname(l.name).toLowerCase();shouldCompressFile(c,m,n.size,t)&&i.push({filePath:u,relativePath:c,size:n.size,ext:m})}}}return await s(e),i}function buildSummary(e,t){const i=e.reduce((r,l)=>r+l.originalSize,0),s=e.reduce((r,l)=>r+l.compressedSize,0),a=i>0?Number(((1-s/i)*100).toFixed(1)):0;return{totalFiles:e.length,totalOriginalSize:i,totalCompressedSize:s,totalRatio:a,gzipFiles:e.filter(r=>r.algorithm==="gzip").length,brotliFiles:e.filter(r=>r.algorithm==="brotli").length,executionTime:t,stats:e}}function formatFileSize(e){return e<1024?`${e}B`:e<1024*1024?`${(e/1024).toFixed(1)}KB`:`${(e/(1024*1024)).toFixed(2)}MB`}async function writeReport(e,t,i){if(!t)return;const s=o__default.isAbsolute(t)?t:o__default.join(e,t),a={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(r=>({file:r.file,originalSize:r.originalSize,compressedSize:r.compressedSize,ratio:r.ratio,algorithm:r.algorithm}))};await common_fs_index.writeFileContent(s,JSON.stringify(a,null,2))}async function deleteOriginalFiles(e){const t=[...new Set(e.map(i=>i.file))];for(const i of t)try{await node_fs.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 a=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const l of a){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 r=Date.now()-i;this.summary=buildSummary(this.allStats,r),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:a,executionTime:r}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${formatFileSize(i)} \u2192 \u538B\u7F29\u540E: ${formatFileSize(s)}\uFF0C\u538B\u7F29\u7387: ${a}%\uFF0C\u8017\u65F6: ${r}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}% ${formatFileSize(u.originalSize)} \u2192 ${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"),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 +1 @@
1
- import{createPluginFactory as d,BasePlugin as z}from"../../factory/index.mjs";import{createGzip as S,createBrotliCompress as y,constants as x}from"node:zlib";import{promises as u,createReadStream as h,createWriteStream as f}from"node:fs";import{pipeline as F}from"node:stream/promises";import m from"node:path";import{writeFileContent as E,runWithConcurrency as w}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";async function B(i,t,e){const s=(await u.stat(i)).size,r=S({level:e});await F(h(i),r,f(t));const o=(await u.stat(t)).size;return{file:i,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"gzip"}}async function b(i,t,e){const s=(await u.stat(i)).size,r=y({params:{[x.BROTLI_PARAM_QUALITY]:e}});await F(h(i),r,f(t));const o=(await u.stat(t)).size;return{file:i,originalSize:s,compressedSize:o,ratio:s>0?Number(((1-o/s)*100).toFixed(1)):0,algorithm:"brotli"}}async function C(i,t,e,s){const r=i+(t==="gzip"?".gz":".br");return t==="gzip"?B(i,r,e):b(i,r,s)}function O(i,t,e,s){const r=i.replace(/\\/g,"/");if(e<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 A(i,t){const e=[];async function s(r){const o=await u.readdir(r,{withFileTypes:!0});for(const l of o){const a=m.join(r,l.name);if(l.isDirectory())await s(a);else if(l.isFile()){const n=await u.stat(a),p=m.relative(i,a),g=m.extname(l.name).toLowerCase();O(p,g,n.size,t)&&e.push({filePath:a,relativePath:p,size:n.size,ext:g})}}}return await s(i),e}function D(i,t){const e=i.reduce((o,l)=>o+l.originalSize,0),s=i.reduce((o,l)=>o+l.compressedSize,0),r=e>0?Number(((1-s/e)*100).toFixed(1)):0;return{totalFiles:i.length,totalOriginalSize:e,totalCompressedSize:s,totalRatio:r,gzipFiles:i.filter(o=>o.algorithm==="gzip").length,brotliFiles:i.filter(o=>o.algorithm==="brotli").length,executionTime:t,stats:i}}function c(i){return i<1024?`${i}B`:i<1024*1024?`${(i/1024).toFixed(1)}KB`:`${(i/(1024*1024)).toFixed(2)}MB`}async function v(i,t,e){if(!t)return;const s=m.isAbsolute(t)?t:m.join(i,t),r={timestamp:new Date().toISOString(),summary:{totalFiles:e.totalFiles,totalOriginalSize:e.totalOriginalSize,totalCompressedSize:e.totalCompressedSize,totalRatio:e.totalRatio,gzipFiles:e.gzipFiles,brotliFiles:e.brotliFiles,executionTime:e.executionTime},files:e.stats.map(o=>({file:o.file,originalSize:o.originalSize,compressedSize:o.compressedSize,ratio:o.ratio,algorithm:o.algorithm}))};await E(s,JSON.stringify(r,null,2))}async function P(i){const t=[...new Set(i.map(e=>e.file))];for(const e of t)try{await u.unlink(e)}catch{}}class $ extends z{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,e=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${t}`);const s=await A(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 a=await w(s,async n=>C(n.filePath,l,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...a)}const o=Date.now()-e;this.summary=D(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 v(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:e,totalCompressedSize:s,totalRatio:r,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${t} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${c(e)} \u2192 \u538B\u7F29\u540E: ${c(s)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${o}ms`);const l=[...this.allStats].sort((a,n)=>n.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}% ${c(a.originalSize)} \u2192 ${c(a.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const L=d($);export{L 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 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,4 +1,4 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs"),u=require("path"),s=require("fs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("crypto");class R extends factory_index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(e){switch(this.options.nameStrategy){case"path":return e.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return common_format_index.toCamelCase(e);case"pascalCase":return common_format_index.toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return common_format_index.toCamelCase(e)}}extractMeta(e,a){const t={},r=e.style||{},o=this.options.metaMapping||{};for(const[n,i]of Object.entries(o))r[n]!==void 0&&(t[i]=r[n]);return this.tabBarPages.has(a)&&(t.isTab=!0),t}parsePageToRoute(e,a=""){const t=a?`/${a}/${e.path}`:`/${e.path}`,r=this.generateRouteName(t),o=this.extractMeta(e,t.replace(/^\//,"")),n={path:t,name:r};return Object.keys(o).length>0&&(n.meta=o),n}parsePagesJson(e){const a=[];if(!e.pages||!Array.isArray(e.pages)||e.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),a;if(this.tabBarPages.clear(),e.tabBar?.list)for(const t of e.tabBar.list)this.tabBarPages.add(t.pagePath);for(const t of e.pages)a.push(this.parsePageToRoute(t));if(this.options.includeSubPackages&&e.subPackages){for(const t of e.subPackages)if(t.pages&&Array.isArray(t.pages))for(const r of t.pages)a.push(this.parsePageToRoute(r,t.root))}return a}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs"),f=require("path"),s=require("fs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("crypto"),require("node:path");class R extends factory_index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(e){switch(this.options.nameStrategy){case"path":return e.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return common_format_index.toCamelCase(e);case"pascalCase":return common_format_index.toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return common_format_index.toCamelCase(e)}}extractMeta(e,u){const t={},a=e.style||{},r=this.options.metaMapping||{};for(const[o,n]of Object.entries(r))a[o]!==void 0&&(t[n]=a[o]);return this.tabBarPages.has(u)&&(t.isTab=!0),t}parsePageToRoute(e,u=""){const t=u?`/${u}/${e.path}`:`/${e.path}`,a=this.generateRouteName(t),r=this.extractMeta(e,t.replace(/^\//,"")),o={path:t,name:a};return Object.keys(r).length>0&&(o.meta=r),o}parsePagesJson(e){const u=[];if(!e.pages||!Array.isArray(e.pages)||e.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),u;if(this.tabBarPages.clear(),e.tabBar?.list)for(const t of e.tabBar.list)this.tabBarPages.add(t.pagePath);for(const t of e.pages)u.push(this.parsePageToRoute(t));if(this.options.includeSubPackages&&e.subPackages){for(const t of e.subPackages)if(t.pages&&Array.isArray(t.pages))for(const a of t.pages)u.push(this.parsePageToRoute(a,t.root))}return u}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
2
2
  /**
3
3
  * \u8DEF\u7531\u5143\u4FE1\u606F
4
4
  */
@@ -24,12 +24,12 @@ export interface RouteConfig {
24
24
  /** \u8DEF\u7531\u5143\u4FE1\u606F */
25
25
  meta?: RouteMeta
26
26
  }
27
- `}generateFileContent(e){const a=this.generateTypeDefinitions(),t=this.options.outputFormat==="ts",r=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${a}
27
+ `}generateFileContent(e){const u=this.generateTypeDefinitions(),t=this.options.outputFormat==="ts",a=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${u}
28
28
  /**
29
29
  * \u8DEF\u7531\u914D\u7F6E\u5217\u8868
30
30
  * @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
31
31
  */
32
- export const routes${t?": RouteConfig[]":""} = ${r}
32
+ export const routes${t?": RouteConfig[]":""} = ${a}
33
33
 
34
34
  export default routes
35
- `}async readPagesJson(){const e=u.resolve(this.projectRoot,this.options.pagesJsonPath);if(!s.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const a=await common_fs_index.readFileContent(e),t=common_format_index.stripJsonComments(a);return JSON.parse(t)}catch(a){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${a.message}`),null}}extractExistingRoutes(e){const a=new Map,t=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!t)return a;try{let r=t[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const o=JSON.parse(r);for(const n of o)n.path&&a.set(n.path,n)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return a}mergeRoutes(e,a){return e.map(t=>{const r=a.get(t.path);if(!r)return t;const o={};return t.meta&&Object.assign(o,t.meta),r.meta&&Object.assign(o,r.meta),{...r,path:t.path,meta:Object.keys(o).length>0?o:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let a=this.parsePagesJson(e);const t=u.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s.existsSync(t))try{const o=await common_fs_index.readFileContent(t),n=this.extractExistingRoutes(o);n.size>0&&(a=this.mergeRoutes(a,n),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const r=this.generateFileContent(a);await common_fs_index.writeFileContent(t,r),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`),this.logger.info(`\u5171\u751F\u6210 ${a.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=u.resolve(this.projectRoot,this.options.pagesJsonPath);s.existsSync(e)&&(this.watcher=s.watch(e,async a=>{a==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${e}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(e){e.configResolved=async a=>{this.projectRoot=a.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),a.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(R);exports.generateRouter=generateRouter;
35
+ `}async readPagesJson(){const e=f.resolve(this.projectRoot,this.options.pagesJsonPath);if(!s.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const u=await common_fs_index.readFileContent(e),t=common_format_index.stripJsonComments(u);return JSON.parse(t)}catch(u){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${u.message}`),null}}extractExistingRoutes(e){const u=new Map,t=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!t)return u;try{let a=t[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const r=JSON.parse(a);for(const o of r)o.path&&u.set(o.path,o)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return u}mergeRoutes(e,u){return e.map(t=>{const a=u.get(t.path);if(!a)return t;const r={};return t.meta&&Object.assign(r,t.meta),a.meta&&Object.assign(r,a.meta),{...a,path:t.path,meta:Object.keys(r).length>0?r:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let u=this.parsePagesJson(e);const t=f.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s.existsSync(t))try{const r=await common_fs_index.readFileContent(t),o=this.extractExistingRoutes(r);o.size>0&&(u=this.mergeRoutes(u,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const a=this.generateFileContent(u);await common_fs_index.writeFileContent(t,a),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`),this.logger.info(`\u5171\u751F\u6210 ${u.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=f.resolve(this.projectRoot,this.options.pagesJsonPath);s.existsSync(e)&&(this.watcher=s.watch(e,async u=>{u==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${e}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(e){e.configResolved=async u=>{this.projectRoot=u.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),u.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(R);exports.generateRouter=generateRouter;
@@ -1,4 +1,4 @@
1
- import{createPluginFactory as p,BasePlugin as h}from"../../factory/index.mjs";import{readFileContent as i,writeFileContent as l}from"../../common/fs/index.mjs";import{toCamelCase as g,toPascalCase as F,stripJsonComments as m}from"../../common/format/index.mjs";import{resolve as r}from"path";import{existsSync as n,watch as f}from"fs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"crypto";class E extends h{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(t){switch(this.options.nameStrategy){case"path":return t.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return g(t);case"pascalCase":return F(t);case"custom":return this.options.customNameGenerator(t);default:return g(t)}}extractMeta(t,u){const e={},s=t.style||{},a=this.options.metaMapping||{};for(const[o,c]of Object.entries(a))s[o]!==void 0&&(e[c]=s[o]);return this.tabBarPages.has(u)&&(e.isTab=!0),e}parsePageToRoute(t,u=""){const e=u?`/${u}/${t.path}`:`/${t.path}`,s=this.generateRouteName(e),a=this.extractMeta(t,e.replace(/^\//,"")),o={path:e,name:s};return Object.keys(a).length>0&&(o.meta=a),o}parsePagesJson(t){const u=[];if(!t.pages||!Array.isArray(t.pages)||t.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),u;if(this.tabBarPages.clear(),t.tabBar?.list)for(const e of t.tabBar.list)this.tabBarPages.add(e.pagePath);for(const e of t.pages)u.push(this.parsePageToRoute(e));if(this.options.includeSubPackages&&t.subPackages){for(const e of t.subPackages)if(e.pages&&Array.isArray(e.pages))for(const s of e.pages)u.push(this.parsePageToRoute(s,e.root))}return u}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
1
+ import{createPluginFactory as p,BasePlugin as h}from"../../factory/index.mjs";import{readFileContent as i,writeFileContent as l}from"../../common/fs/index.mjs";import{toCamelCase as g,toPascalCase as F,stripJsonComments as m}from"../../common/format/index.mjs";import{resolve as r}from"path";import{existsSync as n,watch as f}from"fs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"crypto";import"node:path";class E extends h{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(t){switch(this.options.nameStrategy){case"path":return t.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return g(t);case"pascalCase":return F(t);case"custom":return this.options.customNameGenerator(t);default:return g(t)}}extractMeta(t,u){const e={},s=t.style||{},a=this.options.metaMapping||{};for(const[o,c]of Object.entries(a))s[o]!==void 0&&(e[c]=s[o]);return this.tabBarPages.has(u)&&(e.isTab=!0),e}parsePageToRoute(t,u=""){const e=u?`/${u}/${t.path}`:`/${t.path}`,s=this.generateRouteName(e),a=this.extractMeta(t,e.replace(/^\//,"")),o={path:e,name:s};return Object.keys(a).length>0&&(o.meta=a),o}parsePagesJson(t){const u=[];if(!t.pages||!Array.isArray(t.pages)||t.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),u;if(this.tabBarPages.clear(),t.tabBar?.list)for(const e of t.tabBar.list)this.tabBarPages.add(e.pagePath);for(const e of t.pages)u.push(this.parsePageToRoute(e));if(this.options.includeSubPackages&&t.subPackages){for(const e of t.subPackages)if(e.pages&&Array.isArray(e.pages))for(const s of e.pages)u.push(this.parsePageToRoute(s,e.root))}return u}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
2
2
  /**
3
3
  * \u8DEF\u7531\u5143\u4FE1\u606F
4
4
  */
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),u=require("path");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("crypto"),require("fs");class f extends factory_index.BasePlugin{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const e=common_format_index.getDateFormatParams(this.buildTime),t=common_format_index.generateRandomHash(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":i=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":i=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=t;break;case"custom":i=this.parseCustomFormat({...e,hash:t});break;default:i=e.timestamp}const s=this.options.prefix||"",o=this.options.suffix||"";return`${s}${i}${o}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[i,s,o]=this.options.semverBase.split(".");t.major=i||"1",t.minor=s||"0",t.patch=o||"0"}return common_format_index.parseTemplate(this.options.customFormat||"",t)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(e){const t=u.join(e,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await common_fs_index.writeFileContent(t,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`)}addPluginHooks(e){e.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(e.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const t=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${t} = "${this.version}"`),{define:{[t]:JSON.stringify(this.version),[`${t}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(e.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const t=this.viteConfig.build.outDir;await this.writeVersionFile(t)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const generateVersion=factory_index.createPluginFactory(f);exports.generateVersion=generateVersion;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),f$1=require("path");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("crypto"),require("node:path"),require("fs");class f extends factory_index.BasePlugin{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const e=common_format_index.getDateFormatParams(this.buildTime),t=common_format_index.generateRandomHash(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":i=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":i=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=t;break;case"custom":i=this.parseCustomFormat({...e,hash:t});break;default:i=e.timestamp}const s=this.options.prefix||"",o=this.options.suffix||"";return`${s}${i}${o}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[i,s,o]=this.options.semverBase.split(".");t.major=i||"1",t.minor=s||"0",t.patch=o||"0"}return common_format_index.parseTemplate(this.options.customFormat||"",t)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(e){const t=f$1.join(e,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await common_fs_index.writeFileContent(t,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`)}addPluginHooks(e){e.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(e.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const t=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${t} = "${this.version}"`),{define:{[t]:JSON.stringify(this.version),[`${t}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(e.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const t=this.viteConfig.build.outDir;await this.writeVersionFile(t)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const generateVersion=factory_index.createPluginFactory(f);exports.generateVersion=generateVersion;
@@ -1 +1 @@
1
- import{createPluginFactory as n,BasePlugin as r}from"../../factory/index.mjs";import{getDateFormatParams as a,generateRandomHash as u,parseTemplate as m}from"../../common/format/index.mjs";import{writeFileContent as h}from"../../common/fs/index.mjs";import{join as p}from"path";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"crypto";import"fs";class f extends r{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const t=a(this.buildTime),e=u(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${t.YYYY}${t.MM}${t.DD}${t.HH}${t.mm}${t.ss}`;break;case"date":i=`${t.YYYY}.${t.MM}.${t.DD}`;break;case"datetime":i=`${t.YYYY}.${t.MM}.${t.DD}.${t.HH}${t.mm}${t.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=e;break;case"custom":i=this.parseCustomFormat({...t,hash:e});break;default:i=t.timestamp}const s=this.options.prefix||"",o=this.options.suffix||"";return`${s}${i}${o}`}parseCustomFormat(t){const e={...t};if(this.options.semverBase){const[i,s,o]=this.options.semverBase.split(".");e.major=i||"1",e.minor=s||"0",e.patch=o||"0"}return m(this.options.customFormat||"",e)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(t){const e=p(t,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await h(e,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`)}addPluginHooks(t){t.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(t.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const e=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${e} = "${this.version}"`),{define:{[e]:JSON.stringify(this.version),[`${e}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(t.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const e=this.viteConfig.build.outDir;await this.writeVersionFile(e)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const l=n(f);export{l as generateVersion};
1
+ import{createPluginFactory as r,BasePlugin as n}from"../../factory/index.mjs";import{getDateFormatParams as a,generateRandomHash as u,parseTemplate as m}from"../../common/format/index.mjs";import{writeFileContent as h}from"../../common/fs/index.mjs";import{join as p}from"path";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"crypto";import"node:path";import"fs";class f extends n{version="";buildTime=new Date;getDefaultOptions(){return{format:"timestamp",semverBase:"1.0.0",outputType:"file",outputFile:"version.json",defineName:"__APP_VERSION__",hashLength:8,prefix:"",suffix:""}}validateOptions(){if(this.validator.field("format").enum(["timestamp","date","datetime","semver","hash","custom"]).field("outputType").enum(["file","define","both"]).field("hashLength").number().minValue(1).maxValue(32).validate(),this.options.format==="custom"&&!this.options.customFormat)throw new Error("\u5F53 format \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customFormat")}getPluginName(){return"generate-version"}generateVersion(){const t=a(this.buildTime),e=u(this.options.hashLength);let i;switch(this.options.format){case"timestamp":i=`${t.YYYY}${t.MM}${t.DD}${t.HH}${t.mm}${t.ss}`;break;case"date":i=`${t.YYYY}.${t.MM}.${t.DD}`;break;case"datetime":i=`${t.YYYY}.${t.MM}.${t.DD}.${t.HH}${t.mm}${t.ss}`;break;case"semver":i=this.options.semverBase||"1.0.0";break;case"hash":i=e;break;case"custom":i=this.parseCustomFormat({...t,hash:e});break;default:i=t.timestamp}const s=this.options.prefix||"",o=this.options.suffix||"";return`${s}${i}${o}`}parseCustomFormat(t){const e={...t};if(this.options.semverBase){const[i,s,o]=this.options.semverBase.split(".");e.major=i||"1",e.minor=s||"0",e.patch=o||"0"}return m(this.options.customFormat||"",e)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(t){const e=p(t,this.options.outputFile||"version.json"),i=this.generateVersionInfo();await h(e,JSON.stringify(i,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`)}addPluginHooks(t){t.configResolved=()=>{this.buildTime=new Date,this.version=this.generateVersion(),this.logger.info(`\u751F\u6210\u7248\u672C\u53F7: ${this.version}`)},(this.options.outputType==="define"||this.options.outputType==="both")&&(t.config=()=>{this.version||(this.buildTime=new Date,this.version=this.generateVersion());const e=this.options.defineName||"__APP_VERSION__";return this.logger.info(`\u6CE8\u5165\u5168\u5C40\u53D8\u91CF: ${e} = "${this.version}"`),{define:{[e]:JSON.stringify(this.version),[`${e}_INFO`]:JSON.stringify(this.generateVersionInfo())}}}),(this.options.outputType==="file"||this.options.outputType==="both")&&(t.writeBundle=async()=>{this.viteConfig&&await this.safeExecute(async()=>{const e=this.viteConfig.build.outDir;await this.writeVersionFile(e)},"\u5199\u5165\u7248\u672C\u6587\u4EF6")})}}const l=r(f);export{l as generateVersion};
@@ -1,7 +1,7 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_script_index=require("../../common/script/index.cjs"),o=require("node:path");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const o__default=_interopDefaultCompat(o),g$1=["script","iframe","object","embed","applet","form","input","textarea","select","button"],b=["onclick","ondblclick","onmouseover","onmouseout","onmousemove","onmousedown","onmouseup","onkeydown","onkeyup","onkeypress","onload","onerror","onfocus","onblur","onsubmit","onchange","oninput","oncontextmenu","ondrag","ondrop","onanimationend","ontransitionend"];function validateRules(e){if(!e.rules||!Array.isArray(e.rules))throw new Error("rules \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");if(e.rules.length===0)throw new Error("rules \u4E0D\u80FD\u4E3A\u7A7A\u6570\u7EC4");for(let t=0;t<e.rules.length;t++)m(e.rules[t],t)}function m(e,t){if(!e.content||typeof e.content!="string")throw new Error(`rules[${t}].content \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`);if(!e.position||typeof e.position!="string")throw new Error(`rules[${t}].position \u5FC5\u987B\u662F\u6709\u6548\u7684\u6CE8\u5165\u4F4D\u7F6E`);const n=["head-start","head-end","body-start","body-end","before-selector","after-selector","replace-selector"];if(!n.includes(e.position))throw new Error(`rules[${t}].position \u5FC5\u987B\u662F ${n.join(", ")} \u4E4B\u4E00`);if(e.position.includes("selector")&&!e.selector)throw new Error(`rules[${t}].position \u4E3A "${e.position}" \u65F6\uFF0Cselector \u4E3A\u5FC5\u586B\u9879`);if(e.priority!==void 0&&(typeof e.priority!="number"||e.priority<0))throw new Error(`rules[${t}].priority \u5FC5\u987B\u662F\u975E\u8D1F\u6570`);e.condition&&y(e.condition,t)}function y(e,t){if(!e)return;const n=["env","file-contains","custom"];if(!n.includes(e.type))throw new Error(`rules[${t}].condition.type \u5FC5\u987B\u662F ${n.join(", ")} \u4E4B\u4E00`);if(e.type==="custom"&&typeof e.value!="function")throw new Error(`rules[${t}].condition.type \u4E3A "custom" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u51FD\u6570`);if(e.type!=="custom"&&typeof e.value!="string")throw new Error(`rules[${t}].condition.type \u4E3A "${e.type}" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`)}function validateSecurityConfig(e){if(e){if(e.blockedTags&&!Array.isArray(e.blockedTags))throw new Error("security.blockedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(e.allowedTags&&!Array.isArray(e.allowedTags))throw new Error("security.allowedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(e.blockedAttributes&&!Array.isArray(e.blockedAttributes))throw new Error("security.blockedAttributes \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4")}}function validateAll(e){validateRules(e),validateSecurityConfig(e.security)}function sanitizeContent(e,t,n,i){const c=n?.blockDangerousTags!==!1,r=n?.blockDangerousAttributes!==!1,s=n?.blockedTags||g$1,f=n?.allowedTags,a=n?.blockedAttributes||b;let l=e;if(c){const E=f?s.filter(d=>!f.includes(d)):s;if(common_script_index.containsScriptTag(e))if(t.allowScriptInjection)i?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${t.id||"unnamed"}" \u5DF2\u542F\u7528\u811A\u672C\u6CE8\u5165(allowScriptInjection=true)\uFF0C\u8BF7\u786E\u4FDD\u6CE8\u5165\u5185\u5BB9\u6765\u6E90\u53EF\u4FE1\u3002\u6CE8\u5165\u811A\u672C\u53EF\u80FD\u5E26\u6765 XSS \u653B\u51FB\u98CE\u9669\u3002`);else throw new Error(`\u89C4\u5219 "${t.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B <script> \u6807\u7B7E\uFF0C\u9ED8\u8BA4\u88AB\u963B\u6B62\u3002\u5982\u9700\u6CE8\u5165\u811A\u672C\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);for(const d of E){if(d==="script")continue;const F=new RegExp(`<${d}\\b[^>]*>[\\s\\S]*?<\\/${d}>`,"gi"),h=new RegExp(`<${d}\\b[^>]*/?>`,"gi");if(F.test(l)||h.test(l))if(t.allowScriptInjection){i?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${t.id||"unnamed"}" \u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${d}>\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${t.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${d}>\u3002\u5982\u9700\u6CE8\u5165\u6B64\u6807\u7B7E\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true \u6216\u5728 security.allowedTags \u4E2D\u6DFB\u52A0 "${d}"`);l=l.replace(F,""),l=l.replace(h,"")}}if(r)for(const E of a){const d=new RegExp(`\\s${E}\\s*=\\s*["'][^"']*["']`,"gi");if(d.test(l))if(t.allowScriptInjection){i?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${t.id||"unnamed"}" \u5305\u542B\u5371\u9669\u5C5E\u6027 ${E}\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${t.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u5371\u9669\u5C5E\u6027 ${E}\u3002\u5982\u9700\u6CE8\u5165\u6B64\u5C5E\u6027\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);l=l.replace(d,"")}return l}function g(e,t,n){if(n==="regex"){try{const c=new RegExp(t),r=e.match(c);if(r&&r.index!==void 0)return{index:r.index,length:r[0].length}}catch{return null}return null}const i=e.indexOf(t);return i===-1?null:{index:i,length:t.length}}function applyTemplateVars(e,t,n){let i=e;const c={...n,...t};for(const[r,s]of Object.entries(c)){const f=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=s.replace(/\$/g,"$$$$");i=i.replace(new RegExp(`\\{\\{${f}\\}\\}`,"g"),a)}return i}function evaluateCondition(e,t){let n=!1;switch(e.type){case"env":{const i=e.value,c=process.env[i];n=!!c&&c!=="false"&&c!=="0";break}case"file-contains":{const i=e.value;n=t.includes(i);break}case"custom":{const i=e.value;try{n=!!i()}catch{n=!1}break}}return e.negate?!n:n}function sortRulesByPriority(e){return[...e].sort((t,n)=>(t.priority??100)-(n.priority??100))}function injectAtPosition(e,t,n,i,c){switch(n){case"head-start":{const r=e.match(/<head\b[^>]*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 <head> \u6807\u7B7E"};const s=(r.index??0)+r[0].length;return{html:e.slice(0,s)+`
2
- `+t+e.slice(s),injected:!0}}case"head-end":{const r=e.match(/<\/head\s*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 </head> \u6807\u7B7E"};const s=r.index;return{html:e.slice(0,s)+t+`
3
- `+e.slice(s),injected:!0}}case"body-start":{const r=e.match(/<body\b[^>]*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 <body> \u6807\u7B7E"};const s=(r.index??0)+r[0].length;return{html:e.slice(0,s)+`
4
- `+t+e.slice(s),injected:!0}}case"body-end":{const r=e.match(/<\/body\s*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 </body> \u6807\u7B7E"};const s=r.index;return{html:e.slice(0,s)+t+`
5
- `+e.slice(s),injected:!0}}case"before-selector":{if(!i)return{html:e,injected:!1,reason:"before-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(e,i,c);return r?{html:e.slice(0,r.index)+t+`
6
- `+e.slice(r.index),injected:!0}:{html:e,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${i}"`}}case"after-selector":{if(!i)return{html:e,injected:!1,reason:"after-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(e,i,c);if(!r)return{html:e,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${i}"`};const s=r.index+r.length;return{html:e.slice(0,s)+`
7
- `+t+e.slice(s),injected:!0}}case"replace-selector":{if(!i)return{html:e,injected:!1,reason:"replace-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(e,i,c);if(!r)return{html:e,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${i}"`};const s=r.index+r.length;return{html:e.slice(0,r.index)+t+e.slice(s),injected:!0}}default:return{html:e,injected:!1,reason:`\u4E0D\u652F\u6301\u7684\u6CE8\u5165\u4F4D\u7F6E: ${n}`}}}function processRules(e,t,n,i,c){let r=e;const s=[],f=sortRulesByPriority(t);for(const a of f){const l={ruleId:a.id||"unnamed",position:a.position,selector:a.selector,injected:!1,timestamp:Date.now()};if(a.condition&&!evaluateCondition(a.condition,r)){l.injected=!1,l.reason="\u6761\u4EF6\u4E0D\u6EE1\u8DB3\uFF0C\u8DF3\u8FC7\u6CE8\u5165",s.push(l);continue}let E=applyTemplateVars(a.content,a.templateVars,n);try{E=sanitizeContent(E,a,i,c)}catch(F){l.injected=!1,l.reason=F.message,s.push(l),c?.warn(`\u89C4\u5219 "${a.id||"unnamed"}" \u5B89\u5168\u68C0\u67E5\u5931\u8D25: ${F.message}`);continue}const d=injectAtPosition(r,E,a.position,a.selector,a.selectorMatch);r=d.html,l.injected=d.injected,l.reason=d.reason,s.push(l)}return{html:r,logs:s}}class u extends factory_index.BasePlugin{injectionLogs=[];getDefaultOptions(){return{targetFile:"index.html",logInjection:!0,security:{blockDangerousTags:!0,blockDangerousAttributes:!0}}}validateOptions(){this.validator.field("targetFile").string().field("rules").required().field("logInjection").boolean().validate(),validateAll(this.options)}getPluginName(){return"html-inject"}isTargetFile(t,n){if(n==="index.html")return t.endsWith("index.html")||t.endsWith("index.htm");const i=n.replace(/\\/g,"/"),c=t.replace(/\\/g,"/");return c.endsWith(i)?!0:o__default.basename(c)===o__default.basename(i)}addPluginHooks(t){t.transformIndexHtml={order:"post",handler:(n,i)=>{const c=i.filename||"",r=this.options.targetFile||"index.html";if(!this.isTargetFile(c,r))return n;const s={warn:a=>this.logger.warn(a)},f=processRules(n,this.options.rules,this.options.templateVars,this.options.security,s);return this.injectionLogs=f.logs,this.options.logInjection&&this.logInjectionResults(f.logs),f.html}},t.buildEnd=()=>{this.options.logInjection&&this.injectionLogs.length>0&&this.logger.info(`\u6CE8\u5165\u5B8C\u6210\uFF0C\u5171\u5904\u7406 ${this.injectionLogs.length} \u6761\u89C4\u5219`)}}logInjectionResults(t){for(const n of t)n.injected?this.logger.success(`\u89C4\u5219 "${n.ruleId}" \u6CE8\u5165\u6210\u529F (\u4F4D\u7F6E: ${n.position}${n.selector?`, \u9009\u62E9\u5668: ${n.selector}`:""})`):this.logger.warn(`\u89C4\u5219 "${n.ruleId}" \u6CE8\u5165\u5931\u8D25: ${n.reason||"\u672A\u77E5\u539F\u56E0"}`)}getInjectionLogs(){return[...this.injectionLogs]}}const htmlInject=factory_index.createPluginFactory(u);exports.htmlInject=htmlInject;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_script_index=require("../../common/script/index.cjs"),a=require("node:path");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const a__default=_interopDefaultCompat(a),g$1=["script","iframe","object","embed","applet","form","input","textarea","select","button"],b=["onclick","ondblclick","onmouseover","onmouseout","onmousemove","onmousedown","onmouseup","onkeydown","onkeyup","onkeypress","onload","onerror","onfocus","onblur","onsubmit","onchange","oninput","oncontextmenu","ondrag","ondrop","onanimationend","ontransitionend"];function validateRules(e){if(!e.rules||!Array.isArray(e.rules))throw new Error("rules \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");if(e.rules.length===0)throw new Error("rules \u4E0D\u80FD\u4E3A\u7A7A\u6570\u7EC4");for(let t=0;t<e.rules.length;t++)m(e.rules[t],t)}function m(e,t){if(!e.content||typeof e.content!="string")throw new Error(`rules[${t}].content \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`);if(!e.position||typeof e.position!="string")throw new Error(`rules[${t}].position \u5FC5\u987B\u662F\u6709\u6548\u7684\u6CE8\u5165\u4F4D\u7F6E`);const n=["head-start","head-end","body-start","body-end","before-selector","after-selector","replace-selector"];if(!n.includes(e.position))throw new Error(`rules[${t}].position \u5FC5\u987B\u662F ${n.join(", ")} \u4E4B\u4E00`);if(e.position.includes("selector")&&!e.selector)throw new Error(`rules[${t}].position \u4E3A "${e.position}" \u65F6\uFF0Cselector \u4E3A\u5FC5\u586B\u9879`);if(e.priority!==void 0&&(typeof e.priority!="number"||e.priority<0))throw new Error(`rules[${t}].priority \u5FC5\u987B\u662F\u975E\u8D1F\u6570`);e.condition&&y(e.condition,t)}function y(e,t){if(!e)return;const n=["env","file-contains","custom"];if(!n.includes(e.type))throw new Error(`rules[${t}].condition.type \u5FC5\u987B\u662F ${n.join(", ")} \u4E4B\u4E00`);if(e.type==="custom"&&typeof e.value!="function")throw new Error(`rules[${t}].condition.type \u4E3A "custom" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u51FD\u6570`);if(e.type!=="custom"&&typeof e.value!="string")throw new Error(`rules[${t}].condition.type \u4E3A "${e.type}" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`)}function validateSecurityConfig(e){if(e){if(e.blockedTags&&!Array.isArray(e.blockedTags))throw new Error("security.blockedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(e.allowedTags&&!Array.isArray(e.allowedTags))throw new Error("security.allowedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(e.blockedAttributes&&!Array.isArray(e.blockedAttributes))throw new Error("security.blockedAttributes \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4")}}function validateAll(e){validateRules(e),validateSecurityConfig(e.security)}function sanitizeContent(e,t,n,o){const s=n?.blockDangerousTags!==!1,r=n?.blockDangerousAttributes!==!1,i=n?.blockedTags||g$1,f=n?.allowedTags,l=n?.blockedAttributes||b;let c=e;if(s){const E=f?i.filter(d=>!f.includes(d)):i;if(common_script_index.containsScriptTag(e))if(t.allowScriptInjection)o?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${t.id||"unnamed"}" \u5DF2\u542F\u7528\u811A\u672C\u6CE8\u5165(allowScriptInjection=true)\uFF0C\u8BF7\u786E\u4FDD\u6CE8\u5165\u5185\u5BB9\u6765\u6E90\u53EF\u4FE1\u3002\u6CE8\u5165\u811A\u672C\u53EF\u80FD\u5E26\u6765 XSS \u653B\u51FB\u98CE\u9669\u3002`);else throw new Error(`\u89C4\u5219 "${t.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B <script> \u6807\u7B7E\uFF0C\u9ED8\u8BA4\u88AB\u963B\u6B62\u3002\u5982\u9700\u6CE8\u5165\u811A\u672C\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);for(const d of E){if(d==="script")continue;const F=new RegExp(`<${d}\\b[^>]*>[\\s\\S]*?<\\/${d}>`,"gi"),h=new RegExp(`<${d}\\b[^>]*/?>`,"gi");if(F.test(c)||h.test(c))if(t.allowScriptInjection){o?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${t.id||"unnamed"}" \u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${d}>\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${t.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${d}>\u3002\u5982\u9700\u6CE8\u5165\u6B64\u6807\u7B7E\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true \u6216\u5728 security.allowedTags \u4E2D\u6DFB\u52A0 "${d}"`);c=c.replace(F,""),c=c.replace(h,"")}}if(r)for(const E of l){const d=new RegExp(`\\s${E}\\s*=\\s*["'][^"']*["']`,"gi");if(d.test(c))if(t.allowScriptInjection){o?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${t.id||"unnamed"}" \u5305\u542B\u5371\u9669\u5C5E\u6027 ${E}\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${t.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u5371\u9669\u5C5E\u6027 ${E}\u3002\u5982\u9700\u6CE8\u5165\u6B64\u5C5E\u6027\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);c=c.replace(d,"")}return c}function g(e,t,n){if(n==="regex"){try{const s=new RegExp(t),r=e.match(s);if(r&&r.index!==void 0)return{index:r.index,length:r[0].length}}catch{return null}return null}const o=e.indexOf(t);return o===-1?null:{index:o,length:t.length}}function applyTemplateVars(e,t,n){let o=e;const s={...n,...t};for(const[r,i]of Object.entries(s)){const f=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=i.replace(/\$/g,"$$$$");o=o.replace(new RegExp(`\\{\\{${f}\\}\\}`,"g"),l)}return o}function evaluateCondition(e,t){let n=!1;switch(e.type){case"env":{const o=e.value,s=process.env[o];n=!!s&&s!=="false"&&s!=="0";break}case"file-contains":{const o=e.value;n=t.includes(o);break}case"custom":{const o=e.value;try{n=!!o()}catch{n=!1}break}}return e.negate?!n:n}function sortRulesByPriority(e){return[...e].sort((t,n)=>(t.priority??100)-(n.priority??100))}function injectAtPosition(e,t,n,o,s){switch(n){case"head-start":{const r=e.match(/<head\b[^>]*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 <head> \u6807\u7B7E"};const i=(r.index??0)+r[0].length;return{html:e.slice(0,i)+`
2
+ `+t+e.slice(i),injected:!0}}case"head-end":{const r=e.match(/<\/head\s*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 </head> \u6807\u7B7E"};const i=r.index;return{html:e.slice(0,i)+t+`
3
+ `+e.slice(i),injected:!0}}case"body-start":{const r=e.match(/<body\b[^>]*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 <body> \u6807\u7B7E"};const i=(r.index??0)+r[0].length;return{html:e.slice(0,i)+`
4
+ `+t+e.slice(i),injected:!0}}case"body-end":{const r=e.match(/<\/body\s*>/i);if(!r)return{html:e,injected:!1,reason:"\u672A\u627E\u5230 </body> \u6807\u7B7E"};const i=r.index;return{html:e.slice(0,i)+t+`
5
+ `+e.slice(i),injected:!0}}case"before-selector":{if(!o)return{html:e,injected:!1,reason:"before-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(e,o,s);return r?{html:e.slice(0,r.index)+t+`
6
+ `+e.slice(r.index),injected:!0}:{html:e,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${o}"`}}case"after-selector":{if(!o)return{html:e,injected:!1,reason:"after-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(e,o,s);if(!r)return{html:e,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${o}"`};const i=r.index+r.length;return{html:e.slice(0,i)+`
7
+ `+t+e.slice(i),injected:!0}}case"replace-selector":{if(!o)return{html:e,injected:!1,reason:"replace-selector \u9700\u8981 selector \u53C2\u6570"};const r=g(e,o,s);if(!r)return{html:e,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${o}"`};const i=r.index+r.length;return{html:e.slice(0,r.index)+t+e.slice(i),injected:!0}}default:return{html:e,injected:!1,reason:`\u4E0D\u652F\u6301\u7684\u6CE8\u5165\u4F4D\u7F6E: ${n}`}}}function processRules(e,t,n,o,s){let r=e;const i=[],f=sortRulesByPriority(t);for(const l of f){const c={ruleId:l.id||"unnamed",position:l.position,selector:l.selector,injected:!1,timestamp:Date.now()};if(l.condition&&!evaluateCondition(l.condition,r)){c.injected=!1,c.reason="\u6761\u4EF6\u4E0D\u6EE1\u8DB3\uFF0C\u8DF3\u8FC7\u6CE8\u5165",i.push(c);continue}let E=applyTemplateVars(l.content,l.templateVars,n);try{E=sanitizeContent(E,l,o,s)}catch(F){c.injected=!1,c.reason=F.message,i.push(c),s?.warn(`\u89C4\u5219 "${l.id||"unnamed"}" \u5B89\u5168\u68C0\u67E5\u5931\u8D25: ${F.message}`);continue}const d=injectAtPosition(r,E,l.position,l.selector,l.selectorMatch);r=d.html,c.injected=d.injected,c.reason=d.reason,i.push(c)}return{html:r,logs:i}}class u extends factory_index.BasePlugin{injectionLogs=[];getDefaultOptions(){return{targetFile:"index.html",logInjection:!0,security:{blockDangerousTags:!0,blockDangerousAttributes:!0}}}validateOptions(){this.validator.field("targetFile").string().field("rules").required().field("logInjection").boolean().validate(),validateAll(this.options)}getPluginName(){return"html-inject"}isTargetFile(t,n){if(n==="index.html")return t.endsWith("index.html")||t.endsWith("index.htm");const o=n.replace(/\\/g,"/"),s=t.replace(/\\/g,"/");return s.endsWith(o)?!0:a__default.basename(s)===a__default.basename(o)}addPluginHooks(t){t.transformIndexHtml={order:"post",handler:(n,o)=>{const s=o.filename||"",r=this.options.targetFile||"index.html";if(!this.isTargetFile(s,r))return n;const i={warn:l=>this.logger.warn(l)},f=processRules(n,this.options.rules,this.options.templateVars,this.options.security,i);return this.injectionLogs=f.logs,this.options.logInjection&&this.logInjectionResults(f.logs),f.html}},t.buildEnd=()=>{this.options.logInjection&&this.injectionLogs.length>0&&this.logger.info(`\u6CE8\u5165\u5B8C\u6210\uFF0C\u5171\u5904\u7406 ${this.injectionLogs.length} \u6761\u89C4\u5219`)}}logInjectionResults(t){for(const n of t)n.injected?this.logger.success(`\u89C4\u5219 "${n.ruleId}" \u6CE8\u5165\u6210\u529F (\u4F4D\u7F6E: ${n.position}${n.selector?`, \u9009\u62E9\u5668: ${n.selector}`:""})`):this.logger.warn(`\u89C4\u5219 "${n.ruleId}" \u6CE8\u5165\u5931\u8D25: ${n.reason||"\u672A\u77E5\u539F\u56E0"}`)}getInjectionLogs(){return[...this.injectionLogs]}}const htmlInject=factory_index.createPluginFactory(u);exports.htmlInject=htmlInject;
@@ -1,7 +1,7 @@
1
- import{createPluginFactory as p,BasePlugin as g}from"../../factory/index.mjs";import{containsScriptTag as B}from"../../common/script/index.mjs";import h from"node:path";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";const m=["script","iframe","object","embed","applet","form","input","textarea","select","button"],C=["onclick","ondblclick","onmouseover","onmouseout","onmousemove","onmousedown","onmouseup","onkeydown","onkeyup","onkeypress","onload","onerror","onfocus","onblur","onsubmit","onchange","oninput","oncontextmenu","ondrag","ondrop","onanimationend","ontransitionend"];function w(u){if(!u.rules||!Array.isArray(u.rules))throw new Error("rules \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");if(u.rules.length===0)throw new Error("rules \u4E0D\u80FD\u4E3A\u7A7A\u6570\u7EC4");for(let e=0;e<u.rules.length;e++)y(u.rules[e],e)}function y(u,e){if(!u.content||typeof u.content!="string")throw new Error(`rules[${e}].content \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`);if(!u.position||typeof u.position!="string")throw new Error(`rules[${e}].position \u5FC5\u987B\u662F\u6709\u6548\u7684\u6CE8\u5165\u4F4D\u7F6E`);const t=["head-start","head-end","body-start","body-end","before-selector","after-selector","replace-selector"];if(!t.includes(u.position))throw new Error(`rules[${e}].position \u5FC5\u987B\u662F ${t.join(", ")} \u4E4B\u4E00`);if(u.position.includes("selector")&&!u.selector)throw new Error(`rules[${e}].position \u4E3A "${u.position}" \u65F6\uFF0Cselector \u4E3A\u5FC5\u586B\u9879`);if(u.priority!==void 0&&(typeof u.priority!="number"||u.priority<0))throw new Error(`rules[${e}].priority \u5FC5\u987B\u662F\u975E\u8D1F\u6570`);u.condition&&j(u.condition,e)}function j(u,e){if(!u)return;const t=["env","file-contains","custom"];if(!t.includes(u.type))throw new Error(`rules[${e}].condition.type \u5FC5\u987B\u662F ${t.join(", ")} \u4E4B\u4E00`);if(u.type==="custom"&&typeof u.value!="function")throw new Error(`rules[${e}].condition.type \u4E3A "custom" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u51FD\u6570`);if(u.type!=="custom"&&typeof u.value!="string")throw new Error(`rules[${e}].condition.type \u4E3A "${u.type}" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`)}function $(u){if(u){if(u.blockedTags&&!Array.isArray(u.blockedTags))throw new Error("security.blockedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(u.allowedTags&&!Array.isArray(u.allowedTags))throw new Error("security.allowedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(u.blockedAttributes&&!Array.isArray(u.blockedAttributes))throw new Error("security.blockedAttributes \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4")}}function b(u){w(u),$(u.security)}function A(u,e,t,r){const i=t?.blockDangerousTags!==!1,n=t?.blockDangerousAttributes!==!1,o=t?.blockedTags||m,a=t?.allowedTags,l=t?.blockedAttributes||C;let s=u;if(i){const d=a?o.filter(c=>!a.includes(c)):o;if(B(u))if(e.allowScriptInjection)r?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${e.id||"unnamed"}" \u5DF2\u542F\u7528\u811A\u672C\u6CE8\u5165(allowScriptInjection=true)\uFF0C\u8BF7\u786E\u4FDD\u6CE8\u5165\u5185\u5BB9\u6765\u6E90\u53EF\u4FE1\u3002\u6CE8\u5165\u811A\u672C\u53EF\u80FD\u5E26\u6765 XSS \u653B\u51FB\u98CE\u9669\u3002`);else throw new Error(`\u89C4\u5219 "${e.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B <script> \u6807\u7B7E\uFF0C\u9ED8\u8BA4\u88AB\u963B\u6B62\u3002\u5982\u9700\u6CE8\u5165\u811A\u672C\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);for(const c of d){if(c==="script")continue;const f=new RegExp(`<${c}\\b[^>]*>[\\s\\S]*?<\\/${c}>`,"gi"),F=new RegExp(`<${c}\\b[^>]*/?>`,"gi");if(f.test(s)||F.test(s))if(e.allowScriptInjection){r?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${e.id||"unnamed"}" \u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${c}>\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${e.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${c}>\u3002\u5982\u9700\u6CE8\u5165\u6B64\u6807\u7B7E\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true \u6216\u5728 security.allowedTags \u4E2D\u6DFB\u52A0 "${c}"`);s=s.replace(f,""),s=s.replace(F,"")}}if(n)for(const d of l){const c=new RegExp(`\\s${d}\\s*=\\s*["'][^"']*["']`,"gi");if(c.test(s))if(e.allowScriptInjection){r?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${e.id||"unnamed"}" \u5305\u542B\u5371\u9669\u5C5E\u6027 ${d}\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${e.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u5371\u9669\u5C5E\u6027 ${d}\u3002\u5982\u9700\u6CE8\u5165\u6B64\u5C5E\u6027\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);s=s.replace(c,"")}return s}function E(u,e,t){if(t==="regex"){try{const i=new RegExp(e),n=u.match(i);if(n&&n.index!==void 0)return{index:n.index,length:n[0].length}}catch{return null}return null}const r=u.indexOf(e);return r===-1?null:{index:r,length:e.length}}function D(u,e,t){let r=u;const i={...t,...e};for(const[n,o]of Object.entries(i)){const a=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=o.replace(/\$/g,"$$$$");r=r.replace(new RegExp(`\\{\\{${a}\\}\\}`,"g"),l)}return r}function x(u,e){let t=!1;switch(u.type){case"env":{const r=u.value,i=process.env[r];t=!!i&&i!=="false"&&i!=="0";break}case"file-contains":{const r=u.value;t=e.includes(r);break}case"custom":{const r=u.value;try{t=!!r()}catch{t=!1}break}}return u.negate?!t:t}function k(u){return[...u].sort((e,t)=>(e.priority??100)-(t.priority??100))}function v(u,e,t,r,i){switch(t){case"head-start":{const n=u.match(/<head\b[^>]*>/i);if(!n)return{html:u,injected:!1,reason:"\u672A\u627E\u5230 <head> \u6807\u7B7E"};const o=(n.index??0)+n[0].length;return{html:u.slice(0,o)+`
1
+ import{createPluginFactory as p,BasePlugin as g}from"../../factory/index.mjs";import{containsScriptTag as B}from"../../common/script/index.mjs";import h from"node:path";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";const m=["script","iframe","object","embed","applet","form","input","textarea","select","button"],C=["onclick","ondblclick","onmouseover","onmouseout","onmousemove","onmousedown","onmouseup","onkeydown","onkeyup","onkeypress","onload","onerror","onfocus","onblur","onsubmit","onchange","oninput","oncontextmenu","ondrag","ondrop","onanimationend","ontransitionend"];function w(u){if(!u.rules||!Array.isArray(u.rules))throw new Error("rules \u5FC5\u987B\u662F\u975E\u7A7A\u6570\u7EC4");if(u.rules.length===0)throw new Error("rules \u4E0D\u80FD\u4E3A\u7A7A\u6570\u7EC4");for(let e=0;e<u.rules.length;e++)y(u.rules[e],e)}function y(u,e){if(!u.content||typeof u.content!="string")throw new Error(`rules[${e}].content \u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32`);if(!u.position||typeof u.position!="string")throw new Error(`rules[${e}].position \u5FC5\u987B\u662F\u6709\u6548\u7684\u6CE8\u5165\u4F4D\u7F6E`);const t=["head-start","head-end","body-start","body-end","before-selector","after-selector","replace-selector"];if(!t.includes(u.position))throw new Error(`rules[${e}].position \u5FC5\u987B\u662F ${t.join(", ")} \u4E4B\u4E00`);if(u.position.includes("selector")&&!u.selector)throw new Error(`rules[${e}].position \u4E3A "${u.position}" \u65F6\uFF0Cselector \u4E3A\u5FC5\u586B\u9879`);if(u.priority!==void 0&&(typeof u.priority!="number"||u.priority<0))throw new Error(`rules[${e}].priority \u5FC5\u987B\u662F\u975E\u8D1F\u6570`);u.condition&&j(u.condition,e)}function j(u,e){if(!u)return;const t=["env","file-contains","custom"];if(!t.includes(u.type))throw new Error(`rules[${e}].condition.type \u5FC5\u987B\u662F ${t.join(", ")} \u4E4B\u4E00`);if(u.type==="custom"&&typeof u.value!="function")throw new Error(`rules[${e}].condition.type \u4E3A "custom" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u51FD\u6570`);if(u.type!=="custom"&&typeof u.value!="string")throw new Error(`rules[${e}].condition.type \u4E3A "${u.type}" \u65F6\uFF0Cvalue \u5FC5\u987B\u662F\u5B57\u7B26\u4E32`)}function b(u){if(u){if(u.blockedTags&&!Array.isArray(u.blockedTags))throw new Error("security.blockedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(u.allowedTags&&!Array.isArray(u.allowedTags))throw new Error("security.allowedTags \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4");if(u.blockedAttributes&&!Array.isArray(u.blockedAttributes))throw new Error("security.blockedAttributes \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4")}}function $(u){w(u),b(u.security)}function A(u,e,t,r){const i=t?.blockDangerousTags!==!1,n=t?.blockDangerousAttributes!==!1,o=t?.blockedTags||m,a=t?.allowedTags,l=t?.blockedAttributes||C;let s=u;if(i){const d=a?o.filter(c=>!a.includes(c)):o;if(B(u))if(e.allowScriptInjection)r?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${e.id||"unnamed"}" \u5DF2\u542F\u7528\u811A\u672C\u6CE8\u5165(allowScriptInjection=true)\uFF0C\u8BF7\u786E\u4FDD\u6CE8\u5165\u5185\u5BB9\u6765\u6E90\u53EF\u4FE1\u3002\u6CE8\u5165\u811A\u672C\u53EF\u80FD\u5E26\u6765 XSS \u653B\u51FB\u98CE\u9669\u3002`);else throw new Error(`\u89C4\u5219 "${e.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B <script> \u6807\u7B7E\uFF0C\u9ED8\u8BA4\u88AB\u963B\u6B62\u3002\u5982\u9700\u6CE8\u5165\u811A\u672C\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);for(const c of d){if(c==="script")continue;const f=new RegExp(`<${c}\\b[^>]*>[\\s\\S]*?<\\/${c}>`,"gi"),F=new RegExp(`<${c}\\b[^>]*/?>`,"gi");if(f.test(s)||F.test(s))if(e.allowScriptInjection){r?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${e.id||"unnamed"}" \u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${c}>\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${e.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u88AB\u963B\u6B62\u7684\u6807\u7B7E <${c}>\u3002\u5982\u9700\u6CE8\u5165\u6B64\u6807\u7B7E\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true \u6216\u5728 security.allowedTags \u4E2D\u6DFB\u52A0 "${c}"`);s=s.replace(f,""),s=s.replace(F,"")}}if(n)for(const d of l){const c=new RegExp(`\\s${d}\\s*=\\s*["'][^"']*["']`,"gi");if(c.test(s))if(e.allowScriptInjection){r?.warn(`[\u5B89\u5168\u8B66\u544A] \u89C4\u5219 "${e.id||"unnamed"}" \u5305\u542B\u5371\u9669\u5C5E\u6027 ${d}\uFF0C\u5DF2\u901A\u8FC7 allowScriptInjection \u8DF3\u8FC7\u5B89\u5168\u68C0\u67E5\uFF0C\u8BF7\u786E\u4FDD\u5185\u5BB9\u53EF\u4FE1\u3002`);continue}else throw new Error(`\u89C4\u5219 "${e.id||"unnamed"}" \u7684\u5185\u5BB9\u5305\u542B\u5371\u9669\u5C5E\u6027 ${d}\u3002\u5982\u9700\u6CE8\u5165\u6B64\u5C5E\u6027\uFF0C\u8BF7\u8BBE\u7F6E allowScriptInjection: true`);s=s.replace(c,"")}return s}function E(u,e,t){if(t==="regex"){try{const i=new RegExp(e),n=u.match(i);if(n&&n.index!==void 0)return{index:n.index,length:n[0].length}}catch{return null}return null}const r=u.indexOf(e);return r===-1?null:{index:r,length:e.length}}function D(u,e,t){let r=u;const i={...t,...e};for(const[n,o]of Object.entries(i)){const a=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=o.replace(/\$/g,"$$$$");r=r.replace(new RegExp(`\\{\\{${a}\\}\\}`,"g"),l)}return r}function x(u,e){let t=!1;switch(u.type){case"env":{const r=u.value,i=process.env[r];t=!!i&&i!=="false"&&i!=="0";break}case"file-contains":{const r=u.value;t=e.includes(r);break}case"custom":{const r=u.value;try{t=!!r()}catch{t=!1}break}}return u.negate?!t:t}function k(u){return[...u].sort((e,t)=>(e.priority??100)-(t.priority??100))}function v(u,e,t,r,i){switch(t){case"head-start":{const n=u.match(/<head\b[^>]*>/i);if(!n)return{html:u,injected:!1,reason:"\u672A\u627E\u5230 <head> \u6807\u7B7E"};const o=(n.index??0)+n[0].length;return{html:u.slice(0,o)+`
2
2
  `+e+u.slice(o),injected:!0}}case"head-end":{const n=u.match(/<\/head\s*>/i);if(!n)return{html:u,injected:!1,reason:"\u672A\u627E\u5230 </head> \u6807\u7B7E"};const o=n.index;return{html:u.slice(0,o)+e+`
3
3
  `+u.slice(o),injected:!0}}case"body-start":{const n=u.match(/<body\b[^>]*>/i);if(!n)return{html:u,injected:!1,reason:"\u672A\u627E\u5230 <body> \u6807\u7B7E"};const o=(n.index??0)+n[0].length;return{html:u.slice(0,o)+`
4
4
  `+e+u.slice(o),injected:!0}}case"body-end":{const n=u.match(/<\/body\s*>/i);if(!n)return{html:u,injected:!1,reason:"\u672A\u627E\u5230 </body> \u6807\u7B7E"};const o=n.index;return{html:u.slice(0,o)+e+`
5
5
  `+u.slice(o),injected:!0}}case"before-selector":{if(!r)return{html:u,injected:!1,reason:"before-selector \u9700\u8981 selector \u53C2\u6570"};const n=E(u,r,i);return n?{html:u.slice(0,n.index)+e+`
6
6
  `+u.slice(n.index),injected:!0}:{html:u,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${r}"`}}case"after-selector":{if(!r)return{html:u,injected:!1,reason:"after-selector \u9700\u8981 selector \u53C2\u6570"};const n=E(u,r,i);if(!n)return{html:u,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${r}"`};const o=n.index+n.length;return{html:u.slice(0,o)+`
7
- `+e+u.slice(o),injected:!0}}case"replace-selector":{if(!r)return{html:u,injected:!1,reason:"replace-selector \u9700\u8981 selector \u53C2\u6570"};const n=E(u,r,i);if(!n)return{html:u,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${r}"`};const o=n.index+n.length;return{html:u.slice(0,n.index)+e+u.slice(o),injected:!0}}default:return{html:u,injected:!1,reason:`\u4E0D\u652F\u6301\u7684\u6CE8\u5165\u4F4D\u7F6E: ${t}`}}}function I(u,e,t,r,i){let n=u;const o=[],a=k(e);for(const l of a){const s={ruleId:l.id||"unnamed",position:l.position,selector:l.selector,injected:!1,timestamp:Date.now()};if(l.condition&&!x(l.condition,n)){s.injected=!1,s.reason="\u6761\u4EF6\u4E0D\u6EE1\u8DB3\uFF0C\u8DF3\u8FC7\u6CE8\u5165",o.push(s);continue}let d=D(l.content,l.templateVars,t);try{d=A(d,l,r,i)}catch(f){s.injected=!1,s.reason=f.message,o.push(s),i?.warn(`\u89C4\u5219 "${l.id||"unnamed"}" \u5B89\u5168\u68C0\u67E5\u5931\u8D25: ${f.message}`);continue}const c=v(n,d,l.position,l.selector,l.selectorMatch);n=c.html,s.injected=c.injected,s.reason=c.reason,o.push(s)}return{html:n,logs:o}}class T extends g{injectionLogs=[];getDefaultOptions(){return{targetFile:"index.html",logInjection:!0,security:{blockDangerousTags:!0,blockDangerousAttributes:!0}}}validateOptions(){this.validator.field("targetFile").string().field("rules").required().field("logInjection").boolean().validate(),b(this.options)}getPluginName(){return"html-inject"}isTargetFile(e,t){if(t==="index.html")return e.endsWith("index.html")||e.endsWith("index.htm");const r=t.replace(/\\/g,"/"),i=e.replace(/\\/g,"/");return i.endsWith(r)?!0:h.basename(i)===h.basename(r)}addPluginHooks(e){e.transformIndexHtml={order:"post",handler:(t,r)=>{const i=r.filename||"",n=this.options.targetFile||"index.html";if(!this.isTargetFile(i,n))return t;const o={warn:l=>this.logger.warn(l)},a=I(t,this.options.rules,this.options.templateVars,this.options.security,o);return this.injectionLogs=a.logs,this.options.logInjection&&this.logInjectionResults(a.logs),a.html}},e.buildEnd=()=>{this.options.logInjection&&this.injectionLogs.length>0&&this.logger.info(`\u6CE8\u5165\u5B8C\u6210\uFF0C\u5171\u5904\u7406 ${this.injectionLogs.length} \u6761\u89C4\u5219`)}}logInjectionResults(e){for(const t of e)t.injected?this.logger.success(`\u89C4\u5219 "${t.ruleId}" \u6CE8\u5165\u6210\u529F (\u4F4D\u7F6E: ${t.position}${t.selector?`, \u9009\u62E9\u5668: ${t.selector}`:""})`):this.logger.warn(`\u89C4\u5219 "${t.ruleId}" \u6CE8\u5165\u5931\u8D25: ${t.reason||"\u672A\u77E5\u539F\u56E0"}`)}getInjectionLogs(){return[...this.injectionLogs]}}const S=p(T);export{S as htmlInject};
7
+ `+e+u.slice(o),injected:!0}}case"replace-selector":{if(!r)return{html:u,injected:!1,reason:"replace-selector \u9700\u8981 selector \u53C2\u6570"};const n=E(u,r,i);if(!n)return{html:u,injected:!1,reason:`\u672A\u627E\u5230\u9009\u62E9\u5668 "${r}"`};const o=n.index+n.length;return{html:u.slice(0,n.index)+e+u.slice(o),injected:!0}}default:return{html:u,injected:!1,reason:`\u4E0D\u652F\u6301\u7684\u6CE8\u5165\u4F4D\u7F6E: ${t}`}}}function I(u,e,t,r,i){let n=u;const o=[],a=k(e);for(const l of a){const s={ruleId:l.id||"unnamed",position:l.position,selector:l.selector,injected:!1,timestamp:Date.now()};if(l.condition&&!x(l.condition,n)){s.injected=!1,s.reason="\u6761\u4EF6\u4E0D\u6EE1\u8DB3\uFF0C\u8DF3\u8FC7\u6CE8\u5165",o.push(s);continue}let d=D(l.content,l.templateVars,t);try{d=A(d,l,r,i)}catch(f){s.injected=!1,s.reason=f.message,o.push(s),i?.warn(`\u89C4\u5219 "${l.id||"unnamed"}" \u5B89\u5168\u68C0\u67E5\u5931\u8D25: ${f.message}`);continue}const c=v(n,d,l.position,l.selector,l.selectorMatch);n=c.html,s.injected=c.injected,s.reason=c.reason,o.push(s)}return{html:n,logs:o}}class T extends g{injectionLogs=[];getDefaultOptions(){return{targetFile:"index.html",logInjection:!0,security:{blockDangerousTags:!0,blockDangerousAttributes:!0}}}validateOptions(){this.validator.field("targetFile").string().field("rules").required().field("logInjection").boolean().validate(),$(this.options)}getPluginName(){return"html-inject"}isTargetFile(e,t){if(t==="index.html")return e.endsWith("index.html")||e.endsWith("index.htm");const r=t.replace(/\\/g,"/"),i=e.replace(/\\/g,"/");return i.endsWith(r)?!0:h.basename(i)===h.basename(r)}addPluginHooks(e){e.transformIndexHtml={order:"post",handler:(t,r)=>{const i=r.filename||"",n=this.options.targetFile||"index.html";if(!this.isTargetFile(i,n))return t;const o={warn:l=>this.logger.warn(l)},a=I(t,this.options.rules,this.options.templateVars,this.options.security,o);return this.injectionLogs=a.logs,this.options.logInjection&&this.logInjectionResults(a.logs),a.html}},e.buildEnd=()=>{this.options.logInjection&&this.injectionLogs.length>0&&this.logger.info(`\u6CE8\u5165\u5B8C\u6210\uFF0C\u5171\u5904\u7406 ${this.injectionLogs.length} \u6761\u89C4\u5219`)}}logInjectionResults(e){for(const t of e)t.injected?this.logger.success(`\u89C4\u5219 "${t.ruleId}" \u6CE8\u5165\u6210\u529F (\u4F4D\u7F6E: ${t.position}${t.selector?`, \u9009\u62E9\u5668: ${t.selector}`:""})`):this.logger.warn(`\u89C4\u5219 "${t.ruleId}" \u6CE8\u5165\u5931\u8D25: ${t.reason||"\u672A\u77E5\u539F\u56E0"}`)}getInjectionLogs(){return[...this.injectionLogs]}}const S=p(T);export{S as htmlInject};
@@ -1 +1 @@
1
- "use strict";const plugins_buildProgress_index=require("./buildProgress/index.cjs"),plugins_compressAssets_index=require("./compressAssets/index.cjs"),plugins_copyFile_index=require("./copyFile/index.cjs"),plugins_faviconManager_index=require("./faviconManager/index.cjs"),plugins_generateRouter_index=require("./generateRouter/index.cjs"),plugins_generateVersion_index=require("./generateVersion/index.cjs"),plugins_htmlInject_index=require("./htmlInject/index.cjs"),plugins_loadingManager_index=require("./loadingManager/index.cjs"),plugins_versionUpdateChecker_index=require("./versionUpdateChecker/index.cjs");require("../factory/index.cjs"),require("../logger/index.cjs"),require("../common/object/index.cjs"),require("../shared/vite-plugin.Bcg6RW2N.cjs"),require("node:zlib"),require("node:fs"),require("node:stream/promises"),require("node:path"),require("../common/fs/index.cjs"),require("fs"),require("path"),require("../common/html/index.cjs"),require("../common/format/index.cjs"),require("crypto"),require("../common/script/index.cjs"),require("../common/validation/index.cjs"),exports.buildProgress=plugins_buildProgress_index.buildProgress,exports.compressAssets=plugins_compressAssets_index.compressAssets,exports.copyFile=plugins_copyFile_index.copyFile,exports.faviconManager=plugins_faviconManager_index.faviconManager,exports.generateRouter=plugins_generateRouter_index.generateRouter,exports.generateVersion=plugins_generateVersion_index.generateVersion,exports.htmlInject=plugins_htmlInject_index.htmlInject,exports.loadingManager=plugins_loadingManager_index.loadingManager,exports.versionUpdateChecker=plugins_versionUpdateChecker_index.versionUpdateChecker;
1
+ "use strict";const plugins_buildProgress_index=require("./buildProgress/index.cjs"),plugins_bundleAnalyzer_index=require("./bundleAnalyzer/index.cjs"),plugins_compressAssets_index=require("./compressAssets/index.cjs"),plugins_copyFile_index=require("./copyFile/index.cjs"),plugins_faviconManager_index=require("./faviconManager/index.cjs"),plugins_generateRouter_index=require("./generateRouter/index.cjs"),plugins_generateVersion_index=require("./generateVersion/index.cjs"),plugins_htmlInject_index=require("./htmlInject/index.cjs"),plugins_loadingManager_index=require("./loadingManager/index.cjs"),plugins_versionUpdateChecker_index=require("./versionUpdateChecker/index.cjs");require("../factory/index.cjs"),require("../logger/index.cjs"),require("../common/object/index.cjs"),require("../shared/vite-plugin.Bcg6RW2N.cjs"),require("node:fs"),require("node:path"),require("../common/compress/index.cjs"),require("node:zlib"),require("node:stream/promises"),require("node:stream"),require("../common/path/index.cjs"),require("../common/fs/index.cjs"),require("fs"),require("path"),require("../common/format/index.cjs"),require("crypto"),require("../common/html/index.cjs"),require("../common/script/index.cjs"),require("../common/validation/index.cjs"),exports.buildProgress=plugins_buildProgress_index.buildProgress,exports.bundleAnalyzer=plugins_bundleAnalyzer_index.bundleAnalyzer,exports.compressAssets=plugins_compressAssets_index.compressAssets,exports.copyFile=plugins_copyFile_index.copyFile,exports.faviconManager=plugins_faviconManager_index.faviconManager,exports.generateRouter=plugins_generateRouter_index.generateRouter,exports.generateVersion=plugins_generateVersion_index.generateVersion,exports.htmlInject=plugins_htmlInject_index.htmlInject,exports.loadingManager=plugins_loadingManager_index.loadingManager,exports.versionUpdateChecker=plugins_versionUpdateChecker_index.versionUpdateChecker;