@standhigher/besttrack-page-extension 0.5.10 → 0.5.11

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/dist/index.d.ts CHANGED
@@ -17,19 +17,19 @@ type SearchTab = 'order' | 'tracking';
17
17
  type TrackingNode = {
18
18
  node: string;
19
19
  description: string;
20
- time: string;
20
+ time?: string | null;
21
21
  location: string;
22
22
  country: string;
23
23
  state: string;
24
24
  city: string;
25
25
  street: string;
26
- carrier: string;
26
+ carrier?: string;
27
27
  };
28
28
  type RawEvent = {
29
29
  stage: string;
30
30
  sub_status: string;
31
31
  description: string;
32
- time: string;
32
+ time?: string | null;
33
33
  location: string;
34
34
  country: string;
35
35
  state: string;
package/dist/index.js CHANGED
@@ -106,6 +106,11 @@ function formatTrackingDateTime(time, locale, options = {}) {
106
106
  }).format(date);
107
107
  }
108
108
 
109
+ // src/shopify-track-page/pages/home/asText.ts
110
+ function asText(value) {
111
+ return typeof value === "string" ? value : "";
112
+ }
113
+
109
114
  // src/shopify-track-page/timeline.ts
110
115
  var DEFAULT_INFO_NODE = {
111
116
  node: "InfoReceived",
@@ -202,7 +207,7 @@ var legacyNodeStepMap = /* @__PURE__ */ new Map([
202
207
  ["Returning", "delivered"]
203
208
  ]);
204
209
  var getStepKeyForStatus = (status) => {
205
- const normalized = status?.trim() ?? "";
210
+ const normalized = asText(status).trim();
206
211
  if (!normalized) return null;
207
212
  const exactMatch = subStatusStepMap.get(normalized) ?? legacyNodeStepMap.get(normalized);
208
213
  if (exactMatch) return exactMatch;
@@ -234,16 +239,16 @@ var buildStepsFromStatusRecords = (records, locale) => {
234
239
  };
235
240
  var buildStepsFromRawEvents = (events, locale) => buildStepsFromStatusRecords(
236
241
  events.map((event) => ({
237
- status: event.sub_status || event.stage || "",
238
- fallbackStatus: event.stage,
239
- time: event.time
242
+ status: asText(event.sub_status) || asText(event.stage),
243
+ fallbackStatus: asText(event.stage) || void 0,
244
+ time: asText(event.time)
240
245
  })),
241
246
  locale
242
247
  );
243
248
  var buildStepsFromNodes = (nodeList, locale) => buildStepsFromStatusRecords(
244
249
  nodeList.map((node) => ({
245
- status: node.node,
246
- time: node.time
250
+ status: asText(node.node),
251
+ time: asText(node.time)
247
252
  })),
248
253
  locale
249
254
  );
@@ -273,7 +278,7 @@ var monthIndexMap = /* @__PURE__ */ new Map([
273
278
  ["dec", 11],
274
279
  ["december", 11]
275
280
  ]);
276
- var normalizeNodeTime = (time) => time.replace(/\s+/g, " ").trim();
281
+ var normalizeNodeTime = (time) => asText(time).replace(/\s+/g, " ").trim();
277
282
  var toParsedNodeTime = ({
278
283
  year,
279
284
  monthIndex,
@@ -367,8 +372,8 @@ var formatNodeTime = (time, locale) => formatTrackingDateTime(normalizeNodeTime(
367
372
  var formatNodeDateLabel = (time, locale) => formatTrackingDateLabel(normalizeNodeTime(time), locale);
368
373
  function formatEstimatedDelivery(estimatedDelivery, locale) {
369
374
  if (!estimatedDelivery || !locale) return null;
370
- const from = estimatedDelivery.from.trim();
371
- const to = estimatedDelivery.to.trim();
375
+ const from = asText(estimatedDelivery.from).trim();
376
+ const to = asText(estimatedDelivery.to).trim();
372
377
  if (!from || !to) return null;
373
378
  const dateText = from === to ? formatTrackingDateLabel(from, locale) : `${formatTrackingDateLabel(from, locale)}-${formatTrackingDateLabel(to, locale)}`;
374
379
  return {
@@ -401,7 +406,7 @@ var getLatestTrackingTimestamp = (milestone, now = /* @__PURE__ */ new Date()) =
401
406
  };
402
407
  var hasActualDelivery = (milestone) => {
403
408
  const statuses = milestone.rawEventList?.length ? milestone.rawEventList.flatMap((event) => [event.sub_status, event.stage]) : milestone.nodeList.map((node) => node.node);
404
- return statuses.some((status) => /^delivered(?:_|$)/i.test(status.trim()));
409
+ return statuses.some((status) => /^delivered(?:_|$)/i.test(asText(status).trim()));
405
410
  };
406
411
  function shouldShowEstimatedDelivery(milestone, now = /* @__PURE__ */ new Date()) {
407
412
  const estimatedDelivery = milestone?.estimated_delivery;
@@ -469,14 +474,14 @@ var sortShippingDetailsByTime = (details, syntheticPrefixLength = 0) => {
469
474
  };
470
475
  var buildShippingDetailsFromRecords = (records, locale) => {
471
476
  const filtered = records.filter(
472
- (record) => record.location.trim() || record.description.trim() || record.time.trim()
477
+ (record) => asText(record.location).trim() || asText(record.description).trim() || asText(record.time).trim()
473
478
  );
474
479
  if (filtered.length === 0) return [];
475
480
  const rawDetails = filtered.map((record, index) => {
476
481
  const timeMeta = getNodeTimeMeta(record.time);
477
482
  return {
478
483
  index,
479
- description: [record.location.trim(), record.description.trim()].filter(Boolean).join(", "),
484
+ description: [asText(record.location).trim(), asText(record.description).trim()].filter(Boolean).join(", "),
480
485
  time: formatNodeTime(record.time, locale),
481
486
  timestamp: timeMeta?.timestamp ?? null,
482
487
  hasYear: timeMeta?.hasYear ?? false
@@ -491,10 +496,10 @@ var buildShippingDetailsFromRecords = (records, locale) => {
491
496
  };
492
497
  var buildShippingDetails = (nodeList, locale) => buildShippingDetailsFromRecords(nodeList, locale);
493
498
  var hasRawTrackingSignal = (event) => Boolean(
494
- event.sub_status.trim() || event.location.trim() || event.country.trim() || event.state.trim() || event.city.trim() || event.street.trim() || getStepKeyForStatus(event.stage)
499
+ asText(event.sub_status).trim() || asText(event.location).trim() || asText(event.country).trim() || asText(event.state).trim() || asText(event.city).trim() || asText(event.street).trim() || getStepKeyForStatus(event.stage)
495
500
  );
496
501
  var getSyntheticRawEventPrefixLength = (events) => {
497
- const firstEventStage = events[0]?.stage.trim().toLowerCase();
502
+ const firstEventStage = asText(events[0]?.stage).trim().toLowerCase();
498
503
  if (firstEventStage !== "order confirmed" && firstEventStage !== "package picked up") {
499
504
  return 0;
500
505
  }
@@ -519,7 +524,7 @@ function buildShippingDetailsFromMilestone(milestone, locale) {
519
524
  }
520
525
  var buildShippingDetailsFromRawEvents = (events, locale) => {
521
526
  const filtered = events.filter(
522
- (event) => event.location.trim() || event.description.trim() || event.time.trim()
527
+ (event) => asText(event.location).trim() || asText(event.description).trim() || asText(event.time).trim()
523
528
  );
524
529
  if (filtered.length === 0) return [];
525
530
  const syntheticPrefixLength = getSyntheticRawEventPrefixLength(filtered);
@@ -527,7 +532,7 @@ var buildShippingDetailsFromRawEvents = (events, locale) => {
527
532
  const timeMeta = getNodeTimeMeta(event.time);
528
533
  return {
529
534
  index,
530
- description: [event.location.trim(), event.description.trim()].filter(Boolean).join(", "),
535
+ description: [asText(event.location).trim(), asText(event.description).trim()].filter(Boolean).join(", "),
531
536
  time: formatNodeTime(event.time, locale),
532
537
  timestamp: timeMeta?.timestamp ?? null,
533
538
  hasYear: timeMeta?.hasYear ?? false
@@ -540,6 +545,53 @@ var buildShippingDetailsFromRawEvents = (events, locale) => {
540
545
  isLatest: index === 0
541
546
  }));
542
547
  };
548
+ var sanitizeTrackingNode = (node) => ({
549
+ node: asText(node?.node),
550
+ description: asText(node?.description),
551
+ time: asText(node?.time),
552
+ location: asText(node?.location),
553
+ country: asText(node?.country),
554
+ state: asText(node?.state),
555
+ city: asText(node?.city),
556
+ street: asText(node?.street),
557
+ carrier: asText(node?.carrier)
558
+ });
559
+ var sanitizeRawEvent = (event) => ({
560
+ stage: asText(event?.stage),
561
+ sub_status: asText(event?.sub_status),
562
+ description: asText(event?.description),
563
+ time: asText(event?.time),
564
+ location: asText(event?.location),
565
+ country: asText(event?.country),
566
+ state: asText(event?.state),
567
+ city: asText(event?.city),
568
+ street: asText(event?.street)
569
+ });
570
+ var sanitizePackageItem = (item) => ({
571
+ product_id: asText(item?.product_id),
572
+ variant_id: asText(item?.variant_id),
573
+ title: asText(item?.title),
574
+ variant_title: asText(item?.variant_title),
575
+ image_url: asText(item?.image_url),
576
+ quantity: typeof item?.quantity === "number" && Number.isFinite(item.quantity) ? item.quantity : 0
577
+ });
578
+ var sanitizeEstimatedDelivery = (estimatedDelivery) => {
579
+ if (!estimatedDelivery) return void 0;
580
+ return {
581
+ ...estimatedDelivery,
582
+ from: asText(estimatedDelivery.from),
583
+ to: asText(estimatedDelivery.to)
584
+ };
585
+ };
586
+ var sanitizeMilestone = (milestone) => ({
587
+ tracking_number: asText(milestone?.tracking_number),
588
+ nodeList: Array.isArray(milestone?.nodeList) ? milestone.nodeList.map(sanitizeTrackingNode) : [],
589
+ rawEventList: Array.isArray(milestone?.rawEventList) ? milestone.rawEventList.map(sanitizeRawEvent) : void 0,
590
+ carrier: asText(milestone?.carrier),
591
+ package_items: Array.isArray(milestone?.package_items) ? milestone.package_items.map(sanitizePackageItem) : [],
592
+ estimated_delivery: sanitizeEstimatedDelivery(milestone?.estimated_delivery)
593
+ });
594
+ var sanitizeMilestones = (milestones) => Array.isArray(milestones) ? milestones.map(sanitizeMilestone) : [];
543
595
  function normalizeOrderValue(value) {
544
596
  return value.trim();
545
597
  }
@@ -819,7 +871,7 @@ function mapShopifyTrackQueryResponse(response, request, locale = "EN") {
819
871
  return emptyResult();
820
872
  }
821
873
  const data = response.data;
822
- const milestones = data?.mileStoneList ?? [];
874
+ const milestones = sanitizeMilestones(data?.mileStoneList);
823
875
  const shipments = milestones.map((milestone, index) => mapMilestone(milestone, locale, index));
824
876
  const primary = shipments[0] ?? mapMilestone(void 0, locale, 0);
825
877
  const trackingNumber = request.mode === "tracking" ? request.trackingNumber.trim() : primary.trackingNumber || "";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@standhigher/besttrack-page-extension",
3
- "version": "0.5.10",
3
+ "version": "0.5.11",
4
4
  "description": "BestTrack business extension entry point for @standhigher/puck-page-builder.",
5
5
  "type": "module",
6
6
  "files": [