@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
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@wener/common",
3
- "version": "2.0.2",
3
+ "version": "2.0.5",
4
4
  "type": "module",
5
- "description": "",
6
- "author": "",
5
+ "description": "Common utils for console & server",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/wenerme/wener.git",
9
+ "directory": "packages/wener-common"
10
+ },
11
+ "homepage": "https://github.com/wenerme/wener/tree/main/packages/wener-common",
12
+ "author": "wener",
7
13
  "license": "MIT",
8
14
  "exports": {
9
15
  ".": {
@@ -30,6 +36,38 @@
30
36
  "types": "./src/decimal/index.ts",
31
37
  "default": "./lib/decimal/index.js"
32
38
  },
39
+ "./drain3": {
40
+ "types": "./src/drain3/index.ts",
41
+ "default": "./lib/drain3/index.js"
42
+ },
43
+ "./fs": {
44
+ "types": "./src/fs/index.ts",
45
+ "default": "./lib/fs/index.js"
46
+ },
47
+ "./fs/webdav": {
48
+ "types": "./src/fs/webdav/index.ts",
49
+ "default": "./lib/fs/webdav/index.js"
50
+ },
51
+ "./fs/s3mini": {
52
+ "types": "./src/fs/s3/index.ts",
53
+ "default": "./lib/fs/s3/index.js"
54
+ },
55
+ "./fs/minio": {
56
+ "types": "./src/fs/minio/index.ts",
57
+ "default": "./lib/fs/minio/index.js"
58
+ },
59
+ "./fs/server": {
60
+ "types": "./src/fs/server/index.ts",
61
+ "default": "./lib/fs/server/index.js"
62
+ },
63
+ "./fs/orpc": {
64
+ "types": "./src/fs/orpc/index.ts",
65
+ "default": "./lib/fs/orpc/index.js"
66
+ },
67
+ "./fs/orpc/server": {
68
+ "types": "./src/fs/orpc/server/index.ts",
69
+ "default": "./lib/fs/orpc/server/index.js"
70
+ },
33
71
  "./jsonschema": {
34
72
  "types": "./src/jsonschema/index.ts",
35
73
  "default": "./lib/jsonschema/index.js"
@@ -38,6 +76,10 @@
38
76
  "types": "./src/meta/index.ts",
39
77
  "default": "./lib/meta/index.js"
40
78
  },
79
+ "./orpc": {
80
+ "types": "./src/orpc/index.ts",
81
+ "default": "./lib/orpc/index.js"
82
+ },
41
83
  "./password": {
42
84
  "types": "./src/password/index.ts",
43
85
  "default": "./lib/password/index.js"
@@ -50,10 +92,18 @@
50
92
  "types": "./src/resource/schema/index.ts",
51
93
  "default": "./lib/resource/schema/index.js"
52
94
  },
95
+ "./s3": {
96
+ "types": "./src/s3/index.ts",
97
+ "default": "./lib/s3/index.js"
98
+ },
53
99
  "./schema": {
54
100
  "types": "./src/schema/index.ts",
55
101
  "default": "./lib/schema/index.js"
56
102
  },
103
+ "./utils": {
104
+ "types": "./src/utils/index.ts",
105
+ "default": "./lib/utils/index.js"
106
+ },
57
107
  "./package.json": "./package.json"
58
108
  },
59
109
  "files": [
@@ -64,34 +114,51 @@
64
114
  ],
65
115
  "keywords": [],
66
116
  "peerDependencies": {
117
+ "ajv": "*",
67
118
  "zod": "*"
68
119
  },
69
120
  "dependencies": {
70
- "@standard-schema/spec": "^1.0.0",
71
- "@wener/utils": "^1.1.51",
121
+ "@standard-schema/spec": "^1.1.0",
122
+ "@wener/utils": "^1.1.58",
72
123
  "date-fns": "^4.1.0",
73
- "es-toolkit": "^1.39.10",
74
- "std-env": "^3.9.0",
75
- "ts-pattern": "^5.8.0"
124
+ "es-toolkit": "^1.44.0",
125
+ "std-env": "^3.10.0",
126
+ "ts-pattern": "^5.9.0"
76
127
  },
