From 557182d3cf9adfd20d55d59e01e3da2ac64e6ddc Mon Sep 17 00:00:00 2001 From: v1rtl Date: Wed, 1 Jan 2025 22:56:53 +0200 Subject: [PATCH] feat: remove query-string --- .vscode/settings.json | 2 +- package-lock.json | 59 +------------------------------------ packages/utils/package.json | 1 - packages/utils/src/misc.ts | 23 ++++++++++----- packages/utils/src/uri.ts | 35 +++++++++++++++------- 5 files changed, 41 insertions(+), 79 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index c4b4db5bc..071de5487 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,7 +15,7 @@ "editor.defaultFormatter": "esbenp.prettier-vscode" }, "editor.codeActionsOnSave": { - "source.organizeImports": false + "source.organizeImports": "never" }, "editor.formatOnSave": true, "editor.tabSize": 2, diff --git a/package-lock.json b/package-lock.json index d2ac8de1d..bdd9053f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14270,13 +14270,6 @@ "node": ">=8" } }, - "node_modules/filter-obj": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -22671,22 +22664,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-string": { - "version": "7.1.3", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "dev": true, @@ -24697,13 +24674,6 @@ "node": "*" } }, - "node_modules/split-on-first": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -24949,13 +24919,6 @@ "version": "1.0.1", "license": "MIT" }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "license": "MIT", @@ -27592,7 +27555,6 @@ "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "detect-browser": "5.3.0", - "query-string": "7.1.3", "uint8arrays": "3.1.0" }, "devDependencies": { @@ -27609,7 +27571,7 @@ }, "packages/web3wallet": { "name": "@walletconnect/web3wallet", - "version": "2.13.3", + "version": "1.12.3", "license": "Apache-2.0", "dependencies": { "@walletconnect/auth-client": "2.1.2", @@ -34140,7 +34102,6 @@ "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "detect-browser": "5.3.0", - "query-string": "7.1.3", "uint8arrays": "3.1.0" }, "dependencies": { @@ -38493,9 +38454,6 @@ "to-regex-range": "^5.0.1" } }, - "filter-obj": { - "version": "1.1.0" - }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -44666,15 +44624,6 @@ "side-channel": "^1.0.4" } }, - "query-string": { - "version": "7.1.3", - "requires": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, "queue-microtask": { "version": "1.2.3", "dev": true @@ -46159,9 +46108,6 @@ "through": "2" } }, - "split-on-first": { - "version": "1.1.0" - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -46358,9 +46304,6 @@ "stream-shift": { "version": "1.0.1" }, - "strict-uri-encode": { - "version": "2.0.0" - }, "string_decoder": { "version": "1.3.0", "requires": { diff --git a/packages/utils/package.json b/packages/utils/package.json index bd429b426..6c73ca55e 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -43,7 +43,6 @@ "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "detect-browser": "5.3.0", - "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 da194ec65..5cd246320 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"; @@ -76,14 +75,22 @@ export function getBundleId(): 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 d9783c250..415a8dc84 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"; // -- uri -------------------------------------------------- // @@ -27,7 +26,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 = { @@ -61,13 +64,23 @@ 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}`; }