UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

105 lines (104 loc) 4.6 kB
import { regEx } from "../../util/regex.js"; import { isHttpUrl, parseUrl, trimTrailingSlash } from "../../util/url.js"; import { hosts } from "../../util/host-rules.js"; import { detectPlatform } from "../../util/common.js"; import { asTimestamp } from "../../util/timestamp.js"; import { parseGitUrl } from "../../util/git/url.js"; import { manualChangelogUrls, manualSourceUrls } from "./metadata-manual.js"; import { isEmptyString, isNullOrUndefined, isString, isUndefined } from "@sindresorhus/is"; import parse from "github-url-from-git"; //#region lib/modules/datasource/metadata.ts const githubPages = regEx("^https://([^.]+).github.com/([^/]+)$"); const gitPrefix = regEx("^git:/?/?"); function massageUrl(sourceUrl) { const massagedUrl = massageGitAtUrl(sourceUrl); if (!parseUrl(massagedUrl)) return ""; if (detectPlatform(massagedUrl) === "gitlab") return massageGitlabUrl(sourceUrl); return massageGithubUrl(sourceUrl); } function massageGithubUrl(url) { return massageGitAtUrl(url).replace("http:", "https:").replace("http+git:", "https:").replace("https+git:", "https:").replace("ssh://git@", "https://").replace(gitPrefix, "https://").replace(githubPages, "https://github.com/$1/$2").replace("www.github.com", "github.com").split("/").slice(0, 5).join("/"); } function massageGitlabUrl(url) { return massageGitAtUrl(url).replace("http:", "https:").replace(gitPrefix, "https://").replace(regEx(/\/tree\/.*$/i), "").replace(regEx(/\/$/i), "").replace(regEx(/\.git$/i), ""); } function massageGitAtUrl(url) { let massagedUrl = url; if (url.startsWith("git@")) massagedUrl = url.replace(":", "/").replace("git@", "https://"); return massagedUrl; } function massageTimestamps(dep) { for (const release of dep.releases || []) { let { releaseTimestamp } = release; delete release.releaseTimestamp; releaseTimestamp = asTimestamp(releaseTimestamp); if (releaseTimestamp) release.releaseTimestamp = releaseTimestamp; } } function addMetaData(dep, datasource, packageName) { massageTimestamps(dep); const packageNameLowercase = packageName.toLowerCase(); const manualChangelogUrl = manualChangelogUrls[datasource]?.[packageNameLowercase]; if (manualChangelogUrl) dep.changelogUrl = manualChangelogUrl; const manualSourceUrl = manualSourceUrls[datasource]?.[packageNameLowercase]; if (manualSourceUrl) dep.sourceUrl = manualSourceUrl; if (dep.sourceUrl && !dep.sourceDirectory) try { const parsed = parseGitUrl(dep.sourceUrl); if (parsed.filepathtype === "tree" && parsed.filepath !== "") { dep.sourceUrl = parsed.toString(); dep.sourceDirectory = parsed.filepath; } } catch {} if (!dep.sourceUrl && dep.changelogUrl && detectPlatform(dep.changelogUrl) === "github") dep.sourceUrl = dep.changelogUrl; if (!dep.sourceUrl && dep.homepage) { const platform = detectPlatform(dep.homepage); if (platform === "github" || platform === "gitlab") dep.sourceUrl = dep.homepage; } const extraBaseUrls = []; // istanbul ignore next hosts({ hostType: "github" }).forEach((host) => { extraBaseUrls.push(host, `gist.${host}`); }); extraBaseUrls.push("gitlab.com"); if (dep.sourceUrl) { const massagedUrl = massageUrl(dep.sourceUrl); if (isEmptyString(massagedUrl)) delete dep.sourceUrl; else { dep.sourceUrl = parse(massagedUrl, { extraBaseUrls }) || dep.sourceUrl; if (!isHttpUrl(dep.sourceUrl) && detectPlatform(massagedUrl) === "gitlab") dep.sourceUrl = massagedUrl; } } if (shouldDeleteHomepage(dep.sourceUrl, dep.homepage)) delete dep.homepage; for (const urlKey of [ "homepage", "sourceUrl", "changelogUrl", "dependencyUrl" ]) { const urlVal = dep[urlKey]; if (isString(urlVal) && isHttpUrl(urlVal.trim())) dep[urlKey] = urlVal.trim(); else delete dep[urlKey]; } } /** * Returns true if * 1. it's a github or gitlab url and not a path within the repo. * 2. it's equal to sourceURl * @param sourceUrl * @param homepage */ function shouldDeleteHomepage(sourceUrl, homepage) { if (isNullOrUndefined(sourceUrl) || isUndefined(homepage)) return false; const massagedSourceUrl = massageUrl(sourceUrl); const platform = detectPlatform(homepage); if (platform === "github" || platform === "gitlab") { const sourceUrlParsed = parseUrl(massagedSourceUrl); if (isNullOrUndefined(sourceUrlParsed)) return false; const homepageParsed = parseUrl(homepage); return homepageParsed !== null && trimTrailingSlash(homepageParsed.pathname) === trimTrailingSlash(sourceUrlParsed.pathname); } return massagedSourceUrl === homepage; } //#endregion export { addMetaData, massageGithubUrl }; //# sourceMappingURL=metadata.js.map