@wener/common 2.0.2 → 2.0.3

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 (351) hide show
  1. package/lib/ai/qwen3vl/index.js +2 -0
  2. package/lib/ai/qwen3vl/index.js.map +1 -0
  3. package/lib/ai/qwen3vl/utils.js +31 -0
  4. package/lib/ai/qwen3vl/utils.js.map +1 -0
  5. package/lib/ai/vision/DocLayoutElementTypeSchema.js +28 -0
  6. package/lib/ai/vision/DocLayoutElementTypeSchema.js.map +1 -0
  7. package/lib/ai/vision/ImageAnnotationSchema.js +50 -0
  8. package/lib/ai/vision/ImageAnnotationSchema.js.map +1 -0
  9. package/lib/ai/vision/index.js +3 -0
  10. package/lib/ai/vision/index.js.map +1 -0
  11. package/lib/ai/vision/resolveImageAnnotation.js +105 -0
  12. package/lib/ai/vision/resolveImageAnnotation.js.map +1 -0
  13. package/lib/cn/ChineseResidentIdNo.js +21 -14
  14. package/lib/cn/ChineseResidentIdNo.js.map +1 -0
  15. package/lib/cn/ChineseResidentIdNo.test.js +1 -1
  16. package/lib/cn/DivisionCode.js +30 -25
  17. package/lib/cn/DivisionCode.js.map +1 -0
  18. package/lib/cn/DivisionCode.test.js +1 -1
  19. package/lib/cn/Mod11.js +38 -81
  20. package/lib/cn/Mod11.js.map +1 -0
  21. package/lib/cn/Mod31.js +41 -90
  22. package/lib/cn/Mod31.js.map +1 -0
  23. package/lib/cn/UnifiedSocialCreditCode.js +43 -34
  24. package/lib/cn/UnifiedSocialCreditCode.js.map +1 -0
  25. package/lib/cn/UnifiedSocialCreditCode.test.js +1 -1
  26. package/lib/cn/formatChineseAmount.js +77 -0
  27. package/lib/cn/formatChineseAmount.js.map +1 -0
  28. package/lib/cn/index.js +7 -1
  29. package/lib/cn/index.js.map +1 -0
  30. package/lib/cn/parseChineseNumber.js +94 -0
  31. package/lib/cn/parseChineseNumber.js.map +1 -0
  32. package/lib/cn/parseChineseNumber.test.js +278 -0
  33. package/lib/cn/pinyin/cartesianProduct.js +22 -0
  34. package/lib/cn/pinyin/cartesianProduct.js.map +1 -0
  35. package/lib/cn/pinyin/cartesianProduct.test.js +179 -0
  36. package/lib/cn/pinyin/data.json +23573 -0
  37. package/lib/cn/pinyin/loader.js +14 -0
  38. package/lib/cn/pinyin/loader.js.map +1 -0
  39. package/lib/cn/pinyin/preload.js +3 -0
  40. package/lib/cn/pinyin/preload.js.map +1 -0
  41. package/lib/cn/pinyin/toPinyin.test.js +167 -0
  42. package/lib/cn/pinyin/toPinyinPure.js +33 -0
  43. package/lib/cn/pinyin/toPinyinPure.js.map +1 -0
  44. package/lib/cn/pinyin/transform.js +14 -0
  45. package/lib/cn/pinyin/transform.js.map +1 -0
  46. package/lib/cn/types.d.js +2 -0
  47. package/lib/cn/types.d.js.map +1 -0
  48. package/lib/consola/createStandardConsolaReporter.js +6 -6
  49. package/lib/consola/createStandardConsolaReporter.js.map +1 -0
  50. package/lib/consola/formatLogObject.js +65 -145
  51. package/lib/consola/formatLogObject.js.map +1 -0
  52. package/lib/consola/formatLogObject.test.js +184 -0
  53. package/lib/consola/index.js +1 -0
  54. package/lib/consola/index.js.map +1 -0
  55. package/lib/data/formatSort.js +6 -5
  56. package/lib/data/formatSort.js.map +1 -0
  57. package/lib/data/index.js +1 -0
  58. package/lib/data/index.js.map +1 -0
  59. package/lib/data/maybeNumber.js +5 -7
  60. package/lib/data/maybeNumber.js.map +1 -0
  61. package/lib/data/parseSort.js +22 -28
  62. package/lib/data/parseSort.js.map +1 -0
  63. package/lib/data/resolvePagination.js +13 -17
  64. package/lib/data/resolvePagination.js.map +1 -0
  65. package/lib/data/types.d.js +2 -0
  66. package/lib/data/types.d.js.map +1 -0
  67. package/lib/dayjs/dayjs.js +21 -19
  68. package/lib/dayjs/dayjs.js.map +1 -0
  69. package/lib/dayjs/formatDuration.js +15 -14
  70. package/lib/dayjs/formatDuration.js.map +1 -0
  71. package/lib/dayjs/index.js +2 -0
  72. package/lib/dayjs/index.js.map +1 -0
  73. package/lib/dayjs/parseDuration.js +5 -8
  74. package/lib/dayjs/parseDuration.js.map +1 -0
  75. package/lib/dayjs/parseRelativeTime.js +90 -0
  76. package/lib/dayjs/parseRelativeTime.js.map +1 -0
  77. package/lib/dayjs/parseRelativeTime.test.js +247 -0
  78. package/lib/dayjs/resolveRelativeTime.js +158 -0
  79. package/lib/dayjs/resolveRelativeTime.js.map +1 -0
  80. package/lib/dayjs/resolveRelativeTime.test.js +310 -0
  81. package/lib/decimal/index.js +1 -0
  82. package/lib/decimal/index.js.map +1 -0
  83. package/lib/decimal/parseDecimal.js +3 -1
  84. package/lib/decimal/parseDecimal.js.map +1 -0
  85. package/lib/emittery/emitter.js +10 -0
  86. package/lib/emittery/emitter.js.map +1 -0
  87. package/lib/emittery/index.js +2 -0
  88. package/lib/emittery/index.js.map +1 -0
  89. package/lib/foundation/schema/SexType.js +5 -3
  90. package/lib/foundation/schema/SexType.js.map +1 -0
  91. package/lib/foundation/schema/index.js +1 -0
  92. package/lib/foundation/schema/index.js.map +1 -0
  93. package/lib/foundation/schema/parseSexType.js +1 -0
  94. package/lib/foundation/schema/parseSexType.js.map +1 -0
  95. package/lib/foundation/schema/types.js +4 -2
  96. package/lib/foundation/schema/types.js.map +1 -0
  97. package/lib/fs/FileSystemError.js +23 -0
  98. package/lib/fs/FileSystemError.js.map +1 -0
  99. package/lib/fs/IFileSystem.d.js +3 -0
  100. package/lib/fs/IFileSystem.d.js.map +1 -0
  101. package/lib/fs/MemoryFileSystem.test.js +188 -0
  102. package/lib/fs/createBrowserFileSystem.js +248 -0
  103. package/lib/fs/createBrowserFileSystem.js.map +1 -0
  104. package/lib/fs/createMemoryFileSystem.js +516 -0
  105. package/lib/fs/createMemoryFileSystem.js.map +1 -0
  106. package/lib/fs/createSandboxFileSystem.js +108 -0
  107. package/lib/fs/createSandboxFileSystem.js.map +1 -0
  108. package/lib/fs/createWebDavFileSystem.js +137 -0
  109. package/lib/fs/createWebDavFileSystem.js.map +1 -0
  110. package/lib/fs/findMimeType.js +17 -0
  111. package/lib/fs/findMimeType.js.map +1 -0
  112. package/lib/fs/index.js +8 -0
  113. package/lib/fs/index.js.map +1 -0
  114. package/lib/fs/orpc/FileSystemContract.js +93 -0
  115. package/lib/fs/orpc/FileSystemContract.js.map +1 -0
  116. package/lib/fs/orpc/createContractClientFileSystem.js +93 -0
  117. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -0
  118. package/lib/fs/orpc/index.js +3 -0
  119. package/lib/fs/orpc/index.js.map +1 -0
  120. package/lib/fs/orpc/server/createFileSystemContractImpl.js +63 -0
  121. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -0
  122. package/lib/fs/orpc/server/index.js +2 -0
  123. package/lib/fs/orpc/server/index.js.map +1 -0
  124. package/lib/fs/s3/createS3MiniFileSystem.js +705 -0
  125. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -0
  126. package/lib/fs/s3/index.js +2 -0
  127. package/lib/fs/s3/index.js.map +1 -0
  128. package/lib/fs/s3/s3mini.test.js +584 -0
  129. package/lib/fs/scandir.js +59 -0
  130. package/lib/fs/scandir.js.map +1 -0
  131. package/lib/fs/server/createDatabaseFileSystem.js +750 -0
  132. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -0
  133. package/lib/fs/server/createNodeFileSystem.js +401 -0
  134. package/lib/fs/server/createNodeFileSystem.js.map +1 -0
  135. package/lib/fs/server/dbfs.test.js +221 -0
  136. package/lib/fs/server/index.js +2 -0
  137. package/lib/fs/server/index.js.map +1 -0
  138. package/lib/fs/server/loadTestDatabase.js +127 -0
  139. package/lib/fs/server/loadTestDatabase.js.map +1 -0
  140. package/lib/fs/tests/runFileSystemTest.js +318 -0
  141. package/lib/fs/tests/runFileSystemTest.js.map +1 -0
  142. package/lib/fs/types.js +27 -0
  143. package/lib/fs/types.js.map +1 -0
  144. package/lib/fs/utils/getFileUrl.js +35 -0
  145. package/lib/fs/utils/getFileUrl.js.map +1 -0
  146. package/lib/fs/utils.js +22 -0
  147. package/lib/fs/utils.js.map +1 -0
  148. package/lib/index.js +1 -0
  149. package/lib/index.js.map +1 -0
  150. package/lib/jsonschema/JsonSchema.js +146 -172
  151. package/lib/jsonschema/JsonSchema.js.map +1 -0
  152. package/lib/jsonschema/forEachJsonSchema.js +44 -0
  153. package/lib/jsonschema/forEachJsonSchema.js.map +1 -0
  154. package/lib/jsonschema/index.js +2 -0
  155. package/lib/jsonschema/index.js.map +1 -0
  156. package/lib/jsonschema/types.d.js +2 -0
  157. package/lib/jsonschema/types.d.js.map +1 -0
  158. package/lib/meta/defineFileType.js +20 -103
  159. package/lib/meta/defineFileType.js.map +1 -0
  160. package/lib/meta/defineInit.js +31 -250
  161. package/lib/meta/defineInit.js.map +1 -0
  162. package/lib/meta/defineMetadata.js +24 -140
  163. package/lib/meta/defineMetadata.js.map +1 -0
  164. package/lib/meta/index.js +1 -0
  165. package/lib/meta/index.js.map +1 -0
  166. package/lib/orpc/createOpenApiContractClient.js +27 -0
  167. package/lib/orpc/createOpenApiContractClient.js.map +1 -0
  168. package/lib/orpc/createRpcContractClient.js +34 -0
  169. package/lib/orpc/createRpcContractClient.js.map +1 -0
  170. package/lib/orpc/index.js +3 -0
  171. package/lib/orpc/index.js.map +1 -0
  172. package/lib/orpc/resolveLinkPlugins.js +28 -0
  173. package/lib/orpc/resolveLinkPlugins.js.map +1 -0
  174. package/lib/password/PHC.js +63 -87
  175. package/lib/password/PHC.js.map +1 -0
  176. package/lib/password/PHC.test.js +11 -3
  177. package/lib/password/Password.js +29 -294
  178. package/lib/password/Password.js.map +1 -0
  179. package/lib/password/Password.test.js +35 -22
  180. package/lib/password/createArgon2PasswordAlgorithm.js +35 -191
  181. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -0
  182. package/lib/password/createBase64PasswordAlgorithm.js +8 -141
  183. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -0
  184. package/lib/password/createBcryptPasswordAlgorithm.js +13 -168
  185. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -0
  186. package/lib/password/createPBKDF2PasswordAlgorithm.js +46 -228
  187. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -0
  188. package/lib/password/createScryptPasswordAlgorithm.js +55 -211
  189. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -0
  190. package/lib/password/index.js +1 -0
  191. package/lib/password/index.js.map +1 -0
  192. package/lib/password/server/index.js +1 -0
  193. package/lib/password/server/index.js.map +1 -0
  194. package/lib/resource/Identifiable.js +2 -0
  195. package/lib/resource/Identifiable.js.map +1 -0
  196. package/lib/resource/ListQuery.js +21 -93
  197. package/lib/resource/ListQuery.js.map +1 -0
  198. package/lib/resource/getTitleOfResource.js +3 -5
  199. package/lib/resource/getTitleOfResource.js.map +1 -0
  200. package/lib/resource/index.js +1 -0
  201. package/lib/resource/index.js.map +1 -0
  202. package/lib/resource/schema/AnyResourceSchema.js +2 -1
  203. package/lib/resource/schema/AnyResourceSchema.js.map +1 -0
  204. package/lib/resource/schema/BaseResourceSchema.js +2 -1
  205. package/lib/resource/schema/BaseResourceSchema.js.map +1 -0
  206. package/lib/resource/schema/ResourceActionType.js +6 -4
  207. package/lib/resource/schema/ResourceActionType.js.map +1 -0
  208. package/lib/resource/schema/ResourceStatus.js +5 -3
  209. package/lib/resource/schema/ResourceStatus.js.map +1 -0
  210. package/lib/resource/schema/ResourceType.js +5 -3
  211. package/lib/resource/schema/ResourceType.js.map +1 -0
  212. package/lib/resource/schema/index.js +1 -0
  213. package/lib/resource/schema/index.js.map +1 -0
  214. package/lib/resource/schema/types.js +16 -20
  215. package/lib/resource/schema/types.js.map +1 -0
  216. package/lib/s3/formatS3Url.js +65 -0
  217. package/lib/s3/formatS3Url.js.map +1 -0
  218. package/lib/s3/formatS3Url.test.js +262 -0
  219. package/lib/s3/index.js +3 -0
  220. package/lib/s3/index.js.map +1 -0
  221. package/lib/s3/parseS3Url.js +65 -0
  222. package/lib/s3/parseS3Url.js.map +1 -0
  223. package/lib/s3/parseS3Url.test.js +270 -0
  224. package/lib/schema/SchemaRegistry.js +38 -38
  225. package/lib/schema/SchemaRegistry.js.map +1 -0
  226. package/lib/schema/TypeSchema.d.js +2 -0
  227. package/lib/schema/TypeSchema.d.js.map +1 -0
  228. package/lib/schema/createSchemaData.js +26 -125
  229. package/lib/schema/createSchemaData.js.map +1 -0
  230. package/lib/schema/findJsonSchemaByPath.js +13 -36
  231. package/lib/schema/findJsonSchemaByPath.js.map +1 -0
  232. package/lib/schema/formatZodError.js +140 -0
  233. package/lib/schema/formatZodError.js.map +1 -0
  234. package/lib/schema/formatZodError.test.js +196 -0
  235. package/lib/schema/getSchemaCache.js +5 -5
  236. package/lib/schema/getSchemaCache.js.map +1 -0
  237. package/lib/schema/getSchemaOptions.js +8 -11
  238. package/lib/schema/getSchemaOptions.js.map +1 -0
  239. package/lib/schema/index.js +2 -1
  240. package/lib/schema/index.js.map +1 -0
  241. package/lib/schema/toJsonSchema.js +47 -290
  242. package/lib/schema/toJsonSchema.js.map +1 -0
  243. package/lib/schema/validate.js +33 -45
  244. package/lib/schema/validate.js.map +1 -0
  245. package/lib/tools/generateSchema.js +39 -197
  246. package/lib/tools/generateSchema.js.map +1 -0
  247. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +55 -143
  248. package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -0
  249. package/lib/utils/buildBaseUrl.js +13 -0
  250. package/lib/utils/buildBaseUrl.js.map +1 -0
  251. package/lib/utils/buildRedactorFormSchema.js +59 -0
  252. package/lib/utils/buildRedactorFormSchema.js.map +1 -0
  253. package/lib/utils/getEstimateProcessTime.js +12 -11
  254. package/lib/utils/getEstimateProcessTime.js.map +1 -0
  255. package/lib/utils/index.js +3 -0
  256. package/lib/utils/index.js.map +1 -0
  257. package/lib/utils/resolveFeatureOptions.js +12 -0
  258. package/lib/utils/resolveFeatureOptions.js.map +1 -0
  259. package/package.json +61 -13
  260. package/src/ai/qwen3vl/index.ts +1 -0
  261. package/src/ai/qwen3vl/utils.ts +36 -0
  262. package/src/ai/vision/DocLayoutElementTypeSchema.ts +30 -0
  263. package/src/ai/vision/ImageAnnotationSchema.ts +60 -0
  264. package/src/ai/vision/index.ts +2 -0
  265. package/src/ai/vision/resolveImageAnnotation.ts +135 -0
  266. package/src/cn/ChineseResidentIdNo.test.ts +1 -1
  267. package/src/cn/ChineseResidentIdNo.ts +8 -0
  268. package/src/cn/DivisionCode.test.ts +1 -1
  269. package/src/cn/DivisionCode.ts +8 -0
  270. package/src/cn/UnifiedSocialCreditCode.test.ts +1 -1
  271. package/src/cn/UnifiedSocialCreditCode.ts +15 -0
  272. package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +23 -0
  273. package/src/cn/formatChineseAmount.ts +61 -0
  274. package/src/cn/index.ts +7 -1
  275. package/src/cn/parseChineseNumber.test.ts +159 -0
  276. package/src/cn/parseChineseNumber.ts +97 -0
  277. package/src/cn/pinyin/cartesianProduct.test.ts +64 -0
  278. package/src/cn/pinyin/cartesianProduct.ts +24 -0
  279. package/src/cn/pinyin/data.json +23573 -0
  280. package/src/cn/pinyin/loader.ts +12 -0
  281. package/src/cn/pinyin/preload.ts +3 -0
  282. package/src/cn/pinyin/toPinyin.test.ts +12 -0
  283. package/src/cn/pinyin/toPinyinPure.ts +43 -0
  284. package/src/cn/pinyin/transform.ts +12 -0
  285. package/src/consola/formatLogObject.test.ts +27 -0
  286. package/src/consola/formatLogObject.ts +34 -6
  287. package/src/dayjs/dayjs.ts +18 -18
  288. package/src/dayjs/index.ts +3 -1
  289. package/src/dayjs/parseRelativeTime.test.ts +185 -0
  290. package/src/dayjs/parseRelativeTime.ts +115 -0
  291. package/src/dayjs/resolveRelativeTime.test.ts +357 -0
  292. package/src/dayjs/resolveRelativeTime.ts +167 -0
  293. package/src/emittery/emitter.ts +9 -0
  294. package/src/emittery/index.ts +1 -0
  295. package/src/fs/FileSystemError.ts +26 -0
  296. package/src/fs/IFileSystem.d.ts +102 -0
  297. package/src/fs/MemoryFileSystem.test.ts +37 -0
  298. package/src/fs/createBrowserFileSystem.ts +291 -0
  299. package/src/fs/createMemoryFileSystem.ts +604 -0
  300. package/src/fs/createSandboxFileSystem.ts +136 -0
  301. package/src/fs/createWebDavFileSystem.ts +172 -0
  302. package/src/fs/findMimeType.ts +23 -0
  303. package/src/fs/index.ts +8 -0
  304. package/src/fs/orpc/FileSystemContract.ts +92 -0
  305. package/src/fs/orpc/createContractClientFileSystem.ts +115 -0
  306. package/src/fs/orpc/index.ts +2 -0
  307. package/src/fs/orpc/server/createFileSystemContractImpl.ts +64 -0
  308. package/src/fs/orpc/server/index.ts +1 -0
  309. package/src/fs/s3/createS3MiniFileSystem.ts +830 -0
  310. package/src/fs/s3/index.ts +1 -0
  311. package/src/fs/s3/s3mini.test.ts +264 -0
  312. package/src/fs/scandir.ts +75 -0
  313. package/src/fs/server/createDatabaseFileSystem.ts +668 -0
  314. package/src/fs/server/createNodeFileSystem.ts +499 -0
  315. package/src/fs/server/dbfs.test.ts +47 -0
  316. package/src/fs/server/index.ts +1 -0
  317. package/src/fs/server/loadTestDatabase.ts +131 -0
  318. package/src/fs/tests/runFileSystemTest.ts +288 -0
  319. package/src/fs/types.ts +29 -0
  320. package/src/fs/utils/getFileUrl.ts +44 -0
  321. package/src/fs/utils.ts +23 -0
  322. package/src/jsonschema/JsonSchema.ts +118 -110
  323. package/src/jsonschema/forEachJsonSchema.ts +50 -0
  324. package/src/jsonschema/index.ts +1 -0
  325. package/src/orpc/createOpenApiContractClient.ts +52 -0
  326. package/src/orpc/createRpcContractClient.ts +50 -0
  327. package/src/orpc/index.ts +2 -0
  328. package/src/orpc/resolveLinkPlugins.ts +29 -0
  329. package/src/password/PHC.ts +3 -3
  330. package/src/password/Password.test.ts +1 -1
  331. package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
  332. package/src/resource/schema/AnyResourceSchema.ts +16 -2
  333. package/src/s3/formatS3Url.test.ts +254 -0
  334. package/src/s3/formatS3Url.ts +84 -0
  335. package/src/s3/index.ts +2 -0
  336. package/src/s3/parseS3Url.test.ts +258 -0
  337. package/src/s3/parseS3Url.ts +88 -0
  338. package/src/schema/SchemaRegistry.ts +35 -33
  339. package/src/schema/formatZodError.test.ts +196 -0
  340. package/src/schema/formatZodError.ts +151 -0
  341. package/src/schema/getSchemaOptions.ts +2 -2
  342. package/src/schema/index.ts +1 -1
  343. package/src/utils/buildBaseUrl.ts +12 -0
  344. package/src/utils/buildRedactorFormSchema.ts +85 -0
  345. package/src/utils/index.ts +4 -0
  346. package/src/utils/resolveFeatureOptions.ts +14 -0
  347. package/src/cn/ChineseResidentIdNo.mod.ts +0 -7
  348. package/src/cn/DivisionCode.mod.ts +0 -7
  349. package/src/cn/UnifiedSocialCreditCode.mod.ts +0 -7
  350. package/src/cn/mod.ts +0 -3
  351. package/src/schema/SchemaRegistry.mod.ts +0 -1
