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,83 @@
1
+ import { load } from 'cheerio';
2
+ import { DateTime } from 'luxon';
3
+ import { IndeterminateError, NotFoundError, SchemaError } from '../../core/errors/index.js';
4
+ import { clean } from '../../core/transport/index.js';
5
+ import { classifyAramexStatus } from './status.js';
6
+ export function normalizeAramexNumber(raw) {
7
+ const number = raw.replace(/[\s.-]/g, '');
8
+ if (!/^\d{11,12}$/.test(number))
9
+ throw new TypeError('Aramex requires an eleven- or twelve-digit shipment number');
10
+ return number;
11
+ }
12
+ export function aramexDetailUrl(html, number) {
13
+ const requested = normalizeAramexNumber(number);
14
+ const $ = load(html);
15
+ const matches = $('a.shipment-card').filter((_, card) => clean($(card).find('.shipment-num h5').text(), 64) === requested);
16
+ if (!matches.length) {
17
+ if ($('.track-shipment-list h5').toArray().some(e => clean($(e).text(), 300) === 'No results found with current selection, please enter a different tracking number.')) {
18
+ throw new NotFoundError('Aramex');
19
+ }
20
+ throw new SchemaError('Aramex', 'Aramex did not return the requested shipment card');
21
+ }
22
+ if (matches.length !== 1)
23
+ throw new SchemaError('Aramex', 'Aramex returned ambiguous shipment cards');
24
+ const url = new URL(matches.attr('href') ?? '', 'https://www.aramex.com');
25
+ if (url.origin !== 'https://www.aramex.com' || url.pathname !== '/track/details' || !url.searchParams.get('q') || url.username || url.password || url.hash) {
26
+ throw new SchemaError('Aramex', 'Aramex returned an invalid detail link');
27
+ }
28
+ return url.href;
29
+ }
30
+ export function aramexDetailRedirect(location, original) {
31
+ const bound = new URL(original);
32
+ const url = new URL(location, bound);
33
+ if (url.origin !== bound.origin || !/^\/[a-z]{2}\/en\/track\/details$/.test(url.pathname)
34
+ || url.search !== bound.search || url.username || url.password || url.hash) {
35
+ throw new SchemaError('Aramex', 'Aramex returned an invalid detail redirect');
36
+ }
37
+ return url.href;
38
+ }
39
+ export function parseAramex(html, number) {
40
+ const requested = normalizeAramexNumber(number);
41
+ const $ = load(html);
42
+ const identifiers = $('.shipment-info .shipment-num h5');
43
+ if (identifiers.length !== 1 || clean(identifiers.text(), 64) !== requested)
44
+ throw new SchemaError('Aramex', 'Aramex returned a different shipment detail');
45
+ const tables = $('table.collected');
46
+ if (tables.length !== 1 || !tables.find('th.col-activity').length)
47
+ throw new SchemaError('Aramex');
48
+ const rows = tables.find('tr');
49
+ if (rows.length > 500)
50
+ throw new SchemaError('Aramex', 'Aramex returned excessive shipment history');
51
+ const events = [];
52
+ const seen = new Set();
53
+ rows.each((_, row) => {
54
+ if (!$(row).children('td').length)
55
+ return;
56
+ if ($(row).find('td.activity').length !== 1)
57
+ throw new SchemaError('Aramex', 'Aramex returned an incomplete scan row');
58
+ const description = clean($(row).find('td.activity').text(), 500);
59
+ if (!description)
60
+ throw new SchemaError('Aramex', 'Aramex returned a scan with no description');
61
+ const day = clean($(row).find('.date-time .date').text(), 32);
62
+ const clock = clean($(row).find('.date-time .time').text(), 16);
63
+ // Parsing in UTC validates the calendar digits only. The resulting wall
64
+ // time carries no offset because this cross-border portal does not give one.
65
+ const clockText = [day, clock].filter(Boolean).join(' ');
66
+ const parsed = DateTime.fromFormat(clockText, 'dd MMM yy HH:mm', { locale: 'en', zone: 'UTC' });
67
+ const local = parsed.isValid ? parsed.toISO({ includeOffset: false, suppressMilliseconds: true }) : null;
68
+ const location = [clean($(row).find('.addr .city').text(), 120), clean($(row).find('.addr .country').text(), 80)].filter(Boolean).join(', ');
69
+ const key = `${local ?? clockText}\u0000${description}\u0000${location}`;
70
+ if (seen.has(key))
71
+ return;
72
+ seen.add(key);
73
+ const mapped = classifyAramexStatus(description);
74
+ events.push({ description, ...(location ? { location } : {}), ...(local ? { local_time: local } : clockText ? { provider_time_text: clockText } : {}), ...(mapped ? { stage: mapped.stage } : {}) });
75
+ });
76
+ if (!events.length)
77
+ throw new IndeterminateError('Aramex', 'Aramex returned no shipment history');
78
+ const latest = events[0];
79
+ const mapped = classifyAramexStatus(latest.description ?? '');
80
+ return { status: mapped?.status ?? 'unknown', ...(mapped ? { current_stage: mapped.stage } : {}),
81
+ last_status_text: latest.description, last_update: null, last_update_local: latest.local_time ?? null,
82
+ expected_delivery: null, events: events.slice(0, 100) };
83
+ }
@@ -0,0 +1,2 @@
1
+ import type { ClassifiedStatus } from '../../core/status/index.js';
2
+ export declare function classifyAramexStatus(value: string): ClassifiedStatus | undefined;
@@ -0,0 +1,16 @@
1
+ const wording = {
2
+ 'The shipment has been delivered': { status: 'delivered', stage: 'delivered' },
3
+ "An Aramex Delivery Champion has the shipment and is expected to reach the customer's doorstep shortly": { status: 'out_for_delivery', stage: 'out_for_delivery' },
4
+ "We've attempted to deliver the shipment, but the customer was not available at the time. Not to worry, the delivery has been rescheduled": { status: 'exception', stage: 'failed_attempt' },
5
+ 'Updated delivery address required from customer': { status: 'exception', stage: 'exception' },
6
+ 'The shipment is currently going through customs inspection': { status: 'in_transit', stage: 'customs' },
7
+ 'The shipment is on its way to our Aramex facility': { status: 'in_transit', stage: 'in_transit' },
8
+ 'The shipment has arrived at the Aramex office at the destination and is being prepared for customer pickup/delivery': { status: 'in_transit', stage: 'in_transit' },
9
+ 'The shipment has left the Aramex transit office and is now on its way to the final destination country': { status: 'in_transit', stage: 'in_transit' },
10
+ 'The shipment has reached Aramex transit office and is on its way to the final destination office': { status: 'in_transit', stage: 'in_transit' },
11
+ 'The shipment is being processed and on its way to the next destination': { status: 'in_transit', stage: 'in_transit' },
12
+ 'Shipment collected from the shipper': { status: 'in_transit', stage: 'accepted' },
13
+ };
14
+ export function classifyAramexStatus(value) {
15
+ return wording[value];
16
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "carrier": "aramex",
3
+ "entries": [
4
+ {
5
+ "wording": "The shipment has been delivered",
6
+ "language": "en",
7
+ "stage": "delivered",
8
+ "confirmedBy": "live"
9
+ },
10
+ {
11
+ "wording": "An Aramex Delivery Champion has the shipment and is expected to reach the customer's doorstep shortly",
12
+ "language": "en",
13
+ "stage": "out_for_delivery",
14
+ "confirmedBy": "live"
15
+ },
16
+ {
17
+ "wording": "Updated delivery address required from customer",
18
+ "language": "en",
19
+ "stage": "exception",
20
+ "confirmedBy": "live"
21
+ },
22
+ {
23
+ "wording": "The shipment is currently going through customs inspection",
24
+ "language": "en",
25
+ "stage": "customs",
26
+ "confirmedBy": "live"
27
+ },
28
+ {
29
+ "wording": "The shipment is on its way to our Aramex facility",
30
+ "language": "en",
31
+ "stage": "in_transit",
32
+ "confirmedBy": "live"
33
+ },
34
+ {
35
+ "wording": "Shipment collected from the shipper",
36
+ "language": "en",
37
+ "stage": "accepted",
38
+ "confirmedBy": "live"
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Asendia tracking through Asendia USA's A1 platform.
3
+ *
4
+ * Protocol provenance (inspected 2026-09-22):
5
+ * - The official public page https://a1.asendiausa.com/tracking/ (the same
6
+ * static app is served at https://a1.asendia.com/tracking/) loads
7
+ * `js/main.js`, which carries the page's public client configuration: the
8
+ * API base URL, a shared Basic authorization value, an `X-AsendiaOne-ApiKey`
9
+ * and the default branded tracking key. Every anonymous visitor receives the
10
+ * same values. They are read from that script at run time, never pinned.
11
+ * - The page asks `TrackingBranded/Customer?trackingKey=` for its brand, then
12
+ * `TrackingBranded/Tracking?trackingKey=&trackingNumber=`. Both answer HTTP
13
+ * 200 with `responseStatus.responseStatusCode` 200, or 204 when nothing
14
+ * matches.
15
+ * - Without a valid tracking key the Tracking call answers 204 "no package
16
+ * data" even for a known parcel. The key is therefore validated through
17
+ * Customer (204 "no customers configured" for a wrong key) before a 204 is
18
+ * reported as not found, so a rotated key cannot turn every lookup into a
19
+ * not-found.
20
+ * - Both header values are required (JSON 401 and 403 otherwise). Cloudflare
21
+ * refuses a library's default User-Agent (403 "error code: 1010"); an
22
+ * ordinary one is accepted, with no cookie, session or browser.
23
+ * - Prior art calling the same endpoint: Paylicier/Packt (MPL-2.0,
24
+ * backend/src/sources/implementations/asendia.ts) and deingithub/beanstalk
25
+ * (beanstalk/parcel.py).
26
+ *
27
+ * Coverage: parcels on the A1 platform only. Asendia's global portal
28
+ * track.asendia.com, which serves the other subsidiaries, needs a Cloudflare
29
+ * Turnstile token for every search and is not used here (see probe.ts). A
30
+ * number A1 does not know is a not-found for this adapter only; routing then
31
+ * tries the universal providers in the same check.
32
+ *
33
+ * Privacy: events keep their time, wording, code and city, province and
34
+ * country. Address lines and postal codes in `eventLocationDetails` are never
35
+ * read, and nothing else from the summary is copied except the destination
36
+ * country, weight and the declared last-mile reference.
37
+ */
38
+ import type { AdapterFactory, TrackingContext } from '../../core/adapter/index.js';
39
+ import type { CarrierResult } from '../../core/result/index.js';
40
+ export interface AsendiaA1PublicConfig {
41
+ /** The API origin, e.g. https://a1reportapi.asendiaprod.com. */
42
+ baseUrl: string;
43
+ authorization: string;
44
+ apiKey: string;
45
+ trackingKey: string;
46
+ }
47
+ export declare function normalizeAsendiaA1TrackingNumber(raw: string): string;
48
+ /** The official public page for one number. */
49
+ export declare function asendiaA1TrackingUrl(rawTrackingNumber: string): string;
50
+ /**
51
+ * Read the public client configuration from the official page's script. The
52
+ * values are the ones every visitor's browser sends; the default tracking key
53
+ * is the only GUID in the script besides the API key.
54
+ */
55
+ export declare function parseAsendiaA1PublicConfig(script: string): AsendiaA1PublicConfig;
56
+ /** Pure projection of one Tracking reply for the requested number. */
57
+ export declare function parseAsendiaA1TrackingResponse(payload: unknown, rawTrackingNumber: string): CarrierResult;
58
+ export interface AsendiaA1TrackerOptions {
59
+ /** Test seam; production uses the global fetch. */
60
+ fetcher?: typeof fetch;
61
+ /** Wall clock in milliseconds, for the configuration cache and budgets. */
62
+ now?: () => number;
63
+ budgetMs?: number;
64
+ }
65
+ export declare class AsendiaA1Tracker {
66
+ private readonly fetcher?;
67
+ private readonly now;
68
+ private readonly budgetMs;
69
+ private cached;
70
+ private loading;
71
+ constructor(options?: AsendiaA1TrackerOptions);
72
+ fetch(rawTrackingNumber: string, context?: TrackingContext): Promise<CarrierResult>;
73
+ private freshConfig;
74
+ /** One page read at a time; concurrent lookups share it. */
75
+ private loadConfig;
76
+ private readConfig;
77
+ private keyAccepted;
78
+ private tracking;
79
+ private api;
80
+ private requestTimeout;
81
+ }
82
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,342 @@
1
+ import { carrierIdFromPartner } from '../../core/catalog/hints.js';
2
+ import { BudgetExceededError, ChallengeError, IndeterminateError, NotFoundError, SchemaError, UpstreamHttpError, } from '../../core/errors/index.js';
3
+ import { languageStageStatus, wordingStage } from '../../core/status/index.js';
4
+ import { explicitOffsetTime } from '../../core/time/index.js';
5
+ import { clean, cleanScalar, decodeText, fetchBounded, parseJsonBytes } from '../../core/transport/index.js';
6
+ import { isRecord } from '../../core/types.js';
7
+ import { classifyAsendiaA1Event } from './status.js';
8
+ const PROVIDER = 'Asendia';
9
+ const PAGE_URL = 'https://a1.asendiausa.com/tracking/';
10
+ const SCRIPT_URL = `${PAGE_URL}js/main.js`;
11
+ const API_HOST_SUFFIXES = ['asendiaprod.com', 'asendia.io', 'asendia.com', 'asendiausa.com'];
12
+ const USER_AGENT = 'Mozilla/5.0 (compatible; SwissDeliveryTracker/1.0)';
13
+ const GUID = /[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}/gi;
14
+ const DEFAULT_BUDGET_MS = 25_000;
15
+ const MAX_REQUEST_MS = 10_000;
16
+ /** The public configuration is re-read at least this often, in case it rotates. */
17
+ const CONFIG_TTL_MS = 6 * 60 * 60_000;
18
+ /** A not-found is only trusted when the tracking key was accepted this recently. */
19
+ const KEY_CHECK_TTL_MS = 15 * 60_000;
20
+ const MAX_SCRIPT_BYTES = 500_000;
21
+ const MAX_RESPONSE_BYTES = 1_000_000;
22
+ const MAX_EVENTS_TO_INSPECT = 500;
23
+ const MAX_EVENTS_TO_RETURN = 100;
24
+ const POUNDS_TO_KG = 0.453_592_37;
25
+ /** The API refused the page's public header values (JSON 401 or 403). */
26
+ class AsendiaCredentialsError extends SchemaError {
27
+ constructor() {
28
+ super(PROVIDER, 'Asendia rejected the public tracking credentials');
29
+ this.name = 'AsendiaCredentialsError';
30
+ }
31
+ }
32
+ function record(value) {
33
+ return isRecord(value) ? value : {};
34
+ }
35
+ /** Letters and digits only, upper-cased: how A1 identifiers are compared. */
36
+ function comparable(value) {
37
+ return cleanScalar(value, 80).toLocaleUpperCase('en-US').replace(/[^A-Z0-9]/g, '');
38
+ }
39
+ export function normalizeAsendiaA1TrackingNumber(raw) {
40
+ const value = comparable(raw);
41
+ if (!/^[A-Z0-9]{6,40}$/.test(value)) {
42
+ throw new TypeError('Asendia tracking numbers must contain 6 to 40 ASCII letters and digits');
43
+ }
44
+ return value;
45
+ }
46
+ /** The official public page for one number. */
47
+ export function asendiaA1TrackingUrl(rawTrackingNumber) {
48
+ const url = new URL(PAGE_URL);
49
+ url.searchParams.set('trackingnumber', normalizeAsendiaA1TrackingNumber(rawTrackingNumber));
50
+ return url.toString();
51
+ }
52
+ function scriptField(script, name) {
53
+ const values = new Set([...script.matchAll(new RegExp(`"${name}"\\s*:\\s*"([^"\\\\]{1,600})"`, 'g'))]
54
+ .map((match) => match[1]));
55
+ if (values.size !== 1)
56
+ throw new SchemaError(PROVIDER, `Asendia's tracking page no longer publishes ${name}`);
57
+ return [...values][0];
58
+ }
59
+ function apiOrigin(raw) {
60
+ let url;
61
+ try {
62
+ url = new URL(raw);
63
+ }
64
+ catch (error) {
65
+ throw new SchemaError(PROVIDER, 'Asendia published an invalid tracking API address', { cause: error });
66
+ }
67
+ const host = url.hostname.toLowerCase();
68
+ if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash
69
+ || !['', '/'].includes(url.pathname)
70
+ || !API_HOST_SUFFIXES.some((suffix) => host === suffix || host.endsWith(`.${suffix}`))) {
71
+ throw new SchemaError(PROVIDER, 'Asendia published an unexpected tracking API address');
72
+ }
73
+ return url.origin;
74
+ }
75
+ /**
76
+ * Read the public client configuration from the official page's script. The
77
+ * values are the ones every visitor's browser sends; the default tracking key
78
+ * is the only GUID in the script besides the API key.
79
+ */
80
+ export function parseAsendiaA1PublicConfig(script) {
81
+ const baseUrl = apiOrigin(scriptField(script, 'baseUrl'));
82
+ const authorization = scriptField(script, 'authorizationHeaderValue');
83
+ const apiKey = scriptField(script, 'a1ApiKeyHeaderValue');
84
+ if (!/^Basic [A-Za-z0-9+/]{8,500}={0,2}$/.test(authorization) || !new RegExp(`^${GUID.source}$`, 'i').test(apiKey)) {
85
+ throw new SchemaError(PROVIDER, 'Asendia published invalid tracking API credentials');
86
+ }
87
+ const keys = new Map([...script.matchAll(GUID)].map((match) => [match[0].toUpperCase(), match[0]]));
88
+ keys.delete(apiKey.toUpperCase());
89
+ if (keys.size !== 1)
90
+ throw new SchemaError(PROVIDER, "Asendia's tracking page no longer publishes one tracking key");
91
+ return { baseUrl, authorization, apiKey, trackingKey: [...keys.values()][0] };
92
+ }
93
+ function responseCode(payload) {
94
+ const code = record(payload.responseStatus).responseStatusCode;
95
+ return typeof code === 'number' && Number.isInteger(code) ? code : null;
96
+ }
97
+ function eventLocation(value) {
98
+ const location = record(value);
99
+ // Address lines and postal codes are deliberately not read.
100
+ return [location.city, location.province, location.countryIso2]
101
+ .map((part) => clean(part, 80))
102
+ .filter(Boolean)
103
+ .join(', ');
104
+ }
105
+ function eventCode(value) {
106
+ const code = cleanScalar(value, 32).toLocaleUpperCase('en-US');
107
+ return /^[A-Z0-9._-]{1,32}$/.test(code) ? code : '';
108
+ }
109
+ function weightKg(value) {
110
+ const match = /^(\d{1,5}(?:\.\d{1,4})?)\s*(lb|lbs|kg)$/i.exec(clean(value, 32));
111
+ if (!match)
112
+ return null;
113
+ const amount = Number(match[1]) * (match[2].toLowerCase() === 'kg' ? 1 : POUNDS_TO_KG);
114
+ return Number.isFinite(amount) && amount > 0 ? Math.round(amount * 1000) / 1000 : null;
115
+ }
116
+ function parseEvents(details) {
117
+ const parsed = [];
118
+ const seen = new Set();
119
+ details.slice(0, MAX_EVENTS_TO_INSPECT).forEach((raw, sourceIndex) => {
120
+ // A1 stamps every event with an explicit offset; an offset-less value is
121
+ // dropped rather than guessed as UTC.
122
+ const time = explicitOffsetTime(raw.eventOn);
123
+ const description = clean(raw.eventDescription, 300);
124
+ if (!time || !description)
125
+ return;
126
+ const code = eventCode(raw.eventCode);
127
+ const location = eventLocation(raw.eventLocationDetails);
128
+ const identity = JSON.stringify([time.iso, code, description, location]);
129
+ if (seen.has(identity))
130
+ return;
131
+ seen.add(identity);
132
+ // Codes are only meaningful per source: USPS and other partners reuse
133
+ // short codes such as "10" or "B1" for unrelated scans.
134
+ const classified = classifyAsendiaA1Event(clean(raw.eventSource, 80), code, description);
135
+ parsed.push({
136
+ sourceIndex,
137
+ classified,
138
+ timestamp: time.timestamp,
139
+ event: {
140
+ time: time.iso,
141
+ location,
142
+ description,
143
+ ...(classified ? { stage: classified.stage } : {}),
144
+ ...(code ? { provider_code: code } : {}),
145
+ },
146
+ });
147
+ });
148
+ // A1 lists the newest event first; keep that order for equal instants.
149
+ parsed.sort((left, right) => right.timestamp - left.timestamp || left.sourceIndex - right.sourceIndex);
150
+ return parsed.slice(0, MAX_EVENTS_TO_RETURN);
151
+ }
152
+ /** Pure projection of one Tracking reply for the requested number. */
153
+ export function parseAsendiaA1TrackingResponse(payload, rawTrackingNumber) {
154
+ const requested = normalizeAsendiaA1TrackingNumber(rawTrackingNumber);
155
+ if (!isRecord(payload))
156
+ throw new SchemaError(PROVIDER, 'Asendia returned an invalid tracking response');
157
+ const code = responseCode(payload);
158
+ if (code === 204)
159
+ throw new NotFoundError(PROVIDER);
160
+ if (code !== 200)
161
+ throw new IndeterminateError(PROVIDER, `Asendia answered with tracking status ${code ?? 'none'}`);
162
+ const summary = record(payload.trackingBrandedSummary);
163
+ const original = comparable(summary.trackingNumberCustomerCarrierOriginal);
164
+ const customer = comparable(summary.trackingNumberCustomer);
165
+ const vendor = comparable(summary.trackingNumberVendor);
166
+ // The reply echoes nothing about the query itself: bind it through the
167
+ // references it reports, which A1 also accepts as lookup numbers.
168
+ const identities = [original, customer, vendor].filter(Boolean);
169
+ if (identities.length === 0)
170
+ throw new SchemaError(PROVIDER, 'Asendia did not identify the shipment');
171
+ if (!identities.includes(requested))
172
+ throw new SchemaError(PROVIDER, 'Asendia returned a different shipment');
173
+ if (!Array.isArray(payload.trackingBrandedDetail)) {
174
+ throw new SchemaError(PROVIDER, 'Asendia returned an invalid tracking history');
175
+ }
176
+ const parsed = parseEvents(payload.trackingBrandedDetail.filter(isRecord));
177
+ const events = parsed.map(({ event }) => event);
178
+ const latest = events[0];
179
+ const explicit = parsed[0]?.classified ?? null;
180
+ const stage = explicit?.stage ?? (latest ? wordingStage(latest.description ?? '') : null);
181
+ const status = explicit?.status ?? (stage ? languageStageStatus(stage) : 'unknown');
182
+ const partner = carrierIdFromPartner('', clean(summary.finalMileTrackingLink, 500));
183
+ const destination = clean(summary.destinationCountryIso2, 2).toUpperCase();
184
+ const weight = weightKg(summary.weight);
185
+ return {
186
+ status,
187
+ ...(explicit ? { current_stage: explicit.stage } : {}),
188
+ last_status_text: latest?.description ?? null,
189
+ last_update: latest?.time ?? null,
190
+ expected_delivery: null,
191
+ ...(weight !== null ? { weight_kg: weight } : {}),
192
+ ...(/^[A-Z]{2}$/.test(destination) ? { destination_country: destination } : {}),
193
+ ...(partner && partner !== 'asendia' ? { delivery_carrier: partner } : {}),
194
+ ...(vendor && vendor !== requested && /^[A-Z0-9]{4,40}$/.test(vendor) ? { delivery_tracking_number: vendor } : {}),
195
+ events,
196
+ };
197
+ }
198
+ function retryAfterMs(header) {
199
+ if (header === null)
200
+ return undefined;
201
+ const value = header.trim();
202
+ const delay = /^\d+$/.test(value) ? Number(value) * 1000 : Date.parse(value) - Date.now();
203
+ return Number.isFinite(delay) ? Math.max(0, delay) : undefined;
204
+ }
205
+ export class AsendiaA1Tracker {
206
+ fetcher;
207
+ now;
208
+ budgetMs;
209
+ cached = null;
210
+ loading = null;
211
+ constructor(options = {}) {
212
+ this.fetcher = options.fetcher;
213
+ this.now = options.now ?? Date.now;
214
+ this.budgetMs = options.budgetMs ?? DEFAULT_BUDGET_MS;
215
+ if (!Number.isFinite(this.budgetMs) || this.budgetMs <= 0)
216
+ throw new TypeError('Asendia budget must be positive');
217
+ }
218
+ async fetch(rawTrackingNumber, context = {}) {
219
+ const trackingNumber = normalizeAsendiaA1TrackingNumber(rawTrackingNumber);
220
+ const budgetMs = context.budgetMs ?? this.budgetMs;
221
+ const deadline = this.now() + budgetMs;
222
+ const request = { deadline, budgetMs, signal: context.signal };
223
+ let config = this.freshConfig();
224
+ const reused = config !== null;
225
+ config ??= await this.loadConfig(request);
226
+ let payload;
227
+ try {
228
+ payload = await this.tracking(config.value, trackingNumber, request);
229
+ }
230
+ catch (error) {
231
+ // Rotated public credentials: re-read the page once, then give up.
232
+ if (!reused || !(error instanceof AsendiaCredentialsError))
233
+ throw error;
234
+ this.cached = null;
235
+ config = await this.loadConfig(request);
236
+ payload = await this.tracking(config.value, trackingNumber, request);
237
+ }
238
+ if (responseCode(payload) === 204 && this.now() - config.keyCheckedAt > KEY_CHECK_TTL_MS) {
239
+ // A 204 is also what an unaccepted key produces. Confirm the key before
240
+ // trusting the not-found, and retry once with a re-read page if it moved.
241
+ if (!await this.keyAccepted(config.value, request)) {
242
+ this.cached = null;
243
+ config = await this.loadConfig(request);
244
+ payload = await this.tracking(config.value, trackingNumber, request);
245
+ }
246
+ else {
247
+ config.keyCheckedAt = this.now();
248
+ }
249
+ }
250
+ const result = parseAsendiaA1TrackingResponse(payload, trackingNumber);
251
+ result.tracking_url = asendiaA1TrackingUrl(trackingNumber);
252
+ result.tracking_source = 'structured-web-response';
253
+ return result;
254
+ }
255
+ freshConfig() {
256
+ return this.cached && this.now() - this.cached.loadedAt < CONFIG_TTL_MS ? this.cached : null;
257
+ }
258
+ /** One page read at a time; concurrent lookups share it. */
259
+ loadConfig(request) {
260
+ this.loading ??= this.readConfig(request).finally(() => { this.loading = null; });
261
+ return this.loading;
262
+ }
263
+ async readConfig(request) {
264
+ const { bytes } = await fetchBounded(SCRIPT_URL, {
265
+ headers: { Accept: '*/*', Referer: PAGE_URL, 'User-Agent': USER_AGENT },
266
+ }, {
267
+ provider: 'Asendia tracking page', timeoutMs: this.requestTimeout(request), maxBytes: MAX_SCRIPT_BYTES, fetcher: this.fetcher,
268
+ });
269
+ const value = parseAsendiaA1PublicConfig(decodeText(bytes));
270
+ if (!await this.keyAccepted(value, request)) {
271
+ throw new SchemaError(PROVIDER, "Asendia no longer accepts its tracking page's public key");
272
+ }
273
+ const now = this.now();
274
+ this.cached = { value, loadedAt: now, keyCheckedAt: now };
275
+ return this.cached;
276
+ }
277
+ async keyAccepted(config, request) {
278
+ const url = new URL('/api/A1/TrackingBranded/Customer', config.baseUrl);
279
+ url.searchParams.set('trackingKey', config.trackingKey);
280
+ const payload = await this.api(url, config, request, 'Asendia tracking brand');
281
+ const code = responseCode(payload);
282
+ if (code === 200 && isRecord(payload.trackingBrandedCustomer))
283
+ return true;
284
+ if (code === 204)
285
+ return false;
286
+ throw new IndeterminateError(PROVIDER, `Asendia answered the brand check with status ${code ?? 'none'}`);
287
+ }
288
+ tracking(config, trackingNumber, request) {
289
+ const url = new URL('/api/A1/TrackingBranded/Tracking', config.baseUrl);
290
+ url.searchParams.set('trackingKey', config.trackingKey);
291
+ url.searchParams.set('trackingNumber', trackingNumber);
292
+ return this.api(url, config, request, 'Asendia tracking');
293
+ }
294
+ async api(url, config, request, provider) {
295
+ const { response, bytes } = await fetchBounded(url, {
296
+ headers: {
297
+ Accept: 'application/json',
298
+ Authorization: config.authorization,
299
+ 'X-AsendiaOne-ApiKey': config.apiKey,
300
+ 'User-Agent': USER_AGENT,
301
+ },
302
+ }, {
303
+ provider, timeoutMs: this.requestTimeout(request), maxBytes: MAX_RESPONSE_BYTES, fetcher: this.fetcher,
304
+ allowHttpError: true,
305
+ });
306
+ const text = decodeText(bytes);
307
+ const payload = /^\s*\{/.test(text) ? parseJsonBytes(bytes, PROVIDER) : null;
308
+ // Rejections put the code at the top level instead of under responseStatus.
309
+ const code = isRecord(payload)
310
+ ? responseCode(payload) ?? responseCode({ responseStatus: payload })
311
+ : null;
312
+ if (response.status === 401 || response.status === 403 || code === 401 || code === 403) {
313
+ // The API's own JSON rejection means the header values moved; anything
314
+ // else on 401/403 is the edge refusing the client.
315
+ if (code === 401 || code === 403)
316
+ throw new AsendiaCredentialsError();
317
+ throw new ChallengeError(PROVIDER, 'Asendia refused the tracking request');
318
+ }
319
+ if (!response.ok) {
320
+ throw new UpstreamHttpError(provider, response.status, retryAfterMs(response.headers.get('retry-after')));
321
+ }
322
+ if (!isRecord(payload))
323
+ throw new SchemaError(PROVIDER, 'Asendia returned an invalid tracking response');
324
+ return payload;
325
+ }
326
+ requestTimeout(request) {
327
+ request.signal?.throwIfAborted();
328
+ const remaining = Math.floor(request.deadline - this.now());
329
+ if (remaining < 1)
330
+ throw new BudgetExceededError(PROVIDER, request.budgetMs);
331
+ return Math.min(MAX_REQUEST_MS, remaining);
332
+ }
333
+ }
334
+ export const adapter = (environment) => {
335
+ const tracker = new AsendiaA1Tracker({ fetcher: environment.fetcher });
336
+ return {
337
+ id: 'asendia',
338
+ // Plain HTTP against the public page's own API; no second tier.
339
+ steps: ['direct'],
340
+ track: (input, context) => tracker.fetch(input.number, context),
341
+ };
342
+ };
@@ -0,0 +1,91 @@
1
+ {
2
+ "id": "asendia",
3
+ "displayName": "Asendia",
4
+ "aliases": [
5
+ "Asendia Management",
6
+ "Asendia UK",
7
+ "asendia.com"
8
+ ],
9
+ "region": {
10
+ "countries": [
11
+ "FR",
12
+ "CH",
13
+ "GB",
14
+ "DE",
15
+ "US"
16
+ ]
17
+ },
18
+ "brand": {
19
+ "color": "#ef7d00"
20
+ },
21
+ "selectable": true,
22
+ "timezone": "UTC",
23
+ "tracking": {
24
+ "mode": "automatic",
25
+ "adapter": "asendia",
26
+ "steps": [
27
+ "direct"
28
+ ]
29
+ },
30
+ "capabilities": [
31
+ "history",
32
+ "location",
33
+ "provider_code",
34
+ "weight"
35
+ ],
36
+ "portal": {
37
+ "url": "https://track.asendia.com/track/{trackingNumber}",
38
+ "canaryUrl": "https://a1.asendiausa.com/tracking/",
39
+ "shows": [
40
+ "status",
41
+ "history",
42
+ "location",
43
+ "weight"
44
+ ],
45
+ "scraped": [
46
+ "status",
47
+ "history",
48
+ "location",
49
+ "weight"
50
+ ],
51
+ "discarded": [],
52
+ "unavailable": [
53
+ "eta"
54
+ ]
55
+ },
56
+ "links": [
57
+ {
58
+ "domains": [
59
+ "track.asendia.com"
60
+ ],
61
+ "path": "^/track/([^/?#]+)/?$"
62
+ },
63
+ {
64
+ "domains": [
65
+ "a1.asendiausa.com",
66
+ "a1.asendia.com"
67
+ ],
68
+ "pathPattern": "^/tracking/?$",
69
+ "params": [
70
+ "trackingnumber"
71
+ ]
72
+ }
73
+ ],
74
+ "detection": [
75
+ {
76
+ "id": "asendia-1",
77
+ "pattern": "^ASE[A-Z0-9]{8,37}$",
78
+ "confidence": "high"
79
+ },
80
+ {
81
+ "id": "asendia-2",
82
+ "pattern": "^AS\\d{9}US$",
83
+ "confidence": "high"
84
+ },
85
+ {
86
+ "id": "asendia-3",
87
+ "pattern": "^AHOY[A-Z0-9]{8}$",
88
+ "confidence": "high"
89
+ }
90
+ ]
91
+ }