From f3d960a7786f98aab779da11c9762be9796153a1 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 2 Mar 2026 10:23:35 +0900 Subject: [PATCH 1/2] fix: fix `URL.name` on jsdom --- packages/vitest/src/integrations/env/jsdom.ts | 10 ++++++++-- test/core/test/environments/jsdom.spec.ts | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/integrations/env/jsdom.ts b/packages/vitest/src/integrations/env/jsdom.ts index c585ea4237a9..31e3c155553b 100644 --- a/packages/vitest/src/integrations/env/jsdom.ts +++ b/packages/vitest/src/integrations/env/jsdom.ts @@ -232,7 +232,7 @@ export default { } function createCompatRequest(utils: CompatUtils) { - return class Request extends NodeRequest_ { + const CompatRequest = class Request extends NodeRequest_ { constructor(...args: [input: RequestInfo, init?: RequestInit]) { const [input, init] = args if (init?.body != null) { @@ -254,10 +254,12 @@ function createCompatRequest(utils: CompatUtils) { return instance instanceof NodeRequest_ } } + Object.defineProperty(CompatRequest, 'name', { value: 'Request' }) + return CompatRequest } function createJSDOMCompatURL(utils: CompatUtils): typeof URL { - return class URL extends NodeURL { + const CompatURL = class URL extends NodeURL { static createObjectURL(blob: any): string { if (blob instanceof utils.window.Blob) { const compatBlob = utils.makeCompatBlob(blob) @@ -270,6 +272,10 @@ function createJSDOMCompatURL(utils: CompatUtils): typeof URL { return instance instanceof NodeURL } } as typeof URL + // bundlers may rename the class expression to avoid conflicts (e.g. URL$1) + // https://github.com/vitest-dev/vitest/issues/9761 + Object.defineProperty(CompatURL, 'name', { value: 'URL' }) + return CompatURL } interface CompatUtils { diff --git a/test/core/test/environments/jsdom.spec.ts b/test/core/test/environments/jsdom.spec.ts index 5caed58f81a6..2dee767ce169 100644 --- a/test/core/test/environments/jsdom.spec.ts +++ b/test/core/test/environments/jsdom.spec.ts @@ -319,6 +319,11 @@ test('URL.createObjectUrl works properly', () => { }).not.toThrow() }) +test('compat classes preserve their .name property', () => { + expect(URL.name).toBe('URL') + expect(Request.name).toBe('Request') +}) + test('jsdom global is exposed', () => { // @ts-expect-error -- jsdom is not exposed in our types because we use a single tsconfig for all const dom = jsdom From a628859350b51a0f3c16eb942960eb282b666685 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 2 Mar 2026 10:38:50 +0900 Subject: [PATCH 2/2] refactor: this works actually --- packages/vitest/src/integrations/env/jsdom.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/vitest/src/integrations/env/jsdom.ts b/packages/vitest/src/integrations/env/jsdom.ts index 31e3c155553b..dcf3dbe9253d 100644 --- a/packages/vitest/src/integrations/env/jsdom.ts +++ b/packages/vitest/src/integrations/env/jsdom.ts @@ -232,7 +232,7 @@ export default { } function createCompatRequest(utils: CompatUtils) { - const CompatRequest = class Request extends NodeRequest_ { + class Request extends NodeRequest_ { constructor(...args: [input: RequestInfo, init?: RequestInit]) { const [input, init] = args if (init?.body != null) { @@ -254,12 +254,11 @@ function createCompatRequest(utils: CompatUtils) { return instance instanceof NodeRequest_ } } - Object.defineProperty(CompatRequest, 'name', { value: 'Request' }) - return CompatRequest + return Request } function createJSDOMCompatURL(utils: CompatUtils): typeof URL { - const CompatURL = class URL extends NodeURL { + class URL extends NodeURL { static createObjectURL(blob: any): string { if (blob instanceof utils.window.Blob) { const compatBlob = utils.makeCompatBlob(blob) @@ -271,11 +270,8 @@ function createJSDOMCompatURL(utils: CompatUtils): typeof URL { static [Symbol.hasInstance](instance: unknown): boolean { return instance instanceof NodeURL } - } as typeof URL - // bundlers may rename the class expression to avoid conflicts (e.g. URL$1) - // https://github.com/vitest-dev/vitest/issues/9761 - Object.defineProperty(CompatURL, 'name', { value: 'URL' }) - return CompatURL + } + return URL } interface CompatUtils {