UNPKG

vike

Version:

The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.

48 lines (47 loc) 1.87 kB
export { modifyUrlSameOrigin }; // We don't move modifyUrlSameOrigin() to the modifyUrl.ts file because we plan to use modifyUrlSameOrigin() on the client-side: // https://github.com/vikejs/vike/blob/c5a2de5e85262771f97851767c00ac35da69c64b/packages/vike/client/runtime-client-routing/navigate.ts#L4 import { createUrlFromComponents, assertUsageUrlPathAbsolute, parseUrl } from '../utils/parseUrl.js'; import { isNotNullish_keyVal } from '../utils/isNullish.js'; import { objectFilter } from '../utils/objectFilter.js'; function modifyUrlSameOrigin(url, modify) { const urlParsed = parseUrl(url, '/'); // Pathname const pathname = modify.pathname ?? urlParsed.pathnameOriginal; assertUsageUrlPathAbsolute(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, modifySearch) { let searchParams; if (modifySearch instanceof URLSearchParams) { // Overwrite searchParams = modifySearch; } else { // Merge const searchMap = objectFilter({ ...urlParsed.search, ...objectFilter(modifySearch, isNotUndefined) }, (isNotNullish_keyVal)); searchParams = new URLSearchParams(searchMap); } return '?' + searchParams.toString(); } function isNotUndefined(arg) { return arg[1] !== undefined; }