diff --git a/packages/vite-node/README.md b/packages/vite-node/README.md index 6b03ba8729e3..833fd46503df 100644 --- a/packages/vite-node/README.md +++ b/packages/vite-node/README.md @@ -74,17 +74,13 @@ const node = new ViteNodeServer(server) const runner = new ViteNodeRunner({ root: server.config.root, base: server.config.base, + fixStackTrace: true, // when having the server and runner in a different context, // you will need to handle the communication between them // and pass to this function fetchModule(id) { return node.fetchModule(id) }, - // fixes stacktrace in Errors and console.trace calls - // has to be syncronouse - getSourceMap(source) { - return node.getSourceMap(source) - }, resolveId(id, importer) { return node.resolveId(id, importer) }, diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index 99d04a54353b..1168fda3baaa 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -61,15 +61,13 @@ async function run(files: string[], options: CliOptions = {}) { const runner = new ViteNodeRunner({ root: server.config.root, base: server.config.base, + fixStackTrace: true, fetchModule(id) { return node.fetchModule(id) }, resolveId(id, importer) { return node.resolveId(id, importer) }, - getSourceMap(source) { - return node.getSourceMap(source) - }, createHotContext(runner, url) { return createHotContext(runner, server.emitter, files, url) }, diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index 5b08b1c4207c..f96401501ab2 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -127,10 +127,11 @@ export class ViteNodeRunner { this.root = options.root ?? process.cwd() this.moduleCache = options.moduleCache ?? new ModuleCacheMap() this.debug = options.debug ?? (typeof process !== 'undefined' ? !!process.env.VITE_NODE_DEBUG_RUNNER : false) + this.options.fixStackTrace ??= true - if (options.getSourceMap) { + if (this.options.fixStackTrace) { installSourcemapsSupport({ - getSourceMap: options.getSourceMap, + getSourceMap: this.options.getSourceMap ?? (id => this.getSourceMap(id)), }) } } @@ -143,6 +144,20 @@ export class ViteNodeRunner { return await this.cachedRequest(id, []) } + getSourceMap(id: string) { + const fsPath = this.moduleCache.normalizePath(id) + const cache = this.moduleCache.get(fsPath) + if (cache.map) + return cache.map + const mapString = cache?.code?.match(/\/\/# sourceMappingURL=data:application\/json;charset=utf-8;base64,(.+)/)?.[1] + if (mapString) { + const map = JSON.parse(Buffer.from(mapString, 'base64').toString('utf-8')) + cache.map = map + return map + } + return null + } + /** @internal */ async cachedRequest(rawId: string, callstack: string[]) { const id = normalizeRequestId(rawId, this.options.base) diff --git a/packages/vite-node/src/types.ts b/packages/vite-node/src/types.ts index de1422ae4460..61b8f78532ce 100644 --- a/packages/vite-node/src/types.ts +++ b/packages/vite-node/src/types.ts @@ -56,6 +56,7 @@ export interface ViteNodeRunnerOptions { root: string fetchModule: FetchFunction resolveId?: ResolveIdFunction + fixStackTrace?: boolean getSourceMap?: (id: string) => RawSourceMap | null | undefined createHotContext?: CreateHotContextFunction base?: string diff --git a/packages/vitest/src/runtime/worker.ts b/packages/vitest/src/runtime/worker.ts index 4496004f2f21..ba56802dcb94 100644 --- a/packages/vitest/src/runtime/worker.ts +++ b/packages/vitest/src/runtime/worker.ts @@ -48,21 +48,9 @@ async function startViteNode(ctx: WorkerContext) { resolveId(id, importer) { return rpc().resolveId(id, importer) }, - getSourceMap(source) { - const fsPath = moduleCache.normalizePath(source) - const cache = moduleCache.get(fsPath) - if (cache.map) - return cache.map - const mapString = cache?.code?.match(/\/\/# sourceMappingURL=data:application\/json;charset=utf-8;base64,(.+)/)?.[1] - if (mapString) { - const map = JSON.parse(Buffer.from(mapString, 'base64').toString('utf-8')) - cache.map = map - return map - } - return null - }, moduleCache, mockMap, + fixStackTrace: true, interopDefault: config.deps.interopDefault ?? true, root: config.root, base: config.base,