export function getHref( | |
url: URL | string, | |
modifications: { | |
newKeys?: Record<string, string | undefined | null>; | |
existingKeys?: { behaviour: "delete_except" | "delete"; keys: string[] }; | |
} | |
) { | |
const newUrl = new URL(url); | |
const { newKeys, existingKeys } = modifications; | |
// exsiting keys logic | |
if (existingKeys) { | |
const { behaviour, keys } = existingKeys; | |
if (behaviour === "delete") { | |
for (const key of keys) { | |
newUrl.searchParams.delete(key); | |
} | |
} else { | |
// delete_except | |
const keysToPreserve = keys; | |
for (const key of [...newUrl.searchParams.keys()]) { | |
if (!keysToPreserve.includes(key)) { | |
newUrl.searchParams.delete(key); | |
} | |
} | |
} | |
} | |
// new keys logic | |
if (newKeys) { | |
for (const [key, val] of Object.entries(newKeys)) { | |
if (val) { | |
newUrl.searchParams.set(key, val); | |
} else { | |
newUrl.searchParams.delete(key); | |
} | |
} | |
} | |
return newUrl.toString(); | |
} | |