diff --git a/.changeset/strip-image-preload-imagesrcset.md b/.changeset/strip-image-preload-imagesrcset.md new file mode 100644 index 0000000000..33ae384c22 --- /dev/null +++ b/.changeset/strip-image-preload-imagesrcset.md @@ -0,0 +1,5 @@ +--- +"@react-email/render": patch +--- + +Strip image preload links that carry `imagesrcset` or `imagesizes` without `as="image"`, so React-injected responsive-image hints no longer leak into rendered email HTML. diff --git a/packages/render/src/shared/utils/strip-image-preload-links.spec.ts b/packages/render/src/shared/utils/strip-image-preload-links.spec.ts index 62f50afccf..b97d5f9cfc 100644 --- a/packages/render/src/shared/utils/strip-image-preload-links.spec.ts +++ b/packages/render/src/shared/utils/strip-image-preload-links.spec.ts @@ -24,6 +24,13 @@ describe('stripImagePreloadLinks()', () => { expect(stripImagePreloadLinks(html)).toBe('
'); }); + it('removes image preloads with imagesrcset or imagesizes when as="image" is omitted', () => { + const html = + ''; + + expect(stripImagePreloadLinks(html)).toBe(''); + }); + it('keeps user-authored non-image preloads', () => { const html = ''; diff --git a/packages/render/src/shared/utils/strip-image-preload-links.ts b/packages/render/src/shared/utils/strip-image-preload-links.ts index 65158a05cf..431e61bdc7 100644 --- a/packages/render/src/shared/utils/strip-image-preload-links.ts +++ b/packages/render/src/shared/utils/strip-image-preload-links.ts @@ -21,7 +21,12 @@ export const stripImagePreloadLinks = (html: string): string => { const isImagePreloadLink = (tag: string): boolean => { const attributes = parseAttributes(tag); - return attributes.rel === 'preload' && attributes.as === 'image'; + return ( + attributes.rel === 'preload' && + (attributes.as === 'image' || + 'imagesrcset' in attributes || + 'imagesizes' in attributes) + ); }; const ATTRIBUTE_PATTERN =