@meng-xi/vite-plugin 0.1.4 → 0.1.6

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 (151) hide show
  1. package/README-en.md +34 -20
  2. package/README.md +33 -19
  3. package/dist/common/format/index.cjs +1 -1
  4. package/dist/common/format/index.d.cts +19 -114
  5. package/dist/common/format/index.d.mts +19 -114
  6. package/dist/common/format/index.d.ts +19 -114
  7. package/dist/common/format/index.mjs +1 -1
  8. package/dist/common/fs/index.cjs +1 -1
  9. package/dist/common/fs/index.d.cts +36 -89
  10. package/dist/common/fs/index.d.mts +36 -89
  11. package/dist/common/fs/index.d.ts +36 -89
  12. package/dist/common/fs/index.mjs +1 -1
  13. package/dist/common/html/index.cjs +2 -2
  14. package/dist/common/html/index.d.cts +12 -307
  15. package/dist/common/html/index.d.mts +12 -307
  16. package/dist/common/html/index.d.ts +12 -307
  17. package/dist/common/html/index.mjs +2 -2
  18. package/dist/common/index.cjs +1 -1
  19. package/dist/common/index.d.cts +7 -11
  20. package/dist/common/index.d.mts +7 -11
  21. package/dist/common/index.d.ts +7 -11
  22. package/dist/common/index.mjs +1 -1
  23. package/dist/common/script/index.cjs +1 -1
  24. package/dist/common/script/index.d.cts +1 -44
  25. package/dist/common/script/index.d.mts +1 -44
  26. package/dist/common/script/index.d.ts +1 -44
  27. package/dist/common/script/index.mjs +1 -1
  28. package/dist/common/ui/index.cjs +1 -1
  29. package/dist/common/ui/index.d.cts +1 -111
  30. package/dist/common/ui/index.d.mts +1 -111
  31. package/dist/common/ui/index.d.ts +1 -111
  32. package/dist/common/ui/index.mjs +1 -1
  33. package/dist/common/validation/index.cjs +1 -1
  34. package/dist/common/validation/index.d.cts +2 -80
  35. package/dist/common/validation/index.d.mts +2 -80
  36. package/dist/common/validation/index.d.ts +2 -80
  37. package/dist/common/validation/index.mjs +1 -1
  38. package/dist/factory/index.cjs +1 -1
  39. package/dist/factory/index.d.cts +1 -1
  40. package/dist/factory/index.d.mts +1 -1
  41. package/dist/factory/index.d.ts +1 -1
  42. package/dist/factory/index.mjs +1 -1
  43. package/dist/index.cjs +1 -1
  44. package/dist/index.d.cts +10 -12
  45. package/dist/index.d.mts +10 -12
  46. package/dist/index.d.ts +10 -12
  47. package/dist/index.mjs +1 -1
  48. package/dist/logger/index.d.cts +92 -1
  49. package/dist/logger/index.d.mts +92 -1
  50. package/dist/logger/index.d.ts +92 -1
  51. package/dist/plugins/autoImport/index.cjs +19 -0
  52. package/dist/plugins/autoImport/index.d.cts +291 -0
  53. package/dist/plugins/autoImport/index.d.mts +291 -0
  54. package/dist/plugins/autoImport/index.d.ts +291 -0
  55. package/dist/plugins/autoImport/index.mjs +19 -0
  56. package/dist/plugins/buildProgress/index.cjs +1 -1
  57. package/dist/plugins/buildProgress/index.d.cts +1 -1
  58. package/dist/plugins/buildProgress/index.d.mts +1 -1
  59. package/dist/plugins/buildProgress/index.d.ts +1 -1
  60. package/dist/plugins/buildProgress/index.mjs +2 -2
  61. package/dist/plugins/bundleAnalyzer/index.cjs +21 -21
  62. package/dist/plugins/bundleAnalyzer/index.d.cts +1 -1
  63. package/dist/plugins/bundleAnalyzer/index.d.mts +1 -1
  64. package/dist/plugins/bundleAnalyzer/index.d.ts +1 -1
  65. package/dist/plugins/bundleAnalyzer/index.mjs +18 -18
  66. package/dist/plugins/compressAssets/index.cjs +1 -1
  67. package/dist/plugins/compressAssets/index.d.cts +1 -1
  68. package/dist/plugins/compressAssets/index.d.mts +1 -1
  69. package/dist/plugins/compressAssets/index.d.ts +1 -1
  70. package/dist/plugins/compressAssets/index.mjs +1 -1
  71. package/dist/plugins/copyFile/index.cjs +1 -1
  72. package/dist/plugins/copyFile/index.d.cts +1 -1
  73. package/dist/plugins/copyFile/index.d.mts +1 -1
  74. package/dist/plugins/copyFile/index.d.ts +1 -1
  75. package/dist/plugins/copyFile/index.mjs +1 -1
  76. package/dist/plugins/envGuard/index.cjs +11 -11
  77. package/dist/plugins/envGuard/index.d.cts +101 -2
  78. package/dist/plugins/envGuard/index.d.mts +101 -2
  79. package/dist/plugins/envGuard/index.d.ts +101 -2
  80. package/dist/plugins/envGuard/index.mjs +9 -9
  81. package/dist/plugins/faviconManager/index.cjs +1 -1
  82. package/dist/plugins/faviconManager/index.d.cts +1 -1
  83. package/dist/plugins/faviconManager/index.d.mts +1 -1
  84. package/dist/plugins/faviconManager/index.d.ts +1 -1
  85. package/dist/plugins/faviconManager/index.mjs +1 -1
  86. package/dist/plugins/generateRouter/index.cjs +5 -4
  87. package/dist/plugins/generateRouter/index.d.cts +34 -1
  88. package/dist/plugins/generateRouter/index.d.mts +34 -1
  89. package/dist/plugins/generateRouter/index.d.ts +34 -1
  90. package/dist/plugins/generateRouter/index.mjs +5 -4
  91. package/dist/plugins/generateVersion/index.cjs +1 -1
  92. package/dist/plugins/generateVersion/index.d.cts +1 -1
  93. package/dist/plugins/generateVersion/index.d.mts +1 -1
  94. package/dist/plugins/generateVersion/index.d.ts +1 -1
  95. package/dist/plugins/generateVersion/index.mjs +1 -1
  96. package/dist/plugins/htmlInject/index.cjs +7 -1
  97. package/dist/plugins/htmlInject/index.d.cts +2 -2
  98. package/dist/plugins/htmlInject/index.d.mts +2 -2
  99. package/dist/plugins/htmlInject/index.d.ts +2 -2
  100. package/dist/plugins/htmlInject/index.mjs +7 -1
  101. package/dist/plugins/index.cjs +1 -1
  102. package/dist/plugins/index.d.cts +3 -3
  103. package/dist/plugins/index.d.mts +3 -3
  104. package/dist/plugins/index.d.ts +3 -3
  105. package/dist/plugins/index.mjs +1 -1
  106. package/dist/plugins/loadingManager/index.cjs +26 -26
  107. package/dist/plugins/loadingManager/index.d.cts +1 -1
  108. package/dist/plugins/loadingManager/index.d.mts +1 -1
  109. package/dist/plugins/loadingManager/index.d.ts +1 -1
  110. package/dist/plugins/loadingManager/index.mjs +10 -10
  111. package/dist/plugins/versionUpdateChecker/index.cjs +5 -5
  112. package/dist/plugins/versionUpdateChecker/index.d.cts +1 -1
  113. package/dist/plugins/versionUpdateChecker/index.d.mts +1 -1
  114. package/dist/plugins/versionUpdateChecker/index.d.ts +1 -1
  115. package/dist/plugins/versionUpdateChecker/index.mjs +6 -6
  116. package/dist/shared/vite-plugin.B8FuZce1.d.cts +45 -0
  117. package/dist/shared/vite-plugin.B8FuZce1.d.mts +45 -0
  118. package/dist/shared/vite-plugin.B8FuZce1.d.ts +45 -0
  119. package/dist/shared/{vite-plugin.FfJ-Wwfu.d.cts → vite-plugin.BI9taN75.d.cts} +1 -22
  120. package/dist/shared/{vite-plugin.FfJ-Wwfu.d.mts → vite-plugin.BI9taN75.d.mts} +1 -22
  121. package/dist/shared/{vite-plugin.FfJ-Wwfu.d.ts → vite-plugin.BI9taN75.d.ts} +1 -22
  122. package/dist/shared/vite-plugin.CcvHfrL8.cjs +1 -0
  123. package/dist/shared/vite-plugin.CuXEJAWX.mjs +1 -0
  124. package/package.json +7 -17
  125. package/dist/common/compress/index.cjs +0 -1
  126. package/dist/common/compress/index.d.cts +0 -23
  127. package/dist/common/compress/index.d.mts +0 -23
  128. package/dist/common/compress/index.d.ts +0 -23
  129. package/dist/common/compress/index.mjs +0 -1
  130. package/dist/common/object/index.cjs +0 -1
  131. package/dist/common/object/index.d.cts +0 -30
  132. package/dist/common/object/index.d.mts +0 -30
  133. package/dist/common/object/index.d.ts +0 -30
  134. package/dist/common/object/index.mjs +0 -1
  135. package/dist/common/path/index.cjs +0 -1
  136. package/dist/common/path/index.d.cts +0 -22
  137. package/dist/common/path/index.d.mts +0 -22
  138. package/dist/common/path/index.d.ts +0 -22
  139. package/dist/common/path/index.mjs +0 -1
  140. package/dist/shared/vite-plugin.BCuhU1au.mjs +0 -7
  141. package/dist/shared/vite-plugin.BrI73DHA.cjs +0 -7
  142. package/dist/shared/vite-plugin.CLr0ttuO.d.cts +0 -135
  143. package/dist/shared/vite-plugin.CLr0ttuO.d.mts +0 -135
  144. package/dist/shared/vite-plugin.CLr0ttuO.d.ts +0 -135
  145. package/dist/shared/vite-plugin.CmtcnItg.d.cts +0 -261
  146. package/dist/shared/vite-plugin.CmtcnItg.d.mts +0 -261
  147. package/dist/shared/vite-plugin.CmtcnItg.d.ts +0 -261
  148. package/dist/shared/vite-plugin.DnFDPjNf.mjs +0 -1
  149. package/dist/shared/vite-plugin.Dumot0up.mjs +0 -1
  150. package/dist/shared/vite-plugin.soT9a-KD.cjs +0 -1
  151. package/dist/shared/vite-plugin.vwox4bU0.cjs +0 -1
