@meng-xi/vite-plugin 0.1.3 → 0.1.4
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 +48 -774
- package/README.md +45 -769
- package/dist/common/html/index.cjs +2 -2
- package/dist/common/html/index.d.cts +268 -19
- package/dist/common/html/index.d.mts +268 -19
- package/dist/common/html/index.d.ts +268 -19
- package/dist/common/html/index.mjs +2 -2
- package/dist/common/index.cjs +1 -1
- package/dist/common/index.d.cts +4 -1
- package/dist/common/index.d.mts +4 -1
- package/dist/common/index.d.ts +4 -1
- package/dist/common/index.mjs +1 -1
- package/dist/common/ui/index.cjs +1 -0
- package/dist/common/ui/index.d.cts +132 -0
- package/dist/common/ui/index.d.mts +132 -0
- package/dist/common/ui/index.d.ts +132 -0
- package/dist/common/ui/index.mjs +1 -0
- package/dist/common/validation/index.cjs +1 -1
- package/dist/common/validation/index.d.cts +1 -0
- package/dist/common/validation/index.d.mts +1 -0
- package/dist/common/validation/index.d.ts +1 -0
- package/dist/common/validation/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.mts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.mjs +1 -1
- package/dist/plugins/buildProgress/index.cjs +2 -2
- package/dist/plugins/buildProgress/index.mjs +2 -2
- package/dist/plugins/copyFile/index.d.cts +20 -2
- package/dist/plugins/copyFile/index.d.mts +20 -2
- package/dist/plugins/copyFile/index.d.ts +20 -2
- package/dist/plugins/envGuard/index.cjs +67 -0
- package/dist/plugins/envGuard/index.d.cts +156 -0
- package/dist/plugins/envGuard/index.d.mts +156 -0
- package/dist/plugins/envGuard/index.d.ts +156 -0
- package/dist/plugins/envGuard/index.mjs +67 -0
- package/dist/plugins/faviconManager/index.cjs +1 -1
- package/dist/plugins/faviconManager/index.d.cts +43 -5
- package/dist/plugins/faviconManager/index.d.mts +43 -5
- package/dist/plugins/faviconManager/index.d.ts +43 -5
- package/dist/plugins/faviconManager/index.mjs +1 -1
- package/dist/plugins/generateRouter/index.d.cts +61 -14
- package/dist/plugins/generateRouter/index.d.mts +61 -14
- package/dist/plugins/generateRouter/index.d.ts +61 -14
- package/dist/plugins/generateVersion/index.d.cts +12 -0
- package/dist/plugins/generateVersion/index.d.mts +12 -0
- package/dist/plugins/generateVersion/index.d.ts +12 -0
- package/dist/plugins/htmlInject/index.cjs +1 -7
- package/dist/plugins/htmlInject/index.d.cts +49 -194
- package/dist/plugins/htmlInject/index.d.mts +49 -194
- package/dist/plugins/htmlInject/index.d.ts +49 -194
- package/dist/plugins/htmlInject/index.mjs +1 -7
- package/dist/plugins/index.cjs +1 -1
- package/dist/plugins/index.d.cts +4 -1
- package/dist/plugins/index.d.mts +4 -1
- package/dist/plugins/index.d.ts +4 -1
- package/dist/plugins/index.mjs +1 -1
- package/dist/plugins/loadingManager/index.cjs +2 -2
- package/dist/plugins/loadingManager/index.mjs +1 -1
- package/dist/plugins/versionUpdateChecker/index.cjs +2 -2
- package/dist/plugins/versionUpdateChecker/index.mjs +3 -3
- package/dist/shared/vite-plugin.BCuhU1au.mjs +7 -0
- package/dist/shared/vite-plugin.BrI73DHA.cjs +7 -0
- package/dist/shared/vite-plugin.CmtcnItg.d.cts +261 -0
- package/dist/shared/vite-plugin.CmtcnItg.d.mts +261 -0
- package/dist/shared/vite-plugin.CmtcnItg.d.ts +261 -0
- package/dist/shared/vite-plugin.DnFDPjNf.mjs +1 -0
- package/dist/shared/vite-plugin.Dumot0up.mjs +1 -0
- package/dist/shared/vite-plugin.FfJ-Wwfu.d.cts +143 -0
- package/dist/shared/vite-plugin.FfJ-Wwfu.d.mts +143 -0
- package/dist/shared/vite-plugin.FfJ-Wwfu.d.ts +143 -0
- package/dist/shared/vite-plugin.soT9a-KD.cjs +1 -0
- package/dist/shared/vite-plugin.vwox4bU0.cjs +1 -0
- package/package.json +11 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML 注入与安全相关类型定义
|
|
3
|
+
*
|
|
4
|
+
* @module common/html/type
|
|
5
|
+
* @description 定义 HTML 注入位置、选择器匹配模式、条件判断、安全配置等核心类型,
|
|
6
|
+
* 为 HTML 注入和安全过滤功能提供统一的类型约束。
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* HTML 单点注入结果
|
|
10
|
+
*
|
|
11
|
+
* @description 表示在 HTML 中进行单点注入操作后的结果,
|
|
12
|
+
* 包含注入后的 HTML 内容和是否成功注入的标志。
|
|
13
|
+
*/
|
|
14
|
+
interface HtmlInjectResult {
|
|
15
|
+
/** 注入后的 HTML 内容 */
|
|
16
|
+
html: string;
|
|
17
|
+
/** 是否成功注入 */
|
|
18
|
+
injected: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* HTML 双区域注入结果
|
|
22
|
+
*
|
|
23
|
+
* @description 表示在 HTML 的 head 和 body 两个区域同时注入后的结果,
|
|
24
|
+
* 包含各区域的注入状态和是否使用了回退策略。
|
|
25
|
+
*/
|
|
26
|
+
interface DualInjectResult {
|
|
27
|
+
/** 注入后的 HTML 内容 */
|
|
28
|
+
html: string;
|
|
29
|
+
/** 是否成功注入到 head 区域 */
|
|
30
|
+
headInjected: boolean;
|
|
31
|
+
/** 是否成功注入到 body 区域 */
|
|
32
|
+
bodyInjected: boolean;
|
|
33
|
+
/** body 注入是否使用了回退策略(追加到末尾) */
|
|
34
|
+
usedFallback: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* HTML 注入位置类型
|
|
38
|
+
*
|
|
39
|
+
* @description 定义内容在 HTML 中可注入的所有位置:
|
|
40
|
+
* - `head-start`:`<head>` 标签开始后
|
|
41
|
+
* - `head-end`:`</head>` 标签前
|
|
42
|
+
* - `body-start`:`<body>` 标签开始后
|
|
43
|
+
* - `body-end`:`</body>` 标签前
|
|
44
|
+
* - `before-selector`:选择器匹配位置前
|
|
45
|
+
* - `after-selector`:选择器匹配位置后
|
|
46
|
+
* - `replace-selector`:替换选择器匹配的内容
|
|
47
|
+
*/
|
|
48
|
+
type InjectPosition = 'head-start' | 'head-end' | 'body-start' | 'body-end' | 'before-selector' | 'after-selector' | 'replace-selector';
|
|
49
|
+
/**
|
|
50
|
+
* 选择器匹配模式
|
|
51
|
+
*
|
|
52
|
+
* @description 定义 HTML 选择器的匹配方式:
|
|
53
|
+
* - `string`:使用字符串精确匹配(默认)
|
|
54
|
+
* - `regex`:使用正则表达式匹配
|
|
55
|
+
*/
|
|
56
|
+
type SelectorMatch = 'string' | 'regex';
|
|
57
|
+
/**
|
|
58
|
+
* 条件判断类型
|
|
59
|
+
*
|
|
60
|
+
* @description 定义注入条件的类型:
|
|
61
|
+
* - `env`:基于环境变量是否存在且为真值
|
|
62
|
+
* - `file-contains`:基于 HTML 内容是否包含指定字符串
|
|
63
|
+
* - `custom`:基于自定义函数的返回值
|
|
64
|
+
*/
|
|
65
|
+
type ConditionType = 'env' | 'file-contains' | 'custom';
|
|
66
|
+
/**
|
|
67
|
+
* 注入条件配置
|
|
68
|
+
*
|
|
69
|
+
* @description 定义 HTML 内容注入的条件判断规则,
|
|
70
|
+
* 支持环境变量检测、内容包含检测和自定义函数判断,
|
|
71
|
+
* 可通过 `negate` 字段取反结果。
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // 当环境变量 ENABLE_ANALYTICS 存在时注入
|
|
76
|
+
* { type: 'env', value: 'ENABLE_ANALYTICS' }
|
|
77
|
+
*
|
|
78
|
+
* // 当 HTML 不包含特定元素时注入(取反)
|
|
79
|
+
* { type: 'file-contains', value: '<div id="app">', negate: true }
|
|
80
|
+
*
|
|
81
|
+
* // 使用自定义函数判断
|
|
82
|
+
* { type: 'custom', value: () => process.env.NODE_ENV === 'production' }
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
interface InjectCondition {
|
|
86
|
+
/** 条件类型 */
|
|
87
|
+
type: ConditionType;
|
|
88
|
+
/**
|
|
89
|
+
* 条件值:
|
|
90
|
+
* - `env` 类型:环境变量名
|
|
91
|
+
* - `file-contains` 类型:要搜索的字符串
|
|
92
|
+
* - `custom` 类型:返回布尔值的自定义函数
|
|
93
|
+
*/
|
|
94
|
+
value: string | ((...args: any[]) => boolean);
|
|
95
|
+
/** 是否取反条件结果,默认为 `false` */
|
|
96
|
+
negate?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 按位置注入结果
|
|
100
|
+
*
|
|
101
|
+
* @description 表示按指定位置注入内容后的详细结果,
|
|
102
|
+
* 包含注入后的 HTML、是否成功标志和失败原因。
|
|
103
|
+
*/
|
|
104
|
+
interface PositionInjectResult {
|
|
105
|
+
/** 注入后的 HTML 内容 */
|
|
106
|
+
html: string;
|
|
107
|
+
/** 是否成功注入 */
|
|
108
|
+
injected: boolean;
|
|
109
|
+
/** 注入失败时的原因说明(仅在 `injected` 为 `false` 时存在) */
|
|
110
|
+
reason?: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* HTML 安全配置
|
|
114
|
+
*
|
|
115
|
+
* @description 控制 HTML 内容注入时的安全过滤策略,
|
|
116
|
+
* 可配置是否阻止危险标签和属性,以及自定义允许/阻止列表。
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* // 完全禁用安全过滤(不推荐)
|
|
121
|
+
* const config: SecurityConfig = { blockDangerousTags: false, blockDangerousAttributes: false }
|
|
122
|
+
*
|
|
123
|
+
* // 允许特定标签
|
|
124
|
+
* const config: SecurityConfig = { allowedTags: ['iframe'] }
|
|
125
|
+
*
|
|
126
|
+
* // 自定义阻止属性列表
|
|
127
|
+
* const config: SecurityConfig = { blockedAttributes: ['onclick', 'onerror'] }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
interface SecurityConfig {
|
|
131
|
+
/** 是否阻止危险 HTML 标签(如 script、iframe),默认为 `true` */
|
|
132
|
+
blockDangerousTags?: boolean;
|
|
133
|
+
/** 是否阻止危险 HTML 属性(如 onclick、onerror),默认为 `true` */
|
|
134
|
+
blockDangerousAttributes?: boolean;
|
|
135
|
+
/** 允许的标签列表,设置后将从默认阻止列表中排除这些标签 */
|
|
136
|
+
allowedTags?: string[];
|
|
137
|
+
/** 自定义阻止的标签列表,覆盖默认阻止列表 */
|
|
138
|
+
blockedTags?: string[];
|
|
139
|
+
/** 自定义阻止的属性列表,覆盖默认阻止属性列表 */
|
|
140
|
+
blockedAttributes?: string[];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export type { ConditionType as C, DualInjectResult as D, HtmlInjectResult as H, InjectCondition as I, PositionInjectResult as P, SecurityConfig as S, InjectPosition as a, SelectorMatch as b };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const common_script_index=require("../common/script/index.cjs");function validateGlobalName(t,e){if(t)try{common_script_index.validateIdentifierName(t)}catch(i){throw new Error(`${e} ${i.message}`)}}function validateNoScriptInTemplate(t,e){if(t&&common_script_index.containsScriptTag(t))throw new Error(`${e} \u4E0D\u5141\u8BB8\u5305\u542B <script> \u6807\u7B7E`)}function validateCallbackFields(t,e,i){for(const u of e){const o=t[u];if(o!==void 0&&typeof o!="string")throw new Error(`${i}.${u} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u7C7B\u578B`);if(o&&common_script_index.containsScriptTag(o))throw new Error(`${i}.${u} \u4E0D\u5141\u8BB8\u5305\u542B <script> \u6807\u7B7E`)}}function validateNonNegativeNumber(t,e){if(t!==void 0&&(typeof t!="number"||t<0))throw new Error(`${e} \u5FC5\u987B\u662F\u975E\u8D1F\u6570`)}function validateNestedDuration(t,e){if(t?.duration!==void 0&&(typeof t.duration!="number"||t.duration<0))throw new Error(e)}function validateEnumValue(t,e,i){if(t&&!e.includes(t))throw new Error(`${i} \u5FC5\u987B\u662F ${e.join(", ")}`)}exports.validateCallbackFields=validateCallbackFields,exports.validateEnumValue=validateEnumValue,exports.validateGlobalName=validateGlobalName,exports.validateNestedDuration=validateNestedDuration,exports.validateNoScriptInTemplate=validateNoScriptInTemplate,exports.validateNonNegativeNumber=validateNonNegativeNumber;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const STRING_LIKE_TYPES=new Set(["string","url","path","enum","semver",void 0]);function validateType(e,u){switch(u.type){case"number":{if(isNaN(Number(e))||e.trim()==="")return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${e}" \u4E0D\u662F\u5408\u6CD5\u6570\u5B57`};break}case"url":{try{new URL(e)}catch{return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${e}" \u4E0D\u662F\u5408\u6CD5 URL`}}break}case"boolean":{const s=e.toLowerCase();if(!["true","false","1","0","yes","no"].includes(s))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${e}" \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(e))return{valid:!1,status:"enum_mismatch",message:`\u73AF\u5883\u53D8\u91CF\u503C "${e}" \u4E0D\u5728\u5141\u8BB8\u7684\u679A\u4E3E\u503C\u4E2D: ${u.enumValues.join(", ")}`};break}case"json":{try{JSON.parse(e)}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(e))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${e}" \u4E0D\u662F\u5408\u6CD5\u8BED\u4E49\u5316\u7248\u672C\u53F7 (x.y.z)`};break}case"path":{if(!/^(?:[./\\]|(?:[a-zA-Z]:))/.test(e))return{valid:!1,status:"type_error",message:`\u73AF\u5883\u53D8\u91CF\u503C "${e}" \u4E0D\u662F\u5408\u6CD5\u6587\u4EF6\u8DEF\u5F84`};break}}return{valid:!0,status:"pass",message:""}}function validateRange(e,u){if(u.type!=="number")return{valid:!0,status:"pass",message:""};const s=Number(e);return u.minValue!==void 0&&s<u.minValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${s} \u5C0F\u4E8E\u6700\u5C0F\u503C ${u.minValue}`}:u.maxValue!==void 0&&s>u.maxValue?{valid:!1,status:"range_error",message:`\u6570\u503C ${s} \u5927\u4E8E\u6700\u5927\u503C ${u.maxValue}`}:{valid:!0,status:"pass",message:""}}function validateLength(e,u){return STRING_LIKE_TYPES.has(u.type)?u.minLength!==void 0&&e.length<u.minLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${e.length} \u5C0F\u4E8E\u6700\u5C0F\u957F\u5EA6 ${u.minLength}`}:u.maxLength!==void 0&&e.length>u.maxLength?{valid:!1,status:"length_error",message:`\u5B57\u7B26\u4E32\u957F\u5EA6 ${e.length} \u5927\u4E8E\u6700\u5927\u957F\u5EA6 ${u.maxLength}`}:{valid:!0,status:"pass",message:""}:{valid:!0,status:"pass",message:""}}function validateValue(e,u,s){const a={type:"string",required:!0,...s};if(u===void 0||u==="")return a.required!==!1?{key:e,status:"missing",message:a.message||`\u7F3A\u5C11\u5FC5\u9700\u7684\u73AF\u5883\u53D8\u91CF: ${e}`,value:u,rule:a}:{key:e,status:"pass",message:"",value:a.default??u,rule:a};const t=validateType(u,a);if(!t.valid)return{key:e,status:t.status,message:a.message||t.message,value:u,rule:a};const r=validateRange(u,a);if(!r.valid)return{key:e,status:r.status,message:a.message||r.message,value:u,rule:a};const n=validateLength(u,a);if(!n.valid)return{key:e,status:n.status,message:a.message||n.message,value:u,rule:a};if(a.pattern&&!a.pattern.test(u))return{key:e,status:"custom_error",message:a.message||`\u73AF\u5883\u53D8\u91CF ${e} \u4E0D\u5339\u914D\u6B63\u5219: ${a.pattern.source}`,value:u,rule:a};if(a.validator){const l=a.validator(u);if(l!==!0){const i=typeof l=="string"?l:"";return{key:e,status:"custom_error",message:a.message||i||`\u73AF\u5883\u53D8\u91CF ${e} \u81EA\u5B9A\u4E49\u6821\u9A8C\u5931\u8D25`,value:u,rule:a}}}return{key:e,status:"pass",message:"",value:u,rule:a}}function validateEnvironment(e,u){const s=[];for(const[a,t]of Object.entries(u)){const r=e[a];s.push(validateValue(a,r,t))}return s}exports.STRING_LIKE_TYPES=STRING_LIKE_TYPES,exports.validateEnvironment=validateEnvironment,exports.validateLength=validateLength,exports.validateRange=validateRange,exports.validateType=validateType,exports.validateValue=validateValue;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meng-xi/vite-plugin",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.4",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "一个为 Vite 提供实用插件的工具包,同时也是一个完整的插件开发框架",
|
|
7
7
|
"keywords": [
|
|
@@ -60,6 +60,11 @@
|
|
|
60
60
|
"import": "./dist/common/script/index.mjs",
|
|
61
61
|
"types": "./dist/common/script/index.d.ts"
|
|
62
62
|
},
|
|
63
|
+
"./common/ui": {
|
|
64
|
+
"require": "./dist/common/ui/index.cjs",
|
|
65
|
+
"import": "./dist/common/ui/index.mjs",
|
|
66
|
+
"types": "./dist/common/ui/index.d.ts"
|
|
67
|
+
},
|
|
63
68
|
"./common/validation": {
|
|
64
69
|
"require": "./dist/common/validation/index.cjs",
|
|
65
70
|
"import": "./dist/common/validation/index.mjs",
|
|
@@ -100,6 +105,11 @@
|
|
|
100
105
|
"import": "./dist/plugins/copyFile/index.mjs",
|
|
101
106
|
"types": "./dist/plugins/copyFile/index.d.ts"
|
|
102
107
|
},
|
|
108
|
+
"./plugins/env-guard": {
|
|
109
|
+
"require": "./dist/plugins/envGuard/index.cjs",
|
|
110
|
+
"import": "./dist/plugins/envGuard/index.mjs",
|
|
111
|
+
"types": "./dist/plugins/envGuard/index.d.ts"
|
|
112
|
+
},
|
|
103
113
|
"./plugins/favicon-manager": {
|
|
104
114
|
"require": "./dist/plugins/faviconManager/index.cjs",
|
|
105
115
|
"import": "./dist/plugins/faviconManager/index.mjs",
|