77
128
  "devDependencies": {
78
- "@sinclair/typebox": "^0.34.41",
129
+ "@mikro-orm/better-sqlite": "^6.6.6",
130
+ "@mikro-orm/core": "^6.6.6",
131
+ "@mikro-orm/knex": "^6.6.6",
132
+ "@orpc/client": "^1.13.4",
133
+ "@orpc/contract": "^1.13.4",
134
+ "@orpc/openapi-client": "^1.13.4",
135
+ "@orpc/server": "^1.13.4",
136
+ "@sinclair/typebox": "^0.34.48",
79
137
  "@sinclair/typebox-codegen": "^0.11.1",
80
138
  "@types/argon2-browser": "^1.18.4",
81
139
  "@types/bcrypt": "^6.0.0",
82
- "ajv": "^8.17.1",
140
+ "@types/better-sqlite3": "^7.6.13",
141
+ "@types/micromatch": "^4.0.10",
142
+ "@types/mime-types": "^3.0.1",
83
143
  "ajv-formats": "^3.0.1",
84
144
  "ajv-i18n": "^4.2.0",
85
145
  "ajv-keywords": "^5.1.0",
86
146
  "argon2": "^0.44.0",
87
147
  "argon2-browser": "^1.18.0",
88
148
  "bcrypt": "^6.0.0",
89
- "bcryptjs": "^3.0.2",
149
+ "bcryptjs": "^3.0.3",
90
150
  "chalk": "^5.6.2",
91
151
  "consola": "^3.4.2",
92
- "dayjs": "^1.11.18",
152
+ "dayjs": "^1.11.19",
93
153
  "decimal.js": "^10.6.0",
94
- "zod": "^4.1.8"
154
+ "emittery": "^1.2.0",
155
+ "micromatch": "^4.0.8",
156
+ "mime-types": "^3.0.2",
157
+ "minio": "^8.0.6",
158
+ "pathe": "^2.0.3",
159
+ "s3mini": "^0.9.1",
160
+ "webdav": "^5.8.0",
161
+ "zod": "^4.3.6"
95
162
  },
