Skip to content

Commit a186a7e

Browse files
authoredJan 10, 2023
fix: don't use ownKeys, when interoping a module (#2629)
1 parent efbff2a commit a186a7e

File tree

6 files changed

+22
-20
lines changed

6 files changed

+22
-20
lines changed
 

‎examples/mocks/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"devDependencies": {
2020
"@vitest/ui": "latest",
2121
"react": "^18.0.0",
22+
"sweetalert2": "^11.6.16",
2223
"vite": "latest",
2324
"vitest": "latest",
2425
"vue": "^3.2.39",
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
// @vitest-environment jsdom
22

3+
import sweetalert from 'sweetalert2'
34
import * as modDefaultCjs from '../src/external/default-cjs.cjs'
45

6+
vi.mock('sweetalert2')
57
vi.mock('../src/external/default-cjs.cjs')
68

79
test('default is mocked', () => {
810
expect(vi.isMockFunction(modDefaultCjs.default.fn)).toBe(true)
11+
expect(vi.isMockFunction(sweetalert)).toBe(true)
12+
expect(vi.isMockFunction(sweetalert.clickCancel)).toBe(true)
913
})

‎packages/vite-node/src/client.ts

-15
Original file line numberDiff line numberDiff line change
@@ -424,14 +424,6 @@ export class ViteNodeRunner {
424424

425425
const { mod, defaultExport } = interopModule(importedModule)
426426

427-
const modKeys = Reflect.ownKeys(mod)
428-
let defaultKeys = !isPrimitive(defaultExport) ? Reflect.ownKeys(defaultExport) : []
429-
// remove reserved keys from default keys
430-
if (typeof mod !== 'function' && typeof defaultExport === 'function') {
431-
const reservedKeys = ['arguments', 'caller', 'prototype', 'name', 'length']
432-
defaultKeys = defaultKeys.filter(n => typeof n === 'string' && !reservedKeys.includes(n))
433-
}
434-
435427
return new Proxy(mod, {
436428
get(mod, prop) {
437429
if (prop === 'default')
@@ -443,13 +435,6 @@ export class ViteNodeRunner {
443435
return defaultExport !== undefined
444436
return prop in mod || (defaultExport && prop in defaultExport)
445437
},
446-
// this is needed for mocker to know what is available to mock
447-
ownKeys() {
448-
if (!defaultExport || isPrimitive(defaultExport))
449-
return modKeys
450-
const allKeys = [...modKeys, 'default', ...defaultKeys]
451-
return Array.from(new Set(allKeys))
452-
},
453438
getOwnPropertyDescriptor(mod, prop) {
454439
const descriptor = Reflect.getOwnPropertyDescriptor(mod, prop)
455440
if (descriptor)

‎packages/vitest/src/runtime/mocker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ export class VitestMocker {
224224
const mockPropertiesOf = (container: Record<Key, any>, newContainer: Record<Key, any>) => {
225225
const containerType = getType(container)
226226
const isModule = containerType === 'Module' || !!container.__esModule
227-
for (const { key: property, descriptor } of getAllMockableProperties(container)) {
227+
for (const { key: property, descriptor } of getAllMockableProperties(container, isModule)) {
228228
// Modules define their exports as getters. We want to process those.
229229
if (!isModule && descriptor.get) {
230230
try {

‎packages/vitest/src/utils/base.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ function collectOwnProperties(obj: any, collector: Set<string | symbol> | ((key:
1111
Object.getOwnPropertySymbols(obj).forEach(collect)
1212
}
1313

14-
export function getAllMockableProperties(obj: any) {
15-
const allProps = new Set<{ key: string | symbol; descriptor: PropertyDescriptor }>()
14+
export function getAllMockableProperties(obj: any, isModule: boolean) {
15+
const allProps = new Map<string | symbol, { key: string | symbol; descriptor: PropertyDescriptor }>()
1616
let curr = obj
1717
do {
1818
// we don't need properties from these
@@ -22,11 +22,17 @@ export function getAllMockableProperties(obj: any) {
2222
collectOwnProperties(curr, (key) => {
2323
const descriptor = Object.getOwnPropertyDescriptor(curr, key)
2424
if (descriptor)
25-
allProps.add({ key, descriptor })
25+
allProps.set(key, { key, descriptor })
2626
})
2727
// eslint-disable-next-line no-cond-assign
2828
} while (curr = Object.getPrototypeOf(curr))
29-
return Array.from(allProps)
29+
// default is not specified in ownKeys, if module is interoped
30+
if (isModule && !allProps.has('default') && 'default' in obj) {
31+
const descriptor = Object.getOwnPropertyDescriptor(obj, 'default')
32+
if (descriptor)
33+
allProps.set('default', { key: 'default', descriptor })
34+
}
35+
return Array.from(allProps.values())
3036
}
3137

3238
export function notNullish<T>(v: T | null | undefined): v is NonNullable<T> {

‎pnpm-lock.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.