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