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); 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); }