/ scripts / writeData.mjs
writeData.mjs
 1  import fs from "fs/promises";
 2  import path from "path";
 3  import matter from "gray-matter";
 4  
 5  async function getFrontMatterData(entryPath) {
 6  	const file = await fs.readFile(entryPath, "utf-8");
 7  	const frontMatterData = matter(file).data;
 8  	return { path: entryPath, data: frontMatterData };
 9  }
10  
11  async function getAllMdxFiles(dirPath) {
12  	const files = await fs.readdir(dirPath);
13  	const mdxFiles = files.filter((file) => path.extname(file) === ".mdx");
14  	const mdxFilePaths = mdxFiles.map((file) => path.join(dirPath, file));
15  	const frontMatterDataArray = [];
16  
17  	for (const filePath of mdxFilePaths) {
18  		const frontMatterData = await getFrontMatterData(filePath);
19  		frontMatterDataArray.push(frontMatterData);
20  	}
21  
22  	return frontMatterDataArray;
23  }
24  
25  const directoryPath = "./src/routes";
26  
27  getAllMdxFiles(directoryPath)
28  	.then((frontMatterDataArray) => {
29  		const output = frontMatterDataArray.map((data) => {
30  			const frontMatter = data.data;
31  
32  			// Populate missing fields with default values
33  			return {
34  				date: frontMatter.date ? new Date(frontMatter.date).toISOString() : "",
35  				description: frontMatter.description || "",
36  				categories: frontMatter.categories || [],
37  				tags: frontMatter.tags || [],
38  				toc: frontMatter.toc || false,
39  				title: frontMatter.title || "",
40  				path: data.path.split("/").pop()?.replace(".mdx", "") || "",
41  				draft: frontMatter.draft || false,
42  				hideLevel: frontMatter.hideLevel ?? 10, // Use nullish coalescing to check for undefined or null
43  				author: frontMatter.author || "",
44  				math: frontMatter.math || false,
45  				featured_image: frontMatter.featured_image || "",
46  			};
47  		});
48  
49  		// Sort by date in descending order (latest to oldest)
50  		output.sort(
51  			(a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(),
52  		);
53  
54  		const tsOutput = `export default ${JSON.stringify(output, null, 2)} as const;`;
55  
56  		return fs.writeFile("./src/routes/data.ts", tsOutput);
57  	})
58  	.then(() => {
59  		console.log("Data successfully written to data.ts");
60  	})
61  	.catch((error) => {
62  		console.error("Error:", error);
63  	});