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,7 +1,7 @@
1
1
  # 添加自定义语言包指南
2
2
 
3
- **版本**: v1.2.3
4
- **最后更新**: 2026-03-03
3
+ **版本**: v2.0.0-beta.1
4
+ **最后更新**: 2026-04-30
5
5
 
6
6
  ---
7
7
 
@@ -9,6 +9,11 @@
9
9
 
10
10
  本指南将教你如何为 schema-dsl 添加自定义语言包或扩展现有语言。
11
11
 
12
+ > **Node.js 要求**:`>=18.0.0`
13
+ >
14
+ > **目录加载(Node >=18)默认支持的语言文件格式**:`.js`(CommonJS)、`.cjs`、`.json`、`.jsonc`、`.json5`。
15
+ > **推荐**:如果你的应用是 `type: module` / ESM 项目,优先使用 `.cjs`、`.json`、`.jsonc`、`.json5`。
16
+
12
17
  ---
13
18
 
14
19
  ## 🏗️ 多人协作:子目录拆分语言包(v1.2.3 新增)⭐
@@ -21,34 +26,34 @@
21
26
  project/
22
27
  ├── locales/
23
28
  │ ├── core/ # 公共 code 段:1000-1999(框架层维护)
24
- │ │ ├── zh-CN.js
25
- │ │ └── en-US.js
29
+ │ │ ├── zh-CN.cjs
30
+ │ │ └── en-US.jsonc
26
31
  │ ├── account/ # 账户模块 code 段:10000-10999(开发者A)
27
- │ │ ├── zh-CN.js
28
- │ │ └── en-US.js
32
+ │ │ ├── zh-CN.cjs
33
+ │ │ └── en-US.jsonc
29
34
  │ ├── order/ # 订单模块 code 段:20000-20999(开发者B)
30
- │ │ ├── zh-CN.js
31
- │ │ └── en-US.js
35
+ │ │ ├── zh-CN.json5
36
+ │ │ └── en-US.json5
32
37
  │ └── payment/ # 支付模块 code 段:30000-30999(开发者C)
33
- │ ├── zh-CN.js
34
- │ └── en-US.js
38
+ │ ├── zh-CN.cjs
39
+ │ └── en-US.cjs
35
40
  └── app.js
36
41
  ```
37
42
 
38
43
  ### 每个模块独立维护自己的语言文件
39
44
 
40
45
  ```javascript
41
- // locales/account/zh-CN.js — 开发者A 独立维护,互不干扰
46
+ // locales/account/zh-CN.cjs — 开发者A 独立维护,互不干扰
42
47
  module.exports = {
43
48
  'account.notFound': { code: 10001, message: '账户不存在' },
44
49
  'account.locked': { code: 10002, message: '账户已锁定' },
45
50
  };
46
51
 
47
- // locales/order/zh-CN.js — 开发者B 独立维护
48
- module.exports = {
52
+ // locales/order/zh-CN.json5 — 开发者B 独立维护
53
+ const orderZhCN = {
49
54
  'order.notFound': { code: 20001, message: '订单不存在' },
50
55
  'order.notPaid': { code: 20002, message: '订单未支付' },
51
- };
56
+ }
52
57
  ```
53
58
 
54
59
  ### 应用启动:一行配置,自动递归合并
@@ -79,7 +84,7 @@ dsl.config({
79
84
  // 冲突示例输出:
80
85
  // Error: [schema-dsl] i18n key 冲突 in locale 'zh-CN'
81
86
  // 冲突 key: account.notFound
82
- // 来源文件: /project/locales/account/zh-CN.js
87
+ // 来源文件: /project/locales/account/zh-CN.cjs
83
88
  ```
84
89
 
85
90
  ### Code 段划分建议
