27 lines
907 B
JavaScript
27 lines
907 B
JavaScript
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);
|
|
}
|