diff --git a/package-lock.json b/package-lock.json index e40adb88..705095be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11661,15 +11661,6 @@ "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", "dev": true }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -14613,8 +14604,7 @@ "glob-to-regexp": "^0.4.0", "is-subset": "^0.1.1", "lodash.isequal": "^4.5.0", - "path-to-regexp": "^2.2.1", - "querystring": "^0.2.1" + "path-to-regexp": "^2.2.1" }, "engines": { "node": ">=4.0.0" diff --git a/packages/fetch-mock-legacy/package.json b/packages/fetch-mock-legacy/package.json index bb419834..697cefa2 100644 --- a/packages/fetch-mock-legacy/package.json +++ b/packages/fetch-mock-legacy/package.json @@ -44,8 +44,7 @@ "glob-to-regexp": "^0.4.0", "is-subset": "^0.1.1", "lodash.isequal": "^4.5.0", - "path-to-regexp": "^2.2.1", - "querystring": "^0.2.1" + "path-to-regexp": "^2.2.1" }, "peerDependenciesMeta": { "node-fetch": { diff --git a/packages/fetch-mock-legacy/src/Route/matchers.js b/packages/fetch-mock-legacy/src/Route/matchers.js index 9bc6d93d..db99bb1f 100644 --- a/packages/fetch-mock-legacy/src/Route/matchers.js +++ b/packages/fetch-mock-legacy/src/Route/matchers.js @@ -1,6 +1,5 @@ import glob from 'glob-to-regexp'; import pathToRegexp from 'path-to-regexp'; -import querystring from 'querystring'; import isSubset from 'is-subset'; import isEqual from 'lodash.isequal'; import { @@ -78,22 +77,54 @@ const getQueryStringMatcher = ({ query: passedQuery }) => { debug(' No query parameters expectations defined - skipping'); return; } - const expectedQuery = querystring.parse(querystring.stringify(passedQuery)); - debug(' Expected query parameters:', passedQuery); - const keys = Object.keys(expectedQuery); + + const expectedQuery = new URLSearchParams(); + for (const [key, value] of Object.entries(passedQuery)) { + if (Array.isArray(value)) { + for (const item of value) { + expectedQuery.append( + key, + typeof item === 'object' || typeof item === 'undefined' + ? '' + : item.toString(), + ); + } + } else { + expectedQuery.append( + key, + typeof value === 'object' || typeof value === 'undefined' + ? '' + : value.toString(), + ); + } + } + + const keys = Array.from(expectedQuery.keys()); return (url) => { debug('Attempting to match query parameters'); - const query = querystring.parse(getQuery(url)); - debug(' Expected query parameters:', expectedQuery); - debug(' Actual query parameters:', query); + const queryString = getQuery(url); + const query = new URLSearchParams(queryString); + debug( + ' Expected query parameters:', + Object.fromEntries(expectedQuery.entries()), + ); + debug(' Actual query parameters:', Object.fromEntries(query.entries())); + return keys.every((key) => { - if (Array.isArray(query[key])) { - if (!Array.isArray(expectedQuery[key])) { - return false; - } - return isEqual(query[key].sort(), expectedQuery[key].sort()); + const expectedValues = expectedQuery.getAll(key).sort(); + const actualValues = query.getAll(key).sort(); + + if (expectedValues.length !== actualValues.length) { + return false; } - return query[key] === expectedQuery[key]; + + if (Array.isArray(passedQuery[key])) { + return expectedValues.every( + (expected, index) => expected === actualValues[index], + ); + } + + return isEqual(actualValues, expectedValues); }); }; };