75 lines
1.6 KiB
JavaScript
75 lines
1.6 KiB
JavaScript
const getNormalizedPost = async (post) => {
|
|
const { frontmatter, Content, file } = post;
|
|
const ID = file.split('/').pop().split('.').shift();
|
|
|
|
return {
|
|
id: ID,
|
|
|
|
publishDate: frontmatter.publishDate,
|
|
draft: frontmatter.draft,
|
|
|
|
canonical: frontmatter.canonical,
|
|
slug: frontmatter.slug || ID,
|
|
|
|
title: frontmatter.title,
|
|
description: frontmatter.description,
|
|
image: frontmatter.image,
|
|
|
|
Content: Content,
|
|
// or 'body' in case you consume from API
|
|
|
|
excerpt: frontmatter.excerpt,
|
|
authors: frontmatter.authors,
|
|
category: frontmatter.category,
|
|
tags: frontmatter.tags,
|
|
readingTime: frontmatter.readingTime,
|
|
};
|
|
};
|
|
|
|
const load = async function () {
|
|
const posts = import.meta.glob(['~/../data/blog/**/*.md', '~/../data/blog/**/*.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.publishDate).valueOf() - new Date(a.publishDate).valueOf())
|
|
.filter((post) => !post.draft);
|
|
return results;
|
|
};
|
|
|
|
let _posts;
|
|
|
|
/** */
|
|
export const fetchPosts = async () => {
|
|
_posts = _posts || load();
|
|
|
|
return await _posts;
|
|
};
|
|
|
|
/** */
|
|
export const findPostsByIds = async (ids) => {
|
|
if (!Array.isArray(ids)) return [];
|
|
|
|
const posts = await fetchPosts();
|
|
|
|
return ids.reduce(function (r, id) {
|
|
posts.some(function (post) {
|
|
return id === post.id && r.push(post);
|
|
});
|
|
return r;
|
|
}, []);
|
|
};
|
|
|
|
/** */
|
|
export const findLatestPosts = async ({ count }) => {
|
|
const _count = count || 4;
|
|
const posts = await fetchPosts();
|
|
|
|
return posts ? posts.slice(_count * -1) : [];
|
|
};
|