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,52 @@
|
|
|
1
|
+
import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
|
|
2
|
+
import { BudgetExceededError, NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
3
|
+
import { runSteps } from '../../core/runner/index.js';
|
|
4
|
+
import { NOOP_RECORDER } from '../../core/telemetry/index.js';
|
|
5
|
+
import { decodeText, fetchBounded } from '../../core/transport/index.js';
|
|
6
|
+
import { normalizeTipsaNumber, parseTipsaDetail, tipsaDetailUrl } from './parser.js';
|
|
7
|
+
// The shop link (www.tip-sa.com/cliente/datos_prestashop.php) redirects here.
|
|
8
|
+
const LOOKUP = 'https://aplicaciones.tip-sa.com/cliente/datos_prestashop.php';
|
|
9
|
+
const USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36';
|
|
10
|
+
const LOOKUP_MAX_BYTES = 20_000;
|
|
11
|
+
const DETAIL_MAX_BYTES = 1_000_000;
|
|
12
|
+
const REDIRECTS = [301, 302, 303, 307, 308];
|
|
13
|
+
export class TipsaTracker {
|
|
14
|
+
options;
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
}
|
|
18
|
+
fetch(raw, context = {}) {
|
|
19
|
+
const number = normalizeTipsaNumber(raw);
|
|
20
|
+
const budgetMs = context.budgetMs ?? 15_000;
|
|
21
|
+
return runSteps({ carrier: 'tipsa', budgetMs, signal: context.signal,
|
|
22
|
+
recorder: this.options.recorder ?? NOOP_RECORDER }, [{ id: 'direct', run: async ({ signal, remainingMs }) => {
|
|
23
|
+
const deadline = performance.now() + remainingMs;
|
|
24
|
+
const read = async (url, maxBytes, encoding) => {
|
|
25
|
+
signal.throwIfAborted();
|
|
26
|
+
const left = deadline - performance.now();
|
|
27
|
+
if (left <= 0)
|
|
28
|
+
throw new BudgetExceededError('TIPSA', budgetMs);
|
|
29
|
+
const { response, bytes } = await fetchBounded(url, { signal, headers: {
|
|
30
|
+
'User-Agent': USER_AGENT,
|
|
31
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
32
|
+
'Accept-Language': 'es-ES,es;q=0.9,en;q=0.8',
|
|
33
|
+
} }, { provider: 'TIPSA', timeoutMs: Math.max(1, Math.floor(left)), maxBytes, redirect: 'manual',
|
|
34
|
+
allowHttpStatuses: REDIRECTS, fetcher: this.options.fetcher });
|
|
35
|
+
if (performance.now() >= deadline)
|
|
36
|
+
throw new BudgetExceededError('TIPSA', budgetMs);
|
|
37
|
+
if (REDIRECTS.includes(response.status))
|
|
38
|
+
throw new SchemaError('TIPSA', 'TIPSA tracking page moved');
|
|
39
|
+
return decodeText(bytes, encoding);
|
|
40
|
+
};
|
|
41
|
+
const detail = tipsaDetailUrl(await read(`${LOOKUP}?id=${number}`, LOOKUP_MAX_BYTES, 'utf-8'));
|
|
42
|
+
if (!detail)
|
|
43
|
+
throw new NotFoundError('TIPSA');
|
|
44
|
+
return parseTipsaDetail(await read(detail, DETAIL_MAX_BYTES, 'iso-8859-1'), number);
|
|
45
|
+
} }]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export const adapter = environment => {
|
|
49
|
+
const tracker = new TipsaTracker({ fetcher: environment.fetcher, recorder: environment.recorder });
|
|
50
|
+
return { id: 'tipsa', recordsSteps: true, steps: ['direct'], track: (input, context) => tracker.fetch(input.number, context),
|
|
51
|
+
recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeTipsaNumber(number))) };
|
|
52
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "tipsa",
|
|
3
|
+
"displayName": "TIPSA",
|
|
4
|
+
"aliases": [],
|
|
5
|
+
"region": {
|
|
6
|
+
"countries": [
|
|
7
|
+
"ES",
|
|
8
|
+
"PT",
|
|
9
|
+
"AD"
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
"brand": {
|
|
13
|
+
"color": "#001e62"
|
|
14
|
+
},
|
|
15
|
+
"selectable": true,
|
|
16
|
+
"timezone": "Europe/Madrid",
|
|
17
|
+
"tracking": {
|
|
18
|
+
"mode": "automatic",
|
|
19
|
+
"adapter": "tipsa",
|
|
20
|
+
"steps": [
|
|
21
|
+
"direct"
|
|
22
|
+
],
|
|
23
|
+
"recognition": {
|
|
24
|
+
"rank": 24
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"capabilities": [
|
|
28
|
+
"history",
|
|
29
|
+
"location"
|
|
30
|
+
],
|
|
31
|
+
"portal": {
|
|
32
|
+
"url": "https://www.tip-sa.com/cliente/datos_prestashop.php?id={trackingNumber}",
|
|
33
|
+
"canaryUrl": "https://dinapaqweb.tipsa-dinapaq.com/dinapaqweb/detalle_envio.php",
|
|
34
|
+
"shows": [
|
|
35
|
+
"status",
|
|
36
|
+
"history",
|
|
37
|
+
"location",
|
|
38
|
+
"sender_name",
|
|
39
|
+
"recipient_name",
|
|
40
|
+
"recipient_address",
|
|
41
|
+
"postcodes",
|
|
42
|
+
"customer_reference",
|
|
43
|
+
"parcel_count",
|
|
44
|
+
"weight",
|
|
45
|
+
"volume",
|
|
46
|
+
"proof_of_delivery"
|
|
47
|
+
],
|
|
48
|
+
"scraped": [
|
|
49
|
+
"status",
|
|
50
|
+
"history",
|
|
51
|
+
"location"
|
|
52
|
+
],
|
|
53
|
+
"discarded": [
|
|
54
|
+
"sender_name",
|
|
55
|
+
"recipient_name",
|
|
56
|
+
"recipient_address",
|
|
57
|
+
"postcodes",
|
|
58
|
+
"customer_reference",
|
|
59
|
+
"parcel_count",
|
|
60
|
+
"weight",
|
|
61
|
+
"volume",
|
|
62
|
+
"proof_of_delivery"
|
|
63
|
+
],
|
|
64
|
+
"unavailable": [
|
|
65
|
+
"eta"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"links": [
|
|
69
|
+
{
|
|
70
|
+
"domains": [
|
|
71
|
+
"tip-sa.com"
|
|
72
|
+
],
|
|
73
|
+
"path": "^/cliente/datos(?:_prestashop)?\\.php$",
|
|
74
|
+
"params": [
|
|
75
|
+
"id"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"detection": [
|
|
80
|
+
{
|
|
81
|
+
"id": "tipsa-1",
|
|
82
|
+
"pattern": "^\\d{10}$",
|
|
83
|
+
"confidence": "low"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "tipsa-2",
|
|
87
|
+
"pattern": "^0\\d{5}0\\d{5}\\d{10}$",
|
|
88
|
+
"confidence": "low",
|
|
89
|
+
"preferred": true
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "tipsa",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "0000100000104000903494",
|
|
6
|
+
"role": "shipment",
|
|
7
|
+
"evidence": "public_shipment_report",
|
|
8
|
+
"source": {
|
|
9
|
+
"url": "https://www.ocu.org/reclamar/lista-reclamaciones-publicas/paquete-entregado-a-otra-perso/CPTES01915119-48",
|
|
10
|
+
"date": "2023-11-11"
|
|
11
|
+
},
|
|
12
|
+
"expect": {
|
|
13
|
+
"carrier": "ctt-express",
|
|
14
|
+
"confidence": "high"
|
|
15
|
+
},
|
|
16
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. The source attributes it to TIPSA; CTT Express's rule for numbers starting 00 claims it."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"number": "0280010280017024953690",
|
|
20
|
+
"role": "shipment",
|
|
21
|
+
"evidence": "public_shipment_report",
|
|
22
|
+
"source": {
|
|
23
|
+
"url": "https://www.deco.proteste.pt/reclamar/todas-as-reclamacoes/encomenda-n-C3-A3o-recebida/0e56c354319eb7d720",
|
|
24
|
+
"date": "2026-08-25"
|
|
25
|
+
},
|
|
26
|
+
"expect": {
|
|
27
|
+
"carrier": "unknown",
|
|
28
|
+
"confidence": "low",
|
|
29
|
+
"candidates": [
|
|
30
|
+
"tipsa",
|
|
31
|
+
"austrian-post",
|
|
32
|
+
"usps",
|
|
33
|
+
"estafeta"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. Portuguese shipment."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"number": "0460040240008103140542",
|
|
40
|
+
"role": "shipment",
|
|
41
|
+
"evidence": "public_shipment_report",
|
|
42
|
+
"source": {
|
|
43
|
+
"url": "https://www.ocu.org/reclamar/lista-reclamaciones-publicas/incumplimiento-en-la-entrega-d/fac22bd26674a21683",
|
|
44
|
+
"date": "2024-12-13"
|
|
45
|
+
},
|
|
46
|
+
"expect": {
|
|
47
|
+
"carrier": "unknown",
|
|
48
|
+
"confidence": "low",
|
|
49
|
+
"candidates": [
|
|
50
|
+
"tipsa",
|
|
51
|
+
"austrian-post",
|
|
52
|
+
"usps",
|
|
53
|
+
"estafeta"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. Its two agency codes differ."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"number": "0460040460048105123537",
|
|
60
|
+
"role": "shipment",
|
|
61
|
+
"evidence": "public_shipment_report",
|
|
62
|
+
"source": {
|
|
63
|
+
"url": "https://portaldaqueixa.com/brands/tipsa/complaints/tipsa-nao-entrega-de-encomenda-2-146876825",
|
|
64
|
+
"date": "2025-12-24"
|
|
65
|
+
},
|
|
66
|
+
"expect": {
|
|
67
|
+
"carrier": "unknown",
|
|
68
|
+
"confidence": "low",
|
|
69
|
+
"candidates": [
|
|
70
|
+
"tipsa",
|
|
71
|
+
"austrian-post",
|
|
72
|
+
"usps",
|
|
73
|
+
"estafeta"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. Portuguese shipment."
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"number": "8104405448",
|
|
80
|
+
"role": "shipment",
|
|
81
|
+
"evidence": "public_shipment_report",
|
|
82
|
+
"source": {
|
|
83
|
+
"url": "https://www.ocu.org/reclamar/lista-reclamaciones-publicas/no-recibido-pedido/ca39ecd30bb517b380",
|
|
84
|
+
"date": "2025-08-07"
|
|
85
|
+
},
|
|
86
|
+
"expect": {
|
|
87
|
+
"carrier": "unknown",
|
|
88
|
+
"confidence": "low",
|
|
89
|
+
"candidates": [
|
|
90
|
+
"dhl",
|
|
91
|
+
"mondial-relay",
|
|
92
|
+
"relais-colis",
|
|
93
|
+
"tipsa",
|
|
94
|
+
"estafeta"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
"note": "Publicly reported shipment number; the attribution was not independently verified. The source attributes it to TIPSA, which stays one candidate among several."
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
export declare const TIPSA_ZONE = "Europe/Madrid";
|
|
3
|
+
/** The 22-digit reference: charge agency, origin agency and waybill, six, six and ten digits. */
|
|
4
|
+
export declare function normalizeTipsaNumber(raw: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* The shipment page the lookup's meta refresh names, or null when TIPSA knows
|
|
7
|
+
* no shipment by that reference (it then names the page with empty
|
|
8
|
+
* parameters). Only TIPSA's own detail page with a service id and a
|
|
9
|
+
* `dd/MM/yy` date is followed.
|
|
10
|
+
*/
|
|
11
|
+
export declare function tipsaDetailUrl(html: string): string | null;
|
|
12
|
+
/**
|
|
13
|
+
* The history table of TIPSA's shipment page. Its clock is Madrid's for every
|
|
14
|
+
* agency, Portuguese ones included. Recipient, sender, reference and proof of
|
|
15
|
+
* delivery blocks are never read.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseTipsaDetail(html: string, raw: string): CarrierResult;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { load } from 'cheerio';
|
|
2
|
+
import { ChallengeError, IndeterminateError, SchemaError } from '../../core/errors/index.js';
|
|
3
|
+
import { zonedTime } from '../../core/time/index.js';
|
|
4
|
+
import { clean } from '../../core/transport/index.js';
|
|
5
|
+
import { tipsaStatus } from './status.js';
|
|
6
|
+
const PROVIDER = 'TIPSA';
|
|
7
|
+
const DETAIL_ORIGIN = 'https://dinapaqweb.tipsa-dinapaq.com';
|
|
8
|
+
const DETAIL_PATH = '/dinapaqweb/detalle_envio.php';
|
|
9
|
+
const SERVICE = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;
|
|
10
|
+
const MAX_ROWS = 500;
|
|
11
|
+
export const TIPSA_ZONE = 'Europe/Madrid';
|
|
12
|
+
/** The 22-digit reference: charge agency, origin agency and waybill, six, six and ten digits. */
|
|
13
|
+
export function normalizeTipsaNumber(raw) {
|
|
14
|
+
if (raw.length > 64)
|
|
15
|
+
throw new TypeError('TIPSA tracking number is too long');
|
|
16
|
+
const number = raw.replace(/[\s.-]/g, '');
|
|
17
|
+
if (/^\d{22}$/.test(number))
|
|
18
|
+
return number;
|
|
19
|
+
throw new TypeError('TIPSA requires the full 22-digit reference');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The shipment page the lookup's meta refresh names, or null when TIPSA knows
|
|
23
|
+
* no shipment by that reference (it then names the page with empty
|
|
24
|
+
* parameters). Only TIPSA's own detail page with a service id and a
|
|
25
|
+
* `dd/MM/yy` date is followed.
|
|
26
|
+
*/
|
|
27
|
+
export function tipsaDetailUrl(html) {
|
|
28
|
+
const target = /<meta\s+http-equiv=["']refresh["']\s+content=["']\s*0\s*;\s*URL=([^"'\s]{1,512})["']/i.exec(html)?.[1];
|
|
29
|
+
if (!target)
|
|
30
|
+
throw new SchemaError(PROVIDER, 'TIPSA lookup did not name a shipment page');
|
|
31
|
+
let url;
|
|
32
|
+
try {
|
|
33
|
+
url = new URL(target.replaceAll('&', '&'));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new SchemaError(PROVIDER, 'TIPSA shipment page address is invalid');
|
|
37
|
+
}
|
|
38
|
+
const keys = [...url.searchParams.keys()];
|
|
39
|
+
if (url.origin !== DETAIL_ORIGIN || url.pathname.toLowerCase() !== DETAIL_PATH || url.username || url.password || url.hash
|
|
40
|
+
|| keys.length !== 2 || !keys.includes('servicio') || !keys.includes('fecha')) {
|
|
41
|
+
throw new SchemaError(PROVIDER, 'TIPSA shipment page address changed');
|
|
42
|
+
}
|
|
43
|
+
const service = url.searchParams.get('servicio');
|
|
44
|
+
const date = url.searchParams.get('fecha');
|
|
45
|
+
if (!service && !date)
|
|
46
|
+
return null;
|
|
47
|
+
if (!SERVICE.test(service) || !/^\d{2}\/\d{2}\/\d{2}$/.test(date)) {
|
|
48
|
+
throw new SchemaError(PROVIDER, 'TIPSA shipment page address changed');
|
|
49
|
+
}
|
|
50
|
+
return url.toString();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The history table of TIPSA's shipment page. Its clock is Madrid's for every
|
|
54
|
+
* agency, Portuguese ones included. Recipient, sender, reference and proof of
|
|
55
|
+
* delivery blocks are never read.
|
|
56
|
+
*/
|
|
57
|
+
export function parseTipsaDetail(html, raw) {
|
|
58
|
+
const number = normalizeTipsaNumber(raw);
|
|
59
|
+
if (/<title>\s*Just a moment|cf-chl-|challenge-platform|Attention Required! \| Cloudflare/i.test(html)) {
|
|
60
|
+
throw new ChallengeError(PROVIDER, 'TIPSA returned a browser challenge');
|
|
61
|
+
}
|
|
62
|
+
const $ = load(html);
|
|
63
|
+
const value = (selector) => clean($(selector).attr('value'), 32);
|
|
64
|
+
const parts = value('#CodAgeCargo') + value('#CodAgeOri') + value('#Albaran');
|
|
65
|
+
if (value('#envio-localizado') !== number || parts !== number) {
|
|
66
|
+
throw new SchemaError(PROVIDER, 'TIPSA page does not identify the requested shipment');
|
|
67
|
+
}
|
|
68
|
+
const tables = $('table').filter((_, table) => $(table).find('thead th').map((__, th) => clean($(th).text(), 32)).get()
|
|
69
|
+
.join('|') === 'FECHA/HORA|ESTADO|POBLACIÓN');
|
|
70
|
+
if (tables.length !== 1)
|
|
71
|
+
throw new SchemaError(PROVIDER, 'TIPSA shipment history is missing');
|
|
72
|
+
const rows = tables.find('tbody > tr');
|
|
73
|
+
if (rows.length > MAX_ROWS)
|
|
74
|
+
throw new SchemaError(PROVIDER, 'TIPSA returned too many history rows');
|
|
75
|
+
const events = [];
|
|
76
|
+
const seen = new Set();
|
|
77
|
+
rows.each((_, row) => {
|
|
78
|
+
const cells = $(row).children('td');
|
|
79
|
+
if (cells.length !== 3)
|
|
80
|
+
throw new SchemaError(PROVIDER, 'TIPSA history row changed');
|
|
81
|
+
// Each cell repeats its text in a tooltip span, which is skipped.
|
|
82
|
+
const cellText = (index) => {
|
|
83
|
+
const cell = cells.eq(index);
|
|
84
|
+
const spans = cell.children('span').not('.mdl-tooltip');
|
|
85
|
+
return clean((spans.length ? spans : cell).first().text(), 160);
|
|
86
|
+
};
|
|
87
|
+
const time = zonedTime(cellText(0), 'dd/MM/yy HH:mm', TIPSA_ZONE);
|
|
88
|
+
const description = cellText(1);
|
|
89
|
+
if (!time || !description)
|
|
90
|
+
throw new SchemaError(PROVIDER, 'TIPSA history row has no time or status');
|
|
91
|
+
const location = cellText(2);
|
|
92
|
+
const key = JSON.stringify([time.iso, description, location]);
|
|
93
|
+
if (seen.has(key))
|
|
94
|
+
return;
|
|
95
|
+
seen.add(key);
|
|
96
|
+
const stage = tipsaStatus(description)?.stage;
|
|
97
|
+
events.push({ time: time.iso, description, ...(location ? { location } : {}), ...(stage ? { stage } : {}) });
|
|
98
|
+
});
|
|
99
|
+
if (!events.length)
|
|
100
|
+
throw new IndeterminateError(PROVIDER, 'TIPSA shipment history is empty');
|
|
101
|
+
// Newest first, as the page lists them; rows of one minute keep the page's order.
|
|
102
|
+
events.sort((left, right) => Date.parse(right.time) - Date.parse(left.time));
|
|
103
|
+
const newest = events[0];
|
|
104
|
+
const current = tipsaStatus(newest.description);
|
|
105
|
+
return {
|
|
106
|
+
status: current?.status ?? 'unknown',
|
|
107
|
+
...(current ? { current_stage: current.stage } : {}),
|
|
108
|
+
last_status_text: newest.description,
|
|
109
|
+
last_update: newest.time,
|
|
110
|
+
expected_delivery: null,
|
|
111
|
+
timezone: TIPSA_ZONE,
|
|
112
|
+
events,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { languageStageStatus, trackingLanguageStage } from '../../core/status/index.js';
|
|
2
|
+
function comparable(value) {
|
|
3
|
+
return value.normalize('NFD').replace(/[̀-ͯ]/g, '').toUpperCase().replace(/\s+/g, ' ').trim();
|
|
4
|
+
}
|
|
5
|
+
// TIPSA's history labels, as the shipment page lists them.
|
|
6
|
+
const LABELS = new Map([
|
|
7
|
+
['PENDIENTE DE ENTREGAR A TIPSA', { status: 'pending', stage: 'registered' }],
|
|
8
|
+
['TRANSITO', { status: 'in_transit', stage: 'in_transit' }],
|
|
9
|
+
['LEIDO EN DESTINO', { status: 'in_transit', stage: 'in_transit' }],
|
|
10
|
+
['REPARTO', { status: 'out_for_delivery', stage: 'out_for_delivery' }],
|
|
11
|
+
['AUSENTE', { status: 'exception', stage: 'failed_attempt' }],
|
|
12
|
+
['ENTREGADO', { status: 'delivered', stage: 'delivered' }],
|
|
13
|
+
]);
|
|
14
|
+
/** A label's stage: TIPSA's own vocabulary first, then the shared Spanish and Portuguese wording rules. */
|
|
15
|
+
export function tipsaStatus(label) {
|
|
16
|
+
const key = comparable(label);
|
|
17
|
+
// The destination agency's name follows ("LECTURA EN AGENCIA DESTINO EJEMPLO 01").
|
|
18
|
+
if (/^LECTURA EN AGENCIA DESTINO\b/.test(key))
|
|
19
|
+
return { status: 'in_transit', stage: 'in_transit' };
|
|
20
|
+
const known = LABELS.get(key);
|
|
21
|
+
if (known)
|
|
22
|
+
return known;
|
|
23
|
+
const worded = trackingLanguageStage(label);
|
|
24
|
+
return worded ? { status: languageStageStatus(worded), stage: worded } : undefined;
|
|
25
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "tipsa",
|
|
3
|
+
"entries": [
|
|
4
|
+
{ "wording": "PENDIENTE DE ENTREGAR A TIPSA", "language": "es", "stage": "registered", "confirmedBy": "live" },
|
|
5
|
+
{ "wording": "TRANSITO", "language": "es", "stage": "in_transit", "confirmedBy": "live" },
|
|
6
|
+
{ "wording": "LEIDO EN DESTINO", "language": "es", "stage": "in_transit", "confirmedBy": "live" },
|
|
7
|
+
{ "wording": "LECTURA EN AGENCIA DESTINO", "language": "es", "stage": "in_transit", "confirmedBy": "live", "note": "Followed by the destination agency's name." },
|
|
8
|
+
{ "wording": "REPARTO", "language": "es", "stage": "out_for_delivery", "confirmedBy": "live" },
|
|
9
|
+
{ "wording": "Ausente", "language": "es", "stage": "failed_attempt", "confirmedBy": "live" },
|
|
10
|
+
{ "wording": "ENTREGADO", "language": "es", "stage": "delivered", "confirmedBy": "live" }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AdapterFactory, type TrackingContext } from '../../core/adapter/index.js';
|
|
2
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
3
|
+
export declare function normalizeTntFranceNumber(raw: string): string;
|
|
4
|
+
export declare function normalizeTntExpressNumber(raw: string): string;
|
|
5
|
+
export declare function parseTntFranceResponse(html: string, rawNumber: string): CarrierResult;
|
|
6
|
+
export declare function parseTntExpressResponse(payload: unknown, rawNumber: string): CarrierResult;
|
|
7
|
+
export declare class TntFranceTracker {
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(options?: {
|
|
10
|
+
fetcher?: typeof fetch;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
});
|
|
13
|
+
fetch(rawNumber: string, context?: TrackingContext): Promise<CarrierResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare class TntExpressTracker {
|
|
16
|
+
private readonly options;
|
|
17
|
+
constructor(options?: {
|
|
18
|
+
fetcher?: typeof fetch;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
});
|
|
21
|
+
fetch(rawNumber: string, context?: TrackingContext): Promise<CarrierResult>;
|
|
22
|
+
}
|
|
23
|
+
export declare const adapter: AdapterFactory;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { load } from 'cheerio';
|
|
2
|
+
import { recognizeFromLookup } from '../../core/adapter/index.js';
|
|
3
|
+
import { normalizeTrackingNumber } from '../../core/detection/index.js';
|
|
4
|
+
import { ChallengeError, IndeterminateError, InputRequiredError, NotFoundError, SchemaError, TransportError, UpstreamHttpError } from '../../core/errors/index.js';
|
|
5
|
+
import { explicitOffsetTime, zonedTime } from '../../core/time/index.js';
|
|
6
|
+
import { clean, decodeText, fetchBounded, parseJsonBytes } from '../../core/transport/index.js';
|
|
7
|
+
import { isRecord } from '../../core/types.js';
|
|
8
|
+
import { tntExpressStatus, tntFranceStatus } from './status.js';
|
|
9
|
+
const PROVIDER = 'TNT France';
|
|
10
|
+
const ENDPOINT = 'https://www.tnt.fr/public/suivi_colis/recherche/visubontransport.do';
|
|
11
|
+
const EXPRESS_PROVIDER = 'TNT';
|
|
12
|
+
// The JSON read behind tnt.com's public tracking page.
|
|
13
|
+
const EXPRESS_ENDPOINT = 'https://www.tnt.com/api/v3/shipment';
|
|
14
|
+
export function normalizeTntFranceNumber(raw) {
|
|
15
|
+
const number = normalizeTrackingNumber(raw);
|
|
16
|
+
if (!/^\d{16}$/.test(number))
|
|
17
|
+
throw new InputRequiredError(PROVIDER, 'number', 'TNT France direct tracking requires a 16-digit national consignment');
|
|
18
|
+
return number;
|
|
19
|
+
}
|
|
20
|
+
export function normalizeTntExpressNumber(raw) {
|
|
21
|
+
const number = normalizeTrackingNumber(raw);
|
|
22
|
+
if (!/^\d{9}$/.test(number))
|
|
23
|
+
throw new InputRequiredError(EXPRESS_PROVIDER, 'number', 'TNT direct tracking requires a 9-digit consignment or a 16-digit TNT France consignment');
|
|
24
|
+
return number;
|
|
25
|
+
}
|
|
26
|
+
async function fetchTnt(url, accept, provider, context, options) {
|
|
27
|
+
const budgetMs = context.budgetMs ?? options.timeoutMs ?? 15_000;
|
|
28
|
+
if (!Number.isFinite(budgetMs) || budgetMs <= 0)
|
|
29
|
+
throw new TypeError(`${provider} timeout must be positive`);
|
|
30
|
+
context.signal?.throwIfAborted();
|
|
31
|
+
try {
|
|
32
|
+
const fetched = await fetchBounded(url, { headers: { Accept: accept } }, {
|
|
33
|
+
provider, maxBytes: 1_000_000, timeoutMs: Math.max(1, Math.floor(budgetMs)),
|
|
34
|
+
fetcher: (input, init) => (options.fetcher ?? fetch)(input, {
|
|
35
|
+
...init, signal: AbortSignal.any([...(context.signal ? [context.signal] : []), ...(init?.signal ? [init.signal] : [])]),
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
context.signal?.throwIfAborted();
|
|
39
|
+
return fetched;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof UpstreamHttpError && [404, 410].includes(error.status))
|
|
43
|
+
throw new TransportError(provider, `${provider} tracking endpoint is unavailable`, { cause: error });
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function parseTntFranceResponse(html, rawNumber) {
|
|
48
|
+
const number = normalizeTntFranceNumber(rawNumber);
|
|
49
|
+
const $ = load(html);
|
|
50
|
+
$('script, style, noscript').remove();
|
|
51
|
+
if (/captcha|access denied|verify you are human/i.test(clean($('title').text(), 200)))
|
|
52
|
+
throw new ChallengeError(PROVIDER);
|
|
53
|
+
const negative = $('#saisieBTMsg');
|
|
54
|
+
if (negative.length === 1 && !/display\s*:\s*none/i.test(negative.attr('style') ?? '')
|
|
55
|
+
&& /Nous n'avons pas trouvé de colis associé à votre recherche|Les données suivantes ne correspondent pas à des bons de transport/i.test(clean(negative.text(), 500))) {
|
|
56
|
+
throw new NotFoundError(PROVIDER);
|
|
57
|
+
}
|
|
58
|
+
// The returned details identity is separate from the search form's echo.
|
|
59
|
+
const identity = $('#ancestor');
|
|
60
|
+
const titles = $('.layout__item').filter((_, element) => /^Bon de transport n[º°]\s*\d{16}$/.test(clean($(element).text(), 100)));
|
|
61
|
+
if (identity.length !== 1 || clean(identity.text(), 32) !== number || titles.length !== 1
|
|
62
|
+
|| !clean(titles.text(), 100).endsWith(number))
|
|
63
|
+
throw new SchemaError(PROVIDER, 'TNT France returned no matching shipment details');
|
|
64
|
+
const sections = $('.result__item').filter((_, element) => clean($(element).children('.result__row').text(), 100) === 'Etapes de votre expédition');
|
|
65
|
+
if (sections.length !== 1)
|
|
66
|
+
throw new SchemaError(PROVIDER, 'TNT France returned no unique tracking history');
|
|
67
|
+
const rows = sections.children('.result__content').children('.roster');
|
|
68
|
+
if (!rows.length)
|
|
69
|
+
throw new IndeterminateError(PROVIDER, 'TNT France returned empty tracking history');
|
|
70
|
+
if (rows.length > 500)
|
|
71
|
+
throw new SchemaError(PROVIDER, 'TNT France returned excessive tracking history');
|
|
72
|
+
const parsed = [];
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
rows.toArray().forEach((row, index) => {
|
|
75
|
+
const cells = $(row).children('.roster__item');
|
|
76
|
+
if (cells.length !== 3)
|
|
77
|
+
throw new SchemaError(PROVIDER, 'TNT France changed its tracking row');
|
|
78
|
+
const description = clean(cells.eq(0).text(), 500);
|
|
79
|
+
const date = clean(cells.eq(1).text(), 64);
|
|
80
|
+
const time = zonedTime(date, 'dd/MM/yyyy HH:mm', 'Europe/Paris');
|
|
81
|
+
const location = clean(cells.eq(2).text(), 200);
|
|
82
|
+
if (!description || !time)
|
|
83
|
+
throw new SchemaError(PROVIDER, 'TNT France returned an incomplete tracking row');
|
|
84
|
+
const mapped = tntFranceStatus(description);
|
|
85
|
+
const key = JSON.stringify([time.iso, description, location]);
|
|
86
|
+
if (seen.has(key))
|
|
87
|
+
return;
|
|
88
|
+
seen.add(key);
|
|
89
|
+
parsed.push({ event: { time: time.iso, description, ...(location ? { location } : {}), ...(mapped ? { stage: mapped.stage } : {}) }, timestamp: time.timestamp, index });
|
|
90
|
+
});
|
|
91
|
+
parsed.sort((a, b) => b.timestamp - a.timestamp || a.index - b.index);
|
|
92
|
+
const events = parsed.slice(0, 100).map(({ event }) => event);
|
|
93
|
+
// Desktop and mobile repeat the selected milestone. Future rail labels are
|
|
94
|
+
// not events, and an unselected "Livré" never proves delivery.
|
|
95
|
+
const selected = [...new Set($('.suivi-title-selected').toArray().map((element) => clean($(element).text(), 200)).filter(Boolean))];
|
|
96
|
+
if (selected.length !== 1)
|
|
97
|
+
throw new SchemaError(PROVIDER, 'TNT France returned an ambiguous current milestone');
|
|
98
|
+
const mapped = tntFranceStatus(selected[0]);
|
|
99
|
+
return {
|
|
100
|
+
status: mapped?.status ?? 'unknown', ...(mapped ? { current_stage: mapped.stage } : {}),
|
|
101
|
+
last_status_text: selected[0], last_update: events[0].time, expected_delivery: null, events,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function tntExpressHistory(consignment) {
|
|
105
|
+
if (!Array.isArray(consignment.events) || consignment.events.length > 500)
|
|
106
|
+
throw new SchemaError(EXPRESS_PROVIDER, 'TNT returned invalid tracking history');
|
|
107
|
+
const parsed = [];
|
|
108
|
+
const seen = new Set();
|
|
109
|
+
consignment.events.forEach((raw, index) => {
|
|
110
|
+
if (!isRecord(raw))
|
|
111
|
+
throw new SchemaError(EXPRESS_PROVIDER, 'TNT returned an invalid scan');
|
|
112
|
+
const time = explicitOffsetTime(raw.date);
|
|
113
|
+
const description = clean(raw.statusDescription, 500);
|
|
114
|
+
if (!time || !description)
|
|
115
|
+
throw new SchemaError(EXPRESS_PROVIDER, 'TNT returned an incomplete scan');
|
|
116
|
+
const place = isRecord(raw.location) ? raw.location : {};
|
|
117
|
+
const location = [clean(place.city, 100), clean(place.country, 100)].filter(Boolean).join(', ');
|
|
118
|
+
const code = clean(raw.legacyCode, 16);
|
|
119
|
+
const mapped = tntExpressStatus(code);
|
|
120
|
+
const key = JSON.stringify([time.iso, code, description, location]);
|
|
121
|
+
if (seen.has(key))
|
|
122
|
+
return;
|
|
123
|
+
seen.add(key);
|
|
124
|
+
parsed.push({ event: {
|
|
125
|
+
time: time.iso, description, ...(location ? { location } : {}), ...(code ? { provider_code: code } : {}),
|
|
126
|
+
...(mapped ? { stage: mapped.stage } : {}),
|
|
127
|
+
}, timestamp: time.timestamp, index });
|
|
128
|
+
});
|
|
129
|
+
// Newest first, as the page lists them.
|
|
130
|
+
return parsed.sort((a, b) => b.timestamp - a.timestamp || a.index - b.index);
|
|
131
|
+
}
|
|
132
|
+
export function parseTntExpressResponse(payload, rawNumber) {
|
|
133
|
+
const number = normalizeTntExpressNumber(rawNumber);
|
|
134
|
+
const output = isRecord(payload) ? payload['tracker.output'] : undefined;
|
|
135
|
+
if (!isRecord(output))
|
|
136
|
+
throw new SchemaError(EXPRESS_PROVIDER);
|
|
137
|
+
const consignments = Array.isArray(output.consignment) ? output.consignment : [];
|
|
138
|
+
if (!consignments.length) {
|
|
139
|
+
if (Array.isArray(output.notFound) && output.notFound.some((entry) => isRecord(entry) && clean(entry.input, 32) === number)) {
|
|
140
|
+
throw new NotFoundError(EXPRESS_PROVIDER);
|
|
141
|
+
}
|
|
142
|
+
throw new SchemaError(EXPRESS_PROVIDER);
|
|
143
|
+
}
|
|
144
|
+
if (consignments.length > 50)
|
|
145
|
+
throw new SchemaError(EXPRESS_PROVIDER, 'TNT returned excessive shipments');
|
|
146
|
+
// Numbers are reused: every consignment that carried this one is listed.
|
|
147
|
+
// Its most recent scan picks the parcel; another number is never read.
|
|
148
|
+
const shipments = consignments.map((consignment) => {
|
|
149
|
+
if (!isRecord(consignment))
|
|
150
|
+
throw new SchemaError(EXPRESS_PROVIDER, 'TNT returned an invalid shipment');
|
|
151
|
+
return consignment;
|
|
152
|
+
}).filter((consignment) => clean(consignment.consignmentNumber, 32) === number)
|
|
153
|
+
.map((consignment) => ({ consignment, history: tntExpressHistory(consignment) }));
|
|
154
|
+
if (!shipments.length)
|
|
155
|
+
throw new SchemaError(EXPRESS_PROVIDER, 'TNT returned a different shipment');
|
|
156
|
+
const newest = ({ history }) => history[0]?.timestamp ?? -Infinity;
|
|
157
|
+
const { consignment, history } = shipments.reduce((best, shipment) => newest(shipment) > newest(best) ? shipment : best);
|
|
158
|
+
if (!history.length)
|
|
159
|
+
throw new IndeterminateError(EXPRESS_PROVIDER, 'TNT returned a shipment without tracking history');
|
|
160
|
+
const events = history.slice(0, 100).map(({ event }) => event);
|
|
161
|
+
const mapped = tntExpressStatus(String(events[0].provider_code ?? ''));
|
|
162
|
+
// `destinationDate` is the estimate until delivery; its day matches the page.
|
|
163
|
+
const sources = isRecord(consignment.analytics) && isRecord(consignment.analytics.destinationDateSources)
|
|
164
|
+
? consignment.analytics.destinationDateSources : {};
|
|
165
|
+
const estimate = clean(consignment.destinationDate, 64);
|
|
166
|
+
const expected = ['originalEta', 'revisedEta', 'outForDeliveryEta'].includes(clean(sources.usedDate, 32))
|
|
167
|
+
&& !['delivered', 'returned'].includes(mapped?.stage ?? '') && /^\d{4}-\d{2}-\d{2}T/.test(estimate) ? estimate.slice(0, 10) : null;
|
|
168
|
+
return {
|
|
169
|
+
status: mapped?.status ?? 'unknown', ...(mapped ? { current_stage: mapped.stage } : {}),
|
|
170
|
+
last_status_text: events[0].description, last_update: events[0].time, expected_delivery: expected, events,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
export class TntFranceTracker {
|
|
174
|
+
options;
|
|
175
|
+
constructor(options = {}) {
|
|
176
|
+
this.options = options;
|
|
177
|
+
}
|
|
178
|
+
async fetch(rawNumber, context = {}) {
|
|
179
|
+
const number = normalizeTntFranceNumber(rawNumber);
|
|
180
|
+
const url = new URL(ENDPOINT);
|
|
181
|
+
url.search = new URLSearchParams({ bonTransport: number, radiochoixrecherche: 'BT' }).toString();
|
|
182
|
+
const { response, bytes } = await fetchTnt(url, 'text/html', PROVIDER, context, this.options);
|
|
183
|
+
const encoding = /charset\s*=\s*ISO-8859-1/i.test(response.headers.get('content-type') ?? '') ? 'iso-8859-1' : 'utf-8';
|
|
184
|
+
return parseTntFranceResponse(decodeText(bytes, encoding), number);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export class TntExpressTracker {
|
|
188
|
+
options;
|
|
189
|
+
constructor(options = {}) {
|
|
190
|
+
this.options = options;
|
|
191
|
+
}
|
|
192
|
+
async fetch(rawNumber, context = {}) {
|
|
193
|
+
const number = normalizeTntExpressNumber(rawNumber);
|
|
194
|
+
const url = new URL(EXPRESS_ENDPOINT);
|
|
195
|
+
url.search = new URLSearchParams({ con: number, searchType: 'CON', locale: 'en_GB', channel: 'OPENTRACK' }).toString();
|
|
196
|
+
const { bytes } = await fetchTnt(url, 'application/json', EXPRESS_PROVIDER, context, this.options);
|
|
197
|
+
return parseTntExpressResponse(parseJsonBytes(bytes, EXPRESS_PROVIDER), number);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export const adapter = (environment) => {
|
|
201
|
+
const france = new TntFranceTracker({ fetcher: environment.fetcher });
|
|
202
|
+
const express = new TntExpressTracker({ fetcher: environment.fetcher });
|
|
203
|
+
// TNT France consignments have 16 digits; tnt.com rejects them.
|
|
204
|
+
const lookup = (number, context) => /^\d{16}$/.test(normalizeTrackingNumber(number))
|
|
205
|
+
? france.fetch(number, context) : express.fetch(number, context);
|
|
206
|
+
return {
|
|
207
|
+
id: 'tnt', steps: ['direct'], track: (input, context) => lookup(input.number, context),
|
|
208
|
+
recognize: (number, context) => recognizeFromLookup(() => lookup(number, context), () => /^(?:\d{9}|\d{16})$/.test(normalizeTrackingNumber(number))),
|
|
209
|
+
};
|
|
210
|
+
};
|