Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mastodon
GitHub Repository: mastodon/joinmastodon
Path: blob/main/utils/roadmap.ts
1006 views
1
import { readdir, readFile } from "node:fs/promises"
2
import { resolve } from "node:path"
3
4
import matter from "gray-matter"
5
import z from "zod"
6
7
export const featureSchema = z.object({
8
data: z.object({
9
title: z.string(),
10
status: z.enum(["exploring", "working", "next", "released"]),
11
}),
12
content: z.string().trim(),
13
})
14
15
export async function loadRoadmap(root = process.cwd()) {
16
const files = await readdir(resolve(root, "data/roadmap"))
17
return Promise.all(
18
files
19
.filter((file) => file.endsWith(".md"))
20
.map(async (file) => {
21
const contents = await readFile(
22
resolve(root, "data/roadmap", file),
23
"utf-8"
24
)
25
try {
26
return featureSchema.parse(matter(contents))
27
} catch (err: unknown) {
28
if (err instanceof z.ZodError) {
29
const issues = err.issues.reduce(
30
(acc, issue) =>
31
acc + `- [${issue.path.join(".")}]: ${issue.message}\n`,
32
""
33
)
34
throw new Error(`Invalid feature ${file}:\n${issues}`)
35
}
36
throw new Error(`Invalid feature ${file}: ${err}`)
37
}
38
})
39
)
40
}
41
42