@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.
Files changed (75) hide show
  1. package/README-en.md +48 -774
  2. package/README.md +45 -769
  3. package/dist/common/html/index.cjs +2 -2
  4. package/dist/common/html/index.d.cts +268 -19
  5. package/dist/common/html/index.d.mts +268 -19
  6. package/dist/common/html/index.d.ts +268 -19
  7. package/dist/common/html/index.mjs +2 -2
  8. package/dist/common/index.cjs +1 -1
  9. package/dist/common/index.d.cts +4 -1
  10. package/dist/common/index.d.mts +4 -1
  11. package/dist/common/index.d.ts +4 -1
  12. package/dist/common/index.mjs +1 -1
  13. package/dist/common/ui/index.cjs +1 -0
  14. package/dist/common/ui/index.d.cts +132 -0
  15. package/dist/common/ui/index.d.mts +132 -0
  16. package/dist/common/ui/index.d.ts +132 -0
  17. package/dist/common/ui/index.mjs +1 -0
  18. package/dist/common/validation/index.cjs +1 -1
  19. package/dist/common/validation/index.d.cts +1 -0
  20. package/dist/common/validation/index.d.mts +1 -0
  21. package/dist/common/validation/index.d.ts +1 -0
  22. package/dist/common/validation/index.mjs +1 -1
  23. package/dist/index.cjs +1 -1
  24. package/dist/index.d.cts +6 -2
  25. package/dist/index.d.mts +6 -2
  26. package/dist/index.d.ts +6 -2
  27. package/dist/index.mjs +1 -1
  28. package/dist/plugins/buildProgress/index.cjs +2 -2
  29. package/dist/plugins/buildProgress/index.mjs +2 -2
  30. package/dist/plugins/copyFile/index.d.cts +20 -2
  31. package/dist/plugins/copyFile/index.d.mts +20 -2
  32. package/dist/plugins/copyFile/index.d.ts +20 -2
  33. package/dist/plugins/envGuard/index.cjs +67 -0
  34. package/dist/plugins/envGuard/index.d.cts +156 -0
  35. package/dist/plugins/envGuard/index.d.mts +156 -0
  36. package/dist/plugins/envGuard/index.d.ts +156 -0
  37. package/dist/plugins/envGuard/index.mjs +67 -0
  38. package/dist/plugins/faviconManager/index.cjs +1 -1
  39. package/dist/plugins/faviconManager/index.d.cts +43 -5
  40. package/dist/plugins/faviconManager/index.d.mts +43 -5
  41. package/dist/plugins/faviconManager/index.d.ts +43 -5
  42. package/dist/plugins/faviconManager/index.mjs +1 -1
  43. package/dist/plugins/generateRouter/index.d.cts +61 -14
  44. package/dist/plugins/generateRouter/index.d.mts +61 -14
  45. package/dist/plugins/generateRouter/index.d.ts +61 -14
  46. package/dist/plugins/generateVersion/index.d.cts +12 -0
  47. package/dist/plugins/generateVersion/index.d.mts +12 -0
  48. package/dist/plugins/generateVersion/index.d.ts +12 -0
  49. package/dist/plugins/htmlInject/index.cjs +1 -7
  50. package/dist/plugins/htmlInject/index.d.cts +49 -194
  51. package/dist/plugins/htmlInject/index.d.mts +49 -194
  52. package/dist/plugins/htmlInject/index.d.ts +49 -194
  53. package/dist/plugins/htmlInject/index.mjs +1 -7
  54. package/dist/plugins/index.cjs +1 -1
  55. package/dist/plugins/index.d.cts +4 -1
  56. package/dist/plugins/index.d.mts +4 -1
  57. package/dist/plugins/index.d.ts +4 -1
  58. package/dist/plugins/index.mjs +1 -1
  59. package/dist/plugins/loadingManager/index.cjs +2 -2
  60. package/dist/plugins/loadingManager/index.mjs +1 -1
  61. package/dist/plugins/versionUpdateChecker/index.cjs +2 -2
  62. package/dist/plugins/versionUpdateChecker/index.mjs +3 -3
  63. package/dist/shared/vite-plugin.BCuhU1au.mjs +7 -0
  64. package/dist/shared/vite-plugin.BrI73DHA.cjs +7 -0
  65. package/dist/shared/vite-plugin.CmtcnItg.d.cts +261 -0
  66. package/dist/shared/vite-plugin.CmtcnItg.d.mts +261 -0
  67. package/dist/shared/vite-plugin.CmtcnItg.d.ts +261 -0
  68. package/dist/shared/vite-plugin.DnFDPjNf.mjs +1 -0
  69. package/dist/shared/vite-plugin.Dumot0up.mjs +1 -0
  70. package/dist/shared/vite-plugin.FfJ-Wwfu.d.cts +143 -0
  71. package/dist/shared/vite-plugin.FfJ-Wwfu.d.mts +143 -0
  72. package/dist/shared/vite-plugin.FfJ-Wwfu.d.ts +143 -0
  73. package/dist/shared/vite-plugin.soT9a-KD.cjs +1 -0
  74. package/dist/shared/vite-plugin.vwox4bU0.cjs +1 -0
  75. package/package.json +11 -1
@@ -1,25 +1,274 @@
1
+ import { I as InjectCondition, b as SelectorMatch, a as InjectPosition, P as PositionInjectResult, S as SecurityConfig, H as HtmlInjectResult, D as DualInjectResult } from '../../shared/vite-plugin.FfJ-Wwfu.js';
2
+ export { C as ConditionType } from '../../shared/vite-plugin.FfJ-Wwfu.js';
3
+
1
4
  /**
2
- * HTML 注入结果
5
+ * HTML 注入工具模块
6
+ *
7
+ * @module common/html/inject
8
+ * @description 提供高级 HTML 内容注入功能,包括选择器匹配、模板变量替换、
9
+ * 条件判断、规则排序和多位置注入等能力,为插件提供灵活的 HTML 操作支持。
3
10
  */
