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` } } + 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'], + }, + ] +}