@@ -0,0 +1,151 @@
1
+ import { ZodError } from 'zod/v4';
2
+ import { findJsonSchemaByPath } from './findJsonSchemaByPath';
3
+ import type { TypeSchema } from './TypeSchema';
4
+
5
+ export function formatZodError(error: ZodError, schema?: TypeSchema): string {
6
+ if (!error.issues || error.issues.length === 0) {
7
+ return error.message || '验证失败';
8
+ }
9
+
10
+ const messages: string[] = [];
11
+
12
+ // Iterate through issues and format each one
13
+ // We use manual iteration instead of error.format() to have better control
14
+ // over field name formatting with schema descriptions
15
+ for (const issue of error.issues) {
16
+ const formatted = formatIssueMessage(issue, schema);
17
+ if (formatted) {
18
+ const path = issue.path.map((p) => (typeof p === 'symbol' ? String(p) : p)) as (string | number)[];
19
+ let fieldName = formatPath(path);
20
+
21
+ // Try to get field description from schema
22
+ if (schema && path.length > 0) {
23
+ const fieldPath = path.map(String).join('.');
24
+ const fieldSchema = findJsonSchemaByPath(schema, fieldPath);
25
+ if (fieldSchema?.description) {
26
+ fieldName = fieldSchema.description;
27
+ }
28
+ }
29
+
30
+ messages.push(`${fieldName}: ${formatted}`);
31
+ }
32
+ }
33
+
34
+ return messages.join(';');
35
+ }
36
+
37
+ function formatIssueMessage(issue: ZodError['issues'][number], schema?: TypeSchema): string {
38
+ let message = issue.message;
39
+
40
+ // 处理常见的错误类型,生成更友好的消息
41
+ // Use string comparison to avoid TypeScript narrowing issues with Zod v4
42
+ const code = issue.code as string;
43
+ switch (code) {
44
+ case 'invalid_type': {
45
+ const invalidTypeIssue = issue as typeof issue & {
46
+ expected: string;
47
+ received: string;
48
+ };
49
+ if (invalidTypeIssue.received === 'undefined') {
50
+ message = '必填';
51
+ } else if (invalidTypeIssue.received === 'null') {
52
+ message = '不能为空';
53
+ } else {
54
+ message = issue.message || `期望类型 ${invalidTypeIssue.expected},但收到 ${invalidTypeIssue.received}`;
55
+ }
56
+ break;
57
+ }
58
+ case 'invalid_string': {
59
+ const invalidStringIssue = issue as typeof issue & {
60
+ validation?: string;
61
+ };
62
+ if (invalidStringIssue.validation === 'email') {
63
+ message = '请输入有效的邮箱地址';
64
+ } else if (invalidStringIssue.validation === 'url') {
65
+ message = '请输入有效的 URL';
66
+ } else if (invalidStringIssue.validation === 'uuid') {
67
+ message = '请输入有效的 UUID';
68
+ } else if (invalidStringIssue.validation === 'date') {
69
+ message = '请输入有效的日期';
70
+ }
71
+ break;
72
+ }
73
+ case 'too_small': {
74
+ const tooSmallIssue = issue as typeof issue & {
75
+ type: string;
76
+ minimum: number;
77
+ };
78
+ if (tooSmallIssue.type === 'string' && tooSmallIssue.minimum === 1) {
79
+ message = '不能为空';
80
+ } else if (tooSmallIssue.type === 'number') {
81
+ message = `至少需要 ${tooSmallIssue.minimum}`;
82
+ } else if (tooSmallIssue.type === 'array') {
83
+ message = `至少需要 ${tooSmallIssue.minimum} 项`;
84
+ }
85
+ break;
86
+ }
87
+ case 'too_big': {
88
+ const tooBigIssue = issue as typeof issue & {
89
+ type: string;
90
+ maximum: number;
91
+ };
92
+ if (tooBigIssue.type === 'string') {
93
+ message = `最多 ${tooBigIssue.maximum} 个字符`;
94
+ } else if (tooBigIssue.type === 'number') {
95
+ message = `最多 ${tooBigIssue.maximum}`;
96
+ } else if (tooBigIssue.type === 'array') {
97
+ message = `最多 ${tooBigIssue.maximum} 项`;
98
+ }
99
+ break;
100
+ }
101
+ case 'invalid_enum_value': {
102
+ const enumIssue = issue as typeof issue & {
103
+ options: readonly unknown[];
104
+ };
105
+ message = `必须是以下值之一: ${enumIssue.options?.map(String).join(', ') || '未知选项'}`;
106
+ break;
107
+ }
108
+ case 'unrecognized_keys': {
109
+ const unrecognizedIssue = issue as typeof issue & {
110
+ keys: readonly string[];
111
+ };
112
+ message = `不支持的字段: ${unrecognizedIssue.keys?.join(', ') || '未知字段'}`;
113
+ break;
114
+ }
115
+ case 'invalid_union': {
116
+ message = '不符合任何允许的类型';
117
+ break;
118
+ }
119
+ case 'invalid_union_discriminator': {
120
+ const discriminatorIssue = issue as typeof issue & {
121
+ options: readonly unknown[];
122
+ };
123
+ message = `必须是以下值之一: ${discriminatorIssue.options?.map(String).join(', ') || '未知选项'}`;
124
+ break;
125
+ }
126
+ case 'invalid_literal': {
127
+ const literalIssue = issue as typeof issue & {
128
+ expected: unknown;
129
+ };
130
+ message = `必须是 ${String(literalIssue.expected)}`;
131
+ break;
132
+ }
133
+ case 'custom': {
134
+ // 保留自定义错误消息
135
+ message = issue.message;
136
+ break;
137
+ }
138
+ default:
139
+ // 保留原始消息
140
+ message = issue.message;
141
+ }
142
+
143
+ return message;
144
+ }
145
+
146
+ function formatPath(path: (string | number)[]): string {
147
+ if (path.length === 0) {
148
+ return '表单';
149
+ }
150
+ return path.map(String).join('.');
151
+ }
@@ -1,13 +1,13 @@
1
1
  import { deepFreeze } from '@wener/utils';
