universal-parcel-scraper 0.573.0-main.2684 → 0.577.1-main.2704

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 (47) hide show
  1. package/README.md +1 -1
  2. package/data/catalog.json +11 -3
  3. package/data/detection-golden.json +147 -78
  4. package/dist/browser/scraper.js +12 -3
  5. package/dist/carriers/17feia/parser.js +11 -3
  6. package/dist/carriers/17feia/status.js +2 -0
  7. package/dist/carriers/17feia/statuses.json +1 -0
  8. package/dist/carriers/aliexpress/adapter.d.ts +11 -0
  9. package/dist/carriers/aliexpress/adapter.js +28 -4
  10. package/dist/carriers/brt/adapter.d.ts +7 -1
  11. package/dist/carriers/brt/adapter.js +30 -5
  12. package/dist/carriers/brt/parser.d.ts +18 -0
  13. package/dist/carriers/brt/parser.js +65 -2
  14. package/dist/carriers/chunghwa-post/parser.js +22 -2
  15. package/dist/carriers/correios-br/carrier.json +3 -1
  16. package/dist/carriers/dhl-express/status.js +6 -3
  17. package/dist/carriers/dhl-express/statuses.json +9 -0
  18. package/dist/carriers/dpd-uk/adapter.d.ts +1 -1
  19. package/dist/carriers/dpd-uk/adapter.js +4 -1
  20. package/dist/carriers/dpd-uk/carrier.json +5 -2
  21. package/dist/carriers/dpd-uk/numbers.json +26 -0
  22. package/dist/carriers/dpd-uk/parser.js +24 -7
  23. package/dist/carriers/imile/adapter.d.ts +8 -1
  24. package/dist/carriers/imile/adapter.js +60 -8
  25. package/dist/carriers/imile/cainiao.d.ts +18 -0
  26. package/dist/carriers/imile/cainiao.js +109 -0
  27. package/dist/carriers/imile/carrier.json +2 -1
  28. package/dist/carriers/imile/parser.d.ts +3 -1
  29. package/dist/carriers/imile/parser.js +14 -9
  30. package/dist/carriers/imile/status.d.ts +1 -0
  31. package/dist/carriers/imile/status.js +8 -1
  32. package/dist/carriers/japan-post/adapter.js +20 -8
  33. package/dist/carriers/poste-italiane/carrier.json +6 -1
  34. package/dist/carriers/poste-italiane/numbers.json +24 -0
  35. package/dist/carriers/tsjy/parser.js +24 -8
  36. package/dist/carriers/ups/status.js +5 -6
  37. package/dist/carriers/ups/statuses.json +1 -1
  38. package/dist/carriers/yto/adapter.d.ts +2 -1
  39. package/dist/carriers/yto/adapter.js +22 -15
  40. package/dist/carriers/yto/carrier.json +2 -1
  41. package/dist/core/catalog/hints.js +11 -9
  42. package/dist/data/catalog.json +11 -3
  43. package/dist/generated/catalog.d.ts +8 -3
  44. package/dist/generated/catalog.js +12 -4
  45. package/dist/generated/recognition.js +1 -0
  46. package/dist/server/openapi.json +1 -1
  47. package/package.json +1 -1
package/README.md CHANGED
@@ -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 16,184 such statuses, each filed under one stage.
158
+ The carrier folders record 16,186 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
@@ -2754,7 +2754,11 @@
2754
2754
  "confidence": "high"
2755
2755
  },
2756
2756
  {
2757
- "pattern": "^(?:[13]UW[A-Z0-9]{10}|5P[A-Z0-9]{11})$",
2757
+ "pattern": "^(?:[138]UW[A-Z0-9]{10}|5P[A-Z0-9]{11})$",
2758
+ "confidence": "high"
2759
+ },
2760
+ {
2761
+ "pattern": "^JJITA[A-Z0-9]{13}$",
2758
2762
  "confidence": "high"
2759
2763
  },
