diff --git a/packages/next/src/lib/metadata/resolvers/resolve-opengraph.test.ts b/packages/next/src/lib/metadata/resolvers/resolve-opengraph.test.ts new file mode 100644 index 000000000000..9645f3bc2b66 --- /dev/null +++ b/packages/next/src/lib/metadata/resolvers/resolve-opengraph.test.ts @@ -0,0 +1,23 @@ +import { resolveImages } from './resolve-opengraph' + +describe('resolveImages', () => { + const image1 = 'https://www.example.com/image1.jpg' + const image2 = 'https://www.example.com/image2.jpg' + + it(`should resolve images`, () => { + const images = [image1, { url: image2, alt: 'Image2' }] + + expect(resolveImages(images, null)).toEqual([ + { url: new URL(image1) }, + { url: new URL(image2), alt: 'Image2' }, + ]) + }) + + it('should not mutate passed images', () => { + const images = [image1, { url: image2, alt: 'Image2' }] + + resolveImages(images, null) + + expect(images).toEqual([image1, { url: image2, alt: 'Image2' }]) + }) +}) diff --git a/packages/next/src/lib/metadata/resolvers/resolve-opengraph.ts b/packages/next/src/lib/metadata/resolvers/resolve-opengraph.ts index 20a2442eeeae..c7b944d0aca8 100644 --- a/packages/next/src/lib/metadata/resolvers/resolve-opengraph.ts +++ b/packages/next/src/lib/metadata/resolvers/resolve-opengraph.ts @@ -29,32 +29,33 @@ const OgTypeFields = { ], } as const -function resolveImages( +export function resolveImages( images: Twitter['images'], metadataBase: ResolvedMetadata['metadataBase'] ): NonNullable['images'] -function resolveImages( +export function resolveImages( images: OpenGraph['images'], metadataBase: ResolvedMetadata['metadataBase'] ): NonNullable['images'] -function resolveImages( +export function resolveImages( images: OpenGraph['images'] | Twitter['images'], metadataBase: ResolvedMetadata['metadataBase'] ): | NonNullable['images'] | NonNullable['images'] { - const resolvedImages = resolveAsArrayOrUndefined(images) - resolvedImages?.forEach((item, index, array) => { + return resolveAsArrayOrUndefined(images)?.map((item, index) => { if (isStringOrURL(item)) { - array[index] = { + return { url: resolveUrl(item, metadataBase)!, } } else { - // Update image descriptor url - item.url = resolveUrl(item.url, metadataBase)! + return { + ...item, + // Update image descriptor url + url: resolveUrl(item.url, metadataBase)!, + } } }) - return resolvedImages } function getFieldsByOgType(ogType: OpenGraphType | undefined) {