|
1 |
| -import { pathToFileURL } from 'node:url' |
2 | 1 | import { normalize, resolve } from 'pathe'
|
3 | 2 | import { resolvePath } from 'mlly'
|
| 3 | +import { ViteNodeRunner } from 'vite-node/client' |
| 4 | +import type { ViteNodeRunnerOptions } from 'vite-node' |
4 | 5 | import type { BuiltinEnvironment, VitestEnvironment } from '../../types/config'
|
5 | 6 | import type { Environment } from '../../types'
|
6 | 7 | import node from './node'
|
@@ -35,13 +36,26 @@ export function getEnvPackageName(env: VitestEnvironment) {
|
35 | 36 | return `vitest-environment-${env}`
|
36 | 37 | }
|
37 | 38 |
|
38 |
| -export async function loadEnvironment(name: VitestEnvironment, root: string): Promise<Environment> { |
| 39 | +const _loaders = new Map<string, ViteNodeRunner>() |
| 40 | + |
| 41 | +export async function createEnvironmentLoader(options: ViteNodeRunnerOptions) { |
| 42 | + if (!_loaders.has(options.root)) { |
| 43 | + const loader = new ViteNodeRunner(options) |
| 44 | + await loader.executeId('/@vite/env') |
| 45 | + _loaders.set(options.root, loader) |
| 46 | + } |
| 47 | + return _loaders.get(options.root)! |
| 48 | +} |
| 49 | + |
| 50 | +export async function loadEnvironment(name: VitestEnvironment, options: ViteNodeRunnerOptions): Promise<Environment> { |
39 | 51 | if (isBuiltinEnvironment(name))
|
40 | 52 | return environments[name]
|
| 53 | + const loader = await createEnvironmentLoader(options) |
| 54 | + const root = loader.root |
41 | 55 | const packageId = name[0] === '.' || name[0] === '/'
|
42 | 56 | ? resolve(root, name)
|
43 | 57 | : await resolvePath(`vitest-environment-${name}`, { url: [root] }) ?? resolve(root, name)
|
44 |
| - const pkg = await import(pathToFileURL(normalize(packageId)).href) |
| 58 | + const pkg = await loader.executeId(normalize(packageId)) |
45 | 59 | if (!pkg || !pkg.default || typeof pkg.default !== 'object') {
|
46 | 60 | throw new TypeError(
|
47 | 61 | `Environment "${name}" is not a valid environment. `
|
|
0 commit comments