universal-parcel-scraper 0.0.0-stage → 0.2.0

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 (897) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +15 -0
  3. package/README.md +123 -2
  4. package/data/carrier-order.json +107 -0
  5. package/data/carrier.schema.json +415 -0
  6. package/data/catalog.json +3969 -0
  7. package/data/coverage-summary.json +17 -0
  8. package/data/detection-golden.json +5375 -0
  9. package/data/stages.json +13 -0
  10. package/dist/browser/scraper.js +9292 -0
  11. package/dist/carriers/aliexpress/adapter.d.ts +30 -0
  12. package/dist/carriers/aliexpress/adapter.js +164 -0
  13. package/dist/carriers/aliexpress/carrier.json +59 -0
  14. package/dist/carriers/aliexpress/numbers.json +36 -0
  15. package/dist/carriers/aliexpress/status.d.ts +31 -0
  16. package/dist/carriers/aliexpress/status.js +79 -0
  17. package/dist/carriers/aliexpress/statuses.json +355 -0
  18. package/dist/carriers/amazon-logistics/carrier.json +94 -0
  19. package/dist/carriers/amazon-logistics/numbers.json +307 -0
  20. package/dist/carriers/amazon-shipping/adapter.d.ts +34 -0
  21. package/dist/carriers/amazon-shipping/adapter.js +292 -0
  22. package/dist/carriers/amazon-shipping/carrier.json +96 -0
  23. package/dist/carriers/amazon-shipping/eligibility.d.ts +3 -0
  24. package/dist/carriers/amazon-shipping/eligibility.js +16 -0
  25. package/dist/carriers/amazon-shipping/numbers.json +67 -0
  26. package/dist/carriers/amazon-shipping/status.d.ts +26 -0
  27. package/dist/carriers/amazon-shipping/status.js +118 -0
  28. package/dist/carriers/amazon-shipping/statuses.json +19 -0
  29. package/dist/carriers/an-post/carrier.json +38 -0
  30. package/dist/carriers/an-post/numbers.json +33 -0
  31. package/dist/carriers/aramex/adapter.d.ts +11 -0
  32. package/dist/carriers/aramex/adapter.js +49 -0
  33. package/dist/carriers/aramex/carrier.json +62 -0
  34. package/dist/carriers/aramex/numbers.json +71 -0
  35. package/dist/carriers/aramex/parser.d.ts +5 -0
  36. package/dist/carriers/aramex/parser.js +83 -0
  37. package/dist/carriers/aramex/status.d.ts +2 -0
  38. package/dist/carriers/aramex/status.js +16 -0
  39. package/dist/carriers/aramex/statuses.json +41 -0
  40. package/dist/carriers/asendia/adapter.d.ts +82 -0
  41. package/dist/carriers/asendia/adapter.js +342 -0
  42. package/dist/carriers/asendia/carrier.json +91 -0
  43. package/dist/carriers/asendia/numbers.json +177 -0
  44. package/dist/carriers/asendia/probe.d.ts +31 -0
  45. package/dist/carriers/asendia/probe.js +355 -0
  46. package/dist/carriers/asendia/status.d.ts +41 -0
  47. package/dist/carriers/asendia/status.js +147 -0
  48. package/dist/carriers/asendia/statuses.json +877 -0
  49. package/dist/carriers/australia-post/adapter.d.ts +20 -0
  50. package/dist/carriers/australia-post/adapter.js +175 -0
  51. package/dist/carriers/australia-post/carrier.json +72 -0
  52. package/dist/carriers/australia-post/numbers.json +66 -0
  53. package/dist/carriers/australia-post/status.d.ts +2 -0
  54. package/dist/carriers/australia-post/status.js +34 -0
  55. package/dist/carriers/australia-post/statuses.json +172 -0
  56. package/dist/carriers/austrian-post/adapter.d.ts +13 -0
  57. package/dist/carriers/austrian-post/adapter.js +101 -0
  58. package/dist/carriers/austrian-post/carrier.json +58 -0
  59. package/dist/carriers/austrian-post/numbers.json +73 -0
  60. package/dist/carriers/austrian-post/status.d.ts +3 -0
  61. package/dist/carriers/austrian-post/status.js +30 -0
  62. package/dist/carriers/austrian-post/statuses.json +47 -0
  63. package/dist/carriers/blue-dart/adapter.d.ts +11 -0
  64. package/dist/carriers/blue-dart/adapter.js +34 -0
  65. package/dist/carriers/blue-dart/carrier.json +59 -0
  66. package/dist/carriers/blue-dart/numbers.json +113 -0
  67. package/dist/carriers/blue-dart/parser.d.ts +3 -0
  68. package/dist/carriers/blue-dart/parser.js +75 -0
  69. package/dist/carriers/blue-dart/status.d.ts +2 -0
  70. package/dist/carriers/blue-dart/status.js +14 -0
  71. package/dist/carriers/blue-dart/statuses.json +59 -0
  72. package/dist/carriers/bpost/adapter.d.ts +11 -0
  73. package/dist/carriers/bpost/adapter.js +46 -0
  74. package/dist/carriers/bpost/carrier.json +81 -0
  75. package/dist/carriers/bpost/numbers.json +103 -0
  76. package/dist/carriers/bpost/parser.d.ts +3 -0
  77. package/dist/carriers/bpost/parser.js +84 -0
  78. package/dist/carriers/bpost/status.d.ts +2 -0
  79. package/dist/carriers/bpost/status.js +18 -0
  80. package/dist/carriers/bpost/statuses.json +96 -0
  81. package/dist/carriers/bring-posten/adapter.d.ts +11 -0
  82. package/dist/carriers/bring-posten/adapter.js +35 -0
  83. package/dist/carriers/bring-posten/carrier.json +91 -0
  84. package/dist/carriers/bring-posten/numbers.json +33 -0
  85. package/dist/carriers/bring-posten/parser.d.ts +3 -0
  86. package/dist/carriers/bring-posten/parser.js +95 -0
  87. package/dist/carriers/bring-posten/status.d.ts +3 -0
  88. package/dist/carriers/bring-posten/status.js +23 -0
  89. package/dist/carriers/bring-posten/statuses.json +33 -0
  90. package/dist/carriers/brt/adapter.d.ts +11 -0
  91. package/dist/carriers/brt/adapter.js +36 -0
  92. package/dist/carriers/brt/carrier.json +80 -0
  93. package/dist/carriers/brt/numbers.json +91 -0
  94. package/dist/carriers/brt/parser.d.ts +3 -0
  95. package/dist/carriers/brt/parser.js +84 -0
  96. package/dist/carriers/brt/status.d.ts +2 -0
  97. package/dist/carriers/brt/status.js +14 -0
  98. package/dist/carriers/brt/statuses.json +53 -0
  99. package/dist/carriers/c-chez-vous/adapter.d.ts +31 -0
  100. package/dist/carriers/c-chez-vous/adapter.js +181 -0
  101. package/dist/carriers/c-chez-vous/carrier.json +69 -0
  102. package/dist/carriers/c-chez-vous/numbers.json +31 -0
  103. package/dist/carriers/c-chez-vous/status.d.ts +27 -0
  104. package/dist/carriers/c-chez-vous/status.js +19 -0
  105. package/dist/carriers/c-chez-vous/statuses.json +10 -0
  106. package/dist/carriers/canada-post/adapter.d.ts +40 -0
  107. package/dist/carriers/canada-post/adapter.js +78 -0
  108. package/dist/carriers/canada-post/carrier.json +77 -0
  109. package/dist/carriers/canada-post/numbers.json +81 -0
  110. package/dist/carriers/canada-post/parser.d.ts +5 -0
  111. package/dist/carriers/canada-post/parser.js +202 -0
  112. package/dist/carriers/canada-post/status.d.ts +9 -0
  113. package/dist/carriers/canada-post/status.js +67 -0
  114. package/dist/carriers/canada-post/statuses.json +171 -0
  115. package/dist/carriers/canpar/adapter.d.ts +11 -0
  116. package/dist/carriers/canpar/adapter.js +40 -0
  117. package/dist/carriers/canpar/carrier.json +74 -0
  118. package/dist/carriers/canpar/numbers.json +71 -0
  119. package/dist/carriers/canpar/parser.d.ts +3 -0
  120. package/dist/carriers/canpar/parser.js +75 -0
  121. package/dist/carriers/canpar/status.d.ts +2 -0
  122. package/dist/carriers/canpar/status.js +16 -0
  123. package/dist/carriers/canpar/statuses.json +82 -0
  124. package/dist/carriers/china-post/carrier.json +38 -0
  125. package/dist/carriers/china-post/numbers.json +59 -0
  126. package/dist/carriers/chronopost/carrier.json +84 -0
  127. package/dist/carriers/chronopost/numbers.json +110 -0
  128. package/dist/carriers/chronopost/statuses.json +47 -0
  129. package/dist/carriers/ciblex/adapter.d.ts +17 -0
  130. package/dist/carriers/ciblex/adapter.js +46 -0
  131. package/dist/carriers/ciblex/carrier.json +71 -0
  132. package/dist/carriers/ciblex/numbers.json +63 -0
  133. package/dist/carriers/ciblex/parser.d.ts +4 -0
  134. package/dist/carriers/ciblex/parser.js +100 -0
  135. package/dist/carriers/ciblex/status.d.ts +24 -0
  136. package/dist/carriers/ciblex/status.js +55 -0
  137. package/dist/carriers/ciblex/statuses.json +221 -0
  138. package/dist/carriers/colis-prive/adapter.d.ts +39 -0
  139. package/dist/carriers/colis-prive/adapter.js +0 -0
  140. package/dist/carriers/colis-prive/carrier.json +72 -0
  141. package/dist/carriers/colis-prive/numbers.json +97 -0
  142. package/dist/carriers/colis-prive/status.d.ts +30 -0
  143. package/dist/carriers/colis-prive/status.js +85 -0
  144. package/dist/carriers/colis-prive/statuses.json +39 -0
  145. package/dist/carriers/colisweb/adapter.d.ts +29 -0
  146. package/dist/carriers/colisweb/adapter.js +166 -0
  147. package/dist/carriers/colisweb/carrier.json +63 -0
  148. package/dist/carriers/colisweb/numbers.json +39 -0
  149. package/dist/carriers/colisweb/status.d.ts +32 -0
  150. package/dist/carriers/colisweb/status.js +61 -0
  151. package/dist/carriers/colisweb/statuses.json +25 -0
  152. package/dist/carriers/correios-br/adapter.d.ts +16 -0
  153. package/dist/carriers/correios-br/adapter.js +78 -0
  154. package/dist/carriers/correios-br/carrier.json +64 -0
  155. package/dist/carriers/correios-br/model/LICENSE +21 -0
  156. package/dist/carriers/correios-br/model/captcha.onnx +0 -0
  157. package/dist/carriers/correios-br/numbers.json +72 -0
  158. package/dist/carriers/correios-br/ocr-worker.mjs +53 -0
  159. package/dist/carriers/correios-br/ocr.d.ts +10 -0
  160. package/dist/carriers/correios-br/ocr.js +83 -0
  161. package/dist/carriers/correios-br/parser.d.ts +4 -0
  162. package/dist/carriers/correios-br/parser.js +79 -0
  163. package/dist/carriers/correios-br/status.d.ts +2 -0
  164. package/dist/carriers/correios-br/status.js +17 -0
  165. package/dist/carriers/correios-br/statuses.json +16 -0
  166. package/dist/carriers/correos-chile/adapter.d.ts +12 -0
  167. package/dist/carriers/correos-chile/adapter.js +85 -0
  168. package/dist/carriers/correos-chile/carrier.json +62 -0
  169. package/dist/carriers/correos-chile/numbers.json +38 -0
  170. package/dist/carriers/correos-chile/parser.d.ts +9 -0
  171. package/dist/carriers/correos-chile/parser.js +120 -0
  172. package/dist/carriers/correos-chile/status.d.ts +3 -0
  173. package/dist/carriers/correos-chile/status.js +17 -0
  174. package/dist/carriers/correos-chile/statuses.json +12 -0
  175. package/dist/carriers/correos-express/adapter.d.ts +11 -0
  176. package/dist/carriers/correos-express/adapter.js +32 -0
  177. package/dist/carriers/correos-express/carrier.json +65 -0
  178. package/dist/carriers/correos-express/numbers.json +80 -0
  179. package/dist/carriers/correos-express/parser.d.ts +3 -0
  180. package/dist/carriers/correos-express/parser.js +97 -0
  181. package/dist/carriers/correos-express/status.d.ts +2 -0
  182. package/dist/carriers/correos-express/status.js +25 -0
  183. package/dist/carriers/correos-express/statuses.json +19 -0
  184. package/dist/carriers/correos-spain/adapter.d.ts +15 -0
  185. package/dist/carriers/correos-spain/adapter.js +191 -0
  186. package/dist/carriers/correos-spain/carrier.json +92 -0
  187. package/dist/carriers/correos-spain/numbers.json +149 -0
  188. package/dist/carriers/correos-spain/status.d.ts +17 -0
  189. package/dist/carriers/correos-spain/status.js +51 -0
  190. package/dist/carriers/correos-spain/statuses.json +46 -0
  191. package/dist/carriers/ctt/adapter.d.ts +34 -0
  192. package/dist/carriers/ctt/adapter.js +320 -0
  193. package/dist/carriers/ctt/carrier.json +72 -0
  194. package/dist/carriers/ctt/numbers.json +33 -0
  195. package/dist/carriers/ctt/status.d.ts +16 -0
  196. package/dist/carriers/ctt/status.js +16 -0
  197. package/dist/carriers/ctt/statuses.json +15 -0
  198. package/dist/carriers/ctt-express/adapter.d.ts +11 -0
  199. package/dist/carriers/ctt-express/adapter.js +41 -0
  200. package/dist/carriers/ctt-express/carrier.json +64 -0
  201. package/dist/carriers/ctt-express/numbers.json +59 -0
  202. package/dist/carriers/ctt-express/parser.d.ts +3 -0
  203. package/dist/carriers/ctt-express/parser.js +107 -0
  204. package/dist/carriers/ctt-express/status.d.ts +2 -0
  205. package/dist/carriers/ctt-express/status.js +17 -0
  206. package/dist/carriers/ctt-express/statuses.json +15 -0
  207. package/dist/carriers/dachser/adapter.d.ts +25 -0
  208. package/dist/carriers/dachser/adapter.js +168 -0
  209. package/dist/carriers/dachser/carrier.json +80 -0
  210. package/dist/carriers/dachser/numbers.json +66 -0
  211. package/dist/carriers/dachser/status.d.ts +40 -0
  212. package/dist/carriers/dachser/status.js +57 -0
  213. package/dist/carriers/dachser/statuses.json +18 -0
  214. package/dist/carriers/delhivery/adapter.d.ts +11 -0
  215. package/dist/carriers/delhivery/adapter.js +36 -0
  216. package/dist/carriers/delhivery/carrier.json +50 -0
  217. package/dist/carriers/delhivery/numbers.json +108 -0
  218. package/dist/carriers/delhivery/parser.d.ts +3 -0
  219. package/dist/carriers/delhivery/parser.js +81 -0
  220. package/dist/carriers/delhivery/status.d.ts +2 -0
  221. package/dist/carriers/delhivery/status.js +11 -0
  222. package/dist/carriers/delhivery/statuses.json +11 -0
  223. package/dist/carriers/delivengo/carrier.json +56 -0
  224. package/dist/carriers/delivengo/numbers.json +31 -0
  225. package/dist/carriers/delivengo/statuses.json +5 -0
  226. package/dist/carriers/dhl/adapter.d.ts +70 -0
  227. package/dist/carriers/dhl/adapter.js +308 -0
  228. package/dist/carriers/dhl/carrier.json +98 -0
  229. package/dist/carriers/dhl/numbers.json +153 -0
  230. package/dist/carriers/dhl/status.d.ts +14 -0
  231. package/dist/carriers/dhl/status.js +45 -0
  232. package/dist/carriers/dhl/statuses.json +27 -0
  233. package/dist/carriers/dhl-ecommerce/adapter.d.ts +50 -0
  234. package/dist/carriers/dhl-ecommerce/adapter.js +179 -0
  235. package/dist/carriers/dhl-ecommerce/carrier.json +97 -0
  236. package/dist/carriers/dhl-ecommerce/numbers.json +130 -0
  237. package/dist/carriers/dhl-ecommerce/status.d.ts +13 -0
  238. package/dist/carriers/dhl-ecommerce/status.js +57 -0
  239. package/dist/carriers/dhl-ecommerce/statuses.json +23 -0
  240. package/dist/carriers/dpd/adapter.d.ts +70 -0
  241. package/dist/carriers/dpd/adapter.js +809 -0
  242. package/dist/carriers/dpd/carrier.json +111 -0
  243. package/dist/carriers/dpd/numbers.json +43 -0
  244. package/dist/carriers/dpd/status.d.ts +39 -0
  245. package/dist/carriers/dpd/status.js +93 -0
  246. package/dist/carriers/dpd/statuses.json +144 -0
  247. package/dist/carriers/dpd-fr/adapter.d.ts +42 -0
  248. package/dist/carriers/dpd-fr/adapter.js +288 -0
  249. package/dist/carriers/dpd-fr/carrier.json +83 -0
  250. package/dist/carriers/dpd-fr/numbers.json +80 -0
  251. package/dist/carriers/dpd-fr/status.d.ts +21 -0
  252. package/dist/carriers/dpd-fr/status.js +93 -0
  253. package/dist/carriers/dpd-fr/statuses.json +325 -0
  254. package/dist/carriers/dtdc/adapter.d.ts +11 -0
  255. package/dist/carriers/dtdc/adapter.js +39 -0
  256. package/dist/carriers/dtdc/carrier.json +77 -0
  257. package/dist/carriers/dtdc/numbers.json +50 -0
  258. package/dist/carriers/dtdc/parser.d.ts +3 -0
  259. package/dist/carriers/dtdc/parser.js +90 -0
  260. package/dist/carriers/dtdc/status.d.ts +2 -0
  261. package/dist/carriers/dtdc/status.js +15 -0
  262. package/dist/carriers/dtdc/statuses.json +65 -0
  263. package/dist/carriers/ecoscooting/adapter.d.ts +11 -0
  264. package/dist/carriers/ecoscooting/adapter.js +42 -0
  265. package/dist/carriers/ecoscooting/carrier.json +76 -0
  266. package/dist/carriers/ecoscooting/numbers.json +291 -0
  267. package/dist/carriers/ecoscooting/parser.d.ts +3 -0
  268. package/dist/carriers/ecoscooting/parser.js +88 -0
  269. package/dist/carriers/ecoscooting/status.d.ts +2 -0
  270. package/dist/carriers/ecoscooting/status.js +50 -0
  271. package/dist/carriers/ecoscooting/statuses.json +295 -0
  272. package/dist/carriers/ems/adapter.d.ts +14 -0
  273. package/dist/carriers/ems/adapter.js +124 -0
  274. package/dist/carriers/ems/carrier.json +61 -0
  275. package/dist/carriers/ems/numbers.json +43 -0
  276. package/dist/carriers/ems/status.d.ts +2 -0
  277. package/dist/carriers/ems/status.js +24 -0
  278. package/dist/carriers/ems/statuses.json +128 -0
  279. package/dist/carriers/estafeta/adapter.d.ts +11 -0
  280. package/dist/carriers/estafeta/adapter.js +45 -0
  281. package/dist/carriers/estafeta/carrier.json +79 -0
  282. package/dist/carriers/estafeta/numbers.json +85 -0
  283. package/dist/carriers/estafeta/parser.d.ts +11 -0
  284. package/dist/carriers/estafeta/parser.js +123 -0
  285. package/dist/carriers/estafeta/status.d.ts +3 -0
  286. package/dist/carriers/estafeta/status.js +17 -0
  287. package/dist/carriers/estafeta/statuses.json +47 -0
  288. package/dist/carriers/evri/adapter.d.ts +14 -0
  289. package/dist/carriers/evri/adapter.js +146 -0
  290. package/dist/carriers/evri/carrier.json +69 -0
  291. package/dist/carriers/evri/numbers.json +32 -0
  292. package/dist/carriers/evri/status.d.ts +2 -0
  293. package/dist/carriers/evri/status.js +24 -0
  294. package/dist/carriers/evri/statuses.json +133 -0
  295. package/dist/carriers/fedex/adapter.d.ts +32 -0
  296. package/dist/carriers/fedex/adapter.js +307 -0
  297. package/dist/carriers/fedex/carrier.json +74 -0
  298. package/dist/carriers/fedex/numbers.json +198 -0
  299. package/dist/carriers/fedex/status.d.ts +33 -0
  300. package/dist/carriers/fedex/status.js +114 -0
  301. package/dist/carriers/fedex/statuses.json +34 -0
  302. package/dist/carriers/four-px/adapter.d.ts +12 -0
  303. package/dist/carriers/four-px/adapter.js +113 -0
  304. package/dist/carriers/four-px/carrier.json +60 -0
  305. package/dist/carriers/four-px/numbers.json +32 -0
  306. package/dist/carriers/four-px/status.d.ts +2 -0
  307. package/dist/carriers/four-px/status.js +22 -0
  308. package/dist/carriers/four-px/statuses.json +141 -0
  309. package/dist/carriers/geodis/adapter.d.ts +37 -0
  310. package/dist/carriers/geodis/adapter.js +275 -0
  311. package/dist/carriers/geodis/carrier.json +75 -0
  312. package/dist/carriers/geodis/numbers.json +45 -0
  313. package/dist/carriers/geodis/status.d.ts +37 -0
  314. package/dist/carriers/geodis/status.js +105 -0
  315. package/dist/carriers/geodis/statuses.json +51 -0
  316. package/dist/carriers/gls-ch/adapter.d.ts +39 -0
  317. package/dist/carriers/gls-ch/adapter.js +405 -0
  318. package/dist/carriers/gls-ch/carrier.json +122 -0
  319. package/dist/carriers/gls-ch/numbers.json +31 -0
  320. package/dist/carriers/gls-ch/status.d.ts +19 -0
  321. package/dist/carriers/gls-ch/status.js +79 -0
  322. package/dist/carriers/gls-ch/statuses.json +31 -0
  323. package/dist/carriers/gls-de/adapter.d.ts +28 -0
  324. package/dist/carriers/gls-de/adapter.js +113 -0
  325. package/dist/carriers/gls-de/carrier.json +126 -0
  326. package/dist/carriers/gls-de/numbers.json +111 -0
  327. package/dist/carriers/gls-de/status.d.ts +10 -0
  328. package/dist/carriers/gls-de/status.js +10 -0
  329. package/dist/carriers/gls-de/statuses.json +31 -0
  330. package/dist/carriers/gls-fr/adapter.d.ts +29 -0
  331. package/dist/carriers/gls-fr/adapter.js +220 -0
  332. package/dist/carriers/gls-fr/carrier.json +107 -0
  333. package/dist/carriers/gls-fr/numbers.json +113 -0
  334. package/dist/carriers/gls-fr/status.d.ts +28 -0
  335. package/dist/carriers/gls-fr/status.js +58 -0
  336. package/dist/carriers/gls-fr/statuses.json +34 -0
  337. package/dist/carriers/gofo/adapter.d.ts +11 -0
  338. package/dist/carriers/gofo/adapter.js +41 -0
  339. package/dist/carriers/gofo/carrier.json +80 -0
  340. package/dist/carriers/gofo/numbers.json +59 -0
  341. package/dist/carriers/gofo/parser.d.ts +5 -0
  342. package/dist/carriers/gofo/parser.js +131 -0
  343. package/dist/carriers/gofo/status.d.ts +2 -0
  344. package/dist/carriers/gofo/status.js +7 -0
  345. package/dist/carriers/gofo/statuses.json +54 -0
  346. package/dist/carriers/heppner/adapter.d.ts +27 -0
  347. package/dist/carriers/heppner/adapter.js +247 -0
  348. package/dist/carriers/heppner/carrier.json +74 -0
  349. package/dist/carriers/heppner/numbers.json +39 -0
  350. package/dist/carriers/heppner/status.d.ts +28 -0
  351. package/dist/carriers/heppner/status.js +43 -0
  352. package/dist/carriers/heppner/statuses.json +69 -0
  353. package/dist/carriers/hermes/adapter.d.ts +17 -0
  354. package/dist/carriers/hermes/adapter.js +103 -0
  355. package/dist/carriers/hermes/carrier.json +58 -0
  356. package/dist/carriers/hermes/numbers.json +20 -0
  357. package/dist/carriers/hermes/status.d.ts +15 -0
  358. package/dist/carriers/hermes/status.js +61 -0
  359. package/dist/carriers/hermes/statuses.json +31 -0
  360. package/dist/carriers/hermes-de/adapter.d.ts +22 -0
  361. package/dist/carriers/hermes-de/adapter.js +168 -0
  362. package/dist/carriers/hermes-de/carrier.json +90 -0
  363. package/dist/carriers/hermes-de/numbers.json +125 -0
  364. package/dist/carriers/hermes-de/status.d.ts +24 -0
  365. package/dist/carriers/hermes-de/status.js +52 -0
  366. package/dist/carriers/hermes-de/statuses.json +277 -0
  367. package/dist/carriers/hongkong-post/carrier.json +38 -0
  368. package/dist/carriers/hongkong-post/numbers.json +32 -0
  369. package/dist/carriers/india-post/adapter.d.ts +33 -0
  370. package/dist/carriers/india-post/adapter.js +415 -0
  371. package/dist/carriers/india-post/carrier.json +74 -0
  372. package/dist/carriers/india-post/numbers.json +58 -0
  373. package/dist/carriers/india-post/status.d.ts +23 -0
  374. package/dist/carriers/india-post/status.js +99 -0
  375. package/dist/carriers/india-post/statuses.json +18 -0
  376. package/dist/carriers/inpost/adapter.d.ts +14 -0
  377. package/dist/carriers/inpost/adapter.js +143 -0
  378. package/dist/carriers/inpost/carrier.json +75 -0
  379. package/dist/carriers/inpost/numbers.json +130 -0
  380. package/dist/carriers/inpost/status.d.ts +16 -0
  381. package/dist/carriers/inpost/status.js +31 -0
  382. package/dist/carriers/inpost/statuses.json +26 -0
  383. package/dist/carriers/intl-post/carrier.json +46 -0
  384. package/dist/carriers/intl-post/numbers.json +29 -0
  385. package/dist/carriers/j-and-t/carrier.json +66 -0
  386. package/dist/carriers/j-and-t/numbers.json +90 -0
  387. package/dist/carriers/japan-post/adapter.d.ts +13 -0
  388. package/dist/carriers/japan-post/adapter.js +159 -0
  389. package/dist/carriers/japan-post/carrier.json +71 -0
  390. package/dist/carriers/japan-post/numbers.json +35 -0
  391. package/dist/carriers/japan-post/status.d.ts +2 -0
  392. package/dist/carriers/japan-post/status.js +25 -0
  393. package/dist/carriers/japan-post/statuses.json +136 -0
  394. package/dist/carriers/jd-logistics/carrier.json +37 -0
  395. package/dist/carriers/jd-logistics/numbers.json +19 -0
  396. package/dist/carriers/korea-post/adapter.d.ts +12 -0
  397. package/dist/carriers/korea-post/adapter.js +101 -0
  398. package/dist/carriers/korea-post/carrier.json +74 -0
  399. package/dist/carriers/korea-post/numbers.json +54 -0
  400. package/dist/carriers/korea-post/status.d.ts +2 -0
  401. package/dist/carriers/korea-post/status.js +19 -0
  402. package/dist/carriers/korea-post/statuses.json +103 -0
  403. package/dist/carriers/la-poste/adapter.d.ts +29 -0
  404. package/dist/carriers/la-poste/adapter.js +241 -0
  405. package/dist/carriers/la-poste/carrier.json +87 -0
  406. package/dist/carriers/la-poste/numbers.json +140 -0
  407. package/dist/carriers/la-poste/status.d.ts +30 -0
  408. package/dist/carriers/la-poste/status.js +110 -0
  409. package/dist/carriers/la-poste/statuses.json +163 -0
  410. package/dist/carriers/landmark-global/adapter.d.ts +11 -0
  411. package/dist/carriers/landmark-global/adapter.js +30 -0
  412. package/dist/carriers/landmark-global/carrier.json +64 -0
  413. package/dist/carriers/landmark-global/numbers.json +58 -0
  414. package/dist/carriers/landmark-global/parser.d.ts +3 -0
  415. package/dist/carriers/landmark-global/parser.js +78 -0
  416. package/dist/carriers/landmark-global/status.d.ts +2 -0
  417. package/dist/carriers/landmark-global/status.js +13 -0
  418. package/dist/carriers/landmark-global/statuses.json +125 -0
  419. package/dist/carriers/mondial-relay/adapter.d.ts +32 -0
  420. package/dist/carriers/mondial-relay/adapter.js +352 -0
  421. package/dist/carriers/mondial-relay/carrier.json +94 -0
  422. package/dist/carriers/mondial-relay/numbers.json +130 -0
  423. package/dist/carriers/mondial-relay/status.d.ts +31 -0
  424. package/dist/carriers/mondial-relay/status.js +98 -0
  425. package/dist/carriers/mondial-relay/statuses.json +50 -0
  426. package/dist/carriers/mrw/adapter.d.ts +13 -0
  427. package/dist/carriers/mrw/adapter.js +131 -0
  428. package/dist/carriers/mrw/carrier.json +60 -0
  429. package/dist/carriers/mrw/numbers.json +116 -0
  430. package/dist/carriers/mrw/parser.d.ts +12 -0
  431. package/dist/carriers/mrw/parser.js +149 -0
  432. package/dist/carriers/mrw/status.d.ts +2 -0
  433. package/dist/carriers/mrw/status.js +14 -0
  434. package/dist/carriers/mrw/statuses.json +13 -0
  435. package/dist/carriers/nacex/adapter.d.ts +11 -0
  436. package/dist/carriers/nacex/adapter.js +99 -0
  437. package/dist/carriers/nacex/carrier.json +78 -0
  438. package/dist/carriers/nacex/numbers.json +47 -0
  439. package/dist/carriers/nacex/parser.d.ts +4 -0
  440. package/dist/carriers/nacex/parser.js +119 -0
  441. package/dist/carriers/nacex/status.d.ts +2 -0
  442. package/dist/carriers/nacex/status.js +12 -0
  443. package/dist/carriers/nacex/statuses.json +11 -0
  444. package/dist/carriers/ninja-van/adapter.d.ts +11 -0
  445. package/dist/carriers/ninja-van/adapter.js +45 -0
  446. package/dist/carriers/ninja-van/carrier.json +79 -0
  447. package/dist/carriers/ninja-van/numbers.json +67 -0
  448. package/dist/carriers/ninja-van/parser.d.ts +5 -0
  449. package/dist/carriers/ninja-van/parser.js +95 -0
  450. package/dist/carriers/ninja-van/status.d.ts +3 -0
  451. package/dist/carriers/ninja-van/status.js +25 -0
  452. package/dist/carriers/ninja-van/statuses.json +11 -0
  453. package/dist/carriers/nz-post/adapter.d.ts +11 -0
  454. package/dist/carriers/nz-post/adapter.js +45 -0
  455. package/dist/carriers/nz-post/carrier.json +82 -0
  456. package/dist/carriers/nz-post/numbers.json +49 -0
  457. package/dist/carriers/nz-post/parser.d.ts +3 -0
  458. package/dist/carriers/nz-post/parser.js +97 -0
  459. package/dist/carriers/nz-post/status.d.ts +2 -0
  460. package/dist/carriers/nz-post/status.js +29 -0
  461. package/dist/carriers/nz-post/statuses.json +68 -0
  462. package/dist/carriers/old-dominion/carrier.json +51 -0
  463. package/dist/carriers/old-dominion/numbers.json +83 -0
  464. package/dist/carriers/ontrac/adapter.d.ts +11 -0
  465. package/dist/carriers/ontrac/adapter.js +34 -0
  466. package/dist/carriers/ontrac/carrier.json +81 -0
  467. package/dist/carriers/ontrac/numbers.json +214 -0
  468. package/dist/carriers/ontrac/parser.d.ts +3 -0
  469. package/dist/carriers/ontrac/parser.js +72 -0
  470. package/dist/carriers/ontrac/status.d.ts +2 -0
  471. package/dist/carriers/ontrac/status.js +19 -0
  472. package/dist/carriers/ontrac/statuses.json +61 -0
  473. package/dist/carriers/paack/adapter.d.ts +19 -0
  474. package/dist/carriers/paack/adapter.js +255 -0
  475. package/dist/carriers/paack/carrier.json +79 -0
  476. package/dist/carriers/paack/numbers.json +106 -0
  477. package/dist/carriers/paack/status.d.ts +26 -0
  478. package/dist/carriers/paack/status.js +82 -0
  479. package/dist/carriers/paack/statuses.json +357 -0
  480. package/dist/carriers/packeta/adapter.d.ts +15 -0
  481. package/dist/carriers/packeta/adapter.js +166 -0
  482. package/dist/carriers/packeta/carrier.json +90 -0
  483. package/dist/carriers/packeta/numbers.json +71 -0
  484. package/dist/carriers/packeta/status.d.ts +23 -0
  485. package/dist/carriers/packeta/status.js +40 -0
  486. package/dist/carriers/packeta/statuses.json +21 -0
  487. package/dist/carriers/parcelforce/carrier.json +47 -0
  488. package/dist/carriers/parcelforce/numbers.json +32 -0
  489. package/dist/carriers/planzer/adapter.d.ts +40 -0
  490. package/dist/carriers/planzer/adapter.js +148 -0
  491. package/dist/carriers/planzer/carrier.json +85 -0
  492. package/dist/carriers/planzer/numbers.json +118 -0
  493. package/dist/carriers/planzer/shared.d.ts +19 -0
  494. package/dist/carriers/planzer/shared.js +135 -0
  495. package/dist/carriers/planzer/status.d.ts +33 -0
  496. package/dist/carriers/planzer/status.js +89 -0
  497. package/dist/carriers/planzer/statuses.json +229 -0
  498. package/dist/carriers/poczta-polska/adapter.d.ts +15 -0
  499. package/dist/carriers/poczta-polska/adapter.js +65 -0
  500. package/dist/carriers/poczta-polska/carrier.json +79 -0
  501. package/dist/carriers/poczta-polska/numbers.json +130 -0
  502. package/dist/carriers/poczta-polska/parser.d.ts +3 -0
  503. package/dist/carriers/poczta-polska/parser.js +96 -0
  504. package/dist/carriers/poczta-polska/status.d.ts +2 -0
  505. package/dist/carriers/poczta-polska/status.js +21 -0
  506. package/dist/carriers/poczta-polska/statuses.json +47 -0
  507. package/dist/carriers/pos-malaysia/adapter.d.ts +18 -0
  508. package/dist/carriers/pos-malaysia/adapter.js +199 -0
  509. package/dist/carriers/pos-malaysia/carrier.json +78 -0
  510. package/dist/carriers/pos-malaysia/numbers.json +73 -0
  511. package/dist/carriers/pos-malaysia/status.d.ts +17 -0
  512. package/dist/carriers/pos-malaysia/status.js +21 -0
  513. package/dist/carriers/pos-malaysia/statuses.json +17 -0
  514. package/dist/carriers/poste-italiane/adapter.d.ts +15 -0
  515. package/dist/carriers/poste-italiane/adapter.js +211 -0
  516. package/dist/carriers/poste-italiane/carrier.json +86 -0
  517. package/dist/carriers/poste-italiane/numbers.json +117 -0
  518. package/dist/carriers/poste-italiane/status.d.ts +19 -0
  519. package/dist/carriers/poste-italiane/status.js +44 -0
  520. package/dist/carriers/poste-italiane/statuses.json +22 -0
  521. package/dist/carriers/posti/adapter.d.ts +17 -0
  522. package/dist/carriers/posti/adapter.js +195 -0
  523. package/dist/carriers/posti/carrier.json +69 -0
  524. package/dist/carriers/posti/numbers.json +52 -0
  525. package/dist/carriers/posti/status.d.ts +4 -0
  526. package/dist/carriers/posti/status.js +41 -0
  527. package/dist/carriers/posti/statuses.json +18 -0
  528. package/dist/carriers/postlogistics/adapter.d.ts +39 -0
  529. package/dist/carriers/postlogistics/adapter.js +162 -0
  530. package/dist/carriers/postlogistics/carrier.json +67 -0
  531. package/dist/carriers/postlogistics/number.d.ts +2 -0
  532. package/dist/carriers/postlogistics/number.js +7 -0
  533. package/dist/carriers/postlogistics/numbers.json +54 -0
  534. package/dist/carriers/postlogistics/status.d.ts +20 -0
  535. package/dist/carriers/postlogistics/status.js +12 -0
  536. package/dist/carriers/postlogistics/statuses.json +40 -0
  537. package/dist/carriers/postnord/adapter.d.ts +11 -0
  538. package/dist/carriers/postnord/adapter.js +76 -0
  539. package/dist/carriers/postnord/carrier.json +82 -0
  540. package/dist/carriers/postnord/numbers.json +66 -0
  541. package/dist/carriers/postnord/parser.d.ts +3 -0
  542. package/dist/carriers/postnord/parser.js +75 -0
  543. package/dist/carriers/postnord/status.d.ts +3 -0
  544. package/dist/carriers/postnord/status.js +38 -0
  545. package/dist/carriers/postnord/statuses.json +16 -0
  546. package/dist/carriers/purolator/adapter.d.ts +11 -0
  547. package/dist/carriers/purolator/adapter.js +45 -0
  548. package/dist/carriers/purolator/carrier.json +75 -0
  549. package/dist/carriers/purolator/numbers.json +146 -0
  550. package/dist/carriers/purolator/parser.d.ts +3 -0
  551. package/dist/carriers/purolator/parser.js +79 -0
  552. package/dist/carriers/purolator/status.d.ts +2 -0
  553. package/dist/carriers/purolator/status.js +17 -0
  554. package/dist/carriers/purolator/statuses.json +15 -0
  555. package/dist/carriers/quickpac/carrier.json +68 -0
  556. package/dist/carriers/quickpac/numbers.json +31 -0
  557. package/dist/carriers/quickpac/statuses.json +213 -0
  558. package/dist/carriers/relais-colis/adapter.d.ts +28 -0
  559. package/dist/carriers/relais-colis/adapter.js +242 -0
  560. package/dist/carriers/relais-colis/carrier.json +77 -0
  561. package/dist/carriers/relais-colis/numbers.json +64 -0
  562. package/dist/carriers/relais-colis/status.d.ts +26 -0
  563. package/dist/carriers/relais-colis/status.js +91 -0
  564. package/dist/carriers/relais-colis/statuses.json +341 -0
  565. package/dist/carriers/royal-mail/adapter.d.ts +32 -0
  566. package/dist/carriers/royal-mail/adapter.js +260 -0
  567. package/dist/carriers/royal-mail/carrier.json +60 -0
  568. package/dist/carriers/royal-mail/numbers.json +57 -0
  569. package/dist/carriers/royal-mail/status.d.ts +19 -0
  570. package/dist/carriers/royal-mail/status.js +80 -0
  571. package/dist/carriers/royal-mail/statuses.json +16 -0
  572. package/dist/carriers/seur/adapter.d.ts +11 -0
  573. package/dist/carriers/seur/adapter.js +35 -0
  574. package/dist/carriers/seur/carrier.json +89 -0
  575. package/dist/carriers/seur/numbers.json +80 -0
  576. package/dist/carriers/seur/parser.d.ts +3 -0
  577. package/dist/carriers/seur/parser.js +78 -0
  578. package/dist/carriers/seur/status.d.ts +2 -0
  579. package/dist/carriers/seur/status.js +14 -0
  580. package/dist/carriers/seur/statuses.json +47 -0
  581. package/dist/carriers/sf-express/adapter.d.ts +17 -0
  582. package/dist/carriers/sf-express/adapter.js +87 -0
  583. package/dist/carriers/sf-express/carrier.json +78 -0
  584. package/dist/carriers/sf-express/numbers.json +66 -0
  585. package/dist/carriers/sf-express/parser.d.ts +4 -0
  586. package/dist/carriers/sf-express/parser.js +102 -0
  587. package/dist/carriers/sf-express/status.d.ts +4 -0
  588. package/dist/carriers/sf-express/status.js +28 -0
  589. package/dist/carriers/sf-express/statuses.json +334 -0
  590. package/dist/carriers/shipup/carrier.json +28 -0
  591. package/dist/carriers/shipup/numbers.json +20 -0
  592. package/dist/carriers/singapore-post/adapter.d.ts +12 -0
  593. package/dist/carriers/singapore-post/adapter.js +106 -0
  594. package/dist/carriers/singapore-post/carrier.json +62 -0
  595. package/dist/carriers/singapore-post/numbers.json +77 -0
  596. package/dist/carriers/singapore-post/status.d.ts +2 -0
  597. package/dist/carriers/singapore-post/status.js +17 -0
  598. package/dist/carriers/singapore-post/statuses.json +101 -0
  599. package/dist/carriers/spee-dee/carrier.json +51 -0
  600. package/dist/carriers/spee-dee/numbers.json +55 -0
  601. package/dist/carriers/speedx/carrier.json +49 -0
  602. package/dist/carriers/speedx/numbers.json +112 -0
  603. package/dist/carriers/spring-gds/adapter.d.ts +35 -0
  604. package/dist/carriers/spring-gds/adapter.js +212 -0
  605. package/dist/carriers/spring-gds/carrier.json +90 -0
  606. package/dist/carriers/spring-gds/numbers.json +224 -0
  607. package/dist/carriers/spring-gds/status.d.ts +19 -0
  608. package/dist/carriers/spring-gds/status.js +28 -0
  609. package/dist/carriers/spring-gds/statuses.json +140 -0
  610. package/dist/carriers/sto/carrier.json +37 -0
  611. package/dist/carriers/sto/numbers.json +33 -0
  612. package/dist/carriers/sunyou/adapter.d.ts +18 -0
  613. package/dist/carriers/sunyou/adapter.js +156 -0
  614. package/dist/carriers/sunyou/carrier.json +64 -0
  615. package/dist/carriers/sunyou/numbers.json +44 -0
  616. package/dist/carriers/sunyou/status.d.ts +17 -0
  617. package/dist/carriers/sunyou/status.js +13 -0
  618. package/dist/carriers/sunyou/statuses.json +53 -0
  619. package/dist/carriers/swiss-post/adapter.d.ts +18 -0
  620. package/dist/carriers/swiss-post/adapter.js +282 -0
  621. package/dist/carriers/swiss-post/carrier.json +84 -0
  622. package/dist/carriers/swiss-post/numbers.json +55 -0
  623. package/dist/carriers/swiss-post/status.d.ts +27 -0
  624. package/dist/carriers/swiss-post/status.js +64 -0
  625. package/dist/carriers/swiss-post/statuses.json +33 -0
  626. package/dist/carriers/swiss-post-cargo/adapter.d.ts +19 -0
  627. package/dist/carriers/swiss-post-cargo/adapter.js +173 -0
  628. package/dist/carriers/swiss-post-cargo/carrier.json +60 -0
  629. package/dist/carriers/swiss-post-cargo/numbers.json +23 -0
  630. package/dist/carriers/swiss-post-cargo/reference.d.ts +13 -0
  631. package/dist/carriers/swiss-post-cargo/reference.js +48 -0
  632. package/dist/carriers/swiss-post-cargo/status.d.ts +13 -0
  633. package/dist/carriers/swiss-post-cargo/status.js +53 -0
  634. package/dist/carriers/swiss-post-cargo/statuses.json +19 -0
  635. package/dist/carriers/thailand-post/carrier.json +38 -0
  636. package/dist/carriers/thailand-post/numbers.json +33 -0
  637. package/dist/carriers/the-courier-guy/adapter.d.ts +11 -0
  638. package/dist/carriers/the-courier-guy/adapter.js +49 -0
  639. package/dist/carriers/the-courier-guy/carrier.json +73 -0
  640. package/dist/carriers/the-courier-guy/number.d.ts +3 -0
  641. package/dist/carriers/the-courier-guy/number.js +18 -0
  642. package/dist/carriers/the-courier-guy/numbers.json +74 -0
  643. package/dist/carriers/the-courier-guy/parser.d.ts +3 -0
  644. package/dist/carriers/the-courier-guy/parser.js +104 -0
  645. package/dist/carriers/the-courier-guy/status.d.ts +5 -0
  646. package/dist/carriers/the-courier-guy/status.js +21 -0
  647. package/dist/carriers/the-courier-guy/statuses.json +61 -0
  648. package/dist/carriers/tipsa/adapter.d.ts +12 -0
  649. package/dist/carriers/tipsa/adapter.js +52 -0
  650. package/dist/carriers/tipsa/carrier.json +92 -0
  651. package/dist/carriers/tipsa/numbers.json +100 -0
  652. package/dist/carriers/tipsa/parser.d.ts +17 -0
  653. package/dist/carriers/tipsa/parser.js +114 -0
  654. package/dist/carriers/tipsa/status.d.ts +3 -0
  655. package/dist/carriers/tipsa/status.js +25 -0
  656. package/dist/carriers/tipsa/statuses.json +12 -0
  657. package/dist/carriers/tnt/adapter.d.ts +23 -0
  658. package/dist/carriers/tnt/adapter.js +210 -0
  659. package/dist/carriers/tnt/carrier.json +66 -0
  660. package/dist/carriers/tnt/numbers.json +116 -0
  661. package/dist/carriers/tnt/status.d.ts +3 -0
  662. package/dist/carriers/tnt/status.js +35 -0
  663. package/dist/carriers/tnt/statuses.json +126 -0
  664. package/dist/carriers/ukrposhta/adapter.d.ts +13 -0
  665. package/dist/carriers/ukrposhta/adapter.js +152 -0
  666. package/dist/carriers/ukrposhta/carrier.json +62 -0
  667. package/dist/carriers/ukrposhta/numbers.json +53 -0
  668. package/dist/carriers/ukrposhta/parser.d.ts +15 -0
  669. package/dist/carriers/ukrposhta/parser.js +130 -0
  670. package/dist/carriers/ukrposhta/status.d.ts +3 -0
  671. package/dist/carriers/ukrposhta/status.js +34 -0
  672. package/dist/carriers/ukrposhta/statuses.json +208 -0
  673. package/dist/carriers/uniuni/adapter.d.ts +11 -0
  674. package/dist/carriers/uniuni/adapter.js +48 -0
  675. package/dist/carriers/uniuni/carrier.json +90 -0
  676. package/dist/carriers/uniuni/numbers.json +72 -0
  677. package/dist/carriers/uniuni/parser.d.ts +5 -0
  678. package/dist/carriers/uniuni/parser.js +114 -0
  679. package/dist/carriers/uniuni/status.d.ts +2 -0
  680. package/dist/carriers/uniuni/status.js +16 -0
  681. package/dist/carriers/uniuni/statuses.json +54 -0
  682. package/dist/carriers/unknown/carrier.json +57 -0
  683. package/dist/carriers/unknown/numbers.json +257 -0
  684. package/dist/carriers/ups/adapter.d.ts +40 -0
  685. package/dist/carriers/ups/adapter.js +473 -0
  686. package/dist/carriers/ups/carrier.json +69 -0
  687. package/dist/carriers/ups/numbers.json +134 -0
  688. package/dist/carriers/ups/status.d.ts +25 -0
  689. package/dist/carriers/ups/status.js +41 -0
  690. package/dist/carriers/ups/statuses.json +35 -0
  691. package/dist/carriers/usps/adapter.d.ts +25 -0
  692. package/dist/carriers/usps/adapter.js +261 -0
  693. package/dist/carriers/usps/carrier.json +74 -0
  694. package/dist/carriers/usps/numbers.json +286 -0
  695. package/dist/carriers/usps/status.d.ts +25 -0
  696. package/dist/carriers/usps/status.js +72 -0
  697. package/dist/carriers/usps/statuses.json +24 -0
  698. package/dist/carriers/yamato/adapter.d.ts +13 -0
  699. package/dist/carriers/yamato/adapter.js +130 -0
  700. package/dist/carriers/yamato/carrier.json +72 -0
  701. package/dist/carriers/yamato/numbers.json +57 -0
  702. package/dist/carriers/yamato/status.d.ts +2 -0
  703. package/dist/carriers/yamato/status.js +27 -0
  704. package/dist/carriers/yamato/statuses.json +159 -0
  705. package/dist/carriers/yanwen/adapter.d.ts +13 -0
  706. package/dist/carriers/yanwen/adapter.js +130 -0
  707. package/dist/carriers/yanwen/carrier.json +66 -0
  708. package/dist/carriers/yanwen/numbers.json +45 -0
  709. package/dist/carriers/yanwen/status.d.ts +2 -0
  710. package/dist/carriers/yanwen/status.js +25 -0
  711. package/dist/carriers/yanwen/statuses.json +131 -0
  712. package/dist/carriers/yto/adapter.d.ts +11 -0
  713. package/dist/carriers/yto/adapter.js +36 -0
  714. package/dist/carriers/yto/carrier.json +75 -0
  715. package/dist/carriers/yto/numbers.json +33 -0
  716. package/dist/carriers/yto/parser.d.ts +3 -0
  717. package/dist/carriers/yto/parser.js +92 -0
  718. package/dist/carriers/yto/status.d.ts +10 -0
  719. package/dist/carriers/yto/status.js +46 -0
  720. package/dist/carriers/yto/statuses.json +206 -0
  721. package/dist/carriers/yunda/adapter.d.ts +11 -0
  722. package/dist/carriers/yunda/adapter.js +68 -0
  723. package/dist/carriers/yunda/carrier.json +69 -0
  724. package/dist/carriers/yunda/challenge.d.ts +5 -0
  725. package/dist/carriers/yunda/challenge.js +68 -0
  726. package/dist/carriers/yunda/numbers.json +43 -0
  727. package/dist/carriers/yunda/parser.d.ts +4 -0
  728. package/dist/carriers/yunda/parser.js +105 -0
  729. package/dist/carriers/yunda/status.d.ts +4 -0
  730. package/dist/carriers/yunda/status.js +9 -0
  731. package/dist/carriers/yunda/statuses.json +40 -0
  732. package/dist/carriers/yunexpress/adapter.d.ts +20 -0
  733. package/dist/carriers/yunexpress/adapter.js +240 -0
  734. package/dist/carriers/yunexpress/carrier.json +69 -0
  735. package/dist/carriers/yunexpress/numbers.json +32 -0
  736. package/dist/carriers/yunexpress/status.d.ts +2 -0
  737. package/dist/carriers/yunexpress/status.js +23 -0
  738. package/dist/carriers/yunexpress/statuses.json +112 -0
  739. package/dist/carriers/zto/carrier.json +37 -0
  740. package/dist/carriers/zto/numbers.json +30 -0
  741. package/dist/cli/index.d.ts +2 -0
  742. package/dist/cli/index.js +82 -0
  743. package/dist/core/adapter/index.d.ts +90 -0
  744. package/dist/core/adapter/index.js +103 -0
  745. package/dist/core/adapter/track.d.ts +10 -0
  746. package/dist/core/adapter/track.js +20 -0
  747. package/dist/core/catalog/amazon.d.ts +5 -0
  748. package/dist/core/catalog/amazon.js +33 -0
  749. package/dist/core/catalog/definitions.d.ts +24 -0
  750. package/dist/core/catalog/definitions.js +44 -0
  751. package/dist/core/catalog/handoff.d.ts +9 -0
  752. package/dist/core/catalog/handoff.js +56 -0
  753. package/dist/core/catalog/hints.d.ts +45 -0
  754. package/dist/core/catalog/hints.js +162 -0
  755. package/dist/core/catalog/index.d.ts +38 -0
  756. package/dist/core/catalog/index.js +223 -0
  757. package/dist/core/catalog/inputs.d.ts +6 -0
  758. package/dist/core/catalog/inputs.js +89 -0
  759. package/dist/core/catalog/linkRules.d.ts +24 -0
  760. package/dist/core/catalog/linkRules.js +20 -0
  761. package/dist/core/catalog/networks.d.ts +9 -0
  762. package/dist/core/catalog/networks.js +13 -0
  763. package/dist/core/catalog/recognition.d.ts +22 -0
  764. package/dist/core/catalog/recognition.js +52 -0
  765. package/dist/core/catalog/types.d.ts +135 -0
  766. package/dist/core/catalog/types.js +1 -0
  767. package/dist/core/catalog/urls.d.ts +2 -0
  768. package/dist/core/catalog/urls.js +125 -0
  769. package/dist/core/detection/amazon.d.ts +2 -0
  770. package/dist/core/detection/amazon.js +14 -0
  771. package/dist/core/detection/candidates.d.ts +5 -0
  772. package/dist/core/detection/candidates.js +41 -0
  773. package/dist/core/detection/detect.d.ts +17 -0
  774. package/dist/core/detection/detect.js +52 -0
  775. package/dist/core/detection/gls.d.ts +16 -0
  776. package/dist/core/detection/gls.js +21 -0
  777. package/dist/core/detection/hermes.d.ts +14 -0
  778. package/dist/core/detection/hermes.js +19 -0
  779. package/dist/core/detection/index.d.ts +19 -0
  780. package/dist/core/detection/index.js +9 -0
  781. package/dist/core/detection/mondialRelay.d.ts +13 -0
  782. package/dist/core/detection/mondialRelay.js +25 -0
  783. package/dist/core/detection/normalize.d.ts +15 -0
  784. package/dist/core/detection/normalize.js +39 -0
  785. package/dist/core/detection/parse.d.ts +6 -0
  786. package/dist/core/detection/parse.js +112 -0
  787. package/dist/core/detection/s10.d.ts +4 -0
  788. package/dist/core/detection/s10.js +25 -0
  789. package/dist/core/detection/types.d.ts +22 -0
  790. package/dist/core/detection/types.js +1 -0
  791. package/dist/core/errors/hint.d.ts +7 -0
  792. package/dist/core/errors/hint.js +7 -0
  793. package/dist/core/errors/index.d.ts +98 -0
  794. package/dist/core/errors/index.js +178 -0
  795. package/dist/core/recognition/index.d.ts +24 -0
  796. package/dist/core/recognition/index.js +65 -0
  797. package/dist/core/result/index.d.ts +57 -0
  798. package/dist/core/result/index.js +114 -0
  799. package/dist/core/result/resolve.d.ts +18 -0
  800. package/dist/core/result/resolve.js +49 -0
  801. package/dist/core/runner/index.d.ts +33 -0
  802. package/dist/core/runner/index.js +109 -0
  803. package/dist/core/status/index.d.ts +22 -0
  804. package/dist/core/status/index.js +3 -0
  805. package/dist/core/status/language.d.ts +11 -0
  806. package/dist/core/status/language.js +149 -0
  807. package/dist/core/status/wording.d.ts +25 -0
  808. package/dist/core/status/wording.js +91 -0
  809. package/dist/core/telemetry/index.d.ts +62 -0
  810. package/dist/core/telemetry/index.js +55 -0
  811. package/dist/core/time/index.d.ts +84 -0
  812. package/dist/core/time/index.js +243 -0
  813. package/dist/core/time/result.d.ts +5 -0
  814. package/dist/core/time/result.js +55 -0
  815. package/dist/core/transport/boundedFetch.d.ts +26 -0
  816. package/dist/core/transport/boundedFetch.js +152 -0
  817. package/dist/core/transport/browser.d.ts +14 -0
  818. package/dist/core/transport/browser.js +113 -0
  819. package/dist/core/transport/index.d.ts +8 -0
  820. package/dist/core/transport/index.js +5 -0
  821. package/dist/core/transport/optional.d.ts +2 -0
  822. package/dist/core/transport/optional.js +17 -0
  823. package/dist/core/transport/text.d.ts +8 -0
  824. package/dist/core/transport/text.js +18 -0
  825. package/dist/core/transport/trawl.d.ts +80 -0
  826. package/dist/core/transport/trawl.js +212 -0
  827. package/dist/core/transport/upstreamHttpDiagnostics.d.ts +16 -0
  828. package/dist/core/transport/upstreamHttpDiagnostics.js +97 -0
  829. package/dist/core/types.d.ts +8 -0
  830. package/dist/core/types.js +11 -0
  831. package/dist/data/catalog.json +3969 -0
  832. package/dist/facade/index.d.ts +57 -0
  833. package/dist/facade/index.js +195 -0
  834. package/dist/generated/catalog.d.ts +2671 -0
  835. package/dist/generated/catalog.js +4090 -0
  836. package/dist/generated/recognition.d.ts +2 -0
  837. package/dist/generated/recognition.js +31 -0
  838. package/dist/generated/regionTowns.d.ts +2 -0
  839. package/dist/generated/regionTowns.js +11 -0
  840. package/dist/generated/registry.d.ts +4 -0
  841. package/dist/generated/registry.js +286 -0
  842. package/dist/index.d.ts +19 -0
  843. package/dist/index.js +18 -0
  844. package/dist/node.d.ts +11 -0
  845. package/dist/node.js +11 -0
  846. package/dist/places/countries.json +1670 -0
  847. package/dist/places/facilities.json +11 -0
  848. package/dist/places/index.d.ts +42 -0
  849. package/dist/places/index.js +307 -0
  850. package/dist/places/names.d.mts +15 -0
  851. package/dist/places/names.mjs +36 -0
  852. package/dist/places/places.tsv.br +0 -0
  853. package/dist/places/trackingLocation.d.ts +18 -0
  854. package/dist/places/trackingLocation.js +89 -0
  855. package/dist/providers/coverage.d.ts +31 -0
  856. package/dist/providers/coverage.js +70 -0
  857. package/dist/providers/coverage.json +1744 -0
  858. package/dist/providers/parcelsapp/adapter.d.ts +23 -0
  859. package/dist/providers/parcelsapp/adapter.js +391 -0
  860. package/dist/providers/parcelsapp/http.d.ts +9 -0
  861. package/dist/providers/parcelsapp/http.js +67 -0
  862. package/dist/providers/plan.d.ts +38 -0
  863. package/dist/providers/plan.js +54 -0
  864. package/dist/providers/postal-ninja/adapter.d.ts +17 -0
  865. package/dist/providers/postal-ninja/adapter.js +200 -0
  866. package/dist/providers/seventeentrack/adapter.d.ts +50 -0
  867. package/dist/providers/seventeentrack/adapter.js +165 -0
  868. package/dist/providers/seventeentrack/events.d.ts +4 -0
  869. package/dist/providers/seventeentrack/events.js +56 -0
  870. package/dist/providers/shared/capture.d.ts +46 -0
  871. package/dist/providers/shared/capture.js +92 -0
  872. package/dist/providers/shared/hints.d.ts +16 -0
  873. package/dist/providers/shared/hints.js +37 -0
  874. package/dist/providers/shared/result.d.ts +15 -0
  875. package/dist/providers/shared/result.js +161 -0
  876. package/dist/providers/shared/scans.d.ts +22 -0
  877. package/dist/providers/shared/scans.js +29 -0
  878. package/dist/providers/ship24/adapter.d.ts +17 -0
  879. package/dist/providers/ship24/adapter.js +140 -0
  880. package/dist/providers/ship24/http.d.ts +7 -0
  881. package/dist/providers/ship24/http.js +75 -0
  882. package/dist/providers/types.d.ts +1 -0
  883. package/dist/providers/types.js +1 -0
  884. package/dist/providers/universal.d.ts +66 -0
  885. package/dist/providers/universal.js +95 -0
  886. package/dist/providers/upu/adapter.d.ts +5 -0
  887. package/dist/providers/upu/adapter.js +107 -0
  888. package/dist/scripts/canary-report.d.mts +22 -0
  889. package/dist/scripts/canary-report.mjs +69 -0
  890. package/dist/scripts/carrier-canary.d.ts +50 -0
  891. package/dist/scripts/carrier-canary.js +220 -0
  892. package/dist/server/index.d.ts +20 -0
  893. package/dist/server/index.js +226 -0
  894. package/dist/server/openapi.json +487 -0
  895. package/dist/server/page.d.ts +1 -0
  896. package/dist/server/page.js +33 -0
  897. package/package.json +102 -4
