/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at . */ const defaultUrl = { hash: "", host: "", hostname: "", href: "", origin: "null", password: "", path: "", pathname: "", port: "", protocol: "", search: "", // This should be a "URLSearchParams" object searchParams: {}, username: "", }; const parseCache = new Map(); export function parse(url) { if (parseCache.has(url)) { return parseCache.get(url); } let urlObj; try { urlObj = new URL(url); } catch (err) { urlObj = { ...defaultUrl }; // If we're given simply a filename... if (url) { const hashStart = url.indexOf("#"); if (hashStart >= 0) { urlObj.hash = url.slice(hashStart); url = url.slice(0, hashStart); if (urlObj.hash === "#") { // The standard URL parser does not include the ? unless there are // parameters included in the search value. urlObj.hash = ""; } } const queryStart = url.indexOf("?"); if (queryStart >= 0) { urlObj.search = url.slice(queryStart); url = url.slice(0, queryStart); if (urlObj.search === "?") { // The standard URL parser does not include the ? unless there are // parameters included in the search value. urlObj.search = ""; } } urlObj.pathname = url; } } // When provided a special URL like "webpack:///webpack/foo", // prevents passing the three slashes in the path, and pass only onea. // This will prevent displaying modules in empty-name sub folders. urlObj.pathname = urlObj.pathname.replace(/\/+/, "/"); urlObj.path = urlObj.pathname + urlObj.search; // Cache the result parseCache.set(url, urlObj); return urlObj; } export function sameOrigin(firstUrl, secondUrl) { return parse(firstUrl).origin == parse(secondUrl).origin; }