From 3527d8b4f36affe7ad00a58b5850bf5085645fa4 Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Sat, 13 Mar 2021 12:41:51 +0400
Subject: [PATCH] feat(util): Add lightweight parseUrl function (#9019)

Co-authored-by: Rhys Arkins <rhys@arkins.net>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
---
 lib/util/url.spec.ts | 19 ++++++++++++++++++-
 lib/util/url.ts      |  8 ++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/lib/util/url.spec.ts b/lib/util/url.spec.ts
index 6e9665ceb3..b1a5d24980 100644
--- a/lib/util/url.spec.ts
+++ b/lib/util/url.spec.ts
@@ -1,4 +1,9 @@
-import { resolveBaseUrl, trimTrailingSlash, validateUrl } from './url';
+import {
+  parseUrl,
+  resolveBaseUrl,
+  trimTrailingSlash,
+  validateUrl,
+} from './url';
 
 describe('util/url', () => {
   test.each([
@@ -45,6 +50,7 @@ describe('util/url', () => {
   ])('%s + %s => %s', (baseUrl, x, result) => {
     expect(resolveBaseUrl(baseUrl, x)).toBe(result);
   });
+
   it('validates URLs', () => {
     expect(validateUrl()).toBe(false);
     expect(validateUrl(null)).toBe(false);
@@ -53,6 +59,17 @@ describe('util/url', () => {
     expect(validateUrl('http://github.com')).toBe(true);
     expect(validateUrl('https://github.com')).toBe(true);
   });
+
+  it('parses URL', () => {
+    expect(parseUrl(null)).toBeNull();
+    expect(parseUrl(undefined)).toBeNull();
+
+    const url = parseUrl('https://github.com/renovatebot/renovate');
+    expect(url.protocol).toBe('https:');
+    expect(url.host).toBe('github.com');
+    expect(url.pathname).toBe('/renovatebot/renovate');
+  });
+
   it('trimTrailingSlash', () => {
     expect(trimTrailingSlash('foo')).toBe('foo');
     expect(trimTrailingSlash('/foo/bar')).toBe('/foo/bar');
diff --git a/lib/util/url.ts b/lib/util/url.ts
index 6e61b1eeee..0c9b975f7e 100644
--- a/lib/util/url.ts
+++ b/lib/util/url.ts
@@ -48,3 +48,11 @@ export function validateUrl(url?: string, httpOnly = true): boolean {
     return false;
   }
 }
+
+export function parseUrl(url: string): URL | null {
+  try {
+    return new URL(url);
+  } catch (err) {
+    return null;
+  }
+}
-- 
GitLab