From e99448a4cc45e6a572ca71fef0da7ed0e33fbf1b Mon Sep 17 00:00:00 2001 From: Sebastian Beltran Date: Sun, 21 Jun 2026 20:53:16 -0500 Subject: [PATCH] feat: add date field to blog collection schema --- .../AnnouncementBar/AnnouncementBar.astro | 16 ++------ .../RelatedContent/RelatedContent.astro | 7 +--- src/content.config.ts | 1 + src/content/blog/write-post.md | 5 ++- src/pages/[lang]/blog/[...page].astro | 20 ++-------- src/pages/[lang]/blog/[slug].astro | 17 +++------ src/pages/feed.xml.ts | 8 ++-- src/pages/vulnerabilities.xml.ts | 8 ++-- src/utils/rss.ts | 37 +++++++++++++++++-- 9 files changed, 60 insertions(+), 59 deletions(-) diff --git a/src/components/patterns/AnnouncementBar/AnnouncementBar.astro b/src/components/patterns/AnnouncementBar/AnnouncementBar.astro index b8cbfce1c1..70453dafd1 100644 --- a/src/components/patterns/AnnouncementBar/AnnouncementBar.astro +++ b/src/components/patterns/AnnouncementBar/AnnouncementBar.astro @@ -12,6 +12,7 @@ import { Banner } from '@components/patterns'; import { BodyMd } from '@components/primitives'; import { getCollection } from 'astro:content'; import { getLangFromUrl, useTranslations } from '@i18n/utils'; +import { getPubDate, sortByPubDateDesc } from '@/utils/rss'; import announcement from '@/config/announcement.json'; type BannerVariant = 'info' | 'warning'; @@ -22,26 +23,15 @@ const useCustom = !!announcement.title; function getLatestBlog() { return getCollection('blog').then((posts) => { - const sorted = posts - .filter((post) => post.id !== 'write-post') - .sort((a, b) => { - const aFile = a.id.split('/').pop() ?? ''; - const bFile = b.id.split('/').pop() ?? ''; - return bFile.localeCompare(aFile); - }); + const sorted = sortByPubDateDesc(posts.filter((post) => post.id !== 'write-post')); return sorted[0] ?? null; }); } const latestPost = !useCustom ? await getLatestBlog() : null; -function getPostDate(id: string) { - const filename = id.split('/').pop() ?? id; - return filename.substring(0, 10); -} - const blogSlug = latestPost ? latestPost.id.split('/').pop() : ''; -const blogDate = latestPost ? getPostDate(latestPost.id) : ''; +const blogDate = latestPost ? (getPubDate(latestPost)?.toISOString().substring(0, 10) ?? '') : ''; const blogTitle = latestPost?.data.title ?? ''; const blogDescription = latestPost?.data.description ?? ''; const blogVariant: BannerVariant = latestPost?.data.tags?.includes('security') ? 'warning' : 'info'; diff --git a/src/components/patterns/RelatedContent/RelatedContent.astro b/src/components/patterns/RelatedContent/RelatedContent.astro index f8c931d41c..77b2d775cc 100644 --- a/src/components/patterns/RelatedContent/RelatedContent.astro +++ b/src/components/patterns/RelatedContent/RelatedContent.astro @@ -3,6 +3,7 @@ import type { CollectionEntry } from 'astro:content'; import './RelatedContent.css'; import { H2 } from '@/components/primitives'; import { PostCard } from '@/components/patterns'; +import { formatPubDate } from '@/utils/rss'; interface Props { posts: CollectionEntry<'blog'>[]; @@ -20,11 +21,7 @@ const { posts, lang, title } = Astro.props;