2760
2764
  {
@@ -3543,6 +3547,9 @@
3543
3547
  "correios-br": {
3544
3548
  "displayName": "Correios Brazil",
3545
3549
  "color": "#ffd500",
3550
+ "aliases": [
3551
+ "Brazil Post"
3552
+ ],
3546
3553
  "countries": [
3547
3554
  "BR"
3548
3555
  ],
@@ -11667,6 +11674,7 @@
11667
11674
  "tracking": {
11668
11675
  "mode": "automatic",
11669
11676
  "adapter": "dpd-uk",
11677
+ "recognitionRank": 858,
11670
11678
  "localClocks": true
11671
11679
  },
11672
11680
  "canaryUrl": "https://track.dpd.co.uk/",
@@ -11686,12 +11694,12 @@
11686
11694
  ],
11687
11695
  "detectionRules": [
11688
11696
  {
11689
- "pattern": "^1550\\d{10}$",
11697
+ "pattern": "^15(?:50|97)\\d{10}$",
11690
11698
  "confidence": "low",
11691
11699
  "preferred": true
11692
11700
  },
11693
11701
  {
11694
- "pattern": "^1550\\d{10}[0-9A-Z]$",
11702
+ "pattern": "^15(?:50|97)\\d{10}[0-9A-Z]$",
11695
11703
  "confidence": "low",
11696
11704
  "checksum": "dpd",
11697
11705
  "preferred": true
@@ -3978,7 +3978,8 @@
3978
3978
  "asked": [
3979
3979
  "dpd",
3980
3980
  "dpd-de",
3981
- "chronopost"
3981
+ "chronopost",
3982
+ "dpd-uk"
3982
3983
  ]
3983
3984
  },
3984
3985
  {
@@ -4626,6 +4627,7 @@
4626
4627
  "dpd",
4627
4628
  "dpd-de",
4628
4629
  "chronopost",
4630
+ "dpd-uk",
4629
4631
  "brt"
4630
4632
  ]
4631
4633
  },
@@ -7476,7 +7478,8 @@
7476
7478
  "asked": [
7477
7479
  "dpd",
7478
7480
  "dpd-de",
7479
- "chronopost"
7481
+ "chronopost",
7482
+ "dpd-uk"
7480
7483
  ]
7481
7484
  },
7482
7485
  {
@@ -8921,7 +8924,8 @@
8921
8924
  "asked": [
8922
8925
  "dpd",
8923
8926
  "dpd-de",
8924
- "chronopost"
8927
+ "chronopost",
8928
+ "dpd-uk"
8925
8929
  ]
8926
8930
  },
8927
8931
  {
@@ -8983,7 +8987,8 @@
8983
8987
  "dpd-pt",
8984
8988
  "dpd",
8985
8989
  "dpd-de",
8986
- "chronopost"
8990
+ "chronopost",
8991
+ "dpd-uk"
8987
8992
  ]
8988
8993
  },
8989
8994
  {
@@ -9004,7 +9009,8 @@
9004
9009
  "dpd-pt",
9005
9010
  "dpd",
9006
9011
  "dpd-de",
9007
- "chronopost"
9012
+ "chronopost",
9013
+ "dpd-uk"
9008
9014
  ]
9009
9015
  },
9010
9016
  {
@@ -9025,7 +9031,8 @@
9025
9031
  "dpd-pt",
9026
9032
  "dpd",
9027
9033
  "dpd-de",
9028
- "chronopost"
9034
+ "chronopost",
9035
+ "dpd-uk"
9029
9036
  ]
9030
9037
  },
9031
9038
  {
@@ -9056,7 +9063,8 @@
9056
9063
  "dpd-pt",
9057
9064
  "dpd",
9058
9065
  "dpd-de",
9059
- "chronopost"
9066
+ "chronopost",
9067
+ "dpd-uk"
9060
9068
  ]
9061
9069
  },
9062
9070
  {
@@ -9077,7 +9085,8 @@
9077
9085
  "dpd-pt",
9078
9086
  "dpd",
9079
9087
  "dpd-de",
9080
- "chronopost"
9088
+ "chronopost",
9089
+ "dpd-uk"
9081
9090
  ]
9082
9091
  },
9083
9092
  {
@@ -9127,7 +9136,8 @@
9127
9136
  "dpd-pt",
9128
9137
  "dpd",
9129
9138
  "dpd-de",
9130
- "chronopost"
9139
+ "chronopost",
9140
+ "dpd-uk"
9131
9141
  ]
9132
9142
  },
9133
9143
  {
@@ -14323,7 +14333,8 @@
14323
14333
  "asked": [
14324
14334
  "dpd",
14325
14335
  "dpd-de",
14326
- "chronopost"
14336
+ "chronopost",
14337
+ "dpd-uk"
14327
14338
  ]
14328
14339
  },
