summaryrefslogtreecommitdiff
path: root/src/lib/source.ts
diff options
context:
space:
mode:
authorBertrand Yuan <bert.yuan@outlook.com>2025-12-15 23:48:10 +0800
committerBertrand Yuan <bert.yuan@outlook.com>2025-12-15 23:48:10 +0800
commit5b7ccf0b671e2999b62befc729a3e517a0433728 (patch)
tree8bf476dc7c75914c221042546840dc76267366df /src/lib/source.ts
initial commit -- the front-end prototype
The initial code is base on Anirudh's work. More to see at: https://github.com/techwithanirudh/shadcn-blog Therefore, the code in this commit is under MIT license.
Diffstat (limited to 'src/lib/source.ts')
-rw-r--r--src/lib/source.ts40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/lib/source.ts b/src/lib/source.ts
new file mode 100644
index 0000000..34bc7ac
--- /dev/null
+++ b/src/lib/source.ts
@@ -0,0 +1,40 @@
+import { loader } from 'fumadocs-core/source';
+import type { InferMetaType, InferPageType } from 'fumadocs-core/source';
+import { createMDXSource } from 'fumadocs-mdx';
+import { blog } from '.source';
+
+export const source = loader({
+ baseUrl: '/posts',
+ source: createMDXSource(blog),
+});
+export const { getPage: getPost, getPages: getPosts, pageTree } = source;
+
+export type Post = ReturnType<typeof getPost>;
+
+const posts = getPosts();
+
+export const getSortedByDatePosts = () =>
+ posts.toSorted((a, b) => b.data.date.getTime() - a.data.date.getTime());
+
+export const getTags = () => {
+ const tagSet = new Set<string>();
+
+ for (const post of posts) {
+ if (post.data.tags) {
+ for (const tag of post.data.tags) {
+ tagSet.add(tag);
+ }
+ }
+ }
+
+ return Array.from(tagSet).toSorted();
+};
+
+export const getPostsByTag = (tag: string) => {
+ return posts
+ .filter((post) => post.data.tags?.includes(tag))
+ .toSorted((a, b) => b.data.date.getTime() - a.data.date.getTime());
+};
+
+export type Page = InferPageType<typeof source>;
+export type Meta = InferMetaType<typeof source>;