@meng-xi/vite-plugin 0.0.5 → 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.
Files changed (46) hide show
  1. package/README-en.md +404 -182
  2. package/README.md +403 -182
  3. package/dist/common/index.cjs +1 -1
  4. package/dist/common/index.d.cts +9 -1
  5. package/dist/common/index.d.mts +9 -1
  6. package/dist/common/index.d.ts +9 -1
  7. package/dist/common/index.mjs +1 -1
  8. package/dist/factory/index.cjs +1 -1
  9. package/dist/factory/index.d.cts +71 -6
  10. package/dist/factory/index.d.mts +71 -6
  11. package/dist/factory/index.d.ts +71 -6
  12. package/dist/factory/index.mjs +1 -1
  13. package/dist/index.cjs +1 -1
  14. package/dist/index.d.cts +4 -5
  15. package/dist/index.d.mts +4 -5
  16. package/dist/index.d.ts +4 -5
  17. package/dist/index.mjs +1 -1
  18. package/dist/logger/index.cjs +1 -1
  19. package/dist/logger/index.d.cts +1 -1
  20. package/dist/logger/index.d.mts +1 -1
  21. package/dist/logger/index.d.ts +1 -1
  22. package/dist/logger/index.mjs +1 -1
  23. package/dist/plugins/index.cjs +1 -1
  24. package/dist/plugins/index.d.cts +263 -8
  25. package/dist/plugins/index.d.mts +263 -8
  26. package/dist/plugins/index.d.ts +263 -8
  27. package/dist/plugins/index.mjs +1 -1
  28. package/dist/shared/vite-plugin.Ba9646wL.cjs +1 -0
  29. package/dist/shared/vite-plugin.C3ejdBNf.mjs +1 -0
  30. package/dist/shared/vite-plugin.CIahO6bu.mjs +37 -0
  31. package/dist/shared/{vite-plugin.B3PARlU9.d.cts → vite-plugin.CLr0ttuO.d.cts} +16 -0
  32. package/dist/shared/{vite-plugin.B3PARlU9.d.mts → vite-plugin.CLr0ttuO.d.mts} +16 -0
  33. package/dist/shared/{vite-plugin.B3PARlU9.d.ts → vite-plugin.CLr0ttuO.d.ts} +16 -0
  34. package/dist/shared/vite-plugin.CawoITTT.cjs +1 -0
  35. package/dist/shared/vite-plugin.DSb6XzBn.mjs +1 -0
  36. package/dist/shared/vite-plugin.DqgHJjxa.cjs +37 -0
  37. package/package.json +72 -72
  38. package/dist/shared/vite-plugin.BZsetDCm.cjs +0 -1
  39. package/dist/shared/vite-plugin.C7isVPKg.mjs +0 -1
  40. package/dist/shared/vite-plugin.CS9a5kjK.mjs +0 -36
  41. package/dist/shared/vite-plugin.CgnG5_UX.cjs +0 -36
  42. package/dist/shared/vite-plugin.DqWt65U-.cjs +0 -1
  43. package/dist/shared/vite-plugin.UkE7CdSe.d.cts +0 -43
  44. package/dist/shared/vite-plugin.UkE7CdSe.d.mts +0 -43
  45. package/dist/shared/vite-plugin.UkE7CdSe.d.ts +0 -43
  46. package/dist/shared/vite-plugin.YvjM8LxW.mjs +0 -1
@@ -1,5 +1,187 @@
1
- import { B as BasePluginOptions, P as PluginFactory } from '../shared/vite-plugin.UkE7CdSe.js';
1
+ import { BasePluginOptions, PluginFactory } from '../factory/index.js';
2
2
  import 'vite';
3
+ import '../shared/vite-plugin.CLr0ttuO.js';
4
+ import '../shared/vite-plugin.CiHfwMiN.js';
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>;
3
185
 
4
186
  /**
5
187
  * 复制文件插件的配置选项接口
@@ -72,6 +254,84 @@ interface CopyFileOptions extends BasePluginOptions {
72
254
  */
