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,23 @@
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 type { TrawlClient } from '../../core/transport/index.js';
5
+ import { ParcelsAppHttpClient } from './http.js';
6
+ export declare const PARCELSAPP_BUDGET_MS = 45000;
7
+ export declare function parseParcelsAppResponse(payload: unknown, trackingNumber: string, html: string, timezone?: string | null): CarrierResult;
8
+ export declare function parseParcelsAppHtml(html: string, trackingNumber: string, timezone?: string | null): CarrierResult;
9
+ export interface ParcelsAppOptions {
10
+ trawl?: TrawlClient | null;
11
+ fetcher?: typeof fetch;
12
+ recorder?: StepRecorder;
13
+ timeoutMs?: number;
14
+ /** Null runs only the existing browser capture tier. */
15
+ httpClient?: ParcelsAppHttpClient | null;
16
+ }
17
+ export declare class ParcelsAppTracker {
18
+ readonly options: ParcelsAppOptions;
19
+ private readonly http;
20
+ constructor(options?: ParcelsAppOptions);
21
+ fetch(trackingNumber: string, budgetMs?: number, postcode?: string | null, timezone?: string | null): Promise<CarrierResult>;
22
+ }
23
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,391 @@
1
+ /**
2
+ * ParcelsApp (parcelsapp.com), a universal aggregator used as the second
3
+ * discovery provider.
4
+ *
5
+ * Transport: a scoped anonymous POST reproduces the public frontend checksum
6
+ * and submits the stored delivery postcode. Browser capture remains recovery
7
+ * for protocol challenges. Numberless direct replies belong to their single
8
+ * POST; captured replies still require the rendered result's identity.
9
+ */
10
+ import { load } from 'cheerio';
11
+ import { DateTime } from 'luxon';
12
+ import timers from 'node:timers/promises';
13
+ import { carrierTimezone } from '../../core/catalog/index.js';
14
+ import { brandTimeZones, carrierIdFromName, carrierNameCountryZone } from '../../core/catalog/hints.js';
15
+ import { carrierErrorKind, ChallengeError, IndeterminateError, InputRequiredError, NoHistoryError, SchemaError, UpstreamHttpError, UpstreamNetworkError } from '../../core/errors/index.js';
16
+ import { runSteps } from '../../core/runner/index.js';
17
+ import { canadaProvinceTimeZone, countryCode, countryTimeZone, mislabeledLocalTime, mislabeledWallTime, regionHasTown, sharedClockZone, timeZoneCountry, usStateTimeZone, } from '../../core/time/index.js';
18
+ import { isRecord } from '../../core/types.js';
19
+ import { capturedBodies, loadCapture } from '../shared/capture.js';
20
+ import { universalCarrierHints } from '../shared/hints.js';
21
+ import { event, isNotice, localEvent, numberOf, result } from '../shared/result.js';
22
+ import { carrierScan, markReturnLeg } from '../shared/scans.js';
23
+ import { PARCELSAPP_API, ParcelsAppHttpClient } from './http.js';
24
+ const SOURCE = 'ParcelsApp';
25
+ const MAX_EVENTS = 1000;
26
+ export const PARCELSAPP_BUDGET_MS = 45_000;
27
+ const DIRECT_BUDGET_MS = 30_000;
28
+ const RETRY_DELAY_MS = 2_000;
29
+ // ParcelsApp's response omits the number. Bind it to the rendered result's
30
+ // tracking-number row, never merely to the input field or the requested URL.
31
+ function parcelsIdentity(html, number) {
32
+ const $ = load(html);
33
+ const rows = $('.tracking-info .parcel .parcel-attributes tr').filter((_, row) => $(row).children('td').first().text().trim() === 'Tracking number');
34
+ return rows.length === 1 && rows.first().children('td').eq(1).text().trim() === number;
35
+ }
36
+ export function parseParcelsAppResponse(payload, trackingNumber, html, timezone = null) {
37
+ if (!parcelsIdentity(html, numberOf(trackingNumber)))
38
+ throw new SchemaError(SOURCE, 'ParcelsApp shipment identity missing');
39
+ return parseHistory(payload, trackingNumber, timezone);
40
+ }
41
+ /**
42
+ * ParcelsApp's `date` is the scan's local clock, labeled as UTC or shifted
43
+ * into an offset of its own: a DPD scan at 14:05+02:00 arrives as
44
+ * "14:05+00:00", a Swiss Post delivery at 11:30 local as "13:30+02:00"
45
+ * (both shapes checked 2026-09-22). Its UTC digits are re-read in the zone
46
+ * of the scan's carrier, else its location's country, else the country the
47
+ * carrier name ends with ("DPD UK"), else, for a scan with no location, the
48
+ * clock that all catalog networks of a bare brand share at that moment ("DPD
49
+ * Group": DPD Switzerland and France), else the zone routing passes for the
50
+ * parcel. Without one it stays as labeled, as it does when the name's
51
+ * country or the parcel's zone meets a location in another country. TNT's
52
+ * international scans stay as labeled too: tnt.com gives them offsets, and
53
+ * ParcelsApp's UTC matches them. So do Asendia USA's, wherever they happened:
54
+ * their dates are the UTC instants of Asendia's A1 feed, and Swiss Post's own
55
+ * scans of the same item agree (checked 2026-09-30).
56
+ */
57
+ function stateCarrierName(payload, state) {
58
+ const carriers = Array.isArray(payload.carriers) ? payload.carriers : [];
59
+ return typeof state.carrier === 'number' ? carriers[state.carrier] : undefined;
60
+ }
61
+ // The names ParcelsApp gives Asendia USA's scans.
62
+ const ASENDIA_USA = /^asendia\s+(?:usa|united\s+states)$/i;
63
+ // Carriers whose ParcelsApp dates are a North American scan's local clock:
64
+ // UPS's own instants, FedEx's own page, UniUni's own feed and Ship24's offsets
65
+ // agree once they are read that way (checked 2026-09-30 on US scans; UPS's
66
+ // also in Germany, the Netherlands and Spain). OnTrac's are UTC and
67
+ // Landmark's keep one clock everywhere, so no other carrier gets this step.
68
+ const LOCAL_CLOCK_CARRIERS = /^(?:ups|fedex|uniuni|uni express|easyship)$/i;
69
+ const UNITED_STATES = /^(?:us|usa|united states(?: of america)?)$/i;
70
+ const POSTAL_CODE = /\s*\b(?:\d{5}(?:-\d{4})?|[A-Z]\d[A-Z] ?\d[A-Z]\d)$/i;
71
+ /**
72
+ * The zone of the US state or Canadian province a location names ("Riverside,
73
+ * CA, US", "Charlotte, NC", "Linden, NJ 07036", "Scranton PA", "Mississauga,
74
+ * ON, CA"). It is `certain` when the location names the country, the code is
75
+ * no country's, or the town lies in that state or province ("Chicago, IL" is
76
+ * not in Israel); "Atlanta, GA" could still be in Gabon.
77
+ */
78
+ function regionClock(location) {
79
+ const parts = location.split(',').map((part) => part.trim()).filter(Boolean);
80
+ const last = parts.at(-1) ?? '';
81
+ // "CA" after a province is Canada; after a town it is California.
82
+ const country = parts.length > 1 && UNITED_STATES.test(last) ? 'US'
83
+ : (parts.length > 1 && /^canada$/i.test(last)) || (parts.length > 2 && /^ca$/i.test(last)) ? 'CA' : null;
84
+ if (country)
85
+ parts.pop();
86
+ if (parts.length > 1 && !parts.at(-1).replace(POSTAL_CODE, ''))
87
+ parts.pop();
88
+ // "Example City, BE, NL": a region, then some other country.
89
+ if (!country && parts.length > 2 && parts.slice(-2).every((part) => /^[A-Z]{2}$/i.test(part)))
90
+ return null;
91
+ const words = (parts.at(-1) ?? '').replace(POSTAL_CODE, '').split(/\s+/);
92
+ const code = parts.length > 1 || words.length > 1 ? words.at(-1) : '';
93
+ const town = parts.length > 1 ? parts.at(-2) : words.slice(0, -1).join(' ');
94
+ const zone = (country === 'CA' ? null : usStateTimeZone(code)) ?? (country === 'US' ? null : canadaProvinceTimeZone(code));
95
+ return zone ? { zone, certain: country !== null || !countryCode(code) || regionHasTown(code, town) } : null;
96
+ }
97
+ /** Where a location puts a scan, for the reply-wide North America check. */
98
+ function placeKind(location) {
99
+ const region = regionClock(location);
100
+ if (region?.certain)
101
+ return 'certain';
102
+ const place = location.split(',').at(-1);
103
+ if (countryTimeZone(place))
104
+ return 'abroad';
105
+ if (region)
106
+ return 'region';
107
+ const country = countryCode(place);
108
+ return country && country !== 'US' && country !== 'CA' ? 'abroad' : null;
109
+ }
110
+ /**
111
+ * The state or province of a North American scan from a carrier whose dates
112
+ * are local clocks. An uncertain one counts only in a reply that is in North
113
+ * America.
114
+ */
115
+ function regionScanZone(name, location, inNorthAmerica) {
116
+ const region = typeof name === 'string' && LOCAL_CLOCK_CARRIERS.test(name.trim()) ? regionClock(location) : null;
117
+ return region && (region.certain || inNorthAmerica) ? region : null;
118
+ }
119
+ function scanZone(payload, state, fallback, number, inNorthAmerica = false) {
120
+ const name = stateCarrierName(payload, state);
121
+ const carrier = typeof name === 'string' ? carrierIdFromName(name) : undefined;
122
+ if (carrier === 'tnt' && /^\d{9}$/.test(number))
123
+ return null;
124
+ if (typeof name === 'string' && ASENDIA_USA.test(name.trim()))
125
+ return null;
126
+ const zone = carrier ? carrierTimezone(carrier) : 'UTC';
127
+ if (zone !== 'UTC')
128
+ return zone;
129
+ const location = typeof state.location === 'string' ? state.location.trim() : '';
130
+ const place = location.split(',').at(-1);
131
+ // A state or province the town confirms beats the country its code also
132
+ // names ("Chicago, IL"); a merely possible one comes after ("Koeln, DE").
133
+ const region = regionScanZone(name, location, inNorthAmerica);
134
+ if (region?.certain)
135
+ return region.zone;
136
+ const located = countryTimeZone(place);
137
+ if (located)
138
+ return located;
139
+ if (region)
140
+ return region.zone;
141
+ // The zones below only guess where the scan was. A location in another
142
+ // country, one with several clocks or none listed ("Example City, CA,
143
+ // United States", "Example City, South Africa"), rules a guess out, and the
144
+ // scan keeps its labeled instant.
145
+ const country = countryCode(place);
146
+ const guess = (candidate) => candidate && (!country || timeZoneCountry(candidate) === country) ? candidate : null;
147
+ if (typeof name !== 'string')
148
+ return guess(fallback);
149
+ const named = guess(carrierNameCountryZone(name));
150
+ if (named)
151
+ return named;
152
+ // A location with no single-clock country ("Toronto, ON", "Chicago, US")
153
+ // can be a network of the brand outside the catalog, on another clock.
154
+ const brand = location ? [] : brandTimeZones(name);
155
+ const wall = brand.length ? mislabeledWallTime(state.date) : null;
156
+ return (wall ? sharedClockZone(brand, wall) : null) ?? guess(fallback);
157
+ }
158
+ /**
159
+ * ParcelsApp relays some carriers' labels twice over, TIPSA's as
160
+ * "ENTREGADOENTREGADO". Only a label made of two identical halves is collapsed.
161
+ */
162
+ function relayedLabel(value) {
163
+ const label = typeof value === 'string' ? value.trim() : '';
164
+ const half = label.length / 2;
165
+ return Number.isInteger(half) && label.slice(0, half) === label.slice(half) ? label.slice(0, half) : label;
166
+ }
167
+ function parseHistory(payload, trackingNumber, timezone = null) {
168
+ if (isRecord(payload) && payload.error === 'RELOAD')
169
+ throw new ChallengeError(SOURCE);
170
+ if (isRecord(payload) && (payload.error === 'NO_DATA' || payload.error === 'NO_TRACKER')) {
171
+ throw new NoHistoryError(SOURCE, 'ParcelsApp has no usable shipment history');
172
+ }
173
+ if (!isRecord(payload) || payload.error || !Array.isArray(payload.states) || payload.states.length > MAX_EVENTS) {
174
+ throw new SchemaError(SOURCE, 'ParcelsApp lookup unavailable');
175
+ }
176
+ const number = numberOf(trackingNumber);
177
+ const events = [];
178
+ const scans = [];
179
+ const scanCarriers = new Set();
180
+ let undated = 0;
181
+ // The reply is in North America when a scan certainly is, or when a scan
182
+ // names a state or province ("Atlanta, GA") and none names another country.
183
+ const kinds = payload.states.flatMap((raw) => isRecord(raw) && typeof raw.location === 'string' && raw.location.trim() ? [placeKind(raw.location)] : []);
184
+ const inNorthAmerica = kinds.includes('certain') || (kinds.includes('region') && !kinds.includes('abroad'));
185
+ const entries = [];
186
+ for (const raw of payload.states) {
187
+ if (!isRecord(raw))
188
+ throw new SchemaError(SOURCE, 'ParcelsApp returned an invalid event');
189
+ if (raw.require_fields || raw.error)
190
+ continue;
191
+ // A state can come without a date (an Asendia Spain leg). It has no place
192
+ // among the dated scans, so it is counted instead of read as the latest.
193
+ if (raw.date == null || raw.date === '') {
194
+ undated++;
195
+ continue;
196
+ }
197
+ const name = stateCarrierName(payload, raw);
198
+ const status = relayedLabel(raw.status);
199
+ const scan = carrierScan(typeof name === 'string' ? carrierIdFromName(name) : undefined, status);
200
+ const zone = scanZone(payload, raw, timezone, number, inNorthAmerica);
201
+ const location = typeof raw.location === 'string' ? raw.location.trim() : '';
202
+ entries.push({ raw, name, scan, wording: scan?.wording ?? status, zone,
203
+ local: zone !== null && zone === regionScanZone(name, location, inNorthAmerica)?.zone });
204
+ }
205
+ // Another carrier's copy of such a scan (Cainiao relaying UniUni's "Delivered"
206
+ // at the same minute, with no place) takes that scan's zone, so the two stay
207
+ // one scan.
208
+ const copyKey = ({ raw, wording }) => {
209
+ const wall = mislabeledWallTime(raw.date);
210
+ const text = wall ? localEvent(raw.date, wording)?.description : undefined;
211
+ return wall && text ? `${wall}|${text}` : '';
212
+ };
213
+ const localClocks = new Map(entries.filter((entry) => entry.local).map((entry) => [copyKey(entry), entry.zone]).filter(([key]) => key));
214
+ for (const entry of entries) {
215
+ const { raw, name, scan } = entry;
216
+ const zone = (localClocks.size && !entry.local ? localClocks.get(copyKey(entry)) : undefined) ?? entry.zone;
217
+ const parsed = localEvent((zone ? mislabeledLocalTime(raw.date, zone)?.iso : undefined) ?? raw.date, entry.wording);
218
+ // Nor has an offset-less date that no zone resolves: a wall time, not an instant.
219
+ if (parsed && !parsed.time) {
220
+ undated++;
221
+ continue;
222
+ }
223
+ if (parsed) {
224
+ events.push(parsed);
225
+ scanCarriers.add(name);
226
+ }
227
+ if (parsed && scan)
228
+ scans.push({ event: Object.assign(parsed, { stage: scan.stage }), scan });
229
+ }
230
+ markReturnLeg(scans);
231
+ if (!events.length) {
232
+ const fields = payload.states.flatMap((raw) => isRecord(raw) && Array.isArray(raw.require_fields) ? raw.require_fields : []);
233
+ if (fields.some((field) => isRecord(field) && field.name === 'zipcode')) {
234
+ throw new InputRequiredError(SOURCE, 'postcode', 'ParcelsApp requires a valid delivery postcode or further recipient information');
235
+ }
236
+ // An empty history is the NO_DATA answer; states that don't parse are not an answer.
237
+ if (!payload.states.length)
238
+ throw new NoHistoryError(SOURCE, 'ParcelsApp has no usable shipment history');
239
+ throw new IndeterminateError(SOURCE, 'No usable tracking events');
240
+ }
241
+ // The carriers ParcelsApp aggregated for this number ("DPD Group"), as
242
+ // discovery hints; routing confirms one with its own adapter before adopting it.
243
+ const services = Array.isArray(payload.services) ? payload.services : [];
244
+ const carriers = Array.isArray(payload.carriers) ? payload.carriers : [];
245
+ const hints = universalCarrierHints([
246
+ ...carriers, ...services.map((service) => isRecord(service) ? service.name : undefined),
247
+ ].slice(0, 20), number);
248
+ // The list also names carriers asked without an answer. When every scan
249
+ // names the same carrier, that carrier is the hint.
250
+ const discovered = hints.discovered_carrier
251
+ ?? (scanCarriers.size === 1 ? universalCarrierHints([...scanCarriers], number).discovered_carrier : undefined);
252
+ return { ...result(events, SOURCE), ...(undated ? { undated_event_count: undated } : {}),
253
+ ...hints, ...(discovered ? { discovered_carrier: discovered } : {}) };
254
+ }
255
+ function browserCanRecover(error) {
256
+ // A slow uncached lookup needs more time on the same API. It has already
257
+ // had one direct retry; a new browser lookup would repeat the work again.
258
+ if (error instanceof UpstreamNetworkError)
259
+ return false;
260
+ // A second lookup cannot repair missing input, rate limiting or an outage.
261
+ if (error instanceof UpstreamHttpError && (error.status === 429 || error.status >= 500))
262
+ return false;
263
+ const kind = carrierErrorKind(error);
264
+ return kind === null || kind === 'challenge' || kind === 'transport' || kind === 'schema';
265
+ }
266
+ export function parseParcelsAppHtml(html, trackingNumber, timezone = null) {
267
+ if (!parcelsIdentity(html, numberOf(trackingNumber)))
268
+ throw new SchemaError(SOURCE, 'ParcelsApp shipment identity missing');
269
+ const $ = load(html);
270
+ const nodes = $('.tracking-info .parcel .events > .event');
271
+ if (nodes.length > MAX_EVENTS)
272
+ throw new SchemaError(SOURCE, 'ParcelsApp returned too many events');
273
+ const events = [];
274
+ // Each scan names its carrier ("DPD Group") under its wording, as the JSON
275
+ // reply's `carriers` index does: the same zone rules then give the same
276
+ // instants, and so the same event ids, whichever tier answered.
277
+ const carriers = [];
278
+ const scans = [];
279
+ let undated = 0;
280
+ nodes.each((_, node) => {
281
+ const row = $(node);
282
+ if (row.find('input, select, form').length)
283
+ return;
284
+ const description = relayedLabel(row.find('.event-content > strong').first().text());
285
+ if (isNotice(description))
286
+ return;
287
+ const date = row.find('.event-time > strong').text().trim();
288
+ const time = row.find('.event-time > span').text().trim();
289
+ // Notice rows ("No information about your package...") render a date with
290
+ // an empty time. Skip them instead of failing the whole history.
291
+ if (!time)
292
+ return;
293
+ const name = row.find('.event-content .carrier').first().text().replace(/\s+/g, ' ').trim();
294
+ if (name && !carriers.includes(name))
295
+ carriers.push(name);
296
+ // The page prints a state without a date as "aN Inv NaN" at "aN:aN":
297
+ // counted, as in the JSON reply.
298
+ if (date.includes('NaN')) {
299
+ undated++;
300
+ return;
301
+ }
302
+ // The English web app renders the UTC digits of its API, which are the
303
+ // scan's local clock.
304
+ const labeled = DateTime.fromFormat(`${date} ${time}`, 'dd LLL yyyy HH:mm', { locale: 'en', zone: 'UTC' });
305
+ if (!labeled.isValid)
306
+ throw new SchemaError(SOURCE, 'ParcelsApp returned an invalid event date');
307
+ const state = { date: labeled.toISO(), ...(name ? { carrier: carriers.indexOf(name) } : {}) };
308
+ const zone = scanZone({ carriers }, state, timezone, numberOf(trackingNumber));
309
+ const scan = carrierScan(name ? carrierIdFromName(name) : undefined, description);
310
+ const parsed = event((zone ? mislabeledLocalTime(state.date, zone)?.iso : undefined) ?? state.date, scan?.wording ?? description);
311
+ if (parsed)
312
+ events.push(parsed);
313
+ if (parsed && scan)
314
+ scans.push({ event: Object.assign(parsed, { stage: scan.stage }), scan });
315
+ });
316
+ markReturnLeg(scans);
317
+ return { ...result(events, SOURCE), ...(undated ? { undated_event_count: undated } : {}),
318
+ ...universalCarrierHints(carriers.slice(0, 20), numberOf(trackingNumber)) };
319
+ }
320
+ export class ParcelsAppTracker {
321
+ options;
322
+ http;
323
+ constructor(options = {}) {
324
+ this.options = options;
325
+ this.http = options.httpClient === undefined ? new ParcelsAppHttpClient(options.fetcher) : options.httpClient;
326
+ }
327
+ async fetch(trackingNumber, budgetMs = this.options.timeoutMs ?? PARCELSAPP_BUDGET_MS, postcode, timezone = null) {
328
+ const number = numberOf(trackingNumber);
329
+ if (!Number.isFinite(budgetMs) || budgetMs < 1)
330
+ throw new TypeError('ParcelsApp timeout must be positive');
331
+ const deadline = performance.now() + budgetMs;
332
+ const request = async (remainingMs) => {
333
+ const payload = await this.http.fetch(number, Math.max(1, Math.min(DIRECT_BUDGET_MS, Math.floor(remainingMs))), postcode);
334
+ // This endpoint returns one shipment per POST, synchronously, with no
335
+ // shared session or polling handle. Each retry keeps its own request
336
+ // binding. Numberless browser captures never get this exemption.
337
+ if (isRecord(payload) && payload.correctId && payload.correctId !== number) {
338
+ throw new SchemaError(SOURCE, 'ParcelsApp returned an unverified tracking alias');
339
+ }
340
+ return { ...parseHistory(payload, number, timezone), tracking_source: 'structured-web-response' };
341
+ };
342
+ return runSteps({ carrier: SOURCE, budgetMs, recorder: this.options.recorder }, [{
343
+ id: 'direct',
344
+ enabled: this.http !== null,
345
+ run: ({ remainingMs }) => request(remainingMs),
346
+ }, {
347
+ id: 'retry',
348
+ enabled: this.http !== null,
349
+ // Uncached carrier aggregation can outlive a timed-out HTTP request.
350
+ // Retry that replayable read once; responses such as NO_DATA, input
351
+ // gates, aliases, challenges and HTTP errors do not qualify.
352
+ recovers: (error) => error instanceof UpstreamNetworkError && deadline - performance.now() > RETRY_DELAY_MS + 1,
353
+ run: async ({ signal }) => {
354
+ await timers.setTimeout(RETRY_DELAY_MS, undefined, { signal });
355
+ signal.throwIfAborted();
356
+ return request(deadline - performance.now());
357
+ },
358
+ }, {
359
+ id: 'trawl',
360
+ enabled: this.options.trawl != null || this.http === null,
361
+ recovers: browserCanRecover,
362
+ run: async ({ remainingMs }) => {
363
+ const capture = {
364
+ source: SOURCE, url: `https://parcelsapp.com/en/tracking/${number}`, apiUrl: PARCELSAPP_API,
365
+ budgetMs: remainingMs, fetcher: this.options.fetcher,
366
+ };
367
+ const page = await loadCapture(this.options.trawl ?? null, capture);
368
+ for (const body of capturedBodies(page, capture)) {
369
+ try {
370
+ return parseParcelsAppResponse(JSON.parse(body), number, page.html, timezone);
371
+ }
372
+ catch {
373
+ // Polling replies, unrelated numbers and demo shipments are not history.
374
+ }
375
+ }
376
+ // The rendered page carries the same history when no body was readable.
377
+ return parseParcelsAppHtml(page.html, number, timezone);
378
+ },
379
+ }]);
380
+ }
381
+ }
382
+ export const adapter = (environment) => {
383
+ const tracker = new ParcelsAppTracker({
384
+ trawl: environment.trawl, fetcher: environment.fetcher, recorder: environment.recorder,
385
+ });
386
+ return {
387
+ id: SOURCE,
388
+ steps: ['direct', 'retry', 'trawl'],
389
+ track: (input, context) => tracker.fetch(input.number, context?.budgetMs, input.postcode, input.timezone ?? null),
390
+ };
391
+ };
@@ -0,0 +1,9 @@
1
+ export declare const PARCELSAPP_API = "https://parcelsapp.com/api/v2/parcels";
2
+ /** MurmurHash2 with the public website's seed, over ASCII protocol data. */
3
+ export declare function parcelsAppChecksum(text: string): number;
4
+ export declare function parcelsAppRequest(trackingNumber: string, postcode?: string | null): URLSearchParams;
5
+ export declare class ParcelsAppHttpClient {
6
+ readonly fetcher?: typeof fetch | undefined;
7
+ constructor(fetcher?: typeof fetch | undefined);
8
+ fetch(trackingNumber: string, timeoutMs: number, postcode?: string | null): Promise<unknown>;
9
+ }
@@ -0,0 +1,67 @@
1
+ import { fetchBounded, parseJsonBytes } from '../../core/transport/index.js';
2
+ import { numberOf } from '../shared/result.js';
3
+ export const PARCELSAPP_API = 'https://parcelsapp.com/api/v2/parcels';
4
+ // Public frontend protocol, verified 2026-09-12. No session or issued secret:
5
+ // packs/js/application-aa19cda6a00923f7e330.js on dvow0vltefbxy.cloudfront.net.
6
+ // The website accepts this fixed telemetry profile, including its documented
7
+ // "undefined" stack fallback. The checksum below binds it to each number.
8
+ const TELEMETRY = '1361x780,1470x830,1280x800,no,MacIntel,Gecko,Mozilla,Netscape,Google Inc.,true,true,'
9
+ + 'Google Inc. (Apple),ANGLE (Apple, ANGLE Metal Renderer: Apple M1, Unspecified Version),true,true,'
10
+ + Buffer.from('parcelsapp.com').toString('base64') + ',' + Buffer.from('undefined').toString('base64');
11
+ /** MurmurHash2 with the public website's seed, over ASCII protocol data. */
12
+ export function parcelsAppChecksum(text) {
13
+ const bytes = Buffer.from(text, 'ascii');
14
+ let hash = 978 ^ bytes.length;
15
+ let offset = 0;
16
+ for (; offset + 4 <= bytes.length; offset += 4) {
17
+ let block = Math.imul(bytes.readUInt32LE(offset), 0x5bd1e995);
18
+ block ^= block >>> 24;
19
+ hash = Math.imul(hash, 0x5bd1e995) ^ Math.imul(block, 0x5bd1e995);
20
+ }
21
+ const remaining = bytes.length - offset;
22
+ if (remaining >= 3)
23
+ hash ^= bytes[offset + 2] << 16;
24
+ if (remaining >= 2)
25
+ hash ^= bytes[offset + 1] << 8;
26
+ if (remaining >= 1)
27
+ hash = Math.imul(hash ^ bytes[offset], 0x5bd1e995);
28
+ hash ^= hash >>> 13;
29
+ hash = Math.imul(hash, 0x5bd1e995);
30
+ return (hash ^ hash >>> 15) >>> 0;
31
+ }
32
+ export function parcelsAppRequest(trackingNumber, postcode) {
33
+ const number = numberOf(trackingNumber);
34
+ // The bundle shifts ASCII by 2 * sum([1,2,8,4,5,6,7,5]) modulo 126,
35
+ // URI-encodes it, then lets jQuery form-encode it a second time.
36
+ const shifted = [...number].map((char) => String.fromCharCode((char.charCodeAt(0) + 76) % 126)).join('');
37
+ const params = new URLSearchParams({
38
+ trackingId: encodeURIComponent(shifted), carrier: 'Auto-Detect', language: 'en', country: 'Unknown',
39
+ platform: 'web-desktop', wd: 'false', c: 'true', p: '5', l: '3',
40
+ se: `${TELEMETRY},${TELEMETRY.length},${number.length},${parcelsAppChecksum(encodeURIComponent(number) + TELEMETRY)}`,
41
+ });
42
+ const zipcode = postcode?.trim();
43
+ if (zipcode)
44
+ params.set('extra[zipcode]', zipcode);
45
+ return params;
46
+ }
47
+ export class ParcelsAppHttpClient {
48
+ fetcher;
49
+ constructor(fetcher) {
50
+ this.fetcher = fetcher;
51
+ }
52
+ async fetch(trackingNumber, timeoutMs, postcode) {
53
+ const number = numberOf(trackingNumber);
54
+ if (!Number.isFinite(timeoutMs) || timeoutMs < 1)
55
+ throw new TypeError('ParcelsApp HTTP timeout must be positive');
56
+ const { bytes } = await fetchBounded(PARCELSAPP_API, {
57
+ method: 'POST',
58
+ headers: {
59
+ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
60
+ Origin: 'https://parcelsapp.com', Referer: `https://parcelsapp.com/en/tracking/${number}`,
61
+ 'X-Requested-With': 'XMLHttpRequest',
62
+ },
63
+ body: parcelsAppRequest(number, postcode),
64
+ }, { provider: 'ParcelsApp', fetcher: this.fetcher, timeoutMs: Math.floor(timeoutMs), maxBytes: 2_000_000 });
65
+ return parseJsonBytes(bytes, 'ParcelsApp');
66
+ }
67
+ }
@@ -0,0 +1,38 @@
1
+ import { type CoverageTier } from './coverage.js';
2
+ import type { UniversalSource as Source } from './types.js';
3
+ export declare const UNIVERSAL_SOURCES: Source[];
4
+ /** Providers reached only through the browser service: slower, and sharing one TRAWL. */
5
+ export declare const BROWSER_SOURCES: ReadonlySet<Source>;
6
+ /** Lookup time reserved by the chain and host router, before transport allowance. */
7
+ export declare function universalSourceBudget(source: Source): number;
8
+ /** Evidence-based exception to affinity/rotation, shared by discovery and routing. */
9
+ export declare function priorityUniversalSource(trackingNumber?: string): Source | undefined;
10
+ export interface UniversalPlan {
11
+ /** The eligible providers, in the order to ask them. */
12
+ sources: Source[];
13
+ /** The carrier whose coverage evidence ordered them, or null for the default order. */
14
+ carrier: string | null;
15
+ /** A provider's coverage tier for that carrier; `unknown` without evidence. */
16
+ tier(source: Source): CoverageTier;
17
+ /** Lower is fuller history for the carrier; providers without evidence share one rank. */
18
+ rank(source: Source): number;
19
+ }
20
+ /**
21
+ * Orders providers (given in the default order) by a carrier's coverage tiers:
22
+ * fuller history first, HTTP before the browser service, then the default order.
23
+ * Excluded providers are left out unless nothing else would remain. UPU stays
24
+ * last whatever its evidence: sparse, never a preferred source.
25
+ */
26
+ export declare function orderUniversalSources(eligible: readonly Source[], tiers: Partial<Record<Source, CoverageTier>> | null): Source[];
27
+ /**
28
+ * The providers to ask for a number, ordered by the coverage evidence of the
29
+ * first of `carriers` that has some (the carrier the lookup is for, then the one
30
+ * confirmed or discovered for the number), otherwise in the default order.
31
+ */
32
+ export declare function universalPlan(options?: {
33
+ carriers?: ReadonlyArray<string | null | undefined>;
34
+ trackingNumber?: string;
35
+ enablePostalNinja?: boolean;
36
+ }): UniversalPlan;
37
+ /** The default order for a number, without a carrier's evidence. */
38
+ export declare function universalSources(enablePostalNinja?: boolean, trackingNumber?: string): Source[];
@@ -0,0 +1,54 @@
1
+ import { isValidS10TrackingNumber } from '../core/detection/s10.js';
2
+ import { normalizeTrackingNumber } from '../core/detection/normalize.js';
3
+ import { coverageTiers } from './coverage.js';
4
+ export const UNIVERSAL_SOURCES = ['ParcelsApp', 'Ship24', '17TRACK', 'UPU'];
5
+ /** Providers reached only through the browser service: slower, and sharing one TRAWL. */
6
+ export const BROWSER_SOURCES = new Set(['17TRACK', 'Postal Ninja']);
7
+ /** Lookup time reserved by the chain and host router, before transport allowance. */
8
+ export function universalSourceBudget(source) {
9
+ return source === 'ParcelsApp' ? 45_000 : source === 'UPU' ? 8_000 : 30_000;
10
+ }
11
+ /** Evidence-based exception to affinity/rotation, shared by discovery and routing. */
12
+ export function priorityUniversalSource(trackingNumber) {
13
+ // E-series and untested formats keep ordinary discovery.
14
+ return trackingNumber && /^[CL][A-Z]\d{9}CN$/.test(normalizeTrackingNumber(trackingNumber)) && isValidS10TrackingNumber(trackingNumber)
15
+ ? '17TRACK' : undefined;
16
+ }
17
+ const TIER_RANK = { full: 0, partial: 1, unknown: 2, empty: 3, excluded: 4 };
18
+ const tierRank = (tiers, source) => TIER_RANK[source === 'UPU' ? 'unknown' : tiers?.[source] ?? 'unknown'];
19
+ /**
20
+ * Orders providers (given in the default order) by a carrier's coverage tiers:
21
+ * fuller history first, HTTP before the browser service, then the default order.
22
+ * Excluded providers are left out unless nothing else would remain. UPU stays
23
+ * last whatever its evidence: sparse, never a preferred source.
24
+ */
25
+ export function orderUniversalSources(eligible, tiers) {
26
+ const excluded = (source) => source !== 'UPU' && tiers?.[source] === 'excluded';
27
+ const usable = eligible.some((source) => source !== 'UPU' && !excluded(source)) ? eligible.filter((source) => !excluded(source)) : [...eligible];
28
+ return usable.sort((a, b) => Number(a === 'UPU') - Number(b === 'UPU') || tierRank(tiers, a) - tierRank(tiers, b)
29
+ || Number(BROWSER_SOURCES.has(a)) - Number(BROWSER_SOURCES.has(b)) || eligible.indexOf(a) - eligible.indexOf(b));
30
+ }
31
+ /**
32
+ * The providers to ask for a number, ordered by the coverage evidence of the
33
+ * first of `carriers` that has some (the carrier the lookup is for, then the one
34
+ * confirmed or discovered for the number), otherwise in the default order.
35
+ */
36
+ export function universalPlan(options = {}) {
37
+ const { trackingNumber, enablePostalNinja = false } = options;
38
+ const defaults = enablePostalNinja ? ['ParcelsApp', 'Ship24', 'Postal Ninja', '17TRACK', 'UPU'] : [...UNIVERSAL_SOURCES];
39
+ const eligible = defaults.filter((source) => source !== 'UPU' || trackingNumber === undefined || isValidS10TrackingNumber(trackingNumber));
40
+ const carrier = (options.carriers ?? []).find((candidate) => coverageTiers(candidate)) ?? null;
41
+ const tiers = coverageTiers(carrier);
42
+ const ordered = orderUniversalSources(eligible, tiers);
43
+ const priority = priorityUniversalSource(trackingNumber);
44
+ return {
45
+ sources: priority ? [priority, ...ordered.filter((source) => source !== priority)] : ordered,
46
+ carrier,
47
+ tier: (source) => tiers?.[source] ?? 'unknown',
48
+ rank: (source) => tierRank(tiers, source),
49
+ };
50
+ }
51
+ /** The default order for a number, without a carrier's evidence. */
52
+ export function universalSources(enablePostalNinja = false, trackingNumber) {
53
+ return universalPlan({ trackingNumber, enablePostalNinja }).sources;
54
+ }
@@ -0,0 +1,17 @@
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 type { TrawlClient } from '../../core/transport/index.js';
5
+ import { type UniversalBrowserOptions } from '../../core/transport/browser.js';
6
+ export declare function parsePostalNinjaResponse(payload: unknown, trackingNumber: string): CarrierResult;
7
+ export interface PostalNinjaOptions extends UniversalBrowserOptions {
8
+ trawl?: TrawlClient | null;
9
+ fetcher?: typeof fetch;
10
+ recorder?: StepRecorder;
11
+ }
12
+ export declare class PostalNinjaTracker {
13
+ readonly options: PostalNinjaOptions;
14
+ constructor(options?: PostalNinjaOptions);
15
+ fetch(trackingNumber: string, budgetMs?: number): Promise<CarrierResult>;
16
+ }
17
+ export declare const adapter: AdapterFactory;