From 9008faab8fdb662acc8c78429617033c846a4e82 Mon Sep 17 00:00:00 2001 From: Johan Eliasson Date: Thu, 21 May 2026 09:51:58 +0200 Subject: [PATCH 1/2] fix(image): replace deprecated url parser --- packages/image/src/resolve.ts | 36 +++++++++++++++++----------- packages/image/tests/resolve.test.ts | 11 +++++++++ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/packages/image/src/resolve.ts b/packages/image/src/resolve.ts index e79126f71..884bf4f30 100644 --- a/packages/image/src/resolve.ts +++ b/packages/image/src/resolve.ts @@ -1,5 +1,5 @@ import fs from 'fs'; -import url from 'url'; +import { fileURLToPath } from 'url'; import path from 'path'; import PNG from './png'; @@ -36,22 +36,30 @@ const getAbsoluteLocalPath = (src: string) => { throw new Error('Cannot check local paths in client-side environment'); } - const { - protocol, - auth, - host, - port, - hostname, - path: pathname, - } = url.parse(src); + try { + const parsed = new URL(src); - const absolutePath = pathname ? path.resolve(src) : undefined; + if ( + parsed.protocol !== 'file:' || + parsed.username || + parsed.password || + parsed.host + ) { + return undefined; + } - if ((protocol && protocol !== 'file:') || auth || host || port || hostname) { - return undefined; - } + return fileURLToPath(parsed.href); + } catch { + if (!src) { + return undefined; + } - return absolutePath; + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(src)) { + return undefined; + } + + return path.resolve(src); + } }; const fetchLocalFile = (src: LocalImageSrc): Promise => diff --git a/packages/image/tests/resolve.test.ts b/packages/image/tests/resolve.test.ts index d3d92eab8..a7925504f 100644 --- a/packages/image/tests/resolve.test.ts +++ b/packages/image/tests/resolve.test.ts @@ -101,6 +101,17 @@ describe('image resolveImage', () => { expect(image?.height).toBeGreaterThan(0); }); + test('Should render a local image from file URL', async () => { + const absolutePath = path.join(__dirname, './assets/test.jpg'); + const image = await resolveImage({ + uri: url.pathToFileURL(absolutePath).href, + }); + + expect(image?.data).toBeTruthy(); + expect(image?.width).toBeGreaterThan(0); + expect(image?.height).toBeGreaterThan(0); + }); + test('Should render a local image from relative path', async () => { const image = await resolveImage({ uri: 'packages/layout/tests/assets/test.jpg', From 4063b93e1e8c72e72c4625ad231afa3fc5b19e91 Mon Sep 17 00:00:00 2001 From: Johan Eliasson Date: Thu, 21 May 2026 13:37:49 +0200 Subject: [PATCH 2/2] fix(image): add changeset --- .changeset/quiet-paths-smile.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-paths-smile.md diff --git a/.changeset/quiet-paths-smile.md b/.changeset/quiet-paths-smile.md new file mode 100644 index 000000000..67485dead --- /dev/null +++ b/.changeset/quiet-paths-smile.md @@ -0,0 +1,5 @@ +--- +"@react-pdf/image": patch +--- + +Replace deprecated url.parse usage in local image path resolution.