73
255
  declare const copyFile: PluginFactory<CopyFileOptions, CopyFileOptions>;
74
256
 
257
+ /**
258
+ * 路由元信息
259
+ */
260
+ interface RouteMeta {
261
+ /** 页面标题 */
262
+ title?: string;
263
+ /** 是否为TabBar页面 */
264
+ isTab?: boolean;
265
+ /** 是否需要登录 */
266
+ requireAuth?: boolean;
267
+ /** 自定义扩展字段 */
268
+ [key: string]: unknown;
269
+ }
270
+ /**
271
+ * 路由配置项
272
+ */
273
+ interface RouteConfig {
274
+ /** 路由路径 */
275
+ path: string;
276
+ /** 路由名称(用于命名路由导航) */
277
+ name?: string;
278
+ /** 路由元信息 */
279
+ meta?: RouteMeta;
280
+ }
281
+ /**
282
+ * uni-app pages.json 中的页面配置项
283
+ */
284
+ interface UniAppPageConfig {
285
+ /** 页面路径 */
286
+ path: string;
287
+ /** 页面样式 */
288
+ style?: {
289
+ /** 导航栏标题 */
290
+ navigationBarTitleText?: string;
291
+ /** 是否需要登录 */
292
+ requireAuth?: boolean;
293
+ /** 其他自定义属性 */
294
+ [key: string]: unknown;
295
+ };
296
+ /** 其他属性 */
297
+ [key: string]: unknown;
298
+ }
299
+ /**
300
+ * uni-app pages.json 中的 tabBar 配置
301
+ */
302
+ interface UniAppTabBarConfig {
303
+ /** tabBar 列表 */
304
+ list?: Array<{
305
+ /** 页面路径 */
306
+ pagePath: string;
307
+ /** 文字 */
308
+ text?: string;
309
+ /** 图标路径 */
310
+ iconPath?: string;
311
+ /** 选中图标路径 */
312
+ selectedIconPath?: string;
313
+ }>;
314
+ /** 其他属性 */
315
+ [key: string]: unknown;
316
+ }
317
+ /**
318
+ * uni-app pages.json 结构
319
+ */
320
+ interface UniAppPagesJson {
321
+ /** 页面列表 */
322
+ pages: UniAppPageConfig[];
323
+ /** 子包 */
324
+ subPackages?: Array<{
325
+ root: string;
326
+ pages: UniAppPageConfig[];
327
+ }>;
328
+ /** tabBar 配置 */
329
+ tabBar?: UniAppTabBarConfig;
330
+ /** 全局样式 */
331
+ globalStyle?: Record<string, unknown>;
332
+ /** 其他属性 */
333
+ [key: string]: unknown;
334
+ }
75
335
  /**
76
336
  * 输出文件格式类型
77
337
  */
