renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
148 lines (147 loc) • 6.06 kB
JavaScript
import { regEx } from "../../../util/regex.js";
import { isHttpUrl } from "../../../util/url.js";
import { BitbucketTagsDatasource } from "../../datasource/bitbucket-tags/index.js";
import { MAVEN_REPO } from "../../datasource/maven/common.js";
import { CLOJARS_REPO } from "../../datasource/clojure/common.js";
import { ClojureDatasource } from "../../datasource/clojure/index.js";
import { GitRefsDatasource } from "../../datasource/git-refs/index.js";
import { GithubTagsDatasource } from "../../datasource/github-tags/index.js";
import { GitlabTagsDatasource } from "../../datasource/gitlab-tags/index.js";
import { parseDepsEdnFile } from "./parser.js";
import { isPlainObject, isString } from "@sindresorhus/is";
//#region lib/modules/manager/deps-edn/extract.ts
const dependencyRegex = regEx(/^(?<groupId>[a-zA-Z][-_a-zA-Z0-9]*(?:\.[a-zA-Z0-9][-_a-zA-Z0-9]*)*)(?:\/(?<artifactId>[a-zA-Z][-_a-zA-Z0-9]*(?:\.[a-zA-Z0-9][-_a-zA-Z0-9]*)*))?$/);
function getPackageName(depName) {
const matchGroups = dependencyRegex.exec(depName)?.groups;
if (matchGroups) {
const groupId = matchGroups.groupId;
return `${groupId}:${matchGroups.artifactId ? matchGroups.artifactId : groupId}`;
}
return null;
}
const githubDependencyRegex = regEx(/^(?:com|io)\.github\.(?<packageName>[^/]+\/[^/]+)$/);
const gitlabDependencyRegex = regEx(/^(?:com|io)\.gitlab\.(?<packageName>[^/]+\/[^/]+)$/);
const bitbucketDependencyRegex = regEx(/^(?:org|io)\.bitbucket\.(?<packageName>[^/]+\/[^/]+)$/);
function resolveGitPackageFromEdnKey(dep, key) {
if (dep.datasource) return;
const githubDependencyGroups = githubDependencyRegex.exec(key)?.groups;
if (githubDependencyGroups?.packageName) {
dep.datasource = GithubTagsDatasource.id;
dep.packageName = githubDependencyGroups.packageName;
return;
}
const gitlabDependencyGroups = gitlabDependencyRegex.exec(key)?.groups;
if (gitlabDependencyGroups?.packageName) {
dep.datasource = GitlabTagsDatasource.id;
dep.packageName = gitlabDependencyGroups.packageName;
return;
}
const bitbucketDependencyGroups = bitbucketDependencyRegex.exec(key)?.groups;
if (bitbucketDependencyGroups?.packageName) {
dep.datasource = BitbucketTagsDatasource.id;
dep.packageName = bitbucketDependencyGroups.packageName;
return;
}
}
const githubUrlRegex = regEx(/^(?:https:\/\/|git@)github\.com[/:](?<packageName>[^/]+\/[^/]+?)(?:\.git)?$/);
const gitlabUrlRegex = regEx(/^(?:https:\/\/|git@)gitlab\.com[/:](?<packageName>[^/]+\/[^/]+?)(?:\.git)?$/);
const bitbucketUrlRegex = regEx(/^(?:https:\/\/|git@)bitbucket\.org[/:](?<packageName>[^/]+\/[^/]+?)(?:\.git)?$/);
function resolveGitPackageFromEdnVal(dep, val) {
const gitUrl = val["git/url"];
if (!isString(gitUrl)) return;
const githubMatchGroups = githubUrlRegex.exec(gitUrl)?.groups;
if (githubMatchGroups) {
dep.datasource = GithubTagsDatasource.id;
dep.packageName = githubMatchGroups.packageName;
dep.sourceUrl = `https://github.com/${dep.packageName}`;
return;
}
const gitlabMatchGroups = gitlabUrlRegex.exec(gitUrl)?.groups;
const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitUrl)?.groups;
if (gitlabMatchGroups) {
dep.datasource = GitlabTagsDatasource.id;
dep.packageName = gitlabMatchGroups.packageName;
dep.sourceUrl = `https://gitlab.com/${dep.packageName}`;
return;
}
if (bitbucketMatchGroups) {
dep.datasource = GitlabTagsDatasource.id;
dep.packageName = bitbucketMatchGroups.packageName;
dep.sourceUrl = `https://bitbucket.org/${dep.packageName}`;
return;
}
dep.datasource = GitRefsDatasource.id;
dep.packageName = gitUrl;
if (isHttpUrl(gitUrl)) dep.sourceUrl = gitUrl.replace(/\.git$/, "");
}
function extractDependency(key, val, metadata, mavenRegistries, depType) {
if (!isPlainObject(val)) return null;
const packageName = getPackageName(key);
if (!packageName) return null;
const dep = {
depName: key,
packageName,
currentValue: null,
...metadata.get(val)
};
if (depType) dep.depType = depType;
const mvnVersion = val["mvn/version"];
if (isString(mvnVersion)) {
dep.datasource = ClojureDatasource.id;
dep.currentValue = mvnVersion;
dep.packageName = packageName.replace("/", ":");
dep.registryUrls = [...mavenRegistries];
return dep;
}
resolveGitPackageFromEdnVal(dep, val);
resolveGitPackageFromEdnKey(dep, key);
if (dep.datasource) {
const gitTag = val["git/tag"];
if (isString(gitTag)) dep.currentValue = gitTag;
const gitSha = val["git/sha"] ?? val.sha;
if (isString(gitSha)) {
dep.currentDigest = gitSha;
dep.currentDigestShort = gitSha.slice(0, 7);
}
return dep;
}
return null;
}
function extractSection(section, metadata, mavenRegistries, depType) {
const deps = [];
if (isPlainObject(section)) for (const [key, val] of Object.entries(section)) {
const dep = extractDependency(key, val, metadata, mavenRegistries, depType);
if (dep) deps.push(dep);
}
return deps;
}
function extractPackageFile(content) {
const parsed = parseDepsEdnFile(content);
if (!parsed) return null;
const { data, metadata } = parsed;
const deps = [];
const registryMap = {
clojars: CLOJARS_REPO,
central: MAVEN_REPO
};
const mavenRepos = data["mvn/repos"];
if (isPlainObject(mavenRepos)) {
for (const [repoName, repoSpec] of Object.entries(mavenRepos)) if (isString(repoName)) {
if (isPlainObject(repoSpec) && isString(repoSpec.url)) registryMap[repoName] = repoSpec.url;
else if (isString(repoSpec) && repoSpec === "nil") delete registryMap[repoName];
}
}
const mavenRegistries = Object.values(registryMap);
deps.push(...extractSection(data.deps, metadata, mavenRegistries));
const aliases = data.aliases;
if (isPlainObject(aliases)) {
for (const [depType, aliasSection] of Object.entries(aliases)) if (isPlainObject(aliasSection)) {
deps.push(...extractSection(aliasSection["extra-deps"], metadata, mavenRegistries, depType));
deps.push(...extractSection(aliasSection["override-deps"], metadata, mavenRegistries, depType));
}
}
return { deps };
}
//#endregion
export { extractPackageFile };
//# sourceMappingURL=extract.js.map