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,200 @@
1
+ /**
2
+ * Postal Ninja (postal.ninja), an opt-in universal aggregator.
3
+ *
4
+ * Transport: TRAWL verifies through the embedded widget on `/en/tools`, then
5
+ * opens the normal results page for its verified handle and captures the full
6
+ * `/track/get` response. Local Chromium without TRAWL retains compact widget
7
+ * capture. The main entry form has a separate verification gate.
8
+ * The provider is disabled by default;
9
+ * `TRACKING_ENABLE_POSTAL_NINJA=true` puts it in the chain before 17TRACK.
10
+ */
11
+ import { DateTime } from 'luxon';
12
+ import { ChallengeError, NoHistoryError, SchemaError } from '../../core/errors/index.js';
13
+ import { runSteps } from '../../core/runner/index.js';
14
+ import { scrapeUniversalPage } from '../../core/transport/browser.js';
15
+ import { isRecord } from '../../core/types.js';
16
+ import { capturedBodies, captureFailure, loadCapture } from '../shared/capture.js';
17
+ import { event, eventStage, hasPrivateDeliveryDetails, isNotice, numberOf, result, text } from '../shared/result.js';
18
+ const SOURCE = 'Postal Ninja';
19
+ const GET_API = 'https://postal.ninja/track/get';
20
+ const CHECK_API = 'https://postal.ninja/track/check';
21
+ const MAX_EVENTS = 1000;
22
+ /** The states whose history the provider considers established. */
23
+ const TRACKED_STATES = ['TRACKING', 'FINISHED', 'STOPPED', 'ARCHIVED'];
24
+ function isMatchingResultPage(page, number) {
25
+ return page.capturedResponses.some((entry) => {
26
+ if (entry.url !== GET_API || entry.status !== 200 || !entry.body || entry.truncated || entry.base64Encoded)
27
+ return false;
28
+ let payload;
29
+ try {
30
+ payload = JSON.parse(entry.body);
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ return isRecord(payload) && payload.status === 'FOUND' && isRecord(payload.track)
36
+ && payload.track.tc === number && payload.track.hid === payload.hid
37
+ && typeof payload.hid === 'string' && /^[A-Za-z0-9_-]{1,100}$/.test(payload.hid)
38
+ && page.url === `https://postal.ninja/en/track#/${payload.hid}`;
39
+ });
40
+ }
41
+ export function parsePostalNinjaResponse(payload, trackingNumber) {
42
+ const number = numberOf(trackingNumber);
43
+ if (!isRecord(payload) || payload.status !== 'FOUND' || !isRecord(payload.track)
44
+ || payload.track.tc !== number || payload.track.hid !== payload.hid
45
+ || typeof payload.hid !== 'string' || !payload.hid
46
+ || !TRACKED_STATES.includes(String(payload.track.state))) {
47
+ throw new SchemaError(SOURCE, 'Postal Ninja has no matching shipment history');
48
+ }
49
+ // The embedded widget requests compact:true, which supplies only the first
50
+ // and latest scan. Full /track/get responses instead carry events[].
51
+ const rawEvents = payload.track.events === undefined
52
+ ? [payload.track.firstEv, payload.track.lastEv].filter((value) => value != null)
53
+ : payload.track.events;
54
+ if (!Array.isArray(rawEvents) || rawEvents.length > MAX_EVENTS)
55
+ throw new SchemaError(SOURCE, 'Postal Ninja returned invalid events');
56
+ const events = [];
57
+ // Postal Ninja supplies events oldest first. Its dt values are local wall
58
+ // times without a zone, even when multiple countries are involved. Preserve
59
+ // them as local_time, but never invent UTC scans or use the destination zone
60
+ // for the whole journey. Explicit offsets, when present, can be persisted.
61
+ for (const raw of [...rawEvents].reverse()) {
62
+ if (!isRecord(raw))
63
+ throw new SchemaError(SOURCE, 'Postal Ninja returned an invalid event');
64
+ const description = text(raw.dsc);
65
+ if (!description || isNotice(description))
66
+ continue;
67
+ if (typeof raw.dt !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2})?/.test(raw.dt)
68
+ || !DateTime.fromISO(raw.dt, { zone: 'UTC' }).isValid)
69
+ throw new SchemaError(SOURCE, 'Postal Ninja returned an invalid event date');
70
+ if (/(?:Z|[+-]\d{2}:\d{2})$/.test(raw.dt)) {
71
+ const parsed = event(raw.dt, description);
72
+ if (parsed)
73
+ events.push(parsed);
74
+ }
75
+ else {
76
+ const stage = eventStage(description) ?? 'pending';
77
+ if (stage !== 'delivered' && hasPrivateDeliveryDetails(description))
78
+ continue;
79
+ events.push({ local_time: raw.dt, description: stage === 'delivered' ? 'Delivered' : description, stage });
80
+ }
81
+ }
82
+ return result(events, SOURCE, true);
83
+ }
84
+ export class PostalNinjaTracker {
85
+ options;
86
+ constructor(options = {}) {
87
+ this.options = options;
88
+ }
89
+ async fetch(trackingNumber, budgetMs) {
90
+ const number = numberOf(trackingNumber);
91
+ const timeoutMs = budgetMs ?? this.options.timeoutMs ?? 45_000;
92
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 60_000)
93
+ throw new TypeError('Postal Ninja timeout must be between 1 and 60000 ms');
94
+ let handle;
95
+ const responseError = (payload) => {
96
+ if (!isRecord(payload))
97
+ return;
98
+ if (payload.tc === number && payload.status === 'PROCESSING' && typeof payload.hid === 'string' && payload.hid) {
99
+ handle = payload.hid;
100
+ }
101
+ if (payload.status === 'CHLNG_REQ' && (payload.tc === number || (handle && payload.hid === handle))) {
102
+ return new ChallengeError(SOURCE, 'Postal Ninja browser verification did not complete');
103
+ }
104
+ if (payload.status === 'UNTRACEABLE' && payload.tc === number) {
105
+ return new NoHistoryError(SOURCE, 'Postal Ninja cannot track this number');
106
+ }
107
+ if (payload.status === 'FOUND' && isRecord(payload.track) && payload.track.tc === number
108
+ && typeof payload.hid === 'string' && payload.hid && payload.track.hid === payload.hid
109
+ && payload.track.state === 'NO_INFO' && !payload.inProgress) {
110
+ return new NoHistoryError(SOURCE, 'Postal Ninja has no available tracking history');
111
+ }
112
+ };
113
+ return runSteps({ carrier: SOURCE, budgetMs: timeoutMs, recorder: this.options.recorder }, [{
114
+ id: 'trawl', enabled: Boolean(this.options.trawl),
115
+ run: async ({ remainingMs }) => {
116
+ const spec = {
117
+ source: SOURCE, url: `https://postal.ninja/en/tools#trawl-number=${number}`,
118
+ apiUrl: GET_API, additionalApiUrls: [CHECK_API], budgetMs: remainingMs, fetcher: this.options.fetcher,
119
+ acceptResultPage: (page) => isMatchingResultPage(page, number),
120
+ };
121
+ const page = await loadCapture(this.options.trawl ?? null, spec);
122
+ // Learn the submission's handle before interpreting a handle-only
123
+ // retrieval challenge. Read history newest first to skip polling.
124
+ let submissionError;
125
+ for (const body of [...capturedBodies(page, { ...spec, apiUrl: CHECK_API })].reverse()) {
126
+ let payload;
127
+ try {
128
+ payload = JSON.parse(body);
129
+ }
130
+ catch {
131
+ continue;
132
+ }
133
+ submissionError = responseError(payload) ?? submissionError;
134
+ }
135
+ let pending;
136
+ for (const body of capturedBodies(page, spec)) {
137
+ let payload;
138
+ try {
139
+ payload = JSON.parse(body);
140
+ }
141
+ catch {
142
+ continue;
143
+ }
144
+ const error = responseError(payload);
145
+ if (error)
146
+ throw error;
147
+ // The compact widget response establishes the parcel's handle. A
148
+ // TRAWL success must include the normal page's full history; otherwise
149
+ // fallback providers should get a chance to return the missing scans.
150
+ if (isRecord(payload) && isRecord(payload.track) && !Array.isArray(payload.track.events))
151
+ continue;
152
+ try {
153
+ return parsePostalNinjaResponse(payload, number);
154
+ }
155
+ catch (error) {
156
+ if (error instanceof SchemaError)
157
+ pending ??= error;
158
+ else
159
+ throw error;
160
+ }
161
+ }
162
+ throw submissionError ?? pending ?? captureFailure(page, spec);
163
+ },
164
+ }, {
165
+ id: 'browser',
166
+ // A failed TRAWL attempt proceeds to the next universal provider. Do
167
+ // not spend another browser budget on the known-unreliable Chromium path.
168
+ enabled: !this.options.trawl,
169
+ run: ({ remainingMs }) => scrapeUniversalPage({ executablePath: this.options.executablePath, timeoutMs: Math.max(1, Math.floor(remainingMs)) }, {
170
+ name: SOURCE, url: 'https://postal.ninja/en/tools', responseUrl: 'https://postal.ninja/track/get',
171
+ responseErrors: {
172
+ 'https://postal.ninja/track/check': responseError,
173
+ 'https://postal.ninja/track/get': responseError,
174
+ },
175
+ submit: async (page) => {
176
+ // The official embedded widget uses an automatic browser check. The
177
+ // main tracking page can instead require an interactive challenge.
178
+ const form = page.frameLocator('iframe[title="Package tracking widget"]').locator('form.tracker');
179
+ await form.locator('input[type="text"]').fill(number);
180
+ const save = form.locator('input[type="checkbox"]');
181
+ if (await save.count())
182
+ await save.uncheck();
183
+ await form.locator('button[type="submit"]').click();
184
+ },
185
+ }, (payload) => parsePostalNinjaResponse(payload, number)),
186
+ }]);
187
+ }
188
+ }
189
+ export const adapter = (environment) => {
190
+ const tracker = new PostalNinjaTracker({
191
+ trawl: environment.trawl, fetcher: environment.fetcher,
192
+ executablePath: environment.browserExecutablePath ?? undefined,
193
+ recorder: environment.recorder,
194
+ });
195
+ return {
196
+ id: SOURCE,
197
+ steps: [environment.trawl ? 'trawl' : 'browser'],
198
+ track: (input, context) => tracker.fetch(input.number, context?.budgetMs),
199
+ };
200
+ };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 17TRACK (t.17track.net), a universal aggregator with richer China Post history.
3
+ *
4
+ * Transport: the browser service loads the public tracking page and captures
5
+ * the page's own `restapi` response; unsigned direct probes answer HTTP 200
6
+ * with a rejection code instead of history (verified 2026-09-10). The parser
7
+ * keeps only history whose shipment number equals the requested one, and turns
8
+ * the provider's own rejection codes into typed errors so routing can tell a
9
+ * verification wall from an outage.
10
+ */
11
+ import type { AdapterFactory } from '../../core/adapter/index.js';
12
+ import { ChallengeError, NoHistoryError, TransportError } from '../../core/errors/index.js';
13
+ import type { CarrierResult } from '../../core/result/index.js';
14
+ import type { StepRecorder } from '../../core/telemetry/index.js';
15
+ import type { TrawlClient } from '../../core/transport/index.js';
16
+ /** The provider answered, but its lookup did not produce history for this shipment. */
17
+ export declare class SeventeenTrackLookupError extends TransportError {
18
+ readonly reason: 'lookup_unavailable' | 'lookup_pending';
19
+ readonly providerCode: number;
20
+ readonly providerMessage?: string | undefined;
21
+ constructor(reason: 'lookup_unavailable' | 'lookup_pending', providerCode: number, providerMessage?: string | undefined);
22
+ }
23
+ /** A matching code-400/null-shipment reply supplies no history, not a network failure or a proven invalid number. */
24
+ export declare class SeventeenTrackNoHistoryError extends NoHistoryError {
25
+ readonly reason = "no_history";
26
+ readonly providerCode = 400;
27
+ constructor();
28
+ }
29
+ /** The provider asked for an interactive verification the unattended lookup cannot pass. */
30
+ export declare class SeventeenTrackVerificationError extends ChallengeError {
31
+ readonly providerCode: number;
32
+ readonly providerMessage?: string | undefined;
33
+ readonly reason = "verification_required";
34
+ constructor(providerCode: number, providerMessage?: string | undefined);
35
+ }
36
+ /** Structured replies without usable history; polling may still produce a later success. */
37
+ export declare function isSeventeenTrackLookupError(error: unknown): error is SeventeenTrackLookupError | SeventeenTrackNoHistoryError | SeventeenTrackVerificationError;
38
+ export declare function parse17TrackResponse(payload: unknown, trackingNumber: string): CarrierResult;
39
+ export interface SeventeenTrackOptions {
40
+ trawl?: TrawlClient | null;
41
+ fetcher?: typeof fetch;
42
+ recorder?: StepRecorder;
43
+ timeoutMs?: number;
44
+ }
45
+ export declare class SeventeenTrackTracker {
46
+ readonly options: SeventeenTrackOptions;
47
+ constructor(options?: SeventeenTrackOptions);
48
+ fetch(trackingNumber: string, budgetMs?: number): Promise<CarrierResult>;
49
+ }
50
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,165 @@
1
+ import { ChallengeError, NoHistoryError, NotFoundError, SchemaError, TransportError } from '../../core/errors/index.js';
2
+ import { runSteps } from '../../core/runner/index.js';
3
+ import { isRecord } from '../../core/types.js';
4
+ import { universalCarrierHints } from '../shared/hints.js';
5
+ import { capturedBodies, captureFailure, loadCapture } from '../shared/capture.js';
6
+ import { numberOf, result, text } from '../shared/result.js';
7
+ import { seventeenTrackEvent } from './events.js';
8
+ const SOURCE = '17TRACK';
9
+ const API_URL = 'https://t.17track.net/track/restapi';
10
+ /** Codes the provider returns when it wants an interactive verification. */
11
+ const VERIFICATION_CODES = [-11, -13, -14];
12
+ const MAX_PROVIDERS = 20;
13
+ const MAX_EVENTS = 1000;
14
+ /** The provider answered, but its lookup did not produce history for this shipment. */
15
+ export class SeventeenTrackLookupError extends TransportError {
16
+ reason;
17
+ providerCode;
18
+ providerMessage;
19
+ constructor(reason, providerCode, providerMessage) {
20
+ super(SOURCE, describeLookup(reason, providerCode, providerMessage));
21
+ this.reason = reason;
22
+ this.providerCode = providerCode;
23
+ this.providerMessage = providerMessage;
24
+ this.name = 'SeventeenTrackLookupError';
25
+ }
26
+ }
27
+ /** A matching code-400/null-shipment reply supplies no history, not a network failure or a proven invalid number. */
28
+ export class SeventeenTrackNoHistoryError extends NoHistoryError {
29
+ reason = 'no_history';
30
+ providerCode = 400;
31
+ constructor() {
32
+ super(SOURCE, describeLookup('no_history', 400));
33
+ this.name = 'SeventeenTrackNoHistoryError';
34
+ }
35
+ }
36
+ /** The provider asked for an interactive verification the unattended lookup cannot pass. */
37
+ export class SeventeenTrackVerificationError extends ChallengeError {
38
+ providerCode;
39
+ providerMessage;
40
+ reason = 'verification_required';
41
+ constructor(providerCode, providerMessage) {
42
+ super(SOURCE, describeLookup('verification_required', providerCode, providerMessage));
43
+ this.providerCode = providerCode;
44
+ this.providerMessage = providerMessage;
45
+ this.name = 'SeventeenTrackVerificationError';
46
+ }
47
+ }
48
+ function describeLookup(reason, providerCode, providerMessage) {
49
+ return `${SOURCE}: ${reason} (code ${providerCode}${providerMessage ? `: ${providerMessage}` : ''})`;
50
+ }
51
+ /** Structured replies without usable history; polling may still produce a later success. */
52
+ export function isSeventeenTrackLookupError(error) {
53
+ return error instanceof SeventeenTrackLookupError || error instanceof SeventeenTrackNoHistoryError || error instanceof SeventeenTrackVerificationError;
54
+ }
55
+ function lookupError(code, providerMessage) {
56
+ return VERIFICATION_CODES.includes(code)
57
+ ? new SeventeenTrackVerificationError(code, providerMessage)
58
+ : new SeventeenTrackLookupError('lookup_unavailable', code, providerMessage);
59
+ }
60
+ export function parse17TrackResponse(payload, trackingNumber) {
61
+ const number = numberOf(trackingNumber);
62
+ if (!isRecord(payload) || !isRecord(payload.meta) || !Number.isInteger(payload.meta.code)) {
63
+ throw new SchemaError(SOURCE, '17TRACK lookup unavailable');
64
+ }
65
+ if (payload.meta.code !== 200) {
66
+ const code = Number(payload.meta.code);
67
+ // Keep the provider's short reason (e.g. for the intermittent code 400) visible in Sentry.
68
+ const message = typeof payload.meta.message === 'string' ? text(payload.meta.message).slice(0, 120) : undefined;
69
+ throw lookupError(code, message);
70
+ }
71
+ if (!Array.isArray(payload.shipments))
72
+ throw new SchemaError(SOURCE, '17TRACK lookup unavailable');
73
+ const matches = payload.shipments.filter((s) => isRecord(s) && s.number === number);
74
+ if (matches.length === 1 && isRecord(matches[0]) && Number.isInteger(matches[0].code) && matches[0].code !== 200) {
75
+ // A shipment-level code is the lookup's own progress, never a verification wall.
76
+ const code = Number(matches[0].code);
77
+ // Observed repeatedly for valid references whose other providers have history.
78
+ // Scope this to the matching shipment; envelope errors and unknown shapes remain failures.
79
+ if (code === 400 && matches[0].shipment === null)
80
+ throw new SeventeenTrackNoHistoryError();
81
+ throw new SeventeenTrackLookupError(code === 100 ? 'lookup_pending' : 'lookup_unavailable', code);
82
+ }
83
+ if (matches.length !== 1 || !isRecord(matches[0]) || matches[0].code !== 200 || !isRecord(matches[0].shipment)) {
84
+ throw new SchemaError(SOURCE, '17TRACK has no matching shipment history');
85
+ }
86
+ const shipment = matches[0].shipment;
87
+ const tracking = shipment.tracking;
88
+ if (!isRecord(tracking) || !Array.isArray(tracking.providers) || tracking.providers.length > MAX_PROVIDERS) {
89
+ throw new SchemaError(SOURCE, '17TRACK returned invalid providers');
90
+ }
91
+ const events = [];
92
+ let count = 0;
93
+ let undated = 0;
94
+ for (const provider of tracking.providers) {
95
+ if (!isRecord(provider) || !Array.isArray(provider.events))
96
+ throw new SchemaError(SOURCE, '17TRACK returned invalid provider history');
97
+ const reported = isRecord(provider.provider) ? provider.provider : {};
98
+ const name = universalCarrierHints([reported.name]).reported_carriers[0];
99
+ const operator = { ...(name ? { reporting_carrier: name } : {}),
100
+ ...(typeof reported.key === 'number' && Number.isSafeInteger(reported.key) ? { reporting_carrier_key: reported.key } : {}) };
101
+ for (const raw of provider.events) {
102
+ if (++count > MAX_EVENTS || !isRecord(raw))
103
+ throw new SchemaError(SOURCE, '17TRACK returned invalid events');
104
+ if (raw.time_utc == null && raw.time_iso == null)
105
+ undated++;
106
+ let parsed;
107
+ try {
108
+ parsed = seventeenTrackEvent(raw, operator);
109
+ }
110
+ catch (cause) {
111
+ throw new SchemaError(SOURCE, '17TRACK returned an invalid tracking event', { cause });
112
+ }
113
+ if (parsed)
114
+ events.push(parsed);
115
+ }
116
+ }
117
+ if (count === 0 && isRecord(shipment.latest_status) && shipment.latest_status.status === 'NotFound') {
118
+ throw new NotFoundError(SOURCE);
119
+ }
120
+ return { ...result(events, SOURCE), ...(undated ? { undated_event_count: undated } : {}),
121
+ ...universalCarrierHints(tracking.providers.map((provider) => isRecord(provider) && isRecord(provider.provider) ? provider.provider.name : undefined), number) };
122
+ }
123
+ export class SeventeenTrackTracker {
124
+ options;
125
+ constructor(options = {}) {
126
+ this.options = options;
127
+ }
128
+ async fetch(trackingNumber, budgetMs = this.options.timeoutMs ?? 30_000) {
129
+ const number = numberOf(trackingNumber);
130
+ const spec = (remainingMs) => ({
131
+ source: SOURCE, url: `https://t.17track.net/en#nums=${number}`, apiUrl: API_URL,
132
+ budgetMs: remainingMs, fetcher: this.options.fetcher,
133
+ });
134
+ return runSteps({ carrier: SOURCE, budgetMs, recorder: this.options.recorder }, [{
135
+ id: 'trawl',
136
+ run: async ({ remainingMs }) => {
137
+ const capture = spec(remainingMs);
138
+ const page = await loadCapture(this.options.trawl ?? null, capture);
139
+ let pending;
140
+ for (const body of capturedBodies(page, capture)) {
141
+ try {
142
+ return parse17TrackResponse(JSON.parse(body), number);
143
+ }
144
+ catch (error) {
145
+ // Continue past polling replies and unrelated/demo numbers, but retain
146
+ // the latest structured failure if no matching history follows.
147
+ if (isSeventeenTrackLookupError(error) || error instanceof NotFoundError || error instanceof SchemaError)
148
+ pending ??= error;
149
+ }
150
+ }
151
+ throw pending ?? captureFailure(page, capture);
152
+ },
153
+ }]);
154
+ }
155
+ }
156
+ export const adapter = (environment) => {
157
+ const tracker = new SeventeenTrackTracker({
158
+ trawl: environment.trawl, fetcher: environment.fetcher, recorder: environment.recorder,
159
+ });
160
+ return {
161
+ id: SOURCE,
162
+ steps: ['trawl'],
163
+ track: (input, context) => tracker.fetch(input.number, context?.budgetMs),
164
+ };
165
+ };
@@ -0,0 +1,4 @@
1
+ import type { CarrierEvent } from '../../core/result/index.js';
2
+ import { type JsonObject } from '../../core/types.js';
3
+ /** Keep scan codes/operator and the origin of 17TRACK's converted timestamp. */
4
+ export declare function seventeenTrackEvent(raw: JsonObject, operator: JsonObject): CarrierEvent | null;
@@ -0,0 +1,56 @@
1
+ import { isRecord } from '../../core/types.js';
2
+ import { event, text } from '../shared/result.js';
3
+ // Official v2 status vocabulary, plus TransportArrived/Departed observed in
4
+ // public China Post histories. Expired describes tracking age, not a scan.
5
+ const SUB_STAGES = {
6
+ InfoReceived: 'registered',
7
+ InTransit_PickedUp: 'accepted', InTransit_Other: 'in_transit',
8
+ InTransit_Departure: 'in_transit', InTransit_Arrival: 'in_transit',
9
+ InTransit_TransportArrived: 'in_transit', InTransit_TransportDeparted: 'in_transit',
10
+ InTransit_CustomsProcessing: 'customs', InTransit_CustomsReleased: 'in_transit',
11
+ InTransit_CustomsRequiringInformation: 'customs',
12
+ AvailableForPickup_Other: 'ready_for_pickup', OutForDelivery_Other: 'out_for_delivery',
13
+ DeliveryFailure_Other: 'failed_attempt', DeliveryFailure_NoBody: 'failed_attempt',
14
+ DeliveryFailure_Security: 'failed_attempt', DeliveryFailure_Rejected: 'failed_attempt',
15
+ DeliveryFailure_InvalidAddress: 'failed_attempt', Delivered_Other: 'delivered',
16
+ Exception_Other: 'exception', Exception_Returning: 'exception', Exception_Returned: 'returned',
17
+ Exception_NoBody: 'exception', Exception_Security: 'exception', Exception_Damage: 'exception',
18
+ Exception_Rejected: 'exception', Exception_Delayed: 'exception', Exception_Lost: 'exception',
19
+ Exception_Destroyed: 'exception', Exception_Cancel: 'exception',
20
+ };
21
+ /** Keep scan codes/operator and the origin of 17TRACK's converted timestamp. */
22
+ export function seventeenTrackEvent(raw, operator) {
23
+ // Some completed responses contain undated explanatory rows alongside real
24
+ // scans. Skip only absent dates; malformed nonempty timestamps still fail.
25
+ const time = raw.time_utc ?? raw.time_iso;
26
+ if (time === null || time === undefined)
27
+ return null;
28
+ const code = text(raw.sub_status);
29
+ const mapped = Object.hasOwn(SUB_STAGES, code) ? SUB_STAGES[code] : undefined;
30
+ const parsed = event(time, raw.description, raw.stage ?? (mapped ? code.split('_')[0] : undefined));
31
+ if (!parsed)
32
+ return null;
33
+ // Preserve the shared delivered/negation/handoff safeguards. The specific
34
+ // code otherwise supplies semantics that Chinese wording cannot provide.
35
+ const genericTransit = code === 'InTransit_Other' && parsed.stage !== 'pending';
36
+ if (mapped && !genericTransit && (mapped !== 'delivered' || parsed.stage === 'delivered'))
37
+ parsed.stage = mapped;
38
+ // 17TRACK's generic transit bucket loses Swiss Post's delivery-round scan.
39
+ // Refine only that operator's precise native label; keep its original code.
40
+ if (code === 'InTransit_Other' && operator.reporting_carrier === 'Swiss Post'
41
+ && text(raw.description).toLowerCase() === 'loading into delivery vehicle')
42
+ parsed.stage = 'out_for_delivery';
43
+ if (parsed.stage === 'delivered')
44
+ parsed.description = 'Delivered';
45
+ const timeRaw = isRecord(raw.time_raw) ? raw.time_raw : null;
46
+ return {
47
+ ...parsed,
48
+ ...(code && /^[A-Za-z_]{1,80}$/.test(code) ? { provider_code: code } : {}),
49
+ ...operator,
50
+ ...(typeof raw.time_iso === 'string' ? { provider_time_iso: raw.time_iso } : {}),
51
+ // An inferred offset remains provider-converted time, not independent
52
+ // evidence that China Post knows the destination's local timezone.
53
+ time_provenance: timeRaw?.timezone === null ? 'provider_inferred'
54
+ : typeof timeRaw?.timezone === 'string' ? 'carrier_reported' : 'unspecified',
55
+ };
56
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The browser capture the two TRAWL-backed providers share.
3
+ *
4
+ * ParcelsApp and 17TRACK both render their history from an in-page API call,
5
+ * so the browser service loads the public tracking page and hands back the
6
+ * responses it saw for that one API URL. This module performs that call,
7
+ * yields the readable bodies newest first, and turns the service's own answers
8
+ * (a redirect, a rejected status, an unreadable body) into the shared error
9
+ * taxonomy. Parsing stays with each provider.
10
+ */
11
+ import { IndeterminateError } from '../../core/errors/index.js';
12
+ import type { TrawlClient, TrawlScrapeResponse } from '../../core/transport/index.js';
13
+ import type { UniversalSource } from './result.js';
14
+ export interface CaptureSpec {
15
+ source: UniversalSource;
16
+ /** The public tracking page the browser loads. */
17
+ url: string;
18
+ /** The in-page API URL whose responses are captured. */
19
+ apiUrl: string;
20
+ /** Related protocol replies needed to diagnose submission or polling. */
21
+ additionalApiUrls?: readonly string[];
22
+ /** A provider may bind its observed results-page redirect to a captured identity. */
23
+ acceptResultPage?: (page: TrawlScrapeResponse) => boolean;
24
+ budgetMs: number;
25
+ fetcher?: typeof fetch;
26
+ }
27
+ /**
28
+ * The browser answered, but no shipment history came back with it: the service
29
+ * captured nothing (`capture_missing`), could not read the body it captured
30
+ * (`capture_unreadable`), or captured only replies without history
31
+ * (`history_missing`). None of them prove anything about the shipment.
32
+ */
33
+ export declare class TrackingCaptureError extends IndeterminateError {
34
+ readonly reason: 'capture_missing' | 'capture_unreadable' | 'history_missing';
35
+ constructor(reason: 'capture_missing' | 'capture_unreadable' | 'history_missing', provider?: string);
36
+ }
37
+ /** Load the provider's tracking page in the browser service, capturing its API call. */
38
+ export declare function loadCapture(trawl: TrawlClient | null, spec: CaptureSpec): Promise<TrawlScrapeResponse>;
39
+ /**
40
+ * The captured bodies for the provider's API, newest first. Lazily generated:
41
+ * a rejected status only ends the lookup when no newer body parsed first,
42
+ * which keeps a completed reply usable after an intermediate failure.
43
+ */
44
+ export declare function capturedBodies(page: TrawlScrapeResponse, spec: CaptureSpec): Generator<string>;
45
+ /** Why a captured page carried no usable history, once every body has been tried. */
46
+ export declare function captureFailure(page: TrawlScrapeResponse, spec: CaptureSpec): TrackingCaptureError;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The browser capture the two TRAWL-backed providers share.
3
+ *
4
+ * ParcelsApp and 17TRACK both render their history from an in-page API call,
5
+ * so the browser service loads the public tracking page and hands back the
6
+ * responses it saw for that one API URL. This module performs that call,
7
+ * yields the readable bodies newest first, and turns the service's own answers
8
+ * (a redirect, a rejected status, an unreadable body) into the shared error
9
+ * taxonomy. Parsing stays with each provider.
10
+ */
11
+ import { IndeterminateError, SchemaError, TransportError, UpstreamHttpError } from '../../core/errors/index.js';
12
+ /** How many responses the browser may have captured before the newest is meaningless. */
13
+ const MAX_CAPTURED = 20;
14
+ /** How long the browser waits for the in-page API call after the page settles. */
15
+ const SETTLE_TIMEOUT_MS = 15_000;
16
+ const MAX_PAGE_BYTES = 10_000_000;
17
+ /**
18
+ * The browser answered, but no shipment history came back with it: the service
19
+ * captured nothing (`capture_missing`), could not read the body it captured
20
+ * (`capture_unreadable`), or captured only replies without history
21
+ * (`history_missing`). None of them prove anything about the shipment.
22
+ */
23
+ export class TrackingCaptureError extends IndeterminateError {
24
+ reason;
25
+ constructor(reason, provider = 'Tracking browser') {
26
+ super(provider, `Tracking browser: ${reason}`);
27
+ this.reason = reason;
28
+ this.name = 'TrackingCaptureError';
29
+ }
30
+ }
31
+ function retryAfterMs(headers) {
32
+ const raw = headers['retry-after'];
33
+ if (typeof raw !== 'string')
34
+ return undefined;
35
+ return /^\d+$/.test(raw) ? Number(raw) * 1000 : Date.parse(raw) - Date.now();
36
+ }
37
+ /** Load the provider's tracking page in the browser service, capturing its API call. */
38
+ export async function loadCapture(trawl, spec) {
39
+ if (!trawl)
40
+ throw new TransportError(spec.source, 'Automatic carrier lookup requires the tracking browser service');
41
+ const budgetMs = Math.max(1, Math.floor(spec.budgetMs));
42
+ const page = await trawl.scrape({
43
+ url: spec.url, skipHttp: true, maxTier: 3, maxTimeout: budgetMs,
44
+ captureResponses: [spec.apiUrl, ...spec.additionalApiUrls ?? []], settleTimeout: SETTLE_TIMEOUT_MS,
45
+ }, {
46
+ provider: `${spec.source} tracking browser`, timeoutMs: budgetMs,
47
+ maxBytes: MAX_PAGE_BYTES, fetcher: spec.fetcher,
48
+ // A 304 page still carries a fresh captured API reply (observed on
49
+ // 17TRACK 2026-09-13), so the solved-page gate below allows it: the caller
50
+ // validates through the captured bodies (identity, demo and polling
51
+ // rejection) instead of the page status. Without a usable capture the
52
+ // caller still fails closed with a typed capture error.
53
+ requireSolved: false,
54
+ });
55
+ // Results-page navigation must be bound to a captured identity. Arbitrary
56
+ // redirects and interstitials are never accepted as this shipment's page.
57
+ if (page.url !== spec.url && !spec.acceptResultPage?.(page))
58
+ throw new SchemaError(spec.source, 'Tracking browser returned an incomplete page');
59
+ // Preserve the solved-tier requirement for capture flows: only a browser
60
+ // tier (2/3) with a fresh (200) or not-modified (304) page may carry a
61
+ // usable capture. Anything else stays an unsolved page, as before.
62
+ if (![2, 3].includes(page.tier) || (page.statusCode !== 200 && page.statusCode !== 304)) {
63
+ throw new TransportError(spec.source, 'Tracking browser: page unsolved');
64
+ }
65
+ return page;
66
+ }
67
+ /**
68
+ * The captured bodies for the provider's API, newest first. Lazily generated:
69
+ * a rejected status only ends the lookup when no newer body parsed first,
70
+ * which keeps a completed reply usable after an intermediate failure.
71
+ */
72
+ export function* capturedBodies(page, spec) {
73
+ for (const entry of page.capturedResponses.slice(0, MAX_CAPTURED).reverse()) {
74
+ if (entry.url !== spec.apiUrl)
75
+ continue;
76
+ // Preserve the provider's own status for the router's backoff policy.
77
+ if (entry.status === 429)
78
+ throw new UpstreamHttpError(spec.source, 429, retryAfterMs(entry.headers));
79
+ if (entry.status >= 400)
80
+ throw new UpstreamHttpError(spec.source, entry.status);
81
+ if (entry.status !== 200 || entry.truncated || entry.base64Encoded || entry.body === null)
82
+ continue;
83
+ yield entry.body;
84
+ }
85
+ }
86
+ /** Why a captured page carried no usable history, once every body has been tried. */
87
+ export function captureFailure(page, spec) {
88
+ if (!Array.isArray(page.raw.capturedResponses))
89
+ return new TrackingCaptureError('capture_missing', spec.source);
90
+ const unreadable = page.capturedResponses.some((entry) => entry.url === spec.apiUrl && (entry.error || entry.body === null));
91
+ return new TrackingCaptureError(unreadable ? 'capture_unreadable' : 'history_missing', spec.source);
92
+ }
@@ -0,0 +1,16 @@
1
+ export { isKnownCarrierName } from '../../core/catalog/hints.js';
2
+ /**
3
+ * A bare brand ("DPD Group") names several catalog networks; the number can
4
+ * still pick one. Keep the networks whose detection rules match it, then the
5
+ * one a preferred rule backs, such as a DPD depot range. Anything else stays
6
+ * unresolved rather than guessed.
7
+ */
8
+ export declare function brandCarrierForNumber(name: string, trackingNumber: string): string | undefined;
9
+ /**
10
+ * Names are hints only. A direct adapter must confirm the shipment before
11
+ * adoption. The looked-up number resolves a bare brand name.
12
+ */
13
+ export declare function universalCarrierHints(raw: unknown[], trackingNumber?: string): {
14
+ reported_carriers: string[];
15
+ discovered_carrier?: string;
16
+ };