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,415 @@
|
|
|
1
|
+
import { load } from 'cheerio';
|
|
2
|
+
import makeFetchCookie from 'fetch-cookie';
|
|
3
|
+
import { CookieJar } from 'tough-cookie';
|
|
4
|
+
import { ChallengeError, IndeterminateError, NotFoundError, SchemaError } from '../../core/errors/index.js';
|
|
5
|
+
import { eventPoint } from '../../core/result/index.js';
|
|
6
|
+
import { isValidS10TrackingNumber } from '../../core/detection/index.js';
|
|
7
|
+
import { isoTime } from '../../core/time/index.js';
|
|
8
|
+
import { cleanScalar, decodeText, fetchBounded, parseJsonBytes, UpstreamHttpError, } from '../../core/transport/index.js';
|
|
9
|
+
import { isRecord } from '../../core/types.js';
|
|
10
|
+
import { classifyIndiaPostEvent } from './status.js';
|
|
11
|
+
// Protocol provenance (inspected 2026-09-01):
|
|
12
|
+
// https://github.com/bivu-m/njs-tracker-scraper
|
|
13
|
+
// MySpeedPost currently exposes its tracking form as a Livewire component at
|
|
14
|
+
// /track and completes the asynchronous lookup through /livewire/update.
|
|
15
|
+
const TRACKING_PAGE = 'https://myspeedpost.com/track';
|
|
16
|
+
const LIVEWIRE_UPDATE = 'https://myspeedpost.com/livewire/update';
|
|
17
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
18
|
+
const DEFAULT_POLL_INTERVAL_MS = 750;
|
|
19
|
+
const DEFAULT_MAX_POLL_ATTEMPTS = 10;
|
|
20
|
+
// MySpeedPost serves its last sync until someone presses Refresh: one parcel
|
|
21
|
+
// kept an 11-day-old "Item Booked" while it reached export customs.
|
|
22
|
+
const REFRESH_AFTER_MS = 30 * 60_000;
|
|
23
|
+
const USER_TIMEZONE = 'Europe/Zurich';
|
|
24
|
+
const MAX_RESPONSE_BYTES = 2_000_000;
|
|
25
|
+
const USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) '
|
|
26
|
+
+ 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36';
|
|
27
|
+
export { classifyIndiaPostEvent };
|
|
28
|
+
// India Post sends ids and pincodes as numbers as often as strings, so the
|
|
29
|
+
// number-tolerant `cleanScalar` is used throughout instead of `clean`.
|
|
30
|
+
const clean = cleanScalar;
|
|
31
|
+
/** The MySpeedPost session bootstrap ran into Cloudflare, not into a shipment answer. */
|
|
32
|
+
export class IndiaPostChallengeError extends ChallengeError {
|
|
33
|
+
constructor() {
|
|
34
|
+
super('India Post', 'India Post tracking returned a browser challenge');
|
|
35
|
+
this.name = 'IndiaPostChallengeError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function normalizeIndiaPostTrackingNumber(raw) {
|
|
39
|
+
const value = raw.toLocaleUpperCase('en-US').replace(/[\s.-]/g, '');
|
|
40
|
+
if (!/^[A-Z]{2}\d{9}IN$/.test(value) || !isValidS10TrackingNumber(value)) {
|
|
41
|
+
throw new TypeError('India Post tracking requires a valid 13-character S10 number ending in IN');
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
export function indiaPostTrackingUrl(raw) {
|
|
46
|
+
const url = new URL(TRACKING_PAGE);
|
|
47
|
+
url.searchParams.set('n', normalizeIndiaPostTrackingNumber(raw));
|
|
48
|
+
url.searchParams.set('sync', 'true');
|
|
49
|
+
return url.toString();
|
|
50
|
+
}
|
|
51
|
+
function parseTrackingRequest(html) {
|
|
52
|
+
const $ = load(html);
|
|
53
|
+
for (const element of $('[tracking-request]').toArray()) {
|
|
54
|
+
const serialized = $(element).attr('tracking-request');
|
|
55
|
+
if (!serialized)
|
|
56
|
+
continue;
|
|
57
|
+
try {
|
|
58
|
+
const payload = JSON.parse(serialized);
|
|
59
|
+
if (isRecord(payload) && Array.isArray(payload.tracking_events))
|
|
60
|
+
return payload;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Keep looking in case an unrelated component owns the malformed attribute.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw new SchemaError('India Post', 'India Post returned an invalid tracking history');
|
|
67
|
+
}
|
|
68
|
+
// India Post now sends bare codes in `event` (seen 2026-09-22 after a refresh);
|
|
69
|
+
// rows synced earlier carry its prose. Only codes seen live are spelled out.
|
|
70
|
+
const EVENT_TEXT = {
|
|
71
|
+
ITEM_BOOK: 'Item Booked',
|
|
72
|
+
BAG_CLOSE: 'Bag Closed',
|
|
73
|
+
BAG_DISPATCH: 'Bag Dispatched',
|
|
74
|
+
BAG_FORWARD: 'Bag Forwarded',
|
|
75
|
+
TMO_RECEIVE: 'Received at Transit Mail Office',
|
|
76
|
+
ITEM_RECEIVE: 'Item Received',
|
|
77
|
+
CUSTOM_RECEIVE: 'Item Presented to Customs',
|
|
78
|
+
CUSTOM_RETURN: 'Item Returned from Customs',
|
|
79
|
+
TRANSFER_OOE: 'Transferred to Office of Exchange',
|
|
80
|
+
};
|
|
81
|
+
/** Readable text for a code-shaped event such as `BAG_DISPATCH`; prose passes through. */
|
|
82
|
+
function eventText(raw) {
|
|
83
|
+
if (!/^[A-Za-z]+(?:_[A-Za-z0-9]+)+$/.test(raw))
|
|
84
|
+
return raw;
|
|
85
|
+
const code = raw.toUpperCase();
|
|
86
|
+
return EVENT_TEXT[code] ?? code.toLowerCase().split('_')
|
|
87
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The office's point from MySpeedPost's pincode directory. It is looked up by
|
|
91
|
+
* pincode, not by office: "KOLKATA FOREIGN LCAO 900056" comes back as an office
|
|
92
|
+
* in Delhi. Only a verified entry for the scan's own office is kept.
|
|
93
|
+
*/
|
|
94
|
+
function officePoint(rawEvent, office) {
|
|
95
|
+
const info = rawEvent.pincode_info;
|
|
96
|
+
if (!isRecord(info) || info.is_verified !== true)
|
|
97
|
+
return null;
|
|
98
|
+
const name = (value) => clean(value, 120).toLocaleUpperCase('en-US').replace(/[^A-Z0-9]+/g, ' ').trim();
|
|
99
|
+
if (!office || name(info.office_name) !== name(office))
|
|
100
|
+
return null;
|
|
101
|
+
const point = eventPoint(info.latitude, info.longitude);
|
|
102
|
+
// India's mainland and islands; anything else is a bad directory entry.
|
|
103
|
+
if (!point || point.latitude < 6 || point.latitude > 37 || point.longitude < 68 || point.longitude > 98)
|
|
104
|
+
return null;
|
|
105
|
+
return point;
|
|
106
|
+
}
|
|
107
|
+
export function parseIndiaPostTrackingHtml(html, trackingNumber) {
|
|
108
|
+
const requested = normalizeIndiaPostTrackingNumber(trackingNumber);
|
|
109
|
+
const $ = load(html);
|
|
110
|
+
const returned = clean($('#consignment_search').first().attr('value'), 64)
|
|
111
|
+
.toLocaleUpperCase('en-US')
|
|
112
|
+
.replace(/[\s.-]/g, '');
|
|
113
|
+
if (returned !== requested)
|
|
114
|
+
throw new SchemaError('India Post', 'India Post returned a different shipment');
|
|
115
|
+
const trackingRequest = parseTrackingRequest(html);
|
|
116
|
+
if (trackingRequest.tracking_status !== 'Completed') {
|
|
117
|
+
throw new SchemaError('India Post', 'India Post returned an incomplete tracking response');
|
|
118
|
+
}
|
|
119
|
+
if (!Array.isArray(trackingRequest.tracking_events)) {
|
|
120
|
+
throw new SchemaError('India Post', 'India Post returned invalid tracking events');
|
|
121
|
+
}
|
|
122
|
+
const rawEvents = trackingRequest.tracking_events;
|
|
123
|
+
const events = rawEvents.filter(isRecord);
|
|
124
|
+
if (events.length !== rawEvents.length || events.length === 0) {
|
|
125
|
+
throw new SchemaError('India Post', 'India Post returned invalid tracking events');
|
|
126
|
+
}
|
|
127
|
+
const parsed = [];
|
|
128
|
+
const seen = new Set();
|
|
129
|
+
events.slice(0, 500).forEach((rawEvent, index) => {
|
|
130
|
+
// tracked_at is ISO; offset-less values are read as Asia/Kolkata, the zone
|
|
131
|
+
// every India Post office stamps.
|
|
132
|
+
const time = isoTime(rawEvent.tracked_at, 'Asia/Kolkata', 100);
|
|
133
|
+
const description = eventText(clean(rawEvent.event));
|
|
134
|
+
if (!time || !description)
|
|
135
|
+
return;
|
|
136
|
+
const office = clean(rawEvent.office, 120);
|
|
137
|
+
const pincode = /^\d{6}$/.test(clean(rawEvent.pincode, 6))
|
|
138
|
+
? clean(rawEvent.pincode, 6)
|
|
139
|
+
: '';
|
|
140
|
+
const providerCode = clean(rawEvent.event_type, 100);
|
|
141
|
+
const point = officePoint(rawEvent, office);
|
|
142
|
+
const identity = JSON.stringify([time.iso, description, office, pincode, providerCode]);
|
|
143
|
+
if (seen.has(identity))
|
|
144
|
+
return;
|
|
145
|
+
seen.add(identity);
|
|
146
|
+
const classified = classifyIndiaPostEvent(rawEvent.event_type, rawEvent.event, rawEvent.remarks);
|
|
147
|
+
parsed.push({
|
|
148
|
+
// Office plus pincode is an operational location. Recipient identity,
|
|
149
|
+
// contact numbers and address blocks travel on the row and are
|
|
150
|
+
// deliberately never retained.
|
|
151
|
+
event: {
|
|
152
|
+
time: time.iso,
|
|
153
|
+
location: [office, pincode].filter(Boolean).join(' '),
|
|
154
|
+
description,
|
|
155
|
+
stage: classified.stage,
|
|
156
|
+
...(providerCode ? { provider_code: providerCode } : {}),
|
|
157
|
+
...(point ? { point } : {}),
|
|
158
|
+
},
|
|
159
|
+
classified,
|
|
160
|
+
timestamp: time.timestamp,
|
|
161
|
+
index,
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
parsed.sort((left, right) => right.timestamp - left.timestamp || right.index - left.index);
|
|
165
|
+
const latest = parsed[0];
|
|
166
|
+
if (!latest)
|
|
167
|
+
throw new SchemaError('India Post', 'India Post returned no usable tracking events');
|
|
168
|
+
const classified = latest.classified.status === 'unknown'
|
|
169
|
+
? { status: 'in_transit', stage: 'in_transit' }
|
|
170
|
+
: latest.classified;
|
|
171
|
+
const syncedAt = isoTime(trackingRequest.synced_at, 'UTC', 100);
|
|
172
|
+
return {
|
|
173
|
+
status: classified.status,
|
|
174
|
+
current_stage: classified.stage,
|
|
175
|
+
last_status_text: latest.event.description,
|
|
176
|
+
last_update: latest.event.time ?? null,
|
|
177
|
+
expected_delivery: null,
|
|
178
|
+
timezone: 'Asia/Kolkata',
|
|
179
|
+
// When MySpeedPost last asked India Post; an old value means stale history.
|
|
180
|
+
...(syncedAt ? { source_synced_at: syncedAt.iso } : {}),
|
|
181
|
+
events: parsed.slice(0, 100).map((item) => item.event),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function enumValue(value) {
|
|
185
|
+
return Array.isArray(value) && typeof value[0] === 'string' ? value[0] : '';
|
|
186
|
+
}
|
|
187
|
+
function parseTrackSnapshot(snapshot, trackingNumber) {
|
|
188
|
+
let parsed;
|
|
189
|
+
try {
|
|
190
|
+
parsed = JSON.parse(snapshot);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new SchemaError('India Post', 'India Post returned invalid Livewire state', { cause: error });
|
|
194
|
+
}
|
|
195
|
+
if (!isRecord(parsed) || !isRecord(parsed.data) || !isRecord(parsed.memo)
|
|
196
|
+
|| parsed.memo.name !== 'track-consignment') {
|
|
197
|
+
throw new SchemaError('India Post', 'India Post returned invalid Livewire state');
|
|
198
|
+
}
|
|
199
|
+
const returned = clean(parsed.data.consignment_number, 64)
|
|
200
|
+
.toLocaleUpperCase('en-US')
|
|
201
|
+
.replace(/[\s.-]/g, '');
|
|
202
|
+
if (returned !== trackingNumber)
|
|
203
|
+
throw new SchemaError('India Post', 'India Post returned a different shipment');
|
|
204
|
+
const status = enumValue(parsed.data.status);
|
|
205
|
+
if (!status)
|
|
206
|
+
throw new SchemaError('India Post', 'India Post returned an invalid tracking status');
|
|
207
|
+
return { snapshot, data: parsed.data, status };
|
|
208
|
+
}
|
|
209
|
+
function initialTrackComponent(html, trackingNumber) {
|
|
210
|
+
const $ = load(html);
|
|
211
|
+
for (const element of $('[wire\\:snapshot]').toArray()) {
|
|
212
|
+
const snapshot = $(element).attr('wire:snapshot');
|
|
213
|
+
if (!snapshot)
|
|
214
|
+
continue;
|
|
215
|
+
try {
|
|
216
|
+
const parsed = JSON.parse(snapshot);
|
|
217
|
+
if (isRecord(parsed) && isRecord(parsed.memo) && parsed.memo.name === 'track-consignment') {
|
|
218
|
+
return parseTrackSnapshot(snapshot, trackingNumber);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// A page can contain several unrelated Livewire components.
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
throw new SchemaError('India Post', 'India Post did not return its tracking component');
|
|
226
|
+
}
|
|
227
|
+
function csrfToken(html) {
|
|
228
|
+
const token = clean(load(html)('meta[name="csrf-token"]').attr('content'), 512);
|
|
229
|
+
if (!/^[A-Za-z0-9_-]{20,512}$/.test(token)) {
|
|
230
|
+
throw new SchemaError('India Post', 'India Post did not issue a tracking session token');
|
|
231
|
+
}
|
|
232
|
+
return token;
|
|
233
|
+
}
|
|
234
|
+
function parseLivewireUpdate(payload, trackingNumber) {
|
|
235
|
+
if (!isRecord(payload) || !Array.isArray(payload.components) || payload.components.length !== 1
|
|
236
|
+
|| !isRecord(payload.components[0])) {
|
|
237
|
+
throw new SchemaError('India Post', 'India Post returned an invalid Livewire response');
|
|
238
|
+
}
|
|
239
|
+
const rawComponent = payload.components[0];
|
|
240
|
+
if (typeof rawComponent.snapshot !== 'string') {
|
|
241
|
+
throw new SchemaError('India Post', 'India Post returned an invalid Livewire response');
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
component: parseTrackSnapshot(rawComponent.snapshot, trackingNumber),
|
|
245
|
+
effects: isRecord(rawComponent.effects) ? rawComponent.effects : {},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function dispatchNames(effects) {
|
|
249
|
+
if (!Array.isArray(effects.dispatches))
|
|
250
|
+
return new Set();
|
|
251
|
+
return new Set(effects.dispatches
|
|
252
|
+
.filter(isRecord)
|
|
253
|
+
.map((dispatch) => clean(dispatch.name, 100))
|
|
254
|
+
.filter(Boolean));
|
|
255
|
+
}
|
|
256
|
+
// Since 2026-09-24 Cloudflare also injects its passive detection loader
|
|
257
|
+
// (/cdn-cgi/challenge-platform/scripts/jsd/main.js) into ordinary answers, so
|
|
258
|
+
// only the interstitial's own markers count as a challenge.
|
|
259
|
+
function challengePage(status, html, headers) {
|
|
260
|
+
return [401, 403, 419, 429].includes(status)
|
|
261
|
+
|| headers.get('cf-mitigated') === 'challenge'
|
|
262
|
+
|| /Just a moment|Enable JavaScript and cookies|cf-chl-|_cf_chl_opt/i.test(html);
|
|
263
|
+
}
|
|
264
|
+
function pause(milliseconds) {
|
|
265
|
+
return milliseconds > 0
|
|
266
|
+
? new Promise((resolve) => setTimeout(resolve, milliseconds))
|
|
267
|
+
: Promise.resolve();
|
|
268
|
+
}
|
|
269
|
+
export class IndiaPostTracker {
|
|
270
|
+
timeoutMs;
|
|
271
|
+
pollIntervalMs;
|
|
272
|
+
maxPollAttempts;
|
|
273
|
+
fetcher;
|
|
274
|
+
now;
|
|
275
|
+
constructor(options = {}) {
|
|
276
|
+
this.now = options.now ?? (() => new Date());
|
|
277
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
278
|
+
this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
279
|
+
this.maxPollAttempts = options.maxPollAttempts ?? DEFAULT_MAX_POLL_ATTEMPTS;
|
|
280
|
+
this.fetcher = options.fetcher ?? fetch;
|
|
281
|
+
if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {
|
|
282
|
+
throw new TypeError('India Post timeout must be positive');
|
|
283
|
+
}
|
|
284
|
+
if (!Number.isFinite(this.pollIntervalMs) || this.pollIntervalMs < 0) {
|
|
285
|
+
throw new TypeError('India Post poll interval cannot be negative');
|
|
286
|
+
}
|
|
287
|
+
if (!Number.isInteger(this.maxPollAttempts) || this.maxPollAttempts < 1) {
|
|
288
|
+
throw new TypeError('India Post poll attempts must be positive');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
async request(fetcher, url, init) {
|
|
292
|
+
const result = await fetchBounded(url, init, {
|
|
293
|
+
provider: 'India Post tracking',
|
|
294
|
+
timeoutMs: this.timeoutMs,
|
|
295
|
+
maxBytes: MAX_RESPONSE_BYTES,
|
|
296
|
+
redirect: 'manual',
|
|
297
|
+
fetcher,
|
|
298
|
+
allowHttpError: true,
|
|
299
|
+
});
|
|
300
|
+
const html = decodeText(result.bytes);
|
|
301
|
+
if (challengePage(result.response.status, html, result.response.headers)) {
|
|
302
|
+
throw new IndiaPostChallengeError();
|
|
303
|
+
}
|
|
304
|
+
if (!result.response.ok) {
|
|
305
|
+
throw new UpstreamHttpError('India Post tracking', result.response.status);
|
|
306
|
+
}
|
|
307
|
+
return { bytes: result.bytes, html };
|
|
308
|
+
}
|
|
309
|
+
async update(fetcher, trackingNumber, pageUrl, token, snapshot, calls, updates = {}) {
|
|
310
|
+
const result = await this.request(fetcher, LIVEWIRE_UPDATE, {
|
|
311
|
+
method: 'POST',
|
|
312
|
+
headers: {
|
|
313
|
+
Accept: 'application/json',
|
|
314
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
315
|
+
'Content-Type': 'application/json',
|
|
316
|
+
Origin: 'https://myspeedpost.com',
|
|
317
|
+
Referer: pageUrl,
|
|
318
|
+
'User-Agent': USER_AGENT,
|
|
319
|
+
'X-Livewire': '',
|
|
320
|
+
},
|
|
321
|
+
body: JSON.stringify({
|
|
322
|
+
_token: token,
|
|
323
|
+
components: [{ snapshot, updates, calls }],
|
|
324
|
+
}),
|
|
325
|
+
});
|
|
326
|
+
return parseLivewireUpdate(parseJsonBytes(result.bytes, 'India Post tracking'), trackingNumber);
|
|
327
|
+
}
|
|
328
|
+
async fetch(trackingNumber) {
|
|
329
|
+
const normalized = normalizeIndiaPostTrackingNumber(trackingNumber);
|
|
330
|
+
const pageUrl = indiaPostTrackingUrl(normalized);
|
|
331
|
+
// The Livewire flow is stateful: the session cookie issued with the page
|
|
332
|
+
// must travel with every /livewire/update call, so the jar is per lookup.
|
|
333
|
+
const fetcher = makeFetchCookie(this.fetcher, new CookieJar());
|
|
334
|
+
const page = await this.request(fetcher, pageUrl, {
|
|
335
|
+
headers: {
|
|
336
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
337
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
338
|
+
'User-Agent': USER_AGENT,
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
const initial = initialTrackComponent(page.html, normalized);
|
|
342
|
+
if (initial.status === 'Completed') {
|
|
343
|
+
const cached = parseIndiaPostTrackingHtml(page.html, normalized);
|
|
344
|
+
const syncedAt = Date.parse(String(cached.source_synced_at ?? ''));
|
|
345
|
+
if (Number.isFinite(syncedAt) && this.now().getTime() - syncedAt < REFRESH_AFTER_MS)
|
|
346
|
+
return cached;
|
|
347
|
+
// What the page's Refresh button sends. A failed refresh still leaves
|
|
348
|
+
// the cached history, which is better than no answer.
|
|
349
|
+
try {
|
|
350
|
+
return await this.complete(fetcher, normalized, pageUrl, csrfToken(page.html), initial.snapshot, [{
|
|
351
|
+
path: '',
|
|
352
|
+
method: '__dispatch',
|
|
353
|
+
params: ['refresh_consignment', { userTimezone: USER_TIMEZONE }],
|
|
354
|
+
}], { userTimezone: USER_TIMEZONE });
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
return cached;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (!['New', 'Processing'].includes(initial.status)) {
|
|
361
|
+
throw new SchemaError('India Post', 'India Post returned an unsupported tracking state');
|
|
362
|
+
}
|
|
363
|
+
const token = csrfToken(page.html);
|
|
364
|
+
return initial.status === 'Processing'
|
|
365
|
+
? this.complete(fetcher, normalized, pageUrl, token, initial.snapshot, [{
|
|
366
|
+
path: '',
|
|
367
|
+
method: 'fetchStatus',
|
|
368
|
+
params: [],
|
|
369
|
+
}])
|
|
370
|
+
: this.complete(fetcher, normalized, pageUrl, token, initial.snapshot, [{
|
|
371
|
+
path: '',
|
|
372
|
+
method: '__dispatch',
|
|
373
|
+
params: ['set_consignment_number', { consignment_number: normalized }],
|
|
374
|
+
}, {
|
|
375
|
+
path: '',
|
|
376
|
+
method: 'submit',
|
|
377
|
+
params: [USER_TIMEZONE],
|
|
378
|
+
}], { userTimezone: USER_TIMEZONE });
|
|
379
|
+
}
|
|
380
|
+
/** Send the first calls, then poll `fetchStatus` until the component completes. */
|
|
381
|
+
async complete(fetcher, normalized, pageUrl, token, snapshot, calls, updates = {}) {
|
|
382
|
+
let update = await this.update(fetcher, normalized, pageUrl, token, snapshot, calls, updates);
|
|
383
|
+
for (let attempt = 0; attempt <= this.maxPollAttempts; attempt += 1) {
|
|
384
|
+
const names = dispatchNames(update.effects);
|
|
385
|
+
if (names.has('consignment_not_found'))
|
|
386
|
+
throw new NotFoundError('India Post');
|
|
387
|
+
if (update.component.status === 'Completed') {
|
|
388
|
+
const html = typeof update.effects.html === 'string' ? update.effects.html : '';
|
|
389
|
+
if (!html)
|
|
390
|
+
throw new SchemaError('India Post', 'India Post returned an empty completed response');
|
|
391
|
+
return parseIndiaPostTrackingHtml(html, normalized);
|
|
392
|
+
}
|
|
393
|
+
if (update.component.status !== 'Processing') {
|
|
394
|
+
throw new SchemaError('India Post', 'India Post returned an unsupported tracking state');
|
|
395
|
+
}
|
|
396
|
+
if (attempt === this.maxPollAttempts)
|
|
397
|
+
break;
|
|
398
|
+
await pause(this.pollIntervalMs);
|
|
399
|
+
update = await this.update(fetcher, normalized, pageUrl, token, update.component.snapshot, [{ path: '', method: 'fetchStatus', params: [] }]);
|
|
400
|
+
}
|
|
401
|
+
// The backend kept saying "Processing": it answered, but it proved nothing
|
|
402
|
+
// about the shipment, so this must not become a not-found cooldown.
|
|
403
|
+
throw new IndeterminateError('India Post', 'India Post tracking did not complete in time');
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
export const adapter = (environment) => {
|
|
407
|
+
const tracker = new IndiaPostTracker({ fetcher: environment.fetcher });
|
|
408
|
+
return {
|
|
409
|
+
id: 'india-post',
|
|
410
|
+
// The Livewire submit-and-poll cycle is part of the direct call: it is one
|
|
411
|
+
// stateful conversation with one host, not a fallback tier.
|
|
412
|
+
steps: ['direct'],
|
|
413
|
+
track: (input) => tracker.fetch(input.number),
|
|
414
|
+
};
|
|
415
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "india-post",
|
|
3
|
+
"displayName": "India Post",
|
|
4
|
+
"aliases": [
|
|
5
|
+
"Speed Post",
|
|
6
|
+
"India Post Speed Post",
|
|
7
|
+
"Department of Posts"
|
|
8
|
+
],
|
|
9
|
+
"region": {
|
|
10
|
+
"countries": [
|
|
11
|
+
"IN"
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"brand": {
|
|
15
|
+
"color": "#b82025"
|
|
16
|
+
},
|
|
17
|
+
"selectable": true,
|
|
18
|
+
"timezone": "Asia/Kolkata",
|
|
19
|
+
"tracking": {
|
|
20
|
+
"mode": "automatic",
|
|
21
|
+
"adapter": "india-post",
|
|
22
|
+
"steps": [
|
|
23
|
+
"direct"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"capabilities": [
|
|
27
|
+
"history",
|
|
28
|
+
"location",
|
|
29
|
+
"provider_code"
|
|
30
|
+
],
|
|
31
|
+
"portal": {
|
|
32
|
+
"url": "https://myspeedpost.com/track?n={trackingNumber}&sync=true",
|
|
33
|
+
"canaryUrl": "https://myspeedpost.com/track",
|
|
34
|
+
"shows": [
|
|
35
|
+
"status",
|
|
36
|
+
"history",
|
|
37
|
+
"location",
|
|
38
|
+
"recipient_name",
|
|
39
|
+
"recipient_address",
|
|
40
|
+
"signature"
|
|
41
|
+
],
|
|
42
|
+
"scraped": [
|
|
43
|
+
"status",
|
|
44
|
+
"history",
|
|
45
|
+
"location",
|
|
46
|
+
"provider_code"
|
|
47
|
+
],
|
|
48
|
+
"discarded": [
|
|
49
|
+
"recipient_name",
|
|
50
|
+
"recipient_address",
|
|
51
|
+
"signature"
|
|
52
|
+
],
|
|
53
|
+
"unavailable": []
|
|
54
|
+
},
|
|
55
|
+
"links": [
|
|
56
|
+
{
|
|
57
|
+
"domains": [
|
|
58
|
+
"myspeedpost.com"
|
|
59
|
+
],
|
|
60
|
+
"params": [
|
|
61
|
+
"n"
|
|
62
|
+
],
|
|
63
|
+
"path": "^/s/([^/?#]+)/?$"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"detection": [
|
|
67
|
+
{
|
|
68
|
+
"id": "india-post-1",
|
|
69
|
+
"pattern": "^[A-Z]{2}\\d{9}IN$",
|
|
70
|
+
"confidence": "high",
|
|
71
|
+
"checksum": "s10"
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "india-post",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "ED415656540IN",
|
|
6
|
+
"role": "shipment",
|
|
7
|
+
"evidence": "open_source_example",
|
|
8
|
+
"source": {
|
|
9
|
+
"url": "https://gist.github.com/zxp/e83a4a1b7294a5ed6207",
|
|
10
|
+
"date": "2015-08-29"
|
|
11
|
+
},
|
|
12
|
+
"expect": {
|
|
13
|
+
"carrier": "india-post",
|
|
14
|
+
"confidence": "high"
|
|
15
|
+
},
|
|
16
|
+
"note": "Open-source project example, not a real shipment."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"number": "JN067614884IN",
|
|
20
|
+
"role": "shipment",
|
|
21
|
+
"evidence": "synthetic",
|
|
22
|
+
"derivedFrom": "official_shape",
|
|
23
|
+
"shapeConfirmed": "2026-09-12",
|
|
24
|
+
"expect": {
|
|
25
|
+
"carrier": "india-post",
|
|
26
|
+
"confidence": "high"
|
|
27
|
+
},
|
|
28
|
+
"note": "Made-up number that follows the published format."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"number": "JN067614885IN",
|
|
32
|
+
"role": "shipment",
|
|
33
|
+
"evidence": "synthetic",
|
|
34
|
+
"derivedFrom": "invented",
|
|
35
|
+
"shapeConfirmed": "2026-09-12",
|
|
36
|
+
"expect": {
|
|
37
|
+
"carrier": "unknown",
|
|
38
|
+
"confidence": "low",
|
|
39
|
+
"candidates": [
|
|
40
|
+
"chronopost"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"note": "Invented placeholder used as a shape check. Filed under India Post, which no rule claims."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"number": "RR000000005IN",
|
|
47
|
+
"role": "shipment",
|
|
48
|
+
"evidence": "synthetic",
|
|
49
|
+
"derivedFrom": "official_shape",
|
|
50
|
+
"shapeConfirmed": "2026-09-12",
|
|
51
|
+
"expect": {
|
|
52
|
+
"carrier": "india-post",
|
|
53
|
+
"confidence": "high"
|
|
54
|
+
},
|
|
55
|
+
"note": "Invented S10 identifier with a valid check digit."
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* India Post status vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* The tracking rows carry no stable status code: `event_type`, `event` and
|
|
5
|
+
* `remarks` are all English prose that India Post words differently per office.
|
|
6
|
+
* So this classifier normalizes the three of them into one alphanumeric key and
|
|
7
|
+
* matches substrings, most specific first — returns and failures before
|
|
8
|
+
* deliveries, deliveries before pickups, pickups before generic movement.
|
|
9
|
+
*
|
|
10
|
+
* The fallback is `{ status: 'unknown', stage: 'in_transit' }`: every row here
|
|
11
|
+
* is a physical scan, so "something moved" is the safe reading, while the
|
|
12
|
+
* `unknown` status lets the caller see that nothing was actually recognized.
|
|
13
|
+
*
|
|
14
|
+
* Provenance: the MySpeedPost Livewire tracker inspected 2026-09-01, with
|
|
15
|
+
* https://github.com/bivu-m/njs-tracker-scraper as the starting point.
|
|
16
|
+
*/
|
|
17
|
+
import type { ClassifiedStatus } from '../../core/status/index.js';
|
|
18
|
+
/**
|
|
19
|
+
* Classify one row from its `event_type`, `event` and `remarks`. Never
|
|
20
|
+
* undefined: an unrecognized row falls back to an `unknown` status on an
|
|
21
|
+
* `in_transit` stage.
|
|
22
|
+
*/
|
|
23
|
+
export declare function classifyIndiaPostEvent(...values: unknown[]): ClassifiedStatus;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { cleanScalar } from '../../core/transport/index.js';
|
|
2
|
+
function statusKey(value) {
|
|
3
|
+
return cleanScalar(value, 200).toLocaleLowerCase('en-US').replace(/[^a-z0-9]+/g, '');
|
|
4
|
+
}
|
|
5
|
+
function includesAny(value, candidates) {
|
|
6
|
+
return candidates.some((candidate) => value.includes(candidate));
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Classify one row from its `event_type`, `event` and `remarks`. Never
|
|
10
|
+
* undefined: an unrecognized row falls back to an `unknown` status on an
|
|
11
|
+
* `in_transit` stage.
|
|
12
|
+
*/
|
|
13
|
+
export function classifyIndiaPostEvent(...values) {
|
|
14
|
+
const key = values.map(statusKey).filter(Boolean).join(' ');
|
|
15
|
+
if (includesAny(key, [
|
|
16
|
+
'returntosender',
|
|
17
|
+
'returnedtocustomer',
|
|
18
|
+
'returnedtobookingoffice',
|
|
19
|
+
'returnitem',
|
|
20
|
+
]))
|
|
21
|
+
return { status: 'exception', stage: 'returned' };
|
|
22
|
+
if (includesAny(key, [
|
|
23
|
+
'insufficientaddress',
|
|
24
|
+
'addresseecannotbelocated',
|
|
25
|
+
'damaged',
|
|
26
|
+
'refused',
|
|
27
|
+
'lost',
|
|
28
|
+
]))
|
|
29
|
+
return { status: 'exception', stage: 'exception' };
|
|
30
|
+
if (includesAny(key, [
|
|
31
|
+
'deliveryattempted',
|
|
32
|
+
'deliveryfailed',
|
|
33
|
+
'notdelivered',
|
|
34
|
+
'undelivered',
|
|
35
|
+
]))
|
|
36
|
+
return { status: 'exception', stage: 'failed_attempt' };
|
|
37
|
+
if (includesAny(key, [
|
|
38
|
+
'itemdelivered',
|
|
39
|
+
'deliveredtorecipient',
|
|
40
|
+
'delivereddelivery',
|
|
41
|
+
]))
|
|
42
|
+
return { status: 'delivered', stage: 'delivered' };
|
|
43
|
+
if (includesAny(key, [
|
|
44
|
+
'readyforpickup',
|
|
45
|
+
'readyforcollection',
|
|
46
|
+
'awaitingcollection',
|
|
47
|
+
]))
|
|
48
|
+
return { status: 'out_for_delivery', stage: 'ready_for_pickup' };
|
|
49
|
+
if (includesAny(key, [
|
|
50
|
+
'outfordelivery',
|
|
51
|
+
'itemoutfordelivery',
|
|
52
|
+
'sentfordelivery',
|
|
53
|
+
]))
|
|
54
|
+
return { status: 'out_for_delivery', stage: 'out_for_delivery' };
|
|
55
|
+
// Customs handing the item back (CUSTOM_RETURN, "returned from export
|
|
56
|
+
// Customs/Security", "released by export Customs") ends the customs step.
|
|
57
|
+
if (includesAny(key, [
|
|
58
|
+
'customreturn',
|
|
59
|
+
'returnedfromexportcustoms',
|
|
60
|
+
'returnedfromcustoms',
|
|
61
|
+
'releasedbyexportcustoms',
|
|
62
|
+
'releasedbycustoms',
|
|
63
|
+
]))
|
|
64
|
+
return { status: 'in_transit', stage: 'in_transit' };
|
|
65
|
+
if (includesAny(key, ['customs', 'customclearance', 'customreceive'])) {
|
|
66
|
+
return { status: 'in_transit', stage: 'customs' };
|
|
67
|
+
}
|
|
68
|
+
if (includesAny(key, ['itembook', 'articlebooked', 'bookingconfirmed'])) {
|
|
69
|
+
return { status: 'pending', stage: 'accepted' };
|
|
70
|
+
}
|
|
71
|
+
if (includesAny(key, [
|
|
72
|
+
'shipmentinformationreceived',
|
|
73
|
+
'labelcreated',
|
|
74
|
+
'articlecreated',
|
|
75
|
+
'consignmentcreated',
|
|
76
|
+
]))
|
|
77
|
+
return { status: 'pending', stage: 'registered' };
|
|
78
|
+
if (includesAny(key, [
|
|
79
|
+
'itembagged',
|
|
80
|
+
'itemdispatched',
|
|
81
|
+
'itemreceived',
|
|
82
|
+
'receivedat',
|
|
83
|
+
'departed',
|
|
84
|
+
'arrived',
|
|
85
|
+
'forwarded',
|
|
86
|
+
'intransit',
|
|
87
|
+
'handedover',
|
|
88
|
+
// Codes India Post sends since 2026-09 (BAG_DISPATCH, TRANSFER_OOE...).
|
|
89
|
+
'inducted',
|
|
90
|
+
'bagclose',
|
|
91
|
+
'bagdispatch',
|
|
92
|
+
'bagforward',
|
|
93
|
+
'tmoreceive',
|
|
94
|
+
'itemreceive',
|
|
95
|
+
'transferooe',
|
|
96
|
+
]))
|
|
97
|
+
return { status: 'in_transit', stage: 'in_transit' };
|
|
98
|
+
return { status: 'unknown', stage: 'in_transit' };
|
|
99
|
+
}
|