@meng-xi/vite-plugin 0.0.6 → 0.0.7
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 +404 -343
- package/README.md +95 -35
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.d.cts +182 -2
- package/dist/plugins/index.d.mts +182 -2
- package/dist/plugins/index.d.ts +182 -2
- package/dist/plugins/index.mjs +1 -1
- package/dist/shared/vite-plugin.CIahO6bu.mjs +37 -0
- package/dist/shared/vite-plugin.DqgHJjxa.cjs +37 -0
- package/package.json +1 -1
- package/dist/shared/vite-plugin.B5wW4CiL.mjs +0 -36
- package/dist/shared/vite-plugin.CXlzkIgT.cjs +0 -36
package/dist/plugins/index.d.ts
CHANGED
|
@@ -3,6 +3,186 @@ import 'vite';
|
|
|
3
3
|
import '../shared/vite-plugin.CLr0ttuO.js';
|
|
4
4
|
import '../shared/vite-plugin.CiHfwMiN.js';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* 进度条显示格式类型
|
|
8
|
+
*
|
|
9
|
+
* @description
|
|
10
|
+
* - 'bar': 完整进度条模式,显示旋转动画 + 阶段标签 + 进度条 + 百分比 + 模块名
|
|
11
|
+
* - 'spinner': 旋转动画模式,显示旋转动画 + 阶段标签 + 百分比
|
|
12
|
+
* - 'minimal': 精简模式,仅显示阶段标签 + 百分比
|
|
13
|
+
*/
|
|
14
|
+
type ProgressFormat = 'bar' | 'spinner' | 'minimal';
|
|
15
|
+
/**
|
|
16
|
+
* 构建进度插件的配置选项接口
|
|
17
|
+
*
|
|
18
|
+
* @interface BuildProgressOptions
|
|
19
|
+
*/
|
|
20
|
+
interface BuildProgressOptions extends BasePluginOptions {
|
|
21
|
+
/**
|
|
22
|
+
* 进度条宽度(字符数)
|
|
23
|
+
*
|
|
24
|
+
* @default 30
|
|
25
|
+
*/
|
|
26
|
+
width?: number;
|
|
27
|
+
/**
|
|
28
|
+
* 进度条显示格式
|
|
29
|
+
*
|
|
30
|
+
* @default 'bar'
|
|
31
|
+
*/
|
|
32
|
+
format?: ProgressFormat;
|
|
33
|
+
/**
|
|
34
|
+
* 已完成部分的填充字符
|
|
35
|
+
*
|
|
36
|
+
* @default '█'
|
|
37
|
+
* @example '█'、'■'、'='
|
|
38
|
+
*/
|
|
39
|
+
completeChar?: string;
|
|
40
|
+
/**
|
|
41
|
+
* 未完成部分的填充字符
|
|
42
|
+
*
|
|
43
|
+
* @default '░'
|
|
44
|
+
* @example '░'、'□'、'-'
|
|
45
|
+
*/
|
|
46
|
+
incompleteChar?: string;
|
|
47
|
+
/**
|
|
48
|
+
* 构建完成后是否清除进度条
|
|
49
|
+
*
|
|
50
|
+
* @default true
|
|
51
|
+
* @description 设为 false 时,构建完成后保留 100% 进度条在终端中
|
|
52
|
+
*/
|
|
53
|
+
clearOnComplete?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* 是否显示当前正在处理的模块名称
|
|
56
|
+
*
|
|
57
|
+
* @default true
|
|
58
|
+
* @description 仅在 transform 阶段显示,模块名超长时自动截断
|
|
59
|
+
*/
|
|
60
|
+
showModuleName?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* 自定义颜色主题
|
|
63
|
+
*
|
|
64
|
+
* @remarks
|
|
65
|
+
* 每个属性是一个接受字符串并返回带 ANSI 颜色码字符串的函数。
|
|
66
|
+
* 未提供的属性将使用默认主题。
|
|
67
|
+
*/
|
|
68
|
+
theme?: ProgressTheme;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 进度条颜色主题接口
|
|
72
|
+
*
|
|
73
|
+
* @interface ProgressTheme
|
|
74
|
+
* @description 定义进度条各部分的颜色渲染函数,每个函数接受文本并返回带 ANSI 颜色码的字符串
|
|
75
|
+
*/
|
|
76
|
+
interface ProgressTheme {
|
|
77
|
+
/**
|
|
78
|
+
* 已完成部分的颜色渲染函数
|
|
79
|
+
*
|
|
80
|
+
* @param text - 需要着色的文本
|
|
81
|
+
* @returns 带 ANSI 颜色码的字符串
|
|
82
|
+
*/
|
|
83
|
+
completeColor: (text: string) => string;
|
|
84
|
+
/**
|
|
85
|
+
* 未完成部分的颜色渲染函数
|
|
86
|
+
*
|
|
87
|
+
* @param text - 需要着色的文本
|
|
88
|
+
* @returns 带 ANSI 颜色码的字符串
|
|
89
|
+
*/
|
|
90
|
+
incompleteColor: (text: string) => string;
|
|
91
|
+
/**
|
|
92
|
+
* 百分比数字的颜色渲染函数
|
|
93
|
+
*
|
|
94
|
+
* @param text - 需要着色的文本
|
|
95
|
+
* @returns 带 ANSI 颜色码的字符串
|
|
96
|
+
*/
|
|
97
|
+
percentageColor: (text: string) => string;
|
|
98
|
+
/**
|
|
99
|
+
* 阶段标签的颜色渲染函数
|
|
100
|
+
*
|
|
101
|
+
* @param text - 需要着色的文本
|
|
102
|
+
* @returns 带 ANSI 颜色码的字符串
|
|
103
|
+
*/
|
|
104
|
+
phaseColor: (text: string) => string;
|
|
105
|
+
/**
|
|
106
|
+
* 模块名称的颜色渲染函数
|
|
107
|
+
*
|
|
108
|
+
* @param text - 需要着色的文本
|
|
109
|
+
* @returns 带 ANSI 颜色码的字符串
|
|
110
|
+
*/
|
|
111
|
+
moduleColor: (text: string) => string;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 构建阶段类型
|
|
115
|
+
*
|
|
116
|
+
* @description
|
|
117
|
+
* - 'idle': 空闲状态,插件尚未开始工作
|
|
118
|
+
* - 'config': 读取配置阶段
|
|
119
|
+
* - 'resolve': 解析模块依赖阶段
|
|
120
|
+
* - 'transform': 转换模块阶段
|
|
121
|
+
* - 'bundle': 打包阶段(仅生产构建)
|
|
122
|
+
* - 'write': 写入文件阶段
|
|
123
|
+
* - 'done': 构建完成
|
|
124
|
+
*/
|
|
125
|
+
type BuildPhase = 'idle' | 'config' | 'resolve' | 'transform' | 'bundle' | 'write' | 'done';
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 构建进度条插件
|
|
129
|
+
*
|
|
130
|
+
* @param {BuildProgressOptions} options - 插件配置选项
|
|
131
|
+
* @returns {Plugin} 一个 Vite 插件实例
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* // 基本使用 - 默认进度条格式
|
|
136
|
+
* buildProgress()
|
|
137
|
+
*
|
|
138
|
+
* // 旋转动画格式
|
|
139
|
+
* buildProgress({
|
|
140
|
+
* format: 'spinner'
|
|
141
|
+
* })
|
|
142
|
+
*
|
|
143
|
+
* // 精简格式
|
|
144
|
+
* buildProgress({
|
|
145
|
+
* format: 'minimal'
|
|
146
|
+
* })
|
|
147
|
+
*
|
|
148
|
+
* // 自定义进度条外观
|
|
149
|
+
* buildProgress({
|
|
150
|
+
* width: 40,
|
|
151
|
+
* completeChar: '■',
|
|
152
|
+
* incompleteChar: '□',
|
|
153
|
+
* clearOnComplete: false
|
|
154
|
+
* })
|
|
155
|
+
*
|
|
156
|
+
* // 自定义颜色主题
|
|
157
|
+
* buildProgress({
|
|
158
|
+
* theme: {
|
|
159
|
+
* completeColor: (t) => `\x1b[32m${t}\x1b[39m`,
|
|
160
|
+
* incompleteColor: (t) => `\x1b[90m${t}\x1b[39m`,
|
|
161
|
+
* percentageColor: (t) => `\x1b[1m${t}\x1b[22m`,
|
|
162
|
+
* phaseColor: (t) => `\x1b[36m${t}\x1b[39m`,
|
|
163
|
+
* moduleColor: (t) => `\x1b[90m${t}\x1b[39m`
|
|
164
|
+
* }
|
|
165
|
+
* })
|
|
166
|
+
*
|
|
167
|
+
* // 禁用模块名显示
|
|
168
|
+
* buildProgress({
|
|
169
|
+
* showModuleName: false
|
|
170
|
+
* })
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* @remarks
|
|
174
|
+
* 该插件在 Vite 构建过程中实时显示终端进度条,支持三种显示格式:
|
|
175
|
+
* - bar: 完整进度条(默认),包含旋转动画、阶段标签、进度条和百分比
|
|
176
|
+
* - spinner: 旋转动画模式,仅显示动画、阶段标签和百分比
|
|
177
|
+
* - minimal: 精简模式,仅显示阶段标签和百分比
|
|
178
|
+
*
|
|
179
|
+
* 进度计算基于 Vite 构建生命周期:
|
|
180
|
+
* 1. config 阶段(5%)→ resolve 阶段(10%)→ transform 阶段(15%-85%)→ bundle 阶段(+10%)→ write 阶段(+5%)→ 完成(100%)
|
|
181
|
+
*
|
|
182
|
+
* 在非 TTY 终端环境下(如 CI/CD),自动降级为日志输出模式。
|
|
183
|
+
*/
|
|
184
|
+
declare const buildProgress: PluginFactory<BuildProgressOptions, BuildProgressOptions>;
|
|
185
|
+
|
|
6
186
|
/**
|
|
7
187
|
* 复制文件插件的配置选项接口
|
|
8
188
|
*
|
|
@@ -576,5 +756,5 @@ interface InjectIcoOptions extends BasePluginOptions {
|
|
|
576
756
|
*/
|
|
577
757
|
declare const injectIco: PluginFactory<InjectIcoOptions, string | InjectIcoOptions>;
|
|
578
758
|
|
|
579
|
-
export { copyFile, generateRouter, generateVersion, injectIco };
|
|
580
|
-
export type { CopyFileOptions, GenerateRouterOptions, GenerateVersionOptions, Icon, InjectIcoOptions, NameStrategy, OutputFormat, OutputType, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, VersionFormat };
|
|
759
|
+
export { buildProgress, copyFile, generateRouter, generateVersion, injectIco };
|
|
760
|
+
export type { BuildPhase, BuildProgressOptions, CopyFileOptions, GenerateRouterOptions, GenerateVersionOptions, Icon, InjectIcoOptions, NameStrategy, OutputFormat, OutputType, ProgressFormat, ProgressTheme, RouteConfig, RouteMeta, UniAppPageConfig, UniAppPagesJson, UniAppTabBarConfig, VersionFormat };
|
package/dist/plugins/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{c as copyFile,g as generateRouter,a as generateVersion,i as injectIco}from"../shared/vite-plugin.
|
|
1
|
+
export{b as buildProgress,c as copyFile,g as generateRouter,a as generateVersion,i as injectIco}from"../shared/vite-plugin.CIahO6bu.mjs";import"../shared/vite-plugin.DSb6XzBn.mjs";import"../logger/index.mjs";import"fs";import"path";import"crypto";import"../shared/vite-plugin.B88RyRN8.mjs";import"../shared/vite-plugin.C3ejdBNf.mjs";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import{c as h,B as c}from"./vite-plugin.DSb6XzBn.mjs";import{c as d,a as m,t as F,m as b,i as f,l as B,w as E,d as w,g as y,h as $}from"./vite-plugin.C3ejdBNf.mjs";import"crypto";import{resolve as p,join as x}from"path";import{existsSync as g,watch as T}from"fs";import{V as A}from"./vite-plugin.B88RyRN8.mjs";const C=process.platform==="win32"?["|","/","-","\\"]:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],n={reset:"\x1B[0G",clearLine:"\x1B[2K",hideCursor:"\x1B[?25l",showCursor:"\x1B[?25h",green:r=>`\x1B[32m${r}\x1B[39m`,cyan:r=>`\x1B[36m${r}\x1B[39m`,gray:r=>`\x1B[90m${r}\x1B[39m`,bold:r=>`\x1B[1m${r}\x1B[22m`},D={completeColor:n.green,incompleteColor:n.gray,percentageColor:n.bold,phaseColor:n.cyan,moduleColor:n.gray},P={idle:"\u7B49\u5F85\u4E2D",config:"\u8BFB\u53D6\u914D\u7F6E",resolve:"\u89E3\u6790\u6A21\u5757",transform:"\u8F6C\u6362\u6A21\u5757",bundle:"\u6253\u5305\u4E2D",write:"\u5199\u5165\u6587\u4EF6",done:"\u6784\u5EFA\u5B8C\u6210"};class l extends c{totalModules=0;transformedModules=0;currentModule="";phase="idle";spinnerIndex=0;spinnerTimer=null;isDev=!1;theme=D;lastPercentage=0;static ANSI_REGEX=/\x1b\[[0-9;]*m/g;static stripAnsi(e){return e.replace(l.ANSI_REGEX,"")}getDefaultOptions(){return{width:30,format:"bar",completeChar:"\u2588",incompleteChar:"\u2591",clearOnComplete:!0,showModuleName:!0}}validateOptions(){this.validator.field("width").number().custom(e=>!e||e>0,"width \u5FC5\u987B\u5927\u4E8E 0").field("format").custom(e=>!e||["bar","spinner","minimal"].includes(e),"format \u5FC5\u987B\u662F bar, spinner \u6216 minimal").field("completeChar").string().field("incompleteChar").string().field("clearOnComplete").boolean().field("showModuleName").boolean().validate()}getPluginName(){return"build-progress"}onConfigResolved(e){super.onConfigResolved(e),this.theme=this.options.theme||D}getPercentage(){if(this.phase==="done")return this.lastPercentage=100;if(this.phase==="config")return this.lastPercentage=5;if(this.phase==="resolve")return this.lastPercentage=10;if(this.totalModules===0)return this.lastPercentage=15;const e=Math.min(this.transformedModules/this.totalModules*70,70),t=this.phase==="bundle"?10:0,s=this.phase==="write"?5:0,u=Math.min(Math.floor(15+e+t+s),99);return this.lastPercentage=Math.max(u,this.lastPercentage),this.lastPercentage}renderBar(e){const t=this.options.width||30,s=this.options.completeChar||"\u2588",u=this.options.incompleteChar||"\u2591",i=Math.round(e/100*t),o=t-i;return this.theme.completeColor(s.repeat(i))+this.theme.incompleteColor(u.repeat(o))}renderSpinner(){const e=C[this.spinnerIndex%C.length];return this.spinnerIndex++,this.theme.phaseColor(e)}render(e){const t=this.options.format||"bar",s=this.theme.phaseColor(P[this.phase]),u=this.theme.percentageColor(`${e}%`);let i="";if(t==="bar"?i=`${this.renderSpinner()} ${s} ${this.renderBar(e)} ${u}`:t==="spinner"?i=`${this.renderSpinner()} ${s} ${u}`:i=`${s} ${u}`,this.options.showModuleName&&this.currentModule&&this.phase==="transform"){const o=l.stripAnsi(i).length,a=Math.max((process.stdout.columns||80)-o-3,20),v=this.currentModule.length>a?"..."+this.currentModule.slice(-a+3):this.currentModule;i+=` ${this.theme.moduleColor(v)}`}return i}update(){if(!process.stdout.isTTY)return;const e=this.getPercentage(),t=this.render(e);this.safeExecuteSync(()=>{process.stdout.write(n.clearLine+n.reset+t)},"\u66F4\u65B0\u8FDB\u5EA6\u663E\u793A")}startSpinner(){this.spinnerTimer||process.stdout.isTTY&&(this.spinnerTimer=setInterval(()=>this.update(),80))}stopSpinner(){this.spinnerTimer&&(clearInterval(this.spinnerTimer),this.spinnerTimer=null)}complete(){if(this.phase="done",this.stopSpinner(),!process.stdout.isTTY){this.logger.success("\u6784\u5EFA\u5B8C\u6210");return}if(this.options.clearOnComplete)this.safeExecuteSync(()=>{process.stdout.write(n.clearLine+n.reset)},"\u6E05\u9664\u8FDB\u5EA6\u884C");else{const e=this.render(100);this.safeExecuteSync(()=>{process.stdout.write(n.clearLine+n.reset+e+`
|
|
2
|
+
`)},"\u8F93\u51FA\u5B8C\u6210\u8FDB\u5EA6")}this.safeExecuteSync(()=>{process.stdout.write(n.showCursor)},"\u6062\u590D\u5149\u6807\u663E\u793A")}addPluginHooks(e){e.config=(t,{command:s})=>(this.isDev=s==="serve",null),e.configResolved=()=>{this.options.enabled&&(this.phase="config",process.stdout.isTTY&&this.safeExecuteSync(()=>{process.stdout.write(n.hideCursor)},"\u9690\u85CF\u5149\u6807"),this.startSpinner())},e.buildStart=()=>{this.options.enabled&&(this.phase="resolve",this.totalModules=0,this.transformedModules=0)},e.resolveId={handler:t=>{this.options.enabled&&(t.includes("node_modules")||t.includes(".virtual")||this.totalModules++)}},e.transform={handler:(t,s)=>{this.options.enabled&&(s.includes("node_modules")||s.includes(".virtual")||(this.phase="transform",this.transformedModules++,this.currentModule=s))}},e.writeBundle=()=>{this.options.enabled&&(this.phase="write",this.update())},e.closeBundle=()=>{this.options.enabled&&this.complete()},e.buildEnd=()=>{this.options.enabled&&(this.isDev||(this.phase="bundle",this.update()))},e.configureServer=()=>{this.options.enabled&&this.isDev&&this.complete()}}destroy(){super.destroy(),this.stopSpinner(),process.stdout.isTTY&&this.safeExecuteSync(()=>{process.stdout.write(n.showCursor)},"\u6062\u590D\u5149\u6807\u663E\u793A")}}const S=h(l);class M extends c{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:u=!0,incremental:i=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${t}`);return}await d(e);const a=await m(e,t,{recursive:u,overwrite:s,incremental:i});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${a.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${a.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${a.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const R=h(M);class j extends c{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").custom(e=>!e||["ts","js"].includes(e),"outputFormat \u5FC5\u987B\u662F ts \u6216 js").field("nameStrategy").custom(e=>!e||["path","camelCase","pascalCase","custom"].includes(e),"nameStrategy \u5FC5\u987B\u662F path, camelCase, pascalCase \u6216 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 F(e);case"pascalCase":return b(e);case"custom":return this.options.customNameGenerator(e);default:return F(e)}}extractMeta(e,t){const s={},u=e.style||{},i=this.options.metaMapping||{};for(const[o,a]of Object.entries(i))u[o]!==void 0&&(s[a]=u[o]);return this.tabBarPages.has(t)&&(s.isTab=!0),s}parsePageToRoute(e,t=""){const s=t?`/${t}/${e.path}`:`/${e.path}`,u=this.generateRouteName(s),i=this.extractMeta(e,s.replace(/^\//,"")),o={path:s,name:u};return Object.keys(i).length>0&&(o.meta=i),o}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 s of e.tabBar.list)this.tabBarPages.add(s.pagePath);for(const s of e.pages)t.push(this.parsePageToRoute(s));if(this.options.includeSubPackages&&e.subPackages){for(const s of e.subPackages)if(s.pages&&Array.isArray(s.pages))for(const u of s.pages)t.push(this.parsePageToRoute(u,s.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
|
|
3
|
+
/**
|
|
4
|
+
* \u8DEF\u7531\u5143\u4FE1\u606F
|
|
5
|
+
*/
|
|
6
|
+
export interface RouteMeta {
|
|
7
|
+
/** \u9875\u9762\u6807\u9898 */
|
|
8
|
+
title?: string
|
|
9
|
+
/** \u662F\u5426\u4E3ATabBar\u9875\u9762 */
|
|
10
|
+
isTab?: boolean
|
|
11
|
+
/** \u662F\u5426\u9700\u8981\u767B\u5F55 */
|
|
12
|
+
requireAuth?: boolean
|
|
13
|
+
/** \u81EA\u5B9A\u4E49\u6269\u5C55\u5B57\u6BB5 */
|
|
14
|
+
[key: string]: unknown
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* \u8DEF\u7531\u914D\u7F6E\u9879
|
|
19
|
+
*/
|
|
20
|
+
export interface RouteConfig {
|
|
21
|
+
/** \u8DEF\u7531\u8DEF\u5F84 */
|
|
22
|
+
path: string
|
|
23
|
+
/** \u8DEF\u7531\u540D\u79F0\uFF08\u7528\u4E8E\u547D\u540D\u8DEF\u7531\u5BFC\u822A\uFF09 */
|
|
24
|
+
name?: string
|
|
25
|
+
/** \u8DEF\u7531\u5143\u4FE1\u606F */
|
|
26
|
+
meta?: RouteMeta
|
|
27
|
+
}
|
|
28
|
+
`}generateFileContent(e){const t=this.generateTypeDefinitions(),s=this.options.outputFormat==="ts",u=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
|
|
29
|
+
/**
|
|
30
|
+
* \u8DEF\u7531\u914D\u7F6E\u5217\u8868
|
|
31
|
+
* @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
|
|
32
|
+
*/
|
|
33
|
+
export const routes${s?": RouteConfig[]":""} = ${u}
|
|
34
|
+
|
|
35
|
+
export default routes
|
|
36
|
+
`}async readPagesJson(){const e=p(this.projectRoot,this.options.pagesJsonPath);if(!g(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await f(e),s=B(t);return JSON.parse(s)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,s=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!s)return t;try{let u=s[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const i=JSON.parse(u);for(const o of i)o.path&&t.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 t}mergeRoutes(e,t){return e.map(s=>{const u=t.get(s.path);if(!u)return s;const i={};return s.meta&&Object.assign(i,s.meta),u.meta&&Object.assign(i,u.meta),{...u,path:s.path,meta:Object.keys(i).length>0?i:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const s=p(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&g(s))try{const i=await f(s),o=this.extractExistingRoutes(i);o.size>0&&(t=this.mergeRoutes(t,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const u=this.generateFileContent(t);await E(s,u),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${s}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=p(this.projectRoot,this.options.pagesJsonPath);g(e)&&(this.watcher=T(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 k=h(j);class O extends c{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").custom(e=>!e||["timestamp","date","datetime","semver","hash","custom"].includes(e),"format \u5FC5\u987B\u662F timestamp, date, datetime, semver, hash \u6216 custom").field("outputType").custom(e=>!e||["file","define","both"].includes(e),"outputType \u5FC5\u987B\u662F file, define \u6216 both").field("hashLength").number().custom(e=>!e||e>0&&e<=32,"hashLength \u5FC5\u987B\u5728 1-32 \u4E4B\u95F4").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=w(this.buildTime),t=y(this.options.hashLength);let s;switch(this.options.format){case"timestamp":s=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":s=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":s=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":s=this.options.semverBase||"1.0.0";break;case"hash":s=t;break;case"custom":s=this.parseCustomFormat({...e,hash:t});break;default:s=e.timestamp}const u=this.options.prefix||"",i=this.options.suffix||"";return`${u}${s}${i}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[s,u,i]=this.options.semverBase.split(".");t.major=s||"1",t.minor=u||"0",t.patch=i||"0"}return $(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=x(e,this.options.outputFile||"version.json"),s=this.generateVersionInfo();await E(t,JSON.stringify(s,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 N=h(O);function I(r){const e=[];if(r.link)return[];if(r.icons&&r.icons.length>0)for(const t of r.icons){const s={rel:t.rel,href:t.href};t.sizes&&(s.sizes=t.sizes),t.type&&(s.type=t.type),e.push({tag:"link",attrs:s,injectTo:"head"})}else if(r.url)e.push({tag:"link",attrs:{rel:"icon",href:r.url},injectTo:"head"});else{const t=r.base||"/",s=t.endsWith("/")?`${t}favicon.ico`:`${t}/favicon.ico`;e.push({tag:"link",attrs:{rel:"icon",href:s},injectTo:"head"})}return e}class _ extends c{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new A(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"inject-ico"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const e=I(this.options);return e.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${e.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),e}injectCustomLinkTag(e){if(!this.options.enabled||!this.options.link)return e;const t=this.options.link,s=/<\/head>/i,u=e.match(s);if(u&&u.index!==void 0){const i=e.slice(0,u.index)+t+`
|
|
37
|
+
`+e.slice(u.index);return this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${t}`),i}return this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),e}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:e}=this.options;if(!e)return;const{sourceDir:t,targetDir:s,overwrite:u=!0,recursive:i=!0}=e;await d(t);const o=await m(t,s,{recursive:i,overwrite:u,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${t} \u5230 ${s}`,`\u590D\u5236\u4E86 ${o.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${o.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${o.executionTime}ms`)}addPluginHooks(e){e.transformIndexHtml={order:"pre",handler:t=>{if(this.options.link)return this.injectCustomLinkTag(t);const s=this.getIconTagDescriptors();return s.length>0?{html:t,tags:s}:t}},e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const Y=h(_,r=>typeof r=="string"?{base:r}:r||{});export{N as a,S as b,R as c,k as g,Y as i};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";const index=require("./vite-plugin.CawoITTT.cjs"),format=require("./vite-plugin.Ba9646wL.cjs");require("crypto");const u$1=require("path"),o$1=require("fs"),validation=require("./vite-plugin.IGZeStMa.cjs"),SPINNER_FRAMES=process.platform==="win32"?["|","/","-","\\"]:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ANSI={reset:"\x1B[0G",clearLine:"\x1B[2K",hideCursor:"\x1B[?25l",showCursor:"\x1B[?25h",green:n=>`\x1B[32m${n}\x1B[39m`,cyan:n=>`\x1B[36m${n}\x1B[39m`,gray:n=>`\x1B[90m${n}\x1B[39m`,bold:n=>`\x1B[1m${n}\x1B[22m`},DEFAULT_THEME={completeColor:ANSI.green,incompleteColor:ANSI.gray,percentageColor:ANSI.bold,phaseColor:ANSI.cyan,moduleColor:ANSI.gray},PHASE_LABELS={idle:"\u7B49\u5F85\u4E2D",config:"\u8BFB\u53D6\u914D\u7F6E",resolve:"\u89E3\u6790\u6A21\u5757",transform:"\u8F6C\u6362\u6A21\u5757",bundle:"\u6253\u5305\u4E2D",write:"\u5199\u5165\u6587\u4EF6",done:"\u6784\u5EFA\u5B8C\u6210"};class o extends index.BasePlugin{totalModules=0;transformedModules=0;currentModule="";phase="idle";spinnerIndex=0;spinnerTimer=null;isDev=!1;theme=DEFAULT_THEME;lastPercentage=0;static ANSI_REGEX=/\x1b\[[0-9;]*m/g;static stripAnsi(e){return e.replace(o.ANSI_REGEX,"")}getDefaultOptions(){return{width:30,format:"bar",completeChar:"\u2588",incompleteChar:"\u2591",clearOnComplete:!0,showModuleName:!0}}validateOptions(){this.validator.field("width").number().custom(e=>!e||e>0,"width \u5FC5\u987B\u5927\u4E8E 0").field("format").custom(e=>!e||["bar","spinner","minimal"].includes(e),"format \u5FC5\u987B\u662F bar, spinner \u6216 minimal").field("completeChar").string().field("incompleteChar").string().field("clearOnComplete").boolean().field("showModuleName").boolean().validate()}getPluginName(){return"build-progress"}onConfigResolved(e){super.onConfigResolved(e),this.theme=this.options.theme||DEFAULT_THEME}getPercentage(){if(this.phase==="done")return this.lastPercentage=100;if(this.phase==="config")return this.lastPercentage=5;if(this.phase==="resolve")return this.lastPercentage=10;if(this.totalModules===0)return this.lastPercentage=15;const e=Math.min(this.transformedModules/this.totalModules*70,70),t=this.phase==="bundle"?10:0,s=this.phase==="write"?5:0,i=Math.min(Math.floor(15+e+t+s),99);return this.lastPercentage=Math.max(i,this.lastPercentage),this.lastPercentage}renderBar(e){const t=this.options.width||30,s=this.options.completeChar||"\u2588",i=this.options.incompleteChar||"\u2591",r=Math.round(e/100*t),a=t-r;return this.theme.completeColor(s.repeat(r))+this.theme.incompleteColor(i.repeat(a))}renderSpinner(){const e=SPINNER_FRAMES[this.spinnerIndex%SPINNER_FRAMES.length];return this.spinnerIndex++,this.theme.phaseColor(e)}render(e){const t=this.options.format||"bar",s=this.theme.phaseColor(PHASE_LABELS[this.phase]),i=this.theme.percentageColor(`${e}%`);let r="";if(t==="bar"?r=`${this.renderSpinner()} ${s} ${this.renderBar(e)} ${i}`:t==="spinner"?r=`${this.renderSpinner()} ${s} ${i}`:r=`${s} ${i}`,this.options.showModuleName&&this.currentModule&&this.phase==="transform"){const a=o.stripAnsi(r).length,c=Math.max((process.stdout.columns||80)-a-3,20),l=this.currentModule.length>c?"..."+this.currentModule.slice(-c+3):this.currentModule;r+=` ${this.theme.moduleColor(l)}`}return r}update(){if(!process.stdout.isTTY)return;const e=this.getPercentage(),t=this.render(e);this.safeExecuteSync(()=>{process.stdout.write(ANSI.clearLine+ANSI.reset+t)},"\u66F4\u65B0\u8FDB\u5EA6\u663E\u793A")}startSpinner(){this.spinnerTimer||process.stdout.isTTY&&(this.spinnerTimer=setInterval(()=>this.update(),80))}stopSpinner(){this.spinnerTimer&&(clearInterval(this.spinnerTimer),this.spinnerTimer=null)}complete(){if(this.phase="done",this.stopSpinner(),!process.stdout.isTTY){this.logger.success("\u6784\u5EFA\u5B8C\u6210");return}if(this.options.clearOnComplete)this.safeExecuteSync(()=>{process.stdout.write(ANSI.clearLine+ANSI.reset)},"\u6E05\u9664\u8FDB\u5EA6\u884C");else{const e=this.render(100);this.safeExecuteSync(()=>{process.stdout.write(ANSI.clearLine+ANSI.reset+e+`
|
|
2
|
+
`)},"\u8F93\u51FA\u5B8C\u6210\u8FDB\u5EA6")}this.safeExecuteSync(()=>{process.stdout.write(ANSI.showCursor)},"\u6062\u590D\u5149\u6807\u663E\u793A")}addPluginHooks(e){e.config=(t,{command:s})=>(this.isDev=s==="serve",null),e.configResolved=()=>{this.options.enabled&&(this.phase="config",process.stdout.isTTY&&this.safeExecuteSync(()=>{process.stdout.write(ANSI.hideCursor)},"\u9690\u85CF\u5149\u6807"),this.startSpinner())},e.buildStart=()=>{this.options.enabled&&(this.phase="resolve",this.totalModules=0,this.transformedModules=0)},e.resolveId={handler:t=>{this.options.enabled&&(t.includes("node_modules")||t.includes(".virtual")||this.totalModules++)}},e.transform={handler:(t,s)=>{this.options.enabled&&(s.includes("node_modules")||s.includes(".virtual")||(this.phase="transform",this.transformedModules++,this.currentModule=s))}},e.writeBundle=()=>{this.options.enabled&&(this.phase="write",this.update())},e.closeBundle=()=>{this.options.enabled&&this.complete()},e.buildEnd=()=>{this.options.enabled&&(this.isDev||(this.phase="bundle",this.update()))},e.configureServer=()=>{this.options.enabled&&this.isDev&&this.complete()}}destroy(){super.destroy(),this.stopSpinner(),process.stdout.isTTY&&this.safeExecuteSync(()=>{process.stdout.write(ANSI.showCursor)},"\u6062\u590D\u5149\u6807\u663E\u793A")}}const buildProgress=index.createPluginFactory(o);class p extends index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:i=!0,incremental:r=!0,enabled:a=!0}=this.options;if(!a){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${t}`);return}await format.checkSourceExists(e);const c=await format.copySourceToTarget(e,t,{recursive:i,overwrite:s,incremental:r});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${c.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${c.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${c.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=index.createPluginFactory(p);class R extends index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").custom(e=>!e||["ts","js"].includes(e),"outputFormat \u5FC5\u987B\u662F ts \u6216 js").field("nameStrategy").custom(e=>!e||["path","camelCase","pascalCase","custom"].includes(e),"nameStrategy \u5FC5\u987B\u662F path, camelCase, pascalCase \u6216 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 format.toCamelCase(e);case"pascalCase":return format.toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return format.toCamelCase(e)}}extractMeta(e,t){const s={},i=e.style||{},r=this.options.metaMapping||{};for(const[a,c]of Object.entries(r))i[a]!==void 0&&(s[c]=i[a]);return this.tabBarPages.has(t)&&(s.isTab=!0),s}parsePageToRoute(e,t=""){const s=t?`/${t}/${e.path}`:`/${e.path}`,i=this.generateRouteName(s),r=this.extractMeta(e,s.replace(/^\//,"")),a={path:s,name:i};return Object.keys(r).length>0&&(a.meta=r),a}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 s of e.tabBar.list)this.tabBarPages.add(s.pagePath);for(const s of e.pages)t.push(this.parsePageToRoute(s));if(this.options.includeSubPackages&&e.subPackages){for(const s of e.subPackages)if(s.pages&&Array.isArray(s.pages))for(const i of s.pages)t.push(this.parsePageToRoute(i,s.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
|
|
3
|
+
/**
|
|
4
|
+
* \u8DEF\u7531\u5143\u4FE1\u606F
|
|
5
|
+
*/
|
|
6
|
+
export interface RouteMeta {
|
|
7
|
+
/** \u9875\u9762\u6807\u9898 */
|
|
8
|
+
title?: string
|
|
9
|
+
/** \u662F\u5426\u4E3ATabBar\u9875\u9762 */
|
|
10
|
+
isTab?: boolean
|
|
11
|
+
/** \u662F\u5426\u9700\u8981\u767B\u5F55 */
|
|
12
|
+
requireAuth?: boolean
|
|
13
|
+
/** \u81EA\u5B9A\u4E49\u6269\u5C55\u5B57\u6BB5 */
|
|
14
|
+
[key: string]: unknown
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* \u8DEF\u7531\u914D\u7F6E\u9879
|
|
19
|
+
*/
|
|
20
|
+
export interface RouteConfig {
|
|
21
|
+
/** \u8DEF\u7531\u8DEF\u5F84 */
|
|
22
|
+
path: string
|
|
23
|
+
/** \u8DEF\u7531\u540D\u79F0\uFF08\u7528\u4E8E\u547D\u540D\u8DEF\u7531\u5BFC\u822A\uFF09 */
|
|
24
|
+
name?: string
|
|
25
|
+
/** \u8DEF\u7531\u5143\u4FE1\u606F */
|
|
26
|
+
meta?: RouteMeta
|
|
27
|
+
}
|
|
28
|
+
`}generateFileContent(e){const t=this.generateTypeDefinitions(),s=this.options.outputFormat==="ts",i=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
|
|
29
|
+
/**
|
|
30
|
+
* \u8DEF\u7531\u914D\u7F6E\u5217\u8868
|
|
31
|
+
* @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
|
|
32
|
+
*/
|
|
33
|
+
export const routes${s?": RouteConfig[]":""} = ${i}
|
|
34
|
+
|
|
35
|
+
export default routes
|
|
36
|
+
`}async readPagesJson(){const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);if(!o$1.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await format.readFileContent(e),s=format.stripJsonComments(t);return JSON.parse(s)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,s=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!s)return t;try{let i=s[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const r=JSON.parse(i);for(const a of r)a.path&&t.set(a.path,a)}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(s=>{const i=t.get(s.path);if(!i)return s;const r={};return s.meta&&Object.assign(r,s.meta),i.meta&&Object.assign(r,i.meta),{...i,path:s.path,meta:Object.keys(r).length>0?r:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const s=u$1.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&o$1.existsSync(s))try{const r=await format.readFileContent(s),a=this.extractExistingRoutes(r);a.size>0&&(t=this.mergeRoutes(t,a),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const i=this.generateFileContent(t);await format.writeFileContent(s,i),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${s}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);o$1.existsSync(e)&&(this.watcher=o$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=index.createPluginFactory(R);class f extends 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").custom(e=>!e||["timestamp","date","datetime","semver","hash","custom"].includes(e),"format \u5FC5\u987B\u662F timestamp, date, datetime, semver, hash \u6216 custom").field("outputType").custom(e=>!e||["file","define","both"].includes(e),"outputType \u5FC5\u987B\u662F file, define \u6216 both").field("hashLength").number().custom(e=>!e||e>0&&e<=32,"hashLength \u5FC5\u987B\u5728 1-32 \u4E4B\u95F4").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=format.getDateFormatParams(this.buildTime),t=format.generateRandomHash(this.options.hashLength);let s;switch(this.options.format){case"timestamp":s=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":s=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":s=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":s=this.options.semverBase||"1.0.0";break;case"hash":s=t;break;case"custom":s=this.parseCustomFormat({...e,hash:t});break;default:s=e.timestamp}const i=this.options.prefix||"",r=this.options.suffix||"";return`${i}${s}${r}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[s,i,r]=this.options.semverBase.split(".");t.major=s||"1",t.minor=i||"0",t.patch=r||"0"}return format.parseTemplate(this.options.customFormat||"",t)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(e){const t=u$1.join(e,this.options.outputFile||"version.json"),s=this.generateVersionInfo();await format.writeFileContent(t,JSON.stringify(s,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=index.createPluginFactory(f);function generateIconTagDescriptors(n){const e=[];if(n.link)return[];if(n.icons&&n.icons.length>0)for(const t of n.icons){const s={rel:t.rel,href:t.href};t.sizes&&(s.sizes=t.sizes),t.type&&(s.type=t.type),e.push({tag:"link",attrs:s,injectTo:"head"})}else if(n.url)e.push({tag:"link",attrs:{rel:"icon",href:n.url},injectTo:"head"});else{const t=n.base||"/",s=t.endsWith("/")?`${t}favicon.ico`:`${t}/favicon.ico`;e.push({tag:"link",attrs:{rel:"icon",href:s},injectTo:"head"})}return e}class u extends index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validation.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"inject-ico"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const e=generateIconTagDescriptors(this.options);return e.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${e.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),e}injectCustomLinkTag(e){if(!this.options.enabled||!this.options.link)return e;const t=this.options.link,s=/<\/head>/i,i=e.match(s);if(i&&i.index!==void 0){const r=e.slice(0,i.index)+t+`
|
|
37
|
+
`+e.slice(i.index);return this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${t}`),r}return this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),e}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:e}=this.options;if(!e)return;const{sourceDir:t,targetDir:s,overwrite:i=!0,recursive:r=!0}=e;await format.checkSourceExists(t);const a=await format.copySourceToTarget(t,s,{recursive:r,overwrite:i,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${t} \u5230 ${s}`,`\u590D\u5236\u4E86 ${a.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${a.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${a.executionTime}ms`)}addPluginHooks(e){e.transformIndexHtml={order:"pre",handler:t=>{if(this.options.link)return this.injectCustomLinkTag(t);const s=this.getIconTagDescriptors();return s.length>0?{html:t,tags:s}:t}},e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const injectIco=index.createPluginFactory(u,n=>typeof n=="string"?{base:n}:n||{});exports.buildProgress=buildProgress,exports.copyFile=copyFile,exports.generateRouter=generateRouter,exports.generateVersion=generateVersion,exports.injectIco=injectIco;
|
package/package.json
CHANGED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import{c as n,B as c}from"./vite-plugin.DSb6XzBn.mjs";import{c as l,a as g,t as F,m as d,i as m,l as E,w as f,d as D,g as C,h as y}from"./vite-plugin.C3ejdBNf.mjs";import"crypto";import{resolve as h,join as v}from"path";import{existsSync as p,watch as w}from"fs";import{V as $}from"./vite-plugin.B88RyRN8.mjs";class b extends c{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:u=!0,incremental:i=!0,enabled:o=!0}=this.options;if(!o){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${t}`);return}await l(e);const a=await g(e,t,{recursive:u,overwrite:s,incremental:i});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${a.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${a.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${a.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const B=n(b);class T extends c{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").custom(e=>!e||["ts","js"].includes(e),"outputFormat \u5FC5\u987B\u662F ts \u6216 js").field("nameStrategy").custom(e=>!e||["path","camelCase","pascalCase","custom"].includes(e),"nameStrategy \u5FC5\u987B\u662F path, camelCase, pascalCase \u6216 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 F(e);case"pascalCase":return d(e);case"custom":return this.options.customNameGenerator(e);default:return F(e)}}extractMeta(e,t){const s={},u=e.style||{},i=this.options.metaMapping||{};for(const[o,a]of Object.entries(i))u[o]!==void 0&&(s[a]=u[o]);return this.tabBarPages.has(t)&&(s.isTab=!0),s}parsePageToRoute(e,t=""){const s=t?`/${t}/${e.path}`:`/${e.path}`,u=this.generateRouteName(s),i=this.extractMeta(e,s.replace(/^\//,"")),o={path:s,name:u};return Object.keys(i).length>0&&(o.meta=i),o}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 s of e.tabBar.list)this.tabBarPages.add(s.pagePath);for(const s of e.pages)t.push(this.parsePageToRoute(s));if(this.options.includeSubPackages&&e.subPackages){for(const s of e.subPackages)if(s.pages&&Array.isArray(s.pages))for(const u of s.pages)t.push(this.parsePageToRoute(u,s.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
|
|
2
|
-
/**
|
|
3
|
-
* \u8DEF\u7531\u5143\u4FE1\u606F
|
|
4
|
-
*/
|
|
5
|
-
export interface RouteMeta {
|
|
6
|
-
/** \u9875\u9762\u6807\u9898 */
|
|
7
|
-
title?: string
|
|
8
|
-
/** \u662F\u5426\u4E3ATabBar\u9875\u9762 */
|
|
9
|
-
isTab?: boolean
|
|
10
|
-
/** \u662F\u5426\u9700\u8981\u767B\u5F55 */
|
|
11
|
-
requireAuth?: boolean
|
|
12
|
-
/** \u81EA\u5B9A\u4E49\u6269\u5C55\u5B57\u6BB5 */
|
|
13
|
-
[key: string]: unknown
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* \u8DEF\u7531\u914D\u7F6E\u9879
|
|
18
|
-
*/
|
|
19
|
-
export interface RouteConfig {
|
|
20
|
-
/** \u8DEF\u7531\u8DEF\u5F84 */
|
|
21
|
-
path: string
|
|
22
|
-
/** \u8DEF\u7531\u540D\u79F0\uFF08\u7528\u4E8E\u547D\u540D\u8DEF\u7531\u5BFC\u822A\uFF09 */
|
|
23
|
-
name?: string
|
|
24
|
-
/** \u8DEF\u7531\u5143\u4FE1\u606F */
|
|
25
|
-
meta?: RouteMeta
|
|
26
|
-
}
|
|
27
|
-
`}generateFileContent(e){const t=this.generateTypeDefinitions(),s=this.options.outputFormat==="ts",u=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
|
|
28
|
-
/**
|
|
29
|
-
* \u8DEF\u7531\u914D\u7F6E\u5217\u8868
|
|
30
|
-
* @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
|
|
31
|
-
*/
|
|
32
|
-
export const routes${s?": RouteConfig[]":""} = ${u}
|
|
33
|
-
|
|
34
|
-
export default routes
|
|
35
|
-
`}async readPagesJson(){const e=h(this.projectRoot,this.options.pagesJsonPath);if(!p(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await m(e),s=E(t);return JSON.parse(s)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,s=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!s)return t;try{let u=s[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const i=JSON.parse(u);for(const o of i)o.path&&t.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 t}mergeRoutes(e,t){return e.map(s=>{const u=t.get(s.path);if(!u)return s;const i={};return s.meta&&Object.assign(i,s.meta),u.meta&&Object.assign(i,u.meta),{...u,path:s.path,meta:Object.keys(i).length>0?i:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const s=h(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&p(s))try{const i=await m(s),o=this.extractExistingRoutes(i);o.size>0&&(t=this.mergeRoutes(t,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const u=this.generateFileContent(t);await f(s,u),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${s}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=h(this.projectRoot,this.options.pagesJsonPath);p(e)&&(this.watcher=w(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 P=n(T);class x extends c{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").custom(e=>!e||["timestamp","date","datetime","semver","hash","custom"].includes(e),"format \u5FC5\u987B\u662F timestamp, date, datetime, semver, hash \u6216 custom").field("outputType").custom(e=>!e||["file","define","both"].includes(e),"outputType \u5FC5\u987B\u662F file, define \u6216 both").field("hashLength").number().custom(e=>!e||e>0&&e<=32,"hashLength \u5FC5\u987B\u5728 1-32 \u4E4B\u95F4").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=D(this.buildTime),t=C(this.options.hashLength);let s;switch(this.options.format){case"timestamp":s=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":s=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":s=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":s=this.options.semverBase||"1.0.0";break;case"hash":s=t;break;case"custom":s=this.parseCustomFormat({...e,hash:t});break;default:s=e.timestamp}const u=this.options.prefix||"",i=this.options.suffix||"";return`${u}${s}${i}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[s,u,i]=this.options.semverBase.split(".");t.major=s||"1",t.minor=u||"0",t.patch=i||"0"}return y(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=v(e,this.options.outputFile||"version.json"),s=this.generateVersionInfo();await f(t,JSON.stringify(s,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 A=n(x);function j(r){const e=[];if(r.link)return[];if(r.icons&&r.icons.length>0)for(const t of r.icons){const s={rel:t.rel,href:t.href};t.sizes&&(s.sizes=t.sizes),t.type&&(s.type=t.type),e.push({tag:"link",attrs:s,injectTo:"head"})}else if(r.url)e.push({tag:"link",attrs:{rel:"icon",href:r.url},injectTo:"head"});else{const t=r.base||"/",s=t.endsWith("/")?`${t}favicon.ico`:`${t}/favicon.ico`;e.push({tag:"link",attrs:{rel:"icon",href:s},injectTo:"head"})}return e}class k extends c{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new $(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"inject-ico"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const e=j(this.options);return e.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${e.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),e}injectCustomLinkTag(e){if(!this.options.enabled||!this.options.link)return e;const t=this.options.link,s=/<\/head>/i,u=e.match(s);if(u&&u.index!==void 0){const i=e.slice(0,u.index)+t+`
|
|
36
|
-
`+e.slice(u.index);return this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${t}`),i}return this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),e}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:e}=this.options;if(!e)return;const{sourceDir:t,targetDir:s,overwrite:u=!0,recursive:i=!0}=e;await l(t);const o=await g(t,s,{recursive:i,overwrite:u,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${t} \u5230 ${s}`,`\u590D\u5236\u4E86 ${o.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${o.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${o.executionTime}ms`)}addPluginHooks(e){e.transformIndexHtml={order:"pre",handler:t=>{if(this.options.link)return this.injectCustomLinkTag(t);const s=this.getIconTagDescriptors();return s.length>0?{html:t,tags:s}:t}},e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const R=n(k,r=>typeof r=="string"?{base:r}:r||{});export{A as a,B as c,P as g,R as i};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";const index=require("./vite-plugin.CawoITTT.cjs"),format=require("./vite-plugin.Ba9646wL.cjs");require("crypto");const u$1=require("path"),o=require("fs"),validation=require("./vite-plugin.IGZeStMa.cjs");class p extends index.BasePlugin{getDefaultOptions(){return{overwrite:!0,recursive:!0,incremental:!0}}validateOptions(){this.validator.field("sourceDir").required().string().custom(e=>e.trim()!=="","sourceDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("targetDir").required().string().custom(e=>e.trim()!=="","targetDir \u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26\u4E32").field("overwrite").boolean().field("recursive").boolean().field("incremental").boolean().validate()}getPluginName(){return"copy-file"}getEnforce(){return"post"}async copyFiles(){const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:i=!0,incremental:r=!0,enabled:a=!0}=this.options;if(!a){this.logger.info(`\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6267\u884C\uFF1A\u4ECE ${e} \u590D\u5236\u5230 ${t}`);return}await format.checkSourceExists(e);const c=await format.copySourceToTarget(e,t,{recursive:i,overwrite:s,incremental:r});this.logger.success(`\u590D\u5236\u6587\u4EF6\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${c.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${c.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${c.executionTime}ms`)}addPluginHooks(e){e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u590D\u5236\u6587\u4EF6")}}}const copyFile=index.createPluginFactory(p);class R extends index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").custom(e=>!e||["ts","js"].includes(e),"outputFormat \u5FC5\u987B\u662F ts \u6216 js").field("nameStrategy").custom(e=>!e||["path","camelCase","pascalCase","custom"].includes(e),"nameStrategy \u5FC5\u987B\u662F path, camelCase, pascalCase \u6216 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 format.toCamelCase(e);case"pascalCase":return format.toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return format.toCamelCase(e)}}extractMeta(e,t){const s={},i=e.style||{},r=this.options.metaMapping||{};for(const[a,c]of Object.entries(r))i[a]!==void 0&&(s[c]=i[a]);return this.tabBarPages.has(t)&&(s.isTab=!0),s}parsePageToRoute(e,t=""){const s=t?`/${t}/${e.path}`:`/${e.path}`,i=this.generateRouteName(s),r=this.extractMeta(e,s.replace(/^\//,"")),a={path:s,name:i};return Object.keys(r).length>0&&(a.meta=r),a}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 s of e.tabBar.list)this.tabBarPages.add(s.pagePath);for(const s of e.pages)t.push(this.parsePageToRoute(s));if(this.options.includeSubPackages&&e.subPackages){for(const s of e.subPackages)if(s.pages&&Array.isArray(s.pages))for(const i of s.pages)t.push(this.parsePageToRoute(i,s.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
|
|
2
|
-
/**
|
|
3
|
-
* \u8DEF\u7531\u5143\u4FE1\u606F
|
|
4
|
-
*/
|
|
5
|
-
export interface RouteMeta {
|
|
6
|
-
/** \u9875\u9762\u6807\u9898 */
|
|
7
|
-
title?: string
|
|
8
|
-
/** \u662F\u5426\u4E3ATabBar\u9875\u9762 */
|
|
9
|
-
isTab?: boolean
|
|
10
|
-
/** \u662F\u5426\u9700\u8981\u767B\u5F55 */
|
|
11
|
-
requireAuth?: boolean
|
|
12
|
-
/** \u81EA\u5B9A\u4E49\u6269\u5C55\u5B57\u6BB5 */
|
|
13
|
-
[key: string]: unknown
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* \u8DEF\u7531\u914D\u7F6E\u9879
|
|
18
|
-
*/
|
|
19
|
-
export interface RouteConfig {
|
|
20
|
-
/** \u8DEF\u7531\u8DEF\u5F84 */
|
|
21
|
-
path: string
|
|
22
|
-
/** \u8DEF\u7531\u540D\u79F0\uFF08\u7528\u4E8E\u547D\u540D\u8DEF\u7531\u5BFC\u822A\uFF09 */
|
|
23
|
-
name?: string
|
|
24
|
-
/** \u8DEF\u7531\u5143\u4FE1\u606F */
|
|
25
|
-
meta?: RouteMeta
|
|
26
|
-
}
|
|
27
|
-
`}generateFileContent(e){const t=this.generateTypeDefinitions(),s=this.options.outputFormat==="ts",i=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
|
|
28
|
-
/**
|
|
29
|
-
* \u8DEF\u7531\u914D\u7F6E\u5217\u8868
|
|
30
|
-
* @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
|
|
31
|
-
*/
|
|
32
|
-
export const routes${s?": RouteConfig[]":""} = ${i}
|
|
33
|
-
|
|
34
|
-
export default routes
|
|
35
|
-
`}async readPagesJson(){const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);if(!o.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await format.readFileContent(e),s=format.stripJsonComments(t);return JSON.parse(s)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,s=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!s)return t;try{let i=s[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const r=JSON.parse(i);for(const a of r)a.path&&t.set(a.path,a)}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(s=>{const i=t.get(s.path);if(!i)return s;const r={};return s.meta&&Object.assign(r,s.meta),i.meta&&Object.assign(r,i.meta),{...i,path:s.path,meta:Object.keys(r).length>0?r:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const s=u$1.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&o.existsSync(s))try{const r=await format.readFileContent(s),a=this.extractExistingRoutes(r);a.size>0&&(t=this.mergeRoutes(t,a),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const i=this.generateFileContent(t);await format.writeFileContent(s,i),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${s}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);o.existsSync(e)&&(this.watcher=o.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=index.createPluginFactory(R);class f extends 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").custom(e=>!e||["timestamp","date","datetime","semver","hash","custom"].includes(e),"format \u5FC5\u987B\u662F timestamp, date, datetime, semver, hash \u6216 custom").field("outputType").custom(e=>!e||["file","define","both"].includes(e),"outputType \u5FC5\u987B\u662F file, define \u6216 both").field("hashLength").number().custom(e=>!e||e>0&&e<=32,"hashLength \u5FC5\u987B\u5728 1-32 \u4E4B\u95F4").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=format.getDateFormatParams(this.buildTime),t=format.generateRandomHash(this.options.hashLength);let s;switch(this.options.format){case"timestamp":s=`${e.YYYY}${e.MM}${e.DD}${e.HH}${e.mm}${e.ss}`;break;case"date":s=`${e.YYYY}.${e.MM}.${e.DD}`;break;case"datetime":s=`${e.YYYY}.${e.MM}.${e.DD}.${e.HH}${e.mm}${e.ss}`;break;case"semver":s=this.options.semverBase||"1.0.0";break;case"hash":s=t;break;case"custom":s=this.parseCustomFormat({...e,hash:t});break;default:s=e.timestamp}const i=this.options.prefix||"",r=this.options.suffix||"";return`${i}${s}${r}`}parseCustomFormat(e){const t={...e};if(this.options.semverBase){const[s,i,r]=this.options.semverBase.split(".");t.major=s||"1",t.minor=i||"0",t.patch=r||"0"}return format.parseTemplate(this.options.customFormat||"",t)}generateVersionInfo(){return{version:this.version,buildTime:this.buildTime.toISOString(),timestamp:this.buildTime.getTime(),format:this.options.format,...this.options.extra}}async writeVersionFile(e){const t=u$1.join(e,this.options.outputFile||"version.json"),s=this.generateVersionInfo();await format.writeFileContent(t,JSON.stringify(s,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=index.createPluginFactory(f);function generateIconTagDescriptors(n){const e=[];if(n.link)return[];if(n.icons&&n.icons.length>0)for(const t of n.icons){const s={rel:t.rel,href:t.href};t.sizes&&(s.sizes=t.sizes),t.type&&(s.type=t.type),e.push({tag:"link",attrs:s,injectTo:"head"})}else if(n.url)e.push({tag:"link",attrs:{rel:"icon",href:n.url},injectTo:"head"});else{const t=n.base||"/",s=t.endsWith("/")?`${t}favicon.ico`:`${t}/favicon.ico`;e.push({tag:"link",attrs:{rel:"icon",href:s},injectTo:"head"})}return e}class u extends index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validation.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"inject-ico"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const e=generateIconTagDescriptors(this.options);return e.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${e.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),e}injectCustomLinkTag(e){if(!this.options.enabled||!this.options.link)return e;const t=this.options.link,s=/<\/head>/i,i=e.match(s);if(i&&i.index!==void 0){const r=e.slice(0,i.index)+t+`
|
|
36
|
-
`+e.slice(i.index);return this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${t}`),r}return this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),e}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:e}=this.options;if(!e)return;const{sourceDir:t,targetDir:s,overwrite:i=!0,recursive:r=!0}=e;await format.checkSourceExists(t);const a=await format.copySourceToTarget(t,s,{recursive:r,overwrite:i,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${t} \u5230 ${s}`,`\u590D\u5236\u4E86 ${a.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${a.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${a.executionTime}ms`)}addPluginHooks(e){e.transformIndexHtml={order:"pre",handler:t=>{if(this.options.link)return this.injectCustomLinkTag(t);const s=this.getIconTagDescriptors();return s.length>0?{html:t,tags:s}:t}},e.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const injectIco=index.createPluginFactory(u,n=>typeof n=="string"?{base:n}:n||{});exports.copyFile=copyFile,exports.generateRouter=generateRouter,exports.generateVersion=generateVersion,exports.injectIco=injectIco;
|