-
Notifications
You must be signed in to change notification settings - Fork 1
/
posts.data.ts
35 lines (31 loc) · 930 Bytes
/
posts.data.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { defineLoader } from 'vitepress'
import fs from 'fs-extra'
import matter from 'gray-matter'
import dayjs from 'dayjs'
export interface PostMeta {
title: string
path: string
date: string
tags: string[]
}
declare const data: PostMeta[]
export { data }
export default defineLoader({
watch: ['./posts/**/*.md'],
async load(watchedFiles: string[]): Promise<PostMeta[]> {
let posts: PostMeta[] = await Promise.all(
watchedFiles.map(async (item) => {
const content = await fs.readFile(item, "utf-8")
const { data } = matter(content)
return {
title: data.title ?? '',
path: item.split('/').slice(-2).join('/').replace('.md', ''),
date: dayjs(data.date).subtract(8, 'hour').format('YYYY/MM/DD'),
tags: data.tags ?? [],
}
})
)
posts.sort((a, b) => dayjs(a.date).isBefore(dayjs(b.date)) ? 1 : -1)
return posts
}
})