// Functions across main.js and foreground.js import { URL } from 'url'; import { getSearchObjectFromParams } from '../shared/identifiers'; export const makeValidURL = (urlString: string): string => { if (/^http/.test(urlString)) { return urlString; } else { return 'https://' + urlString; } }; // To make sure the order is the same as the backend export const queryObjToQueryString = (queryObj: Record) => { return Object.keys(queryObj) .map((key) => key + '=' + encodeURIComponent(queryObj[key])) .join('&'); }; const getDomain = (urlString: string): string => { const validURLString = makeValidURL(urlString); const { host } = new URL(validURLString); const hostArray = host.split('.'); return hostArray.length == 3 ? hostArray[1] : hostArray[0]; }; export const transformURL = (urlString: string): string => { const validURLString = makeValidURL(urlString); const domain = getDomain(validURLString); const { hostname, pathname, search, searchParams } = new URL(validURLString); let params: Record = {}; if (search) { params = getSearchObjectFromParams(searchParams); } if ( domain == 'urbanoutfitters' && params.color && params.type && params.size ) { const queryString = queryObjToQueryString({ color: params.color, type: params.type, size: params.size, }); return hostname + pathname + '?' + queryString; } if (domain == 'dotandbo' && (params.color || params.primarycolor)) { const queryObj: Record = {}; if (params.color) { queryObj['color'] = params.color; } if (params.primarycolor) { queryObj['primarycolor'] = params.primarycolor; } const queryString = queryObjToQueryString(queryObj); return hostname + pathname + '?' + queryString; } if ( ['luluandgeorgia', 'franceandson', 'burkedecor'].includes(domain) && params.variant ) { const queryString = queryObjToQueryString({ variant: params.variant }); return hostname + pathname + '?' + queryString; } if (domain == 'pier1' && params.variant) { const queryString = queryObjToQueryString({ variant: params.variant }); const pattern = pathname.match(/\/products\/[^?]+/); if (pattern) { return hostname + pattern[0] + '?' + queryString; } else { return hostname + pathname + '?' + queryString; } } if (domain == 'bedbathandbeyond' && params.skuId) { const queryString = queryObjToQueryString({ skuId: params.skuId }); return hostname + pathname + '?' + queryString; } if (domain == 'overstock') { // Product page const productPage = pathname.match(/product.html/); if (productPage) { const skuPath = pathname.match(/(\d+)(\/product.html)$/)?.[0]; const mode = hostname + '/-/-/' + skuPath?.toLowerCase(); if (params.option) { const query = { opre: '1', option: params.option, }; const queryString = queryObjToQueryString(query); return mode + '?' + queryString; } else { return mode + '?opre=1'; } } // Sub-Category page const subcatPage = pathname.match(/subcat.html/); if (subcatPage && params.featuredproduct) { const mode = hostname + '/-/-/' + params.featuredproduct + '/product.html'; if (params.featuredoption) { const query = { opre: '1', option: params.featuredoption, }; const queryString = queryObjToQueryString(query); return mode + '?' + queryString; } else { return mode + '?opre=1'; } } } if (domain == 'worldmarket' && params.option) { const queryString = queryObjToQueryString({ option: params.option }); return hostname + pathname + '?' + queryString; } if (domain == 'macys' && params['ID']) { const queryString = queryObjToQueryString({ ID: params['ID'] }); return hostname + pathname + '?' + queryString; } if ( ['wayfair', 'perigold', 'allmodern', 'jossandmain', 'birchlane'].includes( domain ) ) { const skuPath = pathname.match(/([A-Za-z]+\d+)(.html)$/)?.[0]; let mode = hostname + '/-/pdp/-' + skuPath?.toLowerCase(); if (params.piid) { const queryString = queryObjToQueryString({ piid: params.piid }); mode = mode + '?' + queryString; } if (params['PiID%5B%5D']) { const queryString = queryObjToQueryString({ piid: params['PiID%5B%5D'] }); mode = mode + '?' + queryString; } return mode; } if (domain == 'amazon') { return hostname + '/' + pathname.match(/dp\/\w+/)?.[0]; } if (domain == 'homedepot') { return hostname + '/p/' + pathname.match(/(\d+)$/)?.[0]; } if (domain == 'walmart') { return hostname + '/ip/' + pathname.match(/(\d+)$/)?.[0]; } if (domain == 'houzz') { return hostname + '/products/-prvw-vr' + pathname.match(/~\d+$/)?.[0]; } // If URL uses variants but we haven't mapped them yet if (params.sku) { const queryString = queryObjToQueryString({ sku: params.sku }); return hostname + pathname + '?' + queryString; } if (params.variant) { const queryString = queryObjToQueryString({ variant: params.variant }); return hostname + pathname + '?' + queryString; } return hostname + pathname; };