From 76d0d42c9eb8dd4d35ce743beab8a7683384ed5a Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Wed, 24 Feb 2021 09:58:21 +0100
Subject: [PATCH] refactor: getQueryString (#8834)

---
 lib/datasource/repology/index.ts       |  5 +++--
 lib/platform/bitbucket-server/index.ts |  6 +++---
 lib/platform/gitea/gitea-helper.ts     | 24 +++++-------------------
 lib/platform/gitlab/index.ts           | 10 +++++-----
 lib/util/url.ts                        | 15 +++++++++++++++
 5 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/lib/datasource/repology/index.ts b/lib/datasource/repology/index.ts
index 3c3675f8de..b3c4c034ed 100644
--- a/lib/datasource/repology/index.ts
+++ b/lib/datasource/repology/index.ts
@@ -3,6 +3,7 @@ import { logger } from '../../logger';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import * as packageCache from '../../util/cache/package';
 import { Http } from '../../util/http';
+import { getQueryString } from '../../util/url';
 import { GetReleasesConfig, ReleaseResult } from '../common';
 
 export const id = 'repology';
@@ -46,13 +47,13 @@ async function queryPackagesViaResolver(
   packageName: string,
   packageType: RepologyPackageType
 ): Promise<RepologyPackage[]> {
-  const query = new URLSearchParams({
+  const query = getQueryString({
     repo: repoName,
     name_type: packageType,
     target_page: 'api_v1_project',
     noautoresolve: 'on',
     name: packageName,
-  }).toString();
+  });
 
   // Retrieve list of packages by looking up Repology project
   const packages = await queryPackages(
diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts
index 7123068ead..bb07c4e1cf 100644
--- a/lib/platform/bitbucket-server/index.ts
+++ b/lib/platform/bitbucket-server/index.ts
@@ -1,4 +1,4 @@
-import url, { URLSearchParams } from 'url';
+import url from 'url';
 import is from '@sindresorhus/is';
 import delay from 'delay';
 import type { PartialDeep } from 'type-fest';
@@ -21,7 +21,7 @@ import {
   setBaseUrl,
 } from '../../util/http/bitbucket-server';
 import { sanitize } from '../../util/sanitize';
-import { ensureTrailingSlash } from '../../util/url';
+import { ensureTrailingSlash, getQueryString } from '../../util/url';
 import {
   BranchStatusConfig,
   CreatePRConfig,
@@ -326,7 +326,7 @@ export async function getPrList(refreshCache?: boolean): Promise<Pr[]> {
       searchParams['role.1'] = 'AUTHOR';
       searchParams['username.1'] = config.username;
     }
-    const query = new URLSearchParams(searchParams).toString();
+    const query = getQueryString(searchParams);
     const values = await utils.accumulateValues(
       `./rest/api/1.0/projects/${config.projectKey}/repos/${config.repositorySlug}/pull-requests?${query}`
     );
diff --git a/lib/platform/gitea/gitea-helper.ts b/lib/platform/gitea/gitea-helper.ts
index 592aacd0e4..8026280f41 100644
--- a/lib/platform/gitea/gitea-helper.ts
+++ b/lib/platform/gitea/gitea-helper.ts
@@ -1,6 +1,6 @@
-import { URLSearchParams } from 'url';
 import { BranchStatus, PrState } from '../../types';
 import { GiteaHttp, GiteaHttpOptions } from '../../util/http/gitea';
+import { getQueryString } from '../../util/url';
 import { PrReviewersParams } from './types';
 
 const giteaHttp = new GiteaHttp();
@@ -192,20 +192,6 @@ const commitStatusStates: CommitStatusType[] = [
   'error',
 ];
 
-function queryParams(params: Record<string, any>): URLSearchParams {
-  const usp = new URLSearchParams();
-  for (const [k, v] of Object.entries(params)) {
-    if (Array.isArray(v)) {
-      for (const item of v) {
-        usp.append(k, item.toString());
-      }
-    } else {
-      usp.append(k, v.toString());
-    }
-  }
-  return usp;
-}
-
 export async function getCurrentUser(
   options?: GiteaHttpOptions
 ): Promise<User> {
@@ -218,7 +204,7 @@ export async function searchRepos(
   params: RepoSearchParams,
   options?: GiteaHttpOptions
 ): Promise<Repo[]> {
-  const query = queryParams(params).toString();
+  const query = getQueryString(params);
   const url = `repos/search?${query}`;
   const res = await giteaHttp.getJson<RepoSearchResults>(url, {
     ...options,
@@ -249,7 +235,7 @@ export async function getRepoContents(
   ref?: string,
   options?: GiteaHttpOptions
 ): Promise<RepoContents> {
-  const query = queryParams(ref ? { ref } : {}).toString();
+  const query = getQueryString(ref ? { ref } : {});
   const url = `repos/${repoPath}/contents/${urlEscape(filePath)}?${query}`;
   const res = await giteaHttp.getJson<RepoContents>(url, options);
 
@@ -342,7 +328,7 @@ export async function searchPRs(
   params: PRSearchParams,
   options?: GiteaHttpOptions
 ): Promise<PR[]> {
-  const query = queryParams(params).toString();
+  const query = getQueryString(params);
   const url = `repos/${repoPath}/pulls?${query}`;
   const res = await giteaHttp.getJson<PR[]>(url, {
     ...options,
@@ -397,7 +383,7 @@ export async function searchIssues(
   params: IssueSearchParams,
   options?: GiteaHttpOptions
 ): Promise<Issue[]> {
-  const query = queryParams({ ...params, type: 'issues' }).toString();
+  const query = getQueryString({ ...params, type: 'issues' });
   const url = `repos/${repoPath}/issues?${query}`;
   const res = await giteaHttp.getJson<Issue[]>(url, {
     ...options,
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 2803ebda32..b15e6ed790 100755
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -1,4 +1,4 @@
-import URL, { URLSearchParams } from 'url';
+import URL from 'url';
 import is from '@sindresorhus/is';
 import delay from 'delay';
 import semver from 'semver';
@@ -21,7 +21,7 @@ import * as hostRules from '../../util/host-rules';
 import { HttpResponse } from '../../util/http';
 import { GitlabHttp, setBaseUrl } from '../../util/http/gitlab';
 import { sanitize } from '../../util/sanitize';
-import { ensureTrailingSlash } from '../../util/url';
+import { ensureTrailingSlash, getQueryString } from '../../util/url';
 import {
   BranchStatusConfig,
   CreatePRConfig,
@@ -384,7 +384,7 @@ async function fetchPrList(): Promise<Pr[]> {
     // default: `scope=created_by_me`
     searchParams.scope = 'all';
   }
-  const query = new URLSearchParams(searchParams).toString();
+  const query = getQueryString(searchParams);
   const urlString = `projects/${config.repository}/merge_requests?${query}`;
   try {
     const res = await gitlabApi.getJson<
@@ -710,11 +710,11 @@ export async function setBranchStatus({
 
 export async function getIssueList(): Promise<GitlabIssue[]> {
   if (!config.issueList) {
-    const query = new URLSearchParams({
+    const query = getQueryString({
       per_page: '100',
       author_id: `${authorId}`,
       state: 'opened',
-    }).toString();
+    });
     const res = await gitlabApi.getJson<{ iid: number; title: string }[]>(
       `projects/${config.repository}/issues?${query}`,
       {
diff --git a/lib/util/url.ts b/lib/util/url.ts
index 0ca0938426..1c36aaad2f 100644
--- a/lib/util/url.ts
+++ b/lib/util/url.ts
@@ -17,3 +17,18 @@ export function resolveBaseUrl(baseUrl: string, input: string | URL): string {
 
   return host ? inputString : urlJoin(baseUrl, pathname || '');
 }
+
+export function getQueryString(params: Record<string, any>): string {
+  const usp = new URLSearchParams();
+  for (const [k, v] of Object.entries(params)) {
+    if (Array.isArray(v)) {
+      for (const item of v) {
+        usp.append(k, item.toString());
+      }
+    } else {
+      usp.append(k, v.toString());
+    }
+  }
+  const res = usp.toString();
+  return res;
+}
-- 
GitLab