diff --git a/packages/vite/src/node/__tests__/config.spec.ts b/packages/vite/src/node/__tests__/config.spec.ts index 5cf98adaf2d835..5e9d809365d728 100644 --- a/packages/vite/src/node/__tests__/config.spec.ts +++ b/packages/vite/src/node/__tests__/config.spec.ts @@ -2017,6 +2017,28 @@ describe('loadConfigFromFile', () => { }) }) +describe('root resolution', () => { + const fixtureRoot = path.resolve( + import.meta.dirname, + './fixtures/config/root-resolution', + ) + const realDir = path.join(fixtureRoot, 'real') + const linkDir = path.join(fixtureRoot, 'link') + + test('resolves a symlinked root to its real path', async () => { + 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 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/__tests__/fixtures/config/root-resolution/link b/packages/vite/src/node/__tests__/fixtures/config/root-resolution/link new file mode 120000 index 00000000000000..ac558a3e1bf444 --- /dev/null +++ b/packages/vite/src/node/__tests__/fixtures/config/root-resolution/link @@ -0,0 +1 @@ +real \ No newline at end of file diff --git a/packages/vite/src/node/__tests__/fixtures/config/root-resolution/real/.gitkeep b/packages/vite/src/node/__tests__/fixtures/config/root-resolution/real/.gitkeep new file mode 100644 index 00000000000000..8b137891791fe9 --- /dev/null +++ b/packages/vite/src/node/__tests__/fixtures/config/root-resolution/real/.gitkeep @@ -0,0 +1 @@ + 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(