schema-dsl 2.0.0 → 2.0.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/CHANGELOG.md +130 -113
- package/LICENSE +21 -21
- package/README.md +628 -628
- package/dist/{DslBuilder-DkLaOo9Q.d.ts → DslBuilder-BIgQOAXp.d.ts} +2 -0
- package/dist/{DslBuilder-DQDN0ZxZ.d.cts → DslBuilder-CjHTucNQ.d.cts} +2 -0
- package/dist/{Validator-hFWKGxir.d.ts → Validator-CllRdrY0.d.ts} +1 -1
- package/dist/{Validator-C7GsVQOH.d.cts → Validator-D6okG9tr.d.cts} +1 -1
- package/dist/index.cjs +75 -29
- package/dist/index.d.cts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +75 -29
- package/dist/plugins/custom-format.cjs +33 -17
- package/dist/plugins/custom-format.d.cts +1 -1
- package/dist/plugins/custom-format.d.ts +1 -1
- package/dist/plugins/custom-format.js +33 -17
- package/dist/plugins/custom-type-example.cjs +33 -17
- package/dist/plugins/custom-type-example.d.cts +1 -1
- package/dist/plugins/custom-type-example.d.ts +1 -1
- package/dist/plugins/custom-type-example.js +33 -17
- package/dist/plugins/custom-validator.cjs +0 -2
- package/dist/plugins/custom-validator.d.cts +1 -1
- package/dist/plugins/custom-validator.d.ts +1 -1
- package/dist/plugins/custom-validator.js +0 -2
- package/docs/FEATURE-INDEX.md +553 -553
- package/docs/add-custom-locale.md +496 -496
- package/docs/add-keyword.md +24 -24
- package/docs/api-reference.md +1047 -1047
- package/docs/api.md +13 -13
- package/docs/best-practices-project-structure.md +417 -417
- package/docs/best-practices.md +712 -712
- package/docs/cache-manager.md +344 -344
- package/docs/compile.md +45 -45
- package/docs/conditional-api.md +1307 -1307
- package/docs/custom-extensions-guide.md +339 -339
- package/docs/design-philosophy.md +606 -606
- package/docs/doc-index.md +324 -324
- package/docs/dsl-syntax.md +714 -714
- package/docs/dynamic-locale.md +608 -608
- package/docs/enum.md +482 -482
- package/docs/error-handling.md +1975 -1975
- package/docs/export-guide.md +501 -501
- package/docs/export-limitations.md +567 -567
- package/docs/faq.md +596 -596
- package/docs/frontend-i18n-guide.md +307 -307
- package/docs/i18n-user-guide.md +487 -487
- package/docs/i18n.md +476 -476
- package/docs/index.md +48 -48
- package/docs/json-schema-basics.md +40 -40
- package/docs/label-vs-description.md +271 -271
- package/docs/markdown-exporter.md +406 -406
- package/docs/mongodb-exporter.md +302 -302
- package/docs/multi-language.md +26 -26
- package/docs/multi-type-support.md +322 -322
- package/docs/mysql-exporter.md +280 -280
- package/docs/number-operators.md +449 -449
- package/docs/optional-marker-guide.md +326 -326
- package/docs/performance-guide.md +49 -49
- package/docs/plugin-system.md +381 -381
- package/docs/plugin-type-registration.md +34 -34
- package/docs/postgresql-exporter.md +311 -311
- package/docs/public/favicon.svg +4 -4
- package/docs/quick-start.md +435 -435
- package/docs/runtime-locale-support.md +532 -532
- package/docs/schema-helper.md +345 -345
- package/docs/schema-utils-advanced-issues.md +23 -23
- package/docs/schema-utils-best-practices.md +20 -20
- package/docs/schema-utils-chaining.md +150 -150
- package/docs/schema-utils.md +524 -524
- package/docs/security-checklist.md +20 -20
- package/docs/string-extensions.md +488 -488
- package/docs/troubleshooting.md +486 -486
- package/docs/type-converter.md +310 -310
- package/docs/type-reference.md +242 -242
- package/docs/typescript-guide.md +584 -584
- package/docs/union-type-guide.md +157 -157
- package/docs/union-types.md +284 -284
- package/docs/validate-async.md +491 -491
- package/docs/validate-batch.md +49 -49
- package/docs/validate-dsl-object-support.md +578 -578
- package/docs/validate.md +506 -506
- package/docs/validation-guide.md +502 -502
- package/docs/validator.md +39 -39
- package/package.json +131 -131
- package/plugins/custom-format.cjs +8 -8
- package/plugins/custom-type-example.cjs +8 -8
- package/plugins/custom-validator.cjs +8 -8
- package/src/adapters/DslAdapter.ts +111 -111
- package/src/adapters/index.ts +1 -1
- package/src/config/constants.ts +83 -83
- package/src/config/index.ts +2 -2
- package/src/config/patterns.ts +77 -77
- package/src/core/CacheManager.ts +169 -159
- package/src/core/ConditionalBuilder.ts +382 -382
- package/src/core/ConditionalRuntime.ts +27 -27
- package/src/core/ConditionalValidator.ts +254 -254
- package/src/core/DslBuilder.ts +687 -677
- package/src/core/ErrorCodes.ts +38 -38
- package/src/core/ErrorFormatter.ts +271 -271
- package/src/core/JSONSchemaCore.ts +65 -65
- package/src/core/Locale.ts +187 -187
- package/src/core/MessageTemplate.ts +42 -42
- package/src/core/ObjectDslBuilder.ts +64 -64
- package/src/core/PluginManager.ts +326 -326
- package/src/core/StringExtensions.ts +140 -140
- package/src/core/TemplateEngine.ts +44 -44
- package/src/core/Validator.ts +448 -448
- package/src/errors/I18nError.ts +159 -159
- package/src/errors/ValidationError.ts +105 -105
- package/src/exporters/BaseExporter.ts +60 -60
- package/src/exporters/MarkdownExporter.ts +305 -305
- package/src/exporters/MongoDBExporter.ts +126 -126
- package/src/exporters/MySQLExporter.ts +156 -155
- package/src/exporters/PostgreSQLExporter.ts +222 -222
- package/src/exporters/index.ts +18 -18
- package/src/index.ts +651 -633
- package/src/locales/en-US.ts +160 -160
- package/src/locales/es-ES.ts +160 -160
- package/src/locales/fr-FR.ts +160 -160
- package/src/locales/index.ts +103 -103
- package/src/locales/ja-JP.ts +160 -160
- package/src/locales/types.ts +156 -156
- package/src/locales/zh-CN.ts +160 -160
- package/src/parser/ConstraintParser.ts +101 -101
- package/src/parser/DslParser.ts +470 -470
- package/src/parser/SchemaCompiler.ts +66 -66
- package/src/parser/TypeRegistry.ts +250 -250
- package/src/parser/index.ts +6 -6
- package/src/plugins/custom-format.ts +124 -126
- package/src/plugins/custom-type-example.ts +106 -108
- package/src/plugins/custom-validator.ts +138 -140
- package/src/types/conditional.ts +28 -28
- package/src/types/config.ts +59 -59
- package/src/types/dsl.ts +131 -131
- package/src/types/error.ts +60 -60
- package/src/types/index.ts +17 -17
- package/src/types/infer.ts +127 -127
- package/src/types/plugin.ts +58 -58
- package/src/types/safe-regex.d.ts +9 -9
- package/src/types/schema.ts +66 -66
- package/src/types/validate.ts +71 -71
- package/src/utils/SchemaHelper.ts +196 -196
- package/src/utils/SchemaUtils.ts +365 -346
- package/src/utils/TypeConverter.ts +215 -215
- package/src/utils/index.ts +10 -10
- package/src/validators/CustomKeywords.ts +477 -477
package/docs/mongodb-exporter.md
CHANGED
|
@@ -1,302 +1,302 @@
|
|
|
1
|
-
# MongoDB 导出器文档
|
|
2
|
-
|
|
3
|
-
> **模块**: `src/exporters/MongoDBExporter.ts`
|
|
4
|
-
|
|
5
|
-
> **用途**: 将 JSON Schema 转换为 MongoDB 验证 Schema
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 📑 目录
|
|
10
|
-
|
|
11
|
-
- [概述](#概述)
|
|
12
|
-
- [快速开始](#快速开始)
|
|
13
|
-
- [API 参考](#api-参考)
|
|
14
|
-
- [配置选项](#配置选项)
|
|
15
|
-
- [完整示例](#完整示例)
|
|
16
|
-
- [类型映射](#类型映射)
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## 概述
|
|
21
|
-
|
|
22
|
-
`MongoDBExporter` 将 schema-dsl 生成的 JSON Schema 转换为 MongoDB 的 `$jsonSchema` 验证格式,可直接用于创建集合时的文档验证。
|
|
23
|
-
|
|
24
|
-
### 核心功能
|
|
25
|
-
|
|
26
|
-
- ✅ 转换为 MongoDB `$jsonSchema` 格式
|
|
27
|
-
- ✅ 自动映射类型为 BSON 类型
|
|
28
|
-
- ✅ 保留所有约束条件
|
|
29
|
-
- ✅ 生成 `createCollection` 命令
|
|
30
|
-
- ✅ 支持严格/宽松验证模式
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## 快速开始
|
|
35
|
-
|
|
36
|
-
```javascript
|
|
37
|
-
const { dsl, exporters } = require('schema-dsl');
|
|
38
|
-
|
|
39
|
-
// 1. 定义 Schema
|
|
40
|
-
const userSchema = dsl({
|
|
41
|
-
username: 'string:3-32!',
|
|
42
|
-
email: 'email!',
|
|
43
|
-
age: 'number:18-120'
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// 2. 创建导出器
|
|
47
|
-
const exporter = new exporters.MongoDBExporter();
|
|
48
|
-
|
|
49
|
-
// 3. 导出为 MongoDB Schema
|
|
50
|
-
const mongoSchema = exporter.export(userSchema);
|
|
51
|
-
console.log(JSON.stringify(mongoSchema, null, 2));
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**输出**:
|
|
55
|
-
|
|
56
|
-
```json
|
|
57
|
-
{
|
|
58
|
-
"$jsonSchema": {
|
|
59
|
-
"bsonType": "object",
|
|
60
|
-
"required": ["username", "email"],
|
|
61
|
-
"properties": {
|
|
62
|
-
"username": {
|
|
63
|
-
"bsonType": "string",
|
|
64
|
-
"minLength": 3,
|
|
65
|
-
"maxLength": 32
|
|
66
|
-
},
|
|
67
|
-
"email": {
|
|
68
|
-
"bsonType": "string"
|
|
69
|
-
},
|
|
70
|
-
"age": {
|
|
71
|
-
"bsonType": "double",
|
|
72
|
-
"minimum": 18,
|
|
73
|
-
"maximum": 120
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## API 参考
|
|
83
|
-
|
|
84
|
-
### 构造函数
|
|
85
|
-
|
|
86
|
-
```javascript
|
|
87
|
-
new MongoDBExporter(options)
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**参数**:
|
|
91
|
-
|
|
92
|
-
| 参数 | 类型 | 默认值 | 说明 |
|
|
93
|
-
|------|------|--------|------|
|
|
94
|
-
| `options.strict` | boolean | `false` | 是否使用严格验证模式 |
|
|
95
|
-
|
|
96
|
-
### 方法
|
|
97
|
-
|
|
98
|
-
#### `export(jsonSchema)`
|
|
99
|
-
|
|
100
|
-
将 JSON Schema 转换为 MongoDB 验证 Schema。
|
|
101
|
-
|
|
102
|
-
```javascript
|
|
103
|
-
const mongoSchema = exporter.export(jsonSchema);
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
**参数**:
|
|
107
|
-
- `jsonSchema` (Object): schema-dsl 生成的 JSON Schema 对象
|
|
108
|
-
|
|
109
|
-
**返回值**:
|
|
110
|
-
- `Object`: 包含 `$jsonSchema` 的 MongoDB 验证对象
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
#### `generateCreateCommand(collectionName, jsonSchema)`
|
|
115
|
-
|
|
116
|
-
生成 `createCollection` 命令对象。
|
|
117
|
-
|
|
118
|
-
```javascript
|
|
119
|
-
const command = exporter.generateCreateCommand('users', userSchema);
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**参数**:
|
|
123
|
-
- `collectionName` (string): 集合名称
|
|
124
|
-
- `jsonSchema` (Object): JSON Schema 对象
|
|
125
|
-
|
|
126
|
-
**返回值**:
|
|
127
|
-
|
|
128
|
-
```javascript
|
|
129
|
-
{
|
|
130
|
-
collectionName: 'users',
|
|
131
|
-
options: {
|
|
132
|
-
validator: { $jsonSchema: {...} },
|
|
133
|
-
validationLevel: 'moderate', // 或 'strict'
|
|
134
|
-
validationAction: 'error'
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
#### `generateCommand(collectionName, jsonSchema)`
|
|
142
|
-
|
|
143
|
-
生成可执行的 MongoDB 命令字符串。
|
|
144
|
-
|
|
145
|
-
```javascript
|
|
146
|
-
const commandStr = exporter.generateCommand('users', userSchema);
|
|
147
|
-
console.log(commandStr);
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
**输出**:
|
|
151
|
-
|
|
152
|
-
```javascript
|
|
153
|
-
db.createCollection("users", {
|
|
154
|
-
"validator": {
|
|
155
|
-
"$jsonSchema": {
|
|
156
|
-
"bsonType": "object",
|
|
157
|
-
...
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
"validationLevel": "moderate",
|
|
161
|
-
"validationAction": "error"
|
|
162
|
-
})
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
#### `MongoDBExporter.export(jsonSchema)` (静态方法)
|
|
168
|
-
|
|
169
|
-
快速导出,无需实例化。
|
|
170
|
-
|
|
171
|
-
```javascript
|
|
172
|
-
const mongoSchema = exporters.MongoDBExporter.export(userSchema);
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## 配置选项
|
|
178
|
-
|
|
179
|
-
### 验证模式
|
|
180
|
-
|
|
181
|
-
| 模式 | 说明 |
|
|
182
|
-
|------|------|
|
|
183
|
-
| `strict: false` (默认) | `validationLevel: 'moderate'` - 只验证插入和更新操作中涉及的字段 |
|
|
184
|
-
| `strict: true` | `validationLevel: 'strict'` - 验证所有插入和更新操作 |
|
|
185
|
-
|
|
186
|
-
```javascript
|
|
187
|
-
// 严格模式
|
|
188
|
-
const strictExporter = new exporters.MongoDBExporter({ strict: true });
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## 完整示例
|
|
194
|
-
|
|
195
|
-
### 用户集合验证
|
|
196
|
-
|
|
197
|
-
```javascript
|
|
198
|
-
const { dsl, exporters } = require('schema-dsl');
|
|
199
|
-
|
|
200
|
-
// 定义复杂用户 Schema
|
|
201
|
-
const userSchema = dsl({
|
|
202
|
-
_id: 'string!',
|
|
203
|
-
username: 'string:3-32!'
|
|
204
|
-
.pattern(/^[a-zA-Z0-9_]+$/)
|
|
205
|
-
.label('用户名'),
|
|
206
|
-
email: 'email!'.label('邮箱'),
|
|
207
|
-
profile: {
|
|
208
|
-
bio: 'string:500',
|
|
209
|
-
avatar: 'url'
|
|
210
|
-
},
|
|
211
|
-
status: 'active|inactive|banned',
|
|
212
|
-
createdAt: 'datetime!'
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// 导出并生成命令
|
|
216
|
-
const exporter = new exporters.MongoDBExporter({ strict: true });
|
|
217
|
-
const command = exporter.generateCommand('users', userSchema);
|
|
218
|
-
|
|
219
|
-
console.log(command);
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### 在 MongoDB 中使用
|
|
223
|
-
|
|
224
|
-
```javascript
|
|
225
|
-
const { MongoClient } = require('mongodb');
|
|
226
|
-
|
|
227
|
-
async function createValidatedCollection() {
|
|
228
|
-
const client = new MongoClient('mongodb://localhost:27017');
|
|
229
|
-
await client.connect();
|
|
230
|
-
|
|
231
|
-
const db = client.db('myapp');
|
|
232
|
-
|
|
233
|
-
// 获取验证 Schema
|
|
234
|
-
const exporter = new exporters.MongoDBExporter({ strict: true });
|
|
235
|
-
const { options } = exporter.generateCreateCommand('users', userSchema);
|
|
236
|
-
|
|
237
|
-
// 创建带验证的集合
|
|
238
|
-
await db.createCollection('users', options);
|
|
239
|
-
|
|
240
|
-
console.log('集合创建成功,已启用文档验证');
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
## 类型映射
|
|
247
|
-
|
|
248
|
-
| JSON Schema 类型 | MongoDB BSON 类型 |
|
|
249
|
-
|------------------|-------------------|
|
|
250
|
-
| `string` | `string` |
|
|
251
|
-
| `number` | `double` |
|
|
252
|
-
| `integer` | `int` |
|
|
253
|
-
| `boolean` | `bool` |
|
|
254
|
-
| `object` | `object` |
|
|
255
|
-
| `array` | `array` |
|
|
256
|
-
| `null` | `null` |
|
|
257
|
-
|
|
258
|
-
### 约束映射
|
|
259
|
-
|
|
260
|
-
| JSON Schema 约束 | MongoDB 约束 |
|
|
261
|
-
|------------------|--------------|
|
|
262
|
-
| `minLength` | `minLength` |
|
|
263
|
-
| `maxLength` | `maxLength` |
|
|
264
|
-
| `minimum` | `minimum` |
|
|
265
|
-
| `maximum` | `maximum` |
|
|
266
|
-
| `pattern` | `pattern` |
|
|
267
|
-
| `enum` | `enum` |
|
|
268
|
-
| `minItems` | `minItems` |
|
|
269
|
-
| `maxItems` | `maxItems` |
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## 导出限制
|
|
274
|
-
|
|
275
|
-
⚠️ **重要提示**: 并非所有 schema-dsl 特性都能导出到数据库 Schema。
|
|
276
|
-
|
|
277
|
-
**不支持导出的特性**:
|
|
278
|
-
- ❌ 条件验证逻辑(`dsl.match()`, `dsl.if()`)
|
|
279
|
-
- ❌ 自定义验证器(`.custom()`)
|
|
280
|
-
- ❌ 复杂 JSON Schema 关键字(`allOf`, `anyOf`, `oneOf`)
|
|
281
|
-
- ❌ 自定义错误消息(`.messages()`)
|
|
282
|
-
|
|
283
|
-
**详细说明**: 请阅读 [导出限制说明文档](export-limitations.md)
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## 相关文档
|
|
288
|
-
|
|
289
|
-
- [数据库导出指南](export-guide.md)
|
|
290
|
-
- [MySQL 导出器](mysql-exporter.md)
|
|
291
|
-
- [PostgreSQL 导出器](postgresql-exporter.md)
|
|
292
|
-
- [TypeConverter](type-converter.md)
|
|
293
|
-
- [**导出限制说明**](export-limitations.md) ⚠️
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
## 对应示例文件
|
|
298
|
-
|
|
299
|
-
**示例入口**: [mongodb-exporter.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/mongodb-exporter.ts)
|
|
300
|
-
**说明**: 覆盖 `$jsonSchema` 导出、`generateCreateCommand()` 和 `generateCommand()`,对应文档中的验证集合创建场景。
|
|
301
|
-
|
|
302
|
-
|
|
1
|
+
# MongoDB 导出器文档
|
|
2
|
+
|
|
3
|
+
> **模块**: `src/exporters/MongoDBExporter.ts`
|
|
4
|
+
|
|
5
|
+
> **用途**: 将 JSON Schema 转换为 MongoDB 验证 Schema
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📑 目录
|
|
10
|
+
|
|
11
|
+
- [概述](#概述)
|
|
12
|
+
- [快速开始](#快速开始)
|
|
13
|
+
- [API 参考](#api-参考)
|
|
14
|
+
- [配置选项](#配置选项)
|
|
15
|
+
- [完整示例](#完整示例)
|
|
16
|
+
- [类型映射](#类型映射)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 概述
|
|
21
|
+
|
|
22
|
+
`MongoDBExporter` 将 schema-dsl 生成的 JSON Schema 转换为 MongoDB 的 `$jsonSchema` 验证格式,可直接用于创建集合时的文档验证。
|
|
23
|
+
|
|
24
|
+
### 核心功能
|
|
25
|
+
|
|
26
|
+
- ✅ 转换为 MongoDB `$jsonSchema` 格式
|
|
27
|
+
- ✅ 自动映射类型为 BSON 类型
|
|
28
|
+
- ✅ 保留所有约束条件
|
|
29
|
+
- ✅ 生成 `createCollection` 命令
|
|
30
|
+
- ✅ 支持严格/宽松验证模式
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 快速开始
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
const { dsl, exporters } = require('schema-dsl');
|
|
38
|
+
|
|
39
|
+
// 1. 定义 Schema
|
|
40
|
+
const userSchema = dsl({
|
|
41
|
+
username: 'string:3-32!',
|
|
42
|
+
email: 'email!',
|
|
43
|
+
age: 'number:18-120'
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// 2. 创建导出器
|
|
47
|
+
const exporter = new exporters.MongoDBExporter();
|
|
48
|
+
|
|
49
|
+
// 3. 导出为 MongoDB Schema
|
|
50
|
+
const mongoSchema = exporter.export(userSchema);
|
|
51
|
+
console.log(JSON.stringify(mongoSchema, null, 2));
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**输出**:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"$jsonSchema": {
|
|
59
|
+
"bsonType": "object",
|
|
60
|
+
"required": ["username", "email"],
|
|
61
|
+
"properties": {
|
|
62
|
+
"username": {
|
|
63
|
+
"bsonType": "string",
|
|
64
|
+
"minLength": 3,
|
|
65
|
+
"maxLength": 32
|
|
66
|
+
},
|
|
67
|
+
"email": {
|
|
68
|
+
"bsonType": "string"
|
|
69
|
+
},
|
|
70
|
+
"age": {
|
|
71
|
+
"bsonType": "double",
|
|
72
|
+
"minimum": 18,
|
|
73
|
+
"maximum": 120
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## API 参考
|
|
83
|
+
|
|
84
|
+
### 构造函数
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
new MongoDBExporter(options)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**参数**:
|
|
91
|
+
|
|
92
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
93
|
+
|------|------|--------|------|
|
|
94
|
+
| `options.strict` | boolean | `false` | 是否使用严格验证模式 |
|
|
95
|
+
|
|
96
|
+
### 方法
|
|
97
|
+
|
|
98
|
+
#### `export(jsonSchema)`
|
|
99
|
+
|
|
100
|
+
将 JSON Schema 转换为 MongoDB 验证 Schema。
|
|
101
|
+
|
|
102
|
+
```javascript
|
|
103
|
+
const mongoSchema = exporter.export(jsonSchema);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**参数**:
|
|
107
|
+
- `jsonSchema` (Object): schema-dsl 生成的 JSON Schema 对象
|
|
108
|
+
|
|
109
|
+
**返回值**:
|
|
110
|
+
- `Object`: 包含 `$jsonSchema` 的 MongoDB 验证对象
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
#### `generateCreateCommand(collectionName, jsonSchema)`
|
|
115
|
+
|
|
116
|
+
生成 `createCollection` 命令对象。
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
const command = exporter.generateCreateCommand('users', userSchema);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**参数**:
|
|
123
|
+
- `collectionName` (string): 集合名称
|
|
124
|
+
- `jsonSchema` (Object): JSON Schema 对象
|
|
125
|
+
|
|
126
|
+
**返回值**:
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
{
|
|
130
|
+
collectionName: 'users',
|
|
131
|
+
options: {
|
|
132
|
+
validator: { $jsonSchema: {...} },
|
|
133
|
+
validationLevel: 'moderate', // 或 'strict'
|
|
134
|
+
validationAction: 'error'
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
#### `generateCommand(collectionName, jsonSchema)`
|
|
142
|
+
|
|
143
|
+
生成可执行的 MongoDB 命令字符串。
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
const commandStr = exporter.generateCommand('users', userSchema);
|
|
147
|
+
console.log(commandStr);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**输出**:
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
db.createCollection("users", {
|
|
154
|
+
"validator": {
|
|
155
|
+
"$jsonSchema": {
|
|
156
|
+
"bsonType": "object",
|
|
157
|
+
...
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
"validationLevel": "moderate",
|
|
161
|
+
"validationAction": "error"
|
|
162
|
+
})
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
#### `MongoDBExporter.export(jsonSchema)` (静态方法)
|
|
168
|
+
|
|
169
|
+
快速导出,无需实例化。
|
|
170
|
+
|
|
171
|
+
```javascript
|
|
172
|
+
const mongoSchema = exporters.MongoDBExporter.export(userSchema);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 配置选项
|
|
178
|
+
|
|
179
|
+
### 验证模式
|
|
180
|
+
|
|
181
|
+
| 模式 | 说明 |
|
|
182
|
+
|------|------|
|
|
183
|
+
| `strict: false` (默认) | `validationLevel: 'moderate'` - 只验证插入和更新操作中涉及的字段 |
|
|
184
|
+
| `strict: true` | `validationLevel: 'strict'` - 验证所有插入和更新操作 |
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
// 严格模式
|
|
188
|
+
const strictExporter = new exporters.MongoDBExporter({ strict: true });
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 完整示例
|
|
194
|
+
|
|
195
|
+
### 用户集合验证
|
|
196
|
+
|
|
197
|
+
```javascript
|
|
198
|
+
const { dsl, exporters } = require('schema-dsl');
|
|
199
|
+
|
|
200
|
+
// 定义复杂用户 Schema
|
|
201
|
+
const userSchema = dsl({
|
|
202
|
+
_id: 'string!',
|
|
203
|
+
username: 'string:3-32!'
|
|
204
|
+
.pattern(/^[a-zA-Z0-9_]+$/)
|
|
205
|
+
.label('用户名'),
|
|
206
|
+
email: 'email!'.label('邮箱'),
|
|
207
|
+
profile: {
|
|
208
|
+
bio: 'string:500',
|
|
209
|
+
avatar: 'url'
|
|
210
|
+
},
|
|
211
|
+
status: 'active|inactive|banned',
|
|
212
|
+
createdAt: 'datetime!'
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// 导出并生成命令
|
|
216
|
+
const exporter = new exporters.MongoDBExporter({ strict: true });
|
|
217
|
+
const command = exporter.generateCommand('users', userSchema);
|
|
218
|
+
|
|
219
|
+
console.log(command);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### 在 MongoDB 中使用
|
|
223
|
+
|
|
224
|
+
```javascript
|
|
225
|
+
const { MongoClient } = require('mongodb');
|
|
226
|
+
|
|
227
|
+
async function createValidatedCollection() {
|
|
228
|
+
const client = new MongoClient('mongodb://localhost:27017');
|
|
229
|
+
await client.connect();
|
|
230
|
+
|
|
231
|
+
const db = client.db('myapp');
|
|
232
|
+
|
|
233
|
+
// 获取验证 Schema
|
|
234
|
+
const exporter = new exporters.MongoDBExporter({ strict: true });
|
|
235
|
+
const { options } = exporter.generateCreateCommand('users', userSchema);
|
|
236
|
+
|
|
237
|
+
// 创建带验证的集合
|
|
238
|
+
await db.createCollection('users', options);
|
|
239
|
+
|
|
240
|
+
console.log('集合创建成功,已启用文档验证');
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 类型映射
|
|
247
|
+
|
|
248
|
+
| JSON Schema 类型 | MongoDB BSON 类型 |
|
|
249
|
+
|------------------|-------------------|
|
|
250
|
+
| `string` | `string` |
|
|
251
|
+
| `number` | `double` |
|
|
252
|
+
| `integer` | `int` |
|
|
253
|
+
| `boolean` | `bool` |
|
|
254
|
+
| `object` | `object` |
|
|
255
|
+
| `array` | `array` |
|
|
256
|
+
| `null` | `null` |
|
|
257
|
+
|
|
258
|
+
### 约束映射
|
|
259
|
+
|
|
260
|
+
| JSON Schema 约束 | MongoDB 约束 |
|
|
261
|
+
|------------------|--------------|
|
|
262
|
+
| `minLength` | `minLength` |
|
|
263
|
+
| `maxLength` | `maxLength` |
|
|
264
|
+
| `minimum` | `minimum` |
|
|
265
|
+
| `maximum` | `maximum` |
|
|
266
|
+
| `pattern` | `pattern` |
|
|
267
|
+
| `enum` | `enum` |
|
|
268
|
+
| `minItems` | `minItems` |
|
|
269
|
+
| `maxItems` | `maxItems` |
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 导出限制
|
|
274
|
+
|
|
275
|
+
⚠️ **重要提示**: 并非所有 schema-dsl 特性都能导出到数据库 Schema。
|
|
276
|
+
|
|
277
|
+
**不支持导出的特性**:
|
|
278
|
+
- ❌ 条件验证逻辑(`dsl.match()`, `dsl.if()`)
|
|
279
|
+
- ❌ 自定义验证器(`.custom()`)
|
|
280
|
+
- ❌ 复杂 JSON Schema 关键字(`allOf`, `anyOf`, `oneOf`)
|
|
281
|
+
- ❌ 自定义错误消息(`.messages()`)
|
|
282
|
+
|
|
283
|
+
**详细说明**: 请阅读 [导出限制说明文档](export-limitations.md)
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 相关文档
|
|
288
|
+
|
|
289
|
+
- [数据库导出指南](export-guide.md)
|
|
290
|
+
- [MySQL 导出器](mysql-exporter.md)
|
|
291
|
+
- [PostgreSQL 导出器](postgresql-exporter.md)
|
|
292
|
+
- [TypeConverter](type-converter.md)
|
|
293
|
+
- [**导出限制说明**](export-limitations.md) ⚠️
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## 对应示例文件
|
|
298
|
+
|
|
299
|
+
**示例入口**: [mongodb-exporter.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/mongodb-exporter.ts)
|
|
300
|
+
**说明**: 覆盖 `$jsonSchema` 导出、`generateCreateCommand()` 和 `generateCommand()`,对应文档中的验证集合创建场景。
|
|
301
|
+
|
|
302
|
+
|
package/docs/multi-language.md
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
# 多语言支持
|
|
2
|
-
|
|
3
|
-
多语言能力由 `Locale`、`dsl.config({ i18n })` 和验证选项 `locale` 提供。
|
|
4
|
-
|
|
5
|
-
常见入口:
|
|
6
|
-
|
|
7
|
-
- 运行时切换默认语言:`Locale.setLocale('en-US')`
|
|
8
|
-
- 运行时补充语言包:`Locale.addLocale('en-US', messages)`
|
|
9
|
-
- 从目录扫描语言包:`dsl.config({ i18n: '/path/to/locales' })`
|
|
10
|
-
- 单次验证覆盖语言:`validator.validate(schema, data, { locale: 'en-US' })`
|
|
11
|
-
|
|
12
|
-
当前 i18n 目录扫描支持这些语言包文件:`.js`、`.cjs`、`.json`、`.jsonc`、`.json5`。
|
|
13
|
-
|
|
14
|
-
更多内容请见:
|
|
15
|
-
|
|
16
|
-
- [i18n.md](./i18n.md)
|
|
17
|
-
- [i18n-user-guide.md](./i18n-user-guide.md)
|
|
18
|
-
- [dynamic-locale.md](./dynamic-locale.md)
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## 对应示例文件
|
|
23
|
-
|
|
24
|
-
**示例入口**: [multi-language.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/multi-language.ts)
|
|
25
|
-
**说明**: 展示默认语言、按次覆盖 `locale` 以及可用语言列表的最小运行时示例。
|
|
26
|
-
|
|
1
|
+
# 多语言支持
|
|
2
|
+
|
|
3
|
+
多语言能力由 `Locale`、`dsl.config({ i18n })` 和验证选项 `locale` 提供。
|
|
4
|
+
|
|
5
|
+
常见入口:
|
|
6
|
+
|
|
7
|
+
- 运行时切换默认语言:`Locale.setLocale('en-US')`
|
|
8
|
+
- 运行时补充语言包:`Locale.addLocale('en-US', messages)`
|
|
9
|
+
- 从目录扫描语言包:`dsl.config({ i18n: '/path/to/locales' })`
|
|
10
|
+
- 单次验证覆盖语言:`validator.validate(schema, data, { locale: 'en-US' })`
|
|
11
|
+
|
|
12
|
+
当前 i18n 目录扫描支持这些语言包文件:`.js`、`.cjs`、`.json`、`.jsonc`、`.json5`。
|
|
13
|
+
|
|
14
|
+
更多内容请见:
|
|
15
|
+
|
|
16
|
+
- [i18n.md](./i18n.md)
|
|
17
|
+
- [i18n-user-guide.md](./i18n-user-guide.md)
|
|
18
|
+
- [dynamic-locale.md](./dynamic-locale.md)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 对应示例文件
|
|
23
|
+
|
|
24
|
+
**示例入口**: [multi-language.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/multi-language.ts)
|
|
25
|
+
**说明**: 展示默认语言、按次覆盖 `locale` 以及可用语言列表的最小运行时示例。
|
|
26
|
+
|