diff --git a/packages/vite/src/node/__tests__/config.spec.ts b/packages/vite/src/node/__tests__/config.spec.ts index 6ccbe75f421c27..85737eafe3f8fb 100644 --- a/packages/vite/src/node/__tests__/config.spec.ts +++ b/packages/vite/src/node/__tests__/config.spec.ts @@ -6,7 +6,7 @@ import type { InlineConfig, PluginOption } from '..' import type { UserConfig, UserConfigExport } from '../config' import { defineConfig, loadConfigFromFile, resolveConfig } from '../config' import { resolveEnvPrefix } from '../env' -import { mergeConfig } from '../utils' +import { hasBothRollupOptionsAndRolldownOptions, mergeConfig } from '../utils' import { createLogger } from '../logger' describe('mergeConfig', () => { @@ -560,6 +560,46 @@ describe('mergeConfig', () => { expect(downOutput.hashCharacters).toBe('base36') }) + test('hasBothRollupOptionsAndRolldownOptions returns false when only rollupOptions is set', () => { + // When mergeConfig is called with only rollupOptions in the override, + // setupRollupOptionCompat creates a proxy where rollupOptions === rolldownOptions. + // hasBothRollupOptionsAndRolldownOptions should return false in this case + // to avoid false positive warnings. + const baseConfig = defineConfig({ + build: {}, // Need existing build object for recursive merge to happen + }) + const newConfig = defineConfig({ + build: { + rollupOptions: { + treeshake: false, + }, + }, + }) + const mergedConfig: UserConfig = mergeConfig(baseConfig, newConfig) + + expect(mergedConfig.build!.rollupOptions).toBeDefined() + expect(mergedConfig.build!.rolldownOptions).toBeDefined() + expect(mergedConfig.build!.rollupOptions).toBe( + mergedConfig.build!.rolldownOptions, + ) + + expect(hasBothRollupOptionsAndRolldownOptions(mergedConfig)).toBe(false) + }) + + test('hasBothRollupOptionsAndRolldownOptions returns true when both are explicitly set to different values', () => { + const config = defineConfig({ + build: { + rollupOptions: { + treeshake: false, + }, + rolldownOptions: { + platform: 'neutral', + }, + }, + }) + expect(hasBothRollupOptionsAndRolldownOptions(config)).toBe(true) + }) + test('rollupOptions/rolldownOptions.platform', async () => { const testRollupOptions = await resolveConfig( { diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 52ba8b067c1609..8576b8e2b05261 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -1317,7 +1317,9 @@ export function hasBothRollupOptionsAndRolldownOptions( if ( opt != null && opt.rollupOptions != null && - opt.rolldownOptions != null + opt.rolldownOptions != null && + // Check they are not just proxy values created by setupRollupOptionCompat + opt.rollupOptions !== opt.rolldownOptions ) { return true }