schema-dsl 1.0.7 → 1.0.8
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/CHANGELOG.md +63 -12
- package/lib/core/ErrorFormatter.js +21 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,18 +9,69 @@
|
|
|
9
9
|
|
|
10
10
|
## 版本概览
|
|
11
11
|
|
|
12
|
-
| 版本
|
|
13
|
-
|
|
14
|
-
| [v1.0.
|
|
15
|
-
| [v1.0.
|
|
16
|
-
| [v1.0.
|
|
17
|
-
| [v1.0.
|
|
18
|
-
| [v1.0.
|
|
19
|
-
| [v1.0.
|
|
20
|
-
| [v1.0.
|
|
21
|
-
| [v1.0.
|
|
22
|
-
| [v1.0.
|
|
23
|
-
| [v1.0.
|
|
12
|
+
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
13
|
+
|------------------|------|---------|------|
|
|
14
|
+
| [v1.0.8](#v1071) | 2026-01-04 | 优化:错误消息过滤增强 | [查看详情](#v1071) |
|
|
15
|
+
| [v1.0.7](#v107) | 2026-01-04 | 修复:dsl.match/dsl.if 嵌套支持 dsl() 包裹 | [查看详情](#v107) |
|
|
16
|
+
| [v1.0.6](#v106) | 2026-01-04 | 🚨 紧急修复:TypeScript 类型污染 | [查看详情](#v106) |
|
|
17
|
+
| [v1.0.7](#v107) | 2026-01-04 | 修复:dsl.match/dsl.if 嵌套支持 dsl() 包裹 | [查看详情](#v107) |
|
|
18
|
+
| [v1.0.6](#v106) | 2026-01-04 | 🚨 紧急修复:TypeScript 类型污染 | [查看详情](#v106) |
|
|
19
|
+
| [v1.0.5](#v105) | 2026-01-04 | 测试覆盖率提升至 97% | [查看详情](#v105) |
|
|
20
|
+
| [v1.0.4](#v104) | 2025-12-31 | TypeScript 完整支持、validateAsync、ValidationError | [查看详情](#v104) |
|
|
21
|
+
| [v1.0.3](#v103) | 2025-12-31 | ⚠️ 破坏性变更:单值语法修复 | [查看详情](#v103) |
|
|
22
|
+
| [v1.0.2](#v102) | 2025-12-31 | 15个新增验证器、完整文档、75个测试 | [查看详情](#v102) |
|
|
23
|
+
| [v1.0.1](#v101) | 2025-12-31 | 枚举功能、自动类型识别、统一错误消息 | [查看详情](#v101) |
|
|
24
|
+
| [v1.0.0](#v100) | 2025-12-29 | 初始发布版本 | [查看详情](#v100) |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## [v1.0.8] - 2026-01-04
|
|
29
|
+
|
|
30
|
+
### Improved (优化)
|
|
31
|
+
|
|
32
|
+
#### 错误消息过滤增强 ⭐
|
|
33
|
+
|
|
34
|
+
**问题描述**:
|
|
35
|
+
用户报告错误消息存在冗余问题:
|
|
36
|
+
- 在嵌套 If/Match 结构中,会显示重复的 "must match then schema" 包装错误
|
|
37
|
+
- 当已有具体字段错误时(如"Credit price is required"),还会额外显示2-3个通用包装错误
|
|
38
|
+
|
|
39
|
+
**修复内容**:
|
|
40
|
+
- ✅ 过滤 `if` 关键字的包装错误
|
|
41
|
+
- ✅ 过滤 `anyOf` 关键字的包装错误
|
|
42
|
+
- ✅ 过滤 `oneOf` 关键字的包装错误
|
|
43
|
+
- ✅ 当存在具体字段错误时,自动移除所有包装错误
|
|
44
|
+
|
|
45
|
+
**修复效果**:
|
|
46
|
+
|
|
47
|
+
修复前:
|
|
48
|
+
```javascript
|
|
49
|
+
const result = validate(schema, data);
|
|
50
|
+
// errors: [
|
|
51
|
+
// { message: "Credit price is required" },
|
|
52
|
+
// { message: "must match then schema" }, // 冗余
|
|
53
|
+
// { message: "must match then schema" } // 冗余
|
|
54
|
+
// ]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
修复后:
|
|
58
|
+
```javascript
|
|
59
|
+
const result = validate(schema, data);
|
|
60
|
+
// errors: [
|
|
61
|
+
// { message: "Credit price is required" } // 只显示具体错误
|
|
62
|
+
// ]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**技术细节**:
|
|
66
|
+
- 修改文件:[lib/core/ErrorFormatter.js](lib/core/ErrorFormatter.js#L84-L101)
|
|
67
|
+
- 过滤逻辑:检测到具体错误(type, required, pattern等)时,自动过滤包装错误(if, anyOf, oneOf)
|
|
68
|
+
- 适用场景:所有使用 `dsl.if()`、`dsl.match()` 以及 JSON Schema 的 anyOf/oneOf 的验证
|
|
69
|
+
|
|
70
|
+
**测试覆盖**:
|
|
71
|
+
- 测试文件:[test/unit/error-message-filter.test.js](test/unit/error-message-filter.test.js)
|
|
72
|
+
- 新增测试:5个错误过滤场景
|
|
73
|
+
- 测试总数:725 (+5)
|
|
74
|
+
- 所有测试通过 ✅
|
|
24
75
|
|
|
25
76
|
---
|
|
26
77
|
|
|
@@ -80,6 +80,27 @@ class ErrorFormatter {
|
|
|
80
80
|
errors = [errors];
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
// 过滤冗余的包装错误(v1.0.7.1 增强)
|
|
84
|
+
// 当存在具体字段错误时,移除通用的包装错误
|
|
85
|
+
const hasConcreteErrors = errors.some(err => {
|
|
86
|
+
const keyword = err.keyword;
|
|
87
|
+
// 包装错误关键字:if, anyOf, oneOf, allOf
|
|
88
|
+
return keyword !== 'if' &&
|
|
89
|
+
keyword !== 'anyOf' &&
|
|
90
|
+
keyword !== 'oneOf' &&
|
|
91
|
+
keyword !== 'error';
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
if (hasConcreteErrors) {
|
|
95
|
+
// 过滤掉包装错误(这些是通用的组合验证错误)
|
|
96
|
+
errors = errors.filter(err => {
|
|
97
|
+
const keyword = err.keyword;
|
|
98
|
+
return keyword !== 'if' &&
|
|
99
|
+
keyword !== 'anyOf' &&
|
|
100
|
+
keyword !== 'oneOf';
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
83
104
|
// 获取当前使用的消息模板
|
|
84
105
|
const messages = locale ? this._loadMessages(locale) : this.messages;
|
|
85
106
|
|