universal-parcel-scraper 0.92.0-main.985 → 0.94.0-main.990

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.
Files changed (38) hide show
  1. package/README.md +2 -2
  2. package/data/catalog.json +25 -5
  3. package/data/coverage-summary.json +1 -1
  4. package/data/detection-golden.json +38 -8
  5. package/dist/browser/scraper.js +26 -7
  6. package/dist/carriers/latvijas-pasts/adapter.d.ts +14 -0
  7. package/dist/carriers/latvijas-pasts/adapter.js +60 -0
  8. package/dist/carriers/latvijas-pasts/carrier.json +46 -8
  9. package/dist/carriers/latvijas-pasts/parser.d.ts +12 -0
  10. package/dist/carriers/latvijas-pasts/parser.js +121 -0
  11. package/dist/carriers/latvijas-pasts/status.d.ts +11 -0
  12. package/dist/carriers/latvijas-pasts/status.js +51 -0
  13. package/dist/carriers/latvijas-pasts/statuses.json +21 -1
  14. package/dist/carriers/slovak-parcel-service/adapter.d.ts +14 -0
  15. package/dist/carriers/slovak-parcel-service/adapter.js +78 -0
  16. package/dist/carriers/slovak-parcel-service/carrier.json +48 -7
  17. package/dist/carriers/slovak-parcel-service/numbers.json +12 -12
  18. package/dist/carriers/slovak-parcel-service/parser.d.ts +36 -0
  19. package/dist/carriers/slovak-parcel-service/parser.js +218 -0
  20. package/dist/carriers/slovak-parcel-service/status.d.ts +7 -0
  21. package/dist/carriers/slovak-parcel-service/status.js +16 -0
  22. package/dist/carriers/slovak-parcel-service/statuses.json +15 -1
  23. package/dist/carriers/slovenska-posta/adapter.d.ts +15 -0
  24. package/dist/carriers/slovenska-posta/adapter.js +65 -0
  25. package/dist/carriers/slovenska-posta/carrier.json +70 -8
  26. package/dist/carriers/slovenska-posta/parser.d.ts +12 -0
  27. package/dist/carriers/slovenska-posta/parser.js +246 -0
  28. package/dist/carriers/slovenska-posta/status.d.ts +17 -0
  29. package/dist/carriers/slovenska-posta/status.js +240 -0
  30. package/dist/carriers/slovenska-posta/statuses.json +151 -1
  31. package/dist/core/catalog/statusMaps.js +8 -4
  32. package/dist/data/catalog.json +25 -5
  33. package/dist/generated/catalog.d.ts +21 -5
  34. package/dist/generated/catalog.js +27 -7
  35. package/dist/generated/recognition.js +3 -0
  36. package/dist/generated/registry.js +9 -3
  37. package/dist/server/openapi.json +1 -1
  38. package/package.json +1 -1
