schema-dsl 1.2.5 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/CHANGELOG.md +130 -238
  2. package/LICENSE +21 -21
  3. package/README.md +628 -2486
  4. package/dist/DslBuilder-BIgQOAXp.d.ts +343 -0
  5. package/dist/DslBuilder-CjHTucNQ.d.cts +343 -0
  6. package/dist/Validator-CllRdrY0.d.ts +192 -0
  7. package/dist/Validator-D6okG9tr.d.cts +192 -0
  8. package/dist/index.cjs +6640 -0
  9. package/dist/index.d.cts +1151 -0
  10. package/dist/index.d.ts +1151 -0
  11. package/dist/index.js +6574 -0
  12. package/dist/plugin-CIKtTMtS.d.cts +246 -0
  13. package/dist/plugin-CIKtTMtS.d.ts +246 -0
  14. package/dist/plugins/custom-format.cjs +3818 -0
  15. package/dist/plugins/custom-format.d.cts +12 -0
  16. package/dist/plugins/custom-format.d.ts +12 -0
  17. package/dist/plugins/custom-format.js +3788 -0
  18. package/dist/plugins/custom-type-example.cjs +3811 -0
  19. package/dist/plugins/custom-type-example.d.cts +8 -0
  20. package/dist/plugins/custom-type-example.d.ts +8 -0
  21. package/dist/plugins/custom-type-example.js +3781 -0
  22. package/dist/plugins/custom-validator.cjs +144 -0
  23. package/dist/plugins/custom-validator.d.cts +10 -0
  24. package/dist/plugins/custom-validator.d.ts +10 -0
  25. package/dist/plugins/custom-validator.js +119 -0
  26. package/docs/FEATURE-INDEX.md +553 -519
  27. package/docs/add-custom-locale.md +496 -483
  28. package/docs/add-keyword.md +24 -0
  29. package/docs/api-reference.md +1047 -805
  30. package/docs/api.md +13 -0
  31. package/docs/best-practices-project-structure.md +417 -408
  32. package/docs/best-practices.md +712 -672
  33. package/docs/cache-manager.md +344 -336
  34. package/docs/compile.md +45 -0
  35. package/docs/conditional-api.md +1307 -1278
  36. package/docs/custom-extensions-guide.md +339 -411
  37. package/docs/design-philosophy.md +606 -601
  38. package/docs/doc-index.md +324 -0
  39. package/docs/dsl-syntax.md +714 -664
  40. package/docs/dynamic-locale.md +608 -598
  41. package/docs/enum.md +482 -475
  42. package/docs/error-handling.md +1975 -1966
  43. package/docs/export-guide.md +501 -462
  44. package/docs/export-limitations.md +567 -551
  45. package/docs/faq.md +596 -577
  46. package/docs/frontend-i18n-guide.md +307 -293
  47. package/docs/i18n-user-guide.md +487 -474
  48. package/docs/i18n.md +476 -457
  49. package/docs/index.md +48 -0
  50. package/docs/json-schema-basics.md +40 -0
  51. package/docs/label-vs-description.md +271 -262
  52. package/docs/markdown-exporter.md +406 -397
  53. package/docs/mongodb-exporter.md +302 -295
  54. package/docs/multi-language.md +26 -0
  55. package/docs/multi-type-support.md +322 -329
  56. package/docs/mysql-exporter.md +280 -273
  57. package/docs/number-operators.md +449 -442
  58. package/docs/optional-marker-guide.md +326 -321
  59. package/docs/performance-guide.md +49 -0
  60. package/docs/plugin-system.md +381 -542
  61. package/docs/plugin-type-registration.md +34 -0
  62. package/docs/postgresql-exporter.md +311 -304
  63. package/docs/public/favicon.svg +5 -0
  64. package/docs/quick-start.md +435 -761
  65. package/docs/runtime-locale-support.md +532 -521
  66. package/docs/schema-helper.md +345 -340
  67. package/docs/schema-utils-advanced-issues.md +23 -0
  68. package/docs/schema-utils-best-practices.md +20 -0
  69. package/docs/schema-utils-chaining.md +150 -143
  70. package/docs/schema-utils.md +524 -490
  71. package/docs/security-checklist.md +20 -0
  72. package/docs/string-extensions.md +488 -480
  73. package/docs/troubleshooting.md +486 -471
  74. package/docs/type-converter.md +310 -319
  75. package/docs/type-reference.md +242 -219
  76. package/docs/typescript-guide.md +584 -573
  77. package/docs/union-type-guide.md +157 -147
  78. package/docs/union-types.md +284 -277
  79. package/docs/validate-async.md +491 -480
  80. package/docs/validate-batch.md +49 -0
  81. package/docs/validate-dsl-object-support.md +578 -573
  82. package/docs/validate.md +506 -486
  83. package/docs/validation-guide.md +502 -484
  84. package/docs/validator.md +39 -0
  85. package/package.json +131 -73
  86. package/plugins/custom-format.cjs +8 -0
  87. package/plugins/custom-type-example.cjs +8 -0
  88. package/plugins/custom-validator.cjs +8 -0
  89. package/src/adapters/DslAdapter.ts +111 -0
  90. package/src/adapters/index.ts +1 -0
  91. package/src/config/constants.ts +83 -0
  92. package/src/config/index.ts +2 -0
  93. package/src/config/patterns.ts +77 -0
  94. package/src/core/CacheManager.ts +169 -0
  95. package/src/core/ConditionalBuilder.ts +382 -0
  96. package/src/core/ConditionalRuntime.ts +28 -0
  97. package/src/core/ConditionalValidator.ts +255 -0
  98. package/src/core/DslBuilder.ts +687 -0
  99. package/src/core/ErrorCodes.ts +38 -0
  100. package/src/core/ErrorFormatter.ts +271 -0
  101. package/src/core/JSONSchemaCore.ts +65 -0
  102. package/src/core/Locale.ts +187 -0
  103. package/src/core/MessageTemplate.ts +42 -0
  104. package/src/core/ObjectDslBuilder.ts +64 -0
  105. package/src/core/PluginManager.ts +326 -0
  106. package/src/core/StringExtensions.ts +140 -0
  107. package/src/core/TemplateEngine.ts +44 -0
  108. package/src/core/Validator.ts +448 -0
  109. package/src/errors/I18nError.ts +159 -0
  110. package/src/errors/ValidationError.ts +105 -0
  111. package/src/exporters/BaseExporter.ts +60 -0
  112. package/src/exporters/MarkdownExporter.ts +305 -0
  113. package/src/exporters/MongoDBExporter.ts +126 -0
  114. package/src/exporters/MySQLExporter.ts +156 -0
  115. package/src/exporters/PostgreSQLExporter.ts +222 -0
  116. package/src/exporters/index.ts +18 -0
  117. package/src/index.ts +651 -0
  118. package/{lib/locales/en-US.js → src/locales/en-US.ts} +160 -176
  119. package/{lib/locales/es-ES.js → src/locales/es-ES.ts} +160 -113
  120. package/{lib/locales/fr-FR.js → src/locales/fr-FR.ts} +160 -113
  121. package/src/locales/index.ts +103 -0
  122. package/{lib/locales/ja-JP.js → src/locales/ja-JP.ts} +160 -118
  123. package/src/locales/types.ts +156 -0
  124. package/{lib/locales/zh-CN.js → src/locales/zh-CN.ts} +160 -177
  125. package/src/parser/ConstraintParser.ts +101 -0
  126. package/src/parser/DslParser.ts +470 -0
  127. package/src/parser/SchemaCompiler.ts +66 -0
  128. package/src/parser/TypeRegistry.ts +250 -0
  129. package/src/parser/index.ts +6 -0
  130. package/src/plugins/custom-format.ts +124 -0
  131. package/src/plugins/custom-type-example.ts +106 -0
  132. package/src/plugins/custom-validator.ts +138 -0
  133. package/src/types/conditional.ts +28 -0
  134. package/src/types/config.ts +59 -0
  135. package/src/types/dsl.ts +131 -0
  136. package/src/types/error.ts +60 -0
  137. package/src/types/index.ts +17 -0
  138. package/src/types/infer.ts +128 -0
  139. package/src/types/plugin.ts +58 -0
  140. package/src/types/safe-regex.d.ts +9 -0
  141. package/src/types/schema.ts +66 -0
  142. package/src/types/validate.ts +71 -0
  143. package/src/utils/SchemaHelper.ts +196 -0
  144. package/src/utils/SchemaUtils.ts +365 -0
  145. package/src/utils/TypeConverter.ts +215 -0
  146. package/src/utils/index.ts +10 -0
  147. package/src/validators/CustomKeywords.ts +477 -0
  148. package/.eslintignore +0 -11
  149. package/.eslintrc.json +0 -27
  150. package/CONTRIBUTING.md +0 -368
  151. package/STATUS.md +0 -491
  152. package/changelogs/v1.0.0.md +0 -328
  153. package/changelogs/v1.0.9.md +0 -367
  154. package/changelogs/v1.1.0.md +0 -389
  155. package/changelogs/v1.1.1.md +0 -308
  156. package/changelogs/v1.1.2.md +0 -183
  157. package/changelogs/v1.1.3.md +0 -161
  158. package/changelogs/v1.1.4.md +0 -432
  159. package/changelogs/v1.1.5.md +0 -493
  160. package/changelogs/v1.1.6.md +0 -211
  161. package/changelogs/v1.1.8.md +0 -376
  162. package/changelogs/v1.2.3.md +0 -124
  163. package/docs/INDEX.md +0 -252
  164. package/docs/issues-resolved-summary.md +0 -196
  165. package/docs/performance-benchmark-report.md +0 -179
  166. package/docs/performance-quick-reference.md +0 -123
  167. package/docs/user-questions-answered.md +0 -353
  168. package/docs/validation-rules-v1.0.2.md +0 -1608
  169. package/examples/README.md +0 -81
  170. package/examples/array-dsl-example.js +0 -227
  171. package/examples/conditional-example.js +0 -288
  172. package/examples/conditional-non-object.js +0 -129
  173. package/examples/conditional-validate-example.js +0 -321
  174. package/examples/custom-extension.js +0 -85
  175. package/examples/dsl-match-example.js +0 -74
  176. package/examples/dsl-style.js +0 -118
  177. package/examples/dynamic-locale-configuration.js +0 -348
  178. package/examples/dynamic-locale-example.js +0 -287
  179. package/examples/enum.examples.js +0 -324
  180. package/examples/export-demo.js +0 -130
  181. package/examples/express-integration.js +0 -376
  182. package/examples/i18n-error-handling-complete.js +0 -381
  183. package/examples/i18n-error-handling-quickstart.md +0 -0
  184. package/examples/i18n-error.examples.js +0 -181
  185. package/examples/i18n-full-demo.js +0 -301
  186. package/examples/i18n-memory-safety.examples.js +0 -268
  187. package/examples/markdown-export.js +0 -71
  188. package/examples/middleware-usage.js +0 -93
  189. package/examples/new-features-comparison.js +0 -315
  190. package/examples/password-reset/README.md +0 -153
  191. package/examples/password-reset/schema.js +0 -26
  192. package/examples/password-reset/test.js +0 -101
  193. package/examples/plugin-system.examples.js +0 -205
  194. package/examples/schema-utils-chaining.examples.js +0 -250
  195. package/examples/simple-example.js +0 -122
  196. package/examples/slug.examples.js +0 -179
  197. package/examples/string-extensions.js +0 -297
  198. package/examples/union-type-example.js +0 -127
  199. package/examples/union-types-example.js +0 -77
  200. package/examples/user-registration/README.md +0 -156
  201. package/examples/user-registration/routes.js +0 -92
  202. package/examples/user-registration/schema.js +0 -150
  203. package/examples/user-registration/server.js +0 -74
  204. package/index.d.ts +0 -3658
  205. package/index.js +0 -475
  206. package/index.mjs +0 -60
  207. package/lib/adapters/DslAdapter.js +0 -995
  208. package/lib/adapters/index.js +0 -20
  209. package/lib/config/constants.js +0 -286
  210. package/lib/config/patterns/common.js +0 -47
  211. package/lib/config/patterns/creditCard.js +0 -9
  212. package/lib/config/patterns/idCard.js +0 -9
  213. package/lib/config/patterns/index.js +0 -9
  214. package/lib/config/patterns/licensePlate.js +0 -4
  215. package/lib/config/patterns/passport.js +0 -4
  216. package/lib/config/patterns/phone.js +0 -9
  217. package/lib/config/patterns/postalCode.js +0 -5
  218. package/lib/core/CacheManager.js +0 -376
  219. package/lib/core/ConditionalBuilder.js +0 -503
  220. package/lib/core/DslBuilder.js +0 -1589
  221. package/lib/core/ErrorCodes.js +0 -233
  222. package/lib/core/ErrorFormatter.js +0 -445
  223. package/lib/core/JSONSchemaCore.js +0 -347
  224. package/lib/core/Locale.js +0 -130
  225. package/lib/core/MessageTemplate.js +0 -98
  226. package/lib/core/PluginManager.js +0 -448
  227. package/lib/core/StringExtensions.js +0 -240
  228. package/lib/core/Validator.js +0 -654
  229. package/lib/errors/I18nError.js +0 -328
  230. package/lib/errors/ValidationError.js +0 -191
  231. package/lib/exporters/MarkdownExporter.js +0 -420
  232. package/lib/exporters/MongoDBExporter.js +0 -162
  233. package/lib/exporters/MySQLExporter.js +0 -212
  234. package/lib/exporters/PostgreSQLExporter.js +0 -289
  235. package/lib/exporters/index.js +0 -24
  236. package/lib/locales/index.js +0 -8
  237. package/lib/utils/LRUCache.js +0 -174
  238. package/lib/utils/SchemaHelper.js +0 -240
  239. package/lib/utils/SchemaUtils.js +0 -445
  240. package/lib/utils/TypeConverter.js +0 -245
  241. package/lib/utils/index.js +0 -13
  242. package/lib/validators/CustomKeywords.js +0 -616
  243. package/lib/validators/index.js +0 -11
