Skip to content

Commit 1aee13a

Browse files
authored
feat(vitest): allow using unprocessed environment files (#4098)
1 parent 01e01bf commit 1aee13a

File tree

6 files changed

+49
-18
lines changed

6 files changed

+49
-18
lines changed

Diff for: packages/vitest/src/integrations/env/index.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { pathToFileURL } from 'node:url'
21
import { normalize, resolve } from 'pathe'
32
import { resolvePath } from 'mlly'
3+
import { ViteNodeRunner } from 'vite-node/client'
4+
import type { ViteNodeRunnerOptions } from 'vite-node'
45
import type { BuiltinEnvironment, VitestEnvironment } from '../../types/config'
56
import type { Environment } from '../../types'
67
import node from './node'
@@ -35,13 +36,26 @@ export function getEnvPackageName(env: VitestEnvironment) {
3536
return `vitest-environment-${env}`
3637
}
3738

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> {
3951
if (isBuiltinEnvironment(name))
4052
return environments[name]
53+
const loader = await createEnvironmentLoader(options)
54+
const root = loader.root
4155
const packageId = name[0] === '.' || name[0] === '/'
4256
? resolve(root, name)
4357
: 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))
4559
if (!pkg || !pkg.default || typeof pkg.default !== 'object') {
4660
throw new TypeError(
4761
`Environment "${name}" is not a valid environment. `

Diff for: packages/vitest/src/runtime/child.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ async function init(ctx: ChildContext) {
2222
setCancel = resolve
2323
})
2424

25-
const rpc = createBirpc<RuntimeRPC, RunnerRPC>(
25+
const rpc = createSafeRpc(createBirpc<RuntimeRPC, RunnerRPC>(
2626
{
2727
onCancel: setCancel,
2828
},
@@ -35,9 +35,14 @@ async function init(ctx: ChildContext) {
3535
},
3636
on(fn) { process.on('message', fn) },
3737
},
38-
)
38+
))
3939

40-
const environment = await loadEnvironment(ctx.environment.name, ctx.config.root)
40+
const environment = await loadEnvironment(ctx.environment.name, {
41+
root: ctx.config.root,
42+
fetchModule(id) {
43+
return rpc.fetch(id, 'ssr')
44+
},
45+
})
4146
if (ctx.environment.transformMode)
4247
environment.transformMode = ctx.environment.transformMode
4348

@@ -52,7 +57,7 @@ async function init(ctx: ChildContext) {
5257
environment: 0,
5358
prepare: performance.now(),
5459
},
55-
rpc: createSafeRpc(rpc),
60+
rpc,
5661
}
5762

5863
// @ts-expect-error I know what I am doing :P

Diff for: packages/vitest/src/runtime/vm.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export async function run(ctx: WorkerContext) {
2626
setCancel = resolve
2727
})
2828

29-
const rpc = createBirpc<RuntimeRPC>(
29+
const rpc = createSafeRpc(createBirpc<RuntimeRPC>(
3030
{
3131
onCancel: setCancel,
3232
},
@@ -35,9 +35,14 @@ export async function run(ctx: WorkerContext) {
3535
post(v) { port.postMessage(v) },
3636
on(fn) { port.addListener('message', fn) },
3737
},
38-
)
38+
))
3939

40-
const environment = await loadEnvironment(ctx.environment.name, ctx.config.root)
40+
const environment = await loadEnvironment(ctx.environment.name, {
41+
root: ctx.config.root,
42+
fetchModule(id) {
43+
return rpc.fetch(id, 'ssr')
44+
},
45+
})
4146

4247
if (!environment.setupVM) {
4348
const envName = ctx.environment.name
@@ -59,7 +64,7 @@ export async function run(ctx: WorkerContext) {
5964
environment: performance.now(),
6065
prepare: performance.now(),
6166
},
62-
rpc: createSafeRpc(rpc),
67+
rpc,
6368
}
6469

6570
installSourcemapsSupport({

Diff for: packages/vitest/src/runtime/worker.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ async function init(ctx: WorkerContext) {
2424
setCancel = resolve
2525
})
2626

27-
const rpc = createBirpc<RuntimeRPC, RunnerRPC>(
27+
const rpc = createSafeRpc(createBirpc<RuntimeRPC, RunnerRPC>(
2828
{
2929
onCancel: setCancel,
3030
},
@@ -33,9 +33,14 @@ async function init(ctx: WorkerContext) {
3333
post(v) { port.postMessage(v) },
3434
on(fn) { port.addListener('message', fn) },
3535
},
36-
)
36+
))
3737

38-
const environment = await loadEnvironment(ctx.environment.name, ctx.config.root)
38+
const environment = await loadEnvironment(ctx.environment.name, {
39+
root: ctx.config.root,
40+
fetchModule(id) {
41+
return rpc.fetch(id, 'ssr')
42+
},
43+
})
3944
if (ctx.environment.transformMode)
4045
environment.transformMode = ctx.environment.transformMode
4146

@@ -50,7 +55,7 @@ async function init(ctx: WorkerContext) {
5055
environment: 0,
5156
prepare: performance.now(),
5257
},
53-
rpc: createSafeRpc(rpc),
58+
rpc,
5459
}
5560

5661
// @ts-expect-error I know what I am doing :P

Diff for: test/env-custom/vitest-environment-custom/index.mjs renamed to test/env-custom/vitest-environment-custom/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import vm from 'node:vm'
2+
import type { Environment } from 'vitest'
23

3-
export default {
4+
export default <Environment>{
45
name: 'custom',
56
transformMode: 'ssr',
67
setupVM({ custom }) {

Diff for: test/env-custom/vitest-environment-custom/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"name": "vitest-environment-custom",
33
"private": true,
44
"exports": {
5-
".": "./index.mjs"
6-
}
5+
".": "./index.ts"
6+
},
7+
"main": "index.ts"
78
}

0 commit comments

Comments
 (0)