@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.
- package/README-en.md +34 -20
- package/README.md +33 -19
- package/dist/common/format/index.cjs +1 -1
- package/dist/common/format/index.d.cts +19 -114
- package/dist/common/format/index.d.mts +19 -114
- package/dist/common/format/index.d.ts +19 -114
- package/dist/common/format/index.mjs +1 -1
- package/dist/common/fs/index.cjs +1 -1
- package/dist/common/fs/index.d.cts +36 -89
- package/dist/common/fs/index.d.mts +36 -89
- package/dist/common/fs/index.d.ts +36 -89
- package/dist/common/fs/index.mjs +1 -1
- package/dist/common/html/index.cjs +2 -2
- package/dist/common/html/index.d.cts +12 -307
- package/dist/common/html/index.d.mts +12 -307
- package/dist/common/html/index.d.ts +12 -307
- package/dist/common/html/index.mjs +2 -2
- package/dist/common/index.cjs +1 -1
- package/dist/common/index.d.cts +7 -11
- package/dist/common/index.d.mts +7 -11
- package/dist/common/index.d.ts +7 -11
- 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 -1
- package/dist/common/ui/index.d.cts +1 -111
- package/dist/common/ui/index.d.mts +1 -111
- package/dist/common/ui/index.d.ts +1 -111
- package/dist/common/ui/index.mjs +1 -1
- package/dist/common/validation/index.cjs +1 -1
- package/dist/common/validation/index.d.cts +2 -80
- package/dist/common/validation/index.d.mts +2 -80
- package/dist/common/validation/index.d.ts +2 -80
- 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 +10 -12
- package/dist/index.d.mts +10 -12
- package/dist/index.d.ts +10 -12
- 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 +19 -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 +19 -0
- package/dist/plugins/buildProgress/index.cjs +1 -1
- 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 +21 -21
- 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 +1 -1
- package/dist/plugins/copyFile/index.d.mts +1 -1
- package/dist/plugins/copyFile/index.d.ts +1 -1
- package/dist/plugins/copyFile/index.mjs +1 -1
- package/dist/plugins/envGuard/index.cjs +11 -11
- package/dist/plugins/envGuard/index.d.cts +101 -2
- package/dist/plugins/envGuard/index.d.mts +101 -2
- package/dist/plugins/envGuard/index.d.ts +101 -2
- package/dist/plugins/envGuard/index.mjs +9 -9
- package/dist/plugins/faviconManager/index.cjs +1 -1
- package/dist/plugins/faviconManager/index.d.cts +1 -1
- package/dist/plugins/faviconManager/index.d.mts +1 -1
- package/dist/plugins/faviconManager/index.d.ts +1 -1
- package/dist/plugins/faviconManager/index.mjs +1 -1
- package/dist/plugins/generateRouter/index.cjs +5 -4
- package/dist/plugins/generateRouter/index.d.cts +34 -1
- package/dist/plugins/generateRouter/index.d.mts +34 -1
- package/dist/plugins/generateRouter/index.d.ts +34 -1
- package/dist/plugins/generateRouter/index.mjs +5 -4
- package/dist/plugins/generateVersion/index.cjs +1 -1
- package/dist/plugins/generateVersion/index.d.cts +1 -1
- package/dist/plugins/generateVersion/index.d.mts +1 -1
- package/dist/plugins/generateVersion/index.d.ts +1 -1
- package/dist/plugins/generateVersion/index.mjs +1 -1
- package/dist/plugins/htmlInject/index.cjs +7 -1
- package/dist/plugins/htmlInject/index.d.cts +2 -2
- package/dist/plugins/htmlInject/index.d.mts +2 -2
- package/dist/plugins/htmlInject/index.d.ts +2 -2
- package/dist/plugins/htmlInject/index.mjs +7 -1
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.d.cts +3 -3
- package/dist/plugins/index.d.mts +3 -3
- package/dist/plugins/index.d.ts +3 -3
- 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 +10 -10
- package/dist/plugins/versionUpdateChecker/index.cjs +5 -5
- 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 +6 -6
- 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.FfJ-Wwfu.d.cts → vite-plugin.BI9taN75.d.cts} +1 -22
- package/dist/shared/{vite-plugin.FfJ-Wwfu.d.mts → vite-plugin.BI9taN75.d.mts} +1 -22
- package/dist/shared/{vite-plugin.FfJ-Wwfu.d.ts → vite-plugin.BI9taN75.d.ts} +1 -22
- package/dist/shared/vite-plugin.CcvHfrL8.cjs +1 -0
- package/dist/shared/vite-plugin.CuXEJAWX.mjs +1 -0
- package/package.json +7 -17
- 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.BCuhU1au.mjs +0 -7
- package/dist/shared/vite-plugin.BrI73DHA.cjs +0 -7
- 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
- package/dist/shared/vite-plugin.CmtcnItg.d.cts +0 -261
- package/dist/shared/vite-plugin.CmtcnItg.d.mts +0 -261
- package/dist/shared/vite-plugin.CmtcnItg.d.ts +0 -261
- package/dist/shared/vite-plugin.DnFDPjNf.mjs +0 -1
- package/dist/shared/vite-plugin.Dumot0up.mjs +0 -1
- package/dist/shared/vite-plugin.soT9a-KD.cjs +0 -1
- 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.
|
|
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.
|
|
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{
|
|
2
|
-
`)}function
|
|
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(
|
|
7
|
-
var GUARD_DATA = ${
|
|
6
|
+
var GUARD_NAME = ${JSON.stringify(u)};
|
|
7
|
+
var GUARD_DATA = ${a};
|
|
8
8
|
var FAILED_KEYS = ${f};
|
|
9
|
-
var MODE = ${JSON.stringify(
|
|
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
|
|
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
|
|
66
|
-
`);for(const
|
|
67
|
-
`);switch(this.options.failAction){case"error":throw new Error(
|
|
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("
|
|
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 +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"
|
|
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"),
|
|
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
|
|
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${
|
|
33
|
+
export const routes${r?": RouteConfig[]":""} = ${a}
|
|
33
34
|
|
|
34
35
|
export default routes
|
|
35
|
-
`}async readPagesJson(){const e=
|
|
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.
|
|
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.
|
|
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.
|
|
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
|