From 0fb9700551c43efa3fbb650d570b817e6fc4b31d Mon Sep 17 00:00:00 2001 From: Youngteac Hong Date: Tue, 9 Jul 2024 15:57:08 +0900 Subject: [PATCH] Remove custom-jsdom (#864) Previously, there were Uint8Array related errors which prompted the addition of Custom JSDOM environment to resolve them in Vitest. For some reason, Uint8Array errors are no longer occurring, making Custom JSDOM environment unnecessary for now. So this commit removes custom JSDOM. --- test/vitest/env/index.ts | 155 ------------------------------ test/vitest/env/package-lock.json | 10 -- test/vitest/env/package.json | 5 - vitest.config.ts | 1 - 4 files changed, 171 deletions(-) delete mode 100644 test/vitest/env/index.ts delete mode 100644 test/vitest/env/package-lock.json delete mode 100644 test/vitest/env/package.json diff --git a/test/vitest/env/index.ts b/test/vitest/env/index.ts deleted file mode 100644 index 4cad2a424..000000000 --- a/test/vitest/env/index.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { CookieJar, JSDOM, ResourceLoader, VirtualConsole } from 'jsdom'; -import { Environment } from 'vitest'; -import { populateGlobal } from 'vitest/environments'; - -function catchWindowErrors(window: Window) { - let userErrorListenerCount = 0; - function throwUnhandlerError(e: ErrorEvent) { - if (userErrorListenerCount === 0 && e.error != null) - process.emit('uncaughtException', e.error); - } - const addEventListener = window.addEventListener.bind(window); - const removeEventListener = window.removeEventListener.bind(window); - window.addEventListener('error', throwUnhandlerError); - window.addEventListener = function ( - ...args: Parameters - ) { - if (args[0] === 'error') userErrorListenerCount++; - return addEventListener.apply(this, args); - }; - window.removeEventListener = function ( - ...args: Parameters - ) { - if (args[0] === 'error' && userErrorListenerCount) userErrorListenerCount--; - return removeEventListener.apply(this, args); - }; - return function clearErrorHandlers() { - window.removeEventListener('error', throwUnhandlerError); - }; -} - -const AllowedKeys = ['Uint8Array']; - -export default { - name: 'jsdom', - transformMode: 'web', - async setupVM({ jsdom = {} }) { - const { - html = '', - userAgent, - url = 'http://localhost:3000', - contentType = 'text/html', - pretendToBeVisual = true, - includeNodeLocations = false, - runScripts = 'dangerously', - resources, - console = false, - cookieJar = false, - ...restOptions - } = jsdom as any; - const dom = new JSDOM(html, { - pretendToBeVisual, - resources: - resources ?? - (userAgent ? new ResourceLoader({ userAgent }) : undefined), - runScripts, - url, - virtualConsole: - console && globalThis.console - ? new VirtualConsole().sendTo(globalThis.console) - : undefined, - cookieJar: cookieJar ? new CookieJar() : undefined, - includeNodeLocations, - contentType, - userAgent, - ...restOptions, - }); - const clearWindowErrors = catchWindowErrors(dom.window as any); - - // TODO: browser doesn't expose Buffer, but a lot of dependencies use it - dom.window.Buffer = Buffer; - - // inject web globals if they missing in JSDOM but otherwise available in Nodejs - // https://nodejs.org/dist/latest/docs/api/globals.html - const globalNames = [ - 'structuredClone', - 'fetch', - 'Request', - 'Response', - 'BroadcastChannel', - 'MessageChannel', - 'MessagePort', - ] as const; - for (const name of globalNames) { - const value = globalThis[name]; - if ( - typeof value !== 'undefined' && - typeof dom.window[name] === 'undefined' - ) - dom.window[name] = value; - } - - return { - getVmContext() { - return dom.getInternalVMContext(); - }, - teardown() { - clearWindowErrors(); - dom.window.close(); - }, - }; - }, - async setup(global, { jsdom = {} }) { - const { CookieJar, JSDOM, ResourceLoader, VirtualConsole } = - (await require('jsdom')) as typeof import('jsdom'); - const { - html = '', - userAgent, - url = 'http://localhost:3000', - contentType = 'text/html', - pretendToBeVisual = true, - includeNodeLocations = false, - runScripts = 'dangerously', - resources, - console = false, - cookieJar = false, - ...restOptions - } = jsdom as any; - const dom = new JSDOM(html, { - pretendToBeVisual, - resources: - resources ?? - (userAgent ? new ResourceLoader({ userAgent }) : undefined), - runScripts, - url, - virtualConsole: - console && global.console - ? new VirtualConsole().sendTo(global.console) - : undefined, - cookieJar: cookieJar ? new CookieJar() : undefined, - includeNodeLocations, - contentType, - userAgent, - ...restOptions, - }); - - const { keys, originals } = populateGlobal(global, dom.window, { - bindFunctions: true, - }); - - AllowedKeys.forEach((key) => { - global[key] = originals.get(key); - }); - - const clearWindowErrors = catchWindowErrors(global); - - return { - teardown(global) { - clearWindowErrors(); - dom.window.close(); - keys.forEach((key) => delete global[key]); - originals.forEach((v, k) => (global[k] = v)); - }, - }; - }, -}; diff --git a/test/vitest/env/package-lock.json b/test/vitest/env/package-lock.json deleted file mode 100644 index caf2af0bd..000000000 --- a/test/vitest/env/package-lock.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "vitest-environment-custom-jsdom", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "vitest-environment-custom-jsdom" - } - } -} diff --git a/test/vitest/env/package.json b/test/vitest/env/package.json deleted file mode 100644 index ed0773339..000000000 --- a/test/vitest/env/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "vitest-environment-custom-jsdom", - "private": true, - "main": "index.ts" -} diff --git a/vitest.config.ts b/vitest.config.ts index 8d012ed6d..2bf9616f4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -15,7 +15,6 @@ export default defineConfig({ onConsoleLog() { return false; }, - environment: 'custom-jsdom', globals: true, testTimeout: isCI ? 5000 : Infinity, benchmark: {