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,376 +0,0 @@
1
- # schema-dsl v1.1.8 变更日志
2
-
3
- > **发布日期**: 2026-01-30
4
- > **类型**: 功能增强 🚀
5
- > **重要性**: ⭐⭐⭐⭐⭐
6
-
7
- ---
8
-
9
- ## 📋 本版本概览
10
-
11
- ### 🎯 核心更新
12
-
13
- **智能参数识别 - 简化语法支持**
14
-
15
- 支持简化的错误抛出语法,从4个参数减少到2个参数,使API调用更加简洁直观。
16
-
17
- ```javascript
18
- // ✅ 新增:简化语法
19
- dsl.error.throw('account.notFound', 'zh-CN');
20
-
21
- // ✅ 保持:标准语法(完全兼容)
22
- dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
23
- ```
24
-
25
- ---
26
-
27
- ## 🚀 新增功能
28
-
29
- ### 1. 智能参数识别
30
-
31
- **问题背景**:原有API需要4个参数,即使不需要参数对象也要传空对象 `{}`
32
-
33
- ```javascript
34
- // ❌ 原有方式:必须传递空对象
35
- dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
36
- ```
37
-
38
- **解决方案**:智能识别第2个参数类型,自动判断是语言参数还是参数对象
39
-
40
- ```javascript
41
- // ✅ 简化语法:直接传语言
42
- dsl.error.throw('account.notFound', 'zh-CN');
43
- dsl.error.throw('account.notFound', 'zh-CN', 404);
44
-
45
- // ✅ 标准语法:传参数对象(完全兼容)
46
- dsl.error.throw('account.notFound', { id: '123' }, 404, 'zh-CN');
47
- ```
48
-
49
- **识别规则**:
50
- - 第2个参数是 `string` → 识别为语言参数
51
- - 第2个参数是 `object` → 识别为参数对象
52
- - 第2个参数是 `null/undefined/数组` → 使用默认值
53
-
54
- ### 2. 所有错误方法都支持
55
-
56
- ```javascript
57
- // dsl.error.create() - 创建错误
58
- const error = dsl.error.create('account.notFound', 'zh-CN');
59
-
60
- // dsl.error.throw() - 抛出错误
61
- dsl.error.throw('account.notFound', 'zh-CN');
62
-
63
- // dsl.error.assert() - 断言式错误
64
- dsl.error.assert(account, 'account.notFound', 'zh-CN');
65
- dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
66
-
67
- // I18nError 直接调用
68
- I18nError.throw('account.notFound', 'zh-CN');
69
- I18nError.create('account.notFound', 'zh-CN');
70
- I18nError.assert(account, 'account.notFound', 'zh-CN');
71
- ```
72
-
73
- ---
74
-
75
- ## 🔧 技术实现
76
-
77
- ### 新增工具函数
78
-
79
- ```javascript
80
- /**
81
- * 智能参数识别工具函数
82
- * @private
83
- */
84
- function normalizeParams(paramsOrLocale, statusCode, locale) {
85
- let params = {};
86
- let actualStatusCode = 400;
87
- let actualLocale = null;
88
-
89
- if (typeof paramsOrLocale === 'string') {
90
- // 字符串 → 语言参数
91
- actualLocale = paramsOrLocale;
92
- actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
93
- } else if (paramsOrLocale && typeof paramsOrLocale === 'object' && !Array.isArray(paramsOrLocale)) {
94
- // 对象(非数组)→ 参数对象
95
- params = paramsOrLocale;
96
- actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
97
- actualLocale = locale;
98
- } else {
99
- // null/undefined/数组 → 使用默认值
100
- actualStatusCode = typeof statusCode === 'number' ? statusCode : 400;
101
- actualLocale = locale;
102
- }
103
-
104
- return { params, statusCode: actualStatusCode, locale: actualLocale };
105
- }
106
- ```
107
-
108
- ### 修改的方法
109
-
110
- - `I18nError.create()`
111
- - `I18nError.throw()`
112
- - `I18nError.assert()`
113
- - `dsl.error.create()`
114
- - `dsl.error.throw()`
115
- - `dsl.error.assert()`
116
-
117
- ---
118
-
119
- ## 📖 使用示例
120
-
121
- ### Express API 示例
122
-
123
- ```javascript
124
- const { dsl, Locale } = require('schema-dsl');
125
-
126
- // 配置语言包
127
- Locale.addLocale('zh-CN', {
128
- 'account.notFound': {
129
- code: 40001,
130
- message: '账户不存在'
131
- }
132
- });
133
-
134
- Locale.addLocale('en-US', {
135
- 'account.notFound': {
136
- code: 40001,
137
- message: 'Account not found'
138
- }
139
- });
140
-
141
- // API 路由
142
- app.get('/api/account/:id', async (req, res) => {
143
- try {
144
- const account = await findAccount(req.params.id);
145
- const locale = req.headers['accept-language'] || 'zh-CN';
146
-
147
- // 🎯 简化语法:只需2个参数
148
- dsl.error.assert(account, 'account.notFound', locale);
149
-
150
- res.json(account);
151
- } catch (error) {
152
- res.status(error.statusCode).json(error.toJSON());
153
- }
154
- });
155
- ```
156
-
157
- ### 对比示例
158
-
159
- ```javascript
160
- // 之前:4个参数
161
- dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
162
- dsl.error.assert(account, 'account.notFound', {}, 404, 'zh-CN');
163
-
164
- // 现在:2个参数(无需参数对象时)
165
- dsl.error.throw('account.notFound', 'zh-CN', 404);
166
- dsl.error.assert(account, 'account.notFound', 'zh-CN', 404);
167
-
168
- // 或者:3个参数(带参数对象)
169
- dsl.error.throw('account.insufficientBalance',
170
- { balance: 50, required: 100 },
171
- 'zh-CN'
172
- );
173
- ```
174
-
175
- ---
176
-
177
- ## ✅ 向后兼容性
178
-
179
- ### 完全向后兼容
180
-
181
- 所有原有调用方式都完全正常工作,无需修改任何现有代码。
182
-
183
- | 原有调用方式 | 兼容性 | 说明 |
184
- |-------------|--------|------|
185
- | `throw('key')` | ✅ 完全兼容 | 使用全局语言 |
186
- | `throw('key', {})` | ✅ 完全兼容 | 空参数对象 |
187
- | `throw('key', {}, 404)` | ✅ 完全兼容 | 带状态码 |
188
- | `throw('key', {}, 404, 'zh')` | ✅ 完全兼容 | 完整4参数 |
189
- | `throw('key', {params}, 404, 'zh')` | ✅ 完全兼容 | 带参数对象 |
190
- | `throw('key', null, 404, 'zh')` | ✅ 完全兼容 | null 参数 |
191
-
192
- ### 测试验证
193
-
194
- - **17个测试用例**,全部通过
195
- - **零破坏性变更**
196
- - **100%向后兼容**
197
-
198
- ---
199
-
200
- ## 🎨 优势
201
-
202
- ### 1. 用户体验提升
203
-
204
- - **参数减少**:从4个参数减少到2个(不需要参数对象时)
205
- - **语法简洁**:`throw('key', 'locale')` 更直观
206
- - **易于理解**:参数含义更清晰
207
-
208
- ### 2. 减少错误
209
-
210
- - **避免混淆**:不再需要传递空对象 `{}`
211
- - **类型安全**:智能识别参数类型
212
- - **降低学习成本**:新手更容易上手
213
-
214
- ### 3. 保持兼容
215
-
216
- - **渐进式增强**:新旧语法并存
217
- - **零风险升级**:现有代码无需修改
218
- - **平滑过渡**:可以逐步迁移到简化语法
219
-
220
- ---
221
-
222
- ## 📊 性能影响
223
-
224
- **无性能损失**
225
-
226
- - 参数识别逻辑简单(类型检查)
227
- - 运行时开销可忽略不计
228
- - 不影响错误抛出性能
229
-
230
- ---
231
-
232
- ## 📦 修改文件清单
233
-
234
- ### 核心文件
235
-
236
- 1. **lib/errors/I18nError.js**
237
- - 新增 `normalizeParams()` 工具函数
238
- - 修改 `create()` 方法
239
- - 修改 `throw()` 方法
240
- - 修改 `assert()` 方法
241
-
242
- 2. **index.js**
243
- - 更新 `dsl.error` 的 JSDoc 文档
244
-
245
- ### 文档文件
246
-
247
- 3. **README.md**
248
- - 添加简化语法示例
249
-
250
- 4. **CHANGELOG.md**
251
- - 添加 v1.1.8 版本信息
252
-
253
- 5. **changelogs/v1.1.8.md**
254
- - 详细变更文档(本文件)
255
-
256
- 6. **docs/error-handling.md**
257
- - 更新错误处理指南
258
-
259
- 7. **docs/runtime-locale-support.md**
260
- - 更新运行时语言文档
261
-
262
- ---
263
-
264
- ## 🔗 相关文档
265
-
266
- - [错误处理完整指南](../docs/error-handling.md)
267
- - [运行时多语言支持](../docs/runtime-locale-support.md)
268
- - [API 参考文档](../docs/api-reference.md)
269
- - [实现原理分析](../docs/i18n-implementation-analysis.md)
270
- - [兼容性分析](../docs/api-compatibility-analysis.md)
271
-
272
- ---
273
-
274
- ## 📝 升级指南
275
-
276
- ### 如何升级
277
-
278
- ```bash
279
- npm install schema-dsl@1.1.8
280
- # 或
281
- yarn add schema-dsl@1.1.8
282
- ```
283
-
284
- ### 是否需要修改代码?
285
-
286
- **不需要!** 本版本完全向后兼容,现有代码无需任何修改。
287
-
288
- ### 推荐的迁移方式
289
-
290
- 可以逐步将代码迁移到简化语法:
291
-
292
- ```javascript
293
- // 旧代码(继续有效)
294
- dsl.error.throw('account.notFound', {}, 404, 'zh-CN');
295
-
296
- // 新代码(推荐)
297
- dsl.error.throw('account.notFound', 'zh-CN', 404);
298
- ```
299
-
300
- ---
301
-
302
- ## 🧪 测试覆盖
303
-
304
- ### 测试用例
305
-
306
- 创建了完整的测试套件 `test-smart-params.js`,包含17个测试用例:
307
-
308
- 1. ✅ 简化语法 - 中文
309
- 2. ✅ 简化语法 - 英文 + 404
310
- 3. ✅ 标准语法 - 4参数
311
- 4. ✅ 标准语法 - 带参数对象
312
- 5. ✅ 省略所有参数 - 使用全局语言
313
- 6. ✅ create() 方法 - 简化语法
314
- 7. ✅ create() 方法 - 带状态码
315
- 8. ✅ assert() 方法 - 简化语法
316
- 9. ✅ assert() 方法 - 不应该抛错
317
- 10. ✅ assert() 方法 - 带状态码
318
- 11. ✅ assert() 方法 - 带参数对象
319
- 12. ✅ 边缘情况 - null 参数
320
- 13. ✅ 边缘情况 - undefined 参数
321
- 14. ✅ 边缘情况 - 数组参数
322
- 15. ✅ I18nError.throw() 直接调用
323
- 16. ✅ I18nError.create() 直接调用
324
- 17. ✅ I18nError.assert() 直接调用
325
-
326
- ### 测试结果
327
-
328
- ```
329
- 📊 测试结果总结:
330
- ✅ 通过: 17 个测试
331
- ❌ 失败: 0 个测试
332
- 📈 通过率: 100.0%
333
-
334
- 🎉 所有测试都通过了!智能参数识别功能完全正常!
335
- ```
336
-
337
- ---
338
-
339
- ## 🐛 已知问题
340
-
341
- 无已知问题。
342
-
343
- ---
344
-
345
- ## 🎯 下一步计划
346
-
347
- - 更新所有文档示例
348
- - 添加更多使用场景
349
- - 完善 TypeScript 类型定义
350
-
351
- ---
352
-
353
- ## 👥 贡献者
354
-
355
- 感谢以下贡献者对本版本的贡献:
356
-
357
- - AI Assistant - 功能设计与实现
358
-
359
- ---
360
-
361
- ## 📢 致谢
362
-
363
- 感谢社区用户的反馈和建议,帮助我们不断改进 API 设计!
364
-
365
- ---
366
-
367
- **发布日期**: 2026-01-30
368
- **版本**: v1.1.8
369
- **上一版本**: v1.1.7 (错误消息路径显示优化)
370
- **下一版本预告**: 计划改进文档和示例代码
371
-
372
- ---
373
-
374
- **完整变更日志**: [CHANGELOG.md](../CHANGELOG.md)
375
- **GitHub**: [https://github.com/vextjs/schema-dsl](https://github.com/vextjs/schema-dsl)
376
- **npm**: [https://www.npmjs.com/package/schema-dsl](https://www.npmjs.com/package/schema-dsl)
@@ -1,124 +0,0 @@
1
- # schema-dsl v1.2.3 变更日志
2
-
3
- > **发布日期**: 2026-03-03
4
- > **类型**: 功能增强 🚀 + Bug修复 🐛
5
- > **重要性**: ⭐⭐⭐⭐⭐
6
-
7
- ---
8
-
9
- ## 📋 本版本概览
10
-
11
- ### 🎯 核心更新
12
-
13
- **1. i18n 多语言子目录合并支持(新功能)**
14
-
15
- 多人协作开发时,支持将多语言文件按模块拆分到子目录,启动时自动递归合并,解决 code 码冲突和 Git merge 冲突问题。
16
-
17
- **2. 三个测试状态污染 Bug 修复**
18
-
19
- 修复全量测试时因跨文件 `Locale` 状态污染导致的 3 个 failing,1003 个测试全部通过。
20
-
21
- ---
22
-
23
- ## ✨ 新功能:i18n 子目录合并
24
-
25
- ### F1:递归子目录扫描
26
-
27
- `dsl.config({ i18n: path })` 现在支持递归扫描子目录,每个子目录作为模块组织层,同语言文件自动合并:
28
-
29
- ```javascript
30
- // 目录结构
31
- locales/
32
- ├── core/zh-CN.js // 公共 code: 1000-1999
33
- ├── account/zh-CN.js // 账户模块 code: 10000-10999(开发者A)
34
- ├── order/zh-CN.js // 订单模块 code: 20000-20999(开发者B)
35
- └── payment/zh-CN.js // 支付模块 code: 30000-30999(开发者C)
36
-
37
- // 一行配置,自动递归合并
38
- dsl.config({
39
- i18n: path.join(__dirname, 'locales')
40
- });
41
- ```
42
-
43
- ### F2:同名 key 冲突检测
44
-
45
- 默认模式打印 WARN,`strict: true` 直接抛错阻断启动(推荐 CI 环境):
46
-
47
- ```javascript
48
- // 默认:WARN 日志
49
- dsl.config({ i18n: './locales' });
50
- // [schema-dsl] i18n key 冲突 in locale 'zh-CN'
51
- // 冲突 key: account.notFound
52
- // 来源文件: /project/locales/account/zh-CN.js
53
-
54
- // 严格模式:抛出 Error
55
- dsl.config({ i18n: './locales', strict: true });
56
- ```
57
-
58
- ### F3:语言文件名格式校验
59
-
60
- 只加载符合语言代码格式(`zh-CN.js`、`en.js` 等)的文件,自动跳过 `index.js`、`utils.js`、`CODE-SEGMENTS.js` 等工具文件。
61
-
62
- ### 兼容修复:`localesPath` 对象用法真正生效
63
-
64
- 文档中记载的 `{ localesPath: './path' }` 对象用法之前静默失败,现在已修复:
65
-
66
- ```javascript
67
- // 之前:静默失败(localesPath 被当成语言 key 处理)
68
- // 现在:真正生效
69
- dsl.config({
70
- i18n: { localesPath: path.join(__dirname, 'locales') }
71
- });
72
- ```
73
-
74
- ---
75
-
76
- ## 🐛 Bug 修复:测试状态污染
77
-
78
- ### 问题根因
79
-
80
- `test/unit/i18n-subdir.test.js` 使用了根级别的 `beforeEach(() => Locale.reset())`,导致全量测试时清除了其他测试文件 `before()` 中注册的自定义语言 key,造成以下 3 个测试 failing:
81
-
82
- | 测试文件 | 失败原因 |
83
- |---------|---------|
84
- | `test/unit/core/custom-features.test.js` | `min` key 被 reset 后走内置消息而非自定义 `太短` |
85
- | `test/unit/error-message-interpolation.test.js` | `zh-CN` enum 消息在 reset 后丢失 |
86
- | `test/unit/label-translation.test.js` | `label.test_field` key 被 reset 清除 |
87
-
88
- ### 修复方案
89
-
90
- 将 `i18n-subdir.test.js` 的所有测试包裹在顶级 `describe('i18n 子目录合并')` 内,将 `beforeEach(Locale.reset)` 改为 `describe` 作用域内的 `afterEach(Locale.reset)`,确保状态清理严格限制在本文件的测试范围内,不泄漏到其他文件。
91
-
92
- ---
93
-
94
- ## 📊 测试统计
95
-
96
- | 指标 | v1.2.2 | v1.2.3 | 变化 |
97
- |------|--------|--------|------|
98
- | 通过 | 989 | **1003** | +14 |
99
- | 失败 | 14 | **0** | -14 ✅ |
100
- | 新增测试 | — | 20 (i18n-subdir) | +20 |
101
-
102
- ---
103
-
104
- ## 📁 变更文件
105
-
106
- | 文件 | 操作 | 说明 |
107
- |------|------|------|
108
- | `index.js` | 修改 | 新增 `loadLocalesFromDir` 内部函数,支持递归扫描 + 冲突检测 |
109
- | `index.d.ts` | 修改 | `I18nConfig` 类型扩展 + `strict?: boolean` 选项 |
110
- | `test/unit/i18n-subdir.test.js` | 新增 | 20 个单元测试(F1/F2/F3 + 向后兼容回归)|
111
- | `docs/add-custom-locale.md` | 修改 | 新增子目录多人协作章节 + Code 段划分建议 |
112
-
113
- ---
114
-
115
- ## 🔄 向后兼容性
116
-
117
- ✅ **100% 向后兼容**,现有所有用法零改动:
118
-
119
- | 现有用法 | 兼容性 |
120
- |---------|--------|
121
- | `i18n: '/path'`(平铺目录)| ✅ 完全兼容(行为超集)|
122
- | `i18n: { 'zh-CN': {...} }` | ✅ 完全兼容 |
123
- | `strict` 未传 | ✅ 默认 false,现有行为零变化 |
124
-