@@ -0,0 +1,177 @@
1
+ {
2
+ "carrier": "asendia",
3
+ "records": [
4
+ {
5
+ "number": "AHOY1X39DP45",
6
+ "role": "shipment",
7
+ "evidence": "public_shipment_report",
8
+ "source": {
9
+ "url": "https://www.ship24.com/couriers/asendia-tracking"
10
+ },
11
+ "expect": {
12
+ "carrier": "asendia",
13
+ "confidence": "high"
14
+ },
15
+ "note": "Published Pirate Ship export number carried by Asendia USA; A1 returned its delivered history on 2026-09-22."
16
+ },
17
+ {
18
+ "number": "AS010007869US",
19
+ "role": "shipment",
20
+ "evidence": "public_shipment_report",
21
+ "source": {
22
+ "url": "https://www.ship24.com/couriers/asendia-tracking"
23
+ },
24
+ "expect": {
25
+ "carrier": "asendia",
26
+ "confidence": "high"
27
+ },
28
+ "note": "Published Asendia USA example with an invalid S10 check digit; A1 had no data for it on 2026-09-22."
29
+ },
30
+ {
31
+ "number": "AS010501721US",
32
+ "role": "shipment",
33
+ "evidence": "public_shipment_report",
34
+ "source": {
35
+ "url": "https://www.ship24.com/couriers/asendia-tracking"
36
+ },
37
+ "expect": {
38
+ "carrier": "asendia",
39
+ "confidence": "high"
40
+ },
41
+ "note": "Published Asendia USA example; Asendia USA's A1 tracking returned its delivered history on 2026-09-22."
42
+ },
43
+ {
44
+ "number": "ASE12345678",
45
+ "role": "shipment",
46
+ "evidence": "synthetic",
47
+ "derivedFrom": "official_shape",
48
+ "shapeConfirmed": "2026-09-12",
49
+ "expect": {
50
+ "carrier": "asendia",
51
+ "confidence": "high"
52
+ },
53
+ "note": "Made-up number that follows the published format."
54
+ },
55
+ {
56
+ "number": "ASHK12123456789011",
57
+ "role": "shipment",
58
+ "evidence": "official_documentation_example",
59
+ "source": {
60
+ "url": "https://a1api.asendiausa.com/swagger/index.html?urls.primaryName=Parcel+v1.0"
61
+ },
62
+ "expect": {
63
+ "carrier": "unknown",
64
+ "confidence": "none"
65
+ },
66
+ "note": "Example Asendia unique identifier (ashid) in Asendia USA's Parcel API reference, not a real shipment."
67
+ },
68
+ {
69
+ "number": "EEUS027373790JP0",
70
+ "role": "shipment",
71
+ "evidence": "public_shipment_report",
72
+ "source": {
73
+ "url": "https://www.ship24.com/couriers/asendia-tracking"
74
+ },
75
+ "expect": {
76
+ "carrier": "unknown",
77
+ "confidence": "none"
78
+ },
79
+ "note": "Published eBay International Shipping number attributed to Asendia; A1 had no data for it on 2026-09-22. On 2026-09-30 ParcelsApp filed its Asendia scans under EasyShip on local clocks, matching Ship24's instants and Swiss Post's own scan when read in each place's zone."
80
+ },
81
+ {
82
+ "number": "EEUS027988469JP0",
83
+ "role": "shipment",
84
+ "evidence": "public_shipment_report",
85
+ "source": {
86
+ "url": "https://www.ship24.com/couriers/asendia-tracking"
87
+ },
88
+ "expect": {
89
+ "carrier": "unknown",
90
+ "confidence": "none"
91
+ },
92
+ "note": "Published eBay International Shipping number carried by Asendia USA; A1 returned its delivered history on 2026-09-22."
93
+ },
94
+ {
95
+ "number": "LF079877211FR",
96
+ "role": "shipment",
97
+ "evidence": "merchant_published_example",
98
+ "source": {
99
+ "url": "https://marketplace.fnacdarty.com/s/article/Dois-je-obligatoirement-renseigner-un-num%C3%A9ro-de-suivi-tracking-pour-ma-commande?language=fr_BE"
100
+ },
101
+ "expect": {
102
+ "carrier": "la-poste",
103
+ "confidence": "high"
104
+ },
105
+ "note": "Published integration example, not a real shipment. The source attributes it to Asendia; detection selects La Poste / Colissimo."
106
+ },
107
+ {
108
+ "number": "LS232735825CH",
109
+ "role": "shipment",
110
+ "evidence": "public_shipment_report",
111
+ "source": {
112
+ "url": "https://www.trustpilot.com/reviews/6a680c8b8a48f47256b888b9",
113
+ "date": "2026-07-28"
114
+ },
115
+ "expect": {
116
+ "carrier": "swiss-post",
117
+ "confidence": "high"
118
+ },
119
+ "note": "Publicly reported Asendia USA shipment returned from Germany through Switzerland; detection selects Swiss Post. On 2026-09-30 ParcelsApp listed its Asendia USA scans in both countries at the UTC instants A1 returned."
120
+ },
121
+ {
122
+ "number": "LS244428589CH",
123
+ "role": "shipment",
124
+ "evidence": "public_shipment_report",
125
+ "source": {
126
+ "url": "https://www.trustpilot.com/reviews/6aa36fc3b355e35ecf1ef14e",
127
+ "date": "2026-09-11"
128
+ },
129
+ "expect": {
130
+ "carrier": "swiss-post",
131
+ "confidence": "high"
132
+ },
133
+ "note": "Publicly reported shipment sent from the USA through Asendia; detection selects Swiss Post. Asendia USA's A1 tracking returned its history on 2026-09-29."
134
+ },
135
+ {
136
+ "number": "UX000352872CH",
137
+ "role": "shipment",
138
+ "evidence": "official_documentation_example",
139
+ "source": {
140
+ "url": "https://a1api.asendiausa.com/swagger/index.html?urls.primaryName=Parcel+v1.0"
141
+ },
142
+ "expect": {
143
+ "carrier": "swiss-post",
144
+ "confidence": "high"
145
+ },
146
+ "note": "Example value of the trackingNumber field in Asendia USA's Parcel API reference, not a real shipment; detection selects Swiss Post for this S10 shape."
147
+ },
148
+ {
149
+ "number": "UX911572560FR",
150
+ "role": "shipment",
151
+ "evidence": "public_shipment_report",
152
+ "source": {
153
+ "url": "https://www.trustpilot.com/reviews/6a064349008e8e5d4cf776a3",
154
+ "date": "2026-05-14"
155
+ },
156
+ "expect": {
157
+ "carrier": "la-poste",
158
+ "confidence": "high"
159
+ },
160
+ "note": "Publicly reported Asendia USA shipment; detection selects La Poste / Colissimo. On 2026-09-30 ParcelsApp listed its Asendia USA scans at the UTC instants A1 returned."
161
+ },
162
+ {
163
+ "number": "LN242142606US",
164
+ "role": "quarantined",
165
+ "evidence": "open_source_example",
166
+ "source": {
167
+ "url": "https://gist.github.com/zxp/e83a4a1b7294a5ed6207"
168
+ },
169
+ "quarantine": true,
170
+ "expect": {
171
+ "carrier": "intl-post",
172
+ "confidence": "high"
173
+ },
174
+ "note": "Open-source project example, not a real shipment. The source attributes it to Asendia; detection falls back to the generic postal rule."
175
+ }
176
+ ]
177
+ }
@@ -0,0 +1,31 @@
1
+ import type { CarrierResult } from '../../core/result/index.js';
2
+ export declare function normalizeAsendiaTrackingNumber(raw: string): string;
3
+ export declare function asendiaTrackingUrl(rawTrackingNumber: string): string;
4
+ export declare function asendiaTrackingApiUrl(): string;
5
+ export declare function asendiaConfigApiUrl(): string;
6
+ export declare function asendiaEnvironmentUrl(): string;
7
+ /**
8
+ * Read the public request-checksum key the portal publishes in its own
9
+ * environment script. It is a browser-visible value, not an account secret,
10
+ * and it rotates with a frontend deployment.
11
+ */
12
+ export declare function parseAsendiaPublicHitKey(script: string): string;
13
+ export declare function asendiaHitToken(rawTrackingNumber: string, isoDate: string, publicHitKey: string): string;
14
+ export declare function parseAsendiaTrackingResponse(payload: unknown, rawTrackingNumber: string): CarrierResult;
15
+ export interface AsendiaTrackerOptions {
16
+ timeoutMs?: number;
17
+ now?: () => Date;
18
+ turnstileTokenProvider?: () => string | Promise<string>;
19
+ /** Test seam; production uses the global fetch. */
20
+ fetcher?: typeof fetch;
21
+ }
22
+ export declare class AsendiaTracker {
23
+ readonly timeoutMs: number;
24
+ readonly now: () => Date;
25
+ readonly turnstileTokenProvider: () => string | Promise<string>;
26
+ readonly fetcher?: typeof fetch;
27
+ constructor(options?: AsendiaTrackerOptions);
28
+ fetch(rawTrackingNumber: string): Promise<CarrierResult>;
29
+ private requestText;
30
+ private requestJson;
31
+ }
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Asendia global portal (track.asendia.com) protocol probe.
3
+ *
4
+ * Not on the sync path: the registered adapter (`adapter.ts`) reads Asendia
5
+ * USA's A1 platform. This module reproduces the global portal's public request
6
+ * protocol far enough to prove that its Cloudflare Turnstile gate still behaves
7
+ * the way we recorded, and it parses a response when one is obtained.
8
+ *
9
+ * Protocol provenance (inspected 2026-08-30, rechecked 2026-09-22):
10
+ * https://track.asendia.com/track
11
+ * https://track.asendia.com/_next/static/chunks/pages/track/%5B%5B...tracking_id%5D%5D-a4e56a18621e52da.js
12
+ * The official frontend loads a tenant config and a public daily checksum key,
13
+ * then POSTs to branded-parcel-search. `fe-tracking-configuration` sets
14
+ * `TRACKING.ENABLE_CAPTCHA`, and with it a fresh Cloudflare Turnstile token is
15
+ * a required body field; callers must obtain that token through an approved
16
+ * interactive browser flow and inject it into this module. The checksum hashes
17
+ * the comma-joined ids, which is the plain number for the single id sent here.
18
+ *
19
+ * Privacy: the parcel payload carries the order reference and the recipient's
20
+ * name, address and e-mail. `parseAsendiaTrackingResponse()` rebuilds every
21
+ * event from an explicit allowlist (time, harmonized wording, scanning
22
+ * location, harmonized code) and copies nothing else.
23
+ */
24
+ import { createHash } from 'node:crypto';
25
+ import { load } from 'cheerio';
26
+ import { DateTime } from 'luxon';
27
+ import { ChallengeError, NotFoundError, SchemaError } from '../../core/errors/index.js';
28
+ import { isoTime, zonedTime } from '../../core/time/index.js';
29
+ import { cleanScalar, decodeText, fetchBounded, parseJsonBytes, UpstreamHttpError, } from '../../core/transport/index.js';
30
+ import { isRecord } from '../../core/types.js';
31
+ import { classifyAsendiaStatus } from './status.js';
32
+ const TRACKING_ORIGIN = 'https://track.asendia.com';
33
+ const TRACKING_PAGE = `${TRACKING_ORIGIN}/track`;
34
+ const TRACKING_API = `${TRACKING_ORIGIN}/api/1.0/branded-url/branded-parcel-search`;
35
+ const CONFIG_API = `${TRACKING_ORIGIN}/api/1.0/branded-url/get-config-data/track.asendia.com`;
36
+ const ENVIRONMENT_SCRIPT = `${TRACKING_ORIGIN}/__env.js`;
37
+ const DEFAULT_TIMEOUT_MS = 15_000;
38
+ const MAX_RESPONSE_BYTES = 1_000_000;
39
+ const MAX_EVENTS_TO_INSPECT = 500;
40
+ const MAX_EVENTS_TO_RETURN = 100;
41
+ const ZONE = 'Europe/Zurich';
42
+ const EVENT_TIME_FORMATS = [
43
+ 'dd/MM/yyyy HH:mm:ss',
44
+ 'dd/MM/yyyy HH:mm',
45
+ 'yyyy-MM-dd HH:mm:ss',
46
+ 'yyyy-MM-dd HH:mm',
47
+ 'dd/MM/yyyy',
48
+ 'yyyy-MM-dd',
49
+ ];
50
+ /**
51
+ * Strip markup from a short provider string. Kept local rather than using
52
+ * `textFromHtml`: the portal embeds entity-encoded wording that Cheerio decodes
53
+ * fully, where the regex helper would leave numeric entities behind.
54
+ */
55
+ function plainText(value, maxLength = 500) {
56
+ const raw = cleanScalar(value, Math.max(5_000, maxLength * 10));
57
+ return raw ? cleanScalar(load(raw).text(), maxLength) : '';
58
+ }
59
+ export function normalizeAsendiaTrackingNumber(raw) {
60
+ const value = raw.toLocaleUpperCase('en-US').replace(/[\s-]/g, '');
61
+ if (!/^[A-Z0-9]{8,40}$/.test(value) || !/\d/.test(value)) {
62
+ throw new TypeError('Asendia tracking numbers must contain 8 to 40 ASCII letters and digits');
63
+ }
64
+ return value;
65
+ }
66
+ export function asendiaTrackingUrl(rawTrackingNumber) {
67
+ return `${TRACKING_PAGE}/${encodeURIComponent(normalizeAsendiaTrackingNumber(rawTrackingNumber))}`;
68
+ }
69
+ export function asendiaTrackingApiUrl() {
70
+ const url = new URL(TRACKING_API);
71
+ url.searchParams.set('sort', 'shipment_date');
72
+ return url.toString();
73
+ }
74
+ export function asendiaConfigApiUrl() {
75
+ return CONFIG_API;
76
+ }
77
+ export function asendiaEnvironmentUrl() {
78
+ return ENVIRONMENT_SCRIPT;
79
+ }
80
+ /**
81
+ * Read the public request-checksum key the portal publishes in its own
82
+ * environment script. It is a browser-visible value, not an account secret,
83
+ * and it rotates with a frontend deployment.
84
+ */
85
+ export function parseAsendiaPublicHitKey(script) {
86
+ const match = /window\.__ENV\s*=\s*(\{[^;]*\})\s*;?/.exec(script);
87
+ if (!match)
88
+ throw new SchemaError('Asendia', 'Asendia returned an invalid public environment script');
89
+ let payload;
90
+ try {
91
+ payload = JSON.parse(match[1]);
92
+ }
93
+ catch (error) {
94
+ throw new SchemaError('Asendia', 'Asendia returned an invalid public environment script', { cause: error });
95
+ }
96
+ const key = isRecord(payload) ? cleanScalar(payload.NEXT_PUBLIC_BRANDED_HIT_KEY, 128) : '';
97
+ if (!/^[a-f0-9]{64}$/i.test(key)) {
98
+ throw new SchemaError('Asendia', 'Asendia did not publish a valid request checksum key');
99
+ }
100
+ return key.toLocaleLowerCase('en-US');
101
+ }
102
+ export function asendiaHitToken(rawTrackingNumber, isoDate, publicHitKey) {
103
+ const trackingNumber = normalizeAsendiaTrackingNumber(rawTrackingNumber);
104
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(isoDate) || !DateTime.fromISO(isoDate).isValid) {
105
+ throw new TypeError('Asendia request dates must use YYYY-MM-DD');
106
+ }
107
+ if (!/^[a-f0-9]{64}$/i.test(publicHitKey)) {
108
+ throw new TypeError('Asendia request checksum keys must contain 64 hexadecimal characters');
109
+ }
110
+ return createHash('sha256')
111
+ .update(`${trackingNumber}${isoDate}${publicHitKey.toLocaleLowerCase('en-US')}`)
112
+ .digest('hex');
113
+ }
114
+ function records(value) {
115
+ return Array.isArray(value) ? value.filter(isRecord) : [];
116
+ }
117
+ function parseTenantConfig(payload) {
118
+ if (!isRecord(payload) || !isRecord(payload.data)) {
119
+ throw new SchemaError('Asendia', 'Asendia returned an invalid tracking configuration');
120
+ }
121
+ const data = payload.data;
122
+ const id = typeof data.id === 'number' || typeof data.id === 'string' ? data.id : '';
123
+ const subsidiary = cleanScalar(data.subsidiary_name, 128);
124
+ const subsidiaryId = typeof data.subsidiary === 'number' || typeof data.subsidiary === 'string'
125
+ ? data.subsidiary
126
+ : '';
127
+ const brands = records(data.brand_id)
128
+ .map((brand) => cleanScalar(brand.customer_id, 128))
129
+ .filter(Boolean);
130
+ if (id === '' || !subsidiary || subsidiaryId === '' || brands.length === 0) {
131
+ throw new SchemaError('Asendia', 'Asendia returned an incomplete tracking configuration');
132
+ }
133
+ return {
134
+ id,
135
+ subsidiary,
136
+ subsidiaryId,
137
+ brandId: brands.includes('*') ? '*' : brands,
138
+ };
139
+ }
140
+ function responseIdentifier(parcel) {
141
+ for (const value of [parcel.tracking_id, parcel.upper_tracking_id]) {
142
+ try {
143
+ return normalizeAsendiaTrackingNumber(cleanScalar(value, 64));
144
+ }
145
+ catch {
146
+ // Try the alternate provider field.
147
+ }
148
+ }
149
+ return '';
150
+ }
151
+ function selectParcel(payload, rawTrackingNumber) {
152
+ const trackingNumber = normalizeAsendiaTrackingNumber(rawTrackingNumber);
153
+ if (!isRecord(payload))
154
+ throw new SchemaError('Asendia', 'Asendia returned an invalid tracking response');
155
+ const parcels = records(payload.data);
156
+ if (parcels.length === 0)
157
+ throw new NotFoundError('Asendia');
158
+ const matches = parcels.filter((parcel) => responseIdentifier(parcel) === trackingNumber);
159
+ if (matches.length === 1)
160
+ return matches[0];
161
+ if (matches.length > 1)
162
+ throw new SchemaError('Asendia', 'Asendia returned an ambiguous shipment');
163
+ throw new SchemaError('Asendia', 'Asendia returned a different shipment');
164
+ }
165
+ /**
166
+ * Scan stamps arrive either as ISO strings (with or without an offset) or in
167
+ * one of the portal's display formats. Offset-less values are read in the
168
+ * portal's own zone rather than guessed as UTC.
169
+ */
170
+ function parseEventTime(value) {
171
+ const iso = isoTime(value, ZONE, 64);
172
+ if (iso)
173
+ return iso;
174
+ for (const format of EVENT_TIME_FORMATS) {
175
+ const parsed = zonedTime(value, format, ZONE, { maxLength: 64 });
176
+ if (parsed)
177
+ return parsed;
178
+ }
179
+ return null;
180
+ }
181
+ function safeEventCode(value) {
182
+ const code = cleanScalar(value, 32).toLocaleUpperCase('en-US');
183
+ return /^[A-Z0-9._-]{1,32}$/.test(code) ? code : '';
184
+ }
185
+ function parseEvents(parcel) {
186
+ const parsed = [];
187
+ const seen = new Set();
188
+ records(parcel.events).slice(0, MAX_EVENTS_TO_INSPECT).forEach((raw, sourceIndex) => {
189
+ const time = parseEventTime(raw.eventDateTime ?? raw.event_datetime ?? raw.datetime);
190
+ const description = plainText(raw.harmonizedEvent)
191
+ || plainText(raw.harmonized_event)
192
+ || plainText(raw.eventDesc)
193
+ || plainText(raw.description);
194
+ if (!time || !description)
195
+ return;
196
+ const location = plainText(raw.scanningLocation ?? raw.scanning_location, 200);
197
+ const code = safeEventCode(raw.harmonizedCode ?? raw.eventId ?? raw.event_id);
198
+ const identity = JSON.stringify([time.iso, location, description, code]);
199
+ if (seen.has(identity))
200
+ return;
201
+ seen.add(identity);
202
+ const classified = classifyAsendiaStatus(description);
203
+ parsed.push({
204
+ sourceIndex,
205
+ timestamp: time.timestamp,
206
+ status: classified.status,
207
+ event: {
208
+ time: time.iso,
209
+ location,
210
+ description,
211
+ stage: classified.stage,
212
+ ...(code ? { provider_code: code } : {}),
213
+ },
214
+ });
215
+ });
216
+ parsed.sort((left, right) => (right.timestamp - left.timestamp || left.sourceIndex - right.sourceIndex));
217
+ return parsed.slice(0, MAX_EVENTS_TO_RETURN);
218
+ }
219
+ function expectedDelivery(parcel) {
220
+ for (const value of [parcel.estimated_delivery_date, parcel.delivery_date]) {
221
+ const raw = cleanScalar(value, 64);
222
+ if (!raw)
223
+ continue;
224
+ let parsed = DateTime.fromISO(raw, { zone: ZONE });
225
+ if (!parsed.isValid)
226
+ parsed = DateTime.fromFormat(raw, 'dd/MM/yyyy', { zone: ZONE });
227
+ if (parsed.isValid)
228
+ return parsed.toISODate();
229
+ }
230
+ return null;
231
+ }
232
+ export function parseAsendiaTrackingResponse(payload, rawTrackingNumber) {
233
+ const parcel = selectParcel(payload, rawTrackingNumber);
234
+ const parsedEvents = parseEvents(parcel);
235
+ const events = parsedEvents.map(({ event }) => event);
236
+ const currentText = plainText(parcel.status)
237
+ || plainText(parcel.parcel_progress)
238
+ || events[0]?.description
239
+ || 'Tracking information received';
240
+ const current = classifyAsendiaStatus(currentText);
241
+ const latestKnown = parsedEvents.find((event) => event.status !== 'unknown');
242
+ const status = current.status !== 'unknown'
243
+ ? current.status
244
+ : latestKnown?.status ?? 'unknown';
245
+ return {
246
+ status,
247
+ last_status_text: events[0]?.description ?? currentText,
248
+ last_update: events[0]?.time ?? null,
249
+ expected_delivery: ['delivered', 'exception'].includes(status)
250
+ ? null
251
+ : expectedDelivery(parcel),
252
+ timezone: ZONE,
253
+ events,
254
+ };
255
+ }
256
+ function challengeToken(value) {
257
+ const token = cleanScalar(value, 4_096);
258
+ if (!/^[A-Za-z0-9._-]{20,4096}$/.test(token)) {
259
+ throw new ChallengeError('Asendia', 'Asendia requires a fresh Cloudflare Turnstile token');
260
+ }
261
+ return token;
262
+ }
263
+ function baseHeaders() {
264
+ return {
265
+ Accept: 'application/json',
266
+ 'Accept-Language': 'en',
267
+ 'Content-Type': 'application/json',
268
+ 'x-tenant-id': 'track.asendia.com',
269
+ 'X-Language': 'en',
270
+ 'X-Timezone': ZONE,
271
+ Origin: TRACKING_ORIGIN,
272
+ Referer: `${TRACKING_PAGE}/`,
273
+ 'User-Agent': 'Mozilla/5.0 (compatible; DeliveryTracker/1.0)',
274
+ };
275
+ }
276
+ export class AsendiaTracker {
277
+ timeoutMs;
278
+ now;
279
+ turnstileTokenProvider;
280
+ fetcher;
281
+ constructor(options = {}) {
282
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
283
+ this.now = options.now ?? (() => new Date());
284
+ this.fetcher = options.fetcher;
285
+ this.turnstileTokenProvider = options.turnstileTokenProvider
286
+ ?? (() => '');
287
+ if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {
288
+ throw new TypeError('Asendia timeout must be positive');
289
+ }
290
+ }
291
+ async fetch(rawTrackingNumber) {
292
+ const trackingNumber = normalizeAsendiaTrackingNumber(rawTrackingNumber);
293
+ const token = challengeToken(await this.turnstileTokenProvider());
294
+ const [environmentScript, configPayload] = await Promise.all([
295
+ this.requestText(ENVIRONMENT_SCRIPT, 'Asendia public environment'),
296
+ this.requestJson(CONFIG_API, { headers: baseHeaders() }, 'Asendia tracking configuration'),
297
+ ]);
298
+ const publicHitKey = parseAsendiaPublicHitKey(environmentScript);
299
+ const config = parseTenantConfig(configPayload);
300
+ const date = this.now().toISOString().slice(0, 10);
301
+ const hitToken = asendiaHitToken(trackingNumber, date, publicHitKey);
302
+ const payload = await this.requestJson(asendiaTrackingApiUrl(), {
303
+ method: 'POST',
304
+ headers: { ...baseHeaders(), 'X-Hit-Token': hitToken },
305
+ body: JSON.stringify({
306
+ ids: [trackingNumber],
307
+ id: config.id,
308
+ subsidiary: [config.subsidiary],
309
+ subsidiary_id: [config.subsidiaryId],
310
+ ...(config.brandId === '*' ? { brand_id: '*' } : { customer: config.brandId }),
311
+ turnstile_token: token,
312
+ }),
313
+ }, 'Asendia tracking');
314
+ const result = parseAsendiaTrackingResponse(payload, trackingNumber);
315
+ result.tracking_url = asendiaTrackingUrl(trackingNumber);
316
+ result.tracking_source = 'structured-web-response';
317
+ return result;
318
+ }
319
+ async requestText(url, provider) {
320
+ const { bytes } = await fetchBounded(url, {
321
+ headers: {
322
+ Accept: 'application/javascript,text/javascript,*/*;q=0.8',
323
+ Referer: `${TRACKING_PAGE}/`,
324
+ },
325
+ }, {
326
+ provider,
327
+ timeoutMs: this.timeoutMs,
328
+ maxBytes: MAX_RESPONSE_BYTES,
329
+ fetcher: this.fetcher,
330
+ });
331
+ return decodeText(bytes);
332
+ }
333
+ async requestJson(url, init, provider) {
334
+ const { response, bytes } = await fetchBounded(url, init, {
335
+ provider,
336
+ timeoutMs: this.timeoutMs,
337
+ maxBytes: MAX_RESPONSE_BYTES,
338
+ fetcher: this.fetcher,
339
+ allowHttpError: true,
340
+ });
341
+ const payload = bytes.byteLength > 0 ? parseJsonBytes(bytes, 'Asendia') : null;
342
+ if (response.status === 404)
343
+ throw new NotFoundError('Asendia');
344
+ if (response.status === 403 && provider === 'Asendia tracking') {
345
+ throw new ChallengeError('Asendia', 'Asendia rejected the Cloudflare Turnstile token');
346
+ }
347
+ if (response.status === 400 && isRecord(payload)
348
+ && /turnstile/i.test(cleanScalar(payload.summary, 256))) {
349
+ throw new ChallengeError('Asendia', 'Asendia rejected the Cloudflare Turnstile token');
350
+ }
351
+ if (!response.ok)
352
+ throw new UpstreamHttpError(provider, response.status);
353
+ return payload;
354
+ }
355
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Asendia event vocabularies → product stage.
3
+ *
4
+ * Two sources, two maps. `classifyAsendiaA1Event` serves the registered
5
+ * adapter (Asendia USA's A1 platform); `classifyAsendiaStatus` serves the
6
+ * global-portal probe.
7
+ *
8
+ * A1: Asendia's own scans carry numeric codes (`1`, `2`, `2.1`, …) and are
9
+ * mapped by code. Last-mile partners' scans arrive through the same list with
10
+ * the partner's codes, which differ by partner, so those are mapped by exact
11
+ * wording only where a fixture shows it. Anything else returns null and keeps
12
+ * no event stage, leaving it to the sync's shared wording rules and the
13
+ * unmapped-wording review.
14
+ *
15
+ * Global portal: Asendia's branded portal harmonizes the wording of every partner post into
16
+ * one English vocabulary (`harmonizedEvent`), which is what this map keys on;
17
+ * the numeric `harmonizedCode` is retained as the event's `provider_code` but
18
+ * is not used for mapping, because the same code has been observed with
19
+ * different harmonized wording across subsidiaries.
20
+ *
21
+ * Phrases are compared after lower-casing, stripping diacritics and collapsing
22
+ * everything that is not a letter or a digit. Order matters: return and
23
+ * failure phrases are tested before the delivery ones, so "not delivered" can
24
+ * never match the "delivered" substring. Wording the map does not recognize
25
+ * gets no carrier stage assignment beyond the transit default.
26
+ */
27
+ import type { CarrierStatus } from '../../core/result/index.js';
28
+ import type { Stage } from '../../generated/catalog.js';
29
+ export interface ClassifiedAsendiaStatus {
30
+ status: CarrierStatus;
31
+ stage: Stage;
32
+ }
33
+ /** Lower-case, unaccent and reduce harmonized wording to letters, digits and single spaces. */
34
+ export declare function comparableText(value: string): string;
35
+ export declare function classifyAsendiaStatus(description: string): ClassifiedAsendiaStatus;
36
+ /**
37
+ * The explicit mapping for one A1 event, or null when no map knows it. Codes
38
+ * are read only for Asendia's own sources: partners reuse short codes such as
39
+ * "10" or "B1" for unrelated scans.
40
+ */
41
+ export declare function classifyAsendiaA1Event(source: string, code: string, description: string): ClassifiedAsendiaStatus | null;