Skip to content

Commit

Permalink
fix: proxy nested default (#359)
Browse files Browse the repository at this point in the history
  • Loading branch information
sheremet-va committed Dec 29, 2021
1 parent f8e01df commit affbb55
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 14 deletions.
30 changes: 18 additions & 12 deletions packages/vitest/src/node/execute.ts
Expand Up @@ -48,23 +48,29 @@ export const stubRequests: Record<string, any> = {
},
}

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),
})
}

Expand Down
6 changes: 6 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion test/cjs/package.json
Expand Up @@ -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:*"
}
}
}
8 changes: 7 additions & 1 deletion 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')
})

0 comments on commit affbb55

Please sign in to comment.