schema-dsl 1.2.5 → 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.
Files changed (243) hide show
  1. package/CHANGELOG.md +130 -238
  2. package/LICENSE +21 -21
  3. package/README.md +628 -2486
  4. package/dist/DslBuilder-BIgQOAXp.d.ts +343 -0
  5. package/dist/DslBuilder-CjHTucNQ.d.cts +343 -0
  6. package/dist/Validator-CllRdrY0.d.ts +192 -0
  7. package/dist/Validator-D6okG9tr.d.cts +192 -0
  8. package/dist/index.cjs +6640 -0
  9. package/dist/index.d.cts +1151 -0
  10. package/dist/index.d.ts +1151 -0
  11. package/dist/index.js +6574 -0
  12. package/dist/plugin-CIKtTMtS.d.cts +246 -0
  13. package/dist/plugin-CIKtTMtS.d.ts +246 -0
  14. package/dist/plugins/custom-format.cjs +3818 -0
  15. package/dist/plugins/custom-format.d.cts +12 -0
  16. package/dist/plugins/custom-format.d.ts +12 -0
  17. package/dist/plugins/custom-format.js +3788 -0
  18. package/dist/plugins/custom-type-example.cjs +3811 -0
  19. package/dist/plugins/custom-type-example.d.cts +8 -0
  20. package/dist/plugins/custom-type-example.d.ts +8 -0
  21. package/dist/plugins/custom-type-example.js +3781 -0
  22. package/dist/plugins/custom-validator.cjs +144 -0
  23. package/dist/plugins/custom-validator.d.cts +10 -0
  24. package/dist/plugins/custom-validator.d.ts +10 -0
  25. package/dist/plugins/custom-validator.js +119 -0
  26. package/docs/FEATURE-INDEX.md +553 -519
  27. package/docs/add-custom-locale.md +496 -483
  28. package/docs/add-keyword.md +24 -0
  29. package/docs/api-reference.md +1047 -805
  30. package/docs/api.md +13 -0
  31. package/docs/best-practices-project-structure.md +417 -408
  32. package/docs/best-practices.md +712 -672
  33. package/docs/cache-manager.md +344 -336
  34. package/docs/compile.md +45 -0
  35. package/docs/conditional-api.md +1307 -1278
  36. package/docs/custom-extensions-guide.md +339 -411
  37. package/docs/design-philosophy.md +606 -601
  38. package/docs/doc-index.md +324 -0
  39. package/docs/dsl-syntax.md +714 -664
  40. package/docs/dynamic-locale.md +608 -598
  41. package/docs/enum.md +482 -475
  42. package/docs/error-handling.md +1975 -1966
  43. package/docs/export-guide.md +501 -462
  44. package/docs/export-limitations.md +567 -551
  45. package/docs/faq.md +596 -577
  46. package/docs/frontend-i18n-guide.md +307 -293
  47. package/docs/i18n-user-guide.md +487 -474
  48. package/docs/i18n.md +476 -457
  49. package/docs/index.md +48 -0
  50. package/docs/json-schema-basics.md +40 -0
  51. package/docs/label-vs-description.md +271 -262
  52. package/docs/markdown-exporter.md +406 -397
  53. package/docs/mongodb-exporter.md +302 -295
  54. package/docs/multi-language.md +26 -0
  55. package/docs/multi-type-support.md +322 -329
  56. package/docs/mysql-exporter.md +280 -273
  57. package/docs/number-operators.md +449 -442
  58. package/docs/optional-marker-guide.md +326 -321
  59. package/docs/performance-guide.md +49 -0
  60. package/docs/plugin-system.md +381 -542
  61. package/docs/plugin-type-registration.md +34 -0
  62. package/docs/postgresql-exporter.md +311 -304
  63. package/docs/public/favicon.svg +5 -0
  64. package/docs/quick-start.md +435 -761
  65. package/docs/runtime-locale-support.md +532 -521
  66. package/docs/schema-helper.md +345 -340
  67. package/docs/schema-utils-advanced-issues.md +23 -0
  68. package/docs/schema-utils-best-practices.md +20 -0
  69. package/docs/schema-utils-chaining.md +150 -143
  70. package/docs/schema-utils.md +524 -490
  71. package/docs/security-checklist.md +20 -0
  72. package/docs/string-extensions.md +488 -480
  73. package/docs/troubleshooting.md +486 -471
  74. package/docs/type-converter.md +310 -319
  75. package/docs/type-reference.md +242 -219
  76. package/docs/typescript-guide.md +584 -573
  77. package/docs/union-type-guide.md +157 -147
  78. package/docs/union-types.md +284 -277
  79. package/docs/validate-async.md +491 -480
  80. package/docs/validate-batch.md +49 -0
  81. package/docs/validate-dsl-object-support.md +578 -573
  82. package/docs/validate.md +506 -486
  83. package/docs/validation-guide.md +502 -484
  84. package/docs/validator.md +39 -0
  85. package/package.json +131 -73
  86. package/plugins/custom-format.cjs +8 -0
  87. package/plugins/custom-type-example.cjs +8 -0
  88. package/plugins/custom-validator.cjs +8 -0
  89. package/src/adapters/DslAdapter.ts +111 -0
  90. package/src/adapters/index.ts +1 -0
  91. package/src/config/constants.ts +83 -0
  92. package/src/config/index.ts +2 -0
  93. package/src/config/patterns.ts +77 -0
  94. package/src/core/CacheManager.ts +169 -0
  95. package/src/core/ConditionalBuilder.ts +382 -0
  96. package/src/core/ConditionalRuntime.ts +28 -0
  97. package/src/core/ConditionalValidator.ts +255 -0
  98. package/src/core/DslBuilder.ts +687 -0
  99. package/src/core/ErrorCodes.ts +38 -0
  100. package/src/core/ErrorFormatter.ts +271 -0
  101. package/src/core/JSONSchemaCore.ts +65 -0
  102. package/src/core/Locale.ts +187 -0
  103. package/src/core/MessageTemplate.ts +42 -0
  104. package/src/core/ObjectDslBuilder.ts +64 -0
  105. package/src/core/PluginManager.ts +326 -0
  106. package/src/core/StringExtensions.ts +140 -0
  107. package/src/core/TemplateEngine.ts +44 -0
  108. package/src/core/Validator.ts +448 -0
  109. package/src/errors/I18nError.ts +159 -0
  110. package/src/errors/ValidationError.ts +105 -0
  111. package/src/exporters/BaseExporter.ts +60 -0
  112. package/src/exporters/MarkdownExporter.ts +305 -0
  113. package/src/exporters/MongoDBExporter.ts +126 -0
  114. package/src/exporters/MySQLExporter.ts +156 -0
  115. package/src/exporters/PostgreSQLExporter.ts +222 -0
  116. package/src/exporters/index.ts +18 -0
  117. package/src/index.ts +651 -0
  118. package/{lib/locales/en-US.js → src/locales/en-US.ts} +160 -176
  119. package/{lib/locales/es-ES.js → src/locales/es-ES.ts} +160 -113
  120. package/{lib/locales/fr-FR.js → src/locales/fr-FR.ts} +160 -113
  121. package/src/locales/index.ts +103 -0
  122. package/{lib/locales/ja-JP.js → src/locales/ja-JP.ts} +160 -118
  123. package/src/locales/types.ts +156 -0
  124. package/{lib/locales/zh-CN.js → src/locales/zh-CN.ts} +160 -177
  125. package/src/parser/ConstraintParser.ts +101 -0
  126. package/src/parser/DslParser.ts +470 -0
  127. package/src/parser/SchemaCompiler.ts +66 -0
  128. package/src/parser/TypeRegistry.ts +250 -0
  129. package/src/parser/index.ts +6 -0
  130. package/src/plugins/custom-format.ts +124 -0
  131. package/src/plugins/custom-type-example.ts +106 -0
  132. package/src/plugins/custom-validator.ts +138 -0
  133. package/src/types/conditional.ts +28 -0
  134. package/src/types/config.ts +59 -0
  135. package/src/types/dsl.ts +131 -0
  136. package/src/types/error.ts +60 -0
  137. package/src/types/index.ts +17 -0
  138. package/src/types/infer.ts +128 -0
  139. package/src/types/plugin.ts +58 -0
  140. package/src/types/safe-regex.d.ts +9 -0
  141. package/src/types/schema.ts +66 -0
  142. package/src/types/validate.ts +71 -0
  143. package/src/utils/SchemaHelper.ts +196 -0
  144. package/src/utils/SchemaUtils.ts +365 -0
  145. package/src/utils/TypeConverter.ts +215 -0
  146. package/src/utils/index.ts +10 -0
  147. package/src/validators/CustomKeywords.ts +477 -0
  148. package/.eslintignore +0 -11
  149. package/.eslintrc.json +0 -27
  150. package/CONTRIBUTING.md +0 -368
  151. package/STATUS.md +0 -491
  152. package/changelogs/v1.0.0.md +0 -328
  153. package/changelogs/v1.0.9.md +0 -367
  154. package/changelogs/v1.1.0.md +0 -389
  155. package/changelogs/v1.1.1.md +0 -308
  156. package/changelogs/v1.1.2.md +0 -183
  157. package/changelogs/v1.1.3.md +0 -161
  158. package/changelogs/v1.1.4.md +0 -432
  159. package/changelogs/v1.1.5.md +0 -493
  160. package/changelogs/v1.1.6.md +0 -211
  161. package/changelogs/v1.1.8.md +0 -376
  162. package/changelogs/v1.2.3.md +0 -124
  163. package/docs/INDEX.md +0 -252
  164. package/docs/issues-resolved-summary.md +0 -196
  165. package/docs/performance-benchmark-report.md +0 -179
  166. package/docs/performance-quick-reference.md +0 -123
  167. package/docs/user-questions-answered.md +0 -353
  168. package/docs/validation-rules-v1.0.2.md +0 -1608
  169. package/examples/README.md +0 -81
  170. package/examples/array-dsl-example.js +0 -227
  171. package/examples/conditional-example.js +0 -288
  172. package/examples/conditional-non-object.js +0 -129
  173. package/examples/conditional-validate-example.js +0 -321
  174. package/examples/custom-extension.js +0 -85
  175. package/examples/dsl-match-example.js +0 -74
  176. package/examples/dsl-style.js +0 -118
  177. package/examples/dynamic-locale-configuration.js +0 -348
  178. package/examples/dynamic-locale-example.js +0 -287
  179. package/examples/enum.examples.js +0 -324
  180. package/examples/export-demo.js +0 -130
  181. package/examples/express-integration.js +0 -376
  182. package/examples/i18n-error-handling-complete.js +0 -381
  183. package/examples/i18n-error-handling-quickstart.md +0 -0
  184. package/examples/i18n-error.examples.js +0 -181
  185. package/examples/i18n-full-demo.js +0 -301
  186. package/examples/i18n-memory-safety.examples.js +0 -268
  187. package/examples/markdown-export.js +0 -71
  188. package/examples/middleware-usage.js +0 -93
  189. package/examples/new-features-comparison.js +0 -315
  190. package/examples/password-reset/README.md +0 -153
  191. package/examples/password-reset/schema.js +0 -26
  192. package/examples/password-reset/test.js +0 -101
  193. package/examples/plugin-system.examples.js +0 -205
  194. package/examples/schema-utils-chaining.examples.js +0 -250
  195. package/examples/simple-example.js +0 -122
  196. package/examples/slug.examples.js +0 -179
  197. package/examples/string-extensions.js +0 -297
  198. package/examples/union-type-example.js +0 -127
  199. package/examples/union-types-example.js +0 -77
  200. package/examples/user-registration/README.md +0 -156
  201. package/examples/user-registration/routes.js +0 -92
  202. package/examples/user-registration/schema.js +0 -150
  203. package/examples/user-registration/server.js +0 -74
  204. package/index.d.ts +0 -3658
  205. package/index.js +0 -475
  206. package/index.mjs +0 -60
  207. package/lib/adapters/DslAdapter.js +0 -995
  208. package/lib/adapters/index.js +0 -20
  209. package/lib/config/constants.js +0 -286
  210. package/lib/config/patterns/common.js +0 -47
  211. package/lib/config/patterns/creditCard.js +0 -9
  212. package/lib/config/patterns/idCard.js +0 -9
  213. package/lib/config/patterns/index.js +0 -9
  214. package/lib/config/patterns/licensePlate.js +0 -4
  215. package/lib/config/patterns/passport.js +0 -4
  216. package/lib/config/patterns/phone.js +0 -9
  217. package/lib/config/patterns/postalCode.js +0 -5
  218. package/lib/core/CacheManager.js +0 -376
  219. package/lib/core/ConditionalBuilder.js +0 -503
  220. package/lib/core/DslBuilder.js +0 -1589
  221. package/lib/core/ErrorCodes.js +0 -233
  222. package/lib/core/ErrorFormatter.js +0 -445
  223. package/lib/core/JSONSchemaCore.js +0 -347
  224. package/lib/core/Locale.js +0 -130
  225. package/lib/core/MessageTemplate.js +0 -98
  226. package/lib/core/PluginManager.js +0 -448
  227. package/lib/core/StringExtensions.js +0 -240
  228. package/lib/core/Validator.js +0 -654
  229. package/lib/errors/I18nError.js +0 -328
  230. package/lib/errors/ValidationError.js +0 -191
  231. package/lib/exporters/MarkdownExporter.js +0 -420
  232. package/lib/exporters/MongoDBExporter.js +0 -162
  233. package/lib/exporters/MySQLExporter.js +0 -212
  234. package/lib/exporters/PostgreSQLExporter.js +0 -289
  235. package/lib/exporters/index.js +0 -24
  236. package/lib/locales/index.js +0 -8
  237. package/lib/utils/LRUCache.js +0 -174
  238. package/lib/utils/SchemaHelper.js +0 -240
  239. package/lib/utils/SchemaUtils.js +0 -445
  240. package/lib/utils/TypeConverter.js +0 -245
  241. package/lib/utils/index.js +0 -13
  242. package/lib/validators/CustomKeywords.js +0 -616
  243. package/lib/validators/index.js +0 -11
@@ -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
-