@@ -1,347 +0,0 @@
1
- /**
2
- * JSON Schema核心类
3
- *
4
- * 负责管理JSON Schema对象,提供统一的Schema表示
5
- * 所有适配器转换后的Schema都使用此类表示
6
- *
7
- * @module lib/core/JSONSchemaCore
8
- * @version 1.0.0
9
- */
10
-
11
- const CONSTANTS = require('../config/constants');
12
-
13
- /**
14
- * JSON Schema核心类
15
- *
16
- * @class JSONSchemaCore
17
- * @description 基于JSON Schema Draft 7标准
18
- */
19
- class JSONSchemaCore {
20
- /**
21
- * 构造函数
22
- * @param {Object} schema - JSON Schema对象
23
- * @param {Object} options - 配置选项
24
- * @param {boolean} options.strict - 是否启用严格模式(默认false)
25
- * @param {string} options.draft - JSON Schema草案版本(默认'draft-07')
26
- */
27
- constructor(schema = {}, options = {}) {
28
- this.schema = this._normalizeSchema(schema);
29
- this.options = {
30
- strict: options.strict || false,
31
- draft: options.draft || 'draft-07',
32
- ...options
33
- };
34
-
35
- // 确保$schema字段
36
- if (!this.schema.$schema) {
37
- this.schema.$schema = 'http://json-schema.org/draft-07/schema#';
38
- }
39
- }
40
-
41
- /**
42
- * 规范化Schema对象
43
- * @private
44
- * @param {Object} schema - 原始Schema
45
- * @returns {Object} 规范化后的Schema
46
- */
47
- _normalizeSchema(schema) {
48
- if (!schema || typeof schema !== 'object') {
49
- return { type: 'object' };
50
- }
51
-
52
- // 深拷贝避免修改原对象
53
- return JSON.parse(JSON.stringify(schema));
54
- }
55
-
56
- /**
57
- * 获取Schema对象
58
- * @returns {Object} JSON Schema对象
59
- */
60
- getSchema() {
61
- return this.schema;
62
- }
63
-
64
- /**
65
- * 设置Schema类型
66
- * @param {string} type - 类型名称(string/number/boolean/object/array/null)
67
- * @returns {JSONSchemaCore} 返回this支持链式调用
68
- */
69
- setType(type) {
70
- const validTypes = ['string', 'number', 'integer', 'boolean', 'object', 'array', 'null'];
71
- if (!validTypes.includes(type)) {
72
- throw new Error(`Invalid type: ${type}. Valid types: ${validTypes.join(', ')}`);
73
- }
74
- this.schema.type = type;
75
- return this;
76
- }
77
-
78
- /**
79
- * 设置必填字段
80
- * @param {string[]} required - 必填字段数组
81
- * @returns {JSONSchemaCore} 返回this支持链式调用
82
- */
83
- setRequired(required) {
84
- if (!Array.isArray(required)) {
85
- throw new Error('Required must be an array');
86
- }
87
- this.schema.required = required;
88
- return this;
89
- }
90
-
91
- /**
92
- * 设置属性定义
93
- * @param {string} name - 属性名
94
- * @param {Object} propertySchema - 属性Schema
95
- * @returns {JSONSchemaCore} 返回this支持链式调用
96
- */
97
- setProperty(name, propertySchema) {
98
- if (!this.schema.properties) {
99
- this.schema.properties = {};
100
- }
101
- this.schema.properties[name] = propertySchema;
102
- return this;
103
- }
104
-
105
- /**
106
- * 设置多个属性
107
- * @param {Object} properties - 属性对象
108
- * @returns {JSONSchemaCore} 返回this支持链式调用
109
- */
110
- setProperties(properties) {
111
- if (typeof properties !== 'object' || properties === null) {
112
- throw new Error('Properties must be an object');
113
- }
114
- this.schema.properties = { ...this.schema.properties, ...properties };
115
- return this;
116
- }
117
-
118
- /**
119
- * 设置数组items
120
- * @param {Object} itemsSchema - items的Schema
121
- * @returns {JSONSchemaCore} 返回this支持链式调用
122
- */
123
- setItems(itemsSchema) {
124
- this.schema.items = itemsSchema;
125
- return this;
126
- }
127
-
128
- /**
129
- * 设置字符串格式
130
- * @param {string} format - 格式(email/uri/date-time等)
131
- * @returns {JSONSchemaCore} 返回this支持链式调用
132
- */
133
- setFormat(format) {
134
- this.schema.format = format;
135
- return this;
136
- }
137
-
138
- /**
139
- * 设置字符串正则模式
140
- * @param {string} pattern - 正则表达式字符串
141
- * @returns {JSONSchemaCore} 返回this支持链式调用
142
- */
143
- setPattern(pattern) {
144
- this.schema.pattern = pattern;
145
- return this;
146
- }
147
-
148
- /**
149
- * 设置数值范围(最小值)
150
- * @param {number} min - 最小值
151
- * @param {boolean} exclusive - 是否不包含边界(默认false)
152
- * @returns {JSONSchemaCore} 返回this支持链式调用
153
- */
154
- setMinimum(min, exclusive = false) {
155
- if (exclusive) {
156
- this.schema.exclusiveMinimum = min;
157
- } else {
158
- this.schema.minimum = min;
159
- }
160
- return this;
161
- }
162
-
163
- /**
164
- * 设置数值范围(最大值)
165
- * @param {number} max - 最大值
166
- * @param {boolean} exclusive - 是否不包含边界(默认false)
167
- * @returns {JSONSchemaCore} 返回this支持链式调用
168
- */
169
- setMaximum(max, exclusive = false) {
170
- if (exclusive) {
171
- this.schema.exclusiveMaximum = max;
172
- } else {
173
- this.schema.maximum = max;
174
- }
175
- return this;
176
- }
177
-
178
- /**
179
- * 设置字符串长度范围
180
- * @param {number} min - 最小长度
181
- * @param {number} max - 最大长度
182
- * @returns {JSONSchemaCore} 返回this支持链式调用
183
- */
184
- setLength(min, max) {
185
- if (min !== undefined) {
186
- this.schema.minLength = min;
187
- }
188
- if (max !== undefined) {
189
- this.schema.maxLength = max;
190
- }
191
- return this;
192
- }
193
-
194
- /**
195
- * 设置数组长度范围
196
- * @param {number} min - 最小长度
197
- * @param {number} max - 最大长度
198
- * @returns {JSONSchemaCore} 返回this支持链式调用
199
- */
200
- setArrayLength(min, max) {
201
- if (min !== undefined) {
202
- this.schema.minItems = min;
203
- }
204
- if (max !== undefined) {
205
- this.schema.maxItems = max;
206
- }
207
- return this;
208
- }
209
-
210
- /**
211
- * 设置枚举值
212
- * @param {Array} values - 枚举值数组
213
- * @returns {JSONSchemaCore} 返回this支持链式调用
214
- */
215
- setEnum(values) {
216
- if (!Array.isArray(values)) {
217
- throw new Error('Enum values must be an array');
218
- }
219
- this.schema.enum = values;
220
- return this;
221
- }
222
-
223
- /**
224
- * 设置默认值
225
- * @param {*} value - 默认值
226
- * @returns {JSONSchemaCore} 返回this支持链式调用
227
- */
228
- setDefault(value) {
229
- this.schema.default = value;
230
- return this;
231
- }
232
-
233
- /**
234
- * 设置描述
235
- * @param {string} description - 描述文本
236
- * @returns {JSONSchemaCore} 返回this支持链式调用
237
- */
238
- setDescription(description) {
239
- this.schema.description = description;
240
- return this;
241
- }
242
-
243
- /**
244
- * 设置标题
245
- * @param {string} title - 标题文本
246
- * @returns {JSONSchemaCore} 返回this支持链式调用
247
- */
248
- setTitle(title) {
249
- this.schema.title = title;
250
- return this;
251
- }
252
-
253
- /**
254
- * 添加自定义关键字
255
- * @param {string} keyword - 关键字名称
256
- * @param {*} value - 关键字值
257
- * @returns {JSONSchemaCore} 返回this支持链式调用
258
- */
259
- addCustomKeyword(keyword, value) {
260
- this.schema[keyword] = value;
261
- return this;
262
- }
263
-
264
- /**
265
- * 合并另一个Schema
266
- * @param {Object} otherSchema - 要合并的Schema对象
267
- * @returns {JSONSchemaCore} 返回this支持链式调用
268
- */
269
- merge(otherSchema) {
270
- this.schema = {
271
- ...this.schema,
272
- ...otherSchema
273
- };
274
- return this;
275
- }
276
-
277
- /**
278
- * 转换为JSON字符串
279
- * @param {number} space - 缩进空格数(默认2)
280
- * @returns {string} JSON字符串
281
- */
282
- toJSON(space = 2) {
283
- return JSON.stringify(this.schema, null, space);
284
- }
285
-
286
- /**
287
- * 克隆当前Schema
288
- * @returns {JSONSchemaCore} 新的JSONSchemaCore实例
289
- */
290
- clone() {
291
- return new JSONSchemaCore(this.schema, this.options);
292
- }
293
-
294
- /**
295
- * 验证Schema是否有效
296
- * @returns {Object} 验证结果 { valid: boolean, errors: Array }
297
- */
298
- validateSchema() {
299
- const errors = [];
300
-
301
- // 基本验证
302
- if (!this.schema.type && !this.schema.properties && !this.schema.items) {
303
- errors.push('Schema must have type, properties, or items');
304
- }
305
-
306
- // 类型验证
307
- if (this.schema.type) {
308
- const validTypes = ['string', 'number', 'integer', 'boolean', 'object', 'array', 'null'];
309
- if (!validTypes.includes(this.schema.type)) {
310
- errors.push(`Invalid type: ${this.schema.type}`);
311
- }
312
- }
313
-
314
- return {
315
- valid: errors.length === 0,
316
- errors
317
- };
318
- }
319
-
320
- /**
321
- * 静态方法:从JSON字符串创建
322
- * @static
323
- * @param {string} jsonString - JSON字符串
324
- * @returns {JSONSchemaCore} JSONSchemaCore实例
325
- */
326
- static fromJSON(jsonString) {
327
- try {
328
- const schema = JSON.parse(jsonString);
329
- return new JSONSchemaCore(schema);
330
- } catch (error) {
331
- throw new Error(`Invalid JSON: ${error.message}`);
332
- }
333
- }
334
-
335
- /**
336
- * 静态方法:创建简单类型Schema
337
- * @static
338
- * @param {string} type - 类型名称
339
- * @returns {JSONSchemaCore} JSONSchemaCore实例
340
- */
341
- static createSimpleType(type) {
342
- return new JSONSchemaCore({ type });
343
- }
344
- }
345
-
346
- module.exports = JSONSchemaCore;
347
-
@@ -1,130 +0,0 @@
1
- /**
2
- * 语言管理器
3
- *
4
- * 管理多语言支持,提供语言切换功能
5
- *
6
- * @module lib/core/Locale
7
- */
8
-
9
- const { getErrorInfo } = require('./ErrorCodes');
10
- const defaultLocales = require('../locales');
11
-
12
- class Locale {
13
- /**
14
- * 当前语言
15
- * @private
16
- */
17
- static currentLocale = 'en-US';
18
-
19
- /**
20
- * 语言包存储
21
- * @private
22
- */
23
- static locales = { ...defaultLocales };
24
-
25
- /**
26
- * 自定义消息(全局)
27
- * @private
28
- */
29
- static customMessages = {};
30
-
31
- /**
32
- * 设置当前语言
33
- * @param {string} locale - 语言代码 (zh-CN, en-US等)
34
- */
35
- static setLocale(locale) {
36
- this.currentLocale = locale;
37
- }
38
-
39
- /**
40
- * 获取当前语言
41
- * @returns {string} 当前语言代码
42
- */
43
- static getLocale() {
44
- return this.currentLocale;
45
- }
46
-
47
- /**
48
- * 添加语言包
49
- * @param {string} locale - 语言代码
50
- * @param {Object} messages - 消息对象
51
- */
52
- static addLocale(locale, messages) {
53
- this.locales[locale] = { ...(this.locales[locale] || {}), ...messages };
54
- }
55
-
56
- /**
57
- * 设置全局自定义消息
58
- * @param {Object} messages - 消息对象
59
- */
60
- static setMessages(messages) {
61
- this.customMessages = { ...this.customMessages, ...messages };
62
- }
63
-
64
- /**
65
- * 获取错误消息配置
66
- * @param {string} type - 错误类型或消息字符串
67
- * @param {Object} [customMessages] - 自定义消息
68
- * @param {string} [locale] - 指定语言(可选,默认使用当前语言)
69
- * @returns {Object|string} 消息配置对象 { code, message } 或字符串(向后兼容)
70
- * @version 1.1.5 - 支持对象格式
71
- */
72
- static getMessage(type, customMessages = {}, locale = null) {
73
- // 使用指定的语言或当前全局语言
74
- const targetLocale = locale || this.currentLocale;
75
-
76
- // 优先级: 自定义消息 > 全局自定义消息 > 语言包 > ErrorCodes > 原字符串
77
-
78
- // 1. 查找消息配置
79
- let messageConfig = customMessages[type]
80
- || this.customMessages[type]
81
- || (this.locales[targetLocale] && this.locales[targetLocale][type]);
82
-
83
- // 2. 如果未找到,尝试从 ErrorCodes 获取
84
- if (!messageConfig) {
85
- const errorInfo = getErrorInfo(type);
86
- if (errorInfo.code === 'UNKNOWN_ERROR') {
87
- // ✅ 向后兼容:直接返回原字符串(支持硬编码消息)
88
- return type;
89
- }
90
- messageConfig = errorInfo.message;
91
- }
92
-
93
- // 3. 规范化为对象格式(v1.1.5 新增)
94
- if (typeof messageConfig === 'string') {
95
- // 字符串格式 → 转换为对象格式(向后兼容)
96
- return { code: type, message: messageConfig };
97
- }
98
-
99
- if (typeof messageConfig === 'object' && messageConfig !== null && messageConfig.message) {
100
- // 对象格式 → 直接使用
101
- return {
102
- code: messageConfig.code || type, // 无 code 时使用 type 作为 code
103
- message: messageConfig.message
104
- };
105
- }
106
-
107
- // 4. 降级处理(边界情况)
108
- return { code: type, message: type };
109
- }
110
-
111
- /**
112
- * 获取所有可用语言
113
- * @returns {Array<string>} 语言代码数组
114
- */
115
- static getAvailableLocales() {
116
- return ['en-US', 'zh-CN', ...Object.keys(this.locales)];
117
- }
118
-
119
- /**
120
- * 重置语言管理器
121
- * 用于测试
122
- */
123
- static reset() {
124
- this.currentLocale = 'en-US';
125
- this.locales = { ...defaultLocales };
126
- this.customMessages = {};
127
- }
128
- }
129
-
130
- module.exports = Locale;
@@ -1,98 +0,0 @@
1
- /**
2
- * 消息模板引擎
3
- *
4
- * 支持模板变量替换,如 {{#label}}, {{#limit}} 等
5
- *
6
- * @module lib/core/MessageTemplate
7
- */
8
-
9
- class MessageTemplate {
10
- /**
11
- * 创建消息模板实例
12
- * @param {string} template - 模板字符串
13
- */
14
- constructor(template) {
15
- this.template = template || '';
16
- }
17
-
18
- /**
19
- * 渲染模板
20
- * @param {Object} context - 上下文对象
21
- * @param {string} [context.label] - 字段标签
22
- * @param {string} [context.key] - 字段名
23
- * @param {*} [context.value] - 当前值
24
- * @param {*} [context.limit] - 限制值
25
- * @param {Array|string} [context.valids] - 有效值列表
26
- * @param {RegExp} [context.pattern] - 正则表达式
27
- * @returns {string} 渲染后的消息
28
- */
29
- render(context = {}) {
30
- let message = this.template;
31
-
32
- // 定义支持的模板格式(按优先级)
33
- const patterns = [
34
- /\{\{#(\w+)\}\}/g, // {{#variable}} - 优先级1(现有格式)
35
- /\{\{(\w+)\}\}/g, // {{variable}} - 优先级2(无井号)
36
- /\{(\w+)\}/g // {variable} - 优先级3(单花括号)
37
- ];
38
-
39
- // 按优先级依次替换
40
- for (const pattern of patterns) {
41
- message = message.replace(pattern, (match, key) => {
42
- const value = context[key];
43
-
44
- // 特殊处理
45
- if (value === undefined || value === null) {
46
- return match; // 保留原样
47
- }
48
-
49
- // 数组转字符串
50
- if (Array.isArray(value)) {
51
- return value.join(', ');
52
- }
53
-
54
- // RegExp转字符串
55
- if (value instanceof RegExp) {
56
- return value.toString();
57
- }
58
-
59
- // Date转字符串
60
- if (value instanceof Date) {
61
- return value.toISOString();
62
- }
63
-
64
- return String(value);
65
- });
66
- }
67
-
68
- return message;
69
- }
70
-
71
- /**
72
- * 静态方法:快速渲染
73
- * @param {string} template - 模板字符串
74
- * @param {Object} context - 上下文对象
75
- * @returns {string} 渲染后的消息
76
- */
77
- static render(template, context) {
78
- const instance = new MessageTemplate(template);
79
- return instance.render(context);
80
- }
81
-
82
- /**
83
- * 批量渲染
84
- * @param {Object} templates - 模板对象 { type: template }
85
- * @param {Object} context - 上下文对象
86
- * @returns {Object} 渲染后的消息对象
87
- */
88
- static renderBatch(templates, context) {
89
- const result = {};
90
- for (const [type, template] of Object.entries(templates)) {
91
- result[type] = MessageTemplate.render(template, context);
92
- }
93
- return result;
94
- }
95
- }
96
-
97
- module.exports = MessageTemplate;
98
-