fix(amazon-shopping): verify prime and delivery filters
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
import type { ProductSearchResult, ProductSpec } from "./types.js";
|
||||
|
||||
function parseDimensionNumber(text: string): number | undefined {
|
||||
const match = text.match(/([0-9]+(?:\.[0-9]+)?)/);
|
||||
return match ? Number(match[1]) : undefined;
|
||||
}
|
||||
|
||||
function isOverallWidthSpec(spec: ProductSpec): boolean {
|
||||
const name = spec.name.toLowerCase();
|
||||
if (/seat|arm|door|package|box|back|cushion/.test(name)) {
|
||||
return false;
|
||||
}
|
||||
return /width|dimensions?/.test(name);
|
||||
}
|
||||
|
||||
function widthFromSpec(spec: ProductSpec): number | undefined {
|
||||
if (!isOverallWidthSpec(spec)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const name = spec.name.toLowerCase();
|
||||
const value = spec.value;
|
||||
const labeledWidth = value.match(/([0-9]+(?:\.[0-9]+)?)\s*(?:"|in(?:ches?)?)?\s*W\b/i);
|
||||
if (labeledWidth) {
|
||||
return Number(labeledWidth[1]);
|
||||
}
|
||||
|
||||
if (/width/.test(name)) {
|
||||
return parseDimensionNumber(value);
|
||||
}
|
||||
|
||||
const orderMatch = name.match(/\b([dwh])\s*x\s*([dwh])(?:\s*x\s*([dwh]))?\b/i);
|
||||
if (orderMatch) {
|
||||
const order = orderMatch.slice(1).filter(Boolean).map((part) => part.toLowerCase());
|
||||
const widthIndex = order.indexOf("w");
|
||||
const values = value.match(/[0-9]+(?:\.[0-9]+)?/g)?.map(Number) ?? [];
|
||||
if (widthIndex >= 0 && values[widthIndex] !== undefined) {
|
||||
return values[widthIndex];
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
export function extractWidthInches(product: ProductSearchResult): number | undefined {
|
||||
for (const spec of product.specs) {
|
||||
const width = widthFromSpec(spec);
|
||||
if (width !== undefined) {
|
||||
return width;
|
||||
}
|
||||
}
|
||||
|
||||
const titleMatch = product.title.match(/\b([0-9]+(?:\.[0-9]+)?)\s*(?:["”]|in(?:ch(?:es)?)?)\b/i);
|
||||
return titleMatch ? Number(titleMatch[1]) : undefined;
|
||||
}
|
||||
|
||||
export function formatWidthInches(width: number | undefined): string {
|
||||
if (width === undefined) {
|
||||
return "unknown";
|
||||
}
|
||||
return `${Number.isInteger(width) ? width.toFixed(0) : width.toFixed(1)}"`;
|
||||
}
|
||||
Reference in New Issue
Block a user