package/README.md CHANGED
@@ -13,7 +13,7 @@ The engine behind [Peek](https://peektracker.com) ([GitHub](https://github.com/p
13
13
  [![License: Apache-2.0](https://img.shields.io/badge/core-Apache--2.0-blue.svg)](LICENSE)
14
14
 
15
15
  <!-- GENERATED:summary -->
16
- **3,500+ carriers** through **150 dedicated adapters** and **5 universal fallbacks**
16
+ **3,500+ carriers** through **153 dedicated adapters** and **5 universal fallbacks**
17
17
 
18
18
  <sub>208 catalog entries · 66 countries represented</sub>
19
19
  <!-- /GENERATED:summary -->
@@ -155,7 +155,7 @@ createTracker({ providers: ['ParcelsApp', 'Ship24', '17TRACK', 'Postal Ninja', '
155
155
  <!-- GENERATED:stages -->
156
156
  <img src="docs/assets/stages.svg" alt="DHL: Die Sendung wurde in das Zustellfahrzeug geladen.; Mondial Relay: En cours de livraison; Correios Brazil: Objeto saiu para entrega ao destinatário; Correos Express: EN REPARTO; Yamato Transport: 配達中; La Poste / Colissimo: DISTOU. All are filed under out_for_delivery." width="760">
157
157
 
158
- The carrier folders record 4,098 such statuses, each filed under one stage.
158
+ The carrier folders record 4,279 such statuses, each filed under one stage.
159
159
  <!-- /GENERATED:stages -->
160
160
 
161
161
  Wording nobody recorded yet goes through a classifier that reads seven European languages.
package/data/catalog.json CHANGED
@@ -6938,7 +6938,9 @@
6938
6938
  "timezone": "Europe/Riga",
6939
6939
  "tracking": {
6940
6940
  "mode": "automatic",
6941
- "adapter": "universal"
6941
+ "adapter": "latvijas-pasts",
6942
+ "recognitionRank": 820,
6943
+ "localClocks": true
6942
6944
  },
6943
6945
  "canaryUrl": "https://www.pasts.lv/izsekot-sutijumu",
6944
6946
  "trackingUrlTemplate": "https://mans.pasts.lv/track?locale=lv-LV&id={trackingNumber}",
@@ -6954,7 +6956,14 @@
6954
6956
  ]
6955
6957
  }
6956
6958
  ],
6957
- "detectionRules": []
6959
+ "detectionRules": [
6960
+ {
6961
+ "pattern": "^[A-Z]{2}\\d{9}LV$",
6962
+ "confidence": "low",
6963
+ "checksum": "s10",
6964
+ "preferred": true
6965
+ }
6966
+ ]
6958
6967
  },
6959
6968
  "lbc-express": {
6960
6969
  "displayName": "LBC Express",
@@ -7907,7 +7916,9 @@
7907
7916
  "timezone": "Europe/Bratislava",
7908
7917
  "tracking": {
7909
7918
  "mode": "automatic",
7910
- "adapter": "universal"
7919
+ "adapter": "slovak-parcel-service",
7920
+ "recognitionRank": 830,
7921
+ "localClocks": true
7911
7922
  },
7912
7923
  "canaryUrl": "https://www.sps-sro.sk/moja-zasielka/",
7913
7924
  "trackingUrlTemplate": "https://www.sps-sro.sk/moja-zasielka/?shipment_id={trackingNumber}",
@@ -7944,7 +7955,9 @@
7944
7955
  "timezone": "Europe/Bratislava",
7945
7956
  "tracking": {
7946
7957
  "mode": "automatic",
7947
- "adapter": "universal"
7958
+ "adapter": "slovenska-posta",
7959
+ "recognitionRank": 840,
7960
+ "localClocks": true
7948
7961
  },
7949
7962
  "canaryUrl": "https://www.posta.sk/sledovanie-zasielok",
7950
7963
  "trackingUrlTemplate": "https://www.posta.sk/sledovanie-zasielok#parcel={trackingNumber}",
@@ -7973,7 +7986,14 @@
7973
7986
  ]
7974
7987
  }
7975
7988
  ],
7976
- "detectionRules": []
7989
+ "detectionRules": [
7990
+ {
7991
+ "pattern": "^[A-Z]{2}\\d{9}SK$",
7992
+ "confidence": "low",
7993
+ "checksum": "s10",
7994
+ "preferred": true
7995
+ }
7996
+ ]
7977
7997
  },
7978
7998
  "speedpak": {
7979
7999
  "displayName": "SpeedPAK",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "catalog": 208,
3
- "activeAdapters": 150,
3
+ "activeAdapters": 153,
4
4
  "countries": 66,
5
5
  "referenceCarriers": 100,
6
6
  "comparison": {
@@ -19948,10 +19948,10 @@
19948
19948
  ],
19949
19949
  "asked": [
19950
19950
  "hermes-de",
19951
+ "slovak-parcel-service",
19951
19952
  "dpd",
19952
19953
  "dpd-de",
19953
- "seur",
19954
- "brt"
19954
+ "seur"
19955
19955
  ]
19956
19956
  },
19957
19957
  {
@@ -19989,11 +19989,11 @@
19989
19989
  "slovak-parcel-service"
19990
19990
  ],
19991
19991
  "asked": [
19992
+ "slovak-parcel-service",
19992
19993
  "dpd",
19993
19994
  "dpd-de",
19994
19995
  "seur",
19995
- "brt",
19996
- "relais-colis"
19996
+ "brt"
19997
19997
  ]
19998
19998
  },
