schema-dsl 2.3.0
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/.eslintignore +10 -0
- package/.eslintrc.json +27 -0
- package/.github/CODE_OF_CONDUCT.md +45 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +57 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
- package/.github/ISSUE_TEMPLATE/question.md +31 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +70 -0
- package/.github/SECURITY.md +184 -0
- package/.github/workflows/ci.yml +35 -0
- package/CHANGELOG.md +633 -0
- package/CONTRIBUTING.md +368 -0
- package/LICENSE +21 -0
- package/README.md +1122 -0
- package/STATUS.md +273 -0
- package/docs/FEATURE-INDEX.md +521 -0
- package/docs/INDEX.md +224 -0
- package/docs/api-reference.md +1098 -0
- package/docs/best-practices.md +672 -0
- package/docs/cache-manager.md +336 -0
- package/docs/design-philosophy.md +602 -0
- package/docs/dsl-syntax.md +654 -0
- package/docs/dynamic-locale.md +552 -0
- package/docs/error-handling.md +703 -0
- package/docs/export-guide.md +459 -0
- package/docs/faq.md +576 -0
- package/docs/frontend-i18n-guide.md +290 -0
- package/docs/i18n-user-guide.md +488 -0
- package/docs/label-vs-description.md +262 -0
- package/docs/markdown-exporter.md +398 -0
- package/docs/mongodb-exporter.md +279 -0
- package/docs/multi-type-support.md +319 -0
- package/docs/mysql-exporter.md +257 -0
- package/docs/plugin-system.md +542 -0
- package/docs/postgresql-exporter.md +290 -0
- package/docs/quick-start.md +761 -0
- package/docs/schema-helper.md +340 -0
- package/docs/schema-utils.md +492 -0
- package/docs/string-extensions.md +480 -0
- package/docs/troubleshooting.md +471 -0
- package/docs/type-converter.md +319 -0
- package/docs/type-reference.md +219 -0
- package/docs/validate.md +486 -0
- package/docs/validation-guide.md +484 -0
- package/examples/array-dsl-example.js +227 -0
- package/examples/custom-extension.js +85 -0
- package/examples/dsl-match-example.js +74 -0
- package/examples/dsl-style.js +118 -0
- package/examples/dynamic-locale-configuration.js +348 -0
- package/examples/dynamic-locale-example.js +287 -0
- package/examples/export-demo.js +130 -0
- package/examples/i18n-full-demo.js +310 -0
- package/examples/i18n-memory-safety.examples.js +268 -0
- package/examples/markdown-export.js +71 -0
- package/examples/middleware-usage.js +93 -0
- package/examples/password-reset/README.md +153 -0
- package/examples/password-reset/schema.js +26 -0
- package/examples/password-reset/test.js +101 -0
- package/examples/plugin-system.examples.js +205 -0
- package/examples/simple-example.js +122 -0
- package/examples/string-extensions.js +297 -0
- package/examples/user-registration/README.md +156 -0
- package/examples/user-registration/routes.js +92 -0
- package/examples/user-registration/schema.js +150 -0
- package/examples/user-registration/server.js +74 -0
- package/index.d.ts +1999 -0
- package/index.js +270 -0
- package/index.mjs +30 -0
- package/lib/adapters/DslAdapter.js +653 -0
- package/lib/adapters/index.js +20 -0
- package/lib/config/constants.js +286 -0
- package/lib/config/patterns/creditCard.js +9 -0
- package/lib/config/patterns/idCard.js +9 -0
- package/lib/config/patterns/index.js +8 -0
- package/lib/config/patterns/licensePlate.js +4 -0
- package/lib/config/patterns/passport.js +4 -0
- package/lib/config/patterns/phone.js +9 -0
- package/lib/config/patterns/postalCode.js +5 -0
- package/lib/core/CacheManager.js +376 -0
- package/lib/core/DslBuilder.js +740 -0
- package/lib/core/ErrorCodes.js +233 -0
- package/lib/core/ErrorFormatter.js +342 -0
- package/lib/core/JSONSchemaCore.js +347 -0
- package/lib/core/Locale.js +119 -0
- package/lib/core/MessageTemplate.js +89 -0
- package/lib/core/PluginManager.js +448 -0
- package/lib/core/StringExtensions.js +209 -0
- package/lib/core/Validator.js +316 -0
- package/lib/exporters/MarkdownExporter.js +420 -0
- package/lib/exporters/MongoDBExporter.js +162 -0
- package/lib/exporters/MySQLExporter.js +212 -0
- package/lib/exporters/PostgreSQLExporter.js +289 -0
- package/lib/exporters/index.js +24 -0
- package/lib/locales/en-US.js +65 -0
- package/lib/locales/es-ES.js +66 -0
- package/lib/locales/fr-FR.js +66 -0
- package/lib/locales/index.js +8 -0
- package/lib/locales/ja-JP.js +66 -0
- package/lib/locales/zh-CN.js +93 -0
- package/lib/utils/LRUCache.js +174 -0
- package/lib/utils/SchemaHelper.js +240 -0
- package/lib/utils/SchemaUtils.js +313 -0
- package/lib/utils/TypeConverter.js +245 -0
- package/lib/utils/index.js +13 -0
- package/lib/validators/CustomKeywords.js +203 -0
- package/lib/validators/index.js +11 -0
- package/package.json +70 -0
- package/plugins/custom-format.js +101 -0
- package/plugins/custom-validator.js +200 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,633 @@
|
|
|
1
|
+
# schema-dsl 更新日志
|
|
2
|
+
|
|
3
|
+
本文档记录 schema-dsl 项目的所有重要变更。
|
|
4
|
+
|
|
5
|
+
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
|
|
6
|
+
版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 版本概览
|
|
11
|
+
|
|
12
|
+
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
13
|
+
|------|------|---------|------|
|
|
14
|
+
| [v2.3.0](#v230) | 2025-12-29 | 用户语言包配置、缓存优化、性能提升3-10倍 | [查看详情](#v230) |
|
|
15
|
+
| [v2.2.0](#v220) | 2025-12-29 | Markdown 导出器、插件系统、快速开始优化 | [查看详情](#v220) |
|
|
16
|
+
| [v2.1.2](#v212) | 2025-12-26 | 代码清理、错误消息优化、min/max简写 | [查看详情](#v212) |
|
|
17
|
+
| [v2.1.1](#v211) | 2025-12-25 | 修复错误键名、清理遗留代码 | [查看详情](#v211) |
|
|
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) |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## [v2.3.0] - 2025-12-29
|
|
26
|
+
|
|
27
|
+
### 🎉 新增功能 (Added)
|
|
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` 配置**: 控制缓存的过期时间(毫秒)
|
|
65
|
+
|
|
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
|
|
113
|
+
|
|
114
|
+
### ✨ 新增功能
|
|
115
|
+
|
|
116
|
+
#### Markdown 导出器
|
|
117
|
+
- ✅ **新增 `MarkdownExporter`**: 将 JSON Schema 导出为人类可读的 Markdown 文档
|
|
118
|
+
- ✅ **多语言支持**: 支持中文、英文、日文三种语言
|
|
119
|
+
- ✅ **自动生成字段表格**: 包含类型、约束、说明等信息
|
|
120
|
+
- ✅ **自动生成示例数据**: 根据 Schema 生成示例 JSON
|
|
121
|
+
- ✅ **约束规则汇总**: 自动列出必填和可选字段
|
|
122
|
+
|
|
123
|
+
**使用示例**:
|
|
124
|
+
```javascript
|
|
125
|
+
const { dsl, exporters } = require('schema-dsl');
|
|
126
|
+
|
|
127
|
+
const schema = dsl({
|
|
128
|
+
username: 'string:3-32!',
|
|
129
|
+
email: 'email!'
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const markdown = exporters.MarkdownExporter.export(schema, {
|
|
133
|
+
title: '用户注册 API',
|
|
134
|
+
locale: 'zh-CN',
|
|
135
|
+
includeExample: true
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
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
|
+
```
|
|
149
|
+
|
|
150
|
+
**改进后**:
|
|
151
|
+
```javascript
|
|
152
|
+
const { validate } = require('schema-dsl');
|
|
153
|
+
const result = validate(schema, data); // 更简洁!
|
|
154
|
+
```
|
|
155
|
+
|
|
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`(内部测试版本),请按以下步骤迁移:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# 1. 卸载旧包(如果安装过)
|
|
191
|
+
npm uninstall schema-dsl
|
|
192
|
+
|
|
193
|
+
# 2. 安装新包
|
|
194
|
+
npm install schema-dsl
|
|
195
|
+
|
|
196
|
+
# 3. 更新代码中的引用
|
|
197
|
+
# 旧: const { dsl } = require('schema-dsl');
|
|
198
|
+
# 新: const { dsl } = require('schema-dsl');
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**注意**: 除了包名变更,所有 API 保持完全兼容,无需修改业务代码。
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## [v2.1.2] - 2025-12-26
|
|
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
|
+
- ✅ 验证向后兼容性。
|
|
233
|
+
|
|
234
|
+
### 📦 其他
|
|
235
|
+
- ✅ 生成 `FIXES_SUMMARY.md` 详细修复总结文档。
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## [v2.1.1] - 2025-12-25
|
|
240
|
+
|
|
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
|
+
---
|
|
252
|
+
|
|
253
|
+
## [v2.1.0] - 2025-12-25
|
|
254
|
+
|
|
255
|
+
### 🔴 破坏性变更
|
|
256
|
+
- ❌ 移除 `JoiAdapter` 及相关 API。
|
|
257
|
+
- ❌ Patterns 错误消息改为 Key,需配合 Locale 使用。
|
|
258
|
+
|
|
259
|
+
### ✨ 新增功能
|
|
260
|
+
- ✅ 多语言支持增强:`dsl.config({ locales: ... })`。
|
|
261
|
+
- ✅ ESM 支持:添加 `exports` 和 `index.mjs`。
|
|
262
|
+
|
|
263
|
+
#### 扩展新类型
|
|
264
|
+
- ✅ `objectId` - MongoDB ObjectId (24位十六进制)
|
|
265
|
+
- ✅ `hexColor` - CSS 16进制颜色 (#fff 或 #ffffff)
|
|
266
|
+
- ✅ `macAddress` - MAC 地址
|
|
267
|
+
- ✅ `cron` - Cron 表达式
|
|
268
|
+
|
|
269
|
+
#### 全局配置 API
|
|
270
|
+
- ✅ `dsl.config(options)` - 支持运行时修改配置
|
|
271
|
+
- ✅ 支持自定义手机号验证规则
|
|
272
|
+
|
|
273
|
+
### ♻️ 重构
|
|
274
|
+
|
|
275
|
+
#### 号码验证逻辑
|
|
276
|
+
- ✅ 提取手机号正则到 `lib/config/phonePatterns.js`
|
|
277
|
+
- ✅ 实现配置与逻辑分离
|
|
278
|
+
|
|
279
|
+
### 📝 文档更新
|
|
280
|
+
|
|
281
|
+
#### 移除 Joi 对比
|
|
282
|
+
- ✅ `docs/type-reference.md` 移除 Joi 列,专注自身功能
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## [v2.0.1] - 2025-12-25
|
|
287
|
+
|
|
288
|
+
### 🔴 破坏性变更
|
|
289
|
+
|
|
290
|
+
#### 移除简写功能
|
|
291
|
+
- ❌ **不再支持类型简写** - `s/n/i/b/o/a` 等简写已移除
|
|
292
|
+
- ✅ **使用完整类型名** - `string/number/integer/boolean/object/array`
|
|
293
|
+
- **原因**: 降低学习成本,减少歧义,提升代码可读性
|
|
294
|
+
|
|
295
|
+
**迁移指南**:
|
|
296
|
+
```javascript
|
|
297
|
+
// ❌ v2.0.0 及之前
|
|
298
|
+
dsl({ name: 's:3-32!' })
|
|
299
|
+
|
|
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
|
+
const schema = dsl({
|
|
324
|
+
tags: 'array!1-10<string:1-20>', // 1-10个标签,每个1-20字符
|
|
325
|
+
items: 'array:1-<number:0-100>' // 至少1个,每个0-100
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
#### 对象必填优化
|
|
330
|
+
- ✅ **key! 语法** - 字段名带 `!` 表示该字段本身必填
|
|
331
|
+
|
|
332
|
+
**示例**:
|
|
333
|
+
```javascript
|
|
334
|
+
// ✅ 优雅方式
|
|
335
|
+
const schema = dsl({
|
|
336
|
+
'user!': { // user 本身必填
|
|
337
|
+
name: 'string', // name 可选
|
|
338
|
+
email: 'email' // email 可选
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
// 对比旧方式
|
|
343
|
+
const schema = dsl({
|
|
344
|
+
user: {
|
|
345
|
+
name: 'string!', // name 必填(但 user 可选)
|
|
346
|
+
email: 'email!'
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### 📝 文档更新
|
|
352
|
+
|
|
353
|
+
#### 完全重写 DSL 语法文档
|
|
354
|
+
- ✅ **行数减少 80%** - 从 2857 行精简到 567 行
|
|
355
|
+
- ✅ **移除所有简写** - 只使用完整类型名
|
|
356
|
+
- ✅ **简化示例** - 使用最简单的方式
|
|
357
|
+
- ✅ **实现方案对比** - "不能这样 vs 只能这样"
|
|
358
|
+
|
|
359
|
+
#### 新增完整类型文档
|
|
360
|
+
- ✅ `docs/type-reference.md` - 完整类型列表
|
|
361
|
+
- ✅ 与 joi 对比表
|
|
362
|
+
- ✅ 所有类型使用示例
|
|
363
|
+
|
|
364
|
+
### 🐛 Bug 修复
|
|
365
|
+
|
|
366
|
+
#### ErrorFormatter 多错误处理
|
|
367
|
+
- ✅ 修复 `format()` 方法只处理单个错误的问题
|
|
368
|
+
- ✅ 支持 ajv 返回的多个错误
|
|
369
|
+
- ✅ `formatDetailed()` 正确处理 ajv 错误格式
|
|
370
|
+
- ✅ `_interpolate()` 处理 undefined template
|
|
371
|
+
|
|
372
|
+
#### 嵌套深度计算修复
|
|
373
|
+
- ✅ 修复深度计算包含根节点的问题
|
|
374
|
+
- ✅ 从 properties 内部开始计数
|
|
375
|
+
- ✅ 支持 `isRoot` 参数跳过根节点
|
|
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
|
+
- 无变更
|
|
442
|
+
|
|
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
|
+
```
|
|
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
|
+
```
|
|
580
|
+
|
|
581
|
+
### 📊 统计信息
|
|
582
|
+
|
|
583
|
+
- **代码行数**: ~3200行
|
|
584
|
+
- **文件数**: 17个核心文件
|
|
585
|
+
- **功能完成度**: 98%
|
|
586
|
+
- **测试覆盖率**: 0%(待补充)
|
|
587
|
+
|
|
588
|
+
---
|
|
589
|
+
|
|
590
|
+
## [v0.1.0] - 2025-12-XX
|
|
591
|
+
|
|
592
|
+
### ✨ 初始版本
|
|
593
|
+
|
|
594
|
+
- 基础框架搭建
|
|
595
|
+
- 类型系统设计
|
|
596
|
+
- SchemaBuilder原型
|
|
597
|
+
- 目录结构规划
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
## 待发布
|
|
602
|
+
|
|
603
|
+
### v1.1.0(计划中)
|
|
604
|
+
|
|
605
|
+
#### 计划新增
|
|
606
|
+
- [ ] ChainAdapter - 链式风格适配器
|
|
607
|
+
- [ ] 完整测试套件(覆盖率80%+)
|
|
608
|
+
- [ ] TypeScript类型定义
|
|
609
|
+
- [ ] 性能基准测试
|
|
610
|
+
|
|
611
|
+
#### 计划改进
|
|
612
|
+
- [ ] JoiAdapter required处理优化
|
|
613
|
+
- [ ] 错误提示优化
|
|
614
|
+
- [ ] 文档补充(API详细文档)
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## 变更类型说明
|
|
619
|
+
|
|
620
|
+
- `✨ 新增`: 新功能
|
|
621
|
+
- `🔧 改进`: 功能改进或优化
|
|
622
|
+
- `🐛 修复`: Bug修复
|
|
623
|
+
- `📝 文档`: 文档更新
|
|
624
|
+
- `🎨 样式`: 代码格式调整
|
|
625
|
+
- `♻️ 重构`: 代码重构
|
|
626
|
+
- `⚡ 性能`: 性能优化
|
|
627
|
+
- `🔒 安全`: 安全问题修复
|
|
628
|
+
- `📦 依赖`: 依赖更新
|
|
629
|
+
- `🎉 重大`: 重大变更
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
**维护说明**: 请在每次发布新版本时更新此文档
|