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,58 @@
1
+ {
2
+ "carrier": "landmark-global",
3
+ "records": [
4
+ {
5
+ "number": "LTN480634985",
6
+ "role": "shipment",
7
+ "evidence": "public_shipment_report",
8
+ "source": {
9
+ "url": "https://www.trustpilot.com/reviews/6ab3ef95f2b298d50182689a",
10
+ "date": "2026-09-23"
11
+ },
12
+ "expect": {
13
+ "carrier": "landmark-global",
14
+ "confidence": "high"
15
+ },
16
+ "note": "The anonymous native tracking page identifies this reference as a Landmark parcel."
17
+ },
18
+ {
19
+ "number": "LTN74207623N1",
20
+ "role": "shipment",
21
+ "evidence": "open_source_example",
22
+ "source": {
23
+ "url": "https://github.com/jkeen/tracking_number_data/blob/main/couriers/landmark.json"
24
+ },
25
+ "expect": {
26
+ "carrier": "landmark-global",
27
+ "confidence": "high"
28
+ },
29
+ "note": "Open-source project example, not a real shipment."
30
+ },
31
+ {
32
+ "number": "LTN74209518N1",
33
+ "role": "shipment",
34
+ "evidence": "open_source_example",
35
+ "source": {
36
+ "url": "https://github.com/jkeen/tracking_number_data/blob/main/couriers/landmark.json"
37
+ },
38
+ "expect": {
39
+ "carrier": "landmark-global",
40
+ "confidence": "high"
41
+ },
42
+ "note": "Open-source project example, not a real shipment."
43
+ },
44
+ {
45
+ "number": "LTN74224021N1",
46
+ "role": "shipment",
47
+ "evidence": "open_source_example",
48
+ "source": {
49
+ "url": "https://github.com/jkeen/tracking_number_data/blob/main/couriers/landmark.json"
50
+ },
51
+ "expect": {
52
+ "carrier": "landmark-global",
53
+ "confidence": "high"
54
+ },
55
+ "note": "Open-source project example, not a real shipment."
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,3 @@
1
+ import type { CarrierResult } from '../../core/result/index.js';
2
+ export declare function normalizeLandmarkNumber(raw: string): string;
3
+ export declare function parseLandmark(html: string, rawNumber: string): CarrierResult;
@@ -0,0 +1,78 @@
1
+ import { load } from 'cheerio';
2
+ import { DateTime } from 'luxon';
3
+ import { normalizeTrackingNumber } from '../../core/detection/index.js';
4
+ import { ChallengeError, IndeterminateError, NotFoundError, SchemaError } from '../../core/errors/index.js';
5
+ import { clean } from '../../core/transport/index.js';
6
+ import { landmarkStatus } from './status.js';
7
+ const ABSENT = "We couldn't find a match for this value. Please try a different value.";
8
+ export function normalizeLandmarkNumber(raw) {
9
+ const number = normalizeTrackingNumber(raw);
10
+ if (!/^LTN\d{8,9}(?:N1)?$/.test(number))
11
+ throw new TypeError('Landmark requires an LTN parcel reference');
12
+ return number;
13
+ }
14
+ function clock(raw) {
15
+ const validated = /^\d{4}-\d{2}-\d{2} (?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(raw)
16
+ ? DateTime.fromFormat(raw, 'yyyy-MM-dd HH:mm:ss', { zone: 'UTC' }) : null;
17
+ if (!validated?.isValid)
18
+ return raw ? { provider_time_text: raw } : {};
19
+ return { local_time: validated.toISO({ includeOffset: false, suppressMilliseconds: true }) };
20
+ }
21
+ export function parseLandmark(html, rawNumber) {
22
+ const number = normalizeLandmarkNumber(rawNumber);
23
+ const canonical = number.replace(/N1$/, '');
24
+ const $ = load(html);
25
+ if (/just a moment|verify.*human|captcha/i.test($('title').text()) || $('.g-recaptcha,.h-captcha').length)
26
+ throw new ChallengeError('Landmark Global');
27
+ $('script,style,noscript').remove();
28
+ const identities = $('.delivery-details-col h6').filter((_, node) => clean($(node).text()) === 'Landmark Tracking Number');
29
+ const tables = $('.event-summary .event-table table');
30
+ const errors = $('.error-text').map((_, node) => clean($(node).text())).get().filter(Boolean);
31
+ if (!identities.length && !tables.length && $('#search').length === 1 && $('#search').val() === number
32
+ && errors.length && errors.every(error => error === ABSENT) && $('title').text().trim() === 'Landmark Global | Landmark Tracking')
33
+ throw new NotFoundError('Landmark Global');
34
+ if (identities.length !== 1 || clean(identities.next('div').text()) !== canonical)
35
+ throw new SchemaError('Landmark Global', 'Landmark returned a different or ambiguous parcel');
36
+ if (tables.length !== 1 || tables.find('thead th').map((_, node) => clean($(node).text())).get().join('|') !== 'Description|Date/Time|Location')
37
+ throw new SchemaError('Landmark Global');
38
+ const rows = tables.find('tbody > tr');
39
+ if (!rows.length)
40
+ throw new IndeterminateError('Landmark Global', 'Landmark returned no parcel history');
41
+ if (rows.length > 500)
42
+ throw new SchemaError('Landmark Global', 'Landmark returned excessive parcel history');
43
+ const firstCells = rows.first().children('td');
44
+ const summary = $('.current-status');
45
+ if (summary.length !== 1 || clean(summary.find('h3').text()) !== clean(firstCells.eq(0).text())
46
+ || summary.find('.time').attr('data-time') !== firstCells.eq(1).attr('data-time'))
47
+ throw new IndeterminateError('Landmark Global', 'Landmark latest summary does not match its first scan');
48
+ const events = [];
49
+ const seen = new Set();
50
+ for (const row of rows.toArray()) {
51
+ const cells = $(row).children('td');
52
+ if (cells.length !== 3 || cells.filter('[colspan]').length)
53
+ throw new SchemaError('Landmark Global');
54
+ const wording = clean(cells.eq(0).text(), 500);
55
+ if (!wording)
56
+ throw new SchemaError('Landmark Global', 'Landmark returned an empty scan');
57
+ const mapped = landmarkStatus(wording);
58
+ const event = { ...clock(clean(cells.eq(1).attr('data-time') ?? cells.eq(1).text(), 64)),
59
+ description: mapped?.stage === 'delivered' ? 'Delivered' : wording, location: clean(cells.eq(2).text(), 200),
60
+ ...(mapped ? { stage: mapped.stage } : {}) };
61
+ const key = JSON.stringify(event);
62
+ if (!seen.has(key)) {
63
+ seen.add(key);
64
+ events.push(event);
65
+ }
66
+ }
67
+ const latest = events[0];
68
+ const current = landmarkStatus(clean(firstCells.eq(0).text(), 500));
69
+ const partner = $('.delivery-details-col h6').filter((_, node) => clean($(node).text()) === 'Delivery Partner').next('div');
70
+ const inputs = partner.find('input[name="id"]');
71
+ const partnerNumber = partner.length === 1 && inputs.length === 1 ? clean(inputs.val(), 64).toUpperCase() : '';
72
+ const partnerName = clean(partner.clone().find('form').remove().end().text(), 100);
73
+ return { status: current?.status ?? 'unknown', ...(current ? { current_stage: current.stage } : {}),
74
+ last_status_text: latest.description, last_update: latest.time ?? null, last_update_local: latest.local_time ?? null, expected_delivery: null,
75
+ ...(number !== canonical ? { canonical_tracking_number: canonical } : {}),
76
+ ...(/^[A-Z0-9]{4,40}$/.test(partnerNumber) ? { delivery_tracking_number: partnerNumber,
77
+ ...(partnerName === 'Australia Post' ? { delivery_carrier: 'australia-post' } : {}) } : {}), events: events.slice(0, 100) };
78
+ }
@@ -0,0 +1,2 @@
1
+ import type { ClassifiedStatus } from '../../core/status/index.js';
2
+ export declare function landmarkStatus(wording: string): ClassifiedStatus | undefined;
@@ -0,0 +1,13 @@
1
+ const WORDINGS = new Map([
2
+ ['Delivered', { status: 'delivered', stage: 'delivered' }],
3
+ ['Delivered to your community mailbox, parcel locker or apt./condo mailbox', { status: 'delivered', stage: 'delivered' }],
4
+ ...['Onboard for delivery', 'Item out for delivery'].map(wording => [wording, { status: 'out_for_delivery', stage: 'out_for_delivery' }]),
5
+ ['Shipment Data Uploaded', { status: 'pending', stage: 'registered' }],
6
+ ['Transmitted customs information', { status: 'in_transit', stage: 'customs' }],
7
+ ...['Customs cleared', 'Item processed at facility', 'Item processed', 'Received in destination country',
8
+ 'Crossing border and in transit to carrier hub', 'Scanned at Landmark crossdock facility', 'Processed',
9
+ 'Shipment received at originating postal facility', 'Departure to country of destination', 'Shipment has arrived at depot',
10
+ 'Received at international processing center', 'Incoming scan at facility', 'Shipment has departed from airport',
11
+ 'Shipment has departed from depot'].map(wording => [wording, { status: 'in_transit', stage: 'in_transit' }]),
12
+ ]);
13
+ export function landmarkStatus(wording) { return WORDINGS.get(wording); }
@@ -0,0 +1,125 @@
1
+ {
2
+ "carrier": "landmark-global",
3
+ "entries": [
4
+ {
5
+ "wording": "Delivered",
6
+ "language": "en",
7
+ "stage": "delivered",
8
+ "confirmedBy": "live"
9
+ },
10
+ {
11
+ "wording": "Delivered to your community mailbox, parcel locker or apt./condo mailbox",
12
+ "language": "en",
13
+ "stage": "delivered",
14
+ "confirmedBy": "live"
15
+ },
16
+ {
17
+ "wording": "Onboard for delivery",
18
+ "language": "en",
19
+ "stage": "out_for_delivery",
20
+ "confirmedBy": "live"
21
+ },
22
+ {
23
+ "wording": "Item out for delivery",
24
+ "language": "en",
25
+ "stage": "out_for_delivery",
26
+ "confirmedBy": "live"
27
+ },
28
+ {
29
+ "wording": "Shipment Data Uploaded",
30
+ "language": "en",
31
+ "stage": "registered",
32
+ "confirmedBy": "live"
33
+ },
34
+ {
35
+ "wording": "Transmitted customs information",
36
+ "language": "en",
37
+ "stage": "customs",
38
+ "confirmedBy": "live"
39
+ },
40
+ {
41
+ "wording": "Customs cleared",
42
+ "language": "en",
43
+ "stage": "in_transit",
44
+ "confirmedBy": "live"
45
+ },
46
+ {
47
+ "wording": "Item processed at facility",
48
+ "language": "en",
49
+ "stage": "in_transit",
50
+ "confirmedBy": "live"
51
+ },
52
+ {
53
+ "wording": "Item processed",
54
+ "language": "en",
55
+ "stage": "in_transit",
56
+ "confirmedBy": "live"
57
+ },
58
+ {
59
+ "wording": "Received in destination country",
60
+ "language": "en",
61
+ "stage": "in_transit",
62
+ "confirmedBy": "live"
63
+ },
64
+ {
65
+ "wording": "Crossing border and in transit to carrier hub",
66
+ "language": "en",
67
+ "stage": "in_transit",
68
+ "confirmedBy": "live"
69
+ },
70
+ {
71
+ "wording": "Scanned at Landmark crossdock facility",
72
+ "language": "en",
73
+ "stage": "in_transit",
74
+ "confirmedBy": "live"
75
+ },
76
+ {
77
+ "wording": "Processed",
78
+ "language": "en",
79
+ "stage": "in_transit",
80
+ "confirmedBy": "live"
81
+ },
82
+ {
83
+ "wording": "Shipment received at originating postal facility",
84
+ "language": "en",
85
+ "stage": "in_transit",
86
+ "confirmedBy": "live"
87
+ },
88
+ {
89
+ "wording": "Departure to country of destination",
90
+ "language": "en",
91
+ "stage": "in_transit",
92
+ "confirmedBy": "live"
93
+ },
94
+ {
95
+ "wording": "Shipment has arrived at depot",
96
+ "language": "en",
97
+ "stage": "in_transit",
98
+ "confirmedBy": "live"
99
+ },
100
+ {
101
+ "wording": "Received at international processing center",
102
+ "language": "en",
103
+ "stage": "in_transit",
104
+ "confirmedBy": "live"
105
+ },
106
+ {
107
+ "wording": "Incoming scan at facility",
108
+ "language": "en",
109
+ "stage": "in_transit",
110
+ "confirmedBy": "live"
111
+ },
112
+ {
113
+ "wording": "Shipment has departed from airport",
114
+ "language": "en",
115
+ "stage": "in_transit",
116
+ "confirmedBy": "live"
117
+ },
118
+ {
119
+ "wording": "Shipment has departed from depot",
120
+ "language": "en",
121
+ "stage": "in_transit",
122
+ "confirmedBy": "live"
123
+ }
124
+ ]
125
+ }
@@ -0,0 +1,32 @@
1
+ import type { AdapterFactory } from '../../core/adapter/index.js';
2
+ import type { CarrierResult } from '../../core/result/index.js';
3
+ import { type StepRecorder } from '../../core/telemetry/index.js';
4
+ import { TrawlClient } from '../../core/transport/index.js';
5
+ interface MondialRelayCredential {
6
+ shipment: string;
7
+ postcode: string;
8
+ canonicalShipment?: string;
9
+ }
10
+ export declare function normalizeMondialRelayCredential(rawShipment: string, rawPostcode?: string): MondialRelayCredential;
11
+ export declare function mondialRelayTrackingUrl(rawShipment: string, rawPostcode?: string): string;
12
+ export declare function parseMondialRelayTrackingResponse(payload: unknown, rawShipment: string, rawPostcode?: string): CarrierResult;
13
+ export interface MondialRelayTrackerOptions {
14
+ timeoutMs?: number;
15
+ directTimeoutMs?: number;
16
+ /** Legacy configuration seam; `trawl` is preferred. */
17
+ trawlUrl?: string;
18
+ /** The browser service, or null when none is configured. */
19
+ trawl?: TrawlClient | null;
20
+ fetcher?: typeof fetch;
21
+ recorder?: StepRecorder;
22
+ }
23
+ export declare class MondialRelayTracker {
24
+ #private;
25
+ readonly timeoutMs: number;
26
+ readonly directTimeoutMs: number;
27
+ readonly trawlUrl: string;
28
+ constructor(options?: MondialRelayTrackerOptions);
29
+ fetch(rawShipment: string, rawPostcode?: string): Promise<CarrierResult>;
30
+ }
31
+ export declare const adapter: AdapterFactory;
32
+ export {};
@@ -0,0 +1,352 @@
1
+ import { load } from 'cheerio';
2
+ import { DateTime } from 'luxon';
3
+ import { isValidMondialRelayBarcode } from '../../core/detection/index.js';
4
+ import { ChallengeError, InputRequiredError, NotFoundError, SchemaError } from '../../core/errors/index.js';
5
+ import { runSteps, singleFlight } from '../../core/runner/index.js';
6
+ import { NOOP_RECORDER } from '../../core/telemetry/index.js';
7
+ import { isoTime, zonedTime } from '../../core/time/index.js';
8
+ import { cleanScalar, TrawlClient, trawlBody } from '../../core/transport/index.js';
9
+ import { isRecord } from '../../core/types.js';
10
+ import { classifyStatus, milestoneNumberStatus } from './status.js';
11
+ // Protocol provenance (inspected 2026-08-30):
12
+ // https://www.mondialrelay.fr/versioned-assets/2nMAiuVI9Rv9J3kZacblPYCfCABwzS-qZ3m7eFBQn4A/Scripts/vue/tracking/js/app.js
13
+ // SHA-256: da73008ae548f51bfd27791969c6e53d809f080070cd2faa6779bb7850509f80
14
+ // The current official bundle reads the server-rendered `token` attribute from
15
+ // #tracking and sends it as RequestVerificationToken to GET /api/tracking.
16
+ // Mondial Relay's current CONNECT guide documents 8-, 10-, and 12-digit IDs:
17
+ // https://www.mondialrelay.fr/media/124728/fr-documentation-utilisateur-connect-v-12.pdf
18
+ const TRACKING_PAGE = 'https://www.mondialrelay.fr/suivi-de-colis/';
19
+ const TRACKING_API = 'https://www.mondialrelay.fr/api/tracking';
20
+ const MAX_DIRECT_BYTES = 2_000_000;
21
+ const MAX_TRAWL_BYTES = 10_000_000;
22
+ const DEFAULT_TIMEOUT_MS = 90_000;
23
+ const DEFAULT_DIRECT_TIMEOUT_MS = 20_000;
24
+ const ZONE = 'Europe/Paris';
25
+ const CREDENTIAL_MESSAGE = 'Mondial Relay tracking requires an 8-, 10-, or 12-digit shipment number followed by '
26
+ + 'the 5-digit recipient postcode';
27
+ /** Strip the markup Mondial Relay embeds in its labels, entities included. */
28
+ function plainText(value, limit = 500) {
29
+ if (typeof value !== 'string' && typeof value !== 'number')
30
+ return '';
31
+ const raw = String(value).slice(0, Math.max(limit * 10, 5_000));
32
+ return cleanScalar(load(raw).text(), limit);
33
+ }
34
+ function plausibleFrenchPostcode(value) {
35
+ return /^(?:0[1-9]|[1-8]\d|9[0-5]|97|98)\d{3}$/.test(value);
36
+ }
37
+ export function normalizeMondialRelayCredential(rawShipment, rawPostcode = '') {
38
+ let shipment = rawShipment.trim().replace(/[\s.-]/g, '');
39
+ let postcode = rawPostcode.trim();
40
+ if (/^\d{26}$/.test(shipment)) {
41
+ if (!isValidMondialRelayBarcode(shipment) || (postcode && !plausibleFrenchPostcode(postcode))) {
42
+ throw new SchemaError('Mondial Relay', 'Invalid Mondial Relay barcode or postcode');
43
+ }
44
+ // The public alias carries brand/shipment/parcel sequence, not a postcode.
45
+ return { shipment: shipment.slice(0, 12), postcode, canonicalShipment: shipment.slice(2, 10) };
46
+ }
47
+ if (!postcode && /^(?:\d{13}|\d{15}|\d{17})$/.test(shipment)) {
48
+ postcode = shipment.slice(-5);
49
+ shipment = shipment.slice(0, -5);
50
+ }
51
+ const shapedShipment = /^(?:\d{8}|\d{10}|\d{12})$/.test(shipment);
52
+ if (!shapedShipment || !plausibleFrenchPostcode(postcode)) {
53
+ // A well-shaped number without a usable postcode is a missing credential;
54
+ // anything else is a number this carrier cannot address at all.
55
+ throw shapedShipment
56
+ ? new InputRequiredError('Mondial Relay', 'the recipient postcode', CREDENTIAL_MESSAGE)
57
+ : new SchemaError('Mondial Relay', CREDENTIAL_MESSAGE);
58
+ }
59
+ // The longer forms put the 2-digit brand before the 8-digit shipment (the
60
+ // 12-digit one adds the parcel sequence), and the API echoes the shipment.
61
+ return shipment.length > 8
62
+ ? { shipment, postcode, canonicalShipment: shipment.slice(2, 10) }
63
+ : { shipment, postcode };
64
+ }
65
+ export function mondialRelayTrackingUrl(rawShipment, rawPostcode = '') {
66
+ const credential = normalizeMondialRelayCredential(rawShipment, rawPostcode);
67
+ const url = new URL(TRACKING_PAGE);
68
+ url.searchParams.set('numeroExpedition', credential.shipment);
69
+ return url.toString();
70
+ }
71
+ function trackingApiUrl(credential, brand = '') {
72
+ const url = new URL(TRACKING_API);
73
+ url.searchParams.set('shipment', credential.shipment);
74
+ url.searchParams.set('postcode', credential.postcode);
75
+ url.searchParams.set('brand', brand);
76
+ url.searchParams.set('codePays', 'fr');
77
+ return url.toString();
78
+ }
79
+ function verificationToken(html) {
80
+ const $ = load(html);
81
+ const token = cleanScalar($('#tracking').first().attr('token'), 4_096);
82
+ if (!/^[A-Za-z0-9:_-]{20,4096}$/.test(token)) {
83
+ throw new ChallengeError('Mondial Relay', 'Mondial Relay did not issue a request token');
84
+ }
85
+ return token;
86
+ }
87
+ /**
88
+ * An event timestamp. Mondial Relay sends offset-less Paris wall-clock time in
89
+ * several shapes; a bare calendar day is kept as a day, because stamping
90
+ * midnight on it would invent a precision the provider did not give.
91
+ */
92
+ function eventTime(value) {
93
+ const raw = cleanScalar(value, 64);
94
+ if (!raw)
95
+ return null;
96
+ if (/^\d{4}-\d{2}-\d{2}$/.test(raw)) {
97
+ const day = isoTime(raw, ZONE);
98
+ return day ? { iso: raw, timestamp: day.timestamp } : null;
99
+ }
100
+ return isoTime(raw, ZONE)
101
+ ?? zonedTime(raw, 'dd/MM/yyyy HH:mm:ss', ZONE)
102
+ ?? zonedTime(raw, 'dd/MM/yyyy HH:mm', ZONE)
103
+ ?? zonedTime(raw, 'dd/MM/yyyy', ZONE);
104
+ }
105
+ /**
106
+ * The delivery estimate, reduced to its calendar day. None of the core time
107
+ * policies fits: they all return an instant, and the estimate is read in Paris
108
+ * even when it carries an offset, as the provider sends it offset-less.
109
+ */
110
+ function expectedDelivery(value) {
111
+ const raw = cleanScalar(value, 64);
112
+ if (!raw || raw.startsWith('0001-01-01'))
113
+ return null;
114
+ const date = DateTime.fromISO(raw, { zone: ZONE });
115
+ return date.isValid ? date.toISODate() : null;
116
+ }
117
+ function parseEvents(expedition) {
118
+ if (!Array.isArray(expedition.Evenements))
119
+ return [];
120
+ const parsed = [];
121
+ const seen = new Set();
122
+ expedition.Evenements.forEach((rawEvent, index) => {
123
+ if (!isRecord(rawEvent))
124
+ return;
125
+ const time = eventTime(rawEvent.Date);
126
+ const description = plainText(rawEvent.Libelle);
127
+ if (!time || !description)
128
+ return;
129
+ const identity = JSON.stringify([time.iso, description]);
130
+ if (seen.has(identity))
131
+ return;
132
+ seen.add(identity);
133
+ const classified = classifyStatus(description);
134
+ parsed.push({
135
+ event: {
136
+ time: time.iso,
137
+ location: '',
138
+ description,
139
+ stage: classified.stage,
140
+ },
141
+ classified,
142
+ timestamp: time.timestamp,
143
+ index,
144
+ });
145
+ });
146
+ parsed.sort((left, right) => right.timestamp - left.timestamp || left.index - right.index);
147
+ return parsed.slice(0, 100);
148
+ }
149
+ function milestoneStatus(expedition) {
150
+ if (!isRecord(expedition.SuiviParEtapes))
151
+ return null;
152
+ const reached = [];
153
+ for (const raw of Object.values(expedition.SuiviParEtapes)) {
154
+ if (!isRecord(raw) || !isRecord(raw.Evenement) || !cleanScalar(raw.Evenement.Date, 64))
155
+ continue;
156
+ const number = Number(raw.Numero);
157
+ const classified = classifyStatus(plainText(raw.Libelle));
158
+ if (Number.isFinite(number))
159
+ reached.push({ number, status: classified });
160
+ }
161
+ reached.sort((left, right) => right.number - left.number);
162
+ const latest = reached[0];
163
+ if (!latest)
164
+ return null;
165
+ if (latest.status.status !== 'unknown')
166
+ return latest.status;
167
+ return milestoneNumberStatus(latest.number);
168
+ }
169
+ export function parseMondialRelayTrackingResponse(payload, rawShipment, rawPostcode = '') {
170
+ return parseTrackingResponse(payload, normalizeMondialRelayCredential(rawShipment, rawPostcode));
171
+ }
172
+ function parseTrackingResponse(payload, credential) {
173
+ if (!isRecord(payload))
174
+ throw new SchemaError('Mondial Relay');
175
+ if (!isRecord(payload.Expedition)) {
176
+ const warning = Array.isArray(payload.status)
177
+ && payload.status.some((entry) => isRecord(entry) && cleanScalar(entry.state, 32) === 'warn');
178
+ // The provider echoes the query in that warning; only the fact is kept.
179
+ if (warning || Array.isArray(payload.FiltresRecherche))
180
+ throw new NotFoundError('Mondial Relay');
181
+ throw new SchemaError('Mondial Relay', 'Mondial Relay returned incomplete tracking details');
182
+ }
183
+ const expedition = payload.Expedition;
184
+ const returnedShipment = cleanScalar(expedition.Numero, 32).replace(/\s/g, '');
185
+ if (!/^(?:\d{8}|\d{10}|\d{12})$/.test(returnedShipment)) {
186
+ throw new SchemaError('Mondial Relay', 'Mondial Relay returned an invalid shipment number');
187
+ }
188
+ if (returnedShipment !== credential.shipment && returnedShipment !== credential.canonicalShipment) {
189
+ throw new SchemaError('Mondial Relay', 'Mondial Relay returned a different shipment');
190
+ }
191
+ const parsedEvents = parseEvents(expedition);
192
+ const events = parsedEvents.map(({ event }) => event);
193
+ const contextual = plainText(expedition.SuiviContextuel);
194
+ const statusText = contextual || events[0]?.description || 'Tracking information received';
195
+ const contextualStatus = classifyStatus(statusText);
196
+ const current = contextualStatus.status !== 'unknown'
197
+ ? contextualStatus
198
+ : parsedEvents.find((event) => event.classified.status !== 'unknown')?.classified
199
+ ?? milestoneStatus(expedition);
200
+ const status = current?.status ?? 'unknown';
201
+ return {
202
+ status,
203
+ // The status vocabulary has no pickup value; without the stage the sync
204
+ // would re-read the headline and fall back to "out for delivery".
205
+ ...(current ? { current_stage: current.stage } : {}),
206
+ last_status_text: statusText,
207
+ last_update: events[0]?.time ?? null,
208
+ expected_delivery: ['delivered', 'exception'].includes(status)
209
+ ? null
210
+ : expectedDelivery(expedition.EstimatedDeliveryDate),
211
+ timezone: ZONE,
212
+ events,
213
+ source: 'mondial_relay_public_web',
214
+ };
215
+ }
216
+ /**
217
+ * The page the browser actually loaded. Mondial Relay's Vue app replaces the
218
+ * `#tracking` root as soon as it boots, so the captured response body carries
219
+ * the server-rendered token that the rendered HTML no longer has.
220
+ */
221
+ function originalTrawlPage(response) {
222
+ const body = trawlBody(response.raw, MAX_DIRECT_BYTES);
223
+ return body.includes('id="tracking"') || body.includes("id='tracking'") ? body : response.html;
224
+ }
225
+ function trawlJson(response) {
226
+ const candidates = [trawlBody(response.raw, MAX_DIRECT_BYTES)];
227
+ const $ = load(response.html);
228
+ candidates.push($('pre').first().text(), $('body').text(), response.html);
229
+ for (const candidate of candidates) {
230
+ const cleaned = candidate.trim().replace(/^/, '');
231
+ if (!cleaned)
232
+ continue;
233
+ try {
234
+ return JSON.parse(cleaned);
235
+ }
236
+ catch {
237
+ // Try the next representation. Browser navigations wrap JSON in a <pre>.
238
+ }
239
+ }
240
+ throw new SchemaError('Mondial Relay', 'Mondial Relay browser fallback returned invalid tracking data');
241
+ }
242
+ function assertTrawlTarget(response, expectedUrl) {
243
+ const returned = cleanScalar(response.url, 2_048);
244
+ if (!returned)
245
+ return;
246
+ let actual;
247
+ let expected;
248
+ try {
249
+ actual = new URL(returned);
250
+ expected = new URL(expectedUrl);
251
+ }
252
+ catch (error) {
253
+ throw new SchemaError('Mondial Relay', 'Mondial Relay browser fallback returned an invalid URL', { cause: error });
254
+ }
255
+ if (actual.origin !== expected.origin
256
+ || actual.pathname !== expected.pathname
257
+ || actual.searchParams.get('shipment') !== expected.searchParams.get('shipment')
258
+ || actual.searchParams.get('postcode') !== expected.searchParams.get('postcode')) {
259
+ throw new SchemaError('Mondial Relay', 'Mondial Relay browser fallback returned a different shipment');
260
+ }
261
+ }
262
+ export class MondialRelayTracker {
263
+ timeoutMs;
264
+ directTimeoutMs;
265
+ trawlUrl;
266
+ #trawl;
267
+ #fetcher;
268
+ #recorder;
269
+ #serialize = singleFlight();
270
+ constructor(options = {}) {
271
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
272
+ this.directTimeoutMs = Math.max(1_000, Math.min(this.timeoutMs, options.directTimeoutMs ?? DEFAULT_DIRECT_TIMEOUT_MS));
273
+ this.trawlUrl = (options.trawlUrl ?? '').trim();
274
+ this.#trawl = options.trawl;
275
+ this.#fetcher = options.fetcher;
276
+ this.#recorder = options.recorder ?? NOOP_RECORDER;
277
+ if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {
278
+ throw new TypeError('Mondial Relay timeout must be positive');
279
+ }
280
+ }
281
+ /** The injected browser service, or one built from the configured URL. */
282
+ #browserService() {
283
+ if (this.#trawl !== undefined)
284
+ return this.#trawl;
285
+ return this.trawlUrl ? new TrawlClient(this.trawlUrl, this.#fetcher) : null;
286
+ }
287
+ async fetch(rawShipment, rawPostcode = '') {
288
+ // One lookup at a time: the page token and the API call have to stay on the
289
+ // same solved browser identity.
290
+ return this.#serialize(() => this.#lookup(normalizeMondialRelayCredential(rawShipment, rawPostcode)));
291
+ }
292
+ async #lookup(credential) {
293
+ // Cloudflare blocks every non-browser client with an HTTP 403 WAF block
294
+ // (verified from multiple networks, 2026-09-10), so a direct attempt only
295
+ // burns time and reports a fallback on each sync. There is one step, and
296
+ // it is the browser.
297
+ const trawl = this.#browserService();
298
+ if (!trawl) {
299
+ throw new ChallengeError('Mondial Relay', 'Mondial Relay challenged direct tracking; configure FLARESOLVERR_URL for browser fallback');
300
+ }
301
+ return runSteps({
302
+ carrier: 'mondial-relay', budgetMs: this.timeoutMs, recorder: this.#recorder,
303
+ }, [
304
+ { id: 'trawl', run: () => this.#trawlResult(trawl, credential) },
305
+ ]);
306
+ }
307
+ async #trawlResult(trawl, credential) {
308
+ const bootstrap = await this.#scrape(trawl, { url: TRACKING_PAGE });
309
+ const token = verificationToken(originalTrawlPage(bootstrap));
310
+ const apiUrl = trackingApiUrl(credential);
311
+ const tracked = await this.#scrape(trawl, {
312
+ url: apiUrl,
313
+ headers: {
314
+ Accept: 'application/json, text/plain, */*',
315
+ 'Accept-Language': 'fr-FR,fr;q=0.9',
316
+ Referer: TRACKING_PAGE,
317
+ RequestVerificationToken: token,
318
+ },
319
+ });
320
+ assertTrawlTarget(tracked, apiUrl);
321
+ return this.#finish(trawlJson(tracked), credential, 'browser-session-response');
322
+ }
323
+ #scrape(trawl, request) {
324
+ return trawl.scrape({ skipHttp: true, maxTier: 3, maxTimeout: this.timeoutMs, ...request }, {
325
+ provider: 'TRAWL while fetching Mondial Relay',
326
+ timeoutMs: this.timeoutMs,
327
+ maxBytes: MAX_TRAWL_BYTES,
328
+ fetcher: this.#fetcher,
329
+ });
330
+ }
331
+ #finish(payload, credential, trackingSource) {
332
+ const result = parseTrackingResponse(payload, credential);
333
+ const url = new URL(TRACKING_PAGE);
334
+ url.searchParams.set('numeroExpedition', credential.shipment);
335
+ result.tracking_url = url.toString();
336
+ result.tracking_source = trackingSource;
337
+ return result;
338
+ }
339
+ }
340
+ export const adapter = (environment) => {
341
+ const tracker = new MondialRelayTracker({
342
+ fetcher: environment.fetcher,
343
+ trawl: environment.trawl,
344
+ recorder: environment.recorder,
345
+ });
346
+ return {
347
+ id: 'mondial-relay',
348
+ // Cloudflare refuses every non-browser client, so there is no direct tier.
349
+ steps: ['trawl'],
350
+ track: (input) => tracker.fetch(input.number, input.postcode ?? ''),
351
+ };
352
+ };