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,156 +0,0 @@
1
- # 用户注册系统示例
2
-
3
- 完整的企业级用户注册验证示例,展示 SchemaIO 的所有高级功能。
4
-
5
- ## 功能展示
6
-
7
- - ✅ 错误消息定制
8
- - ✅ 字段标签
9
- - ✅ 多语言支持
10
- - ✅ 异步验证(数据库检查)
11
- - ✅ 密码强度验证
12
- - ✅ 字段引用(密码确认)
13
- - ✅ 自定义验证器
14
- - ✅ Express路由集成
15
-
16
- ## 文件结构
17
-
18
- ```
19
- examples/user-registration/
20
- ├── README.md # 本文件
21
- ├── schema.js # Schema定义
22
- ├── routes.js # Express路由
23
- ├── database.js # 模拟数据库
24
- └── server.js # 服务器启动
25
- ```
26
-
27
- ## 快速开始
28
-
29
- ### 1. 安装依赖
30
-
31
- ```bash
32
- npm install express body-parser
33
- ```
34
-
35
- ### 2. 启动服务器
36
-
37
- ```bash
38
- node examples/user-registration/server.js
39
- ```
40
-
41
- ### 3. 测试API
42
-
43
- ```bash
44
- # 成功注册
45
- curl -X POST http://localhost:3000/api/register \
46
- -H "Content-Type: application/json" \
47
- -d '{
48
- "username": "john_doe",
49
- "email": "john@example.com",
50
- "password": "Password123",
51
- "confirmPassword": "Password123",
52
- "phone": "13800138000"
53
- }'
54
-
55
- # 验证失败(用户名太短)
56
- curl -X POST http://localhost:3000/api/register \
57
- -H "Content-Type: application/json" \
58
- -d '{
59
- "username": "ab",
60
- "email": "john@example.com",
61
- "password": "Password123",
62
- "confirmPassword": "Password123",
63
- "phone": "13800138000"
64
- }'
65
-
66
- # 密码不一致
67
- curl -X POST http://localhost:3000/api/register \
68
- -H "Content-Type: application/json" \
69
- -d '{
70
- "username": "john_doe",
71
- "email": "john@example.com",
72
- "password": "Password123",
73
- "confirmPassword": "Different123",
74
- "phone": "13800138000"
75
- }'
76
- ```
77
-
78
- ## 多语言测试
79
-
80
- ```bash
81
- # 中文错误消息
82
- curl -X POST http://localhost:3000/api/register \
83
- -H "Content-Type: application/json" \
84
- -H "Accept-Language: zh-CN" \
85
- -d '{ "username": "ab" }'
86
-
87
- # 英文错误消息
88
- curl -X POST http://localhost:3000/api/register \
89
- -H "Content-Type: application/json" \
90
- -H "Accept-Language: en-US" \
91
- -d '{ "username": "ab" }'
92
- ```
93
-
94
- ## Schema说明
95
-
96
- 详见 `schema.js` 文件,包含:
97
-
98
- - 用户名:3-32字符,字母数字下划线,自动转小写
99
- - 邮箱:自动转小写,去空格,异步检查重复
100
- - 密码:8-64字符,必须包含大小写字母和数字
101
- - 确认密码:必须与密码字段一致
102
- - 手机号:中国大陆11位,异步检查重复
103
-
104
- ## 响应格式
105
-
106
- ### 成功响应
107
-
108
- ```json
109
- {
110
- "success": true,
111
- "data": {
112
- "userId": "507f1f77bcf86cd799439011",
113
- "username": "john_doe"
114
- }
115
- }
116
- ```
117
-
118
- ### 验证失败响应
119
-
120
- ```json
121
- {
122
- "success": false,
123
- "code": "VALIDATION_ERROR",
124
- "message": "请检查输入信息",
125
- "errors": [
126
- {
127
- "field": "username",
128
- "message": "用户名长度不能少于3个字符",
129
- "code": "string.min",
130
- "context": {
131
- "label": "用户名",
132
- "limit": 3,
133
- "value": "ab"
134
- }
135
- }
136
- ]
137
- }
138
- ```
139
-
140
- ## 技术要点
141
-
142
- 1. **错误消息定制**: 每个字段都有友好的中文错误提示
143
- 2. **字段标签**: 使用 `.label()` 设置字段的友好名称
144
- 3. **异步验证**: 使用 `.custom()` 实现数据库重复检查
145
- 4. **密码确认**: 使用 `.valid(ref('password'))` 引用密码字段
146
- 5. **自动转换**: 使用 `.lowercase()` 和 `.trim()` 自动清洗数据
147
- 6. **多语言**: 根据 `Accept-Language` 头自动切换语言
148
-
149
- ## 扩展建议
150
-
151
- 1. 添加验证码验证
152
- 2. 添加邀请码功能
153
- 3. 集成真实数据库(MongoDB/MySQL)
154
- 4. 添加邮箱验证
155
- 5. 添加手机号验证码
156
-
@@ -1,92 +0,0 @@
1
- /**
2
- * Express路由实现
3
- * 展示如何在实际项目中使用SchemaIO
4
- */
5
-
6
- const express = require('express');
7
- const { createRegisterSchema, db } = require('./schema');
8
-
9
- const router = express.Router();
10
-
11
- /**
12
- * 注册API
13
- * POST /api/register
14
- */
15
- router.post('/register', async (req, res) => {
16
- try {
17
- // 获取用户语言(从请求头)
18
- const userLang = req.headers['accept-language'] || 'zh-CN';
19
- const lang = userLang.startsWith('zh') ? 'zh-CN' : 'en-US';
20
-
21
- // 创建Schema
22
- const schema = createRegisterSchema(lang);
23
-
24
- // 验证数据(传入整个body作为context用于password确认)
25
- const result = await schema.validate(req.body, {
26
- abortEarly: false, // 收集所有错误
27
- context: req.body // 传递上下文给自定义验证器
28
- });
29
-
30
- if (!result.isValid) {
31
- return res.status(400).json({
32
- success: false,
33
- code: 'VALIDATION_ERROR',
34
- message: lang === 'zh-CN' ? '请检查输入信息' : 'Please check your input',
35
- errors: result.errors.map(err => ({
36
- field: err.path ? err.path.join('.') : err.context?.key,
37
- message: err.message,
38
- code: err.type,
39
- context: err.context
40
- }))
41
- });
42
- }
43
-
44
- // 创建用户(模拟)
45
- const newUser = {
46
- id: Date.now().toString(),
47
- username: result.data.username,
48
- email: result.data.email,
49
- phone: result.data.phone,
50
- createdAt: new Date().toISOString()
51
- };
52
-
53
- db.users.push(newUser);
54
-
55
- // 返回成功
56
- res.json({
57
- success: true,
58
- message: lang === 'zh-CN' ? '注册成功' : 'Registration successful',
59
- data: {
60
- userId: newUser.id,
61
- username: newUser.username
62
- }
63
- });
64
-
65
- } catch (error) {
66
- console.error('注册失败:', error);
67
- res.status(500).json({
68
- success: false,
69
- code: 'SERVER_ERROR',
70
- message: '服务器内部错误'
71
- });
72
- }
73
- });
74
-
75
- /**
76
- * 获取已注册用户列表(测试用)
77
- * GET /api/users
78
- */
79
- router.get('/users', (req, res) => {
80
- res.json({
81
- success: true,
82
- data: db.users.map(u => ({
83
- username: u.username,
84
- email: u.email,
85
- phone: u.phone
86
- }))
87
- });
88
- });
89
-
90
- module.exports = router;
91
-
92
-
@@ -1,150 +0,0 @@
1
- /**
2
- * 用户注册Schema定义 v2.0.1
3
- *
4
- * 展示所有高级功能:
5
- * - ✨ String扩展链式调用
6
- * - 错误消息定制
7
- * - 字段标签
8
- * - 多语言支持
9
- * - 自定义验证器(异步)
10
- */
11
-
12
- const { dsl } = require('../../index');
13
- const Locale = require('../../lib/core/Locale');
14
-
15
- // 模拟数据库
16
- const db = {
17
- users: [
18
- { username: 'admin', email: 'admin@example.com', phone: '13800138000' }
19
- ]
20
- };
21
-
22
- /**
23
- * 检查用户名是否已存在
24
- */
25
- async function checkUsernameExists(username) {
26
- return new Promise((resolve) => {
27
- setTimeout(() => {
28
- const exists = db.users.some(u => u.username === username);
29
- resolve(exists);
30
- }, 100);
31
- });
32
- }
33
-
34
- /**
35
- * 检查邮箱是否已存在
36
- */
37
- async function checkEmailExists(email) {
38
- return new Promise((resolve) => {
39
- setTimeout(() => {
40
- const exists = db.users.some(u => u.email === email);
41
- resolve(exists);
42
- }, 100);
43
- });
44
- }
45
-
46
- /**
47
- * 检查手机号是否已存在
48
- */
49
- async function checkPhoneExists(phone) {
50
- return new Promise((resolve) => {
51
- setTimeout(() => {
52
- const exists = db.users.some(u => u.phone === phone);
53
- resolve(exists);
54
- }, 100);
55
- });
56
- }
57
-
58
- /**
59
- * 注册Schema定义(使用 v2.0.1 String扩展)
60
- */
61
- function createRegisterSchema(lang = 'zh-CN') {
62
- // 设置语言
63
- Locale.setLocale(lang);
64
-
65
- return dsl({
66
- // ✨ 用户名:String扩展 + 自定义验证
67
- username: 'string:3-32!'
68
- .pattern(/^[a-zA-Z0-9_]+$/)
69
- .label('用户名')
70
- .messages({
71
- 'min': '{{#label}}长度不能少于{{#limit}}个字符',
72
- 'max': '{{#label}}长度不能超过{{#limit}}个字符',
73
- 'pattern': '{{#label}}只能包含字母、数字和下划线'
74
- })
75
- .custom(async (value) => {
76
- const exists = await checkUsernameExists(value);
77
- if (exists) {
78
- return { error: 'username.exists', message: '用户名已被占用,请换一个试试' };
79
- }
80
- return true;
81
- }),
82
-
83
- // ✨ 邮箱:String扩展 + 异步验证
84
- email: 'email!'
85
- .label('邮箱地址')
86
- .messages({
87
- 'format.email': '请输入有效的{{#label}}'
88
- })
89
- .custom(async (value) => {
90
- const exists = await checkEmailExists(value);
91
- if (exists) {
92
- return { error: 'email.exists', message: '该邮箱已被注册' };
93
- }
94
- return true;
95
- }),
96
-
97
- // ✨ 密码:String扩展 + 复杂正则
98
- password: 'string:8-64!'
99
- .pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$/)
100
- .label('密码')
101
- .messages({
102
- 'min': '{{#label}}长度不能少于{{#limit}}位',
103
- 'max': '{{#label}}长度不能超过{{#limit}}位',
104
- 'pattern': '{{#label}}必须包含大小写字母和数字'
105
- }),
106
-
107
- // ✨ 确认密码:String扩展
108
- confirmPassword: 'string!'
109
- .label('确认密码')
110
- .messages({
111
- 'password.mismatch': '两次输入的密码不一致'
112
- })
113
- .custom((value, context) => {
114
- // 临时实现:手动检查password字段
115
- if (context && context.password && value !== context.password) {
116
- return { error: 'password.mismatch', message: '两次输入的密码不一致' };
117
- }
118
- return true;
119
- })
120
- .required(),
121
-
122
- // ✨ 手机号:String扩展 + 异步验证
123
- phone: 'string:11!'
124
- .pattern(/^1[3-9]\d{9}$/)
125
- .label('手机号')
126
- .messages({
127
- 'pattern': '请输入正确的{{#label}}格式'
128
- })
129
- .custom(async (value) => {
130
- const exists = await checkPhoneExists(value);
131
- if (exists) {
132
- return { error: 'phone.exists', message: '该手机号已被注册' };
133
- }
134
- return true;
135
- }),
136
-
137
- // 简单字段:纯DSL
138
- agreeTerms: 'boolean!'
139
- });
140
- }
141
-
142
- module.exports = {
143
- createRegisterSchema,
144
- db,
145
- checkUsernameExists,
146
- checkEmailExists,
147
- checkPhoneExists
148
- };
149
-
150
-
@@ -1,74 +0,0 @@
1
- /**
2
- * 用户注册服务器
3
- *
4
- * 启动方法:node examples/user-registration/server.js
5
- */
6
-
7
- const express = require('express');
8
- const bodyParser = require('body-parser');
9
- const routes = require('./routes');
10
-
11
- const app = express();
12
- const PORT = process.env.PORT || 3000;
13
-
14
- // 中间件
15
- app.use(bodyParser.json());
16
- app.use(bodyParser.urlencoded({ extended: true }));
17
-
18
- // 路由
19
- app.use('/api', routes);
20
-
21
- // 首页
22
- app.get('/', (req, res) => {
23
- res.send(`
24
- <h1>SchemaIO 用户注册示例</h1>
25
- <p>请使用POST请求测试API:</p>
26
- <pre>
27
- POST http://localhost:${PORT}/api/register
28
- Content-Type: application/json
29
- Accept-Language: zh-CN
30
-
31
- {
32
- "username": "john_doe",
33
- "email": "john@example.com",
34
- "password": "Password123",
35
- "confirmPassword": "Password123",
36
- "phone": "13800138001",
37
- "agreeTerms": true
38
- }
39
- </pre>
40
- <p><a href="/api/users">查看已注册用户</a></p>
41
- `);
42
- });
43
-
44
- // 错误处理
45
- app.use((err, req, res, next) => {
46
- console.error(err.stack);
47
- res.status(500).json({
48
- success: false,
49
- code: 'SERVER_ERROR',
50
- message: '服务器内部错误'
51
- });
52
- });
53
-
54
- // 启动服务器
55
- app.listen(PORT, () => {
56
- console.log(`
57
- ========================================
58
- 用户注册示例服务器已启动
59
- ========================================
60
- 地址: http://localhost:${PORT}
61
- API: http://localhost:${PORT}/api/register
62
-
63
- 测试命令:
64
- curl -X POST http://localhost:${PORT}/api/register \\
65
- -H "Content-Type: application/json" \\
66
- -H "Accept-Language: zh-CN" \\
67
- -d '{"username":"test","email":"test@example.com","password":"Password123","confirmPassword":"Password123","phone":"13800138001","agreeTerms":true}'
68
- ========================================
69
- `);
70
- });
71
-
72
- module.exports = app;
73
-
74
-