19999
19999
  {
@@ -20015,10 +20015,10 @@
20015
20015
  ],
20016
20016
  "asked": [
20017
20017
  "hermes-de",
20018
+ "slovak-parcel-service",
20018
20019
  "dpd",
20019
20020
  "dpd-de",
20020
- "seur",
20021
- "brt"
20021
+ "seur"
20022
20022
  ]
20023
20023
  },
20024
20024
  {
@@ -20038,11 +20038,11 @@
20038
20038
  "slovak-parcel-service"
20039
20039
  ],
20040
20040
  "asked": [
20041
+ "slovak-parcel-service",
20041
20042
  "dpd",
20042
20043
  "dpd-de",
20043
20044
  "seur",
20044
- "brt",
20045
- "relais-colis"
20045
+ "brt"
20046
20046
  ]
20047
20047
  },
20048
20048
  {
@@ -25176,6 +25176,7 @@
25176
25176
  "intl-post"
25177
25177
  ],
25178
25178
  "asked": [
25179
+ "slovenska-posta",
25179
25180
  "chronopost"
25180
25181
  ]
25181
25182
  },
@@ -25390,6 +25391,7 @@
25390
25391
  "intl-post"
25391
25392
  ],
25392
25393
  "asked": [
25394
+ "slovenska-posta",
25393
25395
  "chronopost"
25394
25396
  ]
25395
25397
  },
@@ -25585,6 +25587,7 @@
25585
25587
  "intl-post"
25586
25588
  ],
25587
25589
  "asked": [
25590
+ "latvijas-pasts",
25588
25591
  "chronopost"
25589
25592
  ]
25590
25593
  },
@@ -25596,6 +25599,7 @@
25596
25599
  "intl-post"
25597
25600
  ],
25598
25601
  "asked": [
25602
+ "latvijas-pasts",
25599
25603
  "chronopost"
25600
25604
  ]
25601
25605
  },
@@ -25607,6 +25611,7 @@
25607
25611
  "intl-post"
25608
25612
  ],
25609
25613
  "asked": [
25614
+ "latvijas-pasts",
25610
25615
  "chronopost"
25611
25616
  ]
25612
25617
  },
@@ -26766,6 +26771,7 @@
26766
26771
  "intl-post"
26767
26772
  ],
26768
26773
  "asked": [
26774
+ "slovenska-posta",
26769
26775
  "chronopost"
26770
26776
  ]
26771
26777
  },
@@ -26881,6 +26887,7 @@
26881
26887
  "intl-post"
26882
26888
  ],
26883
26889
  "asked": [
26890
+ "slovenska-posta",
26884
26891
  "chronopost"
26885
26892
  ]
26886
26893
  },
@@ -26983,6 +26990,7 @@
26983
26990
  "intl-post"
26984
26991
  ],
26985
26992
  "asked": [
26993
+ "slovenska-posta",
26986
26994
  "chronopost"
26987
26995
  ]
26988
26996
  },
@@ -27047,6 +27055,7 @@
27047
27055
  "intl-post"
27048
27056
  ],
27049
27057
  "asked": [
27058
+ "latvijas-pasts",
27050
27059
  "chronopost"
27051
27060
  ]
27052
27061
  },
@@ -27517,6 +27526,7 @@
27517
27526
  "intl-post"
27518
27527
  ],
27519
27528
  "asked": [
27529
+ "slovenska-posta",
27520
27530
  "chronopost"
27521
27531
  ]
27522
27532
  },
@@ -27528,6 +27538,7 @@
27528
27538
  "intl-post"
27529
27539
  ],
27530
27540
  "asked": [
27541
+ "slovenska-posta",
27531
27542
  "chronopost"
27532
27543
  ]
27533
27544
  },
@@ -27634,6 +27645,7 @@
27634
27645
  "intl-post"
27635
27646
  ],
27636
27647
  "asked": [
27648
+ "slovenska-posta",
27637
27649
  "chronopost"
27638
27650
  ]
27639
27651
  },
@@ -30807,6 +30819,7 @@
30807
30819
  "intl-post"
30808
30820
  ],
30809
30821
  "asked": [
30822
+ "slovenska-posta",
30810
30823
  "chronopost"
30811
30824
  ]
