import { type CollectionEntry, getCollection } from "astro:content"; /** filter out draft posts based on the environment and optionally archived posts and micro posts */ export async function getAllPosts( includeArchived = false, includeMicro = false, ): Promise[]> { return await getCollection("post", ({ data }) => { const isDraftFilter = import.meta.env.PROD ? !data.draft : true; const isArchivedFilter = includeArchived || !data.tags.includes("archived"); const isMicroFilter = includeMicro || !data.tags.includes("micro"); return isDraftFilter && isArchivedFilter && isMicroFilter; }); } /** Get tag metadata by tag name */ export async function getTagMeta(tag: string): Promise | undefined> { const tagEntries = await getCollection("tag", (entry) => { return entry.id === tag; }); return tagEntries[0]; } /** groups posts by year (based on option siteConfig.sortPostsByUpdatedDate), using the year as the key * Note: This function doesn't filter draft posts, pass it the result of getAllPosts above to do so. */ export function groupPostsByYear(posts: CollectionEntry<"post">[]) { return posts.reduce[]>>((acc, post) => { const year = post.data.publishDate.getFullYear(); if (!acc[year]) { acc[year] = []; } acc[year]?.push(post); return acc; }, {}); } /** returns all tags created from posts (inc duplicate tags) * Note: This function doesn't filter draft posts, pass it the result of getAllPosts above to do so. * */ export function getAllTags(posts: CollectionEntry<"post">[]) { return posts.flatMap((post) => [...post.data.tags]); } /** returns all unique tags created from posts * Note: This function doesn't filter draft posts, pass it the result of getAllPosts above to do so. * */ export function getUniqueTags(posts: CollectionEntry<"post">[]) { return [...new Set(getAllTags(posts))]; } /** returns a count of each unique tag - [[tagName, count], ...] * Note: This function doesn't filter draft posts, pass it the result of getAllPosts above to do so. * */ export function getUniqueTagsWithCount(posts: CollectionEntry<"post">[]): [string, number][] { return [ ...getAllTags(posts).reduce( (acc, t) => acc.set(t, (acc.get(t) ?? 0) + 1), new Map(), ), ].sort((a, b) => b[1] - a[1]); }