Skip to content

Commit 892bfef

Browse files
feat: upgrade dependencies and improve blog metadata handling
- Refactored metadata generation to use Next.js 13 metadata API instead of fumadocs helper - Updated image generation route to use Next.js built-in ImageResponse - Upgraded major dependencies: - Next.js from 15.5.6 to 16.0.0 - fumadocs-core from 15.8.5 to 16.0.4 - fumadocs-mdx from 12.0.3 to 13.0.2 - fumadocs-ui from 15.8.5 to 16.0.4 - Updated imports to use new fumadocs provider path - Simplified page image URL generation logic
1 parent d297a8f commit 892bfef

File tree

8 files changed

+1137
-363
lines changed

8 files changed

+1137
-363
lines changed

app/blog/[slug]/page.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {blogSource} from "@/lib/source";
22
import Link from "next/link";
33
import {notFound} from "next/navigation";
4-
import {metadataImage} from "@/lib/metadata";
4+
import {getPageImage} from "@/lib/metadata";
55
import {calculateReadingTime} from "@/lib/timeToRead";
66
import defaultMdxComponents from "fumadocs-ui/mdx";
77
import CustomToc from "@/components/blog/CustomToc";
@@ -22,14 +22,26 @@ export async function generateMetadata(props: {
2222
const page = blogSource.getPage([params.slug]);
2323
if (!page) notFound();
2424

25+
const imageUrl = getPageImage(page).url;
2526

26-
return metadataImage.withImage(page.slugs, {
27+
return {
2728
title: page.data.title,
2829
description: page.data.description,
30+
openGraph: {
31+
title: page.data.title,
32+
description: page.data.description,
33+
images: [imageUrl],
34+
},
35+
twitter: {
36+
card: 'summary_large_image',
37+
title: page.data.title,
38+
description: page.data.description,
39+
images: [imageUrl],
40+
},
2941
icons: {
3042
icon: '/img/favicon.png',
3143
}
32-
});
44+
};
3345
}
3446

3547
export default async function page(props: {

app/docs-og/[...slug]/route.tsx

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,36 @@
1-
import {generateOGImage} from 'fumadocs-ui/og';
2-
import {metadataImage} from '@/lib/metadata';
1+
import { getPageImage, blogSource } from '@/lib/metadata';
2+
import { notFound } from 'next/navigation';
3+
import { ImageResponse } from 'next/og';
4+
import { generate as DefaultImage } from 'fumadocs-ui/og';
35

4-
export const GET = metadataImage.createAPI((page) => {
5-
return generateOGImage({
6-
title: page.data.title,
7-
primaryColor: '#3366ff',
8-
description: page.data.description,
9-
});
10-
});
6+
export const revalidate = false;
7+
8+
export async function GET(
9+
_req: Request,
10+
{ params }: { params: Promise<{ slug: string[] }> }
11+
) {
12+
const { slug } = await params;
13+
const page = blogSource.getPage(slug.slice(0, -1));
14+
15+
if (!page) notFound();
16+
17+
return new ImageResponse(
18+
(
19+
<DefaultImage
20+
title={page.data.title}
21+
description={page.data.description}
22+
primaryColor="#3366ff"
23+
/>
24+
),
25+
{
26+
width: 1200,
27+
height: 630,
28+
}
29+
);
30+
}
1131

1232
export function generateStaticParams() {
13-
return metadataImage.generateParams();
33+
return blogSource.getPages().map((page) => ({
34+
slug: getPageImage(page).segments,
35+
}));
1436
}

app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type {ReactNode} from 'react';
44
import ClientAnalytics from "@/components/Analytics";
55
import NcSearchDialog from "@/components/layout/Search";
66
import {CustomThemeProvider} from "@/app/ThemeProvider";
7-
import {RootProvider} from "fumadocs-ui/provider";
7+
import {RootProvider} from "fumadocs-ui/provider/next";
88
import { Toaster } from "sonner";
99

1010
const inter = Inter({

lib/metadata.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
import { createMetadataImage } from 'fumadocs-core/server';
1+
import { type InferPageType } from 'fumadocs-core/source';
22
import { blogSource } from './source';
33

4-
export const metadataImage = createMetadataImage({
5-
imageRoute: '/docs-og',
6-
source: blogSource,
7-
});
4+
export { blogSource };
5+
6+
export function getPageImage(page: InferPageType<typeof blogSource>) {
7+
const segments = [...page.slugs, 'image.png'];
8+
return {
9+
segments,
10+
url: `/docs-og/${segments.join('/')}`,
11+
};
12+
}

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"@ai-sdk/anthropic": "^2.0.35",
2020
"@ai-sdk/google": "^2.0.23",
2121
"@ai-sdk/openai": "^2.0.53",
22-
"@ai-sdk/react": "^2.0.76",
22+
"@ai-sdk/react": "^2.0.81",
2323
"@icons-pack/react-simple-icons": "^13.8.0",
2424
"@openrouter/ai-sdk-provider": "^1.2.0",
2525
"@radix-ui/react-collapsible": "^1.1.8",
@@ -33,15 +33,15 @@
3333
"ai": "^5.0.76",
3434
"class-variance-authority": "^0.7.1",
3535
"clsx": "^2.1.1",
36-
"fumadocs-core": "15.8.5",
37-
"fumadocs-mdx": "12.0.3",
38-
"fumadocs-ui": "15.8.5",
36+
"fumadocs-core": "16.0.4",
37+
"fumadocs-mdx": "13.0.2",
38+
"fumadocs-ui": "16.0.4",
3939
"hast": "^1.0.0",
4040
"hast-util-to-jsx-runtime": "^2.3.6",
4141
"jsdom": "^27.0.1",
4242
"lucide-react": "^0.548.0",
4343
"nc-analytics": "^0.0.9",
44-
"next": "15.5.6",
44+
"next": "16.0.0",
4545
"next-recaptcha-v3": "^1.5.2",
4646
"next-sitemap": "^4.2.3",
4747
"next-themes": "^0.4.6",
@@ -73,7 +73,7 @@
7373
"@types/react-dom": "^19.2.2",
7474
"dotenv": "^17.0.0",
7575
"eslint": "^8",
76-
"eslint-config-next": "15.5.6",
76+
"eslint-config-next": "16.0.0",
7777
"postcss": "^8.5.6",
7878
"tailwindcss": "^4.1.15",
7979
"tsx": "^4.20.6",

0 commit comments

Comments
 (0)