Skip to content

Commit 51cd091

Browse files
feat: add per-package RSS feed
1 parent c6fe0a4 commit 51cd091

File tree

6 files changed

+125
-0
lines changed

6 files changed

+125
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"eslint": "^9.25.1",
4141
"eslint-config-prettier": "^10.1.2",
4242
"eslint-plugin-svelte": "^3.5.1",
43+
"feed": "^4.2.2",
4344
"globals": "^16.0.0",
4445
"mode-watcher": "^1.0.2",
4546
"octokit": "^4.1.3",

pnpm-lock.yaml

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { type RequestHandler, text } from "@sveltejs/kit";
2+
import { rssHandler } from "../rss";
3+
4+
export const GET: RequestHandler = rssHandler(feed =>
5+
text(feed.atom1(), {
6+
headers: {
7+
"Cache-Control": "max-age=0, s-max-age=600",
8+
"Content-Type": "application/xml"
9+
}
10+
})
11+
);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { type RequestHandler, text } from "@sveltejs/kit";
2+
import { rssHandler } from "../rss";
3+
4+
export const GET: RequestHandler = rssHandler(feed =>
5+
text(feed.json1(), {
6+
headers: {
7+
"Cache-Control": "max-age=0, s-max-age=600",
8+
"Content-Type": "application/json"
9+
}
10+
})
11+
);
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { error, type RequestHandler } from "@sveltejs/kit";
2+
import { Feed } from "feed";
3+
import { discoverer } from "$lib/server/package-discoverer";
4+
import { getPackageReleases } from "../releases";
5+
6+
function getBaseFeed(url: URL, title: string) {
7+
const feed = new Feed({
8+
copyright: "",
9+
description: `The releases feed for ${title}, brought by Svelte Changelog.`,
10+
favicon: "https://raw.githubusercontent.com/sveltejs/branding/master/svelte-logo.svg",
11+
feedLinks: {
12+
xml: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "rss.xml"),
13+
json: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "rss.json"),
14+
atom: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "atom.xml")
15+
},
16+
id: url.toString(),
17+
language: "en",
18+
link: url.toString(),
19+
title
20+
});
21+
feed.addCategory("Technology");
22+
feed.addContributor({
23+
name: "Antoine Lethimonnier",
24+
link: "https://github.com/WarningImHack3r"
25+
});
26+
return feed;
27+
}
28+
29+
export function rssHandler(response: (feed: Feed) => Response): RequestHandler {
30+
return async ({ params, url, locals }) => {
31+
const { package: slugPackage } = params;
32+
if (!slugPackage) error(400);
33+
34+
// 1. Get all the discovered packages
35+
const categorizedPackages = await discoverer.getOrDiscoverCategorized();
36+
37+
// 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);
44+
45+
const feed = getBaseFeed(url, `${packageReleases.releasesRepo.pkg.name} releases`);
46+
for (const release of packageReleases.releases) {
47+
feed.addItem({
48+
author: [
49+
{
50+
name: release.author.name ?? undefined,
51+
link: release.author.url,
52+
email: release.author.email ?? undefined
53+
}
54+
],
55+
content: release.body ?? undefined,
56+
date: new Date(release.published_at ?? release.created_at),
57+
description: `${release.cleanName} ${release.cleanVersion} release`,
58+
id: release.id.toString(),
59+
link: release.html_url,
60+
published: release.published_at ? new Date(release.published_at) : undefined,
61+
title: `${release.cleanName}@${release.cleanVersion}`
62+
});
63+
}
64+
65+
return response(feed);
66+
};
67+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { type RequestHandler, text } from "@sveltejs/kit";
2+
import { rssHandler } from "../rss";
3+
4+
export const GET: RequestHandler = rssHandler(feed =>
5+
text(feed.rss2(), {
6+
headers: {
7+
"Cache-Control": "max-age=0, s-max-age=600",
8+
"Content-Type": "application/xml"
9+
}
10+
})
11+
);

0 commit comments

Comments
 (0)