Source code

Revision control

Copy as Markdown

Other Tools

/* 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 <http://mozilla.org/MPL/2.0/>. */
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;
}