@meng-xi/vite-plugin 0.1.8 → 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 CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Features
17
17
 
18
- - **Ready to Use** - 13 practical plugins covering auto-import, build progress, bundle analysis & compression, file copying, environment variable validation, route generation, version management, HTML injection, favicon
18
+ - **Ready to Use** - 14 practical plugins covering auto-import, build progress, bundle analysis & compression, file copying, environment variable validation, route generation, version management, HTML injection, favicon
19
19
  management, global Loading, image optimization, and more
20
20
  - **Plugin Development Framework** - Exports core components like BasePlugin, Logger, and Validator to quickly build custom Vite plugins
21
21
  - **Common Utility Library** - Built-in 8 Common utility modules supporting on-demand sub-path imports
@@ -42,6 +42,7 @@ pnpm add @meng-xi/vite-plugin -D
42
42
  ```typescript
43
43
  import { defineConfig } from 'vite'
44
44
  import {
45
+ assetManifest,
45
46
  autoImport,
46
47
  buildProgress,
47
48
  bundleAnalyzer,
@@ -59,6 +60,7 @@ import {
59
60
 
60
61
  export default defineConfig({
61
62
  plugins: [
63
+ assetManifest({ outputFormat: 'vite', groupByEntry: true }),
62
64
  autoImport({ imports: { vue: ['ref', 'reactive', 'computed'] }, dts: 'src/auto-imports.d.ts' }),
63
65
  buildProgress(),
64
66
  bundleAnalyzer({ outputFormat: 'both' }),
@@ -80,6 +82,7 @@ export default defineConfig({
80
82
 
81
83
  | Plugin | Description |
82
84
  | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
85
+ | [assetManifest](https://mengxi-studio.github.io/vite-plugin/en/plugins/asset-manifest.html) | Build artifact manifest generation with multiple output formats, entry grouping, and runtime injection |
83
86
  | [autoImport](https://mengxi-studio.github.io/vite-plugin/en/plugins/auto-import.html) | Auto-inject import statements with preset mappings, directory scanning, and Vue template auto-import |
84
87
  | [buildProgress](https://mengxi-studio.github.io/vite-plugin/en/plugins/build-progress.html) | Real-time terminal build progress bar, supports bar / spinner / minimal |
85
88
  | [bundleAnalyzer](https://mengxi-studio.github.io/vite-plugin/en/plugins/bundle-analyzer.html) | Bundle volume analysis with JSON/HTML reports, gzip calculation, threshold alerts, and build diff |
@@ -195,6 +198,7 @@ import { normalizePath, isExtensionIncluded, isPathExcluded, isPreCompressed } f
195
198
  | `@meng-xi/vite-plugin/common` | All utility functions |
196
199
  | `@meng-xi/vite-plugin/common/*` | Utility sub-modules |
197
200
  | `@meng-xi/vite-plugin/common/concurrency` | Concurrency control utilities |
201
+ | `@meng-xi/vite-plugin/plugins/asset-manifest` | assetManifest plugin |
198
202
  | `@meng-xi/vite-plugin/plugins/auto-import` | autoImport plugin |
199
203
  | `@meng-xi/vite-plugin/plugins/build-progress` | buildProgress plugin |
200
204
  | `@meng-xi/vite-plugin/plugins/bundle-analyzer` | bundleAnalyzer plugin |
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## 特性
17
17
 
18
- - **开箱即用** - 13 个实用插件,覆盖自动导入、构建进度、产物分析与压缩、文件复制、环境变量校验、路由生成、版本管理、HTML 注入、图标管理、全局 Loading、图片优化 等场景
18
+ - **开箱即用** - 14 个实用插件,覆盖自动导入、构建进度、产物分析与压缩、文件复制、环境变量校验、路由生成、版本管理、HTML 注入、图标管理、全局 Loading、图片优化 等场景
19
19
  - **插件开发框架** - 导出 BasePlugin、Logger、Validator 等核心组件,快速构建自定义 Vite 插件
20
20
  - **通用工具库** - 内置 8 大 Common 工具模块,支持按需子路径导入
21
21
  - **类型安全** - 完整 TypeScript 类型定义与配置验证器
@@ -41,6 +41,7 @@ pnpm add @meng-xi/vite-plugin -D
41
41
  ```typescript
42
42
  import { defineConfig } from 'vite'
43
43
  import {
44
+ assetManifest,
44
45
  autoImport,
45
46
  buildProgress,
46
47
  bundleAnalyzer,
@@ -58,6 +59,7 @@ import {
58
59
 
59
60
  export default defineConfig({
60
61
  plugins: [
62
+ assetManifest({ outputFormat: 'vite', groupByEntry: true }),
61
63
  autoImport({ imports: { vue: ['ref', 'reactive', 'computed'] }, dts: 'src/auto-imports.d.ts' }),
62
64
  buildProgress(),
63
65
  bundleAnalyzer({ outputFormat: 'both' }),
@@ -79,6 +81,7 @@ export default defineConfig({
79
81
 
80
82
  | 插件 | 说明 |
81
83
  | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
84
+ | [assetManifest](https://mengxi-studio.github.io/vite-plugin/plugins/asset-manifest.html) | 构建产物资源清单生成,支持多种输出格式、按入口分组和运行时注入 |
82
85
  | [autoImport](https://mengxi-studio.github.io/vite-plugin/plugins/auto-import.html) | 自动注入 import 语句,支持预设映射、目录扫描和 Vue 模板自动导入 |
83
86
  | [buildProgress](https://mengxi-studio.github.io/vite-plugin/plugins/build-progress.html) | 终端实时构建进度条,支持 bar / spinner / minimal |
84
87
  | [bundleAnalyzer](https://mengxi-studio.github.io/vite-plugin/plugins/bundle-analyzer.html) | 构建产物体积分析,支持 JSON/HTML 报告、gzip 计算、阈值告警和构建对比 |
@@ -194,6 +197,7 @@ import { normalizePath, isExtensionIncluded, isPathExcluded, isPreCompressed } f
194
197
  | `@meng-xi/vite-plugin/common` | 所有工具函数 |
195
198
  | `@meng-xi/vite-plugin/common/*` | 各工具子模块 |
196
199
  | `@meng-xi/vite-plugin/common/concurrency` | 并发控制工具 |
200
+ | `@meng-xi/vite-plugin/plugins/asset-manifest` | assetManifest 插件 |
197
201
  | `@meng-xi/vite-plugin/plugins/auto-import` | autoImport 插件 |
198
202
  | `@meng-xi/vite-plugin/plugins/build-progress` | buildProgress 插件 |
199
203
  | `@meng-xi/vite-plugin/plugins/bundle-analyzer` | bundleAnalyzer 插件 |
package/dist/index.d.cts CHANGED
@@ -17,7 +17,7 @@ export { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummar
17
17
  export { CopyFileOptions, copyFile } from './plugins/copyFile/index.cjs';
18
18
  export { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode, envGuard } from './plugins/envGuard/index.cjs';
19
19
  export { FaviconManagerOptions, Icon, faviconManager } from './plugins/faviconManager/index.cjs';
20
- export { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './plugins/generateRouter/index.cjs';
20
+ export { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './plugins/generateRouter/index.cjs';
21
21
  export { GenerateVersionOptions, OutputType, VersionFormat, VersionInfo, generateVersion } from './plugins/generateVersion/index.cjs';
22
22
  export { HtmlInjectOptions, InjectRule, InjectionLogEntry, htmlInject } from './plugins/htmlInject/index.cjs';
23
23
  export { ConvertMapping, FormatQualityOptions, ImageFormat, ImageOptimizeStats, ImageOptimizeSummary, ImageOptimizerOptions, SvgoOptions, SvgoPlugin, imageOptimizer } from './plugins/imageOptimizer/index.cjs';
package/dist/index.d.mts CHANGED
@@ -17,7 +17,7 @@ export { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummar
17
17
  export { CopyFileOptions, copyFile } from './plugins/copyFile/index.mjs';
18
18
  export { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode, envGuard } from './plugins/envGuard/index.mjs';
19
19
  export { FaviconManagerOptions, Icon, faviconManager } from './plugins/faviconManager/index.mjs';
20
- export { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './plugins/generateRouter/index.mjs';
20
+ export { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './plugins/generateRouter/index.mjs';
21
21
  export { GenerateVersionOptions, OutputType, VersionFormat, VersionInfo, generateVersion } from './plugins/generateVersion/index.mjs';
22
22
  export { HtmlInjectOptions, InjectRule, InjectionLogEntry, htmlInject } from './plugins/htmlInject/index.mjs';
23
23
  export { ConvertMapping, FormatQualityOptions, ImageFormat, ImageOptimizeStats, ImageOptimizeSummary, ImageOptimizerOptions, SvgoOptions, SvgoPlugin, imageOptimizer } from './plugins/imageOptimizer/index.mjs';
package/dist/index.d.ts CHANGED
@@ -17,7 +17,7 @@ export { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummar
17
17
  export { CopyFileOptions, copyFile } from './plugins/copyFile/index.js';
18
18
  export { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode, envGuard } from './plugins/envGuard/index.js';
19
19
  export { FaviconManagerOptions, Icon, faviconManager } from './plugins/faviconManager/index.js';
20
- export { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './plugins/generateRouter/index.js';
20
+ export { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './plugins/generateRouter/index.js';
21
21
  export { GenerateVersionOptions, OutputType, VersionFormat, VersionInfo, generateVersion } from './plugins/generateVersion/index.js';
22
22
  export { HtmlInjectOptions, InjectRule, InjectionLogEntry, htmlInject } from './plugins/htmlInject/index.js';
23
23
  export { ConvertMapping, FormatQualityOptions, ImageFormat, ImageOptimizeStats, ImageOptimizeSummary, ImageOptimizerOptions, SvgoOptions, SvgoPlugin, imageOptimizer } from './plugins/imageOptimizer/index.js';
@@ -1 +1 @@
1
- "use strict";const l=require("node:path"),u$2=require("node:fs"),factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_path_index=require("../../common/path/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_validation_index=require("../../common/validation/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path"),require("../../common/concurrency/index.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs");function _interopDefaultCompat(s){return s&&typeof s=="object"&&"default"in s?s.default:s}const l__default=_interopDefaultCompat(l),u__default=_interopDefaultCompat(u$2);function shouldIncludeAsset(s,t,e){const n=common_path_index.normalizePath(s);if(!common_path_index.isExtensionIncluded(t,{includeExtensions:e.includeExtensions,excludeExtensions:e.excludeExtensions})||common_path_index.isPathExcluded(s,e.excludePaths,{matchMode:"segment"}))return!1;const o=common_path_index.normalizePath(e.outputFile);return!(n===o||n.endsWith("/"+o)||n.endsWith("manifest.json")||n.endsWith("asset-manifest.json")||common_path_index.isPreCompressed(t))}async function scanOutputDirectory(s,t){return(await common_fs_index.scanDirectory(s,{filter:(e,n,o)=>{const h=common_path_index.normalizePath(l__default.relative(s,e));return shouldIncludeAsset(h,n,t)}})).map(e=>({filePath:e.filePath,relativePath:common_path_index.normalizePath(l__default.relative(s,e.filePath)),size:e.size,ext:e.extension}))}function buildAssetMap(s,t,e){const n={},o=t.endsWith("/")?t:t+"/";for(const h of s){const c=extractOriginalKey(h.relativePath),r=o+h.relativePath;n[c]!==void 0&&n[c]!==r?(n[h.relativePath]=r,e?.(`\u8D44\u6E90\u952E\u540D\u51B2\u7A81: "${c}" \u5DF2\u88AB ${n[c]} \u5360\u7528\uFF0C"${h.relativePath}" \u5C06\u4F7F\u7528\u5B8C\u6574\u8DEF\u5F84\u4F5C\u4E3A\u952E`)):n[c]=r}return n}function extractOriginalKey(s){const t=/[-.]([0-9a-f]{6,20})(?=\.)/g;return s.replace(t,"")}function formatManifest(s,t,e,n,o){switch(t){case"vite":return a(s,n,o);case"webpack":return i(s,o);case"custom":return u$1(s,e);default:return a(s,n,o)}}function a(s,t,e){const n={version:"1.0",timestamp:new Date().toISOString(),publicPath:t,assets:s};return e&&e.length>0&&(n.groups=e),n}function i(s,t){return t&&t.length>0?{entries:t.map(e=>({name:e.entry,files:[...e.assets.js,...e.assets.css,...e.assets.other]})),assets:s}:{entries:[{name:"main",files:Object.values(s)}],assets:s}}function u$1(s,t){if(!t)throw new Error('outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u4E0D\u80FD\u4E3A\u7A7A');return t(s)}function groupAssetsByEntry(s,t){const e=new Map,n=new Set,o=s.filter(d);for(const r of o){const p=f(r.relativePath);e.has(p)||e.set(p,{entry:p,assets:{js:[],css:[],other:[]}});const g=e.get(p),E=t[r.relativePath]||r.relativePath;u(g,E,r.ext),n.add(r.relativePath)}const h=s.filter(r=>!n.has(r.relativePath)&&!A(r));for(const r of h){const p=m(r,o),g=p?f(p.relativePath):"_shared";e.has(g)||e.set(g,{entry:g,assets:{js:[],css:[],other:[]}});const E=e.get(g),v=t[r.relativePath]||r.relativePath;u(E,v,r.ext),n.add(r.relativePath)}const c=s.filter(r=>!n.has(r.relativePath));if(c.length>0){e.has("_shared")||e.set("_shared",{entry:"_shared",assets:{js:[],css:[],other:[]}});const r=e.get("_shared");for(const p of c){const g=t[p.relativePath]||p.relativePath;u(r,g,p.ext)}}return Array.from(e.values())}function d(s){const{relativePath:t,ext:e}=s,n=t.split("/").pop()||"";return!!(e===".html"||(e===".js"||e===".mjs")&&(n.startsWith("entry-")||n.startsWith("main")||!t.includes("/")))}function A(s){return[".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".woff",".woff2",".ttf",".eot",".map"].includes(s.ext)}function f(s){let t=(s.split("/").pop()||"").replace(/\.[^.]+$/,"");return t.startsWith("entry-")&&(t=t.slice(6)),t.replace(/[-.][0-9a-f]{6,20}$/,"")||t}function m(s,t){const e=s.relativePath.split("/").slice(0,-1).join("/"),n=(s.relativePath.split("/").pop()||"").replace(/\.[^.]+$/,"").replace(/[-.][0-9a-f]{6,20}$/,"");let o=null,h=0;for(const c of t){const r=c.relativePath.split("/").slice(0,-1).join("/"),p=f(c.relativePath);if(e===r)return c;n.startsWith(p)&&p.length>h&&(o=c,h=p.length)}return o}function u(s,t,e){e===".js"||e===".mjs"?s.assets.js.push(t):e===".css"?s.assets.css.push(t):s.assets.other.push(t)}function generateRuntimeScript(s,t){const e=JSON.stringify(s).replace(/<\/script>/gi,"<\\/script>");return`<script>Object.defineProperty(window,"${t}",{value:Object.freeze(${e}),writable:false,configurable:false})<\/script>`}function injectRuntimeManifest(s,t,e){const n=generateRuntimeScript(t,e);return common_html_index.injectBeforeTag(s,"</head>",n)}class F extends factory_index.BasePlugin{manifest=null;assetMap={};groups=null;getDefaultOptions(){return{outputFormat:"vite",outputFile:"manifest.json",includeExtensions:[],publicPath:"/",injectRuntime:!1,runtimeGlobalName:"__ASSET_MANIFEST__",customFormatter:null,groupByEntry:!1,excludeExtensions:[".map",".gz",".br"],excludePaths:[]}}validateOptions(){this.validator.field("outputFormat").enum(["vite","webpack","custom"]).field("outputFile").custom(t=>typeof t=="string"&&t.length>0,"outputFile \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("publicPath").custom(t=>typeof t=="string"&&t.length>0,"publicPath \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("injectRuntime").boolean().field("runtimeGlobalName").custom(t=>typeof t=="string"&&t.length>0,"runtimeGlobalName \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("groupByEntry").boolean().field("customFormatter").custom(t=>this.options.outputFormat!=="custom"||typeof t=="function",'outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u5FC5\u987B\u4E3A\u51FD\u6570').validate(),common_validation_index.validateGlobalName(this.options.runtimeGlobalName,"runtimeGlobalName")}getPluginName(){return"asset-manifest"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle={order:"post",handler:async()=>{await this.safeExecute(()=>this.generateManifest(),"\u751F\u6210\u8D44\u6E90\u6E05\u5355")}}}async generateManifest(){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 n=await scanOutputDirectory(t,this.options);if(n.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u8BB0\u5F55\u7684\u8D44\u6E90\u6587\u4EF6");return}this.assetMap=buildAssetMap(n,this.options.publicPath,r=>{this.logger.warn(r)}),this.options.groupByEntry&&(this.groups=groupAssetsByEntry(n,this.assetMap));const o=formatManifest(this.assetMap,this.options.outputFormat,this.options.customFormatter,this.options.publicPath,this.groups??void 0),h=l__default.isAbsolute(this.options.outputFile)?this.options.outputFile:l__default.join(t,this.options.outputFile);await common_fs_index.writeFileContent(h,JSON.stringify(o,null,2)),this.options.outputFormat==="vite"&&(this.manifest=o),this.options.injectRuntime&&await this.injectRuntimeToHtmlFiles(t);const c=Date.now()-e;this.logStats(n.length,c)}async injectRuntimeToHtmlFiles(t){if(!this.manifest&&Object.keys(this.assetMap).length===0){this.logger.warn("\u8D44\u6E90\u6E05\u5355\u5C1A\u672A\u751F\u6210\uFF0C\u8DF3\u8FC7\u8FD0\u884C\u65F6\u6CE8\u5165");return}const e=this.manifest?.assets||this.assetMap,n=await this.findHtmlFiles(t);if(n.length===0){this.logger.warn("\u672A\u627E\u5230 HTML \u6587\u4EF6\uFF0C\u8FD0\u884C\u65F6\u6E05\u5355\u6CE8\u5165\u8DF3\u8FC7");return}for(const o of n)try{const h=await u__default.promises.readFile(o,"utf-8"),c=injectRuntimeManifest(h,e,this.options.runtimeGlobalName);c.injected?(await common_fs_index.writeFileContent(o,c.html),this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5DF2\u6CE8\u5165\u5230: ${l__default.relative(t,o)}`)):this.logger.warn(`\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u6CE8\u5165: ${l__default.relative(t,o)}`)}catch(h){this.logger.error(`\u6CE8\u5165\u8FD0\u884C\u65F6\u6E05\u5355\u5931\u8D25: ${o} - ${h instanceof Error?h.message:String(h)}`)}this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5168\u5C40\u53D8\u91CF: ${this.options.runtimeGlobalName}`)}async findHtmlFiles(t){const e=[];async function n(o){const h=await u__default.promises.readdir(o,{withFileTypes:!0});for(const c of h){const r=l__default.join(o,c.name);c.isDirectory()?await n(r):c.isFile()&&c.name.endsWith(".html")&&e.push(r)}}return await n(t),e}logStats(t,e){const n=Object.keys(this.assetMap).length;this.logger.success(`\u8D44\u6E90\u6E05\u5355\u5DF2\u751F\u6210: ${t} \u4E2A\u8D44\u6E90\u6587\u4EF6\uFF0C${n} \u6761\u6620\u5C04\u8BB0\u5F55`,`\u683C\u5F0F: ${this.options.outputFormat}\uFF0C\u8F93\u51FA: ${this.options.outputFile}\uFF0C\u8017\u65F6: ${e}ms`),this.groups&&this.groups.length>0&&this.logger.info(`\u5165\u53E3\u5206\u7EC4: ${this.groups.map(o=>`${o.entry}(${o.assets.js.length+o.assets.css.length+o.assets.other.length})`).join(", ")}`)}getAssetMap(){return{...this.assetMap}}getManifest(){return this.manifest}getGroups(){return this.groups}}const assetManifest=factory_index.createPluginFactory(F);exports.assetManifest=assetManifest;
1
+ "use strict";const l=require("node:path"),u$2=require("node:fs"),factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_path_index=require("../../common/path/index.cjs"),common_html_index=require("../../common/html/index.cjs"),common_validation_index=require("../../common/validation/index.cjs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("path"),require("../../common/concurrency/index.cjs"),require("../../shared/vite-plugin.CcvHfrL8.cjs");function _interopDefaultCompat(s){return s&&typeof s=="object"&&"default"in s?s.default:s}const l__default=_interopDefaultCompat(l),u__default=_interopDefaultCompat(u$2);function shouldIncludeAsset(s,t,e){const n=common_path_index.normalizePath(s);if(!common_path_index.isExtensionIncluded(t,{includeExtensions:e.includeExtensions,excludeExtensions:e.excludeExtensions})||common_path_index.isPathExcluded(s,e.excludePaths,{matchMode:"segment"}))return!1;const o=common_path_index.normalizePath(e.outputFile);return!(n===o||n.endsWith("/"+o)||n.endsWith("manifest.json")||n.endsWith("asset-manifest.json")||common_path_index.isPreCompressed(t))}async function scanOutputDirectory(s,t){return(await common_fs_index.scanDirectory(s,{filter:(e,n,o)=>{const c=common_path_index.normalizePath(l__default.relative(s,e));return shouldIncludeAsset(c,n,t)}})).map(e=>({filePath:e.filePath,relativePath:common_path_index.normalizePath(l__default.relative(s,e.filePath)),size:e.size,ext:e.extension}))}function buildAssetMap(s,t,e){const n={},o=t.endsWith("/")?t:t+"/";for(const c of s){const h=extractOriginalKey(c.relativePath),r=o+c.relativePath;n[h]!==void 0&&n[h]!==r?(n[c.relativePath]=r,e?.(`\u8D44\u6E90\u952E\u540D\u51B2\u7A81: "${h}" \u5DF2\u88AB ${n[h]} \u5360\u7528\uFF0C"${c.relativePath}" \u5C06\u4F7F\u7528\u5B8C\u6574\u8DEF\u5F84\u4F5C\u4E3A\u952E`)):n[h]=r}return n}function extractOriginalKey(s){const t=/[-.]([0-9a-f]{6,20})(?=\.)/g;return s.replace(t,"")}function formatManifest(s,t,e,n,o){switch(t){case"vite":return a(s,n,o);case"webpack":return i(s,o);case"custom":return u$1(s,e);default:return a(s,n,o)}}function a(s,t,e){const n={version:"1.0",timestamp:new Date().toISOString(),publicPath:t,assets:s};return e&&e.length>0&&(n.groups=e),n}function i(s,t){return t&&t.length>0?{entries:t.map(e=>({name:e.entry,files:[...e.assets.js,...e.assets.css,...e.assets.other]})),assets:s}:{entries:[{name:"main",files:Object.values(s)}],assets:s}}function u$1(s,t){if(!t)throw new Error('outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u4E0D\u80FD\u4E3A\u7A7A');return t(s)}function groupAssetsByEntry(s,t){const e=new Map,n=new Set,o=s.filter(d);for(const r of o){const p=f(r.relativePath);e.has(p)||e.set(p,{entry:p,assets:{js:[],css:[],other:[]}});const g=e.get(p),E=t[r.relativePath]||r.relativePath;u(g,E,r.ext),n.add(r.relativePath)}const c=s.filter(r=>!n.has(r.relativePath)&&!A(r));for(const r of c){const p=m(r,o),g=p?f(p.relativePath):"_shared";e.has(g)||e.set(g,{entry:g,assets:{js:[],css:[],other:[]}});const E=e.get(g),v=t[r.relativePath]||r.relativePath;u(E,v,r.ext),n.add(r.relativePath)}const h=s.filter(r=>!n.has(r.relativePath));if(h.length>0){e.has("_shared")||e.set("_shared",{entry:"_shared",assets:{js:[],css:[],other:[]}});const r=e.get("_shared");for(const p of h){const g=t[p.relativePath]||p.relativePath;u(r,g,p.ext)}}return Array.from(e.values())}function d(s){const{relativePath:t,ext:e}=s,n=t.split("/").pop()||"";return!!(e===".html"||(e===".js"||e===".mjs")&&(n.startsWith("entry-")||n.startsWith("main")||!t.includes("/")))}function A(s){return[".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".woff",".woff2",".ttf",".eot",".map"].includes(s.ext)}function f(s){let t=(s.split("/").pop()||"").replace(/\.[^.]+$/,"");return t.startsWith("entry-")&&(t=t.slice(6)),t.replace(/[-.][0-9a-f]{6,20}$/,"")||t}function m(s,t){const e=s.relativePath.split("/").slice(0,-1).join("/"),n=(s.relativePath.split("/").pop()||"").replace(/\.[^.]+$/,"").replace(/[-.][0-9a-f]{6,20}$/,"");let o=null,c=0;for(const h of t){const r=h.relativePath.split("/").slice(0,-1).join("/"),p=f(h.relativePath);if(e===r)return h;n.startsWith(p)&&p.length>c&&(o=h,c=p.length)}return o}function u(s,t,e){e===".js"||e===".mjs"?s.assets.js.push(t):e===".css"?s.assets.css.push(t):s.assets.other.push(t)}function generateRuntimeScript(s,t){const e=JSON.stringify(s).replace(/<\/script>/gi,"<\\/script>");return`<script>Object.defineProperty(window,"${t}",{value:Object.freeze(${e}),writable:false,configurable:false})<\/script>`}function injectRuntimeManifest(s,t,e){const n=generateRuntimeScript(t,e);return common_html_index.injectBeforeTag(s,"</head>",n)}async function findHtmlFiles(s){const t=[];async function e(n){const o=await u__default.promises.readdir(n,{withFileTypes:!0});for(const c of o){const h=l__default.join(n,c.name);c.isDirectory()?await e(h):c.isFile()&&c.name.endsWith(".html")&&t.push(h)}}return await e(s),t}class F extends factory_index.BasePlugin{manifest=null;assetMap={};groups=null;getDefaultOptions(){return{outputFormat:"vite",outputFile:"manifest.json",includeExtensions:[],publicPath:"/",injectRuntime:!1,runtimeGlobalName:"__ASSET_MANIFEST__",customFormatter:null,groupByEntry:!1,excludeExtensions:[".map",".gz",".br"],excludePaths:[]}}validateOptions(){this.validator.field("outputFormat").enum(["vite","webpack","custom"]).field("outputFile").custom(t=>typeof t=="string"&&t.length>0,"outputFile \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("publicPath").custom(t=>typeof t=="string"&&t.length>0,"publicPath \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("injectRuntime").boolean().field("runtimeGlobalName").custom(t=>typeof t=="string"&&t.length>0,"runtimeGlobalName \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("groupByEntry").boolean().field("customFormatter").custom(t=>this.options.outputFormat!=="custom"||typeof t=="function",'outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u5FC5\u987B\u4E3A\u51FD\u6570').validate(),common_validation_index.validateGlobalName(this.options.runtimeGlobalName,"runtimeGlobalName")}getPluginName(){return"asset-manifest"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle={order:"post",handler:async()=>{await this.safeExecute(()=>this.generateManifest(),"\u751F\u6210\u8D44\u6E90\u6E05\u5355")}}}async generateManifest(){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 n=await scanOutputDirectory(t,this.options);if(n.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u8BB0\u5F55\u7684\u8D44\u6E90\u6587\u4EF6");return}this.assetMap=buildAssetMap(n,this.options.publicPath,r=>{this.logger.warn(r)}),this.options.groupByEntry&&(this.groups=groupAssetsByEntry(n,this.assetMap));const o=formatManifest(this.assetMap,this.options.outputFormat,this.options.customFormatter,this.options.publicPath,this.groups??void 0),c=l__default.isAbsolute(this.options.outputFile)?this.options.outputFile:l__default.join(t,this.options.outputFile);await common_fs_index.writeFileContent(c,JSON.stringify(o,null,2)),this.options.outputFormat==="vite"&&(this.manifest=o),this.options.injectRuntime&&await this.injectRuntimeToHtmlFiles(t);const h=Date.now()-e;this.logStats(n.length,h)}async injectRuntimeToHtmlFiles(t){if(!this.manifest&&Object.keys(this.assetMap).length===0){this.logger.warn("\u8D44\u6E90\u6E05\u5355\u5C1A\u672A\u751F\u6210\uFF0C\u8DF3\u8FC7\u8FD0\u884C\u65F6\u6CE8\u5165");return}const e=this.manifest?.assets||this.assetMap,n=await findHtmlFiles(t);if(n.length===0){this.logger.warn("\u672A\u627E\u5230 HTML \u6587\u4EF6\uFF0C\u8FD0\u884C\u65F6\u6E05\u5355\u6CE8\u5165\u8DF3\u8FC7");return}for(const o of n)try{const c=await u__default.promises.readFile(o,"utf-8"),h=injectRuntimeManifest(c,e,this.options.runtimeGlobalName);h.injected?(await common_fs_index.writeFileContent(o,h.html),this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5DF2\u6CE8\u5165\u5230: ${l__default.relative(t,o)}`)):this.logger.warn(`\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u6CE8\u5165: ${l__default.relative(t,o)}`)}catch(c){this.logger.error(`\u6CE8\u5165\u8FD0\u884C\u65F6\u6E05\u5355\u5931\u8D25: ${o} - ${c instanceof Error?c.message:String(c)}`)}this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5168\u5C40\u53D8\u91CF: ${this.options.runtimeGlobalName}`)}logStats(t,e){const n=Object.keys(this.assetMap).length;this.logger.success(`\u8D44\u6E90\u6E05\u5355\u5DF2\u751F\u6210: ${t} \u4E2A\u8D44\u6E90\u6587\u4EF6\uFF0C${n} \u6761\u6620\u5C04\u8BB0\u5F55`,`\u683C\u5F0F: ${this.options.outputFormat}\uFF0C\u8F93\u51FA: ${this.options.outputFile}\uFF0C\u8017\u65F6: ${e}ms`),this.groups&&this.groups.length>0&&this.logger.info(`\u5165\u53E3\u5206\u7EC4: ${this.groups.map(o=>`${o.entry}(${o.assets.js.length+o.assets.css.length+o.assets.other.length})`).join(", ")}`)}getAssetMap(){return{...this.assetMap}}getManifest(){return this.manifest}getGroups(){return this.groups}}const assetManifest=factory_index.createPluginFactory(F);exports.assetManifest=assetManifest;
@@ -1 +1 @@
1
- import c from"node:path";import F from"node:fs";import{createPluginFactory as v,BasePlugin as C}from"../../factory/index.mjs";import{scanDirectory as P,writeFileContent as g}from"../../common/fs/index.mjs";import{normalizePath as h,isExtensionIncluded as y,isPathExcluded as A,isPreCompressed as w}from"../../common/path/index.mjs";import{injectBeforeTag as j}from"../../common/html/index.mjs";import{validateGlobalName as D}from"../../common/validation/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";import"../../common/concurrency/index.mjs";import"../../shared/vite-plugin.CuXEJAWX.mjs";function b(s,t,e){const u=h(s);if(!y(t,{includeExtensions:e.includeExtensions,excludeExtensions:e.excludeExtensions})||A(s,e.excludePaths,{matchMode:"segment"}))return!1;const i=h(e.outputFile);return!(u===i||u.endsWith("/"+i)||u.endsWith("manifest.json")||u.endsWith("asset-manifest.json")||w(t))}async function B(s,t){return(await P(s,{filter:(e,u,i)=>{const r=h(c.relative(s,e));return b(r,u,t)}})).map(e=>({filePath:e.filePath,relativePath:h(c.relative(s,e.filePath)),size:e.size,ext:e.extension}))}function $(s,t,e){const u={},i=t.endsWith("/")?t:t+"/";for(const r of s){const o=x(r.relativePath),n=i+r.relativePath;u[o]!==void 0&&u[o]!==n?(u[r.relativePath]=n,e?.(`\u8D44\u6E90\u952E\u540D\u51B2\u7A81: "${o}" \u5DF2\u88AB ${u[o]} \u5360\u7528\uFF0C"${r.relativePath}" \u5C06\u4F7F\u7528\u5B8C\u6574\u8DEF\u5F84\u4F5C\u4E3A\u952E`)):u[o]=n}return u}function x(s){const t=/[-.]([0-9a-f]{6,20})(?=\.)/g;return s.replace(t,"")}function M(s,t,e,u,i){switch(t){case"vite":return E(s,u,i);case"webpack":return N(s,i);case"custom":return O(s,e);default:return E(s,u,i)}}function E(s,t,e){const u={version:"1.0",timestamp:new Date().toISOString(),publicPath:t,assets:s};return e&&e.length>0&&(u.groups=e),u}function N(s,t){return t&&t.length>0?{entries:t.map(e=>({name:e.entry,files:[...e.assets.js,...e.assets.css,...e.assets.other]})),assets:s}:{entries:[{name:"main",files:Object.values(s)}],assets:s}}function O(s,t){if(!t)throw new Error('outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u4E0D\u80FD\u4E3A\u7A7A');return t(s)}function S(s,t){const e=new Map,u=new Set,i=s.filter(_);for(const n of i){const a=f(n.relativePath);e.has(a)||e.set(a,{entry:a,assets:{js:[],css:[],other:[]}});const l=e.get(a),p=t[n.relativePath]||n.relativePath;m(l,p,n.ext),u.add(n.relativePath)}const r=s.filter(n=>!u.has(n.relativePath)&&!G(n));for(const n of r){const a=W(n,i),l=a?f(a.relativePath):"_shared";e.has(l)||e.set(l,{entry:l,assets:{js:[],css:[],other:[]}});const p=e.get(l),d=t[n.relativePath]||n.relativePath;m(p,d,n.ext),u.add(n.relativePath)}const o=s.filter(n=>!u.has(n.relativePath));if(o.length>0){e.has("_shared")||e.set("_shared",{entry:"_shared",assets:{js:[],css:[],other:[]}});const n=e.get("_shared");for(const a of o){const l=t[a.relativePath]||a.relativePath;m(n,l,a.ext)}}return Array.from(e.values())}function _(s){const{relativePath:t,ext:e}=s,u=t.split("/").pop()||"";return!!(e===".html"||(e===".js"||e===".mjs")&&(u.startsWith("entry-")||u.startsWith("main")||!t.includes("/")))}function G(s){return[".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".woff",".woff2",".ttf",".eot",".map"].includes(s.ext)}function f(s){let t=(s.split("/").pop()||"").replace(/\.[^.]+$/,"");return t.startsWith("entry-")&&(t=t.slice(6)),t.replace(/[-.][0-9a-f]{6,20}$/,"")||t}function W(s,t){const e=s.relativePath.split("/").slice(0,-1).join("/"),u=(s.relativePath.split("/").pop()||"").replace(/\.[^.]+$/,"").replace(/[-.][0-9a-f]{6,20}$/,"");let i=null,r=0;for(const o of t){const n=o.relativePath.split("/").slice(0,-1).join("/"),a=f(o.relativePath);if(e===n)return o;u.startsWith(a)&&a.length>r&&(i=o,r=a.length)}return i}function m(s,t,e){e===".js"||e===".mjs"?s.assets.js.push(t):e===".css"?s.assets.css.push(t):s.assets.other.push(t)}function R(s,t){const e=JSON.stringify(s).replace(/<\/script>/gi,"<\\/script>");return`<script>Object.defineProperty(window,"${t}",{value:Object.freeze(${e}),writable:false,configurable:false})<\/script>`}function T(s,t,e){const u=R(t,e);return j(s,"</head>",u)}class H extends C{manifest=null;assetMap={};groups=null;getDefaultOptions(){return{outputFormat:"vite",outputFile:"manifest.json",includeExtensions:[],publicPath:"/",injectRuntime:!1,runtimeGlobalName:"__ASSET_MANIFEST__",customFormatter:null,groupByEntry:!1,excludeExtensions:[".map",".gz",".br"],excludePaths:[]}}validateOptions(){this.validator.field("outputFormat").enum(["vite","webpack","custom"]).field("outputFile").custom(t=>typeof t=="string"&&t.length>0,"outputFile \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("publicPath").custom(t=>typeof t=="string"&&t.length>0,"publicPath \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("injectRuntime").boolean().field("runtimeGlobalName").custom(t=>typeof t=="string"&&t.length>0,"runtimeGlobalName \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("groupByEntry").boolean().field("customFormatter").custom(t=>this.options.outputFormat!=="custom"||typeof t=="function",'outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u5FC5\u987B\u4E3A\u51FD\u6570').validate(),D(this.options.runtimeGlobalName,"runtimeGlobalName")}getPluginName(){return"asset-manifest"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle={order:"post",handler:async()=>{await this.safeExecute(()=>this.generateManifest(),"\u751F\u6210\u8D44\u6E90\u6E05\u5355")}}}async generateManifest(){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 u=await B(t,this.options);if(u.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u8BB0\u5F55\u7684\u8D44\u6E90\u6587\u4EF6");return}this.assetMap=$(u,this.options.publicPath,n=>{this.logger.warn(n)}),this.options.groupByEntry&&(this.groups=S(u,this.assetMap));const i=M(this.assetMap,this.options.outputFormat,this.options.customFormatter,this.options.publicPath,this.groups??void 0),r=c.isAbsolute(this.options.outputFile)?this.options.outputFile:c.join(t,this.options.outputFile);await g(r,JSON.stringify(i,null,2)),this.options.outputFormat==="vite"&&(this.manifest=i),this.options.injectRuntime&&await this.injectRuntimeToHtmlFiles(t);const o=Date.now()-e;this.logStats(u.length,o)}async injectRuntimeToHtmlFiles(t){if(!this.manifest&&Object.keys(this.assetMap).length===0){this.logger.warn("\u8D44\u6E90\u6E05\u5355\u5C1A\u672A\u751F\u6210\uFF0C\u8DF3\u8FC7\u8FD0\u884C\u65F6\u6CE8\u5165");return}const e=this.manifest?.assets||this.assetMap,u=await this.findHtmlFiles(t);if(u.length===0){this.logger.warn("\u672A\u627E\u5230 HTML \u6587\u4EF6\uFF0C\u8FD0\u884C\u65F6\u6E05\u5355\u6CE8\u5165\u8DF3\u8FC7");return}for(const i of u)try{const r=await F.promises.readFile(i,"utf-8"),o=T(r,e,this.options.runtimeGlobalName);o.injected?(await g(i,o.html),this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5DF2\u6CE8\u5165\u5230: ${c.relative(t,i)}`)):this.logger.warn(`\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u6CE8\u5165: ${c.relative(t,i)}`)}catch(r){this.logger.error(`\u6CE8\u5165\u8FD0\u884C\u65F6\u6E05\u5355\u5931\u8D25: ${i} - ${r instanceof Error?r.message:String(r)}`)}this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5168\u5C40\u53D8\u91CF: ${this.options.runtimeGlobalName}`)}async findHtmlFiles(t){const e=[];async function u(i){const r=await F.promises.readdir(i,{withFileTypes:!0});for(const o of r){const n=c.join(i,o.name);o.isDirectory()?await u(n):o.isFile()&&o.name.endsWith(".html")&&e.push(n)}}return await u(t),e}logStats(t,e){const u=Object.keys(this.assetMap).length;this.logger.success(`\u8D44\u6E90\u6E05\u5355\u5DF2\u751F\u6210: ${t} \u4E2A\u8D44\u6E90\u6587\u4EF6\uFF0C${u} \u6761\u6620\u5C04\u8BB0\u5F55`,`\u683C\u5F0F: ${this.options.outputFormat}\uFF0C\u8F93\u51FA: ${this.options.outputFile}\uFF0C\u8017\u65F6: ${e}ms`),this.groups&&this.groups.length>0&&this.logger.info(`\u5165\u53E3\u5206\u7EC4: ${this.groups.map(i=>`${i.entry}(${i.assets.js.length+i.assets.css.length+i.assets.other.length})`).join(", ")}`)}getAssetMap(){return{...this.assetMap}}getManifest(){return this.manifest}getGroups(){return this.groups}}const k=v(H);export{k as assetManifest};
1
+ import c from"node:path";import F from"node:fs";import{createPluginFactory as v,BasePlugin as C}from"../../factory/index.mjs";import{scanDirectory as P,writeFileContent as g}from"../../common/fs/index.mjs";import{normalizePath as h,isExtensionIncluded as y,isPathExcluded as A,isPreCompressed as w}from"../../common/path/index.mjs";import{injectBeforeTag as j}from"../../common/html/index.mjs";import{validateGlobalName as D}from"../../common/validation/index.mjs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"path";import"../../common/concurrency/index.mjs";import"../../shared/vite-plugin.CuXEJAWX.mjs";function b(s,t,e){const u=h(s);if(!y(t,{includeExtensions:e.includeExtensions,excludeExtensions:e.excludeExtensions})||A(s,e.excludePaths,{matchMode:"segment"}))return!1;const i=h(e.outputFile);return!(u===i||u.endsWith("/"+i)||u.endsWith("manifest.json")||u.endsWith("asset-manifest.json")||w(t))}async function B(s,t){return(await P(s,{filter:(e,u,i)=>{const o=h(c.relative(s,e));return b(o,u,t)}})).map(e=>({filePath:e.filePath,relativePath:h(c.relative(s,e.filePath)),size:e.size,ext:e.extension}))}function $(s,t,e){const u={},i=t.endsWith("/")?t:t+"/";for(const o of s){const r=x(o.relativePath),n=i+o.relativePath;u[r]!==void 0&&u[r]!==n?(u[o.relativePath]=n,e?.(`\u8D44\u6E90\u952E\u540D\u51B2\u7A81: "${r}" \u5DF2\u88AB ${u[r]} \u5360\u7528\uFF0C"${o.relativePath}" \u5C06\u4F7F\u7528\u5B8C\u6574\u8DEF\u5F84\u4F5C\u4E3A\u952E`)):u[r]=n}return u}function x(s){const t=/[-.]([0-9a-f]{6,20})(?=\.)/g;return s.replace(t,"")}function M(s,t,e,u,i){switch(t){case"vite":return E(s,u,i);case"webpack":return N(s,i);case"custom":return O(s,e);default:return E(s,u,i)}}function E(s,t,e){const u={version:"1.0",timestamp:new Date().toISOString(),publicPath:t,assets:s};return e&&e.length>0&&(u.groups=e),u}function N(s,t){return t&&t.length>0?{entries:t.map(e=>({name:e.entry,files:[...e.assets.js,...e.assets.css,...e.assets.other]})),assets:s}:{entries:[{name:"main",files:Object.values(s)}],assets:s}}function O(s,t){if(!t)throw new Error('outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u4E0D\u80FD\u4E3A\u7A7A');return t(s)}function S(s,t){const e=new Map,u=new Set,i=s.filter(_);for(const n of i){const a=f(n.relativePath);e.has(a)||e.set(a,{entry:a,assets:{js:[],css:[],other:[]}});const l=e.get(a),p=t[n.relativePath]||n.relativePath;m(l,p,n.ext),u.add(n.relativePath)}const o=s.filter(n=>!u.has(n.relativePath)&&!G(n));for(const n of o){const a=W(n,i),l=a?f(a.relativePath):"_shared";e.has(l)||e.set(l,{entry:l,assets:{js:[],css:[],other:[]}});const p=e.get(l),d=t[n.relativePath]||n.relativePath;m(p,d,n.ext),u.add(n.relativePath)}const r=s.filter(n=>!u.has(n.relativePath));if(r.length>0){e.has("_shared")||e.set("_shared",{entry:"_shared",assets:{js:[],css:[],other:[]}});const n=e.get("_shared");for(const a of r){const l=t[a.relativePath]||a.relativePath;m(n,l,a.ext)}}return Array.from(e.values())}function _(s){const{relativePath:t,ext:e}=s,u=t.split("/").pop()||"";return!!(e===".html"||(e===".js"||e===".mjs")&&(u.startsWith("entry-")||u.startsWith("main")||!t.includes("/")))}function G(s){return[".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".woff",".woff2",".ttf",".eot",".map"].includes(s.ext)}function f(s){let t=(s.split("/").pop()||"").replace(/\.[^.]+$/,"");return t.startsWith("entry-")&&(t=t.slice(6)),t.replace(/[-.][0-9a-f]{6,20}$/,"")||t}function W(s,t){const e=s.relativePath.split("/").slice(0,-1).join("/"),u=(s.relativePath.split("/").pop()||"").replace(/\.[^.]+$/,"").replace(/[-.][0-9a-f]{6,20}$/,"");let i=null,o=0;for(const r of t){const n=r.relativePath.split("/").slice(0,-1).join("/"),a=f(r.relativePath);if(e===n)return r;u.startsWith(a)&&a.length>o&&(i=r,o=a.length)}return i}function m(s,t,e){e===".js"||e===".mjs"?s.assets.js.push(t):e===".css"?s.assets.css.push(t):s.assets.other.push(t)}function R(s,t){const e=JSON.stringify(s).replace(/<\/script>/gi,"<\\/script>");return`<script>Object.defineProperty(window,"${t}",{value:Object.freeze(${e}),writable:false,configurable:false})<\/script>`}function T(s,t,e){const u=R(t,e);return j(s,"</head>",u)}async function k(s){const t=[];async function e(u){const i=await F.promises.readdir(u,{withFileTypes:!0});for(const o of i){const r=c.join(u,o.name);o.isDirectory()?await e(r):o.isFile()&&o.name.endsWith(".html")&&t.push(r)}}return await e(s),t}class z extends C{manifest=null;assetMap={};groups=null;getDefaultOptions(){return{outputFormat:"vite",outputFile:"manifest.json",includeExtensions:[],publicPath:"/",injectRuntime:!1,runtimeGlobalName:"__ASSET_MANIFEST__",customFormatter:null,groupByEntry:!1,excludeExtensions:[".map",".gz",".br"],excludePaths:[]}}validateOptions(){this.validator.field("outputFormat").enum(["vite","webpack","custom"]).field("outputFile").custom(t=>typeof t=="string"&&t.length>0,"outputFile \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("publicPath").custom(t=>typeof t=="string"&&t.length>0,"publicPath \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("injectRuntime").boolean().field("runtimeGlobalName").custom(t=>typeof t=="string"&&t.length>0,"runtimeGlobalName \u5FC5\u987B\u4E3A\u975E\u7A7A\u5B57\u7B26\u4E32").field("groupByEntry").boolean().field("customFormatter").custom(t=>this.options.outputFormat!=="custom"||typeof t=="function",'outputFormat \u4E3A "custom" \u65F6\uFF0CcustomFormatter \u5FC5\u987B\u4E3A\u51FD\u6570').validate(),D(this.options.runtimeGlobalName,"runtimeGlobalName")}getPluginName(){return"asset-manifest"}getEnforce(){return"post"}addPluginHooks(t){t.writeBundle={order:"post",handler:async()=>{await this.safeExecute(()=>this.generateManifest(),"\u751F\u6210\u8D44\u6E90\u6E05\u5355")}}}async generateManifest(){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 u=await B(t,this.options);if(u.length===0){this.logger.info("\u672A\u627E\u5230\u9700\u8981\u8BB0\u5F55\u7684\u8D44\u6E90\u6587\u4EF6");return}this.assetMap=$(u,this.options.publicPath,n=>{this.logger.warn(n)}),this.options.groupByEntry&&(this.groups=S(u,this.assetMap));const i=M(this.assetMap,this.options.outputFormat,this.options.customFormatter,this.options.publicPath,this.groups??void 0),o=c.isAbsolute(this.options.outputFile)?this.options.outputFile:c.join(t,this.options.outputFile);await g(o,JSON.stringify(i,null,2)),this.options.outputFormat==="vite"&&(this.manifest=i),this.options.injectRuntime&&await this.injectRuntimeToHtmlFiles(t);const r=Date.now()-e;this.logStats(u.length,r)}async injectRuntimeToHtmlFiles(t){if(!this.manifest&&Object.keys(this.assetMap).length===0){this.logger.warn("\u8D44\u6E90\u6E05\u5355\u5C1A\u672A\u751F\u6210\uFF0C\u8DF3\u8FC7\u8FD0\u884C\u65F6\u6CE8\u5165");return}const e=this.manifest?.assets||this.assetMap,u=await k(t);if(u.length===0){this.logger.warn("\u672A\u627E\u5230 HTML \u6587\u4EF6\uFF0C\u8FD0\u884C\u65F6\u6E05\u5355\u6CE8\u5165\u8DF3\u8FC7");return}for(const i of u)try{const o=await F.promises.readFile(i,"utf-8"),r=T(o,e,this.options.runtimeGlobalName);r.injected?(await g(i,r.html),this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5DF2\u6CE8\u5165\u5230: ${c.relative(t,i)}`)):this.logger.warn(`\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u6CE8\u5165: ${c.relative(t,i)}`)}catch(o){this.logger.error(`\u6CE8\u5165\u8FD0\u884C\u65F6\u6E05\u5355\u5931\u8D25: ${i} - ${o instanceof Error?o.message:String(o)}`)}this.logger.info(`\u8FD0\u884C\u65F6\u6E05\u5355\u5168\u5C40\u53D8\u91CF: ${this.options.runtimeGlobalName}`)}logStats(t,e){const u=Object.keys(this.assetMap).length;this.logger.success(`\u8D44\u6E90\u6E05\u5355\u5DF2\u751F\u6210: ${t} \u4E2A\u8D44\u6E90\u6587\u4EF6\uFF0C${u} \u6761\u6620\u5C04\u8BB0\u5F55`,`\u683C\u5F0F: ${this.options.outputFormat}\uFF0C\u8F93\u51FA: ${this.options.outputFile}\uFF0C\u8017\u65F6: ${e}ms`),this.groups&&this.groups.length>0&&this.logger.info(`\u5165\u53E3\u5206\u7EC4: ${this.groups.map(i=>`${i.entry}(${i.assets.js.length+i.assets.css.length+i.assets.other.length})`).join(", ")}`)}getAssetMap(){return{...this.assetMap}}getManifest(){return this.manifest}getGroups(){return this.groups}}const H=v(z);export{H as assetManifest};
@@ -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"),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 i=o$1(e,t);if(!i.valid)return{key:s,status:i.status,message:t.message||i.message,value:e,rule:t};const n=l(e,t);if(!n.valid)return{key:s,status:n.status,message:t.message||n.message,value:e,rule:t};const m=d(e,t);if(!m.valid)return{key:s,status:m.status,message:t.message||m.message,value:e,rule:t};if(t.pattern&&!t.pattern.test(e))return{key:s,status:"custom_error",message:t.message||`\u73AF\u5883\u53D8\u91CF ${s} \u4E0D\u5339\u914D\u6B63\u5219: ${t.pattern.source}`,value:e,rule:t};if(t.validator){const a=t.validator(e);if(a!==!0){const h=typeof a=="string"?a:"";return{key:s,status:"custom_error",message:t.message||h||`\u73AF\u5883\u53D8\u91CF ${s} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:e,rule:t}}}return{key:s,status:"pass",message:"",value:e,rule:t}}function validateEnvironment(s,e){const r=[];for(const[t,i]of Object.entries(e)){const n=s[t];r.push(validateValue(t,n,i))}return r}function generateTemplate(s){const e=new Map,r=[];for(const[i,n]of Object.entries(s)){const m={type:"string",required:!0,...n};if(m.group){const a=e.get(m.group)||[];a.push({key:i,rule:m}),e.set(m.group,a)}else r.push({key:i,rule:m})}const t=[];t.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),t.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),t.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),t.push(""),r.length>0&&o(t,"\u901A\u7528\u914D\u7F6E",r);for(const[i,n]of e)o(t,i,n);return t.join(`
2
- `)}function o(s,e,r){s.push("# =============================="),s.push(`# ${e}`),s.push("# =============================="),s.push("");for(const{key:t,rule:i}of r){i.description&&s.push(`# ${i.description}`);const n=[];n.push(`\u7C7B\u578B: ${i.type||"string"}`),n.push(i.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),i.enumValues&&i.enumValues.length>0&&n.push(`\u679A\u4E3E\u503C: ${i.enumValues.join(" | ")}`),i.minValue!==void 0&&n.push(`\u6700\u5C0F\u503C: ${i.minValue}`),i.maxValue!==void 0&&n.push(`\u6700\u5927\u503C: ${i.maxValue}`),i.minLength!==void 0&&n.push(`\u6700\u5C0F\u957F\u5EA6: ${i.minLength}`),i.maxLength!==void 0&&n.push(`\u6700\u5927\u957F\u5EA6: ${i.maxLength}`),i.sensitive&&n.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),s.push(`# [${n.join(" | ")}]`),i.default!==void 0?s.push(`${t}=${i.sensitive?"********":i.default}`):s.push(`${t}=`),s.push("")}}function generateRuntimeGuard(s,e,r,t){const i=[];for(const[c,p]of Object.entries(s))p.required!==!1&&i.push({key:c,rule:{type:"string",required:!0,...p}});if(i.length===0)return"";const n=t.filter(c=>c.status!=="pass"),m=i.map(({key:c,rule:p})=>({key:c,type:p.type||"string",description:p.description||""})),a=JSON.stringify(m,null,2),h=n.map(c=>c.key),v=JSON.stringify(h),F=f(r);return`<script>
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""}}class R extends factory_index.BasePlugin{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(e=>e===!1||typeof e=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(e){this.options.validateBeforeBuild&&(e.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(e.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=validateEnvironment(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const e=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const t=l__default.resolve(e,r);if(u__default.existsSync(t))try{this.parseAndLoadEnvFile(t)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${t}`)}}}parseAndLoadEnvFile(e){const r=u__default.readFileSync(e,"utf-8").split(`
66
- `);for(const t of r){const i=t.trim();if(!i||i.startsWith("#"))continue;const n=i.indexOf("=");if(n===-1)continue;const m=i.slice(0,n).trim();let a=i.slice(n+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),m.startsWith("VITE_")&&process.env[m]===void 0&&(process.env[m]=a)}}buildResult(){const e=this.validationResults.length,r=this.validationResults.filter(n=>n.status==="pass").length,t=this.validationResults.filter(n=>n.status==="missing").length,i=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing").length;return{timestamp:common_format_index.formatDate(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:e,passed:r,missing:t,invalid:i,results:this.validationResults,allPassed:t===0&&i===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const e=this.validationResults.filter(n=>n.status==="missing").map(n=>n.key),r=this.validationResults.filter(n=>n.status!=="pass"&&n.status!=="missing"),t=[];e.length>0&&t.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${e.join(", ")}`);for(const n of r)t.push(`${n.key}: ${n.message}`);const i=t.join(`
67
- `);switch(this.options.failAction){case"error":throw new Error(i);case"warn":this.logger.warn(i);break}}writeEnvTemplate(){const e=this.viteConfig?.root||process.cwd(),r=l__default.resolve(e,this.options.templateOutput),t=generateTemplate(this.options.required);this.safeExecuteSync(()=>{common_fs_index.writeFileContent(r,t),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const e=this.viteConfig?.build?.outDir||"dist",r=l__default.resolve(e,this.options.reportOutput);this.safeExecuteSync(()=>{const t=JSON.stringify(this.guardResult,(i,n)=>n instanceof RegExp?n.toString():typeof n=="function"?"[Function]":n,2);common_fs_index.writeFileContent(r,t),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:e,passed:r,missing:t,invalid:i,allPassed:n}=this.guardResult;if(n){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${e} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${e} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${t} | \u5931\u8D25 ${i}`);const m=this.validationResults.filter(a=>a.status!=="pass");for(const a of m){const h=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${h}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(e){const r=generateRuntimeGuard(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return e;const t=common_html_index.injectBeforeTag(e,"</head>",r);return t.injected?t.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),e)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const envGuard=factory_index.createPluginFactory(R);exports.envGuard=envGuard;
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 A}from"../../common/format/index.mjs";import{injectBeforeTag as E}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 s=D(u,e);if(!s.valid)return{key:t,status:s.status,message:e.message||s.message,value:u,rule:e};const i=y(u,e);if(!i.valid)return{key:t,status:i.status,message:e.message||i.message,value:u,rule:e};const n=$(u,e);if(!n.valid)return{key:t,status:n.status,message:e.message||n.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 a=e.validator(u);if(a!==!0){const l=typeof a=="string"?a:"";return{key:t,status:"custom_error",message:e.message||l||`\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,s]of Object.entries(u)){const i=t[e];r.push(R(e,i,s))}return r}function _(t){const u=new Map,r=[];for(const[s,i]of Object.entries(t)){const n={type:"string",required:!0,...i};if(n.group){const a=u.get(n.group)||[];a.push({key:s,rule:n}),u.set(n.group,a)}else r.push({key:s,rule:n})}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&&h(e,"\u901A\u7528\u914D\u7F6E",r);for(const[s,i]of u)h(e,s,i);return e.join(`
2
- `)}function h(t,u,r){t.push("# =============================="),t.push(`# ${u}`),t.push("# =============================="),t.push("");for(const{key:e,rule:s}of r){s.description&&t.push(`# ${s.description}`);const i=[];i.push(`\u7C7B\u578B: ${s.type||"string"}`),i.push(s.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),s.enumValues&&s.enumValues.length>0&&i.push(`\u679A\u4E3E\u503C: ${s.enumValues.join(" | ")}`),s.minValue!==void 0&&i.push(`\u6700\u5C0F\u503C: ${s.minValue}`),s.maxValue!==void 0&&i.push(`\u6700\u5927\u503C: ${s.maxValue}`),s.minLength!==void 0&&i.push(`\u6700\u5C0F\u957F\u5EA6: ${s.minLength}`),s.maxLength!==void 0&&i.push(`\u6700\u5927\u957F\u5EA6: ${s.maxLength}`),s.sensitive&&i.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),t.push(`# [${i.join(" | ")}]`),s.default!==void 0?t.push(`${e}=${s.sensitive?"********":s.default}`):t.push(`${e}=`),t.push("")}}function k(t,u,r,e){const s=[];for(const[o,d]of Object.entries(t))d.required!==!1&&s.push({key:o,rule:{type:"string",required:!0,...d}});if(s.length===0)return"";const i=e.filter(o=>o.status!=="pass"),n=s.map(({key:o,rule:d})=>({key:o,type:d.type||"string",description:d.description||""})),a=JSON.stringify(n,null,2),l=i.map(o=>o.key),f=JSON.stringify(l),c=B(r);return`<script>
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 = ${a};
8
- var FAILED_KEYS = ${f};
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 B(t){switch(t){case"console":return`
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""}}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").split(`
66
- `);for(const e of r){const s=e.trim();if(!s||s.startsWith("#"))continue;const i=s.indexOf("=");if(i===-1)continue;const n=s.slice(0,i).trim();let a=s.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n.startsWith("VITE_")&&process.env[n]===void 0&&(process.env[n]=a)}}buildResult(){const u=this.validationResults.length,r=this.validationResults.filter(i=>i.status==="pass").length,e=this.validationResults.filter(i=>i.status==="missing").length,s=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing").length;return{timestamp:A(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:u,passed:r,missing:e,invalid:s,results:this.validationResults,allPassed:e===0&&s===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const u=this.validationResults.filter(i=>i.status==="missing").map(i=>i.key),r=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing"),e=[];u.length>0&&e.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${u.join(", ")}`);for(const i of r)e.push(`${i.key}: ${i.message}`);const s=e.join(`
67
- `);switch(this.options.failAction){case"error":throw new Error(s);case"warn":this.logger.warn(s);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,(s,i)=>i instanceof RegExp?i.toString():typeof i=="function"?"[Function]":i,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:s,allPassed:i}=this.guardResult;if(i){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 ${s}`);const n=this.validationResults.filter(a=>a.status!=="pass");for(const a of n){const l=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${l}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(u){const r=k(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return u;const e=E(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 x=v(b);export{x as envGuard};
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,5 +1,55 @@
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(c,e=/[/-]/){return c.replace(/^\/+/,"").split(e).filter(Boolean).map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function toPascalCase(c,e=/[/-]/){return c.replace(/^\/+/,"").split(e).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function stripJsonComments(c){return c.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function s(c,e){return typeof e=="string"?"string":typeof e=="boolean"?e?"true":"false":typeof e=="number"?"number":"unknown"}function u(c){const e=Object.entries(c);return e.length===0?"{}":`{ ${e.map(([t,r])=>`${t}: ${s(t,r)}`).join("; ")} }`}function generateRouterDtsContent(c,e="@meng-xi/uni-router"){const t=[];t.push(`import '${e}'`),t.push(""),t.push(`declare module '${e}' {`),t.push(" interface RouteNameMap {");for(const r of c){const a=r.name||r.path;r.meta?.title&&t.push(` /** ${r.meta.title} */`);const n=r.meta?u(r.meta):"{}";t.push(` ${a}: { path: '${r.path}'; meta: ${n} }`)}return t.push(" }"),t.push("}"),t.join(`
2
- `)}class y 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,t){const r={},a=e.style||{},n=this.options.metaMapping||{};for(const[i,p]of Object.entries(n))a[i]!==void 0&&(r[p]=a[i]);return this.tabBarPages.has(t)&&(r.isTab=!0),r}parsePageToRoute(e,t=""){const r=t?`/${t}/${e.path}`:`/${e.path}`,a=this.generateRouteName(r),n=this.extractMeta(e,r.replace(/^\//,"")),i={path:r,name:a};return Object.keys(n).length>0&&(i.meta=n),i}parsePagesJson(e){const t=[];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"),t;if(this.tabBarPages.clear(),e.tabBar?.list)for(const r of e.tabBar.list)this.tabBarPages.add(r.pagePath);for(const r of e.pages)t.push(this.parsePageToRoute(r));if(this.options.includeSubPackages&&e.subPackages){for(const r of e.subPackages)if(r.pages&&Array.isArray(r.pages))for(const a of r.pages)t.push(this.parsePageToRoute(a,r.root))}return t}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"),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 t=this.generateTypeDefinitions(),r=this.options.outputFormat==="ts",a=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
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${r?": RouteConfig[]":""} = ${a}
88
+ export const routes${a} = [
89
+ ${g}
90
+ ]
34
91
 
35
92
  export default routes
36
- `}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 t=await s$1.promises.readFile(e,"utf-8"),r=stripJsonComments(t);return JSON.parse(r)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,r=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!r)return t;try{let a=r[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const n=JSON.parse(a);for(const i of n)i.path&&t.set(i.path,i)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return t}mergeRoutes(e,t){return e.map(r=>{const a=t.get(r.path);if(!a)return r;const n={};return r.meta&&Object.assign(n,r.meta),a.meta&&Object.assign(n,a.meta),{...a,path:r.path,meta:Object.keys(n).length>0?n:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const r=o.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s$1.existsSync(r))try{const n=await s$1.promises.readFile(r,"utf-8"),i=this.extractExistingRoutes(n);i.size>0&&(t=this.mergeRoutes(t,i),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const a=this.generateFileContent(t);await common_fs_index.writeFileContent(r,a),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${r}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(t)}async generateDtsFile(e){if(!this.options.dts)return;const t=o.resolve(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),r=generateRouterDtsContent(e);common_fs_index.shouldUpdateFileContent(t,r)&&(await common_fs_index.writeFileContent(t,r),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`))}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 t=>{t==="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 t=>{this.projectRoot=t.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),t.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(y);exports.generateRouter=generateRouter;
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 };
@@ -3,6 +3,30 @@ import 'vite';
3
3
  import '../../shared/vite-plugin.B8FuZce1.js';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
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 };
@@ -1,5 +1,55 @@
1
- import{createPluginFactory as l,BasePlugin as F}from"../../factory/index.mjs";import{writeFileContent as p,shouldUpdateFileContent as m}from"../../common/fs/index.mjs";import{resolve as n}from"path";import{existsSync as i,promises as c,watch as f}from"fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../common/concurrency/index.mjs";function g(r,t=/[/-]/){return r.replace(/^\/+/,"").split(t).filter(Boolean).map((e,u)=>u===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function E(r,t=/[/-]/){return r.replace(/^\/+/,"").split(t).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function D(r){return r.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function C(r,t){return typeof t=="string"?"string":typeof t=="boolean"?t?"true":"false":typeof t=="number"?"number":"unknown"}function d(r){const t=Object.entries(r);return t.length===0?"{}":`{ ${t.map(([e,u])=>`${e}: ${C(e,u)}`).join("; ")} }`}function y(r,t="@meng-xi/uni-router"){const e=[];e.push(`import '${t}'`),e.push(""),e.push(`declare module '${t}' {`),e.push(" interface RouteNameMap {");for(const u of r){const s=u.name||u.path;u.meta?.title&&e.push(` /** ${u.meta.title} */`);const a=u.meta?d(u.meta):"{}";e.push(` ${s}: { path: '${u.path}'; meta: ${a} }`)}return e.push(" }"),e.push("}"),e.join(`
2
- `)}class w extends F{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(t){switch(this.options.nameStrategy){case"path":return t.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return g(t);case"pascalCase":return E(t);case"custom":return this.options.customNameGenerator(t);default:return g(t)}}extractMeta(t,e){const u={},s=t.style||{},a=this.options.metaMapping||{};for(const[o,h]of Object.entries(a))s[o]!==void 0&&(u[h]=s[o]);return this.tabBarPages.has(e)&&(u.isTab=!0),u}parsePageToRoute(t,e=""){const u=e?`/${e}/${t.path}`:`/${t.path}`,s=this.generateRouteName(u),a=this.extractMeta(t,u.replace(/^\//,"")),o={path:u,name:s};return Object.keys(a).length>0&&(o.meta=a),o}parsePagesJson(t){const e=[];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"),e;if(this.tabBarPages.clear(),t.tabBar?.list)for(const u of t.tabBar.list)this.tabBarPages.add(u.pagePath);for(const u of t.pages)e.push(this.parsePageToRoute(u));if(this.options.includeSubPackages&&t.subPackages){for(const u of t.subPackages)if(u.pages&&Array.isArray(u.pages))for(const s of u.pages)e.push(this.parsePageToRoute(s,u.root))}return e}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
1
+ import{createPluginFactory as b,BasePlugin as A}from"../../factory/index.mjs";import{writeFileContent as d,shouldUpdateFileContent as y}from"../../common/fs/index.mjs";import{resolve as h}from"path";import{existsSync as f,promises as E,watch as B}from"fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../common/concurrency/index.mjs";function D(t,e=/[/-]/){return t.replace(/^\/+/,"").split(e).filter(Boolean).map((u,o)=>o===0?u.toLowerCase():u.charAt(0).toUpperCase()+u.slice(1).toLowerCase()).join("")}function $(t,e=/[/-]/){return t.replace(/^\/+/,"").split(e).filter(Boolean).map(u=>u.charAt(0).toUpperCase()+u.slice(1).toLowerCase()).join("")}function x(t){return t.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function w(t,e){return typeof e=="string"?"string":typeof e=="boolean"?e?"true":"false":typeof e=="number"?"number":"unknown"}function j(t){const e=Object.entries(t);return e.length===0?"{}":`{ ${e.map(([u,o])=>`${u}: ${w(u,o)}`).join("; ")} }`}function R(t,e="@meng-xi/uni-router"){const u=[];u.push(`import '${e}'`),u.push(""),u.push(`declare module '${e}' {`),u.push(" interface RouteNameMap {");for(const o of t){const n=o.name||o.path;o.meta?.title&&u.push(` /** ${o.meta.title} */`);const r=o.meta?j(o.meta):"{}";u.push(` ${n}: { path: '${o.path}'; meta: ${r} }`)}return u.push(" }"),u.push("}"),u.join(`
2
+ `)}function P(t){return JSON.stringify(t,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'")}function F(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=>F(e)).join(", ")+"]":typeof t=="object"?`{ ${Object.entries(t).map(([e,u])=>`${e}: ${F(u)}`).join(", ")} }`:String(t)}function O(t){const e=[];let u=0,o=-1,n=!1,r="";for(let s=0;s<t.length;s++){const c=t[s];if(n){c===r&&t[s-1]!=="\\"&&(n=!1);continue}if(c==="/"&&s+1<t.length&&t[s+1]==="/"){const p=t.indexOf(`
3
+ `,s);s=p===-1?t.length-1:p-1;continue}if(c==="/"&&s+1<t.length&&t[s+1]==="*"){const p=t.indexOf("*/",s+2);s=p===-1?t.length-1:p+1;continue}if(c==='"'||c==="'"||c==="`"){n=!0,r=c;continue}c==="{"?(u===0&&(o=s),u++):c==="}"&&(u--,u===0&&o>=0&&(e.push(t.substring(o,s+1)),o=-1))}return e}function m(t,e,u){const o=new RegExp(`(\\b${e}\\s*:\\s*)`),n=t.match(o);if(!n||n.index===void 0){const i=t.lastIndexOf("}"),a=t.substring(0,i),g=a.lastIndexOf(`
4
+ `),C=`
5
+ ${g>=0?a.substring(g+1).match(/^(\s*)/)?.[1]??" ":" "}${e}: ${u},`;return t.substring(0,i)+C+`
6
+ `+t.substring(i)}const r=n.index+n[0].length;let s=0,c=!1,p="",l=r;for(let i=r;i<t.length;i++){const a=t[i];if(c){a===p&&t[i-1]!=="\\"&&(c=!1);continue}if(a==="/"&&i+1<t.length&&t[i+1]==="/"){const g=t.indexOf(`
7
+ `,i);i=g===-1?t.length-1:g-1;continue}if(a==="/"&&i+1<t.length&&t[i+1]==="*"){const g=t.indexOf("*/",i+2);i=g===-1?t.length-1:g+1;continue}if(a==='"'||a==="'"||a==="`"){c=!0,p=a;continue}if(a==="{"||a==="["||a==="(")s++;else if(a==="}"||a==="]"||a===")")if(s>0)s--;else{l=i;break}else if(s===0&&a===","){l=i;break}}return t.substring(0,n.index)+`${e}: ${u}`+t.substring(l)}function v(t,e){const u=new RegExp(`,?\\s*\\b${e}\\s*:\\s*`),o=t.match(u);if(!o||o.index===void 0)return t;const n=o.index,r=n+o[0].length;let s=0,c=!1,p="",l=r;for(let i=r;i<t.length;i++){const a=t[i];if(c){a===p&&t[i-1]!=="\\"&&(c=!1);continue}if(a==="/"&&i+1<t.length&&t[i+1]==="/"){const g=t.indexOf(`
8
+ `,i);i=g===-1?t.length-1:g-1;continue}if(a==="/"&&i+1<t.length&&t[i+1]==="*"){const g=t.indexOf("*/",i+2);i=g===-1?t.length-1:g+1;continue}if(a==='"'||a==="'"||a==="`"){c=!0,p=a;continue}if(a==="{"||a==="["||a==="("){s++;continue}if(a==="}"||a==="]"||a===")"){if(s>0){s--;continue}l=i;break}if(s===0&&a===","){l=i;break}}if(o[0].startsWith(","))return t.substring(0,n)+t.substring(l);{let i=l;return t[i]===","&&i++,t.substring(0,n)+t.substring(i)}}function k(t){const e=new Map,u=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!u)return e;const o=O(u[1]);for(const n of o){const r=n.match(/path:\s*['"]([^'"]*)['"]/);r&&e.set(r[1],n.trim())}return e}function S(t){const e=new Map,u=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!u)return e;try{let o=u[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const n=JSON.parse(o);for(const r of n)r.path&&e.set(r.path,r)}catch{}return e}class T extends A{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 D(e);case"pascalCase":return $(e);case"custom":return this.options.customNameGenerator(e);default:return D(e)}}extractMeta(e,u){const o={},n=e.style||{},r=this.options.metaMapping||{};for(const[s,c]of Object.entries(r))n[s]!==void 0&&(o[c]=n[s]);return this.tabBarPages.has(u)&&(o.isTab=!0),o}parsePageToRoute(e,u=""){const o=u?`/${u}/${e.path}`:`/${e.path}`,n=this.generateRouteName(o),r=this.extractMeta(e,o.replace(/^\//,"")),s={path:o,name:n};return Object.keys(r).length>0&&(s.meta=r),s}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 o of e.tabBar.list)this.tabBarPages.add(o.pagePath);for(const o of e.pages)u.push(this.parsePageToRoute(o));if(this.options.includeSubPackages&&e.subPackages){for(const o of e.subPackages)if(o.pages&&Array.isArray(o.pages))for(const n of o.pages)u.push(this.parsePageToRoute(n,o.root))}return u}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(t){const e=this.generateTypeDefinitions(),u=this.options.outputFormat==="ts",s=JSON.stringify(t,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${e}
80
+ `}generateFileContent(e,u){const o=this.generateTypeDefinitions(),n=this.options.outputFormat==="ts"?": RouteConfig[]":"",r=e.map(s=>{const c=u?.get(s.path);if(c){let p=c;if(p=m(p,"path",`'${s.path}'`),s.name!==void 0&&(p=m(p,"name",`'${s.name}'`)),s.meta&&Object.keys(s.meta).length>0){const l=F(s.meta);p=m(p,"meta",l)}else s.meta&&Object.keys(s.meta).length===0&&(p=v(p,"meta"));return p}return P(s)}).map(s=>" "+s.split(`
81
+ `).join(`
82
+ `)).join(`,
83
+ `);return`${o}
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${u?": RouteConfig[]":""} = ${s}
88
+ export const routes${n} = [
89
+ ${r}
90
+ ]
34
91
 
35
92
  export default routes
36
- `}async readPagesJson(){const t=n(this.projectRoot,this.options.pagesJsonPath);if(!i(t))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`),null;try{const e=await c.readFile(t,"utf-8"),u=D(e);return JSON.parse(u)}catch(e){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${e.message}`),null}}extractExistingRoutes(t){const e=new Map,u=t.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!u)return e;try{let s=u[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const a=JSON.parse(s);for(const o of a)o.path&&e.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 e}mergeRoutes(t,e){return t.map(u=>{const s=e.get(u.path);if(!s)return u;const a={};return u.meta&&Object.assign(a,u.meta),s.meta&&Object.assign(a,s.meta),{...s,path:u.path,meta:Object.keys(a).length>0?a:void 0}})}async generateRouterConfig(){const t=await this.readPagesJson();if(!t)return;let e=this.parsePagesJson(t);const u=n(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&i(u))try{const a=await c.readFile(u,"utf-8"),o=this.extractExistingRoutes(a);o.size>0&&(e=this.mergeRoutes(e,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const s=this.generateFileContent(e);await p(u,s),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${u}`),this.logger.info(`\u5171\u751F\u6210 ${e.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(e)}async generateDtsFile(t){if(!this.options.dts)return;const e=n(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),u=y(t);m(e,u)&&(await p(e,u),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`))}startWatching(){if(!this.options.watch)return;const t=n(this.projectRoot,this.options.pagesJsonPath);i(t)&&(this.watcher=f(t,async e=>{e==="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: ${t}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(t){t.configResolved=async e=>{this.projectRoot=e.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),e.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const B=l(w);export{B as generateRouter};
93
+ `}async readPagesJson(){const e=h(this.projectRoot,this.options.pagesJsonPath);if(!f(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const u=await E.readFile(e,"utf-8"),o=x(u);return JSON.parse(o)}catch(u){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${u.message}`),null}}mergeRoutes(e,u){return e.map(o=>{const n=u.get(o.path);if(!n)return o;const r={};return o.meta&&Object.assign(r,o.meta),n.meta&&Object.assign(r,n.meta),{...n,path:o.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),o;const n=h(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&f(n))try{const s=await E.readFile(n,"utf-8"),c=S(s);o=k(s),c.size>0&&(u=this.mergeRoutes(u,c),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const r=this.generateFileContent(u,o);await d(n,r),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${n}`),this.logger.info(`\u5171\u751F\u6210 ${u.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(u)}async generateDtsFile(e){if(!this.options.dts)return;const u=h(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),o=R(e);y(u,o)&&(await d(u,o),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${u}`))}startWatching(){if(!this.options.watch)return;const e=h(this.projectRoot,this.options.pagesJsonPath);f(e)&&(this.watcher=B(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 J=b(T);export{J as generateRouter};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),crypto=require("crypto"),common_format_index=require("../../common/format/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),o=require("path");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("../../common/concurrency/index.cjs");function generateRandomHash(n=8){const e=Math.max(1,Math.min(64,n));return crypto.randomBytes(Math.ceil(e/2)).toString("hex").slice(0,e)}function parseTemplate(n,e){let t=n;for(const[i,s]of Object.entries(e))t=t.replace(new RegExp(`\\{${i}\\}`,"g"),s);return t}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=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||"",r=this.options.suffix||"";return`${s}${i}${r}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[i,s,r]=this.options.semverBase.split(".");t.major=i||"1",t.minor=s||"0",t.patch=r||"0"}return 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=o.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"),crypto=require("crypto"),common_format_index=require("../../common/format/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),o=require("path");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("fs"),require("../../common/concurrency/index.cjs");function generateRandomHash(i=8){const s=Math.max(1,Math.min(64,i));return crypto.randomBytes(Math.ceil(s/2)).toString("hex").slice(0,s)}function parseTemplate(i,s){let e=i;for(const[n,a]of Object.entries(s))e=e.replace(new RegExp(`\\{${n}\\}`,"g"),a);return e}function generateVersionString(i){const{format:s,buildTime:e,hashLength:n,semverBase:a,customFormat:u,prefix:m,suffix:c}=i,t=common_format_index.getDateFormatParams(e),h=generateRandomHash(n);let r;switch(s){case"timestamp":r=`${t.YYYY}${t.MM}${t.DD}${t.HH}${t.mm}${t.ss}`;break;case"date":r=`${t.YYYY}.${t.MM}.${t.DD}`;break;case"datetime":r=`${t.YYYY}.${t.MM}.${t.DD}.${t.HH}${t.mm}${t.ss}`;break;case"semver":r=a||"1.0.0";break;case"hash":r=h;break;case"custom":r=parseCustomFormat(u||"",{...t,hash:h},a);break;default:r=t.timestamp}return`${m||""}${r}${c||""}`}function parseCustomFormat(i,s,e){const n={...s};if(e){const[a,u,m]=e.split(".");n.major=a||"1",n.minor=u||"0",n.patch=m||"0"}return parseTemplate(i,n)}function generateVersionInfoObject(i){return{version:i.version,buildTime:i.buildTime.toISOString(),timestamp:i.buildTime.getTime(),format:i.format,...i.extra}}class p 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(){return generateVersionString({format:this.options.format,buildTime:this.buildTime,hashLength:this.options.hashLength||8,semverBase:this.options.semverBase,customFormat:this.options.customFormat,prefix:this.options.prefix,suffix:this.options.suffix})}generateVersionInfo(){return generateVersionInfoObject({version:this.version,buildTime:this.buildTime,format:this.options.format,extra:this.options.extra})}async writeVersionFile(s){const e=o.join(s,this.options.outputFile||"version.json"),n=this.generateVersionInfo();await common_fs_index.writeFileContent(e,JSON.stringify(n,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`)}addPluginHooks(s){s.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")&&(s.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")&&(s.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 generateVersion=factory_index.createPluginFactory(p);exports.generateVersion=generateVersion;
@@ -1 +1 @@
1
- import{createPluginFactory as r,BasePlugin as a}from"../../factory/index.mjs";import{randomBytes as u}from"crypto";import{getDateFormatParams 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"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"../../common/concurrency/index.mjs";function f(o=8){const t=Math.max(1,Math.min(64,o));return u(Math.ceil(t/2)).toString("hex").slice(0,t)}function l(o,t){let e=o;for(const[i,s]of Object.entries(t))e=e.replace(new RegExp(`\\{${i}\\}`,"g"),s);return e}class c extends a{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=m(this.buildTime),e=f(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||"",n=this.options.suffix||"";return`${s}${i}${n}`}parseCustomFormat(t){const e={...t};if(this.options.semverBase){const[i,s,n]=this.options.semverBase.split(".");e.major=i||"1",e.minor=s||"0",e.patch=n||"0"}return l(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 g=r(c);export{g as generateVersion};
1
+ import{createPluginFactory as f,BasePlugin as p}from"../../factory/index.mjs";import{randomBytes as l}from"crypto";import{getDateFormatParams as c}from"../../common/format/index.mjs";import{writeFileContent as g}from"../../common/fs/index.mjs";import{join as d}from"path";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"fs";import"../../common/concurrency/index.mjs";function F(i=8){const s=Math.max(1,Math.min(64,i));return l(Math.ceil(s/2)).toString("hex").slice(0,s)}function v(i,s){let e=i;for(const[o,n]of Object.entries(s))e=e.replace(new RegExp(`\\{${o}\\}`,"g"),n);return e}function b(i){const{format:s,buildTime:e,hashLength:o,semverBase:n,customFormat:a,prefix:u,suffix:h}=i,t=c(e),m=F(o);let r;switch(s){case"timestamp":r=`${t.YYYY}${t.MM}${t.DD}${t.HH}${t.mm}${t.ss}`;break;case"date":r=`${t.YYYY}.${t.MM}.${t.DD}`;break;case"datetime":r=`${t.YYYY}.${t.MM}.${t.DD}.${t.HH}${t.mm}${t.ss}`;break;case"semver":r=n||"1.0.0";break;case"hash":r=m;break;case"custom":r=$(a||"",{...t,hash:m},n);break;default:r=t.timestamp}return`${u||""}${r}${h||""}`}function $(i,s,e){const o={...s};if(e){const[n,a,u]=e.split(".");o.major=n||"1",o.minor=a||"0",o.patch=u||"0"}return v(i,o)}function T(i){return{version:i.version,buildTime:i.buildTime.toISOString(),timestamp:i.buildTime.getTime(),format:i.format,...i.extra}}class x extends p{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(){return b({format:this.options.format,buildTime:this.buildTime,hashLength:this.options.hashLength||8,semverBase:this.options.semverBase,customFormat:this.options.customFormat,prefix:this.options.prefix,suffix:this.options.suffix})}generateVersionInfo(){return T({version:this.version,buildTime:this.buildTime,format:this.options.format,extra:this.options.extra})}async writeVersionFile(s){const e=d(s,this.options.outputFile||"version.json"),o=this.generateVersionInfo();await g(e,JSON.stringify(o,null,2)),this.logger.success(`\u7248\u672C\u6587\u4EF6\u5DF2\u751F\u6210: ${e}`)}addPluginHooks(s){s.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")&&(s.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")&&(s.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 D=f(x);export{D as generateVersion};
@@ -6,7 +6,7 @@ export { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummar
6
6
  export { CopyFileOptions, copyFile } from './copyFile/index.cjs';
7
7
  export { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode, envGuard } from './envGuard/index.cjs';
8
8
  export { FaviconManagerOptions, Icon, faviconManager } from './faviconManager/index.cjs';
9
- export { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './generateRouter/index.cjs';
9
+ export { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './generateRouter/index.cjs';
10
10
  export { GenerateVersionOptions, OutputType, VersionFormat, VersionInfo, generateVersion } from './generateVersion/index.cjs';
11
11
  export { HtmlInjectOptions, InjectRule, InjectionLogEntry, htmlInject } from './htmlInject/index.cjs';
12
12
  export { ConvertMapping, FormatQualityOptions, ImageFormat, ImageOptimizeStats, ImageOptimizeSummary, ImageOptimizerOptions, SvgoOptions, SvgoPlugin, imageOptimizer } from './imageOptimizer/index.cjs';
@@ -6,7 +6,7 @@ export { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummar
6
6
  export { CopyFileOptions, copyFile } from './copyFile/index.mjs';
7
7
  export { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode, envGuard } from './envGuard/index.mjs';
8
8
  export { FaviconManagerOptions, Icon, faviconManager } from './faviconManager/index.mjs';
9
- export { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './generateRouter/index.mjs';
9
+ export { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './generateRouter/index.mjs';
10
10
  export { GenerateVersionOptions, OutputType, VersionFormat, VersionInfo, generateVersion } from './generateVersion/index.mjs';
11
11
  export { HtmlInjectOptions, InjectRule, InjectionLogEntry, htmlInject } from './htmlInject/index.mjs';
12
12
  export { ConvertMapping, FormatQualityOptions, ImageFormat, ImageOptimizeStats, ImageOptimizeSummary, ImageOptimizerOptions, SvgoOptions, SvgoPlugin, imageOptimizer } from './imageOptimizer/index.mjs';
@@ -6,7 +6,7 @@ export { CompressAlgorithm, CompressAssetsOptions, CompressStats, CompressSummar
6
6
  export { CopyFileOptions, copyFile } from './copyFile/index.js';
7
7
  export { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode, envGuard } from './envGuard/index.js';
8
8
  export { FaviconManagerOptions, Icon, faviconManager } from './faviconManager/index.js';
9
- export { GenerateRouterOptions, NameStrategy, OutputFormat, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './generateRouter/index.js';
9
+ export { GenerateRouterOptions, NameStrategy, NavigationAnimation, OutputFormat, RouteConfig, RouteMeta, UniAnimationType, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, generateRouter } from './generateRouter/index.js';
10
10
  export { GenerateVersionOptions, OutputType, VersionFormat, VersionInfo, generateVersion } from './generateVersion/index.js';
11
11
  export { HtmlInjectOptions, InjectRule, InjectionLogEntry, htmlInject } from './htmlInject/index.js';
12
12
  export { ConvertMapping, FormatQualityOptions, ImageFormat, ImageOptimizeStats, ImageOptimizeSummary, ImageOptimizerOptions, SvgoOptions, SvgoPlugin, imageOptimizer } from './imageOptimizer/index.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meng-xi/vite-plugin",
3
3
  "type": "module",
4
- "version": "0.1.8",
4
+ "version": "0.1.9",
5
5
  "private": false,
6
6
  "description": "一个为 Vite 提供实用插件的工具包,同时也是一个完整的插件开发框架",
7
7
  "keywords": [