@wener/common 2.0.2 → 2.0.5

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 (410) 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 +22 -15
  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 +66 -146
  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 +6 -8
  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 +87 -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/drain3/Drain.js +356 -0
  86. package/lib/drain3/Drain.js.map +1 -0
  87. package/lib/drain3/LogCluster.js +38 -0
  88. package/lib/drain3/LogCluster.js.map +1 -0
  89. package/lib/drain3/Node.js +39 -0
  90. package/lib/drain3/Node.js.map +1 -0
  91. package/lib/drain3/TemplateMiner.js +204 -0
  92. package/lib/drain3/TemplateMiner.js.map +1 -0
  93. package/lib/drain3/index.js +31 -0
  94. package/lib/drain3/index.js.map +1 -0
  95. package/lib/drain3/persistence/FilePersistence.js +24 -0
  96. package/lib/drain3/persistence/FilePersistence.js.map +1 -0
  97. package/lib/drain3/persistence/MemoryPersistence.js +18 -0
  98. package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
  99. package/lib/drain3/persistence/PersistenceHandler.js +5 -0
  100. package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
  101. package/lib/drain3/types.js +7 -0
  102. package/lib/drain3/types.js.map +1 -0
  103. package/lib/emittery/emitter.js +10 -0
  104. package/lib/emittery/emitter.js.map +1 -0
  105. package/lib/emittery/index.js +2 -0
  106. package/lib/emittery/index.js.map +1 -0
  107. package/lib/foundation/schema/SexType.js +5 -3
  108. package/lib/foundation/schema/SexType.js.map +1 -0
  109. package/lib/foundation/schema/index.js +1 -0
  110. package/lib/foundation/schema/index.js.map +1 -0
  111. package/lib/foundation/schema/parseSexType.js +1 -0
  112. package/lib/foundation/schema/parseSexType.js.map +1 -0
  113. package/lib/foundation/schema/types.js +4 -2
  114. package/lib/foundation/schema/types.js.map +1 -0
  115. package/lib/fs/FileSystemError.js +23 -0
  116. package/lib/fs/FileSystemError.js.map +1 -0
  117. package/lib/fs/IFileSystem.d.js +3 -0
  118. package/lib/fs/IFileSystem.d.js.map +1 -0
  119. package/lib/fs/MemoryFileSystem.test.js +188 -0
  120. package/lib/fs/createBrowserFileSystem.js +250 -0
  121. package/lib/fs/createBrowserFileSystem.js.map +1 -0
  122. package/lib/fs/createMemoryFileSystem.js +517 -0
  123. package/lib/fs/createMemoryFileSystem.js.map +1 -0
  124. package/lib/fs/createSandboxFileSystem.js +108 -0
  125. package/lib/fs/createSandboxFileSystem.js.map +1 -0
  126. package/lib/fs/createWebDavFileSystem.js +154 -0
  127. package/lib/fs/createWebDavFileSystem.js.map +1 -0
  128. package/lib/fs/createWebFileSystem.js +225 -0
  129. package/lib/fs/createWebFileSystem.js.map +1 -0
  130. package/lib/fs/findMimeType.js +17 -0
  131. package/lib/fs/findMimeType.js.map +1 -0
  132. package/lib/fs/index.js +8 -0
  133. package/lib/fs/index.js.map +1 -0
  134. package/lib/fs/minio/createMinioFileSystem.js +974 -0
  135. package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
  136. package/lib/fs/minio/index.js +2 -0
  137. package/lib/fs/minio/index.js.map +1 -0
  138. package/lib/fs/orpc/FileSystemContract.js +93 -0
  139. package/lib/fs/orpc/FileSystemContract.js.map +1 -0
  140. package/lib/fs/orpc/createContractClientFileSystem.js +93 -0
  141. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -0
  142. package/lib/fs/orpc/index.js +3 -0
  143. package/lib/fs/orpc/index.js.map +1 -0
  144. package/lib/fs/orpc/server/createFileSystemContractImpl.js +63 -0
  145. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -0
  146. package/lib/fs/orpc/server/index.js +2 -0
  147. package/lib/fs/orpc/server/index.js.map +1 -0
  148. package/lib/fs/s3/createS3MiniFileSystem.js +753 -0
  149. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -0
  150. package/lib/fs/s3/index.js +2 -0
  151. package/lib/fs/s3/index.js.map +1 -0
  152. package/lib/fs/s3/s3mini.test.js +584 -0
  153. package/lib/fs/scandir.js +59 -0
  154. package/lib/fs/scandir.js.map +1 -0
  155. package/lib/fs/server/createDatabaseFileSystem.js +750 -0
  156. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -0
  157. package/lib/fs/server/createNodeFileSystem.js +426 -0
  158. package/lib/fs/server/createNodeFileSystem.js.map +1 -0
  159. package/lib/fs/server/dbfs.test.js +221 -0
  160. package/lib/fs/server/index.js +2 -0
  161. package/lib/fs/server/index.js.map +1 -0
  162. package/lib/fs/server/loadTestDatabase.js +127 -0
  163. package/lib/fs/server/loadTestDatabase.js.map +1 -0
  164. package/lib/fs/tests/runFileSystemTest.js +319 -0
  165. package/lib/fs/tests/runFileSystemTest.js.map +1 -0
  166. package/lib/fs/types.js +27 -0
  167. package/lib/fs/types.js.map +1 -0
  168. package/lib/fs/utils/getFileUrl.js +35 -0
  169. package/lib/fs/utils/getFileUrl.js.map +1 -0
  170. package/lib/fs/utils.js +22 -0
  171. package/lib/fs/utils.js.map +1 -0
  172. package/lib/fs/webdav/index.js +2 -0
  173. package/lib/fs/webdav/index.js.map +1 -0
  174. package/lib/index.js +1 -0
  175. package/lib/index.js.map +1 -0
  176. package/lib/jsonschema/JsonSchema.js +146 -172
  177. package/lib/jsonschema/JsonSchema.js.map +1 -0
  178. package/lib/jsonschema/forEachJsonSchema.js +44 -0
  179. package/lib/jsonschema/forEachJsonSchema.js.map +1 -0
  180. package/lib/jsonschema/index.js +2 -0
  181. package/lib/jsonschema/index.js.map +1 -0
  182. package/lib/jsonschema/types.d.js +2 -0
  183. package/lib/jsonschema/types.d.js.map +1 -0
  184. package/lib/meta/defineFileType.js +20 -103
  185. package/lib/meta/defineFileType.js.map +1 -0
  186. package/lib/meta/defineInit.js +31 -250
  187. package/lib/meta/defineInit.js.map +1 -0
  188. package/lib/meta/defineMetadata.js +24 -140
  189. package/lib/meta/defineMetadata.js.map +1 -0
  190. package/lib/meta/index.js +1 -0
  191. package/lib/meta/index.js.map +1 -0
  192. package/lib/orpc/createOpenApiContractClient.js +27 -0
  193. package/lib/orpc/createOpenApiContractClient.js.map +1 -0
  194. package/lib/orpc/createRpcContractClient.js +34 -0
  195. package/lib/orpc/createRpcContractClient.js.map +1 -0
  196. package/lib/orpc/index.js +3 -0
  197. package/lib/orpc/index.js.map +1 -0
  198. package/lib/orpc/resolveLinkPlugins.js +28 -0
  199. package/lib/orpc/resolveLinkPlugins.js.map +1 -0
  200. package/lib/password/PHC.js +63 -87
  201. package/lib/password/PHC.js.map +1 -0
  202. package/lib/password/PHC.test.js +11 -3
  203. package/lib/password/Password.js +29 -294
  204. package/lib/password/Password.js.map +1 -0
  205. package/lib/password/Password.test.js +35 -22
  206. package/lib/password/createArgon2PasswordAlgorithm.js +35 -191
  207. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -0
  208. package/lib/password/createBase64PasswordAlgorithm.js +8 -141
  209. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -0
  210. package/lib/password/createBcryptPasswordAlgorithm.js +13 -168
  211. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -0
  212. package/lib/password/createPBKDF2PasswordAlgorithm.js +46 -228
  213. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -0
  214. package/lib/password/createScryptPasswordAlgorithm.js +55 -211
  215. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -0
  216. package/lib/password/index.js +1 -0
  217. package/lib/password/index.js.map +1 -0
  218. package/lib/password/server/index.js +1 -0
  219. package/lib/password/server/index.js.map +1 -0
  220. package/lib/resource/Identifiable.js +2 -0
  221. package/lib/resource/Identifiable.js.map +1 -0
  222. package/lib/resource/ListQuery.js +21 -93
  223. package/lib/resource/ListQuery.js.map +1 -0
  224. package/lib/resource/getTitleOfResource.js +3 -5
  225. package/lib/resource/getTitleOfResource.js.map +1 -0
  226. package/lib/resource/index.js +1 -0
  227. package/lib/resource/index.js.map +1 -0
  228. package/lib/resource/schema/AnyResourceSchema.js +2 -1
  229. package/lib/resource/schema/AnyResourceSchema.js.map +1 -0
  230. package/lib/resource/schema/BaseResourceSchema.js +2 -1
  231. package/lib/resource/schema/BaseResourceSchema.js.map +1 -0
  232. package/lib/resource/schema/ResourceActionType.js +6 -4
  233. package/lib/resource/schema/ResourceActionType.js.map +1 -0
  234. package/lib/resource/schema/ResourceStatus.js +5 -3
  235. package/lib/resource/schema/ResourceStatus.js.map +1 -0
  236. package/lib/resource/schema/ResourceType.js +5 -3
  237. package/lib/resource/schema/ResourceType.js.map +1 -0
  238. package/lib/resource/schema/index.js +1 -0
  239. package/lib/resource/schema/index.js.map +1 -0
  240. package/lib/resource/schema/types.js +16 -20
  241. package/lib/resource/schema/types.js.map +1 -0
  242. package/lib/s3/formatS3Url.js +65 -0
  243. package/lib/s3/formatS3Url.js.map +1 -0
  244. package/lib/s3/formatS3Url.test.js +262 -0
  245. package/lib/s3/index.js +3 -0
  246. package/lib/s3/index.js.map +1 -0
  247. package/lib/s3/parseS3Url.js +65 -0
  248. package/lib/s3/parseS3Url.js.map +1 -0
  249. package/lib/s3/parseS3Url.test.js +270 -0
  250. package/lib/schema/SchemaRegistry.js +38 -38
  251. package/lib/schema/SchemaRegistry.js.map +1 -0
  252. package/lib/schema/TypeSchema.d.js +2 -0
  253. package/lib/schema/TypeSchema.d.js.map +1 -0
  254. package/lib/schema/createSchemaData.js +26 -125
  255. package/lib/schema/createSchemaData.js.map +1 -0
  256. package/lib/schema/findJsonSchemaByPath.js +13 -36
  257. package/lib/schema/findJsonSchemaByPath.js.map +1 -0
  258. package/lib/schema/formatZodError.js +138 -0
  259. package/lib/schema/formatZodError.js.map +1 -0
  260. package/lib/schema/formatZodError.test.js +196 -0
  261. package/lib/schema/getSchemaCache.js +5 -5
  262. package/lib/schema/getSchemaCache.js.map +1 -0
  263. package/lib/schema/getSchemaOptions.js +8 -11
  264. package/lib/schema/getSchemaOptions.js.map +1 -0
  265. package/lib/schema/index.js +2 -1
  266. package/lib/schema/index.js.map +1 -0
  267. package/lib/schema/toJsonSchema.js +50 -293
  268. package/lib/schema/toJsonSchema.js.map +1 -0
  269. package/lib/schema/validate.js +34 -46
  270. package/lib/schema/validate.js.map +1 -0
  271. package/lib/tools/generateSchema.js +39 -197
  272. package/lib/tools/generateSchema.js.map +1 -0
  273. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +55 -143
  274. package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -0
  275. package/lib/utils/buildBaseUrl.js +13 -0
  276. package/lib/utils/buildBaseUrl.js.map +1 -0
  277. package/lib/utils/buildRedactorFormSchema.js +59 -0
  278. package/lib/utils/buildRedactorFormSchema.js.map +1 -0
  279. package/lib/utils/getEstimateProcessTime.js +12 -11
  280. package/lib/utils/getEstimateProcessTime.js.map +1 -0
  281. package/lib/utils/index.js +3 -0
  282. package/lib/utils/index.js.map +1 -0
  283. package/lib/utils/resolveFeatureOptions.js +12 -0
  284. package/lib/utils/resolveFeatureOptions.js.map +1 -0
  285. package/package.json +80 -13
  286. package/src/ai/qwen3vl/index.ts +1 -0
  287. package/src/ai/qwen3vl/utils.ts +36 -0
  288. package/src/ai/vision/DocLayoutElementTypeSchema.ts +30 -0
  289. package/src/ai/vision/ImageAnnotationSchema.ts +60 -0
  290. package/src/ai/vision/index.ts +2 -0
  291. package/src/ai/vision/resolveImageAnnotation.ts +135 -0
  292. package/src/cn/ChineseResidentIdNo.test.ts +1 -1
  293. package/src/cn/ChineseResidentIdNo.ts +9 -1
  294. package/src/cn/DivisionCode.test.ts +1 -1
  295. package/src/cn/DivisionCode.ts +8 -0
  296. package/src/cn/Mod11.ts +1 -1
  297. package/src/cn/UnifiedSocialCreditCode.test.ts +1 -1
  298. package/src/cn/UnifiedSocialCreditCode.ts +15 -0
  299. package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
  300. package/src/cn/formatChineseAmount.ts +61 -0
  301. package/src/cn/index.ts +7 -1
  302. package/src/cn/parseChineseNumber.test.ts +159 -0
  303. package/src/cn/parseChineseNumber.ts +97 -0
  304. package/src/cn/pinyin/cartesianProduct.test.ts +64 -0
  305. package/src/cn/pinyin/cartesianProduct.ts +24 -0
  306. package/src/cn/pinyin/data.json +23573 -0
  307. package/src/cn/pinyin/loader.ts +12 -0
  308. package/src/cn/pinyin/preload.ts +3 -0
  309. package/src/cn/pinyin/toPinyin.test.ts +12 -0
  310. package/src/cn/pinyin/toPinyinPure.ts +43 -0
  311. package/src/cn/pinyin/transform.ts +12 -0
  312. package/src/consola/formatLogObject.test.ts +27 -0
  313. package/src/consola/formatLogObject.ts +40 -12
  314. package/src/data/maybeNumber.ts +1 -1
  315. package/src/data/parseSort.test.ts +0 -1
  316. package/src/data/types.d.ts +2 -2
  317. package/src/dayjs/dayjs.ts +18 -18
  318. package/src/dayjs/formatDuration.ts +2 -2
  319. package/src/dayjs/index.ts +3 -1
  320. package/src/dayjs/parseRelativeTime.test.ts +185 -0
  321. package/src/dayjs/parseRelativeTime.ts +115 -0
  322. package/src/dayjs/resolveRelativeTime.test.ts +357 -0
  323. package/src/dayjs/resolveRelativeTime.ts +164 -0
  324. package/src/drain3/Drain.test.ts +378 -0
  325. package/src/drain3/Drain.ts +394 -0
  326. package/src/drain3/LogCluster.ts +46 -0
  327. package/src/drain3/Node.ts +53 -0
  328. package/src/drain3/TemplateMiner.ts +246 -0
  329. package/src/drain3/index.ts +36 -0
  330. package/src/drain3/persistence/FilePersistence.ts +24 -0
  331. package/src/drain3/persistence/MemoryPersistence.ts +23 -0
  332. package/src/drain3/persistence/PersistenceHandler.ts +19 -0
  333. package/src/drain3/types.ts +75 -0
  334. package/src/emittery/emitter.ts +9 -0
  335. package/src/emittery/index.ts +1 -0
  336. package/src/fs/FileSystemError.ts +26 -0
  337. package/src/fs/IFileSystem.d.ts +101 -0
  338. package/src/fs/MemoryFileSystem.test.ts +37 -0
  339. package/src/fs/createBrowserFileSystem.ts +293 -0
  340. package/src/fs/createMemoryFileSystem.ts +600 -0
  341. package/src/fs/createSandboxFileSystem.ts +136 -0
  342. package/src/fs/createWebDavFileSystem.ts +190 -0
  343. package/src/fs/createWebFileSystem.ts +242 -0
  344. package/src/fs/findMimeType.ts +20 -0
  345. package/src/fs/index.ts +8 -0
  346. package/src/fs/minio/createMinioFileSystem.ts +1148 -0
  347. package/src/fs/minio/index.ts +1 -0
  348. package/src/fs/orpc/FileSystemContract.ts +92 -0
  349. package/src/fs/orpc/createContractClientFileSystem.ts +115 -0
  350. package/src/fs/orpc/index.ts +2 -0
  351. package/src/fs/orpc/server/createFileSystemContractImpl.ts +64 -0
  352. package/src/fs/orpc/server/index.ts +1 -0
  353. package/src/fs/s3/createS3MiniFileSystem.ts +871 -0
  354. package/src/fs/s3/index.ts +1 -0
  355. package/src/fs/s3/s3fs.test.ts +441 -0
  356. package/src/fs/s3/s3mini.test.ts +264 -0
  357. package/src/fs/scandir.ts +75 -0
  358. package/src/fs/server/createDatabaseFileSystem.ts +668 -0
  359. package/src/fs/server/createNodeFileSystem.ts +518 -0
  360. package/src/fs/server/dbfs.test.ts +48 -0
  361. package/src/fs/server/index.ts +1 -0
  362. package/src/fs/server/loadTestDatabase.ts +131 -0
  363. package/src/fs/tests/runFileSystemTest.ts +289 -0
  364. package/src/fs/types.ts +29 -0
  365. package/src/fs/utils/getFileUrl.ts +44 -0
  366. package/src/fs/utils.ts +23 -0
  367. package/src/fs/webdav/index.ts +1 -0
  368. package/src/jsonschema/JsonSchema.ts +118 -110
  369. package/src/jsonschema/forEachJsonSchema.ts +50 -0
  370. package/src/jsonschema/index.ts +1 -0
  371. package/src/jsonschema/types.d.ts +1 -1
  372. package/src/meta/defineMetadata.ts +1 -1
  373. package/src/orpc/createOpenApiContractClient.ts +52 -0
  374. package/src/orpc/createRpcContractClient.ts +50 -0
  375. package/src/orpc/index.ts +2 -0
  376. package/src/orpc/resolveLinkPlugins.ts +29 -0
  377. package/src/password/PHC.ts +6 -6
  378. package/src/password/Password.test.ts +1 -1
  379. package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
  380. package/src/password/createBase64PasswordAlgorithm.ts +2 -2
  381. package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
  382. package/src/password/createPBKDF2PasswordAlgorithm.ts +4 -4
  383. package/src/password/createScryptPasswordAlgorithm.ts +4 -4
  384. package/src/resource/ListQuery.ts +4 -1
  385. package/src/resource/index.ts +2 -2
  386. package/src/resource/schema/AnyResourceSchema.ts +16 -2
  387. package/src/s3/formatS3Url.test.ts +254 -0
  388. package/src/s3/formatS3Url.ts +84 -0
  389. package/src/s3/index.ts +2 -0
  390. package/src/s3/parseS3Url.test.ts +258 -0
  391. package/src/s3/parseS3Url.ts +88 -0
  392. package/src/schema/SchemaRegistry.ts +35 -33
  393. package/src/schema/TypeSchema.d.ts +6 -6
  394. package/src/schema/createSchemaData.ts +4 -4
  395. package/src/schema/findJsonSchemaByPath.ts +4 -4
  396. package/src/schema/formatZodError.test.ts +197 -0
  397. package/src/schema/formatZodError.ts +139 -0
  398. package/src/schema/getSchemaOptions.ts +2 -2
  399. package/src/schema/index.ts +1 -1
  400. package/src/schema/toJsonSchema.ts +6 -6
  401. package/src/schema/validate.ts +1 -1
  402. package/src/utils/buildBaseUrl.ts +12 -0
  403. package/src/utils/buildRedactorFormSchema.ts +85 -0
  404. package/src/utils/index.ts +4 -0
  405. package/src/utils/resolveFeatureOptions.ts +14 -0
  406. package/src/cn/ChineseResidentIdNo.mod.ts +0 -7
  407. package/src/cn/DivisionCode.mod.ts +0 -7
  408. package/src/cn/UnifiedSocialCreditCode.mod.ts +0 -7
  409. package/src/cn/mod.ts +0 -3
  410. package/src/schema/SchemaRegistry.mod.ts +0 -1