30812
30825
  },
@@ -30818,6 +30831,7 @@
30818
30831
  "intl-post"
30819
30832
  ],
30820
30833
  "asked": [
30834
+ "slovenska-posta",
30821
30835
  "chronopost"
30822
30836
  ]
30823
30837
  },
@@ -31655,6 +31669,7 @@
31655
31669
  "intl-post"
31656
31670
  ],
31657
31671
  "asked": [
31672
+ "latvijas-pasts",
31658
31673
  "chronopost"
31659
31674
  ]
31660
31675
  },
@@ -31666,6 +31681,7 @@
31666
31681
  "intl-post"
31667
31682
  ],
31668
31683
  "asked": [
31684
+ "latvijas-pasts",
31669
31685
  "chronopost"
31670
31686
  ]
31671
31687
  },
@@ -31677,6 +31693,7 @@
31677
31693
  "intl-post"
31678
31694
  ],
31679
31695
  "asked": [
31696
+ "latvijas-pasts",
31680
31697
  "chronopost"
31681
31698
  ]
31682
31699
  },
@@ -31688,6 +31705,7 @@
31688
31705
  "intl-post"
31689
31706
  ],
31690
31707
  "asked": [
31708
+ "latvijas-pasts",
31691
31709
  "chronopost"
31692
31710
  ]
31693
31711
  },
@@ -31699,6 +31717,7 @@
31699
31717
  "intl-post"
31700
31718
  ],
31701
31719
  "asked": [
31720
+ "latvijas-pasts",
31702
31721
  "chronopost"
31703
31722
  ]
31704
31723
  },
@@ -31710,6 +31729,7 @@
31710
31729
  "intl-post"
31711
31730
  ],
31712
31731
  "asked": [
31732
+ "latvijas-pasts",
31713
31733
  "chronopost"
31714
31734
  ]
31715
31735
  },
@@ -31721,6 +31741,7 @@
31721
31741
  "intl-post"
31722
31742
  ],
31723
31743
  "asked": [
31744
+ "latvijas-pasts",
31724
31745
  "chronopost"
31725
31746
  ]
31726
31747
  },
@@ -31732,6 +31753,7 @@
31732
31753
  "intl-post"
31733
31754
  ],
31734
31755
  "asked": [
31756
+ "latvijas-pasts",
31735
31757
  "chronopost"
31736
31758
  ]
31737
31759
  },
@@ -31743,6 +31765,7 @@
31743
31765
  "intl-post"
31744
31766
  ],
31745
31767
  "asked": [
31768
+ "latvijas-pasts",
31746
31769
  "chronopost"
31747
31770
  ]
31748
31771
  },
@@ -33577,6 +33600,7 @@
33577
33600
  "intl-post"
33578
33601
  ],
33579
33602
  "asked": [
33603
+ "slovenska-posta",
33580
33604
  "chronopost"
33581
33605
  ]
33582
33606
  },
@@ -33632,6 +33656,7 @@
33632
33656
  "intl-post"
33633
33657
  ],
33634
33658
  "asked": [
33659
+ "slovenska-posta",
33635
33660
  "chronopost"
33636
33661
  ]
33637
33662
  },
@@ -33962,6 +33987,7 @@
33962
33987
  "intl-post"
33963
33988
  ],
33964
33989
  "asked": [
33990
+ "slovenska-posta",
33965
33991
  "chronopost"
33966
33992
  ]
33967
33993
  },
@@ -34250,6 +34276,7 @@
34250
34276
  "intl-post"
34251
34277
  ],
34252
34278
  "asked": [
34279
+ "latvijas-pasts",
34253
34280
  "chronopost"
34254
34281
  ]
34255
34282
  },
@@ -35419,6 +35446,7 @@
35419
35446
  "intl-post"
35420
35447
  ],
35421
35448
  "asked": [
35449
+ "latvijas-pasts",
35422
35450
  "chronopost"
35423
35451
  ]
35424
35452
  },
@@ -36887,6 +36915,7 @@
36887
36915
  "intl-post"
36888
36916
  ],
36889
36917
  "asked": [
36918
+ "latvijas-pasts",
36890
36919
  "chronopost"
36891
36920
  ]
36892
36921
  },
