const TRACKING_QUERY_KEYS = new Set([ 'fbclid', 'gclid', 'dclid', 'msclkid', 'mc_cid', 'mc_eid', ]); export function removeTrackingParameters(url: URL): void { for (const key of Array.from(url.searchParams.keys())) { const normalized = key.toLowerCase(); if (normalized === 'atx' || normalized.startsWith('utm_') || TRACKING_QUERY_KEYS.has(normalized)) { url.searchParams.delete(key); } } } /** Direct, tracking-free HTTPS WooCommerce PDP URL with the selected variation. */ export function buildWooCommerceProductUrl( productUrl: string | undefined, variationId?: string | null, variationSelections?: Record> ): string | null { if (!productUrl) return null; try { const url = new URL(productUrl); if (url.protocol !== 'https:') return null; url.hash = ''; removeTrackingParameters(url); url.searchParams.delete('variation_id'); for (const key of Array.from(url.searchParams.keys())) { if (key.toLowerCase().startsWith('attribute_')) url.searchParams.delete(key); } if (variationId && /^\d+$/.test(String(variationId))) { url.searchParams.set('variation_id', String(variationId)); const selected = variationSelections?.[String(variationId)] ?? {}; for (const [name, value] of Object.entries(selected)) { const key = name.startsWith('attribute_') ? name : `attribute_${name}`; if (/^attribute_[a-z0-9_-]+$/i.test(key) && typeof value === 'string' && value) { url.searchParams.set(key, value); } } } return url.toString(); } catch { return null; } }