14329
14340
  {
@@ -15149,7 +15160,8 @@
15149
15160
  "dpd-pl",
15150
15161
  "dpd",
15151
15162
  "dpd-de",
15152
- "chronopost"
15163
+ "chronopost",
15164
+ "dpd-uk"
15153
15165
  ]
15154
15166
  },
15155
15167
  {
@@ -16633,11 +16645,11 @@
16633
16645
  "dpd-uk"
16634
16646
  ],
16635
16647
  "asked": [
16636
- "seur",
16637
- "brt",
16638
- "ciblex",
16639
- "dhl-ecommerce-uk",
16640
- "delhivery"
16648
+ "dpd-uk",
16649
+ "dpd-be",
16650
+ "dpd",
16651
+ "dpd-nl",
16652
+ "dpd-de"
16641
16653
  ]
16642
16654
  },
16643
16655
  {
@@ -16661,10 +16673,11 @@
16661
16673
  "dpd-uk"
16662
16674
  ],
16663
16675
  "asked": [
16664
- "seur",
16665
- "brt",
16666
- "ciblex",
16667
- "dhl-ecommerce-uk"
16676
+ "dpd-uk",
16677
+ "dpd-be",
16678
+ "dpd",
16679
+ "dpd-nl",
16680
+ "dpd-de"
16668
16681
  ]
16669
16682
  },
16670
16683
  {
@@ -16709,6 +16722,9 @@
16709
16722
  "dpd-uk"
16710
16723
  ],
16711
16724
  "asked": [
16725
+ "dpd-uk",
16726
+ "dpd",
16727
+ "dpd-de",
16712
16728
  "chronopost",
16713
16729
  "brt"
16714
16730
  ]
@@ -16732,6 +16748,9 @@
16732
16748
  "dpd-uk"
16733
16749
  ],
16734
16750
  "asked": [
16751
+ "dpd-uk",
16752
+ "dpd",
16753
+ "dpd-de",
16735
16754
  "chronopost",
16736
16755
  "brt"
16737
16756
  ]
@@ -16750,6 +16769,9 @@
16750
16769
  "dpd-uk"
16751
16770
  ],
16752
16771
  "asked": [
16772
+ "dpd-uk",
16773
+ "dpd",
16774
+ "dpd-de",
16753
16775
  "chronopost"
16754
16776
  ]
16755
16777
  },
@@ -16775,11 +16797,11 @@
16775
16797
  "dpd-uk"
16776
16798
  ],
16777
16799
  "asked": [
16778
- "seur",
16779
- "brt",
16780
- "ciblex",
16781
- "dhl-ecommerce-uk",
16782
- "delhivery"
16800
+ "dpd-uk",
16801
+ "dpd-be",
16802
+ "dpd",
16803
+ "dpd-nl",
16804
+ "dpd-de"
16783
16805
  ]
16784
16806
  },
16785
16807
  {
@@ -16803,10 +16825,11 @@
16803
16825
  "dpd-uk"
16804
16826
  ],
16805
16827
  "asked": [
16806
- "seur",
16807
- "brt",
16808
- "ciblex",
16809
- "dhl-ecommerce-uk"
16828
+ "dpd-uk",
16829
+ "dpd-be",
16830
+ "dpd",
16831
+ "dpd-nl",
16832
+ "dpd-de"
16810
16833
  ]
16811
16834
  },
16812
16835
  {
@@ -16831,11 +16854,11 @@
16831
16854
  "dpd-uk"
16832
16855
  ],
16833
16856
  "asked": [
16834
- "seur",
16835
- "brt",
16836
- "ciblex",
16837
- "dhl-ecommerce-uk",
16838
- "delhivery"
16857
+ "dpd-uk",
16858
+ "dpd-be",
16859
+ "dpd",
16860
+ "dpd-nl",
16861
+ "dpd-de"
16839
16862
  ]
16840
16863
  },
16841
16864
  {
@@ -16860,11 +16883,11 @@
16860
16883
  "dpd-uk"
16861
16884
  ],
