@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
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@wener/common",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
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,26 @@
30
36
  "types": "./src/decimal/index.ts",
31
37
  "default": "./lib/decimal/index.js"
32
38
  },
39
+ "./fs": {
40
+ "types": "./src/fs/index.ts",
41
+ "default": "./lib/fs/index.js"
42
+ },
43
+ "./fs/orpc": {
44
+ "types": "./src/fs/orpc/index.ts",
45
+ "default": "./lib/fs/orpc/index.js"
46
+ },
47
+ "./fs/orpc/server": {
48
+ "types": "./src/fs/orpc/server/index.ts",
49
+ "default": "./lib/fs/orpc/server/index.js"
50
+ },
51
+ "./fs/s3": {
52
+ "types": "./src/fs/s3/index.ts",
53
+ "default": "./lib/fs/s3/index.js"
54
+ },
55
+ "./fs/server": {
56
+ "types": "./src/fs/server/index.ts",
57
+ "default": "./lib/fs/server/index.js"
58
+ },
33
59
  "./jsonschema": {
34
60
  "types": "./src/jsonschema/index.ts",
35
61
  "default": "./lib/jsonschema/index.js"
@@ -38,6 +64,10 @@
38
64
  "types": "./src/meta/index.ts",
39
65
  "default": "./lib/meta/index.js"
40
66
  },
67
+ "./orpc": {
68
+ "types": "./src/orpc/index.ts",
69
+ "default": "./lib/orpc/index.js"
70
+ },
41
71
  "./password": {
42
72
  "types": "./src/password/index.ts",
43
73
  "default": "./lib/password/index.js"
@@ -50,10 +80,18 @@
50
80
  "types": "./src/resource/schema/index.ts",
51
81
  "default": "./lib/resource/schema/index.js"
52
82
  },
83
+ "./s3": {
84
+ "types": "./src/s3/index.ts",
85
+ "default": "./lib/s3/index.js"
86
+ },
53
87
  "./schema": {
54
88
  "types": "./src/schema/index.ts",
55
89
  "default": "./lib/schema/index.js"
56
90
  },
91
+ "./utils": {
92
+ "types": "./src/utils/index.ts",
93
+ "default": "./lib/utils/index.js"
94
+ },
57
95
  "./package.json": "./package.json"
58
96
  },
59
97
  "files": [
@@ -64,34 +102,44 @@
64
102
  ],
65
103
  "keywords": [],
66
104
  "peerDependencies": {
105
+ "ajv": "*",
67
106
  "zod": "*"
68
107
  },
69
108
  "dependencies": {
70
- "@standard-schema/spec": "^1.0.0",
71
- "@wener/utils": "^1.1.51",
109
+ "@standard-schema/spec": "^1.1.0",
110
+ "@wener/utils": "^1.1.58",
72
111
  "date-fns": "^4.1.0",
73
- "es-toolkit": "^1.39.10",
74
- "std-env": "^3.9.0",
75
- "ts-pattern": "^5.8.0"
112
+ "es-toolkit": "^1.43.0",
113
+ "std-env": "^3.10.0",
114
+ "ts-pattern": "^5.9.0"
76
115
  },
77
116
  "devDependencies": {
78
- "@sinclair/typebox": "^0.34.41",
117
+ "@orpc/client": "^1.13.4",
118
+ "@orpc/contract": "^1.13.4",
119
+ "@orpc/openapi-client": "^1.13.4",
120
+ "@sinclair/typebox": "^0.34.47",
79
121
  "@sinclair/typebox-codegen": "^0.11.1",
80
122
  "@types/argon2-browser": "^1.18.4",
81
123
  "@types/bcrypt": "^6.0.0",
82
- "ajv": "^8.17.1",
124
+ "@types/micromatch": "^4.0.10",
125
+ "@types/mime-types": "^3.0.1",
83
126
  "ajv-formats": "^3.0.1",
84
127
  "ajv-i18n": "^4.2.0",
85
128
  "ajv-keywords": "^5.1.0",
86
129
  "argon2": "^0.44.0",
87
130
  "argon2-browser": "^1.18.0",
88
131
  "bcrypt": "^6.0.0",
89
- "bcryptjs": "^3.0.2",
132
+ "bcryptjs": "^3.0.3",
90
133
  "chalk": "^5.6.2",
91
134
  "consola": "^3.4.2",
92
- "dayjs": "^1.11.18",
135
+ "dayjs": "^1.11.19",
93
136
  "decimal.js": "^10.6.0",
94
- "zod": "^4.1.8"
137
+ "emittery": "^1.2.0",
138
+ "micromatch": "^4.0.8",
139
+ "mime-types": "^3.0.2",
140
+ "pathe": "^2.0.3",
141
+ "s3mini": "^0.8.1",
142
+ "zod": "^4.3.5"
95
143
  },
96
144
  "scripts": {
97
145
  "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', () => {
@@ -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
+ }
@@ -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
+ }
@@ -45,3 +45,26 @@ exports[`UnifiedSocialCreditCode > should parse 2`] = `
45
45
  "valid": true,
46
46
  }
47
47
  `;
48
+
49
+ exports[`UnifiedSocialCreditCode > should parse 3`] = `
50
+ {
51
+ "adminDivisionCode": "310120",
52
+ "checkDigit": "0",
53
+ "codes": [
54
+ "9",
55
+ "1",
56
+ "310120",
57
+ "MAEXK9GG9",
58
+ "0",
59
+ ],
60
+ "entityCategoryCode": "1",
61
+ "names": [
62
+ "工商",
63
+ "企业",
64
+ ],
65
+ "organizationCode": "MAEXK9GG9",
66
+ "raw": "91310120MAEXK9GG90",
67
+ "registrationAuthorityCode": "9",
68
+ "valid": false,
69
+ }
70
+ `;
@@ -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';