--- import { getCollection, type CollectionEntry } from "astro:content"; import Timestamp from "./Timestamp.astro"; import { sortBy } from "lodash-es"; interface Props { basePath: string; drafts?: "exclude" | "include" | "only"; filteredPosts?: Post[]; } type Post = CollectionEntry<"posts">; const { basePath, drafts: includeDrafts, filteredPosts } = Astro.props; type FilterFn = (_: Post) => boolean; function unreachable(): never { throw new Error("unreachable"); } function getFilter(): FilterFn { switch (includeDrafts) { case "exclude": case undefined: return (post: Post) => !post.data.draft; case "include": return (_: Post) => true; case "only": return (post: Post) => post.data.draft === true; } return unreachable(); } const filter = getFilter(); let allPosts; if (filteredPosts) allPosts = filteredPosts.filter(filter); else allPosts = await getCollection("posts", filter); const sortedPosts = sortBy(allPosts, (post) => -post.data.date); --- { sortedPosts.map((post) => { return ( ); }) }
{post.data.title}