From a9764c24c8818e5ccfb2e28f8deffe8d0db57361 Mon Sep 17 00:00:00 2001 From: Abdel <62770500+hktitof@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:21:21 +0000 Subject: [PATCH 1/3] fix: merge `build.rolldownOptions.output.minify` correctly setting `build.rolldownOptions.output.minify` overrode the whole value instead of being merged, so a partial object dropped the defaults vite computes for es lib builds and lost the codegen: false guard that keeps pure annotations intact for tree shaking move the resolved value after the user spread and merge it like output.comments, a boolean still wins over the computed default and partial objects keep the defaults same invariant as #23514, applied to output.minify --- .../vite/src/node/__tests__/build.spec.ts | 54 +++++++++++++++++++ packages/vite/src/node/build.ts | 35 +++++++----- 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index c194760f856866..41d9c3911f059b 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -558,6 +558,60 @@ describe('resolveBuildOutputs', () => { ) }) }) + + describe('output minify and comments resolution in resolveRolldownOptions', () => { + const buildProjectRoot = resolve(dirname, 'packages/build-project') + + test('merges a partial output.minify object with the lib defaults', async () => { + const builder = await createBuilder({ + root: buildProjectRoot, + logLevel: 'silent', + build: { + minify: 'oxc', + lib: { ...baseLibOptions, formats: ['es'] }, + rolldownOptions: { + output: { + minify: { mangle: { props: true } }, + }, + }, + }, + }) + const options = resolveRolldownOptions( + builder.environments.client, + new ChunkMetadataMap(), + ) + const outputs = options.output as OutputOptions | OutputOptions[] + const output = Array.isArray(outputs) ? outputs[0] : outputs + expect(output.minify).toStrictEqual({ + compress: true, + mangle: { props: true }, + codegen: false, + }) + }) + + test('keeps an explicit boolean output.minify untouched', async () => { + const builder = await createBuilder({ + root: buildProjectRoot, + logLevel: 'silent', + build: { + minify: 'oxc', + lib: { ...baseLibOptions, formats: ['es'] }, + rolldownOptions: { + output: { + minify: false, + }, + }, + }, + }) + const options = resolveRolldownOptions( + builder.environments.client, + new ChunkMetadataMap(), + ) + const outputs = options.output as OutputOptions | OutputOptions[] + const output = Array.isArray(outputs) ? outputs[0] : outputs + expect(output.minify).toBe(false) + }) + }) }) describe('resolveLibFilename', () => { diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 63ff50e34c85ba..224e357990b38c 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -747,6 +747,20 @@ export function resolveRolldownOptions( findNearestPackageData(root, packageCache)?.data.type, ) : 'js' + const resolvedMinify = + options.minify === 'oxc' + ? libOptions && (format === 'es' || format === 'esm') + ? { + compress: true, + mangle: true, + // Do not minify whitespace for ES lib output since that would remove + // pure annotations and break tree-shaking + codegen: false, + } + : true + : options.minify === false + ? 'dce-only' + : false return { dir: outDir, // Default format is 'es' for regular and for SSR builds @@ -788,22 +802,15 @@ export function resolveRolldownOptions( (typeof input === 'string' || Object.keys(input).length === 1)) ? false : undefined), - minify: - options.minify === 'oxc' - ? libOptions && (format === 'es' || format === 'esm') - ? { - compress: true, - mangle: true, - // Do not minify whitespace for ES lib output since that would remove - // pure annotations and break tree-shaking - codegen: false, - } - : true - : options.minify === false - ? 'dce-only' - : false, topLevelVar: true, ...output, + minify: + output.minify === undefined + ? resolvedMinify + : typeof output.minify === 'object' && + typeof resolvedMinify === 'object' + ? { ...resolvedMinify, ...output.minify } + : output.minify, comments: typeof output.comments === 'boolean' ? output.comments From e7849af8f0dde7d3fc1700f5594f035be69f2793 Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Wed, 30 Sep 2026 14:22:25 +0900 Subject: [PATCH 2/3] test: use valid value --- packages/vite/src/node/__tests__/build.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index 41d9c3911f059b..d2ff4deb512249 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -571,7 +571,7 @@ describe('resolveBuildOutputs', () => { lib: { ...baseLibOptions, formats: ['es'] }, rolldownOptions: { output: { - minify: { mangle: { props: true } }, + minify: { mangle: { keepNames: true } }, }, }, }, @@ -584,7 +584,7 @@ describe('resolveBuildOutputs', () => { const output = Array.isArray(outputs) ? outputs[0] : outputs expect(output.minify).toStrictEqual({ compress: true, - mangle: { props: true }, + mangle: { keepNames: true }, codegen: false, }) }) From 4621c710bd3aa5baec01f9a417071c184206a5db Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Wed, 30 Sep 2026 14:24:57 +0900 Subject: [PATCH 3/3] chore: tweak --- packages/vite/src/node/__tests__/build.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index 243f740374c3e6..967fa0a6b0cdba 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -601,7 +601,7 @@ describe('resolveBuildOutputs', () => { builder.environments.client, new ChunkMetadataMap(), ) - const outputs = options.output as OutputOptions | OutputOptions[] + const outputs = options.output! const output = Array.isArray(outputs) ? outputs[0] : outputs expect(output.minify).toStrictEqual({ compress: true, @@ -628,7 +628,7 @@ describe('resolveBuildOutputs', () => { builder.environments.client, new ChunkMetadataMap(), ) - const outputs = options.output as OutputOptions | OutputOptions[] + const outputs = options.output! const output = Array.isArray(outputs) ? outputs[0] : outputs expect(output.minify).toBe(false) })