16862
16885
  "asked": [
16863
- "seur",
16864
- "brt",
16865
- "ciblex",
16866
- "dhl-ecommerce-uk",
16867
- "delhivery"
16886
+ "dpd-uk",
16887
+ "dpd-be",
16888
+ "dpd",
16889
+ "dpd-nl",
16890
+ "dpd-de"
16868
16891
  ]
16869
16892
  },
16870
16893
  {
@@ -16889,11 +16912,11 @@
16889
16912
  "dpd-uk"
16890
16913
  ],
16891
16914
  "asked": [
16892
- "seur",
16893
- "brt",
16894
- "ciblex",
16895
- "dhl-ecommerce-uk",
16896
- "delhivery"
16915
+ "dpd-uk",
16916
+ "dpd-be",
16917
+ "dpd",
16918
+ "dpd-nl",
16919
+ "dpd-de"
16897
16920
  ]
16898
16921
  },
16899
16922
  {
@@ -16918,11 +16941,11 @@
16918
16941
  "dpd-uk"
16919
16942
  ],
16920
16943
  "asked": [
16921
- "seur",
16922
- "brt",
16923
- "ciblex",
16924
- "dhl-ecommerce-uk",
16925
- "delhivery"
16944
+ "dpd-uk",
16945
+ "dpd-be",
16946
+ "dpd",
16947
+ "dpd-nl",
16948
+ "dpd-de"
16926
16949
  ]
16927
16950
  },
16928
16951
  {
@@ -16947,11 +16970,11 @@
16947
16970
  "dpd-uk"
16948
16971
  ],
16949
16972
  "asked": [
16950
- "seur",
16951
- "brt",
16952
- "ciblex",
16953
- "dhl-ecommerce-uk",
16954
- "delhivery"
16973
+ "dpd-uk",
16974
+ "dpd-be",
16975
+ "dpd",
16976
+ "dpd-nl",
16977
+ "dpd-de"
16955
16978
  ]
16956
16979
  },
16957
16980
  {
@@ -16976,11 +16999,11 @@
16976
16999
  "dpd-uk"
16977
17000
  ],
16978
17001
  "asked": [
16979
- "seur",
16980
- "brt",
16981
- "ciblex",
16982
- "dhl-ecommerce-uk",
16983
- "delhivery"
17002
+ "dpd-uk",
17003
+ "dpd-be",
17004
+ "dpd",
17005
+ "dpd-nl",
17006
+ "dpd-de"
16984
17007
  ]
16985
17008
  },
16986
17009
  {
@@ -17005,11 +17028,11 @@
17005
17028
  "dpd-uk"
17006
17029
  ],
17007
17030
  "asked": [
17008
- "seur",
17009
- "brt",
17010
- "ciblex",
17011
- "dhl-ecommerce-uk",
17012
- "delhivery"
17031
+ "dpd-uk",
17032
+ "dpd-be",
17033
+ "dpd",
17034
+ "dpd-nl",
17035
+ "dpd-de"
17013
17036
  ]
17014
17037
  },
17015
17038
  {
@@ -17034,11 +17057,11 @@
17034
17057
  "dpd-uk"
17035
17058
  ],
17036
17059
  "asked": [
17037
- "seur",
17038
- "brt",
17039
- "ciblex",
17040
- "dhl-ecommerce-uk",
17041
- "delhivery"
17060
+ "dpd-uk",
17061
+ "dpd-be",
17062
+ "dpd",
17063
+ "dpd-nl",
17064
+ "dpd-de"
17042
17065
  ]
17043
17066
  },
17044
17067
  {
@@ -17064,11 +17087,11 @@
17064
17087
  "dpd-uk"
17065
17088
  ],
17066
17089
  "asked": [
17090
+ "dpd-uk",
17067
17091
  "hermes-de",
17068
- "seur",
17069
- "brt",
17070
- "ciblex",
17071
- "dhl-ecommerce-uk"
17092
+ "dpd-be",
17093
+ "dpd",
17094
+ "dpd-nl"
17072
17095
  ]
17073
17096
  },
17074
17097
  {
@@ -17093,11 +17116,11 @@
17093
17116
  "dpd-uk"
17094
17117
  ],
17095
17118
  "asked": [
17096
- "seur",
17097
- "brt",
17098
- "ciblex",
17099
- "dhl-ecommerce-uk",
17100
- "delhivery"
17119
+ "dpd-uk",
17120
+ "dpd-be",
17121
+ "dpd",
17122
+ "dpd-nl",
17123
+ "dpd-de"
17101
17124
  ]