2
2
  import { getSchemaCache } from './getSchemaCache';
3
- import { SchemaRegistry } from './SchemaRegistry.mod';
3
+ import { SchemaRegistry } from './SchemaRegistry';
4
4
  import type { TypeSchema } from './TypeSchema';
5
5
 
6
6
  export function getSchemaOptions(s: TypeSchema): Array<{ value: string; label: string }> {
7
7
  let js = SchemaRegistry.get(s);
8
8
  return getSchemaCache(s, 'options', () => {
9
9
  let out =
10
- (js.anyOf || js.oneOf)?.map((v) => {
10
+ (js.anyOf || js.oneOf)?.map((v: any) => {
11
11
  let value = v.const;
12
12
  return {
13
13
  label: String(v.description || v.title || value),
@@ -4,4 +4,4 @@ export { getSchemaOptions, getSchemaOptionLabel } from './getSchemaOptions';
4
4
  export { toJsonSchema } from './toJsonSchema';
5
5
  export { findJsonSchemaByPath } from './findJsonSchemaByPath';
6
6
  export { createSchemaData } from './createSchemaData';
7
- export { SchemaRegistry } from './SchemaRegistry.mod';
7
+ export { SchemaRegistry } from './SchemaRegistry';
@@ -0,0 +1,12 @@
1
+ function joinUrl(baseUrl: string, maybeUrl: string): string {
2
+ const sanitizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
3
+ const sanitizedEndpoint = maybeUrl.startsWith('/') ? maybeUrl.slice(1) : maybeUrl;
4
+ return `${sanitizedBase}/${sanitizedEndpoint}`;
5
+ }
6
+
7
+ export function buildBaseUrl(url: string, baseUrl: string | undefined | null): string {
8
+ if (!baseUrl || /^https?:/.test(url)) {
9
+ return url;
10
+ }
11
+ return joinUrl(baseUrl, url);
12
+ }
@@ -0,0 +1,85 @@
1
+ import { forEachJsonSchema, type JsonSchemaDef } from '../jsonschema';
2
+ import { toJsonSchema, type TypeSchema } from '../schema';
3
+
4
+ export const RedactedText = '[redacted]';
5
+
6
+ export function buildRedactorFormSchema(
7
+ ts: TypeSchema,
8
+ {
9
+ shouldRedact = (schema) => schema['x-sensitive'] === true,
10
+ replacer = () => RedactedText,
11
+ }: {
12
+ shouldRedact?: (schema: JsonSchemaDef) => boolean;
13
+ replacer?: (key: string, value: any) => any;
14
+ },
15
+ ) {
16
+ let js = toJsonSchema(ts);
17
+
18
+ let paths: string[][] = [];
19
+
20
+ forEachJsonSchema(js, (js, { path }) => {
21
+ if (shouldRedact(js)) {
22
+ paths.push(path);
23
+ }
24
+ });
25
+ const vis = (root: any, path: string[]) => {
26
+ switch (root) {
27
+ case null:
28
+ case undefined:
29
+ return;
30
+ }
31
+
32
+ let c = root;
33
+ for (let i = 0; i < path.length; i++) {
34
+ let k = path[i];
35
+ if (c && typeof c === 'object' && k in c) {
36
+ let v = c[k];
37
+ if (path.length === 1) {
38
+ c[k] = replacer(k, v);
39
+ } else if (Array.isArray(v)) {
40
+ for (let vv of v) {
41
+ vis(vv, path.slice(i + 1));
42
+ }
43
+ } else {
44
+ vis(v, path.slice(i + 1));
45
+ }
46
+ }
47
+ }
48
+ };
49
+
50
+ return (root: any) => {
51
+ if (!paths.length) {
52
+ return root;
53
+ }
54
+
55
+ paths.forEach((path) => {
56
+ vis(root, path);
57
+ });
58
+
59
+ return root;
60
+ };
61
+ }
62
+
63
+ function buildReversibleRedactText({
64
+ id,
65
+ type,
66
+ key,
67
+ timestamp,
68
+ }: {
69
+ id?: string | number;
70
+ type?: string;
71
+ key?: string;
72
+ timestamp?: number | boolean;
73
+ } = {}) {
74
+ if (!id) {
75
+ return RedactedText;
76
+ }
77
+ if (timestamp === true) {
78
+ timestamp = Date.now();
79
+ }
80
+ return `[redacted ${id}]`;
81
+ }
82
+
83
+ export function isRedactedText(v: any) {
84
+ return v === RedactedText || (typeof v === 'string' && v.startsWith('[redacted ') && v.endsWith(']'));
85
+ }
@@ -1 +1,5 @@
1
1
  export { getEstimateProcessTime } from './getEstimateProcessTime';
2
+
3
+ export { buildRedactorFormSchema } from './buildRedactorFormSchema';
4
+
5
+ export { buildBaseUrl } from './buildBaseUrl';
@@ -0,0 +1,14 @@
1
+ import { maybeFunction, type MaybeFunction } from '@wener/utils';
2
+
3
+ export function resolveFeatureOptions<T>(
4
+ value: boolean | T | undefined | null,
5
+ defaultValue: MaybeFunction<T>,
6
+ ): T | undefined {
7
+ if (value === false) {
8
+ return undefined;
9
+ }
10
+ if (value === true || value === undefined || value === null) {
11
+ return maybeFunction(defaultValue);
12
+ }
13
+ return value;
14
+ }
@@ -1,7 +0,0 @@
1
- export {
2
- ChineseResidentIdNoRegex as regex,
3
- parseChineseResidentIdNo as parse,
4
- formatChineseResidentIdNo as format,
5
- type ParsedChineseResidentIdNo as Result,
6
- ParsedChineseResidentIdNoSchema as ResultSchema,
7
- } from './ChineseResidentIdNo';
@@ -1,7 +0,0 @@
1
- export {
2
- DivisionCodeRegex as regex,
3
- type ParsedDivisionCode as Result,
4
- ParsedDivisionCodeSchema as ResultSchema,
5
- parseDivisionCode as parse,
6
- formatDivisionCode as format,
7
- } from './DivisionCode';
@@ -1,7 +0,0 @@
1
- export {
2
- type ParsedUnifiedSocialCreditCode as Result,
3
- UnifiedSocialCreditCodeRegex as regex,
4
- ParsedUnifiedSocialCreditCodeSchema as ResultSchema,
5
- parseUnifiedSocialCreditCode as parse,
6
- formatUnifiedSocialCreditCode as format,
7
- } from './UnifiedSocialCreditCode';
package/src/cn/mod.ts DELETED
@@ -1,3 +0,0 @@
1
- export * as ChineseResidentIdNo from './ChineseResidentIdNo.mod';
2
- export * as UnifiedSocialCreditCode from './UnifiedSocialCreditCode.mod';
3
- export * as DivisionCode from './DivisionCode.mod';
@@ -1 +0,0 @@
1
- export * as SchemaRegistry from './SchemaRegistry';