Open dmaretskyi opened 3 days ago
For the bug to trigger it seems to be essential to have a package from node_modules in the bundle. Just bundling two local source files together does not repro the bug
I've started debugging this...
It seems like the source file paths get corrupted when the source map is loaded
After doing a dump with VITE_NODE_DEBUG_DUMP=1
it seems like those modules have broken source maps
I've traced it down to vite's source map combining code. The actual source positions are correct, but something corrupts the source paths
This looks similar to https://github.com/vitest-dev/vitest/issues/5523. Workaround is to prevent Vitest/Vite from processing already bundled pkg-a
and you can do that by configuring test.server.deps.external
. I don't think Vite currently has a way to read existing dist.js.map
and use it for remapping during own transform.
// pkg-b/vitest.config.ts
import { defineConfig } from "vitest/config"
export default defineConfig({
test: {
server: {
deps: {
external: [/pkg-a/],
}
}
}
})
With this config, I see this error on Vitest:
FAIL index.test.js > repro
Error: Test error
❯ Module.foo ../pkg-a/index.js:5:9
❯ index.test.js:5:3
Looks like bug in Vite. map.sources
are incorrect when file is SSR transformed.
Error: Test error
❯ Module.foo ../node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js:5:9
^^^ This is pkg-a/index.js, not contents of base32-decode
I renamed pkg-a/index.js
to pkg-a/pkg-a-entrypoint.js
here to make it unique from index.js
.
When we request the pkg-a
here, we get following. Notice the "...base32-decode/pkg-a-entrypoint.js"
part:
console.log(result.map.sources);
> {
> "sources": [
> "../node_modules/.pnpm/base32-decode@1.0.0/node_modules/node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js",
> "../node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/pkg-a-entrypoint.js"
> ],
> ...
> }
Minimal repro without Vitest:
import { createServer } from "vite";
const server = await createServer();
await server.listen();
const ssrResult = await server.transformRequest(
"/Users/x/vitest-sourcemap-bug/pkg-a/dist.js",
{ ssr: true }
);
console.log(ssrResult.map);
/*
sources: [
'../node_modules/.pnpm/base32-decode@1.0.0/node_modules/node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js',
'../node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/pkg-a-entrypoint.js'
],
file: '/Users/x/vitest-sourcemap-bug/pkg-a/dist.js'
*/
// Without SSR:
const webResult = await server.transformRequest(
"/Users/x/vitest-sourcemap-bug/pkg-a/dist.js",
{ ssr: false }
);
console.log(webResult.map);
/*
sources: [
'../node_modules/.pnpm/base32-decode@1.0.0/node_modules/base32-decode/index.js',
'pkg-a-entrypoint.js'
],
*/
server.close();
If I manually fix the path in vite-node
we get proper stack trace in errror:
FAIL index.test.js > repro
Error: Test error
❯ Module.foo ../pkg-a/pkg-a-entrypoint.js:5:9
❯ index.test.js:5:3
3|
4| test("repro", () => {
5| foo();
| ^
6| });
7|
I'll create upstream bug for this.
I just ran into this yesterday, and this bug is very timely! Just a "me, too." Keep up the good work!
Describe the bug
I have a workspace with two packages:
pkg-a
build a bundle of its own code and packages from node_modulespkg-b
runs test from vitest that import code frompkg-a
The sourcemaps for errors thrown from inside
pkg-a
report incorrect source locations:Running similar code in node JS produces the correct stack trace:
Reproduction
https://github.com/dmaretskyi/vitest-sourcemap-bug
See README for repro steps
System Info
Used Package Manager
pnpm
Validations