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,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "yunda",
|
|
3
|
+
"displayName": "Yunda Express",
|
|
4
|
+
"aliases": [],
|
|
5
|
+
"region": {
|
|
6
|
+
"countries": [
|
|
7
|
+
"CN"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
"brand": {
|
|
11
|
+
"color": "#ffce00"
|
|
12
|
+
},
|
|
13
|
+
"selectable": true,
|
|
14
|
+
"timezone": "Asia/Shanghai",
|
|
15
|
+
"tracking": {
|
|
16
|
+
"mode": "automatic",
|
|
17
|
+
"adapter": "yunda",
|
|
18
|
+
"steps": [
|
|
19
|
+
"direct"
|
|
20
|
+
],
|
|
21
|
+
"localClocks": true
|
|
22
|
+
},
|
|
23
|
+
"capabilities": [
|
|
24
|
+
"history",
|
|
25
|
+
"location"
|
|
26
|
+
],
|
|
27
|
+
"portal": {
|
|
28
|
+
"url": "https://web.yundaex.com/infoInquiry?nav_id=262&cid=0&homeWaybill={trackingNumber}",
|
|
29
|
+
"canaryUrl": "https://web.yundaex.com/infoInquiry",
|
|
30
|
+
"shows": [
|
|
31
|
+
"status",
|
|
32
|
+
"history",
|
|
33
|
+
"location"
|
|
34
|
+
],
|
|
35
|
+
"scraped": [
|
|
36
|
+
"status",
|
|
37
|
+
"history",
|
|
38
|
+
"location"
|
|
39
|
+
],
|
|
40
|
+
"discarded": [
|
|
41
|
+
"contact_details",
|
|
42
|
+
"recipient_details",
|
|
43
|
+
"collection_addresses",
|
|
44
|
+
"signature_images",
|
|
45
|
+
"unlabelled_weight"
|
|
46
|
+
],
|
|
47
|
+
"unavailable": [
|
|
48
|
+
"eta",
|
|
49
|
+
"pickup_point"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"links": [
|
|
53
|
+
{
|
|
54
|
+
"domains": [
|
|
55
|
+
"web.yundaex.com"
|
|
56
|
+
],
|
|
57
|
+
"params": [
|
|
58
|
+
"homeWaybill"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"detection": [
|
|
63
|
+
{
|
|
64
|
+
"id": "yunda-1",
|
|
65
|
+
"pattern": "^\\d{13}(?:\\d{2})?$",
|
|
66
|
+
"confidence": "low"
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { loadSharp } from '../../core/transport/optional.js';
|
|
2
|
+
import { ChallengeError, SchemaError } from '../../core/errors/index.js';
|
|
3
|
+
import { isRecord } from '../../core/types.js';
|
|
4
|
+
const PROVIDER = 'Yunda Express';
|
|
5
|
+
const PNG = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
6
|
+
async function pixels(raw, width, height) {
|
|
7
|
+
if (typeof raw !== 'string' || raw.length > 700_000 || !/^[A-Za-z\d+/]+={0,2}$/.test(raw))
|
|
8
|
+
throw new SchemaError(PROVIDER, 'Yunda returned an invalid challenge image');
|
|
9
|
+
const bytes = Buffer.from(raw, 'base64');
|
|
10
|
+
if (!bytes.subarray(0, 8).equals(PNG))
|
|
11
|
+
throw new SchemaError(PROVIDER, 'Yunda returned an unsupported challenge image');
|
|
12
|
+
try {
|
|
13
|
+
const sharp = await loadSharp('Yunda');
|
|
14
|
+
const decoder = sharp(bytes, { limitInputPixels: 60_000, failOn: 'warning' });
|
|
15
|
+
const metadata = await decoder.metadata();
|
|
16
|
+
if (metadata.format !== 'png' || metadata.width !== width || metadata.height !== height || (width === 40 && !metadata.hasAlpha)) {
|
|
17
|
+
throw new ChallengeError(PROVIDER, 'Yunda changed its slider image layout');
|
|
18
|
+
}
|
|
19
|
+
return await decoder.toColourspace('srgb').ensureAlpha().raw().toBuffer();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof ChallengeError)
|
|
23
|
+
throw error;
|
|
24
|
+
throw new SchemaError(PROVIDER, 'Yunda returned an undecodable challenge image', { cause: error });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** The current client's native PNG geometry, not rendered browser coordinates. */
|
|
28
|
+
export async function solveYundaSlider(value, signal) {
|
|
29
|
+
signal?.throwIfAborted();
|
|
30
|
+
if (!isRecord(value) || !Number.isInteger(value.y) || Number(value.y) < 0 || Number(value.y) > 112)
|
|
31
|
+
throw new SchemaError(PROVIDER, 'Yunda returned an invalid slider row');
|
|
32
|
+
const [big, small] = await Promise.all([pixels(value.big, 344, 152), pixels(value.small, 40, 40)]);
|
|
33
|
+
signal?.throwIfAborted();
|
|
34
|
+
let maskSize = 0;
|
|
35
|
+
for (let i = 3; i < small.length; i += 4)
|
|
36
|
+
if (small[i] > 127)
|
|
37
|
+
maskSize++;
|
|
38
|
+
if (maskSize < 200 || maskSize > 1400)
|
|
39
|
+
throw new ChallengeError(PROVIDER, 'Yunda returned an unsupported slider outline');
|
|
40
|
+
const y = Number(value.y);
|
|
41
|
+
const scores = [];
|
|
42
|
+
// The deployed challenge removes the piece with white fill. Texture cannot
|
|
43
|
+
// match missing pixels; compare the transparent piece outline to that gap.
|
|
44
|
+
// The official moveX/sliderUp handler rejects coordinates above 300 even
|
|
45
|
+
// though the image has four additional pixels at the right edge.
|
|
46
|
+
for (let x = 0; x <= 300; x++) {
|
|
47
|
+
let overlap = 0;
|
|
48
|
+
let white = 0;
|
|
49
|
+
for (let row = 0; row < 40; row++)
|
|
50
|
+
for (let col = 0; col < 40; col++) {
|
|
51
|
+
const source = ((row + y) * 344 + x + col) * 4;
|
|
52
|
+
const hole = big[source] >= 250 && big[source + 1] >= 250 && big[source + 2] >= 250;
|
|
53
|
+
if (hole) {
|
|
54
|
+
white++;
|
|
55
|
+
if (small[(row * 40 + col) * 4 + 3] > 127)
|
|
56
|
+
overlap++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
scores.push({ x, score: 2 * overlap / (maskSize + white) });
|
|
60
|
+
}
|
|
61
|
+
scores.sort((a, b) => b.score - a.score);
|
|
62
|
+
const best = scores[0];
|
|
63
|
+
const other = scores.find(candidate => Math.abs(candidate.x - best.x) > 3);
|
|
64
|
+
if (best.score < 0.98 || best.score - other.score < 0.1)
|
|
65
|
+
throw new ChallengeError(PROVIDER, 'Yunda slider match is uncertain');
|
|
66
|
+
signal?.throwIfAborted();
|
|
67
|
+
return { x: best.x, y };
|
|
68
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "yunda",
|
|
3
|
+
"records": [
|
|
4
|
+
{
|
|
5
|
+
"number": "1000478495775",
|
|
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": "unknown",
|
|
14
|
+
"confidence": "low",
|
|
15
|
+
"candidates": [
|
|
16
|
+
"dpd-fr",
|
|
17
|
+
"la-poste",
|
|
18
|
+
"correos-chile",
|
|
19
|
+
"delhivery",
|
|
20
|
+
"yunda"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"note": "Open-source project example, not a real shipment. The source attributes it to Yunda Express, which stays one candidate among several."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"number": "000000000000001",
|
|
27
|
+
"role": "shipment",
|
|
28
|
+
"evidence": "synthetic",
|
|
29
|
+
"derivedFrom": "official_shape",
|
|
30
|
+
"shapeConfirmed": "2026-09-28",
|
|
31
|
+
"expect": {
|
|
32
|
+
"carrier": "unknown",
|
|
33
|
+
"confidence": "low",
|
|
34
|
+
"candidates": [
|
|
35
|
+
"fedex",
|
|
36
|
+
"dpd-fr",
|
|
37
|
+
"yunda"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"note": "Synthetic domestic waybill shape; its length is shared with FedEx and DPD France, so it stays ambiguous."
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
2
|
+
export declare function normalizeYundaNumber(raw: string): string;
|
|
3
|
+
export declare function yundaEnvelope(payload: unknown): Record<string, unknown>;
|
|
4
|
+
export declare function parseYunda(payload: unknown, trackingNumber: string): CarrierResult;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { normalizeTrackingNumber } from '../../core/detection/index.js';
|
|
2
|
+
import { ChallengeError, IndeterminateError, InputRequiredError, SchemaError } from '../../core/errors/index.js';
|
|
3
|
+
import { zonedTime } from '../../core/time/index.js';
|
|
4
|
+
import { clean } from '../../core/transport/index.js';
|
|
5
|
+
import { isRecord } from '../../core/types.js';
|
|
6
|
+
import { yundaStatus } from './status.js';
|
|
7
|
+
const PROVIDER = 'Yunda Express';
|
|
8
|
+
const ZONE = 'Asia/Shanghai';
|
|
9
|
+
export function normalizeYundaNumber(raw) {
|
|
10
|
+
const number = normalizeTrackingNumber(raw);
|
|
11
|
+
// The domestic client's documented lengths. It routes 76/77 international
|
|
12
|
+
// identifiers to the international website instead of this consumer feed.
|
|
13
|
+
if (!/^\d{13}(?:\d{2})?$/.test(number) || /^(?:76|77)/.test(number)) {
|
|
14
|
+
throw new InputRequiredError(PROVIDER, 'number', 'Yunda direct tracking requires a domestic waybill number');
|
|
15
|
+
}
|
|
16
|
+
return number;
|
|
17
|
+
}
|
|
18
|
+
export function yundaEnvelope(payload) {
|
|
19
|
+
if (!isRecord(payload) || !Number.isInteger(payload.code))
|
|
20
|
+
throw new SchemaError(PROVIDER, 'Yunda returned an invalid response envelope');
|
|
21
|
+
if (payload.code !== 200) {
|
|
22
|
+
const message = clean(payload.msg, 200);
|
|
23
|
+
if (payload.code === 401 || /验证码|验证失败|校验失败|滑块|captcha/i.test(message))
|
|
24
|
+
throw new ChallengeError(PROVIDER);
|
|
25
|
+
// Even a body code of 404 can mean a generic API error or empty old history.
|
|
26
|
+
throw new IndeterminateError(PROVIDER, 'Yunda returned an inconclusive API error');
|
|
27
|
+
}
|
|
28
|
+
return payload;
|
|
29
|
+
}
|
|
30
|
+
function identityMap(value) {
|
|
31
|
+
// PHP encodes its empty associative maps as [] rather than {}.
|
|
32
|
+
if (Array.isArray(value) && value.length === 0)
|
|
33
|
+
return {};
|
|
34
|
+
if (!isRecord(value))
|
|
35
|
+
throw new SchemaError(PROVIDER, 'Yunda returned an invalid identity map');
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
export function parseYunda(payload, trackingNumber) {
|
|
39
|
+
const number = normalizeYundaNumber(trackingNumber);
|
|
40
|
+
const envelope = yundaEnvelope(payload);
|
|
41
|
+
if (!isRecord(envelope.data))
|
|
42
|
+
throw new SchemaError(PROVIDER);
|
|
43
|
+
const orders = identityMap(envelope.data.order);
|
|
44
|
+
const histories = identityMap(envelope.data.logistic);
|
|
45
|
+
if ([...Object.keys(orders), ...Object.keys(histories)].some(identity => identity !== number)) {
|
|
46
|
+
throw new SchemaError(PROVIDER, 'Yunda returned a different or ambiguous shipment identity');
|
|
47
|
+
}
|
|
48
|
+
const history = histories[number];
|
|
49
|
+
if (history === undefined)
|
|
50
|
+
throw new IndeterminateError(PROVIDER, 'Yunda returned no domestic history');
|
|
51
|
+
if (!isRecord(history) || !Array.isArray(history.gn) || !Array.isArray(history.gj) || history.gn.length > 1000)
|
|
52
|
+
throw new SchemaError(PROVIDER);
|
|
53
|
+
if (!history.gn.length)
|
|
54
|
+
throw new IndeterminateError(PROVIDER, 'Yunda returned no domestic scans');
|
|
55
|
+
// The official client reverses this oldest-first domestic list for display.
|
|
56
|
+
// Keep its order when a clock is absent or malformed rather than sorting it
|
|
57
|
+
// among dated events or borrowing another event's time.
|
|
58
|
+
const events = [];
|
|
59
|
+
let returning = false;
|
|
60
|
+
for (const raw of history.gn) {
|
|
61
|
+
if (!isRecord(raw) || normalizeTrackingNumber(clean(raw.mailNo, 64)) !== number) {
|
|
62
|
+
throw new SchemaError(PROVIDER, 'Yunda returned mixed or incomplete scan identities');
|
|
63
|
+
}
|
|
64
|
+
const label = clean(raw.status, 100);
|
|
65
|
+
if (!label)
|
|
66
|
+
throw new SchemaError(PROVIDER, 'Yunda returned a scan with no status');
|
|
67
|
+
const detail = clean(raw.trackRecord, 1500);
|
|
68
|
+
// An explicit return scan or sender signature establishes the leg.
|
|
69
|
+
// Instructions such as "contact us if you need to return it" do not.
|
|
70
|
+
if (/签收人(?:是|为|[::])\s*(?:寄件人|发件人|退回)|已(?:退回|返回)(?:寄件人|发件人|寄件网点)|退回件扫描/.test(detail))
|
|
71
|
+
returning = true;
|
|
72
|
+
const mapped = yundaStatus(label);
|
|
73
|
+
const stage = returning && mapped?.stage === 'delivered' ? 'returned' : mapped?.stage;
|
|
74
|
+
const description = returning && mapped?.stage === 'delivered' ? 'Returned to the sender'
|
|
75
|
+
: returning && mapped?.stage === 'out_for_delivery' ? 'Out for delivery back to the sender'
|
|
76
|
+
: returning && mapped?.stage === 'ready_for_pickup' ? 'Ready for pickup on its way back'
|
|
77
|
+
: mapped?.wording ?? label;
|
|
78
|
+
const clock = clean(raw.scanTm, 64);
|
|
79
|
+
const time = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(clock)
|
|
80
|
+
? zonedTime(clock, 'yyyy-MM-dd HH:mm:ss', ZONE)?.iso : null;
|
|
81
|
+
// The bracketed city is a separate coarse location. The remaining prose
|
|
82
|
+
// includes courier phones, names and pickup/recipient addresses.
|
|
83
|
+
const location = /^【([\p{Script=Han}]{1,30}(?:市|县|区))】/u.exec(detail)?.[1];
|
|
84
|
+
events.push({ description, provider_code: label,
|
|
85
|
+
...(time ? { time } : clock ? { provider_time_text: clock } : {}),
|
|
86
|
+
...(location ? { location } : {}), ...(stage ? { stage } : {}),
|
|
87
|
+
...(returning ? { provider_leg: 'return' } : {}) });
|
|
88
|
+
}
|
|
89
|
+
const seen = new Set();
|
|
90
|
+
const unique = events.reverse().filter(event => {
|
|
91
|
+
const key = JSON.stringify(event);
|
|
92
|
+
if (seen.has(key))
|
|
93
|
+
return false;
|
|
94
|
+
seen.add(key);
|
|
95
|
+
return true;
|
|
96
|
+
});
|
|
97
|
+
const latest = unique[0];
|
|
98
|
+
const mapped = yundaStatus(latest.provider_code);
|
|
99
|
+
const returned = latest.stage === 'returned';
|
|
100
|
+
return { status: returned ? 'exception' : mapped?.status ?? 'unknown',
|
|
101
|
+
...(latest.stage ? { current_stage: latest.stage } : {}),
|
|
102
|
+
timezone: ZONE, last_status_text: latest.description, last_update: latest.time ?? null,
|
|
103
|
+
...(mapped?.stage === 'delivered' && !returned && latest.time ? { delivered_at: latest.time } : {}),
|
|
104
|
+
events: unique.slice(0, 100) };
|
|
105
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// The current consumer site's status labels and its published sample history.
|
|
2
|
+
const STATUSES = {
|
|
3
|
+
'已揽件': { status: 'in_transit', stage: 'accepted', wording: 'Picked up' },
|
|
4
|
+
'运输中': { status: 'in_transit', stage: 'in_transit', wording: 'In transit' },
|
|
5
|
+
'派送中': { status: 'in_transit', stage: 'out_for_delivery', wording: 'Out for delivery' },
|
|
6
|
+
'待取件': { status: 'in_transit', stage: 'ready_for_pickup', wording: 'Ready for pickup' },
|
|
7
|
+
'已签收': { status: 'delivered', stage: 'delivered', wording: 'Delivered' },
|
|
8
|
+
};
|
|
9
|
+
export const yundaStatus = (label) => Object.hasOwn(STATUSES, label.trim()) ? STATUSES[label.trim()] : null;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"carrier": "yunda",
|
|
3
|
+
"entries": [
|
|
4
|
+
{
|
|
5
|
+
"wording": "已揽件",
|
|
6
|
+
"language": "zh",
|
|
7
|
+
"stage": "accepted",
|
|
8
|
+
"confirmedBy": "documentation",
|
|
9
|
+
"note": "Exact domestic status label in the official consumer website."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"wording": "运输中",
|
|
13
|
+
"language": "zh",
|
|
14
|
+
"stage": "in_transit",
|
|
15
|
+
"confirmedBy": "documentation",
|
|
16
|
+
"note": "Exact domestic status label in the official consumer website."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"wording": "派送中",
|
|
20
|
+
"language": "zh",
|
|
21
|
+
"stage": "out_for_delivery",
|
|
22
|
+
"confirmedBy": "live",
|
|
23
|
+
"note": "Exact domestic status label in the official consumer website."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"wording": "待取件",
|
|
27
|
+
"language": "zh",
|
|
28
|
+
"stage": "ready_for_pickup",
|
|
29
|
+
"confirmedBy": "documentation",
|
|
30
|
+
"note": "Exact domestic status label in the official consumer website."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"wording": "已签收",
|
|
34
|
+
"language": "zh",
|
|
35
|
+
"stage": "delivered",
|
|
36
|
+
"confirmedBy": "live",
|
|
37
|
+
"note": "Exact domestic status label in the official consumer website."
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AdapterFactory, TrackingContext } from '../../core/adapter/index.js';
|
|
2
|
+
import type { CarrierResult } from '../../core/result/index.js';
|
|
3
|
+
import { type StepRecorder } from '../../core/telemetry/index.js';
|
|
4
|
+
import { type TrawlClient, type TrawlScrapeResponse } from '../../core/transport/index.js';
|
|
5
|
+
export declare function normalizeYunExpressNumber(raw: string): string;
|
|
6
|
+
export declare function yunExpressTrackingUrl(raw: string): string;
|
|
7
|
+
export declare function parse(payload: unknown, trackingNumber: string): CarrierResult;
|
|
8
|
+
/** A later captured reply is final; never silently reuse an earlier success. */
|
|
9
|
+
export declare function parseCaptured(page: TrawlScrapeResponse, number: string): CarrierResult;
|
|
10
|
+
export declare class YunExpressTracker {
|
|
11
|
+
private readonly options;
|
|
12
|
+
constructor(options?: {
|
|
13
|
+
trawl?: TrawlClient | null;
|
|
14
|
+
executablePath?: string | null;
|
|
15
|
+
fetcher?: typeof fetch;
|
|
16
|
+
recorder?: StepRecorder;
|
|
17
|
+
});
|
|
18
|
+
fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
|
|
19
|
+
}
|
|
20
|
+
export declare const adapter: AdapterFactory;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { loadChromium } from '../../core/transport/optional.js';
|
|
2
|
+
import { DateTime } from 'luxon';
|
|
3
|
+
import { ChallengeError, IndeterminateError, NotFoundError, SchemaError, TransportError, UpstreamHttpError } from '../../core/errors/index.js';
|
|
4
|
+
import { runSteps } from '../../core/runner/index.js';
|
|
5
|
+
import { explicitOffsetTime, EXPLICIT_OFFSET_PATTERN } from '../../core/time/index.js';
|
|
6
|
+
import { NOOP_RECORDER } from '../../core/telemetry/index.js';
|
|
7
|
+
import { clean } from '../../core/transport/index.js';
|
|
8
|
+
import { isRecord } from '../../core/types.js';
|
|
9
|
+
import { yunExpressStatus } from './status.js';
|
|
10
|
+
const API = 'https://services.yuntrack.com/Track/Query';
|
|
11
|
+
const MAX_BYTES = 1_000_000;
|
|
12
|
+
let browserBusy = false;
|
|
13
|
+
export function normalizeYunExpressNumber(raw) {
|
|
14
|
+
const number = raw.toUpperCase().replace(/[\s.-]/g, '');
|
|
15
|
+
if (!/^YT\d{16}$/.test(number))
|
|
16
|
+
throw new TypeError('YunExpress requires a YT parcel reference');
|
|
17
|
+
return number;
|
|
18
|
+
}
|
|
19
|
+
export function yunExpressTrackingUrl(raw) {
|
|
20
|
+
return `https://www.yuntrack.com/parcelTracking?id=${normalizeYunExpressNumber(raw)}`;
|
|
21
|
+
}
|
|
22
|
+
function eventClock(raw, offset) {
|
|
23
|
+
if (EXPLICIT_OFFSET_PATTERN.test(raw)) {
|
|
24
|
+
const parsed = explicitOffsetTime(raw);
|
|
25
|
+
if (!parsed)
|
|
26
|
+
throw new SchemaError('YunExpress', 'YunExpress returned an invalid scan time');
|
|
27
|
+
return { time: parsed.iso };
|
|
28
|
+
}
|
|
29
|
+
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/.test(raw))
|
|
30
|
+
throw new SchemaError('YunExpress', 'YunExpress returned an invalid scan time');
|
|
31
|
+
const parsed = DateTime.fromISO(`${raw}${offset ?? ''}`, { setZone: true, zone: 'UTC' });
|
|
32
|
+
if (!parsed.isValid)
|
|
33
|
+
throw new SchemaError('YunExpress', 'YunExpress returned an invalid scan time');
|
|
34
|
+
const iso = parsed.toISO({ suppressMilliseconds: true, includeOffset: Boolean(offset) });
|
|
35
|
+
return offset ? { time: iso } : { local_time: iso };
|
|
36
|
+
}
|
|
37
|
+
export function parse(payload, trackingNumber) {
|
|
38
|
+
const number = normalizeYunExpressNumber(trackingNumber);
|
|
39
|
+
if (isRecord(payload) && [1003, 1004].includes(Number(payload.Code)))
|
|
40
|
+
throw new ChallengeError('YunExpress', 'YunExpress requires its interactive tracking verification');
|
|
41
|
+
if (!isRecord(payload) || !Array.isArray(payload.ResultList))
|
|
42
|
+
throw new SchemaError('YunExpress');
|
|
43
|
+
const matches = payload.ResultList.filter((item) => isRecord(item) && item.Id === number);
|
|
44
|
+
if (matches.length !== 1 || !isRecord(matches[0]))
|
|
45
|
+
throw new SchemaError('YunExpress', 'YunExpress returned a different or ambiguous shipment');
|
|
46
|
+
const item = matches[0];
|
|
47
|
+
if (!isRecord(item.TrackInfo) || item.TrackInfo.WaybillNumber !== number || !isRecord(item.TrackData))
|
|
48
|
+
throw new SchemaError('YunExpress', 'YunExpress returned inconsistent parcel identity');
|
|
49
|
+
const info = item.TrackInfo;
|
|
50
|
+
const groups = item.TrackData.ProcessGroupList;
|
|
51
|
+
if (!Array.isArray(groups))
|
|
52
|
+
throw new SchemaError('YunExpress');
|
|
53
|
+
if (item.Status === 0 && info.TrackingStatus === 0 && groups.length === 0
|
|
54
|
+
&& info.TrackEventCount === 0 && item.TrackData.ChildCount === 0
|
|
55
|
+
&& Array.isArray(info.TrackEventDetails) && info.TrackEventDetails.length === 0
|
|
56
|
+
&& isRecord(info.LastTrackEvent) && info.LastTrackEvent.TrackingStatus === 0
|
|
57
|
+
&& info.LastTrackEvent.ProcessDate === '' && info.LastTrackEvent.ProcessContent === ''
|
|
58
|
+
&& info.LastTrackEvent.ProcessLocation === '')
|
|
59
|
+
throw new NotFoundError('YunExpress');
|
|
60
|
+
if (!groups.length)
|
|
61
|
+
throw new IndeterminateError('YunExpress', 'YunExpress returned no parcel scans');
|
|
62
|
+
if (groups.length > 500)
|
|
63
|
+
throw new SchemaError('YunExpress');
|
|
64
|
+
const last = isRecord(info.LastTrackEvent) ? info.LastTrackEvent : {};
|
|
65
|
+
const lastOffset = /^GMT([+-]\d{2}:\d{2})$/.exec(clean(last.GmtProcessTimezone, 32))?.[1];
|
|
66
|
+
const events = [];
|
|
67
|
+
const seen = new Set();
|
|
68
|
+
let scans = 0;
|
|
69
|
+
let current;
|
|
70
|
+
for (const group of groups) {
|
|
71
|
+
if (!isRecord(group) || !Array.isArray(group.ProcessDetailList) || !group.ProcessDetailList.length)
|
|
72
|
+
throw new SchemaError('YunExpress');
|
|
73
|
+
for (const raw of group.ProcessDetailList) {
|
|
74
|
+
if (!isRecord(raw) || ++scans > 500)
|
|
75
|
+
throw new SchemaError('YunExpress');
|
|
76
|
+
const content = clean(raw.ProcessContent, MAX_BYTES);
|
|
77
|
+
const divider = content.lastIndexOf('----');
|
|
78
|
+
const fullDescription = clean(divider < 0 ? content : content.slice(0, divider), MAX_BYTES);
|
|
79
|
+
const fullLocation = divider < 0 ? '' : clean(content.slice(divider + 4), MAX_BYTES);
|
|
80
|
+
const description = clean(fullDescription, 500);
|
|
81
|
+
const location = clean(fullLocation, 200);
|
|
82
|
+
if (!description)
|
|
83
|
+
throw new SchemaError('YunExpress', 'YunExpress returned an empty scan');
|
|
84
|
+
const rawTime = clean(raw.ProcessDate, 64);
|
|
85
|
+
// Only the separately described latest scan supplies a verified offset.
|
|
86
|
+
// Storage/creation timezone fields say nothing about earlier scan clocks.
|
|
87
|
+
const exactLast = rawTime === last.ProcessDate && fullDescription === clean(last.ProcessContent, MAX_BYTES)
|
|
88
|
+
&& fullLocation === clean(last.ProcessLocation, MAX_BYTES);
|
|
89
|
+
const clock = eventClock(rawTime, exactLast ? lastOffset : undefined);
|
|
90
|
+
if (events.length === 0 && !exactLast)
|
|
91
|
+
throw new IndeterminateError('YunExpress', 'YunExpress latest summary does not match its first scan');
|
|
92
|
+
const key = JSON.stringify([clock, description, location]);
|
|
93
|
+
if (seen.has(key))
|
|
94
|
+
continue;
|
|
95
|
+
seen.add(key);
|
|
96
|
+
const classified = yunExpressStatus(description, exactLast ? last.TrackingStatus : undefined);
|
|
97
|
+
if (events.length === 0)
|
|
98
|
+
current = classified;
|
|
99
|
+
events.push({ ...clock, description, location, ...(classified ? { stage: classified.stage } : {}) });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!events.length)
|
|
103
|
+
throw new IndeterminateError('YunExpress');
|
|
104
|
+
if (Array.isArray(info.TrackEventDetails) && info.TrackEventDetails.length > scans) {
|
|
105
|
+
throw new IndeterminateError('YunExpress', 'YunExpress returned incomplete parcel history');
|
|
106
|
+
}
|
|
107
|
+
const latest = events[0];
|
|
108
|
+
const classified = current;
|
|
109
|
+
const deliveryNumber = clean(info.TrackingNumber, 64).toUpperCase();
|
|
110
|
+
const country = clean(info.DestinationCountryCode, 8).toUpperCase();
|
|
111
|
+
return { status: classified?.status ?? 'unknown', ...(classified ? { current_stage: classified.stage } : {}),
|
|
112
|
+
last_status_text: latest.description, last_update: latest.time ?? null,
|
|
113
|
+
...(classified?.stage === 'delivered' && latest.time ? { delivered_at: latest.time } : {}),
|
|
114
|
+
...(deliveryNumber !== number && /^[A-Z0-9]{4,40}$/.test(deliveryNumber) ? { delivery_tracking_number: deliveryNumber } : {}),
|
|
115
|
+
...(/^[A-Z]{2}$/.test(country) ? { destination_country: country } : {}), events: events.slice(0, 100) };
|
|
116
|
+
}
|
|
117
|
+
/** A later captured reply is final; never silently reuse an earlier success. */
|
|
118
|
+
export function parseCaptured(page, number) {
|
|
119
|
+
const capture = page.capturedResponses.filter((entry) => entry.url === API).at(-1);
|
|
120
|
+
if (!capture)
|
|
121
|
+
throw new TransportError('YunExpress', 'The browser service did not capture YunExpress history');
|
|
122
|
+
if (capture.status >= 400) {
|
|
123
|
+
if ([401, 403, 405].includes(capture.status))
|
|
124
|
+
throw new ChallengeError('YunExpress', 'YunExpress rejected the browser tracking request', { status: capture.status });
|
|
125
|
+
throw new UpstreamHttpError('YunExpress', capture.status);
|
|
126
|
+
}
|
|
127
|
+
if (capture.status !== 200 || capture.truncated || capture.error || capture.body === null || capture.body.length > MAX_BYTES)
|
|
128
|
+
throw new IndeterminateError('YunExpress', 'The browser returned incomplete YunExpress history');
|
|
129
|
+
const body = capture.base64Encoded ? Buffer.from(capture.body, 'base64').toString('utf8') : capture.body;
|
|
130
|
+
let payload;
|
|
131
|
+
try {
|
|
132
|
+
payload = JSON.parse(body);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new SchemaError('YunExpress', 'YunExpress returned unreadable tracking JSON', { cause: error });
|
|
136
|
+
}
|
|
137
|
+
return parse(payload, number);
|
|
138
|
+
}
|
|
139
|
+
async function localBrowser(number, executablePath, signal, timeoutMs) {
|
|
140
|
+
signal.throwIfAborted();
|
|
141
|
+
if (browserBusy)
|
|
142
|
+
throw new TransportError('YunExpress', 'The YunExpress tracking browser is busy');
|
|
143
|
+
browserBusy = true;
|
|
144
|
+
let browser;
|
|
145
|
+
let rejectHistory;
|
|
146
|
+
let resolveHistory;
|
|
147
|
+
let settled = false;
|
|
148
|
+
const history = new Promise((resolve, reject) => { resolveHistory = resolve; rejectHistory = reject; });
|
|
149
|
+
void history.catch(() => { });
|
|
150
|
+
const fail = (error) => { if (!settled) {
|
|
151
|
+
settled = true;
|
|
152
|
+
rejectHistory(error);
|
|
153
|
+
} };
|
|
154
|
+
const abort = () => { fail(signal.reason); void browser?.close().catch(() => { }); };
|
|
155
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
156
|
+
try {
|
|
157
|
+
browser = await (await loadChromium("YunExpress")).launch({ executablePath, headless: true, timeout: Math.min(timeoutMs, 10_000),
|
|
158
|
+
env: { PATH: process.env.PATH ?? '', HOME: process.env.HOME ?? '/tmp', LANG: 'en_US.UTF-8' } });
|
|
159
|
+
signal.throwIfAborted();
|
|
160
|
+
const page = await browser.newPage({ locale: 'en-US' });
|
|
161
|
+
// Request interception makes the same fresh session receive API 405.
|
|
162
|
+
// Observe response events without altering the browser's network requests.
|
|
163
|
+
page.on('response', async (response) => {
|
|
164
|
+
if (settled || response.url() !== API || response.request().method() !== 'POST')
|
|
165
|
+
return;
|
|
166
|
+
try {
|
|
167
|
+
const body = response.request().postDataJSON();
|
|
168
|
+
if (!isRecord(body) || !Array.isArray(body.NumberList) || body.NumberList.length !== 1 || body.NumberList[0] !== number)
|
|
169
|
+
throw new SchemaError('YunExpress', 'The browser submitted a different parcel');
|
|
170
|
+
if (response.status() !== 200) {
|
|
171
|
+
if ([401, 403, 405].includes(response.status()))
|
|
172
|
+
throw new ChallengeError('YunExpress', 'YunExpress rejected the browser tracking request', { status: response.status() });
|
|
173
|
+
throw new UpstreamHttpError('YunExpress', response.status());
|
|
174
|
+
}
|
|
175
|
+
if (Number(response.headers()['content-length']) > MAX_BYTES)
|
|
176
|
+
throw new SchemaError('YunExpress', 'YunExpress returned excessive tracking data');
|
|
177
|
+
const bytes = await response.body();
|
|
178
|
+
signal.throwIfAborted();
|
|
179
|
+
if (bytes.length > MAX_BYTES)
|
|
180
|
+
throw new SchemaError('YunExpress', 'YunExpress returned excessive tracking data');
|
|
181
|
+
const result = parse(JSON.parse(bytes.toString('utf8')), number);
|
|
182
|
+
if (!settled) {
|
|
183
|
+
settled = true;
|
|
184
|
+
resolveHistory(result);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
fail(error instanceof SyntaxError ? new SchemaError('YunExpress', 'YunExpress returned unreadable tracking JSON', { cause: error }) : error);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
const navigation = page.goto(yunExpressTrackingUrl(number), { waitUntil: 'domcontentloaded', timeout: timeoutMs }).then((response) => {
|
|
192
|
+
if (!response || response.status() !== 200)
|
|
193
|
+
throw new TransportError('YunExpress', 'YunExpress tracking page is unavailable');
|
|
194
|
+
return history;
|
|
195
|
+
});
|
|
196
|
+
return await Promise.race([navigation, history]);
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
settled = true;
|
|
200
|
+
signal.removeEventListener('abort', abort);
|
|
201
|
+
try {
|
|
202
|
+
await browser?.close();
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
browserBusy = false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export class YunExpressTracker {
|
|
210
|
+
options;
|
|
211
|
+
constructor(options = {}) {
|
|
212
|
+
this.options = options;
|
|
213
|
+
}
|
|
214
|
+
async fetch(raw, context = {}) {
|
|
215
|
+
const number = normalizeYunExpressNumber(raw);
|
|
216
|
+
const budgetMs = context.budgetMs ?? 45_000;
|
|
217
|
+
if (!Number.isFinite(budgetMs) || budgetMs <= 0)
|
|
218
|
+
throw new TypeError('YunExpress timeout must be positive');
|
|
219
|
+
if (!this.options.trawl && !this.options.executablePath)
|
|
220
|
+
throw new ChallengeError('YunExpress', 'YunExpress requires a configured tracking browser');
|
|
221
|
+
return runSteps({ carrier: 'yunexpress', budgetMs, signal: context.signal, recorder: this.options.recorder ?? NOOP_RECORDER }, [
|
|
222
|
+
{ id: 'browser', enabled: Boolean(this.options.executablePath), run: ({ signal, remainingMs }) => localBrowser(number, this.options.executablePath, signal, Math.max(1, Math.floor(remainingMs))) },
|
|
223
|
+
// Keep the local runtime primary. Service capture needs the matching
|
|
224
|
+
// decoded-response hook and is used only without local Chromium.
|
|
225
|
+
{ id: 'trawl', enabled: !this.options.executablePath && Boolean(this.options.trawl), run: async ({ signal, remainingMs }) => {
|
|
226
|
+
const timeoutMs = Math.max(1, Math.min(25_000, Math.floor(remainingMs)));
|
|
227
|
+
const page = await this.options.trawl.scrape({ url: yunExpressTrackingUrl(number), skipHttp: true, maxTier: 2,
|
|
228
|
+
maxTimeout: timeoutMs, captureResponses: [API], settleTimeout: 5_000 }, {
|
|
229
|
+
provider: 'TRAWL while fetching YunExpress', timeoutMs, maxBytes: 2_000_000, fetcher: this.options.fetcher, signal
|
|
230
|
+
});
|
|
231
|
+
return parseCaptured(page, number);
|
|
232
|
+
} },
|
|
233
|
+
]);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export const adapter = (environment) => {
|
|
237
|
+
const tracker = new YunExpressTracker({ trawl: environment.trawl, executablePath: environment.browserExecutablePath,
|
|
238
|
+
fetcher: environment.fetcher, recorder: environment.recorder });
|
|
239
|
+
return { id: 'yunexpress', recordsSteps: true, steps: ['browser', 'trawl'], track: (input, context) => tracker.fetch(input.number, context) };
|
|
240
|
+
};
|