71 lines
2.5 KiB
JavaScript
71 lines
2.5 KiB
JavaScript
import { fetchRepo, fetchReleases, normalizeRepoInput } from "./pluginService.js";
|
|
|
|
export function buildDownloadUrl(repoEntry, version, sourceType = "release") {
|
|
const ownerRepo = repoEntry.repo;
|
|
if (repoEntry.provider === "gitea") {
|
|
const sanitizedBase = (repoEntry.baseUrl || "").replace(/\/$/, "");
|
|
const [owner, repo] = ownerRepo.split("/");
|
|
return `${sanitizedBase}/${owner}/${repo}/archive/${version}.zip`;
|
|
}
|
|
const refType = sourceType === "release" ? "tags" : "heads";
|
|
return `https://codeload.github.com/${ownerRepo}/zip/refs/${refType}/${version}`;
|
|
}
|
|
|
|
export async function resolveRepoDownload(repoEntry, requestedVersion = "latest") {
|
|
const normalizedEntry = normalizeRepoInput(repoEntry, {
|
|
repo: repoEntry.repo,
|
|
provider: repoEntry.provider,
|
|
baseUrl: repoEntry.baseUrl
|
|
});
|
|
if (!normalizedEntry) {
|
|
throw new Error("Kon repository gegevens niet bepalen.");
|
|
}
|
|
|
|
const repoInfo = await fetchRepo(normalizedEntry);
|
|
if (repoInfo.isPrivate) {
|
|
const error = new Error("Downloads niet beschikbaar voor private repositories.");
|
|
error.meta = "PRIVATE_REPO";
|
|
throw error;
|
|
}
|
|
const releases = await fetchReleases(normalizedEntry).catch(() => []);
|
|
|
|
let targetVersion = requestedVersion || "latest";
|
|
let sourceType = "release";
|
|
|
|
if (targetVersion === "latest") {
|
|
if (releases.length > 0) {
|
|
targetVersion = releases[0].tag;
|
|
} else {
|
|
targetVersion = repoInfo.defaultBranch || "main";
|
|
sourceType = "branch";
|
|
}
|
|
} else {
|
|
const found = releases.find((release) => release.tag === targetVersion || release.name === targetVersion);
|
|
if (!found) {
|
|
sourceType = "branch";
|
|
} else {
|
|
targetVersion = found.tag;
|
|
}
|
|
}
|
|
|
|
const downloadUrl = buildDownloadUrl(normalizedEntry, targetVersion, sourceType);
|
|
const filenameBase = repoInfo.name || normalizedEntry.repo.split("/").pop() || "plugin";
|
|
return {
|
|
url: downloadUrl,
|
|
version: targetVersion,
|
|
sourceType,
|
|
filename: `${filenameBase}-${targetVersion}.zip`,
|
|
repoEntry: normalizedEntry,
|
|
repoInfo
|
|
};
|
|
}
|
|
|
|
export async function getDownloadSourceForLicense(licenseRow, requestedVersion = "latest") {
|
|
const repoEntry = {
|
|
repo: licenseRow.repo_name,
|
|
provider: licenseRow.repo_provider,
|
|
baseUrl: licenseRow.repo_base_url
|
|
};
|
|
return resolveRepoDownload(repoEntry, requestedVersion);
|
|
}
|