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,95 @@
1
+ import { NOOP_RECORDER } from '../core/telemetry/index.js';
2
+ import { TrawlClient } from '../core/transport/index.js';
3
+ import { adapter as parcelsAppAdapter } from './parcelsapp/adapter.js';
4
+ import { adapter as postalNinjaAdapter } from './postal-ninja/adapter.js';
5
+ import { adapter as seventeenTrackAdapter } from './seventeentrack/adapter.js';
6
+ import { adapter as ship24Adapter } from './ship24/adapter.js';
7
+ import { adapter as upuAdapter } from './upu/adapter.js';
8
+ import { numberOf } from './shared/result.js';
9
+ export { parse17TrackResponse, SeventeenTrackLookupError, SeventeenTrackNoHistoryError, SeventeenTrackVerificationError } from './seventeentrack/adapter.js';
10
+ export { parseParcelsAppHtml, parseParcelsAppResponse } from './parcelsapp/adapter.js';
11
+ export { parsePostalNinjaResponse } from './postal-ninja/adapter.js';
12
+ export { parseShip24Response } from './ship24/adapter.js';
13
+ export { TrackingCaptureError } from './shared/capture.js';
14
+ export * from './plan.js';
15
+ import { universalSources, universalSourceBudget } from './plan.js';
16
+ const FACTORIES = {
17
+ 'Ship24': ship24Adapter,
18
+ 'ParcelsApp': parcelsAppAdapter,
19
+ 'Postal Ninja': postalNinjaAdapter,
20
+ '17TRACK': seventeenTrackAdapter,
21
+ 'UPU': upuAdapter,
22
+ };
23
+ export class UniversalTrackingError extends AggregateError {
24
+ failures;
25
+ constructor(failures) {
26
+ super(failures.map(({ error }) => error), `Automatic carrier lookup could not retrieve tracking history. ${failures.map(({ source, reason }) => `${source}: ${reason}`).join('; ')}`);
27
+ this.failures = failures;
28
+ this.name = 'UniversalTrackingError';
29
+ }
30
+ }
31
+ export class UniversalTracker {
32
+ options;
33
+ instances = new Map();
34
+ constructor(options = {}) {
35
+ this.options = options;
36
+ if (options.timeoutMs !== undefined && (!Number.isFinite(options.timeoutMs) || options.timeoutMs <= 0)) {
37
+ throw new TypeError('Universal tracking timeout must be positive');
38
+ }
39
+ }
40
+ /**
41
+ * Look up one number through the whole chain. `postcode` is the parcel's
42
+ * stored delivery postcode, if the user supplied one: it is forwarded into
43
+ * every provider's track input. ParcelsApp submits it as extra[zipcode] on
44
+ * its direct API request; the other providers currently do not consume it.
45
+ */
46
+ async fetch(trackingNumber, postcode) {
47
+ numberOf(trackingNumber);
48
+ const failures = [];
49
+ const sources = universalSources(this.options.enablePostalNinja, trackingNumber).filter(source => (this.options.providers ?? ['UPU']).includes(source));
50
+ for (const source of sources) {
51
+ try {
52
+ return await this.fetchSource(source, trackingNumber, undefined, postcode);
53
+ }
54
+ catch (error) {
55
+ failures.push({ source, reason: 'history unavailable; try again later or open the tracking website', error });
56
+ }
57
+ }
58
+ throw new UniversalTrackingError(failures);
59
+ }
60
+ async fetchSource(source, trackingNumber, timeoutMs = this.options.timeoutMs ?? universalSourceBudget(source), postcode, timezone, signal) {
61
+ const number = numberOf(trackingNumber);
62
+ if (this.options.browserLookup && (source === 'Postal Ninja' || source === 'Ship24')) {
63
+ return await this.options.browserLookup(source, number);
64
+ }
65
+ return await this.provider(source).track({ number, postcode: postcode ?? null, timezone: timezone ?? null }, { budgetMs: timeoutMs, signal });
66
+ }
67
+ /** One provider adapter, built from this tracker's environment. */
68
+ provider(source) {
69
+ let instance = this.instances.get(source);
70
+ if (!instance) {
71
+ instance = FACTORIES[source](this.environment());
72
+ this.instances.set(source, instance);
73
+ }
74
+ return instance;
75
+ }
76
+ environment() {
77
+ const partial = this.options.environment ?? {};
78
+ const fetcher = partial.fetcher ?? this.options.fetcher;
79
+ return {
80
+ fetcher,
81
+ trawl: this.trawl(fetcher, partial),
82
+ browserExecutablePath: partial.browserExecutablePath ?? this.options.executablePath ?? null,
83
+ recorder: partial.recorder ?? NOOP_RECORDER,
84
+ env: partial.env ?? {},
85
+ };
86
+ }
87
+ trawl(fetcher, partial) {
88
+ const configured = this.options.trawlUrl;
89
+ if (configured !== undefined)
90
+ return configured ? new TrawlClient(configured, fetcher) : null;
91
+ if (partial.trawl !== undefined)
92
+ return partial.trawl;
93
+ return TrawlClient.fromEnvironment(partial.env ?? {}, fetcher);
94
+ }
95
+ }
@@ -0,0 +1,5 @@
1
+ import type { AdapterFactory } from '../../core/adapter/index.js';
2
+ import type { CarrierResult } from '../../core/result/index.js';
3
+ export declare const UPU_BUDGET_MS = 8000;
4
+ export declare function parseUpuResponse(payload: unknown, trackingNumber: string): CarrierResult;
5
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,107 @@
1
+ import { DateTime } from 'luxon';
2
+ import { isValidS10TrackingNumber } from '../../core/detection/s10.js';
3
+ import { NotFoundError, SchemaError } from '../../core/errors/index.js';
4
+ import { runSteps } from '../../core/runner/index.js';
5
+ import { decodeText, fetchBounded, parseJsonBytes } from '../../core/transport/index.js';
6
+ import { isRecord } from '../../core/types.js';
7
+ import { eventStage, hasPrivateDeliveryDetails, isNotice, numberOf, result, text } from '../shared/result.js';
8
+ const SOURCE = 'UPU';
9
+ export const UPU_BUDGET_MS = 8_000;
10
+ const MAX_EVENTS = 1_000;
11
+ const STAGES = {
12
+ EMA: 'accepted', EMB: 'in_transit', EMC: 'in_transit', EMD: 'in_transit',
13
+ EDA: 'customs', EDB: 'customs', EDC: 'in_transit',
14
+ EXA: 'customs', EXB: 'customs', EXC: 'in_transit', EMI: 'delivered',
15
+ };
16
+ /** The wire offset was contradicted by a destination operator; retain wall time only. */
17
+ function localTime(value) {
18
+ if (typeof value !== 'string')
19
+ throw new SchemaError(SOURCE, 'UPU event has no date');
20
+ const wcf = /^\/Date\((-?\d+)([+-])(\d{2})(\d{2})\)\/$/.exec(value);
21
+ let date;
22
+ if (wcf) {
23
+ const hours = Number(wcf[3]);
24
+ const minutes = Number(wcf[4]);
25
+ if (hours > 14 || minutes > 59 || (hours === 14 && minutes !== 0)) {
26
+ throw new SchemaError(SOURCE, 'UPU event has an invalid offset');
27
+ }
28
+ const offset = (wcf[2] === '+' ? 1 : -1) * (hours * 60 + minutes);
29
+ date = DateTime.fromMillis(Number(wcf[1]), { zone: 'UTC' }).plus({ minutes: offset });
30
+ }
31
+ else {
32
+ // Documented ISO replies still do not establish the event's true zone.
33
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$/.test(value)) {
34
+ throw new SchemaError(SOURCE, 'UPU event has an invalid date');
35
+ }
36
+ date = DateTime.fromISO(value, { setZone: true, zone: 'UTC' });
37
+ }
38
+ if (!date.isValid || date.year < 1900 || date.year > 2200)
39
+ throw new SchemaError(SOURCE, 'UPU event has an invalid date');
40
+ return date.toFormat("yyyy-MM-dd'T'HH:mm:ss");
41
+ }
42
+ export function parseUpuResponse(payload, trackingNumber) {
43
+ const number = numberOf(trackingNumber);
44
+ if (Array.isArray(payload) && payload.length === 0)
45
+ throw new NotFoundError(SOURCE, 'UPU has no available history');
46
+ if (!Array.isArray(payload) || payload.length !== 1 || !isRecord(payload[0]) || payload[0].ID !== number
47
+ || !Array.isArray(payload[0].Events) || payload[0].Events.length > MAX_EVENTS) {
48
+ throw new SchemaError(SOURCE, 'UPU has no matching shipment history');
49
+ }
50
+ const events = [];
51
+ for (const raw of payload[0].Events) {
52
+ if (!isRecord(raw) || typeof raw.EventCd !== 'string' || !/^[A-Z0-9]{2,8}$/.test(raw.EventCd)) {
53
+ throw new SchemaError(SOURCE, 'UPU returned an invalid event');
54
+ }
55
+ const description = text(raw.EventNm);
56
+ // DLV means a forecast, not final delivery. Do not let it advance freshness.
57
+ if (raw.EventCd === 'DLV' || /\b(?:estimated|expected|predicted) delivery\b/i.test(description))
58
+ continue;
59
+ if (!description || isNotice(description))
60
+ throw new SchemaError(SOURCE, 'UPU returned no event label');
61
+ const stage = STAGES[raw.EventCd] ?? eventStage(description) ?? 'pending';
62
+ if (stage !== 'delivered' && hasPrivateDeliveryDetails(description))
63
+ continue;
64
+ const location = text(raw.EventLocation);
65
+ events.push({ local_time: localTime(raw.EventDT), provider_code: raw.EventCd,
66
+ description: stage === 'delivered' ? 'Delivered' : description, stage,
67
+ ...(location && !hasPrivateDeliveryDetails(location) ? { location } : {}),
68
+ });
69
+ }
70
+ if (!events.length)
71
+ throw new NotFoundError(SOURCE, 'UPU has no actual tracking scans');
72
+ // The response is oldest first. Sort within this feed only; never compare its
73
+ // wall times with another provider's instants. Numeric State is not a scan.
74
+ const unique = [...new Map(events.map((event) => [JSON.stringify([
75
+ event.local_time, event.provider_code, event.location, event.description,
76
+ ]), event])).values()].sort((a, b) => String(b.local_time).localeCompare(String(a.local_time)));
77
+ const projected = { ...result(unique, SOURCE, true), events: unique };
78
+ return { ...projected, last_update_local: projected.events?.[0]?.local_time,
79
+ tracking_source: 'structured-web-response' };
80
+ }
81
+ export const adapter = (environment) => ({
82
+ id: SOURCE,
83
+ steps: ['direct'],
84
+ async track(input, context) {
85
+ const number = numberOf(input.number);
86
+ if (!isValidS10TrackingNumber(number))
87
+ throw new TypeError('UPU requires a checksum-valid postal S10 number');
88
+ const budgetMs = Math.min(context?.budgetMs ?? UPU_BUDGET_MS, UPU_BUDGET_MS);
89
+ if (!Number.isFinite(budgetMs) || budgetMs < 1)
90
+ throw new TypeError('UPU timeout must be positive');
91
+ context?.signal?.throwIfAborted();
92
+ return runSteps({ carrier: SOURCE, budgetMs, signal: context?.signal, recorder: environment.recorder }, [{
93
+ id: 'direct',
94
+ run: async ({ remainingMs, signal }) => {
95
+ const { bytes } = await fetchBounded(`https://globaltracktrace.ptc.post/gtt.api/service.svc/rest/ItemTTWithTrans/${number}/EN`, {}, { provider: SOURCE, timeoutMs: Math.max(1, Math.floor(remainingMs)), maxBytes: 2_000_000,
96
+ fetcher: (url, init) => (environment.fetcher ?? fetch)(url, {
97
+ ...init, signal: AbortSignal.any([signal, ...(init?.signal ? [init.signal] : [])]),
98
+ }),
99
+ });
100
+ // The observed unknown/expired lookup is HTTP 200 with no body.
101
+ if (!decodeText(bytes).trim())
102
+ throw new NotFoundError(SOURCE, 'UPU has no available history');
103
+ return parseUpuResponse(parseJsonBytes(bytes, SOURCE), number);
104
+ },
105
+ }]);
106
+ },
107
+ });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @param {{ title: string, totals: string, rows: { result: 'failed' | 'unverified', check: string, reason: string }[] }} report
3
+ * @param {Record<string, string | undefined>} [env]
4
+ */
5
+ export function writeCanaryReport({ title, totals, rows }: {
6
+ title: string;
7
+ totals: string;
8
+ rows: {
9
+ result: "failed" | "unverified";
10
+ check: string;
11
+ reason: string;
12
+ }[];
13
+ }, env?: Record<string, string | undefined>): void;
14
+ /**
15
+ * Vitest reporter for the live carrier suites. A skip with a note (bot
16
+ * protection, an unsolved challenge) is inconclusive, not a pass, so it is
17
+ * listed; a skip without one is a check gated on private input or a solver.
18
+ */
19
+ export default class CanaryReporter {
20
+ /** @param {ReadonlyArray<import('vitest/node').TestModule>} testModules */
21
+ onTestRunEnd(testModules: ReadonlyArray<import("vitest/node").TestModule>, unhandledErrors: any): void;
22
+ }
@@ -0,0 +1,69 @@
1
+ import fs from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+
4
+ // Daily carrier canary reporting for GitHub Actions. Every failed or
5
+ // inconclusive live check is listed with its reason in the job summary, and
6
+ // failures become the `failures` step output read by the issue job. Outside
7
+ // Actions (no GITHUB_STEP_SUMMARY or GITHUB_OUTPUT) nothing is written.
8
+
9
+ function cell(text) {
10
+ return String(text).replace(/\s+/g, ' ').replace(/\|/g, '\\|').replace(/`/g, "'").trim().slice(0, 240);
11
+ }
12
+
13
+ /**
14
+ * @param {{ title: string, totals: string, rows: { result: 'failed' | 'unverified', check: string, reason: string }[] }} report
15
+ * @param {Record<string, string | undefined>} [env]
16
+ */
17
+ export function writeCanaryReport({ title, totals, rows }, env = process.env) {
18
+ if (env.GITHUB_STEP_SUMMARY) {
19
+ let summary = `### ${title}\n\n${totals}\n`;
20
+ if (rows.length) {
21
+ summary += '\n| Result | Check | Reason |\n| --- | --- | --- |\n';
22
+ for (const row of rows) {
23
+ summary += `| ${row.result === 'failed' ? '❌ failed' : '⚠️ unverified'} | ${cell(row.check)} | ${cell(row.reason)} |\n`;
24
+ }
25
+ }
26
+ fs.appendFileSync(env.GITHUB_STEP_SUMMARY, `${summary}\n`);
27
+ }
28
+ const failures = rows.filter((row) => row.result === 'failed');
29
+ if (env.GITHUB_OUTPUT && failures.length) {
30
+ const delimiter = `EOF_${randomUUID()}`;
31
+ const lines = failures.map((row) => `- \`${cell(row.check)}\`: ${cell(row.reason)}`);
32
+ fs.appendFileSync(env.GITHUB_OUTPUT, `failures<<${delimiter}\n${lines.join('\n')}\n${delimiter}\n`);
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Vitest reporter for the live carrier suites. A skip with a note (bot
38
+ * protection, an unsolved challenge) is inconclusive, not a pass, so it is
39
+ * listed; a skip without one is a check gated on private input or a solver.
40
+ */
41
+ export default class CanaryReporter {
42
+ /** @param {ReadonlyArray<import('vitest/node').TestModule>} testModules */
43
+ onTestRunEnd(testModules, unhandledErrors) {
44
+ /** @type {{ result: 'failed' | 'unverified', check: string, reason: string }[]} */
45
+ const rows = [];
46
+ let passed = 0;
47
+ let gated = 0;
48
+ const reason = (error) => `${error?.name ?? 'Error'}: ${error?.message ?? 'failed'}`;
49
+ for (const testModule of testModules) {
50
+ for (const error of testModule.errors()) {
51
+ rows.push({ result: 'failed', check: testModule.relativeModuleId, reason: reason(error) });
52
+ }
53
+ for (const test of testModule.children.allTests()) {
54
+ const result = test.result();
55
+ if (result.state === 'passed') passed += 1;
56
+ else if (result.state === 'failed') rows.push({ result: 'failed', check: test.fullName, reason: reason(result.errors?.[0]) });
57
+ else if (result.state === 'skipped' && result.note) rows.push({ result: 'unverified', check: test.fullName, reason: result.note });
58
+ else gated += 1;
59
+ }
60
+ }
61
+ for (const error of unhandledErrors) rows.push({ result: 'failed', check: 'Unhandled error', reason: reason(error) });
62
+ const failed = rows.filter((row) => row.result === 'failed').length;
63
+ writeCanaryReport({
64
+ title: process.env.CANARY_SUMMARY_TITLE || 'Live carrier checks',
65
+ totals: `${passed} passed · ${failed} failed · ${rows.length - failed} unverified · ${gated} not run (need private input or a challenge solver)`,
66
+ rows,
67
+ });
68
+ }
69
+ }
@@ -0,0 +1,50 @@
1
+ export interface CanaryTarget {
2
+ carrierId: string;
3
+ displayName: string;
4
+ url: string;
5
+ }
6
+ export interface CanaryResult {
7
+ target: CanaryTarget;
8
+ status: number | null;
9
+ error?: string;
10
+ }
11
+ interface CanaryError {
12
+ name: string;
13
+ code?: string;
14
+ syscall?: string;
15
+ address?: string;
16
+ port?: number;
17
+ cause?: CanaryError;
18
+ errors?: CanaryError[];
19
+ truncated?: boolean;
20
+ }
21
+ interface CanaryAttempt {
22
+ attempt: number;
23
+ maxAttempts: number;
24
+ timeoutMs: number;
25
+ durationMs: number;
26
+ status: number | null;
27
+ error?: CanaryError;
28
+ }
29
+ export declare function canaryHealthy(result: CanaryResult): boolean;
30
+ export declare function automaticCanaryTargets(definitions?: unknown): CanaryTarget[];
31
+ export declare function requestCanaryStatus(url: string, timeoutMs: number): Promise<number>;
32
+ export declare function probeCanaryTarget(target: CanaryTarget, options?: {
33
+ timeoutMs?: number;
34
+ attempts?: number;
35
+ fetchStatus?: (url: string, timeoutMs: number) => Promise<number>;
36
+ onAttempt?: (target: CanaryTarget, result: CanaryAttempt) => void;
37
+ }): Promise<CanaryResult>;
38
+ export declare function runCanaries(targets: CanaryTarget[], options?: Parameters<typeof probeCanaryTarget>[1]): Promise<CanaryResult[]>;
39
+ /**
40
+ * Probes each target that got no HTTP answer again after a pause, for up to
41
+ * `rechecks` rounds. A front door on rotating DNS can hand out an edge this
42
+ * network cannot reach (YTO's CDN does), and an immediate retry meets the
43
+ * same address.
44
+ */
45
+ export declare function recheckUnanswered(results: CanaryResult[], options?: NonNullable<Parameters<typeof probeCanaryTarget>[1]> & {
46
+ rechecks?: number;
47
+ pauseMs?: number;
48
+ }): Promise<CanaryResult[]>;
49
+ export declare function carrierCanaryMain(argv?: string[]): Promise<number>;
50
+ export {};
@@ -0,0 +1,220 @@
1
+ import { isIP } from 'node:net';
2
+ import { pathToFileURL } from 'node:url';
3
+ import catalog from '../data/catalog.json' with { type: 'json' };
4
+ const contract = { 'x-carriers': catalog };
5
+ import { writeCanaryReport } from './canary-report.mjs';
6
+ const DEFAULT_TIMEOUT_MS = 15_000;
7
+ const DEFAULT_ATTEMPTS = 2;
8
+ const MAX_CONCURRENCY = 6;
9
+ const DEFAULT_RECHECKS = 2;
10
+ // Longer than the one-minute DNS answers of the CDNs seen rotating their edges.
11
+ const DEFAULT_RECHECK_PAUSE_MS = 70_000;
12
+ const ERROR_NAMES = new Set([
13
+ 'Error', 'TypeError', 'AggregateError', 'AbortError', 'TimeoutError',
14
+ 'ConnectTimeoutError', 'HeadersTimeoutError', 'BodyTimeoutError', 'SocketError',
15
+ ]);
16
+ function isRecord(value) {
17
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
18
+ }
19
+ function canaryErrorDetails(error, seen = new Set()) {
20
+ if (!isRecord(error))
21
+ return { name: typeof error };
22
+ if (seen.has(error) || seen.size >= 8)
23
+ return { name: 'Error', truncated: true };
24
+ seen.add(error);
25
+ const details = {
26
+ name: typeof error.name === 'string' && ERROR_NAMES.has(error.name) ? error.name : 'Error',
27
+ };
28
+ // Copy only bounded diagnostic fields. Messages, stacks and arbitrary properties
29
+ // can contain full URLs, credentials or response content.
30
+ if (typeof error.code === 'string' && /^[A-Z][A-Z0-9_]{0,63}$/.test(error.code)) {
31
+ details.code = error.code;
32
+ }
33
+ if (typeof error.syscall === 'string' && /^[a-z][a-z0-9]{0,31}$/.test(error.syscall)) {
34
+ details.syscall = error.syscall;
35
+ }
36
+ if (typeof error.address === 'string' && isIP(error.address))
37
+ details.address = error.address;
38
+ if (typeof error.port === 'number' && Number.isInteger(error.port) && error.port > 0 && error.port <= 65535) {
39
+ details.port = error.port;
40
+ }
41
+ if (error.cause !== undefined)
42
+ details.cause = canaryErrorDetails(error.cause, seen);
43
+ // Node may wrap the connection failures for several resolved IPs in AggregateError.
44
+ if (Array.isArray(error.errors)) {
45
+ details.errors = error.errors.slice(0, 8).map((item) => canaryErrorDetails(item, seen));
46
+ if (error.errors.length > 8)
47
+ details.truncated = true;
48
+ }
49
+ return details;
50
+ }
51
+ export function canaryHealthy(result) {
52
+ // A challenge or redirect still proves the front door answers. A missing
53
+ // page means the canary URL, and usually the lookup behind it, has moved.
54
+ return result.status !== null && result.status < 500 && result.status !== 404 && result.status !== 410;
55
+ }
56
+ export function automaticCanaryTargets(definitions = contract['x-carriers']) {
57
+ if (!isRecord(definitions))
58
+ throw new TypeError('Carrier definitions must be an object');
59
+ const targets = [];
60
+ for (const [carrierId, value] of Object.entries(definitions)) {
61
+ if (!isRecord(value) || !isRecord(value.tracking) || value.tracking.mode !== 'automatic') {
62
+ continue;
63
+ }
64
+ if (typeof value.displayName !== 'string' || typeof value.canaryUrl !== 'string') {
65
+ throw new TypeError(`Automatic carrier ${carrierId} has no canary metadata`);
66
+ }
67
+ let url;
68
+ try {
69
+ url = new URL(value.canaryUrl);
70
+ }
71
+ catch (error) {
72
+ throw new TypeError(`Automatic carrier ${carrierId} has an unsafe canary URL`, { cause: error });
73
+ }
74
+ if (url.protocol !== 'https:' || !url.hostname || url.username || url.password || url.search || url.hash) {
75
+ throw new TypeError(`Automatic carrier ${carrierId} has an unsafe canary URL`);
76
+ }
77
+ targets.push({ carrierId, displayName: value.displayName, url: url.toString() });
78
+ }
79
+ return targets;
80
+ }
81
+ export async function requestCanaryStatus(url, timeoutMs) {
82
+ const response = await fetch(url, {
83
+ headers: {
84
+ Accept: 'text/html,application/json;q=0.8,*/*;q=0.5',
85
+ 'User-Agent': 'SwissDeliveryTracker-Canary/1.0',
86
+ },
87
+ cache: 'no-store',
88
+ redirect: 'manual',
89
+ signal: AbortSignal.timeout(timeoutMs),
90
+ });
91
+ try {
92
+ await response.body?.cancel();
93
+ }
94
+ catch {
95
+ // The HTTP status is sufficient even if the probe body cannot be cancelled.
96
+ }
97
+ return response.status;
98
+ }
99
+ export async function probeCanaryTarget(target, options = {}) {
100
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
101
+ const attempts = options.attempts ?? DEFAULT_ATTEMPTS;
102
+ const fetchStatus = options.fetchStatus ?? requestCanaryStatus;
103
+ if (!Number.isInteger(attempts) || attempts < 1)
104
+ throw new TypeError('Canary attempts must be positive');
105
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
106
+ throw new TypeError('Canary timeout must be positive');
107
+ let status = null;
108
+ let error;
109
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
110
+ const started = performance.now();
111
+ let errorDetails;
112
+ try {
113
+ status = await fetchStatus(target.url, timeoutMs);
114
+ error = undefined;
115
+ }
116
+ catch (caught) {
117
+ status = null;
118
+ errorDetails = canaryErrorDetails(caught);
119
+ error = errorDetails.name;
120
+ }
121
+ options.onAttempt?.(target, {
122
+ attempt: attempt + 1,
123
+ maxAttempts: attempts,
124
+ timeoutMs,
125
+ durationMs: Math.round(performance.now() - started),
126
+ status,
127
+ ...(errorDetails ? { error: errorDetails } : {}),
128
+ });
129
+ if (status !== null && status < 500)
130
+ break;
131
+ }
132
+ return { target, status, ...(error ? { error } : {}) };
133
+ }
134
+ export async function runCanaries(targets, options = {}) {
135
+ const results = new Array(targets.length);
136
+ let cursor = 0;
137
+ const runWorker = async () => {
138
+ while (cursor < targets.length) {
139
+ const index = cursor;
140
+ cursor += 1;
141
+ results[index] = await probeCanaryTarget(targets[index], options);
142
+ }
143
+ };
144
+ await Promise.all(Array.from({ length: Math.min(MAX_CONCURRENCY, targets.length) }, runWorker));
145
+ return results;
146
+ }
147
+ /**
148
+ * Probes each target that got no HTTP answer again after a pause, for up to
149
+ * `rechecks` rounds. A front door on rotating DNS can hand out an edge this
150
+ * network cannot reach (YTO's CDN does), and an immediate retry meets the
151
+ * same address.
152
+ */
153
+ export async function recheckUnanswered(results, options = {}) {
154
+ const { rechecks = DEFAULT_RECHECKS, pauseMs = DEFAULT_RECHECK_PAUSE_MS, ...probe } = options;
155
+ let current = results;
156
+ for (let round = 0; round < rechecks; round += 1) {
157
+ const unanswered = current.filter((result) => result.status === null).map((result) => result.target);
158
+ if (!unanswered.length)
159
+ break;
160
+ await new Promise((resolve) => { setTimeout(resolve, pauseMs); });
161
+ const rechecked = await runCanaries(unanswered, { ...probe, attempts: 1 });
162
+ current = current.map((result) => rechecked.find((again) => again.target === result.target) ?? result);
163
+ }
164
+ return current;
165
+ }
166
+ function optionValue(argv, name, fallback) {
167
+ const index = argv.indexOf(name);
168
+ if (index < 0)
169
+ return fallback;
170
+ const value = Number(argv[index + 1]);
171
+ if (!Number.isFinite(value) || value <= 0)
172
+ throw new TypeError(`${name} must be positive`);
173
+ return value;
174
+ }
175
+ export async function carrierCanaryMain(argv = process.argv.slice(2)) {
176
+ const timeoutMs = optionValue(argv, '--timeout', DEFAULT_TIMEOUT_MS / 1_000) * 1_000;
177
+ const attempts = optionValue(argv, '--attempts', DEFAULT_ATTEMPTS);
178
+ const pauseMs = optionValue(argv, '--recheck-pause', DEFAULT_RECHECK_PAUSE_MS / 1_000) * 1_000;
179
+ console.log(`CANARY ${JSON.stringify({
180
+ node: process.version,
181
+ undici: process.versions.undici,
182
+ platform: process.platform,
183
+ arch: process.arch,
184
+ timeoutMs,
185
+ attempts,
186
+ concurrency: MAX_CONCURRENCY,
187
+ })}`);
188
+ // Many carriers share a front door (every universal one uses the same
189
+ // provider page), so each URL is probed once and reported for all of them.
190
+ const targets = automaticCanaryTargets();
191
+ const carriersByUrl = new Map();
192
+ for (const target of targets)
193
+ carriersByUrl.set(target.url, [...carriersByUrl.get(target.url) ?? [], target.carrierId]);
194
+ const options = {
195
+ timeoutMs,
196
+ attempts,
197
+ onAttempt: (target, result) => {
198
+ console.log(`ATTEMPT ${target.carrierId} ${new URL(target.url).hostname} ${JSON.stringify(result)}`);
199
+ },
200
+ };
201
+ const results = await recheckUnanswered(await runCanaries(targets.filter((target) => carriersByUrl.get(target.url)[0] === target.carrierId), options), { ...options, pauseMs });
202
+ const failures = [];
203
+ for (const result of results) {
204
+ const carriers = carriersByUrl.get(result.target.url).join(',');
205
+ const hostname = new URL(result.target.url).hostname;
206
+ const outcome = result.status !== null ? `HTTP ${result.status}` : result.error ?? 'unreachable';
207
+ console.log(`${canaryHealthy(result) ? 'PASS' : 'FAIL'} ${carriers} ${hostname} ${outcome}`);
208
+ if (!canaryHealthy(result))
209
+ failures.push({ result: 'failed', check: `${carriers} (${hostname})`, reason: outcome });
210
+ }
211
+ const healthy = results.length - failures.length;
212
+ const totals = `${healthy}/${results.length} canary URLs reachable for ${targets.length} automatic carriers`;
213
+ console.log(totals);
214
+ writeCanaryReport({ title: 'Public carrier reachability', totals, rows: failures });
215
+ return healthy === results.length ? 0 : 1;
216
+ }
217
+ const executable = process.argv[1] ? pathToFileURL(process.argv[1]).href : '';
218
+ if (import.meta.url === executable) {
219
+ process.exitCode = await carrierCanaryMain();
220
+ }
@@ -0,0 +1,20 @@
1
+ import { type IncomingMessage, type ServerResponse } from 'node:http';
2
+ import { type Tracker, type TrackerOptions } from '../facade/index.js';
3
+ export interface TrackingServerOptions extends TrackerOptions {
4
+ token?: string;
5
+ demoPage?: boolean;
6
+ tracker?: Tracker;
7
+ rateLimit?: number;
8
+ cacheMs?: number;
9
+ maxConcurrent?: number;
10
+ /** Receives route names and status only; input and error objects never enter logs. */
11
+ log?: (record: {
12
+ method: string;
13
+ route: string;
14
+ status: number;
15
+ durationMs: number;
16
+ }) => void;
17
+ now?: () => number;
18
+ }
19
+ /** Shared, bounded memory only: no accounts, parcel store, scheduler or database. */
20
+ export declare function createTrackingServer(options?: TrackingServerOptions): import("node:http").Server<typeof IncomingMessage, typeof ServerResponse>;