From 17e3d5f6d220f9ee1d443b650a426bbeed4038fd Mon Sep 17 00:00:00 2001 From: Tyagiquamar Date: Wed, 23 Sep 2026 11:26:02 +0530 Subject: [PATCH] fix(render): strip image preload links with imagesrcset or imagesizes when as=image is omitted --- .changeset/strip-image-preload-imagesrcset.md | 5 +++++ .../src/shared/utils/strip-image-preload-links.spec.ts | 7 +++++++ .../render/src/shared/utils/strip-image-preload-links.ts | 7 ++++++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changeset/strip-image-preload-imagesrcset.md 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 =