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,11 @@
1
+ [
2
+ { "country": "CH", "code": "801050", "town": "Zürich", "name": "Zürich-Mülligen", "latitude": 47.3959, "longitude": 8.4695, "source": "https://www.openstreetmap.org/way/24055904" },
3
+ { "country": "CH", "code": "801053", "town": "Zürich", "name": "Zürich-Mülligen", "latitude": 47.3959, "longitude": 8.4695, "source": "https://www.openstreetmap.org/way/24055904" },
4
+ { "country": "CH", "code": "800473", "town": "Zürich", "name": "Zürich Sihlpost", "latitude": 47.3773, "longitude": 8.5353, "source": "https://www.openstreetmap.org/way/36927540" },
5
+ { "country": "CH", "code": "892000", "town": "Urdorf", "name": "Urdorf", "latitude": 47.3676, "longitude": 8.4276, "source": "https://www.openstreetmap.org/way/38934280" },
6
+ { "country": "CH", "code": "852000", "town": "Frauenfeld", "name": "Frauenfeld", "latitude": 47.5716, "longitude": 8.9173, "source": "https://www.openstreetmap.org/way/46882390" },
7
+ { "country": "CH", "code": "462000", "town": "Härkingen", "name": "Härkingen", "latitude": 47.3163, "longitude": 7.8084, "source": "https://www.openstreetmap.org/node/11139998177" },
8
+ { "country": "CH", "code": "462150", "town": "Härkingen", "name": "Härkingen", "latitude": 47.3192, "longitude": 7.8155, "source": "https://www.openstreetmap.org/node/11139998178" },
9
+ { "country": "CH", "code": "131000", "town": "Daillens", "name": "Daillens", "latitude": 46.6327, "longitude": 6.541, "source": "https://www.openstreetmap.org/way/112072584" },
10
+ { "country": "CH", "code": "659100", "town": "Cadenazzo", "name": "Cadenazzo", "latitude": 46.1552, "longitude": 8.9417, "source": "https://www.openstreetmap.org/way/1121092808" }
11
+ ]
@@ -0,0 +1,42 @@
1
+ /** Where a scan happened, as precisely as its free-text location allows. */
2
+ export interface EventPlace {
3
+ latitude: number;
4
+ longitude: number;
5
+ precision: 'city' | 'country';
6
+ /** ISO 3166-1 alpha-2. */
7
+ country: string;
8
+ name: string;
9
+ /** The facility name, when distinct from the town. */
10
+ site?: string;
11
+ }
12
+ /** Where a carrier itself puts a scan's facility (`point` on a stored scan). */
13
+ export interface EventPoint {
14
+ latitude: number;
15
+ longitude: number;
16
+ }
17
+ export interface PlaceHints {
18
+ /** Countries the parcel is likely in, strongest first: neighbouring scans, destination, carrier. */
19
+ countries?: readonly string[];
20
+ }
21
+ /** Loads the gazetteer ahead of the first request that needs it. */
22
+ export declare function preloadPlaces(): void;
23
+ /**
24
+ * Turns one carrier location ("ZUERICH, CH", "Härkingen 4622", "Agence DPD de
25
+ * La Crau (283)", "Germany") into a place, or null when the text names no
26
+ * place we can be confident about. A wrong dot is worse than no dot.
27
+ */
28
+ export declare function locatePlace(location: string | null | undefined, hints?: PlaceHints): EventPlace | null;
29
+ /**
30
+ * Places for a parcel's scans, oldest first. A scan that names no country
31
+ * borrows one from the scans around it, then the destination and the
32
+ * carrier's home countries, so "Buchs" after "Zürich" stays in Switzerland.
33
+ * A carrier's own point for a scan, or for another scan with the same text,
34
+ * moves it from the town's centre to the facility, if the two are within
35
+ * 30 km of each other.
36
+ */
37
+ export declare function placesForEvents(locations: readonly (string | null | undefined)[], { destinationCountry, carrierCountries, points }?: {
38
+ destinationCountry?: string | null;
39
+ carrierCountries?: readonly string[];
40
+ /** The carrier's own point for each scan, where it gave one. */
41
+ points?: readonly (EventPoint | null | undefined)[];
42
+ }): (EventPlace | null)[];
@@ -0,0 +1,307 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { brotliDecompressSync } from 'node:zlib';
3
+ import { ambiguousAddressCodes, trackingPlace } from './trackingLocation.js';
4
+ import facilityList from './facilities.json' with { type: 'json' };
5
+ import { nameKey, nameKeys } from './names.mjs';
6
+ const DATA = new URL('./places.tsv.br', import.meta.url);
7
+ // Words for facilities and services rather than places ("Agence DPD de La Crau", "PAKETZENTRUM").
8
+ const FACILITY_WORDS = new Set(`
9
+ agence agency air airport area branch bureau cedex cidex center centre centro centrum clasificacion colis
10
+ customs delivery depot deposito destination distribution distribuicao dogana douane export facility filiale
11
+ gateway hub import international intl livraison local location logistics logistik mail oddzial office oficina
12
+ operations operativo origin paketzentrum briefzentrum verteilzentrum sortierzentrum zustellbasis zustellstelle
13
+ parcel parcels plateforme platform point postal postfiliale postfach poste pz bz return service services site
14
+ smistamento sort sorting station terminal tratamento tri unidade ufficio warehouse zentrum zoll zollamt
15
+ dhl ups fedex gls dpd tnt usps colissimo chronopost postnl bpost evri hermes cainiao yanwen parcelforce
16
+ planzer quickpac amazon express post home house address recipient sender neighbourhood neighborhood unknown
17
+ `.trim().split(/\s+/));
18
+ const LEADING_WORDS = new Set(['de', 'du', 'des', 'di', 'da', 'del', 'della', 'von', 'of']);
19
+ // Carriers print provinces the way the post does; GeoNames numbers them.
20
+ const ADMIN_CODES = {
21
+ CA: { AB: '01', BC: '02', MB: '03', NB: '04', NL: '05', NS: '07', ON: '08', PE: '09', QC: '10', SK: '11', YT: '12', NT: '13', NU: '14' },
22
+ AU: { ACT: '01', NSW: '02', NT: '03', QLD: '04', SA: '05', TAS: '06', VIC: '07', WA: '08' },
23
+ BR: {
24
+ AC: '01', AL: '02', AP: '03', AM: '04', BA: '05', CE: '06', DF: '07', ES: '08', MS: '11', MA: '13', MT: '14', MG: '15',
25
+ PA: '16', PB: '17', PR: '18', PI: '20', RJ: '21', RN: '22', RS: '23', RO: '24', RR: '25', SC: '26', SP: '27', SE: '28',
26
+ GO: '29', PE: '30', TO: '31',
27
+ },
28
+ };
29
+ // A place nothing else confirms has to be a known town, not a hamlet with the same name.
30
+ const UNCONFIRMED_MIN_THOUSANDS = 15;
31
+ // A carrier's own point for a scan has to agree with the town its text names.
32
+ const POINT_MAX_KM = 30;
33
+ // Swiss Post scans end in the site's six-digit number: "Zürich Briefzentrum 801050".
34
+ const FACILITIES = new Map(facilityList.map((facility) => [`${facility.country}:${facility.code}`, facility]));
35
+ let loaded = null;
36
+ function gazetteer() {
37
+ if (loaded)
38
+ return loaded;
39
+ // Parsed straight from bytes: substrings of one decompressed string would keep all 10 MB of it alive.
40
+ const bytes = brotliDecompressSync(readFileSync(DATA));
41
+ const rows = [];
42
+ for (let start = 0; start < bytes.length;) {
43
+ let end = bytes.indexOf(10, start);
44
+ if (end < 0)
45
+ end = bytes.length;
46
+ const fields = [];
47
+ for (let field = start; field <= end;) {
48
+ let stop = bytes.indexOf(9, field);
49
+ if (stop < 0 || stop > end)
50
+ stop = end;
51
+ fields.push(bytes.toString('utf8', field, stop));
52
+ field = stop + 1;
53
+ }
54
+ rows.push(fields);
55
+ start = end + 1;
56
+ }
57
+ const count = rows.filter((fields) => fields[0] === 'P').length;
58
+ const data = {
59
+ names: [], codes: [],
60
+ country: new Uint16Array(count), admin1: new Uint16Array(count), admin2: new Uint16Array(count),
61
+ latitude: new Float32Array(count), longitude: new Float32Array(count), population: new Uint32Array(count),
62
+ keys: new Map(), postcodes: new Map(), countries: new Map(),
63
+ };
64
+ const codeIndex = new Map();
65
+ const code = (value) => {
66
+ let index = codeIndex.get(value);
67
+ if (index === undefined) {
68
+ index = data.codes.push(value) - 1;
69
+ codeIndex.set(value, index);
70
+ }
71
+ return index;
72
+ };
73
+ const add = (key, entry) => {
74
+ const existing = data.keys.get(key);
75
+ if (existing === undefined)
76
+ data.keys.set(key, entry);
77
+ else if (typeof existing === 'number') {
78
+ if (existing !== entry)
79
+ data.keys.set(key, [existing, entry]);
80
+ }
81
+ else if (!existing.includes(entry))
82
+ existing.push(entry);
83
+ };
84
+ let index = 0;
85
+ for (const fields of rows) {
86
+ if (fields[0] === 'P') {
87
+ const [, name, ascii, country, admin1, admin2, latitude, longitude, population, alternates] = fields;
88
+ data.names.push(name);
89
+ data.country[index] = code(country);
90
+ data.admin1[index] = code(admin1);
91
+ data.admin2[index] = code(admin2);
92
+ data.latitude[index] = Number(latitude);
93
+ data.longitude[index] = Number(longitude);
94
+ data.population[index] = Number(population);
95
+ for (const key of [...nameKeys(name), ...(ascii ? nameKeys(ascii) : [])])
96
+ add(key, index);
97
+ for (const key of alternates ? alternates.split(',') : [])
98
+ add(key, ~index);
99
+ index += 1;
100
+ }
101
+ else if (fields[0] === 'Z') {
102
+ const [, country, postcode, latitude, longitude] = fields;
103
+ data.postcodes.set(`${country}:${postcode}`, { latitude: Number(latitude), longitude: Number(longitude) });
104
+ }
105
+ else if (fields[0] === 'C') {
106
+ const [, country, name, longitude, latitude] = fields;
107
+ data.countries.set(country, { name, latitude: Number(latitude), longitude: Number(longitude) });
108
+ }
109
+ }
110
+ loaded = data;
111
+ return data;
112
+ }
113
+ /** Loads the gazetteer ahead of the first request that needs it. */
114
+ export function preloadPlaces() {
115
+ gazetteer();
116
+ }
117
+ function distanceKm(latitude1, longitude1, latitude2, longitude2) {
118
+ const radians = Math.PI / 180;
119
+ const a = Math.sin((latitude2 - latitude1) * radians / 2) ** 2
120
+ + Math.cos(latitude1 * radians) * Math.cos(latitude2 * radians) * Math.sin((longitude2 - longitude1) * radians / 2) ** 2;
121
+ return 12742 * Math.asin(Math.sqrt(a));
122
+ }
123
+ function tokens(text) {
124
+ return [...text.matchAll(/[\p{L}\p{N}]+/gu)].flatMap((match) => {
125
+ // "BARCELONA2": a depot number glued to the town.
126
+ const word = /\p{L}/u.test(match[0]) ? match[0].replace(/\d+$/u, '') : match[0];
127
+ const key = nameKey(word);
128
+ return key ? [{ key, start: match.index, end: match.index + word.length }] : [];
129
+ });
130
+ }
131
+ /** Phrases worth looking up, most specific first: "zurich mulligen", then "zurich". */
132
+ function phrases(field) {
133
+ const all = tokens(field).filter((token) => !/^\d+$/.test(token.key));
134
+ const found = [];
135
+ const add = (list, rank) => {
136
+ if (!list.length)
137
+ return;
138
+ const key = list.map((token) => token.key).join(' ');
139
+ if (key.length >= 3 && !found.some((phrase) => phrase.key === key)) {
140
+ found.push({ key, text: field.slice(list[0].start, list.at(-1).end), rank });
141
+ }
142
+ };
143
+ add(all, 0);
144
+ let words = all.filter((token) => !FACILITY_WORDS.has(token.key));
145
+ while (words.length && LEADING_WORDS.has(words[0].key))
146
+ words = words.slice(1);
147
+ for (let count = words.length; count > 0; count -= 1)
148
+ add(words.slice(0, count), words.length - count + 1);
149
+ for (let start = 1; start < words.length; start += 1)
150
+ add(words.slice(start), words.length + start);
151
+ return found;
152
+ }
153
+ const candidate = (entry) => ({ index: entry < 0 ? ~entry : entry, alternate: entry < 0 });
154
+ /**
155
+ * Turns one carrier location ("ZUERICH, CH", "Härkingen 4622", "Agence DPD de
156
+ * La Crau (283)", "Germany") into a place, or null when the text names no
157
+ * place we can be confident about. A wrong dot is worse than no dot.
158
+ */
159
+ export function locatePlace(location, hints = {}) {
160
+ const text = location?.trim();
161
+ if (!text)
162
+ return null;
163
+ const facility = facilityPlace(text);
164
+ if (facility)
165
+ return facility;
166
+ const data = gazetteer();
167
+ const explicit = trackingPlace(text);
168
+ let country = explicit.country && data.countries.has(explicit.country) ? explicit.country : null;
169
+ let rest = explicit.country ? explicit.place : text;
170
+ const hinted = [...(hints.countries ?? [])];
171
+ const admin = [];
172
+ const postcodes = [];
173
+ // A trailing code without a comma ("ZUERICH CH"), or one that is also a state
174
+ // or canton ("KOELN, DE", "Buchs SG"): a hint either way.
175
+ const trailing = /[\s,;]+([A-Z]{2})$/.exec(rest)?.[1];
176
+ if (!country && trailing && data.countries.has(trailing)) {
177
+ rest = rest.slice(0, -trailing.length).replace(/[\s,;]+$/, '');
178
+ hinted.unshift(trailing);
179
+ admin.push(trailing);
180
+ if (!/,|;/.test(text.slice(0, -trailing.length)) && !ambiguousAddressCodes.has(trailing))
181
+ country = trailing;
182
+ }
183
+ for (const match of rest.matchAll(/\b([A-Z]{2,3})\b/g))
184
+ admin.push(match[1]);
185
+ for (const match of rest.matchAll(/(?:\b[A-Z]{1,2}-)?\b(\d{4,5})\b/g))
186
+ postcodes.push(match[1]);
187
+ // French departments and Italian provinces in brackets: "Sausheim 68 (68)", "Cologne (BS)".
188
+ for (const match of rest.matchAll(/\((\d{2}|[A-Z]{2})\)|(?:^|\s)(\d{2})(?=\s|$)/g))
189
+ admin.push(match[1] ?? match[2]);
190
+ // Postcodes only confirm a name, and only in a country the scan or the parcel
191
+ // names: on its own, "2024" is more likely a year than a village.
192
+ const countries = country ? [country] : hinted;
193
+ let postcode = null;
194
+ for (const code of postcodes) {
195
+ for (const candidateCountry of countries) {
196
+ const entry = data.postcodes.get(`${candidateCountry}:${code}`);
197
+ if (entry) {
198
+ postcode = { ...entry, country: candidateCountry };
199
+ break;
200
+ }
201
+ }
202
+ if (postcode)
203
+ break;
204
+ }
205
+ let best = null;
206
+ const fields = rest.split(/[,;|()]|\s+-\s+/).map((field) => field.trim()).filter(Boolean);
207
+ for (const [fieldIndex, field] of fields.entries()) {
208
+ for (const phrase of phrases(field)) {
209
+ for (const entry of [data.keys.get(phrase.key) ?? []].flat()) {
210
+ const { index, alternate } = candidate(entry);
211
+ const placeCountry = data.codes[data.country[index]];
212
+ if (country && placeCountry !== country)
213
+ continue;
214
+ const hint = hinted.indexOf(placeCountry);
215
+ const admin1 = data.codes[data.admin1[index]];
216
+ const adminCodes = [admin1, data.codes[data.admin2[index]]].filter(Boolean);
217
+ const adminMatch = admin.some((code) => adminCodes.includes(code) || ADMIN_CODES[placeCountry]?.[code] === admin1);
218
+ const postcodeMatch = postcode !== null && postcode.country === placeCountry
219
+ && distanceKm(postcode.latitude, postcode.longitude, data.latitude[index], data.longitude[index]) < 30;
220
+ const confirmed = Boolean(country) || hint >= 0 || adminMatch || postcodeMatch;
221
+ const thousands = data.population[index];
222
+ if (!confirmed && thousands < UNCONFIRMED_MIN_THOUSANDS)
223
+ continue;
224
+ const score = Math.log10(Math.max(thousands, .3) * 1000)
225
+ + (alternate ? 0 : 1.8)
226
+ + (country ? 4 : hint >= 0 ? 2.5 - Math.min(hint, 3) * .4 : 0)
227
+ + (adminMatch ? 3 : 0) + (postcodeMatch ? 3 : 0)
228
+ - phrase.rank * .3 - fieldIndex * .5;
229
+ if (!best || score > best.score)
230
+ best = { index, score, text: phrase.text };
231
+ }
232
+ }
233
+ }
234
+ if (best) {
235
+ const { index, text: written } = best;
236
+ return {
237
+ latitude: round(data.latitude[index]),
238
+ longitude: round(data.longitude[index]),
239
+ precision: 'city',
240
+ country: data.codes[data.country[index]],
241
+ // Keep the carrier's spelling unless it is shouting: "La Crau", but "Köln" for "KOELN".
242
+ name: /\p{Ll}/u.test(written) ? written : data.names[index],
243
+ };
244
+ }
245
+ const area = country ? data.countries.get(country) : null;
246
+ return area && country ? { latitude: area.latitude, longitude: area.longitude, precision: 'country', country, name: area.name } : null;
247
+ }
248
+ const round = (value) => Math.round(value * 1000) / 1000;
249
+ /** A sorting centre the table knows, by its number and the town its name starts with. */
250
+ function facilityPlace(text) {
251
+ const match = /^(.*\S)\s+(\d{6})$/.exec(text);
252
+ const facility = match && FACILITIES.get(`CH:${match[2]}`);
253
+ if (!facility || !`${nameKey(match[1])} `.startsWith(`${nameKey(facility.town)} `))
254
+ return null;
255
+ const { latitude, longitude, country, town, name } = facility;
256
+ return { latitude, longitude, precision: 'city', country, name: town, ...(name === town ? {} : { site: name }) };
257
+ }
258
+ /** The carrier's own point in place of the town's centre, when the two agree. */
259
+ function atPoint(place, point) {
260
+ if (!place || !point || place.precision !== 'city')
261
+ return place;
262
+ if (distanceKm(place.latitude, place.longitude, point.latitude, point.longitude) > POINT_MAX_KM)
263
+ return place;
264
+ return { ...place, latitude: point.latitude, longitude: point.longitude };
265
+ }
266
+ const cache = new Map();
267
+ const CACHE_SIZE = 20_000;
268
+ function cachedPlace(location, countries) {
269
+ const key = `${countries.join(',')}|${location ?? ''}`;
270
+ if (cache.has(key))
271
+ return cache.get(key);
272
+ const place = locatePlace(location, { countries });
273
+ if (cache.size >= CACHE_SIZE)
274
+ cache.clear();
275
+ cache.set(key, place);
276
+ return place;
277
+ }
278
+ /**
279
+ * Places for a parcel's scans, oldest first. A scan that names no country
280
+ * borrows one from the scans around it, then the destination and the
281
+ * carrier's home countries, so "Buchs" after "Zürich" stays in Switzerland.
282
+ * A carrier's own point for a scan, or for another scan with the same text,
283
+ * moves it from the town's centre to the facility, if the two are within
284
+ * 30 km of each other.
285
+ */
286
+ export function placesForEvents(locations, { destinationCountry, carrierCountries = [], points = [] } = {}) {
287
+ const base = [...new Set([destinationCountry, ...carrierCountries].filter((code) => Boolean(code)))];
288
+ const first = locations.map((location) => cachedPlace(location, base));
289
+ // A carrier can place some scans of an office and not others: they all share it.
290
+ const pointAt = new Map();
291
+ locations.forEach((location, index) => {
292
+ const point = points[index];
293
+ if (location && point && !pointAt.has(location.trim()))
294
+ pointAt.set(location.trim(), point);
295
+ });
296
+ return locations.map((location, index) => {
297
+ if (!location?.trim())
298
+ return null;
299
+ const before = first.slice(0, index).reverse().find(Boolean)?.country;
300
+ const after = first.slice(index + 1).find(Boolean)?.country;
301
+ const neighbours = [...new Set([before, after].filter((code) => Boolean(code)))];
302
+ const place = !neighbours.length || neighbours.every((code) => base.includes(code))
303
+ ? first[index]
304
+ : cachedPlace(location, [...neighbours, ...base.filter((code) => !neighbours.includes(code))]) ?? first[index];
305
+ return atPoint(place, points[index] ?? pointAt.get(location.trim()));
306
+ });
307
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Lower case, no accents, words separated by single spaces:
3
+ * "Zürich" and "ZURICH" both become "zurich", "St. Gallen" becomes "st gallen".
4
+ * @param {string} name
5
+ * @returns {string}
6
+ */
7
+ export function nameKey(name: string): string;
8
+ /**
9
+ * Every key a name answers to, including the German transliteration carriers
10
+ * print in capitals ("ZUERICH", "KOELN") and each half of a bilingual name
11
+ * ("Biel/Bienne").
12
+ * @param {string} name
13
+ * @returns {string[]}
14
+ */
15
+ export function nameKeys(name: string): string[];
@@ -0,0 +1,36 @@
1
+ // Place-name keys shared by the gazetteer generator and the server lookup, so
2
+ // both sides spell every name the same way. Plain JavaScript on purpose: the
3
+ // generator runs in Node without a TypeScript build.
4
+
5
+ const letters = { ß: 'ss', æ: 'ae', Æ: 'ae', ø: 'o', Ø: 'o', œ: 'oe', Œ: 'oe', ł: 'l', Ł: 'l', đ: 'd', Đ: 'd', ı: 'i', þ: 'th', ð: 'd' };
6
+ const german = { ä: 'ae', ö: 'oe', ü: 'ue', Ä: 'ae', Ö: 'oe', Ü: 'ue' };
7
+
8
+ /**
9
+ * Lower case, no accents, words separated by single spaces:
10
+ * "Zürich" and "ZURICH" both become "zurich", "St. Gallen" becomes "st gallen".
11
+ * @param {string} name
12
+ * @returns {string}
13
+ */
14
+ export function nameKey(name) {
15
+ return name
16
+ .replace(/[ßæÆøØœŒłŁđĐıþð]/g, (letter) => letters[/** @type {keyof typeof letters} */ (letter)])
17
+ .normalize('NFD')
18
+ .replace(/\p{Mn}/gu, '')
19
+ .toLowerCase()
20
+ .replace(/[^a-z0-9]+/g, ' ')
21
+ .trim();
22
+ }
23
+
24
+ /**
25
+ * Every key a name answers to, including the German transliteration carriers
26
+ * print in capitals ("ZUERICH", "KOELN") and each half of a bilingual name
27
+ * ("Biel/Bienne").
28
+ * @param {string} name
29
+ * @returns {string[]}
30
+ */
31
+ export function nameKeys(name) {
32
+ const keys = new Set([nameKey(name), nameKey(name.replace(/[äöüÄÖÜ]/g, (letter) => german[/** @type {keyof typeof german} */ (letter)]))]);
33
+ if (name.includes('/')) for (const part of name.split('/')) keys.add(nameKey(part));
34
+ keys.delete('');
35
+ return [...keys];
36
+ }
Binary file
@@ -0,0 +1,18 @@
1
+ /** Country codes that are also states or cantons ("Hebron, KY", "Buchs AG"), so a bare one is not a country. */
2
+ export declare const ambiguousAddressCodes: ReadonlySet<string>;
3
+ /** Passport evidence: only an explicit final country field; never a country inferred from a city. */
4
+ export declare function trackingLocationCountry(location?: string): string | null;
5
+ export interface TrackingPlace {
6
+ /** The country the carrier wrote, as an ISO 3166-1 alpha-2 code. */
7
+ country: string | null;
8
+ /** The rest of the location; empty when the country was all of it. */
9
+ place: string;
10
+ }
11
+ /**
12
+ * For display, take an explicit country off a location: the final field ("Zürich, CH",
13
+ * repeated in "Hebron, KY, US, US") or a leading name ("Switzerland Haerkingen").
14
+ */
15
+ export declare function trackingPlace(location: string): TrackingPlace;
16
+ export declare function countryFlag(code: string): string;
17
+ /** The region's name, with the short "Hong Kong" and "Macao" iOS also uses. */
18
+ export declare function countryName(code: string, languageTag: string): string;
@@ -0,0 +1,89 @@
1
+ const regionCodes = new Set('AD AE AF AG AI AL AM AO AQ AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BV BW BY BZ CA CC CD CF CG CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG EH ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GG GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HM HN HR HT HU ID IE IL IM IN IO IQ IR IS IT JE JM JO JP KE KG KH KI KM KN KP KR KW KY KZ LA LB LC LI LK LR LS LT LU LV LY MA MC MD ME MF MG MH MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NF NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PK PL PM PN PR PS PT PW PY QA RE RO RS RU RW SA SB SC SD SE SG SH SI SJ SK SL SM SN SO SR SS ST SV SX SY SZ TC TD TF TG TH TJ TK TL TM TN TO TR TT TV TW TZ UA UG UM US UY UZ VA VC VE VG VI VN VU WF WS YE YT ZA ZM ZW'.split(' '));
2
+ /** Country codes that are also states or cantons ("Hebron, KY", "Buchs AG"), so a bare one is not a country. */
3
+ export const ambiguousAddressCodes = new Set('AL AZ AR CA CO DE GA ID IL IN KY LA ME MD MA MN MS MO MT NE NC PA SC SD TN VA AG AI BE BL BS FR GE GL GR LU SG SH SO SZ TG NL NU PE SK YT SA'.split(' '));
4
+ // Carrier spellings no region name matches. Display only: Passport evidence
5
+ // stays in step with private.passport_country, which Friends stamps use.
6
+ const carrierSpellings = new Map([
7
+ ['united states of america', 'US'], ['great britain', 'GB'], ['czech republic', 'CZ'], ['holland', 'NL'],
8
+ ['hong kong', 'HK'], ['macau', 'MO'], ['macao', 'MO'], ['turkey', 'TR'], ['russian federation', 'RU'],
9
+ ['korea', 'KR'], ['republic of korea', 'KR'],
10
+ ]);
11
+ // Apple's ICU (Safari, iOS) calls CN "China mainland" in every language; carriers write "China".
12
+ const chinaNames = new Map([['en', 'China'], ['de', 'China'], ['fr', 'Chine'], ['it', 'Cina'], ['es', 'China'], ['pt', 'China'], ['pl', 'Chiny']]);
13
+ // "Mexico City" is a city, not Mexico followed by one.
14
+ const settlementWords = new Set(['city', 'town', 'ville', 'stadt', 'ciudad', 'cidade', 'citta']);
15
+ const normalized = (value) => value.trim().normalize('NFD').replace(/\p{Diacritic}/gu, '').toLowerCase();
16
+ let countryNames;
17
+ const displayNames = new Map();
18
+ function namedCountry(name, display) {
19
+ if (!countryNames) {
20
+ countryNames = new Map([['usa', 'US'], ['uk', 'GB']]);
21
+ for (const language of ['en', 'de', 'fr', 'it', 'es', 'pt', 'pl']) {
22
+ const names = new Intl.DisplayNames([language], { type: 'region' });
23
+ for (const code of regionCodes)
24
+ countryNames.set(normalized(names.of(code) ?? code), code);
25
+ }
26
+ for (const name of chinaNames.values())
27
+ countryNames.set(normalized(name), 'CN');
28
+ }
29
+ const key = normalized(name);
30
+ const code = countryNames.get(key);
31
+ if (code || !display)
32
+ return code ?? null;
33
+ const bare = key.replace(/^the /, '');
34
+ return countryNames.get(bare) ?? carrierSpellings.get(bare) ?? null;
35
+ }
36
+ function fieldCountry(field, location, display) {
37
+ if (regionCodes.has(field))
38
+ return location === field || !ambiguousAddressCodes.has(field) ? field : null;
39
+ return namedCountry(field, display);
40
+ }
41
+ /** Passport evidence: only an explicit final country field; never a country inferred from a city. */
42
+ export function trackingLocationCountry(location) {
43
+ const text = location?.trim();
44
+ const field = text?.split(/[,;|()]/).map((value) => value.trim()).filter(Boolean).at(-1);
45
+ return field ? fieldCountry(field, text, false) : null;
46
+ }
47
+ /**
48
+ * For display, take an explicit country off a location: the final field ("Zürich, CH",
49
+ * repeated in "Hebron, KY, US, US") or a leading name ("Switzerland Haerkingen").
50
+ */
51
+ export function trackingPlace(location) {
52
+ const text = location.trim();
53
+ const fields = [...text.matchAll(/[^,;|()]+/g)].filter((match) => match[0].trim());
54
+ let country = null;
55
+ let kept = fields.length;
56
+ while (kept > 0) {
57
+ const code = fieldCountry(fields[kept - 1][0].trim(), text, true);
58
+ if (!code || (country && code !== country))
59
+ break;
60
+ country = code;
61
+ kept -= 1;
62
+ }
63
+ if (country)
64
+ return { country, place: kept ? text.slice(0, fields[kept].index).replace(/[\s,;|(]+$/u, '') : '' };
65
+ if (fields.length === 1 && text === fields[0][0]) {
66
+ const words = text.split(/\s+/);
67
+ for (let count = Math.min(words.length - 1, 4); count > 0; count -= 1) {
68
+ const code = namedCountry(words.slice(0, count).join(' '), true);
69
+ const place = words.slice(count).join(' ');
70
+ if (code && /^\p{Lu}/u.test(place) && !settlementWords.has(normalized(place)))
71
+ return { country: code, place };
72
+ }
73
+ }
74
+ return { country: null, place: text };
75
+ }
76
+ export function countryFlag(code) {
77
+ return [...code].map((letter) => String.fromCodePoint(letter.charCodeAt(0) + 127397)).join('');
78
+ }
79
+ /** The region's name, with the short "Hong Kong" and "Macao" iOS also uses. */
80
+ export function countryName(code, languageTag) {
81
+ const china = code === 'CN' ? chinaNames.get(languageTag.split('-')[0]) : undefined;
82
+ if (china)
83
+ return china;
84
+ const style = code === 'HK' || code === 'MO' ? 'short' : 'long';
85
+ const key = `${languageTag}:${style}`;
86
+ if (!displayNames.has(key))
87
+ displayNames.set(key, new Intl.DisplayNames([languageTag], { type: 'region', style }));
88
+ return displayNames.get(key).of(code) ?? code;
89
+ }
@@ -0,0 +1,31 @@
1
+ import type { UniversalSource } from './types.js';
2
+ export type CoverageAnswer = 'history' | 'no_history' | 'summary_only' | 'sign_in' | 'postcode_prompt' | 'wrong_carrier' | 'refused' | 'error' | 'blocked' | 'unverified' | 'n/a';
3
+ /** History rows, an answer, or history marked partial with the reason. */
4
+ export type CoverageCell = number | CoverageAnswer | {
5
+ rows: number;
6
+ partial: string;
7
+ };
8
+ export interface CoverageReference {
9
+ /** What this extra reference is; the first one is the table's comparison reference. */
10
+ note?: string;
11
+ /** Too old for a negative to say anything about current coverage. */
12
+ stale?: boolean;
13
+ results: Partial<Record<UniversalSource, CoverageCell>>;
14
+ }
15
+ export interface CarrierCoverage {
16
+ carrier: string;
17
+ /** Table name, when it differs from the catalog's display name. */
18
+ name?: string;
19
+ /** The table's direct-support and direct-sample cells. */
20
+ direct: string;
21
+ sample: string;
22
+ references: CoverageReference[];
23
+ }
24
+ export type CoverageTier = 'full' | 'partial' | 'unknown' | 'empty' | 'excluded';
25
+ export declare const COVERAGE_SOURCES: readonly UniversalSource[];
26
+ export declare const CARRIER_COVERAGE: readonly CarrierCoverage[];
27
+ export declare function isHistory(cell: CoverageCell | undefined): boolean;
28
+ /** The problems of one coverage entry, empty when it is valid. */
29
+ export declare function coverageProblems(entry: CarrierCoverage): string[];
30
+ /** Each provider's tier for a carrier, or null when the carrier has no coverage evidence. */
31
+ export declare function coverageTiers(carrier: string | null | undefined): Record<UniversalSource, CoverageTier> | null;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * What each universal provider returned for public references of a carrier
3
+ * ([coverage.json](coverage.json), rendered in COVERAGE.md), graded for routing.
4
+ *
5
+ * A carrier's references decide one tier per provider:
6
+ * - `full`: history, with none marked partial and no reference missed that
7
+ * another provider knew;
8
+ * - `partial`: history, but marked partial (label only, stops early, missing a
9
+ * leg, undated), or missing a reference another provider knew;
10
+ * - `unknown`: nothing conclusive (errors, challenges, unverified, or only
11
+ * negatives on references too old to say anything);
12
+ * - `empty`: answered without history (no history, summary only, a sign-in or
13
+ * postcode prompt);
14
+ * - `excluded`: never history, and it answered with another carrier's parcel
15
+ * or refused the number format.
16
+ *
17
+ * Positives are strong evidence, negatives weak: one old reference can miss a
18
+ * parcel the provider would know today. So an empty provider is asked last,
19
+ * never skipped; only a wrong parcel or a refused format excludes it.
20
+ */
21
+ import data from './coverage.json' with { type: 'json' };
22
+ export const COVERAGE_SOURCES = ['Ship24', 'ParcelsApp', '17TRACK', 'Postal Ninja', 'UPU'];
23
+ const ANSWERS = new Set(['history', 'no_history', 'summary_only', 'sign_in', 'postcode_prompt',
24
+ 'wrong_carrier', 'refused', 'error', 'blocked', 'unverified', 'n/a']);
25
+ const EMPTY = new Set(['no_history', 'summary_only', 'sign_in', 'postcode_prompt']);
26
+ export const CARRIER_COVERAGE = data.carriers;
27
+ const BY_CARRIER = new Map(CARRIER_COVERAGE.map((entry) => [entry.carrier, entry]));
28
+ export function isHistory(cell) {
29
+ return typeof cell === 'number' || cell === 'history' || (typeof cell === 'object' && cell !== null);
30
+ }
31
+ /** The problems of one coverage entry, empty when it is valid. */
32
+ export function coverageProblems(entry) {
33
+ const problems = [];
34
+ if (!entry.references.length)
35
+ problems.push('no reference');
36
+ for (const [index, reference] of entry.references.entries()) {
37
+ for (const [source, cell] of Object.entries(reference.results)) {
38
+ if (!COVERAGE_SOURCES.includes(source))
39
+ problems.push(`reference ${index + 1}: unknown source ${source}`);
40
+ const valid = typeof cell === 'number' ? Number.isInteger(cell) && cell > 0
41
+ : typeof cell === 'string' ? ANSWERS.has(cell)
42
+ : typeof cell === 'object' && cell !== null && Number.isInteger(cell.rows) && cell.rows > 0
43
+ && typeof cell.partial === 'string' && cell.partial.length > 0;
44
+ if (!valid)
45
+ problems.push(`reference ${index + 1}: invalid ${source} result ${JSON.stringify(cell)}`);
46
+ }
47
+ }
48
+ return problems;
49
+ }
50
+ function tierOf(source, references) {
51
+ const seen = references.filter((reference) => reference.results[source] !== undefined);
52
+ // A reference another provider knew, which this one did not.
53
+ const missed = seen.some((reference) => !reference.stale
54
+ && (EMPTY.has(reference.results[source]) || reference.results[source] === 'wrong_carrier')
55
+ && Object.entries(reference.results).some(([other, cell]) => other !== source && other !== 'UPU' && isHistory(cell)));
56
+ if (seen.some((reference) => isHistory(reference.results[source]))) {
57
+ const marked = seen.some((reference) => typeof reference.results[source] === 'object');
58
+ return marked || missed ? 'partial' : 'full';
59
+ }
60
+ if (seen.some((reference) => ['wrong_carrier', 'refused'].includes(reference.results[source])))
61
+ return 'excluded';
62
+ return seen.some((reference) => !reference.stale && EMPTY.has(reference.results[source])) ? 'empty' : 'unknown';
63
+ }
64
+ /** Each provider's tier for a carrier, or null when the carrier has no coverage evidence. */
65
+ export function coverageTiers(carrier) {
66
+ const entry = carrier ? BY_CARRIER.get(carrier) : undefined;
67
+ if (!entry)
68
+ return null;
69
+ return Object.fromEntries(COVERAGE_SOURCES.map((source) => [source, tierOf(source, entry.references)]));
70
+ }