@wener/common 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/lib/ai/qwen3vl/index.js +2 -0
  2. package/lib/ai/qwen3vl/index.js.map +1 -0
  3. package/lib/ai/qwen3vl/utils.js +31 -0
  4. package/lib/ai/qwen3vl/utils.js.map +1 -0
  5. package/lib/ai/vision/DocLayoutElementTypeSchema.js +28 -0
  6. package/lib/ai/vision/DocLayoutElementTypeSchema.js.map +1 -0
  7. package/lib/ai/vision/ImageAnnotationSchema.js +50 -0
  8. package/lib/ai/vision/ImageAnnotationSchema.js.map +1 -0
  9. package/lib/ai/vision/index.js +3 -0
  10. package/lib/ai/vision/index.js.map +1 -0
  11. package/lib/ai/vision/resolveImageAnnotation.js +105 -0
  12. package/lib/ai/vision/resolveImageAnnotation.js.map +1 -0
  13. package/lib/cn/ChineseResidentIdNo.js +21 -14
  14. package/lib/cn/ChineseResidentIdNo.js.map +1 -0
  15. package/lib/cn/ChineseResidentIdNo.test.js +1 -1
  16. package/lib/cn/DivisionCode.js +30 -25
  17. package/lib/cn/DivisionCode.js.map +1 -0
  18. package/lib/cn/DivisionCode.test.js +1 -1
  19. package/lib/cn/Mod11.js +38 -81
  20. package/lib/cn/Mod11.js.map +1 -0
  21. package/lib/cn/Mod31.js +41 -90
  22. package/lib/cn/Mod31.js.map +1 -0
  23. package/lib/cn/UnifiedSocialCreditCode.js +43 -34
  24. package/lib/cn/UnifiedSocialCreditCode.js.map +1 -0
  25. package/lib/cn/UnifiedSocialCreditCode.test.js +1 -1
  26. package/lib/cn/formatChineseAmount.js +77 -0
  27. package/lib/cn/formatChineseAmount.js.map +1 -0
  28. package/lib/cn/index.js +7 -1
  29. package/lib/cn/index.js.map +1 -0
  30. package/lib/cn/parseChineseNumber.js +94 -0
  31. package/lib/cn/parseChineseNumber.js.map +1 -0
  32. package/lib/cn/parseChineseNumber.test.js +278 -0
  33. package/lib/cn/pinyin/cartesianProduct.js +22 -0
  34. package/lib/cn/pinyin/cartesianProduct.js.map +1 -0
  35. package/lib/cn/pinyin/cartesianProduct.test.js +179 -0
  36. package/lib/cn/pinyin/data.json +23573 -0
  37. package/lib/cn/pinyin/loader.js +14 -0
  38. package/lib/cn/pinyin/loader.js.map +1 -0
  39. package/lib/cn/pinyin/preload.js +3 -0
  40. package/lib/cn/pinyin/preload.js.map +1 -0
  41. package/lib/cn/pinyin/toPinyin.test.js +167 -0
  42. package/lib/cn/pinyin/toPinyinPure.js +33 -0
  43. package/lib/cn/pinyin/toPinyinPure.js.map +1 -0
  44. package/lib/cn/pinyin/transform.js +14 -0
  45. package/lib/cn/pinyin/transform.js.map +1 -0
  46. package/lib/cn/types.d.js +2 -0
  47. package/lib/cn/types.d.js.map +1 -0
  48. package/lib/consola/createStandardConsolaReporter.js +6 -6
  49. package/lib/consola/createStandardConsolaReporter.js.map +1 -0
  50. package/lib/consola/formatLogObject.js +65 -145
  51. package/lib/consola/formatLogObject.js.map +1 -0
  52. package/lib/consola/formatLogObject.test.js +184 -0
  53. package/lib/consola/index.js +1 -0
  54. package/lib/consola/index.js.map +1 -0
  55. package/lib/data/formatSort.js +6 -5
  56. package/lib/data/formatSort.js.map +1 -0
  57. package/lib/data/index.js +1 -0
  58. package/lib/data/index.js.map +1 -0
  59. package/lib/data/maybeNumber.js +5 -7
  60. package/lib/data/maybeNumber.js.map +1 -0
  61. package/lib/data/parseSort.js +22 -28
  62. package/lib/data/parseSort.js.map +1 -0
  63. package/lib/data/resolvePagination.js +13 -17
  64. package/lib/data/resolvePagination.js.map +1 -0
  65. package/lib/data/types.d.js +2 -0
  66. package/lib/data/types.d.js.map +1 -0
  67. package/lib/dayjs/dayjs.js +21 -19
  68. package/lib/dayjs/dayjs.js.map +1 -0
  69. package/lib/dayjs/formatDuration.js +15 -14
  70. package/lib/dayjs/formatDuration.js.map +1 -0
  71. package/lib/dayjs/index.js +2 -0
  72. package/lib/dayjs/index.js.map +1 -0
  73. package/lib/dayjs/parseDuration.js +5 -8
  74. package/lib/dayjs/parseDuration.js.map +1 -0
  75. package/lib/dayjs/parseRelativeTime.js +90 -0
  76. package/lib/dayjs/parseRelativeTime.js.map +1 -0
  77. package/lib/dayjs/parseRelativeTime.test.js +247 -0
  78. package/lib/dayjs/resolveRelativeTime.js +158 -0
  79. package/lib/dayjs/resolveRelativeTime.js.map +1 -0
  80. package/lib/dayjs/resolveRelativeTime.test.js +310 -0
  81. package/lib/decimal/index.js +1 -0
  82. package/lib/decimal/index.js.map +1 -0
  83. package/lib/decimal/parseDecimal.js +3 -1
  84. package/lib/decimal/parseDecimal.js.map +1 -0
  85. package/lib/emittery/emitter.js +10 -0
  86. package/lib/emittery/emitter.js.map +1 -0
  87. package/lib/emittery/index.js +2 -0
  88. package/lib/emittery/index.js.map +1 -0
  89. package/lib/foundation/schema/SexType.js +5 -3
  90. package/lib/foundation/schema/SexType.js.map +1 -0
  91. package/lib/foundation/schema/index.js +1 -0
  92. package/lib/foundation/schema/index.js.map +1 -0
  93. package/lib/foundation/schema/parseSexType.js +1 -0
  94. package/lib/foundation/schema/parseSexType.js.map +1 -0
  95. package/lib/foundation/schema/types.js +4 -2
  96. package/lib/foundation/schema/types.js.map +1 -0
  97. package/lib/fs/FileSystemError.js +23 -0
  98. package/lib/fs/FileSystemError.js.map +1 -0
  99. package/lib/fs/IFileSystem.d.js +3 -0
  100. package/lib/fs/IFileSystem.d.js.map +1 -0
  101. package/lib/fs/MemoryFileSystem.test.js +188 -0
  102. package/lib/fs/createBrowserFileSystem.js +248 -0
  103. package/lib/fs/createBrowserFileSystem.js.map +1 -0
  104. package/lib/fs/createMemoryFileSystem.js +516 -0
  105. package/lib/fs/createMemoryFileSystem.js.map +1 -0
  106. package/lib/fs/createSandboxFileSystem.js +108 -0
  107. package/lib/fs/createSandboxFileSystem.js.map +1 -0
  108. package/lib/fs/createWebDavFileSystem.js +137 -0
  109. package/lib/fs/createWebDavFileSystem.js.map +1 -0
  110. package/lib/fs/findMimeType.js +17 -0
  111. package/lib/fs/findMimeType.js.map +1 -0
  112. package/lib/fs/index.js +8 -0
  113. package/lib/fs/index.js.map +1 -0
  114. package/lib/fs/orpc/FileSystemContract.js +93 -0
  115. package/lib/fs/orpc/FileSystemContract.js.map +1 -0
  116. package/lib/fs/orpc/createContractClientFileSystem.js +93 -0
  117. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -0
  118. package/lib/fs/orpc/index.js +3 -0
  119. package/lib/fs/orpc/index.js.map +1 -0
  120. package/lib/fs/orpc/server/createFileSystemContractImpl.js +63 -0
  121. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -0
  122. package/lib/fs/orpc/server/index.js +2 -0
  123. package/lib/fs/orpc/server/index.js.map +1 -0
  124. package/lib/fs/s3/createS3MiniFileSystem.js +705 -0
  125. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -0
  126. package/lib/fs/s3/index.js +2 -0
  127. package/lib/fs/s3/index.js.map +1 -0
  128. package/lib/fs/s3/s3mini.test.js +584 -0
  129. package/lib/fs/scandir.js +59 -0
  130. package/lib/fs/scandir.js.map +1 -0
  131. package/lib/fs/server/createDatabaseFileSystem.js +750 -0
  132. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -0
  133. package/lib/fs/server/createNodeFileSystem.js +401 -0
  134. package/lib/fs/server/createNodeFileSystem.js.map +1 -0
  135. package/lib/fs/server/dbfs.test.js +221 -0
  136. package/lib/fs/server/index.js +2 -0
  137. package/lib/fs/server/index.js.map +1 -0
  138. package/lib/fs/server/loadTestDatabase.js +127 -0
  139. package/lib/fs/server/loadTestDatabase.js.map +1 -0
  140. package/lib/fs/tests/runFileSystemTest.js +318 -0
  141. package/lib/fs/tests/runFileSystemTest.js.map +1 -0
  142. package/lib/fs/types.js +27 -0
  143. package/lib/fs/types.js.map +1 -0
  144. package/lib/fs/utils/getFileUrl.js +35 -0
  145. package/lib/fs/utils/getFileUrl.js.map +1 -0
  146. package/lib/fs/utils.js +22 -0
  147. package/lib/fs/utils.js.map +1 -0
  148. package/lib/index.js +1 -0
  149. package/lib/index.js.map +1 -0
  150. package/lib/jsonschema/JsonSchema.js +146 -172
  151. package/lib/jsonschema/JsonSchema.js.map +1 -0
  152. package/lib/jsonschema/forEachJsonSchema.js +44 -0
  153. package/lib/jsonschema/forEachJsonSchema.js.map +1 -0
  154. package/lib/jsonschema/index.js +2 -0
  155. package/lib/jsonschema/index.js.map +1 -0
  156. package/lib/jsonschema/types.d.js +2 -0
  157. package/lib/jsonschema/types.d.js.map +1 -0
  158. package/lib/meta/defineFileType.js +20 -103
  159. package/lib/meta/defineFileType.js.map +1 -0
  160. package/lib/meta/defineInit.js +31 -250
  161. package/lib/meta/defineInit.js.map +1 -0
  162. package/lib/meta/defineMetadata.js +24 -140
  163. package/lib/meta/defineMetadata.js.map +1 -0
  164. package/lib/meta/index.js +1 -0
  165. package/lib/meta/index.js.map +1 -0
  166. package/lib/orpc/createOpenApiContractClient.js +27 -0
  167. package/lib/orpc/createOpenApiContractClient.js.map +1 -0
  168. package/lib/orpc/createRpcContractClient.js +34 -0
  169. package/lib/orpc/createRpcContractClient.js.map +1 -0
  170. package/lib/orpc/index.js +3 -0
  171. package/lib/orpc/index.js.map +1 -0
  172. package/lib/orpc/resolveLinkPlugins.js +28 -0
  173. package/lib/orpc/resolveLinkPlugins.js.map +1 -0
  174. package/lib/password/PHC.js +63 -87
  175. package/lib/password/PHC.js.map +1 -0
  176. package/lib/password/PHC.test.js +11 -3
  177. package/lib/password/Password.js +29 -294
  178. package/lib/password/Password.js.map +1 -0
  179. package/lib/password/Password.test.js +35 -22
  180. package/lib/password/createArgon2PasswordAlgorithm.js +35 -191
  181. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -0
  182. package/lib/password/createBase64PasswordAlgorithm.js +8 -141
  183. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -0
  184. package/lib/password/createBcryptPasswordAlgorithm.js +13 -168
  185. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -0
  186. package/lib/password/createPBKDF2PasswordAlgorithm.js +46 -228
  187. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -0
  188. package/lib/password/createScryptPasswordAlgorithm.js +55 -211
  189. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -0
  190. package/lib/password/index.js +1 -0
  191. package/lib/password/index.js.map +1 -0
  192. package/lib/password/server/index.js +1 -0
  193. package/lib/password/server/index.js.map +1 -0
  194. package/lib/resource/Identifiable.js +2 -0
  195. package/lib/resource/Identifiable.js.map +1 -0
  196. package/lib/resource/ListQuery.js +21 -93
  197. package/lib/resource/ListQuery.js.map +1 -0
  198. package/lib/resource/getTitleOfResource.js +3 -5
  199. package/lib/resource/getTitleOfResource.js.map +1 -0
  200. package/lib/resource/index.js +1 -0
  201. package/lib/resource/index.js.map +1 -0
  202. package/lib/resource/schema/AnyResourceSchema.js +2 -1
  203. package/lib/resource/schema/AnyResourceSchema.js.map +1 -0
  204. package/lib/resource/schema/BaseResourceSchema.js +2 -1
  205. package/lib/resource/schema/BaseResourceSchema.js.map +1 -0
  206. package/lib/resource/schema/ResourceActionType.js +6 -4
  207. package/lib/resource/schema/ResourceActionType.js.map +1 -0
  208. package/lib/resource/schema/ResourceStatus.js +5 -3
  209. package/lib/resource/schema/ResourceStatus.js.map +1 -0
  210. package/lib/resource/schema/ResourceType.js +5 -3
  211. package/lib/resource/schema/ResourceType.js.map +1 -0
  212. package/lib/resource/schema/index.js +1 -0
  213. package/lib/resource/schema/index.js.map +1 -0
  214. package/lib/resource/schema/types.js +16 -20
  215. package/lib/resource/schema/types.js.map +1 -0
  216. package/lib/s3/formatS3Url.js +65 -0
  217. package/lib/s3/formatS3Url.js.map +1 -0
  218. package/lib/s3/formatS3Url.test.js +262 -0
  219. package/lib/s3/index.js +3 -0
  220. package/lib/s3/index.js.map +1 -0
  221. package/lib/s3/parseS3Url.js +65 -0
  222. package/lib/s3/parseS3Url.js.map +1 -0
  223. package/lib/s3/parseS3Url.test.js +270 -0
  224. package/lib/schema/SchemaRegistry.js +38 -38
  225. package/lib/schema/SchemaRegistry.js.map +1 -0
  226. package/lib/schema/TypeSchema.d.js +2 -0
  227. package/lib/schema/TypeSchema.d.js.map +1 -0
  228. package/lib/schema/createSchemaData.js +26 -125
  229. package/lib/schema/createSchemaData.js.map +1 -0
  230. package/lib/schema/findJsonSchemaByPath.js +13 -36
  231. package/lib/schema/findJsonSchemaByPath.js.map +1 -0
  232. package/lib/schema/formatZodError.js +140 -0
  233. package/lib/schema/formatZodError.js.map +1 -0
  234. package/lib/schema/formatZodError.test.js +196 -0
  235. package/lib/schema/getSchemaCache.js +5 -5
  236. package/lib/schema/getSchemaCache.js.map +1 -0
  237. package/lib/schema/getSchemaOptions.js +8 -11
  238. package/lib/schema/getSchemaOptions.js.map +1 -0
  239. package/lib/schema/index.js +2 -1
  240. package/lib/schema/index.js.map +1 -0
  241. package/lib/schema/toJsonSchema.js +47 -290
  242. package/lib/schema/toJsonSchema.js.map +1 -0
  243. package/lib/schema/validate.js +33 -45
  244. package/lib/schema/validate.js.map +1 -0
  245. package/lib/tools/generateSchema.js +39 -197
  246. package/lib/tools/generateSchema.js.map +1 -0
  247. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +55 -143
  248. package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -0
  249. package/lib/utils/buildBaseUrl.js +13 -0
  250. package/lib/utils/buildBaseUrl.js.map +1 -0
  251. package/lib/utils/buildRedactorFormSchema.js +59 -0
  252. package/lib/utils/buildRedactorFormSchema.js.map +1 -0
  253. package/lib/utils/getEstimateProcessTime.js +12 -11
  254. package/lib/utils/getEstimateProcessTime.js.map +1 -0
  255. package/lib/utils/index.js +3 -0
  256. package/lib/utils/index.js.map +1 -0
  257. package/lib/utils/resolveFeatureOptions.js +12 -0
  258. package/lib/utils/resolveFeatureOptions.js.map +1 -0
  259. package/package.json +61 -13
  260. package/src/ai/qwen3vl/index.ts +1 -0
  261. package/src/ai/qwen3vl/utils.ts +36 -0
  262. package/src/ai/vision/DocLayoutElementTypeSchema.ts +30 -0
  263. package/src/ai/vision/ImageAnnotationSchema.ts +60 -0
  264. package/src/ai/vision/index.ts +2 -0
  265. package/src/ai/vision/resolveImageAnnotation.ts +135 -0
  266. package/src/cn/ChineseResidentIdNo.test.ts +1 -1
  267. package/src/cn/ChineseResidentIdNo.ts +8 -0
  268. package/src/cn/DivisionCode.test.ts +1 -1
  269. package/src/cn/DivisionCode.ts +8 -0
  270. package/src/cn/UnifiedSocialCreditCode.test.ts +1 -1
  271. package/src/cn/UnifiedSocialCreditCode.ts +15 -0
  272. package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +23 -0
  273. package/src/cn/formatChineseAmount.ts +61 -0
  274. package/src/cn/index.ts +7 -1
  275. package/src/cn/parseChineseNumber.test.ts +159 -0
  276. package/src/cn/parseChineseNumber.ts +97 -0
  277. package/src/cn/pinyin/cartesianProduct.test.ts +64 -0
  278. package/src/cn/pinyin/cartesianProduct.ts +24 -0
  279. package/src/cn/pinyin/data.json +23573 -0
  280. package/src/cn/pinyin/loader.ts +12 -0
  281. package/src/cn/pinyin/preload.ts +3 -0
  282. package/src/cn/pinyin/toPinyin.test.ts +12 -0
  283. package/src/cn/pinyin/toPinyinPure.ts +43 -0
  284. package/src/cn/pinyin/transform.ts +12 -0
  285. package/src/consola/formatLogObject.test.ts +27 -0
  286. package/src/consola/formatLogObject.ts +34 -6
  287. package/src/dayjs/dayjs.ts +18 -18
  288. package/src/dayjs/index.ts +3 -1
  289. package/src/dayjs/parseRelativeTime.test.ts +185 -0
  290. package/src/dayjs/parseRelativeTime.ts +115 -0
  291. package/src/dayjs/resolveRelativeTime.test.ts +357 -0
  292. package/src/dayjs/resolveRelativeTime.ts +167 -0
  293. package/src/emittery/emitter.ts +9 -0
  294. package/src/emittery/index.ts +1 -0
  295. package/src/fs/FileSystemError.ts +26 -0
  296. package/src/fs/IFileSystem.d.ts +102 -0
  297. package/src/fs/MemoryFileSystem.test.ts +37 -0
  298. package/src/fs/createBrowserFileSystem.ts +291 -0
  299. package/src/fs/createMemoryFileSystem.ts +604 -0
  300. package/src/fs/createSandboxFileSystem.ts +136 -0
  301. package/src/fs/createWebDavFileSystem.ts +172 -0
  302. package/src/fs/findMimeType.ts +23 -0
  303. package/src/fs/index.ts +8 -0
  304. package/src/fs/orpc/FileSystemContract.ts +92 -0
  305. package/src/fs/orpc/createContractClientFileSystem.ts +115 -0
  306. package/src/fs/orpc/index.ts +2 -0
  307. package/src/fs/orpc/server/createFileSystemContractImpl.ts +64 -0
  308. package/src/fs/orpc/server/index.ts +1 -0
  309. package/src/fs/s3/createS3MiniFileSystem.ts +830 -0
  310. package/src/fs/s3/index.ts +1 -0
  311. package/src/fs/s3/s3mini.test.ts +264 -0
  312. package/src/fs/scandir.ts +75 -0
  313. package/src/fs/server/createDatabaseFileSystem.ts +668 -0
  314. package/src/fs/server/createNodeFileSystem.ts +499 -0
  315. package/src/fs/server/dbfs.test.ts +47 -0
  316. package/src/fs/server/index.ts +1 -0
  317. package/src/fs/server/loadTestDatabase.ts +131 -0
  318. package/src/fs/tests/runFileSystemTest.ts +288 -0
  319. package/src/fs/types.ts +29 -0
  320. package/src/fs/utils/getFileUrl.ts +44 -0
  321. package/src/fs/utils.ts +23 -0
  322. package/src/jsonschema/JsonSchema.ts +118 -110
  323. package/src/jsonschema/forEachJsonSchema.ts +50 -0
  324. package/src/jsonschema/index.ts +1 -0
  325. package/src/orpc/createOpenApiContractClient.ts +52 -0
  326. package/src/orpc/createRpcContractClient.ts +50 -0
  327. package/src/orpc/index.ts +2 -0
  328. package/src/orpc/resolveLinkPlugins.ts +29 -0
  329. package/src/password/PHC.ts +3 -3
  330. package/src/password/Password.test.ts +1 -1
  331. package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
  332. package/src/resource/schema/AnyResourceSchema.ts +16 -2
  333. package/src/s3/formatS3Url.test.ts +254 -0
  334. package/src/s3/formatS3Url.ts +84 -0
  335. package/src/s3/index.ts +2 -0
  336. package/src/s3/parseS3Url.test.ts +258 -0
  337. package/src/s3/parseS3Url.ts +88 -0
  338. package/src/schema/SchemaRegistry.ts +35 -33
  339. package/src/schema/formatZodError.test.ts +196 -0
  340. package/src/schema/formatZodError.ts +151 -0
  341. package/src/schema/getSchemaOptions.ts +2 -2
  342. package/src/schema/index.ts +1 -1
  343. package/src/utils/buildBaseUrl.ts +12 -0
  344. package/src/utils/buildRedactorFormSchema.ts +85 -0
  345. package/src/utils/index.ts +4 -0
  346. package/src/utils/resolveFeatureOptions.ts +14 -0
  347. package/src/cn/ChineseResidentIdNo.mod.ts +0 -7
  348. package/src/cn/DivisionCode.mod.ts +0 -7
  349. package/src/cn/UnifiedSocialCreditCode.mod.ts +0 -7
  350. package/src/cn/mod.ts +0 -3
  351. package/src/schema/SchemaRegistry.mod.ts +0 -1
