| 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; |
|
|
| |
| if (existingKeys) { |
| const { behaviour, keys } = existingKeys; |
| if (behaviour === "delete") { |
| for (const key of keys) { |
| newUrl.searchParams.delete(key); |
| } |
| } else { |
| |
| const keysToPreserve = keys; |
| for (const key of [...newUrl.searchParams.keys()]) { |
| if (!keysToPreserve.includes(key)) { |
| newUrl.searchParams.delete(key); |
| } |
| } |
| } |
| } |
|
|
| |
| 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(); |
| } |
|
|