--- import type { CollectionEntry } from 'astro:content'; import { getCollection } from 'astro:content'; import FormattedDate from './FormattedDate.astro'; export interface Props { headingLevel?: 1 | 2 | 3 | 4 | 5 | 6, hideAuthor?: boolean, hideSubheadings?: boolean, maxEntries?: number, }; const { headingLevel = 2, hideSubheadings = false, hideAuthor = false, maxEntries } = Astro.props; const allPosts = (await getCollection('blog')).filter((post) => !post.data.hidden); const posts = maxEntries === undefined ? allPosts : allPosts.sort(sortByPubDateDescending).slice(0, maxEntries); const distinctYears: number[] = posts .map(post => pubDate(post).getFullYear()) .reduce((acc, curr) => acc.includes(curr) ? acc : [...acc, curr], []) .sort((a, b) => b - a); function matchesYear(year: number) { return (post: CollectionEntry<'blog'>) => pubDate(post).getFullYear() === year; } function sortByPubDateDescending(post1: CollectionEntry<'blog'>, post2: CollectionEntry<'blog'>) { const date1 = pubDate(post1).getTime(); const date2 = pubDate(post2).getTime(); return date2 - date1; } function pubDate(post: CollectionEntry<'blog'>): Date { if (post.data.pubDate) { return post.data.pubDate; } const date = new Date(post.id); if (isNaN(date.valueOf())) { throw new Error(`Post ${post.id} does not have a valid publication date.`); } return date; } const HeadingElem = `h${headingLevel} class="p-name"`; const SubHeadingElem = `h${headingLevel + 1}`; const AuthorElem = `p${hideAuthor ? " hidden" : ""}`; const canonicalBlogUrl = new URL('blog', Astro.site) ---
My blog { hideSubheadings ? : distinctYears.map(year => ( {year} )) } { (maxEntries !== undefined && maxEntries < allPosts.length) ? : <> }