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,50 @@
1
+ /**
2
+ * DHL eCommerce, through the public recipient endpoint the global tracking
3
+ * page calls (`www.dhl.com/utapi`).
4
+ *
5
+ * The endpoint answers every direct server request with an Akamai crypto
6
+ * proof-of-work challenge (HTTP 428) that plain HTTP cannot solve (verified
7
+ * 2026-09-10: cookie replay and visiting the page first both still return
8
+ * 428), and browser clearance is not transferable back to Node. The lookup
9
+ * therefore has a single step: a local Chromium session loads the tracking
10
+ * page, the site solves its own challenge and calls the API in that session,
11
+ * and the response to the exact requested URL is parsed.
12
+ *
13
+ * DHL may answer with a customer-confirmation id instead of the queried
14
+ * alias, so only one eCommerce shipment from that exact request URL is
15
+ * accepted, and the id itself is never retained.
16
+ */
17
+ import type { AdapterFactory } from '../../core/adapter/index.js';
18
+ import { ChallengeError, type CarrierErrorOptions } from '../../core/errors/index.js';
19
+ import type { CarrierResult } from '../../core/result/index.js';
20
+ import { type StepRecorder } from '../../core/telemetry/index.js';
21
+ import { type UniversalBrowserOptions } from '../../core/transport/browser.js';
22
+ export declare function normalizeDHLEcommerceNumber(raw: string): string;
23
+ export declare function dhlEcommerceTrackingUrl(number: string): string;
24
+ /** Only call for the response to the exact requested UTAPI URL. DHL can return
25
+ * a customer-confirmation id which differs from every queried parcel alias. */
26
+ export declare function parseDHLEcommerceResponse(payload: unknown): CarrierResult;
27
+ /**
28
+ * The tracking page answered with a challenge status instead of the tracking
29
+ * application. The name is part of the host's error metadata contract: it
30
+ * reports the upstream status for errors named `DHLEcommerceSessionError`.
31
+ */
32
+ export declare class DHLEcommerceSessionError extends ChallengeError {
33
+ /** Always present here; narrowed from the optional base field. */
34
+ readonly status: number;
35
+ constructor(status: number, options?: CarrierErrorOptions);
36
+ }
37
+ export interface DHLEcommerceTrackerOptions extends UniversalBrowserOptions {
38
+ budgetMs?: number;
39
+ recorder?: StepRecorder;
40
+ }
41
+ export declare class DHLEcommerceTracker {
42
+ readonly options: DHLEcommerceTrackerOptions;
43
+ private readonly recorder;
44
+ private readonly serialize;
45
+ constructor(options?: DHLEcommerceTrackerOptions);
46
+ /** One browser at a time per instance: a batch must not spawn a Chromium per parcel. */
47
+ fetch(trackingNumber: string): Promise<CarrierResult>;
48
+ private browser;
49
+ }
50
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,179 @@
1
+ /**
2
+ * DHL eCommerce, through the public recipient endpoint the global tracking
3
+ * page calls (`www.dhl.com/utapi`).
4
+ *
5
+ * The endpoint answers every direct server request with an Akamai crypto
6
+ * proof-of-work challenge (HTTP 428) that plain HTTP cannot solve (verified
7
+ * 2026-09-10: cookie replay and visiting the page first both still return
8
+ * 428), and browser clearance is not transferable back to Node. The lookup
9
+ * therefore has a single step: a local Chromium session loads the tracking
10
+ * page, the site solves its own challenge and calls the API in that session,
11
+ * and the response to the exact requested URL is parsed.
12
+ *
13
+ * DHL may answer with a customer-confirmation id instead of the queried
14
+ * alias, so only one eCommerce shipment from that exact request URL is
15
+ * accepted, and the id itself is never retained.
16
+ */
17
+ import { DateTime } from 'luxon';
18
+ import { ChallengeError, SchemaError } from '../../core/errors/index.js';
19
+ import { runSteps, singleFlight } from '../../core/runner/index.js';
20
+ import { countryTimeZone } from '../../core/time/index.js';
21
+ import { NOOP_RECORDER } from '../../core/telemetry/index.js';
22
+ import { clean as cleanText, UpstreamHttpError } from '../../core/transport/index.js';
23
+ import { scrapeUniversalPage } from '../../core/transport/browser.js';
24
+ import { isRecord } from '../../core/types.js';
25
+ import { stageFor, statusFor } from './status.js';
26
+ const PROVIDER = 'DHL eCommerce';
27
+ const API = 'https://www.dhl.com/utapi';
28
+ /** Statuses DHL answers with while its challenge is unsolved. */
29
+ const CHALLENGE_STATUSES = [401, 403, 419, 428];
30
+ /**
31
+ * UTAPI strings occasionally carry markup. Tags are dropped without a
32
+ * separator, as this adapter has always done, before the shared cleaner
33
+ * collapses whitespace and caps the length.
34
+ */
35
+ function clean(value, limit = 500) {
36
+ return typeof value === 'string' ? cleanText(value.replace(/<[^>]*>/g, ''), limit) : '';
37
+ }
38
+ export function normalizeDHLEcommerceNumber(raw) {
39
+ const number = raw.toUpperCase().replace(/[\s.-]/g, '');
40
+ if (!/^(?=.*\d)[A-Z0-9]{5,40}$/.test(number))
41
+ throw new TypeError('DHL eCommerce tracking number is invalid');
42
+ return number;
43
+ }
44
+ export function dhlEcommerceTrackingUrl(number) {
45
+ return `https://www.dhl.com/ch-en/home/tracking.html?tracking-id=${normalizeDHLEcommerceNumber(number)}&submit=1`;
46
+ }
47
+ function address(event) {
48
+ const location = isRecord(event.location) ? event.location : {};
49
+ return isRecord(location.address) ? location.address : {};
50
+ }
51
+ // UTAPI returns local wall-clock timestamps, sometimes without countryCode.
52
+ // Resolve only unambiguous locations; never treat an unknown local time as UTC.
53
+ const HUB_ZONES = {
54
+ 'melrose park, il, us': 'America/Chicago', 'hebron, ky, us': 'America/New_York',
55
+ 'lahr': 'Europe/Berlin', 'staufenberg': 'Europe/Berlin',
56
+ };
57
+ /**
58
+ * A local policy rather than one from `core/time`: the zone comes from the
59
+ * event's own location, and every event is normalized to UTC because the
60
+ * result declares `timezone: 'UTC'` for a carrier whose legs cross zones.
61
+ */
62
+ function eventTime(event) {
63
+ const raw = clean(event.timestamp, 64);
64
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/.test(raw))
65
+ return null;
66
+ const place = address(event);
67
+ const locality = clean(place.addressLocality, 160);
68
+ const country = clean(place.countryCode).toUpperCase();
69
+ const zone = /(?:Z|[+-]\d{2}:\d{2})$/.test(raw) ? 'UTC'
70
+ : countryTimeZone(country) ?? countryTimeZone(locality) ?? HUB_ZONES[locality.toLowerCase()];
71
+ if (!zone)
72
+ return null;
73
+ const parsed = DateTime.fromISO(raw, { zone, setZone: true });
74
+ return parsed.isValid ? parsed.toUTC().toISO() : null;
75
+ }
76
+ /** Only call for the response to the exact requested UTAPI URL. DHL can return
77
+ * a customer-confirmation id which differs from every queried parcel alias. */
78
+ export function parseDHLEcommerceResponse(payload) {
79
+ if (!isRecord(payload) || !Array.isArray(payload.shipments))
80
+ throw new SchemaError(PROVIDER, 'DHL eCommerce returned an invalid tracking response');
81
+ if (payload.shipments.length !== 1 || !isRecord(payload.shipments[0])) {
82
+ throw new SchemaError(PROVIDER, 'DHL eCommerce did not return one unambiguous shipment');
83
+ }
84
+ const shipment = payload.shipments[0];
85
+ if (!clean(shipment.id))
86
+ throw new SchemaError(PROVIDER, 'DHL eCommerce returned a shipment without an identifier');
87
+ if (shipment.service !== 'ecommerce')
88
+ throw new SchemaError(PROVIDER, 'This shipment is not handled by DHL eCommerce');
89
+ if (!isRecord(shipment.status) || !clean(shipment.status.description))
90
+ throw new SchemaError(PROVIDER, 'DHL eCommerce returned no tracking status');
91
+ if (!Array.isArray(shipment.events) || shipment.events.length > 500)
92
+ throw new SchemaError(PROVIDER, 'DHL eCommerce returned invalid tracking events');
93
+ const events = shipment.events.filter(isRecord).flatMap((event) => {
94
+ const time = eventTime(event);
95
+ const description = clean(event.description);
96
+ if (!time || !description)
97
+ return [];
98
+ const place = address(event);
99
+ const stage = stageFor(event);
100
+ return [{ time, description: stage === 'delivered' ? 'Delivered' : description,
101
+ location: [...new Set([clean(place.addressLocality, 160), clean(place.countryCode, 2)].filter(Boolean))].join(', '),
102
+ stage }];
103
+ }).sort((a, b) => b.time.localeCompare(a.time)).slice(0, 100);
104
+ const stage = shipment.returnFlag === true && shipment.status.statusCode === 'delivered'
105
+ ? 'returned' : stageFor(shipment.status);
106
+ const expected = clean(shipment.estimatedTimeOfDelivery, 64).slice(0, 10);
107
+ const sender = clean(isRecord(shipment.sender) ? shipment.sender.name : shipment.senderName, 200) || null;
108
+ const deliveredAt = stage === 'delivered' ? eventTime(shipment.status) : null;
109
+ return {
110
+ status: statusFor(stage), current_stage: stage,
111
+ last_status_text: stage === 'delivered' ? 'Delivered' : clean(shipment.status.description),
112
+ last_update: eventTime(shipment.status),
113
+ expected_delivery: !['delivered', 'returned'].includes(stage) && /^\d{4}-\d{2}-\d{2}$/.test(expected)
114
+ && DateTime.fromISO(expected).isValid ? expected : null,
115
+ timezone: 'UTC', events,
116
+ ...(sender ? { sender_name: sender } : {}),
117
+ ...(deliveredAt ? { delivered_at: deliveredAt } : {}),
118
+ };
119
+ }
120
+ /**
121
+ * The tracking page answered with a challenge status instead of the tracking
122
+ * application. The name is part of the host's error metadata contract: it
123
+ * reports the upstream status for errors named `DHLEcommerceSessionError`.
124
+ */
125
+ export class DHLEcommerceSessionError extends ChallengeError {
126
+ constructor(status, options) {
127
+ super(PROVIDER, `DHL eCommerce rejected the tracking session with HTTP ${status}`, { ...options, status });
128
+ this.name = 'DHLEcommerceSessionError';
129
+ }
130
+ }
131
+ function trackingApiUrl(number) {
132
+ const url = new URL(API);
133
+ url.search = new URLSearchParams({ trackingNumber: number, language: 'en', requesterCountryCode: 'CH', source: 'tt' }).toString();
134
+ return url.toString();
135
+ }
136
+ export class DHLEcommerceTracker {
137
+ options;
138
+ recorder;
139
+ serialize = singleFlight();
140
+ constructor(options = {}) {
141
+ this.options = options;
142
+ const timeout = options.timeoutMs;
143
+ if (timeout !== undefined && (!Number.isFinite(timeout) || timeout <= 0 || timeout > 60_000)) {
144
+ throw new TypeError('DHL eCommerce timeout must be between 1 and 60000 ms');
145
+ }
146
+ this.recorder = options.recorder ?? NOOP_RECORDER;
147
+ }
148
+ /** One browser at a time per instance: a batch must not spawn a Chromium per parcel. */
149
+ async fetch(trackingNumber) {
150
+ const number = normalizeDHLEcommerceNumber(trackingNumber);
151
+ const timeoutMs = this.options.timeoutMs ?? 45_000;
152
+ return this.serialize(() => runSteps({ carrier: 'dhl-ecommerce', budgetMs: this.options.budgetMs ?? timeoutMs + 15_000, recorder: this.recorder }, [{ id: 'browser', run: () => this.browser(number, timeoutMs) }]));
153
+ }
154
+ async browser(number, timeoutMs) {
155
+ try {
156
+ return await scrapeUniversalPage({ executablePath: this.options.executablePath, timeoutMs }, {
157
+ name: PROVIDER, url: dhlEcommerceTrackingUrl(number), responseUrl: trackingApiUrl(number),
158
+ }, parseDHLEcommerceResponse);
159
+ }
160
+ catch (error) {
161
+ // The challenge can also reach the page itself; name it so the host
162
+ // records the upstream status rather than a bare transport failure.
163
+ if (error instanceof UpstreamHttpError && CHALLENGE_STATUSES.includes(error.status)) {
164
+ throw new DHLEcommerceSessionError(error.status, { cause: error });
165
+ }
166
+ throw error;
167
+ }
168
+ }
169
+ }
170
+ export const adapter = (environment) => {
171
+ const tracker = new DHLEcommerceTracker({
172
+ executablePath: environment.browserExecutablePath ?? undefined, recorder: environment.recorder,
173
+ });
174
+ return {
175
+ id: 'dhl-ecommerce',
176
+ steps: ['browser'],
177
+ track: (input) => tracker.fetch(input.number),
178
+ };
179
+ };
@@ -0,0 +1,97 @@
1
+ {
2
+ "id": "dhl-ecommerce",
3
+ "displayName": "DHL eCommerce",
4
+ "aliases": [
5
+ "DHL eCommerce Solutions",
6
+ "DHL Global Mail"
7
+ ],
8
+ "region": {
9
+ "countries": [
10
+ "DE",
11
+ "NL",
12
+ "US"
13
+ ]
14
+ },
15
+ "brand": {
16
+ "color": "#ffcc00"
17
+ },
18
+ "selectable": true,
19
+ "timezone": "UTC",
20
+ "tracking": {
21
+ "mode": "automatic",
22
+ "adapter": "dhl-ecommerce",
23
+ "steps": [
24
+ "browser"
25
+ ]
26
+ },
27
+ "capabilities": [
28
+ "history",
29
+ "location",
30
+ "eta",
31
+ "sender_name",
32
+ "delivered_at"
33
+ ],
34
+ "portal": {
35
+ "url": "https://www.dhl.com/ch-en/home/tracking.html?tracking-id={trackingNumber}&submit=1",
36
+ "canaryUrl": "https://www.dhl.com/ch-en/home/tracking.html",
37
+ "shows": [
38
+ "status",
39
+ "history",
40
+ "location",
41
+ "eta",
42
+ "sender_name",
43
+ "delivered_at",
44
+ "recipient_address",
45
+ "customer_reference"
46
+ ],
47
+ "scraped": [
48
+ "status",
49
+ "history",
50
+ "location",
51
+ "eta",
52
+ "sender_name",
53
+ "delivered_at"
54
+ ],
55
+ "discarded": [
56
+ "recipient_address",
57
+ "customer_reference"
58
+ ],
59
+ "unavailable": []
60
+ },
61
+ "links": [
62
+ {
63
+ "domains": [
64
+ "ecommerceportal.dhl.com",
65
+ "webtrack.dhlglobalmail.com"
66
+ ],
67
+ "params": [
68
+ "tracking-id",
69
+ "trackingNumber",
70
+ "tracking",
71
+ "ID"
72
+ ]
73
+ },
74
+ {
75
+ "domains": [
76
+ "dhl.com"
77
+ ],
78
+ "pathPattern": "/home/tracking[.]html$",
79
+ "params": [
80
+ "tracking-id",
81
+ "trackingId"
82
+ ]
83
+ }
84
+ ],
85
+ "detection": [
86
+ {
87
+ "id": "dhl-ecommerce-1",
88
+ "pattern": "^GM[0-9]{16,18}$",
89
+ "confidence": "high"
90
+ },
91
+ {
92
+ "id": "dhl-ecommerce-2",
93
+ "pattern": "^[0-9]{16,17}$",
94
+ "confidence": "low"
95
+ }
96
+ ]
97
+ }
@@ -0,0 +1,130 @@
1
+ {
2
+ "carrier": "dhl-ecommerce",
3
+ "records": [
4
+ {
5
+ "number": "33870000000000001",
6
+ "role": "shipment",
7
+ "evidence": "synthetic",
8
+ "derivedFrom": "invented",
9
+ "shapeConfirmed": "2026-09-12",
10
+ "expect": {
11
+ "carrier": "unknown",
12
+ "confidence": "low",
13
+ "candidates": [
14
+ "dhl-ecommerce"
15
+ ]
16
+ },
17
+ "note": "Invented placeholder used as a shape check. Filed under DHL eCommerce, which stays one candidate among several."
18
+ },
19
+ {
20
+ "number": "3387191106122423",
21
+ "role": "shipment",
22
+ "evidence": "official_documentation_example",
23
+ "source": {
24
+ "url": "https://developer.dhl.com/api-reference/references-dhl-ecommerce-americas"
25
+ },
26
+ "expect": {
27
+ "carrier": "unknown",
28
+ "confidence": "low",
29
+ "candidates": [
30
+ "dhl-ecommerce",
31
+ "correos-express",
32
+ "canada-post",
33
+ "tnt"
34
+ ]
35
+ },
36
+ "note": "Official documentation example, not a real shipment. The source attributes it to DHL eCommerce, which stays one candidate among several."
37
+ },
38
+ {
39
+ "number": "GM1234567890123456",
40
+ "role": "shipment",
41
+ "evidence": "synthetic",
42
+ "derivedFrom": "official_shape",
43
+ "shapeConfirmed": "2026-09-12",
44
+ "expect": {
45
+ "carrier": "dhl-ecommerce",
46
+ "confidence": "high"
47
+ },
48
+ "note": "Made-up number that follows the published format."
49
+ },
50
+ {
51
+ "number": "GM60511234500000001",
52
+ "role": "shipment",
53
+ "evidence": "official_documentation_example",
54
+ "source": {
55
+ "url": "https://developer.dhl.com/api-reference/references-dhl-ecommerce-americas"
56
+ },
57
+ "expect": {
58
+ "carrier": "dhl-ecommerce",
59
+ "confidence": "high"
60
+ },
61
+ "note": "Official documentation example, not a real shipment."
62
+ },
63
+ {
64
+ "number": "0031043534391627906195625053434",
65
+ "role": "full_barcode",
66
+ "evidence": "official_documentation_example",
67
+ "source": {
68
+ "url": "https://developer.dhl.com/api-reference/references-dhl-ecommerce-americas"
69
+ },
70
+ "quarantine": true,
71
+ "expect": {
72
+ "carrier": "unknown",
73
+ "confidence": "none"
74
+ },
75
+ "note": "Official documentation example, not a real shipment. Full label barcode rather than the number a user types. The source attributes it to DHL eCommerce; no rule matches this shape."
76
+ },
77
+ {
78
+ "number": "0031043534391640211895625057522",
79
+ "role": "full_barcode",
80
+ "evidence": "official_documentation_example",
81
+ "source": {
82
+ "url": "https://developer.dhl.com/api-reference/references-dhl-ecommerce-americas"
83
+ },
84
+ "quarantine": true,
85
+ "expect": {
86
+ "carrier": "unknown",
87
+ "confidence": "none"
88
+ },
89
+ "note": "Official documentation example, not a real shipment. Full label barcode rather than the number a user types. The source attributes it to DHL eCommerce; no rule matches this shape."
90
+ },
91
+ {
92
+ "number": "9261269903500013618305",
93
+ "role": "quarantined",
94
+ "evidence": "official_documentation_example",
95
+ "source": {
96
+ "url": "https://developer.dhl.com/api-reference/references-dhl-ecommerce-americas"
97
+ },
98
+ "quarantine": true,
99
+ "expect": {
100
+ "carrier": "unknown",
101
+ "confidence": "low",
102
+ "candidates": [
103
+ "austrian-post",
104
+ "usps",
105
+ "estafeta"
106
+ ]
107
+ },
108
+ "note": "Official documentation example, not a real shipment. The source attributes it to DHL eCommerce, which no rule claims."
109
+ },
110
+ {
111
+ "number": "9361269903500011492028",
112
+ "role": "quarantined",
113
+ "evidence": "official_documentation_example",
114
+ "source": {
115
+ "url": "https://developer.dhl.com/api-reference/references-dhl-ecommerce-americas"
116
+ },
117
+ "quarantine": true,
118
+ "expect": {
119
+ "carrier": "unknown",
120
+ "confidence": "low",
121
+ "candidates": [
122
+ "austrian-post",
123
+ "usps",
124
+ "estafeta"
125
+ ]
126
+ },
127
+ "note": "Official documentation example, not a real shipment. The source attributes it to DHL eCommerce, which no rule claims."
128
+ }
129
+ ]
130
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * DHL eCommerce wording and UTAPI status codes → product stage.
3
+ *
4
+ * UTAPI events carry both a free-text `description` and a coarse
5
+ * `statusCode` (`pre-transit`, `transit`, `failure`, `delivered`). The
6
+ * wording is the more precise of the two, so it is read first; the code is
7
+ * the fallback, except for `delivered`, which is terminal and outranks an
8
+ * intuitive translation of the text.
9
+ */
10
+ import type { CarrierStatus } from '../../core/result/index.js';
11
+ import type { JsonObject } from '../../core/types.js';
12
+ export declare function stageFor(event: JsonObject): string;
13
+ export declare function statusFor(stage: string): CarrierStatus;
@@ -0,0 +1,57 @@
1
+ import { trackingLanguageStage } from '../../core/status/index.js';
2
+ import { clean as cleanText } from '../../core/transport/index.js';
3
+ /** The same tag-stripping cleaner the projection uses (see adapter.ts). */
4
+ function clean(value, limit = 500) {
5
+ return typeof value === 'string' ? cleanText(value.replace(/<[^>]*>/g, ''), limit) : '';
6
+ }
7
+ export function stageFor(event) {
8
+ const text = clean(event.description).toLowerCase();
9
+ if (/return(?:ed|ing)? to (?:the )?sender/.test(text))
10
+ return 'returned';
11
+ if (/not delivered|unable to deliver|delivery attempt|delivery failed/.test(text))
12
+ return 'failed_attempt';
13
+ // A carrier-reported problem that is neither a missed attempt nor a return.
14
+ if (/carrier exception|shipment exception|delivery exception|damaged|refused|address (?:incorrect|incomplete|unknown)|(?:incorrect|incomplete) address|lost in transit/.test(text))
15
+ return 'exception';
16
+ // Sender-side drop-off scans (ha-dhl-nl#15) must never read as recipient
17
+ // pickup: the parcel is entering the network, not awaiting collection.
18
+ if (/picked.?up at (?:a )?parcel ?shop|drop(?:ped)? ?off at|handed in at/.test(text))
19
+ return 'accepted';
20
+ if (/ready for (?:pickup|collection)|available for (?:pickup|collection)/.test(text))
21
+ return 'ready_for_pickup';
22
+ if (/out for delivery/.test(text))
23
+ return 'out_for_delivery';
24
+ if (/customs.*(?:cleared|released)|clearance completed/.test(text))
25
+ return 'in_transit';
26
+ if (/customs|clearance/.test(text))
27
+ return 'customs';
28
+ if (/label created|manifest data received|en route to dhl ecommerce or awaiting processing|electronic|information received/.test(text))
29
+ return 'registered';
30
+ if (/package received at dhl|picked up|accepted/.test(text))
31
+ return 'accepted';
32
+ if (/^(?:close bag|scanned into sack\/container)$/.test(text))
33
+ return 'in_transit';
34
+ // A terminal provider code outranks an intuitive translated label.
35
+ if (event.statusCode === 'delivered')
36
+ return 'delivered';
37
+ const translated = trackingLanguageStage(String(event.description ?? ''));
38
+ if (translated)
39
+ return translated;
40
+ switch (event.statusCode) {
41
+ case 'transit': return 'in_transit';
42
+ case 'pre-transit': return 'registered';
43
+ case 'failure': return 'failed_attempt';
44
+ default: return 'pending';
45
+ }
46
+ }
47
+ export function statusFor(stage) {
48
+ if (stage === 'delivered')
49
+ return 'delivered';
50
+ if (stage === 'out_for_delivery' || stage === 'ready_for_pickup')
51
+ return 'out_for_delivery';
52
+ if (['exception', 'failed_attempt', 'returned'].includes(stage))
53
+ return 'exception';
54
+ if (stage === 'registered' || stage === 'pending')
55
+ return 'pending';
56
+ return 'in_transit';
57
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "carrier": "dhl-ecommerce",
3
+ "entries": [
4
+ { "code": "pre-transit", "language": "en", "stage": "registered", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "UTAPI status code, read only when no wording rule matches." },
5
+ { "code": "transit", "language": "en", "stage": "in_transit", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
6
+ { "code": "failure", "language": "en", "stage": "failed_attempt", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
7
+ { "code": "delivered", "language": "en", "stage": "delivered", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "Terminal: this code outranks an intuitive translation of the wording." },
8
+ { "code": "pre-transit", "wording": "LABEL CREATED", "language": "en", "stage": "registered", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
9
+ { "wording": "MANIFEST DATA RECEIVED", "language": "en", "stage": "registered", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "Seen without a usable status code." },
10
+ { "code": "transit", "wording": "EN ROUTE TO DHL ECOMMERCE OR AWAITING PROCESSING", "language": "en", "stage": "registered", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "Announced by the sender; the transit code would overstate progress." },
11
+ { "code": "transit", "wording": "PACKAGE RECEIVED AT DHL ECOMMERCE DISTRIBUTION CENTER", "language": "en", "stage": "accepted", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
12
+ { "wording": "Picked up at parcelshop", "language": "en", "stage": "accepted", "confirmedBy": "prior-art", "firstSeen": "2026-09-12", "note": "Sender-side drop-off (ha-dhl-nl#15): the parcel enters the network, it does not await collection." },
13
+ { "code": "transit", "wording": "CLOSE BAG", "language": "en", "stage": "in_transit", "confirmedBy": "prior-art", "firstSeen": "2026-09-12", "note": "Also SCANNED INTO SACK/CONTAINER." },
14
+ { "code": "transit", "wording": "CUSTOMS CLEARANCE", "language": "en", "stage": "customs", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
15
+ { "code": "transit", "wording": "CUSTOMS CLEARED", "language": "en", "stage": "in_transit", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "Clearance completed leaves customs." },
16
+ { "code": "transit", "wording": "OUT FOR DELIVERY", "language": "en", "stage": "out_for_delivery", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
17
+ { "code": "transit", "wording": "READY FOR COLLECTION", "language": "en", "stage": "ready_for_pickup", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
18
+ { "code": "failure", "wording": "DELIVERY ATTEMPT FAILED", "language": "en", "stage": "failed_attempt", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "" },
19
+ { "wording": "Carrier exception", "language": "en", "stage": "exception", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "Wording rule, checked after the failed-attempt rule. Reclassified to exception 2026-09-12." },
20
+ { "code": "delivered", "wording": "RETURNED TO SENDER", "language": "en", "stage": "returned", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "Also reached through returnFlag with the delivered code." },
21
+ { "code": "delivered", "wording": "DELIVERED - Signed by …", "language": "en", "stage": "delivered", "confirmedBy": "fixture", "firstSeen": "2026-09-12", "note": "The signatory is never retained: a delivered event's description is replaced by \"Delivered\"." }
22
+ ]
23
+ }
@@ -0,0 +1,70 @@
1
+ import type { AdapterFactory } from '../../core/adapter/index.js';
2
+ import { ChallengeError, IndeterminateError, NotFoundError, type CarrierErrorOptions } from '../../core/errors/index.js';
3
+ import type { CarrierResult } from '../../core/result/index.js';
4
+ import type { StepRecorder } from '../../core/telemetry/index.js';
5
+ import { TrawlClient } from '../../core/transport/index.js';
6
+ /** Cloudflare interrupted the consignee page with an interactive challenge. */
7
+ export declare class DPDChallengeError extends ChallengeError {
8
+ constructor(message?: string, options?: CarrierErrorOptions);
9
+ }
10
+ /**
11
+ * The guest API answered, but the answer proves nothing about the shipment
12
+ * (unreachable, malformed, unauthenticated, or an HTTP status the guest flow
13
+ * handles itself). The rendered page is allowed to recover from it.
14
+ */
15
+ export declare class DPDAPIError extends IndeterminateError {
16
+ constructor(message: string, options?: CarrierErrorOptions);
17
+ }
18
+ /** DPD positively reports that it does not know the parcel number. */
19
+ export declare class DPDTrackingError extends NotFoundError {
20
+ constructor(options?: CarrierErrorOptions);
21
+ }
22
+ export declare function dpdTrackingUrl(trackingNumber: string, language?: string): string;
23
+ export declare function parseDPDTrackingApi(payload: unknown, trackingNumber: string, postcodeVerified?: boolean): CarrierResult;
24
+ export declare function parseDPDTrackingHtml(html: string, trackingNumber: string): CarrierResult;
25
+ export interface DPDTrackerOptions {
26
+ timeoutMs?: number;
27
+ /** Whole-lookup budget; defaults to both tiers plus the solver's own allowance. */
28
+ budgetMs?: number;
29
+ /** Legacy configuration seam kept for tests; production passes `trawl`. */
30
+ flaresolverrUrl?: string;
31
+ firebaseApiKey?: string;
32
+ fetcher?: typeof fetch;
33
+ trawl?: TrawlClient | null;
34
+ recorder?: StepRecorder;
35
+ }
36
+ export declare class DPDTracker {
37
+ #private;
38
+ readonly timeoutMs: number;
39
+ readonly budgetMs: number;
40
+ readonly flaresolverrUrl: string;
41
+ readonly firebaseApiKey: string;
42
+ private readonly fetcher?;
43
+ private readonly trawl?;
44
+ private readonly recorder?;
45
+ constructor(options?: DPDTrackerOptions);
46
+ /** The browser service, resolved late so a malformed URL fails the page step, not construction. */
47
+ private browserService;
48
+ fetch(trackingNumber: string, postcode?: string): Promise<CarrierResult>;
49
+ /**
50
+ * Whether DPD knows a 14-digit number, for the host's carrier-detection
51
+ * route, which promotes the number to `dpd` only when this returns true.
52
+ * Guest API only, never the page tier. A positive not-found (404) and a
53
+ * details lookup DPD refuses without the postcode (400, seen for old
54
+ * parcels) are false; any other failure, a 400 from a token step included,
55
+ * stays a failure.
56
+ */
57
+ recognizes(trackingNumber: string): Promise<boolean>;
58
+ private apiFetch;
59
+ private detailsWithFreshToken;
60
+ private parcelDetails;
61
+ private accessToken;
62
+ private refreshAccessToken;
63
+ private fetchBasicToken;
64
+ private firebaseInstallation;
65
+ private firebaseHeaders;
66
+ private requestJson;
67
+ private pageFetch;
68
+ private directGet;
69
+ }
70
+ export declare const adapter: AdapterFactory;