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,243 @@
1
+ /**
2
+ * Timestamp parsing with an explicit timezone policy.
3
+ *
4
+ * Providers disagree about time: some send offsets, some send naive wall-clock
5
+ * strings in a known zone, some send epoch milliseconds, some only a calendar
6
+ * day. Each helper below implements one policy and documents its limits so an
7
+ * adapter states which one applies instead of re-implementing the parsing.
8
+ * Every helper returns `null` rather than guessing.
9
+ */
10
+ import { DateTime } from 'luxon';
11
+ import { REGION_TOWNS } from '../../generated/regionTowns.js';
12
+ import { clean } from '../transport/text.js';
13
+ export const EXPLICIT_OFFSET_PATTERN = /(?:Z|[+-]\d{2}:?\d{2})$/i;
14
+ function fromDateTime(parsed) {
15
+ const iso = parsed.isValid ? parsed.toISO({ suppressMilliseconds: true }) : null;
16
+ return iso ? { iso, timestamp: parsed.toMillis() } : null;
17
+ }
18
+ /**
19
+ * ISO strings that carry their own offset. Use for cross-border lanes where
20
+ * stamping a zone would be wrong; offset-less values are rejected.
21
+ */
22
+ export function explicitOffsetTime(value, maxLength = 64) {
23
+ const raw = clean(value, maxLength);
24
+ if (!raw || !EXPLICIT_OFFSET_PATTERN.test(raw))
25
+ return null;
26
+ return fromDateTime(DateTime.fromISO(raw, { setZone: true }));
27
+ }
28
+ /**
29
+ * Naive wall-clock strings in one known zone. Use when the provider documents
30
+ * (or live checks show) a single backend zone; note regional caveats in the
31
+ * adapter.
32
+ */
33
+ export function zonedTime(value, format, zone, options = {}) {
34
+ const raw = clean(value, options.maxLength ?? 64);
35
+ if (!raw)
36
+ return null;
37
+ return fromDateTime(DateTime.fromFormat(raw, format, { zone, locale: options.locale }));
38
+ }
39
+ /** ISO strings that may or may not carry an offset; offset-less values are read in `zone`. */
40
+ export function isoTime(value, zone, maxLength = 64) {
41
+ const raw = clean(value, maxLength);
42
+ if (!raw)
43
+ return null;
44
+ const parsed = EXPLICIT_OFFSET_PATTERN.test(raw)
45
+ ? DateTime.fromISO(raw, { setZone: true })
46
+ : DateTime.fromISO(raw, { zone });
47
+ return fromDateTime(parsed);
48
+ }
49
+ /** The digits of a labeled instant read in UTC, or of an offset-less value as given. */
50
+ function labeledDigits(value, maxLength) {
51
+ const raw = clean(value, maxLength);
52
+ if (!raw)
53
+ return null;
54
+ const labeled = EXPLICIT_OFFSET_PATTERN.test(raw)
55
+ ? DateTime.fromISO(raw, { setZone: true }).toUTC()
56
+ : DateTime.fromISO(raw, { zone: 'utc' });
57
+ return labeled.isValid ? labeled : null;
58
+ }
59
+ /**
60
+ * Wall-clock times a provider labels as UTC (or with an offset of its own)
61
+ * although they are the scan's local time: ParcelsApp and PostNL do this. The
62
+ * digits of the labeled instant, read in UTC, are re-read in `zone`.
63
+ * Offset-less values are read in `zone` directly.
64
+ */
65
+ export function mislabeledLocalTime(value, zone, maxLength = 64) {
66
+ const labeled = labeledDigits(value, maxLength);
67
+ if (!labeled)
68
+ return null;
69
+ const { year, month, day, hour, minute, second, millisecond } = labeled;
70
+ return fromDateTime(DateTime.fromObject({ year, month, day, hour, minute, second, millisecond }, { zone }));
71
+ }
72
+ /** The wall clock `mislabeledLocalTime` re-reads, as an offset-less ISO string. */
73
+ export function mislabeledWallTime(value, maxLength = 64) {
74
+ return labeledDigits(value, maxLength)?.toISO({ includeOffset: false }) ?? null;
75
+ }
76
+ /**
77
+ * One zone for several that keep the same clock at `wallIso`, an offset-less
78
+ * wall time: the first zone when every zone reads it as the same instant.
79
+ * Null when none is given, a zone or the time is invalid, the time carries an
80
+ * offset (every zone would agree), or the zones disagree at that moment, as
81
+ * Zurich and London always do.
82
+ */
83
+ export function sharedClockZone(zones, wallIso) {
84
+ if (!zones.length || EXPLICIT_OFFSET_PATTERN.test(wallIso))
85
+ return null;
86
+ const instants = zones.map((zone) => DateTime.fromISO(wallIso, { zone }));
87
+ const first = instants[0].toMillis();
88
+ return instants.every((instant) => instant.isValid && instant.toMillis() === first) ? zones[0] : null;
89
+ }
90
+ // Some scanners run early; the host flags a scan only past the same hour.
91
+ const CLOCK_SKEW_MS = 3_600_000;
92
+ /**
93
+ * Settles guessed clocks against the feed itself, given newest first. A guess
94
+ * stands only if it is not after the lookup (`readAt`, give or take an hour of
95
+ * skew) and keeps the feed's order: not after the nearest newer scan with a
96
+ * known instant, not before the nearest older one. Each scan gets its known
97
+ * instant or its first guess that stands; null when none does.
98
+ */
99
+ export function settleGuessedClocks(scans, readAt) {
100
+ const known = scans.map((scan) => scan.known ?? null);
101
+ const nearest = (from, step) => {
102
+ for (let index = from; index >= 0 && index < known.length; index += step) {
103
+ if (known[index])
104
+ return known[index].timestamp;
105
+ }
106
+ return undefined;
107
+ };
108
+ return scans.map((scan, index) => {
109
+ if (scan.known)
110
+ return scan.known;
111
+ const newer = nearest(index - 1, -1);
112
+ const older = nearest(index + 1, 1);
113
+ return scan.guesses?.find((guess) => Boolean(guess)
114
+ && guess.timestamp <= readAt + CLOCK_SKEW_MS
115
+ && (newer === undefined || guess.timestamp <= newer)
116
+ && (older === undefined || guess.timestamp >= older)) ?? null;
117
+ });
118
+ }
119
+ // Countries that keep one civil time. Spain and Portugal use their mainland
120
+ // zone (their islands differ by an hour). Countries spanning several zones
121
+ // (US, CA, BR, RU, AU, MX, ID...) are absent: they need a finer location.
122
+ const COUNTRY_ZONES = {
123
+ AT: 'Europe/Vienna', BE: 'Europe/Brussels', BG: 'Europe/Sofia', CH: 'Europe/Zurich',
124
+ CY: 'Asia/Nicosia', CZ: 'Europe/Prague', DE: 'Europe/Berlin', DK: 'Europe/Copenhagen',
125
+ EE: 'Europe/Tallinn', ES: 'Europe/Madrid', FI: 'Europe/Helsinki', FR: 'Europe/Paris',
126
+ GB: 'Europe/London', GR: 'Europe/Athens', HR: 'Europe/Zagreb', HU: 'Europe/Budapest',
127
+ IE: 'Europe/Dublin', IS: 'Atlantic/Reykjavik', IT: 'Europe/Rome', LI: 'Europe/Vaduz',
128
+ LT: 'Europe/Vilnius', LU: 'Europe/Luxembourg', LV: 'Europe/Riga', MT: 'Europe/Malta',
129
+ NL: 'Europe/Amsterdam', NO: 'Europe/Oslo', PL: 'Europe/Warsaw', PT: 'Europe/Lisbon',
130
+ RO: 'Europe/Bucharest', SE: 'Europe/Stockholm', SI: 'Europe/Ljubljana', SK: 'Europe/Bratislava',
131
+ TR: 'Europe/Istanbul', AE: 'Asia/Dubai', IL: 'Asia/Jerusalem', IN: 'Asia/Kolkata',
132
+ CN: 'Asia/Shanghai', HK: 'Asia/Hong_Kong', JP: 'Asia/Tokyo', KR: 'Asia/Seoul',
133
+ MY: 'Asia/Kuala_Lumpur', PH: 'Asia/Manila', SG: 'Asia/Singapore', TH: 'Asia/Bangkok',
134
+ TW: 'Asia/Taipei', VN: 'Asia/Ho_Chi_Minh',
135
+ };
136
+ const ENGLISH_REGIONS = new Intl.DisplayNames(['en'], { type: 'region' });
137
+ // Every region Intl names, by English name. Retired codes ("FX", "UK") repeat
138
+ // a current region's name and are left out.
139
+ const REGION_BY_NAME = new Map(Array.from({ length: 26 * 26 }, (_, index) => String.fromCharCode(65 + Math.floor(index / 26), 65 + (index % 26)))
140
+ .filter((code) => ENGLISH_REGIONS.of(code) !== code && new Intl.Locale(`und-${code}`).region === code)
141
+ .map((code) => [ENGLISH_REGIONS.of(code).toUpperCase(), code]));
142
+ const REGION_CODES = new Set(REGION_BY_NAME.values());
143
+ /**
144
+ * The ISO code of any country, whatever its clocks, from the code or its
145
+ * English name ("South Africa" is ZA, "United States" US); null otherwise.
146
+ */
147
+ export function countryCode(country) {
148
+ if (typeof country !== 'string')
149
+ return null;
150
+ const value = country.trim().toUpperCase();
151
+ return REGION_CODES.has(value) ? value : REGION_BY_NAME.get(value) ?? null;
152
+ }
153
+ /** The zone of a single-zone country, from an ISO code or its English name; null otherwise. */
154
+ export function countryTimeZone(country) {
155
+ const code = countryCode(country);
156
+ return code && Object.hasOwn(COUNTRY_ZONES, code) ? COUNTRY_ZONES[code] : null;
157
+ }
158
+ /** The single-zone country keeping this civil time ("Europe/Zurich" is Switzerland's); null for UTC. */
159
+ export function timeZoneCountry(zone) {
160
+ const countries = Object.keys(COUNTRY_ZONES).filter((code) => COUNTRY_ZONES[code] === zone);
161
+ return countries.length === 1 ? countries[0] : null;
162
+ }
163
+ // US states and territories by postal code. A state with several zones keeps its
164
+ // majority zone.
165
+ const US_STATE_ZONES = {
166
+ AL: 'America/Chicago', AK: 'America/Anchorage', AZ: 'America/Phoenix', AR: 'America/Chicago',
167
+ CA: 'America/Los_Angeles', CO: 'America/Denver', CT: 'America/New_York', DE: 'America/New_York',
168
+ DC: 'America/New_York', FL: 'America/New_York', GA: 'America/New_York', HI: 'Pacific/Honolulu',
169
+ ID: 'America/Boise', IL: 'America/Chicago', IN: 'America/New_York', IA: 'America/Chicago',
170
+ KS: 'America/Chicago', KY: 'America/New_York', LA: 'America/Chicago', ME: 'America/New_York',
171
+ MD: 'America/New_York', MA: 'America/New_York', MI: 'America/Detroit', MN: 'America/Chicago',
172
+ MS: 'America/Chicago', MO: 'America/Chicago', MT: 'America/Denver', NE: 'America/Chicago',
173
+ NV: 'America/Los_Angeles', NH: 'America/New_York', NJ: 'America/New_York', NM: 'America/Denver',
174
+ NY: 'America/New_York', NC: 'America/New_York', ND: 'America/Chicago', OH: 'America/New_York',
175
+ OK: 'America/Chicago', OR: 'America/Los_Angeles', PA: 'America/New_York', RI: 'America/New_York',
176
+ SC: 'America/New_York', SD: 'America/Chicago', TN: 'America/Chicago', TX: 'America/Chicago',
177
+ UT: 'America/Denver', VT: 'America/New_York', VA: 'America/New_York', WA: 'America/Los_Angeles',
178
+ WV: 'America/New_York', WI: 'America/Chicago', WY: 'America/Denver', PR: 'America/Puerto_Rico',
179
+ GU: 'Pacific/Guam', VI: 'America/St_Thomas', AS: 'Pacific/Pago_Pago', MP: 'Pacific/Saipan',
180
+ };
181
+ /**
182
+ * The zone of a US state or territory from its postal code ("IL"): its
183
+ * majority zone when it has several; null otherwise.
184
+ */
185
+ export function usStateTimeZone(state) {
186
+ if (typeof state !== 'string')
187
+ return null;
188
+ const code = state.trim().toUpperCase();
189
+ return Object.hasOwn(US_STATE_ZONES, code) ? US_STATE_ZONES[code] : null;
190
+ }
191
+ // Canadian provinces and territories by postal code, each in its majority zone.
192
+ const CANADA_PROVINCE_ZONES = {
193
+ AB: 'America/Edmonton', BC: 'America/Vancouver', MB: 'America/Winnipeg', NB: 'America/Moncton',
194
+ NL: 'America/St_Johns', NS: 'America/Halifax', NT: 'America/Edmonton', NU: 'America/Iqaluit',
195
+ ON: 'America/Toronto', PE: 'America/Halifax', QC: 'America/Toronto', SK: 'America/Regina',
196
+ YT: 'America/Whitehorse',
197
+ };
198
+ /** The zone of a Canadian province or territory from its postal code ("ON"): its majority zone; null otherwise. */
199
+ export function canadaProvinceTimeZone(province) {
200
+ if (typeof province !== 'string')
201
+ return null;
202
+ const code = province.trim().toUpperCase();
203
+ return Object.hasOwn(CANADA_PROVINCE_ZONES, code) ? CANADA_PROVINCE_ZONES[code] : null;
204
+ }
205
+ /** A town name as the region town lists key it: "St. John's" and "SAINT JOHNS" are both "stjohns". */
206
+ export function townKey(name) {
207
+ return name.normalize('NFD').replace(/\p{Mn}/gu, '').toLowerCase()
208
+ .replace(/\bsaint\b/g, 'st').replace(/\bsainte\b/g, 'ste').replace(/\bmount\b/g, 'mt').replace(/\bfort\b/g, 'ft')
209
+ .replace(/[^a-z0-9]/g, '');
210
+ }
211
+ const REGION_TOWN_SETS = new Map(Object.entries(REGION_TOWNS).map(([code, towns]) => [code, new Set(towns.split('|'))]));
212
+ /**
213
+ * Whether a town of this name lies in the US state or Canadian province whose
214
+ * code also names a single-clock country: Chicago is in Illinois, not Israel,
215
+ * and Koeln is not in Delaware. Only DE, IL, IN, MT, NL and SK have town lists
216
+ * (generated from GeoNames); false for any other code.
217
+ */
218
+ export function regionHasTown(code, town) {
219
+ return REGION_TOWN_SETS.get(code.trim().toUpperCase())?.has(townKey(town)) ?? false;
220
+ }
221
+ /** Epoch milliseconds (numbers or numeric strings); zero and negatives are rejected. */
222
+ export function epochMillisTime(value) {
223
+ const millis = typeof value === 'number' ? value
224
+ : typeof value === 'string' && value.trim() !== '' ? Number(value) : NaN;
225
+ if (!Number.isFinite(millis) || millis <= 0)
226
+ return null;
227
+ return fromDateTime(DateTime.fromMillis(millis, { zone: 'utc' }));
228
+ }
229
+ /** Epoch seconds, same rules as `epochMillisTime`. */
230
+ export function epochSecondsTime(value) {
231
+ const seconds = typeof value === 'number' ? value
232
+ : typeof value === 'string' && value.trim() !== '' ? Number(value) : NaN;
233
+ if (!Number.isFinite(seconds) || seconds <= 0)
234
+ return null;
235
+ return epochMillisTime(seconds * 1000);
236
+ }
237
+ /** A local calendar day as `YYYY-MM-DD`, validated; never a timestamp. */
238
+ export function calendarDay(year, month, day) {
239
+ if (![year, month, day].every(Number.isInteger))
240
+ return null;
241
+ const parsed = DateTime.fromObject({ year, month, day }, { zone: 'utc' });
242
+ return parsed.isValid ? parsed.toISODate() : null;
243
+ }
@@ -0,0 +1,5 @@
1
+ import type { CarrierResult } from '../result/index.js';
2
+ export declare function resultTimezone(carrierId: string, result: CarrierResult): string;
3
+ export declare function eventTimestamp(raw: unknown, assumedTimezone?: string): string | null;
4
+ /** The newest instant of a result, under the same timezone policy as persisted events; 0 without one. */
5
+ export declare function latestResultTime(result: CarrierResult, carrier: string): number;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * How the host reads a carrier result's times: an offset is kept, and an
3
+ * offset-less wall time is read in the result's declared zone, else its
4
+ * carrier's catalog zone. Persisted events and the routing watermark share
5
+ * this policy, so a naive local clock is never compared as if it were UTC.
6
+ */
7
+ import { DateTime, IANAZone } from 'luxon';
8
+ import { carrierTimezone } from '../catalog/index.js';
9
+ export function resultTimezone(carrierId, result) {
10
+ const declared = typeof result.timezone === 'string' ? result.timezone : '';
11
+ if (declared.length >= 1 && declared.length <= 64 && IANAZone.isValidZone(declared))
12
+ return declared;
13
+ try {
14
+ const configured = carrierTimezone(carrierId);
15
+ return IANAZone.isValidZone(configured) ? configured : 'UTC';
16
+ }
17
+ catch {
18
+ return 'UTC';
19
+ }
20
+ }
21
+ const EVENT_FORMATS = [
22
+ 'yyyy-MM-dd HH:mm:ss',
23
+ 'yyyy-MM-dd HH:mm',
24
+ 'dd.MM.yyyy HH:mm:ss',
25
+ 'dd.MM.yyyy HH:mm',
26
+ 'dd/MM/yyyy HH:mm:ss',
27
+ 'dd/MM/yyyy HH:mm',
28
+ 'yyyy-MM-dd',
29
+ 'dd.MM.yyyy',
30
+ 'dd/MM/yyyy',
31
+ ];
32
+ export function eventTimestamp(raw, assumedTimezone = 'UTC') {
33
+ if (typeof raw !== 'string' || !raw.trim())
34
+ return null;
35
+ const value = raw.trim();
36
+ let parsed = DateTime.fromISO(value, { setZone: true });
37
+ if (parsed.isValid) {
38
+ if (!/(?:Z|[+-]\d{2}:?\d{2})$/i.test(value)) {
39
+ parsed = DateTime.fromISO(value, { zone: assumedTimezone });
40
+ }
41
+ return parsed.toUTC().toISO({ suppressMilliseconds: true }) ?? null;
42
+ }
43
+ for (const format of EVENT_FORMATS) {
44
+ parsed = DateTime.fromFormat(value, format, { zone: assumedTimezone });
45
+ if (parsed.isValid)
46
+ return parsed.toUTC().toISO({ suppressMilliseconds: true }) ?? null;
47
+ }
48
+ return null;
49
+ }
50
+ /** The newest instant of a result, under the same timezone policy as persisted events; 0 without one. */
51
+ export function latestResultTime(result, carrier) {
52
+ const timezone = resultTimezone(carrier, result);
53
+ return Math.max(0, ...[result.last_update, ...(result.events ?? []).map((event) => event.time)]
54
+ .map((time) => Date.parse(eventTimestamp(time, timezone) ?? '') || 0));
55
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Size- and time-bounded HTTP for provider requests. Every adapter reads
3
+ * provider responses through `fetchBounded`, which enforces a timeout, a
4
+ * byte cap, no caching, explicit redirect handling, and attaches bounded
5
+ * diagnostics to rejected responses. Errors are the shared taxonomy in
6
+ * core/errors.
7
+ */
8
+ import { UpstreamHttpError, UpstreamNetworkError } from '../errors/index.js';
9
+ export declare function fetchBounded(url: string | URL, init: RequestInit, options: {
10
+ provider: string;
11
+ timeoutMs?: number;
12
+ maxBytes?: number;
13
+ redirect?: RequestRedirect;
14
+ fetcher?: typeof fetch;
15
+ allowHttpError?: boolean;
16
+ /** Inspect specific non-success replies without bypassing other HTTP errors. */
17
+ allowHttpStatuses?: readonly number[];
18
+ /** One retry for replayable reads only; never retry parsing or validation. */
19
+ retryTransient?: boolean;
20
+ }): Promise<{
21
+ response: Response;
22
+ bytes: Uint8Array;
23
+ }>;
24
+ export declare function decodeText(bytes: Uint8Array, encoding?: string): string;
25
+ export declare function parseJsonBytes(bytes: Uint8Array, provider: string): unknown;
26
+ export { UpstreamHttpError, UpstreamNetworkError };
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Size- and time-bounded HTTP for provider requests. Every adapter reads
3
+ * provider responses through `fetchBounded`, which enforces a timeout, a
4
+ * byte cap, no caching, explicit redirect handling, and attaches bounded
5
+ * diagnostics to rejected responses. Errors are the shared taxonomy in
6
+ * core/errors.
7
+ */
8
+ import { UpstreamHttpError, UpstreamNetworkError } from '../errors/index.js';
9
+ import { readUpstreamHttpDiagnostics } from './upstreamHttpDiagnostics.js';
10
+ const DEFAULT_MAX_BYTES = 2_000_000;
11
+ const TRANSIENT_HTTP_STATUSES = new Set([429, 502, 503, 504]);
12
+ const DEFAULT_RETRY_DELAY_MS = 1_000;
13
+ const MAX_RETRY_DELAY_MS = 60_000;
14
+ const MAX_DIAGNOSTIC_BODY = 8_192;
15
+ function requestDiagnostics(url, init, timeoutMs) {
16
+ const body = typeof init.body === 'string' ? init.body
17
+ : init.body instanceof URLSearchParams ? init.body.toString() : undefined;
18
+ return { url: String(url), method: init.method ?? 'GET', headers: Object.fromEntries(new Headers(init.headers)),
19
+ body: body?.slice(0, MAX_DIAGNOSTIC_BODY), body_truncated: body === undefined ? undefined : body.length > MAX_DIAGNOSTIC_BODY,
20
+ timeout_ms: timeoutMs };
21
+ }
22
+ function retryDelay(header, status) {
23
+ // A rate limit without a retry window needs a later check, not another
24
+ // request one second later. Explicit, short Retry-After windows remain safe.
25
+ if (header === null)
26
+ return status === 429 ? null : DEFAULT_RETRY_DELAY_MS;
27
+ const value = header.trim();
28
+ const delay = /^\d+$/.test(value)
29
+ ? Number(value) * 1_000
30
+ : /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), /i.test(value)
31
+ ? Date.parse(value) - Date.now()
32
+ : NaN;
33
+ if (!Number.isFinite(delay) || delay > MAX_RETRY_DELAY_MS)
34
+ return null;
35
+ return Math.max(DEFAULT_RETRY_DELAY_MS, delay);
36
+ }
37
+ async function waitBeforeRetry(delayMs, signal) {
38
+ signal?.throwIfAborted();
39
+ await new Promise((resolve, reject) => {
40
+ const abort = () => {
41
+ clearTimeout(timer);
42
+ signal?.removeEventListener('abort', abort);
43
+ reject(signal?.reason);
44
+ };
45
+ const timer = setTimeout(() => {
46
+ signal?.removeEventListener('abort', abort);
47
+ resolve();
48
+ }, delayMs);
49
+ signal?.addEventListener('abort', abort, { once: true });
50
+ });
51
+ }
52
+ async function cancelQuietly(body) {
53
+ try {
54
+ await body?.cancel();
55
+ }
56
+ catch {
57
+ // Cancellation is cleanup; it must not hide the response error.
58
+ }
59
+ }
60
+ export async function fetchBounded(url, init, options) {
61
+ const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
62
+ let response;
63
+ for (let attempt = 0;; attempt += 1) {
64
+ init.signal?.throwIfAborted();
65
+ try {
66
+ const timeout = AbortSignal.timeout(Math.max(0, Math.floor(options.timeoutMs ?? 15_000)));
67
+ response = await (options.fetcher ?? fetch)(url, {
68
+ ...init,
69
+ cache: 'no-store',
70
+ redirect: options.redirect ?? 'error',
71
+ signal: init.signal ? AbortSignal.any([init.signal, timeout]) : timeout,
72
+ });
73
+ }
74
+ catch (error) {
75
+ if (options.retryTransient && attempt === 0 && !init.signal?.aborted) {
76
+ await waitBeforeRetry(DEFAULT_RETRY_DELAY_MS, init.signal);
77
+ continue;
78
+ }
79
+ throw new UpstreamNetworkError(options.provider, error, requestDiagnostics(url, init, options.timeoutMs ?? 15_000));
80
+ }
81
+ if (response.ok || options.allowHttpError || options.allowHttpStatuses?.includes(response.status))
82
+ break;
83
+ const delay = retryDelay(response.headers.get('retry-after'), response.status);
84
+ if (options.retryTransient && attempt === 0
85
+ && TRANSIENT_HTTP_STATUSES.has(response.status) && delay !== null) {
86
+ await cancelQuietly(response.body);
87
+ await waitBeforeRetry(delay, init.signal);
88
+ continue;
89
+ }
90
+ const retryHeader = response.headers.get('retry-after');
91
+ const retryAfterMs = retryHeader === null ? undefined : /^\d+$/.test(retryHeader.trim())
92
+ ? Number(retryHeader) * 1000 : Date.parse(retryHeader) - Date.now();
93
+ // Diagnostic failure must never replace the original HTTP status.
94
+ const diagnostics = await readUpstreamHttpDiagnostics(response).catch(() => undefined);
95
+ throw new UpstreamHttpError(options.provider, response.status, Number.isFinite(retryAfterMs) ? Math.max(0, retryAfterMs) : undefined, diagnostics, requestDiagnostics(url, init, options.timeoutMs ?? 15_000));
96
+ }
97
+ const contentLength = Number(response.headers.get('content-length'));
98
+ if (Number.isFinite(contentLength) && contentLength > maxBytes) {
99
+ await cancelQuietly(response.body);
100
+ throw new Error(`${options.provider} returned an unexpectedly large response`);
101
+ }
102
+ if (!response.body)
103
+ return { response, bytes: new Uint8Array() };
104
+ const reader = response.body.getReader();
105
+ const chunks = [];
106
+ let length = 0;
107
+ try {
108
+ while (true) {
109
+ const { done, value } = await reader.read().catch((error) => {
110
+ throw new UpstreamNetworkError(options.provider, error, requestDiagnostics(url, init, options.timeoutMs ?? 15_000));
111
+ });
112
+ if (done)
113
+ break;
114
+ length += value.byteLength;
115
+ if (length > maxBytes) {
116
+ try {
117
+ await reader.cancel();
118
+ }
119
+ catch {
120
+ // Preserve the size error even if the upstream stream rejects cleanup.
121
+ }
122
+ throw new Error(`${options.provider} returned an unexpectedly large response`);
123
+ }
124
+ chunks.push(value);
125
+ }
126
+ }
127
+ finally {
128
+ reader.releaseLock();
129
+ }
130
+ const bytes = new Uint8Array(length);
131
+ let offset = 0;
132
+ for (const chunk of chunks) {
133
+ bytes.set(chunk, offset);
134
+ offset += chunk.byteLength;
135
+ }
136
+ return { response, bytes };
137
+ }
138
+ export function decodeText(bytes, encoding = 'utf-8') {
139
+ return new TextDecoder(encoding, { fatal: false }).decode(bytes);
140
+ }
141
+ export function parseJsonBytes(bytes, provider) {
142
+ try {
143
+ return JSON.parse(decodeText(bytes).replace(/^\uFEFF/, ''));
144
+ }
145
+ catch (error) {
146
+ throw Object.assign(new TypeError(`${provider} returned an invalid tracking response`, { cause: error }), {
147
+ provider, response_body: decodeText(bytes.subarray(0, MAX_DIAGNOSTIC_BODY)),
148
+ response_body_truncated: bytes.byteLength > MAX_DIAGNOSTIC_BODY,
149
+ });
150
+ }
151
+ }
152
+ export { UpstreamHttpError, UpstreamNetworkError };
@@ -0,0 +1,14 @@
1
+ import type { Page } from 'playwright-core';
2
+ import type { CarrierResult } from '../result/index.js';
3
+ export interface UniversalBrowserOptions {
4
+ executablePath?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export declare function scrapeUniversalPage(options: UniversalBrowserOptions, spec: {
8
+ name: string;
9
+ url: string;
10
+ responseUrl: string;
11
+ submit?: (page: Page) => Promise<void>;
12
+ /** Explicit terminal replies from the lookup flow, including its submission endpoint. */
13
+ responseErrors?: Readonly<Record<string, (payload: unknown) => Error | undefined>>;
14
+ }, parse: (payload: unknown) => CarrierResult): Promise<CarrierResult>;
@@ -0,0 +1,113 @@
1
+ import { loadChromium } from './optional.js';
2
+ import { UpstreamHttpError } from '../errors/index.js';
3
+ // A process handles many syncs concurrently. Do not spawn a browser per parcel
4
+ // when a carrier outage sends an entire batch through the fallback chain.
5
+ let busy = false;
6
+ export async function scrapeUniversalPage(options, spec, parse) {
7
+ const executablePath = options.executablePath;
8
+ if (!executablePath)
9
+ throw new Error(`${spec.name} requires TRACKING_CHROMIUM_PATH`);
10
+ const timeoutMs = options.timeoutMs ?? 45_000;
11
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 60_000)
12
+ throw new TypeError('Browser tracking timeout must be between 1 and 60000 ms');
13
+ if (busy)
14
+ throw new Error('Tracking browser is busy; retry on the next sync');
15
+ busy = true;
16
+ let browser;
17
+ let timer;
18
+ let expired = false;
19
+ try {
20
+ const deadline = Date.now() + timeoutMs;
21
+ // Do not pass the application environment (database/API secrets) to Chromium.
22
+ browser = await (await loadChromium(spec.name)).launch({ executablePath, headless: true,
23
+ args: ['--disable-blink-features=AutomationControlled', '--disable-dev-shm-usage'], timeout: Math.min(timeoutMs, 10_000),
24
+ env: { PATH: process.env.PATH ?? '', HOME: process.env.HOME ?? '/tmp', LANG: 'en_US.UTF-8' } });
25
+ const platform = process.platform === 'darwin' ? 'Macintosh; Intel Mac OS X 10_15_7' : 'X11; Linux x86_64';
26
+ const userAgent = `Mozilla/5.0 (${platform}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${browser.version()} Safari/537.36`;
27
+ const remaining = Math.max(1, deadline - Date.now());
28
+ let received = 0;
29
+ let resolveHistory;
30
+ let rejectHistory;
31
+ const history = new Promise((resolve, reject) => {
32
+ resolveHistory = resolve;
33
+ rejectHistory = reject;
34
+ timer = setTimeout(() => { expired = true; reject(new Error(`${spec.name} did not return matching tracking history before the timeout`)); }, remaining);
35
+ });
36
+ // Attach the rejection handler before navigation can fail or time out.
37
+ const navigation = (async () => {
38
+ const context = await browser.newContext({ userAgent, locale: 'en-US', timezoneId: 'UTC',
39
+ viewport: { width: 1440, height: 1000 }, acceptDownloads: false, serviceWorkers: 'block' });
40
+ // Only the provider and its challenge resources are needed. This also keeps
41
+ // advertisements and provider scripts from reaching private network hosts.
42
+ const provider = new URL(spec.url).hostname.replace(/^www\./, '');
43
+ await context.route('**/*', async (route) => {
44
+ const url = new URL(route.request().url());
45
+ const allowed = url.protocol === 'https:' && (url.hostname === provider || url.hostname.endsWith(`.${provider}`)
46
+ || url.hostname.endsWith('.challenges.cloudflare.com')
47
+ || ['challenges.cloudflare.com', 'www.google.com', 'www.gstatic.com', 'www.recaptcha.net'].includes(url.hostname));
48
+ await (allowed ? route.continue() : route.abort());
49
+ });
50
+ const page = await context.newPage();
51
+ page.setDefaultTimeout(remaining);
52
+ page.on('response', async (response) => {
53
+ const url = response.url();
54
+ const inspect = Object.hasOwn(spec.responseErrors ?? {}, url) ? spec.responseErrors[url] : undefined;
55
+ if (expired || (url !== spec.responseUrl && !inspect))
56
+ return;
57
+ if (response.status() === 429) {
58
+ const raw = response.headers()['retry-after'];
59
+ const delay = raw && /^\d+$/.test(raw) ? Number(raw) * 1000 : raw ? Date.parse(raw) - Date.now() : undefined;
60
+ rejectHistory(new UpstreamHttpError(spec.name, 429, delay));
61
+ return;
62
+ }
63
+ if (![200, 201].includes(response.status()))
64
+ return;
65
+ if (++received > 20) {
66
+ rejectHistory(new Error(`${spec.name} returned too many polling responses`));
67
+ return;
68
+ }
69
+ try {
70
+ if (Number(response.headers()['content-length'] ?? 0) > 2_000_000)
71
+ return;
72
+ const body = await response.body();
73
+ if (expired || body.length > 2_000_000)
74
+ return;
75
+ const payload = JSON.parse(body.toString('utf8'));
76
+ const error = inspect?.(payload);
77
+ if (error) {
78
+ rejectHistory(error);
79
+ return;
80
+ }
81
+ if (url === spec.responseUrl)
82
+ resolveHistory(parse(payload));
83
+ }
84
+ catch {
85
+ // Initial polling, challenges and unrelated shipments are not history.
86
+ }
87
+ });
88
+ const response = await page.goto(spec.url, { waitUntil: 'domcontentloaded', timeout: remaining });
89
+ // Cloudflare initially responds with 403, then navigates after its
90
+ // automatic browser check. Let the bounded lookup wait for that reload.
91
+ const challenge = response?.status() === 403 && response.headers()['cf-mitigated'] === 'challenge';
92
+ if (!response)
93
+ throw new Error(`${spec.name} tracking page is unavailable`);
94
+ if (response.status() !== 200 && !challenge)
95
+ throw new UpstreamHttpError(spec.name, response.status());
96
+ if (spec.submit)
97
+ await spec.submit(page);
98
+ return history;
99
+ })();
100
+ return await Promise.race([navigation, history]);
101
+ }
102
+ finally {
103
+ expired = true;
104
+ if (timer)
105
+ clearTimeout(timer);
106
+ try {
107
+ await browser?.close();
108
+ }
109
+ finally {
110
+ busy = false;
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,8 @@
1
+ export { fetchBounded, decodeText, parseJsonBytes, UpstreamHttpError, UpstreamNetworkError } from './boundedFetch.js';
2
+ export { readUpstreamHttpDiagnostics } from './upstreamHttpDiagnostics.js';
3
+ export type { UpstreamHttpDiagnostics } from './upstreamHttpDiagnostics.js';
4
+ export { TrawlClient, TrawlError, trawlBody, trawlEndpoint } from './trawl.js';
5
+ export type { TrawlScrapeRequest, TrawlScrapeResponse, TrawlCapturedResponse, TrawlCallOptions } from './trawl.js';
6
+ export { clean, cleanScalar, escapeRegExp, textFromHtml } from './text.js';
7
+ export { scrapeUniversalPage } from './browser.js';
8
+ export type { UniversalBrowserOptions } from './browser.js';
@@ -0,0 +1,5 @@
1
+ export { fetchBounded, decodeText, parseJsonBytes, UpstreamHttpError, UpstreamNetworkError } from './boundedFetch.js';
2
+ export { readUpstreamHttpDiagnostics } from './upstreamHttpDiagnostics.js';
3
+ export { TrawlClient, TrawlError, trawlBody, trawlEndpoint } from './trawl.js';
4
+ export { clean, cleanScalar, escapeRegExp, textFromHtml } from './text.js';
5
+ export { scrapeUniversalPage } from './browser.js';
@@ -0,0 +1,2 @@
1
+ export declare function loadChromium(provider: string): Promise<import("playwright-core").BrowserType<{}>>;
2
+ export declare function loadSharp(provider: string): Promise<import("sharp").SharpConstructor>;
@@ -0,0 +1,17 @@
1
+ import { TransportError } from '../errors/index.js';
2
+ export async function loadChromium(provider) {
3
+ try {
4
+ return (await import('playwright-core')).chromium;
5
+ }
6
+ catch (cause) {
7
+ throw new TransportError(provider, 'Install playwright-core to enable browser tracking', { cause });
8
+ }
9
+ }
10
+ export async function loadSharp(provider) {
11
+ try {
12
+ return (await import('sharp')).default;
13
+ }
14
+ catch (cause) {
15
+ throw new TransportError(provider, 'Install sharp to enable image challenges', { cause });
16
+ }
17
+ }
@@ -0,0 +1,8 @@
1
+ /** Small text helpers every adapter needs when projecting provider payloads. */
2
+ /** Collapse whitespace, trim, and cap the length of a provider string; non-strings become ''. */
3
+ export declare function clean(value: unknown, maxLength?: number): string;
4
+ /** Like `clean`, for values that may arrive as numbers (ids, codes). */
5
+ export declare function cleanScalar(value: unknown, maxLength?: number): string;
6
+ export declare function escapeRegExp(value: string): string;
7
+ /** Strip tags from an HTML fragment and collapse whitespace; for short provider strings only. */
8
+ export declare function textFromHtml(value: unknown, maxLength?: number): string;