@@ -0,0 +1,2 @@
1
+ export { fromQwen3VlBbox2d, toQwen3VlBbox2d } from "./utils.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ai/qwen3vl/index.ts"],"sourcesContent":["export { fromQwen3VlBbox2d, toQwen3VlBbox2d } from './utils';\n"],"names":["fromQwen3VlBbox2d","toQwen3VlBbox2d"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,eAAe,QAAQ,UAAU"}
@@ -0,0 +1,31 @@
1
+ // xyxy
2
+ /**
3
+ * Convert Qwen3V format bbox (0-1000 range) to absolute pixel coordinates
4
+ * @param dimensions Image dimensions {width, height}
5
+ * @param bbox Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
6
+ * @returns Absolute pixel coordinates [x1, y1, x2, y2]
7
+ */ export function fromQwen3VlBbox2d({ width, height }, bbox) {
8
+ const [x1, y1, x2, y2] = bbox;
9
+ return [
10
+ Math.floor(x1 / 1000 * width),
11
+ Math.floor(y1 / 1000 * height),
12
+ Math.floor(x2 / 1000 * width),
13
+ Math.floor(y2 / 1000 * height)
14
+ ];
15
+ }
16
+ /**
17
+ * Convert absolute pixel coordinates to Qwen3V format bbox (0-1000 range)
18
+ * @param dimensions Image dimensions {width, height}
19
+ * @param bbox Absolute pixel coordinates [x1, y1, x2, y2]
20
+ * @returns Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
21
+ */ export function toQwen3VlBbox2d({ width, height }, bbox) {
22
+ const [x1, y1, x2, y2] = bbox;
23
+ return [
24
+ Math.round(x1 / width * 1000),
25
+ Math.round(y1 / height * 1000),
26
+ Math.round(x2 / width * 1000),
27
+ Math.round(y2 / height * 1000)
28
+ ];
29
+ }
30
+
31
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ai/qwen3vl/utils.ts"],"sourcesContent":["// xyxy\ntype Bbox2d = [number, number, number, number];\ntype Dimensions = { width: number; height: number };\n// x_center, y_center, z_center, x_size, y_size, z_size, roll, pitch, yaw\ntype Bbox3d = [number, number, number, number, number, number, number, number, number];\n/**\n * Convert Qwen3V format bbox (0-1000 range) to absolute pixel coordinates\n * @param dimensions Image dimensions {width, height}\n * @param bbox Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000\n * @returns Absolute pixel coordinates [x1, y1, x2, y2]\n */\nexport function fromQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {\n\tconst [x1, y1, x2, y2] = bbox;\n\treturn [\n\t\tMath.floor((x1 / 1000) * width),\n\t\tMath.floor((y1 / 1000) * height),\n\t\tMath.floor((x2 / 1000) * width),\n\t\tMath.floor((y2 / 1000) * height),\n\t];\n}\n\n/**\n * Convert absolute pixel coordinates to Qwen3V format bbox (0-1000 range)\n * @param dimensions Image dimensions {width, height}\n * @param bbox Absolute pixel coordinates [x1, y1, x2, y2]\n * @returns Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000\n */\nexport function toQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {\n\tconst [x1, y1, x2, y2] = bbox;\n\treturn [\n\t\tMath.round((x1 / width) * 1000),\n\t\tMath.round((y1 / height) * 1000),\n\t\tMath.round((x2 / width) * 1000),\n\t\tMath.round((y2 / height) * 1000),\n\t];\n}\n"],"names":["fromQwen3VlBbox2d","width","height","bbox","x1","y1","x2","y2","Math","floor","toQwen3VlBbox2d","round"],"mappings":"AAAA,OAAO;AAKP;;;;;CAKC,GACD,OAAO,SAASA,kBAAkB,EAAEC,KAAK,EAAEC,MAAM,EAAc,EAAEC,IAAY;IAC5E,MAAM,CAACC,IAAIC,IAAIC,IAAIC,GAAG,GAAGJ;IACzB,OAAO;QACNK,KAAKC,KAAK,CAAC,AAACL,KAAK,OAAQH;QACzBO,KAAKC,KAAK,CAAC,AAACJ,KAAK,OAAQH;QACzBM,KAAKC,KAAK,CAAC,AAACH,KAAK,OAAQL;QACzBO,KAAKC,KAAK,CAAC,AAACF,KAAK,OAAQL;KACzB;AACF;AAEA;;;;;CAKC,GACD,OAAO,SAASQ,gBAAgB,EAAET,KAAK,EAAEC,MAAM,EAAc,EAAEC,IAAY;IAC1E,MAAM,CAACC,IAAIC,IAAIC,IAAIC,GAAG,GAAGJ;IACzB,OAAO;QACNK,KAAKG,KAAK,CAAC,AAACP,KAAKH,QAAS;QAC1BO,KAAKG,KAAK,CAAC,AAACN,KAAKH,SAAU;QAC3BM,KAAKG,KAAK,CAAC,AAACL,KAAKL,QAAS;QAC1BO,KAAKG,KAAK,CAAC,AAACJ,KAAKL,SAAU;KAC3B;AACF"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ // based on DocLayout-YOLO
3
+ export const DocLayoutElementType = Object.freeze({
4
+ Title: 'Title',
5
+ PlainText: 'PlainText',
6
+ Abandon: 'Abandon',
7
+ Figure: 'Figure',
8
+ FigureCaption: 'FigureCaption',
9
+ Table: 'Table',
10
+ TableCaption: 'TableCaption',
11
+ TableFootnote: 'TableFootnote',
12
+ IsolateFormula: 'IsolateFormula',
13
+ FormulaCaption: 'FormulaCaption'
14
+ });
15
+ export const DocLayoutElementTypeSchema = z.union([
16
+ z.literal(DocLayoutElementType.Title).describe('标题'),
17
+ z.literal(DocLayoutElementType.PlainText).describe('纯文本'),
18
+ z.literal(DocLayoutElementType.Abandon).describe('废弃'),
19
+ z.literal(DocLayoutElementType.Figure).describe('图片'),
20
+ z.literal(DocLayoutElementType.FigureCaption).describe('图片说明'),
21
+ z.literal(DocLayoutElementType.Table).describe('表格'),
22
+ z.literal(DocLayoutElementType.TableCaption).describe('表格标题'),
23
+ z.literal(DocLayoutElementType.TableFootnote).describe('表格脚注'),
24
+ z.literal(DocLayoutElementType.IsolateFormula).describe('独立公式'),
25
+ z.literal(DocLayoutElementType.FormulaCaption).describe('公式说明')
26
+ ]);
27
+
28
+ //# sourceMappingURL=DocLayoutElementTypeSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ai/vision/DocLayoutElementTypeSchema.ts"],"sourcesContent":["import { z } from 'zod';\n\n// based on DocLayout-YOLO\n\nexport const DocLayoutElementType = Object.freeze({\n\tTitle: 'Title',\n\tPlainText: 'PlainText',\n\tAbandon: 'Abandon',\n\tFigure: 'Figure',\n\tFigureCaption: 'FigureCaption',\n\tTable: 'Table',\n\tTableCaption: 'TableCaption',\n\tTableFootnote: 'TableFootnote',\n\tIsolateFormula: 'IsolateFormula',\n\tFormulaCaption: 'FormulaCaption',\n});\nexport type DocLayoutElementType = (typeof DocLayoutElementType)[keyof typeof DocLayoutElementType];\n\nexport const DocLayoutElementTypeSchema = z.union([\n\tz.literal(DocLayoutElementType.Title).describe('标题'),\n\tz.literal(DocLayoutElementType.PlainText).describe('纯文本'),\n\tz.literal(DocLayoutElementType.Abandon).describe('废弃'),\n\tz.literal(DocLayoutElementType.Figure).describe('图片'),\n\tz.literal(DocLayoutElementType.FigureCaption).describe('图片说明'),\n\tz.literal(DocLayoutElementType.Table).describe('表格'),\n\tz.literal(DocLayoutElementType.TableCaption).describe('表格标题'),\n\tz.literal(DocLayoutElementType.TableFootnote).describe('表格脚注'),\n\tz.literal(DocLayoutElementType.IsolateFormula).describe('独立公式'),\n\tz.literal(DocLayoutElementType.FormulaCaption).describe('公式说明'),\n]);\n"],"names":["z","DocLayoutElementType","Object","freeze","Title","PlainText","Abandon","Figure","FigureCaption","Table","TableCaption","TableFootnote","IsolateFormula","FormulaCaption","DocLayoutElementTypeSchema","union","literal","describe"],"mappings":"AAAA,SAASA,CAAC,QAAQ,MAAM;AAExB,0BAA0B;AAE1B,OAAO,MAAMC,uBAAuBC,OAAOC,MAAM,CAAC;IACjDC,OAAO;IACPC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,eAAe;IACfC,OAAO;IACPC,cAAc;IACdC,eAAe;IACfC,gBAAgB;IAChBC,gBAAgB;AACjB,GAAG;AAGH,OAAO,MAAMC,6BAA6Bd,EAAEe,KAAK,CAAC;IACjDf,EAAEgB,OAAO,CAACf,qBAAqBG,KAAK,EAAEa,QAAQ,CAAC;IAC/CjB,EAAEgB,OAAO,CAACf,qBAAqBI,SAAS,EAAEY,QAAQ,CAAC;IACnDjB,EAAEgB,OAAO,CAACf,qBAAqBK,OAAO,EAAEW,QAAQ,CAAC;IACjDjB,EAAEgB,OAAO,CAACf,qBAAqBM,MAAM,EAAEU,QAAQ,CAAC;IAChDjB,EAAEgB,OAAO,CAACf,qBAAqBO,aAAa,EAAES,QAAQ,CAAC;IACvDjB,EAAEgB,OAAO,CAACf,qBAAqBQ,KAAK,EAAEQ,QAAQ,CAAC;IAC/CjB,EAAEgB,OAAO,CAACf,qBAAqBS,YAAY,EAAEO,QAAQ,CAAC;IACtDjB,EAAEgB,OAAO,CAACf,qBAAqBU,aAAa,EAAEM,QAAQ,CAAC;IACvDjB,EAAEgB,OAAO,CAACf,qBAAqBW,cAAc,EAAEK,QAAQ,CAAC;IACxDjB,EAAEgB,OAAO,CAACf,qBAAqBY,cAAc,EAAEI,QAAQ,CAAC;CACxD,EAAE"}
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ export const ImageAnnotationSchema = z.looseObject({
3
+ id: z.string().optional(),
4
+ title: z.string().trim().optional().describe('标题'),
5
+ description: z.string().trim().optional().describe('描述'),
6
+ type: z.string().trim().optional().describe('类型'),
7
+ // 内容字段
8
+ text: z.string().optional().describe('文本内容'),
9
+ markdown: z.string().optional().describe('Markdown 内容'),
10
+ csv: z.string().optional().describe('CSV 内容'),
11
+ html: z.string().optional().describe('HTML 内容'),
12
+ data: z.any().optional().describe('任意数据'),
13
+ // 定位信息
14
+ field: z.string().trim().optional().describe('目标字段'),
15
+ file: z.string().trim().optional().describe('源文件'),
16
+ page: z.coerce.number().int().nonnegative().optional().describe('页码'),
17
+ // 几何/边界框信息
18
+ bbox: z.array(z.number()).optional().describe('边界框'),
19
+ xywh: z.array(z.number()).length(4, {
20
+ error: 'xywh 必须包含4个数字 [x, y, width, height]'
21
+ }).optional().describe('XYWH'),
22
+ xyxy: z.array(z.number()).length(4, {
23
+ error: 'xyxy 必须包含4个数字 [x1, y1, x2, y2]'
24
+ }).optional().describe('XYXY'),
25
+ polygon: z.array(z.number().array()).optional().describe('Polygon'),
26
+ x: z.coerce.number().optional().describe('X 坐标'),
27
+ y: z.coerce.number().optional().describe('Y 坐标'),
28
+ w: z.coerce.number().nonnegative().optional().describe('宽度'),
29
+ h: z.coerce.number().nonnegative().optional().describe('高度'),
30
+ label: z.string().trim().optional().describe('标签'),
31
+ confidence: z.coerce.number().min(0).max(1).optional().describe('置信度'),
32
+ score: z.coerce.number().optional().describe('原始分数'),
33
+ classes: z.array(z.object({
34
+ label: z.string().nonempty({
35
+ error: '分类标签不能为空'
36
+ }).describe('分类标签'),
37
+ confidence: z.coerce.number().min(0).max(1).optional().describe('分类置信度 (0-1)'),
38
+ score: z.coerce.number().optional().describe('分类原始分数')
39
+ })).optional().describe('多分类结果'),
40
+ // 元数据和标签
41
+ tags: z.array(z.string()).optional().describe('标签'),
42
+ metadata: z.record(z.string(), z.any()).optional().describe('元数据'),
43
+ attributes: z.record(z.string(), z.any()).optional().describe('属性'),
44
+ properties: z.record(z.string(), z.any()).optional().describe('属性'),
45
+ get annotations () {
46
+ return z.array(ImageAnnotationSchema).optional().describe('子注释');
47
+ }
48
+ });
49
+
50
+ //# sourceMappingURL=ImageAnnotationSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ai/vision/ImageAnnotationSchema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type ImageAnnotation = z.infer<typeof ImageAnnotationSchema>;\nexport const ImageAnnotationSchema = z.looseObject({\n\tid: z.string().optional(),\n\ttitle: z.string().trim().optional().describe('标题'),\n\tdescription: z.string().trim().optional().describe('描述'),\n\ttype: z.string().trim().optional().describe('类型'),\n\n\t// 内容字段\n\ttext: z.string().optional().describe('文本内容'),\n\tmarkdown: z.string().optional().describe('Markdown 内容'),\n\tcsv: z.string().optional().describe('CSV 内容'),\n\thtml: z.string().optional().describe('HTML 内容'),\n\tdata: z.any().optional().describe('任意数据'),\n\n\t// 定位信息\n\tfield: z.string().trim().optional().describe('目标字段'),\n\tfile: z.string().trim().optional().describe('源文件'),\n\tpage: z.coerce.number().int().nonnegative().optional().describe('页码'),\n\n\t// 几何/边界框信息\n\tbbox: z.array(z.number()).optional().describe('边界框'),\n\txywh: z\n\t\t.array(z.number())\n\t\t.length(4, { error: 'xywh 必须包含4个数字 [x, y, width, height]' })\n\t\t.optional()\n\t\t.describe('XYWH'),\n\txyxy: z.array(z.number()).length(4, { error: 'xyxy 必须包含4个数字 [x1, y1, x2, y2]' }).optional().describe('XYXY'),\n\tpolygon: z.array(z.number().array()).optional().describe('Polygon'),\n\tx: z.coerce.number().optional().describe('X 坐标'),\n\ty: z.coerce.number().optional().describe('Y 坐标'),\n\tw: z.coerce.number().nonnegative().optional().describe('宽度'),\n\th: z.coerce.number().nonnegative().optional().describe('高度'),\n\n\tlabel: z.string().trim().optional().describe('标签'),\n\tconfidence: z.coerce.number().min(0).max(1).optional().describe('置信度'),\n\tscore: z.coerce.number().optional().describe('原始分数'),\n\n\tclasses: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tlabel: z.string().nonempty({ error: '分类标签不能为空' }).describe('分类标签'),\n\t\t\t\tconfidence: z.coerce.number().min(0).max(1).optional().describe('分类置信度 (0-1)'),\n\t\t\t\tscore: z.coerce.number().optional().describe('分类原始分数'),\n\t\t\t}),\n\t\t)\n\t\t.optional()\n\t\t.describe('多分类结果'),\n\n\t// 元数据和标签\n\ttags: z.array(z.string()).optional().describe('标签'),\n\tmetadata: z.record(z.string(), z.any()).optional().describe('元数据'),\n\tattributes: z.record(z.string(), z.any()).optional().describe('属性'),\n\tproperties: z.record(z.string(), z.any()).optional().describe('属性'),\n\n\tget annotations(): z.ZodOptional<z.ZodArray<typeof ImageAnnotationSchema>> {\n\t\treturn z.array(ImageAnnotationSchema).optional().describe('子注释');\n\t},\n});\n"],"names":["z","ImageAnnotationSchema","looseObject","id","string","optional","title","trim","describe","description","type","text","markdown","csv","html","data","any","field","file","page","coerce","number","int","nonnegative","bbox","array","xywh","length","error","xyxy","polygon","x","y","w","h","label","confidence","min","max","score","classes","object","nonempty","tags","metadata","record","attributes","properties","annotations"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ImageAnnotationSchema } from "./ImageAnnotationSchema.js";
2
+ export { resolveImageAnnotation } from "./resolveImageAnnotation.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ai/vision/index.ts"],"sourcesContent":["export { ImageAnnotationSchema, type ImageAnnotation } from './ImageAnnotationSchema';\nexport { resolveImageAnnotation, type ResolvedImageAnnotation } from './resolveImageAnnotation';\n"],"names":["ImageAnnotationSchema","resolveImageAnnotation"],"mappings":"AAAA,SAASA,qBAAqB,QAA8B,0BAA0B;AACtF,SAASC,sBAAsB,QAAsC,2BAA2B"}
@@ -0,0 +1,105 @@
1
+ export { resolveImageAnnotation };
2
+ function resolveImageAnnotation(input) {
3
+ const normalize = (input, { path = [], level = 0 } = {})=>{
4
+ input.id ||= path.join('.') || 'ROOT';
5
+ input.annotations ||= [];
6
+ input.tags ||= [];
7
+ input.attributes ||= {};
8
+ input.metadata ||= {};
9
+ if (!input.csv && input.html?.includes('<table') && globalThis.DOMParser) {
10
+ const parser = new DOMParser();
11
+ const doc = parser.parseFromString(input.html, 'text/html');
12
+ const table = doc.querySelector('table');
13
+ if (table) {
14
+ const rows = Array.from(table.querySelectorAll('tr'));
15
+ input.data = rows.map((row)=>Array.from(row.querySelectorAll('td')).map((td)=>td.textContent?.trim() || ''));
16
+ }
17
+ }
18
+ input.annotations.forEach((v, i)=>normalize(v, {
19
+ path: [
20
+ ...path,
21
+ i
22
+ ],
23
+ level: level + 1
24
+ }));
25
+ resolveBBox(input);
26
+ // can get bbox from annotations
27
+ let first = input.annotations.find((v)=>v.xyxy)?.xyxy;
28
+ if (!input.xyxy && first) {
29
+ const xyxy = input.annotations.reduce((acc, v)=>{
30
+ if (!v.xyxy) return acc;
31
+ return [
32
+ Math.min(acc[0], v.xyxy[0]),
33
+ Math.min(acc[1], v.xyxy[1]),
34
+ Math.max(acc[2], v.xyxy[2]),
35
+ Math.max(acc[3], v.xyxy[3])
36
+ ];
37
+ }, first);
38
+ input.xyxy = xyxy;
39
+ input.xywh = xyxy2xywh(xyxy);
40
+ }
41
+ };
42
+ const out = input;
43
+ normalize(out);
44
+ // out.annotations.forEach((v) => norm(v));
45
+ // only merge for root node
46
+ if (!out.markdown) {
47
+ out.markdown = out.annotations.map((v)=>v.markdown).join('\n');
48
+ out.markdown ||= undefined;
49
+ }
50
+ if (!out.text) {
51
+ out.text = out.annotations.map((v)=>v.text).join('\n');
52
+ out.text ||= undefined;
53
+ }
54
+ // fallback
55
+ out.text ||= out.markdown;
56
+ out.markdown ||= out.text;
57
+ return out;
58
+ }
59
+ function xywh2xyxy(input) {
60
+ if (!input) return;
61
+ const [x, y, w, h] = input;
62
+ return [
63
+ x,
64
+ y,
65
+ x + w,
66
+ y + h
67
+ ];
68
+ }
69
+ function xyxy2xywh(input) {
70
+ if (!input) return;
71
+ const [x1, y1, x2, y2] = input;
72
+ return [
73
+ x1,
74
+ y1,
75
+ x2 - x1,
76
+ y2 - y1
77
+ ];
78
+ }
79
+ function resolveBBox(input) {
80
+ let { x, y, w, h } = input;
81
+ let isNil = (v)=>v === undefined || v === null;
82
+ if (isNil(x) && input.xywh?.length) {
83
+ [x, y, w, h] = input.xywh;
84
+ }
85
+ if (isNil(x) && input.xyxy?.length) {
86
+ [x, y, w, h] = xyxy2xywh(input.xyxy);
87
+ }
88
+ if (!isNil(x)) {
89
+ input.xywh ||= [
90
+ x,
91
+ y,
92
+ w,
93
+ h
94
+ ];
95
+ input.xyxy ||= xywh2xyxy(input.xywh);
96
+ input.x = x;
97
+ input.y = y;
98
+ input.w = w;
99
+ input.h = h;
100
+ return input;
101
+ }
102
+ return;
103
+ }
104
+
105
+ //# sourceMappingURL=resolveImageAnnotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ai/vision/resolveImageAnnotation.ts"],"sourcesContent":["import type { ImageAnnotation } from './ImageAnnotationSchema';\n\nexport { resolveImageAnnotation };\n\nexport type ResolvedImageAnnotation = Omit<ImageAnnotation, 'id' | 'annotations' | 'attributes' | 'metadata'> & {\n\tid: string;\n\tannotations: ResolvedImageAnnotation[];\n\tattributes: Record<string, any>;\n\tmetadata: Record<string, any>;\n};\n\nfunction resolveImageAnnotation(input: Partial<ImageAnnotation>): ResolvedImageAnnotation {\n\tconst normalize = (\n\t\tinput: ImageAnnotation,\n\t\t{\n\t\t\tpath = [],\n\t\t\tlevel = 0,\n\t\t}: {\n\t\t\tpath?: number[];\n\t\t\tlevel?: number;\n\t\t} = {},\n\t) => {\n\t\tinput.id ||= path.join('.') || 'ROOT';\n\t\tinput.annotations ||= [];\n\t\tinput.tags ||= [];\n\t\tinput.attributes ||= {};\n\t\tinput.metadata ||= {};\n\n\t\tif (!input.csv && input.html?.includes('<table') && globalThis.DOMParser) {\n\t\t\tconst parser = new DOMParser();\n\t\t\tconst doc = parser.parseFromString(input.html, 'text/html');\n\t\t\tconst table = doc.querySelector('table');\n\n\t\t\tif (table) {\n\t\t\t\tconst rows = Array.from(table.querySelectorAll('tr'));\n\t\t\t\tinput.data = rows.map((row) =>\n\t\t\t\t\tArray.from(row.querySelectorAll('td')).map((td) => td.textContent?.trim() || ''),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tinput.annotations.forEach((v, i) => normalize(v, { path: [...path, i], level: level + 1 }));\n\n\t\tresolveBBox(input);\n\n\t\t// can get bbox from annotations\n\t\tlet first = input.annotations.find((v) => v.xyxy)?.xyxy;\n\t\tif (!input.xyxy && first) {\n\t\t\tconst xyxy = input.annotations.reduce((acc, v) => {\n\t\t\t\tif (!v.xyxy) return acc;\n\t\t\t\treturn [\n\t\t\t\t\tMath.min(acc[0], v.xyxy[0]),\n\t\t\t\t\tMath.min(acc[1], v.xyxy[1]),\n\t\t\t\t\tMath.max(acc[2], v.xyxy[2]),\n\t\t\t\t\tMath.max(acc[3], v.xyxy[3]),\n\t\t\t\t];\n\t\t\t}, first);\n\t\t\tinput.xyxy = xyxy;\n\t\t\tinput.xywh = xyxy2xywh(xyxy);\n\t\t}\n\t};\n\n\tconst out = input as ResolvedImageAnnotation;\n\tnormalize(out);\n\t// out.annotations.forEach((v) => norm(v));\n\n\t// only merge for root node\n\n\tif (!out.markdown) {\n\t\tout.markdown = out.annotations.map((v) => v.markdown).join('\\n');\n\t\tout.markdown ||= undefined;\n\t}\n\tif (!out.text) {\n\t\tout.text = out.annotations.map((v) => v.text).join('\\n');\n\t\tout.text ||= undefined;\n\t}\n\t// fallback\n\tout.text ||= out.markdown;\n\tout.markdown ||= out.text;\n\treturn out;\n}\n\nfunction xywh2xyxy(input?: number[]) {\n\tif (!input) return;\n\tconst [x, y, w, h] = input;\n\treturn [x, y, x + w, y + h];\n}\n\nfunction xyxy2xywh(input?: number[]) {\n\tif (!input) return;\n\tconst [x1, y1, x2, y2] = input;\n\treturn [x1, y1, x2 - x1, y2 - y1];\n}\n\ntype BBoxObject = {\n\txywh: number[];\n\txyxy: number[];\n\tx: number;\n\ty: number;\n\tw: number;\n\th: number;\n};\n\nfunction resolveBBox(input: {\n\txywh?: number[];\n\txyxy?: number[];\n\tx?: number;\n\ty?: number;\n\tw?: number;\n\th?: number;\n}): BBoxObject | undefined {\n\tlet { x, y, w, h } = input as {\n\t\tx: number;\n\t\ty: number;\n\t\tw: number;\n\t\th: number;\n\t};\n\tlet isNil = (v: any) => v === undefined || v === null;\n\tif (isNil(x) && input.xywh?.length) {\n\t\t[x, y, w, h] = input.xywh;\n\t}\n\tif (isNil(x) && input.xyxy?.length) {\n\t\t[x, y, w, h] = xyxy2xywh(input.xyxy)!;\n\t}\n\tif (!isNil(x)) {\n\t\tinput.xywh ||= [x, y, w, h];\n\t\tinput.xyxy ||= xywh2xyxy(input.xywh);\n\t\tinput.x = x;\n\t\tinput.y = y;\n\t\tinput.w = w;\n\t\tinput.h = h;\n\n\t\treturn input as BBoxObject;\n\t}\n\treturn;\n}\n"],"names":["resolveImageAnnotation","input","normalize","path","level","id","join","annotations","tags","attributes","metadata","csv","html","includes","globalThis","DOMParser","parser","doc","parseFromString","table","querySelector","rows","Array","from","querySelectorAll","data","map","row","td","textContent","trim","forEach","v","i","resolveBBox","first","find","xyxy","reduce","acc","Math","min","max","xywh","xyxy2xywh","out","markdown","undefined","text","xywh2xyxy","x","y","w","h","x1","y1","x2","y2","isNil","length"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { z } from "zod/v4";
2
2
  import { SexType, SexTypeSchema } from "../foundation/schema/index.js";
