universal-parcel-scraper 0.76.0-main.934 → 0.78.0-main.939

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 (40) hide show
  1. package/README.md +2 -2
  2. package/data/catalog.json +14 -3
  3. package/data/coverage-summary.json +1 -1
  4. package/data/detection-golden.json +17 -0
  5. package/dist/browser/scraper.js +33 -12
  6. package/dist/carriers/dpd-ie/adapter.d.ts +14 -0
  7. package/dist/carriers/dpd-ie/adapter.js +100 -0
  8. package/dist/carriers/dpd-ie/carrier.json +39 -7
  9. package/dist/carriers/dpd-ie/numbers.json +2 -2
  10. package/dist/carriers/dpd-ie/parser.d.ts +19 -0
  11. package/dist/carriers/dpd-ie/parser.js +198 -0
  12. package/dist/carriers/dpd-ie/status.d.ts +27 -0
  13. package/dist/carriers/dpd-ie/status.js +60 -0
  14. package/dist/carriers/dpd-ie/statuses.json +21 -1
  15. package/dist/carriers/omniva/adapter.d.ts +14 -0
  16. package/dist/carriers/omniva/adapter.js +60 -0
  17. package/dist/carriers/omniva/carrier.json +50 -7
  18. package/dist/carriers/omniva/numbers.json +9 -9
  19. package/dist/carriers/omniva/parser.d.ts +15 -0
  20. package/dist/carriers/omniva/parser.js +149 -0
  21. package/dist/carriers/omniva/status.d.ts +15 -0
  22. package/dist/carriers/omniva/status.js +164 -0
  23. package/dist/carriers/omniva/statuses.json +122 -1
  24. package/dist/carriers/venipak/adapter.d.ts +15 -0
  25. package/dist/carriers/venipak/adapter.js +63 -0
  26. package/dist/carriers/venipak/carrier.json +42 -7
  27. package/dist/carriers/venipak/numbers.json +10 -10
  28. package/dist/carriers/venipak/parser.d.ts +19 -0
  29. package/dist/carriers/venipak/parser.js +173 -0
  30. package/dist/carriers/venipak/status.d.ts +14 -0
  31. package/dist/carriers/venipak/status.js +34 -0
  32. package/dist/carriers/venipak/statuses.json +11 -1
  33. package/dist/core/catalog/statusMaps.js +7 -4
  34. package/dist/data/catalog.json +14 -3
  35. package/dist/generated/catalog.d.ts +13 -3
  36. package/dist/generated/catalog.js +15 -4
  37. package/dist/generated/recognition.js +3 -0
  38. package/dist/generated/registry.js +9 -3
  39. package/dist/server/openapi.json +1 -1
  40. 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 **132 dedicated adapters** and **5 universal fallbacks**
16
+ **3,500+ carriers** through **135 dedicated adapters** and **5 universal fallbacks**
17
17
 
18
18
  <sub>207 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 3,704 such statuses, each filed under one stage.
158
+ The carrier folders record 3,852 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
@@ -5480,7 +5480,9 @@
5480
5480
  "timezone": "Europe/Dublin",
5481
5481
  "tracking": {
5482
5482
  "mode": "automatic",
5483
- "adapter": "universal"
5483
+ "adapter": "dpd-ie",
5484
+ "recognitionRank": 62,
5485
+ "localClocks": true
5484
5486
  },
5485
5487
  "canaryUrl": "https://www.dpd.ie/tracking/",
5486
5488
  "trackingUrlTemplate": "https://www.dpd.ie/tracking/?consignmentNumber={trackingNumber}",
@@ -7192,7 +7194,8 @@
7192
7194
  "timezone": "Europe/Tallinn",
7193
7195
  "tracking": {
7194
7196
  "mode": "automatic",
7195
- "adapter": "universal"
7197
+ "adapter": "omniva",
7198
+ "recognitionRank": 64
7196
7199
  },
7197
7200
  "canaryUrl": "https://minu.omniva.ee/track",
