@@ -508,6 +508,88 @@ if (import.meta.vitest) {
508508 ` )
509509 } )
510510
511+ test ( 'imports are kept when the file has no hoisted calls' , async ( ) => {
512+ const { stderr, testTree } = await runNoViteModuleRunnerTests ( {
513+ 'add.js' : `export const add = (a, b) => a + b` ,
514+ 'comment.test.js' : /* js */ `
515+ import { add } from './add.js'
516+ // vi.mock('./add.js')
517+ test('add', () => {
518+ expect(add(1, 2)).toBe(3)
519+ })
520+ ` ,
521+ 'import-actual.test.js' : /* js */ `
522+ import { add } from './add.js'
523+ test('add', async () => {
524+ const actual = await vi.importActual('./add.js')
525+ expect(add).toBe(actual.add)
526+ })
527+ ` ,
528+ } )
529+ expect ( stderr ) . toBe ( '' )
530+ expect ( testTree ( ) ) . toMatchInlineSnapshot ( `
531+ {
532+ "comment.test.js": {
533+ "add": "passed",
534+ },
535+ "import-actual.test.js": {
536+ "add": "passed",
537+ },
538+ }
539+ ` )
540+ } )
541+
542+ test ( 'manual mock keeps names re-exported with export *' , async ( ) => {
543+ const { stderr, testTree } = await runNoViteModuleRunnerTests ( {
544+ 'base.js' : `export function fromBase() { return 'base' }` ,
545+ 'star.js' : /* js */ `
546+ export * from './base.js'
547+ export function own() { return 'own' }
548+ ` ,
549+ 'star.test.js' : /* js */ `
550+ import { fromBase, own } from './star.js'
551+ vi.mock(import('./star.js'), () => ({
552+ own: () => 'mocked-own',
553+ fromBase: () => 'mocked-base',
554+ }))
555+ test('re-exported names are mocked', () => {
556+ expect(own()).toBe('mocked-own')
557+ expect(fromBase()).toBe('mocked-base')
558+ })
559+ ` ,
560+ 'users.js' : /* js */ `
561+ export * from './posts.js'
562+ export const getUser = () => 'user'
563+ ` ,
564+ 'posts.js' : /* js */ `
565+ export * from './users.js'
566+ export const getPost = () => 'post'
567+ ` ,
568+ 'circular.test.js' : /* js */ `
569+ import { getPost, getUser } from './users.js'
570+ vi.mock(import('./users.js'), () => ({
571+ getUser: () => 'mocked-user',
572+ getPost: () => 'mocked-post',
573+ }))
574+ test('circular re-exports are mocked', () => {
575+ expect(getUser()).toBe('mocked-user')
576+ expect(getPost()).toBe('mocked-post')
577+ })
578+ ` ,
579+ } )
580+ expect ( stderr ) . toBe ( '' )
581+ expect ( testTree ( ) ) . toMatchInlineSnapshot ( `
582+ {
583+ "circular.test.js": {
584+ "circular re-exports are mocked": "passed",
585+ },
586+ "star.test.js": {
587+ "re-exported names are mocked": "passed",
588+ },
589+ }
590+ ` )
591+ } )
592+
511593 test ( 'cannot import JS file without extension in ESM' , async ( ) => {
512594 const { stderr, root } = await runNoViteModuleRunnerTests ( {
513595 'add.js' : /* js */ `
0 commit comments