@@ -1,9 +1,108 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
- import { E as EnvFieldRule, b as EnvValidationResult } from '../../shared/vite-plugin.CmtcnItg.mjs';
3
2
  import 'vite';
4
- import '../../shared/vite-plugin.CLr0ttuO.mjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.mjs';
5
4
  import '../../shared/vite-plugin.DRRlWY8P.mjs';
6
5
 
6
+ /**
7
+ * 环境变量值类型
8
+ *
9
+ * @description 定义环境变量支持的所有值类型:
10
+ * - `string`:普通字符串(默认类型)
11
+ * - `number`:数字类型
12
+ * - `url`:URL 地址
13
+ * - `boolean`:布尔值
14
+ * - `enum`:枚举值
15
+ * - `json`:JSON 字符串
16
+ * - `semver`:语义化版本号
17
+ * - `path`:文件路径
18
+ */
19
+ type EnvType = 'string' | 'number' | 'url' | 'boolean' | 'enum' | 'json' | 'semver' | 'path';
20
+ /**
21
+ * 环境变量字段校验规则
22
+ *
23
+ * @description 定义单个环境变量的校验规则,包括类型约束、范围限制、
24
+ * 自定义验证函数和元数据信息等。
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // 基本字符串字段
29
+ * const rule: EnvFieldRule = { type: 'string', required: true }
30
+ *
31
+ * // 带范围的数字字段
32
+ * const portRule: EnvFieldRule = { type: 'number', required: true, minValue: 1, maxValue: 65535 }
33
+ *
34
+ * // 枚举字段
35
+ * const envRule: EnvFieldRule = { type: 'enum', required: true, enumValues: ['development', 'staging', 'production'] }
36
+ *
37
+ * // 自定义验证
38
+ * const customRule: EnvFieldRule = {
39
+ * type: 'string',
40
+ * required: true,
41
+ * validator: (v) => v.startsWith('https://') || '必须使用 HTTPS'
42
+ * }
43
+ * ```
44
+ */
45
+ interface EnvFieldRule {
46
+ /** 值类型,默认为 `'string'` */
47
+ type?: EnvType;
48
+ /** 是否为必需字段,默认为 `true` */
49
+ required?: boolean;
50
+ /** 正则表达式,值必须匹配此模式 */
51
+ pattern?: RegExp;
52
+ /**
53
+ * 自定义验证函数
54
+ *
55
+ * @description 返回 `true` 表示验证通过,返回字符串表示验证失败且字符串为错误消息
56
+ */
57
+ validator?: (value: string) => boolean | string;
58
+ /** 自定义错误消息,覆盖默认的错误提示 */
59
+ message?: string;
60
+ /** 当值为空时使用的默认值 */
61
+ default?: string;
62
+ /** 枚举值列表(仅 `enum` 类型需要) */
63
+ enumValues?: string[];
64
+ /** 数值最小值(仅 `number` 类型) */
65
+ minValue?: number;
66
+ /** 数值最大值(仅 `number` 类型) */
67
+ maxValue?: number;
68
+ /** 字符串最小长度(仅字符串类类型) */
69
+ minLength?: number;
70
+ /** 字符串最大长度(仅字符串类类型) */
71
+ maxLength?: number;
72
+ /** 变量分组名称,用于模板生成时的分组显示 */
73
+ group?: string;
74
+ /** 变量描述信息,用于模板生成时的说明文本 */
75
+ description?: string;
76
+ /** 是否为敏感变量,模板中会隐藏实际值 */
77
+ sensitive?: boolean;
78
+ }
79
+ /**
80
+ * 环境变量验证结果
81
+ *
82
+ * @description 表示单个环境变量的验证结果,包含验证状态、错误消息和有效值。
83
+ */
84
+ interface EnvValidationResult {
85
+ /** 环境变量名 */
86
+ key: string;
87
+ /**
88
+ * 验证状态:
89
+ * - `pass`:验证通过
90
+ * - `missing`:必需变量缺失
91
+ * - `type_error`:类型不匹配
92
+ * - `custom_error`:自定义验证失败或正则不匹配
93
+ * - `enum_mismatch`:枚举值不匹配
94
+ * - `range_error`:数值超出范围
95
+ * - `length_error`:字符串长度不符合要求
96
+ */
97
+ status: 'pass' | 'missing' | 'type_error' | 'custom_error' | 'enum_mismatch' | 'range_error' | 'length_error';
98
+ /** 验证消息(验证通过时为空字符串,失败时为错误描述) */
99
+ message: string;
100
+ /** 环境变量的有效值(缺失时可能为 `undefined` 或默认值) */
101
+ value: string | undefined;
102
+ /** 应用的校验规则(含默认值填充后的完整规则) */
103
+ rule: EnvFieldRule;
104
+ }
105
+
7
106
  /**
8
107
  * 环境变量校验失败时的处理动作
9
108
  *
@@ -1,9 +1,108 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
- import { E as EnvFieldRule, b as EnvValidationResult } from '../../shared/vite-plugin.CmtcnItg.js';
3
2
  import 'vite';
4
- import '../../shared/vite-plugin.CLr0ttuO.js';
3
+ import '../../shared/vite-plugin.B8FuZce1.js';
5
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
6
5
 
6
+ /**
7
+ * 环境变量值类型
8
+ *
9
+ * @description 定义环境变量支持的所有值类型:
10
+ * - `string`:普通字符串(默认类型)
11
+ * - `number`:数字类型
12
+ * - `url`:URL 地址
13
+ * - `boolean`:布尔值
14
+ * - `enum`:枚举值
15
+ * - `json`:JSON 字符串
16
+ * - `semver`:语义化版本号
17
+ * - `path`:文件路径
18
+ */
19
+ type EnvType = 'string' | 'number' | 'url' | 'boolean' | 'enum' | 'json' | 'semver' | 'path';
20
+ /**
21
+ * 环境变量字段校验规则
22
+ *
23
+ * @description 定义单个环境变量的校验规则,包括类型约束、范围限制、
24
+ * 自定义验证函数和元数据信息等。
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // 基本字符串字段
29
+ * const rule: EnvFieldRule = { type: 'string', required: true }
30
+ *
31
+ * // 带范围的数字字段
32
+ * const portRule: EnvFieldRule = { type: 'number', required: true, minValue: 1, maxValue: 65535 }
33
+ *
34
+ * // 枚举字段
35
+ * const envRule: EnvFieldRule = { type: 'enum', required: true, enumValues: ['development', 'staging', 'production'] }
36
+ *
37
+ * // 自定义验证
38
+ * const customRule: EnvFieldRule = {
39
+ * type: 'string',
40
+ * required: true,
41
+ * validator: (v) => v.startsWith('https://') || '必须使用 HTTPS'
42
+ * }
43
+ * ```
44
+ */
45
+ interface EnvFieldRule {
46
+ /** 值类型,默认为 `'string'` */
47
+ type?: EnvType;
48
+ /** 是否为必需字段,默认为 `true` */
49
+ required?: boolean;
50
+ /** 正则表达式,值必须匹配此模式 */
51
+ pattern?: RegExp;
52
+ /**
53
+ * 自定义验证函数
54
+ *
55
+ * @description 返回 `true` 表示验证通过,返回字符串表示验证失败且字符串为错误消息
56
+ */
57
+ validator?: (value: string) => boolean | string;
58
+ /** 自定义错误消息,覆盖默认的错误提示 */
59
+ message?: string;
60
+ /** 当值为空时使用的默认值 */
61
+ default?: string;
62
+ /** 枚举值列表(仅 `enum` 类型需要) */
63
+ enumValues?: string[];
64
+ /** 数值最小值(仅 `number` 类型) */
65
+ minValue?: number;
66
+ /** 数值最大值(仅 `number` 类型) */
67
+ maxValue?: number;
68
+ /** 字符串最小长度(仅字符串类类型) */
69
+ minLength?: number;
70
+ /** 字符串最大长度(仅字符串类类型) */
71
+ maxLength?: number;
72
+ /** 变量分组名称,用于模板生成时的分组显示 */
73
+ group?: string;
74
+ /** 变量描述信息,用于模板生成时的说明文本 */
75
+ description?: string;
76
+ /** 是否为敏感变量,模板中会隐藏实际值 */
77
+ sensitive?: boolean;
78
+ }
79
+ /**
80
+ * 环境变量验证结果
81
+ *
82
+ * @description 表示单个环境变量的验证结果,包含验证状态、错误消息和有效值。
83
+ */
84
+ interface EnvValidationResult {
85
+ /** 环境变量名 */
86
+ key: string;
87
+ /**
88
+ * 验证状态:
89
+ * - `pass`:验证通过
90
+ * - `missing`:必需变量缺失
91
+ * - `type_error`:类型不匹配
92
+ * - `custom_error`:自定义验证失败或正则不匹配
93
+ * - `enum_mismatch`:枚举值不匹配
94
+ * - `range_error`:数值超出范围
95
+ * - `length_error`:字符串长度不符合要求
96
+ */
97
+ status: 'pass' | 'missing' | 'type_error' | 'custom_error' | 'enum_mismatch' | 'range_error' | 'length_error';
98
+ /** 验证消息(验证通过时为空字符串,失败时为错误描述) */
99
+ message: string;
100
+ /** 环境变量的有效值(缺失时可能为 `undefined` 或默认值) */
101
+ value: string | undefined;
102
+ /** 应用的校验规则(含默认值填充后的完整规则) */
103
+ rule: EnvFieldRule;
104
+ }
105
+
7
106
  /**
8
107
  * 环境变量校验失败时的处理动作
9
108
  *
@@ -1,12 +1,12 @@
1
- import{createPluginFactory as v,BasePlugin as F}from"../../factory/index.mjs";import{v as A}from"../../shared/vite-plugin.DnFDPjNf.mjs";import{injectBeforeTag as E}from"../../common/html/index.mjs";import{writeFileContent as h}from"../../common/fs/index.mjs";import{formatDate as y}from"../../common/format/index.mjs";import p from"node:path";import m from"node:fs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../shared/vite-plugin.BCuhU1au.mjs";import"../../common/script/index.mjs";import"fs";import"path";import"crypto";function D(r){const i=new Map,s=[];for(const[t,e]of Object.entries(r)){const o={type:"string",required:!0,...e};if(o.group){const n=i.get(o.group)||[];n.push({key:t,rule:o}),i.set(o.group,n)}else s.push({key:t,rule:o})}const u=[];u.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),u.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),u.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),u.push(""),s.length>0&&g(u,"\u901A\u7528\u914D\u7F6E",s);for(const[t,e]of i)g(u,t,e);return u.join(`
2
- `)}function g(r,i,s){r.push("# =============================="),r.push(`# ${i}`),r.push("# =============================="),r.push("");for(const{key:u,rule:t}of s){t.description&&r.push(`# ${t.description}`);const e=[];e.push(`\u7C7B\u578B: ${t.type||"string"}`),e.push(t.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),t.enumValues&&t.enumValues.length>0&&e.push(`\u679A\u4E3E\u503C: ${t.enumValues.join(" | ")}`),t.minValue!==void 0&&e.push(`\u6700\u5C0F\u503C: ${t.minValue}`),t.maxValue!==void 0&&e.push(`\u6700\u5927\u503C: ${t.maxValue}`),t.minLength!==void 0&&e.push(`\u6700\u5C0F\u957F\u5EA6: ${t.minLength}`),t.maxLength!==void 0&&e.push(`\u6700\u5927\u957F\u5EA6: ${t.maxLength}`),t.sensitive&&e.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),r.push(`# [${e.join(" | ")}]`),t.default!==void 0?r.push(`${u}=${t.sensitive?"********":t.default}`):r.push(`${u}=`),r.push("")}}function C(r,i,s,u){const t=[];for(const[a,l]of Object.entries(r))l.required!==!1&&t.push({key:a,rule:{type:"string",required:!0,...l}});if(t.length===0)return"";const e=u.filter(a=>a.status!=="pass"),o=t.map(({key:a,rule:l})=>({key:a,type:l.type||"string",description:l.description||""})),n=JSON.stringify(o,null,2),d=e.map(a=>a.key),f=JSON.stringify(d),c=R(s);return`<script>
1
+ import{createPluginFactory as v,BasePlugin as F}from"../../factory/index.mjs";import{formatDate as A}from"../../common/format/index.mjs";import{injectBeforeTag as E}from"../../common/html/index.mjs";import{writeFileContent as g}from"../../common/fs/index.mjs";import m from"node:path";import p from"node:fs";import"../../logger/index.mjs";import"../../shared/vite-plugin.DcExl6jd.mjs";import"../../shared/vite-plugin.CuXEJAWX.mjs";import"fs";import"path";const C=new Set(["string","url","path","enum","semver",void 0]);function D(t,u){switch(u.type){case"number":{if(isNaN(Number(t))||t.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(t)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const r=t.toLowerCase();if(!["true","false","1","0","yes","no"].includes(r))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u5E03\u5C14\u503C (true/false/1/0/yes/no)`};break}case"enum":{if(!u.enumValues||u.enumValues.length===0)return{valid:!1,status:"enum_mismatch",message:"enum \u7C7B\u578B\u5FC5\u987B\u6307\u5B9A enumValues"};if(!u.enumValues.includes(t))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${u.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(t)}catch{return{valid:!1,status:"type_error",message:"\u73AF\u5883\u53D8\u91CF\u503C\u4E0D\u662F\u5408\u6CD5 JSON"}}break}case"semver":{if(!/^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(t))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${t}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function y(t,u){if(u.type!=="number")return{valid:!0,status:"pass",message:""};const r=Number(t);return u.minValue!==void 0&&r<u.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5C0F\u4E8E\u6700\u5C0F\u503C ${u.minValue}`}:u.maxValue!==void 0&&r>u.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${r} \u5927\u4E8E\u6700\u5927\u503C ${u.maxValue}`}:{valid:!0,status:"pass",message:""}}function $(t,u){return C.has(u.type)?u.minLength!==void 0&&t.length<u.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${u.minLength}`}:u.maxLength!==void 0&&t.length>u.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${t.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${u.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function R(t,u,r){const e={type:"string",required:!0,...r};if(u===void 0||u==="")return e.required!==!1?{key:t,status:"missing",message:e.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${t}`,value:u,rule:e}:{key:t,status:"pass",message:"",value:e.default??u,rule:e};const s=D(u,e);if(!s.valid)return{key:t,status:s.status,message:e.message||s.message,value:u,rule:e};const i=y(u,e);if(!i.valid)return{key:t,status:i.status,message:e.message||i.message,value:u,rule:e};const n=$(u,e);if(!n.valid)return{key:t,status:n.status,message:e.message||n.message,value:u,rule:e};if(e.pattern&&!e.pattern.test(u))return{key:t,status:"custom_error",message:e.message||`\u73AF\u5883\u53D8\u91CF ${t} \u4E0D\u5339\u914D\u6B63\u5219: ${e.pattern.source}`,value:u,rule:e};if(e.validator){const a=e.validator(u);if(a!==!0){const l=typeof a=="string"?a:"";return{key:t,status:"custom_error",message:e.message||l||`\u73AF\u5883\u53D8\u91CF ${t} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:u,rule:e}}}return{key:t,status:"pass",message:"",value:u,rule:e}}function w(t,u){const r=[];for(const[e,s]of Object.entries(u)){const i=t[e];r.push(R(e,i,s))}return r}function _(t){const u=new Map,r=[];for(const[s,i]of Object.entries(t)){const n={type:"string",required:!0,...i};if(n.group){const a=u.get(n.group)||[];a.push({key:s,rule:n}),u.set(n.group,a)}else r.push({key:s,rule:n})}const e=[];e.push("# \u73AF\u5883\u53D8\u91CF\u6A21\u677F\u6587\u4EF6"),e.push(`# \u751F\u6210\u65F6\u95F4: ${new Date().toISOString()}`),e.push("# \u7531 @meng-xi/vite-plugin envGuard \u81EA\u52A8\u751F\u6210"),e.push(""),r.length>0&&h(e,"\u901A\u7528\u914D\u7F6E",r);for(const[s,i]of u)h(e,s,i);return e.join(`
2
+ `)}function h(t,u,r){t.push("# =============================="),t.push(`# ${u}`),t.push("# =============================="),t.push("");for(const{key:e,rule:s}of r){s.description&&t.push(`# ${s.description}`);const i=[];i.push(`\u7C7B\u578B: ${s.type||"string"}`),i.push(s.required!==!1?"\u5FC5\u9700":"\u53EF\u9009"),s.enumValues&&s.enumValues.length>0&&i.push(`\u679A\u4E3E\u503C: ${s.enumValues.join(" | ")}`),s.minValue!==void 0&&i.push(`\u6700\u5C0F\u503C: ${s.minValue}`),s.maxValue!==void 0&&i.push(`\u6700\u5927\u503C: ${s.maxValue}`),s.minLength!==void 0&&i.push(`\u6700\u5C0F\u957F\u5EA6: ${s.minLength}`),s.maxLength!==void 0&&i.push(`\u6700\u5927\u957F\u5EA6: ${s.maxLength}`),s.sensitive&&i.push("\u26A0\uFE0F \u654F\u611F\u4FE1\u606F"),t.push(`# [${i.join(" | ")}]`),s.default!==void 0?t.push(`${e}=${s.sensitive?"********":s.default}`):t.push(`${e}=`),t.push("")}}function k(t,u,r,e){const s=[];for(const[o,d]of Object.entries(t))d.required!==!1&&s.push({key:o,rule:{type:"string",required:!0,...d}});if(s.length===0)return"";const i=e.filter(o=>o.status!=="pass"),n=s.map(({key:o,rule:d})=>({key:o,type:d.type||"string",description:d.description||""})),a=JSON.stringify(n,null,2),l=i.map(o=>o.key),f=JSON.stringify(l),c=B(r);return`<script>
3
3
  ${`
4
4
  (function() {
5
5
  'use strict';
6
- var GUARD_NAME = ${JSON.stringify(i)};
7
- var GUARD_DATA = ${n};
6
+ var GUARD_NAME = ${JSON.stringify(u)};
7
+ var GUARD_DATA = ${a};
8
8
  var FAILED_KEYS = ${f};
9
- var MODE = ${JSON.stringify(s)};
9
+ var MODE = ${JSON.stringify(r)};
10
10
 
11
11
  var missing = [];
12
12
  var invalid = [];
@@ -46,7 +46,7 @@ ${`
46
46
  }
47
47
  })();
48
48
  `.trim()}
49
- <\/script>`}function R(r){switch(r){case"console":return`
49
+ <\/script>`}function B(t){switch(t){case"console":return`
50
50
  var msgs = [];
51
51
  if (missing.length > 0) msgs.push('[EnvGuard] \u7F3A\u5C11\u73AF\u5883\u53D8\u91CF: ' + missing.join(', '));
52
52
  if (invalid.length > 0) msgs.push('[EnvGuard] \u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', '));
@@ -62,6 +62,6 @@ ${`
62
62
  if (missing.length > 0) html += '\u7F3A\u5C11: ' + missing.join(', ') + '<br>';
63
63
  if (invalid.length > 0) html += '\u6821\u9A8C\u5931\u8D25: ' + invalid.join(', ');
64
64
  overlay.innerHTML = html;
65
- document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}class $ extends F{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(i=>i===!1||typeof i=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(i){this.options.validateBeforeBuild&&(i.configResolved=s=>{this.viteConfig=s,this.runValidation()}),this.options.runtimeGuard&&(i.transformIndexHtml={order:"post",handler:s=>this.safeExecuteSync(()=>this.injectRuntimeGuard(s),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||s})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=A(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const i=this.viteConfig.root||process.cwd();for(const s of this.options.envFiles){const u=p.resolve(i,s);if(m.existsSync(u))try{this.parseAndLoadEnvFile(u)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${u}`)}}}parseAndLoadEnvFile(i){const s=m.readFileSync(i,"utf-8").split(`
66
- `);for(const u of s){const t=u.trim();if(!t||t.startsWith("#"))continue;const e=t.indexOf("=");if(e===-1)continue;const o=t.slice(0,e).trim();let n=t.slice(e+1).trim();(n.startsWith('"')&&n.endsWith('"')||n.startsWith("'")&&n.endsWith("'"))&&(n=n.slice(1,-1)),o.startsWith("VITE_")&&process.env[o]===void 0&&(process.env[o]=n)}}buildResult(){const i=this.validationResults.length,s=this.validationResults.filter(e=>e.status==="pass").length,u=this.validationResults.filter(e=>e.status==="missing").length,t=this.validationResults.filter(e=>e.status!=="pass"&&e.status!=="missing").length;return{timestamp:y(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:i,passed:s,missing:u,invalid:t,results:this.validationResults,allPassed:u===0&&t===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const i=this.validationResults.filter(e=>e.status==="missing").map(e=>e.key),s=this.validationResults.filter(e=>e.status!=="pass"&&e.status!=="missing"),u=[];i.length>0&&u.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${i.join(", ")}`);for(const e of s)u.push(`${e.key}: ${e.message}`);const t=u.join(`
67
- `);switch(this.options.failAction){case"error":throw new Error(t);case"warn":this.logger.warn(t);break}}writeEnvTemplate(){const i=this.viteConfig?.root||process.cwd(),s=p.resolve(i,this.options.templateOutput),u=D(this.options.required);this.safeExecuteSync(()=>{h(s,u),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const i=this.viteConfig?.build?.outDir||"dist",s=p.resolve(i,this.options.reportOutput);this.safeExecuteSync(()=>{const u=JSON.stringify(this.guardResult,(t,e)=>e instanceof RegExp?e.toString():typeof e=="function"?"[Function]":e,2);h(s,u),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:i,passed:s,missing:u,invalid:t,allPassed:e}=this.guardResult;if(e){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${i} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${i} | \u901A\u8FC7 ${s} | \u7F3A\u5931 ${u} | \u5931\u8D25 ${t}`);const o=this.validationResults.filter(n=>n.status!=="pass");for(const n of o){const d=n.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${d}] ${n.key}: ${n.message}`)}}injectRuntimeGuard(i){const s=C(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!s)return i;const u=E(i,"</head>",s);return u.injected?u.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),i)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const w=v($);export{w as envGuard};
65
+ document.addEventListener('DOMContentLoaded', function() { document.body.appendChild(overlay); });`;default:return""}}class b extends F{validationResults=[];guardResult=null;getDefaultOptions(){return{required:{},failAction:"error",generateTemplate:!0,templateOutput:".env.template",runtimeGuard:!1,runtimeGlobalName:"__ENV_GUARD__",runtimeGuardMode:"console",envFiles:[".env",".env.local",".env.production",".env.development"],autoLoadEnv:!0,reportOutput:!1,validateBeforeBuild:!0,showSummary:!0}}validateOptions(){this.validator.field("failAction").enum(["error","warn","ignore"]).field("generateTemplate").boolean().field("runtimeGuard").boolean().field("runtimeGuardMode").enum(["console","throw","overlay"]).field("autoLoadEnv").boolean().field("reportOutput").custom(u=>u===!1||typeof u=="string","reportOutput \u5FC5\u987B\u4E3A false \u6216\u5B57\u7B26\u4E32\u8DEF\u5F84").field("validateBeforeBuild").boolean().field("showSummary").boolean().validate()}getPluginName(){return"env-guard"}addPluginHooks(u){this.options.validateBeforeBuild&&(u.configResolved=r=>{this.viteConfig=r,this.runValidation()}),this.options.runtimeGuard&&(u.transformIndexHtml={order:"post",handler:r=>this.safeExecuteSync(()=>this.injectRuntimeGuard(r),"\u6CE8\u5165\u8FD0\u884C\u65F6\u5B88\u536B")||r})}runValidation(){this.options.autoLoadEnv&&this.loadEnvFiles(),this.validationResults=w(process.env,this.options.required),this.guardResult=this.buildResult(),this.options.generateTemplate&&this.writeEnvTemplate(),this.options.reportOutput&&this.writeReport(),this.options.showSummary&&this.logSummary(),this.handleResults()}loadEnvFiles(){if(!this.viteConfig)return;const u=this.viteConfig.root||process.cwd();for(const r of this.options.envFiles){const e=m.resolve(u,r);if(p.existsSync(e))try{this.parseAndLoadEnvFile(e)}catch{this.logger.warn(`\u52A0\u8F7D .env \u6587\u4EF6\u5931\u8D25: ${e}`)}}}parseAndLoadEnvFile(u){const r=p.readFileSync(u,"utf-8").split(`
66
+ `);for(const e of r){const s=e.trim();if(!s||s.startsWith("#"))continue;const i=s.indexOf("=");if(i===-1)continue;const n=s.slice(0,i).trim();let a=s.slice(i+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),n.startsWith("VITE_")&&process.env[n]===void 0&&(process.env[n]=a)}}buildResult(){const u=this.validationResults.length,r=this.validationResults.filter(i=>i.status==="pass").length,e=this.validationResults.filter(i=>i.status==="missing").length,s=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing").length;return{timestamp:A(new Date,"{YYYY}-{MM}-{DD}T{HH}:{mm}:{ss}"),total:u,passed:r,missing:e,invalid:s,results:this.validationResults,allPassed:e===0&&s===0}}handleResults(){if(!this.guardResult||this.guardResult.allPassed)return;const u=this.validationResults.filter(i=>i.status==="missing").map(i=>i.key),r=this.validationResults.filter(i=>i.status!=="pass"&&i.status!=="missing"),e=[];u.length>0&&e.push(`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${u.join(", ")}`);for(const i of r)e.push(`${i.key}: ${i.message}`);const s=e.join(`
67
+ `);switch(this.options.failAction){case"error":throw new Error(s);case"warn":this.logger.warn(s);break}}writeEnvTemplate(){const u=this.viteConfig?.root||process.cwd(),r=m.resolve(u,this.options.templateOutput),e=_(this.options.required);this.safeExecuteSync(()=>{g(r,e),this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6A21\u677F\u5DF2\u751F\u6210: ${this.options.templateOutput}`)},"\u751F\u6210 .env \u6A21\u677F")}writeReport(){if(!this.guardResult||!this.options.reportOutput)return;const u=this.viteConfig?.build?.outDir||"dist",r=m.resolve(u,this.options.reportOutput);this.safeExecuteSync(()=>{const e=JSON.stringify(this.guardResult,(s,i)=>i instanceof RegExp?i.toString():typeof i=="function"?"[Function]":i,2);g(r,e),this.logger.info(`\u6821\u9A8C\u62A5\u544A\u5DF2\u751F\u6210: ${this.options.reportOutput}`)},"\u751F\u6210\u6821\u9A8C\u62A5\u544A")}logSummary(){if(!this.guardResult)return;const{total:u,passed:r,missing:e,invalid:s,allPassed:i}=this.guardResult;if(i){this.logger.success(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u901A\u8FC7: ${u} \u4E2A\u53D8\u91CF\u5168\u90E8\u5408\u6CD5`);return}this.logger.info(`\u73AF\u5883\u53D8\u91CF\u6821\u9A8C\u7ED3\u679C: \u603B\u8BA1 ${u} | \u901A\u8FC7 ${r} | \u7F3A\u5931 ${e} | \u5931\u8D25 ${s}`);const n=this.validationResults.filter(a=>a.status!=="pass");for(const a of n){const l=a.status==="missing"?"\u7F3A\u5931":"\u5931\u8D25";this.logger.warn(` [${l}] ${a.key}: ${a.message}`)}}injectRuntimeGuard(u){const r=k(this.options.required,this.options.runtimeGlobalName,this.options.runtimeGuardMode,this.validationResults);if(!r)return u;const e=E(u,"</head>",r);return e.injected?e.html:(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8FD0\u884C\u65F6\u5B88\u536B\u4EE3\u7801\u672A\u80FD\u6CE8\u5165"),u)}getResult(){return this.guardResult}getValidationResults(){return[...this.validationResults]}}const x=v(b);export{x as envGuard};
@@ -1 +1 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("fs"),require("path"),require("../../shared/vite-plugin.BrI73DHA.cjs"),require("../../common/script/index.cjs");function generateIconTagDescriptors(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class f extends factory_index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validator.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=generateIconTagDescriptors(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=common_html_index.injectBeforeTag(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:r=!0,recursive:n=!0}=i;await common_fs_index.checkSourceExists(e);const s=await common_fs_index.copySourceToTarget(e,t,{recursive:n,overwrite:r,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${s.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${s.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${s.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const faviconManager=factory_index.createPluginFactory(f,u=>typeof u=="string"?{base:u}:u||{});exports.faviconManager=faviconManager;
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),validator=require("../../shared/vite-plugin.Bcg6RW2N.cjs"),common_html_index=require("../../common/html/index.cjs");require("../../logger/index.cjs"),require("fs"),require("path"),require("../../shared/vite-plugin.CcvHfrL8.cjs");function generateIconTagDescriptors(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class f extends factory_index.BasePlugin{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new validator.Validator(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=generateIconTagDescriptors(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=common_html_index.injectBeforeTag(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:r=!0,recursive:n=!0}=i;await common_fs_index.checkSourceExists(e);const s=await common_fs_index.copySourceToTarget(e,t,{recursive:n,overwrite:r,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${s.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${s.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${s.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const faviconManager=factory_index.createPluginFactory(f,u=>typeof u=="string"?{base:u}:u||{});exports.faviconManager=faviconManager;
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.cjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.cjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.mjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.mjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.js';
3
+ import '../../shared/vite-plugin.B8FuZce1.js';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
5
5
 
6
6
  /**
@@ -1 +1 @@
1
- import{createPluginFactory as n,BasePlugin as a}from"../../factory/index.mjs";import{checkSourceExists as c,copySourceToTarget as l}from"../../common/fs/index.mjs";import{V as g}from"../../shared/vite-plugin.DcExl6jd.mjs";import{injectBeforeTag as p}from"../../common/html/index.mjs";import"../../logger/index.mjs";import"../../common/object/index.mjs";import"fs";import"path";import"../../shared/vite-plugin.BCuhU1au.mjs";import"../../common/script/index.mjs";function F(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class h extends a{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new g(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=F(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=p(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:o=!0,recursive:s=!0}=i;await c(e);const r=await l(e,t,{recursive:s,overwrite:o,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const f=n(h,u=>typeof u=="string"?{base:u}:u||{});export{f as faviconManager};
1
+ import{createPluginFactory as n,BasePlugin as a}from"../../factory/index.mjs";import{checkSourceExists as c,copySourceToTarget as l}from"../../common/fs/index.mjs";import{V as g}from"../../shared/vite-plugin.DcExl6jd.mjs";import{injectBeforeTag as p}from"../../common/html/index.mjs";import"../../logger/index.mjs";import"fs";import"path";import"../../shared/vite-plugin.CuXEJAWX.mjs";function F(u){const i=[];if(u.link)return[];if(u.icons&&u.icons.length>0)for(const e of u.icons){const t={rel:e.rel,href:e.href};e.sizes&&(t.sizes=e.sizes),e.type&&(t.type=e.type),i.push({tag:"link",attrs:t,injectTo:"head"})}else if(u.url)i.push({tag:"link",attrs:{rel:"icon",href:u.url},injectTo:"head"});else{const e=u.base||"/",t=e.endsWith("/")?`${e}favicon.ico`:`${e}/favicon.ico`;i.push({tag:"link",attrs:{rel:"icon",href:t},injectTo:"head"})}return i}class h extends a{getDefaultOptions(){return{base:"/"}}validateOptions(){this.validator.field("base").string().field("url").string().field("link").string().field("icons").array(),this.options?.copyOptions&&(this.validator.field("copyOptions").object(),new g(this.options.copyOptions).field("sourceDir").required().string().field("targetDir").required().string().field("overwrite").boolean().field("recursive").boolean().validate()),this.validator.validate()}getPluginName(){return"favicon-manager"}getIconTagDescriptors(){if(!this.options.enabled)return this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),[];const i=F(this.options);return i.length>0&&this.logger.success(`\u6210\u529F\u6CE8\u5165 ${i.length} \u4E2A\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6`),i}injectCustomLinkTag(i){if(!this.options.enabled||!this.options.link)return i;const e=this.options.link,t=p(i,"</head>",e);return t.injected?(this.logger.success("\u6210\u529F\u6CE8\u5165\u81EA\u5B9A\u4E49\u56FE\u6807\u6807\u7B7E\u5230 HTML \u6587\u4EF6"),this.logger.info(` - ${e}`),t.html):(this.logger.warn("\u672A\u627E\u5230 </head> \u6807\u7B7E\uFF0C\u8DF3\u8FC7\u56FE\u6807\u6CE8\u5165"),i)}async copyFiles(){if(!this.options.enabled){this.logger.info("\u63D2\u4EF6\u5DF2\u7981\u7528\uFF0C\u8DF3\u8FC7\u6587\u4EF6\u590D\u5236");return}const{copyOptions:i}=this.options;if(!i)return;const{sourceDir:e,targetDir:t,overwrite:s=!0,recursive:o=!0}=i;await c(e);const r=await l(e,t,{recursive:o,overwrite:s,incremental:!0});this.logger.success(`\u56FE\u6807\u6587\u4EF6\u590D\u5236\u6210\u529F\uFF1A\u4ECE ${e} \u5230 ${t}`,`\u590D\u5236\u4E86 ${r.copiedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8DF3\u8FC7\u4E86 ${r.skippedFiles} \u4E2A\u6587\u4EF6\uFF0C\u8017\u65F6 ${r.executionTime}ms`)}addPluginHooks(i){i.transformIndexHtml={order:"pre",handler:e=>{if(this.options.link)return this.injectCustomLinkTag(e);const t=this.getIconTagDescriptors();return t.length>0?{html:e,tags:t}:e}},i.writeBundle=async()=>{await this.safeExecute(()=>this.copyFiles(),"\u56FE\u6807\u6587\u4EF6\u590D\u5236")}}}const f=n(h,u=>typeof u=="string"?{base:u}:u||{});export{f as faviconManager};
@@ -1,4 +1,5 @@
1
- "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),common_format_index=require("../../common/format/index.cjs"),f=require("path"),s=require("fs");require("../../logger/index.cjs"),require("../../common/object/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs"),require("crypto"),require("node:path");class R extends factory_index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"}}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(e){switch(this.options.nameStrategy){case"path":return e.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return common_format_index.toCamelCase(e);case"pascalCase":return common_format_index.toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return common_format_index.toCamelCase(e)}}extractMeta(e,u){const t={},a=e.style||{},r=this.options.metaMapping||{};for(const[o,n]of Object.entries(r))a[o]!==void 0&&(t[n]=a[o]);return this.tabBarPages.has(u)&&(t.isTab=!0),t}parsePageToRoute(e,u=""){const t=u?`/${u}/${e.path}`:`/${e.path}`,a=this.generateRouteName(t),r=this.extractMeta(e,t.replace(/^\//,"")),o={path:t,name:a};return Object.keys(r).length>0&&(o.meta=r),o}parsePagesJson(e){const u=[];if(!e.pages||!Array.isArray(e.pages)||e.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),u;if(this.tabBarPages.clear(),e.tabBar?.list)for(const t of e.tabBar.list)this.tabBarPages.add(t.pagePath);for(const t of e.pages)u.push(this.parsePageToRoute(t));if(this.options.includeSubPackages&&e.subPackages){for(const t of e.subPackages)if(t.pages&&Array.isArray(t.pages))for(const a of t.pages)u.push(this.parsePageToRoute(a,t.root))}return u}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
1
+ "use strict";const factory_index=require("../../factory/index.cjs"),common_fs_index=require("../../common/fs/index.cjs"),u$1=require("path"),s$1=require("fs");require("../../logger/index.cjs"),require("../../shared/vite-plugin.Bcg6RW2N.cjs");function toCamelCase(i,e=/[/-]/){return i.replace(/^\/+/,"").split(e).filter(Boolean).map((t,r)=>r===0?t.toLowerCase():t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function toPascalCase(i,e=/[/-]/){return i.replace(/^\/+/,"").split(e).filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function stripJsonComments(i){return i.replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"")}function s(i,e){return typeof e=="string"?"string":typeof e=="boolean"?e?"true":"false":typeof e=="number"?"number":"unknown"}function u(i){const e=Object.entries(i);return e.length===0?"{}":`{ ${e.map(([t,r])=>`${t}: ${s(t,r)}`).join("; ")} }`}function generateRouterDtsContent(i,e="@meng-xi/uni-router"){const t=[];t.push(`import '${e}'`),t.push(""),t.push(`declare module '${e}' {`),t.push(" interface RouteNameMap {");for(const r of i){const a=r.name||r.path;r.meta?.title&&t.push(` /** ${r.meta.title} */`);const o=r.meta?u(r.meta):"{}";t.push(` ${a}: { path: '${r.path}'; meta: ${o} }`)}return t.push(" }"),t.push("}"),t.join(`
2
+ `)}class y extends factory_index.BasePlugin{projectRoot=process.cwd();tabBarPages=new Set;watcher=null;getDefaultOptions(){return{pagesJsonPath:"src/pages.json",outputPath:"src/router.config.ts",outputFormat:"ts",nameStrategy:"camelCase",includeSubPackages:!0,watch:!0,exportTypes:!0,preserveRouteChanges:!0,metaMapping:{navigationBarTitleText:"title",requireAuth:"requireAuth"},dts:!1}}validateOptions(){if(this.validator.field("pagesJsonPath").string().field("outputPath").string().field("outputFormat").enum(["ts","js"]).field("nameStrategy").enum(["path","camelCase","pascalCase","custom"]).validate(),this.options.nameStrategy==="custom"&&!this.options.customNameGenerator)throw new Error("\u5F53 nameStrategy \u4E3A custom \u65F6\uFF0C\u5FC5\u987B\u63D0\u4F9B customNameGenerator")}getPluginName(){return"generate-router"}generateRouteName(e){switch(this.options.nameStrategy){case"path":return e.replace(/\//g,"_").replace(/^_/,"");case"camelCase":return toCamelCase(e);case"pascalCase":return toPascalCase(e);case"custom":return this.options.customNameGenerator(e);default:return toCamelCase(e)}}extractMeta(e,t){const r={},a=e.style||{},o=this.options.metaMapping||{};for(const[n,c]of Object.entries(o))a[n]!==void 0&&(r[c]=a[n]);return this.tabBarPages.has(t)&&(r.isTab=!0),r}parsePageToRoute(e,t=""){const r=t?`/${t}/${e.path}`:`/${e.path}`,a=this.generateRouteName(r),o=this.extractMeta(e,r.replace(/^\//,"")),n={path:r,name:a};return Object.keys(o).length>0&&(n.meta=o),n}parsePagesJson(e){const t=[];if(!e.pages||!Array.isArray(e.pages)||e.pages.length===0)return this.logger.warn("pages.json \u4E2D\u6CA1\u6709\u6709\u6548\u7684\u9875\u9762\u914D\u7F6E"),t;if(this.tabBarPages.clear(),e.tabBar?.list)for(const r of e.tabBar.list)this.tabBarPages.add(r.pagePath);for(const r of e.pages)t.push(this.parsePageToRoute(r));if(this.options.includeSubPackages&&e.subPackages){for(const r of e.subPackages)if(r.pages&&Array.isArray(r.pages))for(const a of r.pages)t.push(this.parsePageToRoute(a,r.root))}return t}generateTypeDefinitions(){return!this.options.exportTypes||this.options.outputFormat==="js"?"":`
2
3
  /**
3
4
  * \u8DEF\u7531\u5143\u4FE1\u606F
4
5
  */