7198
7201
  "trackingUrlTemplate": "https://minu.omniva.ee/track/{trackingNumber}",
@@ -7228,6 +7231,12 @@
7228
7231
  {
7229
7232
  "pattern": "^JJEE[A-Z]{3}\\d{11}$",
7230
7233
  "confidence": "high"
7234
+ },
7235
+ {
7236
+ "pattern": "^[A-Z]{2}\\d{9}EE$",
7237
+ "confidence": "low",
7238
+ "checksum": "s10",
7239
+ "preferred": true
7231
7240
  }
7232
7241
  ]
7233
7242
  },
@@ -8008,7 +8017,9 @@
8008
8017
  "timezone": "Europe/Vilnius",
8009
8018
  "tracking": {
8010
8019
  "mode": "automatic",
8011
- "adapter": "universal"
8020
+ "adapter": "venipak",
8021
+ "recognitionRank": 63,
8022
+ "localClocks": true
8012
8023
  },
8013
8024
  "canaryUrl": "https://venipak.com/lt/en/parcel-tracking/",
8014
8025
  "trackingUrlTemplate": "https://venipak.com/lt/en/tracking/track/{trackingNumber}",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "catalog": 207,
3
- "activeAdapters": 132,
3
+ "activeAdapters": 135,
4
4
  "countries": 66,
5
5
  "referenceCarriers": 100,
6
6
  "comparison": {
@@ -25371,6 +25371,7 @@
25371
25371
  "intl-post"
25372
25372
  ],
25373
25373
  "asked": [
25374
+ "omniva",
25374
25375
  "chronopost"
25375
25376
  ]
25376
25377
  },
@@ -25382,6 +25383,7 @@
25382
25383
  "intl-post"
25383
25384
  ],
25384
25385
  "asked": [
25386
+ "omniva",
25385
25387
  "chronopost"
25386
25388
  ]
25387
25389
  },
@@ -25599,6 +25601,7 @@
25599
25601
  "intl-post"
25600
25602
  ],
25601
25603
  "asked": [
25604
+ "omniva",
25602
25605
  "chronopost"
25603
25606
  ]
25604
25607
  },
@@ -25634,6 +25637,7 @@
25634
25637
  "intl-post"
25635
25638
  ],
25636
25639
  "asked": [
25640
+ "omniva",
25637
25641
  "chronopost"
25638
25642
  ]
25639
25643
  },
@@ -25653,6 +25657,7 @@
25653
25657
  "intl-post"
25654
25658
  ],
25655
25659
  "asked": [
25660
+ "omniva",
25656
25661
  "chronopost"
25657
25662
  ]
25658
25663
  },
@@ -25683,6 +25688,7 @@
25683
25688
  "intl-post"
25684
25689
  ],
25685
25690
  "asked": [
25691
+ "omniva",
25686
25692
  "chronopost"
25687
25693
  ]
25688
25694
  },
@@ -26573,6 +26579,7 @@
26573
26579
  "intl-post"
26574
26580
  ],
26575
26581
  "asked": [
26582
+ "omniva",
26576
26583
  "chronopost"
26577
26584
  ]
26578
26585
  },
@@ -26724,6 +26731,7 @@
26724
26731
  "intl-post"
26725
26732
  ],
26726
26733
  "asked": [
26734
+ "omniva",
26727
26735
  "chronopost"
26728
26736
  ]
26729
26737
  },
@@ -30508,6 +30516,7 @@
30508
30516
  "intl-post"
30509
30517
  ],
30510
30518
  "asked": [
30519
+ "omniva",
30511
30520
  "chronopost"
30512
30521
  ]
30513
30522
  },
@@ -32984,6 +32993,7 @@
32984
32993
  "intl-post"
32985
32994
  ],
32986
32995
  "asked": [
32996
+ "omniva",
32987
32997
  "chronopost"
32988
32998
  ]
32989
32999
  },
@@ -33006,6 +33016,7 @@
33006
33016
  "intl-post"
33007
33017
  ],
33008
33018
  "asked": [
33019
+ "omniva",
33009
33020
  "chronopost"
33010
33021
  ]
