schema-dsl 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -3
- package/README.md +149 -4
- package/STATUS.md +37 -3
- package/changelogs/v1.1.5.md +493 -0
- package/docs/error-handling.md +247 -2
- package/docs/runtime-locale-support.md +27 -0
- package/index.d.ts +77 -2
- package/lib/core/Locale.js +28 -22
- package/lib/core/MessageTemplate.js +30 -21
- package/lib/core/Validator.js +6 -1
- package/lib/errors/I18nError.js +38 -9
- package/lib/locales/en-US.js +13 -3
- package/lib/locales/zh-CN.js +14 -3
- package/lib/validators/CustomKeywords.js +10 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 变更日志 (CHANGELOG)
|
|
2
2
|
|
|
3
3
|
> **说明**: 版本概览摘要,详细变更见 [changelogs/](./changelogs/) 目录
|
|
4
|
-
> **最后更新**: 2026-01-
|
|
4
|
+
> **最后更新**: 2026-01-17
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
11
11
|
|------|------|---------|------|
|
|
12
|
+
| [v1.1.5](./changelogs/v1.1.5.md) | 2026-01-17 | 🚀 新功能:错误配置对象格式支持 - 语言包支持 `{ code, message }` 对象格式 | [查看](./changelogs/v1.1.5.md) |
|
|
12
13
|
| [v1.1.4](./changelogs/v1.1.4.md) | 2026-01-13 | 🔧 TypeScript类型修复:移除重复函数签名 + 多语言文档完善 | [查看](./changelogs/v1.1.4.md) |
|
|
13
14
|
| [v1.1.3](./changelogs/v1.1.3.md) | 2026-01-09 | 🐛 Bug修复:类型错误消息模板变量未替换 | [查看](./changelogs/v1.1.3.md) |
|
|
14
15
|
| [v1.1.2](./changelogs/v1.1.2.md) | 2026-01-06 | 🎉 新功能:数字比较运算符 + Bug修复 | [查看](./changelogs/v1.1.2.md) |
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
| [v1.0.0](./changelogs/v1.0.0.md) | 2025-12-29 | 初始发布版本 | [查看](./changelogs/v1.0.0.md) |
|
|
27
28
|
|
|
28
29
|
> 💡 **提示**: 重要版本的详细变更记录在 [changelogs/](./changelogs/) 目录中。
|
|
29
|
-
> 当前已有详细文档的版本:v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
|
|
30
|
+
> 当前已有详细文档的版本:v1.1.5, v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
|
|
30
31
|
> 其他版本的详细变更信息请参考项目提交历史或联系维护者。
|
|
31
32
|
|
|
32
33
|
---
|
|
@@ -35,13 +36,27 @@
|
|
|
35
36
|
|
|
36
37
|
| 版本系列 | 版本数 | 主要改进方向 |
|
|
37
38
|
|---------|-------|------------|
|
|
38
|
-
| v1.1.x |
|
|
39
|
+
| v1.1.x | 6 | 错误配置增强、TypeScript类型完善、多语言支持、数字运算符、联合类型 |
|
|
39
40
|
| v1.0.x | 10 | 核心功能、验证器、测试覆盖、文档完善 |
|
|
40
41
|
|
|
41
42
|
---
|
|
42
43
|
|
|
43
44
|
## 里程碑版本
|
|
44
45
|
|
|
46
|
+
### v1.1.5 - 错误配置对象格式支持 🚀
|
|
47
|
+
|
|
48
|
+
**发布日期**: 2026-01-17
|
|
49
|
+
**重要性**: ⭐⭐⭐⭐
|
|
50
|
+
|
|
51
|
+
**核心改进**:
|
|
52
|
+
- ✨ 语言包支持对象格式 `{ code, message }`,统一错误代码管理
|
|
53
|
+
- ✨ I18nError 新增 `originalKey` 字段,保留原始 key
|
|
54
|
+
- ✨ 多语言共享相同的 `code`,便于前端统一处理
|
|
55
|
+
- ✅ 完全向后兼容,字符串格式自动转换为对象
|
|
56
|
+
- ✅ `error.is()` 同时支持 code 和 originalKey 判断
|
|
57
|
+
|
|
58
|
+
**测试覆盖**: 942 个测试通过 (98.6%)
|
|
59
|
+
|
|
45
60
|
### v1.1.4 - TypeScript类型修复与文档完善 🔧
|
|
46
61
|
|
|
47
62
|
**发布日期**: 2026-01-13
|
package/README.md
CHANGED
|
@@ -68,9 +68,68 @@ console.log(result.valid); // true
|
|
|
68
68
|
|
|
69
69
|
---
|
|
70
70
|
|
|
71
|
-
## 🆕 最新特性(v1.1.
|
|
71
|
+
## 🆕 最新特性(v1.1.5)
|
|
72
72
|
|
|
73
|
-
###
|
|
73
|
+
### 🎯 错误配置对象格式支持(v1.1.5)
|
|
74
|
+
|
|
75
|
+
**统一错误代码,多语言共享,前端友好**
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
// 语言包配置(支持对象格式)
|
|
79
|
+
const locales = {
|
|
80
|
+
'zh-CN': {
|
|
81
|
+
'account.notFound': {
|
|
82
|
+
code: 40001, // 统一的数字错误代码
|
|
83
|
+
message: '账户不存在'
|
|
84
|
+
},
|
|
85
|
+
'account.insufficientBalance': {
|
|
86
|
+
code: 40002,
|
|
87
|
+
message: '余额不足,当前{{#balance}},需要{{#required}}'
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
'en-US': {
|
|
91
|
+
'account.notFound': {
|
|
92
|
+
code: 40001, // 相同的数字 code
|
|
93
|
+
message: 'Account not found'
|
|
94
|
+
},
|
|
95
|
+
'account.insufficientBalance': {
|
|
96
|
+
code: 40002,
|
|
97
|
+
message: 'Insufficient balance: {{#balance}}, required: {{#required}}'
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// 使用
|
|
103
|
+
try {
|
|
104
|
+
dsl.error.throw('account.notFound');
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.log(error.code); // 40001 (统一数字代码)
|
|
107
|
+
console.log(error.originalKey); // 'account.notFound' (原始key)
|
|
108
|
+
console.log(error.message); // 中文: "账户不存在" / 英文: "Account not found"
|
|
109
|
+
|
|
110
|
+
// 增强的 error.is() - 两种方式都支持
|
|
111
|
+
if (error.is('account.notFound')) { } // ✅ 使用 originalKey
|
|
112
|
+
if (error.is(40001)) { } // ✅ 使用数字 code
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 前端统一处理
|
|
116
|
+
switch (error.code) {
|
|
117
|
+
case 40001: showNotFoundPage(); break; // 不受语言影响
|
|
118
|
+
case 40002: showTopUpDialog(); break;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**核心优势**:
|
|
123
|
+
- 🎯 **统一错误代码**: 不同语言使用相同的数字 `code`,便于前端统一处理
|
|
124
|
+
- 🔄 **完全向后兼容**: 字符串格式自动转换,现有代码无需修改
|
|
125
|
+
- 📊 **更好的错误追踪**: `originalKey` 和 `code` 分离,便于日志分析
|
|
126
|
+
- 🌍 **多语言友好**: 前端可以用统一的数字 code 处理,不受语言影响
|
|
127
|
+
|
|
128
|
+
📖 [完整文档](./docs/error-handling.md#v115-新功能对象格式错误配置) · [变更日志](./changelogs/v1.1.5.md)
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### 🔗 跨类型联合验证(v1.1.0)
|
|
74
133
|
|
|
75
134
|
**一行代码支持多种类型,告别繁琐的类型判断**
|
|
76
135
|
|
|
@@ -125,8 +184,9 @@ app.post('/api/account', (req, res) => {
|
|
|
125
184
|
|
|
126
185
|
### ⚡ 其他新特性
|
|
127
186
|
|
|
128
|
-
- ✅
|
|
129
|
-
- ✅
|
|
187
|
+
- ✅ **错误配置对象格式**: 支持 `{ code, message }` 统一错误代码(v1.1.5)
|
|
188
|
+
- ✅ **统一错误抛出**: `I18nError` 类,支持多语言错误消息(v1.1.1)
|
|
189
|
+
- ✅ **插件系统增强**: 自定义类型注册更简单(v1.1.0)
|
|
130
190
|
- ✅ **TypeScript 类型完善**: 0个类型错误(v1.1.4)
|
|
131
191
|
|
|
132
192
|
[查看完整更新日志](./CHANGELOG.md)
|
|
@@ -2085,6 +2145,91 @@ dsl.error.throw('user.noPermission');
|
|
|
2085
2145
|
dsl.error.assert(user.role === 'admin', 'user.noPermission');
|
|
2086
2146
|
```
|
|
2087
2147
|
|
|
2148
|
+
**🆕 对象格式错误配置(v1.1.5)**
|
|
2149
|
+
|
|
2150
|
+
支持统一的数字错误代码,便于前端处理:
|
|
2151
|
+
|
|
2152
|
+
```javascript
|
|
2153
|
+
// 语言包配置(lib/locales/zh-CN.js)
|
|
2154
|
+
module.exports = {
|
|
2155
|
+
// 字符串格式(向后兼容)
|
|
2156
|
+
'user.notFound': '用户不存在',
|
|
2157
|
+
|
|
2158
|
+
// 对象格式(v1.1.5 新增)- 使用数字错误码
|
|
2159
|
+
'account.notFound': {
|
|
2160
|
+
code: 40001, // 数字错误代码
|
|
2161
|
+
message: '账户不存在'
|
|
2162
|
+
},
|
|
2163
|
+
'account.insufficientBalance': {
|
|
2164
|
+
code: 40002,
|
|
2165
|
+
message: '余额不足,当前{{#balance}},需要{{#required}}'
|
|
2166
|
+
},
|
|
2167
|
+
'order.notPaid': {
|
|
2168
|
+
code: 50001,
|
|
2169
|
+
message: '订单未支付'
|
|
2170
|
+
}
|
|
2171
|
+
};
|
|
2172
|
+
|
|
2173
|
+
// lib/locales/en-US.js
|
|
2174
|
+
module.exports = {
|
|
2175
|
+
'account.notFound': {
|
|
2176
|
+
code: 40001, // 相同的数字 code
|
|
2177
|
+
message: 'Account not found'
|
|
2178
|
+
},
|
|
2179
|
+
'account.insufficientBalance': {
|
|
2180
|
+
code: 40002,
|
|
2181
|
+
message: 'Insufficient balance: {{#balance}}, required: {{#required}}'
|
|
2182
|
+
},
|
|
2183
|
+
'order.notPaid': {
|
|
2184
|
+
code: 50001,
|
|
2185
|
+
message: 'Order not paid'
|
|
2186
|
+
}
|
|
2187
|
+
};
|
|
2188
|
+
|
|
2189
|
+
// 使用
|
|
2190
|
+
try {
|
|
2191
|
+
dsl.error.throw('account.notFound');
|
|
2192
|
+
} catch (error) {
|
|
2193
|
+
error.code // 40001 (数字代码)
|
|
2194
|
+
error.originalKey // 'account.notFound' (原始key)
|
|
2195
|
+
error.message // '账户不存在'
|
|
2196
|
+
|
|
2197
|
+
// 两种判断方式
|
|
2198
|
+
error.is('account.notFound') // ✅ 使用 originalKey
|
|
2199
|
+
error.is(40001) // ✅ 使用数字 code
|
|
2200
|
+
}
|
|
2201
|
+
|
|
2202
|
+
// 前端统一处理(不受语言影响)
|
|
2203
|
+
try {
|
|
2204
|
+
await api.getAccount(id);
|
|
2205
|
+
} catch (error) {
|
|
2206
|
+
switch (error.code) {
|
|
2207
|
+
case 40001:
|
|
2208
|
+
router.push('/account-not-found');
|
|
2209
|
+
break;
|
|
2210
|
+
case 40002:
|
|
2211
|
+
showTopUpDialog(error.params.balance, error.params.required);
|
|
2212
|
+
break;
|
|
2213
|
+
case 50001:
|
|
2214
|
+
showPaymentDialog();
|
|
2215
|
+
break;
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
```
|
|
2219
|
+
|
|
2220
|
+
**优势**:
|
|
2221
|
+
- ✅ 多语言共享相同的数字 `code`,前端统一处理
|
|
2222
|
+
- ✅ 完全向后兼容,字符串格式自动转换
|
|
2223
|
+
- ✅ `originalKey` 便于调试和日志追踪
|
|
2224
|
+
- ✅ 数字 code 更简洁,易于管理和文档化
|
|
2225
|
+
|
|
2226
|
+
**错误码规范建议**:
|
|
2227
|
+
- `4xxxx` - 客户端错误(账户、权限、参数等)
|
|
2228
|
+
- `5xxxx` - 业务逻辑错误(订单、支付、库存等)
|
|
2229
|
+
- `6xxxx` - 系统错误(数据库、服务不可用等)
|
|
2230
|
+
|
|
2231
|
+
📖 详细说明: [错误处理文档](./docs/error-handling.md#v115-新功能对象格式错误配置)
|
|
2232
|
+
|
|
2088
2233
|
**🆕 运行时指定语言(v1.1.0+)**
|
|
2089
2234
|
|
|
2090
2235
|
无需修改全局语言设置,每次调用时指定:
|
package/STATUS.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# schema-dsl 项目状态
|
|
2
2
|
|
|
3
|
-
> **最后更新**: 2026-01-
|
|
4
|
-
> **当前版本**: v1.1.
|
|
5
|
-
> **项目状态**: ✅ 全部完成,测试100%通过(
|
|
3
|
+
> **最后更新**: 2026-01-17
|
|
4
|
+
> **当前版本**: v1.1.5
|
|
5
|
+
> **项目状态**: ✅ 全部完成,测试100%通过(955个测试)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## 📋 目录
|
|
10
10
|
|
|
11
|
+
- [v1.1.5](#v115) - 2026-01-17 ✅ 已完成
|
|
11
12
|
- [v1.1.4](#v114) - 2026-01-13 ✅ 已完成
|
|
12
13
|
- [v1.1.3](#v113) - 2026-01-09 ✅ 已完成
|
|
13
14
|
- [v1.1.1](#v111) - 2026-01-06 ✅ 已完成
|
|
@@ -27,6 +28,39 @@
|
|
|
27
28
|
|
|
28
29
|
## 版本发布计划
|
|
29
30
|
|
|
31
|
+
### v1.1.5
|
|
32
|
+
|
|
33
|
+
**发布日期**: 2026-01-17
|
|
34
|
+
**状态**: ✅ 已完成
|
|
35
|
+
**类型**: 🚀 功能增强 - 错误配置对象格式支持
|
|
36
|
+
**进度**: 100%完成 | 测试: 955个通过 (100%)
|
|
37
|
+
|
|
38
|
+
| 需求标题 | 状态 | 优先级 | 详细 |
|
|
39
|
+
|---------|------|--------|------|
|
|
40
|
+
| 实现 Locale.getMessage 对象格式支持 | ✅ 完成 | P0 | lib/core/Locale.js |
|
|
41
|
+
| 修改 I18nError 构造函数支持对象格式 | ✅ 完成 | P0 | lib/errors/I18nError.js |
|
|
42
|
+
| 新增 originalKey 字段 | ✅ 完成 | P0 | I18nError 类 |
|
|
43
|
+
| 更新 TypeScript 类型定义 | ✅ 完成 | P0 | index.d.ts |
|
|
44
|
+
| 更新语言包示例(对象格式) | ✅ 完成 | P1 | lib/locales/*.js |
|
|
45
|
+
| 新增测试用例(6个) | ✅ 完成 | P0 | test/unit/i18n-error.test.js |
|
|
46
|
+
| 更新现有测试适配对象格式 | ✅ 完成 | P0 | test/unit/*.test.js |
|
|
47
|
+
| 更新 CHANGELOG | ✅ 完成 | P0 | v1.1.5 变更记录 |
|
|
48
|
+
| 更新 STATUS | ✅ 完成 | P0 | 版本号和状态 |
|
|
49
|
+
|
|
50
|
+
**实现状态统计**:
|
|
51
|
+
- ✅ 完成: 9个
|
|
52
|
+
- 🔄 进行中: 0个
|
|
53
|
+
- ⏳ 待完成: 0个
|
|
54
|
+
|
|
55
|
+
**核心变更**:
|
|
56
|
+
- ✨ 语言包支持对象格式 `{ code, message }`
|
|
57
|
+
- ✨ I18nError 新增 `originalKey` 字段
|
|
58
|
+
- ✨ 多语言共享相同的 `code`
|
|
59
|
+
- ✅ 完全向后兼容,字符串格式自动转换
|
|
60
|
+
- ✅ `error.is()` 同时支持 code 和 originalKey 判断
|
|
61
|
+
|
|
62
|
+
**向后兼容性**: ✅ 100% 向后兼容
|
|
63
|
+
|
|
30
64
|
### v1.1.4
|
|
31
65
|
|
|
32
66
|
**发布日期**: 2026-01-13
|