@@ -114,13 +119,13 @@ dsl.config({
114
119
  # 项目结构
115
120
  my-project/
116
121
  ├── locales/ # 语言包目录
117
- │ ├── zh-CN.js # 中文(已存在,将被覆盖/合并)
118
- │ ├── en-US.js # 英文(已存在,将被覆盖/合并)
119
- │ └── pt-BR.js # 葡萄牙语(新增)
122
+ │ ├── zh-CN.cjs # 中文(CommonJS / ESM 项目都稳定)
123
+ │ ├── en-US.jsonc # 英文(带注释 / 末尾逗号)
124
+ │ └── pt-BR.json5 # 葡萄牙语(JSON5 风格)
120
125
  └── app.js
121
126
  ```
122
127
 
123
- #### 第2步:定义语言包(`locales/pt-BR.js`)
128
+ #### 第2步:定义语言包(`locales/pt-BR.json5`)
124
129
 
125
130
  ```javascript
126
131
  module.exports = {
@@ -194,8 +199,8 @@ dsl.config({
194
199
  });
195
200
 
196
201
  // 说明:
197
- // 1. 自动扫描 locales/ 目录下的所有 .js 和 .json 文件
198
- // 2. 从文件名提取语言代码(如 pt-BR.js → pt-BR)
202
+ // 1. 自动扫描 locales/ 目录下的 `.js`(CommonJS)、`.cjs`、`.json`、`.jsonc`、`.json5`
203
+ // 2. 从文件名提取语言代码(如 pt-BR.cjs → pt-BR)
199
204
  // 3. 自动加载并注册所有语言包
200
205
  // 4. 用户自定义的语言包会与系统默认语言包合并,用户的优先
201
206
 
@@ -224,7 +229,7 @@ const systemZhCN = {
224
229
  'string.minLength': '{{#label}}长度不能少于{{#limit}}个字符'
225
230
  };
226
231
 
227
- // 用户自定义的 locales/zh-CN.js
232
+ // 用户自定义的 locales/zh-CN.cjs
228
233
  const userZhCN = {
229
234
  'required': '{{#label}}必须填写', // 覆盖系统默认
230
235
  'custom.myError': '自定义错误' // 新增自定义消息
@@ -277,8 +282,7 @@ function validateUser(data, locale) {
277
282
  }
278
283
  ```
279
284
 
280
- }
281
-
285
+ ```javascript
282
286
  // ✅ 正确:应用启动时一次性加载
283
287
  // app.js 启动入口
284
288
  dsl.config({ i18n: './locales' }); // 只加载一次
@@ -322,7 +326,7 @@ const userSchema = dsl({
322
326
 
323
327
  app.post('/api/users', (req, res) => {
324
328
  // 从请求头获取用户语言偏好
325
- const locale = req.headers['accept-language'] || 'en-US';
329
+ const locale = req.headers['accept-language']?.split(',')[0]?.trim() || 'en-US';
326
330
 
327
331
  // 验证(直接切换语言,无需加载)
328
332
  const result = validate(userSchema, req.body, { locale });
@@ -432,21 +436,23 @@ app.post('/api/users', (req, res) => {
432
436
  你可以参考内置的语言包作为模板:
433
437
 
434
438
  ```javascript
439
+ const { Locale } = require('schema-dsl');
440
+
435
441
  // 查看中文语言包
436
- const zhCN = require('schema-dsl/lib/locales/zh-CN');
442
+ const zhCN = Locale.getMessages('zh-CN');
437
443
  console.log(zhCN);
438
444
 
439
445
  // 查看英文语言包
440
- const enUS = require('schema-dsl/lib/locales/en-US');
446
+ const enUS = Locale.getMessages('en-US');
441
447
  console.log(enUS);
442
448
  ```
443
449
 
444
450
  或者直接查看源码:
445
- - 中文:`node_modules/schema-dsl/lib/locales/zh-CN.js`
446
- - 英文:`node_modules/schema-dsl/lib/locales/en-US.js`
447
- - 日语:`node_modules/schema-dsl/lib/locales/ja-JP.js`
448
- - 西班牙语:`node_modules/schema-dsl/lib/locales/es-ES.js`
449
- - 法语:`node_modules/schema-dsl/lib/locales/fr-FR.js`
451
+ - 中文:`src/locales/zh-CN.ts`
452
+ - 英文:`src/locales/en-US.ts`
453
+ - 日语:`src/locales/ja-JP.ts`
454
+ - 西班牙语:`src/locales/es-ES.ts`
455
+ - 法语:`src/locales/fr-FR.ts`
450
456
 
451
457
  ---
452
458
 
@@ -465,9 +471,9 @@ console.log(enUS);
465
471
  如果你为 schema-dsl 添加了新语言包,欢迎提交 Pull Request:
466
472
 
467
473
  1. Fork 项目
468
- 2. 在 `lib/locales/` 目录创建新语言文件(如 `pt-BR.js`)
474
+ 2. 在 `src/locales/` 目录创建新语言文件(如 `pt-BR.ts`)
469
475
  3. 完整翻译所有消息键
470
- 4. 在 `lib/locales/index.js` 中注册新语言
476
+ 4. 在 `src/locales/index.ts` 中注册新语言
471
477
  5. 添加测试用例(在 `test/unit/locales/` 目录)
472
478
  6. 提交 Pull Request
473
479
 
@@ -479,5 +485,12 @@ console.log(enUS);
479
485
 
480
486
  - 查看 [多语言配置指南](./i18n.md)
481
487
  - 查看 [动态多语言配置指南](./dynamic-locale.md)
482
- - 提交 Issue: https://github.com/your-repo/schema-dsl/issues
488
+ - 提交 Issue: https://github.com/vextjs/schema-dsl/issues
489
+
490
+ ---
491
+
492
+ ## 对应示例文件
493
+
494
+ **示例入口**: [add-custom-locale.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/add-custom-locale.ts)
495
+ **说明**: 覆盖 `Locale.addLocale()` 注册新语言、读取消息文本,以及在自定义 locale 下执行验证的最小工作流。
483
496
 
@@ -0,0 +1,24 @@
1
+ # addKeyword 方法
2
+
3
+ `Validator.addKeyword(name, definition)` 用于向底层 AJV 实例注册自定义关键字。
4
+
5
+ 当前实现内部已经兼容 AJV 8 的对象式注册,因此可以继续使用 v1 的两参数写法,而不会把 deprecated 警告暴露给调用方。
6
+
7
+ ```javascript
8
+ const { Validator } = require('schema-dsl');
9
+ const validator = new Validator();
10
+ validator.addKeyword('isEven', {
11
+ type: 'number',
12
+ validate: (_schema, data) => data % 2 === 0
13
+ });
14
+ ```
15
+
16
+ 更多 AJV 关键字定义请参考 AJV 官方文档。
17
+
18
+ ---
19
+
20
+ ## 对应示例文件
21
+
22
+ **示例入口**: [add-keyword.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/add-keyword.ts)
23
+ **说明**: 覆盖 `Validator.addKeyword()` 的最小注册与验证路径,直接展示成功 / 失败两种结果。
24
+