import fs from 'fs'; import path from 'path'; import matter from 'gray-matter'; import { mapSlugToFileSlug } from './slugs'; const CONTENT_DIR = path.join(process.cwd(), 'content'); export interface PageFrontmatter { title: string; excerpt?: string; featuredImage?: string | null; focalX?: number; focalY?: number; layout?: 'default' | 'fullBleed'; public?: boolean; description?: string; } export interface PageData { slug: string; frontmatter: PageFrontmatter; content: string; } export async function getPageBySlug(slug: string, locale: string): Promise { const fileSlug = await mapSlugToFileSlug(slug, locale); const filePath = path.join(CONTENT_DIR, locale, `${fileSlug}.mdx`); if (!fs.existsSync(filePath)) { return null; } const source = fs.readFileSync(filePath, 'utf8'); const { content, data } = matter(source); return { slug, frontmatter: data as PageFrontmatter, content, }; } export async function getAllPages(locale: string): Promise { const localeDir = path.join(CONTENT_DIR, locale); if (!fs.existsSync(localeDir)) return []; const files = fs.readdirSync(localeDir).filter(f => f.endsWith('.mdx')); const pages = await Promise.all( files.map(async f => { const slug = f.replace('.mdx', ''); return await getPageBySlug(slug, locale); }) ); return pages.filter((p): p is PageData => p !== null); } export async function getAllPagesMetadata(locale: string): Promise { const localeDir = path.join(CONTENT_DIR, locale); if (!fs.existsSync(localeDir)) return []; const files = fs.readdirSync(localeDir).filter(f => f.endsWith('.mdx')); return files.map(f => { const slug = f.replace('.mdx', ''); const filePath = path.join(localeDir, f); const source = fs.readFileSync(filePath, 'utf8'); const { data } = matter(source); return { slug, frontmatter: data as PageFrontmatter, content: '', // Metadata only }; }); }