From 40eb850bbfd6000e3812a45ef4624301332003c2 Mon Sep 17 00:00:00 2001 From: Mathieu Acthernoene Date: Mon, 18 Mar 2024 10:41:19 +0100 Subject: [PATCH] Encode search params using URLSearchParams --- src/search.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/search.ts b/src/search.ts index 283d290e..c7dcabb2 100644 --- a/src/search.ts +++ b/src/search.ts @@ -20,14 +20,8 @@ export const decodeSearch = (search: string): Search => { return output; }; -export const appendParam = ( - acc: string, - key: string, - value: string, -): string => { - const output = acc + (acc !== "" ? "&" : "") + encodeURIComponent(key); - return value !== "" ? output + "=" + encodeURIComponent(value) : output; -}; +const NO_VALUE_PARAM_REGEXP = /=&/g; +const FINISH_BY_EQUAL_REGEXP = /=$/g; export const encodeSearch = (search: Search): string => { const keys = Object.keys(search); @@ -36,7 +30,7 @@ export const encodeSearch = (search: Search): string => { return ""; } - let output = ""; + const params = new URLSearchParams(); keys.sort(); // keys are sorted in place for (const key of keys) { @@ -47,16 +41,21 @@ export const encodeSearch = (search: Search): string => { } if (typeof value === "string") { - output = appendParam(output, key, value); + params.append(key, value); } else { for (const item of value) { - output = appendParam(output, key, item); + params.append(key, item); } } } + const output = params + .toString() + .replace(NO_VALUE_PARAM_REGEXP, "&") + .replace(FINISH_BY_EQUAL_REGEXP, ""); + if (output === "") { - return ""; // params are empty arrays + return ""; } return "?" + output;