vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
41 lines (40 loc) • 1.4 kB
JavaScript
export { modifyUrlSameOrigin };
import { createUrlFromComponents, isNotNullish_keyVal, parseUrl, objectFilter, assertUsageUrlPathnameAbsolute, } from './utils.js';
function modifyUrlSameOrigin(url, modify) {
const urlParsed = parseUrl(url, '/');
// Pathname
const pathname = modify.pathname ?? urlParsed.pathnameOriginal;
assertUsageUrlPathnameAbsolute(pathname, 'modify.pathname');
// Search
let search = modify.search === null ? '' : !modify.search ? urlParsed.searchOriginal : resolveSearch(urlParsed, modify.search);
if (search === '?')
search = '';
// Hash
let hash;
if (modify.hash === null) {
hash = '';
}
else if (modify.hash === undefined) {
hash = urlParsed.hashOriginal ?? '';
}
else {
hash = modify.hash;
if (!hash.startsWith('#'))
hash = '#' + hash;
}
const urlModified = createUrlFromComponents(urlParsed.origin, pathname, search, hash);
return urlModified;
}
function resolveSearch(urlParsed, search) {
let searchParams;
if (search instanceof URLSearchParams) {
// Overwrite
searchParams = search;
}
else {
// Merge
const searchMap = objectFilter({ ...urlParsed.search, ...search }, (isNotNullish_keyVal));
searchParams = new URLSearchParams(searchMap);
}
return '?' + searchParams.toString();
}