diff --git a/apps/www/src/content.config.ts b/apps/www/src/content.config.ts index 575fcc8..98e79d4 100644 --- a/apps/www/src/content.config.ts +++ b/apps/www/src/content.config.ts @@ -1,6 +1,7 @@ import { defineCollection } from 'astro:content'; -import { glob } from 'astro/loaders'; +import { glob, file } from 'astro/loaders'; import { z } from 'astro/zod'; +import yaml from 'js-yaml'; const posts = defineCollection({ loader: glob({ pattern: '**/*.md', base: './src/content/posts' }), @@ -13,4 +14,18 @@ const posts = defineCollection({ }) }); -export const collections = { posts }; +const bookmarks = defineCollection({ + loader: file('./src/content/bookmarks.yaml', { + parser: (text) => { + const data = yaml.load(text) as Array>; + return data.map((item, i) => ({ id: String(i), ...item })); + }, + }), + schema: z.object({ + title: z.string(), + url: z.string().url(), + date: z.coerce.date(), + }) +}); + +export const collections = { posts, bookmarks }; diff --git a/apps/www/src/pages/bookmarks/index.astro b/apps/www/src/pages/bookmarks/index.astro index 197ea3c..e4e5415 100644 --- a/apps/www/src/pages/bookmarks/index.astro +++ b/apps/www/src/pages/bookmarks/index.astro @@ -1,16 +1,10 @@ --- +import { getCollection } from 'astro:content'; import Layout from '../../layouts/Layout.astro'; -import yaml from 'js-yaml'; -import bookmarksRaw from '../../content/bookmarks.yaml?raw'; -interface Bookmark { - date: string; - title: string; - url: string; -} - -const bookmarks = (yaml.load(bookmarksRaw) as Bookmark[]) - .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); +const bookmarksCollection = await getCollection('bookmarks'); +const bookmarks = bookmarksCollection + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()); function formatDate(date: Date): string { const d = String(date.getDate()).padStart(2, '0'); @@ -19,11 +13,6 @@ function formatDate(date: Date): string { return `${d}/${m}/${y}`; } -function formatBookmarkDate(dateStr: string): string { - const date = new Date(dateStr); - return formatDate(date); -} - function extractDomain(url: string): string { try { const parsed = new URL(url); @@ -37,6 +26,6 @@ function extractDomain(url: string): string {
bookmarks -
 `${formatBookmarkDate(b.date)}    ${b.title} (${extractDomain(b.url)})`).join('\n')} />
+
 `${formatDate(b.data.date)}    ${b.data.title} (${extractDomain(b.data.url)})`).join('\n')} />
 
