diff --git a/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.test.ts b/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.test.ts
index 7c0b22de50c71..82e686afd6707 100644
--- a/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.test.ts
+++ b/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.test.ts
@@ -126,5 +126,32 @@ describe('resolveRouteData', () => {
"
`)
})
+ it('should resolve sitemap.xml with images', () => {
+ expect(
+ resolveSitemap([
+ {
+ url: 'https://example.com',
+ lastModified: '2021-01-01',
+ changeFrequency: 'weekly',
+ priority: 0.5,
+ images: ['https://example.com/image.jpg'],
+ },
+ ])
+ ).toMatchInlineSnapshot(`
+ "
+
+
+ https://example.com
+
+ https://example.com/image.jpg
+
+ 2021-01-01
+ weekly
+ 0.5
+
+
+ "
+ `)
+ })
})
})
diff --git a/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.ts b/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.ts
index 368fdbaebbdb7..44668e3e2802d 100644
--- a/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.ts
+++ b/packages/next/src/build/webpack/loaders/metadata/resolve-route-data.ts
@@ -47,10 +47,16 @@ export function resolveSitemap(data: MetadataRoute.Sitemap): string {
const hasAlternates = data.some(
(item) => Object.keys(item.alternates ?? {}).length > 0
)
+ const hasImages = data.some(
+ (item) => Object.keys(item.images ?? {}).length > 0
+ )
let content = ''
content += '\n'
content += '\n'
} else {
@@ -70,6 +76,11 @@ export function resolveSitemap(data: MetadataRoute.Sitemap): string {
}" />\n`
}
}
+ if (item.images?.length) {
+ for (const image of item.images) {
+ content += `\n${image}\n\n`
+ }
+ }
if (item.lastModified) {
const serializedDate =
item.lastModified instanceof Date
diff --git a/packages/next/src/lib/metadata/types/metadata-interface.ts b/packages/next/src/lib/metadata/types/metadata-interface.ts
index ebc7e340daf5c..3fd67070a98ac 100644
--- a/packages/next/src/lib/metadata/types/metadata-interface.ts
+++ b/packages/next/src/lib/metadata/types/metadata-interface.ts
@@ -607,6 +607,7 @@ type SitemapFile = Array<{
alternates?: {
languages?: Languages
}
+ images?: string[]
}>
type ResolvingMetadata = Promise
diff --git a/test/e2e/app-dir/metadata-dynamic-routes/app/sitemap-image/sitemap.ts b/test/e2e/app-dir/metadata-dynamic-routes/app/sitemap-image/sitemap.ts
new file mode 100644
index 0000000000000..60c7f5c90258a
--- /dev/null
+++ b/test/e2e/app-dir/metadata-dynamic-routes/app/sitemap-image/sitemap.ts
@@ -0,0 +1,17 @@
+import { MetadataRoute } from 'next'
+
+export default function sitemap(): MetadataRoute.Sitemap {
+ return [
+ {
+ url: 'https://example.com',
+ lastModified: '2024-01-01',
+ changeFrequency: 'daily',
+ priority: 0.5,
+ },
+ {
+ url: 'https://example.com/about',
+ lastModified: '2024-01-01',
+ images: ['https://example.com/image.jpg'],
+ },
+ ]
+}