From 536d6a3354573b2107e43b6aa33cecad0db4cc38 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 18 Feb 2022 19:31:08 +0300 Subject: [PATCH 1/6] fix: global Event should be equal to env Event --- packages/vitest/src/integrations/env/happy-dom.ts | 2 +- packages/vitest/src/integrations/env/jsdom.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/integrations/env/happy-dom.ts b/packages/vitest/src/integrations/env/happy-dom.ts index 501f36666612..cd051b519d47 100644 --- a/packages/vitest/src/integrations/env/happy-dom.ts +++ b/packages/vitest/src/integrations/env/happy-dom.ts @@ -9,7 +9,7 @@ export default ({ const win: any = new Window() const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(win)) - .filter(k => !k.startsWith('_') && !(k in global))) + .filter(k => !k.startsWith('_'))) const overrideObject = new Map() for (const key of keys) { diff --git a/packages/vitest/src/integrations/env/jsdom.ts b/packages/vitest/src/integrations/env/jsdom.ts index f865793f74a1..349b82c911f8 100644 --- a/packages/vitest/src/integrations/env/jsdom.ts +++ b/packages/vitest/src/integrations/env/jsdom.ts @@ -41,7 +41,7 @@ export default ({ ) const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(dom.window)) - .filter(k => !k.startsWith('_') && !(k in global))) + .filter(k => !k.startsWith('_'))) const overrideObject = new Map() for (const key of keys) { From fffff23cfa7b1629c5322eac477c6c15a6a406f5 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 18 Feb 2022 19:39:33 +0300 Subject: [PATCH 2/6] fix: filter window keys by possibility of rewriting --- packages/vitest/src/integrations/env/happy-dom.ts | 5 ++--- packages/vitest/src/integrations/env/jsdom.ts | 5 ++--- packages/vitest/src/integrations/env/utils.ts | 15 +++++++++++++++ packages/vitest/src/utils/base.ts | 8 ++++++++ 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 packages/vitest/src/integrations/env/utils.ts diff --git a/packages/vitest/src/integrations/env/happy-dom.ts b/packages/vitest/src/integrations/env/happy-dom.ts index cd051b519d47..89e3bf22228e 100644 --- a/packages/vitest/src/integrations/env/happy-dom.ts +++ b/packages/vitest/src/integrations/env/happy-dom.ts @@ -1,6 +1,6 @@ import { importModule } from 'local-pkg' import type { Environment } from '../../types' -import { KEYS } from './jsdom-keys' +import { getWindowKeys } from './utils' export default ({ name: 'happy-dom', @@ -8,8 +8,7 @@ export default ({ const { Window } = await importModule('happy-dom') as typeof import('happy-dom') const win: any = new Window() - const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(win)) - .filter(k => !k.startsWith('_'))) + const keys = getWindowKeys(win) const overrideObject = new Map() for (const key of keys) { diff --git a/packages/vitest/src/integrations/env/jsdom.ts b/packages/vitest/src/integrations/env/jsdom.ts index 349b82c911f8..74c4556cff65 100644 --- a/packages/vitest/src/integrations/env/jsdom.ts +++ b/packages/vitest/src/integrations/env/jsdom.ts @@ -1,6 +1,6 @@ import { importModule } from 'local-pkg' import type { Environment, JSDOMOptions } from '../../types' -import { KEYS } from './jsdom-keys' +import { getWindowKeys } from './utils' export default ({ name: 'jsdom', @@ -40,8 +40,7 @@ export default ({ }, ) - const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(dom.window)) - .filter(k => !k.startsWith('_'))) + const keys = getWindowKeys(dom.window) const overrideObject = new Map() for (const key of keys) { diff --git a/packages/vitest/src/integrations/env/utils.ts b/packages/vitest/src/integrations/env/utils.ts new file mode 100644 index 000000000000..07b8d71b7b8c --- /dev/null +++ b/packages/vitest/src/integrations/env/utils.ts @@ -0,0 +1,15 @@ +import { getDescriptor } from '../../utils' +import { KEYS } from './jsdom-keys' + +export function getWindowKeys(win: any) { + return new Set(KEYS.concat(Object.getOwnPropertyNames(win)) + .filter((k) => { + if (k.startsWith('_')) return false + if (k in global) { + const descriptor = getDescriptor(global, k) + if (!descriptor) return true + return descriptor.configurable === true + } + return true + })) +} diff --git a/packages/vitest/src/utils/base.ts b/packages/vitest/src/utils/base.ts index 3fbb37caa048..c5dabb6669ec 100644 --- a/packages/vitest/src/utils/base.ts +++ b/packages/vitest/src/utils/base.ts @@ -105,3 +105,11 @@ export function deepMerge(targe function isMergableObject(item: any): item is Object { return isPlainObject(item) && !Array.isArray(item) } + +export function getDescriptor(obj: any, key: string): PropertyDescriptor | undefined { + if (!isObject(obj)) return undefined + const descriptor = Object.getOwnPropertyDescriptor(obj, key) + if (descriptor) return descriptor + const proto = Object.getPrototypeOf(obj) + return getDescriptor(proto, key) +} From c7b018a6c5cb0ff9754244a64efe599d3d27004e Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 18 Feb 2022 19:42:08 +0300 Subject: [PATCH 3/6] chore: pass global to getWindowKeys --- packages/vitest/src/integrations/env/happy-dom.ts | 2 +- packages/vitest/src/integrations/env/jsdom.ts | 2 +- packages/vitest/src/integrations/env/utils.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vitest/src/integrations/env/happy-dom.ts b/packages/vitest/src/integrations/env/happy-dom.ts index 89e3bf22228e..35d3ddc2e68e 100644 --- a/packages/vitest/src/integrations/env/happy-dom.ts +++ b/packages/vitest/src/integrations/env/happy-dom.ts @@ -8,7 +8,7 @@ export default ({ const { Window } = await importModule('happy-dom') as typeof import('happy-dom') const win: any = new Window() - const keys = getWindowKeys(win) + const keys = getWindowKeys(global, win) const overrideObject = new Map() for (const key of keys) { diff --git a/packages/vitest/src/integrations/env/jsdom.ts b/packages/vitest/src/integrations/env/jsdom.ts index 74c4556cff65..0e457b998473 100644 --- a/packages/vitest/src/integrations/env/jsdom.ts +++ b/packages/vitest/src/integrations/env/jsdom.ts @@ -40,7 +40,7 @@ export default ({ }, ) - const keys = getWindowKeys(dom.window) + const keys = getWindowKeys(global, dom.window) const overrideObject = new Map() for (const key of keys) { diff --git a/packages/vitest/src/integrations/env/utils.ts b/packages/vitest/src/integrations/env/utils.ts index 07b8d71b7b8c..fa2e2d7d2eda 100644 --- a/packages/vitest/src/integrations/env/utils.ts +++ b/packages/vitest/src/integrations/env/utils.ts @@ -1,7 +1,7 @@ import { getDescriptor } from '../../utils' import { KEYS } from './jsdom-keys' -export function getWindowKeys(win: any) { +export function getWindowKeys(global: any, win: any) { return new Set(KEYS.concat(Object.getOwnPropertyNames(win)) .filter((k) => { if (k.startsWith('_')) return false From eb7f3731301629712272c497924e2a40487ec5ee Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 18 Feb 2022 19:44:36 +0300 Subject: [PATCH 4/6] chore: don't put interval APIs from window to global --- packages/vitest/src/integrations/env/utils.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/integrations/env/utils.ts b/packages/vitest/src/integrations/env/utils.ts index fa2e2d7d2eda..d94128441b6c 100644 --- a/packages/vitest/src/integrations/env/utils.ts +++ b/packages/vitest/src/integrations/env/utils.ts @@ -1,8 +1,15 @@ import { getDescriptor } from '../../utils' import { KEYS } from './jsdom-keys' +const filterKeys = new Set([ + 'clearInterval', + 'clearTimeout', + 'setInterval', + 'setTimeout' +]) + export function getWindowKeys(global: any, win: any) { - return new Set(KEYS.concat(Object.getOwnPropertyNames(win)) + const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(win)) .filter((k) => { if (k.startsWith('_')) return false if (k in global) { @@ -10,6 +17,8 @@ export function getWindowKeys(global: any, win: any) { if (!descriptor) return true return descriptor.configurable === true } - return true + return !filterKeys.has(k) })) + + return keys } From 3e5a634a2d594b33b231b1f64b6fa2d1768bc4c0 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 18 Feb 2022 19:57:51 +0300 Subject: [PATCH 5/6] chore: instead of putting everyting on global, allow some to be rewritten --- packages/vitest/src/integrations/env/utils.ts | 14 ++++---------- packages/vitest/src/utils/base.ts | 8 -------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/packages/vitest/src/integrations/env/utils.ts b/packages/vitest/src/integrations/env/utils.ts index d94128441b6c..5d34ac61454b 100644 --- a/packages/vitest/src/integrations/env/utils.ts +++ b/packages/vitest/src/integrations/env/utils.ts @@ -1,11 +1,7 @@ -import { getDescriptor } from '../../utils' import { KEYS } from './jsdom-keys' -const filterKeys = new Set([ - 'clearInterval', - 'clearTimeout', - 'setInterval', - 'setTimeout' +const allowRewrite = new Set([ + 'Event', ]) export function getWindowKeys(global: any, win: any) { @@ -13,11 +9,9 @@ export function getWindowKeys(global: any, win: any) { .filter((k) => { if (k.startsWith('_')) return false if (k in global) { - const descriptor = getDescriptor(global, k) - if (!descriptor) return true - return descriptor.configurable === true + return allowRewrite.has(k) } - return !filterKeys.has(k) + return true })) return keys diff --git a/packages/vitest/src/utils/base.ts b/packages/vitest/src/utils/base.ts index a004e9b37167..ce44a3303098 100644 --- a/packages/vitest/src/utils/base.ts +++ b/packages/vitest/src/utils/base.ts @@ -100,14 +100,6 @@ function isMergableObject(item: any): item is Object { return isPlainObject(item) && !Array.isArray(item) } -export function getDescriptor(obj: any, key: string): PropertyDescriptor | undefined { - if (!isObject(obj)) return undefined - const descriptor = Object.getOwnPropertyDescriptor(obj, key) - if (descriptor) return descriptor - const proto = Object.getPrototypeOf(obj) - return getDescriptor(proto, key) -} - export function assertTypes(value: unknown, name: string, types: string[]): void { const receivedType = typeof value const pass = types.includes(receivedType) From 3f57092ec74d0b3ed0e90ff3f1be35ed5a6041b0 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Fri, 18 Feb 2022 20:02:30 +0300 Subject: [PATCH 6/6] chore: fix eslint errors --- packages/vitest/src/integrations/env/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vitest/src/integrations/env/utils.ts b/packages/vitest/src/integrations/env/utils.ts index 5d34ac61454b..821b6846e385 100644 --- a/packages/vitest/src/integrations/env/utils.ts +++ b/packages/vitest/src/integrations/env/utils.ts @@ -8,9 +8,9 @@ export function getWindowKeys(global: any, win: any) { const keys = new Set(KEYS.concat(Object.getOwnPropertyNames(win)) .filter((k) => { if (k.startsWith('_')) return false - if (k in global) { + if (k in global) return allowRewrite.has(k) - } + return true }))