From 8aa252121311f9020561050a3c2faacc0d4676ee Mon Sep 17 00:00:00 2001 From: Blake Newman Date: Mon, 9 Jun 2025 11:59:14 +0100 Subject: [PATCH] fix(vite-node): unable to handle errors where sourcemap mapping empty (#8071) Co-authored-by: Hiroshi Ogawa --- packages/vite-node/src/source-map-handler.ts | 5 +++-- test/vite-node/src/empty-mappings/main.ts | 2 ++ test/vite-node/src/empty-mappings/vite.config.ts | 14 ++++++++++++++ test/vite-node/test/cli.test.ts | 6 ++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 test/vite-node/src/empty-mappings/main.ts create mode 100644 test/vite-node/src/empty-mappings/vite.config.ts diff --git a/packages/vite-node/src/source-map-handler.ts b/packages/vite-node/src/source-map-handler.ts index 724013e09..533357efa 100644 --- a/packages/vite-node/src/source-map-handler.ts +++ b/packages/vite-node/src/source-map-handler.ts @@ -177,10 +177,11 @@ function mapSourcePosition(position: OriginalMapping) { if (!sourceMap) { // Call the (overridable) retrieveSourceMap function to get the source map. const urlAndMap = retrieveSourceMap(position.source) - if (urlAndMap && urlAndMap.map) { + const map = urlAndMap && urlAndMap.map + if (map && !(typeof map === 'object' && 'mappings' in map && map.mappings === '')) { sourceMap = sourceMapCache[position.source] = { url: urlAndMap.url, - map: new TraceMap(urlAndMap.map), + map: new TraceMap(map), } // Load all sources stored inline with the source map into the file cache diff --git a/test/vite-node/src/empty-mappings/main.ts b/test/vite-node/src/empty-mappings/main.ts new file mode 100644 index 000000000..94b611d2d --- /dev/null +++ b/test/vite-node/src/empty-mappings/main.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-console +console.log(new Error('[ok]').stack) diff --git a/test/vite-node/src/empty-mappings/vite.config.ts b/test/vite-node/src/empty-mappings/vite.config.ts new file mode 100644 index 000000000..8d7d10f96 --- /dev/null +++ b/test/vite-node/src/empty-mappings/vite.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [ + { + name: 'repro', + transform(code, id) { + if (id.endsWith('/empty-mappings/main.ts')) { + return { code, map: { mappings: '' } } + } + }, + }, + ], +}) diff --git a/test/vite-node/test/cli.test.ts b/test/vite-node/test/cli.test.ts index de28516c8..3e496d54d 100644 --- a/test/vite-node/test/cli.test.ts +++ b/test/vite-node/test/cli.test.ts @@ -74,3 +74,9 @@ it('buildStart with all ssr', async () => { ) await result.viteNode.waitForStdout('["buildStart:in","buildStart:out"]') }) + +it('empty mappings', async () => { + const root = resolve(__dirname, '../src/empty-mappings') + const result = await runViteNodeCli('--root', root, resolve(root, 'main.ts')) + await result.viteNode.waitForStdout('[ok]') +}) -- 2.51.2