From 28599f87e05ca6fafc61955bd0f4767e07597b91 Mon Sep 17 00:00:00 2001 From: lazerg Date: Sat, 8 Aug 2026 05:06:49 +0500 Subject: [PATCH] fix: respect `resolve.preserveSymlinks` when resolving root (fix #23197) --- .../vite/src/node/__tests__/config.spec.ts | 35 +++++++++++++++++++ packages/vite/src/node/config.ts | 8 +++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/__tests__/config.spec.ts b/packages/vite/src/node/__tests__/config.spec.ts index 5cf98adaf2d835..70dd471f31b434 100644 --- a/packages/vite/src/node/__tests__/config.spec.ts +++ b/packages/vite/src/node/__tests__/config.spec.ts @@ -2017,6 +2017,41 @@ describe('loadConfigFromFile', () => { }) }) +describe('root resolution', () => { + const tmpBase = path.join(os.tmpdir(), 'vite-root-test') + + afterEach(() => { + if (fs.existsSync(tmpBase)) { + fs.rmSync(tmpBase, { recursive: true, force: true }) + } + }) + + test('resolves a symlinked root to its real path', async () => { + const realDir = path.join(tmpBase, 'realpath', 'real') + const linkDir = path.join(tmpBase, 'realpath', 'link') + fs.mkdirSync(realDir, { recursive: true }) + fs.symlinkSync(realDir, linkDir, 'junction') + + const config = await resolveConfig({ root: linkDir }, 'serve') + + expect(config.root).toBe(normalizePath(fs.realpathSync.native(realDir))) + }) + + test('keeps a symlinked root when resolve.preserveSymlinks is true', async () => { + const realDir = path.join(tmpBase, 'preserve-symlinks', 'real') + const linkDir = path.join(tmpBase, 'preserve-symlinks', 'link') + fs.mkdirSync(realDir, { recursive: true }) + fs.symlinkSync(realDir, linkDir, 'junction') + + const config = await resolveConfig( + { root: linkDir, resolve: { preserveSymlinks: true } }, + 'serve', + ) + + expect(config.root).toBe(normalizePath(linkDir)) + }) +}) + describe('resolveServerOptions', () => { const warnFn = vi.fn() const logger = { warn: warnFn } as unknown as Logger diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 9fee3e59a93c77..fa3b5194188358 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -1600,9 +1600,11 @@ export async function resolveConfig( let nonNormalizedResolvedRoot = config.root ? path.resolve(config.root) : process.cwd() - try { - nonNormalizedResolvedRoot = safeRealpathSync(nonNormalizedResolvedRoot) - } catch {} + if (!config.resolve?.preserveSymlinks) { + try { + nonNormalizedResolvedRoot = safeRealpathSync(nonNormalizedResolvedRoot) + } catch {} + } const resolvedRoot = normalizePath(nonNormalizedResolvedRoot) checkBadCharactersInPath(