fix(amazon-shopping): verify prime and delivery filters

This commit is contained in:
2026-04-15 20:28:16 -05:00
parent a81a055ec6
commit fda0602ac9
20 changed files with 605 additions and 36 deletions
+31 -4
View File
@@ -76,15 +76,42 @@ function extractHistogramText(root: HTMLElement): string {
return parts.join(" ");
}
function deliveryFromText(text: string): DeliverySummary | undefined {
function deliveryFromText(text: string, primeSignal = false): DeliverySummary | undefined {
const display = text.replace(/\s+/g, " ").trim();
if (!display) {
return undefined;
return primeSignal ? { display: "Prime delivery available", prime: true } : undefined;
}
return {
display,
free: /\bfree\b/i.test(display),
prime: /\bprime\b/i.test(display)
prime: primeSignal || /\bprime\b/i.test(display)
};
}
function hasPrimeSignal(root: HTMLElement): boolean {
const attributeText = root.querySelectorAll("[id], [class], [aria-label], img[alt]")
.map((node) => [
attrOf(node, "id"),
attrOf(node, "class"),
attrOf(node, "aria-label"),
attrOf(node, "alt")
].join(" "))
.join(" ");
return /a-icon-prime|prime-logo|primeExclusive|primePopover|amazon\s+prime|\bprime\b/i.test(attributeText);
}
function mergeDelivery(detail: DeliverySummary | undefined, base: DeliverySummary | undefined): DeliverySummary | undefined {
if (!detail) {
return base;
}
if (!base) {
return detail;
}
return {
display: detail.display || base.display,
free: Boolean(detail.free || base.free),
prime: Boolean(detail.prime || base.prime),
fastestDate: detail.fastestDate ?? base.fastestDate
};
}
@@ -113,7 +140,7 @@ export function extractDetailPage(html: string, base: ProductSearchResult): Prod
price: parseMoney(priceText) ?? base.price,
rating: parseRating(ratingText) ?? base.rating,
reviewCount: parseReviewCount(reviewText) ?? base.reviewCount,
delivery: deliveryFromText(deliveryText) ?? base.delivery,
delivery: mergeDelivery(deliveryFromText(deliveryText, hasPrimeSignal(root)), base.delivery),
availability: availability || base.availability,
seller: seller || base.seller,
bullets: extractBullets(root),