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,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
-