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
@@ -0,0 +1,324 @@
1
+ # schema-dsl 文档索引
2
+
3
+ > **更新时间**: 2026-05-06
4
+ > **用途**: 所有文档的快速导航
5
+ > **在线文档**: https://schema-dsl.github.io
6
+ > **文档数量**: `README.md + docs/*.md` 共 58 份
7
+
8
+ ---
9
+
10
+ ## 📑 目录
11
+
12
+ ### 快速导航
13
+ - [快速开始](#doc-index-quick-start) - 入门必读
14
+ - [核心文档](#doc-index-core-docs) - 主要功能文档
15
+ - [功能索引](#doc-index-feature-map) - 按功能查找
16
+ - [导出器](#doc-index-exporters) - 数据库 Schema 导出
17
+ - [工具类](#doc-index-utilities) - 辅助工具
18
+ - [使用指南](#doc-index-guides) - 完整教程
19
+ - [补充文档](#doc-index-supplemental) - 其余未在专题区展开的文档
20
+ - [故障排查](#doc-index-troubleshooting) - 问题解决
21
+ - [示例代码](#doc-index-examples) - 完整示例
22
+ - [常见问题](#doc-index-faq) - FAQ
23
+
24
+ ---
25
+
26
+ <a id="doc-index-quick-start"></a>
27
+
28
+ ## 🚀 快速开始
29
+
30
+ | 文档 | 阅读时间 | 说明 |
31
+ |------|----------|------|
32
+ | [README.md](https://github.com/vextjs/schema-dsl/blob/main/README.md) | 3分钟 | 项目介绍、安装和快速开始 ⭐ |
33
+ | [quick-start.md](quick-start.md) | 5分钟 | 5分钟快速上手教程 ⭐ |
34
+ | [design-philosophy.md](design-philosophy.md) | 15分钟 | **设计理念与性能权衡** ⭐⭐⭐ |
35
+ | [FEATURE-INDEX.md](FEATURE-INDEX.md) | 10分钟 | 完整功能索引 ⭐ |
36
+ | [best-practices.md](best-practices.md) | 15分钟 | 最佳实践指南 ⭐⭐⭐ |
37
+ | [faq.md](faq.md) | 5分钟 | 常见问题解答 |
38
+
39
+ ---
40
+
41
+ <a id="doc-index-core-docs"></a>
42
+
43
+ ## 📖 核心文档
44
+
45
+ ### DSL 语法(核心功能)
46
+
47
+ | 文档 | 说明 |
48
+ |------|------|
49
+ | [dsl-syntax.md](dsl-syntax.md) | **DSL语法完整指南**(最重要)⭐⭐⭐ |
50
+ | [string-extensions.md](string-extensions.md) | **String扩展文档** ⭐⭐ |
51
+ | [plugin-system.md](plugin-system.md) | **插件系统指南** ⭐⭐ |
52
+ | [api-reference.md](api-reference.md) | API完整参考 ⭐⭐ |
53
+ | [validate.md](validate.md) | validate方法详解 ⭐ |
54
+ | [**validate-async.md**](validate-async.md) | **异步验证方法详解** ⭐⭐⭐ |
55
+ | [**schema-utils-chaining.md**](schema-utils-chaining.md) | **Schema链式复用方法** ⭐⭐⭐ |
56
+ | [**schema-utils-best-practices.md**](schema-utils-best-practices.md) | **SchemaUtils最佳实践与常见陷阱** ⭐⭐⭐ |
57
+ | [**schema-utils-advanced-issues.md**](schema-utils-advanced-issues.md) | **SchemaUtils深入问题分析** ⭐⭐ |
58
+
59
+ ---
60
+
61
+ <a id="doc-index-feature-map"></a>
62
+
63
+ ## 🎯 功能索引
64
+
65
+ ### 核心API
66
+
67
+ | 功能 | 文档 | 代码位置 |
68
+ |------|------|---------|
69
+ | dsl() 函数 | [api-reference.md](api-reference.md#dsl-函数) | `src/index.ts` / `src/adapters/DslAdapter.ts` |
70
+ | DslBuilder 类 | [api-reference.md](api-reference.md#dslbuilder-类) | `src/core/DslBuilder.ts` |
71
+ | String 扩展 | [string-extensions.md](string-extensions.md) | `src/core/StringExtensions.ts` |
72
+ | Validator 类 | [validate.md](validate.md) | `src/core/Validator.ts` |
73
+ | validate() 函数 | [api-reference.md](api-reference.md) | `src/index.ts` |
74
+ | validateAsync() 函数 | [validate-async.md](validate-async.md) | `src/index.ts` |
75
+ | ValidationError 类 | [validate-async.md](validate-async.md#validationerror) | `src/errors/ValidationError.ts` |
76
+ | SchemaUtils 链式调用 | [schema-utils-chaining.md](schema-utils-chaining.md) | `src/utils/SchemaUtils.ts` |
77
+
78
+
79
+ ---
80
+
81
+ <a id="doc-index-exporters"></a>
82
+
83
+ ## 🗄️ 导出器
84
+
85
+ > 将 JSON Schema 转换为数据库 DDL 和验证规则
86
+
87
+ > ⚠️ **重要提示**: 请先阅读 [**导出限制说明**](export-limitations.md),了解哪些特性无法导出到数据库 Schema。
88
+
89
+ ### 导出限制说明 ⚠️
90
+
91
+ | 文档 | 说明 |
92
+ |------|------|
93
+ | [**export-limitations.md**](export-limitations.md) | **导出限制完整说明**(必读)⭐⭐⭐ |
94
+
95
+ **主要内容**:
96
+ - ❌ 不支持导出的特性(条件验证、自定义验证器等)
97
+ - ⚠️ 部分支持的特性(正则、范围、枚举等)
98
+ - ✅ 完全支持的特性(基础类型、必填约束等)
99
+ - 数据库特定限制对比(MongoDB/MySQL/PostgreSQL)
100
+ - 最佳实践建议(分层验证、文档化约束等)
101
+
102
+ ### MongoDB 导出器
103
+
104
+ | 文档 | 说明 |
105
+ |------|------|
106
+ | [mongodb-exporter.md](mongodb-exporter.md) | MongoDB 导出器完整指南 |
107
+
108
+ **主要功能**:
109
+ - `export()` - 导出 $jsonSchema 验证规则
110
+ - `generateCreateCommand()` - 生成创建集合命令(含验证)
111
+ - `generateCommand()` - 生成完整 runCommand 命令
112
+ - `MongoDBExporter.export()` - 静态快速导出方法
113
+
114
+ ### MySQL 导出器
115
+
116
+ | 文档 | 说明 |
117
+ |------|------|
118
+ | [mysql-exporter.md](mysql-exporter.md) | MySQL 导出器完整指南 |
119
+
120
+ **主要功能**:
121
+ - `export()` - 导出 CREATE TABLE DDL
122
+ - `generateIndex()` - 生成 CREATE INDEX DDL
123
+ - 支持 ENGINE、CHARSET、COLLATE 配置
124
+
125
+ ### PostgreSQL 导出器
126
+
127
+ | 文档 | 说明 |
128
+ |------|------|
129
+ | [postgresql-exporter.md](postgresql-exporter.md) | PostgreSQL 导出器完整指南 |
130
+
131
+ **主要功能**:
132
+ - `export()` - 导出 CREATE TABLE DDL(含 CHECK 约束)
133
+ - `generateIndex()` - 生成索引 DDL(支持 btree/gin/gist/hash)
134
+ - 支持 Schema 命名空间和 COMMENT
135
+
136
+ ---
137
+
138
+ <a id="doc-index-utilities"></a>
139
+
140
+ ## 🛠️ 工具类(Utilities)
141
+
142
+ | 文档 | 说明 |
143
+ |------|------|
144
+ | [type-converter.md](type-converter.md) | TypeConverter - 类型转换工具 |
145
+ | [schema-helper.md](schema-helper.md) | SchemaHelper - Schema 辅助工具 |
146
+ | [cache-manager.md](cache-manager.md) | CacheManager - LRU缓存管理 |
147
+
148
+ ### TypeConverter 主要功能
149
+ - `toMongoDBType()` - 转换为 MongoDB 类型
150
+ - `toMySQLType()` - 转换为 MySQL 类型
151
+ - `toPostgreSQLType()` - 转换为 PostgreSQL 类型
152
+ - `extractConstraints()` - 提取约束信息
153
+ - `mergeSchemas()` - 合并多个 Schema
154
+
155
+ ### SchemaHelper 主要功能
156
+ - `isValidSchema()` - 验证 Schema 合法性
157
+ - `cloneSchema()` - 深度克隆 Schema
158
+ - `flattenSchema()` - 扁平化嵌套 Schema
159
+ - `getFieldPaths()` - 获取所有字段路径
160
+ - `summarizeSchema()` - 生成 Schema 摘要
161
+
162
+ ### CacheManager 主要功能
163
+ - LRU 缓存策略(最近最少使用淘汰)
164
+ - TTL 过期支持
165
+ - 缓存统计(命中率、大小等)
166
+ - 线程安全设计
167
+
168
+ ---
169
+
170
+ <a id="doc-index-guides"></a>
171
+
172
+ ## 📖 使用指南(Guides)
173
+
174
+ | 文档 | 说明 |
175
+ |------|------|
176
+ | [validation-guide.md](validation-guide.md) | 数据验证完整指南 |
177
+ | [export-guide.md](export-guide.md) | 数据库导出完整指南 |
178
+ | [error-handling.md](error-handling.md) | 错误处理最佳实践 |
179
+
180
+ ### 验证指南内容
181
+ - 基础验证流程
182
+ - 字段类型验证(字符串/数字/布尔/数组/对象)
183
+ - 常用业务验证模式
184
+ - 批量验证与性能优化
185
+ - 错误处理最佳实践
186
+
187
+ ### 导出指南内容
188
+ - MongoDB/MySQL/PostgreSQL 导出对比
189
+ - 配置与自定义选项
190
+ - 自动化迁移脚本
191
+ - 版本管理与最佳实践
192
+ - **⚠️ [导出限制说明](export-limitations.md) - 哪些特性无法导出** ⭐⭐⭐
193
+
194
+
195
+ - 数据库导出概述
196
+ - MongoDB/MySQL/PostgreSQL 导出教程
197
+ - 多数据库同步方案
198
+ - 类型映射参考表
199
+ - 最佳实践与常见问题
200
+
201
+ ---
202
+
203
+ <a id="doc-index-supplemental"></a>
204
+
205
+ ## 🧩 补充文档
206
+
207
+ > 上方专题区主要按学习路径和主题组织;以下补充索引列出当前尚未在专题区单独展开的其余文档,确保导航覆盖 `docs/*.md` 全量文档。
208
+
209
+ | 文档 | 标题 / 说明 |
210
+ |------|-------------|
211
+ | [add-custom-locale.md](add-custom-locale.md) | 添加自定义语言包指南 |
212
+ | [add-keyword.md](add-keyword.md) | addKeyword 方法 |
213
+ | [api.md](api.md) | API 参考入口 |
214
+ | [best-practices-project-structure.md](best-practices-project-structure.md) | Schema-DSL 项目最佳实践示例 |
215
+ | [compile.md](compile.md) | compile 方法 |
216
+ | [conditional-api.md](conditional-api.md) | 链式条件 API - ConditionalBuilder |
217
+ | [custom-extensions-guide.md](custom-extensions-guide.md) | 自定义扩展指南 |
218
+ | [dynamic-locale.md](dynamic-locale.md) | 动态多语言配置指南 |
219
+ | [enum.md](enum.md) | 枚举功能文档 |
220
+ | [frontend-i18n-guide.md](frontend-i18n-guide.md) | 前端动态切换语言 - 最佳实践指南 |
221
+ | [i18n-user-guide.md](i18n-user-guide.md) | 多语言支持用户指南 |
222
+ | [i18n.md](i18n.md) | 多语言配置指南 |
223
+ | [index.md](index.md) | 站点首页文案(文件内未单独声明 H1) |
224
+ | [json-schema-basics.md](json-schema-basics.md) | JSON Schema 基础 |
225
+ | [label-vs-description.md](label-vs-description.md) | label vs description 使用指南 |
226
+ | [markdown-exporter.md](markdown-exporter.md) | Markdown 导出器 |
227
+ | [multi-language.md](multi-language.md) | 多语言支持 |
228
+ | [multi-type-support.md](multi-type-support.md) | 多类型支持设计说明 |
229
+ | [number-operators.md](number-operators.md) | 数字比较运算符 (v1.1.2+) |
230
+ | [optional-marker-guide.md](optional-marker-guide.md) | schema-dsl 可选标记 ? 支持 |
231
+ | [performance-guide.md](performance-guide.md) | 性能优化指南 |
232
+ | [plugin-type-registration.md](plugin-type-registration.md) | 自定义类型注册 |
233
+ | [runtime-locale-support.md](runtime-locale-support.md) | 运行时多语言支持 - schema-dsl |
234
+ | [schema-utils.md](schema-utils.md) | Schema 工具函数文档 |
235
+ | [security-checklist.md](security-checklist.md) | 安全检查清单 |
236
+ | [troubleshooting.md](troubleshooting.md) | 常见问题排查指南 |
237
+ | [type-reference.md](type-reference.md) | schema-dsl 类型参考 |
238
+ | [typescript-guide.md](typescript-guide.md) | TypeScript 使用指南 |
239
+ | [union-type-guide.md](union-type-guide.md) | 一个字段支持多种类型 |
240
+ | [union-types.md](union-types.md) | 跨类型联合验证 - types: 语法 |
241
+ | [validate-batch.md](validate-batch.md) | validateBatch 方法 |
242
+ | [validate-dsl-object-support.md](validate-dsl-object-support.md) | validate() 函数支持 DSL 对象说明 |
243
+ | [validator.md](validator.md) | Validator 类概述 |
244
+
245
+ ---
246
+
247
+ <a id="doc-index-examples"></a>
248
+
249
+ ## 📝 示例代码(Examples)
250
+
251
+ | 文件 | 说明 |
252
+ |------|------|
253
+ | [quick-start.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/quick-start.ts) | 快速开始示例 |
254
+ | [dsl-syntax.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/dsl-syntax.ts) | DSL 风格完整示例 |
255
+ | [string-extensions.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/string-extensions.ts) | String 扩展示例 |
256
+ | [troubleshooting.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/troubleshooting.ts) | 排障与错误定位示例 |
257
+
258
+ ---
259
+
260
+ <a id="doc-index-faq"></a>
261
+
262
+ ## ❓ 常见问题(FAQ)
263
+
264
+ | 文档 | 说明 |
265
+ |------|------|
266
+ | [faq.md](faq.md) | 常见问题与解答 |
267
+
268
+ **热门问题**:
269
+ - DSL 语法与 Joi 语法的区别?
270
+ - 如何自定义验证规则?
271
+ - 如何优化验证性能?
272
+ - 不同数据库的类型映射?
273
+ - 如何处理验证错误?
274
+
275
+ ---
276
+
277
+ <a id="doc-index-troubleshooting"></a>
278
+
279
+ ## 🔧 开发指南
280
+
281
+ | 文档 | 说明 |
282
+ |------|------|
283
+ | [CONTRIBUTING.md](https://github.com/vextjs/schema-dsl/blob/main/CONTRIBUTING.md) | 贡献指南 |
284
+
285
+ ---
286
+
287
+ ## 📊 版本信息
288
+
289
+ | 文档 | 说明 |
290
+ |------|------|
291
+ | [STATUS.md](https://github.com/vextjs/schema-dsl/blob/main/STATUS.md) | 项目状态(当前测试与发布状态)|
292
+ | [CHANGELOG.md](https://github.com/vextjs/schema-dsl/blob/main/CHANGELOG.md) | 更新日志 |
293
+
294
+ ---
295
+
296
+ ## 📁 文档统计
297
+
298
+ | 指标 | 当前值 |
299
+ |------|--------|
300
+ | `docs/*.md` 文档数 | **58** |
301
+ | `README.md + docs/*.md` 文档数 | **59** |
302
+ | 文档总行数 | **持续演进(以仓库实时内容为准)** |
303
+ | 测试文件数 | **67** |
304
+ | 最近一次全量验证 | **67 files / 1052 tests passed** |
305
+
306
+ ---
307
+
308
+ **图例说明**:
309
+ - ⭐ 重点推荐文档
310
+ - ⭐⭐ 核心文档
311
+ - ⭐⭐⭐ 必读文档
312
+
313
+ ---
314
+
315
+ ## 对应示例文件
316
+
317
+ **示例入口**: [doc-index.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/doc-index.ts)
318
+ **说明**: 用一个最小入口脚本串起快速开始、编译校验和文档导出,帮助读者从索引页直接落到可运行示例。
319
+
320
+ ---
321
+
322
+ **最后更新**: 2026-05-08
323
+
324
+
@@ -1,6 +1,6 @@
1
1
  # DSL 语法完整指南
2
2
 
3
- > **更新时间**: 2025-12-25
3
+ > **更新时间**: 2026-05-22
4
4
 
5
5
  ---
6
6
 
@@ -57,14 +57,35 @@ const schema = dsl({
57
57
  |------|-----|------|
58
58
  | 邮箱 | `email` | 邮箱地址 |
59
59
  | URL | `url` | 网址 |
60
+ | URI | `uri` | URI 地址 |
60
61
  | UUID | `uuid` | UUID格式 |
61
62
  | 日期 | `date` | YYYY-MM-DD |
62
63
  | 日期时间 | `datetime` | ISO 8601 |
63
64
  | 时间 | `time` | HH:mm:ss |
65
+ | 主机名 | `hostname` | 主机名 |
66
+ | IP(IPv4 / IPv6) | `ip` | 自动接受 IPv4 或 IPv6 |
64
67
  | IPv4 | `ipv4` | IPv4地址 |
65
68
  | IPv6 | `ipv6` | IPv6地址 |
66
69
  | 二进制 | `binary` | Base64编码 |
67
70
 
71
+ ### 特殊类型
72
+
73
+ | 类型 | DSL | 说明 |
74
+ |------|-----|------|
75
+ | ObjectId | `objectId` | MongoDB ObjectId |
76
+ | 十六进制颜色 | `hexColor` | CSS 十六进制颜色 |
77
+ | MAC 地址 | `macAddress` | MAC 地址 |
78
+ | Cron 表达式 | `cron` | 标准 Cron 表达式 |
79
+ | URL Slug | `slug` | 小写字母/数字/中横线组成的 URL 友好标识 |
80
+ | 中文姓名 | `chineseName` | 2 到 10 个中文字符 |
81
+ | 纯中文文本 | `chinese` | 仅允许中文字符 |
82
+ | 邮箱域名校验 | `emailDomain` | 邮箱格式基础上的域名约束类型 |
83
+ | 字母数字 | `alphanum` | 仅字母与数字 |
84
+ | 全小写字符串 | `lower` | 自动约束为小写字符串 |
85
+ | 全大写字符串 | `upper` | 自动约束为大写字符串 |
86
+ | JSON 字符串 | `json` | 内容需为合法 JSON 字符串 |
87
+ | 端口号 | `port` | 整数端口号 |
88
+
68
89
 
69
90
  ---
70
91
 
@@ -100,9 +121,9 @@ const schema = dsl({
100
121
  ```
101
122
 
102
123
  **说明**:
103
- - `!` - 必填标记,字段不能为空
104
- - `?` - 可选标记,字段可以为空(默认行为)
105
- - 不加标记 - 默认可选
124
+ - `!` - 必填标记,字段必须存在
125
+ - `?` - 可选标记,字段可省略(显式表达)
126
+ - 不加标记 - 默认可选(字段可省略)
106
127
 
107
128
  **推荐**:
108
129
  - 使用 `!` 明确标记必填字段
@@ -137,10 +158,10 @@ const schema2 = dsl({
137
158
  ### 1. 字符串长度
138
159
 
139
160
  ```javascript
140
- 'string:10' // 最大长度10
141
- 'string:-10' // 最大长度10(明确语法)
142
- 'string:3-32' // 长度3-32
143
- 'string:10-' // 最小长度10
161
+ 'string:10' // 精确长度10(exactLength:minLength=10, maxLength=10)
162
+ 'string:-10' // 最大长度10
163
+ 'string:3-32' // 长度范围3-32
164
+ 'string:10-' // 最小长度10(无最大限制)
144
165
  ```
145
166
 
146
167
  **示例**:
@@ -181,7 +202,26 @@ const schema = dsl({
181
202
  });
182
203
  ```
183
204
 
184
- ### 4. 特殊约束
205
+ ### 4. `types:` 联合类型
206
+
207
+ 当一个字段需要接受多种不同类型时,可以使用 `types:` 前缀生成联合类型:
208
+
209
+ ```javascript
210
+ const schema = dsl({
211
+ contact: 'types:email|phone',
212
+ price: 'types:number:0-|string:1-20',
213
+ payload: 'types:object|array<object>'
214
+ });
215
+ ```
216
+
217
+ 这个语法会被编译为 `oneOf` 结构,适合表达“满足其中任意一种类型即可”的场景。
218
+
219
+ **适用场景**:
220
+ - 联系方式允许邮箱或手机号
221
+ - 价格字段允许数值或说明字符串
222
+ - 兼容历史接口中同字段的多种输入格式
223
+
224
+ ### 5. 特殊约束
185
225
 
186
226
  支持特定格式的约束:
187
227
 
@@ -380,6 +420,8 @@ const schema = dsl({
380
420
 
381
421
  ### 1. 链式调用
382
422
 
423
+ > ⚠️ `.custom()` 当前仅支持同步自定义逻辑;异步业务校验请在验证通过后单独执行。
424
+
383
425
  ```javascript
384
426
  const schema = dsl({
385
427
  username: 'string:3-32!'
@@ -392,9 +434,8 @@ const schema = dsl({
392
434
  email: 'email!'
393
435
  .label('邮箱地址')
394
436
  .description('用于登录和接收通知')
395
- .custom(async (value) => {
396
- const exists = await checkEmailExists(value);
397
- if (exists) return '邮箱已被占用';
437
+ .custom((value) => {
438
+ if (value.endsWith('@blocked.example')) return '该邮箱域名不允许注册';
398
439
  })
399
440
  });
400
441
  ```
@@ -479,16 +520,18 @@ const schema = dsl({
479
520
  'string!@custom' // ❌ 不支持
480
521
  ```
481
522
 
482
- **解决方案**: 使用 `.custom()` 方法
523
+ **解决方案**: 使用 `.custom()` 方法承载**同步**自定义逻辑
483
524
  ```javascript
484
- 'string!'.custom(async (value) => {
485
- // 自定义逻辑
486
- if (await checkExists(value)) {
487
- return '已存在';
525
+ 'string!'.custom((value) => {
526
+ // 自定义同步逻辑
527
+ if (value === 'reserved') {
528
+ return '该值不可用';
488
529
  }
489
530
  })
490
531
  ```
491
532
 
533
+ 异步校验(如数据库查重)请在 `validate()` / `validateAsync()` 通过后于业务层单独执行。
534
+
492
535
  ---
493
536
 
494
537
  ### 5. 对象数组详细定义
@@ -659,6 +702,13 @@ dsl.match('vipLevel', { gold: 'number:0-50', silver: 'number:0-20' })
659
702
 
660
703
  ---
661
704
 
662
- **最后更新**: 2025-12-29
663
- **作者**: SchemaI-DSL Team
705
+ ## 对应示例文件
706
+
707
+ **示例入口**: [dsl-syntax.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/dsl-syntax.ts)
708
+ **说明**: 覆盖 Batch 1 中 DSL 语法的基础类型、约束、枚举、数组和嵌套对象写法,可直接运行参考。
709
+
710
+ ---
711
+
712
+ **最后更新**: 2026-05-08
713
+ **作者**: schema-dsl Team
664
714
 
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## 基本原理
20
20
 
21
- SchemaI-DSL 的 `Validator` 支持在验证时动态指定语言,无需全局切换。
21
+ schema-dsl 的 `Validator` 支持在验证时动态指定语言,无需全局切换。
22
22
 
23
23
  ### 核心方法
24
24
 
@@ -45,7 +45,7 @@ const path = require('path');
45
45
  // ========== 应用启动时配置(只执行一次)==========
46
46
 
47
47
  // 方式一:传入目录路径(推荐)⭐
48
- // 自动扫描目录下的所有 .js 和 .json 文件
48
+ // Node >=18:自动扫描目录下的 .js(CommonJS)、.cjs、.json、.jsonc、.json5 文件
49
49
  dsl.config({
50
50
  i18n: path.join(__dirname, 'locales')
51
51
  });
@@ -128,7 +128,7 @@ const userSchema = dsl({
128
128
  // ========== Express 路由 ==========
129
129
  app.post('/api/user/register', (req, res) => {
130
130
  // 从请求头获取语言偏好
131
- const locale = req.headers['accept-language'] || 'en-US';
131
+ const locale = parseAcceptLanguage(req.headers['accept-language']);
132
132
 
133
133
  // 验证数据(直接切换语言,无需重新加载)
134
134
  const result = validate(userSchema, req.body, { locale });
@@ -210,7 +210,7 @@ function validateWithLocale(validator, schema, data, locale) {
210
210
 
211
211
  // 使用
212
212
  app.post('/api/user/register', (req, res) => {
213
- const locale = req.headers['accept-language'] || 'en-US';
213
+ const locale = parseAcceptLanguage(req.headers['accept-language']);
214
214
 
215
215
  const result = validateWithLocale(validator, schema, req.body, locale);
216
216
 
@@ -234,7 +234,7 @@ const validator = new Validator();
234
234
 
235
235
  const schemaIoMiddleware = (req, res, next) => {
236
236
  // 1. 自动获取语言
237
- const lang = req.headers['accept-language'] || 'en-US';
237
+ const lang = req.headers['accept-language']?.split(',')[0]?.trim() || 'en-US';
238
238
  // 简单匹配逻辑 (实际可使用 accept-language-parser)
239
239
  const locale = lang.includes('zh') ? 'zh-CN' :
240
240
  lang.includes('ja') ? 'ja-JP' :
@@ -264,12 +264,14 @@ app.post('/users', (req, res) => {
264
264
  });
265
265
  ```
266
266
 
267
- 完整示例请参考 `examples/middleware-usage.js`。
267
+ 完整示例请参考 [dynamic-locale.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/dynamic-locale.ts)。
268
268
 
269
269
  ### 3.2 Koa 中间件
270
270
 
271
271
  ```javascript
272
- const { Locale } = require('schema-dsl');
272
+ const { Locale, Validator } = require('schema-dsl');
273
+
274
+ const validator = new Validator();
273
275
 
274
276
  /**
275
277
  * Koa 语言中间件
@@ -282,10 +284,8 @@ function localeMiddleware() {
282
284
  // 保存到上下文
283
285
  ctx.locale = locale;
284
286
 
285
- // 创建验证辅助函数
287
+ // 复用共享 Validator,避免每个请求都重新建立实例和缓存
286
288
  ctx.validate = function(schema, data) {
287
- const { Validator } = require('schema-dsl');
288
- const validator = new Validator();
289
289
  return validator.validate(schema, data, { locale: ctx.locale });
290
290
  };
291
291
 
@@ -368,11 +368,12 @@ function parseAcceptLanguage(acceptLanguage) {
368
368
 
369
369
  // ========== 3. 中间件 ==========
370
370
 
371
+ const validator = new Validator();
372
+
371
373
  function localeMiddleware(req, res, next) {
372
374
  req.locale = parseAcceptLanguage(req.headers['accept-language']);
373
375
 
374
376
  req.validate = function(schema, data) {
375
- const validator = new Validator();
376
377
  return validator.validate(schema, data, { locale: req.locale });
377
378
  };
378
379
 
@@ -525,7 +526,7 @@ if (!result.valid) {
525
526
  |------|------|------|--------|
526
527
  | **方案1: 验证时指定** | ✅ 无竞态问题<br>✅ 支持并发<br>✅ 代码简洁 | - | ⭐⭐⭐⭐⭐ |
527
528
  | 方案2: 临时切换 | ✅ 实现简单 | ⚠️ 并发竞态问题 | ⭐⭐⭐ |
528
- | 方案3: 中间件 | ✅ 自动化<br>✅ 统一管理 | - | ⭐⭐⭐⭐⭐ |
529
+ | 方案3: 中间件 | ✅ 自动化<br>✅ 统一管理<br>✅ 可复用共享 Validator 缓存 | - | ⭐⭐⭐⭐⭐ |
529
530
 
530
531
  **推荐**: 方案1 + 方案3(中间件封装)
531
532
 
@@ -537,6 +538,8 @@ if (!result.valid) {
537
538
 
538
539
  **A**: 回退到默认语言
539
540
 
541
+ 不要直接把原始 `Accept-Language` 头透传给 `locale`;浏览器常见值会带 `q=` 权重,应该先解析再回退。
542
+
540
543
  ```javascript
541
544
  function parseAcceptLanguage(acceptLanguage) {
542
545
  // ...解析逻辑
@@ -592,7 +595,14 @@ const schema = dsl({
592
595
 
593
596
  ---
594
597
 
595
- **最后更新**: 2025-12-25
596
- **作者**: SchemaI-DSL Team
598
+ ## 对应示例文件
599
+
600
+ **示例入口**: [dynamic-locale.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/dynamic-locale.ts)
601
+ **说明**: 覆盖 `Accept-Language` 解析、运行时 locale 选择,以及同一 schema 在不同请求语言下的验证入口。
602
+
603
+ ---
604
+
605
+ **最后更新**: 2026-05-08
606
+ **作者**: schema-dsl Team
597
607
 
598
608
 
package/docs/enum.md CHANGED
@@ -450,10 +450,17 @@ const schema = dsl({
450
450
 
451
451
  ## 📖 相关文档
452
452
 
453
- - [基础用法](./README.md)
454
- - [验证规则](./docs/validation.md)
455
- - [API 参考](./docs/api.md)
456
- - [示例代码](../examples/enum.examples.js)
453
+ - [基础用法](https://github.com/vextjs/schema-dsl/blob/main/README.md)
454
+ - [验证规则](./validation-guide.md)
455
+ - [API 参考](./api-reference.md)
456
+ - [示例代码](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/enum.ts)
457
+
458
+ ---
459
+
460
+ ## 对应示例文件
461
+
462
+ **示例入口**: [enum.ts](https://github.com/vextjs/schema-dsl/blob/main/examples/docs/enum.ts)
463
+ **说明**: 覆盖字符串、数字、布尔值和数组元素枚举的成功/失败路径,并展示自定义枚举错误消息。
457
464
 
458
465
  ---
459
466
 
@@ -470,6 +477,6 @@ const schema = dsl({
470
477
 
471
478
  ---
472
479
 
473
- **文档生成时间**: 2025-12-31
480
+ **文档生成时间**: 2026-05-08
474
481
  **版本**: v1.1.0
475
482