schema-dsl 1.0.0 → 1.0.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/CHANGELOG.md +263 -529
- package/README.md +814 -896
- package/STATUS.md +135 -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/typescript-guide.md +554 -0
- 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 +246 -17
- 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,357 @@
|
|
|
11
11
|
|
|
12
12
|
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
13
13
|
|------|------|---------|------|
|
|
14
|
-
| [
|
|
15
|
-
| [
|
|
16
|
-
| [
|
|
17
|
-
| [
|
|
18
|
-
| [
|
|
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.4](#v104) | 2025-12-31 | TypeScript 完整支持、validateAsync、ValidationError | [查看详情](#v104) |
|
|
15
|
+
| [v1.0.3](#v103) | 2025-12-31 | ⚠️ 破坏性变更:单值语法修复 | [查看详情](#v103) |
|
|
16
|
+
| [v1.0.2](#v102) | 2025-12-31 | 15个新增验证器、完整文档、75个测试 | [查看详情](#v102) |
|
|
17
|
+
| [v1.0.1](#v101) | 2025-12-31 | 枚举功能、自动类型识别、统一错误消息 | [查看详情](#v101) |
|
|
18
|
+
| [v1.0.0](#v100) | 2025-12-29 | 初始发布版本 | [查看详情](#v100) |
|
|
22
19
|
|
|
23
20
|
---
|
|
24
21
|
|
|
25
|
-
## [
|
|
22
|
+
## [v1.0.4] - 2025-12-31
|
|
26
23
|
|
|
27
|
-
###
|
|
24
|
+
### Added (新增功能)
|
|
28
25
|
|
|
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' })` 支持请求级别的语言切换
|
|
26
|
+
#### TypeScript 完整支持 ⭐
|
|
35
27
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
});
|
|
28
|
+
- ✅ **完整的类型定义**
|
|
29
|
+
- 新增 `validateAsync` 函数类型定义
|
|
30
|
+
- 新增 `ValidationError` 类完整类型(包含所有方法)
|
|
31
|
+
- 优化 String 扩展的 TypeScript 说明
|
|
49
32
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
33
|
+
- ✅ **TypeScript 使用指南**
|
|
34
|
+
- 创建完整的 TypeScript 使用文档 (`docs/typescript-guide.md`)
|
|
35
|
+
- 1000+ 行详细说明,涵盖从基础到高级所有场景
|
|
36
|
+
- 3个完整实战案例(用户注册、API验证、字段复用)
|
|
37
|
+
- 5个常见问题解答
|
|
55
38
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
39
|
+
- ✅ **TypeScript 链式调用最佳实践**
|
|
40
|
+
```typescript
|
|
41
|
+
// ✅ 推荐:使用 dsl() 包裹获得完整类型推导
|
|
42
|
+
const schema = dsl({
|
|
43
|
+
email: dsl('email!').label('邮箱').pattern(/custom/)
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// ❌ 不推荐:可能缺少类型提示
|
|
47
|
+
const schema = dsl({
|
|
48
|
+
email: 'email!'.label('邮箱')
|
|
49
|
+
});
|
|
50
|
+
```
|
|
60
51
|
|
|
61
|
-
|
|
62
|
-
- ✅ **`dsl.config()` 支持 cache 配置**: 用户可以自定义缓存大小和过期时间
|
|
63
|
-
- ✅ **支持 `maxSize` 配置**: 控制 Schema 编译缓存的最大条目数
|
|
64
|
-
- ✅ **支持 `ttl` 配置**: 控制缓存的过期时间(毫秒)
|
|
52
|
+
### Improved (改进)
|
|
65
53
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
maxSize: 10000, // 大型项目推荐
|
|
71
|
-
ttl: 7200000 // 2小时
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
```
|
|
54
|
+
- 📝 **README 更新**
|
|
55
|
+
- 添加 "1.5 TypeScript 用法" 快速开始章节
|
|
56
|
+
- 添加 TypeScript 使用指南链接
|
|
57
|
+
- 清晰说明 TypeScript 和 JavaScript 的不同用法
|
|
75
58
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
-
|
|
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,第一名)
|
|
59
|
+
- 🔧 **类型定义优化**
|
|
60
|
+
- 修复 `dsl.config` 的 `i18n` 参数类型错误
|
|
61
|
+
- 统一 `DslConfigOptions` 和 `dsl.config` 的类型定义
|
|
62
|
+
- 标记 String 扩展方法为 `@deprecated` for TypeScript
|
|
98
63
|
|
|
99
|
-
###
|
|
100
|
-
- 🧪 **新增 `test/unit/dsl-config.test.js`**: 8个测试用例,覆盖 i18n 和 cache 配置
|
|
101
|
-
- 🧪 **测试覆盖率**: >90%
|
|
102
|
-
- 🧪 **所有测试通过**: 150+ 个测试用例全部通过
|
|
64
|
+
### Documentation (文档)
|
|
103
65
|
|
|
104
|
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
- ✅ **向后兼容**: 100% 向后兼容,现有代码无需修改
|
|
66
|
+
- 📚 新增文档
|
|
67
|
+
- `docs/typescript-guide.md` - TypeScript 使用指南(1000+ 行)
|
|
68
|
+
- `reports/schema-dsl/implementation/dollar-method-implementation-v1.0.4.md` - 实施报告
|
|
69
|
+
- `reports/schema-dsl/summary/typescript-support-completion-v1.0.4.md` - 完成总结
|
|
109
70
|
|
|
110
|
-
|
|
71
|
+
### Note (重要说明)
|
|
111
72
|
|
|
112
|
-
|
|
73
|
+
- ✅ **100% 向后兼容** - JavaScript 用户无需任何改变
|
|
74
|
+
- ✅ **TypeScript 用户推荐使用 `dsl()` 包裹字符串** 以获得完整类型推导
|
|
75
|
+
- ✅ **所有 API 都有完整的 TypeScript 类型定义**
|
|
113
76
|
|
|
114
|
-
|
|
77
|
+
---
|
|
115
78
|
|
|
116
|
-
|
|
117
|
-
- ✅ **新增 `MarkdownExporter`**: 将 JSON Schema 导出为人类可读的 Markdown 文档
|
|
118
|
-
- ✅ **多语言支持**: 支持中文、英文、日文三种语言
|
|
119
|
-
- ✅ **自动生成字段表格**: 包含类型、约束、说明等信息
|
|
120
|
-
- ✅ **自动生成示例数据**: 根据 Schema 生成示例 JSON
|
|
121
|
-
- ✅ **约束规则汇总**: 自动列出必填和可选字段
|
|
79
|
+
## [v1.0.3] - 2025-12-31
|
|
122
80
|
|
|
123
|
-
|
|
124
|
-
```javascript
|
|
125
|
-
const { dsl, exporters } = require('schema-dsl');
|
|
81
|
+
### ⚠️ 破坏性变更 (Breaking Changes)
|
|
126
82
|
|
|
127
|
-
|
|
128
|
-
username: 'string:3-32!',
|
|
129
|
-
email: 'email!'
|
|
130
|
-
});
|
|
83
|
+
#### String 单值语法含义变更
|
|
131
84
|
|
|
132
|
-
|
|
133
|
-
title: '用户注册 API',
|
|
134
|
-
locale: 'zh-CN',
|
|
135
|
-
includeExample: true
|
|
136
|
-
});
|
|
137
|
-
```
|
|
85
|
+
**变更内容**: `'string:N'` 的含义从"最大长度"改为"精确长度"
|
|
138
86
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
87
|
+
**变更原因**:
|
|
88
|
+
1. ✅ 更符合直觉 - 验证码、国家代码等常用场景都是精确长度
|
|
89
|
+
2. ✅ 语义更清晰 - 看到 `'string:6'` 就知道是6位
|
|
90
|
+
3. ✅ 有替代方案 - 最大长度可用 `'string:-N'`
|
|
143
91
|
|
|
144
|
-
|
|
92
|
+
**影响范围**:
|
|
145
93
|
```javascript
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
```
|
|
94
|
+
// ❌ v1.0.2 及之前
|
|
95
|
+
'string:10' → maxLength: 10(最大长度)
|
|
149
96
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const result = validate(schema, data); // 更简洁!
|
|
97
|
+
// ✅ v1.0.3 及之后
|
|
98
|
+
'string:10' → exactLength: 10(精确长度)
|
|
99
|
+
'string:-10' → maxLength: 10(最大长度,新语法)
|
|
154
100
|
```
|
|
155
101
|
|
|
156
|
-
|
|
157
|
-
- ✅ 统一文档示例使用便捷函数
|
|
158
|
-
- ✅ 新增 `examples/markdown-export.js` 示例文件
|
|
159
|
-
- ✅ 导出器索引添加 Markdown 导出器
|
|
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
|
-
### 🔄 重大变更
|
|
171
|
-
|
|
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
|
|
179
|
-
|
|
180
|
-
### 📝 文档更新
|
|
181
|
-
- ✅ 更新所有文档中的包名引用
|
|
182
|
-
- ✅ 更新 README.md 中的安装说明
|
|
183
|
-
- ✅ 更新所有示例代码
|
|
184
|
-
|
|
185
|
-
### ⚠️ 迁移指南
|
|
186
|
-
|
|
187
|
-
如果您之前使用了 `schema-dsl`(内部测试版本),请按以下步骤迁移:
|
|
102
|
+
**迁移指南**:
|
|
188
103
|
|
|
104
|
+
1. **如果你的代码使用 `'string:N'` 表示最大长度**:
|
|
105
|
+
```javascript
|
|
106
|
+
// 旧代码
|
|
107
|
+
bio: 'string:500'
|
|
108
|
+
|
|
109
|
+
// 新代码(添加 - 前缀)
|
|
110
|
+
bio: 'string:-500'
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
2. **如果你的代码本意就是精确长度**:
|
|
114
|
+
```javascript
|
|
115
|
+
// 旧代码(行为不符合预期)
|
|
116
|
+
code: 'string:6' // 之前会解析为 maxLength: 6(错误)
|
|
117
|
+
|
|
118
|
+
// 新代码(现在正确工作)
|
|
119
|
+
code: 'string:6' // 现在正确解析为 exactLength: 6
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**检查方法**:
|
|
189
123
|
```bash
|
|
190
|
-
#
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
# 2. 安装新包
|
|
194
|
-
npm install schema-dsl
|
|
195
|
-
|
|
196
|
-
# 3. 更新代码中的引用
|
|
197
|
-
# 旧: const { dsl } = require('schema-dsl');
|
|
198
|
-
# 新: const { dsl } = require('schema-dsl');
|
|
124
|
+
# 在项目中搜索所有使用单值语法的地方
|
|
125
|
+
grep -rn "'string:[0-9]\\+['\"]" .
|
|
126
|
+
grep -rn '"string:[0-9]' .
|
|
199
127
|
```
|
|
200
128
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
129
|
+
**受益场景统计**:
|
|
130
|
+
- ✅ 60% 场景更简洁直观(验证码、国家码、邮编等)
|
|
131
|
+
- ⚠️ 20% 场景需要迁移(简介、描述等)
|
|
132
|
+
- ✅ 20% 场景无影响(范围语法)
|
|
204
133
|
|
|
205
|
-
|
|
134
|
+
### 🔧 修复 (Fixes)
|
|
206
135
|
|
|
207
|
-
|
|
208
|
-
-
|
|
209
|
-
-
|
|
210
|
-
- ✅ 清理所有注释的调试代码。
|
|
136
|
+
- 修复 String 单值约束语义不直观的问题
|
|
137
|
+
- 统一约束语法规则
|
|
138
|
+
- 完善文档说明
|
|
211
139
|
|
|
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}}`。
|
|
140
|
+
### 📝 文档 (Documentation)
|
|
223
141
|
|
|
224
|
-
|
|
225
|
-
-
|
|
226
|
-
-
|
|
227
|
-
- ✅ 明确简写API的优势和兼容性说明。
|
|
228
|
-
- ✅ 修复 `docs/dsl-syntax.md` 和 `docs/string-extensions.md` 缺失的类型和方法说明。
|
|
142
|
+
- 新增约束语法规则说明
|
|
143
|
+
- 新增迁移指南
|
|
144
|
+
- 更新所有示例代码
|
|
229
145
|
|
|
230
|
-
###
|
|
231
|
-
- ✅ 所有 318 个测试通过。
|
|
232
|
-
- ✅ 验证向后兼容性。
|
|
146
|
+
### 🆕 新增功能 (Added)
|
|
233
147
|
|
|
234
|
-
|
|
235
|
-
-
|
|
148
|
+
- 新增 `dateGreater()` 链式方法 - 日期大于验证
|
|
149
|
+
- 新增 `dateLess()` 链式方法 - 日期小于验证
|
|
236
150
|
|
|
237
151
|
---
|
|
238
152
|
|
|
239
|
-
## [
|
|
153
|
+
## [v1.0.2] - 2025-12-31
|
|
240
154
|
|
|
241
|
-
###
|
|
242
|
-
- ✅ 修复 `examples/user-registration/schema.js` 中 `any.only` 错误键名。
|
|
243
|
-
- ✅ 修复 `ErrorCodes.js` 中遗留的 `string.*` 错误码,统一为 `format.*`。
|
|
244
|
-
- ✅ 修复 `Locale.test.js` 测试用例,适配新的错误码标准。
|
|
245
|
-
|
|
246
|
-
### ♻️ 重构
|
|
247
|
-
- ✅ **多语言架构重构**: `Locale.js` 自动加载默认语言包,`ErrorCodes.js` 移除硬编码的 `zhCN` 字段,实现真正的多语言解耦。
|
|
248
|
-
- ✅ 清理 `ErrorCodes.js`,移除不推荐使用的 `string.email` 等遗留键名。
|
|
249
|
-
- ✅ 新增 `type` 错误码,完善类型错误定义。
|
|
250
|
-
|
|
251
|
-
---
|
|
155
|
+
### 🎉 新增功能 (Added)
|
|
252
156
|
|
|
253
|
-
|
|
157
|
+
#### 验证器扩展 (15 个新增验证器)
|
|
254
158
|
|
|
255
|
-
|
|
256
|
-
-
|
|
257
|
-
-
|
|
159
|
+
**String 验证器** (6 个):
|
|
160
|
+
- ✅ **exactLength**: 精确长度验证 - 验证字符串长度必须等于指定值
|
|
161
|
+
- ✅ **alphanum**: 只能包含字母和数字 - 用于用户名、编码等场景
|
|
162
|
+
- ✅ **trim**: 不能包含前后空格 - 用于搜索关键词、API密钥等
|
|
163
|
+
- ✅ **lowercase**: 必须是小写 - 用于邮箱、URL slug等
|
|
164
|
+
- ✅ **uppercase**: 必须是大写 - 用于国家代码、货币代码等
|
|
165
|
+
- ✅ **jsonString**: JSON 字符串验证 - 验证有效的 JSON 格式
|
|
258
166
|
|
|
259
|
-
|
|
260
|
-
- ✅
|
|
261
|
-
- ✅
|
|
167
|
+
**Number 验证器** (2 个):
|
|
168
|
+
- ✅ **precision**: 小数位数限制 - 用于价格、百分比等高精度场景
|
|
169
|
+
- ✅ **port**: 端口号验证 (1-65535) - 用于服务器配置
|
|
262
170
|
|
|
263
|
-
|
|
264
|
-
- ✅
|
|
265
|
-
- ✅
|
|
266
|
-
- ✅ `macAddress` - MAC 地址
|
|
267
|
-
- ✅ `cron` - Cron 表达式
|
|
171
|
+
**Object 验证器** (2 个):
|
|
172
|
+
- ✅ **requiredAll**: 要求所有定义的属性都存在 - 用于完整性检查
|
|
173
|
+
- ✅ **strictSchema**: 严格模式,不允许额外属性 - 用于API请求验证
|
|
268
174
|
|
|
269
|
-
|
|
270
|
-
- ✅
|
|
271
|
-
- ✅
|
|
175
|
+
**Array 验证器** (2 个):
|
|
176
|
+
- ✅ **noSparse**: 不允许稀疏数组 - 用于批量处理数据
|
|
177
|
+
- ✅ **includesRequired**: 必须包含指定的元素 - 用于权限、标签验证
|
|
272
178
|
|
|
273
|
-
|
|
179
|
+
**Date 验证器** (3 个):
|
|
180
|
+
- ✅ **dateFormat**: 自定义日期格式验证 (支持5种格式: YYYY-MM-DD, YYYY/MM/DD, DD-MM-YYYY, DD/MM/YYYY, ISO8601)
|
|
181
|
+
- ✅ **dateGreater**: 日期必须大于指定日期 - 用于活动时间范围
|
|
182
|
+
- ✅ **dateLess**: 日期必须小于指定日期 - 用于历史数据验证
|
|
274
183
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
184
|
+
**使用示例**:
|
|
185
|
+
```javascript
|
|
186
|
+
const { dsl, validate } = require('schema-dsl');
|
|
187
|
+
|
|
188
|
+
// String 验证器
|
|
189
|
+
const schema = {
|
|
190
|
+
code: { type: 'string', exactLength: 6 }, // 验证码
|
|
191
|
+
username: { type: 'string', alphanum: true }, // 用户名
|
|
192
|
+
keyword: { type: 'string', trim: true }, // 搜索关键词
|
|
193
|
+
email: { type: 'string', lowercase: true }, // 邮箱
|
|
194
|
+
countryCode: { type: 'string', uppercase: true }, // 国家代码
|
|
195
|
+
config: { type: 'string', jsonString: true }, // JSON配置
|
|
196
|
+
|
|
197
|
+
// Number 验证器
|
|
198
|
+
price: { type: 'number', precision: 2 }, // 价格(2位小数)
|
|
199
|
+
port: { type: 'integer', port: true }, // 端口号
|
|
200
|
+
|
|
201
|
+
// Date 验证器
|
|
202
|
+
birthDate: { type: 'string', dateFormat: 'YYYY-MM-DD' }, // 生日
|
|
203
|
+
endDate: { type: 'string', dateGreater: '2025-01-01' }, // 结束日期
|
|
204
|
+
startDate: { type: 'string', dateLess: '2025-12-31' } // 开始日期
|
|
205
|
+
};
|
|
206
|
+
```
|
|
278
207
|
|
|
279
|
-
|
|
208
|
+
#### 多语言支持
|
|
209
|
+
- ✅ **中文消息**: 新增 19 个验证消息
|
|
210
|
+
- ✅ **英文消息**: 新增 19 个验证消息
|
|
211
|
+
- ✅ **错误消息键**: 统一使用 string.length, number.precision 等键名
|
|
280
212
|
|
|
281
|
-
|
|
282
|
-
- ✅ `docs/
|
|
213
|
+
### 📝 文档 (Documentation)
|
|
214
|
+
- ✅ 新增 `docs/validation-rules-v1.0.2.md` - 15个验证器详细文档(1200行)
|
|
215
|
+
- ✅ 每个验证器包含:用途、参数、错误消息、使用方法、应用场景、最佳实践
|
|
216
|
+
- ✅ 完整的代码示例和验证演示
|
|
217
|
+
- ✅ 组合使用技巧和国际化支持说明
|
|
283
218
|
|
|
284
|
-
|
|
219
|
+
### 🧪 测试 (Tests)
|
|
220
|
+
- ✅ 新增 `test/unit/validators/CustomKeywords-v1.0.2.test.js`
|
|
221
|
+
- ✅ 75 个单元测试用例,覆盖所有新增验证器
|
|
222
|
+
- ✅ 每个验证器至少 5 个测试用例(正常、边界、错误情况)
|
|
223
|
+
- ✅ 测试覆盖率: 100%
|
|
224
|
+
- ✅ 所有测试通过: 602 passing
|
|
285
225
|
|
|
286
|
-
|
|
226
|
+
### 📦 示例 (Examples)
|
|
227
|
+
- ⏳ 待补充 `examples/validation-rules-v1.0.2.examples.js`
|
|
287
228
|
|
|
288
|
-
###
|
|
229
|
+
### 🔧 技术细节 (Technical Details)
|
|
289
230
|
|
|
290
|
-
|
|
291
|
-
-
|
|
292
|
-
-
|
|
293
|
-
-
|
|
231
|
+
**实现位置**: `lib/validators/CustomKeywords.js`
|
|
232
|
+
- String 验证器: L210-334
|
|
233
|
+
- Number 验证器: L342-389
|
|
234
|
+
- Object 验证器: L397-441
|
|
235
|
+
- Array 验证器: L449-499
|
|
236
|
+
- Date 验证器: L507-608
|
|
294
237
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
dsl({ name: 's:3-32!' })
|
|
238
|
+
**错误消息位置**:
|
|
239
|
+
- `lib/locales/zh-CN.js` (126 行)
|
|
240
|
+
- `lib/locales/en-US.js` (126 行)
|
|
299
241
|
|
|
300
|
-
|
|
301
|
-
dsl({ name: 'string:3-32!' })
|
|
302
|
-
```
|
|
242
|
+
---
|
|
303
243
|
|
|
304
|
-
|
|
244
|
+
## [v1.0.1] - 2025-12-31
|
|
305
245
|
|
|
306
|
-
|
|
307
|
-
- ✅ `time` - 时间格式 (HH:mm:ss)
|
|
308
|
-
- ✅ `ipv4` - IPv4 地址
|
|
309
|
-
- ✅ `ipv6` - IPv6 地址
|
|
310
|
-
- ✅ `binary` - 二进制数据 (Base64)
|
|
311
|
-
- ✅ `any` - 任意类型
|
|
312
|
-
- ✅ `null` - 空值类型
|
|
246
|
+
### 🎉 新增功能 (Added)
|
|
313
247
|
|
|
314
|
-
####
|
|
315
|
-
- ✅ `
|
|
316
|
-
- ✅ `
|
|
317
|
-
- ✅ `
|
|
318
|
-
- ✅ `
|
|
319
|
-
- ✅ `
|
|
248
|
+
#### 枚举功能
|
|
249
|
+
- ✅ **字符串枚举**: `'active|inactive|pending'` 简写语法
|
|
250
|
+
- ✅ **布尔值枚举**: `'true|false'` 自动识别为布尔值
|
|
251
|
+
- ✅ **数字枚举**: `'1|2|3'` 自动识别为数字
|
|
252
|
+
- ✅ **整数枚举**: `'enum:integer:1|2|3'` 显式指定整数类型
|
|
253
|
+
- ✅ **小数枚举**: `'1.0|1.5|2.0'` 支持小数值
|
|
254
|
+
- ✅ **必填枚举**: `'active|inactive!'` 支持必填标记
|
|
255
|
+
- ✅ **显式类型**: `'enum:type:values'` 显式指定枚举类型
|
|
320
256
|
|
|
321
|
-
|
|
257
|
+
**使用示例**:
|
|
322
258
|
```javascript
|
|
259
|
+
const { dsl, validate } = require('schema-dsl');
|
|
260
|
+
|
|
323
261
|
const schema = dsl({
|
|
324
|
-
|
|
325
|
-
|
|
262
|
+
// 字符串枚举(自动识别)
|
|
263
|
+
status: 'active|inactive|pending',
|
|
264
|
+
|
|
265
|
+
// 布尔值枚举(自动识别)
|
|
266
|
+
isPublic: 'true|false',
|
|
267
|
+
|
|
268
|
+
// 数字枚举(自动识别)
|
|
269
|
+
priority: '1|2|3',
|
|
270
|
+
|
|
271
|
+
// 整数枚举(显式指定)
|
|
272
|
+
level: 'enum:integer:1|2|3',
|
|
273
|
+
|
|
274
|
+
// 必填枚举
|
|
275
|
+
role: 'admin|user|guest!'
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// 验证
|
|
279
|
+
const result = validate(schema, {
|
|
280
|
+
status: 'active',
|
|
281
|
+
isPublic: true,
|
|
282
|
+
priority: 1,
|
|
283
|
+
level: 2,
|
|
284
|
+
role: 'admin'
|
|
326
285
|
});
|
|
327
286
|
```
|
|
328
287
|
|
|
329
|
-
####
|
|
330
|
-
- ✅
|
|
288
|
+
#### 统一错误消息
|
|
289
|
+
- ✅ **统一 'enum' 键**: 所有枚举类型统一使用 `'enum'` 定义错误消息
|
|
290
|
+
- ✅ **简化配置**: 不需要记忆不同类型的错误消息键名
|
|
291
|
+
- ✅ **高级用法**: 支持 `'type.enum'` 格式按类型定制消息(可选)
|
|
331
292
|
|
|
332
|
-
|
|
293
|
+
**使用示例**:
|
|
333
294
|
```javascript
|
|
334
|
-
// ✅ 优雅方式
|
|
335
|
-
const schema = dsl({
|
|
336
|
-
'user!': { // user 本身必填
|
|
337
|
-
name: 'string', // name 可选
|
|
338
|
-
email: 'email' // email 可选
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
// 对比旧方式
|
|
343
295
|
const schema = dsl({
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
}
|
|
296
|
+
status: dsl('active|inactive').messages({
|
|
297
|
+
'enum': '状态必须是 active 或 inactive' // 统一使用 enum
|
|
298
|
+
})
|
|
348
299
|
});
|
|
349
300
|
```
|
|
350
301
|
|
|
351
|
-
### 📝
|
|
302
|
+
### 📝 文档 (Documentation)
|
|
352
303
|
|
|
353
|
-
|
|
354
|
-
- ✅
|
|
355
|
-
- ✅
|
|
356
|
-
- ✅ **简化示例** - 使用最简单的方式
|
|
357
|
-
- ✅ **实现方案对比** - "不能这样 vs 只能这样"
|
|
304
|
+
- ✅ **新增 docs/enum.md**: 完整的枚举功能文档(476行)
|
|
305
|
+
- ✅ **更新 README.md**: 添加枚举语法说明
|
|
306
|
+
- ✅ **新增示例**: examples/enum.examples.js(325行,10个示例)
|
|
358
307
|
|
|
359
|
-
|
|
360
|
-
- ✅ `docs/type-reference.md` - 完整类型列表
|
|
361
|
-
- ✅ 与 joi 对比表
|
|
362
|
-
- ✅ 所有类型使用示例
|
|
308
|
+
### ✅ 测试 (Tests)
|
|
363
309
|
|
|
364
|
-
|
|
310
|
+
- ✅ **新增 test/unit/enum.test.js**: 30个枚举测试用例
|
|
311
|
+
- ✅ **测试覆盖**: 字符串/布尔值/数字/整数枚举全覆盖
|
|
312
|
+
- ✅ **错误处理测试**: 无效枚举值、类型不匹配测试
|
|
365
313
|
|
|
366
|
-
|
|
367
|
-
- ✅ 修复 `format()` 方法只处理单个错误的问题
|
|
368
|
-
- ✅ 支持 ajv 返回的多个错误
|
|
369
|
-
- ✅ `formatDetailed()` 正确处理 ajv 错误格式
|
|
370
|
-
- ✅ `_interpolate()` 处理 undefined template
|
|
314
|
+
### 📊 变更统计
|
|
371
315
|
|
|
372
|
-
|
|
373
|
-
-
|
|
374
|
-
-
|
|
375
|
-
-
|
|
376
|
-
|
|
377
|
-
#### 数组 DSL 解析修复
|
|
378
|
-
- ✅ 修复 `array!1-10` 被解析为 string 的问题
|
|
379
|
-
- ✅ DslBuilder 构造函数支持 `array!数字` 格式
|
|
380
|
-
- ✅ DslAdapter 和 DslBuilder 同步支持数组约束
|
|
381
|
-
|
|
382
|
-
### 🧪 测试改进
|
|
383
|
-
|
|
384
|
-
#### 测试通过率 100%
|
|
385
|
-
- ✅ **215 个测试全部通过** (之前 211/215)
|
|
386
|
-
- ✅ 数组 DSL 语法测试 5/5 通过
|
|
387
|
-
- ✅ 删除简写测试 (已移除功能)
|
|
388
|
-
- ✅ 修复 date 格式测试
|
|
389
|
-
|
|
390
|
-
### 📦 其他改进
|
|
391
|
-
|
|
392
|
-
#### 代码质量
|
|
393
|
-
- ✅ 统一类型定义(移除简写)
|
|
394
|
-
- ✅ 优化解析逻辑
|
|
395
|
-
- ✅ 清理临时文件
|
|
396
|
-
|
|
397
|
-
---
|
|
398
|
-
|
|
399
|
-
## [v2.0.0] - 2025-12-25 (内部版本)
|
|
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
|
-
- 无变更
|
|
316
|
+
- **新增代码**: ~500 行
|
|
317
|
+
- **新增测试**: 30 个
|
|
318
|
+
- **新增文档**: 476 行
|
|
319
|
+
- **新增示例**: 325 行
|
|
442
320
|
|
|
443
321
|
---
|
|
444
322
|
|
|
445
|
-
## [v1.0.0] - 2025-12-
|
|
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
|
-
```
|
|
568
|
-
|
|
569
|
-
#### 新增开发依赖
|
|
570
|
-
```json
|
|
571
|
-
{
|
|
572
|
-
"mocha": "^10.8.2",
|
|
573
|
-
"chai": "^4.5.0",
|
|
574
|
-
"sinon": "^17.0.1",
|
|
575
|
-
"nyc": "^15.1.0",
|
|
576
|
-
"eslint": "^8.57.1",
|
|
577
|
-
"monsqlize": "^1.0.1"
|
|
578
|
-
}
|
|
579
|
-
```
|
|
323
|
+
## [v1.0.0] - 2025-12-29
|
|
580
324
|
|
|
581
|
-
###
|
|
582
|
-
|
|
583
|
-
- **代码行数**: ~3200行
|
|
584
|
-
- **文件数**: 17个核心文件
|
|
585
|
-
- **功能完成度**: 98%
|
|
586
|
-
- **测试覆盖率**: 0%(待补充)
|
|
587
|
-
|
|
588
|
-
---
|
|
325
|
+
### 🎉 初始发布
|
|
589
326
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
327
|
+
#### 核心功能
|
|
328
|
+
- ✅ **DSL 语法**: 简洁的字符串 DSL 定义 Schema
|
|
329
|
+
- `'string:3-32!'` - 字符串长度 3-32,必填
|
|
330
|
+
- `'number:0-100'` - 数字范围 0-100
|
|
331
|
+
- `'email!'` - 邮箱格式,必填
|
|
332
|
+
|
|
333
|
+
- ✅ **基础类型**: string, number, integer, boolean, object, array, null
|
|
593
334
|
|
|
594
|
-
-
|
|
595
|
-
- 类型系统设计
|
|
596
|
-
- SchemaBuilder原型
|
|
597
|
-
- 目录结构规划
|
|
335
|
+
- ✅ **格式类型**: email, url, uuid, date, datetime, time, ipv4, ipv6, binary
|
|
598
336
|
|
|
599
|
-
|
|
337
|
+
- ✅ **模式类型**:
|
|
338
|
+
- objectId - MongoDB ObjectId
|
|
339
|
+
- hexColor - 十六进制颜色
|
|
340
|
+
- macAddress - MAC 地址
|
|
341
|
+
- cron - Cron 表达式
|
|
342
|
+
- phone - 手机号(支持多国)
|
|
343
|
+
- idCard - 身份证号
|
|
344
|
+
- creditCard - 信用卡号
|
|
345
|
+
- licensePlate - 车牌号
|
|
346
|
+
- postalCode - 邮政编码
|
|
347
|
+
- passport - 护照号
|
|
600
348
|
|
|
601
|
-
|
|
349
|
+
- ✅ **验证功能**:
|
|
350
|
+
- `validate(schema, data)` - 同步验证
|
|
351
|
+
- `validateAsync(schema, data)` - 异步验证
|
|
602
352
|
|
|
603
|
-
|
|
353
|
+
- ✅ **错误格式化**: 友好的错误消息
|
|
604
354
|
|
|
605
|
-
|
|
606
|
-
- [ ] ChainAdapter - 链式风格适配器
|
|
607
|
-
- [ ] 完整测试套件(覆盖率80%+)
|
|
608
|
-
- [ ] TypeScript类型定义
|
|
609
|
-
- [ ] 性能基准测试
|
|
355
|
+
- ✅ **多语言支持**: zh-CN, en-US
|
|
610
356
|
|
|
611
|
-
|
|
612
|
-
- [ ] JoiAdapter required处理优化
|
|
613
|
-
- [ ] 错误提示优化
|
|
614
|
-
- [ ] 文档补充(API详细文档)
|
|
615
|
-
|
|
616
|
-
---
|
|
357
|
+
- ✅ **链式 API**: String 扩展,支持 `.label()`, `.messages()`, `.pattern()` 等
|
|
617
358
|
|
|
618
|
-
|
|
359
|
+
- ✅ **SchemaUtils**: omit, pick, partial, extend 工具方法
|
|
619
360
|
|
|
620
|
-
|
|
621
|
-
-
|
|
622
|
-
-
|
|
623
|
-
- `📝 文档`: 文档更新
|
|
624
|
-
- `🎨 样式`: 代码格式调整
|
|
625
|
-
- `♻️ 重构`: 代码重构
|
|
626
|
-
- `⚡ 性能`: 性能优化
|
|
627
|
-
- `🔒 安全`: 安全问题修复
|
|
628
|
-
- `📦 依赖`: 依赖更新
|
|
629
|
-
- `🎉 重大`: 重大变更
|
|
361
|
+
#### 文档和测试
|
|
362
|
+
- ✅ **完整文档**: README, API 文档, 示例代码
|
|
363
|
+
- ✅ **测试覆盖**: 447+ 测试用例,覆盖率 >90%
|
|
630
364
|
|
|
631
365
|
---
|
|
632
366
|
|
|
633
|
-
|
|
367
|
+
**更多历史版本信息请参考 Git 提交记录**
|