universal-parcel-scraper 0.577.2-main.2708 → 0.577.3-main.2713
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/README.md +1 -1
- package/dist/carriers/japan-post/adapter.js +9 -3
- package/dist/carriers/japan-post/status.js +3 -0
- package/dist/carriers/japan-post/statuses.json +8 -0
- package/dist/carriers/yanwen/status.js +1 -0
- package/dist/carriers/yanwen/statuses.json +8 -0
- package/dist/providers/shared/result.js +3 -0
- package/dist/server/openapi.json +1 -1
- 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,
|
|
158
|
+
The carrier folders record 16,189 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.
|
|
@@ -173,14 +173,20 @@ export function parse(html, trackingNumber) {
|
|
|
173
173
|
return true;
|
|
174
174
|
});
|
|
175
175
|
const latest = latestFirst[0];
|
|
176
|
-
|
|
176
|
+
// A delivery stands against the destination post's rows after it, such as
|
|
177
|
+
// its customs system returning the item an hour after the delivery; only a
|
|
178
|
+
// return or another problem says more.
|
|
179
|
+
const delivery = latestFirst.findIndex((event) => event.stage === 'delivered');
|
|
180
|
+
const current = delivery > 0 && latestFirst.slice(0, delivery)
|
|
181
|
+
.every((event) => japanPostStatus(event.description)?.status !== 'exception') ? latestFirst[delivery] : latest;
|
|
182
|
+
const status = japanPostStatus(current.description);
|
|
177
183
|
const settled = status && (status.status === 'exception' || ['delivered', 'returned', 'ready_for_pickup'].includes(status.stage));
|
|
178
184
|
// The class of goods is the Japan Post service the item travels under: Yu-Pack, or EMS or Parcel abroad.
|
|
179
185
|
const service = clean(fields.get('Class of goods'), 80);
|
|
180
186
|
return { status: status?.status ?? 'unknown', ...(status ? { current_stage: status.stage } : {}),
|
|
181
|
-
last_status_text:
|
|
187
|
+
last_status_text: current.description, last_update: latest.time ?? null, last_update_local: latest.local_time,
|
|
182
188
|
expected_delivery: settled ? null : designatedDelivery(fields, String(latest.local_time)),
|
|
183
|
-
...(status?.stage === 'delivered' &&
|
|
189
|
+
...(status?.stage === 'delivered' && current.time ? { delivered_at: current.time } : {}),
|
|
184
190
|
...(service ? { service_name: service } : {}), events: latestFirst.slice(0, 100) };
|
|
185
191
|
}
|
|
186
192
|
/**
|
|
@@ -12,6 +12,9 @@ const STATUS = new Map([
|
|
|
12
12
|
['Item returned from import Customs', { status: 'in_transit', stage: 'in_transit' }],
|
|
13
13
|
['Departure from inward office of exchange', { status: 'in_transit', stage: 'in_transit' }],
|
|
14
14
|
['Item out of sorting centre', { status: 'in_transit', stage: 'in_transit' }],
|
|
15
|
+
// The destination post's delivery office has the item; like Retention, the
|
|
16
|
+
// label does not say whether the recipient can collect it.
|
|
17
|
+
['Item held at delivery depot/delivery office', { status: 'in_transit', stage: 'in_transit' }],
|
|
15
18
|
['Processing at delivery Post Office', { status: 'in_transit', stage: 'in_transit' }],
|
|
16
19
|
['Item out for physical delivery', { status: 'out_for_delivery', stage: 'out_for_delivery' }],
|
|
17
20
|
['Final delivery', { status: 'delivered', stage: 'delivered' }],
|
|
@@ -79,6 +79,14 @@
|
|
|
79
79
|
"firstSeen": "2026-10-08",
|
|
80
80
|
"note": "Destination-country sorting scan on an international item."
|
|
81
81
|
},
|
|
82
|
+
{
|
|
83
|
+
"wording": "Item held at delivery depot/delivery office",
|
|
84
|
+
"language": "en",
|
|
85
|
+
"stage": "in_transit",
|
|
86
|
+
"confirmedBy": "live",
|
|
87
|
+
"firstSeen": "2026-10-20",
|
|
88
|
+
"note": "The destination post's delivery office has the item, logged with its round and delivery; it does not say the recipient can collect it."
|
|
89
|
+
},
|
|
82
90
|
{
|
|
83
91
|
"wording": "Processing at delivery Post Office",
|
|
84
92
|
"language": "en",
|
|
@@ -34,6 +34,7 @@ const WORDING = new Map([
|
|
|
34
34
|
['Votre Colissimo va bientôt nous être confié ! Il est en cours de préparation chez votre expéditeur.', { status: 'pending', stage: 'registered' }],
|
|
35
35
|
['Accepted at USPS Origin Facility', { status: 'in_transit', stage: 'in_transit' }],
|
|
36
36
|
['Your shipment has been accepted by delivery carrier', { status: 'in_transit', stage: 'in_transit' }],
|
|
37
|
+
['Your shipment has arrived at sorting center', { status: 'in_transit', stage: 'in_transit' }],
|
|
37
38
|
['Parcel dispatched to be delivered', { status: 'out_for_delivery', stage: 'out_for_delivery' }],
|
|
38
39
|
['UA.In the New Post Office', { status: 'out_for_delivery', stage: 'ready_for_pickup' }],
|
|
39
40
|
]);
|
|
@@ -213,6 +213,14 @@
|
|
|
213
213
|
"firstSeen": "2026-10-08",
|
|
214
214
|
"note": "The last-mile carrier's handover scan; Yanwen's pickup scan is the acceptance."
|
|
215
215
|
},
|
|
216
|
+
{
|
|
217
|
+
"wording": "Your shipment has arrived at sorting center",
|
|
218
|
+
"language": "en",
|
|
219
|
+
"stage": "in_transit",
|
|
220
|
+
"confirmedBy": "live",
|
|
221
|
+
"firstSeen": "2026-10-20",
|
|
222
|
+
"note": "The last-mile carrier's sorting scan, after Yanwen's batch handover."
|
|
223
|
+
},
|
|
216
224
|
{
|
|
217
225
|
"wording": "Parcel dispatched to be delivered",
|
|
218
226
|
"language": "en",
|
|
@@ -172,6 +172,9 @@ function providerWordingStage(description) {
|
|
|
172
172
|
return 'ready_for_pickup';
|
|
173
173
|
if (/^pendiente de recoger[.!]?$/i.test(value))
|
|
174
174
|
return 'registered';
|
|
175
|
+
// MRW's delivery address lacking details, as its own map reads it: the wording names no attempt.
|
|
176
|
+
if (/^direccion entrega incompleta[.!]?$/i.test(value))
|
|
177
|
+
return 'exception';
|
|
175
178
|
// A return on its way back to the sender, as other unfinished returns.
|
|
176
179
|
if (/^the shipment is handled by a return consolidator[.!]?$/i.test(value))
|
|
177
180
|
return 'exception';
|
package/dist/server/openapi.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-parcel-scraper",
|
|
3
|
-
"version": "0.577.
|
|
3
|
+
"version": "0.577.3-main.2713",
|
|
4
4
|
"description": "Self-hosted parcel tracking: carrier detection, dedicated scrapers and optional universal providers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|