96
163
  "scripts": {
97
164
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -0,0 +1 @@
1
+ export { fromQwen3VlBbox2d, toQwen3VlBbox2d } from './utils';
@@ -0,0 +1,36 @@
1
+ // xyxy
2
+ type Bbox2d = [number, number, number, number];
3
+ type Dimensions = { width: number; height: number };
4
+ // x_center, y_center, z_center, x_size, y_size, z_size, roll, pitch, yaw
5
+ type _Bbox3d = [number, number, number, number, number, number, number, number, number];
6
+ /**
7
+ * Convert Qwen3V format bbox (0-1000 range) to absolute pixel coordinates
8
+ * @param dimensions Image dimensions {width, height}
9
+ * @param bbox Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
10
+ * @returns Absolute pixel coordinates [x1, y1, x2, y2]
11
+ */
12
+ export function fromQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {
13
+ const [x1, y1, x2, y2] = bbox;
14
+ return [
15
+ Math.floor((x1 / 1000) * width),
16
+ Math.floor((y1 / 1000) * height),
17
+ Math.floor((x2 / 1000) * width),
18
+ Math.floor((y2 / 1000) * height),
19
+ ];
20
+ }
21
+
22
+ /**
23
+ * Convert absolute pixel coordinates to Qwen3V format bbox (0-1000 range)
24
+ * @param dimensions Image dimensions {width, height}
25
+ * @param bbox Absolute pixel coordinates [x1, y1, x2, y2]
26
+ * @returns Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
27
+ */
28
+ export function toQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {
29
+ const [x1, y1, x2, y2] = bbox;
30
+ return [
31
+ Math.round((x1 / width) * 1000),
32
+ Math.round((y1 / height) * 1000),
33
+ Math.round((x2 / width) * 1000),
34
+ Math.round((y2 / height) * 1000),
35
+ ];
36
+ }
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+
3
+ // based on DocLayout-YOLO
4
+
5
+ export const DocLayoutElementType = Object.freeze({
6
+ Title: 'Title',
7
+ PlainText: 'PlainText',
8
+ Abandon: 'Abandon',
9
+ Figure: 'Figure',
10
+ FigureCaption: 'FigureCaption',
11
+ Table: 'Table',
12
+ TableCaption: 'TableCaption',
13
+ TableFootnote: 'TableFootnote',
14
+ IsolateFormula: 'IsolateFormula',
15
+ FormulaCaption: 'FormulaCaption',
16
+ });
17
+ export type DocLayoutElementType = (typeof DocLayoutElementType)[keyof typeof DocLayoutElementType];
18
+
19
+ export const DocLayoutElementTypeSchema = z.union([
20
+ z.literal(DocLayoutElementType.Title).describe('标题'),
21
+ z.literal(DocLayoutElementType.PlainText).describe('纯文本'),
22
+ z.literal(DocLayoutElementType.Abandon).describe('废弃'),
23
+ z.literal(DocLayoutElementType.Figure).describe('图片'),
24
+ z.literal(DocLayoutElementType.FigureCaption).describe('图片说明'),
25
+ z.literal(DocLayoutElementType.Table).describe('表格'),
26
+ z.literal(DocLayoutElementType.TableCaption).describe('表格标题'),
27
+ z.literal(DocLayoutElementType.TableFootnote).describe('表格脚注'),
28
+ z.literal(DocLayoutElementType.IsolateFormula).describe('独立公式'),
29
+ z.literal(DocLayoutElementType.FormulaCaption).describe('公式说明'),
30
+ ]);
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod';
2
+
3
+ export type ImageAnnotation = z.infer<typeof ImageAnnotationSchema>;
4
+ export const ImageAnnotationSchema = z.looseObject({
5
+ id: z.string().optional(),
6
+ title: z.string().trim().optional().describe('标题'),
7
+ description: z.string().trim().optional().describe('描述'),
8
+ type: z.string().trim().optional().describe('类型'),
9
+
10
+ // 内容字段
11
+ text: z.string().optional().describe('文本内容'),
12
+ markdown: z.string().optional().describe('Markdown 内容'),
13
+ csv: z.string().optional().describe('CSV 内容'),
14
+ html: z.string().optional().describe('HTML 内容'),
15
+ data: z.any().optional().describe('任意数据'),
16
+
17
+ // 定位信息
18
+ field: z.string().trim().optional().describe('目标字段'),
19
+ file: z.string().trim().optional().describe('源文件'),
20
+ page: z.coerce.number().int().nonnegative().optional().describe('页码'),
21
+
22
+ // 几何/边界框信息
23
+ bbox: z.array(z.number()).optional().describe('边界框'),
24
+ xywh: z
25
+ .array(z.number())
26
+ .length(4, { error: 'xywh 必须包含4个数字 [x, y, width, height]' })
27
+ .optional()
28
+ .describe('XYWH'),
29
+ xyxy: z.array(z.number()).length(4, { error: 'xyxy 必须包含4个数字 [x1, y1, x2, y2]' }).optional().describe('XYXY'),
30
+ polygon: z.array(z.number().array()).optional().describe('Polygon'),
31
+ x: z.coerce.number().optional().describe('X 坐标'),
32
+ y: z.coerce.number().optional().describe('Y 坐标'),
33
+ w: z.coerce.number().nonnegative().optional().describe('宽度'),
34
+ h: z.coerce.number().nonnegative().optional().describe('高度'),
35
+
36
+ label: z.string().trim().optional().describe('标签'),
37
+ confidence: z.coerce.number().min(0).max(1).optional().describe('置信度'),
38
+ score: z.coerce.number().optional().describe('原始分数'),
39
+
40
+ classes: z
41
+ .array(
42
+ z.object({
43
+ label: z.string().nonempty({ error: '分类标签不能为空' }).describe('分类标签'),
44
+ confidence: z.coerce.number().min(0).max(1).optional().describe('分类置信度 (0-1)'),
45
+ score: z.coerce.number().optional().describe('分类原始分数'),
46
+ }),
47
+ )
48
+ .optional()
49
+ .describe('多分类结果'),
50
+
51
+ // 元数据和标签
52
+ tags: z.array(z.string()).optional().describe('标签'),
53
+ metadata: z.record(z.string(), z.any()).optional().describe('元数据'),
54
+ attributes: z.record(z.string(), z.any()).optional().describe('属性'),
55
+ properties: z.record(z.string(), z.any()).optional().describe('属性'),
56
+
57
+ get annotations(): z.ZodOptional<z.ZodArray<typeof ImageAnnotationSchema>> {
58
+ return z.array(ImageAnnotationSchema).optional().describe('子注释');
59
+ },
60
+ });
@@ -0,0 +1,2 @@
1
+ export { ImageAnnotationSchema, type ImageAnnotation } from './ImageAnnotationSchema';
2
+ export { resolveImageAnnotation, type ResolvedImageAnnotation } from './resolveImageAnnotation';
@@ -0,0 +1,135 @@
1
+ import type { ImageAnnotation } from './ImageAnnotationSchema';
2
+
3
+ export { resolveImageAnnotation };
4
+
5
+ export type ResolvedImageAnnotation = Omit<ImageAnnotation, 'id' | 'annotations' | 'attributes' | 'metadata'> & {
6
+ id: string;
7
+ annotations: ResolvedImageAnnotation[];
8
+ attributes: Record<string, any>;
9
+ metadata: Record<string, any>;
10
+ };
11
+
12
+ function resolveImageAnnotation(input: Partial<ImageAnnotation>): ResolvedImageAnnotation {
13
+ const normalize = (
14
+ input: ImageAnnotation,
15
+ {
16
+ path = [],
17
+ level = 0,
18
+ }: {
19
+ path?: number[];
20
+ level?: number;
21
+ } = {},
22
+ ) => {
23
+ input.id ||= path.join('.') || 'ROOT';
24
+ input.annotations ||= [];
25
+ input.tags ||= [];
26
+ input.attributes ||= {};
27
+ input.metadata ||= {};
28
+
29
+ if (!input.csv && input.html?.includes('<table') && globalThis.DOMParser) {
30
+ const parser = new DOMParser();
31
+ const doc = parser.parseFromString(input.html, 'text/html');
32
+ const table = doc.querySelector('table');
33
+
34
+ if (table) {
35
+ const rows = Array.from(table.querySelectorAll('tr'));
36
+ input.data = rows.map((row) =>
37
+ Array.from(row.querySelectorAll('td')).map((td) => td.textContent?.trim() || ''),
38
+ );
39
+ }
40
+ }
41
+ input.annotations.forEach((v, i) => normalize(v, { path: [...path, i], level: level + 1 }));
42
+
43
+ resolveBBox(input);
44
+
45
+ // can get bbox from annotations
46
+ let first = input.annotations.find((v) => v.xyxy)?.xyxy;
47
+ if (!input.xyxy && first) {
48
+ const xyxy = input.annotations.reduce((acc, v) => {
49
+ if (!v.xyxy) return acc;
50
+ return [
51
+ Math.min(acc[0], v.xyxy[0]),
52
+ Math.min(acc[1], v.xyxy[1]),
53
+ Math.max(acc[2], v.xyxy[2]),
54
+ Math.max(acc[3], v.xyxy[3]),
55
+ ];
56
+ }, first);
57
+ input.xyxy = xyxy;
58
+ input.xywh = xyxy2xywh(xyxy);
59
+ }
60
+ };
61
+
62
+ const out = input as ResolvedImageAnnotation;
63
+ normalize(out);
64
+ // out.annotations.forEach((v) => norm(v));
65
+
66
+ // only merge for root node
67
+
68
+ if (!out.markdown) {
69
+ out.markdown = out.annotations.map((v) => v.markdown).join('\n');
70
+ out.markdown ||= undefined;
71
+ }
72
+ if (!out.text) {
73
+ out.text = out.annotations.map((v) => v.text).join('\n');
74
+ out.text ||= undefined;
75
+ }
76
+ // fallback
77
+ out.text ||= out.markdown;
78
+ out.markdown ||= out.text;
79
+ return out;
80
+ }
81
+
82
+ function xywh2xyxy(input?: number[]) {
83
+ if (!input) return;
84
+ const [x, y, w, h] = input;
85
+ return [x, y, x + w, y + h];
86
+ }
87
+
88
+ function xyxy2xywh(input?: number[]) {
89
+ if (!input) return;
90
+ const [x1, y1, x2, y2] = input;
91
+ return [x1, y1, x2 - x1, y2 - y1];
92
+ }
93
+
94
+ type BBoxObject = {
95
+ xywh: number[];
96
+ xyxy: number[];
97
+ x: number;
98
+ y: number;
99
+ w: number;
100
+ h: number;
101
+ };
102
+
103
+ function resolveBBox(input: {
104
+ xywh?: number[];
105
+ xyxy?: number[];
106
+ x?: number;
107
+ y?: number;
108
+ w?: number;
109
+ h?: number;
110
+ }): BBoxObject | undefined {
111
+ let { x, y, w, h } = input as {
112
+ x: number;
113
+ y: number;
114
+ w: number;
115
+ h: number;
116
+ };
117
+ let isNil = (v: any) => v === undefined || v === null;
118
+ if (isNil(x) && input.xywh?.length) {
119
+ [x, y, w, h] = input.xywh;
120
+ }
121
+ if (isNil(x) && input.xyxy?.length) {
122
+ [x, y, w, h] = xyxy2xywh(input.xyxy)!;
123
+ }
124
+ if (!isNil(x)) {
125
+ input.xywh ||= [x, y, w, h];
126
+ input.xyxy ||= xywh2xyxy(input.xywh);
127
+ input.x = x;
128
+ input.y = y;
129
+ input.w = w;
130
+ input.h = h;
131
+
132
+ return input as BBoxObject;
133
+ }
134
+ return;
135
+ }
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { ChineseResidentIdNo } from './mod';
2
+ import { ChineseResidentIdNo } from './index';
3
3
 
4
4
  describe('ChineseResidentIdNo', () => {
5
5
  it('should parse', () => {
@@ -32,7 +32,7 @@ export function parseChineseResidentIdNo(idNo: string): ParsedChineseResidentIdN
32
32
  addressCode: division,
33
33
  birthDate: `${year}-${month}-${day}`,
34
34
  sequence: seq,
35
- checkDigit: checkDigit.toUpperCase() === 'X' ? 10 : parseInt(checkDigit),
35
+ checkDigit: checkDigit.toUpperCase() === 'X' ? 10 : parseInt(checkDigit, 10),
36
36
  sex: seq % 2 === 0 ? SexType.Male : SexType.Female,
37
37
  age: new Date().getFullYear() - parseInt(year, 10),
38
38
  valid: Mod11.validate(idNo),
@@ -64,3 +64,11 @@ export function formatChineseResidentIdNo({
64
64
  : checkDigit?.toUpperCase() || Mod11.compute(major);
65
65
  return `${major}${check}`;
66
66
  }
67
+
68
+ export namespace ChineseResidentIdNo {
69
+ export const regex = ChineseResidentIdNoRegex;
70
+ export const parse = parseChineseResidentIdNo;
71
+ export const format = formatChineseResidentIdNo;
72
+ export type Result = ParsedChineseResidentIdNo;
73
+ export const ResultSchema = ParsedChineseResidentIdNoSchema;
74
+ }
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { DivisionCode } from './mod';
2
+ import { DivisionCode } from './index';
3
3
 
4
4
  describe('DivisionCode', () => {
5
5
  it('should parse', () => {
@@ -144,3 +144,11 @@ export function formatDivisionCode({
144
144
 
145
145
  return codes.join('');
146
146
  }
147
+
148
+ export namespace DivisionCode {
149
+ export const regex = DivisionCodeRegex;
150
+ export const parse = parseDivisionCode;
151
+ export const format = formatDivisionCode;
152
+ export type Result = ParsedDivisionCode;
153
+ export const ResultSchema = ParsedDivisionCodeSchema;
154
+ }
package/src/cn/Mod11.ts CHANGED
@@ -12,7 +12,7 @@ export class Mod11Checksum {
12
12
  const { weights } = this;
13
13
  let sum = 0;
14
14
  for (let i = 0; i < s.length; i++) {
15
- sum += parseInt(s[i]) * weights[i];
15
+ sum += parseInt(s[i], 10) * weights[i];
16
16
  }
17
17
  const num = (12 - (sum % 11)) % 11;
18
18
  if (num < 10) {
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { UnifiedSocialCreditCode } from './mod';
2
+ import { UnifiedSocialCreditCode } from './index';
3
3
 
4
4
  describe('UnifiedSocialCreditCode', () => {
5
5
  it('should parse', () => {
@@ -121,3 +121,18 @@ export function next(s: string, delta: number = 1) {
121
121
  }
122
122
  return sp.map((v) => Mod31.chars[v]).join('');
123
123
  }
124
+
125
+ export namespace UnifiedSocialCreditCode {
126
+ export const regex = UnifiedSocialCreditCodeRegex;
127
+ export const parse = parseUnifiedSocialCreditCode;
128
+ export const format = formatUnifiedSocialCreditCode;
129
+ export type Result = ParsedUnifiedSocialCreditCode;
130
+ export const ResultSchema = ParsedUnifiedSocialCreditCodeSchema;
131
+ export function test(s: string | undefined | null) {
132
+ if (!s) {
133
+ return false;
134
+ }
135
+ // fast check
136
+ return regex.test(s) && Mod31.validate(s);
137
+ }
138
+ }
@@ -3,7 +3,7 @@
3
3
  exports[`ChineseResidentIdNo > should parse 1`] = `
4
4
  {
5
5
  "addressCode": "110105",
6
- "age": 76,
6
+ "age": 77,
7
7
  "birthDate": "1949-12-31",
8
8
  "checkDigit": 10,
9
9
  "raw": "11010519491231002X",
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @see https://gist.github.com/tonyc726/00c829a54a40cf80409f
3
+ * @see https://github.com/Siykt/javascript-algorithms/blob/master/src/algorithms/string/getChinesePrice.ts 人民币金额转中文大写
4
+ */
5
+ export function formatChineseAmount(price: number) {
6
+ if (price === 0) return '零元整';
7
+ if (price >= 1e12) return '整数位已超过最大值';
8
+
9
+ const CHINESE_NUMBER_MAP = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
10
+ const CHINESE_UNIT_MAP = ['', '拾', '佰', '仟'];
11
+ const CHINESE_BIG_UNIT_MAP = ['', '万', '亿'];
12
+ const CHINESE_SMALL_UNIT_MAP = ['角', '分', '厘', '毫'];
13
+
14
+ const priceStr = price.toString();
15
+ const priceArr = priceStr.split('.');
16
+ const integer = priceArr[0];
17
+ const decimal = priceArr[1];
18
+
19
+ let chineseIntegerPrice = '';
20
+ let zeroCount = 0;
21
+
22
+ for (let i = 0; i < integer.length; i++) {
23
+ const num = +integer[i];
24
+ const unit = integer.length - i - 1; // 当前数字的单位
25
+ const quotient = Math.floor(unit / 4); // 1w为进位单位, 除 4 即为 万 亿
26
+ const remainder = unit % 4; // 1w为进位单位, 取模 4 即为 个 十 百 千
27
+
28
+ if (num === 0) {
29
+ zeroCount++;
30
+ } else {
31
+ // 处理前置的零
32
+ if (zeroCount > 0) chineseIntegerPrice += CHINESE_NUMBER_MAP[0];
33
+ zeroCount = 0;
34
+ chineseIntegerPrice += CHINESE_NUMBER_MAP[num] + CHINESE_UNIT_MAP[remainder];
35
+ }
36
+ if (remainder === 0 && zeroCount < 4) {
37
+ chineseIntegerPrice += CHINESE_BIG_UNIT_MAP[quotient];
38
+ }
39
+ }
40
+
41
+ // 价格为小数时,整数部分不显示
42
+ if (price < 1) chineseIntegerPrice = '';
43
+ else chineseIntegerPrice += '元';
44
+
45
+ let chineseDecimalPrice = '';
46
+
47
+ if (!decimal) {
48
+ chineseDecimalPrice = '整';
49
+ } else {
50
+ let hasZero = false;
51
+ for (let i = 0; i < decimal.length; i++) {
52
+ const num = +decimal[i];
53
+ if (num) chineseDecimalPrice += CHINESE_NUMBER_MAP[num] + CHINESE_SMALL_UNIT_MAP[i];
54
+ else hasZero = true;
55
+ }
56
+
57
+ if (chineseIntegerPrice && hasZero) chineseIntegerPrice += '零';
58
+ }
59
+
60
+ return chineseIntegerPrice + chineseDecimalPrice;
61
+ }
package/src/cn/index.ts CHANGED
@@ -1 +1,7 @@
1
- export { ChineseResidentIdNo, UnifiedSocialCreditCode, DivisionCode } from './mod';
1
+ export { ChineseResidentIdNo } from './ChineseResidentIdNo';
2
+ export { UnifiedSocialCreditCode } from './UnifiedSocialCreditCode';
3
+ export { DivisionCode } from './DivisionCode';
4
+
5
+ export * from './formatChineseAmount';
6
+ export * from './parseChineseNumber';
7
+ export * from './pinyin/toPinyinPure';