From 64fbabf20466b7955443f7f89c721b92346579f7 Mon Sep 17 00:00:00 2001 From: j285he Date: Tue, 17 Aug 2021 14:58:06 -0400 Subject: [PATCH] Add helper functions for fetching events (#115) helper functions for [year] and [year]/[term] only closes #110 Co-authored-by: Jared He <66887902+jaredjhe@users.noreply.github.com> Reviewed-on: https://git.csclub.uwaterloo.ca/www/www-new/pulls/115 Reviewed-by: Aditya Thakral Co-authored-by: j285he Co-committed-by: j285he --- lib/events.ts | 64 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 4 +-- 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 lib/events.ts diff --git a/lib/events.ts b/lib/events.ts new file mode 100644 index 00000000..886b6954 --- /dev/null +++ b/lib/events.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 EVENTS_PATH = path.join("content", "events"); +const TERMS = ["winter", "spring", "fall"]; + +export async function getEventYears(): Promise { + return (await fs.readdir(EVENTS_PATH, { withFileTypes: true })) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name) + .sort(); +} + +export async function getEventTermsByYear(year: string): Promise { + return ( + await fs.readdir(path.join(EVENTS_PATH, year), { withFileTypes: true }) + ) + .filter((dirent) => dirent.isDirectory() && TERMS.includes(dirent.name)) + .map((dirent) => dirent.name) + .sort((a, b) => TERMS.indexOf(a) - TERMS.indexOf(b)); +} + +interface Metadata { + name: string; + short: string; + date: string; + online: boolean; + location: string; +} + +export interface Event { + content: MDXRemoteSerializeResult>; + metadata: Metadata; +} + +export async function getEventBySlug( + year: string, + term: string, + slug: string +): Promise { + const raw = await fs.readFile( + path.join(EVENTS_PATH, year, term, `${slug}.md`), + "utf-8" + ); + const { content, data: metadata } = matter(raw); + + return { + content: await serialize(content), + metadata: metadata as Metadata, + }; +} + +export async function getEventsByTerm( + year: string, + term: string +): Promise { + return (await fs.readdir(path.join(EVENTS_PATH, year, term))) + .filter((name) => name.endsWith(".md")) + .map((name) => name.slice(0, -".md".length)); +} diff --git a/package-lock.json b/package-lock.json index 4e29d4b5..34eb7304 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "website", + "name": "www-new", "version": "0.1.0", "lockfileVersion": 2, "requires": true, @@ -39,7 +39,7 @@ "typescript": "4.3.5" }, "engines": { - "node": ">14", + "node": "^16", "npm": "^7" } },