@@ -0,0 +1,197 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod/v4';
3
+ import { formatZodError } from './formatZodError';
4
+
5
+ describe('formatZodError', () => {
6
+ it('should format invalid_type error', () => {
7
+ const schema = z.object({
8
+ name: z.string(),
9
+ age: z.number(),
10
+ });
11
+
12
+ const result = schema.safeParse({ name: 123, age: 'not-a-number' });
13
+ expect(result.success).toBe(false);
14
+ if (!result.success) {
15
+ const formatted = formatZodError(result.error);
16
+ expect(formatted).toContain('name');
17
+ expect(formatted).toContain('age');
18
+ }
19
+ });
20
+
21
+ it('should format required field error', () => {
22
+ const schema = z.object({
23
+ name: z.string(),
24
+ email: z.string().email(),
25
+ });
26
+
27
+ const result = schema.safeParse({});
28
+ expect(result.success).toBe(false);
29
+ if (!result.success) {
30
+ const formatted = formatZodError(result.error);
31
+ expect(formatted).toContain('必填');
32
+ }
33
+ });
34
+
35
+ it('should format email validation error', () => {
36
+ const schema = z.object({
37
+ email: z.string().email(),
38
+ });
39
+
40
+ const result = schema.safeParse({ email: 'invalid-email' });
41
+ expect(result.success).toBe(false);
42
+ if (!result.success) {
43
+ const formatted = formatZodError(result.error);
44
+ expect(formatted).toContain('请输入有效的邮箱地址');
45
+ }
46
+ });
47
+
48
+ it('should format URL validation error', () => {
49
+ const schema = z.object({
50
+ url: z.string().url(),
51
+ });
52
+
53
+ const result = schema.safeParse({ url: 'not-a-url' });
54
+ expect(result.success).toBe(false);
55
+ if (!result.success) {
56
+ const formatted = formatZodError(result.error);
57
+ expect(formatted).toContain('请输入有效的 URL');
58
+ }
59
+ });
60
+
61
+ it('should format too_small error for string', () => {
62
+ const schema = z.object({
63
+ name: z.string().min(5),
64
+ });
65
+
66
+ const result = schema.safeParse({ name: 'abc' });
67
+ expect(result.success).toBe(false);
68
+ if (!result.success) {
69
+ const formatted = formatZodError(result.error);
70
+ expect(formatted).toContain('至少需要');
71
+ }
72
+ });
73
+
74
+ it('should format too_small error for number', () => {
75
+ const schema = z.object({
76
+ age: z.number().min(18),
77
+ });
78
+
79
+ const result = schema.safeParse({ age: 16 });
80
+ expect(result.success).toBe(false);
81
+ if (!result.success) {
82
+ const formatted = formatZodError(result.error);
83
+ expect(formatted).toContain('至少需要 18');
84
+ }
85
+ });
86
+
87
+ it('should format too_big error for string', () => {
88
+ const schema = z.object({
89
+ name: z.string().max(10),
90
+ });
91
+
92
+ const result = schema.safeParse({ name: 'this is too long' });
93
+ expect(result.success).toBe(false);
94
+ if (!result.success) {
95
+ const formatted = formatZodError(result.error);
96
+ expect(formatted).toContain('最多 10 个字符');
97
+ }
98
+ });
99
+
100
+ it('should format invalid_enum_value error', () => {
101
+ const schema = z.object({
102
+ status: z.enum(['active', 'inactive', 'pending']),
103
+ });
104
+
105
+ const result = schema.safeParse({ status: 'invalid' });
106
+ expect(result.success).toBe(false);
107
+ if (!result.success) {
108
+ const formatted = formatZodError(result.error);
109
+ expect(formatted).toContain('必须是以下值之一');
110
+ }
111
+ });
112
+
113
+ it('should format invalid_literal error', () => {
114
+ const schema = z.object({
115
+ type: z.literal('user'),
116
+ });
117
+
118
+ const result = schema.safeParse({ type: 'admin' });
119
+ expect(result.success).toBe(false);
120
+ if (!result.success) {
121
+ const formatted = formatZodError(result.error);
122
+ expect(formatted).toContain('必须是 user');
123
+ }
124
+ });
125
+
126
+ it('should format nested object errors', () => {
127
+ const schema = z.object({
128
+ user: z.object({
129
+ name: z.string(),
130
+ email: z.string().email(),
131
+ }),
132
+ });
133
+
134
+ const result = schema.safeParse({
135
+ user: {
136
+ name: '',
137
+ email: 'invalid',
138
+ },
139
+ });
140
+ expect(result.success).toBe(false);
141
+ if (!result.success) {
142
+ const formatted = formatZodError(result.error);
143
+ expect(formatted).toContain('user');
144
+ expect(formatted).toContain('email');
145
+ }
146
+ });
147
+
148
+ it('should format array errors', () => {
149
+ const schema = z.object({
150
+ tags: z.array(z.string()).min(1),
151
+ });
152
+
153
+ const result = schema.safeParse({ tags: [] });
154
+ expect(result.success).toBe(false);
155
+ if (!result.success) {
156
+ const formatted = formatZodError(result.error);
157
+ expect(formatted).toContain('至少需要 1 项');
158
+ }
159
+ });
160
+
161
+ it('should format multiple errors', () => {
162
+ const schema = z.object({
163
+ name: z.string().min(1),
164
+ email: z.string().email(),
165
+ age: z.number().min(18),
166
+ });
167
+
168
+ const result = schema.safeParse({
169
+ name: '',
170
+ email: 'invalid',
171
+ age: 15,
172
+ });
173
+ expect(result.success).toBe(false);
174
+ if (!result.success) {
175
+ const formatted = formatZodError(result.error);
176
+ // Should contain multiple error messages separated by ';'
177
+ const parts = formatted.split(';');
178
+ expect(parts.length).toBeGreaterThan(1);
179
+ }
180
+ });
181
+
182
+ it('should use schema description when available', () => {
183
+ const schema = z.object({
184
+ name: z.string().min(1).describe('姓名'),
185
+ email: z.string().email().describe('邮箱地址'),
186
+ });
187
+
188
+ // Use empty string for name (triggers min(1) error) and invalid email
189
+ const result = schema.safeParse({ name: '', email: 'invalid' });
190
+ expect(result.success).toBe(false);
191
+ if (!result.success) {
192
+ const formatted = formatZodError(result.error, schema);
193
+ expect(formatted).toContain('姓名');
194
+ expect(formatted).toContain('邮箱地址');
195
+ }
196
+ });
197
+ });
@@ -0,0 +1,139 @@
1
+ import type { core, ZodError } from 'zod/v4';
2
+ import { findJsonSchemaByPath } from './findJsonSchemaByPath';
3
+ import type { TypeSchema } from './TypeSchema';
4
+
5
+ // Zod 4 issue types with proper typing
6
+ type ZodIssue = core.$ZodIssue;
7
+ type ZodIssueInvalidType = core.$ZodIssueInvalidType;
8
+ type ZodIssueTooSmall = core.$ZodIssueTooSmall;
9
+ type ZodIssueTooBig = core.$ZodIssueTooBig;
10
+ type ZodIssueInvalidStringFormat = core.$ZodIssueInvalidStringFormat;
11
+ type ZodIssueInvalidValue = core.$ZodIssueInvalidValue;
12
+ type ZodIssueUnrecognizedKeys = core.$ZodIssueUnrecognizedKeys;
13
+
14
+ export function formatZodError(error: ZodError, schema?: TypeSchema): string {
15
+ if (!error.issues || error.issues.length === 0) {
16
+ return error.message || '验证失败';
17
+ }
18
+
19
+ const messages: string[] = [];
20
+
21
+ // Iterate through issues and format each one
22
+ // We use manual iteration instead of error.format() to have better control
23
+ // over field name formatting with schema descriptions
24
+ for (const issue of error.issues) {
25
+ const formatted = formatIssueMessage(issue, schema);
26
+ if (formatted) {
27
+ const path = issue.path.map((p) => (typeof p === 'symbol' ? String(p) : p)) as (string | number)[];
28
+ let fieldName = formatPath(path);
29
+
30
+ // Try to get field description from schema
31
+ if (schema && path.length > 0) {
32
+ const fieldPath = path.map(String).join('.');
33
+ const fieldSchema = findJsonSchemaByPath(schema, fieldPath);
34
+ if (fieldSchema?.description) {
35
+ fieldName = fieldSchema.description;
36
+ }
37
+ }
38
+
39
+ messages.push(`${fieldName}: ${formatted}`);
40
+ }
41
+ }
42
+
43
+ return messages.join(';');
44
+ }
45
+
46
+ function formatIssueMessage(issue: ZodIssue, _schema?: TypeSchema): string {
47
+ let message = issue.message;
48
+
49
+ // 处理常见的错误类型,生成更友好的消息
50
+ switch (issue.code) {
51
+ case 'invalid_type': {
52
+ const i = issue as ZodIssueInvalidType;
53
+ // Zod v4 doesn't have 'received' field directly, extract from message
54
+ const match = issue.message.match(/received (\w+)/);
55
+ const received = match?.[1];
56
+ if (received === 'undefined') {
57
+ message = '必填';
58
+ } else if (received === 'null') {
59
+ message = '不能为空';
60
+ } else {
61
+ message = issue.message || `期望类型 ${i.expected},但收到 ${received}`;
62
+ }
63
+ break;
64
+ }
65
+ case 'invalid_format': {
66
+ const i = issue as ZodIssueInvalidStringFormat;
67
+ if (i.format === 'email') {
68
+ message = '请输入有效的邮箱地址';
69
+ } else if (i.format === 'url') {
70
+ message = '请输入有效的 URL';
71
+ } else if (i.format === 'uuid') {
72
+ message = '请输入有效的 UUID';
73
+ } else if (i.format === 'date') {
74
+ message = '请输入有效的日期';
75
+ }
76
+ break;
77
+ }
78
+ case 'too_small': {
79
+ const i = issue as ZodIssueTooSmall;
80
+ if (i.origin === 'string' && i.minimum === 1) {
81
+ message = '不能为空';
82
+ } else if (i.origin === 'string') {
83
+ message = `至少需要 ${i.minimum} 个字符`;
84
+ } else if (i.origin === 'number' || i.origin === 'int') {
85
+ message = `至少需要 ${i.minimum}`;
86
+ } else if (i.origin === 'array') {
87
+ message = `至少需要 ${i.minimum} 项`;
88
+ }
89
+ break;
90
+ }
91
+ case 'too_big': {
92
+ const i = issue as ZodIssueTooBig;
93
+ if (i.origin === 'string') {
94
+ message = `最多 ${i.maximum} 个字符`;
95
+ } else if (i.origin === 'number' || i.origin === 'int') {
96
+ message = `最多 ${i.maximum}`;
97
+ } else if (i.origin === 'array') {
98
+ message = `最多 ${i.maximum} 项`;
99
+ }
100
+ break;
101
+ }
102
+ case 'invalid_value': {
103
+ const i = issue as ZodIssueInvalidValue;
104
+ if (i.values.length === 1) {
105
+ // Single value means it's a literal check
106
+ message = `必须是 ${String(i.values[0])}`;
107
+ } else {
108
+ message = `必须是以下值之一: ${i.values.map(String).join(', ')}`;
109
+ }
110
+ break;
111
+ }
112
+ case 'unrecognized_keys': {
113
+ const i = issue as ZodIssueUnrecognizedKeys;
114
+ message = `不支持的字段: ${i.keys.join(', ')}`;
115
+ break;
116
+ }
117
+ case 'invalid_union': {
118
+ message = '不符合任何允许的类型';
119
+ break;
120
+ }
121
+ case 'custom': {
122
+ // 保留自定义错误消息
123
+ message = issue.message;
124
+ break;
125
+ }
126
+ default:
127
+ // 保留原始消息
128
+ message = issue.message;
129
+ }
130
+
131
+ return message;
132
+ }
133
+
134
+ function formatPath(path: (string | number)[]): string {
135
+ if (path.length === 0) {
136
+ return '表单';
137
+ }
138
+ return path.map(String).join('.');
139
+ }
@@ -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';
@@ -33,7 +33,7 @@ export function toJsonSchema(schema: TypeSchema): JsonSchemaDef {
33
33
  // prefer nullable
34
34
  match(js)
35
35
  .with({ anyOf: [P.select(), { type: 'null' }] }, (select) => {
36
- delete js['anyOf'];
36
+ delete js.anyOf;
37
37
  Object.assign(js, select);
38
38
  js.nullable = true;
39
39
  })
@@ -70,9 +70,9 @@ function visit(js: JsonSchemaDef, f: (js: JsonSchemaDef) => void) {
70
70
  const _visit = (
71
71
  js: JsonSchemaDef,
72
72
  f: (js: JsonSchemaDef) => void,
73
- parent: JsonSchemaDef | undefined,
73
+ _parent: JsonSchemaDef | undefined,
74
74
  path: string[],
75
- k?: string,
75
+ _k?: string,
76
76
  ) => {
77
77
  if (!js) {
78
78
  return;
@@ -109,9 +109,9 @@ function visit(js: JsonSchemaDef, f: (js: JsonSchemaDef) => void) {
109
109
  _visit(js, f, undefined, []);
110
110
  }
111
111
 
112
- function resolveJsonSchemaDef(
112
+ function _resolveJsonSchemaDef(
113
113
  js: JsonSchemaDef,
114
- ctx?: {
114
+ _ctx?: {
115
115
  parent: JsonSchemaDef;
116
116
  key: string;
117
117
  },
@@ -129,7 +129,7 @@ function resolveJsonSchemaDef(
129
129
  for (const key in schema.properties) {
130
130
  const prop = schema.properties[key];
131
131
  if (prop) {
132
- schema.properties[key] = resolveJsonSchemaDef(prop, { parent: schema, key });
132
+ schema.properties[key] = _resolveJsonSchemaDef(prop, { parent: schema, key });
133
133
  }
134
134
  }
135
135
  return schema;
@@ -107,7 +107,7 @@ export function parseData<S extends TypeSchema>(schema: S, data: unknown): Schem
107
107
  );
108
108
  }
109
109
 
110
- function formatIssues(schema: TypeSchema, issues: Array<ValidationIssue>): string {
110
+ function _formatIssues(_schema: TypeSchema, _issues: Array<ValidationIssue>): string {
111
111
  return '';
112
112
  }
113
113
 
@@ -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: _type,
66
+ key: _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';