33011
33022
  },
@@ -33017,6 +33028,7 @@
33017
33028
  "intl-post"
33018
33029
  ],
33019
33030
  "asked": [
33031
+ "omniva",
33020
33032
  "chronopost"
33021
33033
  ]
33022
33034
  },
@@ -33424,6 +33436,7 @@
33424
33436
  "intl-post"
33425
33437
  ],
33426
33438
  "asked": [
33439
+ "omniva",
33427
33440
  "chronopost"
33428
33441
  ]
33429
33442
  },
@@ -33435,6 +33448,7 @@
33435
33448
  "intl-post"
33436
33449
  ],
33437
33450
  "asked": [
33451
+ "omniva",
33438
33452
  "chronopost"
33439
33453
  ]
33440
33454
  },
@@ -33446,6 +33460,7 @@
33446
33460
  "intl-post"
33447
33461
  ],
33448
33462
  "asked": [
33463
+ "omniva",
33449
33464
  "chronopost"
33450
33465
  ]
33451
33466
  },
@@ -33457,6 +33472,7 @@
33457
33472
  "intl-post"
33458
33473
  ],
33459
33474
  "asked": [
33475
+ "omniva",
33460
33476
  "chronopost"
33461
33477
  ]
33462
33478
  },
@@ -33468,6 +33484,7 @@
33468
33484
  "intl-post"
33469
33485
  ],
33470
33486
  "asked": [
33487
+ "omniva",
33471
33488
  "chronopost"
33472
33489
  ]
33473
33490
  },
@@ -4443,7 +4443,9 @@ var ye = {
4443
4443
  timezone: "Europe/Dublin",
4444
4444
  tracking: {
4445
4445
  mode: "automatic",
4446
- adapter: "universal"
4446
+ adapter: "dpd-ie",
4447
+ recognitionRank: 62,
4448
+ localClocks: !0
4447
4449
  },
4448
4450
  canaryUrl: "https://www.dpd.ie/tracking/",
4449
4451
  trackingUrlTemplate: "https://www.dpd.ie/tracking/?consignmentNumber={trackingNumber}",
@@ -5713,7 +5715,8 @@ var ye = {
5713
5715
  timezone: "Europe/Tallinn",
5714
5716
  tracking: {
5715
5717
  mode: "automatic",
5716
- adapter: "universal"
5718
+ adapter: "omniva",
5719
+ recognitionRank: 64
5717
5720
  },
5718
5721
  canaryUrl: "https://minu.omniva.ee/track",
5719
5722
  trackingUrlTemplate: "https://minu.omniva.ee/track/{trackingNumber}",
@@ -5733,13 +5736,22 @@ var ye = {
5733
5736
  pathPattern: "^/(?:era/jalgimine|abi/jalgimine|verslo/siuntos_sekimas)/?$",
5734
5737
  params: ["barcode"]
5735
5738
  }],
5736
- detectionRules: [{
5737
- pattern: "^JJEE\\d{17}$",
5738
- confidence: "high"
5739
- }, {
5740
- pattern: "^JJEE[A-Z]{3}\\d{11}$",
5741
- confidence: "high"
5742
- }]
5739
+ detectionRules: [
5740
+ {
5741
+ pattern: "^JJEE\\d{17}$",
5742
+ confidence: "high"
5743
+ },
5744
+ {
5745
+ pattern: "^JJEE[A-Z]{3}\\d{11}$",
5746
+ confidence: "high"
5747
+ },
5748
+ {
5749
+ pattern: "^[A-Z]{2}\\d{9}EE$",
5750
+ confidence: "low",
5751
+ checksum: "s10",
5752
+ preferred: !0
5753
+ }
5754
+ ]
5743
5755
  },
