Skip to content

Commit 549d321

Browse files
authored
fix: support import.meta.resolve on Vite 7 (#8493)
1 parent 57b2cca commit 549d321

File tree

5 files changed

+56
-4
lines changed

5 files changed

+56
-4
lines changed

packages/vitest/src/runtime/moduleRunner/moduleRunner.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,24 @@ import type { ExternalModulesExecutor } from '../external-executor'
66
import type { ModuleExecutionInfo } from './moduleDebug'
77
import type { VitestModuleEvaluator } from './moduleEvaluator'
88
import type { VitestTransportOptions } from './moduleTransport'
9-
import { ModuleRunner } from 'vite/module-runner'
9+
import * as viteModuleRunner from 'vite/module-runner'
1010
import { VitestMocker } from './moduleMocker'
1111
import { VitestTransport } from './moduleTransport'
1212

13+
// eslint-disable-next-line ts/ban-ts-comment
14+
// @ts-ignore available since Vite 7.1 https://github.com/vitejs/vite/pull/20260
15+
export type CreateImportMeta = NonNullable<viteModuleRunner.ModuleRunnerOptions['createImportMeta']>
16+
// eslint-disable-next-line ts/ban-ts-comment
17+
// @ts-ignore
18+
export const createNodeImportMeta: CreateImportMeta = viteModuleRunner.createNodeImportMeta
19+
1320
// @ts-expect-error overriding private method
14-
export class VitestModuleRunner extends ModuleRunner {
21+
export class VitestModuleRunner extends viteModuleRunner.ModuleRunner {
1522
public mocker: VitestMocker
1623
public moduleExecutionInfo: ModuleExecutionInfo
1724

18-
constructor(private options: VitestModuleRunnerOptions) {
25+
constructor(private vitestOptions: VitestModuleRunnerOptions) {
26+
const options = vitestOptions
1927
const transport = new VitestTransport(options.transport)
2028
const evaluatedModules = options.evaluatedModules
2129
super(
@@ -24,6 +32,9 @@ export class VitestModuleRunner extends ModuleRunner {
2432
hmr: false,
2533
evaluatedModules,
2634
sourcemapInterceptor: 'prepareStackTrace',
35+
// eslint-disable-next-line ts/ban-ts-comment
36+
// @ts-ignore
37+
createImportMeta: vitestOptions.createImportMeta,
2738
},
2839
options.evaluator,
2940
)
@@ -56,7 +67,7 @@ export class VitestModuleRunner extends ModuleRunner {
5667
}
5768

5869
public async import(rawId: string): Promise<any> {
59-
const resolved = await this.options.transport.resolveId(rawId)
70+
const resolved = await this.vitestOptions.transport.resolveId(rawId)
6071
if (!resolved) {
6172
return super.import(rawId)
6273
}
@@ -145,6 +156,7 @@ export interface VitestModuleRunnerOptions {
145156
mocker?: VitestMocker
146157
vm?: VitestVmOptions
147158
spyModule?: typeof import('@vitest/spy')
159+
createImportMeta?: CreateImportMeta
148160
}
149161

150162
export interface VitestVmOptions {

packages/vitest/src/runtime/moduleRunner/startModuleRunner.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type vm from 'node:vm'
22
import type { EvaluatedModules } from 'vite/module-runner'
33
import type { WorkerGlobalState } from '../../types/worker'
44
import type { ExternalModulesExecutor } from '../external-executor'
5+
import type { CreateImportMeta } from './moduleRunner'
56
import fs from 'node:fs'
67
import { isBuiltin } from 'node:module'
78
import { isBareImport } from '@vitest/utils'
@@ -26,6 +27,7 @@ export interface ContextModuleRunnerOptions {
2627
externalModulesExecutor?: ExternalModulesExecutor
2728
state: WorkerGlobalState
2829
spyModule?: typeof import('@vitest/spy')
30+
createImportMeta?: CreateImportMeta
2931
}
3032

3133
const cwd = process.cwd()
@@ -161,6 +163,7 @@ export function startVitestModuleRunner(options: ContextModuleRunnerOptions): Vi
161163
},
162164
getWorkerState: state,
163165
vm,
166+
createImportMeta: options.createImportMeta,
164167
})
165168

166169
// await moduleRunner.import('/@vite/env')

packages/vitest/src/runtime/workers/base.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { ContextModuleRunnerOptions } from '../moduleRunner/startModuleRunn
44
import { runInThisContext } from 'node:vm'
55
import * as spyModule from '@vitest/spy'
66
import { EvaluatedModules } from 'vite/module-runner'
7+
import { createNodeImportMeta } from '../moduleRunner/moduleRunner'
78
import { startVitestModuleRunner } from '../moduleRunner/startModuleRunner'
89
import { run } from '../runBaseTests'
910
import { provideWorkerState } from '../utils'
@@ -52,6 +53,7 @@ export async function runBaseTests(method: 'run' | 'collect', state: WorkerGloba
5253
state,
5354
evaluatedModules: state.evaluatedModules,
5455
spyModule,
56+
createImportMeta: createNodeImportMeta,
5557
})
5658
const fileSpecs = ctx.files.map(f =>
5759
typeof f === 'string'

packages/vitest/src/runtime/workers/vm.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { distDir } from '../../paths'
77
import { createCustomConsole } from '../console'
88
import { ExternalModulesExecutor } from '../external-executor'
99
import { getDefaultRequestStubs } from '../moduleRunner/moduleEvaluator'
10+
import { createNodeImportMeta } from '../moduleRunner/moduleRunner'
1011
import { startVitestModuleRunner, VITEST_VM_CONTEXT_SYMBOL } from '../moduleRunner/startModuleRunner'
1112
import { provideWorkerState } from '../utils'
1213
import { FileMap } from '../vm/file-map'
@@ -80,6 +81,7 @@ export async function runVmTests(method: 'run' | 'collect', state: WorkerGlobalS
8081
evaluatedModules: state.evaluatedModules,
8182
state,
8283
externalModulesExecutor,
84+
createImportMeta: createNodeImportMeta,
8385
})
8486

8587
Object.defineProperty(context, VITEST_VM_CONTEXT_SYMBOL, {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { createRequire } from 'node:module'
2+
import { pathToFileURL } from 'node:url'
3+
import * as vite from 'vite'
4+
import { expect, test } from 'vitest'
5+
6+
const require = createRequire(import.meta.url)
7+
8+
// requires Vite 7.1
9+
const [major, minor] = vite.version.split('.').map(Number)
10+
const supported = (major > 7 || (major === 7 && minor >= 1))
11+
12+
test('import.meta.resolve relative', () => {
13+
try {
14+
expect(import.meta.resolve('./import-meta-resolve.test.ts')).toBe(import.meta.url)
15+
expect(supported).toBe(true)
16+
}
17+
catch (e: any) {
18+
expect(e.message).toContain(`"import.meta.resolve" is not supported`)
19+
expect(supported).toBe(false)
20+
}
21+
})
22+
23+
test('import.meta.resolve package', () => {
24+
try {
25+
const expected = pathToFileURL(require.resolve('react')).href
26+
expect(import.meta.resolve('react')).toBe(expected)
27+
expect(supported).toBe(true)
28+
}
29+
catch (e: any) {
30+
expect(e.message).toContain(`"import.meta.resolve" is not supported`)
31+
expect(supported).toBe(false)
32+
}
33+
})

0 commit comments

Comments
 (0)