Skip to content

Commit fa3de2c

Browse files
feat: add RSS feed for "all" package
1 parent ed9c618 commit fa3de2c

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

src/routes/package/[...package]/rss.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { error, type RequestHandler } from "@sveltejs/kit";
22
import { Feed } from "feed";
33
import { discoverer } from "$lib/server/package-discoverer";
4-
import { getPackageReleases } from "../releases";
4+
import { getAllPackagesReleases, getPackageReleases } from "../releases";
55

6-
function getBaseFeed(url: URL, title: string) {
6+
function getBaseFeed(url: URL, title: string, mode: "all" | "single" = "single") {
77
const feed = new Feed({
88
copyright: "",
9-
description: `The releases feed for ${title}, brought by Svelte Changelog.`,
9+
description: `The releases feed for ${mode === "single" ? title : "all the packages"}, brought by Svelte Changelog.`,
1010
favicon: "https://raw.githubusercontent.com/sveltejs/branding/master/svelte-logo.svg",
1111
feedLinks: {
1212
xml: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "rss.xml"),
@@ -35,15 +35,30 @@ export function rssHandler(response: (feed: Feed) => Response): RequestHandler {
3535
const categorizedPackages = await discoverer.getOrDiscoverCategorized();
3636

3737
// 2. Get the releases and package info
38-
const packageReleases = await getPackageReleases(
39-
slugPackage,
40-
categorizedPackages,
41-
locals.posthog
42-
);
43-
if (!packageReleases) error(404);
38+
let packageName: string;
39+
let releases: NonNullable<Awaited<ReturnType<typeof getPackageReleases>>>["releases"];
40+
if (slugPackage.toLowerCase() === "all") {
41+
// All releases
42+
packageName = "All";
43+
releases = await getAllPackagesReleases(categorizedPackages, locals.posthog);
44+
} else {
45+
// This package releases
46+
const packageReleases = await getPackageReleases(
47+
slugPackage,
48+
categorizedPackages,
49+
locals.posthog
50+
);
51+
if (!packageReleases) error(404);
52+
packageName = packageReleases.releasesRepo.pkg.name;
53+
releases = packageReleases.releases;
54+
}
4455

45-
const feed = getBaseFeed(url, `${packageReleases.releasesRepo.pkg.name} releases`);
46-
for (const release of packageReleases.releases) {
56+
const feed = getBaseFeed(
57+
url,
58+
`${packageName} releases`,
59+
packageName.toLowerCase() === "all" ? "all" : "single"
60+
);
61+
for (const release of releases) {
4762
feed.addItem({
4863
author: [
4964
{

src/routes/package/releases.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,30 @@ export async function getPackageReleases(
110110
}
111111
: undefined;
112112
}
113+
114+
/**
115+
* Get all the releases from all the packages.
116+
*
117+
* @param allPackages all the known packages
118+
* @param posthog the optional PostHog instance
119+
* @return a list of all the package releases
120+
*/
121+
export async function getAllPackagesReleases(
122+
allPackages: Awaited<ReturnType<typeof discoverer.getOrDiscoverCategorized>>,
123+
posthog?: PostHog
124+
) {
125+
const packages = allPackages.flatMap(({ packages }) => packages);
126+
127+
const awaitedResult = await Promise.all(
128+
packages.map(async ({ pkg }) => getPackageReleases(pkg.name, allPackages, posthog))
129+
);
130+
131+
return awaitedResult
132+
.filter(r => r !== undefined)
133+
.flatMap(r => r.releases)
134+
.toSorted(
135+
(a, b) =>
136+
new Date(b.published_at ?? b.created_at).getTime() -
137+
new Date(a.published_at ?? a.created_at).getTime()
138+
);
139+
}

0 commit comments

Comments
 (0)