From e6b81d42c395165095c280bb752dff43b74d7d0e Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Mon, 21 Jul 2025 10:28:53 -0700 Subject: [PATCH] Chore: Migrate `urlUtils` from deprecated `url.parse` to `URL` (#12750) --- packages/lib/urlUtils.test.js | 19 +++++++++++++++++++ packages/lib/urlUtils.ts | 11 +++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/lib/urlUtils.test.js b/packages/lib/urlUtils.test.js index 9baa2d0ec6..13b3bcda4f 100644 --- a/packages/lib/urlUtils.test.js +++ b/packages/lib/urlUtils.test.js @@ -14,6 +14,7 @@ describe('urlUtils', () => { expect(urlUtils.prependBaseUrl('//somewhereelse.com/testing.html', 'http://example.com/something')).toBe('http://somewhereelse.com/testing.html'); expect(urlUtils.prependBaseUrl('', 'http://example.com/something')).toBe('http://example.com/something'); expect(urlUtils.prependBaseUrl('testing.html', '')).toBe('testing.html'); + expect(urlUtils.prependBaseUrl('/testing.html', '')).toBe('/testing.html'); // It shouldn't prepend anything for these: expect(urlUtils.prependBaseUrl('mailto:emailme@example.com', 'http://example.com')).toBe('mailto:emailme@example.com'); @@ -91,4 +92,22 @@ describe('urlUtils', () => { } })); + it('urlProtocol should detect file protocol URLs', () => { + expect(urlUtils.urlProtocol('file:/test')).toBe('file:'); + expect(urlUtils.urlProtocol('file://test')).toBe('file:'); + expect(urlUtils.urlProtocol('file:///test')).toBe('file:'); + expect(urlUtils.urlProtocol('file://C:\\Users\\test`')).toBe('file:'); + }); + + it('urlProtocol should return null for non-empty URLs with no protocol', () => { + expect(urlUtils.urlProtocol('invalid!protocol:/test')).toBe(null); + expect(urlUtils.urlProtocol('!protocol:/test')).toBe(null); + expect(urlUtils.urlProtocol('.protocol:/test')).toBe(null); + }); + + it('urlProtocol should support protocols with uppercase characters, hyphens, and +s', () => { + expect(urlUtils.urlProtocol('ValidProtocol:/test')).toBe('validprotocol:'); + expect(urlUtils.urlProtocol('valid-protocol:/test')).toBe('valid-protocol:'); + expect(urlUtils.urlProtocol('valid+protocol:/test')).toBe('valid+protocol:'); + }); }); diff --git a/packages/lib/urlUtils.ts b/packages/lib/urlUtils.ts index 6f4165c75e..bf4ee164ef 100644 --- a/packages/lib/urlUtils.ts +++ b/packages/lib/urlUtils.ts @@ -8,13 +8,20 @@ export const hash = (url: string) => { }; export const urlWithoutPath = (url: string) => { - const parsed = require('url').parse(url, true); + const parsed = new URL(url); return `${parsed.protocol}//${parsed.host}`; }; export const urlProtocol = (url: string) => { if (!url) return ''; - const parsed = require('url').parse(url, true); + + let parsed; + try { + parsed = new URL(url); + } catch (error) { + // Match the NodeJS url.parse behavior in the case of an invalid URL: + return null; + } return parsed.protocol; };