schema-dsl 2.3.0 → 2.3.1
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/.github/workflows/ci.yml +1 -3
- package/README.md +69 -7
- package/docs/FEATURE-INDEX.md +1 -1
- package/docs/INDEX.md +31 -2
- package/docs/export-guide.md +3 -0
- package/docs/export-limitations.md +551 -0
- package/docs/mongodb-exporter.md +16 -0
- package/docs/mysql-exporter.md +16 -0
- package/docs/postgresql-exporter.md +14 -0
- package/docs/schema-utils-chaining.md +146 -0
- package/docs/schema-utils.md +7 -9
- package/docs/validate-async.md +480 -0
- package/examples/array-dsl-example.js +1 -1
- package/examples/express-integration.js +376 -0
- package/examples/new-features-comparison.js +315 -0
- package/examples/schema-utils-chaining.examples.js +250 -0
- package/examples/simple-example.js +2 -2
- package/index.js +13 -1
- package/lib/adapters/DslAdapter.js +47 -1
- package/lib/core/Validator.js +60 -0
- package/lib/errors/ValidationError.js +191 -0
- package/lib/utils/SchemaUtils.js +170 -38
- package/package.json +1 -1
package/.github/workflows/ci.yml
CHANGED
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
|
|
14
14
|
strategy:
|
|
15
15
|
matrix:
|
|
16
|
-
node-version: [
|
|
16
|
+
node-version: [16.x, 18.x, 20.x]
|
|
17
17
|
|
|
18
18
|
steps:
|
|
19
19
|
- uses: actions/checkout@v3
|
|
@@ -30,6 +30,4 @@ jobs:
|
|
|
30
30
|
- name: Run tests
|
|
31
31
|
run: npm test
|
|
32
32
|
|
|
33
|
-
- name: Run benchmarks
|
|
34
|
-
run: npm run test:benchmark
|
|
35
33
|
|
package/README.md
CHANGED
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
### 代码量减少 65% | 性能优秀 | 独家数据库导出
|
|
19
19
|
|
|
20
|
+
### 🆕 v2.1.0 新特性:异步验证 + Schema 链式复用
|
|
21
|
+
|
|
20
22
|
</div>
|
|
21
23
|
|
|
22
24
|
---
|
|
@@ -69,6 +71,63 @@ const result = validate(schema, {
|
|
|
69
71
|
console.log(result.valid); // true
|
|
70
72
|
```
|
|
71
73
|
|
|
74
|
+
### 🆕 v2.1.0 新特性快速示例
|
|
75
|
+
|
|
76
|
+
#### 异步验证 + 自动错误处理
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
const { dsl, validateAsync, ValidationError } = require('schema-dsl');
|
|
80
|
+
|
|
81
|
+
// Express 中使用
|
|
82
|
+
app.post('/users', async (req, res, next) => {
|
|
83
|
+
try {
|
|
84
|
+
// 验证通过返回数据,失败自动抛出 ValidationError
|
|
85
|
+
const data = await validateAsync(userSchema, req.body);
|
|
86
|
+
const user = await db.users.insert(data);
|
|
87
|
+
res.json(user);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
next(error); // 自动传递给错误处理中间件
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// 全局错误处理
|
|
94
|
+
app.use((error, req, res, next) => {
|
|
95
|
+
if (error instanceof ValidationError) {
|
|
96
|
+
return res.status(error.statusCode).json(error.toJSON());
|
|
97
|
+
}
|
|
98
|
+
next(error);
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Schema 链式复用 - 一行代码搞定
|
|
103
|
+
|
|
104
|
+
```javascript
|
|
105
|
+
const { SchemaUtils } = require('schema-dsl');
|
|
106
|
+
|
|
107
|
+
// POST /users - 创建用户(严格模式)
|
|
108
|
+
const createSchema = SchemaUtils
|
|
109
|
+
.omit(fullUserSchema, ['id', 'createdAt', 'updatedAt'])
|
|
110
|
+
.strict();
|
|
111
|
+
|
|
112
|
+
// GET /users/:id - 查询用户(移除敏感字段)
|
|
113
|
+
const publicSchema = SchemaUtils
|
|
114
|
+
.omit(fullUserSchema, ['password'])
|
|
115
|
+
.clean();
|
|
116
|
+
|
|
117
|
+
// PATCH /users/:id - 更新用户(部分验证,宽松模式)
|
|
118
|
+
const updateSchema = SchemaUtils
|
|
119
|
+
.pick(fullUserSchema, ['name', 'age'])
|
|
120
|
+
.partial()
|
|
121
|
+
.loose();
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**详细文档**:
|
|
125
|
+
- [异步验证完整指南](./docs/validate-async.md)
|
|
126
|
+
- [Schema链式复用方法](./docs/schema-utils-chaining.md)
|
|
127
|
+
- [Express集成示例](./examples/express-integration.js)
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
72
131
|
### 📊 与其他库对比
|
|
73
132
|
|
|
74
133
|
<table>
|
|
@@ -114,7 +173,9 @@ const schema = Joi.object({
|
|
|
114
173
|
- **简洁语法**: 一行代码定义验证规则
|
|
115
174
|
- **String扩展**: 字符串直接链式调用方法
|
|
116
175
|
- **默认验证器**: 内置用户名、手机号、密码验证
|
|
117
|
-
-
|
|
176
|
+
- **🆕 异步验证(v2.1.0)**: `validateAsync` + `ValidationError` 自动错误处理
|
|
177
|
+
- **🆕 Schema链式复用(v2.1.0)**: 8个链式方法简化Schema复用
|
|
178
|
+
- **插件系统**: 强大的插件机制,支持自定义验证器和格式
|
|
118
179
|
- **数据库导出**: 导出MongoDB/MySQL/PostgreSQL Schema
|
|
119
180
|
- **多语言支持**: 内置中英文,可自定义语言包
|
|
120
181
|
- **高性能**: 基于ajv,支持编译缓存
|
|
@@ -260,7 +321,7 @@ schema-dsl 使用**运行时解析**,而 Zod 使用**编译时构建**。
|
|
|
260
321
|
res.json({ rules: { username: 'string:3-32!' } });
|
|
261
322
|
```
|
|
262
323
|
|
|
263
|
-
|
|
324
|
+
**权衡结果**
|
|
264
325
|
```
|
|
265
326
|
损失:比 Zod 慢 1.9倍
|
|
266
327
|
换来:代码量减少 65% + 完全动态性 + 独家功能
|
|
@@ -548,7 +609,7 @@ const result = validator.validate(validate, data);
|
|
|
548
609
|
|
|
549
610
|
## � 插件系统
|
|
550
611
|
|
|
551
|
-
**v2.2.0 新增**:强大的插件机制,轻松扩展
|
|
612
|
+
**v2.2.0 新增**:强大的插件机制,轻松扩展 schema-dsl 功能。
|
|
552
613
|
|
|
553
614
|
### 快速开始
|
|
554
615
|
|
|
@@ -688,6 +749,8 @@ pluginManager.clear(schema-dsl);
|
|
|
688
749
|
|
|
689
750
|
## �🗄️ 数据库导出
|
|
690
751
|
|
|
752
|
+
> ⚠️ **重要提示**: 并非所有 schema-dsl 特性都能导出到数据库。条件验证(`dsl.match()`、`dsl.if()`)、自定义验证器等无法导出。详见 [**导出限制说明**](docs/export-limitations.md)。
|
|
753
|
+
|
|
691
754
|
### MongoDB Schema
|
|
692
755
|
|
|
693
756
|
```javascript
|
|
@@ -861,7 +924,7 @@ const schema = dsl({
|
|
|
861
924
|
- `type` - 类型不匹配
|
|
862
925
|
|
|
863
926
|
**💡 简化的错误关键字**:
|
|
864
|
-
|
|
927
|
+
schema-dsl 对常见的错误关键字做了简化:
|
|
865
928
|
- `min` / `max` 代替 `minLength` / `maxLength` - 更简洁
|
|
866
929
|
- 同时也支持完整关键字 `minLength` / `maxLength` - 向后兼容
|
|
867
930
|
|
|
@@ -932,7 +995,7 @@ const schema2 = dsl({ contactEmail: emailField() });
|
|
|
932
995
|
const baseUser = dsl({ name: 'string!', email: 'email!' });
|
|
933
996
|
const withAge = dsl({ age: 'number:18-120' });
|
|
934
997
|
|
|
935
|
-
const
|
|
998
|
+
const extended = SchemaUtils.extend(baseUser, { age: 'number:18-120' });
|
|
936
999
|
```
|
|
937
1000
|
|
|
938
1001
|
### Schema 筛选
|
|
@@ -1067,7 +1130,7 @@ npm run coverage # 测试覆盖率
|
|
|
1067
1130
|
|
|
1068
1131
|
### 贡献者
|
|
1069
1132
|
|
|
1070
|
-
感谢所有为
|
|
1133
|
+
感谢所有为 schema-dsl 做出贡献的开发者!
|
|
1071
1134
|
|
|
1072
1135
|
<a href="https://github.com/vextjs/schema-dsl/graphs/contributors">
|
|
1073
1136
|
<img src="https://contrib.rocks/image?repo=vextjs/schema-dsl" />
|
|
@@ -1119,4 +1182,3 @@ Made with ❤️ by [vextjs](https://github.com/vextjs)
|
|
|
1119
1182
|
</div>
|
|
1120
1183
|
|
|
1121
1184
|
|
|
1122
|
-
|
package/docs/FEATURE-INDEX.md
CHANGED
|
@@ -290,7 +290,7 @@ const schema1 = dsl({ email: emailField() });
|
|
|
290
290
|
const schema2 = dsl({ contactEmail: emailField() });
|
|
291
291
|
|
|
292
292
|
// Schema合并
|
|
293
|
-
const
|
|
293
|
+
const extended = SchemaUtils.extend(schema1, { age: 'number' });
|
|
294
294
|
```
|
|
295
295
|
|
|
296
296
|
**文档位置**:
|
package/docs/INDEX.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **更新时间**: 2025-12-29
|
|
4
4
|
> **用途**: 所有文档的快速导航
|
|
5
|
-
> **文档数量**:
|
|
5
|
+
> **文档数量**: 27个文档(总计 12,450+ 行)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -45,6 +45,10 @@
|
|
|
45
45
|
| [plugin-system.md](plugin-system.md) | 580行 | **插件系统指南** ⭐⭐ |
|
|
46
46
|
| [api-reference.md](api-reference.md) | 534行 | API完整参考 ⭐⭐ |
|
|
47
47
|
| [validate.md](validate.md) | 452行 | validate方法详解 ⭐ |
|
|
48
|
+
| [**validate-async.md**](validate-async.md) | ~700行 | **异步验证方法详解** ⭐⭐⭐ |
|
|
49
|
+
| [**schema-utils-chaining.md**](schema-utils-chaining.md) | ~680行 | **Schema链式复用方法** ⭐⭐⭐ |
|
|
50
|
+
| [**schema-utils-best-practices.md**](schema-utils-best-practices.md) | ~500行 | **SchemaUtils最佳实践与常见陷阱** ⭐⭐⭐ |
|
|
51
|
+
| [**schema-utils-advanced-issues.md**](schema-utils-advanced-issues.md) | ~600行 | **SchemaUtils深入问题分析** ⭐⭐ |
|
|
48
52
|
|
|
49
53
|
---
|
|
50
54
|
|
|
@@ -59,6 +63,9 @@
|
|
|
59
63
|
| String 扩展 | [string-extensions.md](string-extensions.md) | `lib/core/StringExtensions.js` |
|
|
60
64
|
| Validator 类 | [validate.md](validate.md) | `lib/core/Validator.js` |
|
|
61
65
|
| validate() 函数 | [api-reference.md](api-reference.md) | `index.js` |
|
|
66
|
+
| **validateAsync() 函数(v2.1.0)** | [validate-async.md](validate-async.md) | `index.js` |
|
|
67
|
+
| **ValidationError 类(v2.1.0)** | [validate-async.md](validate-async.md#validationerror) | `lib/errors/ValidationError.js` |
|
|
68
|
+
| **SchemaUtils 链式调用(v2.1.0)** | [schema-utils-chaining.md](schema-utils-chaining.md) | `lib/utils/SchemaUtils.js` |
|
|
62
69
|
|
|
63
70
|
|
|
64
71
|
---
|
|
@@ -67,6 +74,21 @@
|
|
|
67
74
|
|
|
68
75
|
> 将 JSON Schema 转换为数据库 DDL 和验证规则
|
|
69
76
|
|
|
77
|
+
> ⚠️ **重要提示**: 请先阅读 [**导出限制说明**](export-limitations.md),了解哪些特性无法导出到数据库 Schema。
|
|
78
|
+
|
|
79
|
+
### 导出限制说明 ⚠️
|
|
80
|
+
|
|
81
|
+
| 文档 | 说明 |
|
|
82
|
+
|------|------|
|
|
83
|
+
| [**export-limitations.md**](export-limitations.md) | **导出限制完整说明**(必读)⭐⭐⭐ |
|
|
84
|
+
|
|
85
|
+
**主要内容**:
|
|
86
|
+
- ❌ 不支持导出的特性(条件验证、自定义验证器等)
|
|
87
|
+
- ⚠️ 部分支持的特性(正则、范围、枚举等)
|
|
88
|
+
- ✅ 完全支持的特性(基础类型、必填约束等)
|
|
89
|
+
- 数据库特定限制对比(MongoDB/MySQL/PostgreSQL)
|
|
90
|
+
- 最佳实践建议(分层验证、文档化约束等)
|
|
91
|
+
|
|
70
92
|
### MongoDB 导出器
|
|
71
93
|
|
|
72
94
|
| 文档 | 行数 | 说明 |
|
|
@@ -149,6 +171,13 @@
|
|
|
149
171
|
- 错误处理最佳实践
|
|
150
172
|
|
|
151
173
|
### 导出指南内容
|
|
174
|
+
- MongoDB/MySQL/PostgreSQL 导出对比
|
|
175
|
+
- 配置与自定义选项
|
|
176
|
+
- 自动化迁移脚本
|
|
177
|
+
- 版本管理与最佳实践
|
|
178
|
+
- **⚠️ [导出限制说明](export-limitations.md) - 哪些特性无法导出** ⭐⭐⭐
|
|
179
|
+
|
|
180
|
+
|
|
152
181
|
- 数据库导出概述
|
|
153
182
|
- MongoDB/MySQL/PostgreSQL 导出教程
|
|
154
183
|
- 多数据库同步方案
|
|
@@ -219,6 +248,6 @@
|
|
|
219
248
|
- ⭐⭐ 核心文档
|
|
220
249
|
- ⭐⭐⭐ 必读文档
|
|
221
250
|
|
|
222
|
-
**最后更新**: 2025-12-
|
|
251
|
+
**最后更新**: 2025-12-29
|
|
223
252
|
|
|
224
253
|
|
package/docs/export-guide.md
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
> **用途**: Schema 到数据库 DDL 的完整导出指南
|
|
4
4
|
> **阅读时间**: 10分钟
|
|
5
5
|
|
|
6
|
+
> ⚠️ **重要提示**: 并非所有 SchemaIO 特性都能导出到数据库。请先阅读 [导出限制说明](export-limitations.md) 了解哪些特性不支持导出。
|
|
7
|
+
|
|
6
8
|
---
|
|
7
9
|
|
|
8
10
|
## 📑 目录
|
|
@@ -451,6 +453,7 @@ console.log('导出完成!');
|
|
|
451
453
|
|
|
452
454
|
## 相关文档
|
|
453
455
|
|
|
456
|
+
- [**导出限制说明**](export-limitations.md) ⚠️ **必读**
|
|
454
457
|
- [MongoDB 导出器](mongodb-exporter.md)
|
|
455
458
|
- [MySQL 导出器](mysql-exporter.md)
|
|
456
459
|
- [PostgreSQL 导出器](postgresql-exporter.md)
|