diff --git a/src/utils/getAllPosts.js b/src/utils/getAllPosts.js new file mode 100644 index 0000000..7753c38 --- /dev/null +++ b/src/utils/getAllPosts.js @@ -0,0 +1,25 @@ +import { getNormalizedPost } from "~/utils/getNormalizedPost"; + +const load = async function () { + const posts = import.meta.glob("../data/posts/**/*.{md,mdx}", { + eager: true, + }); + + const normalizedPosts = Object.keys(posts).map(async (key) => { + const post = await posts[key]; + return await getNormalizedPost(post); + }); + + const results = (await Promise.all(normalizedPosts)).sort( + (a, b) => new Date(b.pubDate).valueOf() - new Date(a.pubDate).valueOf() + ); + return results; +}; + +let _posts; + +export const getAllPosts = async () => { + _posts = _posts || load(); + + return await _posts; +}; diff --git a/src/utils/getNormalizedPost.js b/src/utils/getNormalizedPost.js new file mode 100644 index 0000000..d649c70 --- /dev/null +++ b/src/utils/getNormalizedPost.js @@ -0,0 +1,17 @@ +import getReadingTime from "reading-time"; + +export const getNormalizedPost = async (post) => { + const { frontmatter, compiledContent, rawContent, file } = post; + + return { + pubDate: frontmatter.pubDate, + title: frontmatter.title, + description: frontmatter.description, + excerpt: frontmatter.excerpt, + body: compiledContent(), + image: frontmatter.image, + authors: frontmatter.authors, + slug: file.split("/").pop().split(".").shift(), + readingTime: Math.ceil(getReadingTime(rawContent()).minutes), + }; +};