import events from './events.js'; export default function navigate(path, query, options = {}) { const curatedQuery = Object.fromEntries(Object.entries(query || {}).map(([key, value]) => (value === undefined ? null : [key, value])).filter(Boolean)); const queryString = new URLSearchParams({ ...(options.preserveQuery ? Object.fromEntries(new URL(window.location).searchParams.entries()) : {}), ...curatedQuery, }).toString(); const url = queryString ? `${path}?${queryString .replace(/%2C/g, ',') // URLSearchParams encodes commas and colons, we don't want that .replace(/%3A/g, ':')}` : path; if (options.redirect) { window.location.href = url; } else if (options.replace) { history.replaceState({}, '', url); // eslint-disable-line no-restricted-globals } else { history.pushState({}, '', url); // eslint-disable-line no-restricted-globals } events.emit('route', url); }