@@ -37173,6 +37202,7 @@
37173
37202
  "intl-post"
37174
37203
  ],
37175
37204
  "asked": [
37205
+ "latvijas-pasts",
37176
37206
  "chronopost"
37177
37207
  ]
37178
37208
  },
@@ -5527,7 +5527,9 @@ var be = {
5527
5527
  timezone: "Europe/Riga",
5528
5528
  tracking: {
5529
5529
  mode: "automatic",
5530
- adapter: "universal"
5530
+ adapter: "latvijas-pasts",
5531
+ recognitionRank: 820,
5532
+ localClocks: !0
5531
5533
  },
5532
5534
  canaryUrl: "https://www.pasts.lv/izsekot-sutijumu",
5533
5535
  trackingUrlTemplate: "https://mans.pasts.lv/track?locale=lv-LV&id={trackingNumber}",
@@ -5537,7 +5539,12 @@ var be = {
5537
5539
  pathPattern: "^/track/?$",
5538
5540
  params: ["id"]
5539
5541
  }],
5540
- detectionRules: []
5542
+ detectionRules: [{
5543
+ pattern: "^[A-Z]{2}\\d{9}LV$",
5544
+ confidence: "low",
5545
+ checksum: "s10",
5546
+ preferred: !0
5547
+ }]
5541
5548
  },