3
3
  import { Mod11 } from "./Mod11.js";
4
- export var ChineseResidentIdNoRegex = RegExp("^(?<division>[1-9]\\d{5})(?<year>(18|19|20)\\d{2})(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\\d|3[01])(?<sequence>\\d{3})(?<checkDigit>[0-9Xx])$");
5
- export var ParsedChineseResidentIdNoSchema = z.object({
4
+ export const ChineseResidentIdNoRegex = /^(?<division>[1-9]\d{5})(?<year>(18|19|20)\d{2})(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\d|3[01])(?<sequence>\d{3})(?<checkDigit>[0-9Xx])$/;
5
+ export const ParsedChineseResidentIdNoSchema = z.object({
6
6
  raw: z.string().regex(ChineseResidentIdNoRegex, "\u65E0\u6548\u768418\u4F4D\u8EAB\u4EFD\u8BC1\u53F7\u7801\u683C\u5F0F").describe("\u8EAB\u4EFD\u8BC1\u53F7\u7801"),
7
7
  addressCode: z.string().length(6).describe("\u5730\u5740\u7801 "),
8
8
  birthDate: z.iso.date().describe("\u51FA\u751F\u65E5\u671F"),
@@ -13,17 +13,17 @@ export var ParsedChineseResidentIdNoSchema = z.object({
13
13
  valid: z.boolean().optional().describe("\u662F\u5426\u6709\u6548")
14
14
  }).describe("\u5C45\u6C11\u8EAB\u4EFD\u8BC1\u53F7\u7801\u89E3\u6790\u5185\u5BB9");
15
15
  export function parseChineseResidentIdNo(idNo) {
16
- var reg = ChineseResidentIdNoRegex;
17
- var match = idNo.match(reg);
16
+ const reg = ChineseResidentIdNoRegex;
17
+ const match = idNo.match(reg);
18
18
  if (!match || !match.groups) {
19
19
  return undefined;
20
20
  }
21
- var _match_groups = match.groups, division = _match_groups.division, year = _match_groups.year, month = _match_groups.month, day = _match_groups.day, sequence = _match_groups.sequence, checkDigit = _match_groups.checkDigit;
22
- var seq = parseInt(sequence, 10);
21
+ const { division, year, month, day, sequence, checkDigit } = match.groups;
22
+ let seq = parseInt(sequence, 10);
23
23
  return {
24
24
  raw: idNo,
25
25
  addressCode: division,
26
- birthDate: "".concat(year, "-").concat(month, "-").concat(day),
26
+ birthDate: `${year}-${month}-${day}`,
27
27
  sequence: seq,
28
28
  checkDigit: checkDigit.toUpperCase() === "X" ? 10 : parseInt(checkDigit),
29
29
  sex: seq % 2 === 0 ? SexType.Male : SexType.Female,
@@ -31,11 +31,18 @@ export function parseChineseResidentIdNo(idNo) {
31
31
  valid: Mod11.validate(idNo)
32
32
  };
33
33
  }
34
- export function formatChineseResidentIdNo(param) {
35
- var addressCode = param.addressCode, birthDate = param.birthDate, sequence = param.sequence, checkDigit = param.checkDigit;
36
- var date = typeof birthDate === "string" ? birthDate.replace(/-/g, "") : "".concat(birthDate.getFullYear()).concat(String(birthDate.getMonth() + 1).padStart(2, "0")).concat(String(birthDate.getDate()).padStart(2, "0"));
37
- var seq = String(sequence).padStart(3, "0");
38
- var major = "".concat(addressCode).concat(date).concat(seq);
39
- var check = typeof checkDigit === "number" ? checkDigit === 10 ? "X" : String(checkDigit) : (checkDigit === null || checkDigit === void 0 ? void 0 : checkDigit.toUpperCase()) || Mod11.compute(major);
40
- return "".concat(major).concat(check);
34
+ export function formatChineseResidentIdNo({ addressCode, birthDate, sequence, checkDigit }) {
35
+ const date = typeof birthDate === "string" ? birthDate.replace(/-/g, "") : `${birthDate.getFullYear()}${String(birthDate.getMonth() + 1).padStart(2, "0")}${String(birthDate.getDate()).padStart(2, "0")}`;
36
+ const seq = String(sequence).padStart(3, "0");
37
+ const major = `${addressCode}${date}${seq}`;
38
+ const check = typeof checkDigit === "number" ? checkDigit === 10 ? "X" : String(checkDigit) : checkDigit?.toUpperCase() || Mod11.compute(major);
39
+ return `${major}${check}`;
41
40
  }
41
+ (function (ChineseResidentIdNo) {
42
+ ChineseResidentIdNo.regex = ChineseResidentIdNoRegex;
43
+ ChineseResidentIdNo.parse = parseChineseResidentIdNo;
44
+ ChineseResidentIdNo.format = formatChineseResidentIdNo;
45
+ ChineseResidentIdNo.ResultSchema = ParsedChineseResidentIdNoSchema;
46
+ })(ChineseResidentIdNo || (ChineseResidentIdNo = {}));
47
+ export var ChineseResidentIdNo;
48
+ //# sourceMappingURL=ChineseResidentIdNo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cn/ChineseResidentIdNo.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { SexType, SexTypeSchema } from '../foundation/schema';\nimport { Mod11 } from './Mod11';\n\nexport const ChineseResidentIdNoRegex =\n\t/^(?<division>[1-9]\\d{5})(?<year>(18|19|20)\\d{2})(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\\d|3[01])(?<sequence>\\d{3})(?<checkDigit>[0-9Xx])$/;\n\nexport type ParsedChineseResidentIdNo = z.infer<typeof ParsedChineseResidentIdNoSchema>;\nexport const ParsedChineseResidentIdNoSchema = z\n\t.object({\n\t\traw: z.string().regex(ChineseResidentIdNoRegex, '无效的18位身份证号码格式').describe('身份证号码'),\n\t\taddressCode: z.string().length(6).describe('地址码 '),\n\t\tbirthDate: z.iso.date().describe('出生日期'),\n\t\tsequence: z.int().max(999).min(0).describe('顺序码'),\n\t\tcheckDigit: z.int().min(0).max(10).describe('校验码'),\n\t\tsex: SexTypeSchema.describe('性别'),\n\t\tage: z.number().optional(),\n\t\tvalid: z.boolean().optional().describe('是否有效'),\n\t})\n\t.describe('居民身份证号码解析内容');\n\nexport function parseChineseResidentIdNo(idNo: string): ParsedChineseResidentIdNo | undefined {\n\tconst reg = ChineseResidentIdNoRegex;\n\tconst match = idNo.match(reg);\n\tif (!match || !match.groups) {\n\t\treturn undefined;\n\t}\n\tconst { division, year, month, day, sequence, checkDigit } = match.groups;\n\tlet seq = parseInt(sequence, 10);\n\treturn {\n\t\traw: idNo,\n\t\taddressCode: division,\n\t\tbirthDate: `${year}-${month}-${day}`,\n\t\tsequence: seq,\n\t\tcheckDigit: checkDigit.toUpperCase() === 'X' ? 10 : parseInt(checkDigit),\n\t\tsex: seq % 2 === 0 ? SexType.Male : SexType.Female,\n\t\tage: new Date().getFullYear() - parseInt(year, 10),\n\t\tvalid: Mod11.validate(idNo),\n\t};\n}\n\nexport function formatChineseResidentIdNo({\n\taddressCode,\n\tbirthDate,\n\tsequence,\n\tcheckDigit,\n}: {\n\taddressCode: string;\n\tbirthDate: string | Date;\n\tsequence: number | string;\n\tcheckDigit?: string | number;\n}): string {\n\tconst date =\n\t\ttypeof birthDate === 'string'\n\t\t\t? birthDate.replace(/-/g, '')\n\t\t\t: `${birthDate.getFullYear()}${String(birthDate.getMonth() + 1).padStart(2, '0')}${String(birthDate.getDate()).padStart(2, '0')}`;\n\tconst seq = String(sequence).padStart(3, '0');\n\tconst major = `${addressCode}${date}${seq}`;\n\tconst check =\n\t\ttypeof checkDigit === 'number'\n\t\t\t? checkDigit === 10\n\t\t\t\t? 'X'\n\t\t\t\t: String(checkDigit)\n\t\t\t: checkDigit?.toUpperCase() || Mod11.compute(major);\n\treturn `${major}${check}`;\n}\n\nexport namespace ChineseResidentIdNo {\n\texport const regex = ChineseResidentIdNoRegex;\n\texport const parse = parseChineseResidentIdNo;\n\texport const format = formatChineseResidentIdNo;\n\texport type Result = ParsedChineseResidentIdNo;\n\texport const ResultSchema = ParsedChineseResidentIdNoSchema;\n}\n"],"names":["z","SexType","SexTypeSchema","Mod11","ChineseResidentIdNoRegex","ParsedChineseResidentIdNoSchema","object","raw","string","regex","describe","addressCode","length","birthDate","iso","date","sequence","int","max","min","checkDigit","sex","age","number","optional","valid","boolean","parseChineseResidentIdNo","idNo","reg","match","groups","undefined","division","year","month","day","seq","parseInt","toUpperCase","Male","Female","Date","getFullYear","validate","formatChineseResidentIdNo","replace","String","getMonth","padStart","getDate","major","check","compute","ChineseResidentIdNo","parse","format","ResultSchema"],"mappings":"AAAA,SAASA,CAAC,QAAQ,SAAS;AAC3B,SAASC,OAAO,EAAEC,aAAa,QAAQ,uBAAuB;AAC9D,SAASC,KAAK,QAAQ,UAAU;AAEhC,OAAO,MAAMC,2BACZ,8IAA8I;AAG/I,OAAO,MAAMC,kCAAkCL,EAC7CM,MAAM,CAAC;IACPC,KAAKP,EAAEQ,MAAM,GAAGC,KAAK,CAACL,0BAA0B,iBAAiBM,QAAQ,CAAC;IAC1EC,aAAaX,EAAEQ,MAAM,GAAGI,MAAM,CAAC,GAAGF,QAAQ,CAAC;IAC3CG,WAAWb,EAAEc,GAAG,CAACC,IAAI,GAAGL,QAAQ,CAAC;IACjCM,UAAUhB,EAAEiB,GAAG,GAAGC,GAAG,CAAC,KAAKC,GAAG,CAAC,GAAGT,QAAQ,CAAC;IAC3CU,YAAYpB,EAAEiB,GAAG,GAAGE,GAAG,CAAC,GAAGD,GAAG,CAAC,IAAIR,QAAQ,CAAC;IAC5CW,KAAKnB,cAAcQ,QAAQ,CAAC;IAC5BY,KAAKtB,EAAEuB,MAAM,GAAGC,QAAQ;IACxBC,OAAOzB,EAAE0B,OAAO,GAAGF,QAAQ,GAAGd,QAAQ,CAAC;AACxC,GACCA,QAAQ,CAAC,eAAe;AAE1B,OAAO,SAASiB,yBAAyBC,IAAY;IACpD,MAAMC,MAAMzB;IACZ,MAAM0B,QAAQF,KAAKE,KAAK,CAACD;IACzB,IAAI,CAACC,SAAS,CAACA,MAAMC,MAAM,EAAE;QAC5B,OAAOC;IACR;IACA,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,KAAK,EAAEC,GAAG,EAAEpB,QAAQ,EAAEI,UAAU,EAAE,GAAGU,MAAMC,MAAM;IACzE,IAAIM,MAAMC,SAAStB,UAAU;IAC7B,OAAO;QACNT,KAAKqB;QACLjB,aAAasB;QACbpB,WAAW,GAAGqB,KAAK,CAAC,EAAEC,MAAM,CAAC,EAAEC,KAAK;QACpCpB,UAAUqB;QACVjB,YAAYA,WAAWmB,WAAW,OAAO,MAAM,KAAKD,SAASlB;QAC7DC,KAAKgB,MAAM,MAAM,IAAIpC,QAAQuC,IAAI,GAAGvC,QAAQwC,MAAM;QAClDnB,KAAK,IAAIoB,OAAOC,WAAW,KAAKL,SAASJ,MAAM;QAC/CT,OAAOtB,MAAMyC,QAAQ,CAAChB;IACvB;AACD;AAEA,OAAO,SAASiB,0BAA0B,EACzClC,WAAW,EACXE,SAAS,EACTG,QAAQ,EACRI,UAAU,EAMV;IACA,MAAML,OACL,OAAOF,cAAc,WAClBA,UAAUiC,OAAO,CAAC,MAAM,MACxB,GAAGjC,UAAU8B,WAAW,KAAKI,OAAOlC,UAAUmC,QAAQ,KAAK,GAAGC,QAAQ,CAAC,GAAG,OAAOF,OAAOlC,UAAUqC,OAAO,IAAID,QAAQ,CAAC,GAAG,MAAM;IACnI,MAAMZ,MAAMU,OAAO/B,UAAUiC,QAAQ,CAAC,GAAG;IACzC,MAAME,QAAQ,GAAGxC,cAAcI,OAAOsB,KAAK;IAC3C,MAAMe,QACL,OAAOhC,eAAe,WACnBA,eAAe,KACd,MACA2B,OAAO3B,cACRA,YAAYmB,iBAAiBpC,MAAMkD,OAAO,CAACF;IAC/C,OAAO,GAAGA,QAAQC,OAAO;AAC1B;UAEiBE;wBACH7C,QAAQL;wBACRmD,QAAQ5B;wBACR6B,SAASX;wBAETY,eAAepD;AAC7B,GANiBiD,wBAAAA"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { ChineseResidentIdNo } from "./mod.js";
2
+ import { ChineseResidentIdNo } from "./index.js";
3
3
  describe("ChineseResidentIdNo", function () {
4
4
  it("should parse", function () {
5
5
  for (var _i = 0, _iter = [
@@ -1,5 +1,5 @@
1
- import z from 'zod/v4';
2
- export var DivisionLevel = Object.freeze({
1
+ import z from "zod/v4";
2
+ export const DivisionLevel = Object.freeze({
3
3
  __proto__: null,
4
4
  Province: 'Province',
5
5
  City: 'City',
@@ -7,14 +7,14 @@ export var DivisionLevel = Object.freeze({
7
7
  Town: 'Town',
8
8
  Village: 'Village'
9
9
  });
10
- var DivisionLevels = [
10
+ const DivisionLevels = [
11
11
  DivisionLevel.Province,
12
12
  DivisionLevel.City,
13
13
  DivisionLevel.County,
14
14
  DivisionLevel.Town,
15
15
  DivisionLevel.Village
16
16
  ];
17
- export var DivisionLevelSchema = z.union([
17
+ export const DivisionLevelSchema = z.union([
18
18
  z.literal(DivisionLevel.Province).describe('省级').meta({
19
19
  ordinal: 1
20
20
  }),
@@ -31,7 +31,7 @@ export var DivisionLevelSchema = z.union([
31
31
  ordinal: 5
32
32
  })
33
33
  ]).describe('行政区划级别');
34
- export var ParsedDivisionCodeSchema = z.object({
34
+ export const ParsedDivisionCodeSchema = z.object({
35
35
  code: z.string().describe('行政区划代码'),
36
36
  name: z.string().describe('行政区划名称'),
37
37
  level: DivisionLevelSchema,
@@ -40,8 +40,8 @@ export var ParsedDivisionCodeSchema = z.object({
40
40
  latitude: z.number().optional().describe('纬度'),
41
41
  longitude: z.number().optional().describe('经度')
42
42
  });
43
- export var DivisionCodeRegex = RegExp("^(?<province>\\d{2})(?<city>\\d{2})?(?<county>\\d{2})?(?<town>\\d{3})?(?<village>\\d{3})?$");
44
- var CodeNames = [
43
+ export const DivisionCodeRegex = /^(?<province>\d{2})(?<city>\d{2})?(?<county>\d{2})?(?<town>\d{3})?(?<village>\d{3})?$/;
44
+ const CodeNames = [
45
45
  {
46
46
  value: '11',
47
47
  name: '北京市'
@@ -180,51 +180,47 @@ var CodeNames = [
180
180
  }
181
181
  ];
182
182
  export function parseDivisionCode(code) {
183
- var match = DivisionCodeRegex.exec(code);
183
+ const match = DivisionCodeRegex.exec(code);
184
184
  if (!match) {
185
185
  return undefined;
186
186
  }
187
- var _match_groups;
188
- var _ref = (_match_groups = match.groups) !== null && _match_groups !== void 0 ? _match_groups : {}, province = _ref.province, city = _ref.city, county = _ref.county, town = _ref.town, village = _ref.village;
187
+ const { province, city, county, town, village } = match.groups ?? {};
189
188
  if (!province) {
190
189
  return undefined;
191
190
  }
192
- var codes = [
191
+ const codes = [
193
192
  province,
194
193
  city,
195
194
  county,
196
195
  town,
197
196
  village
198
197
  ].filter(Boolean);
199
- var names = [];
198
+ const names = [];
200
199
  {
201
- var name = CodeNames.find(function(cn) {
202
- return cn.value === province;
203
- });
200
+ let name = CodeNames.find((cn)=>cn.value === province);
204
201
  if (name) {
205
202
  names.push(name.name);
206
203
  }
207
204
  }
208
- var level = DivisionLevels[codes.length - 1];
205
+ let level = DivisionLevels[codes.length - 1];
209
206
  return {
210
- code: code,
207
+ code,
211
208
  name: names.join(''),
212
- level: level,
213
- codes: codes,
214
- names: names
209
+ level,
210
+ codes,
211
+ names
215
212
  };
216
213
  }
217
- export function formatDivisionCode(param) {
218
- var province = param.province, city = param.city, county = param.county, town = param.town, village = param.village, _param_codes = param.codes, codes = _param_codes === void 0 ? [] : _param_codes;
214
+ export function formatDivisionCode({ province, city, county, town, village, codes = [] }) {
219
215
  if (!codes.length) {
220
- for(var i = 0; i < [
216
+ for(let i = 0; i < [
221
217
  province,
222
218
  city,
223
219
  county,
224
220
  town,
225
221
  village
226
222
  ].length; i++){
227
- var x = [
223
+ let x = [
228
224
  province,
229
225
  city,
230
226
  county,
@@ -234,7 +230,7 @@ export function formatDivisionCode(param) {
234
230
  if (x === undefined || x === null || x === '') {
235
231
  break;
236
232
  }
237
- var size = 2;
233
+ let size = 2;
238
234
  if (i > 2) {
239
235
  size = 3;
240
236
  }
@@ -243,3 +239,12 @@ export function formatDivisionCode(param) {
243
239
  }
244
240
  return codes.join('');
245
241
  }
242
+ (function(DivisionCode) {
243
+ DivisionCode.regex = DivisionCodeRegex;
244
+ DivisionCode.parse = parseDivisionCode;
245
+ DivisionCode.format = formatDivisionCode;
246
+ DivisionCode.ResultSchema = ParsedDivisionCodeSchema;
247
+ })(DivisionCode || (DivisionCode = {}));
248
+ export var DivisionCode;
249
+
250
+ //# sourceMappingURL=DivisionCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cn/DivisionCode.ts"],"sourcesContent":["import z from 'zod/v4';\nimport type { EnumValues } from '../resource/schema';\n\nexport const DivisionLevel = Object.freeze({\n\t__proto__: null,\n\tProvince: 'Province',\n\tCity: 'City',\n\tCounty: 'County',\n\tTown: 'Town',\n\tVillage: 'Village',\n});\nconst DivisionLevels = [\n\tDivisionLevel.Province,\n\tDivisionLevel.City,\n\tDivisionLevel.County,\n\tDivisionLevel.Town, // 3\n\tDivisionLevel.Village, // 3\n];\nexport type DivisionLevel = EnumValues<typeof DivisionLevel>;\nexport const DivisionLevelSchema = z\n\t.union([\n\t\tz.literal(DivisionLevel.Province).describe('省级').meta({ ordinal: 1 }),\n\t\tz.literal(DivisionLevel.City).describe('地级').meta({ ordinal: 2 }),\n\t\tz.literal(DivisionLevel.County).describe('县级').meta({ ordinal: 3 }),\n\t\tz.literal(DivisionLevel.Town).describe('乡镇级').meta({ ordinal: 4 }),\n\t\tz.literal(DivisionLevel.Village).describe('村级').meta({ ordinal: 5 }),\n\t])\n\t.describe('行政区划级别');\n\nexport type ParsedDivisionCode = z.infer<typeof ParsedDivisionCodeSchema>;\nexport const ParsedDivisionCodeSchema = z.object({\n\tcode: z.string().describe('行政区划代码'),\n\tname: z.string().describe('行政区划名称'),\n\tlevel: DivisionLevelSchema,\n\tcodes: z.string().array(),\n\tnames: z.string().array(),\n\tlatitude: z.number().optional().describe('纬度'),\n\tlongitude: z.number().optional().describe('经度'),\n});\n\ninterface CodeName {\n\tvalue: string;\n\tname: string;\n\tchildren?: Array<CodeName>;\n}\n\nexport const DivisionCodeRegex =\n\t/^(?<province>\\d{2})(?<city>\\d{2})?(?<county>\\d{2})?(?<town>\\d{3})?(?<village>\\d{3})?$/;\n\nconst CodeNames: CodeName[] = [\n\t{ value: '11', name: '北京市' },\n\t{ value: '12', name: '天津市' },\n\t{ value: '13', name: '河北省' },\n\t{ value: '14', name: '山西省' },\n\t{ value: '15', name: '内蒙古自治区' },\n\t{ value: '21', name: '辽宁省' },\n\t{ value: '22', name: '吉林省' },\n\t{ value: '23', name: '黑龙江省' },\n\t{ value: '31', name: '上海市' },\n\t{ value: '32', name: '江苏省' },\n\t{ value: '33', name: '浙江省' },\n\t{ value: '34', name: '安徽省' },\n\t{ value: '35', name: '福建省' },\n\t{ value: '36', name: '江西省' },\n\t{ value: '37', name: '山东省' },\n\t{ value: '41', name: '河南省' },\n\t{ value: '42', name: '湖北省' },\n\t{ value: '43', name: '湖南省' },\n\t{ value: '44', name: '广东省' },\n\t{ value: '45', name: '广西壮族自治区' },\n\t{ value: '46', name: '海南省' },\n\t{ value: '50', name: '重庆市' },\n\t{ value: '51', name: '四川省' },\n\t{ value: '52', name: '贵州省' },\n\t{ value: '53', name: '云南省' },\n\t{ value: '54', name: '西藏自治区' },\n\t{ value: '61', name: '陕西省' },\n\t{ value: '62', name: '甘肃省' },\n\t{ value: '63', name: '青海省' },\n\t{ value: '64', name: '宁夏回族自治区' },\n\t{ value: '65', name: '新疆维吾尔自治区' },\n\t{ value: '71', name: '台湾省' },\n\t{ value: '81', name: '香港特别行政区' },\n\t{ value: '82', name: '澳门特别行政区' },\n\t// 9 国外\n];\n\nexport function parseDivisionCode(code: string): ParsedDivisionCode | undefined {\n\tconst match = DivisionCodeRegex.exec(code);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\tconst { province, city, county, town, village } = match.groups ?? {};\n\tif (!province) {\n\t\treturn undefined;\n\t}\n\n\tconst codes = [province, city, county, town, village].filter(Boolean);\n\tconst names: string[] = [];\n\t{\n\t\tlet name = CodeNames.find((cn) => cn.value === province);\n\t\tif (name) {\n\t\t\tnames.push(name.name);\n\t\t}\n\t}\n\tlet level: DivisionLevel = DivisionLevels[codes.length - 1];\n\treturn {\n\t\tcode,\n\t\tname: names.join(''),\n\t\tlevel,\n\t\tcodes,\n\t\tnames,\n\t};\n}\n\nexport function formatDivisionCode({\n\tprovince,\n\tcity,\n\tcounty,\n\ttown,\n\tvillage,\n\tcodes = [],\n}: {\n\tprovince?: string | number;\n\tcity?: string | number;\n\tcounty?: string | number;\n\ttown?: string | number;\n\tvillage?: string | number;\n\tcodes?: string[];\n}): string {\n\tif (!codes.length) {\n\t\tfor (let i = 0; i < [province, city, county, town, village].length; i++) {\n\t\t\tlet x = [province, city, county, town, village][i];\n\t\t\tif (x === undefined || x === null || x === '') {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet size = 2;\n\t\t\tif (i > 2) {\n\t\t\t\tsize = 3;\n\t\t\t}\n\t\t\tcodes.push(String(x).padStart(size, '0').slice(0, size));\n\t\t}\n\t}\n\n\treturn codes.join('');\n}\n\nexport namespace DivisionCode {\n\texport const regex = DivisionCodeRegex;\n\texport const parse = parseDivisionCode;\n\texport const format = formatDivisionCode;\n\texport type Result = ParsedDivisionCode;\n\texport const ResultSchema = ParsedDivisionCodeSchema;\n}\n"],"names":["z","DivisionLevel","Object","freeze","__proto__","Province","City","County","Town","Village","DivisionLevels","DivisionLevelSchema","union","literal","describe","meta","ordinal","ParsedDivisionCodeSchema","object","code","string","name","level","codes","array","names","latitude","number","optional","longitude","DivisionCodeRegex","CodeNames","value","parseDivisionCode","match","exec","undefined","province","city","county","town","village","groups","filter","Boolean","find","cn","push","length","join","formatDivisionCode","i","x","size","String","padStart","slice","DivisionCode","regex","parse","format","ResultSchema"],"mappings":"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"}
@@ -60,7 +60,7 @@ function _unsupported_iterable_to_array(o, minLen) {
60
60
  return _array_like_to_array(o, minLen);
61
61
  }
62
62
  import { describe, expect, it } from "vitest";
63
- import { DivisionCode } from "./mod.js";
63
+ import { DivisionCode } from "./index.js";
64
64
  describe("DivisionCode", function () {
65
65
  it("should parse", function () {
66
66
  for (var _i = 0, _iter = [