renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
103 lines (102 loc) • 3.24 kB
JavaScript
import { regEx } from "./regex.js";
import { logger } from "../logger/index.js";
import { isArray, isNonEmptyString, isString, isUrlInstance } from "@sindresorhus/is";
import _parseLinkHeader from "parse-link-header";
import urlJoin from "url-join";
//#region lib/util/url.ts
function joinUrlParts(...parts) {
return urlJoin(...parts);
}
function ensurePathPrefix(url, prefix) {
const parsed = new URL(url);
const fullPath = parsed.pathname + parsed.search;
if (fullPath.startsWith(prefix)) return url;
return parsed.origin + prefix + fullPath;
}
function ensureTrailingSlash(url) {
return url.replace(/\/?$/, "/");
}
function trimTrailingSlash(url) {
return url.replace(regEx(/\/+$/), "");
}
function trimLeadingSlash(path) {
return path.replace(/^\/+/, "");
}
function trimSlashes(path) {
return trimLeadingSlash(trimTrailingSlash(path));
}
/**
* Resolves an input path against a base URL
*
* @param baseUrl - base URL to resolve against
* @param input - input path (if this is a full URL, it will be returned)
*/
function resolveBaseUrl(baseUrl, input) {
const inputString = input.toString();
let host;
let pathname;
try {
({host, pathname} = new URL(inputString));
} catch {
pathname = inputString;
}
return host ? inputString : urlJoin(baseUrl, pathname || "");
}
/**
* Replaces the path of a URL with a new path
*
* @param baseUrl - source URL
* @param path - replacement path (if this is a full URL, it will be returned)
*/
function replaceUrlPath(baseUrl, path) {
if (parseUrl(path)) return path;
const { origin } = isString(baseUrl) ? new URL(baseUrl) : baseUrl;
return urlJoin(origin, path);
}
function getQueryString(params) {
const usp = new URLSearchParams();
for (const [k, v] of Object.entries(params)) if (isArray(v)) for (const item of v) usp.append(k, item.toString());
else usp.append(k, v.toString());
return usp.toString();
}
function isHttpUrl(url) {
if (!isNonEmptyString(url) && !isUrlInstance(url)) return false;
const protocol = parseUrl(url)?.protocol;
return protocol === "https:" || protocol === "http:";
}
function parseUrl(url) {
if (!url) return null;
if (url instanceof URL) return url;
try {
return new URL(url);
} catch {
return null;
}
}
/**
* Tries to create an URL object from either a full URL string or a hostname
* @param url either the full url or a hostname
* @returns an URL object or null
*/
function createURLFromHostOrURL(url) {
return parseUrl(url) ?? parseUrl(`https://${url}`);
}
function parseLinkHeader(linkHeader) {
if (!isNonEmptyString(linkHeader)) return null;
if (linkHeader.length > 2e3) {
logger.warn({ linkHeader }, "Link header too long.");
return null;
}
return _parseLinkHeader(linkHeader);
}
/**
* prefix https:// to hosts with port or path
*/
function massageHostUrl(url) {
if (!url.includes("://") && url.includes("/")) return `https://${url}`;
else if (!url.includes("://") && url.includes(":")) return `https://${url}`;
else return url;
}
//#endregion
export { createURLFromHostOrURL, ensurePathPrefix, ensureTrailingSlash, getQueryString, isHttpUrl, joinUrlParts, massageHostUrl, parseLinkHeader, parseUrl, replaceUrlPath, resolveBaseUrl, trimLeadingSlash, trimSlashes, trimTrailingSlash };
//# sourceMappingURL=url.js.map