From a74c946e4e80d43bec78efdae8ecf53397ddf2a2 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 14 Aug 2025 00:20:09 +0900 Subject: [PATCH 1/3] fix(rsc): fix custom `root` --- packages/plugin-rsc/src/plugin.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index 54365be47..cf07f08ab 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -165,6 +165,9 @@ export function vitePluginRscMinimal( }, configResolved(config_) { config = config_ + for (const e of Object.values(config.environments)) { + e.build.outDir = path.resolve(config.root, e.build.outDir) + } }, configureServer(server_) { server = server_ From 982e6b22a9b493c6163bf3972beddf24e2e34db5 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 14 Aug 2025 11:16:40 +0900 Subject: [PATCH 2/3] chore: comment --- packages/plugin-rsc/src/plugin.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/plugin-rsc/src/plugin.ts b/packages/plugin-rsc/src/plugin.ts index cf07f08ab..68fdcce83 100644 --- a/packages/plugin-rsc/src/plugin.ts +++ b/packages/plugin-rsc/src/plugin.ts @@ -165,6 +165,8 @@ export function vitePluginRscMinimal( }, configResolved(config_) { config = config_ + // ensure outDir is fully resolved to take custom root into account + // https://github.com/vitejs/vite/blob/946831f986cb797009b8178659d2b31f570c44ff/packages/vite/src/node/build.ts#L574 for (const e of Object.values(config.environments)) { e.build.outDir = path.resolve(config.root, e.build.outDir) } From c0ef3e4b1df984a37b89681aabcde7fe1f49c1a0 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Thu, 14 Aug 2025 11:38:21 +0900 Subject: [PATCH 3/3] test: add e2e --- packages/plugin-rsc/e2e/root.test.ts | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 packages/plugin-rsc/e2e/root.test.ts diff --git a/packages/plugin-rsc/e2e/root.test.ts b/packages/plugin-rsc/e2e/root.test.ts new file mode 100644 index 000000000..ae59a95de --- /dev/null +++ b/packages/plugin-rsc/e2e/root.test.ts @@ -0,0 +1,47 @@ +import { test } from '@playwright/test' +import { setupInlineFixture, useFixture } from './fixture' +import { defineStarterTest } from './starter' +import fs from 'node:fs' +import path from 'node:path' + +test.describe(() => { + const root = 'examples/e2e/temp/root' + + test.beforeAll(async () => { + await setupInlineFixture({ + src: 'examples/starter', + dest: root, + files: { + 'vite.config.base.ts': { cp: 'vite.config.ts' }, + 'vite.config.ts': /* js */ ` + import baseConfig from './vite.config.base.ts' + import path from "node:path"; + baseConfig.root = "./custom-root"; + for (const e of Object.values(baseConfig.environments)) { + e.build.rollupOptions.input.index = path.resolve( + 'custom-root', + e.build.rollupOptions.input.index, + ); + } + export default baseConfig; + `, + }, + }) + fs.mkdirSync(`${root}/custom-root`, { recursive: true }) + fs.renameSync(`${root}/src`, `${root}/custom-root/src`) + fs.renameSync(`${root}/public`, `${root}/custom-root/public`) + }) + + test.describe('dev-root', () => { + const f = useFixture({ root, mode: 'dev' }) + const oldCreateEditor = f.createEditor + f.createEditor = (filePath: string) => + oldCreateEditor(path.resolve(root, 'custom-root', filePath)) + defineStarterTest(f) + }) + + test.describe('build-root', () => { + const f = useFixture({ root, mode: 'build' }) + defineStarterTest(f) + }) +})