diff --git a/packages/plugin-rsc/e2e/sourcemap.test.ts b/packages/plugin-rsc/e2e/sourcemap.test.ts new file mode 100644 index 000000000..a4dd4cefd --- /dev/null +++ b/packages/plugin-rsc/e2e/sourcemap.test.ts @@ -0,0 +1,25 @@ +import { expect, test } from '@playwright/test' +import { x } from 'tinyexec' +import { setupInlineFixture } from './fixture' + +test.describe('sourcemap', () => { + const root = 'examples/e2e/temp/sourcemap' + + test.beforeAll(async () => { + await setupInlineFixture({ + src: 'examples/starter', + dest: root, + }) + }) + + test('build without broken sourcemap warnings', async () => { + const result = await x('pnpm', ['build', '--sourcemap'], { + nodeOptions: { cwd: root }, + }) + + expect(result.exitCode).toBe(0) + expect(result.stdout + result.stderr).not.toContain( + 'Sourcemap is likely to be incorrect', + ) + }) +}) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index a87a471ee..b8df86b3a 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -331,7 +331,12 @@ export function vitePluginRscMinimal( if (code.includes('__vite_rsc_raw_import__')) { // inject dynamic import last to avoid Vite adding `?import` query // to client references (and browser mode server references) - return code.replace('__vite_rsc_raw_import__', 'import') + const output = new MagicString(code) + output.replace('__vite_rsc_raw_import__', 'import') + return { + code: output.toString(), + map: output.generateMap({ hires: 'boundary' }), + } } }, }, @@ -1247,11 +1252,15 @@ export function createRpcClient(params) { BUILD_ASSETS_MANIFEST_NAME, ), ) - code = code.replaceAll( + const output = new MagicString(code) + output.replaceAll( 'virtual:vite-rsc/assets-manifest', () => replacement, ) - return { code } + return { + code: output.toString(), + map: output.generateMap({ hires: 'boundary' }), + } } return }, @@ -1396,13 +1405,17 @@ function globalAsyncLocalStoragePlugin(): Plugin[] { !code.includes('__viteRscAsyncHooks') ) { // for build, we cannot use `import` as it confuses rollup commonjs plugin. - return ( + const output = new MagicString(code) + output.prepend( (this.environment.mode === 'build' && !isRolldownVite ? `const __viteRscAsyncHooks = require("node:async_hooks");` : `import * as __viteRscAsyncHooks from "node:async_hooks";`) + - `globalThis.AsyncLocalStorage = __viteRscAsyncHooks.AsyncLocalStorage;` + - code + `globalThis.AsyncLocalStorage = __viteRscAsyncHooks.AsyncLocalStorage;`, ) + return { + code: output.toString(), + map: output.generateMap({ hires: 'boundary' }), + } } }, },