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,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "gofo",
|
|
3
|
+
"displayName": "GOFO Express",
|
|
4
|
+
"aliases": [],
|
|
5
|
+
"region": {
|
|
6
|
+
"countries": [
|
|
7
|
+
"US"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
"brand": {
|
|
11
|
+
"color": "#fc4c02"
|
|
12
|
+
},
|
|
13
|
+
"selectable": true,
|
|
14
|
+
"timezone": "UTC",
|
|
15
|
+
"tracking": {
|
|
16
|
+
"mode": "automatic",
|
|
17
|
+
"adapter": "gofo",
|
|
18
|
+
"steps": [
|
|
19
|
+
"direct"
|
|
20
|
+
],
|
|
21
|
+
"localClocks": true
|
|
22
|
+
},
|
|
23
|
+
"capabilities": [
|
|
24
|
+
"history",
|
|
25
|
+
"location",
|
|
26
|
+
"delivered_at"
|
|
27
|
+
],
|
|
28
|
+
"portal": {
|
|
29
|
+
"url": "https://www.gofo.com/us/track?searchID={trackingNumber}",
|
|
30
|
+
"canaryUrl": "https://www.gofo.com/us/track",
|
|
31
|
+
"shows": [
|
|
32
|
+
"status",
|
|
33
|
+
"history",
|
|
34
|
+
"location",
|
|
35
|
+
"delivered_at",
|
|
36
|
+
"eta"
|
|
37
|
+
],
|
|
38
|
+
"scraped": [
|
|
39
|
+
"status",
|
|
40
|
+
"history",
|
|
41
|
+
"location",
|
|
42
|
+
"delivered_at"
|
|
43
|
+
],
|
|
44
|
+
"discarded": [
|
|
45
|
+
"delivery_detail",
|
|
46
|
+
"proof_images",
|
|
47
|
+
"coordinates",
|
|
48
|
+
"departments",
|
|
49
|
+
"unlabelled_weight",
|
|
50
|
+
"eta"
|
|
51
|
+
],
|
|
52
|
+
"unavailable": []
|
|
53
|
+
},
|
|
54
|
+
"links": [
|
|
55
|
+
{
|
|
56
|
+
"domains": [
|
|
57
|
+
"gofoexpress.com"
|
|
58
|
+
],
|
|
59
|
+
"params": [
|
|
60
|
+
"searchID"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"domains": [
|
|
65
|
+
"gofo.com"
|
|
66
|
+
],
|
|
67
|
+
"path": "^/us/track/?$",
|
|
68
|
+
"params": [
|
|
69
|
+
"searchID"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"detection": [
|
|
74
|
+
{
|
|
75
|
+
"id": "gofo-1",
|
|
76
|
+
"pattern": "^GFUS\\d{14}$",
|
|
77
|
+
"confidence": "high"
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "gofo",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "GFUS01011884214272",
|
|
6
|
+
"role": "shipment",
|
|
7
|
+
"evidence": "open_source_example",
|
|
8
|
+
"source": {
|
|
9
|
+
"url": "https://github.com/jkeen/tracking_number_data/blob/main/couriers/gofo.json"
|
|
10
|
+
},
|
|
11
|
+
"expect": {
|
|
12
|
+
"carrier": "gofo",
|
|
13
|
+
"confidence": "high"
|
|
14
|
+
},
|
|
15
|
+
"note": "Open-source project example, not a real shipment."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"number": "GFUS01011884214464",
|
|
19
|
+
"role": "shipment",
|
|
20
|
+
"evidence": "open_source_example",
|
|
21
|
+
"source": {
|
|
22
|
+
"url": "https://github.com/jkeen/tracking_number_data/blob/main/couriers/gofo.json"
|
|
23
|
+
},
|
|
24
|
+
"expect": {
|
|
25
|
+
"carrier": "gofo",
|
|
26
|
+
"confidence": "high"
|
|
27
|
+
},
|
|
28
|
+
"note": "Open-source project example, not a real shipment."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"number": "GFUS01066030373313",
|
|
32
|
+
"role": "shipment",
|
|
33
|
+
"evidence": "public_shipment_report",
|
|
34
|
+
"source": {
|
|
35
|
+
"url": "https://www.trustpilot.com/reviews/6a9585f1402196fa26d71560",
|
|
36
|
+
"date": "2026-08-31"
|
|
37
|
+
},
|
|
38
|
+
"expect": {
|
|
39
|
+
"carrier": "gofo",
|
|
40
|
+
"confidence": "high"
|
|
41
|
+
},
|
|
42
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"number": "GFUS01068091652674",
|
|
46
|
+
"role": "shipment",
|
|
47
|
+
"evidence": "public_shipment_report",
|
|
48
|
+
"source": {
|
|
49
|
+
"url": "https://www.courtlistener.com/docket/74763247/1/tikbooks-inc-v-chriss-sports-llc/",
|
|
50
|
+
"date": "2026-09-09"
|
|
51
|
+
},
|
|
52
|
+
"expect": {
|
|
53
|
+
"carrier": "gofo",
|
|
54
|
+
"confidence": "high"
|
|
55
|
+
},
|
|
56
|
+
"note": "Tracking number in a public court complaint that does not name the carrier; the GFUS prefix is GOFO's."
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
/** The clock the adapter requests: GOFO prints Pacific clocks with their real offset. */
|
|
3
|
+
export declare const GOFO_CLOCK_ZONE = "America/Los_Angeles";
|
|
4
|
+
export declare function normalizeGofoNumber(raw: string): string;
|
|
5
|
+
export declare function parseGofo(payload: unknown, rawNumber: string): CarrierResult;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { DateTime, IANAZone } from 'luxon';
|
|
2
|
+
import { normalizeTrackingNumber } from '../../core/detection/index.js';
|
|
3
|
+
import { IndeterminateError, NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
4
|
+
import { explicitOffsetTime } from '../../core/time/index.js';
|
|
5
|
+
import { clean } from '../../core/transport/index.js';
|
|
6
|
+
import { isRecord } from '../../core/types.js';
|
|
7
|
+
import { gofoStatus } from './status.js';
|
|
8
|
+
const LABEL_CREATED = '100';
|
|
9
|
+
/** The clock the adapter requests: GOFO prints Pacific clocks with their real offset. */
|
|
10
|
+
export const GOFO_CLOCK_ZONE = 'America/Los_Angeles';
|
|
11
|
+
// GOFO appends its support phone and email to some scans, in English or
|
|
12
|
+
// Spanish; the public page removes that line before display.
|
|
13
|
+
const CONTACT = String.raw `(?:\+?\(?\d[\d ().-]*\d|[\w.+-]+@[\w-]+(?:\.[\w-]+)+)`;
|
|
14
|
+
const SUPPORT_LINE = new RegExp(String.raw `\s*(?:For delivery issues (?:&|and) tracking support, contact GOFO at|Para problemas de entrega y soporte de seguimiento, comun[ií]quese con GOFO al) ${CONTACT}(?:,? (?:or|and|o|y) ${CONTACT})*\.?$`, 'iu');
|
|
15
|
+
export function normalizeGofoNumber(raw) {
|
|
16
|
+
const number = normalizeTrackingNumber(raw);
|
|
17
|
+
if (!/^GFUS\d{14}$/.test(number))
|
|
18
|
+
throw new TypeError('GOFO US requires a GFUS parcel reference');
|
|
19
|
+
return number;
|
|
20
|
+
}
|
|
21
|
+
function scanClock(value, scanZone) {
|
|
22
|
+
const raw = clean(value, 64);
|
|
23
|
+
const match = /^(\d{4}-\d{2}-\d{2}T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d{1,3})?)(Z|[+-](?:0\d|1[0-4]):?[0-5]\d)?$/.exec(raw);
|
|
24
|
+
if (!match) {
|
|
25
|
+
// Offset-looking values must not exploit a permissive ISO parser.
|
|
26
|
+
if (raw.includes('T') && /(?:Z|[+-][\d:]+)$/i.test(raw))
|
|
27
|
+
throw new SchemaError('GOFO', 'GOFO returned an invalid scan timestamp');
|
|
28
|
+
return raw ? { provider_time_text: raw } : {};
|
|
29
|
+
}
|
|
30
|
+
const local = DateTime.fromISO(match[1], { zone: 'UTC' });
|
|
31
|
+
if (!local.isValid)
|
|
32
|
+
throw new SchemaError('GOFO', 'GOFO returned an invalid scan date');
|
|
33
|
+
if (!match[2])
|
|
34
|
+
return { local_time: local.toISO({ includeOffset: false, suppressMilliseconds: true }) };
|
|
35
|
+
const offset = match[2].replace(':', '');
|
|
36
|
+
if (offset !== 'Z' && Number(offset.slice(1, 3)) * 60 + Number(offset.slice(3)) > 840)
|
|
37
|
+
throw new SchemaError('GOFO', 'GOFO returned an invalid scan offset');
|
|
38
|
+
const time = explicitOffsetTime(raw);
|
|
39
|
+
if (!time)
|
|
40
|
+
throw new SchemaError('GOFO', 'GOFO returned an invalid scan timestamp');
|
|
41
|
+
// GOFO's "Local Time" setting pairs each scan's local clock with Pacific's
|
|
42
|
+
// offset. A requested Pacific clock must carry Pacific's offset at that time;
|
|
43
|
+
// the instant is then expressed in the scan's own zone when it has a valid one.
|
|
44
|
+
const instant = DateTime.fromMillis(time.timestamp, { zone: GOFO_CLOCK_ZONE });
|
|
45
|
+
if (instant.toFormat("yyyy-MM-dd'T'HH:mm:ss") !== match[1].slice(0, 19))
|
|
46
|
+
throw new SchemaError('GOFO', 'GOFO returned a clock outside Pacific time');
|
|
47
|
+
const zone = clean(scanZone, 64);
|
|
48
|
+
return { time: (IANAZone.isValidZone(zone) ? instant.setZone(zone) : instant).toISO({ suppressMilliseconds: true }) };
|
|
49
|
+
}
|
|
50
|
+
/** Scan wording without a trailing support line; a scan worded only by that line keeps it. */
|
|
51
|
+
function scanText(value) {
|
|
52
|
+
const text = clean(value, 1_000);
|
|
53
|
+
return (text.replace(SUPPORT_LINE, '') || text).slice(0, 500);
|
|
54
|
+
}
|
|
55
|
+
export function parseGofo(payload, rawNumber) {
|
|
56
|
+
const number = normalizeGofoNumber(rawNumber);
|
|
57
|
+
if (!isRecord(payload))
|
|
58
|
+
throw new SchemaError('GOFO');
|
|
59
|
+
if (payload.code !== 200 || payload.success !== 1)
|
|
60
|
+
throw new IndeterminateError('GOFO', 'GOFO returned an inconclusive lookup');
|
|
61
|
+
if (!isRecord(payload.data) || !Array.isArray(payload.data.success) || payload.data.success.length > 25
|
|
62
|
+
|| !payload.data.success.every(isRecord) || !isRecord(payload.data.error))
|
|
63
|
+
throw new SchemaError('GOFO');
|
|
64
|
+
const entries = payload.data.success;
|
|
65
|
+
const error = payload.data.error;
|
|
66
|
+
if (!entries.length && error.errorCount === 1 && Array.isArray(error.us) && error.us.length === 1 && error.us[0] === number
|
|
67
|
+
&& Object.keys(error).every(key => ['errorCount', 'us'].includes(key)))
|
|
68
|
+
throw new NotFoundError('GOFO');
|
|
69
|
+
if (!entries.length)
|
|
70
|
+
throw new IndeterminateError('GOFO', 'GOFO returned no matching history');
|
|
71
|
+
// The GFUS number is the waybill. The tracking number repeats it or is the
|
|
72
|
+
// shipper's own reference, which must not name another GOFO parcel.
|
|
73
|
+
const reference = entries[0].trackingNumber;
|
|
74
|
+
const ownReference = reference === number || (typeof reference === 'string' && clean(reference, 100) !== ''
|
|
75
|
+
&& !/^GFUS\d{14}$/.test(normalizeTrackingNumber(reference)));
|
|
76
|
+
if (entries.length !== 1 || entries[0].waybillNo !== number || !ownReference || error.errorCount !== 0) {
|
|
77
|
+
throw new SchemaError('GOFO', 'GOFO returned a different or ambiguous parcel');
|
|
78
|
+
}
|
|
79
|
+
const item = entries[0];
|
|
80
|
+
if (!Array.isArray(item.trackEventList) || item.trackEventList.length > 500 || !item.trackEventList.every(isRecord))
|
|
81
|
+
throw new SchemaError('GOFO');
|
|
82
|
+
if (!item.trackEventList.length)
|
|
83
|
+
throw new IndeterminateError('GOFO', 'GOFO returned no parcel scans');
|
|
84
|
+
// The public client renders this entire list without paging and ignores the
|
|
85
|
+
// counter, which can also count scans the list omits. A larger counter is
|
|
86
|
+
// accepted only while the list still reaches label creation; the summary
|
|
87
|
+
// check below binds its newest end.
|
|
88
|
+
if (!Number.isInteger(item.trackEventCount) || Number(item.trackEventCount) < item.trackEventList.length
|
|
89
|
+
|| Number(item.trackEventCount) > 500) {
|
|
90
|
+
throw new IndeterminateError('GOFO', 'GOFO returned an inconsistent parcel event count');
|
|
91
|
+
}
|
|
92
|
+
if (Number(item.trackEventCount) > item.trackEventList.length && clean(item.trackEventList.at(-1).processCode, 32) !== LABEL_CREATED) {
|
|
93
|
+
throw new IndeterminateError('GOFO', 'GOFO returned incomplete parcel history');
|
|
94
|
+
}
|
|
95
|
+
const first = item.trackEventList[0];
|
|
96
|
+
const summary = item.lastTrackEvent;
|
|
97
|
+
if (!isRecord(summary) || ['processDate', 'processCode', 'processContent', 'processCity', 'processProvince', 'processLocation', 'processDeptId', 'processSecondCode', 'processTimeZone', 'processTimeZoneMapping'].some(key => summary[key] !== first[key])) {
|
|
98
|
+
throw new IndeterminateError('GOFO', 'GOFO latest summary does not match its first scan');
|
|
99
|
+
}
|
|
100
|
+
const events = [];
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
for (const row of item.trackEventList) {
|
|
103
|
+
const code = clean(row.processCode, 32);
|
|
104
|
+
const rawDescription = scanText(row.processContent);
|
|
105
|
+
if (!code || !rawDescription)
|
|
106
|
+
throw new SchemaError('GOFO', 'GOFO returned an incomplete scan');
|
|
107
|
+
const mapped = gofoStatus(code);
|
|
108
|
+
if (mapped?.stage === 'delivered' && !/^Delivered(?:,|$)/.test(rawDescription))
|
|
109
|
+
throw new IndeterminateError('GOFO', 'GOFO returned inconsistent delivery evidence');
|
|
110
|
+
if ((row.waybillNo != null && row.waybillNo !== number) || (row.trackingNumber != null && row.trackingNumber !== reference)) {
|
|
111
|
+
throw new SchemaError('GOFO', 'GOFO returned a scan for a different parcel');
|
|
112
|
+
}
|
|
113
|
+
const timestamp = scanClock(row.processDate, row.processTimeZone);
|
|
114
|
+
const location = [clean(row.processCity, 100), clean(row.processProvince, 20)].filter(Boolean).join(', ');
|
|
115
|
+
const description = mapped?.stage === 'delivered' ? 'Delivered' : rawDescription;
|
|
116
|
+
const event = { ...timestamp, description, provider_code: code,
|
|
117
|
+
...(location ? { location } : {}), ...(mapped ? { stage: mapped.stage } : {}) };
|
|
118
|
+
const key = JSON.stringify(event);
|
|
119
|
+
if (!seen.has(key)) {
|
|
120
|
+
seen.add(key);
|
|
121
|
+
events.push(event);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const latest = events[0];
|
|
125
|
+
const current = gofoStatus(String(latest.provider_code));
|
|
126
|
+
return { status: current?.status ?? 'unknown', ...(current ? { current_stage: current.stage } : {}),
|
|
127
|
+
last_status_text: latest.description, last_update: latest.time ?? null, last_update_local: latest.local_time ?? null,
|
|
128
|
+
expected_delivery: null,
|
|
129
|
+
...(current?.stage === 'delivered' && latest.time ? { delivered_at: latest.time } : {}),
|
|
130
|
+
...(item.toCountry === 'USA' ? { destination_country: 'US' } : {}), events: events.slice(0, 100) };
|
|
131
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const CODES = new Map([
|
|
2
|
+
['100', { status: 'pending', stage: 'registered' }],
|
|
3
|
+
...['200', '201', '202', '203'].map(code => [code, { status: 'in_transit', stage: 'in_transit' }]),
|
|
4
|
+
['208', { status: 'out_for_delivery', stage: 'out_for_delivery' }],
|
|
5
|
+
['205', { status: 'delivered', stage: 'delivered' }],
|
|
6
|
+
]);
|
|
7
|
+
export function gofoStatus(code) { return CODES.get(code); }
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "gofo",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"code": "100",
|
|
6
|
+
"wording": "Shipping Label Created",
|
|
7
|
+
"language": "en",
|
|
8
|
+
"stage": "registered",
|
|
9
|
+
"confirmedBy": "live"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"code": "202",
|
|
13
|
+
"wording": "Arrived at GOFO Regional Hub",
|
|
14
|
+
"language": "en",
|
|
15
|
+
"stage": "in_transit",
|
|
16
|
+
"confirmedBy": "live"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"code": "200",
|
|
20
|
+
"wording": "Departed GOFO Regional Hub",
|
|
21
|
+
"language": "en",
|
|
22
|
+
"stage": "in_transit",
|
|
23
|
+
"confirmedBy": "live"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"code": "201",
|
|
27
|
+
"wording": "Arrived at GOFO Delivery Station",
|
|
28
|
+
"language": "en",
|
|
29
|
+
"stage": "in_transit",
|
|
30
|
+
"confirmedBy": "live"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"code": "203",
|
|
34
|
+
"wording": "Departed GOFO Delivery Station",
|
|
35
|
+
"language": "en",
|
|
36
|
+
"stage": "in_transit",
|
|
37
|
+
"confirmedBy": "live"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"code": "208",
|
|
41
|
+
"wording": "Out for Delivery",
|
|
42
|
+
"language": "en",
|
|
43
|
+
"stage": "out_for_delivery",
|
|
44
|
+
"confirmedBy": "live"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"code": "205",
|
|
48
|
+
"wording": "Delivered",
|
|
49
|
+
"language": "en",
|
|
50
|
+
"stage": "delivered",
|
|
51
|
+
"confirmedBy": "live"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { AdapterFactory } from '../../core/adapter/index.js';
|
|
2
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
3
|
+
interface HeppnerCredential {
|
|
4
|
+
trackingNumber: string;
|
|
5
|
+
postcode: string;
|
|
6
|
+
countryCode: 'CH' | 'FR';
|
|
7
|
+
}
|
|
8
|
+
export declare function normalizeHeppnerTrackingNumber(raw: string): string;
|
|
9
|
+
export declare function normalizeHeppnerCredential(rawTrackingNumber: string, rawPostcode: string): HeppnerCredential;
|
|
10
|
+
export declare function heppnerSearchUrl(rawTrackingNumber: string, rawPostcode: string): string;
|
|
11
|
+
export declare function parseHeppnerCapability(rawCapability: string, rawTrackingNumber: string, rawPostcode: string): string;
|
|
12
|
+
export declare function heppnerDetailUrl(capability: string): string;
|
|
13
|
+
export declare function heppnerTrackingPageUrl(capability: string): string;
|
|
14
|
+
export declare function parseHeppnerTrackingResponse(payload: unknown, rawTrackingNumber: string): CarrierResult;
|
|
15
|
+
export interface HeppnerTrackerOptions {
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
/** Test seam; production uses the global fetch. */
|
|
18
|
+
fetcher?: typeof fetch;
|
|
19
|
+
}
|
|
20
|
+
export declare class HeppnerTracker {
|
|
21
|
+
readonly timeoutMs: number;
|
|
22
|
+
readonly fetcher?: typeof fetch;
|
|
23
|
+
constructor(options?: HeppnerTrackerOptions);
|
|
24
|
+
fetch(rawTrackingNumber: string, rawPostcode: string): Promise<CarrierResult>;
|
|
25
|
+
}
|
|
26
|
+
export declare const adapter: AdapterFactory;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heppner recipient tracking.
|
|
3
|
+
*
|
|
4
|
+
* The public recipient page asks for a shipment receipt number plus the
|
|
5
|
+
* delivery postcode, and the portal answers in two hops: a search call that
|
|
6
|
+
* returns a base64 capability binding both values, then a detail call that
|
|
7
|
+
* returns the shipment with its scan list. The capability is verified against
|
|
8
|
+
* the credential we sent before it is used, so a portal that answered for a
|
|
9
|
+
* different shipment cannot redirect the lookup.
|
|
10
|
+
*
|
|
11
|
+
* Privacy: the detail payload also carries shipment parties, references,
|
|
12
|
+
* merchandise descriptions, appointment tokens and depot addresses. `parse()`
|
|
13
|
+
* builds events from an explicit allowlist (time, our own description, stage,
|
|
14
|
+
* event code) and keeps no location at all, because the only location field
|
|
15
|
+
* the endpoint offers is the delivery address.
|
|
16
|
+
*/
|
|
17
|
+
import { Buffer } from 'node:buffer';
|
|
18
|
+
import { DateTime } from 'luxon';
|
|
19
|
+
import { InputRequiredError, NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
20
|
+
import { cleanScalar, decodeText, fetchBounded, parseJsonBytes, UpstreamHttpError, } from '../../core/transport/index.js';
|
|
21
|
+
import { isRecord } from '../../core/types.js';
|
|
22
|
+
import { classifyHeppnerEvent, heppnerCode } from './status.js';
|
|
23
|
+
const SEARCH_ENDPOINT = 'https://myportal.heppner-group.com/api/recipient/search/expedition';
|
|
24
|
+
const DETAIL_ENDPOINT = 'https://myportal.heppner-group.com/api/recipient/search/detailexpedition';
|
|
25
|
+
const TRACKING_PAGE = 'https://myportal.heppner-group.com/tracking';
|
|
26
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
27
|
+
const MAX_RESPONSE_BYTES = 1_000_000;
|
|
28
|
+
const MAX_EVENTS_TO_INSPECT = 500;
|
|
29
|
+
const MAX_EVENTS_TO_RETURN = 100;
|
|
30
|
+
/**
|
|
31
|
+
* Kept local rather than taken from core/time: the portal always stamps an
|
|
32
|
+
* offset, and this adapter normalizes every scan to UTC instead of preserving
|
|
33
|
+
* the source offset, which `explicitOffsetTime` does.
|
|
34
|
+
*/
|
|
35
|
+
function eventTime(value) {
|
|
36
|
+
const raw = cleanScalar(value, 64);
|
|
37
|
+
if (!raw)
|
|
38
|
+
return null;
|
|
39
|
+
const parsed = DateTime.fromISO(raw, { setZone: true });
|
|
40
|
+
const iso = parsed.toUTC().toISO({ suppressMilliseconds: true });
|
|
41
|
+
return parsed.isValid && iso ? { iso, timestamp: parsed.toMillis() } : null;
|
|
42
|
+
}
|
|
43
|
+
export function normalizeHeppnerTrackingNumber(raw) {
|
|
44
|
+
const trackingNumber = raw.replace(/\s/g, '');
|
|
45
|
+
if (!/^\d{8}$/.test(trackingNumber)) {
|
|
46
|
+
throw new TypeError('Heppner tracking numbers must contain exactly 8 digits');
|
|
47
|
+
}
|
|
48
|
+
return trackingNumber;
|
|
49
|
+
}
|
|
50
|
+
export function normalizeHeppnerCredential(rawTrackingNumber, rawPostcode) {
|
|
51
|
+
const trackingNumber = normalizeHeppnerTrackingNumber(rawTrackingNumber);
|
|
52
|
+
const postcode = rawPostcode.trim();
|
|
53
|
+
if (!/^\d{4,5}$/.test(postcode)) {
|
|
54
|
+
throw new TypeError('Heppner requires a four-digit Swiss or five-digit French delivery postcode');
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
trackingNumber,
|
|
58
|
+
postcode,
|
|
59
|
+
countryCode: postcode.length === 4 ? 'CH' : 'FR',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function heppnerSearchUrl(rawTrackingNumber, rawPostcode) {
|
|
63
|
+
const credential = normalizeHeppnerCredential(rawTrackingNumber, rawPostcode);
|
|
64
|
+
const url = new URL(SEARCH_ENDPOINT);
|
|
65
|
+
url.search = new URLSearchParams({
|
|
66
|
+
zipCode: credential.postcode,
|
|
67
|
+
receipt: credential.trackingNumber,
|
|
68
|
+
countryCode: credential.countryCode,
|
|
69
|
+
}).toString();
|
|
70
|
+
return url.toString();
|
|
71
|
+
}
|
|
72
|
+
function expectedCapabilityValue(credential) {
|
|
73
|
+
return `${credential.trackingNumber}&${credential.postcode}&${credential.countryCode}`;
|
|
74
|
+
}
|
|
75
|
+
export function parseHeppnerCapability(rawCapability, rawTrackingNumber, rawPostcode) {
|
|
76
|
+
const credential = normalizeHeppnerCredential(rawTrackingNumber, rawPostcode);
|
|
77
|
+
const capability = cleanScalar(rawCapability, 512);
|
|
78
|
+
if (!capability
|
|
79
|
+
|| !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(capability)) {
|
|
80
|
+
throw new SchemaError('Heppner', 'Heppner returned an invalid tracking capability');
|
|
81
|
+
}
|
|
82
|
+
let decoded = '';
|
|
83
|
+
try {
|
|
84
|
+
decoded = Buffer.from(capability, 'base64').toString('utf8');
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw new SchemaError('Heppner', 'Heppner returned an invalid tracking capability', { cause: error });
|
|
88
|
+
}
|
|
89
|
+
if (decoded !== expectedCapabilityValue(credential)) {
|
|
90
|
+
throw new SchemaError('Heppner', 'Heppner returned a capability for a different shipment');
|
|
91
|
+
}
|
|
92
|
+
return capability;
|
|
93
|
+
}
|
|
94
|
+
export function heppnerDetailUrl(capability) {
|
|
95
|
+
const normalized = cleanScalar(capability, 512);
|
|
96
|
+
if (!normalized || !/^[A-Za-z0-9+/]+={0,2}$/.test(normalized)) {
|
|
97
|
+
throw new SchemaError('Heppner', 'Heppner tracking capability is invalid');
|
|
98
|
+
}
|
|
99
|
+
const url = new URL(DETAIL_ENDPOINT);
|
|
100
|
+
url.searchParams.set('expedition', normalized);
|
|
101
|
+
return url.toString();
|
|
102
|
+
}
|
|
103
|
+
export function heppnerTrackingPageUrl(capability) {
|
|
104
|
+
const normalized = cleanScalar(capability, 512);
|
|
105
|
+
if (!normalized || !/^[A-Za-z0-9+/]+={0,2}$/.test(normalized)) {
|
|
106
|
+
throw new SchemaError('Heppner', 'Heppner tracking capability is invalid');
|
|
107
|
+
}
|
|
108
|
+
return `${TRACKING_PAGE}/${encodeURIComponent(normalized)}`;
|
|
109
|
+
}
|
|
110
|
+
function responseReceipt(value) {
|
|
111
|
+
const normalized = cleanScalar(value, 32);
|
|
112
|
+
return /^\d{8}$/.test(normalized) ? normalized : '';
|
|
113
|
+
}
|
|
114
|
+
function rawEvents(shipment) {
|
|
115
|
+
return Array.isArray(shipment.events) ? shipment.events.filter(isRecord) : [];
|
|
116
|
+
}
|
|
117
|
+
function parseEvents(shipment) {
|
|
118
|
+
const parsedEvents = [];
|
|
119
|
+
const seen = new Set();
|
|
120
|
+
rawEvents(shipment).slice(0, MAX_EVENTS_TO_INSPECT).forEach((rawEvent, index) => {
|
|
121
|
+
const providerCode = heppnerCode(rawEvent.code) || heppnerCode(rawEvent.event);
|
|
122
|
+
const time = eventTime(rawEvent.event_date) ?? eventTime(rawEvent.date);
|
|
123
|
+
if (!time)
|
|
124
|
+
return;
|
|
125
|
+
const classified = classifyHeppnerEvent(rawEvent.step, rawEvent.state, providerCode);
|
|
126
|
+
const identity = `${time.iso}\u0000${providerCode}\u0000${classified.stage}`;
|
|
127
|
+
if (seen.has(identity))
|
|
128
|
+
return;
|
|
129
|
+
seen.add(identity);
|
|
130
|
+
parsedEvents.push({
|
|
131
|
+
event: {
|
|
132
|
+
time: time.iso,
|
|
133
|
+
location: '',
|
|
134
|
+
description: classified.description,
|
|
135
|
+
stage: classified.stage,
|
|
136
|
+
...(providerCode ? { provider_code: providerCode } : {}),
|
|
137
|
+
},
|
|
138
|
+
status: classified.status,
|
|
139
|
+
timestamp: time.timestamp,
|
|
140
|
+
index,
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
parsedEvents.sort((left, right) => right.timestamp - left.timestamp || left.index - right.index);
|
|
144
|
+
return parsedEvents.slice(0, MAX_EVENTS_TO_RETURN);
|
|
145
|
+
}
|
|
146
|
+
export function parseHeppnerTrackingResponse(payload, rawTrackingNumber) {
|
|
147
|
+
const trackingNumber = normalizeHeppnerTrackingNumber(rawTrackingNumber);
|
|
148
|
+
if (!Array.isArray(payload)) {
|
|
149
|
+
throw new SchemaError('Heppner', 'Heppner returned an invalid tracking response');
|
|
150
|
+
}
|
|
151
|
+
if (payload.length === 0)
|
|
152
|
+
throw new NotFoundError('Heppner');
|
|
153
|
+
const shipments = payload.filter(isRecord);
|
|
154
|
+
if (shipments.length !== payload.length) {
|
|
155
|
+
throw new SchemaError('Heppner', 'Heppner returned an invalid shipment entry');
|
|
156
|
+
}
|
|
157
|
+
const matching = shipments.find((shipment) => responseReceipt(shipment.receipt) === trackingNumber);
|
|
158
|
+
if (!matching) {
|
|
159
|
+
const hasIdentifier = shipments.some((shipment) => responseReceipt(shipment.receipt));
|
|
160
|
+
if (hasIdentifier)
|
|
161
|
+
throw new SchemaError('Heppner', 'Heppner returned a different shipment');
|
|
162
|
+
throw new SchemaError('Heppner', 'Heppner did not return a shipment identifier');
|
|
163
|
+
}
|
|
164
|
+
const parsed = parseEvents(matching);
|
|
165
|
+
if (parsed.length === 0)
|
|
166
|
+
throw new SchemaError('Heppner', 'Heppner did not return tracking history');
|
|
167
|
+
const latest = parsed[0];
|
|
168
|
+
const latestKnown = parsed.find((item) => item.status !== 'unknown');
|
|
169
|
+
return {
|
|
170
|
+
status: latest.status !== 'unknown' ? latest.status : latestKnown?.status ?? 'unknown',
|
|
171
|
+
current_stage: latest.status !== 'unknown'
|
|
172
|
+
? latest.event.stage ?? 'in_transit'
|
|
173
|
+
: latestKnown?.event.stage ?? 'in_transit',
|
|
174
|
+
last_status_text: latest.event.description ?? 'Tracking information received',
|
|
175
|
+
last_update: latest.event.time ?? null,
|
|
176
|
+
expected_delivery: null,
|
|
177
|
+
timezone: 'Europe/Paris',
|
|
178
|
+
events: parsed.map(({ event }) => event),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function requestHeaders(accept, origin = 'https://www.heppner-group.com') {
|
|
182
|
+
return {
|
|
183
|
+
Accept: accept,
|
|
184
|
+
'Accept-Language': 'fr-FR,fr;q=0.9',
|
|
185
|
+
Origin: origin,
|
|
186
|
+
Referer: 'https://www.heppner-group.com/destinataire-suivez-votre-marchandise/',
|
|
187
|
+
'User-Agent': 'Mozilla/5.0 (compatible; DeliveryTracker/1.0)',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export class HeppnerTracker {
|
|
191
|
+
timeoutMs;
|
|
192
|
+
fetcher;
|
|
193
|
+
constructor(options = {}) {
|
|
194
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
195
|
+
this.fetcher = options.fetcher;
|
|
196
|
+
if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {
|
|
197
|
+
throw new TypeError('Heppner timeout must be positive');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async fetch(rawTrackingNumber, rawPostcode) {
|
|
201
|
+
const credential = normalizeHeppnerCredential(rawTrackingNumber, rawPostcode);
|
|
202
|
+
const search = await fetchBounded(heppnerSearchUrl(credential.trackingNumber, credential.postcode), { headers: requestHeaders('text/plain,*/*;q=0.8') }, {
|
|
203
|
+
provider: 'Heppner shipment search',
|
|
204
|
+
timeoutMs: this.timeoutMs,
|
|
205
|
+
maxBytes: 2_048,
|
|
206
|
+
fetcher: this.fetcher,
|
|
207
|
+
allowHttpError: true,
|
|
208
|
+
});
|
|
209
|
+
if (search.response.status === 404)
|
|
210
|
+
throw new NotFoundError('Heppner');
|
|
211
|
+
if (!search.response.ok) {
|
|
212
|
+
throw new UpstreamHttpError('Heppner shipment search', search.response.status);
|
|
213
|
+
}
|
|
214
|
+
const capability = parseHeppnerCapability(decodeText(search.bytes), credential.trackingNumber, credential.postcode);
|
|
215
|
+
const detail = await fetchBounded(heppnerDetailUrl(capability), {
|
|
216
|
+
headers: {
|
|
217
|
+
...requestHeaders('application/json', 'https://myportal.heppner-group.com'),
|
|
218
|
+
Referer: heppnerTrackingPageUrl(capability),
|
|
219
|
+
},
|
|
220
|
+
}, {
|
|
221
|
+
provider: 'Heppner tracking',
|
|
222
|
+
timeoutMs: this.timeoutMs,
|
|
223
|
+
maxBytes: MAX_RESPONSE_BYTES,
|
|
224
|
+
fetcher: this.fetcher,
|
|
225
|
+
allowHttpError: true,
|
|
226
|
+
});
|
|
227
|
+
if (detail.response.status === 404)
|
|
228
|
+
throw new NotFoundError('Heppner');
|
|
229
|
+
if (!detail.response.ok) {
|
|
230
|
+
throw new UpstreamHttpError('Heppner tracking', detail.response.status);
|
|
231
|
+
}
|
|
232
|
+
return parseHeppnerTrackingResponse(parseJsonBytes(detail.bytes, 'Heppner'), credential.trackingNumber);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export const adapter = (environment) => {
|
|
236
|
+
const tracker = new HeppnerTracker({ fetcher: environment.fetcher });
|
|
237
|
+
return {
|
|
238
|
+
id: 'heppner',
|
|
239
|
+
steps: ['direct'],
|
|
240
|
+
track: async (input) => {
|
|
241
|
+
const postcode = input.postcode?.trim() ?? '';
|
|
242
|
+
if (!postcode)
|
|
243
|
+
throw new InputRequiredError('Heppner', 'the delivery postcode');
|
|
244
|
+
return tracker.fetch(input.number, postcode);
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
};
|