diff --git a/package-lock.json b/package-lock.json index c83adfeb4..c1c38b325 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27644,7 +27644,6 @@ "@walletconnect/window-metadata": "1.0.1", "detect-browser": "5.3.0", "elliptic": "6.6.1", - "query-string": "7.1.3", "uint8arrays": "3.1.0" }, "devDependencies": { @@ -34379,7 +34378,6 @@ "@walletconnect/window-metadata": "1.0.1", "detect-browser": "5.3.0", "elliptic": "6.6.1", - "query-string": "7.1.3", "uint8arrays": "3.1.0" }, "dependencies": { diff --git a/packages/utils/package.json b/packages/utils/package.json index 9e7a9f5e7..e3cabe792 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -49,7 +49,6 @@ "@walletconnect/window-metadata": "1.0.1", "detect-browser": "5.3.0", "elliptic": "6.6.1", - "query-string": "7.1.3", "uint8arrays": "3.1.0" }, "devDependencies": { diff --git a/packages/utils/src/misc.ts b/packages/utils/src/misc.ts index 9e75cc1cb..b1c40e355 100644 --- a/packages/utils/src/misc.ts +++ b/packages/utils/src/misc.ts @@ -10,7 +10,6 @@ import { getDocument, getLocation, getNavigator } from "@walletconnect/window-ge import { getWindowMetadata } from "@walletconnect/window-metadata"; import { ErrorResponse } from "@walletconnect/jsonrpc-utils"; import { IKeyValueStorage } from "@walletconnect/keyvaluestorage"; -import * as qs from "query-string"; // -- constants -----------------------------------------// export const REACT_NATIVE_PRODUCT = "ReactNative"; @@ -94,14 +93,22 @@ export function getAppId(): string | undefined { // -- query -----------------------------------------------// -export function appendToQueryString(queryString: string, newQueryParams: any): string { - let queryParams = qs.parse(queryString); - - queryParams = { ...queryParams, ...newQueryParams }; - - queryString = qs.stringify(queryParams); +export function appendToQueryString( + queryString: string, + newQueryParams: Record, +): string { + const urlSearchParams = new URLSearchParams(queryString); + + for (const key of Object.keys(newQueryParams).sort()) { + if (newQueryParams.hasOwnProperty(key)) { + const value = newQueryParams[key]; + if (value !== undefined) { + urlSearchParams.set(key, value); + } + } + } - return queryString; + return urlSearchParams.toString(); } // -- metadata ----------------------------------------------// diff --git a/packages/utils/src/uri.ts b/packages/utils/src/uri.ts index a1d450e8e..966553643 100644 --- a/packages/utils/src/uri.ts +++ b/packages/utils/src/uri.ts @@ -1,4 +1,3 @@ -import * as qs from "query-string"; import { EngineTypes, RelayerTypes } from "@walletconnect/types"; import { fromBase64 } from "./misc"; @@ -35,7 +34,11 @@ export function parseUri(str: string): EngineTypes.UriParameters { const path: string = str.substring(pathStart + 1, pathEnd); const requiredValues = path.split("@"); const queryString: string = typeof pathEnd !== "undefined" ? str.substring(pathEnd) : ""; - const queryParams = qs.parse(queryString); + const urlSearchParams = new URLSearchParams(queryString); + const queryParams: Record = {}; + urlSearchParams.forEach((value, key) => { + queryParams[key] = value; + }); const methods = typeof queryParams.methods === "string" ? queryParams.methods.split(",") : undefined; const result = { @@ -69,15 +72,25 @@ export function formatRelayParams(relay: RelayerTypes.ProtocolOptions, delimiter } export function formatUri(params: EngineTypes.UriParameters): string { - return ( - `${params.protocol}:${params.topic}@${params.version}?` + - qs.stringify({ - symKey: params.symKey, - ...formatRelayParams(params.relay), - expiryTimestamp: params.expiryTimestamp, - ...(params.methods ? { methods: params.methods.join(",") } : {}), - }) - ); + const urlSearchParams = new URLSearchParams(); + + const relayParams = formatRelayParams(params.relay); + Object.keys(relayParams) + .sort() + .forEach((key) => { + urlSearchParams.set(key, relayParams[key]); + }); + + urlSearchParams.set("symKey", params.symKey); + if (params.expiryTimestamp) + urlSearchParams.set("expiryTimestamp", params.expiryTimestamp.toString()); + + if (params.methods) { + urlSearchParams.set("methods", params.methods.join(",")); + } + + const queryString = urlSearchParams.toString(); + return `${params.protocol}:${params.topic}@${params.version}?${queryString}`; } export function getLinkModeURL(