5744
5756
  "orlen-paczka": {
5745
5757
  displayName: "ORLEN Paczka",
@@ -6320,7 +6332,9 @@ var ye = {
6320
6332
  timezone: "Europe/Vilnius",
6321
6333
  tracking: {
6322
6334
  mode: "automatic",
6323
- adapter: "universal"
6335
+ adapter: "venipak",
6336
+ recognitionRank: 63,
6337
+ localClocks: !0
6324
6338
  },
6325
6339
  canaryUrl: "https://venipak.com/lt/en/parcel-tracking/",
6326
6340
  trackingUrlTemplate: "https://venipak.com/lt/en/tracking/track/{trackingNumber}",
@@ -6972,7 +6986,11 @@ var ye = {
6972
6986
  nationex: [],
6973
6987
  "nova-poshta": ["nova-poshta-domestic"],
6974
6988
  omgo: ["omgo-1"],
6975
- omniva: ["omniva-1", "omniva-2"],
6989
+ omniva: [
6990
+ "omniva-1",
6991
+ "omniva-2",
6992
+ "omniva-s10"
6993
+ ],
6976
6994
  "orlen-paczka": ["orlen-paczka-1"],
6977
6995
  "osm-worldwide": ["osm-worldwide-1"],
6978
6996
  paquetexpress: [],
@@ -11710,6 +11728,7 @@ var _c = {
11710
11728
  "dhl-express": 75,
11711
11729
  dpd: 70,
11712
11730
  "dpd-de": 65,
11731
+ "dpd-ie": 62,
11713
11732
  "dpd-pl": 8,
11714
11733
  econt: 56,
11715
11734
  elta: 55,
@@ -11733,6 +11752,7 @@ var _c = {
11733
11752
  "ninja-van": 28,
11734
11753
  "nz-post": 32,
11735
11754
  omgo: 1,
11755
+ omniva: 64,
11736
11756
  ontrac: 21,
11737
11757
  "orlen-paczka": 49,
11738
11758
  "poczta-polska": 31,
@@ -11751,7 +11771,8 @@ var _c = {
11751
11771
  tipsa: 24,
11752
11772
  tnt: 44,
11753
11773
  ukrposhta: 5,
11754
- uniuni: 33
11774
+ uniuni: 33,
11775
+ venipak: 63
11755
11776
  }, vc = 5;
11756
11777
  function yc(e) {
11757
11778
  let t = y(e);
@@ -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 class DpdIeTracker {
5
+ private readonly options;
6
+ constructor(options?: {
7
+ fetcher?: typeof fetch;
8
+ recorder?: StepRecorder;
9
+ userAgent?: string;
10
+ });
11
+ fetch(raw: string, context?: TrackingContext): Promise<CarrierResult>;
12
+ private lookup;
13
+ }
14
+ export declare const adapter: AdapterFactory;
@@ -0,0 +1,100 @@
1
+ import { accepted, recognizeFromLookup } from '../../core/adapter/index.js';
2
+ import { BudgetExceededError, ChallengeError, IndeterminateError, SchemaError } 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, userAgentOf } from '../../core/transport/index.js';
7
+ import { isDpdIeChallenge, normalizeDpdIeNumber, parseDpdIe, parseDpdIeAbsence, PROVIDER } from './parser.js';
8
+ // The tracker www.dpd.ie/tracking/ shows in a frame, with the frame's device type.
9
+ const ORIGIN = 'https://tracking.dpd.ie';
10
+ const RESULT = '/Home/SearchResult?deviceType=5';
11
+ // Where the tracker sends a consignment it does not have.
12
+ const ABSENT = '/Custom500.html?aspxerrorpath=/Home/SearchResult';
13
+ // The result page is about 10 kB.
14
+ const MAX_BYTES = 512 * 1024;
15
+ const REDIRECTS = [301, 302, 303, 307, 308];
16
+ const COOKIE = /^(ASP\.NET_SessionId|__cf_bm)=([A-Za-z0-9._~:=+/-]{1,512})(?:;|$)/;
17
+ /** The anonymous session the search opens; the result page reads the consignment from it. */
18
+ function sessionCookie(response) {
19
+ const cookies = new Map();
20
+ for (const header of response.headers.getSetCookie()) {
21
+ const match = COOKIE.exec(header);
22
+ if (match)
23
+ cookies.set(match[1], `${match[1]}=${match[2]}`);
24
+ }
25
+ return cookies.has('ASP.NET_SessionId') ? [...cookies.values()].join('; ') : null;
26
+ }
27
+ /** A redirect's target on the tracker's own host, as a path with its query, or null. */
28
+ function redirectPath(response) {
29
+ const location = response.headers.get('location');
30
+ if (!location)
31
+ return null;
32
+ try {
33
+ const target = new URL(location, `${ORIGIN}/`);
34
+ return target.origin === ORIGIN ? target.pathname + target.search : null;
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ export class DpdIeTracker {
41
+ options;
42
+ constructor(options = {}) {
43
+ this.options = options;
44
+ }
45
+ async fetch(raw, context = {}) {
46
+ const number = normalizeDpdIeNumber(raw);
47
+ const budgetMs = context.budgetMs ?? 15_000;
48
+ // A request that fails to reach DPD Ireland, or hangs, gets one more try
49
+ // with a new session: the first gets half of the budget.
50
+ return runSteps({ carrier: 'dpd-ie', budgetMs, signal: context.signal, recorder: this.options.recorder ?? NOOP_RECORDER }, [
51
+ { id: 'direct', run: ({ signal, remainingMs }) => this.lookup(number, signal, firstAttemptMs(remainingMs), budgetMs) },
52
+ networkRetryStep(({ signal, remainingMs }) => this.lookup(number, signal, remainingMs, budgetMs)),
53
+ ]);
54
+ }
55
+ async lookup(number, signal, timeoutMs, budgetMs) {
56
+ const deadline = performance.now() + timeoutMs;
57
+ const userAgent = userAgentOf(this.options.userAgent);
58
+ const read = async (path, cookie) => {
59
+ const left = deadline - performance.now();
60
+ if (left <= 0)
61
+ throw new BudgetExceededError(PROVIDER, budgetMs);
62
+ signal.throwIfAborted();
63
+ const { response, bytes } = await fetchBounded(`${ORIGIN}${path}`, { signal, headers: {
64
+ 'User-Agent': userAgent, Accept: 'text/html', ...(cookie ? { Cookie: cookie } : {}),
65
+ } }, { provider: PROVIDER, timeoutMs: Math.max(1, Math.floor(left)), maxBytes: MAX_BYTES, redirect: 'manual',
66
+ allowHttpStatuses: [...REDIRECTS, 404, 410], fetcher: this.options.fetcher });
67
+ signal.throwIfAborted();
68
+ // A missing page says nothing about the consignment.
69
+ if (response.status === 404 || response.status === 410)
70
+ throw new IndeterminateError(PROVIDER, 'DPD Ireland tracking is unavailable');
71
+ return { response, html: decodeText(bytes) };
72
+ };
73
+ // The search stores the number in a new session and sends the browser to the result page.
74
+ const search = await read(`/?${new URLSearchParams({ deviceType: '5', consignmentNumber: number })}`);
75
+ if (!REDIRECTS.includes(search.response.status)) {
76
+ if (isDpdIeChallenge(search.html))
77
+ throw new ChallengeError(PROVIDER, 'DPD Ireland asked for a browser check');
78
+ throw new SchemaError(PROVIDER, 'DPD Ireland did not accept the consignment number');
79
+ }
80
+ const cookie = sessionCookie(search.response);
81
+ if (redirectPath(search.response) !== RESULT || !cookie) {
82
+ throw new IndeterminateError(PROVIDER, 'DPD Ireland did not open a tracking session');
83
+ }
84
+ const result = await read(RESULT, cookie);
85
+ if (REDIRECTS.includes(result.response.status)) {
86
+ if (redirectPath(result.response) !== ABSENT)
87
+ throw new IndeterminateError(PROVIDER, 'DPD Ireland did not keep the tracking session');
88
+ return parseDpdIeAbsence((await read(ABSENT)).html);
89
+ }
90
+ return parseDpdIe(result.html, number);
91
+ }
92
+ }
93
+ export const adapter = environment => {
94
+ const tracker = new DpdIeTracker({ fetcher: environment.fetcher, recorder: environment.recorder, userAgent: environment.userAgent });
95
+ return {
96
+ id: 'dpd-ie', recordsSteps: true, steps: ['direct', 'retry'],
97
+ track: (input, context) => tracker.fetch(input.number, context),
98
+ recognize: (number, context) => recognizeFromLookup(() => tracker.fetch(number, context), () => accepted(() => normalizeDpdIeNumber(number))),
99
+ };
100
+ };
@@ -16,18 +16,50 @@
16
16
  "timezone": "Europe/Dublin",
17
17
  "tracking": {
18
18
  "mode": "automatic",
19
- "adapter": "universal",
20
- "steps": []
19
+ "adapter": "dpd-ie",
20
+ "steps": [
21
+ "direct",
22
+ "retry"
23
+ ],
24
+ "recognition": {
25
+ "rank": 62
26
+ },
27
+ "localClocks": true
21
28
  },
22
- "capabilities": [],
29
+ "capabilities": [
30
+ "history",
31
+ "location",
32
+ "eta",
33
+ "delivered_at"
34
+ ],
23
35
  "portal": {
24
36
  "url": "https://www.dpd.ie/tracking/?consignmentNumber={trackingNumber}",
25
37
  "searchUrl": "https://www.dpd.ie/tracking/",
26
38
  "canaryUrl": "https://www.dpd.ie/tracking/",
27
- "shows": [],
28
- "scraped": [],
29
- "discarded": [],
30
- "unavailable": []
39
+ "shows": [
40
+ "status",
41
+ "history",
42
+ "location",
43
+ "eta",
44
+ "eta_window",
45
+ "parcel_count"
46
+ ],
47
+ "scraped": [
48
+ "status",
49
+ "history",
50
+ "location",
51
+ "eta",
52
+ "eta_window",
53
+ "delivered_at"
54
+ ],
55
+ "discarded": [
56
+ "parcel_count"
57
+ ],
58
+ "unavailable": [
59
+ "weight",
60
+ "sender_name",
61
+ "offset_timestamps"
62
+ ]
31
63
  },
32
64
  "links": [
33
65
  {
@@ -244,13 +244,13 @@
244
244
  "access": "indexed_excerpt"
245
245
  },
246
246
  "context": {
247
- "assessment": "candidate"
247
+ "assessment": "confirmed"
248
248
  },
249
249
  "expect": {
250
250
  "carrier": "unknown",
251
251
  "confidence": "none"
252
252
  },
253
- "note": "Looked up on DPD Ireland's own tracker, as an archived address shows; the capture was not opened."
253
+ "note": "Looked up on DPD Ireland's own tracker, as an archived address shows. DPD Ireland's tracker returns its history."
254
254
  }
255
255
  ]
256
256
  }
@@ -0,0 +1,19 @@
1
+ import type { CarrierResult } from '../../core/result/index.js';
2
+ export declare const PROVIDER = "DPD Ireland";
3
+ export declare const DPD_IE_ZONE = "Europe/Dublin";
4
+ /** A DPD Ireland consignment number: nine or ten digits. */
5
+ export declare function normalizeDpdIeNumber(raw: string): string;
6
+ /** Cloudflare's challenge page in place of the tracker. Its passive script on ordinary pages is not one. */
7
+ export declare function isDpdIeChallenge(html: string): boolean;
8
+ /**
9
+ * The page the tracker sends an unknown consignment to. A redirect to it is
10
+ * the tracker's only answer for a number it does not have, so its notice must
11
+ * be the not-found one.
12
+ */
13
+ export declare function parseDpdIeAbsence(html: string): never;
14
+ /**
15
+ * The tracker's result for one consignment: its scans, oldest first, and a
16
+ * headline with the current status. A consignment of several parcels repeats
17
+ * each scan once per parcel.
18
+ */
19
+ export declare function parseDpdIe(html: string, raw: string): CarrierResult;