@meng-xi/vite-plugin 0.1.7 → 0.1.9
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.
- package/README-en.md +43 -17
- package/README.md +56 -30
- package/dist/common/concurrency/index.cjs +1 -0
- package/dist/common/concurrency/index.d.cts +26 -0
- package/dist/common/concurrency/index.d.mts +26 -0
- package/dist/common/concurrency/index.d.ts +26 -0
- package/dist/common/concurrency/index.mjs +1 -0
- package/dist/common/format/index.cjs +1 -1
- package/dist/common/format/index.d.cts +19 -1
- package/dist/common/format/index.d.mts +19 -1
- package/dist/common/format/index.d.ts +19 -1
- package/dist/common/format/index.mjs +1 -1
- package/dist/common/fs/index.cjs +1 -1
- package/dist/common/fs/index.d.cts +19 -1
- package/dist/common/fs/index.d.mts +19 -1
- package/dist/common/fs/index.d.ts +19 -1
- package/dist/common/fs/index.mjs +1 -1
- package/dist/common/index.cjs +1 -1
- package/dist/common/index.d.cts +3 -2
- package/dist/common/index.d.mts +3 -2
- package/dist/common/index.d.ts +3 -2
- package/dist/common/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.mjs +1 -1
- package/dist/plugins/assetManifest/index.cjs +1 -1
- package/dist/plugins/assetManifest/index.mjs +1 -1
- package/dist/plugins/autoImport/index.cjs +13 -13
- package/dist/plugins/autoImport/index.mjs +8 -8
- package/dist/plugins/bundleAnalyzer/index.cjs +1 -1
- package/dist/plugins/bundleAnalyzer/index.mjs +1 -1
- package/dist/plugins/compressAssets/index.cjs +1 -1
- package/dist/plugins/compressAssets/index.mjs +1 -1
- package/dist/plugins/copyFile/index.cjs +1 -1
- package/dist/plugins/copyFile/index.mjs +1 -1
- package/dist/plugins/envGuard/index.cjs +5 -5
- package/dist/plugins/envGuard/index.mjs +8 -8
- package/dist/plugins/faviconManager/index.cjs +1 -1
- package/dist/plugins/faviconManager/index.mjs +1 -1
- package/dist/plugins/generateRouter/index.cjs +62 -5
- package/dist/plugins/generateRouter/index.d.cts +29 -1
- package/dist/plugins/generateRouter/index.d.mts +29 -1
- package/dist/plugins/generateRouter/index.d.ts +29 -1
- package/dist/plugins/generateRouter/index.mjs +62 -5
- package/dist/plugins/generateVersion/index.cjs +1 -1
- package/dist/plugins/generateVersion/index.mjs +1 -1
- package/dist/plugins/imageOptimizer/index.cjs +5 -0
- package/dist/plugins/imageOptimizer/index.d.cts +242 -0
- package/dist/plugins/imageOptimizer/index.d.mts +242 -0
- package/dist/plugins/imageOptimizer/index.d.ts +242 -0
- package/dist/plugins/imageOptimizer/index.mjs +5 -0
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.d.cts +2 -1
- package/dist/plugins/index.d.mts +2 -1
- package/dist/plugins/index.d.ts +2 -1
- package/dist/plugins/index.mjs +1 -1
- package/package.json +15 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createPluginFactory as x,BasePlugin as b}from"../../factory/index.mjs";import m from"node:fs";import f from"node:path";import v from"node:zlib";import{promisify as S}from"node:util";import{scanDirectory as w,writeJsonReport as $,writeFileContent as F}from"../../common/fs/index.mjs";import{normalizePath as A}from"../../common/path/index.mjs";import{formatFileSize as c}from"../../common/format/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";const M=S(v.gzip);async function C(a){const i=Buffer.isBuffer(a)?a:Buffer.from(a,"utf-8");return(await M(i)).length}function z(a){return a.includes("node_modules")||a.startsWith("\0")||a.startsWith("virtual:")}async function B(a,i={}){return w(a,{includeExtensions:i.includeExtensions,excludePatterns:i.excludePatterns})}function k(a){const i=a.reduce((o,n)=>o+n.size,0),e=new Map;for(const o of a){const n=o.extension||"(no ext)",t=e.get(n)||{count:0,totalSize:0};t.count++,t.totalSize+=o.size,e.set(n,t)}return Array.from(e.entries()).map(([o,{count:n,totalSize:t}])=>({extension:o,count:n,totalSize:t,percentage:i>0?Number((t/i*100).toFixed(1)):0})).sort((o,n)=>n.totalSize-o.totalSize)}function D(a,i){const e=[],o=i*1024;for(const n of a){n.size>o&&e.push({level:"chunk",name:n.name,sizeKB:Number((n.size/1024).toFixed(1)),thresholdKB:i,message:`Chunk "${n.name}" \u8D85\u8FC7\u9608\u503C: ${(n.size/1024).toFixed(1)}KB > ${i}KB`});for(const t of n.modules)t.size>o&&e.push({level:"module",name:t.id,sizeKB:Number((t.size/1024).toFixed(1)),thresholdKB:i,message:`\u6A21\u5757 "${t.id}" \u8D85\u8FC7\u9608\u503C: ${(t.size/1024).toFixed(1)}KB > ${i}KB`})}return e}function E(a,i,e){const o=[];for(const n of a)for(const t of n.modules)e&&t.isNodeModule||o.push(t);return o.sort((n,t)=>t.size-n.size).slice(0,i)}async function T(a,i,e={}){const{gzipSize:o=!0,excludeNodeModules:n=!1}=e,t=[];for(const r of i){const d=f.relative(a,r.filePath),l=A(d),s=r.extension;let u="chunk";s===".html"?u="entry":[".js",".mjs",".cjs",".css",".html"].includes(s)||(u="asset");let h=0;if(o)try{const y=await m.promises.readFile(r.filePath);h=await C(y)}catch{h=0}const p=z(d),g={id:l,size:r.size,gzipSize:h,chunks:[l],imports:[],isEntry:u==="entry",isNodeModule:p};n&&p||t.push({name:l,size:r.size,gzipSize:h,modules:[g],type:u,fileCount:1})}return t.sort((r,d)=>d.size-r.size)}async function R(a,i){const e=Date.now(),o=await B(a,{includeExtensions:i.includeExtensions,excludePatterns:i.excludePatterns}),n=await T(a,o,{gzipSize:i.gzipSize,excludeNodeModules:i.excludeNodeModules}),t=i.excludeNodeModules?o.filter(p=>!z(f.relative(a,p.filePath))):o,r=k(t),d=E(n,i.topModules,i.excludeNodeModules),l=D(n,i.sizeThreshold),s=n.reduce((p,g)=>p+g.size,0),u=n.reduce((p,g)=>p+g.gzipSize,0),h=Date.now()-e;return{timestamp:new Date().toISOString(),totalSize:s,totalGzipSize:u,chunks:n,topModules:d,fileTypeDistribution:r,warnings:l,comparisonDiffs:[],analysisTime:h}}async function P(a){try{const i=f.isAbsolute(a)?a:f.resolve(process.cwd(),a);if(!await m.promises.access(i,m.constants.F_OK).then(()=>!0).catch(()=>!1))return null;const e=await m.promises.readFile(i,"utf-8");return JSON.parse(e)}catch{return null}}function N(a,i){const e=[],o=new Map;for(const t of i.chunks)o.set(t.name,t.size);const n=new Map;for(const t of a.chunks)n.set(t.name,t.size);for(const[t,r]of n){const d=o.get(t);if(d===void 0)e.push({name:t,previousSize:-1,currentSize:r,diff:r,diffPercentage:100,trend:"added"});else{const l=r-d,s=d>0?Number((l/d*100).toFixed(1)):0;e.push({name:t,previousSize:d,currentSize:r,diff:l,diffPercentage:s,trend:l>0?"increased":l<0?"decreased":"unchanged"})}}for(const[t,r]of o)n.has(t)||e.push({name:t,previousSize:r,currentSize:-1,diff:-r,diffPercentage:-100,trend:"removed"});return e.sort((t,r)=>Math.abs(r.diff)-Math.abs(t.diff))}async function O(a,i,e){const o=f.join(a,`${i}.json`),n={timestamp:e.timestamp,summary:{totalSize:e.totalSize,totalGzipSize:e.totalGzipSize,totalSizeFormatted:c(e.totalSize),totalGzipSizeFormatted:c(e.totalGzipSize),chunkCount:e.chunks.length,warningCount:e.warnings.length,analysisTime:e.analysisTime},chunks:e.chunks.map(t=>({name:t.name,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),type:t.type,fileCount:t.fileCount,modules:t.modules.map(r=>({id:r.id,size:r.size,sizeFormatted:c(r.size),gzipSize:r.gzipSize,gzipSizeFormatted:c(r.gzipSize),isEntry:r.isEntry,isNodeModule:r.isNodeModule,imports:r.imports}))})),topModules:e.topModules.map(t=>({id:t.id,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),isNodeModule:t.isNodeModule})),fileTypeDistribution:e.fileTypeDistribution,warnings:e.warnings,comparisonDiffs:e.comparisonDiffs};return await $(o,n),o}async function L(a,i,e,o={}){const n=f.join(a,`${i}.html`),t=o.defaultChartType||"treemap",r=e.chunks.map(p=>({name:p.name,size:p.size,gzipSize:p.gzipSize,type:p.type})),d=e.fileTypeDistribution,l=e.warnings,s=e.comparisonDiffs,u=e.topModules.slice(0,10),h=j(e,r,d,l,s,u,t);return await F(n,h),n}function j(a,i,e,o,n,t,r){const d=c(a.totalSize),l=c(a.totalGzipSize);return`<!DOCTYPE html>
|
|
1
|
+
import{createPluginFactory as x,BasePlugin as b}from"../../factory/index.mjs";import m from"node:fs";import f from"node:path";import v from"node:zlib";import{promisify as S}from"node:util";import{scanDirectory as w,writeJsonReport as $,writeFileContent as F}from"../../common/fs/index.mjs";import{normalizePath as A}from"../../common/path/index.mjs";import{formatFileSize as c}from"../../common/format/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";import"../../common/concurrency/index.mjs";const M=S(v.gzip);async function C(a){const i=Buffer.isBuffer(a)?a:Buffer.from(a,"utf-8");return(await M(i)).length}function z(a){return a.includes("node_modules")||a.startsWith("\0")||a.startsWith("virtual:")}async function B(a,i={}){return w(a,{includeExtensions:i.includeExtensions,excludePatterns:i.excludePatterns})}function k(a){const i=a.reduce((o,n)=>o+n.size,0),e=new Map;for(const o of a){const n=o.extension||"(no ext)",t=e.get(n)||{count:0,totalSize:0};t.count++,t.totalSize+=o.size,e.set(n,t)}return Array.from(e.entries()).map(([o,{count:n,totalSize:t}])=>({extension:o,count:n,totalSize:t,percentage:i>0?Number((t/i*100).toFixed(1)):0})).sort((o,n)=>n.totalSize-o.totalSize)}function D(a,i){const e=[],o=i*1024;for(const n of a){n.size>o&&e.push({level:"chunk",name:n.name,sizeKB:Number((n.size/1024).toFixed(1)),thresholdKB:i,message:`Chunk "${n.name}" \u8D85\u8FC7\u9608\u503C: ${(n.size/1024).toFixed(1)}KB > ${i}KB`});for(const t of n.modules)t.size>o&&e.push({level:"module",name:t.id,sizeKB:Number((t.size/1024).toFixed(1)),thresholdKB:i,message:`\u6A21\u5757 "${t.id}" \u8D85\u8FC7\u9608\u503C: ${(t.size/1024).toFixed(1)}KB > ${i}KB`})}return e}function E(a,i,e){const o=[];for(const n of a)for(const t of n.modules)e&&t.isNodeModule||o.push(t);return o.sort((n,t)=>t.size-n.size).slice(0,i)}async function T(a,i,e={}){const{gzipSize:o=!0,excludeNodeModules:n=!1}=e,t=[];for(const r of i){const d=f.relative(a,r.filePath),l=A(d),s=r.extension;let u="chunk";s===".html"?u="entry":[".js",".mjs",".cjs",".css",".html"].includes(s)||(u="asset");let h=0;if(o)try{const y=await m.promises.readFile(r.filePath);h=await C(y)}catch{h=0}const p=z(d),g={id:l,size:r.size,gzipSize:h,chunks:[l],imports:[],isEntry:u==="entry",isNodeModule:p};n&&p||t.push({name:l,size:r.size,gzipSize:h,modules:[g],type:u,fileCount:1})}return t.sort((r,d)=>d.size-r.size)}async function R(a,i){const e=Date.now(),o=await B(a,{includeExtensions:i.includeExtensions,excludePatterns:i.excludePatterns}),n=await T(a,o,{gzipSize:i.gzipSize,excludeNodeModules:i.excludeNodeModules}),t=i.excludeNodeModules?o.filter(p=>!z(f.relative(a,p.filePath))):o,r=k(t),d=E(n,i.topModules,i.excludeNodeModules),l=D(n,i.sizeThreshold),s=n.reduce((p,g)=>p+g.size,0),u=n.reduce((p,g)=>p+g.gzipSize,0),h=Date.now()-e;return{timestamp:new Date().toISOString(),totalSize:s,totalGzipSize:u,chunks:n,topModules:d,fileTypeDistribution:r,warnings:l,comparisonDiffs:[],analysisTime:h}}async function P(a){try{const i=f.isAbsolute(a)?a:f.resolve(process.cwd(),a);if(!await m.promises.access(i,m.constants.F_OK).then(()=>!0).catch(()=>!1))return null;const e=await m.promises.readFile(i,"utf-8");return JSON.parse(e)}catch{return null}}function N(a,i){const e=[],o=new Map;for(const t of i.chunks)o.set(t.name,t.size);const n=new Map;for(const t of a.chunks)n.set(t.name,t.size);for(const[t,r]of n){const d=o.get(t);if(d===void 0)e.push({name:t,previousSize:-1,currentSize:r,diff:r,diffPercentage:100,trend:"added"});else{const l=r-d,s=d>0?Number((l/d*100).toFixed(1)):0;e.push({name:t,previousSize:d,currentSize:r,diff:l,diffPercentage:s,trend:l>0?"increased":l<0?"decreased":"unchanged"})}}for(const[t,r]of o)n.has(t)||e.push({name:t,previousSize:r,currentSize:-1,diff:-r,diffPercentage:-100,trend:"removed"});return e.sort((t,r)=>Math.abs(r.diff)-Math.abs(t.diff))}async function O(a,i,e){const o=f.join(a,`${i}.json`),n={timestamp:e.timestamp,summary:{totalSize:e.totalSize,totalGzipSize:e.totalGzipSize,totalSizeFormatted:c(e.totalSize),totalGzipSizeFormatted:c(e.totalGzipSize),chunkCount:e.chunks.length,warningCount:e.warnings.length,analysisTime:e.analysisTime},chunks:e.chunks.map(t=>({name:t.name,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),type:t.type,fileCount:t.fileCount,modules:t.modules.map(r=>({id:r.id,size:r.size,sizeFormatted:c(r.size),gzipSize:r.gzipSize,gzipSizeFormatted:c(r.gzipSize),isEntry:r.isEntry,isNodeModule:r.isNodeModule,imports:r.imports}))})),topModules:e.topModules.map(t=>({id:t.id,size:t.size,sizeFormatted:c(t.size),gzipSize:t.gzipSize,gzipSizeFormatted:c(t.gzipSize),isNodeModule:t.isNodeModule})),fileTypeDistribution:e.fileTypeDistribution,warnings:e.warnings,comparisonDiffs:e.comparisonDiffs};return await $(o,n),o}async function L(a,i,e,o={}){const n=f.join(a,`${i}.html`),t=o.defaultChartType||"treemap",r=e.chunks.map(p=>({name:p.name,size:p.size,gzipSize:p.gzipSize,type:p.type})),d=e.fileTypeDistribution,l=e.warnings,s=e.comparisonDiffs,u=e.topModules.slice(0,10),h=j(e,r,d,l,s,u,t);return await F(n,h),n}function j(a,i,e,o,n,t,r){const d=c(a.totalSize),l=c(a.totalGzipSize);return`<!DOCTYPE html>
|
|
2
2
|
<html lang="zh-CN">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const factory_index=require("../../factory/index.cjs"),g=require("node:zlib"),u=require("node:fs"),promises=require("node:stream/promises"),l=require("node:path"),common_fs_index=require("../../common/fs/index.cjs"),common_path_index=require("../../common/path/index.cjs"),
|
|
1
|
+
"use strict";const factory_index=require("../../factory/index.cjs"),g=require("node:zlib"),u=require("node:fs"),promises=require("node:stream/promises"),common_format_index=require("../../common/format/index.cjs"),l=require("node:path"),common_fs_index=require("../../common/fs/index.cjs"),common_path_index=require("../../common/path/index.cjs"),common_concurrency_index=require("../../common/concurrency/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const l__default=_interopDefaultCompat(l);async function compressFileGzip(e,i,t){const s=(await u.promises.stat(e)).size,r=g.createGzip({level:t});await promises.pipeline(u.createReadStream(e),r,u.createWriteStream(i));const o=(await u.promises.stat(i)).size;return{file:e,originalSize:s,compressedSize:o,ratio:common_format_index.calcRatio(s,o),algorithm:"gzip"}}async function compressFileBrotli(e,i,t){const s=(await u.promises.stat(e)).size,r=g.createBrotliCompress({params:{[g.constants.BROTLI_PARAM_QUALITY]:t}});await promises.pipeline(u.createReadStream(e),r,u.createWriteStream(i));const o=(await u.promises.stat(i)).size;return{file:e,originalSize:s,compressedSize:o,ratio:common_format_index.calcRatio(s,o),algorithm:"brotli"}}async function compressFile(e,i,t,s){const r=e+(i==="gzip"?".gz":".br");return i==="gzip"?compressFileGzip(e,r,t):compressFileBrotli(e,r,s)}function shouldCompressFile(e,i,t,s){return!(t<s.threshold||!common_path_index.isExtensionIncluded(i,{includeExtensions:s.includeExtensions,excludeExtensions:s.excludeExtensions})||common_path_index.isPathExcluded(e,s.excludePaths)||common_path_index.isPreCompressed(i))}async function scanDirectory(e,i){return(await common_fs_index.scanDirectory(e,{filter:(t,s,r)=>{const o=l__default.relative(e,t);return shouldCompressFile(o,s,r,i)}})).map(t=>({filePath:t.filePath,relativePath:common_path_index.normalizePath(l__default.relative(e,t.filePath)),size:t.size,ext:t.extension}))}function buildSummary(e,i){const t=e.reduce((o,a)=>o+a.originalSize,0),s=e.reduce((o,a)=>o+a.compressedSize,0),r=common_format_index.calcRatio(t,s);return{totalFiles:e.length,totalOriginalSize:t,totalCompressedSize:s,totalRatio:r,gzipFiles:e.filter(o=>o.algorithm==="gzip").length,brotliFiles:e.filter(o=>o.algorithm==="brotli").length,executionTime:i,stats:e}}async function writeReport(e,i,t){const s=common_fs_index.resolveReportPath(e,i);if(!s)return;const r={timestamp:new Date().toISOString(),summary:{totalFiles:t.totalFiles,totalOriginalSize:t.totalOriginalSize,totalCompressedSize:t.totalCompressedSize,totalRatio:t.totalRatio,gzipFiles:t.gzipFiles,brotliFiles:t.brotliFiles,executionTime:t.executionTime},files:t.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 i=[...new Set(e.map(t=>t.file))];for(const t of i)try{await u.promises.unlink(t)}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(i=>i===!1||typeof i=="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(i){i.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const i=this.viteConfig.build.outDir,t=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${i}`);const s=await scanDirectory(i,this.options);if(s.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${s.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const r=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const a of r){const n=await common_concurrency_index.runWithConcurrency(s,async c=>compressFile(c.filePath,a,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...n)}const o=Date.now()-t;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(i,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:i,totalOriginalSize:t,totalCompressedSize:s,totalRatio:r,executionTime:o}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${i} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${common_format_index.formatFileSize(t)} \u2192 \u538B\u7F29\u540E: ${common_format_index.formatFileSize(s)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${o}ms`);const a=[...this.allStats].sort((n,c)=>c.ratio-n.ratio).slice(0,5);if(a.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const n of a)this.logger.info(` ${n.algorithm.toUpperCase().padEnd(6)} ${n.ratio}% ${common_format_index.formatFileSize(n.originalSize)} \u2192 ${common_format_index.formatFileSize(n.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const compressAssets=factory_index.createPluginFactory(y);exports.compressAssets=compressAssets;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createPluginFactory as
|
|
1
|
+
import{createPluginFactory as F,BasePlugin as d}from"../../factory/index.mjs";import{createGzip as z,createBrotliCompress as S,constants as y}from"node:zlib";import{promises as u,createReadStream as p,createWriteStream as h}from"node:fs";import{pipeline as g}from"node:stream/promises";import{calcRatio as c,formatFileSize as n}from"../../common/format/index.mjs";import f from"node:path";import{scanDirectory as E,resolveReportPath as x,writeJsonReport as B}from"../../common/fs/index.mjs";import{normalizePath as C,isExtensionIncluded as w,isPathExcluded as b,isPreCompressed as O}from"../../common/path/index.mjs";import{runWithConcurrency as P}from"../../common/concurrency/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";async function A(e,i,t){const o=(await u.stat(e)).size,r=z({level:t});await g(p(e),r,h(i));const s=(await u.stat(i)).size;return{file:e,originalSize:o,compressedSize:s,ratio:c(o,s),algorithm:"gzip"}}async function v(e,i,t){const o=(await u.stat(e)).size,r=S({params:{[y.BROTLI_PARAM_QUALITY]:t}});await g(p(e),r,h(i));const s=(await u.stat(i)).size;return{file:e,originalSize:o,compressedSize:s,ratio:c(o,s),algorithm:"brotli"}}async function D(e,i,t,o){const r=e+(i==="gzip"?".gz":".br");return i==="gzip"?A(e,r,t):v(e,r,o)}function $(e,i,t,o){return!(t<o.threshold||!w(i,{includeExtensions:o.includeExtensions,excludeExtensions:o.excludeExtensions})||b(e,o.excludePaths)||O(i))}async function R(e,i){return(await E(e,{filter:(t,o,r)=>{const s=f.relative(e,t);return $(s,o,r,i)}})).map(t=>({filePath:t.filePath,relativePath:C(f.relative(e,t.filePath)),size:t.size,ext:t.extension}))}function L(e,i){const t=e.reduce((s,a)=>s+a.originalSize,0),o=e.reduce((s,a)=>s+a.compressedSize,0),r=c(t,o);return{totalFiles:e.length,totalOriginalSize:t,totalCompressedSize:o,totalRatio:r,gzipFiles:e.filter(s=>s.algorithm==="gzip").length,brotliFiles:e.filter(s=>s.algorithm==="brotli").length,executionTime:i,stats:e}}async function T(e,i,t){const o=x(e,i);if(!o)return;const r={timestamp:new Date().toISOString(),summary:{totalFiles:t.totalFiles,totalOriginalSize:t.totalOriginalSize,totalCompressedSize:t.totalCompressedSize,totalRatio:t.totalRatio,gzipFiles:t.gzipFiles,brotliFiles:t.brotliFiles,executionTime:t.executionTime},files:t.stats.map(s=>({file:s.file,originalSize:s.originalSize,compressedSize:s.compressedSize,ratio:s.ratio,algorithm:s.algorithm}))};await B(o,r)}async function V(e){const i=[...new Set(e.map(t=>t.file))];for(const t of i)try{await u.unlink(t)}catch{}}class I extends d{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(i=>i===!1||typeof i=="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(i){i.writeBundle=async()=>{await this.safeExecute(()=>this.compressAllFiles(),"\u538B\u7F29\u6784\u5EFA\u4EA7\u7269")}}async compressAllFiles(){if(!this.viteConfig)return;const i=this.viteConfig.build.outDir,t=Date.now();this.logger.info(`\u5F00\u59CB\u626B\u63CF\u6784\u5EFA\u4EA7\u7269\u76EE\u5F55: ${i}`);const o=await R(i,this.options);if(o.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u538B\u7F29\u7684\u6587\u4EF6");return}this.logger.info(`\u53D1\u73B0 ${o.length} \u4E2A\u5F85\u538B\u7F29\u6587\u4EF6`),this.allStats=[];const r=this.options.algorithm==="both"?["gzip","brotli"]:[this.options.algorithm];for(const a of r){const l=await P(o,async m=>D(m.filePath,a,this.options.compressionLevel,this.options.brotliQuality),this.options.parallelLimit);this.allStats.push(...l)}const s=Date.now()-t;this.summary=L(this.allStats,s),this.options.deleteOriginalFile&&(await V(this.allStats),this.logger.info("\u5DF2\u5220\u9664\u539F\u59CB\u6587\u4EF6\uFF0C\u4EC5\u4FDD\u7559\u538B\u7F29\u7248\u672C")),this.options.reportOutput&&(await T(i,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:i,totalOriginalSize:t,totalCompressedSize:o,totalRatio:r,executionTime:s}=this.summary;this.logger.success(`\u538B\u7F29\u5B8C\u6210: ${i} \u4E2A\u6587\u4EF6`,`\u539F\u59CB\u4F53\u79EF: ${n(t)} \u2192 \u538B\u7F29\u540E: ${n(o)}\uFF0C\u538B\u7F29\u7387: ${r}%\uFF0C\u8017\u65F6: ${s}ms`);const a=[...this.allStats].sort((l,m)=>m.ratio-l.ratio).slice(0,5);if(a.length>0){this.logger.info("\u538B\u7F29\u7387 Top 5:");for(const l of a)this.logger.info(` ${l.algorithm.toUpperCase().padEnd(6)} ${l.ratio}% ${n(l.originalSize)} \u2192 ${n(l.compressedSize)}`)}}getStats(){return[...this.allStats]}getSummary(){return this.summary}}const Q=F(I);export{Q as compressAssets};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path");class p extends factory_index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:i=!0,recursive:t=!0,incremental:s=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await common_fs_index.checkSourceExists(e);const r=await common_fs_index.copySourceToTarget(e,u,{recursive:t,overwrite:i,incremental:s});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=factory_index.createPluginFactory(p);exports.copyFile=copyFile;
|
|
1
|
+
"use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path"),require("../../common/concurrency/index.cjs");class p extends factory_index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:i=!0,recursive:t=!0,incremental:s=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await common_fs_index.checkSourceExists(e);const r=await common_fs_index.copySourceToTarget(e,u,{recursive:t,overwrite:i,incremental:s});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=factory_index.createPluginFactory(p);exports.copyFile=copyFile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createPluginFactory as c,BasePlugin as n}from"../../factory/index.mjs";import{checkSourceExists as a,copySourceToTarget as l}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";class F extends n{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:t=!0,recursive:i=!0,incremental:o=!0,enabled:s=!0}=this.options;if(!s){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await a(e);const r=await l(e,u,{recursive:i,overwrite:t,incremental:o});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const E=c(F);export{E as copyFile};
|
|
1
|
+
import{createPluginFactory as c,BasePlugin as n}from"../../factory/index.mjs";import{checkSourceExists as a,copySourceToTarget as l}from"../../common/fs/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";import"../../common/concurrency/index.mjs";class F extends n{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:u,overwrite:t=!0,recursive:i=!0,incremental:o=!0,enabled:s=!0}=this.options;if(!s){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${u}`);return}await a(e);const r=await l(e,u,{recursive:i,overwrite:t,incremental:o});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const E=c(F);export{E as copyFile};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),l$1=require("node:path"),u=require("node:fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs"),require("fs"),require("path");function _interopDefaultCompat(s){return s&&typeof s=="object"&&"default"in s?s.default:s}const l__default=_interopDefaultCompat(l$1),u__default=_interopDefaultCompat(u),g=new Set(["string","url","path","enum","semver",void 0]);function o$1(s,e){switch(e.type){case"number":{if(isNaN(Number(s))||s.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(s)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=s.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!e.enumValues||e.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!e.enumValues.includes(s))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${e.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(s)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function l(s,e){if(e.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(s);return e.minValue!==void 0&&r<e.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${e.minValue}`}:e.maxValue!==void 0&&r>e.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${e.maxValue}`}:{valid:!0,status:"pass",message:""}}function d(s,e){return g.has(e.type)?e.minLength!==void 0&&s.length<e.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${e.minLength}`}:e.maxLength!==void 0&&s.length>e.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${e.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function validateValue(s,e,r){const t={type:"string",required:!0,...r};if(e===void 0||e==="")return t.required!==!1?{key:s,status:"missing",message:t.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${s}`,value:e,rule:t}:{key:s,status:"pass",message:"",value:t.default??e,rule:t};const
|
|
2
|
-
`)}function o(s,e,r){s.push("# =============================="),s.push(`# ${e}`),s.push("# =============================="),s.push("");for(const{key:t,rule:
|
|
1
|
+
"use strict";const factory_index=require("../../factory/index.cjs"),common_format_index=require("../../common/format/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),l$1=require("node:path"),u=require("node:fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs"),require("fs"),require("path"),require("../../common/concurrency/index.cjs");function _interopDefaultCompat(s){return s&&typeof s=="object"&&"default"in s?s.default:s}const l__default=_interopDefaultCompat(l$1),u__default=_interopDefaultCompat(u),g=new Set(["string","url","path","enum","semver",void 0]);function o$1(s,e){switch(e.type){case"number":{if(isNaN(Number(s))||s.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(s)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=s.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!e.enumValues||e.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!e.enumValues.includes(s))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${e.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(s)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${s}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function l(s,e){if(e.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(s);return e.minValue!==void 0&&r<e.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${e.minValue}`}:e.maxValue!==void 0&&r>e.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${e.maxValue}`}:{valid:!0,status:"pass",message:""}}function d(s,e){return g.has(e.type)?e.minLength!==void 0&&s.length<e.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${e.minLength}`}:e.maxLength!==void 0&&s.length>e.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${s.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${e.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function validateValue(s,e,r){const t={type:"string",required:!0,...r};if(e===void 0||e==="")return t.required!==!1?{key:s,status:"missing",message:t.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${s}`,value:e,rule:t}:{key:s,status:"pass",message:"",value:t.default??e,rule:t};const n=o$1(e,t);if(!n.valid)return{key:s,status:n.status,message:t.message||n.message,value:e,rule:t};const i=l(e,t);if(!i.valid)return{key:s,status:i.status,message:t.message||i.message,value:e,rule:t};const m=d(e,t);if(!m.valid)return{key:s,status:m.status,message:t.message||m.message,value:e,rule:t};if(t.pattern&&!t.pattern.test(e))return{key:s,status:"custom_error",message:t.message||`\u73AF\u5883\u53D8\u91CF ${s} \u4E0D\u5339\u914D\u6B63\u5219: ${t.pattern.source}`,value:e,rule:t};if(t.validator){const a=t.validator(e);if(a!==!0){const c=typeof a=="string"?a:"";return{key:s,status:"custom_error",message:t.message||c||`\u73AF\u5883\u53D8\u91CF ${s} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:e,rule:t}}}return{key:s,status:"pass",message:"",value:e,rule:t}}function validateEnvironment(s,e){const r=[];for(const[t,n]of Object.entries(e)){const i=s[t];r.push(validateValue(t,i,n))}return r}function generateTemplate(s){const e=new Map,r=[];for(const[n,i]of Object.entries(s)){const m={type:"string",required:!0,...i};if(m.group){const a=e.get(m.group)||[];a.push({key:n,rule:m}),e.set(m.group,a)}else r.push({key:n,rule:m})}const t=[];t.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),t.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),t.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),t.push(""),r.length>0&&o(t,"\u901A\u7528\u914D\u7F6E",r);for(const[n,i]of e)o(t,n,i);return t.join(`
|
|
2
|
+
`)}function o(s,e,r){s.push("# =============================="),s.push(`# ${e}`),s.push("# =============================="),s.push("");for(const{key:t,rule:n}of r){n.description&&s.push(`# ${n.description}`);const i=[];i.push(`\u7C7B\u578B: ${n.type||"string"}`),i.push(n.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),n.enumValues&&n.enumValues.length>0&&i.push(`\u679A\u4E3E\u503C: ${n.enumValues.join(" | ")}`),n.minValue!==void 0&&i.push(`\u6700\u5C0F\u503C: ${n.minValue}`),n.maxValue!==void 0&&i.push(`\u6700\u5927\u503C: ${n.maxValue}`),n.minLength!==void 0&&i.push(`\u6700\u5C0F\u957F\u5EA6: ${n.minLength}`),n.maxLength!==void 0&&i.push(`\u6700\u5927\u957F\u5EA6: ${n.maxLength}`),n.sensitive&&i.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),s.push(`# [${i.join(" | ")}]`),n.default!==void 0?s.push(`${t}=${n.sensitive?"********":n.default}`):s.push(`${t}=`),s.push("")}}function generateRuntimeGuard(s,e,r,t){const n=[];for(const[h,p]of Object.entries(s))p.required!==!1&&n.push({key:h,rule:{type:"string",required:!0,...p}});if(n.length===0)return"";const i=t.filter(h=>h.status!=="pass"),m=n.map(({key:h,rule:p})=>({key:h,type:p.type||"string",description:p.description||""})),a=JSON.stringify(m,null,2),c=i.map(h=>h.key),v=JSON.stringify(c),F=f(r);return`<script>
|
|
3
3
|
${`
|
|
4
4
|
(function() {
|
|
5
5
|
'use strict';
|
|
@@ -62,6 +62,6 @@ ${`
|
|
|
62
62
|
if (missing.length > 0) html += '\u7F3A\u5C11: ' + missing.join(', ') + '<br>';
|
|
63
63
|
if (invalid.length > 0) html += '\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', ');
|
|
64
64
|
overlay.innerHTML = html;
|
|
65
|
-
document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}
|
|
66
|
-
`);for(const
|
|
67
|
-
`);switch(this.options.failAction){case"error":throw new Error(
|
|
65
|
+
document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}function parseEnvContent(s,e){const r={},t=s.split(`
|
|
66
|
+
`);for(const n of t){const i=n.trim();if(!i||i.startsWith("#"))continue;const m=i.indexOf("=");if(m===-1)continue;const a=i.slice(0,m).trim();let c=i.slice(m+1).trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),e?.prefix?a.startsWith(e.prefix)&&(r[a]=c):r[a]=c}return r}class E extends factory_index.BasePlugin{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(e=>e===!1||typeof e=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(e){this.options.validateBeforeBuild&&(e.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(e.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=validateEnvironment(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const e=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const t=l__default.resolve(e,r);if(u__default.existsSync(t))try{this.parseAndLoadEnvFile(t)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${t}`)}}}parseAndLoadEnvFile(e){const r=u__default.readFileSync(e,"utf-8"),t=parseEnvContent(r,{prefix:"VITE_"});for(const[n,i]of Object.entries(t))process.env[n]===void 0&&(process.env[n]=i)}buildResult(){const e=this.validationResults.length,r=this.validationResults.filter(i=>i.status==="pass").length,t=this.validationResults.filter(i=>i.status==="missing").length,n=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing").length;return{timestamp:common_format_index.formatDate(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:e,passed:r,missing:t,invalid:n,results:this.validationResults,allPassed:t===0&&n===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const e=this.validationResults.filter(i=>i.status==="missing").map(i=>i.key),r=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing"),t=[];e.length>0&&t.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${e.join(", ")}`);for(const i of r)t.push(`${i.key}: ${i.message}`);const n=t.join(`
|
|
67
|
+
`);switch(this.options.failAction){case"error":throw new Error(n);case"warn":this.logger.warn(n);break}}writeEnvTemplate(){const e=this.viteConfig?.root||process.cwd(),r=l__default.resolve(e,this.options.templateOutput),t=generateTemplate(this.options.required);this.safeExecuteSync(()=>{common_fs_index.writeFileContent(r,t),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const e=this.viteConfig?.build?.outDir||"dist",r=l__default.resolve(e,this.options.reportOutput);this.safeExecuteSync(()=>{const t=JSON.stringify(this.guardResult,(n,i)=>i instanceof RegExp?i.toString():typeof i=="function"?"[Function]":i,2);common_fs_index.writeFileContent(r,t),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:e,passed:r,missing:t,invalid:n,allPassed:i}=this.guardResult;if(i){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${e} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${e} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${t} | \u5931\u8D25 ${n}`);const m=this.validationResults.filter(a=>a.status!=="pass");for(const a of m){const c=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${c}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(e){const r=generateRuntimeGuard(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return e;const t=common_html_index.injectBeforeTag(e,"</head>",r);return t.injected?t.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),e)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const envGuard=factory_index.createPluginFactory(E);exports.envGuard=envGuard;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{createPluginFactory as v,BasePlugin as F}from"../../factory/index.mjs";import{formatDate as
|
|
2
|
-
`)}function
|
|
1
|
+
import{createPluginFactory as v,BasePlugin as F}from"../../factory/index.mjs";import{formatDate as E}from"../../common/format/index.mjs";import{injectBeforeTag as A}from"../../common/html/index.mjs";import{writeFileContent as g}from"../../common/fs/index.mjs";import m from"node:path";import p from"node:fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../shared/vite-plugin.CuXEJAWX.mjs";import"fs";import"path";import"../../common/concurrency/index.mjs";const C=new Set(["string","url","path","enum","semver",void 0]);function D(t,u){switch(u.type){case"number":{if(isNaN(Number(t))||t.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(t)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=t.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!u.enumValues||u.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!u.enumValues.includes(t))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${u.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(t)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function y(t,u){if(u.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(t);return u.minValue!==void 0&&r<u.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${u.minValue}`}:u.maxValue!==void 0&&r>u.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${u.maxValue}`}:{valid:!0,status:"pass",message:""}}function $(t,u){return C.has(u.type)?u.minLength!==void 0&&t.length<u.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${u.minLength}`}:u.maxLength!==void 0&&t.length>u.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${u.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function R(t,u,r){const e={type:"string",required:!0,...r};if(u===void 0||u==="")return e.required!==!1?{key:t,status:"missing",message:e.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${t}`,value:u,rule:e}:{key:t,status:"pass",message:"",value:e.default??u,rule:e};const i=D(u,e);if(!i.valid)return{key:t,status:i.status,message:e.message||i.message,value:u,rule:e};const s=y(u,e);if(!s.valid)return{key:t,status:s.status,message:e.message||s.message,value:u,rule:e};const a=$(u,e);if(!a.valid)return{key:t,status:a.status,message:e.message||a.message,value:u,rule:e};if(e.pattern&&!e.pattern.test(u))return{key:t,status:"custom_error",message:e.message||`\u73AF\u5883\u53D8\u91CF ${t} \u4E0D\u5339\u914D\u6B63\u5219: ${e.pattern.source}`,value:u,rule:e};if(e.validator){const n=e.validator(u);if(n!==!0){const o=typeof n=="string"?n:"";return{key:t,status:"custom_error",message:e.message||o||`\u73AF\u5883\u53D8\u91CF ${t} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:u,rule:e}}}return{key:t,status:"pass",message:"",value:u,rule:e}}function w(t,u){const r=[];for(const[e,i]of Object.entries(u)){const s=t[e];r.push(R(e,s,i))}return r}function _(t){const u=new Map,r=[];for(const[i,s]of Object.entries(t)){const a={type:"string",required:!0,...s};if(a.group){const n=u.get(a.group)||[];n.push({key:i,rule:a}),u.set(a.group,n)}else r.push({key:i,rule:a})}const e=[];e.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),e.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),e.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),e.push(""),r.length>0&&f(e,"\u901A\u7528\u914D\u7F6E",r);for(const[i,s]of u)f(e,i,s);return e.join(`
|
|
2
|
+
`)}function f(t,u,r){t.push("# =============================="),t.push(`# ${u}`),t.push("# =============================="),t.push("");for(const{key:e,rule:i}of r){i.description&&t.push(`# ${i.description}`);const s=[];s.push(`\u7C7B\u578B: ${i.type||"string"}`),s.push(i.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),i.enumValues&&i.enumValues.length>0&&s.push(`\u679A\u4E3E\u503C: ${i.enumValues.join(" | ")}`),i.minValue!==void 0&&s.push(`\u6700\u5C0F\u503C: ${i.minValue}`),i.maxValue!==void 0&&s.push(`\u6700\u5927\u503C: ${i.maxValue}`),i.minLength!==void 0&&s.push(`\u6700\u5C0F\u957F\u5EA6: ${i.minLength}`),i.maxLength!==void 0&&s.push(`\u6700\u5927\u957F\u5EA6: ${i.maxLength}`),i.sensitive&&s.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),t.push(`# [${s.join(" | ")}]`),i.default!==void 0?t.push(`${e}=${i.sensitive?"********":i.default}`):t.push(`${e}=`),t.push("")}}function x(t,u,r,e){const i=[];for(const[l,d]of Object.entries(t))d.required!==!1&&i.push({key:l,rule:{type:"string",required:!0,...d}});if(i.length===0)return"";const s=e.filter(l=>l.status!=="pass"),a=i.map(({key:l,rule:d})=>({key:l,type:d.type||"string",description:d.description||""})),n=JSON.stringify(a,null,2),o=s.map(l=>l.key),h=JSON.stringify(o),c=b(r);return`<script>
|
|
3
3
|
${`
|
|
4
4
|
(function() {
|
|
5
5
|
'use strict';
|
|
6
6
|
var GUARD_NAME = ${JSON.stringify(u)};
|
|
7
|
-
var GUARD_DATA = ${
|
|
8
|
-
var FAILED_KEYS = ${
|
|
7
|
+
var GUARD_DATA = ${n};
|
|
8
|
+
var FAILED_KEYS = ${h};
|
|
9
9
|
var MODE = ${JSON.stringify(r)};
|
|
10
10
|
|
|
11
11
|
var missing = [];
|
|
@@ -46,7 +46,7 @@ ${`
|
|
|
46
46
|
}
|
|
47
47
|
})();
|
|
48
48
|
`.trim()}
|
|
49
|
-
<\/script>`}function
|
|
49
|
+
<\/script>`}function b(t){switch(t){case"console":return`
|
|
50
50
|
var msgs = [];
|
|
51
51
|
if (missing.length > 0) msgs.push('[EnvGuard] \u7F3A\u5C11\u73AF\u5883\u53D8\u91CF: ' + missing.join(', '));
|
|
52
52
|
if (invalid.length > 0) msgs.push('[EnvGuard] \u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', '));
|
|
@@ -62,6 +62,6 @@ ${`
|
|
|
62
62
|
if (missing.length > 0) html += '\u7F3A\u5C11: ' + missing.join(', ') + '<br>';
|
|
63
63
|
if (invalid.length > 0) html += '\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', ');
|
|
64
64
|
overlay.innerHTML = html;
|
|
65
|
-
document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}
|
|
66
|
-
`);for(const
|
|
67
|
-
`);switch(this.options.failAction){case"error":throw new Error(
|
|
65
|
+
document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}function k(t,u){const r={},e=t.split(`
|
|
66
|
+
`);for(const i of e){const s=i.trim();if(!s||s.startsWith("#"))continue;const a=s.indexOf("=");if(a===-1)continue;const n=s.slice(0,a).trim();let o=s.slice(a+1).trim();(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),u?.prefix?n.startsWith(u.prefix)&&(r[n]=o):r[n]=o}return r}class B extends F{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(u=>u===!1||typeof u=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(u){this.options.validateBeforeBuild&&(u.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(u.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=w(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const u=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const e=m.resolve(u,r);if(p.existsSync(e))try{this.parseAndLoadEnvFile(e)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${e}`)}}}parseAndLoadEnvFile(u){const r=p.readFileSync(u,"utf-8"),e=k(r,{prefix:"VITE_"});for(const[i,s]of Object.entries(e))process.env[i]===void 0&&(process.env[i]=s)}buildResult(){const u=this.validationResults.length,r=this.validationResults.filter(s=>s.status==="pass").length,e=this.validationResults.filter(s=>s.status==="missing").length,i=this.validationResults.filter(s=>s.status!=="pass"&&s.status!=="missing").length;return{timestamp:E(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:u,passed:r,missing:e,invalid:i,results:this.validationResults,allPassed:e===0&&i===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const u=this.validationResults.filter(s=>s.status==="missing").map(s=>s.key),r=this.validationResults.filter(s=>s.status!=="pass"&&s.status!=="missing"),e=[];u.length>0&&e.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${u.join(", ")}`);for(const s of r)e.push(`${s.key}: ${s.message}`);const i=e.join(`
|
|
67
|
+
`);switch(this.options.failAction){case"error":throw new Error(i);case"warn":this.logger.warn(i);break}}writeEnvTemplate(){const u=this.viteConfig?.root||process.cwd(),r=m.resolve(u,this.options.templateOutput),e=_(this.options.required);this.safeExecuteSync(()=>{g(r,e),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const u=this.viteConfig?.build?.outDir||"dist",r=m.resolve(u,this.options.reportOutput);this.safeExecuteSync(()=>{const e=JSON.stringify(this.guardResult,(i,s)=>s instanceof RegExp?s.toString():typeof s=="function"?"[Function]":s,2);g(r,e),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:u,passed:r,missing:e,invalid:i,allPassed:s}=this.guardResult;if(s){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${u} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${u} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${e} | \u5931\u8D25 ${i}`);const a=this.validationResults.filter(n=>n.status!=="pass");for(const n of a){const o=n.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${o}] ${n.key}: ${n.message}`)}}injectRuntimeGuard(u){const r=x(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return u;const e=A(u,"</head>",r);return e.injected?e.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),u)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const O=v(B);export{O as envGuard};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("fs"),require("path"),require("../../shared/vite-plugin.CcvHfrL8.cjs");function generateIconTagDescriptors(
|
|
1
|
+
"use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("fs"),require("path"),require("../../common/concurrency/index.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs");function generateIconTagDescriptors(t){const i=[];if(t.link)return[];if(t.icons&&t.icons.length>0)for(const e of t.icons){const u={rel:e.rel,href:e.href};e.sizes&&(u.sizes=e.sizes),e.type&&(u.type=e.type),i.push({tag:"link",attrs:u,injectTo:"head"})}else if(t.url)i.push({tag:"link",attrs:{rel:"icon",href:t.url},injectTo:"head"});else{const e=t.base||"/",u=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:u},injectTo:"head"})}return i}class f extends factory_index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validator.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=generateIconTagDescriptors(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,u=common_html_index.injectBeforeTag(i,"</head>",e);return u.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),u.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:u,overwrite:r=!0,recursive:n=!0}=i;await common_fs_index.checkSourceExists(e);const s=await common_fs_index.copySourceToTarget(e,u,{recursive:n,overwrite:r,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${u}`,`\u590D\u5236\u4E86 ${s.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${s.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${s.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const u=this.getIconTagDescriptors();return u.length>0?{html:e,tags:u}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const faviconManager=factory_index.createPluginFactory(f,t=>typeof t=="string"?{base:t}:t||{});exports.faviconManager=faviconManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createPluginFactory as n,BasePlugin as a}from"../../factory/index.mjs";import{checkSourceExists as c,copySourceToTarget as l}from"../../common/fs/index.mjs";import{V as g}from"../../shared/vite-plugin.DcExl6jd.mjs";import{injectBeforeTag as p}from"../../common/html/index.mjs";import"../../logger/index.mjs";import"fs";import"path";import"../../shared/vite-plugin.CuXEJAWX.mjs";function F(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class h extends a{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new g(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=F(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=p(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:o=!0}=i;await c(e);const r=await l(e,t,{recursive:o,overwrite:s,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const f=n(h,u=>typeof u=="string"?{base:u}:u||{});export{f as faviconManager};
|
|
1
|
+
import{createPluginFactory as n,BasePlugin as a}from"../../factory/index.mjs";import{checkSourceExists as c,copySourceToTarget as l}from"../../common/fs/index.mjs";import{V as g}from"../../shared/vite-plugin.DcExl6jd.mjs";import{injectBeforeTag as p}from"../../common/html/index.mjs";import"../../logger/index.mjs";import"fs";import"path";import"../../common/concurrency/index.mjs";import"../../shared/vite-plugin.CuXEJAWX.mjs";function F(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class h extends a{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new g(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=F(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=p(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:o=!0}=i;await c(e);const r=await l(e,t,{recursive:o,overwrite:s,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const f=n(h,u=>typeof u=="string"?{base:u}:u||{});export{f as faviconManager};
|
|
@@ -1,5 +1,55 @@
|
|
|
1
|
-
"use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),
|
|
2
|
-
`)}
|
|
1
|
+
"use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),o=require("path"),s$1=require("fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("../../common/concurrency/index.cjs");function toCamelCase(t,e=/[/-]/){return t.replace(/^\/+/,"").split(e).filter(Boolean).map((n,i)=>i===0?n.toLowerCase():n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join("")}function toPascalCase(t,e=/[/-]/){return t.replace(/^\/+/,"").split(e).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join("")}function stripJsonComments(t){return t.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function s(t,e){return typeof e=="string"?"string":typeof e=="boolean"?e?"true":"false":typeof e=="number"?"number":"unknown"}function u(t){const e=Object.entries(t);return e.length===0?"{}":`{ ${e.map(([n,i])=>`${n}: ${s(n,i)}`).join("; ")} }`}function generateRouterDtsContent(t,e="@meng-xi/uni-router"){const n=[];n.push(`import '${e}'`),n.push(""),n.push(`declare module '${e}' {`),n.push(" interface RouteNameMap {");for(const i of t){const a=i.name||i.path;i.meta?.title&&n.push(` /** ${i.meta.title} */`);const g=i.meta?u(i.meta):"{}";n.push(` ${a}: { path: '${i.path}'; meta: ${g} }`)}return n.push(" }"),n.push("}"),n.join(`
|
|
2
|
+
`)}function serializeRoute(t){return JSON.stringify(t,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'")}function serializeValueCompact(t){return t===null?"null":t===void 0?"undefined":typeof t=="string"?`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'")}'`:typeof t=="number"||typeof t=="boolean"?String(t):Array.isArray(t)?"["+t.map(e=>serializeValueCompact(e)).join(", ")+"]":typeof t=="object"?`{ ${Object.entries(t).map(([e,n])=>`${e}: ${serializeValueCompact(n)}`).join(", ")} }`:String(t)}function extractRouteObjects(t){const e=[];let n=0,i=-1,a=!1,g="";for(let r=0;r<t.length;r++){const l=t[r];if(a){l===g&&t[r-1]!=="\\"&&(a=!1);continue}if(l==="/"&&r+1<t.length&&t[r+1]==="/"){const h=t.indexOf(`
|
|
3
|
+
`,r);r=h===-1?t.length-1:h-1;continue}if(l==="/"&&r+1<t.length&&t[r+1]==="*"){const h=t.indexOf("*/",r+2);r=h===-1?t.length-1:h+1;continue}if(l==='"'||l==="'"||l==="`"){a=!0,g=l;continue}l==="{"?(n===0&&(i=r),n++):l==="}"&&(n--,n===0&&i>=0&&(e.push(t.substring(i,r+1)),i=-1))}return e}function replacePropertyValue(t,e,n){const i=new RegExp(`(\\b${e}\\s*:\\s*)`),a=t.match(i);if(!a||a.index===void 0){const c=t.lastIndexOf("}"),p=t.substring(0,c),f=p.lastIndexOf(`
|
|
4
|
+
`),m=`
|
|
5
|
+
${f>=0?p.substring(f+1).match(/^(\s*)/)?.[1]??" ":" "}${e}: ${n},`;return t.substring(0,c)+m+`
|
|
6
|
+
`+t.substring(c)}const g=a.index+a[0].length;let r=0,l=!1,h="",F=g;for(let c=g;c<t.length;c++){const p=t[c];if(l){p===h&&t[c-1]!=="\\"&&(l=!1);continue}if(p==="/"&&c+1<t.length&&t[c+1]==="/"){const f=t.indexOf(`
|
|
7
|
+
`,c);c=f===-1?t.length-1:f-1;continue}if(p==="/"&&c+1<t.length&&t[c+1]==="*"){const f=t.indexOf("*/",c+2);c=f===-1?t.length-1:f+1;continue}if(p==='"'||p==="'"||p==="`"){l=!0,h=p;continue}if(p==="{"||p==="["||p==="(")r++;else if(p==="}"||p==="]"||p===")")if(r>0)r--;else{F=c;break}else if(r===0&&p===","){F=c;break}}return t.substring(0,a.index)+`${e}: ${n}`+t.substring(F)}function removeProperty(t,e){const n=new RegExp(`,?\\s*\\b${e}\\s*:\\s*`),i=t.match(n);if(!i||i.index===void 0)return t;const a=i.index,g=a+i[0].length;let r=0,l=!1,h="",F=g;for(let c=g;c<t.length;c++){const p=t[c];if(l){p===h&&t[c-1]!=="\\"&&(l=!1);continue}if(p==="/"&&c+1<t.length&&t[c+1]==="/"){const f=t.indexOf(`
|
|
8
|
+
`,c);c=f===-1?t.length-1:f-1;continue}if(p==="/"&&c+1<t.length&&t[c+1]==="*"){const f=t.indexOf("*/",c+2);c=f===-1?t.length-1:f+1;continue}if(p==='"'||p==="'"||p==="`"){l=!0,h=p;continue}if(p==="{"||p==="["||p==="("){r++;continue}if(p==="}"||p==="]"||p===")"){if(r>0){r--;continue}F=c;break}if(r===0&&p===","){F=c;break}}if(i[0].startsWith(","))return t.substring(0,a)+t.substring(F);{let c=F;return t[c]===","&&c++,t.substring(0,a)+t.substring(c)}}function extractExistingRawRoutes(t){const e=new Map,n=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!n)return e;const i=extractRouteObjects(n[1]);for(const a of i){const g=a.match(/path:\s*['"]([^'"]*)['"]/);g&&e.set(g[1],a.trim())}return e}function extractExistingRoutes(t){const e=new Map,n=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!n)return e;try{let i=n[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const a=JSON.parse(i);for(const g of a)g.path&&e.set(g.path,g)}catch{}return e}class S 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"},dts:!1}}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 toCamelCase(e);case"pascalCase":return toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return toCamelCase(e)}}extractMeta(e,n){const i={},a=e.style||{},g=this.options.metaMapping||{};for(const[r,l]of Object.entries(g))a[r]!==void 0&&(i[l]=a[r]);return this.tabBarPages.has(n)&&(i.isTab=!0),i}parsePageToRoute(e,n=""){const i=n?`/${n}/${e.path}`:`/${e.path}`,a=this.generateRouteName(i),g=this.extractMeta(e,i.replace(/^\//,"")),r={path:i,name:a};return Object.keys(g).length>0&&(r.meta=g),r}parsePagesJson(e){const n=[];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"),n;if(this.tabBarPages.clear(),e.tabBar?.list)for(const i of e.tabBar.list)this.tabBarPages.add(i.pagePath);for(const i of e.pages)n.push(this.parsePageToRoute(i));if(this.options.includeSubPackages&&e.subPackages){for(const i of e.subPackages)if(i.pages&&Array.isArray(i.pages))for(const a of i.pages)n.push(this.parsePageToRoute(a,i.root))}return n}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
|
|
9
|
+
/**
|
|
10
|
+
* \u5BFC\u822A\u52A8\u753B\u7C7B\u578B
|
|
11
|
+
*
|
|
12
|
+
* \u7528\u4E8E uni.navigateTo / uni.navigateBack \u7684 animationType \u53C2\u6570\uFF0C
|
|
13
|
+
* \u4EC5 App \u7AEF\u751F\u6548\uFF0C\u5176\u4ED6\u5E73\u53F0\u81EA\u52A8\u5FFD\u7565\u3002
|
|
14
|
+
*
|
|
15
|
+
* \u663E\u793A\u52A8\u753B\uFF08navigateTo\uFF09\uFF1Aslide-in-right / slide-in-left / slide-in-top / slide-in-bottom / pop-in / fade-in / zoom-out / zoom-fade-out / none / auto
|
|
16
|
+
* \u5173\u95ED\u52A8\u753B\uFF08navigateBack\uFF09\uFF1Aslide-out-right / slide-out-left / slide-out-top / slide-out-bottom / pop-out / fade-out / zoom-in / zoom-fade-in / none / auto
|
|
17
|
+
*
|
|
18
|
+
* @see https://en.uniapp.dcloud.io/api/router.html#animation
|
|
19
|
+
*/
|
|
20
|
+
export type UniAnimationType =
|
|
21
|
+
| 'auto'
|
|
22
|
+
| 'none'
|
|
23
|
+
| 'slide-in-right'
|
|
24
|
+
| 'slide-in-left'
|
|
25
|
+
| 'slide-in-top'
|
|
26
|
+
| 'slide-in-bottom'
|
|
27
|
+
| 'slide-out-right'
|
|
28
|
+
| 'slide-out-left'
|
|
29
|
+
| 'slide-out-top'
|
|
30
|
+
| 'slide-out-bottom'
|
|
31
|
+
| 'fade-in'
|
|
32
|
+
| 'fade-out'
|
|
33
|
+
| 'zoom-out'
|
|
34
|
+
| 'zoom-in'
|
|
35
|
+
| 'zoom-fade-out'
|
|
36
|
+
| 'zoom-fade-in'
|
|
37
|
+
| 'pop-in'
|
|
38
|
+
| 'pop-out'
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* \u5BFC\u822A\u52A8\u753B\u914D\u7F6E
|
|
42
|
+
*
|
|
43
|
+
* \u4EC5 App \u7AEF\u751F\u6548\uFF0C\u5176\u4ED6\u5E73\u53F0\u81EA\u52A8\u5FFD\u7565\u3002
|
|
44
|
+
* \u4F18\u5148\u7EA7\uFF1Apush/replace \u8C03\u7528\u65F6\u4F20\u5165 > meta.animation > uni \u9ED8\u8BA4\u503C
|
|
45
|
+
*/
|
|
46
|
+
export interface NavigationAnimation {
|
|
47
|
+
/** \u7A97\u53E3\u52A8\u753B\u7C7B\u578B */
|
|
48
|
+
type: UniAnimationType
|
|
49
|
+
/** \u52A8\u753B\u6301\u7EED\u65F6\u95F4\uFF08ms\uFF09\uFF0C\u9ED8\u8BA4 300 */
|
|
50
|
+
duration?: number
|
|
51
|
+
}
|
|
52
|
+
|
|
3
53
|
/**
|
|
4
54
|
* \u8DEF\u7531\u5143\u4FE1\u606F
|
|
5
55
|
*/
|
|
@@ -10,6 +60,8 @@ export interface RouteMeta {
|
|
|
10
60
|
isTab?: boolean
|
|
11
61
|
/** \u662F\u5426\u9700\u8981\u767B\u5F55 */
|
|
12
62
|
requireAuth?: boolean
|
|
63
|
+
/** \u9ED8\u8BA4\u5BFC\u822A\u52A8\u753B\uFF08\u4EC5 App \u7AEF\u751F\u6548\uFF09\uFF0C\u53EF\u88AB push/replace \u65F6\u7684 animation \u53C2\u6570\u8986\u76D6 */
|
|
64
|
+
animation?: NavigationAnimation
|
|
13
65
|
/** \u81EA\u5B9A\u4E49\u6269\u5C55\u5B57\u6BB5 */
|
|
14
66
|
[key: string]: unknown
|
|
15
67
|
}
|
|
@@ -25,12 +77,17 @@ export interface RouteConfig {
|
|
|
25
77
|
/** \u8DEF\u7531\u5143\u4FE1\u606F */
|
|
26
78
|
meta?: RouteMeta
|
|
27
79
|
}
|
|
28
|
-
`}generateFileContent(e){const
|
|
80
|
+
`}generateFileContent(e,n){const i=this.generateTypeDefinitions(),a=this.options.outputFormat==="ts"?": RouteConfig[]":"",g=e.map(r=>{const l=n?.get(r.path);if(l){let h=l;if(h=replacePropertyValue(h,"path",`'${r.path}'`),r.name!==void 0&&(h=replacePropertyValue(h,"name",`'${r.name}'`)),r.meta&&Object.keys(r.meta).length>0){const F=serializeValueCompact(r.meta);h=replacePropertyValue(h,"meta",F)}else r.meta&&Object.keys(r.meta).length===0&&(h=removeProperty(h,"meta"));return h}return serializeRoute(r)}).map(r=>" "+r.split(`
|
|
81
|
+
`).join(`
|
|
82
|
+
`)).join(`,
|
|
83
|
+
`);return`${i}
|
|
29
84
|
/**
|
|
30
85
|
* \u8DEF\u7531\u914D\u7F6E\u5217\u8868
|
|
31
86
|
* @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
|
|
32
87
|
*/
|
|
33
|
-
export const routes${
|
|
88
|
+
export const routes${a} = [
|
|
89
|
+
${g}
|
|
90
|
+
]
|
|
34
91
|
|
|
35
92
|
export default routes
|
|
36
|
-
`}async readPagesJson(){const e=
|
|
93
|
+
`}async readPagesJson(){const e=o.resolve(this.projectRoot,this.options.pagesJsonPath);if(!s$1.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const n=await s$1.promises.readFile(e,"utf-8"),i=stripJsonComments(n);return JSON.parse(i)}catch(n){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${n.message}`),null}}mergeRoutes(e,n){return e.map(i=>{const a=n.get(i.path);if(!a)return i;const g={};return i.meta&&Object.assign(g,i.meta),a.meta&&Object.assign(g,a.meta),{...a,path:i.path,meta:Object.keys(g).length>0?g:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let n=this.parsePagesJson(e),i;const a=o.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s$1.existsSync(a))try{const r=await s$1.promises.readFile(a,"utf-8"),l=extractExistingRoutes(r);i=extractExistingRawRoutes(r),l.size>0&&(n=this.mergeRoutes(n,l),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const g=this.generateFileContent(n,i);await common_fs_index.writeFileContent(a,g),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${a}`),this.logger.info(`\u5171\u751F\u6210 ${n.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(n)}async generateDtsFile(e){if(!this.options.dts)return;const n=o.resolve(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),i=generateRouterDtsContent(e);common_fs_index.shouldUpdateFileContent(n,i)&&(await common_fs_index.writeFileContent(n,i),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${n}`))}startWatching(){if(!this.options.watch)return;const e=o.resolve(this.projectRoot,this.options.pagesJsonPath);s$1.existsSync(e)&&(this.watcher=s$1.watch(e,async n=>{n==="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 n=>{this.projectRoot=n.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),n.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(S);exports.generateRouter=generateRouter;
|
|
@@ -3,6 +3,30 @@ import 'vite';
|
|
|
3
3
|
import '../../shared/vite-plugin.B8FuZce1.cjs';
|
|
4
4
|
import '../../shared/vite-plugin.DRRlWY8P.cjs';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* 导航动画类型
|
|
8
|
+
*
|
|
9
|
+
* 用于 uni.navigateTo / uni.navigateBack 的 animationType 参数,
|
|
10
|
+
* 仅 App 端生效,其他平台自动忽略。
|
|
11
|
+
*
|
|
12
|
+
* 显示动画(navigateTo):slide-in-right / slide-in-left / slide-in-top / slide-in-bottom / pop-in / fade-in / zoom-out / zoom-fade-out / none / auto
|
|
13
|
+
* 关闭动画(navigateBack):slide-out-right / slide-out-left / slide-out-top / slide-out-bottom / pop-out / fade-out / zoom-in / zoom-fade-in / none / auto
|
|
14
|
+
*
|
|
15
|
+
* @see https://en.uniapp.dcloud.io/api/router.html#animation
|
|
16
|
+
*/
|
|
17
|
+
type UniAnimationType = 'auto' | 'none' | 'slide-in-right' | 'slide-in-left' | 'slide-in-top' | 'slide-in-bottom' | 'slide-out-right' | 'slide-out-left' | 'slide-out-top' | 'slide-out-bottom' | 'fade-in' | 'fade-out' | 'zoom-out' | 'zoom-in' | 'zoom-fade-out' | 'zoom-fade-in' | 'pop-in' | 'pop-out';
|
|
18
|
+
/**
|
|
19
|
+
* 导航动画配置
|
|
20
|
+
*
|
|
21
|
+
* 仅 App 端生效,其他平台自动忽略。
|
|
22
|
+
* 优先级:push/replace 调用时传入 > meta.animation > uni 默认值
|
|
23
|
+
*/
|
|
24
|
+
interface NavigationAnimation {
|
|
25
|
+
/** 窗口动画类型 */
|
|
26
|
+
type: UniAnimationType;
|
|
27
|
+
/** 动画持续时间(ms),默认 300 */
|
|
28
|
+
duration?: number;
|
|
29
|
+
}
|
|
6
30
|
/**
|
|
7
31
|
* 路由元信息
|
|
8
32
|
*
|
|
@@ -17,6 +41,8 @@ interface RouteMeta {
|
|
|
17
41
|
isTab?: boolean;
|
|
18
42
|
/** 是否需要登录才能访问 */
|
|
19
43
|
requireAuth?: boolean;
|
|
44
|
+
/** 默认导航动画(仅 App 端生效),可被 push/replace 时的 animation 参数覆盖 */
|
|
45
|
+
animation?: NavigationAnimation;
|
|
20
46
|
/** 自定义扩展字段 */
|
|
21
47
|
[key: string]: unknown;
|
|
22
48
|
}
|
|
@@ -33,6 +59,8 @@ interface RouteConfig {
|
|
|
33
59
|
name?: string;
|
|
34
60
|
/** 路由元信息 */
|
|
35
61
|
meta?: RouteMeta;
|
|
62
|
+
/** 用户自定义扩展属性(如 beforeEnter、component 等) */
|
|
63
|
+
[key: string]: unknown;
|
|
36
64
|
}
|
|
37
65
|
/**
|
|
38
66
|
* uni-app pages.json 中的页面配置项
|
|
@@ -292,4 +320,4 @@ interface GenerateRouterOptions extends BasePluginOptions {
|
|
|
292
320
|
declare const generateRouter: PluginFactory<GenerateRouterOptions, GenerateRouterOptions>;
|
|
293
321
|
|
|
294
322
|
export { generateRouter };
|
|
295
|
-
export type { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig };
|
|
323
|
+
export type { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig };
|
|
@@ -3,6 +3,30 @@ import 'vite';
|
|
|
3
3
|
import '../../shared/vite-plugin.B8FuZce1.mjs';
|
|
4
4
|
import '../../shared/vite-plugin.DRRlWY8P.mjs';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* 导航动画类型
|
|
8
|
+
*
|
|
9
|
+
* 用于 uni.navigateTo / uni.navigateBack 的 animationType 参数,
|
|
10
|
+
* 仅 App 端生效,其他平台自动忽略。
|
|
11
|
+
*
|
|
12
|
+
* 显示动画(navigateTo):slide-in-right / slide-in-left / slide-in-top / slide-in-bottom / pop-in / fade-in / zoom-out / zoom-fade-out / none / auto
|
|
13
|
+
* 关闭动画(navigateBack):slide-out-right / slide-out-left / slide-out-top / slide-out-bottom / pop-out / fade-out / zoom-in / zoom-fade-in / none / auto
|
|
14
|
+
*
|
|
15
|
+
* @see https://en.uniapp.dcloud.io/api/router.html#animation
|
|
16
|
+
*/
|
|
17
|
+
type UniAnimationType = 'auto' | 'none' | 'slide-in-right' | 'slide-in-left' | 'slide-in-top' | 'slide-in-bottom' | 'slide-out-right' | 'slide-out-left' | 'slide-out-top' | 'slide-out-bottom' | 'fade-in' | 'fade-out' | 'zoom-out' | 'zoom-in' | 'zoom-fade-out' | 'zoom-fade-in' | 'pop-in' | 'pop-out';
|
|
18
|
+
/**
|
|
19
|
+
* 导航动画配置
|
|
20
|
+
*
|
|
21
|
+
* 仅 App 端生效,其他平台自动忽略。
|
|
22
|
+
* 优先级:push/replace 调用时传入 > meta.animation > uni 默认值
|
|
23
|
+
*/
|
|
24
|
+
interface NavigationAnimation {
|
|
25
|
+
/** 窗口动画类型 */
|
|
26
|
+
type: UniAnimationType;
|
|
27
|
+
/** 动画持续时间(ms),默认 300 */
|
|
28
|
+
duration?: number;
|
|
29
|
+
}
|
|
6
30
|
/**
|
|
7
31
|
* 路由元信息
|
|
8
32
|
*
|
|
@@ -17,6 +41,8 @@ interface RouteMeta {
|
|
|
17
41
|
isTab?: boolean;
|
|
18
42
|
/** 是否需要登录才能访问 */
|
|
19
43
|
requireAuth?: boolean;
|
|
44
|
+
/** 默认导航动画(仅 App 端生效),可被 push/replace 时的 animation 参数覆盖 */
|
|
45
|
+
animation?: NavigationAnimation;
|
|
20
46
|
/** 自定义扩展字段 */
|
|
21
47
|
[key: string]: unknown;
|
|
22
48
|
}
|
|
@@ -33,6 +59,8 @@ interface RouteConfig {
|
|
|
33
59
|
name?: string;
|
|
34
60
|
/** 路由元信息 */
|
|
35
61
|
meta?: RouteMeta;
|
|
62
|
+
/** 用户自定义扩展属性(如 beforeEnter、component 等) */
|
|
63
|
+
[key: string]: unknown;
|
|
36
64
|
}
|
|
37
65
|
/**
|
|
38
66
|
* uni-app pages.json 中的页面配置项
|
|
@@ -292,4 +320,4 @@ interface GenerateRouterOptions extends BasePluginOptions {
|
|
|
292
320
|
declare const generateRouter: PluginFactory<GenerateRouterOptions, GenerateRouterOptions>;
|
|
293
321
|
|
|
294
322
|
export { generateRouter };
|
|
295
|
-
export type { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig };
|
|
323
|
+
export type { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig };
|