From 58941229bbf8a48fb42555e7d12e8175324aab4c Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Mon, 17 Jan 2022 13:20:31 +0300 Subject: [PATCH] feat: add resolveId to vite-node --- packages/vite-node/src/server.ts | 6 +++++- packages/vite-node/src/types.ts | 10 ++++++++++ packages/vitest/src/node/pool.ts | 3 +++ packages/vitest/src/runtime/worker.ts | 3 +++ packages/vitest/src/types/worker.ts | 3 +++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/vite-node/src/server.ts b/packages/vite-node/src/server.ts index c1d3486e37f8..0436ca7c7541 100644 --- a/packages/vite-node/src/server.ts +++ b/packages/vite-node/src/server.ts @@ -1,6 +1,6 @@ import type { TransformResult, ViteDevServer } from 'vite' import { shouldExternalize } from './externalize' -import type { ViteNodeServerOptions } from './types' +import type { ViteNodeResolveId, ViteNodeServerOptions } from './types' import { toFilePath } from './utils' export * from './externalize' @@ -28,6 +28,10 @@ export class ViteNodeServer { return { code: r?.code } } + async resolveId(id: string, importer?: string): Promise { + return this.server.pluginContainer.resolveId(id, importer, { ssr: true }) + } + async transformRequest(id: string) { // reuse transform for concurrent requests if (!this.promiseMap.has(id)) { diff --git a/packages/vite-node/src/types.ts b/packages/vite-node/src/types.ts index f9ba4b00ea75..6703f34584d9 100644 --- a/packages/vite-node/src/types.ts +++ b/packages/vite-node/src/types.ts @@ -5,6 +5,7 @@ export interface ExternalizeOptions { } export type FetchFunction = (id: string) => Promise<{ code?: string; externalize?: string }> +export type ResolveIdFunction = (id: string, importer?: string) => Promise export interface ModuleCache { promise?: Promise @@ -14,6 +15,7 @@ export interface ModuleCache { export interface ViteNodeRunnerOptions { fetchModule: FetchFunction + resolveId: ResolveIdFunction root: string base?: string moduleCache?: Map @@ -21,6 +23,14 @@ export interface ViteNodeRunnerOptions { requestStubs?: Record } +export interface ViteNodeResolveId { + external?: boolean | 'absolute' | 'relative' + id: string + meta?: Record | null + moduleSideEffects?: boolean | 'no-treeshake' | null + syntheticNamedExports?: boolean | string | null +} + export interface ViteNodeServerOptions { deps?: ExternalizeOptions transformMode?: { diff --git a/packages/vitest/src/node/pool.ts b/packages/vitest/src/node/pool.ts index 439a1fbdf5b1..6b32a6397b8e 100644 --- a/packages/vitest/src/node/pool.ts +++ b/packages/vitest/src/node/pool.ts @@ -124,6 +124,9 @@ function createChannel(ctx: Vitest) { fetch(id) { return ctx.vitenode.fetchModule(id) }, + resolveId(id, importer) { + return ctx.vitenode.resolveId(id, importer) + }, onCollected(files) { ctx.state.collectFiles(files) ctx.report('onCollected', files) diff --git a/packages/vitest/src/runtime/worker.ts b/packages/vitest/src/runtime/worker.ts index 1e08bedc5102..a598435b0076 100644 --- a/packages/vitest/src/runtime/worker.ts +++ b/packages/vitest/src/runtime/worker.ts @@ -37,6 +37,9 @@ async function startViteNode(ctx: WorkerContext) { fetchModule(id) { return rpc().fetch(id) }, + resolveId(id, importer) { + return rpc().resolveId(id, importer) + }, moduleCache, mockMap, interpretDefault: config.deps.interpretDefault ?? true, diff --git a/packages/vitest/src/types/worker.ts b/packages/vitest/src/types/worker.ts index ce7e2eee8e63..a89233d31519 100644 --- a/packages/vitest/src/types/worker.ts +++ b/packages/vitest/src/types/worker.ts @@ -1,5 +1,6 @@ import type { MessagePort } from 'worker_threads' import type { RawSourceMap } from 'source-map-js' +import type { ViteNodeResolveId } from 'vite-node' import type { ResolvedConfig } from './config' import type { File, TaskResultPack } from './tasks' import type { SnapshotResult } from './snapshot' @@ -13,9 +14,11 @@ export interface WorkerContext { } export type FetchFunction = (id: string) => Promise<{ code?: string; externalize?: string }> +export type ResolveIdFunction = (id: string, importer?: string) => Promise export interface WorkerRPC { fetch: FetchFunction + resolveId: ResolveIdFunction getSourceMap: (id: string, force?: boolean) => Promise onWorkerExit: (code?: number) => void