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 });