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,148 @@
|
|
|
1
|
+
import { SchemaError } from '../../core/errors/index.js';
|
|
2
|
+
import { fetchBounded, parseJsonBytes } from '../../core/transport/index.js';
|
|
3
|
+
import { isRecord } from '../../core/types.js';
|
|
4
|
+
import { PlanzerSharedTracker } from './shared.js';
|
|
5
|
+
import { PLANZER_STATUS, planzerDescription, planzerEventStage } from './status.js';
|
|
6
|
+
const PROVIDER = 'Planzer';
|
|
7
|
+
const UPSTREAM = 'Planzer tracking';
|
|
8
|
+
const SHIPMENTS_URL = 'https://api.tracking.app.planzer.ch/api/v1/shipments';
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
10
|
+
const BASE_HEADERS = {
|
|
11
|
+
Accept: 'application/json, text/plain, */*',
|
|
12
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
13
|
+
'User-Agent': 'Mozilla/5.0 (compatible; SwissDeliveryTracker/1.0)',
|
|
14
|
+
};
|
|
15
|
+
function record(value) {
|
|
16
|
+
return isRecord(value) ? value : {};
|
|
17
|
+
}
|
|
18
|
+
function recordArray(value) {
|
|
19
|
+
return Array.isArray(value) ? value.filter(isRecord) : [];
|
|
20
|
+
}
|
|
21
|
+
function text(value) {
|
|
22
|
+
return typeof value === 'string' ? value : '';
|
|
23
|
+
}
|
|
24
|
+
function comparableIdentifier(value) {
|
|
25
|
+
return text(value).toLocaleUpperCase('en-US').replace(/[^A-Z0-9]/g, '');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The shipment number the API expects. Planzer prints `reference.shipment`
|
|
29
|
+
* composites (`87979.0061660090`); only the shipment half is looked up, without
|
|
30
|
+
* its leading zeros. The app stores numbers without dots, so a 5-digit
|
|
31
|
+
* reference followed by a zero-padded 10-digit shipment is split the same way.
|
|
32
|
+
*/
|
|
33
|
+
export function planzerShipmentNumber(trackingNumber) {
|
|
34
|
+
const raw = trackingNumber.includes('.')
|
|
35
|
+
? trackingNumber.split('.', 2)[1] ?? ''
|
|
36
|
+
: /^\d{5}(0\d{9})$/.exec(trackingNumber)?.[1];
|
|
37
|
+
if (raw === undefined)
|
|
38
|
+
return trackingNumber;
|
|
39
|
+
return raw.replace(/^0+/, '') || raw;
|
|
40
|
+
}
|
|
41
|
+
// The parcels of one shipment repeat each milestone seconds or minutes apart.
|
|
42
|
+
const SAME_MILESTONE_MS = 15 * 60_000;
|
|
43
|
+
function eventMillis(time) {
|
|
44
|
+
// Naive local timestamps with up to seven fractional digits; only differences matter.
|
|
45
|
+
return Date.parse(`${time.slice(0, 19)}Z`);
|
|
46
|
+
}
|
|
47
|
+
/** One row per milestone the parcels share, at its first occurrence. */
|
|
48
|
+
function mergeParcelMilestones(events) {
|
|
49
|
+
const kept = [];
|
|
50
|
+
for (const event of [...events].sort((left, right) => text(left.time).localeCompare(text(right.time)))) {
|
|
51
|
+
const at = eventMillis(text(event.time));
|
|
52
|
+
const repeated = kept.some((other) => other.description === event.description
|
|
53
|
+
&& Math.abs(eventMillis(text(other.time)) - at) <= SAME_MILESTONE_MS);
|
|
54
|
+
if (!repeated)
|
|
55
|
+
kept.push(event);
|
|
56
|
+
}
|
|
57
|
+
return kept;
|
|
58
|
+
}
|
|
59
|
+
/** Projects one `/shipments/{shipment}/Pak` payload. Pure: the offline tests target this. */
|
|
60
|
+
export function parsePlanzerTrackingResponse(value, shipmentNumber) {
|
|
61
|
+
const payload = record(value);
|
|
62
|
+
const overall = record(payload.overallStatus);
|
|
63
|
+
const statusText = text(record(overall.text).english);
|
|
64
|
+
if (!Array.isArray(payload.transportPositions)) {
|
|
65
|
+
throw new SchemaError(PROVIDER, 'Planzer returned an invalid shipment response');
|
|
66
|
+
}
|
|
67
|
+
const positions = recordArray(payload.transportPositions);
|
|
68
|
+
if (positions.length !== payload.transportPositions.length) {
|
|
69
|
+
throw new SchemaError(PROVIDER, 'Planzer returned an invalid transport position');
|
|
70
|
+
}
|
|
71
|
+
const requested = comparableIdentifier(shipmentNumber);
|
|
72
|
+
const identified = positions.filter((position) => comparableIdentifier(position.positionNumber));
|
|
73
|
+
if (identified.length === 0) {
|
|
74
|
+
throw new SchemaError(PROVIDER, 'Planzer did not return a shipment identifier');
|
|
75
|
+
}
|
|
76
|
+
const parcelPositions = identified.filter((position) => comparableIdentifier(position.positionNumber) === requested);
|
|
77
|
+
// Looked up by shipment number: every position belongs to the requested shipment.
|
|
78
|
+
const wholeShipment = parcelPositions.length === 0 && comparableIdentifier(payload.shipmentNumber) === requested;
|
|
79
|
+
const matchingPositions = wholeShipment ? identified : parcelPositions;
|
|
80
|
+
if (matchingPositions.length === 0) {
|
|
81
|
+
throw new SchemaError(PROVIDER, 'Planzer returned a different shipment');
|
|
82
|
+
}
|
|
83
|
+
let events = [];
|
|
84
|
+
for (const position of matchingPositions) {
|
|
85
|
+
for (const event of recordArray(position.positionEvents)) {
|
|
86
|
+
const description = text(record(event.text).english);
|
|
87
|
+
const stage = planzerEventStage(description);
|
|
88
|
+
if (!stage) {
|
|
89
|
+
// Surface schema changes through the existing sync error monitoring;
|
|
90
|
+
// never silently turn an unfamiliar historical event into a delivery.
|
|
91
|
+
throw new SchemaError('Planzer', 'Planzer returned an unrecognized tracking event status');
|
|
92
|
+
}
|
|
93
|
+
events.push({
|
|
94
|
+
time: text(event.createdAt),
|
|
95
|
+
location: '',
|
|
96
|
+
description: planzerDescription(description),
|
|
97
|
+
stage,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (matchingPositions.length > 1)
|
|
102
|
+
events = mergeParcelMilestones(events);
|
|
103
|
+
events.sort((left, right) => text(right.time).localeCompare(text(left.time)));
|
|
104
|
+
return {
|
|
105
|
+
status: PLANZER_STATUS.get(statusText) ?? (statusText ? 'in_transit' : 'unknown'),
|
|
106
|
+
last_status_text: planzerDescription(statusText),
|
|
107
|
+
last_update: events[0]?.time || null,
|
|
108
|
+
expected_delivery: text(record(payload.deliveryDay).date) || null,
|
|
109
|
+
events,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export class PlanzerTracker {
|
|
113
|
+
fetcher;
|
|
114
|
+
timeoutMs;
|
|
115
|
+
constructor(options = {}) {
|
|
116
|
+
this.fetcher = options.fetcher;
|
|
117
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
118
|
+
}
|
|
119
|
+
async fetch(trackingNumber) {
|
|
120
|
+
const shipmentNumber = planzerShipmentNumber(trackingNumber);
|
|
121
|
+
const { bytes } = await fetchBounded(`${SHIPMENTS_URL}/${encodeURIComponent(shipmentNumber)}/Pak`, { headers: BASE_HEADERS }, {
|
|
122
|
+
provider: UPSTREAM,
|
|
123
|
+
timeoutMs: this.timeoutMs,
|
|
124
|
+
// One replay after a transport failure, HTTP 502/503/504, or a 429
|
|
125
|
+
// with a short Retry-After; parsing and validation are never retried.
|
|
126
|
+
retryTransient: true,
|
|
127
|
+
fetcher: this.fetcher,
|
|
128
|
+
});
|
|
129
|
+
return parsePlanzerTrackingResponse(parseJsonBytes(bytes, UPSTREAM), shipmentNumber);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Kept for the host's legacy dispatch chain until it is deleted. */
|
|
133
|
+
export async function fetchPlanzer(trackingNumber) {
|
|
134
|
+
return new PlanzerTracker().fetch(trackingNumber);
|
|
135
|
+
}
|
|
136
|
+
export const adapter = (environment) => {
|
|
137
|
+
const tracker = new PlanzerTracker({ fetcher: environment.fetcher });
|
|
138
|
+
const shared = new PlanzerSharedTracker({ fetcher: environment.fetcher });
|
|
139
|
+
return {
|
|
140
|
+
id: 'planzer',
|
|
141
|
+
// Both routes are a single bounded request; the capability URL decides
|
|
142
|
+
// which one, not a fallback tier.
|
|
143
|
+
steps: ['direct'],
|
|
144
|
+
track: (input) => (input.trackingUrl
|
|
145
|
+
? shared.fetch(input.number, input.trackingUrl)
|
|
146
|
+
: tracker.fetch(input.number)),
|
|
147
|
+
};
|
|
148
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "planzer",
|
|
3
|
+
"displayName": "Planzer",
|
|
4
|
+
"aliases": [
|
|
5
|
+
"Planzer Group"
|
|
6
|
+
],
|
|
7
|
+
"region": {
|
|
8
|
+
"countries": [
|
|
9
|
+
"CH"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"brand": {
|
|
13
|
+
"color": "#e30613"
|
|
14
|
+
},
|
|
15
|
+
"selectable": true,
|
|
16
|
+
"timezone": "Europe/Zurich",
|
|
17
|
+
"tracking": {
|
|
18
|
+
"mode": "automatic",
|
|
19
|
+
"adapter": "planzer",
|
|
20
|
+
"upstreamName": "Planzer",
|
|
21
|
+
"requirements": [
|
|
22
|
+
{
|
|
23
|
+
"field": "trackingUrl",
|
|
24
|
+
"validator": "planzerSharedUrl",
|
|
25
|
+
"whenTrackingNumber": "^99990\\d{8}$",
|
|
26
|
+
"label": "Planzer tracking URL",
|
|
27
|
+
"type": "url",
|
|
28
|
+
"placeholder": "https://trackandtrace.planzergroup.com/shared/…",
|
|
29
|
+
"help": "Paste the complete shared link, including its accessKey."
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"steps": [
|
|
33
|
+
"direct"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"capabilities": [
|
|
37
|
+
"history",
|
|
38
|
+
"eta"
|
|
39
|
+
],
|
|
40
|
+
"portal": {
|
|
41
|
+
"url": "https://tracking.app.planzer.ch/delivery/info?deliveryNumber={trackingNumber}",
|
|
42
|
+
"canaryUrl": "https://tracking.app.planzer.ch/",
|
|
43
|
+
"shows": [
|
|
44
|
+
"status",
|
|
45
|
+
"history",
|
|
46
|
+
"eta"
|
|
47
|
+
],
|
|
48
|
+
"scraped": [
|
|
49
|
+
"status",
|
|
50
|
+
"history",
|
|
51
|
+
"eta"
|
|
52
|
+
],
|
|
53
|
+
"discarded": [],
|
|
54
|
+
"unavailable": []
|
|
55
|
+
},
|
|
56
|
+
"links": [
|
|
57
|
+
{
|
|
58
|
+
"domains": [
|
|
59
|
+
"trackandtrace.planzergroup.com"
|
|
60
|
+
],
|
|
61
|
+
"path": "/shared/sendungen/([^/?#]+)",
|
|
62
|
+
"keepsCapabilityUrl": true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"domains": [
|
|
66
|
+
"tracking.app.planzer.ch"
|
|
67
|
+
],
|
|
68
|
+
"params": [
|
|
69
|
+
"deliveryNumber"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"detection": [
|
|
74
|
+
{
|
|
75
|
+
"id": "planzer-1",
|
|
76
|
+
"pattern": "^99990\\d{8}$",
|
|
77
|
+
"confidence": "high"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "planzer-2",
|
|
81
|
+
"pattern": "^91346097\\d{12}$",
|
|
82
|
+
"confidence": "high"
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "planzer",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "11652.0059554609",
|
|
6
|
+
"role": "shipment",
|
|
7
|
+
"evidence": "public_shipment_report",
|
|
8
|
+
"source": {
|
|
9
|
+
"url": "https://www.trustpilot.com/reviews/6a1ad21200205c065a1b7aa8",
|
|
10
|
+
"date": "2026-05-30"
|
|
11
|
+
},
|
|
12
|
+
"expect": {
|
|
13
|
+
"carrier": "unknown",
|
|
14
|
+
"confidence": "low",
|
|
15
|
+
"candidates": [
|
|
16
|
+
"fedex",
|
|
17
|
+
"dpd-fr",
|
|
18
|
+
"yunda"
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. The source attributes it to Planzer, which no rule claims. Printed as reference.shipment."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"number": "12345678",
|
|
25
|
+
"role": "shipment",
|
|
26
|
+
"evidence": "open_source_example",
|
|
27
|
+
"source": {
|
|
28
|
+
"url": "https://github.com/ha-parcel-integrations/ha-planzer/blob/main/README.md"
|
|
29
|
+
},
|
|
30
|
+
"expect": {
|
|
31
|
+
"carrier": "unknown",
|
|
32
|
+
"confidence": "low",
|
|
33
|
+
"candidates": [
|
|
34
|
+
"mondial-relay",
|
|
35
|
+
"heppner"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"note": "Open-source project example, not a real shipment. The source attributes it to Planzer, which no rule claims."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"number": "61214174",
|
|
42
|
+
"role": "shipment",
|
|
43
|
+
"evidence": "public_shipment_report",
|
|
44
|
+
"source": {
|
|
45
|
+
"url": "https://www.trustpilot.com/reviews/6a45580211a8ca65d11c1072",
|
|
46
|
+
"date": "2026-07-01"
|
|
47
|
+
},
|
|
48
|
+
"expect": {
|
|
49
|
+
"carrier": "unknown",
|
|
50
|
+
"confidence": "low",
|
|
51
|
+
"candidates": [
|
|
52
|
+
"mondial-relay",
|
|
53
|
+
"heppner"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. The source attributes it to Planzer, which no rule claims. The 8-digit shipment number Planzer prints."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"number": "87979.0061660090",
|
|
60
|
+
"role": "shipment",
|
|
61
|
+
"evidence": "public_shipment_report",
|
|
62
|
+
"source": {
|
|
63
|
+
"url": "https://www.trustpilot.com/reviews/6a463a9fe1dee431b2338215",
|
|
64
|
+
"date": "2026-07-02"
|
|
65
|
+
},
|
|
66
|
+
"expect": {
|
|
67
|
+
"carrier": "unknown",
|
|
68
|
+
"confidence": "low",
|
|
69
|
+
"candidates": [
|
|
70
|
+
"fedex",
|
|
71
|
+
"yunda"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. The source attributes it to Planzer, which no rule claims. Printed as reference.shipment."
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"number": "91346097123456789012",
|
|
78
|
+
"role": "shipment",
|
|
79
|
+
"evidence": "synthetic",
|
|
80
|
+
"derivedFrom": "official_shape",
|
|
81
|
+
"shapeConfirmed": "2026-09-12",
|
|
82
|
+
"expect": {
|
|
83
|
+
"carrier": "planzer",
|
|
84
|
+
"confidence": "high"
|
|
85
|
+
},
|
|
86
|
+
"note": "Made-up number that follows the published format."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"number": "98765.0012345678",
|
|
90
|
+
"role": "shipment",
|
|
91
|
+
"evidence": "open_source_example",
|
|
92
|
+
"source": {
|
|
93
|
+
"url": "https://github.com/ha-parcel-integrations/ha-planzer/blob/main/README.md"
|
|
94
|
+
},
|
|
95
|
+
"expect": {
|
|
96
|
+
"carrier": "unknown",
|
|
97
|
+
"confidence": "low",
|
|
98
|
+
"candidates": [
|
|
99
|
+
"fedex",
|
|
100
|
+
"yunda"
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"note": "Open-source project example, not a real shipment. The source attributes it to Planzer, which no rule claims."
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"number": "999.90.03316119",
|
|
107
|
+
"role": "shipment",
|
|
108
|
+
"evidence": "synthetic",
|
|
109
|
+
"derivedFrom": "official_shape",
|
|
110
|
+
"shapeConfirmed": "2026-09-12",
|
|
111
|
+
"expect": {
|
|
112
|
+
"carrier": "planzer",
|
|
113
|
+
"confidence": "high"
|
|
114
|
+
},
|
|
115
|
+
"note": "Made-up number that follows the published format."
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { validatePlanzerSharedUrl } from '../../core/catalog/urls.js';
|
|
2
|
+
import { isPlanzerSharedTrackingNumber, normalizeTrackingNumber } from '../../core/detection/index.js';
|
|
3
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
4
|
+
export { isPlanzerSharedTrackingNumber, normalizeTrackingNumber };
|
|
5
|
+
/**
|
|
6
|
+
* Accepts only a complete, https Planzer shared link for this very shipment,
|
|
7
|
+
* with exactly one well-formed access key. Returns the canonical URL to fetch.
|
|
8
|
+
*/
|
|
9
|
+
/** Projects one shared route page. Pure: the offline tests target this. */
|
|
10
|
+
export declare function parsePlanzerTrackingHtml(html: string, trackingNumber: string): CarrierResult;
|
|
11
|
+
export declare class PlanzerSharedTracker {
|
|
12
|
+
private readonly fetcher;
|
|
13
|
+
readonly timeoutMs: number;
|
|
14
|
+
constructor(options?: {
|
|
15
|
+
fetcher?: typeof fetch;
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
});
|
|
18
|
+
fetch(trackingNumber: string, trackingUrl: string): Promise<CarrierResult>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { validatePlanzerSharedUrl } from '../../core/catalog/urls.js';
|
|
2
|
+
export { validatePlanzerSharedUrl } from '../../core/catalog/urls.js';
|
|
3
|
+
/**
|
|
4
|
+
* Planzer shared shipments.
|
|
5
|
+
*
|
|
6
|
+
* A `999.90.########` shipment is not in the tracking API. Planzer publishes
|
|
7
|
+
* it as a capability link — `trackandtrace.planzergroup.com/shared/sendungen/
|
|
8
|
+
* {number}?accessKey=…` — which renders the five-step route page. The access
|
|
9
|
+
* key is part of the tracking credential and is validated before the lookup.
|
|
10
|
+
*
|
|
11
|
+
* The page carries no status code, so the route steps are read from the
|
|
12
|
+
* markup: their tooltip labels name the stage, `text-primary` marks the ones
|
|
13
|
+
* already reached, and the `<time datetime>` next to each carries its
|
|
14
|
+
* timestamp.
|
|
15
|
+
*/
|
|
16
|
+
import { load } from 'cheerio';
|
|
17
|
+
import { NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
18
|
+
import { isPlanzerSharedTrackingNumber, normalizeTrackingNumber } from '../../core/detection/index.js';
|
|
19
|
+
import { decodeText, fetchBounded } from '../../core/transport/index.js';
|
|
20
|
+
import { PLANZER_ROUTE_STAGES, PLANZER_ROUTE_STATUS, planzerRouteStage, } from './status.js';
|
|
21
|
+
export { isPlanzerSharedTrackingNumber, normalizeTrackingNumber };
|
|
22
|
+
const PROVIDER = 'Planzer';
|
|
23
|
+
const UPSTREAM = 'Planzer shared tracking';
|
|
24
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
25
|
+
const EVENT_DESCRIPTIONS = {
|
|
26
|
+
registered: 'Shipment registered by Planzer',
|
|
27
|
+
accepted: 'Shipment accepted from the sender',
|
|
28
|
+
in_transit: 'Shipment at the transfer depot',
|
|
29
|
+
out_for_delivery: 'Out for delivery',
|
|
30
|
+
delivered: 'Delivered',
|
|
31
|
+
};
|
|
32
|
+
const NOT_FOUND_MESSAGES = new Set([
|
|
33
|
+
'keine sendungen gefunden.',
|
|
34
|
+
'aucun envoi trouve.',
|
|
35
|
+
'nessuna spedizione trovata.',
|
|
36
|
+
'no shipments found.',
|
|
37
|
+
]);
|
|
38
|
+
/**
|
|
39
|
+
* Accepts only a complete, https Planzer shared link for this very shipment,
|
|
40
|
+
* with exactly one well-formed access key. Returns the canonical URL to fetch.
|
|
41
|
+
*/
|
|
42
|
+
/** Projects one shared route page. Pure: the offline tests target this. */
|
|
43
|
+
export function parsePlanzerTrackingHtml(html, trackingNumber) {
|
|
44
|
+
const $ = load(html);
|
|
45
|
+
const notice = $('p.lead').first().text().trim()
|
|
46
|
+
.toLocaleLowerCase()
|
|
47
|
+
.normalize('NFKD')
|
|
48
|
+
.replace(/\p{M}/gu, '');
|
|
49
|
+
const timestamps = $('time[datetime]').toArray()
|
|
50
|
+
.map((element) => ($(element).attr('datetime') ?? '').trim())
|
|
51
|
+
.filter(Boolean);
|
|
52
|
+
const steps = [];
|
|
53
|
+
$('div.text-center').each((_, element) => {
|
|
54
|
+
const container = $(element);
|
|
55
|
+
const target = container.find('span.tooltip-target').first();
|
|
56
|
+
if (target.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const label = (target.attr('data-original-title') ?? target.attr('title') ?? '').trim();
|
|
59
|
+
if (!label)
|
|
60
|
+
return;
|
|
61
|
+
steps.push({
|
|
62
|
+
label,
|
|
63
|
+
reached: target.hasClass('text-primary'),
|
|
64
|
+
timestamp: (container.find('time[datetime]').first().attr('datetime') ?? '').trim(),
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
const seen = new Set();
|
|
68
|
+
const uniqueSteps = steps.filter((step) => {
|
|
69
|
+
const key = step.label.toLocaleLowerCase();
|
|
70
|
+
if (seen.has(key))
|
|
71
|
+
return false;
|
|
72
|
+
seen.add(key);
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
if (uniqueSteps.length < PLANZER_ROUTE_STAGES.length) {
|
|
76
|
+
// A short page is only "unknown shipment" when Planzer says so; anything
|
|
77
|
+
// else (maintenance, a partial render) must stay an error.
|
|
78
|
+
if (NOT_FOUND_MESSAGES.has(notice))
|
|
79
|
+
throw new NotFoundError(PROVIDER);
|
|
80
|
+
throw new SchemaError(PROVIDER, 'Planzer returned an invalid tracking page');
|
|
81
|
+
}
|
|
82
|
+
const events = [];
|
|
83
|
+
let currentStage = null;
|
|
84
|
+
let currentLabel = '';
|
|
85
|
+
uniqueSteps.slice(0, PLANZER_ROUTE_STAGES.length).forEach((step, index) => {
|
|
86
|
+
const stage = planzerRouteStage(step.label) ?? PLANZER_ROUTE_STAGES[index];
|
|
87
|
+
if (!step.reached)
|
|
88
|
+
return;
|
|
89
|
+
currentStage = stage;
|
|
90
|
+
currentLabel = step.label || EVENT_DESCRIPTIONS[stage];
|
|
91
|
+
events.push({
|
|
92
|
+
time: step.timestamp,
|
|
93
|
+
location: '',
|
|
94
|
+
// The rendered label is the recipient's language; the retained
|
|
95
|
+
// description is our own neutral wording for the stage.
|
|
96
|
+
description: EVENT_DESCRIPTIONS[stage],
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
if (!currentStage) {
|
|
100
|
+
throw new SchemaError(PROVIDER, 'Planzer returned a shipment without a current stage');
|
|
101
|
+
}
|
|
102
|
+
const dates = [...new Set(timestamps.filter((timestamp) => /^\d{4}-\d{2}-\d{2}/.test(timestamp))
|
|
103
|
+
.map((timestamp) => timestamp.slice(0, 10)))].sort();
|
|
104
|
+
return {
|
|
105
|
+
status: PLANZER_ROUTE_STATUS[currentStage],
|
|
106
|
+
last_status_text: currentLabel,
|
|
107
|
+
last_update: events.at(-1)?.time || null,
|
|
108
|
+
expected_delivery: dates.at(-1) ?? null,
|
|
109
|
+
events: events.reverse(),
|
|
110
|
+
tracking_number: normalizeTrackingNumber(trackingNumber),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export class PlanzerSharedTracker {
|
|
114
|
+
fetcher;
|
|
115
|
+
timeoutMs;
|
|
116
|
+
constructor(options = {}) {
|
|
117
|
+
this.fetcher = options.fetcher;
|
|
118
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
119
|
+
}
|
|
120
|
+
async fetch(trackingNumber, trackingUrl) {
|
|
121
|
+
const url = validatePlanzerSharedUrl(trackingUrl, trackingNumber);
|
|
122
|
+
const { bytes } = await fetchBounded(url, {
|
|
123
|
+
headers: {
|
|
124
|
+
Accept: 'text/html,application/xhtml+xml',
|
|
125
|
+
'Accept-Language': 'de-CH,de;q=0.9,en;q=0.8',
|
|
126
|
+
'User-Agent': 'SwissDeliveryTracker/1.0',
|
|
127
|
+
},
|
|
128
|
+
}, {
|
|
129
|
+
provider: UPSTREAM,
|
|
130
|
+
timeoutMs: this.timeoutMs,
|
|
131
|
+
fetcher: this.fetcher,
|
|
132
|
+
});
|
|
133
|
+
return parsePlanzerTrackingHtml(decodeText(bytes), trackingNumber);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planzer (and Quickpac) status vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* Two routes, two vocabularies:
|
|
5
|
+
*
|
|
6
|
+
* - The tracking API returns an English label per shipment and per milestone
|
|
7
|
+
* (`overallStatus.text.english`, `positionEvents[].text.english`). Planzer's
|
|
8
|
+
* English "Shipped" means "Zugestellt" / "Livré" — delivered, not dispatched
|
|
9
|
+
* — so each milestone is classified on its own instead of inheriting the
|
|
10
|
+
* shipment's current status, and that label is stored as "Delivered".
|
|
11
|
+
* - The shared capability page renders a five-step route whose step labels are
|
|
12
|
+
* localized; `planzerRouteStage()` recognizes them by substring.
|
|
13
|
+
*
|
|
14
|
+
* An API label that is in neither map is an error rather than an unmapped
|
|
15
|
+
* event: the adapter refuses to turn unfamiliar wording into history.
|
|
16
|
+
*/
|
|
17
|
+
import type { CarrierStatus } from '../../core/result/index.js';
|
|
18
|
+
import type { Stage } from '../../core/status/index.js';
|
|
19
|
+
/** Shipment-level English labels from `overallStatus.text.english`. */
|
|
20
|
+
export declare const PLANZER_STATUS: Map<string, CarrierStatus>;
|
|
21
|
+
export declare const PLANZER_EVENT_STAGE: Map<string, "pending" | "registered" | "accepted" | "in_transit" | "out_for_delivery" | "delivered" | "customs" | "failed_attempt" | "ready_for_pickup" | "returned" | "exception">;
|
|
22
|
+
/** The wording stored and shown for one English API label. */
|
|
23
|
+
export declare function planzerDescription(label: string): string;
|
|
24
|
+
export declare const PLANZER_TRANSLATED_EVENT_STAGE: Map<string, "pending" | "registered" | "accepted" | "in_transit" | "out_for_delivery" | "delivered" | "customs" | "failed_attempt" | "ready_for_pickup" | "returned" | "exception">;
|
|
25
|
+
/** The milestone stage for one API label, or undefined when the label is unknown. */
|
|
26
|
+
export declare function planzerEventStage(description: string): Stage | undefined;
|
|
27
|
+
/** The five steps the shared capability page draws, in the order it draws them. */
|
|
28
|
+
export declare const PLANZER_ROUTE_STAGES: readonly ["registered", "accepted", "in_transit", "out_for_delivery", "delivered"];
|
|
29
|
+
export type PlanzerRouteStage = (typeof PLANZER_ROUTE_STAGES)[number];
|
|
30
|
+
/** The route stage a shared-page step label names, or null when it names none. */
|
|
31
|
+
export declare function planzerRouteStage(label: string): PlanzerRouteStage | null;
|
|
32
|
+
/** The shipment status a reached route stage implies. */
|
|
33
|
+
export declare const PLANZER_ROUTE_STATUS: Record<PlanzerRouteStage, CarrierStatus>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/** Shipment-level English labels from `overallStatus.text.english`. */
|
|
2
|
+
export const PLANZER_STATUS = new Map([
|
|
3
|
+
['Recorded', 'pending'],
|
|
4
|
+
['Transferred', 'in_transit'],
|
|
5
|
+
['Shipment on the way', 'in_transit'],
|
|
6
|
+
['In delivery', 'out_for_delivery'],
|
|
7
|
+
['Shipment out for delivery', 'out_for_delivery'],
|
|
8
|
+
['Delivered', 'delivered'],
|
|
9
|
+
['Shipment delivered', 'delivered'],
|
|
10
|
+
['Shipped', 'delivered'],
|
|
11
|
+
['Not delivered', 'exception'],
|
|
12
|
+
['Not delivered – A delivery card has been deposited', 'exception'],
|
|
13
|
+
['New delivery released', 'in_transit'],
|
|
14
|
+
]);
|
|
15
|
+
// Classify each milestone independently of the shipment's current status.
|
|
16
|
+
// Planzer's English "Shipped" means "Zugestellt" / "Livré", not dispatched.
|
|
17
|
+
export const PLANZER_EVENT_STAGE = new Map([
|
|
18
|
+
['Recorded', 'registered'],
|
|
19
|
+
['Transferred', 'in_transit'],
|
|
20
|
+
['Shipment on the way', 'in_transit'],
|
|
21
|
+
['In delivery', 'out_for_delivery'],
|
|
22
|
+
['Shipment out for delivery', 'out_for_delivery'],
|
|
23
|
+
['Delivered', 'delivered'],
|
|
24
|
+
['Shipment delivered', 'delivered'],
|
|
25
|
+
['Shipped', 'delivered'],
|
|
26
|
+
['Not delivered', 'failed_attempt'],
|
|
27
|
+
['Not delivered – A delivery card has been deposited', 'failed_attempt'],
|
|
28
|
+
// "Erneute Zustellung ausgelöst": a redelivery was booked after a failed attempt.
|
|
29
|
+
['New delivery released', 'in_transit'],
|
|
30
|
+
]);
|
|
31
|
+
// Planzer's English labels are translations of its German ones, and
|
|
32
|
+
// "Zugestellt" came out as "Shipped" (the same event reads "Livré" and
|
|
33
|
+
// "Consegnato", and the shipment summary says "Shipment delivered"). Such a
|
|
34
|
+
// label is classified as received but stored in the wording it means; every
|
|
35
|
+
// other label is kept verbatim. Event identities hash the stored wording, so
|
|
36
|
+
// changing an entry here needs a migration for the rows already saved.
|
|
37
|
+
const PLANZER_WORDING = new Map([
|
|
38
|
+
['Shipped', 'Delivered'],
|
|
39
|
+
]);
|
|
40
|
+
/** The wording stored and shown for one English API label. */
|
|
41
|
+
export function planzerDescription(label) {
|
|
42
|
+
return PLANZER_WORDING.get(label) ?? label;
|
|
43
|
+
}
|
|
44
|
+
// GENERATED localization aliases, kept separate from the observed English API
|
|
45
|
+
// labels above. Prefer a future observed label/code if it contradicts an alias.
|
|
46
|
+
// Livré/Zugestellt are semantic equivalents of Planzer's unusual Shipped label;
|
|
47
|
+
// Expédié/Versandt/Spedito are intentionally absent.
|
|
48
|
+
export const PLANZER_TRANSLATED_EVENT_STAGE = new Map([
|
|
49
|
+
['enregistré', 'registered'], ['erfasst', 'registered'], ['registrato', 'registered'],
|
|
50
|
+
['transféré', 'in_transit'], ['weitergeleitet', 'in_transit'], ['inoltrato', 'in_transit'],
|
|
51
|
+
['en cours de livraison', 'out_for_delivery'], ['in zustellung', 'out_for_delivery'], ['in consegna', 'out_for_delivery'],
|
|
52
|
+
['livré', 'delivered'], ['zugestellt', 'delivered'], ['consegnato', 'delivered'],
|
|
53
|
+
]);
|
|
54
|
+
/** The milestone stage for one API label, or undefined when the label is unknown. */
|
|
55
|
+
export function planzerEventStage(description) {
|
|
56
|
+
return PLANZER_EVENT_STAGE.get(description)
|
|
57
|
+
?? PLANZER_TRANSLATED_EVENT_STAGE.get(description.toLowerCase().replace(/[.!]$/, ''));
|
|
58
|
+
}
|
|
59
|
+
/** The five steps the shared capability page draws, in the order it draws them. */
|
|
60
|
+
export const PLANZER_ROUTE_STAGES = [
|
|
61
|
+
'registered',
|
|
62
|
+
'accepted',
|
|
63
|
+
'in_transit',
|
|
64
|
+
'out_for_delivery',
|
|
65
|
+
'delivered',
|
|
66
|
+
];
|
|
67
|
+
// The shared page labels its route steps in the recipient's language and
|
|
68
|
+
// renders no code, so each stage is recognized by the substrings the German,
|
|
69
|
+
// English, French and Italian labels have in common.
|
|
70
|
+
const ROUTE_LABEL_RULES = [
|
|
71
|
+
['delivered', ['ausgeliefert', 'delivered', 'livré', 'livrée', 'consegnat']],
|
|
72
|
+
['out_for_delivery', ['in auslieferung', 'out for delivery', 'en livraison', 'in consegna']],
|
|
73
|
+
['in_transit', ['umschlaglager', 'transfer depot', 'transshipment', 'plateforme', 'trasbordo']],
|
|
74
|
+
['accepted', ['abholung', 'collection', 'collecte', 'ritiro']],
|
|
75
|
+
['registered', ['erfasst', 'recorded', 'enregistr', 'registrat']],
|
|
76
|
+
];
|
|
77
|
+
/** The route stage a shared-page step label names, or null when it names none. */
|
|
78
|
+
export function planzerRouteStage(label) {
|
|
79
|
+
const value = label.toLocaleLowerCase();
|
|
80
|
+
return ROUTE_LABEL_RULES.find(([, needles]) => needles.some((needle) => value.includes(needle)))?.[0] ?? null;
|
|
81
|
+
}
|
|
82
|
+
/** The shipment status a reached route stage implies. */
|
|
83
|
+
export const PLANZER_ROUTE_STATUS = {
|
|
84
|
+
registered: 'pending',
|
|
85
|
+
accepted: 'in_transit',
|
|
86
|
+
in_transit: 'in_transit',
|
|
87
|
+
out_for_delivery: 'out_for_delivery',
|
|
88
|
+
delivered: 'delivered',
|
|
89
|
+
};
|