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
package/CHANGELOG.md CHANGED
@@ -1,238 +1,130 @@
1
- # 变更日志 (CHANGELOG)
2
-
3
- > **说明**: 版本概览摘要,详细变更见 [changelogs/](./changelogs/) 目录
4
- > **最后更新**: 2026-03-03
5
-
6
- ---
7
-
8
- ## 版本概览
9
-
10
- | 版本 | 日期 | 变更摘要 | 详细 |
11
- |------|------|---------|------|
12
- | [v1.2.5](./changelogs/v1.2.5.md) | 2026-03-09 | 🚀 新功能:`DslBuilder.toJsonSchema()` — 输出纯净 JSON Schema(自动清理 `_required`/`_customMessages` 等内部标记),下游(如 vext OpenAPI)无需再手动清理 | [查看](./changelogs/v1.2.5.md) |
13
- | [v1.2.4](./changelogs/v1.2.4.md) | 2026-03-09 | 🐛 P1 Bug修复:`enum:a,b,c` 逗号分隔格式解析完全失效 - DslBuilder DslAdapter 均只检测管道符 `\|`,导致最常用的逗号分隔枚举格式被静默忽略 | [查看](./changelogs/v1.2.4.md) |
14
- | [v1.2.3](./changelogs/v1.2.3.md) | 2026-03-03 | 🚀 新功能:i18n 子目录合并 - 多人协作独立维护语言文件,自动递归合并 + 冲突检测 | [查看](./changelogs/v1.2.3.md) |
15
- | [v1.2.2](./changelogs/v1.2.2.md) | 2026-02-06 | 🚀 重大功能:智能类型转换 - 字符串数字自动转换,完美支持 Web API | [查看](./changelogs/v1.2.2.md) |
16
- | [v1.1.8](./changelogs/v1.1.8.md) | 2026-01-30 | 🚀 新功能:智能参数识别 - 支持简化语法 `dsl.error.throw('key', 'locale')` | [查看](./changelogs/v1.1.8.md) |
17
- | [v1.1.7](./changelogs/v1.1.7.md) | 2026-01-27 | 🐛 Bug修复:错误消息路径显示优化 - 所有错误类型的 message 只显示字段名 | [查看](./changelogs/v1.1.7.md) |
18
- | [v1.1.6](./changelogs/v1.1.6.md) | 2026-01-23 | 🐛 Bug修复:enum和additionalProperties错误消息模板变量未替换 | [查看](./changelogs/v1.1.6.md) |
19
- | [v1.1.5](./changelogs/v1.1.5.md) | 2026-01-17 | 🚀 新功能:错误配置对象格式支持 - 语言包支持 `{ code, message }` 对象格式 | [查看](./changelogs/v1.1.5.md) |
20
- | [v1.1.4](./changelogs/v1.1.4.md) | 2026-01-13 | 🔧 TypeScript类型修复:移除重复函数签名 + 多语言文档完善 | [查看](./changelogs/v1.1.4.md) |
21
- | [v1.1.3](./changelogs/v1.1.3.md) | 2026-01-09 | 🐛 Bug修复:类型错误消息模板变量未替换 | [查看](./changelogs/v1.1.3.md) |
22
- | [v1.1.2](./changelogs/v1.1.2.md) | 2026-01-06 | 🎉 新功能:数字比较运算符 + Bug修复 | [查看](./changelogs/v1.1.2.md) |
23
- | [v1.1.1](./changelogs/v1.1.1.md) | 2026-01-06 | 🎉 新功能:ConditionalBuilder 独立消息支持 | [查看](./changelogs/v1.1.1.md) |
24
- | [v1.1.0](./changelogs/v1.1.0.md) | 2026-01-05 | 🎉 重大功能:跨类型联合验证 + 插件系统增强 | [查看](./changelogs/v1.1.0.md) |
25
- | [v1.0.9](./changelogs/v1.0.9.md) | 2026-01-04 | 🎉 重大改进:多语言支持完善 + TypeScript 类型完整 | [查看](./changelogs/v1.0.9.md) |
26
- | v1.0.8 | 2026-01-04 | 优化:错误消息过滤增强 | - |
27
- | v1.0.7 | 2026-01-04 | 修复:dsl.match/dsl.if 嵌套支持 dsl() 包裹 | - |
28
- | v1.0.6 | 2026-01-04 | 🚨 紧急修复:TypeScript 类型污染 | - |
29
- | v1.0.5 | 2026-01-04 | 测试覆盖率提升至 97% | - |
30
- | v1.0.4 | 2025-12-31 | TypeScript 完整支持、validateAsync、ValidationError | - |
31
- | v1.0.3 | 2025-12-31 | ⚠️ 破坏性变更:单值语法修复 | - |
32
- | v1.0.2 | 2025-12-31 | 15个新增验证器、完整文档、75个测试 | - |
33
- | v1.0.1 | 2025-12-31 | 枚举功能、自动类型识别、统一错误消息 | - |
34
- | [v1.0.0](./changelogs/v1.0.0.md) | 2025-12-29 | 初始发布版本 | [查看](./changelogs/v1.0.0.md) |
35
-
36
- > 💡 **提示**: 重要版本的详细变更记录在 [changelogs/](./changelogs/) 目录中。
37
- > 当前已有详细文档的版本:v1.2.3, v1.2.2, v1.1.8, v1.1.7, v1.1.6, v1.1.5, v1.1.4, v1.1.3, v1.1.2, v1.1.1, v1.1.0, v1.0.9, v1.0.0
38
- > 其他版本的详细变更信息请参考项目提交历史或联系维护者。
39
-
40
- ---
41
-
42
- ## 变更统计
43
-
44
- | 版本系列 | 版本数 | 主要改进方向 |
45
- |---------|-------|------------|
46
- | v1.2.x | 2 | i18n子目录合并、智能类型转换、Web API 完美支持 |
47
- | v1.1.x | 9 | 智能参数识别、Bug修复、错误消息优化、错误配置增强、TypeScript类型完善、多语言支持、数字运算符、联合类型 |
48
- | v1.0.x | 10 | 核心功能、验证器、测试覆盖、文档完善 |
49
-
50
- ---
51
-
52
- ## 里程碑版本
53
-
54
- ### v1.2.2 - 智能类型转换 🚀
55
-
56
- **发布日期**: 2026-02-06
57
- **重要性**: ⭐⭐⭐⭐⭐
58
-
59
- **主要改进**:
60
- - 🚀 新增智能类型转换功能,自动将字符串数字转换为 number 类型
61
- - 默认启用,零配置,开箱即用
62
- - 完美支持 Web API 项目(Express、Koa 等)
63
- - 保持类型安全(枚举字段不转换)
64
- - 支持禁用选项 `validate(schema, data, { coerce: false })`
65
- - 新增 23 个测试用例,100% 通过率
66
-
67
- **核心特性**:
68
- - 智能判断:只转换字符串→数字(且必须是有效数字)
69
- - 类型安全:string 字段保持字符串,boolean 被正确拒绝
70
- - 枚举保护:数字枚举 `1|2|3` 不接受字符串 `"1"`
71
- - 边界处理:支持小数、负数、零、trim
72
-
73
- **使用示例**:
74
- ```javascript
75
- const { dsl, validate } = require('schema-dsl');
76
-
77
- const schema = dsl({
78
- userId: 'number!',
79
- page: 'number?',
80
- email: 'email!'
81
- });
82
-
83
- // 字符串自动转换为数字
84
- const result = validate(schema, {
85
- userId: '123', // → 123 (number)
86
- page: '2', // → 2 (number)
87
- email: 'test@example.com'
88
- });
89
-
90
- console.log(result.valid); // true
91
- console.log(typeof result.data.userId); // 'number'
92
- ```
93
-
94
- **技术细节**:
95
- - 新增 `smartCoerceTypes()` 函数(约 60 行)
96
- - 修改文件:`index.js`
97
- - 测试文件:`test/unit/smart-coerce.test.js`(23 个测试)
98
- - 零性能损失,运行时开销可忽略不计
99
-
100
- **详细信息**: [查看 changelogs/v1.2.2.md](./changelogs/v1.2.2.md)
101
-
102
- ---
103
-
104
- ### v1.1.8 - 智能参数识别 🚀
105
-
106
- **发布日期**: 2026-01-30
107
- **重要性**: ⭐⭐⭐⭐⭐
108
-
109
- **主要改进**:
110
- - 🚀 新增智能参数识别功能,支持简化语法 `dsl.error.throw('key', 'locale')`
111
- - ✅ 从4个参数减少到2个参数(不需要参数对象时)
112
- - ✅ 智能识别第2个参数类型:字符串→语言参数,对象→参数对象
113
- - ✅ 所有方法都支持:create、throw、assert
114
- - ✅ 完全向后兼容,现有代码无需修改
115
- - ✅ 新增 17 个测试用例,100%通过率
116
-
117
- **技术细节**:
118
- - 新增 `normalizeParams()` 工具函数
119
- - 修改文件:`lib/errors/I18nError.js`、`index.js`
120
- - 参数识别逻辑:typeof 检查 + Array.isArray 排除
121
- - 零性能损失,运行时开销可忽略不计
122
-
123
- **使用示例**:
124
- ```javascript
125
- // 之前:必须传递空对象
126
- dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
127
-
128
- // 现在:直接传语言参数
129
- dsl.error.throw('account.notFound', 'zh-CN', 404);
130
- ```
131
-
132
- ### v1.1.7 - 错误消息路径显示优化 🐛
133
-
134
- **发布日期**: 2026-01-27
135
- **重要性**: ⭐⭐⭐⭐
136
-
137
- ### v1.1.6 - ErrorFormatter Bug修复 🐛
138
-
139
- **发布日期**: 2026-01-23
140
- **重要性**: ⭐⭐⭐⭐
141
-
142
- **主要改进**:
143
- - 🐛 修复 enum 错误消息模板变量 `{{#valids}}` 未替换问题
144
- - 🐛 修复 additionalProperties 错误消息缺少属性名问题
145
- - ✅ 新增完整的错误消息插值测试(14个测试用例)
146
- - ✅ 确保所有 ajv 错误参数正确映射到模板变量
147
-
148
- ### v1.1.5 - 错误配置对象格式支持 🚀
149
-
150
- **发布日期**: 2026-01-17
151
- **重要性**: ⭐⭐⭐⭐
152
-
153
- **核心改进**:
154
- - ✨ 语言包支持对象格式 `{ code, message }`,统一错误代码管理
155
- - ✨ I18nError 新增 `originalKey` 字段,保留原始 key
156
- - ✨ 多语言共享相同的 `code`,便于前端统一处理
157
- - ✅ 完全向后兼容,字符串格式自动转换为对象
158
- - ✅ `error.is()` 同时支持 code 和 originalKey 判断
159
-
160
- **测试覆盖**: 942 个测试通过 (98.6%)
161
-
162
- ### v1.1.4 - TypeScript类型修复与文档完善 🔧
163
-
164
- **发布日期**: 2026-01-13
165
- **重要性**: ⭐⭐⭐
166
-
167
- **核心改进**:
168
- - ✅ 修复 index.d.ts 中2处重复函数签名(46个类型错误→0个错误)
169
- - ✅ 修复 `dsl.error.assert` 重复签名(L1336-1343)
170
- - ✅ 修复 `I18nError.assert` 重复签名(L1805-1821)
171
- - ✅ 完善多语言运行时支持文档(docs/runtime-locale-support.md)
172
- - ✅ README.md 添加运行时语言指定示例
173
- - ✅ 验证 string? 可选语法完整支持
174
-
175
- **详细信息**: [查看 changelogs/v1.1.4.md](./changelogs/v1.1.4.md)
176
-
177
- ---
178
-
179
- ### v1.1.3 - 类型错误消息模板修复 🐛
180
-
181
- **发布日期**: 2026-01-09
182
- **重要性**: ⭐⭐⭐
183
-
184
- **核心改进**:
185
- - ✅ 修复类型错误消息中 `{{#actual}}` 模板变量未替换问题
186
- - ✅ 错误消息正确显示实际数据类型
187
- - ✅ 向后兼容,无破坏性变更
188
-
189
- **详细信息**: [查看 changelogs/v1.1.3.md](./changelogs/v1.1.3.md)
190
-
191
- ---
192
-
193
- ### v1.1.0 - 跨类型联合验证 🎉
194
-
195
- **发布日期**: 2026-01-05
196
- **重要性**: ⭐⭐⭐⭐⭐
197
-
198
- **核心特性**:
199
- - ✅ 跨类型联合验证(email|phone 可以混合不同类型)
200
- - ✅ 运行时多语言支持(dsl.error.create 可指定 locale 参数)
201
- - ✅ 插件系统增强
202
-
203
- **详细信息**: [查看 changelogs/v1.1.0.md](./changelogs/v1.1.0.md)
204
-
205
- ---
206
-
207
- ### v1.0.9 - 多语言支持完善 🌍
208
-
209
- **发布日期**: 2026-01-04
210
- **重要性**: ⭐⭐⭐⭐
211
-
212
- **核心特性**:
213
- - ✅ 完整的多语言支持(5种语言)
214
- - ✅ TypeScript 类型定义完整
215
- - ✅ I18nError 多语言错误类
216
-
217
- **详细信息**: [查看 changelogs/v1.0.9.md](./changelogs/v1.0.9.md)
218
-
219
- ---
220
-
221
- ### v1.0.0 - 正式发布 🎉
222
-
223
- **发布日期**: 2025-12-29
224
- **重要性**: ⭐⭐⭐⭐⭐
225
-
226
- **核心成就**:
227
- - ✅ 初始发布
228
- - ✅ 简洁的DSL语法
229
- - ✅ 完整的验证功能
230
-
231
- **详细信息**: [查看 changelogs/v1.0.0.md](./changelogs/v1.0.0.md)
232
-
233
- ---
234
-
235
- **完整文档**: [docs/INDEX.md](./docs/INDEX.md)
236
- **GitHub**: [https://github.com/vextjs/schema-dsl](https://github.com/vextjs/schema-dsl)
237
- **npm**: [https://www.npmjs.com/package/schema-dsl](https://www.npmjs.com/package/schema-dsl)
238
-
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ > 📂 **Detailed changes**: see [`changelogs/`](./changelogs/) for full notes on major versions.
6
+
7
+ ---
8
+
9
+ ## Version History
10
+
11
+ | Version | Date | Type | Key Theme |
12
+ |---------|------|------|-----------|
13
+ | [2.0.1] | 2026-05-22 | Patch | Post-release security & correctness fixes: safe-regex bypass, XSS escaping, reset completeness, cache rebuild, SQL injection in exporters |
14
+ | [2.0.0] | 2026-05-09 | Major | Full release: BC-2/4/5/6/7 fixes, string:N compat, English comments, 58 enriched examples, 1095 tests [View](./changelogs/v2.0.0.md) |
15
+ | [2.0.0-beta.2] | 2026-04-12 | Major | Full TypeScript rewrite: ESM+CJS dual format, AJV 8, tsup build, 1052 tests passing [View](./changelogs/v2.0.0-beta.2.md) |
16
+ | [v1.2.5] | 2026-03-09 | Patch | Feature: `DslBuilder.toJsonSchema()` exports clean JSON Schema, strips internal markers |
17
+ | [v1.2.4] | 2026-03-09 | Patch | P1 Fix: `enum:a,b,c` comma-separated format parsing completely broken |
18
+ | [v1.2.3] | 2026-03-03 | Patch | Feature: i18n sub-directory merging; collaborative locale maintenance with auto-merge + conflict detection [View](./changelogs/v1.2.3.md) |
19
+ | [v1.2.2] | 2026-02-06 | Minor | Major feature: smart type coercion — auto-converts string numbers, full Web API support [View](./changelogs/v1.2.2.md) |
20
+ | [v1.1.8] | 2026-01-30 | Patch | Feature: smart argument detection, simplified syntax `dsl.error.throw('key', 'locale')` [View](./changelogs/v1.1.8.md) |
21
+ | [v1.1.7] | 2026-01-27 | Patch | Fix: error message path display — all error types now show field name only |
22
+ | [v1.1.6] | 2026-01-23 | Patch | Fix: enum and additionalProperties error message template variables not substituted [View](./changelogs/v1.1.6.md) |
23
+ | [v1.1.5] | 2026-01-17 | Patch | Feature: error config object format; locale messages now support `{ code, message }` object format [View](./changelogs/v1.1.5.md) |
24
+ | [v1.1.4] | 2026-01-13 | Patch | TS fix: remove duplicate function signatures + multilingual docs improvements [View](./changelogs/v1.1.4.md) |
25
+ | [v1.1.3] | 2026-01-09 | Patch | Fix: type error message template variables not substituted [View](./changelogs/v1.1.3.md) |
26
+ | [v1.1.2] | 2026-01-06 | Patch | Feature: numeric comparison operators + bug fixes [View](./changelogs/v1.1.2.md) |
27
+ | [v1.1.1] | 2026-01-06 | Patch | Feature: ConditionalBuilder independent message support [View](./changelogs/v1.1.1.md) |
28
+ | [v1.1.0] | 2026-01-05 | Minor | Major: cross-type union validation + enhanced plugin system [View](./changelogs/v1.1.0.md) |
29
+ | [v1.0.9] | 2026-01-04 | Patch | Major improvement: complete i18n support + full TypeScript types [View](./changelogs/v1.0.9.md) |
30
+ | v1.0.8 | 2026-01-04 | Patch | Improvement: enhanced error message filtering |
31
+ | v1.0.7 | 2026-01-04 | Patch | Fix: dsl.match/dsl.if nesting now supports dsl() wrapper |
32
+ | v1.0.6 | 2026-01-04 | Patch | 🚨 Critical fix: TypeScript type pollution |
33
+ | v1.0.5 | 2026-01-04 | Patch | Test coverage raised to 97% |
34
+ | v1.0.4 | 2025-12-31 | Patch | Full TypeScript support, validateAsync, ValidationError |
35
+ | v1.0.3 | 2025-12-31 | Patch | ⚠️ Breaking change: single-value syntax fix |
36
+ | v1.0.2 | 2025-12-31 | Patch | 15 new validators, complete docs, 75 tests |
37
+ | v1.0.1 | 2025-12-31 | Patch | Enum support, auto type detection, unified error messages |
38
+ | [v1.0.0] | 2025-12-29 | Pre-release | Initial release [View](./changelogs/v1.0.0.md) |
39
+
40
+ ---
41
+
42
+ ## [2.0.1] — 2026-05-22
43
+
44
+ ### Fixes
45
+
46
+ - **Security (DslBuilder)**: built-in string validators (`domain`, `ip`, `base64`, `jwt`, `phone`, `idCard`, `slugChain`, `creditCard`, `licensePlate`, `postalCode`, `passport`, `username`, `password`) now use a new private `_setPattern()` that bypasses the safe-regex check. Public `.pattern()` still enforces the check for user-supplied patterns; this prevents false-positive ReDoS rejections on pre-approved, production-tested regex patterns.
47
+ - **Security (SchemaUtils)**: `toHTML()` now escapes all dynamic content (`title`, field names, types, labels) through `_escapeHtml()`, preventing XSS when field names or labels contain `<`, `>`, `&`, `"`, or `'`. `toMarkdown()` escapes pipe characters and newlines through `_escapeMdCell()`, preventing broken table rendering.
48
+ - **Security (Exporters)**: `PostgreSQLExporter._formatDefaultValue()` and `MySQLExporter._formatDefaultValue()` now call `_escapeString()` on JSON-stringified object/array default values, preventing SQL injection when default values contain single quotes (e.g. `{ name: "O'Brien" }`). `MySQLExporter` also no longer emits `[object Object]` for object-type defaults.
49
+ - **Correctness (index)**: `resetRuntimeState()` now fully resets all runtime-mutable globals: `_strictMode` (TypeRegistry), custom types (DslBuilder + TypeRegistry), locale registry (Locale.reset()), and user-added pattern keys in `PATTERNS.phone / .idCard / .creditCard` via an initial-keys snapshot — preventing cross-test or cross-tenant leakage.
50
+ - **Correctness (CacheManager)**: the `options` setter now rebuilds the internal `MemoryCache` instance when `maxSize` changes, migrating existing entries to the new capacity. Previously, only the `_maxSize` field was updated while the cache instance retained its original capacity.
51
+ - **Correctness (TypeConverter)**: `toMySQLType()` and `toPostgreSQLType()` no longer map the JSON Schema `"null"` type to the SQL keyword `NULL` (which is a constraint, not a data type). Both now return `TEXT`.
52
+ - **DX (Plugins)**: removed `console.log` calls from `install()` and `uninstall()` in `custom-format`, `custom-validator`, and `custom-type-example` example plugins. Runtime error logging via `console.error` is preserved.
53
+ - **DX (SchemaUtils)**: added JSDoc to `SchemaUtils.validateBatch()` noting that it recompiles the schema on every call (no caching), with a recommendation to use `Validator.validateBatch()` for repeated validations of the same schema.
54
+
55
+ ---
56
+
57
+ ## [2.0.0] — 2026-05-09
58
+
59
+ ### Breaking Changes (v1 → v2)
60
+
61
+ - **BC-2**: `DslAdapter.parseObject()` now returns `ObjectDslBuilder` (chainable: `.strict()`, `.requireAll()`, `.toSchema()`, `.toJsonSchema()`) instead of plain `JSONSchema`. Call `.toSchema()` to get the raw schema.
62
+ - **BC-4**: `DslAdapter.typeMap` is now a Proxy getter; `DslAdapter.registerType()` method added for direct registration.
63
+ - **BC-5**: `ConditionalBuilder.require(field)` method added for v1 field-requirement compatibility.
64
+ - **BC-6**: `Validator.validateAsync()` added; async custom validators in sync `validate()` now return `{ valid: false }` with an error message instead of silently passing.
65
+ - **BC-7**: `string:N` single-value DSL now expands to `{ minLength: N, maxLength: N }` (exactLength compat, consistent with v1 behavior).
66
+
67
+ ### New Features
68
+
69
+ - **ObjectDslBuilder**: New class wrapping object schemas; supports `.strict()`, `.requireAll()`, `.toSchema()`, `.toJsonSchema()`, `.toString()`.
70
+ - **validateAsync()**: Full async validation support with typed return (`Promise<T>`); throws `ValidationError` on failure.
71
+ - **installStringExtensions()**: Opt-in String.prototype extension; auto-installed at module load for v1 compatibility.
72
+
73
+ ### Documentation & Examples
74
+
75
+ - 58 example files in `examples/docs/` fully enriched (90–130+ lines each) with complete API coverage.
76
+ - All code comments translated to English (CJK locales and output strings preserved).
77
+ - `docs/api-reference.md`: fixed 4 doc inconsistencies (string:N behavior, validateAsync signature, LocaleMessage params, exactOptionalPropertyTypes notes).
78
+
79
+ ### Quality
80
+
81
+ - 1095 tests passing (75 test files).
82
+ - 0 TypeScript errors in source and examples.
83
+ - ESM + CJS dual format build.
84
+
85
+ ### Fixes
86
+
87
+ - **Security**: replace the custom regex ReDoS heuristic in `CustomKeywords` with `safe-regex`, so catastrophic patterns such as `((a)+)+$` are rejected before execution.
88
+ - **Validation**: stop caching `DslBuilder.toSchema()` results inside `Validator`, so chain mutations made after the first validation call are honored by both `validate()` and `validateAsync()`.
89
+ - **Validation**: make `ConditionalBuilder` cache `Validator` instances by constructor-level option set, so repeated calls with different `allErrors` / `useDefaults` configurations no longer reuse a stale validator.
90
+ - **Exporters**: fix MySQL integer sizing so `TypeConverter.toMySQLType()` checks both `minimum` and `maximum` before choosing `TINYINT` / `SMALLINT` / `INT`, avoiding undersized column types.
91
+ - **Exporters**: escape Markdown table cell content in `MarkdownExporter`, so field names, constraint text, and multiline descriptions containing `|` or newlines no longer break rendered tables.
92
+ - **Tests**: add focused regression coverage for unsafe regex rejection while preserving the existing invalid-regex error path.
93
+
94
+ ---
95
+
96
+ ## [Unreleased]
97
+
98
+ - docs: aligned 58-to-58 `docs/*.md` ↔ `examples/docs/*.ts` mapping, switched to stable example entry links
99
+ - docs: completed runnable coverage for advanced APIs in `api-reference`, added `ErrorFormatter` reference, corrected `FEATURE-INDEX` method descriptions
100
+ - chore: cleaned up legacy top-level `examples/*` entry paths, unified example entry points and `.tmp` workspace visibility
101
+
102
+ ---
103
+
104
+ ## Links
105
+
106
+ - [GitHub Repository](https://github.com/vextjs/schema-dsl)
107
+ - [Online Documentation](https://vextjs.github.io/schema-dsl)
108
+ - [Detailed Changelogs](./changelogs/)
109
+ - [Contributing Guide](./CONTRIBUTING.md)
110
+
111
+ [Unreleased]: https://github.com/vextjs/schema-dsl/compare/v2.0.1...HEAD
112
+ [2.0.1]: https://github.com/vextjs/schema-dsl/compare/v2.0.0...v2.0.1
113
+ [2.0.0]: https://github.com/vextjs/schema-dsl/compare/v2.0.0-beta.2...v2.0.0
114
+ [2.0.0-beta.2]: https://github.com/vextjs/schema-dsl/releases/tag/v2.0.0-beta.2
115
+ [v1.2.5]: https://github.com/vextjs/schema-dsl/compare/v1.2.4...v1.2.5
116
+ [v1.2.4]: https://github.com/vextjs/schema-dsl/compare/v1.2.3...v1.2.4
117
+ [v1.2.3]: https://github.com/vextjs/schema-dsl/compare/v1.2.2...v1.2.3
118
+ [v1.2.2]: https://github.com/vextjs/schema-dsl/compare/v1.1.8...v1.2.2
119
+ [v1.1.8]: https://github.com/vextjs/schema-dsl/compare/v1.1.7...v1.1.8
120
+ [v1.1.7]: https://github.com/vextjs/schema-dsl/compare/v1.1.6...v1.1.7
121
+ [v1.1.6]: https://github.com/vextjs/schema-dsl/compare/v1.1.5...v1.1.6
122
+ [v1.1.5]: https://github.com/vextjs/schema-dsl/compare/v1.1.4...v1.1.5
123
+ [v1.1.4]: https://github.com/vextjs/schema-dsl/compare/v1.1.3...v1.1.4
124
+ [v1.1.3]: https://github.com/vextjs/schema-dsl/compare/v1.1.2...v1.1.3
125
+ [v1.1.2]: https://github.com/vextjs/schema-dsl/compare/v1.1.1...v1.1.2
126
+ [v1.1.1]: https://github.com/vextjs/schema-dsl/compare/v1.1.0...v1.1.1
127
+ [v1.1.0]: https://github.com/vextjs/schema-dsl/compare/v1.0.9...v1.1.0
128
+ [v1.0.9]: https://github.com/vextjs/schema-dsl/compare/v1.0.8...v1.0.9
129
+ [v1.0.0]: https://github.com/vextjs/schema-dsl/releases/tag/v1.0.0
130
+
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 vextjs
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 vextjs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.