my blog https://overreacted.io

fix local build

+74 -74
+2 -4
app/atom.xml/route.js
··· 1 - import { getPosts, metadata } from "../page"; 2 - import { generateFeed } from "../feed"; 1 + import { generateFeed } from "../posts"; 3 2 4 3 export const dynamic = "force-static"; 5 4 6 5 export async function GET() { 7 - const posts = await getPosts(); 8 - const feed = generateFeed(posts, metadata); 6 + const feed = await generateFeed(); 9 7 return new Response(feed.atom1()); 10 8 }
-35
app/feed.js
··· 1 - import { Feed } from "feed"; 2 - 3 - export function generateFeed(posts, metadata) { 4 - const site_url = "https://overreacted.io/"; 5 - 6 - const feedOptions = { 7 - author: { 8 - name: "Dan Abramov", 9 - email: "dan.abramov@gmail.com", 10 - link: site_url, 11 - }, 12 - description: metadata.description, 13 - favicon: `${site_url}/icon.png`, 14 - feedLinks: { atom: `${site_url}atom.xml`, rss: `${site_url}rss.xml` }, 15 - generator: "Feed for Node.js", 16 - id: site_url, 17 - image: "https://github.com/gaearon.png", 18 - link: site_url, 19 - title: metadata.title, 20 - }; 21 - 22 - const feed = new Feed(feedOptions); 23 - 24 - for (const post of posts) { 25 - feed.addItem({ 26 - date: new Date(post.date), 27 - description: post.spoiler, 28 - id: `${site_url}${post.slug}/`, 29 - link: `${site_url}${post.slug}/`, 30 - title: post.title, 31 - }); 32 - } 33 - 34 - return feed; 35 - }
+2 -31
app/page.js
··· 1 - import { readdir, readFile } from "fs/promises"; 2 - import matter from "gray-matter"; 3 1 import Link from "./Link"; 4 2 import Color from "colorjs.io"; 3 + import { metadata, getPosts } from "./posts"; 5 4 import { sans } from "./fonts"; 6 5 7 - export const metadata = { 8 - title: "overreacted — A blog by Dan Abramov", 9 - description: "A personal blog by Dan Abramov", 10 - alternates: { 11 - types: { 12 - "application/atom+xml": "https://overreacted.io/atom.xml", 13 - "application/rss+xml": "https://overreacted.io/rss.xml", 14 - }, 15 - }, 16 - }; 17 - 18 - export async function getPosts() { 19 - const entries = await readdir("./public/", { withFileTypes: true }); 20 - const dirs = entries 21 - .filter((entry) => entry.isDirectory()) 22 - .map((entry) => entry.name); 23 - const fileContents = await Promise.all( 24 - dirs.map((dir) => readFile("./public/" + dir + "/index.md", "utf8")), 25 - ); 26 - const posts = dirs.map((slug, i) => { 27 - const fileContent = fileContents[i]; 28 - const { data } = matter(fileContent); 29 - return { slug, ...data }; 30 - }); 31 - posts.sort((a, b) => { 32 - return Date.parse(a.date) < Date.parse(b.date) ? 1 : -1; 33 - }); 34 - return posts; 35 - } 6 + export { metadata }; 36 7 37 8 export default async function Home() { 38 9 const posts = await getPosts();
+68
app/posts.js
··· 1 + import { readdir, readFile } from "fs/promises"; 2 + import matter from "gray-matter"; 3 + import { Feed } from "feed"; 4 + 5 + export const metadata = { 6 + title: "overreacted — A blog by Dan Abramov", 7 + description: "A personal blog by Dan Abramov", 8 + alternates: { 9 + types: { 10 + "application/atom+xml": "https://overreacted.io/atom.xml", 11 + "application/rss+xml": "https://overreacted.io/rss.xml", 12 + }, 13 + }, 14 + }; 15 + 16 + export async function getPosts() { 17 + const entries = await readdir("./public/", { withFileTypes: true }); 18 + const dirs = entries 19 + .filter((entry) => entry.isDirectory()) 20 + .map((entry) => entry.name); 21 + const fileContents = await Promise.all( 22 + dirs.map((dir) => readFile("./public/" + dir + "/index.md", "utf8")), 23 + ); 24 + const posts = dirs.map((slug, i) => { 25 + const fileContent = fileContents[i]; 26 + const { data } = matter(fileContent); 27 + return { slug, ...data }; 28 + }); 29 + posts.sort((a, b) => { 30 + return Date.parse(a.date) < Date.parse(b.date) ? 1 : -1; 31 + }); 32 + return posts; 33 + } 34 + 35 + export async function generateFeed() { 36 + const posts = await getPosts(); 37 + const site_url = "https://overreacted.io/"; 38 + 39 + const feedOptions = { 40 + author: { 41 + name: "Dan Abramov", 42 + email: "dan.abramov@gmail.com", 43 + link: site_url, 44 + }, 45 + description: metadata.description, 46 + favicon: `${site_url}/icon.png`, 47 + feedLinks: { atom: `${site_url}atom.xml`, rss: `${site_url}rss.xml` }, 48 + generator: "Feed for Node.js", 49 + id: site_url, 50 + image: "https://github.com/gaearon.png", 51 + link: site_url, 52 + title: metadata.title, 53 + }; 54 + 55 + const feed = new Feed(feedOptions); 56 + 57 + for (const post of posts) { 58 + feed.addItem({ 59 + date: new Date(post.date), 60 + description: post.spoiler, 61 + id: `${site_url}${post.slug}/`, 62 + link: `${site_url}${post.slug}/`, 63 + title: post.title, 64 + }); 65 + } 66 + 67 + return feed; 68 + }
+2 -4
app/rss.xml/route.js
··· 1 - import { getPosts, metadata } from "../page"; 2 - import { generateFeed } from "../feed"; 1 + import { generateFeed } from "../posts"; 3 2 4 3 export const dynamic = "force-static"; 5 4 6 5 export async function GET() { 7 - const posts = await getPosts(); 8 - const feed = generateFeed(posts, metadata); 6 + const feed = await generateFeed(); 9 7 return new Response(feed.rss2()); 10 8 }