Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 [
{
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
39 changes: 39 additions & 0 deletions scripts/generate-static-mdx.ts
Original file line number Diff line number Diff line change
@@ -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);
});
8 changes: 4 additions & 4 deletions src/app/[[...slug]]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,10 @@ export default async function Page(props: PageProps<"/[[...slug]]">) {
</div>
<DocsBody data-provider-page={isProviderPage ? "true" : undefined}>
<MDX
components={getMDXComponents({
a: createRelativeLink(source, page),
isProviderPage,
})}
components={getMDXComponents(
{ a: createRelativeLink(source, page) },
{ isProviderPage }
)}
/>
</DocsBody>
</DocsPage>
Expand Down
23 changes: 0 additions & 23 deletions src/app/llms.mdx/docs/[[...slug]]/route.ts

This file was deleted.

10 changes: 8 additions & 2 deletions src/lib/source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,15 @@ export function getPageImage(page: InferPageType<typeof source>) {
}

export async function getLLMText(page: InferPageType<typeof source>) {
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}`;
}
9 changes: 3 additions & 6 deletions src/mdx-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down