@@ -260,12 +520,6 @@ interface GenerateVersionOptions extends BasePluginOptions {
260
520
  * @default '1.0.0'
261
521
  */
262
522
  semverBase?: string;
263
- /**
264
- * 是否自动递增补丁版本号
265
- *
266
- * @default false
267
- */
268
- autoIncrement?: boolean;
269
523
  /**
270
524
  * 输出类型
271
525
  *
@@ -502,4 +756,5 @@ interface InjectIcoOptions extends BasePluginOptions {
502
756
  */
503
757
  declare const injectIco: PluginFactory<InjectIcoOptions, string | InjectIcoOptions>;
504
758
 
505
- export { copyFile, generateRouter, generateVersion, injectIco };
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 };
@@ -1 +1 @@
1
- export{c as copyFile,g as generateRouter,a as generateVersion,i as injectIco}from"../shared/vite-plugin.CS9a5kjK.mjs";import"../shared/vite-plugin.C7isVPKg.mjs";import"../logger/index.mjs";import"fs";import"path";import"crypto";import"../shared/vite-plugin.B88RyRN8.mjs";import"../shared/vite-plugin.YvjM8LxW.mjs";
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 @@
1
+ "use strict";const o=require("fs"),u=require("path"),crypto=require("crypto");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const o__default=_interopDefaultCompat(o),u__default=_interopDefaultCompat(u),S=10;async function checkSourceExists(e){try{await o__default.promises.access(e,o__default.constants.F_OK)}catch(t){const r=t;throw r.code==="ENOENT"?new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u6E90\u6587\u4EF6\u4E0D\u5B58\u5728 - ${e}`):r.code==="EACCES"?new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6E90\u6587\u4EF6 - ${e}`):new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u68C0\u67E5\u6E90\u6587\u4EF6\u65F6\u51FA\u9519 - ${e}\uFF0C\u9519\u8BEF\uFF1A${r.message}`)}}async function ensureTargetDir(e){try{await o__default.promises.mkdir(e,{recursive:!0})}catch(t){const r=t;throw r.code==="EACCES"?new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u521B\u5EFA\u76EE\u6807\u76EE\u5F55 - ${e}`):new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u521B\u5EFA\u76EE\u6807\u76EE\u5F55\u65F6\u51FA\u9519 - ${e}\uFF0C\u9519\u8BEF\uFF1A${r.message}`)}}async function readDirRecursive(e,t){const r=await o__default.promises.readdir(e,{withFileTypes:!0}),s=[];for(const n of r){const i=u__default.join(e,n.name),l=n.isFile(),F=n.isDirectory();if(s.push({path:i,isFile:l,isDirectory:F}),F&&t){const p=await readDirRecursive(i,t);s.push(...p)}}return s}async function shouldUpdateFile(e,t){try{const[r,s]=await Promise.all([o__default.promises.stat(e),o__default.promises.stat(t)]);return r.mtimeMs>s.mtimeMs||r.size!==s.size}catch{return!0}}async function fileExists(e){try{return await o__default.promises.access(e,o__default.constants.F_OK),!0}catch{return!1}}async function runWithConcurrency(e,t,r){const s=[];let n=0;async function i(){for(;n<e.length;){const F=n++,p=await t(e[F]);s[F]=p}}const l=Array(Math.min(r,e.length)).fill(null).map(()=>i());return await Promise.all(l),s}async function copySourceToTarget(e,t,r){const s=Date.now(),{recursive:n,overwrite:i,incremental:l=!1,parallelLimit:F=S}=r;let p=0,f=0,d=0;if((await o__default.promises.stat(e)).isDirectory()){await ensureTargetDir(t);const c=await readDirRecursive(e,n),D=c.filter(a=>a.isFile);d=c.filter(a=>a.isDirectory).length;const C=new Set;for(const a of D){const w=u__default.relative(e,a.path),E=u__default.dirname(u__default.join(t,w));C.add(E)}await Promise.all([...C].map(a=>ensureTargetDir(a)));const y=await runWithConcurrency(D,async a=>{const w=u__default.relative(e,a.path),E=u__default.join(t,w);let m=i;return m||(m=!await fileExists(E)),l&&m&&(m=await shouldUpdateFile(a.path,E)),m?(await o__default.promises.copyFile(a.path,E),{copied:!0,skipped:!1}):{copied:!1,skipped:!0}},F);for(const a of y)a.copied&&p++,a.skipped&&f++}else{await ensureTargetDir(u__default.dirname(t));let c=i;c||(c=!await fileExists(t)),l&&c&&(c=await shouldUpdateFile(e,t)),c?(await o__default.promises.copyFile(e,t),p++):f++}const h=Date.now()-s;return{copiedFiles:p,skippedFiles:f,copiedDirs:d,executionTime:h}}async function writeFileContent(e,t){try{await o__default.promises.writeFile(e,t,"utf-8")}catch(r){const s=r;throw s.code==="EACCES"?new Error(`\u5199\u5165\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u5199\u5165\u6587\u4EF6 - ${e}`):new Error(`\u5199\u5165\u6587\u4EF6\u5931\u8D25\uFF1A\u5199\u5165\u6587\u4EF6\u65F6\u51FA\u9519 - ${e}\uFF0C\u9519\u8BEF\uFF1A${s.message}`)}}async function readFileContent(e){try{return await o__default.promises.readFile(e,"utf-8")}catch(t){const r=t;throw r.code==="EACCES"?new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u8BFB\u53D6\u6587\u4EF6 - ${e}`):new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u8BFB\u53D6\u6587\u4EF6\u65F6\u51FA\u9519 - ${e}\uFF0C\u9519\u8BEF\uFF1A${r.message}`)}}function readFileSync(e){try{return o__default.readFileSync(e,"utf-8")}catch(t){const r=t;throw r.code==="EACCES"?new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u8BFB\u53D6\u6587\u4EF6 - ${e}`):new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u8BFB\u53D6\u6587\u4EF6\u65F6\u51FA\u9519 - ${e}\uFF0C\u9519\u8BEF\uFF1A${r.message}`)}}function padNumber(e,t=2){return e.toString().padStart(t,"0")}function generateRandomHash(e=8){const t=Math.max(1,Math.min(64,e));return crypto.randomBytes(Math.ceil(t/2)).toString("hex").slice(0,t)}function getDateFormatParams(e=new Date){return{YYYY:e.getFullYear().toString(),YY:e.getFullYear().toString().slice(-2),MM:padNumber(e.getMonth()+1),DD:padNumber(e.getDate()),HH:padNumber(e.getHours()),mm:padNumber(e.getMinutes()),ss:padNumber(e.getSeconds()),SSS:padNumber(e.getMilliseconds(),3),timestamp:e.getTime().toString()}}function formatDate(e,t){const r=getDateFormatParams(e);let s=t;for(const[n,i]of Object.entries(r))s=s.replace(new RegExp(`\\{${n}\\}`,"g"),i);return s}function parseTemplate(e,t){let r=e;for(const[s,n]of Object.entries(t))r=r.replace(new RegExp(`\\{${s}\\}`,"g"),n);return r}function toCamelCase(e,t=/[/-]/){return e.replace(/^\/+/,"").split(t).filter(Boolean).map((r,s)=>s===0?r.toLowerCase():r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join("")}function toPascalCase(e,t=/[/-]/){return e.replace(/^\/+/,"").split(t).filter(Boolean).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join("")}function stripJsonComments(e){return e.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}exports.checkSourceExists=checkSourceExists,exports.copySourceToTarget=copySourceToTarget,exports.ensureTargetDir=ensureTargetDir,exports.fileExists=fileExists,exports.formatDate=formatDate,exports.generateRandomHash=generateRandomHash,exports.getDateFormatParams=getDateFormatParams,exports.padNumber=padNumber,exports.parseTemplate=parseTemplate,exports.readDirRecursive=readDirRecursive,exports.readFileContent=readFileContent,exports.readFileSync=readFileSync,exports.runWithConcurrency=runWithConcurrency,exports.shouldUpdateFile=shouldUpdateFile,exports.stripJsonComments=stripJsonComments,exports.toCamelCase=toCamelCase,exports.toPascalCase=toPascalCase,exports.writeFileContent=writeFileContent;
@@ -0,0 +1 @@
1
+ import s from"fs";import l from"path";import{randomBytes as j}from"crypto";const T=10;async function Y(u){try{await s.promises.access(u,s.constants.F_OK)}catch(t){const e=t;throw e.code==="ENOENT"?new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u6E90\u6587\u4EF6\u4E0D\u5B58\u5728 - ${u}`):e.code==="EACCES"?new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u8BBF\u95EE\u6E90\u6587\u4EF6 - ${u}`):new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u68C0\u67E5\u6E90\u6587\u4EF6\u65F6\u51FA\u9519 - ${u}\uFF0C\u9519\u8BEF\uFF1A${e.message}`)}}async function f(u){try{await s.promises.mkdir(u,{recursive:!0})}catch(t){const e=t;throw e.code==="EACCES"?new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u521B\u5EFA\u76EE\u6807\u76EE\u5F55 - ${u}`):new Error(`\u590D\u5236\u6587\u4EF6\u5931\u8D25\uFF1A\u521B\u5EFA\u76EE\u6807\u76EE\u5F55\u65F6\u51FA\u9519 - ${u}\uFF0C\u9519\u8BEF\uFF1A${e.message}`)}}async function h(u,t){const e=await s.promises.readdir(u,{withFileTypes:!0}),r=[];for(const n of e){const i=l.join(u,n.name),p=n.isFile(),c=n.isDirectory();if(r.push({path:i,isFile:p,isDirectory:c}),c&&t){const F=await h(i,t);r.push(...F)}}return r}async function A(u,t){try{const[e,r]=await Promise.all([s.promises.stat(u),s.promises.stat(t)]);return e.mtimeMs>r.mtimeMs||e.size!==r.size}catch{return!0}}async function g(u){try{return await s.promises.access(u,s.constants.F_OK),!0}catch{return!1}}async function S(u,t,e){const r=[];let n=0;async function i(){for(;n<u.length;){const c=n++,F=await t(u[c]);r[c]=F}}const p=Array(Math.min(e,u.length)).fill(null).map(()=>i());return await Promise.all(p),r}async function k(u,t,e){const r=Date.now(),{recursive:n,overwrite:i,incremental:p=!1,parallelLimit:c=T}=e;let F=0,D=0,C=0;if((await s.promises.stat(u)).isDirectory()){await f(t);const o=await h(u,n),y=o.filter(a=>a.isFile);C=o.filter(a=>a.isDirectory).length;const B=new Set;for(const a of y){const d=l.relative(u,a.path),m=l.dirname(l.join(t,d));B.add(m)}await Promise.all([...B].map(a=>f(a)));const x=await S(y,async a=>{const d=l.relative(u,a.path),m=l.join(t,d);let w=i;return w||(w=!await g(m)),p&&w&&(w=await A(a.path,m)),w?(await s.promises.copyFile(a.path,m),{copied:!0,skipped:!1}):{copied:!1,skipped:!0}},c);for(const a of x)a.copied&&F++,a.skipped&&D++}else{await f(l.dirname(t));let o=i;o||(o=!await g(t)),p&&o&&(o=await A(u,t)),o?(await s.promises.copyFile(u,t),F++):D++}const M=Date.now()-r;return{copiedFiles:F,skippedFiles:D,copiedDirs:C,executionTime:M}}async function v(u,t){try{await s.promises.writeFile(u,t,"utf-8")}catch(e){const r=e;throw r.code==="EACCES"?new Error(`\u5199\u5165\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u5199\u5165\u6587\u4EF6 - ${u}`):new Error(`\u5199\u5165\u6587\u4EF6\u5931\u8D25\uFF1A\u5199\u5165\u6587\u4EF6\u65F6\u51FA\u9519 - ${u}\uFF0C\u9519\u8BEF\uFF1A${r.message}`)}}async function O(u){try{return await s.promises.readFile(u,"utf-8")}catch(t){const e=t;throw e.code==="EACCES"?new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u8BFB\u53D6\u6587\u4EF6 - ${u}`):new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u8BFB\u53D6\u6587\u4EF6\u65F6\u51FA\u9519 - ${u}\uFF0C\u9519\u8BEF\uFF1A${e.message}`)}}function P(u){try{return s.readFileSync(u,"utf-8")}catch(t){const e=t;throw e.code==="EACCES"?new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u6CA1\u6709\u6743\u9650\u8BFB\u53D6\u6587\u4EF6 - ${u}`):new Error(`\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\uFF1A\u8BFB\u53D6\u6587\u4EF6\u65F6\u51FA\u9519 - ${u}\uFF0C\u9519\u8BEF\uFF1A${e.message}`)}}function E(u,t=2){return u.toString().padStart(t,"0")}function b(u=8){const t=Math.max(1,Math.min(64,u));return j(Math.ceil(t/2)).toString("hex").slice(0,t)}function $(u=new Date){return{YYYY:u.getFullYear().toString(),YY:u.getFullYear().toString().slice(-2),MM:E(u.getMonth()+1),DD:E(u.getDate()),HH:E(u.getHours()),mm:E(u.getMinutes()),ss:E(u.getSeconds()),SSS:E(u.getMilliseconds(),3),timestamp:u.getTime().toString()}}function H(u,t){const e=$(u);let r=t;for(const[n,i]of Object.entries(e))r=r.replace(new RegExp(`\\{${n}\\}`,"g"),i);return r}function L(u,t){let e=u;for(const[r,n]of Object.entries(t))e=e.replace(new RegExp(`\\{${r}\\}`,"g"),n);return e}function R(u,t=/[/-]/){return u.replace(/^\/+/,"").split(t).filter(Boolean).map((e,r)=>r===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function N(u,t=/[/-]/){return u.replace(/^\/+/,"").split(t).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}function U(u){return u.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}export{k as a,H as b,Y as c,$ as d,f as e,g as f,b as g,L as h,O as i,P as j,S as k,U as l,N as m,E as p,h as r,A as s,R as t,v as w};
@@ -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};
@@ -56,6 +56,22 @@ declare class Logger {
56
56
  * @param enabled 是否启用日志
57
57
  */
58
58
  private registerPlugin;
59
+ /**
60
+ * 注销插件日志配置
61
+ * @param pluginName 插件名称
62
+ */
63
+ private unregisterPlugin;
64
+ /**
65
+ * 注销指定插件的日志配置
66
+ * @param pluginName 插件名称
67
+ * @description 从单例中移除指定插件的日志配置,通常在插件销毁时调用
68
+ */
69
+ static unregister(pluginName: string): void;
70
+ /**
71
+ * 销毁单例实例,释放所有资源
72
+ * @description 清除所有已注册的插件配置,重置单例实例。主要用于测试场景
73
+ */
74
+ static destroy(): void;
59
75
  /**
60
76
  * 生成日志前缀
61
77
  * @param pluginName 插件名称
@@ -56,6 +56,22 @@ declare class Logger {
56
56
  * @param enabled 是否启用日志
57
57
  */
58
58
  private registerPlugin;
59
+ /**
60
+ * 注销插件日志配置
61
+ * @param pluginName 插件名称
62
+ */
63
+ private unregisterPlugin;
64
+ /**
65
+ * 注销指定插件的日志配置
66
+ * @param pluginName 插件名称
67
+ * @description 从单例中移除指定插件的日志配置,通常在插件销毁时调用
68
+ */
69
+ static unregister(pluginName: string): void;
70
+ /**
71
+ * 销毁单例实例,释放所有资源
72
+ * @description 清除所有已注册的插件配置,重置单例实例。主要用于测试场景
73
+ */
74
+ static destroy(): void;
59
75
  /**
60
76
  * 生成日志前缀
61
77
  * @param pluginName 插件名称
@@ -56,6 +56,22 @@ declare class Logger {
56
56
  * @param enabled 是否启用日志
57
57
  */
58
58
  private registerPlugin;
59
+ /**
60
+ * 注销插件日志配置
61
+ * @param pluginName 插件名称
62
+ */
63
+ private unregisterPlugin;
64
+ /**
65
+ * 注销指定插件的日志配置
66
+ * @param pluginName 插件名称
67
+ * @description 从单例中移除指定插件的日志配置,通常在插件销毁时调用
68
+ */
69
+ static unregister(pluginName: string): void;
70
+ /**
71
+ * 销毁单例实例,释放所有资源
72
+ * @description 清除所有已注册的插件配置,重置单例实例。主要用于测试场景
73
+ */
74
+ static destroy(): void;
59
75
  /**
60
76
  * 生成日志前缀
61
77
  * @param pluginName 插件名称
@@ -0,0 +1 @@
1
+ "use strict";const logger_index=require("../logger/index.cjs");require("fs"),require("path"),require("crypto");const validation=require("./vite-plugin.IGZeStMa.cjs");class BasePlugin{options;logger;validator;viteConfig=null;constructor(e,r){this.options=this.mergeOptions(e),this.logger=this.initLogger(r),this.validator=new validation.Validator(this.options),this.safeExecuteSync(()=>this.validateOptions(),"\u63D2\u4EF6\u914D\u7F6E\u9A8C\u8BC1")}getDefaultOptions(){return{}}mergeOptions(e){const r={enabled:!0,verbose:!0,errorStrategy:"throw"},t=this.getDefaultOptions();return validation.deepMerge(r,t,e)}initLogger(e){return logger_index.Logger.create({name:this.getPluginName(),enabled:this.options.verbose,...e}).createPluginLogger(this.getPluginName())}validateOptions(){}getEnforce(){}onConfigResolved(e){this.viteConfig=e,this.logger.info("\u914D\u7F6E\u89E3\u6790\u5B8C\u6210\uFF0C\u63D2\u4EF6\u5DF2\u521D\u59CB\u5316")}destroy(){logger_index.Logger.unregister(this.getPluginName())}safeExecuteSync(e,r){try{return e()}catch(t){return this.handleError(t,r)}}async safeExecute(e,r){try{return await e()}catch(t){return this.handleError(t,r)}}handleError(e,r){let t=`${r}: `;switch(e instanceof Error?t+=e.message:typeof e=="string"?t+=e:t+=String(e),this.options.errorStrategy){case"throw":throw this.logger.error(t),e;case"log":case"ignore":this.logger.error(t);return;default:throw this.logger.error(t),e}}toPlugin(){const e={name:this.getPluginName(),enforce:this.getEnforce()};this.addPluginHooks(e);const r=e.configResolved;e.configResolved=o=>{this.options.enabled&&(this.onConfigResolved(o),typeof r=="function"&&r(o))};const t=this,n=e.closeBundle;return e.closeBundle=function(){typeof n=="function"&&n.call(this),t.destroy()},e}}function createPluginFactory(i,e){return r=>{const t=e?e(r):r,n=new i(t),o=n.toPlugin();return o.pluginInstance=n,o}}exports.BasePlugin=BasePlugin,exports.createPluginFactory=createPluginFactory;
@@ -0,0 +1 @@
1
+ import{Logger as s}from"../logger/index.mjs";import"fs";import"path";import"crypto";import{V as u,d as g}from"./vite-plugin.B88RyRN8.mjs";class a{options;logger;validator;viteConfig=null;constructor(t,r){this.options=this.mergeOptions(t),this.logger=this.initLogger(r),this.validator=new u(this.options),this.safeExecuteSync(()=>this.validateOptions(),"\u63D2\u4EF6\u914D\u7F6E\u9A8C\u8BC1")}getDefaultOptions(){return{}}mergeOptions(t){const r={enabled:!0,verbose:!0,errorStrategy:"throw"},e=this.getDefaultOptions();return g(r,e,t)}initLogger(t){return s.create({name:this.getPluginName(),enabled:this.options.verbose,...t}).createPluginLogger(this.getPluginName())}validateOptions(){}getEnforce(){}onConfigResolved(t){this.viteConfig=t,this.logger.info("\u914D\u7F6E\u89E3\u6790\u5B8C\u6210\uFF0C\u63D2\u4EF6\u5DF2\u521D\u59CB\u5316")}destroy(){s.unregister(this.getPluginName())}safeExecuteSync(t,r){try{return t()}catch(e){return this.handleError(e,r)}}async safeExecute(t,r){try{return await t()}catch(e){return this.handleError(e,r)}}handleError(t,r){let e=`${r}: `;switch(t instanceof Error?e+=t.message:typeof t=="string"?e+=t:e+=String(t),this.options.errorStrategy){case"throw":throw this.logger.error(e),t;case"log":case"ignore":this.logger.error(e);return;default:throw this.logger.error(e),t}}toPlugin(){const t={name:this.getPluginName(),enforce:this.getEnforce()};this.addPluginHooks(t);const r=t.configResolved;t.configResolved=n=>{this.options.enabled&&(this.onConfigResolved(n),typeof r=="function"&&r(n))};const e=this,o=t.closeBundle;return t.closeBundle=function(){typeof o=="function"&&o.call(this),e.destroy()},t}}function l(i,t){return r=>{const e=t?t(r):r,o=new i(e),n=o.toPlugin();return n.pluginInstance=o,n}}export{a as B,l as c};
@@ -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;