From a2a8900b744452994b6bb5efee35edaf60910df3 Mon Sep 17 00:00:00 2001 From: Aditya Thakral Date: Mon, 9 Aug 2021 21:44:26 -0400 Subject: [PATCH] Add helper functions for news --- lib/news.ts | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ types.d.ts | 3 +++ 2 files changed, 67 insertions(+) create mode 100644 lib/news.ts diff --git a/lib/news.ts b/lib/news.ts new file mode 100644 index 00000000..692e717c --- /dev/null +++ b/lib/news.ts @@ -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>; + metadata: Metadata; +} + +export async function getNewsYears(): Promise { + return (await fs.readdir(NEWS_PATH, { withFileTypes: true })) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); +} + +export async function getNewsTermsByYear(year: string): Promise { + 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 { + 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 { + 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, + }; +} diff --git a/types.d.ts b/types.d.ts index e79f50d9..c6daf5e7 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1,3 +1,6 @@ +/* eslint-disable import/order */ +/* eslint-disable import/no-duplicates */ + declare module "*.event.mdx" { import { ComponentType } from "react";