schema-dsl 1.2.4 → 2.0.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 +87 -210
- package/README.md +391 -2249
- package/dist/DslBuilder-DQDN0ZxZ.d.cts +341 -0
- package/dist/DslBuilder-DkLaOo9Q.d.ts +341 -0
- package/dist/Validator-C7GsVQOH.d.cts +192 -0
- package/dist/Validator-hFWKGxir.d.ts +192 -0
- package/dist/index.cjs +6594 -0
- package/dist/index.d.cts +1145 -0
- package/dist/index.d.ts +1145 -0
- package/dist/index.js +6528 -0
- package/dist/plugin-CIKtTMtS.d.cts +246 -0
- package/dist/plugin-CIKtTMtS.d.ts +246 -0
- package/dist/plugins/custom-format.cjs +3802 -0
- package/dist/plugins/custom-format.d.cts +12 -0
- package/dist/plugins/custom-format.d.ts +12 -0
- package/dist/plugins/custom-format.js +3772 -0
- package/dist/plugins/custom-type-example.cjs +3795 -0
- package/dist/plugins/custom-type-example.d.cts +8 -0
- package/dist/plugins/custom-type-example.d.ts +8 -0
- package/dist/plugins/custom-type-example.js +3765 -0
- package/dist/plugins/custom-validator.cjs +146 -0
- package/dist/plugins/custom-validator.d.cts +10 -0
- package/dist/plugins/custom-validator.d.ts +10 -0
- package/dist/plugins/custom-validator.js +121 -0
- package/docs/FEATURE-INDEX.md +102 -68
- package/docs/add-custom-locale.md +48 -35
- package/docs/add-keyword.md +24 -0
- package/docs/api-reference.md +396 -154
- package/docs/api.md +13 -0
- package/docs/best-practices-project-structure.md +19 -10
- package/docs/best-practices.md +93 -53
- package/docs/cache-manager.md +23 -15
- package/docs/compile.md +45 -0
- package/docs/conditional-api.md +40 -11
- package/docs/custom-extensions-guide.md +80 -152
- package/docs/design-philosophy.md +76 -71
- package/docs/doc-index.md +324 -0
- package/docs/dsl-syntax.md +69 -19
- package/docs/dynamic-locale.md +24 -14
- package/docs/enum.md +12 -5
- package/docs/error-handling.md +53 -44
- package/docs/export-guide.md +47 -8
- package/docs/export-limitations.md +27 -11
- package/docs/faq.md +86 -67
- package/docs/frontend-i18n-guide.md +26 -12
- package/docs/i18n-user-guide.md +60 -47
- package/docs/i18n.md +51 -32
- package/docs/index.md +48 -0
- package/docs/json-schema-basics.md +40 -0
- package/docs/label-vs-description.md +12 -3
- package/docs/markdown-exporter.md +15 -6
- package/docs/mongodb-exporter.md +11 -4
- package/docs/multi-language.md +26 -0
- package/docs/multi-type-support.md +26 -33
- package/docs/mysql-exporter.md +9 -2
- package/docs/number-operators.md +12 -5
- package/docs/optional-marker-guide.md +28 -23
- package/docs/performance-guide.md +49 -0
- package/docs/plugin-system.md +205 -366
- package/docs/plugin-type-registration.md +34 -0
- package/docs/postgresql-exporter.md +9 -2
- package/docs/public/favicon.svg +5 -0
- package/docs/quick-start.md +37 -363
- package/docs/runtime-locale-support.md +20 -9
- package/docs/schema-helper.md +10 -5
- package/docs/schema-utils-advanced-issues.md +23 -0
- package/docs/schema-utils-best-practices.md +20 -0
- package/docs/schema-utils-chaining.md +7 -0
- package/docs/schema-utils.md +76 -42
- package/docs/security-checklist.md +20 -0
- package/docs/string-extensions.md +17 -9
- package/docs/troubleshooting.md +36 -21
- package/docs/type-converter.md +41 -50
- package/docs/type-reference.md +38 -15
- package/docs/typescript-guide.md +53 -42
- package/docs/union-type-guide.md +11 -1
- package/docs/union-types.md +10 -3
- package/docs/validate-async.md +36 -25
- package/docs/validate-batch.md +49 -0
- package/docs/validate-dsl-object-support.md +33 -28
- package/docs/validate.md +36 -16
- package/docs/validation-guide.md +25 -7
- package/docs/validator.md +39 -0
- package/package.json +85 -27
- package/plugins/custom-format.cjs +8 -0
- package/plugins/custom-type-example.cjs +8 -0
- package/plugins/custom-validator.cjs +8 -0
- package/src/adapters/DslAdapter.ts +111 -0
- package/src/adapters/index.ts +1 -0
- package/src/config/constants.ts +83 -0
- package/src/config/index.ts +2 -0
- package/src/config/patterns.ts +77 -0
- package/src/core/CacheManager.ts +159 -0
- package/src/core/ConditionalBuilder.ts +382 -0
- package/src/core/ConditionalRuntime.ts +28 -0
- package/src/core/ConditionalValidator.ts +255 -0
- package/src/core/DslBuilder.ts +677 -0
- package/src/core/ErrorCodes.ts +38 -0
- package/src/core/ErrorFormatter.ts +271 -0
- package/src/core/JSONSchemaCore.ts +65 -0
- package/src/core/Locale.ts +187 -0
- package/src/core/MessageTemplate.ts +42 -0
- package/src/core/ObjectDslBuilder.ts +64 -0
- package/src/core/PluginManager.ts +326 -0
- package/src/core/StringExtensions.ts +140 -0
- package/src/core/TemplateEngine.ts +44 -0
- package/src/core/Validator.ts +448 -0
- package/src/errors/I18nError.ts +159 -0
- package/src/errors/ValidationError.ts +105 -0
- package/src/exporters/BaseExporter.ts +60 -0
- package/src/exporters/MarkdownExporter.ts +305 -0
- package/src/exporters/MongoDBExporter.ts +126 -0
- package/src/exporters/MySQLExporter.ts +155 -0
- package/src/exporters/PostgreSQLExporter.ts +222 -0
- package/src/exporters/index.ts +18 -0
- package/src/index.ts +633 -0
- package/{lib/locales/en-US.js → src/locales/en-US.ts} +21 -37
- package/{lib/locales/es-ES.js → src/locales/es-ES.ts} +63 -16
- package/{lib/locales/fr-FR.js → src/locales/fr-FR.ts} +74 -27
- package/src/locales/index.ts +103 -0
- package/{lib/locales/ja-JP.js → src/locales/ja-JP.ts} +59 -17
- package/src/locales/types.ts +156 -0
- package/{lib/locales/zh-CN.js → src/locales/zh-CN.ts} +21 -38
- package/src/parser/ConstraintParser.ts +101 -0
- package/src/parser/DslParser.ts +470 -0
- package/src/parser/SchemaCompiler.ts +66 -0
- package/src/parser/TypeRegistry.ts +250 -0
- package/src/parser/index.ts +6 -0
- package/src/plugins/custom-format.ts +126 -0
- package/src/plugins/custom-type-example.ts +108 -0
- package/src/plugins/custom-validator.ts +140 -0
- package/src/types/conditional.ts +28 -0
- package/src/types/config.ts +59 -0
- package/src/types/dsl.ts +131 -0
- package/src/types/error.ts +60 -0
- package/src/types/index.ts +17 -0
- package/src/types/infer.ts +128 -0
- package/src/types/plugin.ts +58 -0
- package/src/types/safe-regex.d.ts +9 -0
- package/src/types/schema.ts +66 -0
- package/src/types/validate.ts +71 -0
- package/src/utils/SchemaHelper.ts +196 -0
- package/src/utils/SchemaUtils.ts +346 -0
- package/src/utils/TypeConverter.ts +215 -0
- package/src/utils/index.ts +10 -0
- package/src/validators/CustomKeywords.ts +477 -0
- package/.eslintignore +0 -11
- package/.eslintrc.json +0 -27
- package/CONTRIBUTING.md +0 -368
- package/STATUS.md +0 -491
- package/changelogs/v1.0.0.md +0 -328
- package/changelogs/v1.0.9.md +0 -367
- package/changelogs/v1.1.0.md +0 -389
- package/changelogs/v1.1.1.md +0 -308
- package/changelogs/v1.1.2.md +0 -183
- package/changelogs/v1.1.3.md +0 -161
- package/changelogs/v1.1.4.md +0 -432
- package/changelogs/v1.1.5.md +0 -493
- package/changelogs/v1.1.6.md +0 -211
- package/changelogs/v1.1.8.md +0 -376
- package/changelogs/v1.2.3.md +0 -124
- package/docs/INDEX.md +0 -252
- package/docs/issues-resolved-summary.md +0 -196
- package/docs/performance-benchmark-report.md +0 -179
- package/docs/performance-quick-reference.md +0 -123
- package/docs/user-questions-answered.md +0 -353
- package/docs/validation-rules-v1.0.2.md +0 -1608
- package/examples/README.md +0 -81
- package/examples/array-dsl-example.js +0 -227
- package/examples/conditional-example.js +0 -288
- package/examples/conditional-non-object.js +0 -129
- package/examples/conditional-validate-example.js +0 -321
- package/examples/custom-extension.js +0 -85
- package/examples/dsl-match-example.js +0 -74
- package/examples/dsl-style.js +0 -118
- package/examples/dynamic-locale-configuration.js +0 -348
- package/examples/dynamic-locale-example.js +0 -287
- package/examples/enum.examples.js +0 -324
- package/examples/export-demo.js +0 -130
- package/examples/express-integration.js +0 -376
- package/examples/i18n-error-handling-complete.js +0 -381
- package/examples/i18n-error-handling-quickstart.md +0 -0
- package/examples/i18n-error.examples.js +0 -181
- package/examples/i18n-full-demo.js +0 -301
- package/examples/i18n-memory-safety.examples.js +0 -268
- package/examples/markdown-export.js +0 -71
- package/examples/middleware-usage.js +0 -93
- package/examples/new-features-comparison.js +0 -315
- package/examples/password-reset/README.md +0 -153
- package/examples/password-reset/schema.js +0 -26
- package/examples/password-reset/test.js +0 -101
- package/examples/plugin-system.examples.js +0 -205
- package/examples/schema-utils-chaining.examples.js +0 -250
- package/examples/simple-example.js +0 -122
- package/examples/slug.examples.js +0 -179
- package/examples/string-extensions.js +0 -297
- package/examples/union-type-example.js +0 -127
- package/examples/union-types-example.js +0 -77
- package/examples/user-registration/README.md +0 -156
- package/examples/user-registration/routes.js +0 -92
- package/examples/user-registration/schema.js +0 -150
- package/examples/user-registration/server.js +0 -74
- package/index.d.ts +0 -3540
- package/index.js +0 -457
- package/index.mjs +0 -60
- package/lib/adapters/DslAdapter.js +0 -871
- package/lib/adapters/index.js +0 -20
- package/lib/config/constants.js +0 -286
- package/lib/config/patterns/common.js +0 -47
- package/lib/config/patterns/creditCard.js +0 -9
- package/lib/config/patterns/idCard.js +0 -9
- package/lib/config/patterns/index.js +0 -9
- package/lib/config/patterns/licensePlate.js +0 -4
- package/lib/config/patterns/passport.js +0 -4
- package/lib/config/patterns/phone.js +0 -9
- package/lib/config/patterns/postalCode.js +0 -5
- package/lib/core/CacheManager.js +0 -376
- package/lib/core/ConditionalBuilder.js +0 -503
- package/lib/core/DslBuilder.js +0 -1400
- package/lib/core/ErrorCodes.js +0 -233
- package/lib/core/ErrorFormatter.js +0 -445
- package/lib/core/JSONSchemaCore.js +0 -347
- package/lib/core/Locale.js +0 -130
- package/lib/core/MessageTemplate.js +0 -98
- package/lib/core/PluginManager.js +0 -448
- package/lib/core/StringExtensions.js +0 -240
- package/lib/core/Validator.js +0 -654
- package/lib/errors/I18nError.js +0 -328
- package/lib/errors/ValidationError.js +0 -191
- package/lib/exporters/MarkdownExporter.js +0 -420
- package/lib/exporters/MongoDBExporter.js +0 -162
- package/lib/exporters/MySQLExporter.js +0 -212
- package/lib/exporters/PostgreSQLExporter.js +0 -289
- package/lib/exporters/index.js +0 -24
- package/lib/locales/index.js +0 -8
- package/lib/utils/LRUCache.js +0 -174
- package/lib/utils/SchemaHelper.js +0 -240
- package/lib/utils/SchemaUtils.js +0 -445
- package/lib/utils/TypeConverter.js +0 -245
- package/lib/utils/index.js +0 -13
- package/lib/validators/CustomKeywords.js +0 -616
- package/lib/validators/index.js +0 -11
package/examples/README.md
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
# schema-dsl 示例代码
|
|
2
|
-
|
|
3
|
-
本目录包含 schema-dsl 的各种功能示例。
|
|
4
|
-
|
|
5
|
-
## 📂 示例列表
|
|
6
|
-
|
|
7
|
-
### 基础示例
|
|
8
|
-
- [simple-example.js](simple-example.js) - 简单入门示例
|
|
9
|
-
- [dsl-style.js](dsl-style.js) - DSL 风格完整示例
|
|
10
|
-
- [enum.examples.js](enum.examples.js) - 枚举类型验证示例
|
|
11
|
-
|
|
12
|
-
### 扩展功能
|
|
13
|
-
- [string-extensions.js](string-extensions.js) - String 扩展功能(username、password、phone)
|
|
14
|
-
- [custom-extension.js](custom-extension.js) - 自定义扩展示例
|
|
15
|
-
- [array-dsl-example.js](array-dsl-example.js) - 数组 DSL 语法示例
|
|
16
|
-
|
|
17
|
-
### 数据库导出
|
|
18
|
-
- [export-demo.js](export-demo.js) - 导出为 MongoDB/MySQL/PostgreSQL Schema
|
|
19
|
-
|
|
20
|
-
### 国际化 (i18n)
|
|
21
|
-
- [dynamic-locale-configuration.js](dynamic-locale-configuration.js) - 动态语言配置示例
|
|
22
|
-
- [dynamic-locale-example.js](dynamic-locale-example.js) - 动态语言切换示例
|
|
23
|
-
- [i18n-full-demo.js](i18n-full-demo.js) - 完整国际化示例
|
|
24
|
-
- [i18n-memory-safety.examples.js](i18n-memory-safety.examples.js) - i18n 内存安全示例
|
|
25
|
-
|
|
26
|
-
### Schema 工具
|
|
27
|
-
- [schema-utils-chaining.examples.js](schema-utils-chaining.examples.js) - SchemaUtils 链式调用示例
|
|
28
|
-
- [dsl-match-example.js](dsl-match-example.js) - 条件验证 match 示例
|
|
29
|
-
- [new-features-comparison.js](new-features-comparison.js) - 新版本功能对比
|
|
30
|
-
|
|
31
|
-
### 插件系统
|
|
32
|
-
- [plugin-system.examples.js](plugin-system.examples.js) - 插件系统完整示例
|
|
33
|
-
|
|
34
|
-
### 实际应用
|
|
35
|
-
- [express-integration.js](express-integration.js) - Express 集成完整示例
|
|
36
|
-
- [middleware-usage.js](middleware-usage.js) - 中间件使用示例
|
|
37
|
-
- [user-registration/](user-registration/) - 用户注册流程完整示例
|
|
38
|
-
- [schema.js](user-registration/schema.js) - Schema 定义
|
|
39
|
-
- [routes.js](user-registration/routes.js) - 路由定义
|
|
40
|
-
- [server.js](user-registration/server.js) - 服务器入口
|
|
41
|
-
- [password-reset/](password-reset/) - 密码重置流程示例
|
|
42
|
-
- [schema.js](password-reset/schema.js) - Schema 定义
|
|
43
|
-
- [test.js](password-reset/test.js) - 测试用例
|
|
44
|
-
|
|
45
|
-
## 🚀 快速开始
|
|
46
|
-
|
|
47
|
-
### 1. 安装依赖
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
cd schema-dsl
|
|
51
|
-
npm install
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 2. 运行示例
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
# 运行简单示例
|
|
58
|
-
node examples/simple-example.js
|
|
59
|
-
|
|
60
|
-
# 运行 String 扩展示例
|
|
61
|
-
node examples/string-extensions.js
|
|
62
|
-
|
|
63
|
-
# 运行导出示例
|
|
64
|
-
node examples/export-demo.js
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### 3. 查看完整文档
|
|
68
|
-
|
|
69
|
-
访问 [docs/INDEX.md](../docs/INDEX.md) 查看完整文档索引。
|
|
70
|
-
|
|
71
|
-
## 📖 相关文档
|
|
72
|
-
|
|
73
|
-
- [DSL 语法文档](../docs/dsl-syntax.md)
|
|
74
|
-
- [String 扩展文档](../docs/string-extensions.md)
|
|
75
|
-
- [插件系统文档](../docs/plugin-system.md)
|
|
76
|
-
- [API 参考](../docs/api-reference.md)
|
|
77
|
-
- [最佳实践](../docs/best-practices.md)
|
|
78
|
-
|
|
79
|
-
## 🤝 贡献
|
|
80
|
-
|
|
81
|
-
欢迎提交新的示例!请参考 [CONTRIBUTING.md](../CONTRIBUTING.md)。
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SchemaIO v2.0.1 新功能完整示例
|
|
3
|
-
*
|
|
4
|
-
* 展示v2.0.1版本的核心功能
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const { dsl, validate, SchemaUtils, DslBuilder, Validator } = require('../index');
|
|
8
|
-
|
|
9
|
-
console.log('========== SchemaIO v2.0.1 新功能示例 ==========\n');
|
|
10
|
-
|
|
11
|
-
// ========== 1. DSL数组语法 ==========
|
|
12
|
-
console.log('✨ 1. DSL数组语法');
|
|
13
|
-
|
|
14
|
-
const tagsSchema = dsl({
|
|
15
|
-
// 使用DSL数组语法:array:min-max<itemType>
|
|
16
|
-
tags: 'array:1-10<string:1-20>!'
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
console.log('验证标签:', validate(tagsSchema, { tags: ['javascript', 'nodejs'] }).valid);
|
|
20
|
-
console.log('空标签验证:', validate(tagsSchema, { tags: [] }).valid); // false
|
|
21
|
-
console.log('');
|
|
22
|
-
|
|
23
|
-
// ========== 2. when条件验证 ==========
|
|
24
|
-
console.log('✨ 2. when条件验证');
|
|
25
|
-
|
|
26
|
-
const contactSchema = dsl({
|
|
27
|
-
contactType: 'email|phone',
|
|
28
|
-
// 使用 dsl.match 条件验证
|
|
29
|
-
contact: dsl.match('contactType', {
|
|
30
|
-
email: 'email!',
|
|
31
|
-
phone: 'string:11!'
|
|
32
|
-
})
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
console.log('match条件Schema已创建');
|
|
36
|
-
console.log('');
|
|
37
|
-
|
|
38
|
-
// ========== 3. 自定义验证器 ==========
|
|
39
|
-
console.log('✨ 3. 自定义验证器');
|
|
40
|
-
|
|
41
|
-
const customSchema = dsl({
|
|
42
|
-
username: dsl('string:3-32!')
|
|
43
|
-
.custom((value) => {
|
|
44
|
-
// 返回错误消息字符串表示失败
|
|
45
|
-
const forbidden = ['admin', 'root'];
|
|
46
|
-
if (forbidden.includes(value)) {
|
|
47
|
-
return '该用户名已被保留';
|
|
48
|
-
}
|
|
49
|
-
// 不返回任何值表示通过
|
|
50
|
-
})
|
|
51
|
-
.label('用户名')
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
console.log('自定义验证器Schema已创建');
|
|
55
|
-
console.log('');
|
|
56
|
-
|
|
57
|
-
// ========== 4. 默认验证器快捷方法 ==========
|
|
58
|
-
console.log('✨ 4. 默认验证器快捷方法');
|
|
59
|
-
|
|
60
|
-
const userSchema = dsl({
|
|
61
|
-
// ✨ username验证器:自动设置正则和长度
|
|
62
|
-
username: dsl('string!').username().label('用户名'),
|
|
63
|
-
|
|
64
|
-
// ✨ password验证器:根据强度设置验证
|
|
65
|
-
password: dsl('string!').password('medium').label('密码'),
|
|
66
|
-
|
|
67
|
-
// ✨ phone验证器:根据国家设置正则
|
|
68
|
-
phone: dsl('string!').phone('cn').label('手机号')
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
console.log('验证用户:', validate(userSchema, {
|
|
72
|
-
username: 'john_doe',
|
|
73
|
-
password: 'Test1234',
|
|
74
|
-
phone: '13800138000'
|
|
75
|
-
}).valid);
|
|
76
|
-
console.log('');
|
|
77
|
-
|
|
78
|
-
// ========== 5. Schema复用 ==========
|
|
79
|
-
console.log('✨ 5. Schema复用');
|
|
80
|
-
|
|
81
|
-
// ✨ 新特性:创建可复用片段
|
|
82
|
-
const emailField = SchemaUtils.reusable(() =>
|
|
83
|
-
dsl('email!').label('邮箱地址')
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const schema1 = dsl({ email: emailField() });
|
|
87
|
-
const schema2 = dsl({ contactEmail: emailField() });
|
|
88
|
-
|
|
89
|
-
console.log('Schema复用成功:', schema1.properties.email.format === 'email');
|
|
90
|
-
console.log('');
|
|
91
|
-
|
|
92
|
-
// ========== 6. Schema合并 ==========
|
|
93
|
-
console.log('✨ 6. Schema合并');
|
|
94
|
-
|
|
95
|
-
const baseUser = dsl({
|
|
96
|
-
name: 'string!',
|
|
97
|
-
email: 'email!'
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
const withAge = dsl({
|
|
101
|
-
age: 'number:18-120'
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
// ✨ 新特性:merge方法
|
|
105
|
-
const extendedSchema = SchemaUtils.extend(baseUser, withAge);
|
|
106
|
-
|
|
107
|
-
console.log('合并后字段数:', Object.keys(extendedSchema.properties).length);
|
|
108
|
-
console.log('');
|
|
109
|
-
|
|
110
|
-
// ========== 7. Schema pick/omit ==========
|
|
111
|
-
console.log('✨ 7. Schema pick/omit');
|
|
112
|
-
|
|
113
|
-
const fullUser = dsl({
|
|
114
|
-
name: 'string!',
|
|
115
|
-
email: 'email!',
|
|
116
|
-
password: 'string!',
|
|
117
|
-
age: 'number'
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// ✨ 新特性:pick方法
|
|
121
|
-
const publicUser = SchemaUtils.pick(fullUser, ['name', 'email']);
|
|
122
|
-
|
|
123
|
-
console.log('公开用户字段:', Object.keys(publicUser.properties));
|
|
124
|
-
console.log('');
|
|
125
|
-
|
|
126
|
-
// ========== 8. 性能监控 ==========
|
|
127
|
-
console.log('✨ 8. 性能监控');
|
|
128
|
-
|
|
129
|
-
// Validator 已在文件开头导入
|
|
130
|
-
const validator = new Validator(); // 高级用法:创建实例以增强功能
|
|
131
|
-
|
|
132
|
-
// ✨ 新特性:性能监控
|
|
133
|
-
const enhancedValidator = SchemaUtils.withPerformance(validator);
|
|
134
|
-
|
|
135
|
-
const perfResult = enhancedValidator.validate(
|
|
136
|
-
dsl({ email: 'email!' }),
|
|
137
|
-
{ email: 'test@example.com' }
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
console.log('验证耗时:', perfResult.performance.duration, 'ms');
|
|
141
|
-
console.log('');
|
|
142
|
-
|
|
143
|
-
// ========== 9. 批量验证 ==========
|
|
144
|
-
console.log('✨ 9. 批量验证');
|
|
145
|
-
|
|
146
|
-
const users = [
|
|
147
|
-
{ email: 'user1@example.com' },
|
|
148
|
-
{ email: 'invalid' },
|
|
149
|
-
{ email: 'user3@example.com' }
|
|
150
|
-
];
|
|
151
|
-
|
|
152
|
-
// ✨ 新特性:批量验证优化
|
|
153
|
-
const batchResult = SchemaUtils.validateBatch(
|
|
154
|
-
dsl({ email: 'email!' }),
|
|
155
|
-
users,
|
|
156
|
-
validator
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
console.log('批量验证总数:', batchResult.summary.total);
|
|
160
|
-
console.log('有效数量:', batchResult.summary.valid);
|
|
161
|
-
console.log('无效数量:', batchResult.summary.invalid);
|
|
162
|
-
console.log('平均耗时:', batchResult.summary.averageTime.toFixed(2), 'ms');
|
|
163
|
-
console.log('');
|
|
164
|
-
|
|
165
|
-
// ========== 10. Schema导出文档 ==========
|
|
166
|
-
console.log('✨ 10. Schema导出文档');
|
|
167
|
-
|
|
168
|
-
const docSchema = dsl({
|
|
169
|
-
name: dsl('string:1-50!').label('姓名').description('用户真实姓名'),
|
|
170
|
-
email: dsl('email!').label('邮箱').description('用于登录'),
|
|
171
|
-
age: dsl('number:18-120').label('年龄')
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
// ✨ 新特性:导出Markdown
|
|
175
|
-
const markdown = SchemaUtils.toMarkdown(docSchema, { title: '用户Schema' });
|
|
176
|
-
|
|
177
|
-
console.log('Markdown文档生成:', markdown.length, '字符');
|
|
178
|
-
console.log('');
|
|
179
|
-
console.log('--- Markdown预览 ---');
|
|
180
|
-
console.log(markdown.substring(0, 300) + '...');
|
|
181
|
-
console.log('');
|
|
182
|
-
|
|
183
|
-
// ========== 11. 嵌套深度验证 ==========
|
|
184
|
-
console.log('✨ 11. 嵌套深度验证');
|
|
185
|
-
|
|
186
|
-
const deepSchema = dsl({
|
|
187
|
-
level1: {
|
|
188
|
-
level2: {
|
|
189
|
-
level3: {
|
|
190
|
-
level4: {
|
|
191
|
-
value: 'string'
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
// ✨ 新特性:嵌套深度检查
|
|
199
|
-
const depthCheck = DslBuilder.validateNestingDepth(deepSchema, 3);
|
|
200
|
-
|
|
201
|
-
console.log('嵌套深度检查:', depthCheck.message);
|
|
202
|
-
console.log('实际深度:', depthCheck.depth);
|
|
203
|
-
console.log('是否超限:', !depthCheck.valid ? '⚠️ 是' : '✅ 否');
|
|
204
|
-
console.log('');
|
|
205
|
-
|
|
206
|
-
// ========== 总结 ==========
|
|
207
|
-
console.log('========== 功能总结 ==========');
|
|
208
|
-
console.log(`
|
|
209
|
-
✨ SchemaIO v2.0.1 核心功能:
|
|
210
|
-
|
|
211
|
-
1. ✅ DSL数组语法 - array:min-max<itemType>
|
|
212
|
-
2. ✅ when条件验证 - 条件字段验证
|
|
213
|
-
3. ✅ 自定义验证器 - .custom()链式调用
|
|
214
|
-
4. ✅ 默认验证器 - username/password/phone
|
|
215
|
-
5. ✅ Schema复用 - reusable()方法
|
|
216
|
-
6. ✅ Schema合并 - merge()方法
|
|
217
|
-
7. ✅ Schema筛选 - pick/omit方法
|
|
218
|
-
8. ✅ 性能监控 - withPerformance()
|
|
219
|
-
9. ✅ 批量验证 - validateBatch()优化
|
|
220
|
-
10. ✅ 文档导出 - toMarkdown/toHTML
|
|
221
|
-
11. ✅ 嵌套检查 - validateNestingDepth()
|
|
222
|
-
|
|
223
|
-
🎉 SchemaIO v2.0.1 - 功能强大,使用简单!
|
|
224
|
-
`);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ConditionalBuilder 完整示例
|
|
3
|
-
*
|
|
4
|
-
* 展示链式条件构建器的各种用法
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const { dsl, validate } = require('../index');
|
|
8
|
-
|
|
9
|
-
console.log('========================================');
|
|
10
|
-
console.log('ConditionalBuilder 示例');
|
|
11
|
-
console.log('========================================\n');
|
|
12
|
-
|
|
13
|
-
// ============================================
|
|
14
|
-
// 示例1:简单条件 + 错误消息
|
|
15
|
-
// ============================================
|
|
16
|
-
console.log('【示例1】简单条件 + 错误消息');
|
|
17
|
-
console.log('----------------------------');
|
|
18
|
-
|
|
19
|
-
const schema1 = dsl({
|
|
20
|
-
age: 'number!',
|
|
21
|
-
status: dsl.if((data) => data.age >= 18)
|
|
22
|
-
.message('未成年用户不能注册')
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const testData1a = { age: 20, status: 'active' };
|
|
26
|
-
const result1a = validate(schema1, testData1a);
|
|
27
|
-
console.log('✅ 成年用户:', result1a.valid ? '验证通过' : '验证失败');
|
|
28
|
-
|
|
29
|
-
const testData1b = { age: 16, status: 'active' };
|
|
30
|
-
const result1b = validate(schema1, testData1b);
|
|
31
|
-
console.log('❌ 未成年用户:', result1b.valid ? '验证通过' : '验证失败');
|
|
32
|
-
if (!result1b.valid) {
|
|
33
|
-
console.log(' 错误消息:', result1b.errors[0].message);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// ============================================
|
|
37
|
-
// 示例2:条件 + then/else(动态Schema)
|
|
38
|
-
// ============================================
|
|
39
|
-
console.log('\n【示例2】条件 + then/else(动态Schema)');
|
|
40
|
-
console.log('----------------------------');
|
|
41
|
-
|
|
42
|
-
const schema2 = dsl({
|
|
43
|
-
userType: 'string!',
|
|
44
|
-
email: dsl.if((data) => data.userType === 'admin')
|
|
45
|
-
.then('email!') // 管理员必填
|
|
46
|
-
.else('email') // 普通用户可选
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const testData2a = { userType: 'admin', email: 'admin@example.com' };
|
|
50
|
-
const result2a = validate(schema2, testData2a);
|
|
51
|
-
console.log('✅ 管理员有邮箱:', result2a.valid ? '验证通过' : '验证失败');
|
|
52
|
-
|
|
53
|
-
const testData2b = { userType: 'admin', email: '' };
|
|
54
|
-
const result2b = validate(schema2, testData2b);
|
|
55
|
-
console.log('❌ 管理员无邮箱:', result2b.valid ? '验证通过' : '验证失败');
|
|
56
|
-
|
|
57
|
-
const testData2c = { userType: 'user', email: '' };
|
|
58
|
-
const result2c = validate(schema2, testData2c);
|
|
59
|
-
console.log('✅ 普通用户无邮箱:', result2c.valid ? '验证通过' : '验证失败');
|
|
60
|
-
|
|
61
|
-
// ============================================
|
|
62
|
-
// 示例3:else 可选(不写 else 就不验证)
|
|
63
|
-
// ============================================
|
|
64
|
-
console.log('\n【示例3】else 可选');
|
|
65
|
-
console.log('----------------------------');
|
|
66
|
-
|
|
67
|
-
const schema3 = dsl({
|
|
68
|
-
userType: 'string!',
|
|
69
|
-
vipLevel: dsl.if((data) => data.userType === 'vip')
|
|
70
|
-
.then('enum:gold|silver|bronze!')
|
|
71
|
-
// 不写 else,非 vip 用户不验证 vipLevel
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
const testData3a = { userType: 'vip', vipLevel: 'gold' };
|
|
75
|
-
const result3a = validate(schema3, testData3a);
|
|
76
|
-
console.log('✅ VIP用户有等级:', result3a.valid ? '验证通过' : '验证失败');
|
|
77
|
-
|
|
78
|
-
const testData3b = { userType: 'user' };
|
|
79
|
-
const result3b = validate(schema3, testData3b);
|
|
80
|
-
console.log('✅ 普通用户无等级:', result3b.valid ? '验证通过' : '验证失败');
|
|
81
|
-
|
|
82
|
-
const testData3c = { userType: 'user', vipLevel: 'invalid_level' };
|
|
83
|
-
const result3c = validate(schema3, testData3c);
|
|
84
|
-
console.log('✅ 普通用户有无效等级:', result3c.valid ? '验证通过(不验证)' : '验证失败');
|
|
85
|
-
|
|
86
|
-
// ============================================
|
|
87
|
-
// 示例4:多条件 AND
|
|
88
|
-
// ============================================
|
|
89
|
-
console.log('\n【示例4】多条件 AND');
|
|
90
|
-
console.log('----------------------------');
|
|
91
|
-
|
|
92
|
-
const schema4 = dsl({
|
|
93
|
-
age: 'number!',
|
|
94
|
-
userType: 'string!',
|
|
95
|
-
email: dsl.if((data) => data.age >= 18)
|
|
96
|
-
.and((data) => data.userType === 'admin')
|
|
97
|
-
.then('email!')
|
|
98
|
-
.else('email')
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
const testData4a = { age: 20, userType: 'admin', email: 'admin@example.com' };
|
|
102
|
-
const result4a = validate(schema4, testData4a);
|
|
103
|
-
console.log('✅ 成年管理员有邮箱:', result4a.valid ? '验证通过' : '验证失败');
|
|
104
|
-
|
|
105
|
-
const testData4b = { age: 20, userType: 'user', email: '' };
|
|
106
|
-
const result4b = validate(schema4, testData4b);
|
|
107
|
-
console.log('✅ 成年普通用户无邮箱:', result4b.valid ? '验证通过' : '验证失败');
|
|
108
|
-
|
|
109
|
-
const testData4c = { age: 16, userType: 'admin', email: '' };
|
|
110
|
-
const result4c = validate(schema4, testData4c);
|
|
111
|
-
console.log('✅ 未成年管理员无邮箱:', result4c.valid ? '验证通过' : '验证失败');
|
|
112
|
-
|
|
113
|
-
// ============================================
|
|
114
|
-
// 示例5:多条件 OR
|
|
115
|
-
// ============================================
|
|
116
|
-
console.log('\n【示例5】多条件 OR');
|
|
117
|
-
console.log('----------------------------');
|
|
118
|
-
|
|
119
|
-
const schema5 = dsl({
|
|
120
|
-
age: 'number!',
|
|
121
|
-
status: 'string!',
|
|
122
|
-
reason: dsl.if((data) => data.age < 18)
|
|
123
|
-
.or((data) => data.status === 'blocked')
|
|
124
|
-
.message('不允许注册')
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
const testData5a = { age: 16, status: 'active', reason: 'test' };
|
|
128
|
-
const result5a = validate(schema5, testData5a);
|
|
129
|
-
console.log('❌ 未成年用户:', result5a.valid ? '验证通过' : `验证失败(${result5a.errors[0].message})`);
|
|
130
|
-
|
|
131
|
-
const testData5b = { age: 20, status: 'blocked', reason: 'test' };
|
|
132
|
-
const result5b = validate(schema5, testData5b);
|
|
133
|
-
console.log('❌ 被封禁用户:', result5b.valid ? '验证通过' : `验证失败(${result5b.errors[0].message})`);
|
|
134
|
-
|
|
135
|
-
const testData5c = { age: 20, status: 'active', reason: 'test' };
|
|
136
|
-
const result5c = validate(schema5, testData5c);
|
|
137
|
-
console.log('✅ 正常用户:', result5c.valid ? '验证通过' : '验证失败');
|
|
138
|
-
|
|
139
|
-
// ============================================
|
|
140
|
-
// 示例6:elseIf 多分支
|
|
141
|
-
// ============================================
|
|
142
|
-
console.log('\n【示例6】elseIf 多分支');
|
|
143
|
-
console.log('----------------------------');
|
|
144
|
-
|
|
145
|
-
const schema6 = dsl({
|
|
146
|
-
userType: 'string!',
|
|
147
|
-
permissions: dsl.if((data) => data.userType === 'admin')
|
|
148
|
-
.then('array<string>!')
|
|
149
|
-
.elseIf((data) => data.userType === 'vip')
|
|
150
|
-
.then('array<string>')
|
|
151
|
-
.else(null)
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const testData6a = { userType: 'admin', permissions: ['read', 'write'] };
|
|
155
|
-
const result6a = validate(schema6, testData6a);
|
|
156
|
-
console.log('✅ 管理员有权限:', result6a.valid ? '验证通过' : '验证失败');
|
|
157
|
-
|
|
158
|
-
const testData6b = { userType: 'vip' };
|
|
159
|
-
const result6b = validate(schema6, testData6b);
|
|
160
|
-
console.log('✅ VIP无权限:', result6b.valid ? '验证通过' : '验证失败');
|
|
161
|
-
|
|
162
|
-
const testData6c = { userType: 'guest' };
|
|
163
|
-
const result6c = validate(schema6, testData6c);
|
|
164
|
-
console.log('✅ 游客无权限:', result6c.valid ? '验证通过' : '验证失败');
|
|
165
|
-
|
|
166
|
-
// ============================================
|
|
167
|
-
// 示例7:复杂场景 - 用户注册
|
|
168
|
-
// ============================================
|
|
169
|
-
console.log('\n【示例7】复杂场景 - 用户注册');
|
|
170
|
-
console.log('----------------------------');
|
|
171
|
-
|
|
172
|
-
const userRegistrationSchema = dsl({
|
|
173
|
-
username: 'string:3-32!',
|
|
174
|
-
age: 'number:1-120!',
|
|
175
|
-
userType: 'enum:admin|vip|user!',
|
|
176
|
-
|
|
177
|
-
// 未成年禁止注册
|
|
178
|
-
ageCheck: dsl.if((data) => data.age < 18)
|
|
179
|
-
.message('未成年用户不能注册'),
|
|
180
|
-
|
|
181
|
-
// 管理员必须有邮箱
|
|
182
|
-
email: dsl.if((data) => data.userType === 'admin')
|
|
183
|
-
.then('email!')
|
|
184
|
-
.else('email'),
|
|
185
|
-
|
|
186
|
-
// VIP用户必须有手机号
|
|
187
|
-
phone: dsl.if((data) => data.userType === 'vip')
|
|
188
|
-
.then('string:11!')
|
|
189
|
-
.else(null),
|
|
190
|
-
|
|
191
|
-
// 管理员和VIP可以设置昵称
|
|
192
|
-
nickname: dsl.if((data) => data.userType === 'admin')
|
|
193
|
-
.or((data) => data.userType === 'vip')
|
|
194
|
-
.then('string:2-20')
|
|
195
|
-
.else(null)
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
const testData7a = {
|
|
199
|
-
username: 'admin1',
|
|
200
|
-
age: 25,
|
|
201
|
-
userType: 'admin',
|
|
202
|
-
email: 'admin@example.com',
|
|
203
|
-
nickname: 'Super Admin'
|
|
204
|
-
};
|
|
205
|
-
const result7a = validate(userRegistrationSchema, testData7a);
|
|
206
|
-
console.log('✅ 成年管理员:', result7a.valid ? '注册成功' : '注册失败');
|
|
207
|
-
|
|
208
|
-
const testData7b = {
|
|
209
|
-
username: 'vip1',
|
|
210
|
-
age: 30,
|
|
211
|
-
userType: 'vip',
|
|
212
|
-
phone: '13800138000',
|
|
213
|
-
nickname: 'VIP User'
|
|
214
|
-
};
|
|
215
|
-
const result7b = validate(userRegistrationSchema, testData7b);
|
|
216
|
-
console.log('✅ VIP用户:', result7b.valid ? '注册成功' : '注册失败');
|
|
217
|
-
|
|
218
|
-
const testData7c = {
|
|
219
|
-
username: 'kid',
|
|
220
|
-
age: 15,
|
|
221
|
-
userType: 'user'
|
|
222
|
-
};
|
|
223
|
-
const result7c = validate(userRegistrationSchema, testData7c);
|
|
224
|
-
console.log('❌ 未成年用户:', result7c.valid ? '注册成功' : `注册失败(${result7c.errors[0].message})`);
|
|
225
|
-
|
|
226
|
-
// ============================================
|
|
227
|
-
// 示例8:复杂场景 - 商品发布
|
|
228
|
-
// ============================================
|
|
229
|
-
console.log('\n【示例8】复杂场景 - 商品发布');
|
|
230
|
-
console.log('----------------------------');
|
|
231
|
-
|
|
232
|
-
const productSchema = dsl({
|
|
233
|
-
title: 'string:1-100!',
|
|
234
|
-
price: 'number:0-!',
|
|
235
|
-
type: 'enum:physical|digital|service!',
|
|
236
|
-
|
|
237
|
-
// 实体商品需要重量和尺寸
|
|
238
|
-
weight: dsl.if((data) => data.type === 'physical')
|
|
239
|
-
.then('number:0-!')
|
|
240
|
-
.else(null),
|
|
241
|
-
|
|
242
|
-
dimensions: dsl.if((data) => data.type === 'physical')
|
|
243
|
-
.then('string!')
|
|
244
|
-
.else(null),
|
|
245
|
-
|
|
246
|
-
// 数字商品需要下载链接
|
|
247
|
-
downloadUrl: dsl.if((data) => data.type === 'digital')
|
|
248
|
-
.then('url!')
|
|
249
|
-
.else(null),
|
|
250
|
-
|
|
251
|
-
// 服务类需要服务时长
|
|
252
|
-
duration: dsl.if((data) => data.type === 'service')
|
|
253
|
-
.then('number:1-!')
|
|
254
|
-
.else(null)
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
const testData8a = {
|
|
258
|
-
title: '笔记本电脑',
|
|
259
|
-
price: 5999,
|
|
260
|
-
type: 'physical',
|
|
261
|
-
weight: 1.5,
|
|
262
|
-
dimensions: '30x20x2cm'
|
|
263
|
-
};
|
|
264
|
-
const result8a = validate(productSchema, testData8a);
|
|
265
|
-
console.log('✅ 实体商品:', result8a.valid ? '发布成功' : '发布失败');
|
|
266
|
-
|
|
267
|
-
const testData8b = {
|
|
268
|
-
title: '电子书',
|
|
269
|
-
price: 29.9,
|
|
270
|
-
type: 'digital',
|
|
271
|
-
downloadUrl: 'https://example.com/download'
|
|
272
|
-
};
|
|
273
|
-
const result8b = validate(productSchema, testData8b);
|
|
274
|
-
console.log('✅ 数字商品:', result8b.valid ? '发布成功' : '发布失败');
|
|
275
|
-
|
|
276
|
-
const testData8c = {
|
|
277
|
-
title: '咨询服务',
|
|
278
|
-
price: 200,
|
|
279
|
-
type: 'service',
|
|
280
|
-
duration: 60
|
|
281
|
-
};
|
|
282
|
-
const result8c = validate(productSchema, testData8c);
|
|
283
|
-
console.log('✅ 服务类:', result8c.valid ? '发布成功' : '发布失败');
|
|
284
|
-
|
|
285
|
-
console.log('\n========================================');
|
|
286
|
-
console.log('示例运行完成!');
|
|
287
|
-
console.log('========================================');
|
|
288
|
-
|