17102
17125
  },
17103
17126
  {
@@ -17484,6 +17507,35 @@
17484
17507
  "dhl-ecommerce-es"
17485
17508
  ]
17486
17509
  },
17510
+ {
17511
+ "input": "15970000000000",
17512
+ "carrier": "unknown",
17513
+ "confidence": "low",
17514
+ "candidates": [
17515
+ "dpd-uk",
17516
+ "dpd",
17517
+ "dpd-fr",
17518
+ "ciblex",
17519
+ "seur",
17520
+ "brt",
17521
+ "delhivery",
17522
+ "dhl-ecommerce-uk",
17523
+ "dpd-be",
17524
+ "dpd-de",
17525
+ "dpd-nl",
17526
+ "xpressbees"
17527
+ ],
17528
+ "preferred": [
17529
+ "dpd-uk"
17530
+ ],
17531
+ "asked": [
17532
+ "dpd-uk",
17533
+ "dpd-be",
17534
+ "dpd",
17535
+ "dpd-nl",
17536
+ "dpd-de"
17537
+ ]
17538
+ },
17487
17539
  {
17488
17540
  "input": "15BAEB8A",
17489
17541
  "carrier": "unknown",
@@ -37444,6 +37496,7 @@
37444
37496
  "dpd",
37445
37497
  "dpd-de",
37446
37498
  "chronopost",
37499
+ "dpd-uk",
37447
37500
  "brt"
37448
37501
  ]
37449
37502
  },
@@ -56958,6 +57011,14 @@
56958
57011
  "la-poste"
56959
57012
  ]
56960
57013
  },
57014
+ {
57015
+ "input": "8UW1A2B345678",
57016
+ "carrier": "poste-italiane",
57017
+ "confidence": "high",
57018
+ "candidates": [
57019
+ "poste-italiane"
57020
+ ]
57021
+ },
56961
57022
  {
56962
57023
  "input": "8YDR098765432",
56963
57024
  "carrier": "inpost",
@@ -74924,6 +74985,14 @@
74924
74985
  "posti"
74925
74986
  ]
74926
74987
  },