diff --git a/apps/www/src/pages/draft/[slug].astro b/apps/www/src/pages/draft/[slug].astro index 21028c6..f1bdf2c 100644 --- a/apps/www/src/pages/draft/[slug].astro +++ b/apps/www/src/pages/draft/[slug].astro @@ -41,7 +41,6 @@ function formatDate(date: Date): string {
-

[DRAFT] back to drafts

{post.data.title}

{formatDate(post.data.date)}

diff --git a/apps/www/src/pages/feed.xml.ts b/apps/www/src/pages/feed.xml.ts index 6b13096..1f8b258 100644 --- a/apps/www/src/pages/feed.xml.ts +++ b/apps/www/src/pages/feed.xml.ts @@ -1,18 +1,10 @@ import rss from '@astrojs/rss'; import { getCollection } from 'astro:content'; -import yaml from 'js-yaml'; -import bookmarksRaw from '../content/bookmarks.yaml?raw'; import fs from 'node:fs'; import path from 'node:path'; import type { APIContext } from 'astro'; import { getGitDate } from '../utils'; -interface Bookmark { - date: string; - title: string; - url: string; -} - interface TxtFile { name: string; date: Date; @@ -20,7 +12,7 @@ interface TxtFile { export async function GET(context: APIContext) { const posts = await getCollection('posts', ({ data }) => data.draft !== true); - const bookmarks = yaml.load(bookmarksRaw) as Bookmark[]; + const bookmarks = await getCollection('bookmarks'); const txtDir = path.join(process.cwd(), 'public/txt'); const txtFiles: TxtFile[] = fs.existsSync(txtDir) @@ -46,10 +38,10 @@ export async function GET(context: APIContext) { description: txt.name, })), ...bookmarks.map(b => ({ - title: b.title, - pubDate: new Date(b.date), - link: b.url, - description: b.title, + title: b.data.title, + pubDate: b.data.date, + link: b.data.url, + description: b.data.title, })), ].sort((a, b) => b.pubDate.getTime() - a.pubDate.getTime()); diff --git a/apps/www/src/pages/index.astro b/apps/www/src/pages/index.astro index 068aeb6..cd27787 100644 --- a/apps/www/src/pages/index.astro +++ b/apps/www/src/pages/index.astro @@ -2,18 +2,11 @@ import { getCollection } from 'astro:content'; import Layout from '../layouts/Layout.astro'; import yaml from 'js-yaml'; -import bookmarksRaw from '../content/bookmarks.yaml?raw'; import fs from 'node:fs'; import path from 'node:path'; import { getApprovedEntries, type GuestbookEntry } from '../lib/db'; import { getGitDate } from '../utils'; -interface Bookmark { - date: string; - title: string; - url: string; -} - interface TxtFile { name: string; date: Date; @@ -50,8 +43,9 @@ for (const category of sortedCategories) { }); } -const bookmarks = (yaml.load(bookmarksRaw) as Bookmark[]) - .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); +const bookmarksCollection = await getCollection('bookmarks'); +const bookmarks = bookmarksCollection + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()); // Auto-discover txt files from public/txt/ const txtDir = path.join(process.cwd(), 'public/txt'); @@ -89,11 +83,6 @@ function formatDate(date: Date): string { return `${d}/${m}/${y}`; } -function formatBookmarkDate(dateStr: string): string { - const date = new Date(dateStr); - return formatDate(date); -} - function extractDomain(url: string): string { try { const parsed = new URL(url); @@ -129,7 +118,7 @@ function extractDomain(url: string): string {
bookmarks
 `${formatBookmarkDate(b.date)}    ${b.title} (${extractDomain(b.url)})`),
+  ...bookmarks.slice(0, 10).map(b => `${formatDate(b.data.date)}    ${b.data.title} (${extractDomain(b.data.url)})`),
   ...(bookmarks.length > 10 ? [`+${bookmarks.length - 10} more`] : [])
 ].join('\n')} />
 
diff --git a/apps/www/src/pages/random.ts b/apps/www/src/pages/random.ts index 40a11ac..dea64e9 100644 --- a/apps/www/src/pages/random.ts +++ b/apps/www/src/pages/random.ts @@ -1,22 +1,14 @@ import { getCollection } from 'astro:content'; -import yaml from 'js-yaml'; -import bookmarksRaw from '../content/bookmarks.yaml?raw'; import fs from 'node:fs'; import path from 'node:path'; import type { APIContext } from 'astro'; export const prerender = false; -interface Bookmark { - date: string; - title: string; - url: string; -} - export async function GET(context: APIContext) { const site = context.site?.origin ?? 'https://wynne.rs'; const posts = await getCollection('posts', ({ data }) => data.draft !== true); - const bookmarks = yaml.load(bookmarksRaw) as Bookmark[]; + const bookmarks = await getCollection('bookmarks'); const txtDir = path.join(process.cwd(), 'public/txt'); const txtFiles = fs.existsSync(txtDir) @@ -26,7 +18,7 @@ export async function GET(context: APIContext) { const urls = [ ...posts.map(post => `/md/${post.id}`), ...txtFiles.map(txt => `/txt/${txt}`), - ...bookmarks.map(b => b.url), + ...bookmarks.map(b => b.data.url), ]; const random = urls[Math.floor(Math.random() * urls.length)];