|
1 | 1 | import semver from "semver"; |
2 | 2 | import { error } from "@sveltejs/kit"; |
3 | | -import { gitHubCache } from "$lib/server/github-cache"; |
| 3 | +import { gitHubCache, type GitHubRelease } from "$lib/server/github-cache"; |
4 | 4 | import { discoverer } from "$lib/server/package-discoverer"; |
5 | 5 |
|
6 | 6 | export async function load({ params }) { |
7 | 7 | const { package: slugPackage } = params; |
8 | 8 | const categorizedPackages = await discoverer.getOrDiscoverCategorized(); |
9 | 9 |
|
10 | | - // Discover packages, if this one doesn't exist, return 404 |
| 10 | + let currentPackage: |
| 11 | + | (Omit< |
| 12 | + (typeof categorizedPackages)[number]["packages"][number], |
| 13 | + "dataFilter" | "metadataFromTag" | "changelogContentsReplacer" |
| 14 | + > & { category: (typeof categorizedPackages)[number]["category"] }) |
| 15 | + | undefined = undefined; |
| 16 | + const foundVersions = new Set<string>(); |
| 17 | + const releases: (GitHubRelease & { cleanVersion: string })[] = []; |
| 18 | + |
| 19 | + // Discover releases |
| 20 | + console.log("Starting loading releases..."); |
11 | 21 | for (const { category, packages } of categorizedPackages) { |
12 | | - for (const fullPackage of packages) { |
13 | | - const { packageName, ...repo } = fullPackage; |
14 | | - const { dataFilter, metadataFromTag, changelogContentsReplacer, ...rest } = repo; |
| 22 | + for (const { packageName, ...repo } of packages) { |
15 | 23 | if (packageName.toLowerCase() === slugPackage.toLowerCase()) { |
16 | | - return { |
17 | | - currentPackage: { |
18 | | - category, |
19 | | - packageName, |
20 | | - ...rest |
21 | | - }, |
22 | | - releases: gitHubCache.getReleases({ ...repo, category }).then(releases => { |
23 | | - const dataFiltered = releases |
24 | | - .filter(release => dataFilter?.(release) ?? true) |
25 | | - .sort((a, b) => { |
26 | | - const [, firstVersion] = repo.metadataFromTag(a.tag_name); |
27 | | - const [, secondVersion] = repo.metadataFromTag(b.tag_name); |
28 | | - return semver.rcompare(firstVersion, secondVersion); |
29 | | - }); |
30 | | - const pkgTagFiltered = dataFiltered.filter(({ tag_name }) => |
31 | | - tag_name.includes(slugPackage) |
| 24 | + // 1. Get releases |
| 25 | + const cachedReleases = await gitHubCache.getReleases({ ...repo, category }); |
| 26 | + console.log( |
| 27 | + `${cachedReleases.length} releases found for repo ${repo.owner}/${repo.repoName}` |
| 28 | + ); |
| 29 | + |
| 30 | + // 2. Filter out invalid ones |
| 31 | + const dataFiltered = cachedReleases |
| 32 | + .filter(release => repo.dataFilter?.(release) ?? true) |
| 33 | + .sort((a, b) => { |
| 34 | + const [, firstVersion] = repo.metadataFromTag(a.tag_name); |
| 35 | + const [, secondVersion] = repo.metadataFromTag(b.tag_name); |
| 36 | + return semver.rcompare(firstVersion, secondVersion); |
| 37 | + }); |
| 38 | + console.log("Length after filtering:", dataFiltered.length); |
| 39 | + const pkgTagFiltered = dataFiltered.filter(({ tag_name }) => |
| 40 | + tag_name.toLowerCase().includes(slugPackage.toLowerCase()) |
| 41 | + ); |
| 42 | + console.log(`Got ${pkgTagFiltered.length} releases after filtering by package name`); |
| 43 | + // Get the releases matching the slug, or all of them if none |
| 44 | + // (the latter case for repos with no package in names) |
| 45 | + const validReleases = pkgTagFiltered.length ? pkgTagFiltered : dataFiltered; |
| 46 | + console.log("Final filtered count:", validReleases.length); |
| 47 | + |
| 48 | + // 3. For each release, check if it is already found, searching by versions |
| 49 | + const { dataFilter, metadataFromTag, changelogContentsReplacer, ...rest } = repo; |
| 50 | + for (const release of validReleases) { |
| 51 | + const [, cleanVersion] = repo.metadataFromTag(release.tag_name); |
| 52 | + console.log(`Release ${release.tag_name}, extracted version: ${cleanVersion}`); |
| 53 | + if (foundVersions.has(cleanVersion)) continue; |
| 54 | + |
| 55 | + // If not, add its version to the set and itself to the final version |
| 56 | + const currentNewestVersion = [...foundVersions].sort(semver.rcompare)[0]; |
| 57 | + console.log("Current newest version", currentNewestVersion); |
| 58 | + foundVersions.add(cleanVersion); |
| 59 | + releases.push({ ...release, cleanVersion }); |
| 60 | + |
| 61 | + // If it is newer than the newest we got, set this repo as the "final repo" |
| 62 | + if (!currentNewestVersion || semver.gt(cleanVersion, currentNewestVersion)) { |
| 63 | + console.log( |
| 64 | + `Current newest version "${currentNewestVersion}" doesn't exist or is lesser than ${cleanVersion}, setting ${rest.owner}/${rest.repoName} as final repo` |
32 | 65 | ); |
33 | | - return pkgTagFiltered.length ? pkgTagFiltered : dataFiltered; |
34 | | - }) |
35 | | - }; |
| 66 | + currentPackage = { |
| 67 | + category, |
| 68 | + packageName, |
| 69 | + ...rest |
| 70 | + }; |
| 71 | + } |
| 72 | + } |
| 73 | + console.log("Done"); |
36 | 74 | } |
37 | 75 | } |
38 | 76 | } |
39 | 77 |
|
| 78 | + if (currentPackage) { |
| 79 | + // Return the final sorted results and filter back out the clean version |
| 80 | + return { |
| 81 | + currentPackage, |
| 82 | + releases: releases |
| 83 | + .toSorted((a, b) => semver.rcompare(a.cleanVersion, b.cleanVersion)) |
| 84 | + .filter(({ cleanVersion, ...release }) => release) |
| 85 | + }; |
| 86 | + } |
| 87 | + |
| 88 | + // If this one doesn't exist, return 404 |
40 | 89 | error(404); |
41 | 90 | } |
0 commit comments