74988
+ {
74989
+ "input": "JJITA8UW1A2B345678",
74990
+ "carrier": "poste-italiane",
74991
+ "confidence": "high",
74992
+ "candidates": [
74993
+ "poste-italiane"
74994
+ ]
74995
+ },
74927
74996
  {
74928
74997
  "input": "JJS000390015480117223",
74929
74998
  "carrier": "unknown",
@@ -2492,7 +2492,11 @@ var Ye = {
2492
2492
  confidence: "high"
2493
2493
  },
2494
2494
  {
2495
- pattern: "^(?:[13]UW[A-Z0-9]{10}|5P[A-Z0-9]{11})$",
2495
+ pattern: "^(?:[138]UW[A-Z0-9]{10}|5P[A-Z0-9]{11})$",
2496
+ confidence: "high"
2497
+ },
2498
+ {
2499
+ pattern: "^JJITA[A-Z0-9]{13}$",
2496
2500
  confidence: "high"
2497
2501
  },
2498
2502
  {
@@ -3123,6 +3127,7 @@ var Ye = {
3123
3127
  "correios-br": {
3124
3128
  displayName: "Correios Brazil",
3125
3129
  color: "#ffd500",
3130
+ aliases: ["Brazil Post"],
3126
3131
  countries: ["BR"],
3127
3132
  selectable: !0,
3128
3133
  timezone: "UTC",
@@ -9138,6 +9143,7 @@ var Ye = {
9138
9143
  tracking: {
9139
9144
  mode: "automatic",
9140
9145
  adapter: "dpd-uk",
9146
+ recognitionRank: 858,
9141
9147
  localClocks: !0
9142
9148
  },
9143
9149
  canaryUrl: "https://track.dpd.co.uk/",
@@ -9149,12 +9155,12 @@ var Ye = {
9149
9155
  }],
9150
9156
  detectionRules: [
9151
9157
  {
9152
- pattern: "^1550\\d{10}$",
9158
+ pattern: "^15(?:50|97)\\d{10}$",
9153
9159
  confidence: "low",
9154
9160
  preferred: !0
9155
9161
  },
9156
9162
  {
9157
- pattern: "^1550\\d{10}[0-9A-Z]$",
9163
+ pattern: "^15(?:50|97)\\d{10}[0-9A-Z]$",
9158
9164
  confidence: "low",
9159
9165
  checksum: "dpd",
9160
9166
  preferred: !0
@@ -23791,6 +23797,7 @@ var Ye = {
23791
23797
  "poste-italiane": [
23792
23798
  "poste-italiane-1",
23793
23799
  "poste-italiane-2",
23800
+ "poste-italiane-plate",
23794
23801
  "poste-italiane-3",
23795
23802
  "poste-italiane-4",
23796
23803
  "poste-italiane-delivery-europe",
@@ -29632,6 +29639,7 @@ var tl = /* @__PURE__ */ new Map([
29632
29639
  ["AU", "australia-post"],
29633
29640
  ["BD", "bangladesh-post"],
29634
29641
  ["BG", "bulgarian-posts"],
29642
+ ["BR", "correios-br"],
29635
29643
  ["BY", "belpost"],
29636
29644
  ["CA", "canada-post"],
29637
29645
  ["CH", "swiss-post"],
@@ -29993,6 +30001,7 @@ var Nl = {
29993
30001
  "dpd-pl": 520,
29994
30002
  "dpd-pt": 894,
29995
30003
  "dpd-ro": 934,
30004
+ "dpd-uk": 858,
29996
30005
  "dpd-za": 883,
29997
30006
  dpex: 772,
29998
30007
  "dragon-star-curier": 828,
@@ -16,6 +16,12 @@ const WALL_CLOCK = /^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})$/;
16
16
  const OFFSET = /^[+-]\d{2}:\d{2}$/;
17
17
  // 17FEIA's backend keeps the order data on Beijing time; a row kept as a wall clock is read in it only to hold back future ones.
18
18
  const HOME_ZONE = 'Asia/Shanghai';
19
+ /**
20
+ * 17FEIA's steps at its warehouse in China before the flight. The backend
21
+ * writes them on Beijing time, as it writes the warehouse's receipt; the
22
+ * offset they carry is the destination line's, whatever the step's clock.
23
+ */
24
+ const WAREHOUSE_STEPS = new Set(['包裹在去设施路上', '订单待客户确认', '订单已确认', '订单已出库', '出口报关中']);
19
25
  // States whose places keep different clocks, so a state does not settle a clock's zone.
20
26
  const SPLIT_STATES = new Set(['AK', 'AZ', 'FL', 'ID', 'IN', 'KS', 'KY', 'MI', 'ND', 'NE', 'NV', 'OR', 'SD', 'TN', 'TX']);
21
27
  const MAX_ROWS = 500;
@@ -74,14 +80,16 @@ function placedTime(local, label, country, state) {
74
80
  return null;
75
81
  return { iso: placed.toISO({ suppressMilliseconds: true }), timestamp: placed.toMillis() };
76
82
  }
77
- /** A row's clock: its instant where its place settles one, else its wall clock. */
78
- function clockOf(stamp, label, country, state) {
83
+ /** A row's clock: its instant where its place or its step at the warehouse settles one, else its wall clock. */
84
+ function clockOf(stamp, step, label, country, state) {
79
85
  const wall = WALL_CLOCK.exec(stamp);
80
86
  const local = wall ? `${wall[1]}T${wall[2]}` : '';
81
87
  const home = local ? firstOccurrence(DateTime.fromISO(local, { zone: HOME_ZONE })) : null;
82
88
  // Luxon rolls 24:00:00 over to the next day; only a clock that reads back unchanged is kept.
83
89
  if (!home?.isValid || home.toFormat("yyyy-MM-dd'T'HH:mm:ss") !== local)
84
90
  throw new SchemaError(PROVIDER, '17FEIA returned an invalid scan time');
91
+ if (WAREHOUSE_STEPS.has(step))
92
+ return { time: home.toISO({ suppressMilliseconds: true }), at: home.toMillis() };
85
93
  const time = placedTime(local, label, country, state);
86
94
  return time ? { time: time.iso, at: time.timestamp } : { local_time: local, at: home.toMillis() };
87
95
  }
@@ -95,7 +103,7 @@ function projectRow(row, readAt) {
95
103
  const stamp = text(row, 'createTime', 64);
96
104
  const country = text(row, 'country', 8).toUpperCase();
97
105
  // A US row's state is read only for its clock.
98
- const { at, ...clock } = clockOf(stamp, text(row, 'timeZone', 16), country, country === 'US' ? text(row, 'state', 8).toUpperCase() : '');
106
+ const { at, ...clock } = clockOf(stamp, label, text(row, 'timeZone', 16), country, country === 'US' ? text(row, 'state', 8).toUpperCase() : '');
99
107
  // A row dated after the read is not a scan yet.
100
108
  if (at > readAt)
101
109
  return null;
@@ -27,6 +27,8 @@ const LABELS = new Map([
27
27
  ['清关行提货到仓', 'customs'],
28
28
  ['清关中', 'customs'],
29
29
  ['清关完成', 'in_transit'],
30
+ // Handed in at the partner's depot, before the partner's own first scan.
31
+ ['已交仓,等待上网', 'in_transit'],
30
32
  ['成功签收', 'delivered'],
31
33
  ]);
32
34
  /** The label on rows relayed from the delivering partner: their wording is the partner's. */
@@ -18,6 +18,7 @@
18
18
  {"code": "清关行提货到仓", "wording": "Broker picked up Shipment and delivered to warehouse.", "stage": "customs", "language": "en", "confirmedBy": "live", "note": "The customs broker takes the shipment to its warehouse for clearance; the shared rules would read a delivery."},
19
19
  {"code": "清关中", "wording": "Customs Clearance is in progress.", "stage": "customs", "language": "en", "confirmedBy": "live"},
20
20
  {"code": "清关完成", "wording": "Customs Clearance Completed.", "stage": "in_transit", "language": "en", "confirmedBy": "live"},
21
+ {"code": "已交仓,等待上网", "wording": "Arrived at delivery hub,Awaiting carrie scan.", "stage": "in_transit", "language": "en", "confirmedBy": "live", "note": "After the clearance, before the delivering partner's first scan: the parcel was handed in at the partner's depot and waits to enter its system."},
21
22
  {"code": "运输途中", "wording": "The international shipment has been processed in the parcel center of origin", "stage": "in_transit", "language": "en", "confirmedBy": "live", "note": "Relayed from DHL in Germany, with DHL's place, country and offset. The label marks every relayed row; the stage comes from the partner's wording."},
22
23
  {"code": "运输途中", "wording": "The international shipment has been processed in the export parcel center", "stage": "in_transit", "language": "en", "confirmedBy": "live", "note": "Relayed from DHL in Germany."},
23
24
  {"code": "运输途中", "wording": "The shipment will be transported to the destination country/destination area and, from there, handed over to the delivery organization.", "stage": "in_transit", "language": "en", "confirmedBy": "live", "note": "Relayed from DHL in Germany, for a parcel bound for France."},
@@ -21,6 +21,11 @@
21
21
  */
22
22
  import { type AdapterFactory, type TrackingContext } from '../../core/adapter/index.js';
23
23
  import type { CarrierResult } from '../../core/result/index.js';
24
+ /**
25
+ * The carriers a `detail.json` payload names for the number asked, in lower
26
+ * case: the destination carrier and each scan's carrier.
27
+ */
28
+ export declare function cainiaoCarrierNames(value: unknown, trackingNumber: string): ReadonlySet<string>;
24
29
  /** Projects one `detail.json` payload. Pure: the offline tests target this. */
25
30
  export declare function parseCainiaoTrackingResponse(value: unknown, trackingNumber: string): CarrierResult;
26
31
  export declare class CainiaoTracker {
@@ -33,7 +38,13 @@ export declare class CainiaoTracker {
33
38
  userAgent?: string;
34
39
  });
35
40
  fetch(trackingNumber: string, context?: TrackingContext): Promise<CarrierResult>;
41
+ /**
42
+ * The global feed's `detail.json` reply for a number, unparsed, for a
43
+ * carrier that reads Cainiao's leg of its own parcels.
44
+ */
45
+ detail(trackingNumber: string, context?: TrackingContext): Promise<unknown>;
36
46
  private read;
47
+ private payload;
37
48
  }
38
49
  /** Kept for the host's legacy dispatch chain until it is deleted. */
39
50
  export declare function fetchCainiao(trackingNumber: string, context?: TrackingContext): Promise<CarrierResult>;