5542
5549
  "lbc-express": {
5543
5550
  displayName: "LBC Express",
@@ -6267,7 +6274,9 @@ var be = {
6267
6274
  timezone: "Europe/Bratislava",
6268
6275
  tracking: {
6269
6276
  mode: "automatic",
6270
- adapter: "universal"
6277
+ adapter: "slovak-parcel-service",
6278
+ recognitionRank: 830,
6279
+ localClocks: !0
6271
6280
  },
6272
6281
  canaryUrl: "https://www.sps-sro.sk/moja-zasielka/",
6273
6282
  trackingUrlTemplate: "https://www.sps-sro.sk/moja-zasielka/?shipment_id={trackingNumber}",
@@ -6291,7 +6300,9 @@ var be = {
6291
6300
  timezone: "Europe/Bratislava",
6292
6301
  tracking: {
6293
6302
  mode: "automatic",
6294
- adapter: "universal"
6303
+ adapter: "slovenska-posta",
6304
+ recognitionRank: 840,
6305
+ localClocks: !0
6295
6306
  },
6296
6307
  canaryUrl: "https://www.posta.sk/sledovanie-zasielok",
6297
6308
  trackingUrlTemplate: "https://www.posta.sk/sledovanie-zasielok#parcel={trackingNumber}",
@@ -6312,7 +6323,12 @@ var be = {
6312
6323
  params: ["q"]
6313
6324
  }
6314
6325
  ],
6315
- detectionRules: []
6326
+ detectionRules: [{
6327
+ pattern: "^[A-Z]{2}\\d{9}SK$",
6328
+ confidence: "low",
6329
+ checksum: "s10",
6330
+ preferred: !0
6331
+ }]
6316
6332
  },
6317
6333
  speedpak: {
6318
6334
  displayName: "SpeedPAK",
@@ -7143,7 +7159,7 @@ var be = {
7143
7159
  "j-and-t-cargo": ["j-and-t-cargo-1", "j-and-t-cargo-2"],
7144
7160
  jitsu: [],
7145
7161
  "kuehne-nagel": ["kuehne-nagel-1", "kuehne-nagel-2"],
7146
- "latvijas-pasts": [],
7162
+ "latvijas-pasts": ["latvijas-pasts-s10"],
7147
7163
  "lbc-express": ["lbc-domestic"],
7148
7164
  "lietuvos-pastas": ["lietuvos-pastas-1"],
7149
7165
  "loomis-express": ["loomis-express-1", "loomis-express-2"],
@@ -7177,7 +7193,7 @@ var be = {
7177
7193
  saia: [],
7178
7194
  sameday: ["sameday-1"],
7179
7195
  "slovak-parcel-service": ["slovak-parcel-service-1"],
7180
- "slovenska-posta": [],
7196
+ "slovenska-posta": ["slovenska-posta-s10"],
7181
7197
  speedpak: ["speedpak-1"],
7182
7198
  speedy: [],
7183
7199
  "spx-ph": [
@@ -11937,6 +11953,7 @@ var bc = {
11937
11953
  "j-and-t": 90,
11938
11954
  "j-and-t-cargo": 470,
11939
11955
  "la-poste": 800,
11956
+ "latvijas-pasts": 820,
11940
11957
  matkahuolto: 690,
11941
11958
  "mng-kargo": 740,
11942
11959
  nacex: 410,
@@ -11957,6 +11974,8 @@ var bc = {
11957
11974
  "relais-colis": 250,
11958
11975
  sameday: 530,
11959
11976
  seur: 430,
11977
+ "slovak-parcel-service": 830,
11978
+ "slovenska-posta": 840,
11960
11979
  speedy: 540,
11961
11980
  sto: 100,
11962
11981
  "swiss-post-cargo": 110,
@@ -0,0 +1,14 @@
1
+ import { type AdapterFactory, type 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
+ export declare const LATVIJAS_PASTS_ENDPOINT = "https://mans.pasts.lv/tracking-api";
5
+ export declare class LatvijasPastsTracker {
6
+ private readonly options;
7
+ constructor(options?: {
8
+ fetcher?: typeof fetch;
9
+ recorder?: StepRecorder;
10
+ userAgent?: string;
11
+ });
12
+ fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
13
+ }
14
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,60 @@
1
+ import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
2
+ import { ChallengeError, SchemaError, TransportError, UpstreamHttpError } from '../../core/errors/index.js';
3
+ import { runSteps } from '../../core/runner/index.js';
4
+ import { firstAttemptMs, networkRetryStep } from '../../core/runner/networkRetry.js';
5
+ import { NOOP_RECORDER } from '../../core/telemetry/index.js';
6
+ import { decodeText, fetchBounded, parseJsonBytes, userAgentOf } from '../../core/transport/index.js';
7
+ import { LATVIJAS_PASTS_MAX_BYTES, normalizeLatvijasPastsNumber, parseLatvijasPasts, PROVIDER } from './parser.js';
8
+ // The service mans.pasts.lv's tracking page reads. It answers JSON only when
9
+ // asked for it, and XML otherwise.
10
+ export const LATVIJAS_PASTS_ENDPOINT = 'https://mans.pasts.lv/tracking-api';
11
+ // A CloudFront or web application firewall block page.
12
+ const BLOCKED = /<title>\s*(?:ERROR: The request could not be satisfied|Request blocked|Access Denied|Just a moment|Attention Required)|cf-chl-|cf-turnstile|Generated by cloudfront/i;
13
+ export class LatvijasPastsTracker {
14
+ options;
15
+ constructor(options = {}) {
16
+ this.options = options;
17
+ }
18
+ async fetch(raw, context = {}) {
19
+ const number = normalizeLatvijasPastsNumber(raw);
20
+ const url = `${LATVIJAS_PASTS_ENDPOINT}?${new URLSearchParams({ id: number, lang: 'en-US', include_group: 'true' })}`;
21
+ const read = async (signal, timeoutMs) => {
22
+ let bytes;
23
+ try {
24
+ ({ bytes } = await fetchBounded(url, { signal, headers: { Accept: 'application/json', 'User-Agent': userAgentOf(this.options.userAgent) } }, { provider: PROVIDER, timeoutMs: Math.max(1, Math.floor(timeoutMs)), maxBytes: LATVIJAS_PASTS_MAX_BYTES, fetcher: this.options.fetcher }));
25
+ }
26
+ catch (error) {
27
+ // A missing route is not a missing item: the service answers unknown codes with a notice.
28
+ if (error instanceof UpstreamHttpError && [404, 410].includes(error.status)) {
29
+ throw new TransportError(PROVIDER, 'Latvijas Pasts tracking endpoint is unavailable', { cause: error });
30
+ }
31
+ throw error;
32
+ }
33
+ let payload;
34
+ try {
35
+ payload = parseJsonBytes(bytes, PROVIDER);
36
+ }
37
+ catch (cause) {
38
+ if (BLOCKED.test(decodeText(bytes.subarray(0, 64_000))))
39
+ throw new ChallengeError(PROVIDER, 'Latvijas Pasts answered with a block page', { cause });
40
+ throw new SchemaError(PROVIDER, 'Latvijas Pasts returned invalid tracking JSON', { cause });
41
+ }
42
+ return parseLatvijasPasts(payload, number);
43
+ };
44
+ // A request that fails to reach Latvijas Pasts, or hangs, gets one more
45
+ // try: the first gets half of the budget, so the retry fits in the rest.
46
+ return runSteps({ carrier: 'latvijas-pasts', budgetMs: context.budgetMs ?? 15_000, signal: context.signal,
47
+ recorder: this.options.recorder ?? NOOP_RECORDER }, [
48
+ { id: 'direct', run: ({ signal, remainingMs }) => read(signal, firstAttemptMs(remainingMs)) },
49
+ networkRetryStep(({ signal, remainingMs }) => read(signal, remainingMs)),
50
+ ]);
51
+ }
52
+ }
53
+ export const adapter = (environment) => {
54
+ const tracker = new LatvijasPastsTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
55
+ return {
56
+ id: 'latvijas-pasts', recordsSteps: true, steps: ['direct', 'retry'],
57
+ track: (input, context) => tracker.fetch(input.number, context),
58
+ recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeLatvijasPastsNumber(number))),
59
+ };
60
+ };
@@ -17,18 +17,48 @@
17
17
  "timezone": "Europe/Riga",
18
18
  "tracking": {
19
19
  "mode": "automatic",
20
- "adapter": "universal",
21
- "steps": []
20
+ "adapter": "latvijas-pasts",
21
+ "steps": [
22
+ "direct",
23
+ "retry"
24
+ ],
25
+ "recognition": {
26
+ "rank": 820
27
+ },
28
+ "localClocks": true
22
29
  },
23
- "capabilities": [],
30
+ "capabilities": [
31
+ "history",
32
+ "location",
33
+ "provider_code",
34
+ "pickup_point"
35
+ ],
24
36
  "portal": {
25
37
  "url": "https://mans.pasts.lv/track?locale=lv-LV&id={trackingNumber}",
26
38
  "searchUrl": "https://www.pasts.lv/izsekot-sutijumu",
27
39
  "canaryUrl": "https://www.pasts.lv/izsekot-sutijumu",
28
- "shows": [],
29
- "scraped": [],
30
- "discarded": [],
31
- "unavailable": []
40
+ "shows": [
41
+ "status",
42
+ "history",
43
+ "location",
44
+ "event_details"
45
+ ],
46
+ "scraped": [
47
+ "status",
48
+ "history",
49
+ "location",
50
+ "provider_code",
51
+ "pickup_point"
52
+ ],
53
+ "discarded": [
54
+ "event_details"
55
+ ],
56
+ "unavailable": [
57
+ "eta",
58
+ "weight",
59
+ "service_name",
60
+ "proof_of_delivery"
61
+ ]
32
62
  },
33
63
  "links": [
34
64
  {
@@ -41,5 +71,13 @@
41
71
  ]
42
72
  }
43
73
  ],
44
- "detection": []
74
+ "detection": [
75
+ {
76
+ "id": "latvijas-pasts-s10",
77
+ "pattern": "^[A-Z]{2}\\d{9}LV$",
78
+ "confidence": "low",
79
+ "preferred": true,
80
+ "checksum": "s10"
81
+ }
82
+ ]
45
83
  }
@@ -0,0 +1,12 @@
1
+ import type { CarrierResult } from '../../core/result/index.js';
2
+ export declare const PROVIDER = "Latvijas Pasts";
3
+ export declare const LATVIJAS_PASTS_MAX_BYTES = 256000;
4
+ /** Latvijas Pasts tracks UPU S10 items, its own and those it delivers for other posts. */
5
+ export declare function normalizeLatvijasPastsNumber(raw: string): string;
6
+ /**
7
+ * The tracker's reply for one item: its scans newest first, each with an event
8
+ * code, wording, a wall clock and the office, or the country of a foreign
9
+ * post's event, or a notice instead. The reply does not repeat the number; it
10
+ * answers for the one number the request names.
11
+ */
12
+ export declare function parseLatvijasPasts(payload: unknown, rawNumber: string): CarrierResult;