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.
- package/LICENSE +201 -0
- package/NOTICE +15 -0
- package/README.md +123 -2
- package/data/carrier-order.json +107 -0
- package/data/carrier.schema.json +415 -0
- package/data/catalog.json +3969 -0
- package/data/coverage-summary.json +17 -0
- package/data/detection-golden.json +5375 -0
- package/data/stages.json +13 -0
- package/dist/browser/scraper.js +9292 -0
- package/dist/carriers/aliexpress/adapter.d.ts +30 -0
- package/dist/carriers/aliexpress/adapter.js +164 -0
- package/dist/carriers/aliexpress/carrier.json +59 -0
- package/dist/carriers/aliexpress/numbers.json +36 -0
- package/dist/carriers/aliexpress/status.d.ts +31 -0
- package/dist/carriers/aliexpress/status.js +79 -0
- package/dist/carriers/aliexpress/statuses.json +355 -0
- package/dist/carriers/amazon-logistics/carrier.json +94 -0
- package/dist/carriers/amazon-logistics/numbers.json +307 -0
- package/dist/carriers/amazon-shipping/adapter.d.ts +34 -0
- package/dist/carriers/amazon-shipping/adapter.js +292 -0
- package/dist/carriers/amazon-shipping/carrier.json +96 -0
- package/dist/carriers/amazon-shipping/eligibility.d.ts +3 -0
- package/dist/carriers/amazon-shipping/eligibility.js +16 -0
- package/dist/carriers/amazon-shipping/numbers.json +67 -0
- package/dist/carriers/amazon-shipping/status.d.ts +26 -0
- package/dist/carriers/amazon-shipping/status.js +118 -0
- package/dist/carriers/amazon-shipping/statuses.json +19 -0
- package/dist/carriers/an-post/carrier.json +38 -0
- package/dist/carriers/an-post/numbers.json +33 -0
- package/dist/carriers/aramex/adapter.d.ts +11 -0
- package/dist/carriers/aramex/adapter.js +49 -0
- package/dist/carriers/aramex/carrier.json +62 -0
- package/dist/carriers/aramex/numbers.json +71 -0
- package/dist/carriers/aramex/parser.d.ts +5 -0
- package/dist/carriers/aramex/parser.js +83 -0
- package/dist/carriers/aramex/status.d.ts +2 -0
- package/dist/carriers/aramex/status.js +16 -0
- package/dist/carriers/aramex/statuses.json +41 -0
- package/dist/carriers/asendia/adapter.d.ts +82 -0
- package/dist/carriers/asendia/adapter.js +342 -0
- package/dist/carriers/asendia/carrier.json +91 -0
- package/dist/carriers/asendia/numbers.json +177 -0
- package/dist/carriers/asendia/probe.d.ts +31 -0
- package/dist/carriers/asendia/probe.js +355 -0
- package/dist/carriers/asendia/status.d.ts +41 -0
- package/dist/carriers/asendia/status.js +147 -0
- package/dist/carriers/asendia/statuses.json +877 -0
- package/dist/carriers/australia-post/adapter.d.ts +20 -0
- package/dist/carriers/australia-post/adapter.js +175 -0
- package/dist/carriers/australia-post/carrier.json +72 -0
- package/dist/carriers/australia-post/numbers.json +66 -0
- package/dist/carriers/australia-post/status.d.ts +2 -0
- package/dist/carriers/australia-post/status.js +34 -0
- package/dist/carriers/australia-post/statuses.json +172 -0
- package/dist/carriers/austrian-post/adapter.d.ts +13 -0
- package/dist/carriers/austrian-post/adapter.js +101 -0
- package/dist/carriers/austrian-post/carrier.json +58 -0
- package/dist/carriers/austrian-post/numbers.json +73 -0
- package/dist/carriers/austrian-post/status.d.ts +3 -0
- package/dist/carriers/austrian-post/status.js +30 -0
- package/dist/carriers/austrian-post/statuses.json +47 -0
- package/dist/carriers/blue-dart/adapter.d.ts +11 -0
- package/dist/carriers/blue-dart/adapter.js +34 -0
- package/dist/carriers/blue-dart/carrier.json +59 -0
- package/dist/carriers/blue-dart/numbers.json +113 -0
- package/dist/carriers/blue-dart/parser.d.ts +3 -0
- package/dist/carriers/blue-dart/parser.js +75 -0
- package/dist/carriers/blue-dart/status.d.ts +2 -0
- package/dist/carriers/blue-dart/status.js +14 -0
- package/dist/carriers/blue-dart/statuses.json +59 -0
- package/dist/carriers/bpost/adapter.d.ts +11 -0
- package/dist/carriers/bpost/adapter.js +46 -0
- package/dist/carriers/bpost/carrier.json +81 -0
- package/dist/carriers/bpost/numbers.json +103 -0
- package/dist/carriers/bpost/parser.d.ts +3 -0
- package/dist/carriers/bpost/parser.js +84 -0
- package/dist/carriers/bpost/status.d.ts +2 -0
- package/dist/carriers/bpost/status.js +18 -0
- package/dist/carriers/bpost/statuses.json +96 -0
- package/dist/carriers/bring-posten/adapter.d.ts +11 -0
- package/dist/carriers/bring-posten/adapter.js +35 -0
- package/dist/carriers/bring-posten/carrier.json +91 -0
- package/dist/carriers/bring-posten/numbers.json +33 -0
- package/dist/carriers/bring-posten/parser.d.ts +3 -0
- package/dist/carriers/bring-posten/parser.js +95 -0
- package/dist/carriers/bring-posten/status.d.ts +3 -0
- package/dist/carriers/bring-posten/status.js +23 -0
- package/dist/carriers/bring-posten/statuses.json +33 -0
- package/dist/carriers/brt/adapter.d.ts +11 -0
- package/dist/carriers/brt/adapter.js +36 -0
- package/dist/carriers/brt/carrier.json +80 -0
- package/dist/carriers/brt/numbers.json +91 -0
- package/dist/carriers/brt/parser.d.ts +3 -0
- package/dist/carriers/brt/parser.js +84 -0
- package/dist/carriers/brt/status.d.ts +2 -0
- package/dist/carriers/brt/status.js +14 -0
- package/dist/carriers/brt/statuses.json +53 -0
- package/dist/carriers/c-chez-vous/adapter.d.ts +31 -0
- package/dist/carriers/c-chez-vous/adapter.js +181 -0
- package/dist/carriers/c-chez-vous/carrier.json +69 -0
- package/dist/carriers/c-chez-vous/numbers.json +31 -0
- package/dist/carriers/c-chez-vous/status.d.ts +27 -0
- package/dist/carriers/c-chez-vous/status.js +19 -0
- package/dist/carriers/c-chez-vous/statuses.json +10 -0
- package/dist/carriers/canada-post/adapter.d.ts +40 -0
- package/dist/carriers/canada-post/adapter.js +78 -0
- package/dist/carriers/canada-post/carrier.json +77 -0
- package/dist/carriers/canada-post/numbers.json +81 -0
- package/dist/carriers/canada-post/parser.d.ts +5 -0
- package/dist/carriers/canada-post/parser.js +202 -0
- package/dist/carriers/canada-post/status.d.ts +9 -0
- package/dist/carriers/canada-post/status.js +67 -0
- package/dist/carriers/canada-post/statuses.json +171 -0
- package/dist/carriers/canpar/adapter.d.ts +11 -0
- package/dist/carriers/canpar/adapter.js +40 -0
- package/dist/carriers/canpar/carrier.json +74 -0
- package/dist/carriers/canpar/numbers.json +71 -0
- package/dist/carriers/canpar/parser.d.ts +3 -0
- package/dist/carriers/canpar/parser.js +75 -0
- package/dist/carriers/canpar/status.d.ts +2 -0
- package/dist/carriers/canpar/status.js +16 -0
- package/dist/carriers/canpar/statuses.json +82 -0
- package/dist/carriers/china-post/carrier.json +38 -0
- package/dist/carriers/china-post/numbers.json +59 -0
- package/dist/carriers/chronopost/carrier.json +84 -0
- package/dist/carriers/chronopost/numbers.json +110 -0
- package/dist/carriers/chronopost/statuses.json +47 -0
- package/dist/carriers/ciblex/adapter.d.ts +17 -0
- package/dist/carriers/ciblex/adapter.js +46 -0
- package/dist/carriers/ciblex/carrier.json +71 -0
- package/dist/carriers/ciblex/numbers.json +63 -0
- package/dist/carriers/ciblex/parser.d.ts +4 -0
- package/dist/carriers/ciblex/parser.js +100 -0
- package/dist/carriers/ciblex/status.d.ts +24 -0
- package/dist/carriers/ciblex/status.js +55 -0
- package/dist/carriers/ciblex/statuses.json +221 -0
- package/dist/carriers/colis-prive/adapter.d.ts +39 -0
- package/dist/carriers/colis-prive/adapter.js +0 -0
- package/dist/carriers/colis-prive/carrier.json +72 -0
- package/dist/carriers/colis-prive/numbers.json +97 -0
- package/dist/carriers/colis-prive/status.d.ts +30 -0
- package/dist/carriers/colis-prive/status.js +85 -0
- package/dist/carriers/colis-prive/statuses.json +39 -0
- package/dist/carriers/colisweb/adapter.d.ts +29 -0
- package/dist/carriers/colisweb/adapter.js +166 -0
- package/dist/carriers/colisweb/carrier.json +63 -0
- package/dist/carriers/colisweb/numbers.json +39 -0
- package/dist/carriers/colisweb/status.d.ts +32 -0
- package/dist/carriers/colisweb/status.js +61 -0
- package/dist/carriers/colisweb/statuses.json +25 -0
- package/dist/carriers/correios-br/adapter.d.ts +16 -0
- package/dist/carriers/correios-br/adapter.js +78 -0
- package/dist/carriers/correios-br/carrier.json +64 -0
- package/dist/carriers/correios-br/model/LICENSE +21 -0
- package/dist/carriers/correios-br/model/captcha.onnx +0 -0
- package/dist/carriers/correios-br/numbers.json +72 -0
- package/dist/carriers/correios-br/ocr-worker.mjs +53 -0
- package/dist/carriers/correios-br/ocr.d.ts +10 -0
- package/dist/carriers/correios-br/ocr.js +83 -0
- package/dist/carriers/correios-br/parser.d.ts +4 -0
- package/dist/carriers/correios-br/parser.js +79 -0
- package/dist/carriers/correios-br/status.d.ts +2 -0
- package/dist/carriers/correios-br/status.js +17 -0
- package/dist/carriers/correios-br/statuses.json +16 -0
- package/dist/carriers/correos-chile/adapter.d.ts +12 -0
- package/dist/carriers/correos-chile/adapter.js +85 -0
- package/dist/carriers/correos-chile/carrier.json +62 -0
- package/dist/carriers/correos-chile/numbers.json +38 -0
- package/dist/carriers/correos-chile/parser.d.ts +9 -0
- package/dist/carriers/correos-chile/parser.js +120 -0
- package/dist/carriers/correos-chile/status.d.ts +3 -0
- package/dist/carriers/correos-chile/status.js +17 -0
- package/dist/carriers/correos-chile/statuses.json +12 -0
- package/dist/carriers/correos-express/adapter.d.ts +11 -0
- package/dist/carriers/correos-express/adapter.js +32 -0
- package/dist/carriers/correos-express/carrier.json +65 -0
- package/dist/carriers/correos-express/numbers.json +80 -0
- package/dist/carriers/correos-express/parser.d.ts +3 -0
- package/dist/carriers/correos-express/parser.js +97 -0
- package/dist/carriers/correos-express/status.d.ts +2 -0
- package/dist/carriers/correos-express/status.js +25 -0
- package/dist/carriers/correos-express/statuses.json +19 -0
- package/dist/carriers/correos-spain/adapter.d.ts +15 -0
- package/dist/carriers/correos-spain/adapter.js +191 -0
- package/dist/carriers/correos-spain/carrier.json +92 -0
- package/dist/carriers/correos-spain/numbers.json +149 -0
- package/dist/carriers/correos-spain/status.d.ts +17 -0
- package/dist/carriers/correos-spain/status.js +51 -0
- package/dist/carriers/correos-spain/statuses.json +46 -0
- package/dist/carriers/ctt/adapter.d.ts +34 -0
- package/dist/carriers/ctt/adapter.js +320 -0
- package/dist/carriers/ctt/carrier.json +72 -0
- package/dist/carriers/ctt/numbers.json +33 -0
- package/dist/carriers/ctt/status.d.ts +16 -0
- package/dist/carriers/ctt/status.js +16 -0
- package/dist/carriers/ctt/statuses.json +15 -0
- package/dist/carriers/ctt-express/adapter.d.ts +11 -0
- package/dist/carriers/ctt-express/adapter.js +41 -0
- package/dist/carriers/ctt-express/carrier.json +64 -0
- package/dist/carriers/ctt-express/numbers.json +59 -0
- package/dist/carriers/ctt-express/parser.d.ts +3 -0
- package/dist/carriers/ctt-express/parser.js +107 -0
- package/dist/carriers/ctt-express/status.d.ts +2 -0
- package/dist/carriers/ctt-express/status.js +17 -0
- package/dist/carriers/ctt-express/statuses.json +15 -0
- package/dist/carriers/dachser/adapter.d.ts +25 -0
- package/dist/carriers/dachser/adapter.js +168 -0
- package/dist/carriers/dachser/carrier.json +80 -0
- package/dist/carriers/dachser/numbers.json +66 -0
- package/dist/carriers/dachser/status.d.ts +40 -0
- package/dist/carriers/dachser/status.js +57 -0
- package/dist/carriers/dachser/statuses.json +18 -0
- package/dist/carriers/delhivery/adapter.d.ts +11 -0
- package/dist/carriers/delhivery/adapter.js +36 -0
- package/dist/carriers/delhivery/carrier.json +50 -0
- package/dist/carriers/delhivery/numbers.json +108 -0
- package/dist/carriers/delhivery/parser.d.ts +3 -0
- package/dist/carriers/delhivery/parser.js +81 -0
- package/dist/carriers/delhivery/status.d.ts +2 -0
- package/dist/carriers/delhivery/status.js +11 -0
- package/dist/carriers/delhivery/statuses.json +11 -0
- package/dist/carriers/delivengo/carrier.json +56 -0
- package/dist/carriers/delivengo/numbers.json +31 -0
- package/dist/carriers/delivengo/statuses.json +5 -0
- package/dist/carriers/dhl/adapter.d.ts +70 -0
- package/dist/carriers/dhl/adapter.js +308 -0
- package/dist/carriers/dhl/carrier.json +98 -0
- package/dist/carriers/dhl/numbers.json +153 -0
- package/dist/carriers/dhl/status.d.ts +14 -0
- package/dist/carriers/dhl/status.js +45 -0
- package/dist/carriers/dhl/statuses.json +27 -0
- package/dist/carriers/dhl-ecommerce/adapter.d.ts +50 -0
- package/dist/carriers/dhl-ecommerce/adapter.js +179 -0
- package/dist/carriers/dhl-ecommerce/carrier.json +97 -0
- package/dist/carriers/dhl-ecommerce/numbers.json +130 -0
- package/dist/carriers/dhl-ecommerce/status.d.ts +13 -0
- package/dist/carriers/dhl-ecommerce/status.js +57 -0
- package/dist/carriers/dhl-ecommerce/statuses.json +23 -0
- package/dist/carriers/dpd/adapter.d.ts +70 -0
- package/dist/carriers/dpd/adapter.js +809 -0
- package/dist/carriers/dpd/carrier.json +111 -0
- package/dist/carriers/dpd/numbers.json +43 -0
- package/dist/carriers/dpd/status.d.ts +39 -0
- package/dist/carriers/dpd/status.js +93 -0
- package/dist/carriers/dpd/statuses.json +144 -0
- package/dist/carriers/dpd-fr/adapter.d.ts +42 -0
- package/dist/carriers/dpd-fr/adapter.js +288 -0
- package/dist/carriers/dpd-fr/carrier.json +83 -0
- package/dist/carriers/dpd-fr/numbers.json +80 -0
- package/dist/carriers/dpd-fr/status.d.ts +21 -0
- package/dist/carriers/dpd-fr/status.js +93 -0
- package/dist/carriers/dpd-fr/statuses.json +325 -0
- package/dist/carriers/dtdc/adapter.d.ts +11 -0
- package/dist/carriers/dtdc/adapter.js +39 -0
- package/dist/carriers/dtdc/carrier.json +77 -0
- package/dist/carriers/dtdc/numbers.json +50 -0
- package/dist/carriers/dtdc/parser.d.ts +3 -0
- package/dist/carriers/dtdc/parser.js +90 -0
- package/dist/carriers/dtdc/status.d.ts +2 -0
- package/dist/carriers/dtdc/status.js +15 -0
- package/dist/carriers/dtdc/statuses.json +65 -0
- package/dist/carriers/ecoscooting/adapter.d.ts +11 -0
- package/dist/carriers/ecoscooting/adapter.js +42 -0
- package/dist/carriers/ecoscooting/carrier.json +76 -0
- package/dist/carriers/ecoscooting/numbers.json +291 -0
- package/dist/carriers/ecoscooting/parser.d.ts +3 -0
- package/dist/carriers/ecoscooting/parser.js +88 -0
- package/dist/carriers/ecoscooting/status.d.ts +2 -0
- package/dist/carriers/ecoscooting/status.js +50 -0
- package/dist/carriers/ecoscooting/statuses.json +295 -0
- package/dist/carriers/ems/adapter.d.ts +14 -0
- package/dist/carriers/ems/adapter.js +124 -0
- package/dist/carriers/ems/carrier.json +61 -0
- package/dist/carriers/ems/numbers.json +43 -0
- package/dist/carriers/ems/status.d.ts +2 -0
- package/dist/carriers/ems/status.js +24 -0
- package/dist/carriers/ems/statuses.json +128 -0
- package/dist/carriers/estafeta/adapter.d.ts +11 -0
- package/dist/carriers/estafeta/adapter.js +45 -0
- package/dist/carriers/estafeta/carrier.json +79 -0
- package/dist/carriers/estafeta/numbers.json +85 -0
- package/dist/carriers/estafeta/parser.d.ts +11 -0
- package/dist/carriers/estafeta/parser.js +123 -0
- package/dist/carriers/estafeta/status.d.ts +3 -0
- package/dist/carriers/estafeta/status.js +17 -0
- package/dist/carriers/estafeta/statuses.json +47 -0
- package/dist/carriers/evri/adapter.d.ts +14 -0
- package/dist/carriers/evri/adapter.js +146 -0
- package/dist/carriers/evri/carrier.json +69 -0
- package/dist/carriers/evri/numbers.json +32 -0
- package/dist/carriers/evri/status.d.ts +2 -0
- package/dist/carriers/evri/status.js +24 -0
- package/dist/carriers/evri/statuses.json +133 -0
- package/dist/carriers/fedex/adapter.d.ts +32 -0
- package/dist/carriers/fedex/adapter.js +307 -0
- package/dist/carriers/fedex/carrier.json +74 -0
- package/dist/carriers/fedex/numbers.json +198 -0
- package/dist/carriers/fedex/status.d.ts +33 -0
- package/dist/carriers/fedex/status.js +114 -0
- package/dist/carriers/fedex/statuses.json +34 -0
- package/dist/carriers/four-px/adapter.d.ts +12 -0
- package/dist/carriers/four-px/adapter.js +113 -0
- package/dist/carriers/four-px/carrier.json +60 -0
- package/dist/carriers/four-px/numbers.json +32 -0
- package/dist/carriers/four-px/status.d.ts +2 -0
- package/dist/carriers/four-px/status.js +22 -0
- package/dist/carriers/four-px/statuses.json +141 -0
- package/dist/carriers/geodis/adapter.d.ts +37 -0
- package/dist/carriers/geodis/adapter.js +275 -0
- package/dist/carriers/geodis/carrier.json +75 -0
- package/dist/carriers/geodis/numbers.json +45 -0
- package/dist/carriers/geodis/status.d.ts +37 -0
- package/dist/carriers/geodis/status.js +105 -0
- package/dist/carriers/geodis/statuses.json +51 -0
- package/dist/carriers/gls-ch/adapter.d.ts +39 -0
- package/dist/carriers/gls-ch/adapter.js +405 -0
- package/dist/carriers/gls-ch/carrier.json +122 -0
- package/dist/carriers/gls-ch/numbers.json +31 -0
- package/dist/carriers/gls-ch/status.d.ts +19 -0
- package/dist/carriers/gls-ch/status.js +79 -0
- package/dist/carriers/gls-ch/statuses.json +31 -0
- package/dist/carriers/gls-de/adapter.d.ts +28 -0
- package/dist/carriers/gls-de/adapter.js +113 -0
- package/dist/carriers/gls-de/carrier.json +126 -0
- package/dist/carriers/gls-de/numbers.json +111 -0
- package/dist/carriers/gls-de/status.d.ts +10 -0
- package/dist/carriers/gls-de/status.js +10 -0
- package/dist/carriers/gls-de/statuses.json +31 -0
- package/dist/carriers/gls-fr/adapter.d.ts +29 -0
- package/dist/carriers/gls-fr/adapter.js +220 -0
- package/dist/carriers/gls-fr/carrier.json +107 -0
- package/dist/carriers/gls-fr/numbers.json +113 -0
- package/dist/carriers/gls-fr/status.d.ts +28 -0
- package/dist/carriers/gls-fr/status.js +58 -0
- package/dist/carriers/gls-fr/statuses.json +34 -0
- package/dist/carriers/gofo/adapter.d.ts +11 -0
- package/dist/carriers/gofo/adapter.js +41 -0
- package/dist/carriers/gofo/carrier.json +80 -0
- package/dist/carriers/gofo/numbers.json +59 -0
- package/dist/carriers/gofo/parser.d.ts +5 -0
- package/dist/carriers/gofo/parser.js +131 -0
- package/dist/carriers/gofo/status.d.ts +2 -0
- package/dist/carriers/gofo/status.js +7 -0
- package/dist/carriers/gofo/statuses.json +54 -0
- package/dist/carriers/heppner/adapter.d.ts +27 -0
- package/dist/carriers/heppner/adapter.js +247 -0
- package/dist/carriers/heppner/carrier.json +74 -0
- package/dist/carriers/heppner/numbers.json +39 -0
- package/dist/carriers/heppner/status.d.ts +28 -0
- package/dist/carriers/heppner/status.js +43 -0
- package/dist/carriers/heppner/statuses.json +69 -0
- package/dist/carriers/hermes/adapter.d.ts +17 -0
- package/dist/carriers/hermes/adapter.js +103 -0
- package/dist/carriers/hermes/carrier.json +58 -0
- package/dist/carriers/hermes/numbers.json +20 -0
- package/dist/carriers/hermes/status.d.ts +15 -0
- package/dist/carriers/hermes/status.js +61 -0
- package/dist/carriers/hermes/statuses.json +31 -0
- package/dist/carriers/hermes-de/adapter.d.ts +22 -0
- package/dist/carriers/hermes-de/adapter.js +168 -0
- package/dist/carriers/hermes-de/carrier.json +90 -0
- package/dist/carriers/hermes-de/numbers.json +125 -0
- package/dist/carriers/hermes-de/status.d.ts +24 -0
- package/dist/carriers/hermes-de/status.js +52 -0
- package/dist/carriers/hermes-de/statuses.json +277 -0
- package/dist/carriers/hongkong-post/carrier.json +38 -0
- package/dist/carriers/hongkong-post/numbers.json +32 -0
- package/dist/carriers/india-post/adapter.d.ts +33 -0
- package/dist/carriers/india-post/adapter.js +415 -0
- package/dist/carriers/india-post/carrier.json +74 -0
- package/dist/carriers/india-post/numbers.json +58 -0
- package/dist/carriers/india-post/status.d.ts +23 -0
- package/dist/carriers/india-post/status.js +99 -0
- package/dist/carriers/india-post/statuses.json +18 -0
- package/dist/carriers/inpost/adapter.d.ts +14 -0
- package/dist/carriers/inpost/adapter.js +143 -0
- package/dist/carriers/inpost/carrier.json +75 -0
- package/dist/carriers/inpost/numbers.json +130 -0
- package/dist/carriers/inpost/status.d.ts +16 -0
- package/dist/carriers/inpost/status.js +31 -0
- package/dist/carriers/inpost/statuses.json +26 -0
- package/dist/carriers/intl-post/carrier.json +46 -0
- package/dist/carriers/intl-post/numbers.json +29 -0
- package/dist/carriers/j-and-t/carrier.json +66 -0
- package/dist/carriers/j-and-t/numbers.json +90 -0
- package/dist/carriers/japan-post/adapter.d.ts +13 -0
- package/dist/carriers/japan-post/adapter.js +159 -0
- package/dist/carriers/japan-post/carrier.json +71 -0
- package/dist/carriers/japan-post/numbers.json +35 -0
- package/dist/carriers/japan-post/status.d.ts +2 -0
- package/dist/carriers/japan-post/status.js +25 -0
- package/dist/carriers/japan-post/statuses.json +136 -0
- package/dist/carriers/jd-logistics/carrier.json +37 -0
- package/dist/carriers/jd-logistics/numbers.json +19 -0
- package/dist/carriers/korea-post/adapter.d.ts +12 -0
- package/dist/carriers/korea-post/adapter.js +101 -0
- package/dist/carriers/korea-post/carrier.json +74 -0
- package/dist/carriers/korea-post/numbers.json +54 -0
- package/dist/carriers/korea-post/status.d.ts +2 -0
- package/dist/carriers/korea-post/status.js +19 -0
- package/dist/carriers/korea-post/statuses.json +103 -0
- package/dist/carriers/la-poste/adapter.d.ts +29 -0
- package/dist/carriers/la-poste/adapter.js +241 -0
- package/dist/carriers/la-poste/carrier.json +87 -0
- package/dist/carriers/la-poste/numbers.json +140 -0
- package/dist/carriers/la-poste/status.d.ts +30 -0
- package/dist/carriers/la-poste/status.js +110 -0
- package/dist/carriers/la-poste/statuses.json +163 -0
- package/dist/carriers/landmark-global/adapter.d.ts +11 -0
- package/dist/carriers/landmark-global/adapter.js +30 -0
- package/dist/carriers/landmark-global/carrier.json +64 -0
- package/dist/carriers/landmark-global/numbers.json +58 -0
- package/dist/carriers/landmark-global/parser.d.ts +3 -0
- package/dist/carriers/landmark-global/parser.js +78 -0
- package/dist/carriers/landmark-global/status.d.ts +2 -0
- package/dist/carriers/landmark-global/status.js +13 -0
- package/dist/carriers/landmark-global/statuses.json +125 -0
- package/dist/carriers/mondial-relay/adapter.d.ts +32 -0
- package/dist/carriers/mondial-relay/adapter.js +352 -0
- package/dist/carriers/mondial-relay/carrier.json +94 -0
- package/dist/carriers/mondial-relay/numbers.json +130 -0
- package/dist/carriers/mondial-relay/status.d.ts +31 -0
- package/dist/carriers/mondial-relay/status.js +98 -0
- package/dist/carriers/mondial-relay/statuses.json +50 -0
- package/dist/carriers/mrw/adapter.d.ts +13 -0
- package/dist/carriers/mrw/adapter.js +131 -0
- package/dist/carriers/mrw/carrier.json +60 -0
- package/dist/carriers/mrw/numbers.json +116 -0
- package/dist/carriers/mrw/parser.d.ts +12 -0
- package/dist/carriers/mrw/parser.js +149 -0
- package/dist/carriers/mrw/status.d.ts +2 -0
- package/dist/carriers/mrw/status.js +14 -0
- package/dist/carriers/mrw/statuses.json +13 -0
- package/dist/carriers/nacex/adapter.d.ts +11 -0
- package/dist/carriers/nacex/adapter.js +99 -0
- package/dist/carriers/nacex/carrier.json +78 -0
- package/dist/carriers/nacex/numbers.json +47 -0
- package/dist/carriers/nacex/parser.d.ts +4 -0
- package/dist/carriers/nacex/parser.js +119 -0
- package/dist/carriers/nacex/status.d.ts +2 -0
- package/dist/carriers/nacex/status.js +12 -0
- package/dist/carriers/nacex/statuses.json +11 -0
- package/dist/carriers/ninja-van/adapter.d.ts +11 -0
- package/dist/carriers/ninja-van/adapter.js +45 -0
- package/dist/carriers/ninja-van/carrier.json +79 -0
- package/dist/carriers/ninja-van/numbers.json +67 -0
- package/dist/carriers/ninja-van/parser.d.ts +5 -0
- package/dist/carriers/ninja-van/parser.js +95 -0
- package/dist/carriers/ninja-van/status.d.ts +3 -0
- package/dist/carriers/ninja-van/status.js +25 -0
- package/dist/carriers/ninja-van/statuses.json +11 -0
- package/dist/carriers/nz-post/adapter.d.ts +11 -0
- package/dist/carriers/nz-post/adapter.js +45 -0
- package/dist/carriers/nz-post/carrier.json +82 -0
- package/dist/carriers/nz-post/numbers.json +49 -0
- package/dist/carriers/nz-post/parser.d.ts +3 -0
- package/dist/carriers/nz-post/parser.js +97 -0
- package/dist/carriers/nz-post/status.d.ts +2 -0
- package/dist/carriers/nz-post/status.js +29 -0
- package/dist/carriers/nz-post/statuses.json +68 -0
- package/dist/carriers/old-dominion/carrier.json +51 -0
- package/dist/carriers/old-dominion/numbers.json +83 -0
- package/dist/carriers/ontrac/adapter.d.ts +11 -0
- package/dist/carriers/ontrac/adapter.js +34 -0
- package/dist/carriers/ontrac/carrier.json +81 -0
- package/dist/carriers/ontrac/numbers.json +214 -0
- package/dist/carriers/ontrac/parser.d.ts +3 -0
- package/dist/carriers/ontrac/parser.js +72 -0
- package/dist/carriers/ontrac/status.d.ts +2 -0
- package/dist/carriers/ontrac/status.js +19 -0
- package/dist/carriers/ontrac/statuses.json +61 -0
- package/dist/carriers/paack/adapter.d.ts +19 -0
- package/dist/carriers/paack/adapter.js +255 -0
- package/dist/carriers/paack/carrier.json +79 -0
- package/dist/carriers/paack/numbers.json +106 -0
- package/dist/carriers/paack/status.d.ts +26 -0
- package/dist/carriers/paack/status.js +82 -0
- package/dist/carriers/paack/statuses.json +357 -0
- package/dist/carriers/packeta/adapter.d.ts +15 -0
- package/dist/carriers/packeta/adapter.js +166 -0
- package/dist/carriers/packeta/carrier.json +90 -0
- package/dist/carriers/packeta/numbers.json +71 -0
- package/dist/carriers/packeta/status.d.ts +23 -0
- package/dist/carriers/packeta/status.js +40 -0
- package/dist/carriers/packeta/statuses.json +21 -0
- package/dist/carriers/parcelforce/carrier.json +47 -0
- package/dist/carriers/parcelforce/numbers.json +32 -0
- package/dist/carriers/planzer/adapter.d.ts +40 -0
- package/dist/carriers/planzer/adapter.js +148 -0
- package/dist/carriers/planzer/carrier.json +85 -0
- package/dist/carriers/planzer/numbers.json +118 -0
- package/dist/carriers/planzer/shared.d.ts +19 -0
- package/dist/carriers/planzer/shared.js +135 -0
- package/dist/carriers/planzer/status.d.ts +33 -0
- package/dist/carriers/planzer/status.js +89 -0
- package/dist/carriers/planzer/statuses.json +229 -0
- package/dist/carriers/poczta-polska/adapter.d.ts +15 -0
- package/dist/carriers/poczta-polska/adapter.js +65 -0
- package/dist/carriers/poczta-polska/carrier.json +79 -0
- package/dist/carriers/poczta-polska/numbers.json +130 -0
- package/dist/carriers/poczta-polska/parser.d.ts +3 -0
- package/dist/carriers/poczta-polska/parser.js +96 -0
- package/dist/carriers/poczta-polska/status.d.ts +2 -0
- package/dist/carriers/poczta-polska/status.js +21 -0
- package/dist/carriers/poczta-polska/statuses.json +47 -0
- package/dist/carriers/pos-malaysia/adapter.d.ts +18 -0
- package/dist/carriers/pos-malaysia/adapter.js +199 -0
- package/dist/carriers/pos-malaysia/carrier.json +78 -0
- package/dist/carriers/pos-malaysia/numbers.json +73 -0
- package/dist/carriers/pos-malaysia/status.d.ts +17 -0
- package/dist/carriers/pos-malaysia/status.js +21 -0
- package/dist/carriers/pos-malaysia/statuses.json +17 -0
- package/dist/carriers/poste-italiane/adapter.d.ts +15 -0
- package/dist/carriers/poste-italiane/adapter.js +211 -0
- package/dist/carriers/poste-italiane/carrier.json +86 -0
- package/dist/carriers/poste-italiane/numbers.json +117 -0
- package/dist/carriers/poste-italiane/status.d.ts +19 -0
- package/dist/carriers/poste-italiane/status.js +44 -0
- package/dist/carriers/poste-italiane/statuses.json +22 -0
- package/dist/carriers/posti/adapter.d.ts +17 -0
- package/dist/carriers/posti/adapter.js +195 -0
- package/dist/carriers/posti/carrier.json +69 -0
- package/dist/carriers/posti/numbers.json +52 -0
- package/dist/carriers/posti/status.d.ts +4 -0
- package/dist/carriers/posti/status.js +41 -0
- package/dist/carriers/posti/statuses.json +18 -0
- package/dist/carriers/postlogistics/adapter.d.ts +39 -0
- package/dist/carriers/postlogistics/adapter.js +162 -0
- package/dist/carriers/postlogistics/carrier.json +67 -0
- package/dist/carriers/postlogistics/number.d.ts +2 -0
- package/dist/carriers/postlogistics/number.js +7 -0
- package/dist/carriers/postlogistics/numbers.json +54 -0
- package/dist/carriers/postlogistics/status.d.ts +20 -0
- package/dist/carriers/postlogistics/status.js +12 -0
- package/dist/carriers/postlogistics/statuses.json +40 -0
- package/dist/carriers/postnord/adapter.d.ts +11 -0
- package/dist/carriers/postnord/adapter.js +76 -0
- package/dist/carriers/postnord/carrier.json +82 -0
- package/dist/carriers/postnord/numbers.json +66 -0
- package/dist/carriers/postnord/parser.d.ts +3 -0
- package/dist/carriers/postnord/parser.js +75 -0
- package/dist/carriers/postnord/status.d.ts +3 -0
- package/dist/carriers/postnord/status.js +38 -0
- package/dist/carriers/postnord/statuses.json +16 -0
- package/dist/carriers/purolator/adapter.d.ts +11 -0
- package/dist/carriers/purolator/adapter.js +45 -0
- package/dist/carriers/purolator/carrier.json +75 -0
- package/dist/carriers/purolator/numbers.json +146 -0
- package/dist/carriers/purolator/parser.d.ts +3 -0
- package/dist/carriers/purolator/parser.js +79 -0
- package/dist/carriers/purolator/status.d.ts +2 -0
- package/dist/carriers/purolator/status.js +17 -0
- package/dist/carriers/purolator/statuses.json +15 -0
- package/dist/carriers/quickpac/carrier.json +68 -0
- package/dist/carriers/quickpac/numbers.json +31 -0
- package/dist/carriers/quickpac/statuses.json +213 -0
- package/dist/carriers/relais-colis/adapter.d.ts +28 -0
- package/dist/carriers/relais-colis/adapter.js +242 -0
- package/dist/carriers/relais-colis/carrier.json +77 -0
- package/dist/carriers/relais-colis/numbers.json +64 -0
- package/dist/carriers/relais-colis/status.d.ts +26 -0
- package/dist/carriers/relais-colis/status.js +91 -0
- package/dist/carriers/relais-colis/statuses.json +341 -0
- package/dist/carriers/royal-mail/adapter.d.ts +32 -0
- package/dist/carriers/royal-mail/adapter.js +260 -0
- package/dist/carriers/royal-mail/carrier.json +60 -0
- package/dist/carriers/royal-mail/numbers.json +57 -0
- package/dist/carriers/royal-mail/status.d.ts +19 -0
- package/dist/carriers/royal-mail/status.js +80 -0
- package/dist/carriers/royal-mail/statuses.json +16 -0
- package/dist/carriers/seur/adapter.d.ts +11 -0
- package/dist/carriers/seur/adapter.js +35 -0
- package/dist/carriers/seur/carrier.json +89 -0
- package/dist/carriers/seur/numbers.json +80 -0
- package/dist/carriers/seur/parser.d.ts +3 -0
- package/dist/carriers/seur/parser.js +78 -0
- package/dist/carriers/seur/status.d.ts +2 -0
- package/dist/carriers/seur/status.js +14 -0
- package/dist/carriers/seur/statuses.json +47 -0
- package/dist/carriers/sf-express/adapter.d.ts +17 -0
- package/dist/carriers/sf-express/adapter.js +87 -0
- package/dist/carriers/sf-express/carrier.json +78 -0
- package/dist/carriers/sf-express/numbers.json +66 -0
- package/dist/carriers/sf-express/parser.d.ts +4 -0
- package/dist/carriers/sf-express/parser.js +102 -0
- package/dist/carriers/sf-express/status.d.ts +4 -0
- package/dist/carriers/sf-express/status.js +28 -0
- package/dist/carriers/sf-express/statuses.json +334 -0
- package/dist/carriers/shipup/carrier.json +28 -0
- package/dist/carriers/shipup/numbers.json +20 -0
- package/dist/carriers/singapore-post/adapter.d.ts +12 -0
- package/dist/carriers/singapore-post/adapter.js +106 -0
- package/dist/carriers/singapore-post/carrier.json +62 -0
- package/dist/carriers/singapore-post/numbers.json +77 -0
- package/dist/carriers/singapore-post/status.d.ts +2 -0
- package/dist/carriers/singapore-post/status.js +17 -0
- package/dist/carriers/singapore-post/statuses.json +101 -0
- package/dist/carriers/spee-dee/carrier.json +51 -0
- package/dist/carriers/spee-dee/numbers.json +55 -0
- package/dist/carriers/speedx/carrier.json +49 -0
- package/dist/carriers/speedx/numbers.json +112 -0
- package/dist/carriers/spring-gds/adapter.d.ts +35 -0
- package/dist/carriers/spring-gds/adapter.js +212 -0
- package/dist/carriers/spring-gds/carrier.json +90 -0
- package/dist/carriers/spring-gds/numbers.json +224 -0
- package/dist/carriers/spring-gds/status.d.ts +19 -0
- package/dist/carriers/spring-gds/status.js +28 -0
- package/dist/carriers/spring-gds/statuses.json +140 -0
- package/dist/carriers/sto/carrier.json +37 -0
- package/dist/carriers/sto/numbers.json +33 -0
- package/dist/carriers/sunyou/adapter.d.ts +18 -0
- package/dist/carriers/sunyou/adapter.js +156 -0
- package/dist/carriers/sunyou/carrier.json +64 -0
- package/dist/carriers/sunyou/numbers.json +44 -0
- package/dist/carriers/sunyou/status.d.ts +17 -0
- package/dist/carriers/sunyou/status.js +13 -0
- package/dist/carriers/sunyou/statuses.json +53 -0
- package/dist/carriers/swiss-post/adapter.d.ts +18 -0
- package/dist/carriers/swiss-post/adapter.js +282 -0
- package/dist/carriers/swiss-post/carrier.json +84 -0
- package/dist/carriers/swiss-post/numbers.json +55 -0
- package/dist/carriers/swiss-post/status.d.ts +27 -0
- package/dist/carriers/swiss-post/status.js +64 -0
- package/dist/carriers/swiss-post/statuses.json +33 -0
- package/dist/carriers/swiss-post-cargo/adapter.d.ts +19 -0
- package/dist/carriers/swiss-post-cargo/adapter.js +173 -0
- package/dist/carriers/swiss-post-cargo/carrier.json +60 -0
- package/dist/carriers/swiss-post-cargo/numbers.json +23 -0
- package/dist/carriers/swiss-post-cargo/reference.d.ts +13 -0
- package/dist/carriers/swiss-post-cargo/reference.js +48 -0
- package/dist/carriers/swiss-post-cargo/status.d.ts +13 -0
- package/dist/carriers/swiss-post-cargo/status.js +53 -0
- package/dist/carriers/swiss-post-cargo/statuses.json +19 -0
- package/dist/carriers/thailand-post/carrier.json +38 -0
- package/dist/carriers/thailand-post/numbers.json +33 -0
- package/dist/carriers/the-courier-guy/adapter.d.ts +11 -0
- package/dist/carriers/the-courier-guy/adapter.js +49 -0
- package/dist/carriers/the-courier-guy/carrier.json +73 -0
- package/dist/carriers/the-courier-guy/number.d.ts +3 -0
- package/dist/carriers/the-courier-guy/number.js +18 -0
- package/dist/carriers/the-courier-guy/numbers.json +74 -0
- package/dist/carriers/the-courier-guy/parser.d.ts +3 -0
- package/dist/carriers/the-courier-guy/parser.js +104 -0
- package/dist/carriers/the-courier-guy/status.d.ts +5 -0
- package/dist/carriers/the-courier-guy/status.js +21 -0
- package/dist/carriers/the-courier-guy/statuses.json +61 -0
- package/dist/carriers/tipsa/adapter.d.ts +12 -0
- package/dist/carriers/tipsa/adapter.js +52 -0
- package/dist/carriers/tipsa/carrier.json +92 -0
- package/dist/carriers/tipsa/numbers.json +100 -0
- package/dist/carriers/tipsa/parser.d.ts +17 -0
- package/dist/carriers/tipsa/parser.js +114 -0
- package/dist/carriers/tipsa/status.d.ts +3 -0
- package/dist/carriers/tipsa/status.js +25 -0
- package/dist/carriers/tipsa/statuses.json +12 -0
- package/dist/carriers/tnt/adapter.d.ts +23 -0
- package/dist/carriers/tnt/adapter.js +210 -0
- package/dist/carriers/tnt/carrier.json +66 -0
- package/dist/carriers/tnt/numbers.json +116 -0
- package/dist/carriers/tnt/status.d.ts +3 -0
- package/dist/carriers/tnt/status.js +35 -0
- package/dist/carriers/tnt/statuses.json +126 -0
- package/dist/carriers/ukrposhta/adapter.d.ts +13 -0
- package/dist/carriers/ukrposhta/adapter.js +152 -0
- package/dist/carriers/ukrposhta/carrier.json +62 -0
- package/dist/carriers/ukrposhta/numbers.json +53 -0
- package/dist/carriers/ukrposhta/parser.d.ts +15 -0
- package/dist/carriers/ukrposhta/parser.js +130 -0
- package/dist/carriers/ukrposhta/status.d.ts +3 -0
- package/dist/carriers/ukrposhta/status.js +34 -0
- package/dist/carriers/ukrposhta/statuses.json +208 -0
- package/dist/carriers/uniuni/adapter.d.ts +11 -0
- package/dist/carriers/uniuni/adapter.js +48 -0
- package/dist/carriers/uniuni/carrier.json +90 -0
- package/dist/carriers/uniuni/numbers.json +72 -0
- package/dist/carriers/uniuni/parser.d.ts +5 -0
- package/dist/carriers/uniuni/parser.js +114 -0
- package/dist/carriers/uniuni/status.d.ts +2 -0
- package/dist/carriers/uniuni/status.js +16 -0
- package/dist/carriers/uniuni/statuses.json +54 -0
- package/dist/carriers/unknown/carrier.json +57 -0
- package/dist/carriers/unknown/numbers.json +257 -0
- package/dist/carriers/ups/adapter.d.ts +40 -0
- package/dist/carriers/ups/adapter.js +473 -0
- package/dist/carriers/ups/carrier.json +69 -0
- package/dist/carriers/ups/numbers.json +134 -0
- package/dist/carriers/ups/status.d.ts +25 -0
- package/dist/carriers/ups/status.js +41 -0
- package/dist/carriers/ups/statuses.json +35 -0
- package/dist/carriers/usps/adapter.d.ts +25 -0
- package/dist/carriers/usps/adapter.js +261 -0
- package/dist/carriers/usps/carrier.json +74 -0
- package/dist/carriers/usps/numbers.json +286 -0
- package/dist/carriers/usps/status.d.ts +25 -0
- package/dist/carriers/usps/status.js +72 -0
- package/dist/carriers/usps/statuses.json +24 -0
- package/dist/carriers/yamato/adapter.d.ts +13 -0
- package/dist/carriers/yamato/adapter.js +130 -0
- package/dist/carriers/yamato/carrier.json +72 -0
- package/dist/carriers/yamato/numbers.json +57 -0
- package/dist/carriers/yamato/status.d.ts +2 -0
- package/dist/carriers/yamato/status.js +27 -0
- package/dist/carriers/yamato/statuses.json +159 -0
- package/dist/carriers/yanwen/adapter.d.ts +13 -0
- package/dist/carriers/yanwen/adapter.js +130 -0
- package/dist/carriers/yanwen/carrier.json +66 -0
- package/dist/carriers/yanwen/numbers.json +45 -0
- package/dist/carriers/yanwen/status.d.ts +2 -0
- package/dist/carriers/yanwen/status.js +25 -0
- package/dist/carriers/yanwen/statuses.json +131 -0
- package/dist/carriers/yto/adapter.d.ts +11 -0
- package/dist/carriers/yto/adapter.js +36 -0
- package/dist/carriers/yto/carrier.json +75 -0
- package/dist/carriers/yto/numbers.json +33 -0
- package/dist/carriers/yto/parser.d.ts +3 -0
- package/dist/carriers/yto/parser.js +92 -0
- package/dist/carriers/yto/status.d.ts +10 -0
- package/dist/carriers/yto/status.js +46 -0
- package/dist/carriers/yto/statuses.json +206 -0
- package/dist/carriers/yunda/adapter.d.ts +11 -0
- package/dist/carriers/yunda/adapter.js +68 -0
- package/dist/carriers/yunda/carrier.json +69 -0
- package/dist/carriers/yunda/challenge.d.ts +5 -0
- package/dist/carriers/yunda/challenge.js +68 -0
- package/dist/carriers/yunda/numbers.json +43 -0
- package/dist/carriers/yunda/parser.d.ts +4 -0
- package/dist/carriers/yunda/parser.js +105 -0
- package/dist/carriers/yunda/status.d.ts +4 -0
- package/dist/carriers/yunda/status.js +9 -0
- package/dist/carriers/yunda/statuses.json +40 -0
- package/dist/carriers/yunexpress/adapter.d.ts +20 -0
- package/dist/carriers/yunexpress/adapter.js +240 -0
- package/dist/carriers/yunexpress/carrier.json +69 -0
- package/dist/carriers/yunexpress/numbers.json +32 -0
- package/dist/carriers/yunexpress/status.d.ts +2 -0
- package/dist/carriers/yunexpress/status.js +23 -0
- package/dist/carriers/yunexpress/statuses.json +112 -0
- package/dist/carriers/zto/carrier.json +37 -0
- package/dist/carriers/zto/numbers.json +30 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +82 -0
- package/dist/core/adapter/index.d.ts +90 -0
- package/dist/core/adapter/index.js +103 -0
- package/dist/core/adapter/track.d.ts +10 -0
- package/dist/core/adapter/track.js +20 -0
- package/dist/core/catalog/amazon.d.ts +5 -0
- package/dist/core/catalog/amazon.js +33 -0
- package/dist/core/catalog/definitions.d.ts +24 -0
- package/dist/core/catalog/definitions.js +44 -0
- package/dist/core/catalog/handoff.d.ts +9 -0
- package/dist/core/catalog/handoff.js +56 -0
- package/dist/core/catalog/hints.d.ts +45 -0
- package/dist/core/catalog/hints.js +162 -0
- package/dist/core/catalog/index.d.ts +38 -0
- package/dist/core/catalog/index.js +223 -0
- package/dist/core/catalog/inputs.d.ts +6 -0
- package/dist/core/catalog/inputs.js +89 -0
- package/dist/core/catalog/linkRules.d.ts +24 -0
- package/dist/core/catalog/linkRules.js +20 -0
- package/dist/core/catalog/networks.d.ts +9 -0
- package/dist/core/catalog/networks.js +13 -0
- package/dist/core/catalog/recognition.d.ts +22 -0
- package/dist/core/catalog/recognition.js +52 -0
- package/dist/core/catalog/types.d.ts +135 -0
- package/dist/core/catalog/types.js +1 -0
- package/dist/core/catalog/urls.d.ts +2 -0
- package/dist/core/catalog/urls.js +125 -0
- package/dist/core/detection/amazon.d.ts +2 -0
- package/dist/core/detection/amazon.js +14 -0
- package/dist/core/detection/candidates.d.ts +5 -0
- package/dist/core/detection/candidates.js +41 -0
- package/dist/core/detection/detect.d.ts +17 -0
- package/dist/core/detection/detect.js +52 -0
- package/dist/core/detection/gls.d.ts +16 -0
- package/dist/core/detection/gls.js +21 -0
- package/dist/core/detection/hermes.d.ts +14 -0
- package/dist/core/detection/hermes.js +19 -0
- package/dist/core/detection/index.d.ts +19 -0
- package/dist/core/detection/index.js +9 -0
- package/dist/core/detection/mondialRelay.d.ts +13 -0
- package/dist/core/detection/mondialRelay.js +25 -0
- package/dist/core/detection/normalize.d.ts +15 -0
- package/dist/core/detection/normalize.js +39 -0
- package/dist/core/detection/parse.d.ts +6 -0
- package/dist/core/detection/parse.js +112 -0
- package/dist/core/detection/s10.d.ts +4 -0
- package/dist/core/detection/s10.js +25 -0
- package/dist/core/detection/types.d.ts +22 -0
- package/dist/core/detection/types.js +1 -0
- package/dist/core/errors/hint.d.ts +7 -0
- package/dist/core/errors/hint.js +7 -0
- package/dist/core/errors/index.d.ts +98 -0
- package/dist/core/errors/index.js +178 -0
- package/dist/core/recognition/index.d.ts +24 -0
- package/dist/core/recognition/index.js +65 -0
- package/dist/core/result/index.d.ts +57 -0
- package/dist/core/result/index.js +114 -0
- package/dist/core/result/resolve.d.ts +18 -0
- package/dist/core/result/resolve.js +49 -0
- package/dist/core/runner/index.d.ts +33 -0
- package/dist/core/runner/index.js +109 -0
- package/dist/core/status/index.d.ts +22 -0
- package/dist/core/status/index.js +3 -0
- package/dist/core/status/language.d.ts +11 -0
- package/dist/core/status/language.js +149 -0
- package/dist/core/status/wording.d.ts +25 -0
- package/dist/core/status/wording.js +91 -0
- package/dist/core/telemetry/index.d.ts +62 -0
- package/dist/core/telemetry/index.js +55 -0
- package/dist/core/time/index.d.ts +84 -0
- package/dist/core/time/index.js +243 -0
- package/dist/core/time/result.d.ts +5 -0
- package/dist/core/time/result.js +55 -0
- package/dist/core/transport/boundedFetch.d.ts +26 -0
- package/dist/core/transport/boundedFetch.js +152 -0
- package/dist/core/transport/browser.d.ts +14 -0
- package/dist/core/transport/browser.js +113 -0
- package/dist/core/transport/index.d.ts +8 -0
- package/dist/core/transport/index.js +5 -0
- package/dist/core/transport/optional.d.ts +2 -0
- package/dist/core/transport/optional.js +17 -0
- package/dist/core/transport/text.d.ts +8 -0
- package/dist/core/transport/text.js +18 -0
- package/dist/core/transport/trawl.d.ts +80 -0
- package/dist/core/transport/trawl.js +212 -0
- package/dist/core/transport/upstreamHttpDiagnostics.d.ts +16 -0
- package/dist/core/transport/upstreamHttpDiagnostics.js +97 -0
- package/dist/core/types.d.ts +8 -0
- package/dist/core/types.js +11 -0
- package/dist/data/catalog.json +3969 -0
- package/dist/facade/index.d.ts +57 -0
- package/dist/facade/index.js +195 -0
- package/dist/generated/catalog.d.ts +2671 -0
- package/dist/generated/catalog.js +4090 -0
- package/dist/generated/recognition.d.ts +2 -0
- package/dist/generated/recognition.js +31 -0
- package/dist/generated/regionTowns.d.ts +2 -0
- package/dist/generated/regionTowns.js +11 -0
- package/dist/generated/registry.d.ts +4 -0
- package/dist/generated/registry.js +286 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +18 -0
- package/dist/node.d.ts +11 -0
- package/dist/node.js +11 -0
- package/dist/places/countries.json +1670 -0
- package/dist/places/facilities.json +11 -0
- package/dist/places/index.d.ts +42 -0
- package/dist/places/index.js +307 -0
- package/dist/places/names.d.mts +15 -0
- package/dist/places/names.mjs +36 -0
- package/dist/places/places.tsv.br +0 -0
- package/dist/places/trackingLocation.d.ts +18 -0
- package/dist/places/trackingLocation.js +89 -0
- package/dist/providers/coverage.d.ts +31 -0
- package/dist/providers/coverage.js +70 -0
- package/dist/providers/coverage.json +1744 -0
- package/dist/providers/parcelsapp/adapter.d.ts +23 -0
- package/dist/providers/parcelsapp/adapter.js +391 -0
- package/dist/providers/parcelsapp/http.d.ts +9 -0
- package/dist/providers/parcelsapp/http.js +67 -0
- package/dist/providers/plan.d.ts +38 -0
- package/dist/providers/plan.js +54 -0
- package/dist/providers/postal-ninja/adapter.d.ts +17 -0
- package/dist/providers/postal-ninja/adapter.js +200 -0
- package/dist/providers/seventeentrack/adapter.d.ts +50 -0
- package/dist/providers/seventeentrack/adapter.js +165 -0
- package/dist/providers/seventeentrack/events.d.ts +4 -0
- package/dist/providers/seventeentrack/events.js +56 -0
- package/dist/providers/shared/capture.d.ts +46 -0
- package/dist/providers/shared/capture.js +92 -0
- package/dist/providers/shared/hints.d.ts +16 -0
- package/dist/providers/shared/hints.js +37 -0
- package/dist/providers/shared/result.d.ts +15 -0
- package/dist/providers/shared/result.js +161 -0
- package/dist/providers/shared/scans.d.ts +22 -0
- package/dist/providers/shared/scans.js +29 -0
- package/dist/providers/ship24/adapter.d.ts +17 -0
- package/dist/providers/ship24/adapter.js +140 -0
- package/dist/providers/ship24/http.d.ts +7 -0
- package/dist/providers/ship24/http.js +75 -0
- package/dist/providers/types.d.ts +1 -0
- package/dist/providers/types.js +1 -0
- package/dist/providers/universal.d.ts +66 -0
- package/dist/providers/universal.js +95 -0
- package/dist/providers/upu/adapter.d.ts +5 -0
- package/dist/providers/upu/adapter.js +107 -0
- package/dist/scripts/canary-report.d.mts +22 -0
- package/dist/scripts/canary-report.mjs +69 -0
- package/dist/scripts/carrier-canary.d.ts +50 -0
- package/dist/scripts/carrier-canary.js +220 -0
- package/dist/server/index.d.ts +20 -0
- package/dist/server/index.js +226 -0
- package/dist/server/openapi.json +487 -0
- package/dist/server/page.d.ts +1 -0
- package/dist/server/page.js +33 -0
- package/package.json +102 -4
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SunYou tracking.
|
|
3
|
+
*
|
|
4
|
+
* `sypost.net/queryTrack` is the keyless endpoint the public search page uses.
|
|
5
|
+
* It answers with JSONP (`callbackName({...})`) rather than JSON and expects a
|
|
6
|
+
* cache-busting `queryTime`, so the body is unwrapped before it is parsed.
|
|
7
|
+
*
|
|
8
|
+
* A shipment is returned in two legs — `result.origin` and
|
|
9
|
+
* `result.destination` — each stamping its own timezone. Events are merged and
|
|
10
|
+
* ordered by absolute instant, never by comparing wall-clock strings across
|
|
11
|
+
* legs.
|
|
12
|
+
*/
|
|
13
|
+
import { randomInt } from 'node:crypto';
|
|
14
|
+
import { DateTime } from 'luxon';
|
|
15
|
+
import { NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
16
|
+
import { decodeText, fetchBounded } from '../../core/transport/index.js';
|
|
17
|
+
import { isRecord } from '../../core/types.js';
|
|
18
|
+
import { sunYouStatus } from './status.js';
|
|
19
|
+
const PROVIDER = 'SunYou';
|
|
20
|
+
const UPSTREAM = 'SunYou tracking';
|
|
21
|
+
const QUERY_URL = 'https://sypost.net/queryTrack';
|
|
22
|
+
const JSONP_ENVELOPE = /^\s*\w+\(([\s\S]*)\)\s*;?\s*$/;
|
|
23
|
+
const EXPLICIT_OFFSET = /(?:Z|[+-]\d{2}:?\d{2})$/;
|
|
24
|
+
const LEG_OFFSET = /^([+-])(\d{2}):?(\d{2})$/;
|
|
25
|
+
const MAX_EVENTS_TO_RETURN = 20;
|
|
26
|
+
const BASE_HEADERS = {
|
|
27
|
+
Accept: 'application/json, text/plain, */*',
|
|
28
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
29
|
+
'User-Agent': 'Mozilla/5.0 (compatible; SwissDeliveryTracker/1.0)',
|
|
30
|
+
};
|
|
31
|
+
function record(value) {
|
|
32
|
+
return isRecord(value) ? value : {};
|
|
33
|
+
}
|
|
34
|
+
function recordArray(value) {
|
|
35
|
+
return Array.isArray(value) ? value.filter(isRecord) : [];
|
|
36
|
+
}
|
|
37
|
+
function text(value) {
|
|
38
|
+
return typeof value === 'string' ? value : '';
|
|
39
|
+
}
|
|
40
|
+
function comparableIdentifier(value) {
|
|
41
|
+
return text(value).toLocaleUpperCase('en-US').replace(/[^A-Z0-9]/g, '');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The event's timestamp, with the leg's offset applied when the provider gives
|
|
45
|
+
* one. This is not `core/time`'s `explicitOffsetTime`: that policy rejects a
|
|
46
|
+
* value it cannot resolve, while SunYou's provider text must pass through
|
|
47
|
+
* unchanged instead of disappearing — a naive string is still the only thing
|
|
48
|
+
* the carrier said about that scan, and inventing a zone would be worse.
|
|
49
|
+
*/
|
|
50
|
+
function sunYouEventTime(event) {
|
|
51
|
+
const raw = text(event.createTime);
|
|
52
|
+
if (!raw || EXPLICIT_OFFSET.test(raw))
|
|
53
|
+
return raw;
|
|
54
|
+
// Origin/destination legs stamp their own zone (observed "+08:00" on origin
|
|
55
|
+
// scans of a captured SYAE shipment). Honor an explicit offset instead of
|
|
56
|
+
// comparing wall-clock strings across legs; without a usable offset the
|
|
57
|
+
// provider text passes through unchanged — never invented.
|
|
58
|
+
const zone = LEG_OFFSET.exec(text(event.timeZone));
|
|
59
|
+
if (!zone)
|
|
60
|
+
return raw;
|
|
61
|
+
const parsed = DateTime.fromISO(`${raw.replace(' ', 'T')}${zone[1]}${zone[2]}:${zone[3]}`, { setZone: true });
|
|
62
|
+
return parsed.isValid ? parsed.toISO({ suppressMilliseconds: true }) ?? raw : raw;
|
|
63
|
+
}
|
|
64
|
+
function sunYouEventInstant(event) {
|
|
65
|
+
// fromISO needs the T separator; provider wall-clock strings use a space.
|
|
66
|
+
const parsed = DateTime.fromISO(sunYouEventTime(event).replace(' ', 'T'), { setZone: true });
|
|
67
|
+
return parsed.isValid ? parsed.toMillis() : Number.NEGATIVE_INFINITY;
|
|
68
|
+
}
|
|
69
|
+
/** Unwraps the JSONP envelope the search page receives. */
|
|
70
|
+
export function parseSunYouEnvelope(body) {
|
|
71
|
+
const match = JSONP_ENVELOPE.exec(body);
|
|
72
|
+
if (!match) {
|
|
73
|
+
throw new SchemaError(PROVIDER, 'SunYou returned an invalid tracking response');
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
return JSON.parse(match[1]);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw new SchemaError(PROVIDER, 'SunYou returned an invalid tracking response', { cause: error });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Projects one unwrapped payload. Pure: the offline tests target this. */
|
|
83
|
+
export function parseSunYouTrackingResponse(value, trackingNumber) {
|
|
84
|
+
const payload = record(value);
|
|
85
|
+
if (!Array.isArray(payload.data)) {
|
|
86
|
+
throw new SchemaError(PROVIDER, 'SunYou returned an invalid tracking response');
|
|
87
|
+
}
|
|
88
|
+
const items = recordArray(payload.data);
|
|
89
|
+
if (items.length !== payload.data.length) {
|
|
90
|
+
throw new SchemaError(PROVIDER, 'SunYou returned an invalid shipment entry');
|
|
91
|
+
}
|
|
92
|
+
if (items.length === 0)
|
|
93
|
+
throw new SchemaError(PROVIDER, 'SunYou did not return a shipment entry');
|
|
94
|
+
const requested = comparableIdentifier(trackingNumber);
|
|
95
|
+
const identified = items.filter((candidate) => comparableIdentifier(candidate.orderNo));
|
|
96
|
+
if (identified.length === 0)
|
|
97
|
+
throw new SchemaError(PROVIDER, 'SunYou did not return a shipment identifier');
|
|
98
|
+
const item = identified.find((candidate) => comparableIdentifier(candidate.orderNo) === requested);
|
|
99
|
+
if (!item)
|
|
100
|
+
throw new SchemaError(PROVIDER, 'SunYou returned a different shipment');
|
|
101
|
+
const displayStatus = String(item.displayStatus ?? '');
|
|
102
|
+
if (displayStatus === '0')
|
|
103
|
+
throw new NotFoundError(PROVIDER);
|
|
104
|
+
if (item.has !== true)
|
|
105
|
+
throw new NotFoundError(PROVIDER);
|
|
106
|
+
const result = record(item.result);
|
|
107
|
+
const allEvents = [
|
|
108
|
+
...recordArray(record(result.origin).items),
|
|
109
|
+
...recordArray(record(result.destination).items),
|
|
110
|
+
].sort((left, right) => sunYouEventInstant(right) - sunYouEventInstant(left));
|
|
111
|
+
const classified = sunYouStatus(displayStatus);
|
|
112
|
+
const events = allEvents.slice(0, MAX_EVENTS_TO_RETURN).map((event, index) => ({
|
|
113
|
+
time: sunYouEventTime(event),
|
|
114
|
+
location: '',
|
|
115
|
+
description: text(event.content),
|
|
116
|
+
...(index === 0 && classified ? { stage: classified.stage } : {}),
|
|
117
|
+
}));
|
|
118
|
+
return {
|
|
119
|
+
status: classified?.status ?? 'in_transit',
|
|
120
|
+
...(classified ? { current_stage: classified.stage } : {}),
|
|
121
|
+
last_status_text: text(item.lastContent) || events[0]?.description || '',
|
|
122
|
+
last_update: text(item.lastUpdate) || events[0]?.time || null,
|
|
123
|
+
expected_delivery: null,
|
|
124
|
+
events,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export class SunYouTracker {
|
|
128
|
+
fetcher;
|
|
129
|
+
timeoutMs;
|
|
130
|
+
constructor(options = {}) {
|
|
131
|
+
this.fetcher = options.fetcher;
|
|
132
|
+
this.timeoutMs = options.timeoutMs;
|
|
133
|
+
}
|
|
134
|
+
async fetch(trackingNumber) {
|
|
135
|
+
const queryTime = `${Date.now()}-${randomInt(10_000, 100_000)}`;
|
|
136
|
+
const { bytes } = await fetchBounded(`${QUERY_URL}?${new URLSearchParams({
|
|
137
|
+
queryTime,
|
|
138
|
+
toLanguage: 'en_US',
|
|
139
|
+
trackNumber: trackingNumber,
|
|
140
|
+
})}`, { headers: { ...BASE_HEADERS, Referer: 'https://sypost.net/search' } }, { provider: UPSTREAM, ...(this.timeoutMs === undefined ? {} : { timeoutMs: this.timeoutMs }), fetcher: this.fetcher });
|
|
141
|
+
return parseSunYouTrackingResponse(parseSunYouEnvelope(decodeText(bytes)), trackingNumber);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** Kept for the host's legacy dispatch chain until it is deleted. */
|
|
145
|
+
export async function fetchSunYou(trackingNumber) {
|
|
146
|
+
return new SunYouTracker().fetch(trackingNumber);
|
|
147
|
+
}
|
|
148
|
+
export const adapter = (environment) => {
|
|
149
|
+
const tracker = new SunYouTracker({ fetcher: environment.fetcher });
|
|
150
|
+
return {
|
|
151
|
+
id: 'sunyou',
|
|
152
|
+
// One keyless GET; there is no second tier to fall back to.
|
|
153
|
+
steps: ['direct'],
|
|
154
|
+
track: (input) => tracker.fetch(input.number),
|
|
155
|
+
};
|
|
156
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "sunyou",
|
|
3
|
+
"displayName": "SunYou",
|
|
4
|
+
"aliases": [
|
|
5
|
+
"SYPost"
|
|
6
|
+
],
|
|
7
|
+
"region": {
|
|
8
|
+
"countries": [
|
|
9
|
+
"CN"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"brand": {
|
|
13
|
+
"color": "#f39800"
|
|
14
|
+
},
|
|
15
|
+
"selectable": true,
|
|
16
|
+
"timezone": "UTC",
|
|
17
|
+
"tracking": {
|
|
18
|
+
"mode": "automatic",
|
|
19
|
+
"adapter": "sunyou",
|
|
20
|
+
"steps": [
|
|
21
|
+
"direct"
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"capabilities": [
|
|
25
|
+
"history"
|
|
26
|
+
],
|
|
27
|
+
"portal": {
|
|
28
|
+
"url": "https://sypost.net/search?orderNo={trackingNumber}",
|
|
29
|
+
"canaryUrl": "https://sypost.net/",
|
|
30
|
+
"shows": [
|
|
31
|
+
"status",
|
|
32
|
+
"history"
|
|
33
|
+
],
|
|
34
|
+
"scraped": [
|
|
35
|
+
"status",
|
|
36
|
+
"history"
|
|
37
|
+
],
|
|
38
|
+
"discarded": [],
|
|
39
|
+
"unavailable": []
|
|
40
|
+
},
|
|
41
|
+
"links": [
|
|
42
|
+
{
|
|
43
|
+
"domains": [
|
|
44
|
+
"sypost.net"
|
|
45
|
+
],
|
|
46
|
+
"params": [
|
|
47
|
+
"orderNo",
|
|
48
|
+
"trackNumber"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"detection": [
|
|
53
|
+
{
|
|
54
|
+
"id": "sunyou-1",
|
|
55
|
+
"pattern": "^SY\\d{11}$",
|
|
56
|
+
"confidence": "high"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "sunyou-2",
|
|
60
|
+
"pattern": "^SYAE\\d{9}$",
|
|
61
|
+
"confidence": "high"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "sunyou",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "SY12345678901",
|
|
6
|
+
"role": "shipment",
|
|
7
|
+
"evidence": "synthetic",
|
|
8
|
+
"derivedFrom": "official_shape",
|
|
9
|
+
"shapeConfirmed": "2026-09-12",
|
|
10
|
+
"expect": {
|
|
11
|
+
"carrier": "sunyou",
|
|
12
|
+
"confidence": "high"
|
|
13
|
+
},
|
|
14
|
+
"note": "Made-up number that follows the published format."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"number": "SYAE006809461",
|
|
18
|
+
"role": "shipment",
|
|
19
|
+
"evidence": "public_shipment_report",
|
|
20
|
+
"source": {
|
|
21
|
+
"url": "https://github.com/ha-parcel-integrations/ha-sunyou/blob/main/tests/payloads.py",
|
|
22
|
+
"date": "2021-07-20"
|
|
23
|
+
},
|
|
24
|
+
"expect": {
|
|
25
|
+
"carrier": "sunyou",
|
|
26
|
+
"confidence": "high"
|
|
27
|
+
},
|
|
28
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"number": "SYAE100000001",
|
|
32
|
+
"role": "shipment",
|
|
33
|
+
"evidence": "open_source_example",
|
|
34
|
+
"source": {
|
|
35
|
+
"url": "https://github.com/ha-parcel-integrations/ha-sunyou/blob/main/tests/payloads.py"
|
|
36
|
+
},
|
|
37
|
+
"expect": {
|
|
38
|
+
"carrier": "sunyou",
|
|
39
|
+
"confidence": "high"
|
|
40
|
+
},
|
|
41
|
+
"note": "Open-source project example, not a real shipment."
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SunYou status vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* The tracking endpoint returns one numeric `displayStatus` per shipment; the
|
|
5
|
+
* scan texts themselves carry no code. `0` is not in the map: it is SunYou's
|
|
6
|
+
* explicit "no such shipment" and the adapter turns it into a not-found before
|
|
7
|
+
* classification.
|
|
8
|
+
*
|
|
9
|
+
* Only the newest scan inherits this stage. Older scans are returned without
|
|
10
|
+
* one, because the shipment-level status says nothing about where the parcel
|
|
11
|
+
* was three days ago.
|
|
12
|
+
*/
|
|
13
|
+
import type { ClassifiedStatus } from '../../core/status/index.js';
|
|
14
|
+
declare const DISPLAY_STATUS: Map<string, ClassifiedStatus>;
|
|
15
|
+
export { DISPLAY_STATUS as SUNYOU_STATUS };
|
|
16
|
+
/** The status and stage for one `displayStatus`, or undefined when unmapped. */
|
|
17
|
+
export declare function sunYouStatus(displayStatus: string): ClassifiedStatus | undefined;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const DISPLAY_STATUS = new Map([
|
|
2
|
+
['1', { status: 'in_transit', stage: 'in_transit' }],
|
|
3
|
+
['2', { status: 'out_for_delivery', stage: 'ready_for_pickup' }],
|
|
4
|
+
['3', { status: 'exception', stage: 'failed_attempt' }],
|
|
5
|
+
['4', { status: 'delivered', stage: 'delivered' }],
|
|
6
|
+
['5', { status: 'exception', stage: 'failed_attempt' }],
|
|
7
|
+
['6', { status: 'exception', stage: 'failed_attempt' }],
|
|
8
|
+
]);
|
|
9
|
+
export { DISPLAY_STATUS as SUNYOU_STATUS };
|
|
10
|
+
/** The status and stage for one `displayStatus`, or undefined when unmapped. */
|
|
11
|
+
export function sunYouStatus(displayStatus) {
|
|
12
|
+
return DISPLAY_STATUS.get(displayStatus);
|
|
13
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "sunyou",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"code": "0",
|
|
6
|
+
"confirmedBy": "fixture",
|
|
7
|
+
"firstSeen": "2026-09-12",
|
|
8
|
+
"note": "Explicit \"no such shipment\"; reported as a clean 404 and never classified."
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"code": "1",
|
|
12
|
+
"stage": "in_transit",
|
|
13
|
+
"confirmedBy": "fixture",
|
|
14
|
+
"firstSeen": "2026-09-12",
|
|
15
|
+
"note": "Shipment-level display status; only the newest scan inherits it."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"code": "2",
|
|
19
|
+
"stage": "ready_for_pickup",
|
|
20
|
+
"confirmedBy": "fixture",
|
|
21
|
+
"firstSeen": "2026-09-12",
|
|
22
|
+
"note": "Waiting at a pickup point."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"code": "3",
|
|
26
|
+
"stage": "failed_attempt",
|
|
27
|
+
"confirmedBy": "fixture",
|
|
28
|
+
"firstSeen": "2026-09-12",
|
|
29
|
+
"note": "Shipment-level display status; only the newest scan inherits it."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"code": "4",
|
|
33
|
+
"stage": "delivered",
|
|
34
|
+
"confirmedBy": "fixture",
|
|
35
|
+
"firstSeen": "2026-09-12",
|
|
36
|
+
"note": "Shipment-level display status; only the newest scan inherits it."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"code": "5",
|
|
40
|
+
"stage": "failed_attempt",
|
|
41
|
+
"confirmedBy": "fixture",
|
|
42
|
+
"firstSeen": "2026-09-12",
|
|
43
|
+
"note": "Shipment-level display status; only the newest scan inherits it."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"code": "6",
|
|
47
|
+
"stage": "failed_attempt",
|
|
48
|
+
"confirmedBy": "fixture",
|
|
49
|
+
"firstSeen": "2026-09-12",
|
|
50
|
+
"note": "Shipment-level display status; only the newest scan inherits it."
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AdapterFactory } from '../../core/adapter/index.js';
|
|
2
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
3
|
+
import { type JsonObject } from '../../core/types.js';
|
|
4
|
+
export interface SwissPostOptions {
|
|
5
|
+
/** Test seam; production uses the global fetch. The cookie jar wraps it. */
|
|
6
|
+
fetcher?: typeof fetch;
|
|
7
|
+
}
|
|
8
|
+
export declare function swissPostExpectedDelivery(item: JsonObject): string | null;
|
|
9
|
+
export declare function parseSwissPostShipment(item: JsonObject, rawEvents: unknown[], translations?: Record<string, string>): CarrierResult;
|
|
10
|
+
export declare class SwissPostTracker {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(options?: SwissPostOptions);
|
|
13
|
+
readJson(fetcher: typeof fetch, url: string, init?: RequestInit): Promise<unknown>;
|
|
14
|
+
/** Cached for the process: the table is large, static, and shared by every lookup. */
|
|
15
|
+
loadTranslations(fetcher: typeof fetch): Promise<Record<string, string>>;
|
|
16
|
+
fetch(trackingNumber: string): Promise<CarrierResult>;
|
|
17
|
+
}
|
|
18
|
+
export declare const adapter: AdapterFactory;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { load } from 'cheerio';
|
|
2
|
+
import makeFetchCookie from 'fetch-cookie';
|
|
3
|
+
import { CookieJar } from 'tough-cookie';
|
|
4
|
+
import { NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
5
|
+
import { fetchBounded, parseJsonBytes } from '../../core/transport/index.js';
|
|
6
|
+
import { isRecord } from '../../core/types.js';
|
|
7
|
+
import { FALLBACK_EVENT_LABELS, STAGE_STATUS, STATUS_MAP, swissPostEventStage } from './status.js';
|
|
8
|
+
// The public tracker signs an anonymous visitor in before it will search: it
|
|
9
|
+
// creates a throwaway user, echoes a CSRF token, and keys the search result on
|
|
10
|
+
// a hash. Every call in that sequence shares one cookie jar.
|
|
11
|
+
const API_BASE = 'https://service.post.ch/ekp-web/api';
|
|
12
|
+
const TRANSLATIONS_URL = 'https://service.post.ch/ekp-web/core/rest/translations/en/shipment-text-messages';
|
|
13
|
+
const PROVIDER = 'Swiss Post';
|
|
14
|
+
const HEADERS = {
|
|
15
|
+
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/121.0.0.0 Safari/537.36',
|
|
16
|
+
Accept: 'application/json, text/plain, */*',
|
|
17
|
+
'Accept-Language': 'en-CH,en;q=0.9',
|
|
18
|
+
Referer: 'https://service.post.ch/ekp-web/ui/',
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Trim and cap without collapsing inner whitespace: Swiss Post's translated
|
|
22
|
+
* wording is shown as the carrier writes it, so `core/transport`'s `clean` is
|
|
23
|
+
* deliberately not used here.
|
|
24
|
+
*/
|
|
25
|
+
function text(value, limit = 500) {
|
|
26
|
+
return String(value ?? '').trim().slice(0, limit);
|
|
27
|
+
}
|
|
28
|
+
function comparableShipmentNumber(value) {
|
|
29
|
+
return String(value ?? '').replace(/[\s.-]/g, '').toUpperCase();
|
|
30
|
+
}
|
|
31
|
+
function datePart(value) {
|
|
32
|
+
return /(?<!\d)(\d{4}-\d{2}-\d{2})(?!\d)/.exec(text(value))?.[1] ?? null;
|
|
33
|
+
}
|
|
34
|
+
function clockParts(value) {
|
|
35
|
+
if (isRecord(value)) {
|
|
36
|
+
return ['start', 'end', 'from', 'to'].flatMap((key) => clockParts(value[key]));
|
|
37
|
+
}
|
|
38
|
+
if (Array.isArray(value))
|
|
39
|
+
return value.flatMap(clockParts);
|
|
40
|
+
const stringValue = text(value);
|
|
41
|
+
const timestampClock = /T((?:[01]\d|2[0-3]):[0-5]\d)/.exec(stringValue)?.[1];
|
|
42
|
+
if (timestampClock)
|
|
43
|
+
return [timestampClock];
|
|
44
|
+
const clocks = stringValue.match(/(?<!\d)(?:[01]\d|2[0-3]):[0-5]\d/g) ?? [];
|
|
45
|
+
if (clocks.length > 1 && /[+-](?:[01]\d|2[0-3]):[0-5]\d$/.test(stringValue)) {
|
|
46
|
+
return clocks.slice(0, 1);
|
|
47
|
+
}
|
|
48
|
+
return clocks;
|
|
49
|
+
}
|
|
50
|
+
export function swissPostExpectedDelivery(item) {
|
|
51
|
+
const interval = item.deliveryTimeInterval;
|
|
52
|
+
const range = isRecord(item.deliveryRange) ? item.deliveryRange : {};
|
|
53
|
+
const date = [
|
|
54
|
+
item.calculatedDeliveryDate,
|
|
55
|
+
item.deliveryDate,
|
|
56
|
+
interval,
|
|
57
|
+
range.start,
|
|
58
|
+
range.end,
|
|
59
|
+
].map(datePart).find(Boolean) ?? null;
|
|
60
|
+
if (!date)
|
|
61
|
+
return null;
|
|
62
|
+
const clocks = clockParts(interval);
|
|
63
|
+
if (clocks.length === 0)
|
|
64
|
+
return date;
|
|
65
|
+
if (clocks.length === 1 || clocks[0] === clocks[1])
|
|
66
|
+
return `${date} ${clocks[0]}`;
|
|
67
|
+
return `${date} ${clocks[0]}–${clocks[1]}`;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve one dotted translation key against the service's pattern table, where
|
|
71
|
+
* `*` is a wildcard segment. The most specific pattern of the same length wins.
|
|
72
|
+
*/
|
|
73
|
+
function translationMatch(translations, segments) {
|
|
74
|
+
let best = null;
|
|
75
|
+
for (const [pattern, description] of Object.entries(translations)) {
|
|
76
|
+
const patternSegments = pattern.split('.');
|
|
77
|
+
if (patternSegments.length !== segments.length)
|
|
78
|
+
continue;
|
|
79
|
+
if (!patternSegments.every((expected, index) => expected === '*' || expected === segments[index])) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const score = patternSegments.filter((segment) => segment !== '*').length;
|
|
83
|
+
if (!best || score > best.score)
|
|
84
|
+
best = { score, description };
|
|
85
|
+
}
|
|
86
|
+
return best?.description ?? null;
|
|
87
|
+
}
|
|
88
|
+
function eventDescription(event, translations, internationalType) {
|
|
89
|
+
const eventCode = text(event.eventCode, 100);
|
|
90
|
+
const segments = [...eventCode.split('.'), internationalType];
|
|
91
|
+
let description = translationMatch(translations, segments);
|
|
92
|
+
const subEventId = text(event.subEventId, 50);
|
|
93
|
+
if (subEventId) {
|
|
94
|
+
const subSegments = [...segments, subEventId];
|
|
95
|
+
const detailCode = text(event.subEventDetailCode, 50);
|
|
96
|
+
if (detailCode)
|
|
97
|
+
subSegments.push(detailCode);
|
|
98
|
+
const detail = translationMatch(translations, subSegments);
|
|
99
|
+
if (detail && detail !== description)
|
|
100
|
+
description = description ? `${description} — ${detail}` : detail;
|
|
101
|
+
}
|
|
102
|
+
const metadata = isRecord(event.externalMetadata) ? event.externalMetadata : {};
|
|
103
|
+
const externalDescription = text(metadata.description);
|
|
104
|
+
const code = eventCode.split('.').at(-1) ?? '';
|
|
105
|
+
const value = description || externalDescription || FALLBACK_EVENT_LABELS[code] || eventCode;
|
|
106
|
+
const $ = load(`<span>${value}</span>`);
|
|
107
|
+
return $('span').text().trim().slice(0, 500) || 'Tracking update';
|
|
108
|
+
}
|
|
109
|
+
/** Operational scan location only: the city and its postcode, never a street. */
|
|
110
|
+
function eventLocation(event) {
|
|
111
|
+
return [text(event.city, 100), text(event.zip, 30)].filter(Boolean).join(' ').slice(0, 160);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Local ordering policy: event timestamps are read only to sort. Values without
|
|
115
|
+
* an offset are treated as UTC for that comparison, which keeps the ordering
|
|
116
|
+
* stable without rewriting the string the carrier sent — the event keeps the
|
|
117
|
+
* carrier's own `timestamp` verbatim.
|
|
118
|
+
*/
|
|
119
|
+
function timestamp(value) {
|
|
120
|
+
const explicitZone = /(?:Z|[+-]\d{2}:?\d{2})$/i.test(value);
|
|
121
|
+
const parsed = Date.parse(explicitZone ? value : `${value}Z`);
|
|
122
|
+
return Number.isFinite(parsed) ? parsed : Number.NEGATIVE_INFINITY;
|
|
123
|
+
}
|
|
124
|
+
export function parseSwissPostShipment(item, rawEvents, translations = {}) {
|
|
125
|
+
const globalStatus = text(item.globalStatus, 100);
|
|
126
|
+
let status = STATUS_MAP.get(globalStatus) ?? 'in_transit';
|
|
127
|
+
const internationalType = item.internationalImport
|
|
128
|
+
? 'IMPORT'
|
|
129
|
+
: item.internationalExport
|
|
130
|
+
? 'EXPORT'
|
|
131
|
+
: 'INLAND';
|
|
132
|
+
const events = [];
|
|
133
|
+
for (const rawEvent of rawEvents.slice(0, 100)) {
|
|
134
|
+
if (!isRecord(rawEvent))
|
|
135
|
+
continue;
|
|
136
|
+
const time = text(rawEvent.timestamp, 100);
|
|
137
|
+
const eventCode = text(rawEvent.eventCode, 100);
|
|
138
|
+
if (!time || !eventCode)
|
|
139
|
+
continue;
|
|
140
|
+
const event = {
|
|
141
|
+
time,
|
|
142
|
+
location: eventLocation(rawEvent),
|
|
143
|
+
description: eventDescription(rawEvent, translations, internationalType),
|
|
144
|
+
provider_code: eventCode,
|
|
145
|
+
};
|
|
146
|
+
const stage = swissPostEventStage(eventCode);
|
|
147
|
+
if (stage)
|
|
148
|
+
event.stage = stage;
|
|
149
|
+
events.push(event);
|
|
150
|
+
}
|
|
151
|
+
events.sort((left, right) => timestamp(right.time ?? '') - timestamp(left.time ?? ''));
|
|
152
|
+
let lastStatusText;
|
|
153
|
+
let lastUpdate;
|
|
154
|
+
if (events[0]) {
|
|
155
|
+
lastStatusText = events[0].description ?? 'Tracking update';
|
|
156
|
+
if (events[0].stage && STAGE_STATUS[events[0].stage])
|
|
157
|
+
status = STAGE_STATUS[events[0].stage];
|
|
158
|
+
lastUpdate = events[0].time ?? null;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
lastStatusText = globalStatus;
|
|
162
|
+
lastUpdate = text(item.lastEventDateTime, 100) || null;
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
status,
|
|
166
|
+
...(events[0]?.stage ? { current_stage: events[0].stage } : {}),
|
|
167
|
+
last_status_text: lastStatusText,
|
|
168
|
+
last_update: lastUpdate,
|
|
169
|
+
expected_delivery: swissPostExpectedDelivery(item),
|
|
170
|
+
timezone: 'Europe/Zurich',
|
|
171
|
+
global_status: globalStatus,
|
|
172
|
+
canonical_tracking_number: comparableShipmentNumber(item.shipmentNumber) || undefined,
|
|
173
|
+
...(/^[A-Z0-9]{4,40}$/.test(comparableShipmentNumber(item.internationalBarcode))
|
|
174
|
+
? { international_tracking_number: comparableShipmentNumber(item.internationalBarcode) } : {}),
|
|
175
|
+
delivery_range: item.deliveryRange,
|
|
176
|
+
delivery_time_interval: item.deliveryTimeInterval,
|
|
177
|
+
events,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export class SwissPostTracker {
|
|
181
|
+
#translations = null;
|
|
182
|
+
#translationAttempted = false;
|
|
183
|
+
#fetcher;
|
|
184
|
+
constructor(options = {}) {
|
|
185
|
+
this.#fetcher = options.fetcher;
|
|
186
|
+
}
|
|
187
|
+
async readJson(fetcher, url, init = {}) {
|
|
188
|
+
const { bytes } = await fetchBounded(url, init, {
|
|
189
|
+
provider: 'Swiss Post tracking',
|
|
190
|
+
timeoutMs: 10_000,
|
|
191
|
+
fetcher,
|
|
192
|
+
});
|
|
193
|
+
return parseJsonBytes(bytes, PROVIDER);
|
|
194
|
+
}
|
|
195
|
+
/** Cached for the process: the table is large, static, and shared by every lookup. */
|
|
196
|
+
async loadTranslations(fetcher) {
|
|
197
|
+
if (this.#translations)
|
|
198
|
+
return this.#translations;
|
|
199
|
+
if (this.#translationAttempted)
|
|
200
|
+
return {};
|
|
201
|
+
this.#translationAttempted = true;
|
|
202
|
+
try {
|
|
203
|
+
const payload = await this.readJson(fetcher, TRANSLATIONS_URL, { headers: HEADERS });
|
|
204
|
+
const raw = isRecord(payload) && isRecord(payload['shipment-text--'])
|
|
205
|
+
? payload['shipment-text--']
|
|
206
|
+
: {};
|
|
207
|
+
this.#translations = Object.fromEntries(Object.entries(raw).filter((entry) => typeof entry[1] === 'string'));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return {};
|
|
211
|
+
}
|
|
212
|
+
return this.#translations;
|
|
213
|
+
}
|
|
214
|
+
async fetch(trackingNumber) {
|
|
215
|
+
const fetcher = makeFetchCookie(this.#fetcher ?? fetch, new CookieJar());
|
|
216
|
+
const userResult = await fetchBounded(`${API_BASE}/user`, { headers: HEADERS }, {
|
|
217
|
+
provider: 'Swiss Post tracking',
|
|
218
|
+
timeoutMs: 10_000,
|
|
219
|
+
fetcher,
|
|
220
|
+
});
|
|
221
|
+
const userPayload = parseJsonBytes(userResult.bytes, PROVIDER);
|
|
222
|
+
if (!isRecord(userPayload))
|
|
223
|
+
throw new SchemaError(PROVIDER, 'Swiss Post returned an invalid anonymous user response');
|
|
224
|
+
const userId = text(userPayload.userIdentifier);
|
|
225
|
+
if (!userId)
|
|
226
|
+
throw new SchemaError(PROVIDER, 'Swiss Post did not return an anonymous user identifier');
|
|
227
|
+
const csrf = userResult.response.headers.get('x-csrf-token') ?? '';
|
|
228
|
+
const headers = { ...HEADERS, 'x-csrf-token': csrf };
|
|
229
|
+
const query = new URLSearchParams({ userId });
|
|
230
|
+
const historyPayload = await this.readJson(fetcher, `${API_BASE}/history?${query}`, {
|
|
231
|
+
method: 'POST',
|
|
232
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
233
|
+
body: JSON.stringify({ searchQuery: trackingNumber }),
|
|
234
|
+
});
|
|
235
|
+
const hash = isRecord(historyPayload) ? text(historyPayload.hash) : '';
|
|
236
|
+
if (!hash)
|
|
237
|
+
throw new SchemaError(PROVIDER, 'Swiss Post did not return a shipment search identifier');
|
|
238
|
+
const items = await this.readJson(fetcher, `${API_BASE}/history/not-included/${encodeURIComponent(hash)}?${query}`, { headers });
|
|
239
|
+
if (!Array.isArray(items)) {
|
|
240
|
+
throw new SchemaError(PROVIDER, 'Swiss Post returned an invalid shipment response');
|
|
241
|
+
}
|
|
242
|
+
if (items.length === 0)
|
|
243
|
+
throw new NotFoundError(PROVIDER);
|
|
244
|
+
if (!items.every(isRecord)) {
|
|
245
|
+
throw new SchemaError(PROVIDER, 'Swiss Post returned an invalid shipment response');
|
|
246
|
+
}
|
|
247
|
+
const requested = comparableShipmentNumber(trackingNumber);
|
|
248
|
+
const identified = items.filter((candidate) => comparableShipmentNumber(candidate.shipmentNumber));
|
|
249
|
+
if (identified.length === 0) {
|
|
250
|
+
throw new SchemaError(PROVIDER, 'Swiss Post did not return a shipment identifier');
|
|
251
|
+
}
|
|
252
|
+
const matches = identified.filter((candidate) => comparableShipmentNumber(candidate.shipmentNumber) === requested
|
|
253
|
+
|| comparableShipmentNumber(candidate.internationalBarcode) === requested);
|
|
254
|
+
if (matches.length === 0)
|
|
255
|
+
throw new SchemaError(PROVIDER, 'Swiss Post returned a different shipment');
|
|
256
|
+
if (matches.length !== 1)
|
|
257
|
+
throw new SchemaError(PROVIDER, 'Swiss Post returned an ambiguous shipment');
|
|
258
|
+
const item = matches[0];
|
|
259
|
+
const identity = text(item.identity);
|
|
260
|
+
let events = [];
|
|
261
|
+
if (identity) {
|
|
262
|
+
try {
|
|
263
|
+
const payload = await this.readJson(fetcher, `${API_BASE}/shipment/id/${encodeURIComponent(identity)}/events`, { headers });
|
|
264
|
+
if (Array.isArray(payload))
|
|
265
|
+
events = payload;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// A shipment summary is still useful when the optional event call fails.
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const translations = events.length > 0 ? await this.loadTranslations(fetcher) : {};
|
|
272
|
+
return parseSwissPostShipment(item, events, translations);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
export const adapter = (environment) => {
|
|
276
|
+
const tracker = new SwissPostTracker({ fetcher: environment.fetcher });
|
|
277
|
+
return {
|
|
278
|
+
id: 'swiss-post',
|
|
279
|
+
steps: ['direct'],
|
|
280
|
+
track: (input) => tracker.fetch(input.number),
|
|
281
|
+
};
|
|
282
|
+
};
|