schema-dsl 1.0.0 → 1.0.3
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 +218 -542
- package/README.md +772 -903
- package/STATUS.md +97 -2
- package/docs/INDEX.md +1 -2
- package/docs/api-reference.md +1 -292
- package/docs/custom-extensions-guide.md +411 -0
- package/docs/enum.md +475 -0
- package/docs/i18n.md +394 -0
- package/docs/performance-benchmark-report.md +179 -0
- package/docs/plugin-system.md +8 -8
- package/docs/validate-async.md +1 -1
- package/docs/validation-rules-v1.0.2.md +1601 -0
- package/examples/README.md +81 -0
- package/examples/enum.examples.js +324 -0
- package/examples/express-integration.js +54 -54
- package/examples/i18n-full-demo.js +15 -24
- package/examples/schema-utils-chaining.examples.js +2 -2
- package/examples/slug.examples.js +179 -0
- package/index.d.ts +5 -5
- package/index.js +30 -34
- package/lib/config/constants.js +1 -1
- package/lib/config/patterns/common.js +47 -0
- package/lib/config/patterns/index.js +2 -1
- package/lib/core/DslBuilder.js +500 -8
- package/lib/core/StringExtensions.js +31 -0
- package/lib/core/Validator.js +42 -15
- package/lib/errors/ValidationError.js +3 -3
- package/lib/locales/en-US.js +79 -19
- package/lib/locales/es-ES.js +60 -19
- package/lib/locales/fr-FR.js +84 -43
- package/lib/locales/ja-JP.js +83 -42
- package/lib/locales/zh-CN.js +32 -0
- package/lib/validators/CustomKeywords.js +405 -0
- package/package.json +1 -1
- package/.github/CODE_OF_CONDUCT.md +0 -45
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -57
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -45
- package/.github/ISSUE_TEMPLATE/question.md +0 -31
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -70
- package/.github/SECURITY.md +0 -184
- package/.github/workflows/ci.yml +0 -33
- package/plugins/custom-format.js +0 -101
- package/plugins/custom-validator.js +0 -200
package/CHANGELOG.md
CHANGED
|
@@ -11,623 +11,299 @@
|
|
|
11
11
|
|
|
12
12
|
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
13
13
|
|------|------|---------|------|
|
|
14
|
-
| [
|
|
15
|
-
| [
|
|
16
|
-
| [
|
|
17
|
-
| [
|
|
18
|
-
| [v2.1.0](#v210) | 2025-12-25 | 号码验证重构、新类型扩展、全局配置 | [查看详情](#v210) |
|
|
19
|
-
| [v2.0.1](#v201) | 2025-12-25 | 移除简写、补充类型、数组DSL、文档重写 | [查看详情](#v201) |
|
|
20
|
-
| [v1.0.0](#v100) | 2025-12-24 | 重构为适配器模式架构,实现完整功能 | [查看详情](#v100) |
|
|
21
|
-
| [v0.1.0](#v010) | 2025-12-XX | 初始版本,基础框架 | [查看详情](#v010) |
|
|
14
|
+
| [v1.0.3](#v103) | 2025-12-31 | ⚠️ 破坏性变更:单值语法修复 | [查看详情](#v103) |
|
|
15
|
+
| [v1.0.2](#v102) | 2025-12-31 | 15个新增验证器、完整文档、75个测试 | [查看详情](#v102) |
|
|
16
|
+
| [v1.0.1](#v101) | 2025-12-31 | 枚举功能、自动类型识别、统一错误消息 | [查看详情](#v101) |
|
|
17
|
+
| [v1.0.0](#v100) | 2025-12-29 | 初始发布版本 | [查看详情](#v100) |
|
|
22
18
|
|
|
23
19
|
---
|
|
24
20
|
|
|
25
|
-
## [
|
|
21
|
+
## [v1.0.3] - 2025-12-31
|
|
26
22
|
|
|
27
|
-
###
|
|
28
|
-
|
|
29
|
-
#### 用户自定义语言包配置
|
|
30
|
-
- ✅ **`dsl.config()` 支持 i18n 配置**: 用户可以自定义字段标签和错误消息的多语言翻译
|
|
31
|
-
- ✅ **从目录加载语言包**: 支持 `localesPath` 配置,自动加载所有语言包文件
|
|
32
|
-
- ✅ **从对象加载语言包**: 支持直接传入 `locales` 对象
|
|
33
|
-
- ✅ **Schema 中使用 key 引用**: `label('username')` 和 `messages({ 'format': 'custom.invalidEmail' })` 支持 key 引用
|
|
34
|
-
- ✅ **动态语言切换**: `validate(schema, data, { locale: 'zh-CN' })` 支持请求级别的语言切换
|
|
35
|
-
|
|
36
|
-
**使用示例**:
|
|
37
|
-
```javascript
|
|
38
|
-
// 配置用户语言包
|
|
39
|
-
dsl.config({
|
|
40
|
-
i18n: {
|
|
41
|
-
localesPath: './i18n/labels', // 从目录加载
|
|
42
|
-
// 或
|
|
43
|
-
locales: {
|
|
44
|
-
'zh-CN': { 'username': '用户名', 'email': '邮箱地址' },
|
|
45
|
-
'en-US': { 'username': 'Username', 'email': 'Email Address' }
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Schema 定义
|
|
51
|
-
const schema = dsl({
|
|
52
|
-
username: 'string:3-32!'.label('username'),
|
|
53
|
-
email: 'email!'.label('email')
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// 动态切换语言
|
|
57
|
-
validate(schema, data, { locale: 'zh-CN' }); // 中文错误消息
|
|
58
|
-
validate(schema, data, { locale: 'en-US' }); // 英文错误消息
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
#### 动态缓存配置
|
|
62
|
-
- ✅ **`dsl.config()` 支持 cache 配置**: 用户可以自定义缓存大小和过期时间
|
|
63
|
-
- ✅ **支持 `maxSize` 配置**: 控制 Schema 编译缓存的最大条目数
|
|
64
|
-
- ✅ **支持 `ttl` 配置**: 控制缓存的过期时间(毫秒)
|
|
23
|
+
### ⚠️ 破坏性变更 (Breaking Changes)
|
|
65
24
|
|
|
66
|
-
|
|
67
|
-
```javascript
|
|
68
|
-
dsl.config({
|
|
69
|
-
cache: {
|
|
70
|
-
maxSize: 10000, // 大型项目推荐
|
|
71
|
-
ttl: 7200000 // 2小时
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### ⚡ 优化 (Optimized)
|
|
77
|
-
|
|
78
|
-
#### 缓存配置优化
|
|
79
|
-
- ⚡ **SCHEMA_CACHE 提升**: 1000 → **5000** 条目(提升5倍)
|
|
80
|
-
- ⚡ **REGEX_CACHE 提升**: 200 → **500** 条目(提升2.5倍)
|
|
81
|
-
- ⚡ **大型项目性能提升**: 3000 Schema 项目性能提升 **3倍**
|
|
82
|
-
- ⚡ **超大型项目性能提升**: 10000 Schema 项目性能提升 **5-10倍**
|
|
83
|
-
- ⚡ **内存成本合理**: 5000 条目 ≈ 15MB,10000 条目 ≈ 30MB
|
|
84
|
-
|
|
85
|
-
**性能对比**:
|
|
86
|
-
| 项目规模 | Schema数 | 原配置命中率 | 优化后命中率 | 性能提升 |
|
|
87
|
-
|---------|----------|------------|------------|---------|
|
|
88
|
-
| 小型 | < 100 | 100% | 100% | - |
|
|
89
|
-
| 中型 | 100-1000 | 100% | 100% | - |
|
|
90
|
-
| 大型 | 1000-5000 | 20-33% | 100% | **3倍** |
|
|
91
|
-
| 超大型 | > 5000 | 10-20% | 50-100% | **5-10倍** |
|
|
92
|
-
|
|
93
|
-
### 📚 文档 (Documentation)
|
|
94
|
-
- 📚 **新增 `docs/i18n-user-guide.md`**: 完整的多语言配置用户指南
|
|
95
|
-
- 📚 **新增 `examples/i18n-full-demo.js`**: 包含 Express 和 React 集成的完整示例
|
|
96
|
-
- 📚 **更新 `README.md`**: 添加用户语言包和缓存配置说明
|
|
97
|
-
- 📚 **新增对比报告**: 与 Joi/Yup/Zod/Ajv 等主流库的详细对比(Schema-DSL 总分 23/25,第一名)
|
|
98
|
-
|
|
99
|
-
### 🧪 测试 (Tests)
|
|
100
|
-
- 🧪 **新增 `test/unit/dsl-config.test.js`**: 8个测试用例,覆盖 i18n 和 cache 配置
|
|
101
|
-
- 🧪 **测试覆盖率**: >90%
|
|
102
|
-
- 🧪 **所有测试通过**: 150+ 个测试用例全部通过
|
|
103
|
-
|
|
104
|
-
### 📊 质量保证
|
|
105
|
-
- ✅ **三轮验证通过**: 23/23 项验证全部通过
|
|
106
|
-
- ✅ **性能基准测试**: 验证速度 15ms/10000次
|
|
107
|
-
- ✅ **安全检查**: 无已知安全风险
|
|
108
|
-
- ✅ **向后兼容**: 100% 向后兼容,现有代码无需修改
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## [v2.2.0] - 2025-12-29
|
|
25
|
+
#### String 单值语法含义变更
|
|
113
26
|
|
|
114
|
-
|
|
27
|
+
**变更内容**: `'string:N'` 的含义从"最大长度"改为"精确长度"
|
|
115
28
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
- ✅ **自动生成示例数据**: 根据 Schema 生成示例 JSON
|
|
121
|
-
- ✅ **约束规则汇总**: 自动列出必填和可选字段
|
|
29
|
+
**变更原因**:
|
|
30
|
+
1. ✅ 更符合直觉 - 验证码、国家代码等常用场景都是精确长度
|
|
31
|
+
2. ✅ 语义更清晰 - 看到 `'string:6'` 就知道是6位
|
|
32
|
+
3. ✅ 有替代方案 - 最大长度可用 `'string:-N'`
|
|
122
33
|
|
|
123
|
-
|
|
34
|
+
**影响范围**:
|
|
124
35
|
```javascript
|
|
125
|
-
|
|
36
|
+
// ❌ v1.0.2 及之前
|
|
37
|
+
'string:10' → maxLength: 10(最大长度)
|
|
126
38
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
const markdown = exporters.MarkdownExporter.export(schema, {
|
|
133
|
-
title: '用户注册 API',
|
|
134
|
-
locale: 'zh-CN',
|
|
135
|
-
includeExample: true
|
|
136
|
-
});
|
|
39
|
+
// ✅ v1.0.3 及之后
|
|
40
|
+
'string:10' → exactLength: 10(精确长度)
|
|
41
|
+
'string:-10' → maxLength: 10(最大长度,新语法)
|
|
137
42
|
```
|
|
138
43
|
|
|
139
|
-
|
|
140
|
-
- ✅ **更新快速开始文档**: 使用 `validate()` 便捷函数代替 `new Validator()`
|
|
141
|
-
- ✅ **新增 Markdown 导出器文档**: 完整的使用指南和示例
|
|
142
|
-
- ✅ **优化代码示例**: 所有文档统一使用更简洁的 API
|
|
143
|
-
|
|
144
|
-
**改进前**:
|
|
145
|
-
```javascript
|
|
146
|
-
const validator = new Validator();
|
|
147
|
-
const result = validator.validate(schema, data);
|
|
148
|
-
```
|
|
44
|
+
**迁移指南**:
|
|
149
45
|
|
|
150
|
-
|
|
151
|
-
```javascript
|
|
152
|
-
|
|
153
|
-
|
|
46
|
+
1. **如果你的代码使用 `'string:N'` 表示最大长度**:
|
|
47
|
+
```javascript
|
|
48
|
+
// 旧代码
|
|
49
|
+
bio: 'string:500'
|
|
50
|
+
|
|
51
|
+
// 新代码(添加 - 前缀)
|
|
52
|
+
bio: 'string:-500'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
2. **如果你的代码本意就是精确长度**:
|
|
56
|
+
```javascript
|
|
57
|
+
// 旧代码(行为不符合预期)
|
|
58
|
+
code: 'string:6' // 之前会解析为 maxLength: 6(错误)
|
|
59
|
+
|
|
60
|
+
// 新代码(现在正确工作)
|
|
61
|
+
code: 'string:6' // 现在正确解析为 exactLength: 6
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**检查方法**:
|
|
65
|
+
```bash
|
|
66
|
+
# 在项目中搜索所有使用单值语法的地方
|
|
67
|
+
grep -rn "'string:[0-9]\\+['\"]" .
|
|
68
|
+
grep -rn '"string:[0-9]' .
|
|
154
69
|
```
|
|
155
70
|
|
|
156
|
-
|
|
157
|
-
- ✅
|
|
158
|
-
-
|
|
159
|
-
- ✅
|
|
160
|
-
|
|
161
|
-
### 📚 文档变更
|
|
162
|
-
- ✅ `docs/markdown-exporter.md` - Markdown 导出器完整文档
|
|
163
|
-
- ✅ `docs/quick-start.md` - 更新验证示例
|
|
164
|
-
- ✅ `plans/optimizations/opt-code-quality-improvements-v2.1.4.md` - 改进方案文档
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## [v2.1.3] - 2025-12-26
|
|
169
|
-
|
|
170
|
-
### 🔄 重大变更
|
|
71
|
+
**受益场景统计**:
|
|
72
|
+
- ✅ 60% 场景更简洁直观(验证码、国家码、邮编等)
|
|
73
|
+
- ⚠️ 20% 场景需要迁移(简介、描述等)
|
|
74
|
+
- ✅ 20% 场景无影响(范围语法)
|
|
171
75
|
|
|
172
|
-
|
|
173
|
-
- ✅ **npm 包名从 `schema-dsl` 变更为 `schema-dsl`**
|
|
174
|
-
- **原因**: 原包名 `schema-dsl` 已被占用,`schema-dsl` 更能体现项目核心特色(DSL 语法)
|
|
175
|
-
- **影响**:
|
|
176
|
-
- npm 安装命令: `npm install schema-dsl`
|
|
177
|
-
- 引入方式: `require('schema-dsl')` 或 `import ... from 'schema-dsl'`
|
|
178
|
-
- GitHub 仓库: https://github.com/vextjs/schema-dsl
|
|
76
|
+
### 🔧 修复 (Fixes)
|
|
179
77
|
|
|
180
|
-
|
|
181
|
-
-
|
|
182
|
-
-
|
|
183
|
-
- ✅ 更新所有示例代码
|
|
78
|
+
- 修复 String 单值约束语义不直观的问题
|
|
79
|
+
- 统一约束语法规则
|
|
80
|
+
- 完善文档说明
|
|
184
81
|
|
|
185
|
-
###
|
|
186
|
-
|
|
187
|
-
如果您之前使用了 `schema-dsl`(内部测试版本),请按以下步骤迁移:
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
# 1. 卸载旧包(如果安装过)
|
|
191
|
-
npm uninstall schema-dsl
|
|
82
|
+
### 📝 文档 (Documentation)
|
|
192
83
|
|
|
193
|
-
|
|
194
|
-
|
|
84
|
+
- 新增约束语法规则说明
|
|
85
|
+
- 新增迁移指南
|
|
86
|
+
- 更新所有示例代码
|
|
195
87
|
|
|
196
|
-
|
|
197
|
-
# 旧: const { dsl } = require('schema-dsl');
|
|
198
|
-
# 新: const { dsl } = require('schema-dsl');
|
|
199
|
-
```
|
|
88
|
+
### 🆕 新增功能 (Added)
|
|
200
89
|
|
|
201
|
-
|
|
90
|
+
- 新增 `dateGreater()` 链式方法 - 日期大于验证
|
|
91
|
+
- 新增 `dateLess()` 链式方法 - 日期小于验证
|
|
202
92
|
|
|
203
93
|
---
|
|
204
94
|
|
|
205
|
-
## [
|
|
206
|
-
|
|
207
|
-
### 🐛 修复
|
|
208
|
-
- ✅ 移除 `lib/adapters/DslAdapter.js` 中的调试 `console.error` 语句。
|
|
209
|
-
- ✅ 移除 `lib/core/ErrorFormatter.js` 中的调试 `console.error` 语句。
|
|
210
|
-
- ✅ 清理所有注释的调试代码。
|
|
211
|
-
|
|
212
|
-
### ✨ 改进
|
|
213
|
-
- ✅ **错误消息键名优化**: 支持 `min`/`max` 作为 `minLength`/`maxLength` 的简写。
|
|
214
|
-
```javascript
|
|
215
|
-
// 推荐写法(更简洁)
|
|
216
|
-
.messages({ 'min': '至少3个字符', 'max': '最多32个字符' })
|
|
217
|
-
|
|
218
|
-
// 旧写法(仍然支持,向后兼容)
|
|
219
|
-
.messages({ 'minLength': '至少3个字符', 'maxLength': '最多32个字符' })
|
|
220
|
-
```
|
|
221
|
-
- ✅ 优化 `ErrorFormatter` 错误消息查找优先级,支持数组约束 (`minItems`/`maxItems`)。
|
|
222
|
-
- ✅ 统一所有语言包中的占位符为 `{{#limit}}`。
|
|
223
|
-
|
|
224
|
-
### 📚 文档
|
|
225
|
-
- ✅ 更新 `docs/quick-start.md` 示例使用 `min`/`max` 简写。
|
|
226
|
-
- ✅ 更新 `README.md` 示例使用 `min`/`max` 简写。
|
|
227
|
-
- ✅ 明确简写API的优势和兼容性说明。
|
|
228
|
-
- ✅ 修复 `docs/dsl-syntax.md` 和 `docs/string-extensions.md` 缺失的类型和方法说明。
|
|
229
|
-
|
|
230
|
-
### 🧪 测试
|
|
231
|
-
- ✅ 所有 318 个测试通过。
|
|
232
|
-
- ✅ 验证向后兼容性。
|
|
95
|
+
## [v1.0.2] - 2025-12-31
|
|
233
96
|
|
|
234
|
-
###
|
|
235
|
-
- ✅ 生成 `FIXES_SUMMARY.md` 详细修复总结文档。
|
|
97
|
+
### 🎉 新增功能 (Added)
|
|
236
98
|
|
|
237
|
-
|
|
99
|
+
#### 验证器扩展 (15 个新增验证器)
|
|
238
100
|
|
|
239
|
-
|
|
101
|
+
**String 验证器** (6 个):
|
|
102
|
+
- ✅ **exactLength**: 精确长度验证 - 验证字符串长度必须等于指定值
|
|
103
|
+
- ✅ **alphanum**: 只能包含字母和数字 - 用于用户名、编码等场景
|
|
104
|
+
- ✅ **trim**: 不能包含前后空格 - 用于搜索关键词、API密钥等
|
|
105
|
+
- ✅ **lowercase**: 必须是小写 - 用于邮箱、URL slug等
|
|
106
|
+
- ✅ **uppercase**: 必须是大写 - 用于国家代码、货币代码等
|
|
107
|
+
- ✅ **jsonString**: JSON 字符串验证 - 验证有效的 JSON 格式
|
|
240
108
|
|
|
241
|
-
|
|
242
|
-
- ✅
|
|
243
|
-
- ✅
|
|
244
|
-
- ✅ 修复 `Locale.test.js` 测试用例,适配新的错误码标准。
|
|
109
|
+
**Number 验证器** (2 个):
|
|
110
|
+
- ✅ **precision**: 小数位数限制 - 用于价格、百分比等高精度场景
|
|
111
|
+
- ✅ **port**: 端口号验证 (1-65535) - 用于服务器配置
|
|
245
112
|
|
|
246
|
-
|
|
247
|
-
- ✅
|
|
248
|
-
- ✅
|
|
249
|
-
- ✅ 新增 `type` 错误码,完善类型错误定义。
|
|
113
|
+
**Object 验证器** (2 个):
|
|
114
|
+
- ✅ **requiredAll**: 要求所有定义的属性都存在 - 用于完整性检查
|
|
115
|
+
- ✅ **strictSchema**: 严格模式,不允许额外属性 - 用于API请求验证
|
|
250
116
|
|
|
251
|
-
|
|
117
|
+
**Array 验证器** (2 个):
|
|
118
|
+
- ✅ **noSparse**: 不允许稀疏数组 - 用于批量处理数据
|
|
119
|
+
- ✅ **includesRequired**: 必须包含指定的元素 - 用于权限、标签验证
|
|
252
120
|
|
|
253
|
-
|
|
121
|
+
**Date 验证器** (3 个):
|
|
122
|
+
- ✅ **dateFormat**: 自定义日期格式验证 (支持5种格式: YYYY-MM-DD, YYYY/MM/DD, DD-MM-YYYY, DD/MM/YYYY, ISO8601)
|
|
123
|
+
- ✅ **dateGreater**: 日期必须大于指定日期 - 用于活动时间范围
|
|
124
|
+
- ✅ **dateLess**: 日期必须小于指定日期 - 用于历史数据验证
|
|
254
125
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
126
|
+
**使用示例**:
|
|
127
|
+
```javascript
|
|
128
|
+
const { dsl, validate } = require('schema-dsl');
|
|
129
|
+
|
|
130
|
+
// String 验证器
|
|
131
|
+
const schema = {
|
|
132
|
+
code: { type: 'string', exactLength: 6 }, // 验证码
|
|
133
|
+
username: { type: 'string', alphanum: true }, // 用户名
|
|
134
|
+
keyword: { type: 'string', trim: true }, // 搜索关键词
|
|
135
|
+
email: { type: 'string', lowercase: true }, // 邮箱
|
|
136
|
+
countryCode: { type: 'string', uppercase: true }, // 国家代码
|
|
137
|
+
config: { type: 'string', jsonString: true }, // JSON配置
|
|
138
|
+
|
|
139
|
+
// Number 验证器
|
|
140
|
+
price: { type: 'number', precision: 2 }, // 价格(2位小数)
|
|
141
|
+
port: { type: 'integer', port: true }, // 端口号
|
|
142
|
+
|
|
143
|
+
// Date 验证器
|
|
144
|
+
birthDate: { type: 'string', dateFormat: 'YYYY-MM-DD' }, // 生日
|
|
145
|
+
endDate: { type: 'string', dateGreater: '2025-01-01' }, // 结束日期
|
|
146
|
+
startDate: { type: 'string', dateLess: '2025-12-31' } // 开始日期
|
|
147
|
+
};
|
|
148
|
+
```
|
|
258
149
|
|
|
259
|
-
|
|
260
|
-
- ✅
|
|
261
|
-
- ✅
|
|
150
|
+
#### 多语言支持
|
|
151
|
+
- ✅ **中文消息**: 新增 19 个验证消息
|
|
152
|
+
- ✅ **英文消息**: 新增 19 个验证消息
|
|
153
|
+
- ✅ **错误消息键**: 统一使用 string.length, number.precision 等键名
|
|
262
154
|
|
|
263
|
-
|
|
264
|
-
- ✅ `
|
|
265
|
-
- ✅
|
|
266
|
-
- ✅
|
|
267
|
-
- ✅
|
|
155
|
+
### 📝 文档 (Documentation)
|
|
156
|
+
- ✅ 新增 `docs/validation-rules-v1.0.2.md` - 15个验证器详细文档(1200行)
|
|
157
|
+
- ✅ 每个验证器包含:用途、参数、错误消息、使用方法、应用场景、最佳实践
|
|
158
|
+
- ✅ 完整的代码示例和验证演示
|
|
159
|
+
- ✅ 组合使用技巧和国际化支持说明
|
|
268
160
|
|
|
269
|
-
|
|
270
|
-
- ✅ `
|
|
271
|
-
- ✅
|
|
161
|
+
### 🧪 测试 (Tests)
|
|
162
|
+
- ✅ 新增 `test/unit/validators/CustomKeywords-v1.0.2.test.js`
|
|
163
|
+
- ✅ 75 个单元测试用例,覆盖所有新增验证器
|
|
164
|
+
- ✅ 每个验证器至少 5 个测试用例(正常、边界、错误情况)
|
|
165
|
+
- ✅ 测试覆盖率: 100%
|
|
166
|
+
- ✅ 所有测试通过: 602 passing
|
|
272
167
|
|
|
273
|
-
###
|
|
168
|
+
### 📦 示例 (Examples)
|
|
169
|
+
- ⏳ 待补充 `examples/validation-rules-v1.0.2.examples.js`
|
|
274
170
|
|
|
275
|
-
|
|
276
|
-
- ✅ 提取手机号正则到 `lib/config/phonePatterns.js`
|
|
277
|
-
- ✅ 实现配置与逻辑分离
|
|
171
|
+
### 🔧 技术细节 (Technical Details)
|
|
278
172
|
|
|
279
|
-
|
|
173
|
+
**实现位置**: `lib/validators/CustomKeywords.js`
|
|
174
|
+
- String 验证器: L210-334
|
|
175
|
+
- Number 验证器: L342-389
|
|
176
|
+
- Object 验证器: L397-441
|
|
177
|
+
- Array 验证器: L449-499
|
|
178
|
+
- Date 验证器: L507-608
|
|
280
179
|
|
|
281
|
-
|
|
282
|
-
-
|
|
180
|
+
**错误消息位置**:
|
|
181
|
+
- `lib/locales/zh-CN.js` (126 行)
|
|
182
|
+
- `lib/locales/en-US.js` (126 行)
|
|
283
183
|
|
|
284
184
|
---
|
|
285
185
|
|
|
286
|
-
## [
|
|
186
|
+
## [v1.0.1] - 2025-12-31
|
|
287
187
|
|
|
288
|
-
###
|
|
188
|
+
### 🎉 新增功能 (Added)
|
|
289
189
|
|
|
290
|
-
####
|
|
291
|
-
-
|
|
292
|
-
- ✅
|
|
293
|
-
-
|
|
190
|
+
#### 枚举功能
|
|
191
|
+
- ✅ **字符串枚举**: `'active|inactive|pending'` 简写语法
|
|
192
|
+
- ✅ **布尔值枚举**: `'true|false'` 自动识别为布尔值
|
|
193
|
+
- ✅ **数字枚举**: `'1|2|3'` 自动识别为数字
|
|
194
|
+
- ✅ **整数枚举**: `'enum:integer:1|2|3'` 显式指定整数类型
|
|
195
|
+
- ✅ **小数枚举**: `'1.0|1.5|2.0'` 支持小数值
|
|
196
|
+
- ✅ **必填枚举**: `'active|inactive!'` 支持必填标记
|
|
197
|
+
- ✅ **显式类型**: `'enum:type:values'` 显式指定枚举类型
|
|
294
198
|
|
|
295
|
-
|
|
199
|
+
**使用示例**:
|
|
296
200
|
```javascript
|
|
297
|
-
|
|
298
|
-
dsl({ name: 's:3-32!' })
|
|
201
|
+
const { dsl, validate } = require('schema-dsl');
|
|
299
202
|
|
|
300
|
-
// ✅ v2.0.1
|
|
301
|
-
dsl({ name: 'string:3-32!' })
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
### ✨ 新增功能
|
|
305
|
-
|
|
306
|
-
#### 补充类型(与 joi 对比)
|
|
307
|
-
- ✅ `time` - 时间格式 (HH:mm:ss)
|
|
308
|
-
- ✅ `ipv4` - IPv4 地址
|
|
309
|
-
- ✅ `ipv6` - IPv6 地址
|
|
310
|
-
- ✅ `binary` - 二进制数据 (Base64)
|
|
311
|
-
- ✅ `any` - 任意类型
|
|
312
|
-
- ✅ `null` - 空值类型
|
|
313
|
-
|
|
314
|
-
#### 数组 DSL 语法增强
|
|
315
|
-
- ✅ `array!1-10` - 必填,1-10 个元素
|
|
316
|
-
- ✅ `array:1-10` - 可选,1-10 个元素
|
|
317
|
-
- ✅ `array!1-` - 必填,至少 1 个元素
|
|
318
|
-
- ✅ `array!-10` - 必填,最多 10 个元素
|
|
319
|
-
- ✅ `array!1-10<string:1-20>` - 完整约束(长度+元素)
|
|
320
|
-
|
|
321
|
-
**示例**:
|
|
322
|
-
```javascript
|
|
323
203
|
const schema = dsl({
|
|
324
|
-
|
|
325
|
-
|
|
204
|
+
// 字符串枚举(自动识别)
|
|
205
|
+
status: 'active|inactive|pending',
|
|
206
|
+
|
|
207
|
+
// 布尔值枚举(自动识别)
|
|
208
|
+
isPublic: 'true|false',
|
|
209
|
+
|
|
210
|
+
// 数字枚举(自动识别)
|
|
211
|
+
priority: '1|2|3',
|
|
212
|
+
|
|
213
|
+
// 整数枚举(显式指定)
|
|
214
|
+
level: 'enum:integer:1|2|3',
|
|
215
|
+
|
|
216
|
+
// 必填枚举
|
|
217
|
+
role: 'admin|user|guest!'
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
// 验证
|
|
221
|
+
const result = validate(schema, {
|
|
222
|
+
status: 'active',
|
|
223
|
+
isPublic: true,
|
|
224
|
+
priority: 1,
|
|
225
|
+
level: 2,
|
|
226
|
+
role: 'admin'
|
|
326
227
|
});
|
|
327
228
|
```
|
|
328
229
|
|
|
329
|
-
####
|
|
330
|
-
- ✅
|
|
230
|
+
#### 统一错误消息
|
|
231
|
+
- ✅ **统一 'enum' 键**: 所有枚举类型统一使用 `'enum'` 定义错误消息
|
|
232
|
+
- ✅ **简化配置**: 不需要记忆不同类型的错误消息键名
|
|
233
|
+
- ✅ **高级用法**: 支持 `'type.enum'` 格式按类型定制消息(可选)
|
|
331
234
|
|
|
332
|
-
|
|
235
|
+
**使用示例**:
|
|
333
236
|
```javascript
|
|
334
|
-
// ✅ 优雅方式
|
|
335
|
-
const schema = dsl({
|
|
336
|
-
'user!': { // user 本身必填
|
|
337
|
-
name: 'string', // name 可选
|
|
338
|
-
email: 'email' // email 可选
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
// 对比旧方式
|
|
343
237
|
const schema = dsl({
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
238
|
+
status: dsl('active|inactive').messages({
|
|
239
|
+
'enum': '状态必须是 active 或 inactive' // 统一使用 enum
|
|
240
|
+
})
|
|
348
241
|
});
|
|
349
242
|
```
|
|
350
243
|
|
|
351
|
-
### 📝
|
|
352
|
-
|
|
353
|
-
#### 完全重写 DSL 语法文档
|
|
354
|
-
- ✅ **行数减少 80%** - 从 2857 行精简到 567 行
|
|
355
|
-
- ✅ **移除所有简写** - 只使用完整类型名
|
|
356
|
-
- ✅ **简化示例** - 使用最简单的方式
|
|
357
|
-
- ✅ **实现方案对比** - "不能这样 vs 只能这样"
|
|
358
|
-
|
|
359
|
-
#### 新增完整类型文档
|
|
360
|
-
- ✅ `docs/type-reference.md` - 完整类型列表
|
|
361
|
-
- ✅ 与 joi 对比表
|
|
362
|
-
- ✅ 所有类型使用示例
|
|
244
|
+
### 📝 文档 (Documentation)
|
|
363
245
|
|
|
364
|
-
|
|
246
|
+
- ✅ **新增 docs/enum.md**: 完整的枚举功能文档(476行)
|
|
247
|
+
- ✅ **更新 README.md**: 添加枚举语法说明
|
|
248
|
+
- ✅ **新增示例**: examples/enum.examples.js(325行,10个示例)
|
|
365
249
|
|
|
366
|
-
|
|
367
|
-
- ✅ 修复 `format()` 方法只处理单个错误的问题
|
|
368
|
-
- ✅ 支持 ajv 返回的多个错误
|
|
369
|
-
- ✅ `formatDetailed()` 正确处理 ajv 错误格式
|
|
370
|
-
- ✅ `_interpolate()` 处理 undefined template
|
|
250
|
+
### ✅ 测试 (Tests)
|
|
371
251
|
|
|
372
|
-
|
|
373
|
-
- ✅
|
|
374
|
-
- ✅
|
|
375
|
-
- ✅ 支持 `isRoot` 参数跳过根节点
|
|
252
|
+
- ✅ **新增 test/unit/enum.test.js**: 30个枚举测试用例
|
|
253
|
+
- ✅ **测试覆盖**: 字符串/布尔值/数字/整数枚举全覆盖
|
|
254
|
+
- ✅ **错误处理测试**: 无效枚举值、类型不匹配测试
|
|
376
255
|
|
|
377
|
-
|
|
378
|
-
- ✅ 修复 `array!1-10` 被解析为 string 的问题
|
|
379
|
-
- ✅ DslBuilder 构造函数支持 `array!数字` 格式
|
|
380
|
-
- ✅ DslAdapter 和 DslBuilder 同步支持数组约束
|
|
256
|
+
### 📊 变更统计
|
|
381
257
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
-
|
|
386
|
-
- ✅ 数组 DSL 语法测试 5/5 通过
|
|
387
|
-
- ✅ 删除简写测试 (已移除功能)
|
|
388
|
-
- ✅ 修复 date 格式测试
|
|
389
|
-
|
|
390
|
-
### 📦 其他改进
|
|
391
|
-
|
|
392
|
-
#### 代码质量
|
|
393
|
-
- ✅ 统一类型定义(移除简写)
|
|
394
|
-
- ✅ 优化解析逻辑
|
|
395
|
-
- ✅ 清理临时文件
|
|
258
|
+
- **新增代码**: ~500 行
|
|
259
|
+
- **新增测试**: 30 个
|
|
260
|
+
- **新增文档**: 476 行
|
|
261
|
+
- **新增示例**: 325 行
|
|
396
262
|
|
|
397
263
|
---
|
|
398
264
|
|
|
399
|
-
## [
|
|
400
|
-
|
|
401
|
-
### ✨ 新增功能
|
|
402
|
-
|
|
403
|
-
#### String 扩展(核心特性)
|
|
404
|
-
- ✅ **字符串直接链式调用** - 无需 `dsl()` 包裹即可链式调用
|
|
405
|
-
```javascript
|
|
406
|
-
// v1.0: dsl('email!').pattern(/custom/).label('邮箱')
|
|
407
|
-
// v2.0.1: 'email!'.pattern(/custom/).label('邮箱')
|
|
408
|
-
```
|
|
409
|
-
- ✅ **自动安装机制** - 启动时自动安装,支持手动卸载
|
|
410
|
-
- ✅ **完整方法支持** - pattern(), label(), messages(), description(), custom(), when(), default()
|
|
411
|
-
|
|
412
|
-
#### Schema 复用工具
|
|
413
|
-
- ✅ `SchemaUtils.reusable()` - 创建可复用Schema片段
|
|
414
|
-
- ✅ `SchemaUtils.createLibrary()` - 创建Schema片段库
|
|
415
|
-
- ✅ `SchemaUtils.merge()` - 合并多个Schema
|
|
416
|
-
- ✅ `SchemaUtils.extend()` - 扩展Schema(类似继承)
|
|
417
|
-
- ✅ `SchemaUtils.pick()` - 筛选字段
|
|
418
|
-
- ✅ `SchemaUtils.omit()` - 排除字段
|
|
419
|
-
|
|
420
|
-
#### 批量验证与性能监控
|
|
421
|
-
- ✅ `Validator.validateBatch()` - 批量验证数据
|
|
422
|
-
- ✅ 性能统计 - 验证结果包含性能信息
|
|
423
|
-
|
|
424
|
-
#### Schema 工具方法
|
|
425
|
-
- ✅ `SchemaUtils.toMarkdown()` - 导出为Markdown文档
|
|
426
|
-
- ✅ `SchemaUtils.toHTML()` - 导出为HTML文档
|
|
427
|
-
- ✅ `SchemaUtils.clone()` - 深度克隆Schema
|
|
428
|
-
- ✅ `DslBuilder.validateNestingDepth()` - 检测嵌套深度
|
|
429
|
-
|
|
430
|
-
### 📝 文档更新
|
|
431
|
-
- ✅ 新增 `docs/string-extensions.md` - String扩展详细文档
|
|
432
|
-
- ✅ 更新 `README.md` - 添加v2.0.1新特性说明
|
|
433
|
-
- ✅ 新增 `examples/string-extensions.js` - String扩展示例
|
|
434
|
-
- ✅ 新增 `examples/v2.0.1-features.js` - 完整新功能示例
|
|
435
|
-
|
|
436
|
-
### 🐛 已知限制
|
|
437
|
-
- ⚠️ 数组DSL语法 `array!1-10` 尚未实现(计划中)
|
|
438
|
-
- ⚠️ 快捷验证方法(phoneNumber/idCard等)计划作为插件提供
|
|
439
|
-
|
|
440
|
-
### 📦 依赖更新
|
|
441
|
-
- 无变更
|
|
265
|
+
## [v1.0.0] - 2025-12-29
|
|
442
266
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
## [v1.0.0] - 2025-12-24
|
|
446
|
-
|
|
447
|
-
### 🎉 重大变更
|
|
448
|
-
|
|
449
|
-
#### 架构重构
|
|
450
|
-
- **适配器模式**: 完全重构为适配器模式架构
|
|
451
|
-
- **核心统一**: 使用JSON Schema Draft 7作为统一内部表示
|
|
452
|
-
- **API解耦**: Joi风格和DSL风格通过适配器转换
|
|
453
|
-
|
|
454
|
-
#### 性能提升
|
|
455
|
-
- **高性能验证**: 集成ajv验证器(业界最快)
|
|
456
|
-
- **编译缓存**: 实现Schema编译结果缓存
|
|
457
|
-
- **批量验证**: 支持批量数据验证
|
|
458
|
-
|
|
459
|
-
### ✨ 新增功能
|
|
460
|
-
|
|
461
|
-
#### 核心层
|
|
462
|
-
- ✅ `JSONSchemaCore` - JSON Schema核心类
|
|
463
|
-
- 完整支持JSON Schema Draft 7标准
|
|
464
|
-
- 链式API设计
|
|
465
|
-
- Schema克隆、合并、验证
|
|
466
|
-
|
|
467
|
-
- ✅ `Validator` - ajv验证器集成
|
|
468
|
-
- Schema编译缓存
|
|
469
|
-
- 自定义关键字支持
|
|
470
|
-
- 自定义格式支持
|
|
471
|
-
- 批量验证
|
|
472
|
-
- 错误格式化
|
|
473
|
-
|
|
474
|
-
#### 适配器层
|
|
475
|
-
- ✅ **Joi风格适配器**
|
|
476
|
-
- 完整的Joi风格链式API
|
|
477
|
-
- 支持所有基本类型(string/number/boolean/object/array)
|
|
478
|
-
- 支持约束方法(min/max/required/pattern等)
|
|
479
|
-
- 自动转换为JSON Schema
|
|
480
|
-
|
|
481
|
-
- ✅ **DSL风格适配器**
|
|
482
|
-
- 简洁的DSL语法设计
|
|
483
|
-
- 支持类型定义(`string:3-32`)
|
|
484
|
-
- 支持必填标记(`!`)
|
|
485
|
-
- 支持枚举值(`active|inactive`)
|
|
486
|
-
- 支持数组类型(`array<string>`)
|
|
487
|
-
- 支持嵌套对象
|
|
488
|
-
- 支持格式类型(email/url/uuid/date)
|
|
489
|
-
|
|
490
|
-
#### 导出器层
|
|
491
|
-
- ✅ **MongoDB导出器**
|
|
492
|
-
- 转换为MongoDB $jsonSchema格式
|
|
493
|
-
- 生成createCollection命令
|
|
494
|
-
- 支持验证级别配置
|
|
495
|
-
|
|
496
|
-
- ✅ **MySQL导出器**
|
|
497
|
-
- 生成CREATE TABLE DDL
|
|
498
|
-
- 智能类型映射(根据约束条件)
|
|
499
|
-
- 支持约束(NOT NULL/DEFAULT/COMMENT)
|
|
500
|
-
- 支持索引生成
|
|
501
|
-
|
|
502
|
-
- ✅ **PostgreSQL导出器**
|
|
503
|
-
- 生成CREATE TABLE DDL
|
|
504
|
-
- 智能类型映射(JSONB/UUID/TIMESTAMP等)
|
|
505
|
-
- 支持CHECK约束
|
|
506
|
-
- 支持列注释和表注释
|
|
507
|
-
|
|
508
|
-
#### 验证器扩展
|
|
509
|
-
- ✅ **自定义关键字**
|
|
510
|
-
- regex关键字(正则验证)
|
|
511
|
-
- validate关键字(函数验证)
|
|
512
|
-
- range关键字(数值范围)
|
|
513
|
-
|
|
514
|
-
#### 工具函数
|
|
515
|
-
- ✅ `TypeConverter` - 类型转换工具
|
|
516
|
-
- JSON Schema ↔ MongoDB BSON类型
|
|
517
|
-
- JSON Schema ↔ MySQL数据类型
|
|
518
|
-
- JSON Schema ↔ PostgreSQL数据类型
|
|
519
|
-
- 格式验证函数转正则表达式
|
|
520
|
-
|
|
521
|
-
- ✅ `SchemaHelper` - Schema辅助函数
|
|
522
|
-
- Schema验证和分析
|
|
523
|
-
- 字段路径提取
|
|
524
|
-
- 扁平化和克隆
|
|
525
|
-
- 复杂度评估
|
|
526
|
-
|
|
527
|
-
### 📝 文档和示例
|
|
528
|
-
|
|
529
|
-
- ✅ **README.md** - 完整项目文档
|
|
530
|
-
- 快速开始指南
|
|
531
|
-
- DSL语法指南
|
|
532
|
-
- API文档
|
|
533
|
-
- 完整示例
|
|
534
|
-
|
|
535
|
-
- ✅ **示例文件**
|
|
536
|
-
- `joi-style.js` - Joi风格完整示例
|
|
537
|
-
- `dsl-style.js` - DSL风格完整示例
|
|
538
|
-
|
|
539
|
-
### 🔧 改进
|
|
540
|
-
|
|
541
|
-
#### 代码质量
|
|
542
|
-
- ✅ 完整的JSDoc注释
|
|
543
|
-
- ✅ 清晰的命名规范(camelCase/PascalCase)
|
|
544
|
-
- ✅ 模块化设计(高内聚低耦合)
|
|
545
|
-
- ✅ 错误处理完善
|
|
546
|
-
|
|
547
|
-
#### 开发体验
|
|
548
|
-
- ✅ package.json脚本完善
|
|
549
|
-
- ✅ 依赖管理优化
|
|
550
|
-
- ✅ 示例代码丰富
|
|
551
|
-
|
|
552
|
-
### 🐛 修复
|
|
553
|
-
|
|
554
|
-
- ✅ 修复DSL适配器的_required标记清理问题
|
|
555
|
-
- ✅ 修复DSL枚举值解析问题
|
|
556
|
-
- ✅ 修复数组类型DSL解析问题
|
|
557
|
-
- ✅ 优化JoiAdapter的compile方法
|
|
558
|
-
|
|
559
|
-
### 📦 依赖变更
|
|
560
|
-
|
|
561
|
-
#### 新增依赖
|
|
562
|
-
```json
|
|
563
|
-
{
|
|
564
|
-
"ajv": "^8.17.1",
|
|
565
|
-
"ajv-formats": "^2.1.1"
|
|
566
|
-
}
|
|
567
|
-
```
|
|
267
|
+
### 🎉 初始发布
|
|
568
268
|
|
|
569
|
-
####
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
"eslint": "^8.57.1",
|
|
577
|
-
"monsqlize": "^1.0.1"
|
|
578
|
-
}
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
### 📊 统计信息
|
|
582
|
-
|
|
583
|
-
- **代码行数**: ~3200行
|
|
584
|
-
- **文件数**: 17个核心文件
|
|
585
|
-
- **功能完成度**: 98%
|
|
586
|
-
- **测试覆盖率**: 0%(待补充)
|
|
587
|
-
|
|
588
|
-
---
|
|
589
|
-
|
|
590
|
-
## [v0.1.0] - 2025-12-XX
|
|
591
|
-
|
|
592
|
-
### ✨ 初始版本
|
|
269
|
+
#### 核心功能
|
|
270
|
+
- ✅ **DSL 语法**: 简洁的字符串 DSL 定义 Schema
|
|
271
|
+
- `'string:3-32!'` - 字符串长度 3-32,必填
|
|
272
|
+
- `'number:0-100'` - 数字范围 0-100
|
|
273
|
+
- `'email!'` - 邮箱格式,必填
|
|
274
|
+
|
|
275
|
+
- ✅ **基础类型**: string, number, integer, boolean, object, array, null
|
|
593
276
|
|
|
594
|
-
-
|
|
595
|
-
- 类型系统设计
|
|
596
|
-
- SchemaBuilder原型
|
|
597
|
-
- 目录结构规划
|
|
277
|
+
- ✅ **格式类型**: email, url, uuid, date, datetime, time, ipv4, ipv6, binary
|
|
598
278
|
|
|
599
|
-
|
|
279
|
+
- ✅ **模式类型**:
|
|
280
|
+
- objectId - MongoDB ObjectId
|
|
281
|
+
- hexColor - 十六进制颜色
|
|
282
|
+
- macAddress - MAC 地址
|
|
283
|
+
- cron - Cron 表达式
|
|
284
|
+
- phone - 手机号(支持多国)
|
|
285
|
+
- idCard - 身份证号
|
|
286
|
+
- creditCard - 信用卡号
|
|
287
|
+
- licensePlate - 车牌号
|
|
288
|
+
- postalCode - 邮政编码
|
|
289
|
+
- passport - 护照号
|
|
600
290
|
|
|
601
|
-
|
|
291
|
+
- ✅ **验证功能**:
|
|
292
|
+
- `validate(schema, data)` - 同步验证
|
|
293
|
+
- `validateAsync(schema, data)` - 异步验证
|
|
602
294
|
|
|
603
|
-
|
|
295
|
+
- ✅ **错误格式化**: 友好的错误消息
|
|
604
296
|
|
|
605
|
-
|
|
606
|
-
- [ ] ChainAdapter - 链式风格适配器
|
|
607
|
-
- [ ] 完整测试套件(覆盖率80%+)
|
|
608
|
-
- [ ] TypeScript类型定义
|
|
609
|
-
- [ ] 性能基准测试
|
|
297
|
+
- ✅ **多语言支持**: zh-CN, en-US
|
|
610
298
|
|
|
611
|
-
|
|
612
|
-
- [ ] JoiAdapter required处理优化
|
|
613
|
-
- [ ] 错误提示优化
|
|
614
|
-
- [ ] 文档补充(API详细文档)
|
|
615
|
-
|
|
616
|
-
---
|
|
299
|
+
- ✅ **链式 API**: String 扩展,支持 `.label()`, `.messages()`, `.pattern()` 等
|
|
617
300
|
|
|
618
|
-
|
|
301
|
+
- ✅ **SchemaUtils**: omit, pick, partial, extend 工具方法
|
|
619
302
|
|
|
620
|
-
|
|
621
|
-
-
|
|
622
|
-
-
|
|
623
|
-
- `📝 文档`: 文档更新
|
|
624
|
-
- `🎨 样式`: 代码格式调整
|
|
625
|
-
- `♻️ 重构`: 代码重构
|
|
626
|
-
- `⚡ 性能`: 性能优化
|
|
627
|
-
- `🔒 安全`: 安全问题修复
|
|
628
|
-
- `📦 依赖`: 依赖更新
|
|
629
|
-
- `🎉 重大`: 重大变更
|
|
303
|
+
#### 文档和测试
|
|
304
|
+
- ✅ **完整文档**: README, API 文档, 示例代码
|
|
305
|
+
- ✅ **测试覆盖**: 447+ 测试用例,覆盖率 >90%
|
|
630
306
|
|
|
631
307
|
---
|
|
632
308
|
|
|
633
|
-
|
|
309
|
+
**更多历史版本信息请参考 Git 提交记录**
|