parent
d1e0736b2e
commit
a2a8900b74
@ -0,0 +1,64 @@ |
||||
import fs from "fs/promises"; |
||||
import path from "path"; |
||||
|
||||
import matter from "gray-matter"; |
||||
import { MDXRemoteSerializeResult } from "next-mdx-remote"; |
||||
import { serialize } from "next-mdx-remote/serialize"; |
||||
|
||||
const NEWS_PATH = path.join("content", "news"); |
||||
|
||||
interface Metadata { |
||||
author: string; |
||||
date: string; |
||||
} |
||||
|
||||
export interface News { |
||||
content: MDXRemoteSerializeResult<Record<string, unknown>>; |
||||
metadata: Metadata; |
||||
} |
||||
|
||||
export async function getNewsYears(): Promise<string[]> { |
||||
return (await fs.readdir(NEWS_PATH, { withFileTypes: true })) |
||||
.filter((dirent) => dirent.isDirectory()) |
||||
.map((dirent) => dirent.name); |
||||
} |
||||
|
||||
export async function getNewsTermsByYear(year: string): Promise<string[]> { |
||||
return ( |
||||
await fs.readdir(path.join(NEWS_PATH, year), { |
||||
withFileTypes: true, |
||||
}) |
||||
) |
||||
.filter((dirent) => dirent.isDirectory()) |
||||
.map((dirent) => dirent.name); |
||||
} |
||||
|
||||
export async function getNewsByTerm( |
||||
year: string, |
||||
term: string |
||||
): Promise<string[]> { |
||||
return ( |
||||
await fs.readdir(path.join(NEWS_PATH, year, term), { |
||||
withFileTypes: true, |
||||
}) |
||||
) |
||||
.filter((dirent) => dirent.isFile() && dirent.name.endsWith(".md")) |
||||
.map((dirent) => dirent.name.slice(0, -".md".length)); |
||||
} |
||||
|
||||
export async function getNewsBySlug( |
||||
year: string, |
||||
term: string, |
||||
slug: string |
||||
): Promise<News> { |
||||
const raw = await fs.readFile( |
||||
path.join(NEWS_PATH, year, term, `${slug}.md`), |
||||
"utf-8" |
||||
); |
||||
const { content, data: metadata } = matter(raw); |
||||
|
||||
return { |
||||
content: await serialize(content), |
||||
metadata: metadata as Metadata, |
||||
}; |
||||
} |
Loading…
Reference in new issue