4
- interface HtmlInjectResult {
5
- /** 注入后的 HTML 内容 */
6
- html: string;
7
- /** 是否成功注入 */
8
- injected: boolean;
9
- }
11
+
10
12
  /**
11
- * 双区域 HTML 注入结果
13
+ * HTML 中查找选择器匹配位置
14
+ *
15
+ * @param html - 要搜索的 HTML 字符串
16
+ * @param selector - 选择器字符串(普通字符串或正则表达式字符串)
17
+ * @param selectorMatch - 匹配模式,`'string'` 为精确字符串匹配,`'regex'` 为正则匹配
18
+ * @returns 匹配结果对象(包含 `index` 和 `length`),未匹配时返回 `null`
19
+ *
20
+ * @description 根据匹配模式在 HTML 中查找选择器的位置:
21
+ * - 字符串模式:使用 `indexOf` 进行精确匹配
22
+ * - 正则模式:使用 `RegExp` 进行正则匹配,正则语法错误时返回 `null`
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * // 字符串匹配
27
+ * findSelectorMatch('<div id="app">content</div>', '<div id="app">')
28
+ * // { index: 0, length: 14 }
29
+ *
30
+ * // 正则匹配
31
+ * findSelectorMatch('<div class="foo">bar</div>', 'class="\\w+"', 'regex')
32
+ * // { index: 5, length: 12 }
33
+ *
34
+ * // 未匹配
35
+ * findSelectorMatch('<div>hello</div>', '<span>')
36
+ * // null
37
+ * ```
12
38
  */
