@meng-xi/vite-plugin 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README-en.md +49 -775
- package/README.md +46 -770
- package/dist/common/format/index.cjs +1 -1
- package/dist/common/format/index.d.cts +1 -130
- package/dist/common/format/index.d.mts +1 -130
- package/dist/common/format/index.d.ts +1 -130
- package/dist/common/format/index.mjs +1 -1
- package/dist/common/fs/index.cjs +1 -1
- package/dist/common/fs/index.d.cts +1 -89
- package/dist/common/fs/index.d.mts +1 -89
- package/dist/common/fs/index.d.ts +1 -89
- package/dist/common/fs/index.mjs +1 -1
- package/dist/common/html/index.cjs +2 -2
- package/dist/common/html/index.d.cts +19 -81
- package/dist/common/html/index.d.mts +19 -81
- package/dist/common/html/index.d.ts +19 -81
- package/dist/common/html/index.mjs +2 -2
- package/dist/common/index.cjs +1 -1
- package/dist/common/index.d.cts +7 -8
- package/dist/common/index.d.mts +7 -8
- package/dist/common/index.d.ts +7 -8
- package/dist/common/index.mjs +1 -1
- package/dist/common/script/index.cjs +1 -1
- package/dist/common/script/index.d.cts +1 -44
- package/dist/common/script/index.d.mts +1 -44
- package/dist/common/script/index.d.ts +1 -44
- package/dist/common/script/index.mjs +1 -1
- package/dist/common/ui/index.cjs +1 -0
- package/dist/common/ui/index.d.cts +22 -0
- package/dist/common/ui/index.d.mts +22 -0
- package/dist/common/ui/index.d.ts +22 -0
- package/dist/common/ui/index.mjs +1 -0
- package/dist/common/validation/index.cjs +1 -1
- package/dist/common/validation/index.d.cts +2 -79
- package/dist/common/validation/index.d.mts +2 -79
- package/dist/common/validation/index.d.ts +2 -79
- package/dist/common/validation/index.mjs +1 -1
- package/dist/factory/index.cjs +1 -1
- package/dist/factory/index.d.cts +1 -1
- package/dist/factory/index.d.mts +1 -1
- package/dist/factory/index.d.ts +1 -1
- package/dist/factory/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +12 -10
- package/dist/index.d.mts +12 -10
- package/dist/index.d.ts +12 -10
- package/dist/index.mjs +1 -1
- package/dist/logger/index.d.cts +92 -1
- package/dist/logger/index.d.mts +92 -1
- package/dist/logger/index.d.ts +92 -1
- package/dist/plugins/autoImport/index.cjs +17 -0
- package/dist/plugins/autoImport/index.d.cts +291 -0
- package/dist/plugins/autoImport/index.d.mts +291 -0
- package/dist/plugins/autoImport/index.d.ts +291 -0
- package/dist/plugins/autoImport/index.mjs +17 -0
- package/dist/plugins/buildProgress/index.cjs +2 -2
- package/dist/plugins/buildProgress/index.d.cts +1 -1
- package/dist/plugins/buildProgress/index.d.mts +1 -1
- package/dist/plugins/buildProgress/index.d.ts +1 -1
- package/dist/plugins/buildProgress/index.mjs +2 -2
- package/dist/plugins/bundleAnalyzer/index.cjs +11 -11
- package/dist/plugins/bundleAnalyzer/index.d.cts +1 -1
- package/dist/plugins/bundleAnalyzer/index.d.mts +1 -1
- package/dist/plugins/bundleAnalyzer/index.d.ts +1 -1
- package/dist/plugins/bundleAnalyzer/index.mjs +18 -18
- package/dist/plugins/compressAssets/index.cjs +1 -1
- package/dist/plugins/compressAssets/index.d.cts +1 -1
- package/dist/plugins/compressAssets/index.d.mts +1 -1
- package/dist/plugins/compressAssets/index.d.ts +1 -1
- package/dist/plugins/compressAssets/index.mjs +1 -1
- package/dist/plugins/copyFile/index.cjs +1 -1
- package/dist/plugins/copyFile/index.d.cts +21 -3
- package/dist/plugins/copyFile/index.d.mts +21 -3
- package/dist/plugins/copyFile/index.d.ts +21 -3
- package/dist/plugins/copyFile/index.mjs +1 -1
- package/dist/plugins/envGuard/index.cjs +67 -0
- package/dist/plugins/envGuard/index.d.cts +255 -0
- package/dist/plugins/envGuard/index.d.mts +255 -0
- package/dist/plugins/envGuard/index.d.ts +255 -0
- package/dist/plugins/envGuard/index.mjs +67 -0
- package/dist/plugins/faviconManager/index.cjs +1 -1
- package/dist/plugins/faviconManager/index.d.cts +44 -6
- package/dist/plugins/faviconManager/index.d.mts +44 -6
- package/dist/plugins/faviconManager/index.d.ts +44 -6
- package/dist/plugins/faviconManager/index.mjs +1 -1
- package/dist/plugins/generateRouter/index.cjs +4 -4
- package/dist/plugins/generateRouter/index.d.cts +62 -15
- package/dist/plugins/generateRouter/index.d.mts +62 -15
- package/dist/plugins/generateRouter/index.d.ts +62 -15
- package/dist/plugins/generateRouter/index.mjs +4 -4
- package/dist/plugins/generateVersion/index.cjs +1 -1
- package/dist/plugins/generateVersion/index.d.cts +13 -1
- package/dist/plugins/generateVersion/index.d.mts +13 -1
- package/dist/plugins/generateVersion/index.d.ts +13 -1
- package/dist/plugins/generateVersion/index.mjs +1 -1
- package/dist/plugins/htmlInject/index.cjs +7 -7
- package/dist/plugins/htmlInject/index.d.cts +50 -195
- package/dist/plugins/htmlInject/index.d.mts +50 -195
- package/dist/plugins/htmlInject/index.d.ts +50 -195
- package/dist/plugins/htmlInject/index.mjs +7 -7
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.d.cts +5 -2
- package/dist/plugins/index.d.mts +5 -2
- package/dist/plugins/index.d.ts +5 -2
- package/dist/plugins/index.mjs +1 -1
- package/dist/plugins/loadingManager/index.cjs +26 -26
- package/dist/plugins/loadingManager/index.d.cts +1 -1
- package/dist/plugins/loadingManager/index.d.mts +1 -1
- package/dist/plugins/loadingManager/index.d.ts +1 -1
- package/dist/plugins/loadingManager/index.mjs +11 -11
- package/dist/plugins/versionUpdateChecker/index.cjs +1 -1
- package/dist/plugins/versionUpdateChecker/index.d.cts +1 -1
- package/dist/plugins/versionUpdateChecker/index.d.mts +1 -1
- package/dist/plugins/versionUpdateChecker/index.d.ts +1 -1
- package/dist/plugins/versionUpdateChecker/index.mjs +1 -1
- package/dist/shared/vite-plugin.B8FuZce1.d.cts +45 -0
- package/dist/shared/vite-plugin.B8FuZce1.d.mts +45 -0
- package/dist/shared/vite-plugin.B8FuZce1.d.ts +45 -0
- package/dist/shared/vite-plugin.BI9taN75.d.cts +122 -0
- package/dist/shared/vite-plugin.BI9taN75.d.mts +122 -0
- package/dist/shared/vite-plugin.BI9taN75.d.ts +122 -0
- package/dist/shared/vite-plugin.BPFqtmWa.mjs +1 -0
- package/dist/shared/vite-plugin.CnOy46d3.cjs +1 -0
- package/package.json +16 -16
- package/dist/common/compress/index.cjs +0 -1
- package/dist/common/compress/index.d.cts +0 -23
- package/dist/common/compress/index.d.mts +0 -23
- package/dist/common/compress/index.d.ts +0 -23
- package/dist/common/compress/index.mjs +0 -1
- package/dist/common/object/index.cjs +0 -1
- package/dist/common/object/index.d.cts +0 -30
- package/dist/common/object/index.d.mts +0 -30
- package/dist/common/object/index.d.ts +0 -30
- package/dist/common/object/index.mjs +0 -1
- package/dist/common/path/index.cjs +0 -1
- package/dist/common/path/index.d.cts +0 -22
- package/dist/common/path/index.d.mts +0 -22
- package/dist/common/path/index.d.ts +0 -22
- package/dist/common/path/index.mjs +0 -1
- package/dist/shared/vite-plugin.CLr0ttuO.d.cts +0 -135
- package/dist/shared/vite-plugin.CLr0ttuO.d.mts +0 -135
- package/dist/shared/vite-plugin.CLr0ttuO.d.ts +0 -135
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { BasePluginOptions, PluginFactory } from '../../factory/index.cjs';
|
|
2
|
+
import 'vite';
|
|
3
|
+
import '../../shared/vite-plugin.B8FuZce1.cjs';
|
|
4
|
+
import '../../shared/vite-plugin.DRRlWY8P.cjs';
|
|
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
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 环境变量校验失败时的处理动作
|
|
108
|
+
*
|
|
109
|
+
* @description 定义当环境变量校验未通过时的处理策略:
|
|
110
|
+
* - `error`: 抛出错误,中断构建流程
|
|
111
|
+
* - `warn`: 输出警告日志,继续构建
|
|
112
|
+
* - `ignore`: 静默忽略,不输出任何信息
|
|
113
|
+
*/
|
|
114
|
+
type EnvFailAction = 'error' | 'warn' | 'ignore';
|
|
115
|
+
/**
|
|
116
|
+
* 运行时守卫的行为模式
|
|
117
|
+
*
|
|
118
|
+
* @description 定义注入到 HTML 中的运行时守卫代码在检测到
|
|
119
|
+
* 环境变量缺失或无效时的行为方式:
|
|
120
|
+
* - `console`: 在浏览器控制台输出警告信息
|
|
121
|
+
* - `throw`: 抛出运行时错误,阻止应用启动
|
|
122
|
+
* - `overlay`: 在页面顶部显示警告横幅
|
|
123
|
+
*/
|
|
124
|
+
type RuntimeGuardMode = 'console' | 'throw' | 'overlay';
|
|
125
|
+
/**
|
|
126
|
+
* 环境变量校验结果汇总
|
|
127
|
+
*
|
|
128
|
+
* @interface EnvGuardResult
|
|
129
|
+
* @description 包含所有环境变量的校验统计信息和详细结果列表,
|
|
130
|
+
* 用于报告生成和日志输出。
|
|
131
|
+
*/
|
|
132
|
+
interface EnvGuardResult {
|
|
133
|
+
/** 校验时间戳(ISO 格式) */
|
|
134
|
+
timestamp: string;
|
|
135
|
+
/** 校验的环境变量总数 */
|
|
136
|
+
total: number;
|
|
137
|
+
/** 校验通过的变量数量 */
|
|
138
|
+
passed: number;
|
|
139
|
+
/** 缺失的必需变量数量 */
|
|
140
|
+
missing: number;
|
|
141
|
+
/** 校验失败的变量数量(类型不匹配、范围越界等) */
|
|
142
|
+
invalid: number;
|
|
143
|
+
/** 所有变量的详细校验结果列表 */
|
|
144
|
+
results: EnvValidationResult[];
|
|
145
|
+
/** 是否所有变量均校验通过 */
|
|
146
|
+
allPassed: boolean;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 环境变量守卫插件的配置选项
|
|
150
|
+
*
|
|
151
|
+
* @interface EnvGuardOptions
|
|
152
|
+
* @extends {BasePluginOptions}
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* envGuard({
|
|
157
|
+
* required: {
|
|
158
|
+
* VITE_API_URL: { type: 'url', required: true },
|
|
159
|
+
* VITE_APP_TITLE: { type: 'string', minLength: 1, maxLength: 50 }
|
|
160
|
+
* },
|
|
161
|
+
* failAction: 'error',
|
|
162
|
+
* generateTemplate: true,
|
|
163
|
+
* runtimeGuard: true,
|
|
164
|
+
* runtimeGuardMode: 'console'
|
|
165
|
+
* })
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
interface EnvGuardOptions extends BasePluginOptions {
|
|
169
|
+
/** 环境变量校验规则映射,键为变量名,值为校验规则 */
|
|
170
|
+
required?: Record<string, EnvFieldRule>;
|
|
171
|
+
/** 校验失败时的处理动作 */
|
|
172
|
+
failAction?: EnvFailAction;
|
|
173
|
+
/** 是否自动生成 .env 模板文件 */
|
|
174
|
+
generateTemplate?: boolean;
|
|
175
|
+
/** .env 模板文件的输出路径 */
|
|
176
|
+
templateOutput?: string;
|
|
177
|
+
/** 是否注入运行时环境变量守卫代码到 HTML */
|
|
178
|
+
runtimeGuard?: boolean;
|
|
179
|
+
/** 运行时守卫的全局变量名 */
|
|
180
|
+
runtimeGlobalName?: string;
|
|
181
|
+
/** 运行时守卫的行为模式 */
|
|
182
|
+
runtimeGuardMode?: RuntimeGuardMode;
|
|
183
|
+
/** 需要加载的 .env 文件路径列表 */
|
|
184
|
+
envFiles?: string[];
|
|
185
|
+
/** 是否自动加载 .env 文件中的变量到 process.env */
|
|
186
|
+
autoLoadEnv?: boolean;
|
|
187
|
+
/** 校验报告输出路径,设为 false 则不生成报告 */
|
|
188
|
+
reportOutput?: string | false;
|
|
189
|
+
/** 是否在构建前执行校验 */
|
|
190
|
+
validateBeforeBuild?: boolean;
|
|
191
|
+
/** 是否输出校验摘要日志 */
|
|
192
|
+
showSummary?: boolean;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* 创建环境变量守卫插件
|
|
197
|
+
*
|
|
198
|
+
* @function envGuard
|
|
199
|
+
* @param {Partial<EnvGuardOptions>} [options] - 插件配置选项
|
|
200
|
+
* @returns {Plugin} Vite 插件实例
|
|
201
|
+
*
|
|
202
|
+
* @description 在 Vite 构建前校验环境变量的存在性和合法性,
|
|
203
|
+
* 支持多种值类型校验、正则匹配、自定义校验函数等,
|
|
204
|
+
* 可选生成 .env 模板文件和注入运行时守卫代码。
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* ```typescript
|
|
208
|
+
* // vite.config.ts
|
|
209
|
+
* import { envGuard } from '@meng-xi/vite-plugin'
|
|
210
|
+
*
|
|
211
|
+
* export default defineConfig({
|
|
212
|
+
* plugins: [
|
|
213
|
+
* envGuard({
|
|
214
|
+
* required: {
|
|
215
|
+
* VITE_API_BASE_URL: {
|
|
216
|
+
* type: 'url',
|
|
217
|
+
* required: true,
|
|
218
|
+
* message: 'API 基础地址必须为合法 URL'
|
|
219
|
+
* },
|
|
220
|
+
* VITE_APP_TITLE: {
|
|
221
|
+
* type: 'string',
|
|
222
|
+
* required: true,
|
|
223
|
+
* minLength: 1,
|
|
224
|
+
* maxLength: 50
|
|
225
|
+
* },
|
|
226
|
+
* VITE_ENABLE_ANALYTICS: {
|
|
227
|
+
* type: 'boolean',
|
|
228
|
+
* required: false,
|
|
229
|
+
* default: 'false'
|
|
230
|
+
* },
|
|
231
|
+
* VITE_API_TIMEOUT: {
|
|
232
|
+
* type: 'number',
|
|
233
|
+
* minValue: 1000,
|
|
234
|
+
* maxValue: 60000,
|
|
235
|
+
* message: 'API 超时时间必须在 1000-60000ms 之间'
|
|
236
|
+
* },
|
|
237
|
+
* VITE_LOG_LEVEL: {
|
|
238
|
+
* type: 'enum',
|
|
239
|
+
* enumValues: ['debug', 'info', 'warn', 'error'],
|
|
240
|
+
* default: 'info'
|
|
241
|
+
* }
|
|
242
|
+
* },
|
|
243
|
+
* failAction: 'error',
|
|
244
|
+
* generateTemplate: true,
|
|
245
|
+
* runtimeGuard: true,
|
|
246
|
+
* runtimeGuardMode: 'console'
|
|
247
|
+
* })
|
|
248
|
+
* ]
|
|
249
|
+
* })
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
declare const envGuard: PluginFactory<EnvGuardOptions, EnvGuardOptions>;
|
|
253
|
+
|
|
254
|
+
export { envGuard };
|
|
255
|
+
export type { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode };
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { BasePluginOptions, PluginFactory } from '../../factory/index.mjs';
|
|
2
|
+
import 'vite';
|
|
3
|
+
import '../../shared/vite-plugin.B8FuZce1.mjs';
|
|
4
|
+
import '../../shared/vite-plugin.DRRlWY8P.mjs';
|
|
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
|
+
|
|
106
|
+
/**
|
|
107
|
+
* 环境变量校验失败时的处理动作
|
|
108
|
+
*
|
|
109
|
+
* @description 定义当环境变量校验未通过时的处理策略:
|
|
110
|
+
* - `error`: 抛出错误,中断构建流程
|
|
111
|
+
* - `warn`: 输出警告日志,继续构建
|
|
112
|
+
* - `ignore`: 静默忽略,不输出任何信息
|
|
113
|
+
*/
|
|
114
|
+
type EnvFailAction = 'error' | 'warn' | 'ignore';
|
|
115
|
+
/**
|
|
116
|
+
* 运行时守卫的行为模式
|
|
117
|
+
*
|
|
118
|
+
* @description 定义注入到 HTML 中的运行时守卫代码在检测到
|
|
119
|
+
* 环境变量缺失或无效时的行为方式:
|
|
120
|
+
* - `console`: 在浏览器控制台输出警告信息
|
|
121
|
+
* - `throw`: 抛出运行时错误,阻止应用启动
|
|
122
|
+
* - `overlay`: 在页面顶部显示警告横幅
|
|
123
|
+
*/
|
|
124
|
+
type RuntimeGuardMode = 'console' | 'throw' | 'overlay';
|
|
125
|
+
/**
|
|
126
|
+
* 环境变量校验结果汇总
|
|
127
|
+
*
|
|
128
|
+
* @interface EnvGuardResult
|
|
129
|
+
* @description 包含所有环境变量的校验统计信息和详细结果列表,
|
|
130
|
+
* 用于报告生成和日志输出。
|
|
131
|
+
*/
|
|
132
|
+
interface EnvGuardResult {
|
|
133
|
+
/** 校验时间戳(ISO 格式) */
|
|
134
|
+
timestamp: string;
|
|
135
|
+
/** 校验的环境变量总数 */
|
|
136
|
+
total: number;
|
|
137
|
+
/** 校验通过的变量数量 */
|
|
138
|
+
passed: number;
|
|
139
|
+
/** 缺失的必需变量数量 */
|
|
140
|
+
missing: number;
|
|
141
|
+
/** 校验失败的变量数量(类型不匹配、范围越界等) */
|
|
142
|
+
invalid: number;
|
|
143
|
+
/** 所有变量的详细校验结果列表 */
|
|
144
|
+
results: EnvValidationResult[];
|
|
145
|
+
/** 是否所有变量均校验通过 */
|
|
146
|
+
allPassed: boolean;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 环境变量守卫插件的配置选项
|
|
150
|
+
*
|
|
151
|
+
* @interface EnvGuardOptions
|
|
152
|
+
* @extends {BasePluginOptions}
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* envGuard({
|
|
157
|
+
* required: {
|
|
158
|
+
* VITE_API_URL: { type: 'url', required: true },
|
|
159
|
+
* VITE_APP_TITLE: { type: 'string', minLength: 1, maxLength: 50 }
|
|
160
|
+
* },
|
|
161
|
+
* failAction: 'error',
|
|
162
|
+
* generateTemplate: true,
|
|
163
|
+
* runtimeGuard: true,
|
|
164
|
+
* runtimeGuardMode: 'console'
|
|
165
|
+
* })
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
interface EnvGuardOptions extends BasePluginOptions {
|
|
169
|
+
/** 环境变量校验规则映射,键为变量名,值为校验规则 */
|
|
170
|
+
required?: Record<string, EnvFieldRule>;
|
|
171
|
+
/** 校验失败时的处理动作 */
|
|
172
|
+
failAction?: EnvFailAction;
|
|
173
|
+
/** 是否自动生成 .env 模板文件 */
|
|
174
|
+
generateTemplate?: boolean;
|
|
175
|
+
/** .env 模板文件的输出路径 */
|
|
176
|
+
templateOutput?: string;
|
|
177
|
+
/** 是否注入运行时环境变量守卫代码到 HTML */
|
|
178
|
+
runtimeGuard?: boolean;
|
|
179
|
+
/** 运行时守卫的全局变量名 */
|
|
180
|
+
runtimeGlobalName?: string;
|
|
181
|
+
/** 运行时守卫的行为模式 */
|
|
182
|
+
runtimeGuardMode?: RuntimeGuardMode;
|
|
183
|
+
/** 需要加载的 .env 文件路径列表 */
|
|
184
|
+
envFiles?: string[];
|
|
185
|
+
/** 是否自动加载 .env 文件中的变量到 process.env */
|
|
186
|
+
autoLoadEnv?: boolean;
|
|
187
|
+
/** 校验报告输出路径,设为 false 则不生成报告 */
|
|
188
|
+
reportOutput?: string | false;
|
|
189
|
+
/** 是否在构建前执行校验 */
|
|
190
|
+
validateBeforeBuild?: boolean;
|
|
191
|
+
/** 是否输出校验摘要日志 */
|
|
192
|
+
showSummary?: boolean;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* 创建环境变量守卫插件
|
|
197
|
+
*
|
|
198
|
+
* @function envGuard
|
|
199
|
+
* @param {Partial<EnvGuardOptions>} [options] - 插件配置选项
|
|
200
|
+
* @returns {Plugin} Vite 插件实例
|
|
201
|
+
*
|
|
202
|
+
* @description 在 Vite 构建前校验环境变量的存在性和合法性,
|
|
203
|
+
* 支持多种值类型校验、正则匹配、自定义校验函数等,
|
|
204
|
+
* 可选生成 .env 模板文件和注入运行时守卫代码。
|
|
205
|
+
*
|
|
206
|
+
* @example
|
|
207
|
+
* ```typescript
|
|
208
|
+
* // vite.config.ts
|
|
209
|
+
* import { envGuard } from '@meng-xi/vite-plugin'
|
|
210
|
+
*
|
|
211
|
+
* export default defineConfig({
|
|
212
|
+
* plugins: [
|
|
213
|
+
* envGuard({
|
|
214
|
+
* required: {
|
|
215
|
+
* VITE_API_BASE_URL: {
|
|
216
|
+
* type: 'url',
|
|
217
|
+
* required: true,
|
|
218
|
+
* message: 'API 基础地址必须为合法 URL'
|
|
219
|
+
* },
|
|
220
|
+
* VITE_APP_TITLE: {
|
|
221
|
+
* type: 'string',
|
|
222
|
+
* required: true,
|
|
223
|
+
* minLength: 1,
|
|
224
|
+
* maxLength: 50
|
|
225
|
+
* },
|
|
226
|
+
* VITE_ENABLE_ANALYTICS: {
|
|
227
|
+
* type: 'boolean',
|
|
228
|
+
* required: false,
|
|
229
|
+
* default: 'false'
|
|
230
|
+
* },
|
|
231
|
+
* VITE_API_TIMEOUT: {
|
|
232
|
+
* type: 'number',
|
|
233
|
+
* minValue: 1000,
|
|
234
|
+
* maxValue: 60000,
|
|
235
|
+
* message: 'API 超时时间必须在 1000-60000ms 之间'
|
|
236
|
+
* },
|
|
237
|
+
* VITE_LOG_LEVEL: {
|
|
238
|
+
* type: 'enum',
|
|
239
|
+
* enumValues: ['debug', 'info', 'warn', 'error'],
|
|
240
|
+
* default: 'info'
|
|
241
|
+
* }
|
|
242
|
+
* },
|
|
243
|
+
* failAction: 'error',
|
|
244
|
+
* generateTemplate: true,
|
|
245
|
+
* runtimeGuard: true,
|
|
246
|
+
* runtimeGuardMode: 'console'
|
|
247
|
+
* })
|
|
248
|
+
* ]
|
|
249
|
+
* })
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
declare const envGuard: PluginFactory<EnvGuardOptions, EnvGuardOptions>;
|
|
253
|
+
|
|
254
|
+
export { envGuard };
|
|
255
|
+
export type { EnvFailAction, EnvGuardOptions, EnvGuardResult, RuntimeGuardMode };
|