diff --git a/packages/vitest/src/node/execute.ts b/packages/vitest/src/node/execute.ts index 00b133f004e5..1c764b4642b8 100644 --- a/packages/vitest/src/node/execute.ts +++ b/packages/vitest/src/node/execute.ts @@ -48,23 +48,29 @@ export const stubRequests: Record = { }, } +function hasNestedDefault(target: any) { + return '__esModule' in target && target.__esModule && 'default' in target.default +} + +function proxyMethod(name: 'get' | 'set' | 'has' | 'deleteProperty', isNested: boolean) { + return function(target: any, key: string | symbol, ...args: [any?, any?]) { + const result = Reflect[name](target, key, ...args) + if ((isNested && key === 'default') || !result) + return Reflect[name](target.default, key, ...args) + return result + } +} + export async function interpretedImport(path: string, interpretDefault: boolean) { const mod = await import(path) if (interpretDefault && 'default' in mod) { + const isNested = hasNestedDefault(mod) return new Proxy(mod, { - get(target, key, receiver) { - return Reflect.get(target, key, receiver) || Reflect.get(target.default, key, receiver) - }, - set(target, key, value, receiver) { - return Reflect.set(target, key, value, receiver) || Reflect.set(target.default, key, value, receiver) - }, - has(target, key) { - return Reflect.has(target, key) || Reflect.has(target.default, key) - }, - deleteProperty(target, key) { - return Reflect.deleteProperty(target, key) || Reflect.deleteProperty(target.default, key) - }, + get: proxyMethod('get', isNested), + set: proxyMethod('set', isNested), + has: proxyMethod('has', isNested), + deleteProperty: proxyMethod('deleteProperty', isNested), }) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24f717851c86..2ce9be11990e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -241,6 +241,7 @@ importers: '@types/fs-extra': ^9.0.13 '@types/prettier': ^2.4.2 fs-extra: ^10.0.0 + givens: 1.3.9 history: ^5.2.0 prettier: ^2.5.1 vitest: workspace:* @@ -248,6 +249,7 @@ importers: '@types/fs-extra': 9.0.13 '@types/prettier': 2.4.2 fs-extra: 10.0.0 + givens: 1.3.9 history: 5.2.0 prettier: 2.5.1 vitest: link:../../packages/vitest @@ -4891,6 +4893,10 @@ packages: get-intrinsic: 1.1.1 dev: true + /givens/1.3.9: + resolution: {integrity: sha512-4hYlStsEIaYeYvZTZwgD5yOS2WVP0dcDsOBqeImdEM8eLuclvv0IEMlQQ1kuA5DN4he7wVH1jsYtNe9uininxg==} + dev: true + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} diff --git a/test/cjs/package.json b/test/cjs/package.json index 4ddebb46318e..5ae2ce801fe8 100644 --- a/test/cjs/package.json +++ b/test/cjs/package.json @@ -9,8 +9,9 @@ "@types/fs-extra": "^9.0.13", "@types/prettier": "^2.4.2", "fs-extra": "^10.0.0", + "givens": "1.3.9", "history": "^5.2.0", "prettier": "^2.5.1", "vitest": "workspace:*" } -} +} \ No newline at end of file diff --git a/test/cjs/test/interpret-default.test.tsx b/test/cjs/test/interpret-default.test.tsx index 87568236f9de..bb2a9e13a481 100644 --- a/test/cjs/test/interpret-default.test.tsx +++ b/test/cjs/test/interpret-default.test.tsx @@ -1,7 +1,13 @@ -import { it, expect } from 'vitest' +import { expect, it } from 'vitest' import { format } from 'prettier' +import givens from 'givens' it('prettier', () => { expect(format('const a : A = \'t\'', { parser: 'typescript' }).trim()) .toEqual('const a: A = "t";'.trim()) }) + +it('has nested default', () => { + expect(typeof givens).toBe('function') + expect(givens.name).toBe('getGiven') +})