@@ -24,12 +25,12 @@ export interface RouteConfig {
24
25
  /** \u8DEF\u7531\u5143\u4FE1\u606F */
25
26
  meta?: RouteMeta
26
27
  }
27
- `}generateFileContent(e){const u=this.generateTypeDefinitions(),t=this.options.outputFormat==="ts",a=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${u}
28
+ `}generateFileContent(e){const t=this.generateTypeDefinitions(),r=this.options.outputFormat==="ts",a=JSON.stringify(e,null," ").replace(/"(\w+)":/g,"$1:").replace(/: "([^"]+)"/g,": '$1'");return`${t}
28
29
  /**
29
30
  * \u8DEF\u7531\u914D\u7F6E\u5217\u8868
30
31
  * @description \u7531 pages.json \u81EA\u52A8\u751F\u6210
31
32
  */
32
- export const routes${t?": RouteConfig[]":""} = ${a}
33
+ export const routes${r?": RouteConfig[]":""} = ${a}
33
34
 
34
35
  export default routes
35
- `}async readPagesJson(){const e=f.resolve(this.projectRoot,this.options.pagesJsonPath);if(!s.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const u=await common_fs_index.readFileContent(e),t=common_format_index.stripJsonComments(u);return JSON.parse(t)}catch(u){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${u.message}`),null}}extractExistingRoutes(e){const u=new Map,t=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!t)return u;try{let a=t[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const r=JSON.parse(a);for(const o of r)o.path&&u.set(o.path,o)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return u}mergeRoutes(e,u){return e.map(t=>{const a=u.get(t.path);if(!a)return t;const r={};return t.meta&&Object.assign(r,t.meta),a.meta&&Object.assign(r,a.meta),{...a,path:t.path,meta:Object.keys(r).length>0?r:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let u=this.parsePagesJson(e);const t=f.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s.existsSync(t))try{const r=await common_fs_index.readFileContent(t),o=this.extractExistingRoutes(r);o.size>0&&(u=this.mergeRoutes(u,o),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const a=this.generateFileContent(u);await common_fs_index.writeFileContent(t,a),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`),this.logger.info(`\u5171\u751F\u6210 ${u.length} \u6761\u8DEF\u7531\u914D\u7F6E`)}startWatching(){if(!this.options.watch)return;const e=f.resolve(this.projectRoot,this.options.pagesJsonPath);s.existsSync(e)&&(this.watcher=s.watch(e,async u=>{u==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${e}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(e){e.configResolved=async u=>{this.projectRoot=u.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),u.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(R);exports.generateRouter=generateRouter;
36
+ `}async readPagesJson(){const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);if(!s$1.existsSync(e))return this.logger.warn(`pages.json \u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`),null;try{const t=await s$1.promises.readFile(e,"utf-8"),r=stripJsonComments(t);return JSON.parse(r)}catch(t){return this.logger.error(`\u89E3\u6790 pages.json \u5931\u8D25: ${t.message}`),null}}extractExistingRoutes(e){const t=new Map,r=e.match(/export const routes[^=]*=\s*(\[[\s\S]*?\](?=\s*\n|\s*$|\s*\/\/))/);if(!r)return t;try{let a=r[1].replace(/(\w+)(?=\s*:)/g,'"$1"').replace(/'([^']*)'/g,'"$1"').replace(/,\s*([\]\}])/g,"$1");const o=JSON.parse(a);for(const n of o)n.path&&t.set(n.path,n)}catch{this.logger.warn("\u89E3\u6790\u73B0\u6709 routes \u914D\u7F6E\u5931\u8D25\uFF0C\u5C06\u5B8C\u5168\u91CD\u65B0\u751F\u6210")}return t}mergeRoutes(e,t){return e.map(r=>{const a=t.get(r.path);if(!a)return r;const o={};return r.meta&&Object.assign(o,r.meta),a.meta&&Object.assign(o,a.meta),{...a,path:r.path,meta:Object.keys(o).length>0?o:void 0}})}async generateRouterConfig(){const e=await this.readPagesJson();if(!e)return;let t=this.parsePagesJson(e);const r=u$1.resolve(this.projectRoot,this.options.outputPath);if(this.options.preserveRouteChanges&&s$1.existsSync(r))try{const o=await s$1.promises.readFile(r,"utf-8"),n=this.extractExistingRoutes(o);n.size>0&&(t=this.mergeRoutes(t,n),this.logger.info("\u5DF2\u5408\u5E76\u7528\u6237\u5BF9\u8DEF\u7531\u914D\u7F6E\u7684\u4FEE\u6539"))}catch{}const a=this.generateFileContent(t);await common_fs_index.writeFileContent(r,a),this.logger.success(`\u8DEF\u7531\u914D\u7F6E\u6587\u4EF6\u5DF2\u751F\u6210: ${r}`),this.logger.info(`\u5171\u751F\u6210 ${t.length} \u6761\u8DEF\u7531\u914D\u7F6E`),await this.generateDtsFile(t)}async generateDtsFile(e){if(!this.options.dts)return;const t=u$1.resolve(this.projectRoot,typeof this.options.dts=="string"?this.options.dts:"src/router.d.ts"),r=generateRouterDtsContent(e);common_fs_index.shouldUpdateFileContent(t,r)&&(await common_fs_index.writeFileContent(t,r),this.logger.success(`\u8DEF\u7531\u7C7B\u578B\u58F0\u660E\u6587\u4EF6\u5DF2\u751F\u6210: ${t}`))}startWatching(){if(!this.options.watch)return;const e=u$1.resolve(this.projectRoot,this.options.pagesJsonPath);s$1.existsSync(e)&&(this.watcher=s$1.watch(e,async t=>{t==="change"&&(this.logger.info("\u68C0\u6D4B\u5230 pages.json \u53D8\u5316\uFF0C\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E..."),await this.safeExecute(()=>this.generateRouterConfig(),"\u91CD\u65B0\u751F\u6210\u8DEF\u7531\u914D\u7F6E"))}),this.logger.info(`\u6B63\u5728\u76D1\u542C pages.json \u53D8\u5316: ${e}`))}stopWatching(){this.watcher&&(this.watcher.close(),this.watcher=null)}addPluginHooks(e){e.configResolved=async t=>{this.projectRoot=t.root,await this.safeExecute(()=>this.generateRouterConfig(),"\u751F\u6210\u8DEF\u7531\u914D\u7F6E"),t.command==="serve"&&this.startWatching()}}destroy(){super.destroy(),this.stopWatching()}}const generateRouter=factory_index.createPluginFactory(y);exports.generateRouter=generateRouter;
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.cjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.cjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.cjs';
5
5
 
6
6
  /**
@@ -203,6 +203,29 @@ interface GenerateRouterOptions extends BasePluginOptions {
203
203
  * @default true
204
204
  */
205
205
  preserveRouteChanges?: boolean;
206
+ /**
207
+ * TypeScript 类型声明文件输出路径
208
+ *
209
+ * @description 控制是否生成路由类型声明文件(`.d.ts`):
210
+ * - `string`:在指定路径生成类型声明文件
211
+ * - `true`:使用默认路径 `src/router.d.ts`
212
+ * - `false`:不生成类型声明文件
213
+ *
214
+ * 生成的类型声明文件会为 `@meng-xi/uni-router` 模块扩展 `RouteNameMap` 接口,
215
+ * 提供路由名称到路径和元信息的类型映射,实现类型安全的路由导航。
216
+ *
217
+ * @default false
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // 使用默认路径
222
+ * generateRouter({ dts: true })
223
+ *
224
+ * // 自定义路径
225
+ * generateRouter({ dts: 'src/types/router.d.ts' })
226
+ * ```
227
+ */
228
+ dts?: string | boolean;
206
229
  }
207
230
 
208
231
  /**
@@ -246,6 +269,16 @@ interface GenerateRouterOptions extends BasePluginOptions {
246
269
  * customField: 'custom'
247
270
  * }
248
271
  * })
272
+ *
273
+ * // 生成路由类型声明文件
274
+ * generateRouter({
275
+ * dts: true
276
+ * })
277
+ *
278
+ * // 自定义类型声明文件路径
279
+ * generateRouter({
280
+ * dts: 'src/types/router.d.ts'
281
+ * })
249
282
  * ```
250
283
  *
251
284
  * @remarks
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.mjs';
3
+ import '../../shared/vite-plugin.B8FuZce1.mjs';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.mjs';
5
5
 
6
6
  /**
@@ -203,6 +203,29 @@ interface GenerateRouterOptions extends BasePluginOptions {
203
203
  * @default true
204
204
  */
205
205
  preserveRouteChanges?: boolean;
206
+ /**
207
+ * TypeScript 类型声明文件输出路径
208
+ *
209
+ * @description 控制是否生成路由类型声明文件(`.d.ts`):
210
+ * - `string`:在指定路径生成类型声明文件
211
+ * - `true`:使用默认路径 `src/router.d.ts`
212
+ * - `false`:不生成类型声明文件
213
+ *
214
+ * 生成的类型声明文件会为 `@meng-xi/uni-router` 模块扩展 `RouteNameMap` 接口,
215
+ * 提供路由名称到路径和元信息的类型映射,实现类型安全的路由导航。
216
+ *
217
+ * @default false
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // 使用默认路径
222
+ * generateRouter({ dts: true })
223
+ *
224
+ * // 自定义路径
225
+ * generateRouter({ dts: 'src/types/router.d.ts' })
226
+ * ```
227
+ */
228
+ dts?: string | boolean;
206
229
  }
207
230
 
208
231
  /**
@@ -246,6 +269,16 @@ interface GenerateRouterOptions extends BasePluginOptions {
246
269
  * customField: 'custom'
247
270
  * }
248
271
  * })
272
+ *
273
+ * // 生成路由类型声明文件
274
+ * generateRouter({
275
+ * dts: true
276
+ * })
277
+ *
278
+ * // 自定义类型声明文件路径
279
+ * generateRouter({
280
+ * dts: 'src/types/router.d.ts'
281
+ * })
249
282
  * ```
250
283
  *
251
284
  * @remarks
@@ -1,6 +1,6 @@
1
1
  import { BasePluginOptions, PluginFactory } from '../../factory/index.js';
2
2
  import 'vite';
3
- import '../../shared/vite-plugin.CLr0ttuO.js';
3
+ import '../../shared/vite-plugin.B8FuZce1.js';
4
4
  import '../../shared/vite-plugin.DRRlWY8P.js';
5
5
 
6
6
  /**
@@ -203,6 +203,29 @@ interface GenerateRouterOptions extends BasePluginOptions {
203
203
  * @default true
204
204
  */
205
205
  preserveRouteChanges?: boolean;
206
+ /**
207
+ * TypeScript 类型声明文件输出路径
208
+ *
209
+ * @description 控制是否生成路由类型声明文件(`.d.ts`):
210
+ * - `string`:在指定路径生成类型声明文件
211
+ * - `true`:使用默认路径 `src/router.d.ts`
212
+ * - `false`:不生成类型声明文件
213
+ *
214
+ * 生成的类型声明文件会为 `@meng-xi/uni-router` 模块扩展 `RouteNameMap` 接口,
215
+ * 提供路由名称到路径和元信息的类型映射,实现类型安全的路由导航。
216
+ *
217
+ * @default false
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * // 使用默认路径
222
+ * generateRouter({ dts: true })
223
+ *
224
+ * // 自定义路径
225
+ * generateRouter({ dts: 'src/types/router.d.ts' })
226
+ * ```
227
+ */
228
+ dts?: string | boolean;
206
229
  }
207
230
 
208
231
  /**
@@ -246,6 +269,16 @@ interface GenerateRouterOptions extends BasePluginOptions {
246
269
  * customField: 'custom'
247
270
  * }
248
271
  * })
272
+ *
273
+ * // 生成路由类型声明文件
274
+ * generateRouter({
275
+ * dts: true
276
+ * })
277
+ *
278
+ * // 自定义类型声明文件路径
279
+ * generateRouter({
280
+ * dts: 'src/types/router.d.ts'
281
+ * })
249
282
  * ```
250
283
  *
251
284
  * @remarks