From fa697d25d3e957b37862acc28e342d3e7b458aea Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Sat, 17 Jan 2026 19:46:30 +0100 Subject: [PATCH] fix: resolve TypeScript error and static export compatibility - Fix TypeScript error in MDX components by separating components and options - Remove llms.mdx API route (incompatible with static export) - Add postbuild script to generate static .mdx files for LLM consumption - Update getLLMText to fallback to raw text if processed unavailable --- next.config.ts | 2 ++ package.json | 2 ++ scripts/generate-static-mdx.ts | 39 ++++++++++++++++++++++ src/app/[[...slug]]/page.tsx | 8 ++--- src/app/llms.mdx/docs/[[...slug]]/route.ts | 23 ------------- src/lib/source.ts | 10 ++++-- src/mdx-components.tsx | 9 ++--- 7 files changed, 58 insertions(+), 35 deletions(-) create mode 100644 scripts/generate-static-mdx.ts delete mode 100644 src/app/llms.mdx/docs/[[...slug]]/route.ts diff --git a/next.config.ts b/next.config.ts index 021418a..dc4e192 100644 --- a/next.config.ts +++ b/next.config.ts @@ -10,6 +10,8 @@ const nextConfig: NextConfig = { images: { unoptimized: true, }, + // Note: rewrites don't work with static export + // Static .mdx files are generated via postbuild script instead async rewrites() { return [ { diff --git a/package.json b/package.json index a140c75..c013ab2 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,12 @@ "private": true, "scripts": { "generate-provider-docs": "bash scripts/generate-provider-docs.sh", + "generate-static-mdx": "bun scripts/generate-static-mdx.ts", "build": "next build", "dev": "next dev", "prebuild": "CELESTE_SOURCE=local bun run generate-provider-docs", "predev": "CELESTE_SOURCE=local bun run generate-provider-docs", + "postbuild": "bun run generate-static-mdx", "start": "next start", "postinstall": "fumadocs-mdx", "lint": "biome check", diff --git a/scripts/generate-static-mdx.ts b/scripts/generate-static-mdx.ts new file mode 100644 index 0000000..b5caef9 --- /dev/null +++ b/scripts/generate-static-mdx.ts @@ -0,0 +1,39 @@ +#!/usr/bin/env bun +/** + * Generate static .mdx files for LLM consumption after Next.js build. + * + * This script generates markdown files in out/docs/ that correspond to + * the API route /llms.mdx/docs/[[...slug]] for static export compatibility. + */ + +import { writeFile, mkdir } from "fs/promises"; +import { join, dirname } from "path"; +import { source, getPagesInNavOrder, getLLMText } from "../src/lib/source"; + +async function generateStaticMdxFiles() { + const outDir = join(process.cwd(), "out", "docs"); + const pages = getPagesInNavOrder(); + + console.log(`Generating ${pages.length} static MDX files...`); + + for (const page of pages) { + const markdown = await getLLMText(page); + // Convert page URL to file path (e.g., "providers/openai" -> "providers/openai.mdx") + const filePath = join(outDir, `${page.url}.mdx`); + const fileDir = dirname(filePath); + + // Ensure directory exists + await mkdir(fileDir, { recursive: true }); + + // Write markdown file + await writeFile(filePath, markdown, "utf-8"); + console.log(` āœ“ ${page.url}.mdx`); + } + + console.log(`\nāœ“ Generated ${pages.length} static MDX files in ${outDir}`); +} + +generateStaticMdxFiles().catch((error) => { + console.error("Error generating static MDX files:", error); + process.exit(1); +}); diff --git a/src/app/[[...slug]]/page.tsx b/src/app/[[...slug]]/page.tsx index 7e50bd5..81d846e 100644 --- a/src/app/[[...slug]]/page.tsx +++ b/src/app/[[...slug]]/page.tsx @@ -78,10 +78,10 @@ export default async function Page(props: PageProps<"/[[...slug]]">) { diff --git a/src/app/llms.mdx/docs/[[...slug]]/route.ts b/src/app/llms.mdx/docs/[[...slug]]/route.ts deleted file mode 100644 index 5983c21..0000000 --- a/src/app/llms.mdx/docs/[[...slug]]/route.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { getLLMText, source } from "@/lib/source"; -import { notFound } from "next/navigation"; - -export const revalidate = false; - -export async function GET( - _req: Request, - { params }: RouteContext<"/llms.mdx/docs/[[...slug]]">, -) { - const { slug } = await params; - const page = source.getPage(slug); - if (!page) notFound(); - - return new Response(await getLLMText(page), { - headers: { - "Content-Type": "text/markdown; charset=utf-8", - }, - }); -} - -export function generateStaticParams() { - return source.generateParams(); -} diff --git a/src/lib/source.ts b/src/lib/source.ts index 184001b..53c714a 100644 --- a/src/lib/source.ts +++ b/src/lib/source.ts @@ -69,9 +69,15 @@ export function getPageImage(page: InferPageType) { } export async function getLLMText(page: InferPageType) { - const processed = await page.data.getText("processed"); + // Try processed first, fall back to raw if not available + let text: string; + try { + text = await page.data.getText("processed"); + } catch { + text = await page.data.getText("raw"); + } return `# ${page.data.title} (${page.url}) -${processed}`; +${text}`; } diff --git a/src/mdx-components.tsx b/src/mdx-components.tsx index 404959e..55f8361 100644 --- a/src/mdx-components.tsx +++ b/src/mdx-components.tsx @@ -3,14 +3,11 @@ import type { MDXComponents } from "mdx/types"; import { InstallSelector } from "@/components/InstallSelector"; import { Mermaid } from "@/components/Mermaid"; -type MDXComponentsOptions = MDXComponents & { - isProviderPage?: boolean; -}; - export function getMDXComponents( - options?: MDXComponentsOptions, + components?: MDXComponents, + options?: { isProviderPage?: boolean }, ): MDXComponents { - const { isProviderPage, ...components } = options || {}; + const { isProviderPage } = options || {}; return { ...defaultMdxComponents, InstallSelector,