schema-dsl 1.0.8 → 1.1.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/CHANGELOG.md +338 -3
- package/README.md +296 -17
- package/STATUS.md +74 -3
- package/docs/FEATURE-INDEX.md +1 -1
- package/docs/add-custom-locale.md +395 -0
- package/docs/best-practices.md +3 -3
- package/docs/cache-manager.md +1 -1
- package/docs/conditional-api.md +1032 -0
- package/docs/dsl-syntax.md +1 -1
- package/docs/dynamic-locale.md +76 -30
- package/docs/error-handling.md +2 -2
- package/docs/export-guide.md +2 -2
- package/docs/export-limitations.md +3 -3
- package/docs/faq.md +6 -6
- package/docs/frontend-i18n-guide.md +19 -16
- package/docs/i18n-user-guide.md +7 -9
- package/docs/i18n.md +65 -2
- package/docs/mongodb-exporter.md +3 -3
- package/docs/multi-type-support.md +12 -2
- package/docs/mysql-exporter.md +1 -1
- package/docs/plugin-system.md +4 -4
- package/docs/postgresql-exporter.md +1 -1
- package/docs/quick-start.md +4 -4
- package/docs/troubleshooting.md +2 -2
- package/docs/type-reference.md +5 -5
- package/docs/typescript-guide.md +5 -6
- package/docs/union-type-guide.md +147 -0
- package/docs/union-types.md +277 -0
- package/docs/validate-async.md +1 -1
- package/examples/array-dsl-example.js +1 -1
- package/examples/conditional-example.js +288 -0
- package/examples/conditional-non-object.js +129 -0
- package/examples/conditional-validate-example.js +321 -0
- package/examples/union-type-example.js +127 -0
- package/examples/union-types-example.js +77 -0
- package/index.d.ts +395 -12
- package/index.js +31 -4
- package/lib/adapters/DslAdapter.js +14 -5
- package/lib/core/ConditionalBuilder.js +401 -0
- package/lib/core/DslBuilder.js +113 -0
- package/lib/core/ErrorFormatter.js +81 -33
- package/lib/core/Locale.js +13 -8
- package/lib/core/Validator.js +252 -16
- package/lib/locales/en-US.js +14 -0
- package/lib/locales/es-ES.js +4 -0
- package/lib/locales/fr-FR.js +4 -0
- package/lib/locales/ja-JP.js +9 -0
- package/lib/locales/zh-CN.js +14 -0
- package/package.json +5 -2
package/docs/dsl-syntax.md
CHANGED
package/docs/dynamic-locale.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
## 基本原理
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
SchemaI-DSL 的 `Validator` 支持在验证时动态指定语言,无需全局切换。
|
|
22
22
|
|
|
23
23
|
### 核心方法
|
|
24
24
|
|
|
@@ -34,67 +34,113 @@ validator.validate(schema, data, {
|
|
|
34
34
|
|
|
35
35
|
这是**最推荐**的方案,无需修改全局状态,支持并发请求。
|
|
36
36
|
|
|
37
|
-
### 1.1
|
|
37
|
+
### 1.1 应用启动时配置(一次性加载所有语言)
|
|
38
38
|
|
|
39
|
-
使用 `dsl.config`
|
|
39
|
+
使用 `dsl.config` 在应用启动时一次性加载所有自定义语言包。
|
|
40
40
|
|
|
41
41
|
```javascript
|
|
42
|
-
const { dsl,
|
|
42
|
+
const { dsl, validate } = require('schema-dsl');
|
|
43
|
+
const path = require('path');
|
|
43
44
|
|
|
44
|
-
//
|
|
45
|
+
// ========== 应用启动时配置(只执行一次)==========
|
|
46
|
+
|
|
47
|
+
// 方式一:传入目录路径(推荐)⭐
|
|
48
|
+
// 自动扫描目录下的所有 .js 和 .json 文件
|
|
49
|
+
dsl.config({
|
|
50
|
+
i18n: path.join(__dirname, 'locales')
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// 方式二:直接传入对象
|
|
45
54
|
dsl.config({
|
|
46
|
-
|
|
55
|
+
i18n: {
|
|
47
56
|
'fr-FR': {
|
|
48
57
|
'required': '{{#label}} est requis',
|
|
49
|
-
'
|
|
58
|
+
'string.minLength': '{{#label}} doit contenir au moins {{#limit}} caractères'
|
|
59
|
+
},
|
|
60
|
+
'de-DE': {
|
|
61
|
+
'required': '{{#label}} ist erforderlich',
|
|
62
|
+
'string.minLength': '{{#label}} muss mindestens {{#limit}} Zeichen lang sein'
|
|
50
63
|
}
|
|
51
64
|
}
|
|
52
65
|
});
|
|
53
66
|
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
67
|
+
// 说明:
|
|
68
|
+
// - 只在应用启动时执行一次
|
|
69
|
+
// - 自动与系统内置语言包合并(用户自定义的优先)
|
|
70
|
+
// - 运行时无需重新加载,直接切换
|
|
59
71
|
```
|
|
60
72
|
|
|
61
|
-
### 1.2
|
|
73
|
+
### 1.2 运行时直接切换语言(无需重新加载)
|
|
62
74
|
|
|
63
75
|
```javascript
|
|
64
|
-
|
|
76
|
+
const { dsl, validate } = require('schema-dsl');
|
|
77
|
+
|
|
78
|
+
// 定义 Schema
|
|
65
79
|
const schema = dsl({
|
|
66
|
-
username: 'string:3-32!'
|
|
67
|
-
email: 'email!'
|
|
80
|
+
username: 'string:3-32!',
|
|
81
|
+
email: 'email!'
|
|
68
82
|
});
|
|
69
83
|
|
|
70
|
-
//
|
|
71
|
-
const
|
|
84
|
+
// 测试数据
|
|
85
|
+
const data = { username: 'ab', email: 'invalid' };
|
|
86
|
+
|
|
87
|
+
// ========== 运行时直接切换语言 ==========
|
|
88
|
+
|
|
89
|
+
// 使用中文
|
|
90
|
+
const result1 = validate(schema, data, { locale: 'zh-CN' });
|
|
91
|
+
// 错误: "username长度不能少于3个字符"
|
|
92
|
+
|
|
93
|
+
// 使用法语
|
|
94
|
+
const result2 = validate(schema, data, { locale: 'fr-FR' });
|
|
95
|
+
// 错误: "username doit contenir au moins 3 caractères"
|
|
72
96
|
|
|
73
|
-
//
|
|
74
|
-
const
|
|
75
|
-
|
|
97
|
+
// 使用德语
|
|
98
|
+
const result3 = validate(schema, data, { locale: 'de-DE' });
|
|
99
|
+
// 错误: "username muss mindestens 3 Zeichen lang sein"
|
|
100
|
+
|
|
101
|
+
// 说明:
|
|
102
|
+
// - 无需重新加载语言包
|
|
103
|
+
// - 每次验证可以使用不同语言
|
|
104
|
+
// - 支持高并发(无全局状态修改)
|
|
76
105
|
```
|
|
77
106
|
|
|
78
|
-
### 1.3
|
|
107
|
+
### 1.3 从请求头获取语言(实际应用场景)
|
|
79
108
|
|
|
80
109
|
```javascript
|
|
81
|
-
|
|
110
|
+
const express = require('express');
|
|
111
|
+
const { dsl, validate } = require('schema-dsl');
|
|
112
|
+
const path = require('path');
|
|
113
|
+
|
|
114
|
+
const app = express();
|
|
115
|
+
|
|
116
|
+
// ========== 应用启动时配置(只执行一次)==========
|
|
117
|
+
dsl.config({
|
|
118
|
+
i18n: path.join(__dirname, 'locales')
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// 定义 Schema
|
|
122
|
+
const userSchema = dsl({
|
|
123
|
+
username: 'string:3-32!',
|
|
124
|
+
email: 'email!',
|
|
125
|
+
password: 'string:8-32!'
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ========== Express 路由 ==========
|
|
82
129
|
app.post('/api/user/register', (req, res) => {
|
|
83
|
-
//
|
|
130
|
+
// 从请求头获取语言偏好
|
|
84
131
|
const locale = req.headers['accept-language'] || 'en-US';
|
|
85
132
|
|
|
86
|
-
//
|
|
87
|
-
const result =
|
|
88
|
-
locale: locale
|
|
89
|
-
});
|
|
133
|
+
// 验证数据(直接切换语言,无需重新加载)
|
|
134
|
+
const result = validate(userSchema, req.body, { locale });
|
|
90
135
|
|
|
91
136
|
if (!result.valid) {
|
|
92
137
|
return res.status(400).json({
|
|
93
|
-
errors: result.errors //
|
|
138
|
+
errors: result.errors // 自动使用用户偏好的语言
|
|
94
139
|
});
|
|
95
140
|
}
|
|
96
141
|
|
|
97
142
|
// 处理成功...
|
|
143
|
+
res.json({ message: 'User registered successfully' });
|
|
98
144
|
});
|
|
99
145
|
```
|
|
100
146
|
|
|
@@ -547,6 +593,6 @@ const schema = dsl({
|
|
|
547
593
|
---
|
|
548
594
|
|
|
549
595
|
**最后更新**: 2025-12-25
|
|
550
|
-
**作者**:
|
|
596
|
+
**作者**: SchemaI-DSL Team
|
|
551
597
|
|
|
552
598
|
|
package/docs/error-handling.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
### 基础结构
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
SchemaI-DSL 验证返回的错误对象结构:
|
|
27
27
|
|
|
28
28
|
```javascript
|
|
29
29
|
const { dsl, validate } = require('schema-dsl');
|
|
@@ -165,7 +165,7 @@ Locale.setMessages({
|
|
|
165
165
|
|
|
166
166
|
### 内置错误码(简化版)
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
SchemaI-DSL 对 ajv 的错误关键字进行了简化映射,使其更易用:
|
|
169
169
|
|
|
170
170
|
#### 字符串错误码
|
|
171
171
|
|
package/docs/export-guide.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> **用途**: Schema 到数据库 DDL 的完整导出指南
|
|
4
4
|
> **阅读时间**: 10分钟
|
|
5
5
|
|
|
6
|
-
> ⚠️ **重要提示**: 并非所有
|
|
6
|
+
> ⚠️ **重要提示**: 并非所有 SchemaI-DSL 特性都能导出到数据库。请先阅读 [导出限制说明](export-limitations.md) 了解哪些特性不支持导出。
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
## 概述
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
SchemaI-DSL 支持将 JSON Schema 导出为多种数据库的 DDL 语句,实现"一次定义,多处使用"。
|
|
25
25
|
|
|
26
26
|
### 支持的数据库
|
|
27
27
|
|
|
@@ -49,7 +49,7 @@ const schema = dsl({
|
|
|
49
49
|
|
|
50
50
|
**替代方案**:
|
|
51
51
|
- 导出为最宽松的类型(`VARCHAR(255)`)
|
|
52
|
-
- 验证逻辑保留在应用层(使用
|
|
52
|
+
- 验证逻辑保留在应用层(使用 SchemaI-DSL 验证器)
|
|
53
53
|
|
|
54
54
|
---
|
|
55
55
|
|
|
@@ -331,7 +331,7 @@ const schema = dsl('string!')
|
|
|
331
331
|
|
|
332
332
|
```
|
|
333
333
|
┌─────────────────────────────────────────┐
|
|
334
|
-
│ 应用层(
|
|
334
|
+
│ 应用层(SchemaI-DSL 完整验证) │
|
|
335
335
|
│ - 条件逻辑(match/if) │
|
|
336
336
|
│ - 自定义验证器 │
|
|
337
337
|
│ - 复杂约束(正则、范围等) │
|
|
@@ -449,7 +449,7 @@ module.exports = {
|
|
|
449
449
|
```markdown
|
|
450
450
|
## 数据验证说明
|
|
451
451
|
|
|
452
|
-
### 应用层验证(
|
|
452
|
+
### 应用层验证(SchemaI-DSL)
|
|
453
453
|
- ✅ `contact` 字段根据 `contactType` 动态验证
|
|
454
454
|
- ✅ 用户名正则验证(`^[a-zA-Z0-9_]+$`)
|
|
455
455
|
- ✅ 自定义业务规则验证
|
package/docs/faq.md
CHANGED
|
@@ -20,12 +20,12 @@
|
|
|
20
20
|
|
|
21
21
|
## 基础问题
|
|
22
22
|
|
|
23
|
-
### Q:
|
|
23
|
+
### Q: SchemaI-DSL 和 Joi、Yup 有什么区别?
|
|
24
24
|
|
|
25
|
-
**A**:
|
|
25
|
+
**A**: SchemaI-DSL 采用 DSL 语法,更简洁:
|
|
26
26
|
|
|
27
27
|
```javascript
|
|
28
|
-
//
|
|
28
|
+
// SchemaI-DSL - 简洁
|
|
29
29
|
const schema = dsl({
|
|
30
30
|
username: 'string:3-32!',
|
|
31
31
|
email: 'email!'
|
|
@@ -46,7 +46,7 @@ const schema = Joi.object({
|
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
49
|
-
### Q: 如何安装
|
|
49
|
+
### Q: 如何安装 SchemaI-DSL?
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
52
|
npm install schema-dsl
|
|
@@ -299,7 +299,7 @@ app.post('/api/users', (req, res) => {
|
|
|
299
299
|
|
|
300
300
|
### Q: 缓存如何工作?
|
|
301
301
|
|
|
302
|
-
**A**:
|
|
302
|
+
**A**: SchemaI-DSL 内置 LRU 缓存:
|
|
303
303
|
|
|
304
304
|
```javascript
|
|
305
305
|
const validator = new Validator({
|
|
@@ -523,7 +523,7 @@ MySQL 会生成 `COMMENT`,PostgreSQL 会生成 `COMMENT ON COLUMN`。
|
|
|
523
523
|
|
|
524
524
|
## TypeScript 支持
|
|
525
525
|
|
|
526
|
-
### Q:
|
|
526
|
+
### Q: SchemaI-DSL 支持 TypeScript 吗?
|
|
527
527
|
|
|
528
528
|
**A**: 支持,类型定义在 `index.d.ts`:
|
|
529
529
|
|
|
@@ -21,23 +21,16 @@
|
|
|
21
21
|
// server.js
|
|
22
22
|
const express = require('express');
|
|
23
23
|
const cors = require('cors');
|
|
24
|
-
const {
|
|
24
|
+
const { dsl, validate } = require('schema-dsl');
|
|
25
|
+
const path = require('path');
|
|
25
26
|
|
|
26
27
|
const app = express();
|
|
27
28
|
app.use(cors());
|
|
28
29
|
app.use(express.json());
|
|
29
30
|
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const locale = acceptLanguage.split(',')[0].trim();
|
|
34
|
-
|
|
35
|
-
req.validator = new Validator({
|
|
36
|
-
locale,
|
|
37
|
-
allErrors: true // 返回所有错误
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
next();
|
|
31
|
+
// ========== 应用启动时配置(只执行一次)==========
|
|
32
|
+
dsl.config({
|
|
33
|
+
i18n: path.join(__dirname, 'locales') // 一次性加载所有语言包
|
|
41
34
|
});
|
|
42
35
|
|
|
43
36
|
// Schema 定义
|
|
@@ -66,18 +59,27 @@ app.post('/api/validate/:type', (req, res) => {
|
|
|
66
59
|
return res.status(404).json({ error: 'Schema not found' });
|
|
67
60
|
}
|
|
68
61
|
|
|
69
|
-
|
|
62
|
+
// 从请求头获取语言偏好
|
|
63
|
+
const locale = req.headers['accept-language'] || 'en-US';
|
|
64
|
+
|
|
65
|
+
// 验证(直接切换语言,无需重新加载)
|
|
66
|
+
const result = validate(schema, req.body, { locale });
|
|
67
|
+
|
|
70
68
|
res.json(result);
|
|
71
69
|
});
|
|
72
70
|
|
|
73
71
|
// 用户注册(带验证)
|
|
74
72
|
app.post('/api/register', (req, res) => {
|
|
75
|
-
|
|
73
|
+
// 从请求头获取语言偏好
|
|
74
|
+
const locale = req.headers['accept-language'] || 'en-US';
|
|
75
|
+
|
|
76
|
+
// 验证数据
|
|
77
|
+
const result = validate(schemas.user, req.body, { locale });
|
|
76
78
|
|
|
77
79
|
if (!result.valid) {
|
|
78
80
|
return res.status(400).json({
|
|
79
81
|
success: false,
|
|
80
|
-
errors: result.errors
|
|
82
|
+
errors: result.errors // 自动使用用户偏好的语言
|
|
81
83
|
});
|
|
82
84
|
}
|
|
83
85
|
|
|
@@ -87,6 +89,7 @@ app.post('/api/register', (req, res) => {
|
|
|
87
89
|
|
|
88
90
|
app.listen(3000, () => {
|
|
89
91
|
console.log('Server running on http://localhost:3000');
|
|
92
|
+
console.log('语言包已加载,支持动态切换');
|
|
90
93
|
});
|
|
91
94
|
```
|
|
92
95
|
|
|
@@ -247,7 +250,7 @@ Locale.addLocale('de-DE', {
|
|
|
247
250
|
**A**: 后端返回错误消息已经是本地化的,前端无需处理。如果需要前端验证:
|
|
248
251
|
|
|
249
252
|
```javascript
|
|
250
|
-
// 前端可以使用相同的
|
|
253
|
+
// 前端可以使用相同的 SchemaI-DSL(浏览器版)
|
|
251
254
|
import { dsl, validate } from 'schema-dsl/browser';
|
|
252
255
|
|
|
253
256
|
const schema = dsl({ /* ... */ });
|
package/docs/i18n-user-guide.md
CHANGED
|
@@ -25,15 +25,13 @@ const { dsl, validate } = require('schema-dsl');
|
|
|
25
25
|
// 1. 配置用户语言包
|
|
26
26
|
dsl.config({
|
|
27
27
|
i18n: {
|
|
28
|
-
|
|
29
|
-
'
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
'
|
|
34
|
-
|
|
35
|
-
'email': 'Email Address'
|
|
36
|
-
}
|
|
28
|
+
'zh-CN': {
|
|
29
|
+
'username': '用户名',
|
|
30
|
+
'email': '邮箱地址'
|
|
31
|
+
},
|
|
32
|
+
'en-US': {
|
|
33
|
+
'username': 'Username',
|
|
34
|
+
'email': 'Email Address'
|
|
37
35
|
}
|
|
38
36
|
}
|
|
39
37
|
});
|
package/docs/i18n.md
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
# 多语言配置指南
|
|
2
2
|
|
|
3
|
-
**版本**: v1.0.
|
|
4
|
-
**最后更新**:
|
|
3
|
+
**版本**: v1.0.9
|
|
4
|
+
**最后更新**: 2026-01-04
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 📚 多语言文档导航
|
|
9
|
+
|
|
10
|
+
根据你的需求选择合适的文档:
|
|
11
|
+
|
|
12
|
+
- 🚀 **新手快速上手**: [i18n.md](./i18n.md)(当前文档)- 5分钟学会基础用法
|
|
13
|
+
- 📖 **完整使用指南**: [i18n-user-guide.md](./i18n-user-guide.md) - 详细的用户指南和最佳实践
|
|
14
|
+
- 🎯 **添加新语言**: [add-custom-locale.md](./add-custom-locale.md) - 添加自定义语言包教程
|
|
15
|
+
- 🔄 **动态切换语言**: [dynamic-locale.md](./dynamic-locale.md) - API开发中的动态语言切换
|
|
16
|
+
- 🌐 **前端集成**: [frontend-i18n-guide.md](./frontend-i18n-guide.md) - 前后端分离项目集成指南
|
|
5
17
|
|
|
6
18
|
---
|
|
7
19
|
|
|
@@ -9,10 +21,61 @@
|
|
|
9
21
|
|
|
10
22
|
schema-dsl 支持完整的多语言功能,允许你自定义字段标签和错误消息的翻译。
|
|
11
23
|
|
|
24
|
+
**v1.0.9 新增**:
|
|
25
|
+
- ✅ 支持参数化语言切换(无需修改全局状态)
|
|
26
|
+
- ✅ 支持自定义错误消息(三种格式)
|
|
27
|
+
- ✅ TypeScript 类型定义完整
|
|
28
|
+
|
|
12
29
|
---
|
|
13
30
|
|
|
14
31
|
## 🚀 快速开始
|
|
15
32
|
|
|
33
|
+
### 方式1:验证时动态指定语言(推荐)⭐
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
const { dsl, validate } = require('schema-dsl');
|
|
37
|
+
|
|
38
|
+
const schema = dsl({ username: 'string:3-32!' });
|
|
39
|
+
|
|
40
|
+
// 使用中文错误消息
|
|
41
|
+
const result = validate(schema, { username: 'ab' }, { locale: 'zh-CN' });
|
|
42
|
+
// message: "username长度不能少于3个字符"
|
|
43
|
+
|
|
44
|
+
// 使用英文错误消息
|
|
45
|
+
const result2 = validate(schema, { username: 'ab' }, { locale: 'en-US' });
|
|
46
|
+
// message: "username length must be at least 3"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 方式2:使用全局配置(向后兼容)
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
const { Locale } = require('schema-dsl');
|
|
53
|
+
|
|
54
|
+
// 设置默认语言
|
|
55
|
+
Locale.setLocale('zh-CN');
|
|
56
|
+
|
|
57
|
+
// 后续验证会使用中文错误消息
|
|
58
|
+
const result = validate(schema, data);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 📝 内置语言支持
|
|
64
|
+
|
|
65
|
+
schema-dsl 内置了以下语言包:
|
|
66
|
+
|
|
67
|
+
| 语言代码 | 语言名称 | 支持状态 |
|
|
68
|
+
|---------|---------|---------|
|
|
69
|
+
| `zh-CN` | 简体中文 | ✅ 完整支持 |
|
|
70
|
+
| `en-US` | 英语(美国)| ✅ 完整支持 |
|
|
71
|
+
| `ja-JP` | 日语 | ✅ 完整支持 |
|
|
72
|
+
| `es-ES` | 西班牙语 | ✅ 完整支持 |
|
|
73
|
+
| `fr-FR` | 法语 | ✅ 完整支持 |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 🎯 高级用法
|
|
78
|
+
|
|
16
79
|
### 基础配置
|
|
17
80
|
|
|
18
81
|
```javascript
|
package/docs/mongodb-exporter.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
## 概述
|
|
21
21
|
|
|
22
|
-
`MongoDBExporter` 将
|
|
22
|
+
`MongoDBExporter` 将 SchemaI-DSL 生成的 JSON Schema 转换为 MongoDB 的 `$jsonSchema` 验证格式,可直接用于创建集合时的文档验证。
|
|
23
23
|
|
|
24
24
|
### 核心功能
|
|
25
25
|
|
|
@@ -104,7 +104,7 @@ const mongoSchema = exporter.export(jsonSchema);
|
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
**参数**:
|
|
107
|
-
- `jsonSchema` (Object):
|
|
107
|
+
- `jsonSchema` (Object): SchemaI-DSL 生成的 JSON Schema 对象
|
|
108
108
|
|
|
109
109
|
**返回值**:
|
|
110
110
|
- `Object`: 包含 `$jsonSchema` 的 MongoDB 验证对象
|
|
@@ -272,7 +272,7 @@ async function createValidatedCollection() {
|
|
|
272
272
|
|
|
273
273
|
## 导出限制
|
|
274
274
|
|
|
275
|
-
⚠️ **重要提示**: 并非所有
|
|
275
|
+
⚠️ **重要提示**: 并非所有 SchemaI-DSL 特性都能导出到数据库 Schema。
|
|
276
276
|
|
|
277
277
|
**不支持导出的特性**:
|
|
278
278
|
- ❌ 条件验证逻辑(`dsl.match()`, `dsl.if()`)
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
# 多类型支持设计说明
|
|
2
2
|
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## 📖 快速导航
|
|
6
|
+
|
|
7
|
+
- **单一类型验证**(本文档)
|
|
8
|
+
- **[联合类型验证](./union-type-guide.md)** - 一个字段支持多种类型(使用 `.pattern()` 正则匹配)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
3
12
|
## 🎯 设计原理
|
|
4
13
|
|
|
5
|
-
|
|
14
|
+
schema-dsl通过**类型无关的Builder模式**实现多类型支持。
|
|
6
15
|
|
|
7
16
|
### 核心设计
|
|
8
17
|
|
|
@@ -21,6 +30,7 @@ class DslBuilder {
|
|
|
21
30
|
|
|
22
31
|
---
|
|
23
32
|
|
|
33
|
+
|
|
24
34
|
## 📊 类型支持矩阵
|
|
25
35
|
|
|
26
36
|
| DSL字符串 | 解析类型 | 支持的方法 |
|
|
@@ -307,7 +317,7 @@ amount: 'number:0-10000'
|
|
|
307
317
|
|
|
308
318
|
## 💡 总结
|
|
309
319
|
|
|
310
|
-
|
|
320
|
+
SchemaI-DSL的多类型支持采用**类型无关Builder + 方法智能适配**设计:
|
|
311
321
|
|
|
312
322
|
1. **统一入口**: 所有类型都通过DslBuilder
|
|
313
323
|
2. **类型感知**: 方法内部检查类型兼容性
|
package/docs/mysql-exporter.md
CHANGED
package/docs/plugin-system.md
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
## 概述
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
SchemaI-DSL 插件系统允许你扩展核心功能,添加自定义验证器、格式化器、导出器等。
|
|
24
24
|
|
|
25
25
|
### 特性
|
|
26
26
|
|
|
@@ -342,7 +342,7 @@ pluginManager.register({
|
|
|
342
342
|
安装插件。
|
|
343
343
|
|
|
344
344
|
**参数**:
|
|
345
|
-
- `schema-dsl` (Object) -
|
|
345
|
+
- `schema-dsl` (Object) - SchemaI-DSL 实例
|
|
346
346
|
- `pluginName` (String, optional) - 插件名称
|
|
347
347
|
- `options` (Object, optional) - 安装选项
|
|
348
348
|
|
|
@@ -354,7 +354,7 @@ pluginManager.register({
|
|
|
354
354
|
|
|
355
355
|
**参数**:
|
|
356
356
|
- `pluginName` (String) - 插件名称
|
|
357
|
-
- `schema-dsl` (Object) -
|
|
357
|
+
- `schema-dsl` (Object) - SchemaI-DSL 实例
|
|
358
358
|
|
|
359
359
|
**返回**: `this`
|
|
360
360
|
|
|
@@ -398,7 +398,7 @@ pluginManager.register({
|
|
|
398
398
|
清空所有插件。
|
|
399
399
|
|
|
400
400
|
**参数**:
|
|
401
|
-
- `schema-dsl` (Object) -
|
|
401
|
+
- `schema-dsl` (Object) - SchemaI-DSL 实例
|
|
402
402
|
|
|
403
403
|
**返回**: `this`
|
|
404
404
|
|
package/docs/quick-start.md
CHANGED
|
@@ -413,13 +413,13 @@ uninstallStringExtensions();
|
|
|
413
413
|
|
|
414
414
|
### Q: 支持TypeScript吗?
|
|
415
415
|
|
|
416
|
-
**A**: 支持!
|
|
416
|
+
**A**: 支持!SchemaI-DSL提供完整的TypeScript类型定义。
|
|
417
417
|
|
|
418
418
|
---
|
|
419
419
|
|
|
420
420
|
## 🎉 恭喜!
|
|
421
421
|
|
|
422
|
-
你已经掌握了
|
|
422
|
+
你已经掌握了SchemaI-DSL的核心用法!
|
|
423
423
|
|
|
424
424
|
**核心要点**:
|
|
425
425
|
1. ✅ DSL语法简洁直观
|
|
@@ -737,13 +737,13 @@ uninstallStringExtensions();
|
|
|
737
737
|
|
|
738
738
|
### Q: 支持TypeScript吗?
|
|
739
739
|
|
|
740
|
-
**A**: 支持!
|
|
740
|
+
**A**: 支持!SchemaI-DSL提供完整的TypeScript类型定义。
|
|
741
741
|
|
|
742
742
|
---
|
|
743
743
|
|
|
744
744
|
## 🎉 恭喜!
|
|
745
745
|
|
|
746
|
-
你已经掌握了
|
|
746
|
+
你已经掌握了SchemaI-DSL的核心用法!
|
|
747
747
|
|
|
748
748
|
**核心要点**:
|
|
749
749
|
1. ✅ DSL语法简洁直观
|
package/docs/troubleshooting.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 常见问题排查指南
|
|
2
2
|
|
|
3
|
-
> **用途**: 快速解决
|
|
3
|
+
> **用途**: 快速解决 SchemaI-DSL 使用中的常见问题
|
|
4
4
|
> **更新**: 2025-12-26
|
|
5
5
|
|
|
6
6
|
---
|
|
@@ -378,7 +378,7 @@ db.createCollection('users', {
|
|
|
378
378
|
|
|
379
379
|
**解决方案**:
|
|
380
380
|
```javascript
|
|
381
|
-
//
|
|
381
|
+
// SchemaI-DSL 默认会自动安装 String 扩展
|
|
382
382
|
// 如果未生效,手动安装:
|
|
383
383
|
const { installStringExtensions } = require('schema-dsl');
|
|
384
384
|
installStringExtensions();
|
package/docs/type-reference.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
### 基本类型
|
|
10
10
|
|
|
11
|
-
| 类型 |
|
|
11
|
+
| 类型 | SchemaI-DSL | JSON Schema | 说明 |
|
|
12
12
|
|------|----------|-------------|------|
|
|
13
13
|
| 字符串 | `string` | `{ type: 'string' }` | 文本类型 |
|
|
14
14
|
| 数字 | `number` | `{ type: 'number' }` | 浮点数 |
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
### 格式类型(基于 string)
|
|
25
25
|
|
|
26
|
-
| 类型 |
|
|
26
|
+
| 类型 | SchemaI-DSL | JSON Schema format | 说明 |
|
|
27
27
|
|------|----------|-------------------|------|
|
|
28
28
|
| 邮箱 | `email` | `email` | 邮箱地址 |
|
|
29
29
|
| URL | `url` | `uri` | 网址 |
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
|
|
39
39
|
### 特殊类型
|
|
40
40
|
|
|
41
|
-
| 类型 |
|
|
41
|
+
| 类型 | SchemaI-DSL | JSON Schema | 说明 |
|
|
42
42
|
|------|----------|-------------|------|
|
|
43
43
|
| 二进制 | `binary` | `contentEncoding: base64` | Base64编码 |
|
|
44
44
|
| ObjectId | `objectId` | `pattern: ^[0-9a-fA-F]{24}$` | MongoDB ObjectId |
|
|
@@ -156,7 +156,7 @@ const schema = dsl({
|
|
|
156
156
|
|
|
157
157
|
### 完整对照表
|
|
158
158
|
|
|
159
|
-
| joi |
|
|
159
|
+
| joi | SchemaI-DSL | 说明 |
|
|
160
160
|
|-----|--------------|------|
|
|
161
161
|
| `Joi.string()` | `'string'` | 字符串 |
|
|
162
162
|
| `Joi.string().email()` | `'email'` | 邮箱 |
|
|
@@ -206,7 +206,7 @@ const schema = dsl({
|
|
|
206
206
|
|
|
207
207
|
### Q2: 为什么 `integer` 不是 `number().integer()`?
|
|
208
208
|
|
|
209
|
-
A:
|
|
209
|
+
A: SchemaI-DSL 使用 JSON Schema 标准,`integer` 是独立类型。
|
|
210
210
|
|
|
211
211
|
### Q3: 不支持简写吗?
|
|
212
212
|
|