13
- interface DualInjectResult {
14
- /** 注入后的 HTML 内容 */
15
- html: string;
16
- /** head 区域是否成功注入 */
17
- headInjected: boolean;
18
- /** body 区域是否成功注入 */
19
- bodyInjected: boolean;
20
- /** body 注入是否使用了回退策略(追加到末尾) */
21
- usedFallback: boolean;
39
+ declare function findSelectorMatch(html: string, selector: string, selectorMatch?: SelectorMatch): {
40
+ index: number;
41
+ length: number;
42
+ } | null;
43
+ /**
44
+ * 替换模板字符串中的变量占位符
45
+ *
46
+ * @param content - 包含 `{{变量名}}` 占位符的模板字符串
47
+ * @param ruleVars - 规则级变量映射(优先级高于全局变量)
48
+ * @param globalVars - 全局变量映射
49
+ * @returns 替换所有匹配占位符后的字符串
50
+ *
51
+ * @description 将模板字符串中形如 `{{key}}` 的占位符替换为对应的值。
52
+ * 规则变量(`ruleVars`)优先级高于全局变量(`globalVars`),
53
+ * 当两者存在相同键时,规则变量的值会覆盖全局变量的值。
54
+ * 变量名中的正则特殊字符会被自动转义,替换值中的 `$` 也会被安全处理。
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * // 基本替换
59
+ * applyTemplateVars('<div>{{name}}</div>', { name: 'test' })
60
+ * // '<div>test</div>'
61
+ *
62
+ * // 规则变量覆盖全局变量
63
+ * applyTemplateVars('{{a}}-{{b}}', { a: '1' }, { a: '0', b: '2' })
64
+ * // '1-2'
65
+ *
66
+ * // 无匹配占位符
67
+ * applyTemplateVars('no vars', { x: 'y' })
68
+ * // 'no vars'
69
+ * ```
70
+ */
71
+ declare function applyTemplateVars(content: string, ruleVars?: Record<string, string>, globalVars?: Record<string, string>): string;
72
+ /**
73
+ * 评估注入条件是否满足
74
+ *
75
+ * @param condition - 注入条件配置
76
+ * @param html - 当前 HTML 内容(用于 `file-contains` 类型判断)
77
+ * @returns 条件是否满足(布尔值)
78
+ *
79
+ * @description 根据条件类型评估注入条件:
80
+ * - `env`:检查环境变量是否存在且不为 `'false'` 或 `'0'`
81
+ * - `file-contains`:检查 HTML 内容是否包含指定字符串
82
+ * - `custom`:执行自定义函数,捕获异常时返回 `false`
83
+ * - 支持通过 `negate` 字段对结果取反
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * // 环境变量判断
88
+ * evaluateCondition({ type: 'env', value: 'ENABLE_ANALYTICS' }, '')
89
+ *
90
+ * // 内容包含判断
91
+ * evaluateCondition({ type: 'file-contains', value: '<div id="app">' }, html)
92
+ *
93
+ * // 自定义函数(带取反)
94
+ * evaluateCondition(
95
+ * { type: 'custom', value: () => isDev(), negate: true },
96
+ * html
97
+ * )
98
+ * ```
99
+ */
100
+ declare function evaluateCondition(condition: InjectCondition, html: string): boolean;
101
+ /**
102
+ * 按优先级排序规则列表
103
+ *
104
+ * @typeParam T - 规则类型,必须包含可选的 `priority` 字段
105
+ * @param rules - 待排序的规则数组
106
+ * @returns 按 `priority` 升序排列的新数组(不修改原数组)
107
+ *
108
+ * @description 将规则按 `priority` 字段升序排列,`priority` 越小优先级越高。
109
+ * 未指定 `priority` 的规则默认优先级为 100。
110
+ * 返回新数组,不修改原数组。
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const rules = [
115
+ * { priority: 30, name: 'C' },
116
+ * { priority: 10, name: 'A' },
117
+ * { name: 'D' }, // 默认 priority=100
118
+ * { priority: 20, name: 'B' }
119
+ * ]
120
+ * sortRulesByPriority(rules)
121
+ * // [{ priority: 10, name: 'A' }, { priority: 20, name: 'B' },
122
+ * // { priority: 30, name: 'C' }, { name: 'D' }]
123
+ * ```
124
+ */
125
+ declare function sortRulesByPriority<T extends {
126
+ priority?: number;
127
+ }>(rules: T[]): T[];
128
+ /**
129
+ * 在 HTML 的指定位置注入内容
130
+ *
131
+ * @param html - 原始 HTML 字符串
132
+ * @param content - 要注入的内容
133
+ * @param position - 注入位置
134
+ * @param selector - 选择器字符串(仅 `before-selector`、`after-selector`、`replace-selector` 位置需要)
135
+ * @param selectorMatch - 选择器匹配模式(默认为字符串匹配)
136
+ * @returns 注入结果对象,包含注入后的 HTML、是否成功标志和失败原因
137
+ *
138
+ * @description 根据 `position` 参数将内容注入到 HTML 的指定位置:
139
+ * - `head-start`:在 `<head>` 标签开始后注入
140
+ * - `head-end`:在 `</head>` 标签前注入
141
+ * - `body-start`:在 `<body>` 标签开始后注入
142
+ * - `body-end`:在 `</body>` 标签前注入
143
+ * - `before-selector`:在选择器匹配位置前注入
144
+ * - `after-selector`:在选择器匹配位置后注入
145
+ * - `replace-selector`:替换选择器匹配的内容
146
+ *
147
+ * 当目标标签或选择器未找到时,返回 `injected: false` 并附带 `reason` 说明。
148
+ *
149
+ * @example
150
+ * ```typescript
151
+ * const html = '<html><head><title>Test</title></head><body><div id="app"></div></body></html>'
152
+ *
153
+ * // 在 head 开始后注入 meta 标签
154
+ * injectAtPosition(html, '<meta charset="utf-8">', 'head-start')
155
+ *
156
+ * // 在 body 结束前注入脚本
157
+ * injectAtPosition(html, '<script>app()</script>', 'body-end')
158
+ *
159
+ * // 在指定元素前注入
160
+ * injectAtPosition(html, '<nav>menu</nav>', 'before-selector', '<div id="app">')
161
+ *
162
+ * // 替换指定元素
163
+ * injectAtPosition(html, '<div id="root"></div>', 'replace-selector', '<div id="app">')
164
+ * ```
165
+ */
166
+ declare function injectAtPosition(html: string, content: string, position: InjectPosition, selector?: string, selectorMatch?: SelectorMatch): PositionInjectResult;
167
+
168
+ /**
169
+ * HTML 安全过滤模块
170
+ *
171
+ * @module common/html/security
172
+ * @description 提供 HTML 内容安全过滤和验证功能,防止 XSS 攻击和危险内容注入,
173
+ * 包括危险标签检测、危险属性过滤和安全配置验证等能力。
174
+ */
175
+
176
+ /**
177
+ * 默认阻止的 HTML 标签列表
178
+ *
179
+ * @description 包含可能导致安全风险的 HTML 标签:
180
+ * - `script`:可执行 JavaScript 代码
181
+ * - `iframe`:可嵌入外部页面
182
+ * - `object`/`embed`/`applet`:可嵌入插件
183
+ * - `form`/`input`/`textarea`/`select`/`button`:可创建表单
184
+ */
185
+ declare const DEFAULT_BLOCKED_TAGS: string[];
186
+ /**
187
+ * 默认阻止的 HTML 事件属性列表
188
+ *
189
+ * @description 包含所有可能导致 JavaScript 执行的事件处理属性,
190
+ * 涵盖鼠标事件、键盘事件、表单事件、拖拽事件和动画事件等。
191
+ */
192
+ declare const DEFAULT_BLOCKED_ATTRIBUTES: string[];
193
+ /**
194
+ * 验证安全配置的合法性
195
+ *
196
+ * @param security - 安全配置对象
197
+ * @throws 当 `blockedTags` 不是字符串数组时抛出错误
198
+ * @throws 当 `allowedTags` 不是字符串数组时抛出错误
199
+ * @throws 当 `blockedAttributes` 不是字符串数组时抛出错误
200
+ *
201
+ * @description 检查安全配置中的数组字段是否为合法的字符串数组类型,
202
+ * 传入 `undefined` 时直接跳过验证。
203
+ *
204
+ * @example
205
+ * ```typescript
206
+ * // 合法配置
207
+ * validateSecurityConfig({ blockedTags: ['iframe'], allowedTags: ['div'] })
208
+ *
209
+ * // 非法配置(抛出错误)
210
+ * validateSecurityConfig({ blockedTags: 'iframe' })
211
+ * // Error: security.blockedTags 必须是字符串数组
212
+ * ```
213
+ */
214
+ declare function validateSecurityConfig(security?: SecurityConfig): void;
215
+ /**
216
+ * 内容消毒规则选项
217
+ *
218
+ * @description 定义对单条注入规则内容进行安全过滤时的选项,
219
+ * 控制是否允许脚本注入等特殊行为。
220
+ */
221
+ interface SanitizeRuleOptions {
222
+ /** 规则标识符,用于错误消息和警告日志中标识来源规则 */
223
+ id?: string;
224
+ /**
225
+ * 是否允许注入 `<script>` 标签和被阻止的标签/属性
226
+ *
227
+ * @description 设置为 `true` 时,将跳过对危险标签和属性的安全检查,
228
+ * 但仍会输出警告日志提醒开发者注意安全风险。
229
+ * 仅在注入内容来源可信时使用此选项。
230
+ *
231
+ * @default false
232
+ */
233
+ allowScriptInjection?: boolean;
22
234
  }
235
+ /**
236
+ * 对注入内容进行安全过滤
237
+ *
238
+ * @param content - 待过滤的 HTML 内容字符串
239
+ * @param rule - 当前注入规则的消毒选项
240
+ * @param security - 全局安全配置
241
+ * @param logger - 日志记录器(需提供 `warn` 方法),用于输出安全警告
242
+ * @returns 过滤后的安全 HTML 内容字符串
243
+ * @throws 当内容包含被阻止的标签且未启用 `allowScriptInjection` 时抛出错误
244
+ * @throws 当内容包含危险属性且未启用 `allowScriptInjection` 时抛出错误
245
+ *
246
+ * @description 对 HTML 内容进行安全过滤,防止 XSS 攻击:
247
+ * 1. **标签过滤**:检测并阻止默认阻止列表中的标签(如 script、iframe),
248
+ * 可通过 `security.allowedTags` 放行特定标签
249
+ * 2. **属性过滤**:检测并阻止事件处理属性(如 onclick、onerror)
250
+ * 3. **脚本检测**:特别检测 `<script>` 标签,需要显式启用 `allowScriptInjection`
251
+ *
252
+ * 当 `rule.allowScriptInjection` 为 `true` 时,跳过安全检查但输出警告日志。
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * // 安全内容直接通过
257
+ * sanitizeContent('<div>safe</div>', { id: 'rule1' })
258
+ *
259
+ * // 包含 script 标签(抛出错误)
260
+ * sanitizeContent('<script>alert(1)</script>', { id: 'rule2' })
261
+ *
262
+ * // 允许脚本注入(通过但输出警告)
263
+ * sanitizeContent('<script>alert(1)</script>', { id: 'rule3', allowScriptInjection: true }, undefined, console)
264
+ *
265
+ * // 自定义安全配置
266
+ * sanitizeContent('<iframe>test</iframe>', { id: 'rule4' }, { allowedTags: ['iframe'] })
267
+ * ```
268
+ */
269
+ declare function sanitizeContent(content: string, rule: SanitizeRuleOptions, security?: SecurityConfig, logger?: {
270
+ warn: (msg: string) => void;
271
+ }): string;
23
272
 
24
273
  /**
25
274
  * 在 HTML 中指定闭合标签前注入代码
@@ -105,5 +354,5 @@ declare function injectBeforeTagWithFallback(html: string, code: string, _fallba
105
354
  */
106
355
  declare function injectHeadAndBody(html: string, headCode: string | undefined, bodyCode: string): DualInjectResult;
107
356
 
108
- export { injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority };
109
- export type { DualInjectResult, HtmlInjectResult };
357
+ export { DEFAULT_BLOCKED_ATTRIBUTES, DEFAULT_BLOCKED_TAGS, DualInjectResult, HtmlInjectResult, InjectCondition, InjectPosition, PositionInjectResult, SecurityConfig, SelectorMatch, applyTemplateVars, evaluateCondition, findSelectorMatch, injectAtPosition, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority, sanitizeContent, sortRulesByPriority, validateSecurityConfig };
358
+ export type { SanitizeRuleOptions };
@@ -1,2 +1,2 @@
1
- function d(e,t,l){const n=new RegExp(t,"i");return n.test(e)?{html:e.replace(n,`${l}
2
- ${t}`),injected:!0}:{html:e,injected:!1}}function o(e,t,l=["</head>","</body>","</html>"]){for(const n of l){const c=d(e,n,t);if(c.injected)return c}return{html:e+t,injected:!0}}function a(e,t,l){const n=d(e,"</body>",t);if(n.injected)return{...n,usedFallback:!1};const c=d(e,"</html>",t);return c.injected?{...c,usedFallback:!1}:{html:e+t,injected:!0,usedFallback:!0}}function u(e,t,l){let n=e,c=!1;if(t){const i=d(n,"</head>",t);i.injected&&(n=i.html,c=!0)}const r=a(n,l);return{html:r.html,headInjected:c,bodyInjected:r.injected,usedFallback:r.usedFallback}}export{d as injectBeforeTag,a as injectBeforeTagWithFallback,u as injectHeadAndBody,o as injectHtmlByPriority};
1
+ export{D as DEFAULT_BLOCKED_ATTRIBUTES,a as DEFAULT_BLOCKED_TAGS,b as applyTemplateVars,e as evaluateCondition,f as findSelectorMatch,i as injectAtPosition,s as sanitizeContent,c as sortRulesByPriority,v as validateSecurityConfig}from"../../shared/vite-plugin.BCuhU1au.mjs";import"../script/index.mjs";function c(e,t,i){const n=new RegExp(t,"i");return n.test(e)?{html:e.replace(n,`${i}
2
+ ${t}`),injected:!0}:{html:e,injected:!1}}function s(e,t,i=["</head>","</body>","</html>"]){for(const n of i){const a=c(e,n,t);if(a.injected)return a}return{html:e+t,injected:!0}}function o(e,t,i){const n=c(e,"</body>",t);if(n.injected)return{...n,usedFallback:!1};const a=c(e,"</html>",t);return a.injected?{...a,usedFallback:!1}:{html:e+t,injected:!0,usedFallback:!0}}function d(e,t,i){let n=e,a=!1;if(t){const r=c(n,"</head>",t);r.injected&&(n=r.html,a=!0)}const l=o(n,i);return{html:l.html,headInjected:a,bodyInjected:l.injected,usedFallback:l.usedFallback}}export{c as injectBeforeTag,o as injectBeforeTagWithFallback,d as injectHeadAndBody,s as injectHtmlByPriority};
@@ -1 +1 @@
1
- "use strict";const common_compress_index=require("./compress/index.cjs"),common_format_index=require("./format/index.cjs"),common_fs_index=require("./fs/index.cjs"),common_html_index=require("./html/index.cjs"),common_object_index=require("./object/index.cjs"),common_path_index=require("./path/index.cjs"),common_script_index=require("./script/index.cjs"),validator=require("../shared/vite-plugin.Bcg6RW2N.cjs"),common_validation_index=require("./validation/index.cjs");require("node:zlib"),require("node:stream/promises"),require("node:stream"),require("crypto"),require("node:path"),require("fs"),require("path"),exports.calculateGzipSize=common_compress_index.calculateGzipSize,exports.escapeHtmlAttr=common_format_index.escapeHtmlAttr,exports.formatDate=common_format_index.formatDate,exports.formatFileSize=common_format_index.formatFileSize,exports.generateRandomHash=common_format_index.generateRandomHash,exports.getDateFormatParams=common_format_index.getDateFormatParams,exports.getExtension=common_format_index.getExtension,exports.padNumber=common_format_index.padNumber,exports.parseTemplate=common_format_index.parseTemplate,exports.stripJsonComments=common_format_index.stripJsonComments,exports.toCamelCase=common_format_index.toCamelCase,exports.toPascalCase=common_format_index.toPascalCase,exports.checkSourceExists=common_fs_index.checkSourceExists,exports.copySourceToTarget=common_fs_index.copySourceToTarget,exports.ensureTargetDir=common_fs_index.ensureTargetDir,exports.fileExists=common_fs_index.fileExists,exports.readDirRecursive=common_fs_index.readDirRecursive,exports.readFileContent=common_fs_index.readFileContent,exports.readFileSync=common_fs_index.readFileSync,exports.runWithConcurrency=common_fs_index.runWithConcurrency,exports.scanDirectory=common_fs_index.scanDirectory,exports.shouldUpdateFile=common_fs_index.shouldUpdateFile,exports.writeFileContent=common_fs_index.writeFileContent,exports.writeJsonReport=common_fs_index.writeJsonReport,exports.injectBeforeTag=common_html_index.injectBeforeTag,exports.injectBeforeTagWithFallback=common_html_index.injectBeforeTagWithFallback,exports.injectHeadAndBody=common_html_index.injectHeadAndBody,exports.injectHtmlByPriority=common_html_index.injectHtmlByPriority,exports.deepMerge=common_object_index.deepMerge,exports.isNodeModule=common_path_index.isNodeModule,exports.containsScriptTag=common_script_index.containsScriptTag,exports.makeCallback=common_script_index.makeCallback,exports.validateIdentifierName=common_script_index.validateIdentifierName,exports.Validator=validator.Validator,exports.validateCallbackFields=common_validation_index.validateCallbackFields,exports.validateEnumValue=common_validation_index.validateEnumValue,exports.validateGlobalName=common_validation_index.validateGlobalName,exports.validateNestedDuration=common_validation_index.validateNestedDuration,exports.validateNoScriptInTemplate=common_validation_index.validateNoScriptInTemplate,exports.validateNonNegativeNumber=common_validation_index.validateNonNegativeNumber;
1
+ "use strict";const common_compress_index=require("./compress/index.cjs"),common_format_index=require("./format/index.cjs"),common_fs_index=require("./fs/index.cjs"),common_html_index=require("./html/index.cjs"),common_object_index=require("./object/index.cjs"),common_path_index=require("./path/index.cjs"),common_script_index=require("./script/index.cjs"),common_ui_index=require("./ui/index.cjs"),validator=require("../shared/vite-plugin.Bcg6RW2N.cjs"),validators=require("../shared/vite-plugin.soT9a-KD.cjs"),env=require("../shared/vite-plugin.vwox4bU0.cjs"),security=require("../shared/vite-plugin.BrI73DHA.cjs");require("node:zlib"),require("node:stream/promises"),require("node:stream"),require("crypto"),require("node:path"),require("fs"),require("path"),exports.calculateGzipSize=common_compress_index.calculateGzipSize,exports.escapeHtmlAttr=common_format_index.escapeHtmlAttr,exports.formatDate=common_format_index.formatDate,exports.formatFileSize=common_format_index.formatFileSize,exports.generateRandomHash=common_format_index.generateRandomHash,exports.getDateFormatParams=common_format_index.getDateFormatParams,exports.getExtension=common_format_index.getExtension,exports.padNumber=common_format_index.padNumber,exports.parseTemplate=common_format_index.parseTemplate,exports.stripJsonComments=common_format_index.stripJsonComments,exports.toCamelCase=common_format_index.toCamelCase,exports.toPascalCase=common_format_index.toPascalCase,exports.checkSourceExists=common_fs_index.checkSourceExists,exports.copySourceToTarget=common_fs_index.copySourceToTarget,exports.ensureTargetDir=common_fs_index.ensureTargetDir,exports.fileExists=common_fs_index.fileExists,exports.readDirRecursive=common_fs_index.readDirRecursive,exports.readFileContent=common_fs_index.readFileContent,exports.readFileSync=common_fs_index.readFileSync,exports.runWithConcurrency=common_fs_index.runWithConcurrency,exports.scanDirectory=common_fs_index.scanDirectory,exports.shouldUpdateFile=common_fs_index.shouldUpdateFile,exports.writeFileContent=common_fs_index.writeFileContent,exports.writeJsonReport=common_fs_index.writeJsonReport,exports.injectBeforeTag=common_html_index.injectBeforeTag,exports.injectBeforeTagWithFallback=common_html_index.injectBeforeTagWithFallback,exports.injectHeadAndBody=common_html_index.injectHeadAndBody,exports.injectHtmlByPriority=common_html_index.injectHtmlByPriority,exports.deepMerge=common_object_index.deepMerge,exports.isNodeModule=common_path_index.isNodeModule,exports.containsScriptTag=common_script_index.containsScriptTag,exports.makeCallback=common_script_index.makeCallback,exports.validateIdentifierName=common_script_index.validateIdentifierName,exports.ANSI=common_ui_index.ANSI,exports.SPINNER_FRAMES=common_ui_index.SPINNER_FRAMES,exports.stripAnsi=common_ui_index.stripAnsi,exports.Validator=validator.Validator,exports.validateCallbackFields=validators.validateCallbackFields,exports.validateEnumValue=validators.validateEnumValue,exports.validateGlobalName=validators.validateGlobalName,exports.validateNestedDuration=validators.validateNestedDuration,exports.validateNoScriptInTemplate=validators.validateNoScriptInTemplate,exports.validateNonNegativeNumber=validators.validateNonNegativeNumber,exports.STRING_LIKE_TYPES=env.STRING_LIKE_TYPES,exports.validateEnvironment=env.validateEnvironment,exports.validateLength=env.validateLength,exports.validateRange=env.validateRange,exports.validateType=env.validateType,exports.validateValue=env.validateValue,exports.DEFAULT_BLOCKED_ATTRIBUTES=security.DEFAULT_BLOCKED_ATTRIBUTES,exports.DEFAULT_BLOCKED_TAGS=security.DEFAULT_BLOCKED_TAGS,exports.applyTemplateVars=security.applyTemplateVars,exports.evaluateCondition=security.evaluateCondition,exports.findSelectorMatch=security.findSelectorMatch,exports.injectAtPosition=security.injectAtPosition,exports.sanitizeContent=security.sanitizeContent,exports.sortRulesByPriority=security.sortRulesByPriority,exports.validateSecurityConfig=security.validateSecurityConfig;
@@ -1,9 +1,12 @@
1
1
  export { calculateGzipSize } from './compress/index.cjs';
2
2
  export { DateFormatOptions, escapeHtmlAttr, formatDate, formatFileSize, generateRandomHash, getDateFormatParams, getExtension, padNumber, parseTemplate, stripJsonComments, toCamelCase, toPascalCase } from './format/index.cjs';
3
3
  export { CopyOptions, CopyResult, ScanDirectoryOptions, ScannedFile, checkSourceExists, copySourceToTarget, ensureTargetDir, fileExists, readDirRecursive, readFileContent, readFileSync, runWithConcurrency, scanDirectory, shouldUpdateFile, writeFileContent, writeJsonReport } from './fs/index.cjs';
4
- export { DualInjectResult, HtmlInjectResult, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority } from './html/index.cjs';
4
+ export { DEFAULT_BLOCKED_ATTRIBUTES, DEFAULT_BLOCKED_TAGS, SanitizeRuleOptions, applyTemplateVars, evaluateCondition, findSelectorMatch, injectAtPosition, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority, sanitizeContent, sortRulesByPriority, validateSecurityConfig } from './html/index.cjs';
5
5
  export { deepMerge } from './object/index.cjs';
6
6
  export { isNodeModule } from './path/index.cjs';
7
7
  export { containsScriptTag, makeCallback, validateIdentifierName } from './script/index.cjs';
8
+ export { ANSI, SPINNER_FRAMES, stripAnsi } from './ui/index.cjs';
8
9
  export { V as Validator } from '../shared/vite-plugin.DRRlWY8P.cjs';
9
10
  export { validateCallbackFields, validateEnumValue, validateGlobalName, validateNestedDuration, validateNoScriptInTemplate, validateNonNegativeNumber } from './validation/index.cjs';
11
+ export { E as EnvFieldRule, a as EnvType, b as EnvValidationResult, S as STRING_LIKE_TYPES, v as validateEnvironment, c as validateLength, d as validateRange, e as validateType, f as validateValue } from '../shared/vite-plugin.CmtcnItg.cjs';
12
+ export { C as ConditionType, D as DualInjectResult, H as HtmlInjectResult, I as InjectCondition, a as InjectPosition, P as PositionInjectResult, S as SecurityConfig, b as SelectorMatch } from '../shared/vite-plugin.FfJ-Wwfu.cjs';
@@ -1,9 +1,12 @@
1
1
  export { calculateGzipSize } from './compress/index.mjs';
2
2
  export { DateFormatOptions, escapeHtmlAttr, formatDate, formatFileSize, generateRandomHash, getDateFormatParams, getExtension, padNumber, parseTemplate, stripJsonComments, toCamelCase, toPascalCase } from './format/index.mjs';
3
3
  export { CopyOptions, CopyResult, ScanDirectoryOptions, ScannedFile, checkSourceExists, copySourceToTarget, ensureTargetDir, fileExists, readDirRecursive, readFileContent, readFileSync, runWithConcurrency, scanDirectory, shouldUpdateFile, writeFileContent, writeJsonReport } from './fs/index.mjs';
4
- export { DualInjectResult, HtmlInjectResult, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority } from './html/index.mjs';
4
+ export { DEFAULT_BLOCKED_ATTRIBUTES, DEFAULT_BLOCKED_TAGS, SanitizeRuleOptions, applyTemplateVars, evaluateCondition, findSelectorMatch, injectAtPosition, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority, sanitizeContent, sortRulesByPriority, validateSecurityConfig } from './html/index.mjs';
5
5
  export { deepMerge } from './object/index.mjs';
6
6
  export { isNodeModule } from './path/index.mjs';
7
7
  export { containsScriptTag, makeCallback, validateIdentifierName } from './script/index.mjs';
8
+ export { ANSI, SPINNER_FRAMES, stripAnsi } from './ui/index.mjs';
8
9
  export { V as Validator } from '../shared/vite-plugin.DRRlWY8P.mjs';
9
10
  export { validateCallbackFields, validateEnumValue, validateGlobalName, validateNestedDuration, validateNoScriptInTemplate, validateNonNegativeNumber } from './validation/index.mjs';
11
+ export { E as EnvFieldRule, a as EnvType, b as EnvValidationResult, S as STRING_LIKE_TYPES, v as validateEnvironment, c as validateLength, d as validateRange, e as validateType, f as validateValue } from '../shared/vite-plugin.CmtcnItg.mjs';
12
+ export { C as ConditionType, D as DualInjectResult, H as HtmlInjectResult, I as InjectCondition, a as InjectPosition, P as PositionInjectResult, S as SecurityConfig, b as SelectorMatch } from '../shared/vite-plugin.FfJ-Wwfu.mjs';
@@ -1,9 +1,12 @@
1
1
  export { calculateGzipSize } from './compress/index.js';
2
2
  export { DateFormatOptions, escapeHtmlAttr, formatDate, formatFileSize, generateRandomHash, getDateFormatParams, getExtension, padNumber, parseTemplate, stripJsonComments, toCamelCase, toPascalCase } from './format/index.js';
3
3
  export { CopyOptions, CopyResult, ScanDirectoryOptions, ScannedFile, checkSourceExists, copySourceToTarget, ensureTargetDir, fileExists, readDirRecursive, readFileContent, readFileSync, runWithConcurrency, scanDirectory, shouldUpdateFile, writeFileContent, writeJsonReport } from './fs/index.js';
4
- export { DualInjectResult, HtmlInjectResult, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority } from './html/index.js';
4
+ export { DEFAULT_BLOCKED_ATTRIBUTES, DEFAULT_BLOCKED_TAGS, SanitizeRuleOptions, applyTemplateVars, evaluateCondition, findSelectorMatch, injectAtPosition, injectBeforeTag, injectBeforeTagWithFallback, injectHeadAndBody, injectHtmlByPriority, sanitizeContent, sortRulesByPriority, validateSecurityConfig } from './html/index.js';
5
5
  export { deepMerge } from './object/index.js';
6
6
  export { isNodeModule } from './path/index.js';
7
7
  export { containsScriptTag, makeCallback, validateIdentifierName } from './script/index.js';
8
+ export { ANSI, SPINNER_FRAMES, stripAnsi } from './ui/index.js';
8
9
  export { V as Validator } from '../shared/vite-plugin.DRRlWY8P.js';
9
10
  export { validateCallbackFields, validateEnumValue, validateGlobalName, validateNestedDuration, validateNoScriptInTemplate, validateNonNegativeNumber } from './validation/index.js';
11
+ export { E as EnvFieldRule, a as EnvType, b as EnvValidationResult, S as STRING_LIKE_TYPES, v as validateEnvironment, c as validateLength, d as validateRange, e as validateType, f as validateValue } from '../shared/vite-plugin.CmtcnItg.js';
12
+ export { C as ConditionType, D as DualInjectResult, H as HtmlInjectResult, I as InjectCondition, a as InjectPosition, P as PositionInjectResult, S as SecurityConfig, b as SelectorMatch } from '../shared/vite-plugin.FfJ-Wwfu.js';
@@ -1 +1 @@
1
- export{calculateGzipSize}from"./compress/index.mjs";export{escapeHtmlAttr,formatDate,formatFileSize,generateRandomHash,getDateFormatParams,getExtension,padNumber,parseTemplate,stripJsonComments,toCamelCase,toPascalCase}from"./format/index.mjs";export{checkSourceExists,copySourceToTarget,ensureTargetDir,fileExists,readDirRecursive,readFileContent,readFileSync,runWithConcurrency,scanDirectory,shouldUpdateFile,writeFileContent,writeJsonReport}from"./fs/index.mjs";export{injectBeforeTag,injectBeforeTagWithFallback,injectHeadAndBody,injectHtmlByPriority}from"./html/index.mjs";export{deepMerge}from"./object/index.mjs";export{isNodeModule}from"./path/index.mjs";export{containsScriptTag,makeCallback,validateIdentifierName}from"./script/index.mjs";export{V as Validator}from"../shared/vite-plugin.DcExl6jd.mjs";export{validateCallbackFields,validateEnumValue,validateGlobalName,validateNestedDuration,validateNoScriptInTemplate,validateNonNegativeNumber}from"./validation/index.mjs";import"node:zlib";import"node:stream/promises";import"node:stream";import"crypto";import"node:path";import"fs";import"path";
1
+ export{calculateGzipSize}from"./compress/index.mjs";export{escapeHtmlAttr,formatDate,formatFileSize,generateRandomHash,getDateFormatParams,getExtension,padNumber,parseTemplate,stripJsonComments,toCamelCase,toPascalCase}from"./format/index.mjs";export{checkSourceExists,copySourceToTarget,ensureTargetDir,fileExists,readDirRecursive,readFileContent,readFileSync,runWithConcurrency,scanDirectory,shouldUpdateFile,writeFileContent,writeJsonReport}from"./fs/index.mjs";export{injectBeforeTag,injectBeforeTagWithFallback,injectHeadAndBody,injectHtmlByPriority}from"./html/index.mjs";export{deepMerge}from"./object/index.mjs";export{isNodeModule}from"./path/index.mjs";export{containsScriptTag,makeCallback,validateIdentifierName}from"./script/index.mjs";export{ANSI,SPINNER_FRAMES,stripAnsi}from"./ui/index.mjs";export{V as Validator}from"../shared/vite-plugin.DcExl6jd.mjs";export{v as validateCallbackFields,a as validateEnumValue,b as validateGlobalName,c as validateNestedDuration,d as validateNoScriptInTemplate,e as validateNonNegativeNumber}from"../shared/vite-plugin.Dumot0up.mjs";export{S as STRING_LIKE_TYPES,v as validateEnvironment,a as validateLength,b as validateRange,c as validateType,d as validateValue}from"../shared/vite-plugin.DnFDPjNf.mjs";export{D as DEFAULT_BLOCKED_ATTRIBUTES,a as DEFAULT_BLOCKED_TAGS,b as applyTemplateVars,e as evaluateCondition,f as findSelectorMatch,i as injectAtPosition,s as sanitizeContent,c as sortRulesByPriority,v as validateSecurityConfig}from"../shared/vite-plugin.BCuhU1au.mjs";import"node:zlib";import"node:stream/promises";import"node:stream";import"crypto";import"node:path";import"fs";import"path";
@@ -0,0 +1 @@
1
+ "use strict";const SPINNER_FRAMES=process.platform==="win32"?["|","/","-","\\"]:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],ANSI={reset:"\x1B[0G",clearLine:"\x1B[2K",hideCursor:"\x1B[?25l",showCursor:"\x1B[?25h",green:r=>`\x1B[32m${r}\x1B[39m`,cyan:r=>`\x1B[36m${r}\x1B[39m`,gray:r=>`\x1B[90m${r}\x1B[39m`,bold:r=>`\x1B[1m${r}\x1B[22m`,red:r=>`\x1B[31m${r}\x1B[39m`,yellow:r=>`\x1B[33m${r}\x1B[39m`,magenta:r=>`\x1B[35m${r}\x1B[39m`},x=/\x1b\[[0-9;]*m/g;function stripAnsi(r){return r.replace(x,"")}exports.ANSI=ANSI,exports.SPINNER_FRAMES=SPINNER_FRAMES,exports.stripAnsi=stripAnsi;
@@ -0,0 +1,132 @@
1
+ /**
2
+ * 终端 UI 工具模块
3
+ *
4
+ * @module common/ui/terminal
5
+ * @description 提供终端 ANSI 转义码处理、Spinner 动画帧和字符串清理等工具函数,
6
+ * 用于在终端中实现彩色输出、光标控制和进度动画等功能。
7
+ */
8
+ /**
9
+ * Spinner 动画帧序列
10
+ *
11
+ * @description 根据操作系统平台自动选择合适的动画帧:
12
+ * - Windows:使用 ASCII 字符 `|`, `/`, `-`, `\`,确保在传统终端中正常显示
13
+ * - 其他平台:使用 Unicode Braille 字符 `⠋`-`⠏`,视觉效果更流畅
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * let frameIndex = 0
18
+ * setInterval(() => {
19
+ * process.stdout.write(`\r${SPINNER_FRAMES[frameIndex]} Loading...`)
20
+ * frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length
21
+ * }, 80)
22
+ * ```
23
+ */
24
+ declare const SPINNER_FRAMES: string[];
25
+ /**
26
+ * ANSI 转义码工具集
27
+ *
28
+ * @description 提供常用的终端 ANSI 转义码常量和彩色文本包装函数,
29
+ * 用于在终端中实现文本着色、光标控制和行清理等操作。
30
+ *
31
+ * @property reset - 将光标重置到行首(`\x1b[0G`)
32
+ * @property clearLine - 清除当前行内容(`\x1b[2K`)
33
+ * @property hideCursor - 隐藏终端光标(`\x1b[?25l`)
34
+ * @property showCursor - 显示终端光标(`\x1b[?25h`)
35
+ * @property green - 将文本包装为绿色
36
+ * @property cyan - 将文本包装为青色
37
+ * @property gray - 将文本包装为灰色
38
+ * @property bold - 将文本包装为粗体
39
+ * @property red - 将文本包装为红色
40
+ * @property yellow - 将文本包装为黄色
41
+ * @property magenta - 将文本包装为品红色
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // 彩色输出
46
+ * console.log(ANSI.green('✓') + ' 构建成功')
47
+ * console.log(ANSI.red('✗') + ' 构建失败')
48
+ * console.log(ANSI.bold(ANSI.cyan('信息:')) + ' 正在处理...')
49
+ *
50
+ * // 光标控制
51
+ * process.stdout.write(ANSI.hideCursor)
52
+ * // ... 动画逻辑 ...
53
+ * process.stdout.write(ANSI.showCursor)
54
+ *
55
+ * // 行清理与重写
56
+ * process.stdout.write(ANSI.clearLine + ANSI.reset + ANSI.green('完成'))
57
+ * ```
58
+ */
59
+ declare const ANSI: {
60
+ /** 将光标重置到行首 */
61
+ reset: string;
62
+ /** 清除当前行内容 */
63
+ clearLine: string;
64
+ /** 隐藏终端光标 */
65
+ hideCursor: string;
66
+ /** 显示终端光标 */
67
+ showCursor: string;
68
+ /**
69
+ * 将文本包装为绿色
70
+ * @param t - 要着色的文本
71
+ * @returns 包含绿色 ANSI 转义码的字符串
72
+ */
73
+ green: (t: string) => string;
74
+ /**
75
+ * 将文本包装为青色
76
+ * @param t - 要着色的文本
77
+ * @returns 包含青色 ANSI 转义码的字符串
78
+ */
79
+ cyan: (t: string) => string;
80
+ /**
81
+ * 将文本包装为灰色
82
+ * @param t - 要着色的文本
83
+ * @returns 包含灰色 ANSI 转义码的字符串
84
+ */
85
+ gray: (t: string) => string;
86
+ /**
87
+ * 将文本包装为粗体
88
+ * @param t - 要加粗的文本
89
+ * @returns 包含粗体 ANSI 转义码的字符串
90
+ */
91
+ bold: (t: string) => string;
92
+ /**
93
+ * 将文本包装为红色
94
+ * @param t - 要着色的文本
95
+ * @returns 包含红色 ANSI 转义码的字符串
96
+ */
97
+ red: (t: string) => string;
98
+ /**
99
+ * 将文本包装为黄色
100
+ * @param t - 要着色的文本
101
+ * @returns 包含黄色 ANSI 转义码的字符串
102
+ */
103
+ yellow: (t: string) => string;
104
+ /**
105
+ * 将文本包装为品红色
106
+ * @param t - 要着色的文本
107
+ * @returns 包含品红色 ANSI 转义码的字符串
108
+ */
109
+ magenta: (t: string) => string;
110
+ };
111
+ /**
112
+ * 移除字符串中的所有 ANSI 转义码
113
+ *
114
+ * @param str - 可能包含 ANSI 转义码的字符串
115
+ * @returns 不包含任何 ANSI 转义码的纯文本字符串
116
+ *
117
+ * @description 使用正则表达式匹配并移除所有形如 `\x1b[...m` 的 ANSI 转义序列,
118
+ * 常用于计算文本实际显示宽度或将彩色输出转为纯文本。
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * const colored = ANSI.green('hello') + ' ' + ANSI.red('world')
123
+ * stripAnsi(colored) // 'hello world'
124
+ *
125
+ * // 计算终端显示宽度
126
+ * const text = ANSI.bold(ANSI.cyan('状态:')) + ' 完成'
127
+ * stripAnsi(text).length // 7 (不含转义码的实际字符数)
128
+ * ```
129
+ */
130
+ declare function stripAnsi(str: string): string;
131
+
132
+ export { ANSI, SPINNER_FRAMES, stripAnsi };
@@ -0,0 +1,132 @@
1
+ /**
2
+ * 终端 UI 工具模块
3
+ *
4
+ * @module common/ui/terminal
5
+ * @description 提供终端 ANSI 转义码处理、Spinner 动画帧和字符串清理等工具函数,
6
+ * 用于在终端中实现彩色输出、光标控制和进度动画等功能。
7
+ */
8
+ /**
9
+ * Spinner 动画帧序列
10
+ *
11
+ * @description 根据操作系统平台自动选择合适的动画帧:
12
+ * - Windows:使用 ASCII 字符 `|`, `/`, `-`, `\`,确保在传统终端中正常显示
13
+ * - 其他平台:使用 Unicode Braille 字符 `⠋`-`⠏`,视觉效果更流畅
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * let frameIndex = 0
18
+ * setInterval(() => {
19
+ * process.stdout.write(`\r${SPINNER_FRAMES[frameIndex]} Loading...`)
20
+ * frameIndex = (frameIndex + 1) % SPINNER_FRAMES.length
21
+ * }, 80)
22
+ * ```
23
+ */
24
+ declare const SPINNER_FRAMES: string[];
25
+ /**
26
+ * ANSI 转义码工具集
27
+ *
28
+ * @description 提供常用的终端 ANSI 转义码常量和彩色文本包装函数,
29
+ * 用于在终端中实现文本着色、光标控制和行清理等操作。
30
+ *
31
+ * @property reset - 将光标重置到行首(`\x1b[0G`)
32
+ * @property clearLine - 清除当前行内容(`\x1b[2K`)
33
+ * @property hideCursor - 隐藏终端光标(`\x1b[?25l`)
34
+ * @property showCursor - 显示终端光标(`\x1b[?25h`)
35
+ * @property green - 将文本包装为绿色
36
+ * @property cyan - 将文本包装为青色
37
+ * @property gray - 将文本包装为灰色
38
+ * @property bold - 将文本包装为粗体
39
+ * @property red - 将文本包装为红色
40
+ * @property yellow - 将文本包装为黄色
41
+ * @property magenta - 将文本包装为品红色
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // 彩色输出
46
+ * console.log(ANSI.green('✓') + ' 构建成功')
47
+ * console.log(ANSI.red('✗') + ' 构建失败')
48
+ * console.log(ANSI.bold(ANSI.cyan('信息:')) + ' 正在处理...')
49
+ *
50
+ * // 光标控制
51
+ * process.stdout.write(ANSI.hideCursor)
52
+ * // ... 动画逻辑 ...
53
+ * process.stdout.write(ANSI.showCursor)
54
+ *
55
+ * // 行清理与重写
56
+ * process.stdout.write(ANSI.clearLine + ANSI.reset + ANSI.green('完成'))
57
+ * ```
58
+ */
59
+ declare const ANSI: {
60
+ /** 将光标重置到行首 */
61
+ reset: string;
62
+ /** 清除当前行内容 */
63
+ clearLine: string;
64
+ /** 隐藏终端光标 */
65
+ hideCursor: string;
66
+ /** 显示终端光标 */
67
+ showCursor: string;
68
+ /**
69
+ * 将文本包装为绿色
70
+ * @param t - 要着色的文本
71
+ * @returns 包含绿色 ANSI 转义码的字符串
72
+ */
73
+ green: (t: string) => string;
74
+ /**
75
+ * 将文本包装为青色
76
+ * @param t - 要着色的文本
77
+ * @returns 包含青色 ANSI 转义码的字符串
78
+ */
79
+ cyan: (t: string) => string;
80
+ /**
81
+ * 将文本包装为灰色
82
+ * @param t - 要着色的文本
83
+ * @returns 包含灰色 ANSI 转义码的字符串
84
+ */
85
+ gray: (t: string) => string;
86
+ /**
87
+ * 将文本包装为粗体
88
+ * @param t - 要加粗的文本
89
+ * @returns 包含粗体 ANSI 转义码的字符串
90
+ */
91
+ bold: (t: string) => string;
92
+ /**
93
+ * 将文本包装为红色
94
+ * @param t - 要着色的文本
95
+ * @returns 包含红色 ANSI 转义码的字符串
96
+ */
97
+ red: (t: string) => string;
98
+ /**
99
+ * 将文本包装为黄色
100
+ * @param t - 要着色的文本
101
+ * @returns 包含黄色 ANSI 转义码的字符串
102
+ */
103
+ yellow: (t: string) => string;
104
+ /**
105
+ * 将文本包装为品红色
106
+ * @param t - 要着色的文本
107
+ * @returns 包含品红色 ANSI 转义码的字符串
108
+ */
109
+ magenta: (t: string) => string;
110
+ };
111
+ /**
112
+ * 移除字符串中的所有 ANSI 转义码
113
+ *
114
+ * @param str - 可能包含 ANSI 转义码的字符串
115
+ * @returns 不包含任何 ANSI 转义码的纯文本字符串
116
+ *
117
+ * @description 使用正则表达式匹配并移除所有形如 `\x1b[...m` 的 ANSI 转义序列,
118
+ * 常用于计算文本实际显示宽度或将彩色输出转为纯文本。
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * const colored = ANSI.green('hello') + ' ' + ANSI.red('world')
123
+ * stripAnsi(colored) // 'hello world'
124
+ *
125
+ * // 计算终端显示宽度
126
+ * const text = ANSI.bold(ANSI.cyan('状态:')) + ' 完成'
127
+ * stripAnsi(text).length // 7 (不含转义码的实际字符数)
128
+ * ```
129
+ */
130
+ declare function stripAnsi(str: string): string;
131
+
132
+ export { ANSI, SPINNER_FRAMES, stripAnsi };