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,177 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "asendia",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "AHOY1X39DP45",
|
|
6
|
+
"role": "shipment",
|
|
7
|
+
"evidence": "public_shipment_report",
|
|
8
|
+
"source": {
|
|
9
|
+
"url": "https://www.ship24.com/couriers/asendia-tracking"
|
|
10
|
+
},
|
|
11
|
+
"expect": {
|
|
12
|
+
"carrier": "asendia",
|
|
13
|
+
"confidence": "high"
|
|
14
|
+
},
|
|
15
|
+
"note": "Published Pirate Ship export number carried by Asendia USA; A1 returned its delivered history on 2026-09-22."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"number": "AS010007869US",
|
|
19
|
+
"role": "shipment",
|
|
20
|
+
"evidence": "public_shipment_report",
|
|
21
|
+
"source": {
|
|
22
|
+
"url": "https://www.ship24.com/couriers/asendia-tracking"
|
|
23
|
+
},
|
|
24
|
+
"expect": {
|
|
25
|
+
"carrier": "asendia",
|
|
26
|
+
"confidence": "high"
|
|
27
|
+
},
|
|
28
|
+
"note": "Published Asendia USA example with an invalid S10 check digit; A1 had no data for it on 2026-09-22."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"number": "AS010501721US",
|
|
32
|
+
"role": "shipment",
|
|
33
|
+
"evidence": "public_shipment_report",
|
|
34
|
+
"source": {
|
|
35
|
+
"url": "https://www.ship24.com/couriers/asendia-tracking"
|
|
36
|
+
},
|
|
37
|
+
"expect": {
|
|
38
|
+
"carrier": "asendia",
|
|
39
|
+
"confidence": "high"
|
|
40
|
+
},
|
|
41
|
+
"note": "Published Asendia USA example; Asendia USA's A1 tracking returned its delivered history on 2026-09-22."
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"number": "ASE12345678",
|
|
45
|
+
"role": "shipment",
|
|
46
|
+
"evidence": "synthetic",
|
|
47
|
+
"derivedFrom": "official_shape",
|
|
48
|
+
"shapeConfirmed": "2026-09-12",
|
|
49
|
+
"expect": {
|
|
50
|
+
"carrier": "asendia",
|
|
51
|
+
"confidence": "high"
|
|
52
|
+
},
|
|
53
|
+
"note": "Made-up number that follows the published format."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"number": "ASHK12123456789011",
|
|
57
|
+
"role": "shipment",
|
|
58
|
+
"evidence": "official_documentation_example",
|
|
59
|
+
"source": {
|
|
60
|
+
"url": "https://a1api.asendiausa.com/swagger/index.html?urls.primaryName=Parcel+v1.0"
|
|
61
|
+
},
|
|
62
|
+
"expect": {
|
|
63
|
+
"carrier": "unknown",
|
|
64
|
+
"confidence": "none"
|
|
65
|
+
},
|
|
66
|
+
"note": "Example Asendia unique identifier (ashid) in Asendia USA's Parcel API reference, not a real shipment."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"number": "EEUS027373790JP0",
|
|
70
|
+
"role": "shipment",
|
|
71
|
+
"evidence": "public_shipment_report",
|
|
72
|
+
"source": {
|
|
73
|
+
"url": "https://www.ship24.com/couriers/asendia-tracking"
|
|
74
|
+
},
|
|
75
|
+
"expect": {
|
|
76
|
+
"carrier": "unknown",
|
|
77
|
+
"confidence": "none"
|
|
78
|
+
},
|
|
79
|
+
"note": "Published eBay International Shipping number attributed to Asendia; A1 had no data for it on 2026-09-22. On 2026-09-30 ParcelsApp filed its Asendia scans under EasyShip on local clocks, matching Ship24's instants and Swiss Post's own scan when read in each place's zone."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"number": "EEUS027988469JP0",
|
|
83
|
+
"role": "shipment",
|
|
84
|
+
"evidence": "public_shipment_report",
|
|
85
|
+
"source": {
|
|
86
|
+
"url": "https://www.ship24.com/couriers/asendia-tracking"
|
|
87
|
+
},
|
|
88
|
+
"expect": {
|
|
89
|
+
"carrier": "unknown",
|
|
90
|
+
"confidence": "none"
|
|
91
|
+
},
|
|
92
|
+
"note": "Published eBay International Shipping number carried by Asendia USA; A1 returned its delivered history on 2026-09-22."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"number": "LF079877211FR",
|
|
96
|
+
"role": "shipment",
|
|
97
|
+
"evidence": "merchant_published_example",
|
|
98
|
+
"source": {
|
|
99
|
+
"url": "https://marketplace.fnacdarty.com/s/article/Dois-je-obligatoirement-renseigner-un-num%C3%A9ro-de-suivi-tracking-pour-ma-commande?language=fr_BE"
|
|
100
|
+
},
|
|
101
|
+
"expect": {
|
|
102
|
+
"carrier": "la-poste",
|
|
103
|
+
"confidence": "high"
|
|
104
|
+
},
|
|
105
|
+
"note": "Published integration example, not a real shipment. The source attributes it to Asendia; detection selects La Poste / Colissimo."
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"number": "LS232735825CH",
|
|
109
|
+
"role": "shipment",
|
|
110
|
+
"evidence": "public_shipment_report",
|
|
111
|
+
"source": {
|
|
112
|
+
"url": "https://www.trustpilot.com/reviews/6a680c8b8a48f47256b888b9",
|
|
113
|
+
"date": "2026-07-28"
|
|
114
|
+
},
|
|
115
|
+
"expect": {
|
|
116
|
+
"carrier": "swiss-post",
|
|
117
|
+
"confidence": "high"
|
|
118
|
+
},
|
|
119
|
+
"note": "Publicly reported Asendia USA shipment returned from Germany through Switzerland; detection selects Swiss Post. On 2026-09-30 ParcelsApp listed its Asendia USA scans in both countries at the UTC instants A1 returned."
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"number": "LS244428589CH",
|
|
123
|
+
"role": "shipment",
|
|
124
|
+
"evidence": "public_shipment_report",
|
|
125
|
+
"source": {
|
|
126
|
+
"url": "https://www.trustpilot.com/reviews/6aa36fc3b355e35ecf1ef14e",
|
|
127
|
+
"date": "2026-09-11"
|
|
128
|
+
},
|
|
129
|
+
"expect": {
|
|
130
|
+
"carrier": "swiss-post",
|
|
131
|
+
"confidence": "high"
|
|
132
|
+
},
|
|
133
|
+
"note": "Publicly reported shipment sent from the USA through Asendia; detection selects Swiss Post. Asendia USA's A1 tracking returned its history on 2026-09-29."
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"number": "UX000352872CH",
|
|
137
|
+
"role": "shipment",
|
|
138
|
+
"evidence": "official_documentation_example",
|
|
139
|
+
"source": {
|
|
140
|
+
"url": "https://a1api.asendiausa.com/swagger/index.html?urls.primaryName=Parcel+v1.0"
|
|
141
|
+
},
|
|
142
|
+
"expect": {
|
|
143
|
+
"carrier": "swiss-post",
|
|
144
|
+
"confidence": "high"
|
|
145
|
+
},
|
|
146
|
+
"note": "Example value of the trackingNumber field in Asendia USA's Parcel API reference, not a real shipment; detection selects Swiss Post for this S10 shape."
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"number": "UX911572560FR",
|
|
150
|
+
"role": "shipment",
|
|
151
|
+
"evidence": "public_shipment_report",
|
|
152
|
+
"source": {
|
|
153
|
+
"url": "https://www.trustpilot.com/reviews/6a064349008e8e5d4cf776a3",
|
|
154
|
+
"date": "2026-05-14"
|
|
155
|
+
},
|
|
156
|
+
"expect": {
|
|
157
|
+
"carrier": "la-poste",
|
|
158
|
+
"confidence": "high"
|
|
159
|
+
},
|
|
160
|
+
"note": "Publicly reported Asendia USA shipment; detection selects La Poste / Colissimo. On 2026-09-30 ParcelsApp listed its Asendia USA scans at the UTC instants A1 returned."
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"number": "LN242142606US",
|
|
164
|
+
"role": "quarantined",
|
|
165
|
+
"evidence": "open_source_example",
|
|
166
|
+
"source": {
|
|
167
|
+
"url": "https://gist.github.com/zxp/e83a4a1b7294a5ed6207"
|
|
168
|
+
},
|
|
169
|
+
"quarantine": true,
|
|
170
|
+
"expect": {
|
|
171
|
+
"carrier": "intl-post",
|
|
172
|
+
"confidence": "high"
|
|
173
|
+
},
|
|
174
|
+
"note": "Open-source project example, not a real shipment. The source attributes it to Asendia; detection falls back to the generic postal rule."
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
export declare function normalizeAsendiaTrackingNumber(raw: string): string;
|
|
3
|
+
export declare function asendiaTrackingUrl(rawTrackingNumber: string): string;
|
|
4
|
+
export declare function asendiaTrackingApiUrl(): string;
|
|
5
|
+
export declare function asendiaConfigApiUrl(): string;
|
|
6
|
+
export declare function asendiaEnvironmentUrl(): string;
|
|
7
|
+
/**
|
|
8
|
+
* Read the public request-checksum key the portal publishes in its own
|
|
9
|
+
* environment script. It is a browser-visible value, not an account secret,
|
|
10
|
+
* and it rotates with a frontend deployment.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseAsendiaPublicHitKey(script: string): string;
|
|
13
|
+
export declare function asendiaHitToken(rawTrackingNumber: string, isoDate: string, publicHitKey: string): string;
|
|
14
|
+
export declare function parseAsendiaTrackingResponse(payload: unknown, rawTrackingNumber: string): CarrierResult;
|
|
15
|
+
export interface AsendiaTrackerOptions {
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
turnstileTokenProvider?: () => string | Promise<string>;
|
|
19
|
+
/** Test seam; production uses the global fetch. */
|
|
20
|
+
fetcher?: typeof fetch;
|
|
21
|
+
}
|
|
22
|
+
export declare class AsendiaTracker {
|
|
23
|
+
readonly timeoutMs: number;
|
|
24
|
+
readonly now: () => Date;
|
|
25
|
+
readonly turnstileTokenProvider: () => string | Promise<string>;
|
|
26
|
+
readonly fetcher?: typeof fetch;
|
|
27
|
+
constructor(options?: AsendiaTrackerOptions);
|
|
28
|
+
fetch(rawTrackingNumber: string): Promise<CarrierResult>;
|
|
29
|
+
private requestText;
|
|
30
|
+
private requestJson;
|
|
31
|
+
}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asendia global portal (track.asendia.com) protocol probe.
|
|
3
|
+
*
|
|
4
|
+
* Not on the sync path: the registered adapter (`adapter.ts`) reads Asendia
|
|
5
|
+
* USA's A1 platform. This module reproduces the global portal's public request
|
|
6
|
+
* protocol far enough to prove that its Cloudflare Turnstile gate still behaves
|
|
7
|
+
* the way we recorded, and it parses a response when one is obtained.
|
|
8
|
+
*
|
|
9
|
+
* Protocol provenance (inspected 2026-08-30, rechecked 2026-09-22):
|
|
10
|
+
* https://track.asendia.com/track
|
|
11
|
+
* https://track.asendia.com/_next/static/chunks/pages/track/%5B%5B...tracking_id%5D%5D-a4e56a18621e52da.js
|
|
12
|
+
* The official frontend loads a tenant config and a public daily checksum key,
|
|
13
|
+
* then POSTs to branded-parcel-search. `fe-tracking-configuration` sets
|
|
14
|
+
* `TRACKING.ENABLE_CAPTCHA`, and with it a fresh Cloudflare Turnstile token is
|
|
15
|
+
* a required body field; callers must obtain that token through an approved
|
|
16
|
+
* interactive browser flow and inject it into this module. The checksum hashes
|
|
17
|
+
* the comma-joined ids, which is the plain number for the single id sent here.
|
|
18
|
+
*
|
|
19
|
+
* Privacy: the parcel payload carries the order reference and the recipient's
|
|
20
|
+
* name, address and e-mail. `parseAsendiaTrackingResponse()` rebuilds every
|
|
21
|
+
* event from an explicit allowlist (time, harmonized wording, scanning
|
|
22
|
+
* location, harmonized code) and copies nothing else.
|
|
23
|
+
*/
|
|
24
|
+
import { createHash } from 'node:crypto';
|
|
25
|
+
import { load } from 'cheerio';
|
|
26
|
+
import { DateTime } from 'luxon';
|
|
27
|
+
import { ChallengeError, NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
28
|
+
import { isoTime, zonedTime } from '../../core/time/index.js';
|
|
29
|
+
import { cleanScalar, decodeText, fetchBounded, parseJsonBytes, UpstreamHttpError, } from '../../core/transport/index.js';
|
|
30
|
+
import { isRecord } from '../../core/types.js';
|
|
31
|
+
import { classifyAsendiaStatus } from './status.js';
|
|
32
|
+
const TRACKING_ORIGIN = 'https://track.asendia.com';
|
|
33
|
+
const TRACKING_PAGE = `${TRACKING_ORIGIN}/track`;
|
|
34
|
+
const TRACKING_API = `${TRACKING_ORIGIN}/api/1.0/branded-url/branded-parcel-search`;
|
|
35
|
+
const CONFIG_API = `${TRACKING_ORIGIN}/api/1.0/branded-url/get-config-data/track.asendia.com`;
|
|
36
|
+
const ENVIRONMENT_SCRIPT = `${TRACKING_ORIGIN}/__env.js`;
|
|
37
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
38
|
+
const MAX_RESPONSE_BYTES = 1_000_000;
|
|
39
|
+
const MAX_EVENTS_TO_INSPECT = 500;
|
|
40
|
+
const MAX_EVENTS_TO_RETURN = 100;
|
|
41
|
+
const ZONE = 'Europe/Zurich';
|
|
42
|
+
const EVENT_TIME_FORMATS = [
|
|
43
|
+
'dd/MM/yyyy HH:mm:ss',
|
|
44
|
+
'dd/MM/yyyy HH:mm',
|
|
45
|
+
'yyyy-MM-dd HH:mm:ss',
|
|
46
|
+
'yyyy-MM-dd HH:mm',
|
|
47
|
+
'dd/MM/yyyy',
|
|
48
|
+
'yyyy-MM-dd',
|
|
49
|
+
];
|
|
50
|
+
/**
|
|
51
|
+
* Strip markup from a short provider string. Kept local rather than using
|
|
52
|
+
* `textFromHtml`: the portal embeds entity-encoded wording that Cheerio decodes
|
|
53
|
+
* fully, where the regex helper would leave numeric entities behind.
|
|
54
|
+
*/
|
|
55
|
+
function plainText(value, maxLength = 500) {
|
|
56
|
+
const raw = cleanScalar(value, Math.max(5_000, maxLength * 10));
|
|
57
|
+
return raw ? cleanScalar(load(raw).text(), maxLength) : '';
|
|
58
|
+
}
|
|
59
|
+
export function normalizeAsendiaTrackingNumber(raw) {
|
|
60
|
+
const value = raw.toLocaleUpperCase('en-US').replace(/[\s-]/g, '');
|
|
61
|
+
if (!/^[A-Z0-9]{8,40}$/.test(value) || !/\d/.test(value)) {
|
|
62
|
+
throw new TypeError('Asendia tracking numbers must contain 8 to 40 ASCII letters and digits');
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
export function asendiaTrackingUrl(rawTrackingNumber) {
|
|
67
|
+
return `${TRACKING_PAGE}/${encodeURIComponent(normalizeAsendiaTrackingNumber(rawTrackingNumber))}`;
|
|
68
|
+
}
|
|
69
|
+
export function asendiaTrackingApiUrl() {
|
|
70
|
+
const url = new URL(TRACKING_API);
|
|
71
|
+
url.searchParams.set('sort', 'shipment_date');
|
|
72
|
+
return url.toString();
|
|
73
|
+
}
|
|
74
|
+
export function asendiaConfigApiUrl() {
|
|
75
|
+
return CONFIG_API;
|
|
76
|
+
}
|
|
77
|
+
export function asendiaEnvironmentUrl() {
|
|
78
|
+
return ENVIRONMENT_SCRIPT;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Read the public request-checksum key the portal publishes in its own
|
|
82
|
+
* environment script. It is a browser-visible value, not an account secret,
|
|
83
|
+
* and it rotates with a frontend deployment.
|
|
84
|
+
*/
|
|
85
|
+
export function parseAsendiaPublicHitKey(script) {
|
|
86
|
+
const match = /window\.__ENV\s*=\s*(\{[^;]*\})\s*;?/.exec(script);
|
|
87
|
+
if (!match)
|
|
88
|
+
throw new SchemaError('Asendia', 'Asendia returned an invalid public environment script');
|
|
89
|
+
let payload;
|
|
90
|
+
try {
|
|
91
|
+
payload = JSON.parse(match[1]);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
throw new SchemaError('Asendia', 'Asendia returned an invalid public environment script', { cause: error });
|
|
95
|
+
}
|
|
96
|
+
const key = isRecord(payload) ? cleanScalar(payload.NEXT_PUBLIC_BRANDED_HIT_KEY, 128) : '';
|
|
97
|
+
if (!/^[a-f0-9]{64}$/i.test(key)) {
|
|
98
|
+
throw new SchemaError('Asendia', 'Asendia did not publish a valid request checksum key');
|
|
99
|
+
}
|
|
100
|
+
return key.toLocaleLowerCase('en-US');
|
|
101
|
+
}
|
|
102
|
+
export function asendiaHitToken(rawTrackingNumber, isoDate, publicHitKey) {
|
|
103
|
+
const trackingNumber = normalizeAsendiaTrackingNumber(rawTrackingNumber);
|
|
104
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(isoDate) || !DateTime.fromISO(isoDate).isValid) {
|
|
105
|
+
throw new TypeError('Asendia request dates must use YYYY-MM-DD');
|
|
106
|
+
}
|
|
107
|
+
if (!/^[a-f0-9]{64}$/i.test(publicHitKey)) {
|
|
108
|
+
throw new TypeError('Asendia request checksum keys must contain 64 hexadecimal characters');
|
|
109
|
+
}
|
|
110
|
+
return createHash('sha256')
|
|
111
|
+
.update(`${trackingNumber}${isoDate}${publicHitKey.toLocaleLowerCase('en-US')}`)
|
|
112
|
+
.digest('hex');
|
|
113
|
+
}
|
|
114
|
+
function records(value) {
|
|
115
|
+
return Array.isArray(value) ? value.filter(isRecord) : [];
|
|
116
|
+
}
|
|
117
|
+
function parseTenantConfig(payload) {
|
|
118
|
+
if (!isRecord(payload) || !isRecord(payload.data)) {
|
|
119
|
+
throw new SchemaError('Asendia', 'Asendia returned an invalid tracking configuration');
|
|
120
|
+
}
|
|
121
|
+
const data = payload.data;
|
|
122
|
+
const id = typeof data.id === 'number' || typeof data.id === 'string' ? data.id : '';
|
|
123
|
+
const subsidiary = cleanScalar(data.subsidiary_name, 128);
|
|
124
|
+
const subsidiaryId = typeof data.subsidiary === 'number' || typeof data.subsidiary === 'string'
|
|
125
|
+
? data.subsidiary
|
|
126
|
+
: '';
|
|
127
|
+
const brands = records(data.brand_id)
|
|
128
|
+
.map((brand) => cleanScalar(brand.customer_id, 128))
|
|
129
|
+
.filter(Boolean);
|
|
130
|
+
if (id === '' || !subsidiary || subsidiaryId === '' || brands.length === 0) {
|
|
131
|
+
throw new SchemaError('Asendia', 'Asendia returned an incomplete tracking configuration');
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
id,
|
|
135
|
+
subsidiary,
|
|
136
|
+
subsidiaryId,
|
|
137
|
+
brandId: brands.includes('*') ? '*' : brands,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function responseIdentifier(parcel) {
|
|
141
|
+
for (const value of [parcel.tracking_id, parcel.upper_tracking_id]) {
|
|
142
|
+
try {
|
|
143
|
+
return normalizeAsendiaTrackingNumber(cleanScalar(value, 64));
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Try the alternate provider field.
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return '';
|
|
150
|
+
}
|
|
151
|
+
function selectParcel(payload, rawTrackingNumber) {
|
|
152
|
+
const trackingNumber = normalizeAsendiaTrackingNumber(rawTrackingNumber);
|
|
153
|
+
if (!isRecord(payload))
|
|
154
|
+
throw new SchemaError('Asendia', 'Asendia returned an invalid tracking response');
|
|
155
|
+
const parcels = records(payload.data);
|
|
156
|
+
if (parcels.length === 0)
|
|
157
|
+
throw new NotFoundError('Asendia');
|
|
158
|
+
const matches = parcels.filter((parcel) => responseIdentifier(parcel) === trackingNumber);
|
|
159
|
+
if (matches.length === 1)
|
|
160
|
+
return matches[0];
|
|
161
|
+
if (matches.length > 1)
|
|
162
|
+
throw new SchemaError('Asendia', 'Asendia returned an ambiguous shipment');
|
|
163
|
+
throw new SchemaError('Asendia', 'Asendia returned a different shipment');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Scan stamps arrive either as ISO strings (with or without an offset) or in
|
|
167
|
+
* one of the portal's display formats. Offset-less values are read in the
|
|
168
|
+
* portal's own zone rather than guessed as UTC.
|
|
169
|
+
*/
|
|
170
|
+
function parseEventTime(value) {
|
|
171
|
+
const iso = isoTime(value, ZONE, 64);
|
|
172
|
+
if (iso)
|
|
173
|
+
return iso;
|
|
174
|
+
for (const format of EVENT_TIME_FORMATS) {
|
|
175
|
+
const parsed = zonedTime(value, format, ZONE, { maxLength: 64 });
|
|
176
|
+
if (parsed)
|
|
177
|
+
return parsed;
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
function safeEventCode(value) {
|
|
182
|
+
const code = cleanScalar(value, 32).toLocaleUpperCase('en-US');
|
|
183
|
+
return /^[A-Z0-9._-]{1,32}$/.test(code) ? code : '';
|
|
184
|
+
}
|
|
185
|
+
function parseEvents(parcel) {
|
|
186
|
+
const parsed = [];
|
|
187
|
+
const seen = new Set();
|
|
188
|
+
records(parcel.events).slice(0, MAX_EVENTS_TO_INSPECT).forEach((raw, sourceIndex) => {
|
|
189
|
+
const time = parseEventTime(raw.eventDateTime ?? raw.event_datetime ?? raw.datetime);
|
|
190
|
+
const description = plainText(raw.harmonizedEvent)
|
|
191
|
+
|| plainText(raw.harmonized_event)
|
|
192
|
+
|| plainText(raw.eventDesc)
|
|
193
|
+
|| plainText(raw.description);
|
|
194
|
+
if (!time || !description)
|
|
195
|
+
return;
|
|
196
|
+
const location = plainText(raw.scanningLocation ?? raw.scanning_location, 200);
|
|
197
|
+
const code = safeEventCode(raw.harmonizedCode ?? raw.eventId ?? raw.event_id);
|
|
198
|
+
const identity = JSON.stringify([time.iso, location, description, code]);
|
|
199
|
+
if (seen.has(identity))
|
|
200
|
+
return;
|
|
201
|
+
seen.add(identity);
|
|
202
|
+
const classified = classifyAsendiaStatus(description);
|
|
203
|
+
parsed.push({
|
|
204
|
+
sourceIndex,
|
|
205
|
+
timestamp: time.timestamp,
|
|
206
|
+
status: classified.status,
|
|
207
|
+
event: {
|
|
208
|
+
time: time.iso,
|
|
209
|
+
location,
|
|
210
|
+
description,
|
|
211
|
+
stage: classified.stage,
|
|
212
|
+
...(code ? { provider_code: code } : {}),
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
parsed.sort((left, right) => (right.timestamp - left.timestamp || left.sourceIndex - right.sourceIndex));
|
|
217
|
+
return parsed.slice(0, MAX_EVENTS_TO_RETURN);
|
|
218
|
+
}
|
|
219
|
+
function expectedDelivery(parcel) {
|
|
220
|
+
for (const value of [parcel.estimated_delivery_date, parcel.delivery_date]) {
|
|
221
|
+
const raw = cleanScalar(value, 64);
|
|
222
|
+
if (!raw)
|
|
223
|
+
continue;
|
|
224
|
+
let parsed = DateTime.fromISO(raw, { zone: ZONE });
|
|
225
|
+
if (!parsed.isValid)
|
|
226
|
+
parsed = DateTime.fromFormat(raw, 'dd/MM/yyyy', { zone: ZONE });
|
|
227
|
+
if (parsed.isValid)
|
|
228
|
+
return parsed.toISODate();
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
export function parseAsendiaTrackingResponse(payload, rawTrackingNumber) {
|
|
233
|
+
const parcel = selectParcel(payload, rawTrackingNumber);
|
|
234
|
+
const parsedEvents = parseEvents(parcel);
|
|
235
|
+
const events = parsedEvents.map(({ event }) => event);
|
|
236
|
+
const currentText = plainText(parcel.status)
|
|
237
|
+
|| plainText(parcel.parcel_progress)
|
|
238
|
+
|| events[0]?.description
|
|
239
|
+
|| 'Tracking information received';
|
|
240
|
+
const current = classifyAsendiaStatus(currentText);
|
|
241
|
+
const latestKnown = parsedEvents.find((event) => event.status !== 'unknown');
|
|
242
|
+
const status = current.status !== 'unknown'
|
|
243
|
+
? current.status
|
|
244
|
+
: latestKnown?.status ?? 'unknown';
|
|
245
|
+
return {
|
|
246
|
+
status,
|
|
247
|
+
last_status_text: events[0]?.description ?? currentText,
|
|
248
|
+
last_update: events[0]?.time ?? null,
|
|
249
|
+
expected_delivery: ['delivered', 'exception'].includes(status)
|
|
250
|
+
? null
|
|
251
|
+
: expectedDelivery(parcel),
|
|
252
|
+
timezone: ZONE,
|
|
253
|
+
events,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function challengeToken(value) {
|
|
257
|
+
const token = cleanScalar(value, 4_096);
|
|
258
|
+
if (!/^[A-Za-z0-9._-]{20,4096}$/.test(token)) {
|
|
259
|
+
throw new ChallengeError('Asendia', 'Asendia requires a fresh Cloudflare Turnstile token');
|
|
260
|
+
}
|
|
261
|
+
return token;
|
|
262
|
+
}
|
|
263
|
+
function baseHeaders() {
|
|
264
|
+
return {
|
|
265
|
+
Accept: 'application/json',
|
|
266
|
+
'Accept-Language': 'en',
|
|
267
|
+
'Content-Type': 'application/json',
|
|
268
|
+
'x-tenant-id': 'track.asendia.com',
|
|
269
|
+
'X-Language': 'en',
|
|
270
|
+
'X-Timezone': ZONE,
|
|
271
|
+
Origin: TRACKING_ORIGIN,
|
|
272
|
+
Referer: `${TRACKING_PAGE}/`,
|
|
273
|
+
'User-Agent': 'Mozilla/5.0 (compatible; DeliveryTracker/1.0)',
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
export class AsendiaTracker {
|
|
277
|
+
timeoutMs;
|
|
278
|
+
now;
|
|
279
|
+
turnstileTokenProvider;
|
|
280
|
+
fetcher;
|
|
281
|
+
constructor(options = {}) {
|
|
282
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
283
|
+
this.now = options.now ?? (() => new Date());
|
|
284
|
+
this.fetcher = options.fetcher;
|
|
285
|
+
this.turnstileTokenProvider = options.turnstileTokenProvider
|
|
286
|
+
?? (() => '');
|
|
287
|
+
if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {
|
|
288
|
+
throw new TypeError('Asendia timeout must be positive');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async fetch(rawTrackingNumber) {
|
|
292
|
+
const trackingNumber = normalizeAsendiaTrackingNumber(rawTrackingNumber);
|
|
293
|
+
const token = challengeToken(await this.turnstileTokenProvider());
|
|
294
|
+
const [environmentScript, configPayload] = await Promise.all([
|
|
295
|
+
this.requestText(ENVIRONMENT_SCRIPT, 'Asendia public environment'),
|
|
296
|
+
this.requestJson(CONFIG_API, { headers: baseHeaders() }, 'Asendia tracking configuration'),
|
|
297
|
+
]);
|
|
298
|
+
const publicHitKey = parseAsendiaPublicHitKey(environmentScript);
|
|
299
|
+
const config = parseTenantConfig(configPayload);
|
|
300
|
+
const date = this.now().toISOString().slice(0, 10);
|
|
301
|
+
const hitToken = asendiaHitToken(trackingNumber, date, publicHitKey);
|
|
302
|
+
const payload = await this.requestJson(asendiaTrackingApiUrl(), {
|
|
303
|
+
method: 'POST',
|
|
304
|
+
headers: { ...baseHeaders(), 'X-Hit-Token': hitToken },
|
|
305
|
+
body: JSON.stringify({
|
|
306
|
+
ids: [trackingNumber],
|
|
307
|
+
id: config.id,
|
|
308
|
+
subsidiary: [config.subsidiary],
|
|
309
|
+
subsidiary_id: [config.subsidiaryId],
|
|
310
|
+
...(config.brandId === '*' ? { brand_id: '*' } : { customer: config.brandId }),
|
|
311
|
+
turnstile_token: token,
|
|
312
|
+
}),
|
|
313
|
+
}, 'Asendia tracking');
|
|
314
|
+
const result = parseAsendiaTrackingResponse(payload, trackingNumber);
|
|
315
|
+
result.tracking_url = asendiaTrackingUrl(trackingNumber);
|
|
316
|
+
result.tracking_source = 'structured-web-response';
|
|
317
|
+
return result;
|
|
318
|
+
}
|
|
319
|
+
async requestText(url, provider) {
|
|
320
|
+
const { bytes } = await fetchBounded(url, {
|
|
321
|
+
headers: {
|
|
322
|
+
Accept: 'application/javascript,text/javascript,*/*;q=0.8',
|
|
323
|
+
Referer: `${TRACKING_PAGE}/`,
|
|
324
|
+
},
|
|
325
|
+
}, {
|
|
326
|
+
provider,
|
|
327
|
+
timeoutMs: this.timeoutMs,
|
|
328
|
+
maxBytes: MAX_RESPONSE_BYTES,
|
|
329
|
+
fetcher: this.fetcher,
|
|
330
|
+
});
|
|
331
|
+
return decodeText(bytes);
|
|
332
|
+
}
|
|
333
|
+
async requestJson(url, init, provider) {
|
|
334
|
+
const { response, bytes } = await fetchBounded(url, init, {
|
|
335
|
+
provider,
|
|
336
|
+
timeoutMs: this.timeoutMs,
|
|
337
|
+
maxBytes: MAX_RESPONSE_BYTES,
|
|
338
|
+
fetcher: this.fetcher,
|
|
339
|
+
allowHttpError: true,
|
|
340
|
+
});
|
|
341
|
+
const payload = bytes.byteLength > 0 ? parseJsonBytes(bytes, 'Asendia') : null;
|
|
342
|
+
if (response.status === 404)
|
|
343
|
+
throw new NotFoundError('Asendia');
|
|
344
|
+
if (response.status === 403 && provider === 'Asendia tracking') {
|
|
345
|
+
throw new ChallengeError('Asendia', 'Asendia rejected the Cloudflare Turnstile token');
|
|
346
|
+
}
|
|
347
|
+
if (response.status === 400 && isRecord(payload)
|
|
348
|
+
&& /turnstile/i.test(cleanScalar(payload.summary, 256))) {
|
|
349
|
+
throw new ChallengeError('Asendia', 'Asendia rejected the Cloudflare Turnstile token');
|
|
350
|
+
}
|
|
351
|
+
if (!response.ok)
|
|
352
|
+
throw new UpstreamHttpError(provider, response.status);
|
|
353
|
+
return payload;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asendia event vocabularies → product stage.
|
|
3
|
+
*
|
|
4
|
+
* Two sources, two maps. `classifyAsendiaA1Event` serves the registered
|
|
5
|
+
* adapter (Asendia USA's A1 platform); `classifyAsendiaStatus` serves the
|
|
6
|
+
* global-portal probe.
|
|
7
|
+
*
|
|
8
|
+
* A1: Asendia's own scans carry numeric codes (`1`, `2`, `2.1`, …) and are
|
|
9
|
+
* mapped by code. Last-mile partners' scans arrive through the same list with
|
|
10
|
+
* the partner's codes, which differ by partner, so those are mapped by exact
|
|
11
|
+
* wording only where a fixture shows it. Anything else returns null and keeps
|
|
12
|
+
* no event stage, leaving it to the sync's shared wording rules and the
|
|
13
|
+
* unmapped-wording review.
|
|
14
|
+
*
|
|
15
|
+
* Global portal: Asendia's branded portal harmonizes the wording of every partner post into
|
|
16
|
+
* one English vocabulary (`harmonizedEvent`), which is what this map keys on;
|
|
17
|
+
* the numeric `harmonizedCode` is retained as the event's `provider_code` but
|
|
18
|
+
* is not used for mapping, because the same code has been observed with
|
|
19
|
+
* different harmonized wording across subsidiaries.
|
|
20
|
+
*
|
|
21
|
+
* Phrases are compared after lower-casing, stripping diacritics and collapsing
|
|
22
|
+
* everything that is not a letter or a digit. Order matters: return and
|
|
23
|
+
* failure phrases are tested before the delivery ones, so "not delivered" can
|
|
24
|
+
* never match the "delivered" substring. Wording the map does not recognize
|
|
25
|
+
* gets no carrier stage assignment beyond the transit default.
|
|
26
|
+
*/
|
|
27
|
+
import type { CarrierStatus } from '../../core/result/index.js';
|
|
28
|
+
import type { Stage } from '../../generated/catalog.js';
|
|
29
|
+
export interface ClassifiedAsendiaStatus {
|
|
30
|
+
status: CarrierStatus;
|
|
31
|
+
stage: Stage;
|
|
32
|
+
}
|
|
33
|
+
/** Lower-case, unaccent and reduce harmonized wording to letters, digits and single spaces. */
|
|
34
|
+
export declare function comparableText(value: string): string;
|
|
35
|
+
export declare function classifyAsendiaStatus(description: string): ClassifiedAsendiaStatus;
|
|
36
|
+
/**
|
|
37
|
+
* The explicit mapping for one A1 event, or null when no map knows it. Codes
|
|
38
|
+
* are read only for Asendia's own sources: partners reuse short codes such as
|
|
39
|
+
* "10" or "B1" for unrelated scans.
|
|
40
|
+
*/
|
|
41
|
+
export declare function classifyAsendiaA1Event(source: string, code: string, description: string): ClassifiedAsendiaStatus | null;
|