From df1b39fc0199a679c31240fa997c1b60fa638fff Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sat, 18 Jul 2026 02:28:07 +0300 Subject: [PATCH] fix(rsc): generate sourcemaps for code transforms --- packages/plugin-rsc/e2e/sourcemap.test.ts | 25 +++++++++++++++++++++++ packages/plugin-rsc/src/plugin.ts | 25 +++++++++++++++++------ 2 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 packages/plugin-rsc/e2e/sourcemap.test.ts 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 86cbba631..f3a7cddeb 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -334,7 +334,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' }), + } } }, }, @@ -1241,11 +1246,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 }, @@ -1390,13 +1399,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' }), + } } }, },