From f7481c6ce2d2e801a515c8f280311051c2610278 Mon Sep 17 00:00:00 2001 From: Jonas Thelemann Date: Mon, 27 Jul 2026 02:37:06 +0200 Subject: [PATCH 1/2] fix(types): widen RollupConfig.plugins to accept Rolldown-typed plugins Vite 8 changed its own Plugin type to extend Rolldown.Plugin, so plugin factories typed against Vite (e.g. @vitejs/plugin-vue's vue()) no longer satisfy rollupConfig.plugins, which is typed against real Rollup's Plugin. rollupConfig is already reused for the rolldown builder internally, so widen the public type and keep the two real rollup() call sites strict via a local cast. Fixes #4482 --- src/build/rollup/dev.ts | 4 ++-- src/build/rollup/prod.ts | 4 ++-- src/types/build.ts | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/build/rollup/dev.ts b/src/build/rollup/dev.ts index 20f1fb5eb3..85315c4e31 100644 --- a/src/build/rollup/dev.ts +++ b/src/build/rollup/dev.ts @@ -1,5 +1,5 @@ import type { Nitro, RollupConfig } from "nitro/types"; -import type { RollupWatcher } from "rollup"; +import type { RollupOptions, RollupWatcher } from "rollup"; import { watch as chokidarWatch } from "chokidar"; import { defu } from "defu"; import { basename, join } from "pathe"; @@ -68,7 +68,7 @@ export async function watchDev(nitro: Nitro, rollupConfig: RollupConfig) { function startRollupWatcher(nitro: Nitro, rollupConfig: RollupConfig) { const watcher = rollup.watch( - defu(rollupConfig, { + defu(rollupConfig as RollupOptions, { watch: { chokidar: nitro.options.watchOptions, }, diff --git a/src/build/rollup/prod.ts b/src/build/rollup/prod.ts index defbceeb50..9efa7e1556 100644 --- a/src/build/rollup/prod.ts +++ b/src/build/rollup/prod.ts @@ -5,7 +5,7 @@ import { generateFSTree } from "../../utils/fs-tree.ts"; import { writeTypes } from "../types.ts"; import { writeBuildInfo } from "../info.ts"; import { formatRollupError } from "./error.ts"; -import type { RollupOutput } from "rollup"; +import type { RollupOptions, RollupOutput } from "rollup"; export async function buildProduction(nitro: Nitro, rollupConfig: RollupConfig) { const rollup = await import("rollup"); @@ -20,7 +20,7 @@ export async function buildProduction(nitro: Nitro, rollupConfig: RollupConfig) nitro.logger.info( `Building server (builder: \`rollup\`, preset: \`${nitro.options.preset}\`, compatibility date: \`${formatCompatibilityDate(nitro.options.compatibilityDate)}\`)` ); - const build = await rollup.rollup(rollupConfig).catch((error) => { + const build = await rollup.rollup(rollupConfig as RollupOptions).catch((error) => { nitro.logger.error(formatRollupError(error)); throw error; }); diff --git a/src/types/build.ts b/src/types/build.ts index 1efc10b414..c97a073838 100644 --- a/src/types/build.ts +++ b/src/types/build.ts @@ -10,8 +10,13 @@ import type { TransformOptions as RolldownTransformOptions, } from "rolldown"; -export type RollupConfig = RollupInputOptions & { +export type RollupConfig = Omit & { output?: RollupOutputOptions; + // Vite 8 / `@vitejs/plugin-vue` etc. return Rolldown-typed plugins now that + // Vite's `Plugin` extends `Rolldown.Plugin` instead of Rollup's own type. + // `rollupConfig` is also reused for the `rolldown` builder (see + // `build/vite/bundler.ts`), so accept either shape here. + plugins?: RollupInputOptions["plugins"] | RolldownInputOptions["plugins"]; }; export type RolldownConfig = RolldownInputOptions & { From 75fe05706f9323ccd6c651d15a044509afc8d324 Mon Sep 17 00:00:00 2001 From: Jonas Thelemann Date: Fri, 31 Jul 2026 18:17:21 +0200 Subject: [PATCH 2/2] fix(types): allow mixing rollup and rolldown plugins in RollupConfig --- src/types/build.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/types/build.ts b/src/types/build.ts index c97a073838..6a0bb2bea5 100644 --- a/src/types/build.ts +++ b/src/types/build.ts @@ -1,5 +1,6 @@ import type { InputOptions as RollupInputOptions, + InputPluginOption as RollupInputPluginOption, OutputOptions as RollupOutputOptions, } from "rollup"; @@ -7,6 +8,7 @@ import type { InputOptions as RolldownInputOptions, OutputOptions as RolldownOutputOptions, MinifyOptions as RolldownMinifyOptions, + RolldownPluginOption, TransformOptions as RolldownTransformOptions, } from "rolldown"; @@ -15,8 +17,9 @@ export type RollupConfig = Omit & { // Vite 8 / `@vitejs/plugin-vue` etc. return Rolldown-typed plugins now that // Vite's `Plugin` extends `Rolldown.Plugin` instead of Rollup's own type. // `rollupConfig` is also reused for the `rolldown` builder (see - // `build/vite/bundler.ts`), so accept either shape here. - plugins?: RollupInputOptions["plugins"] | RolldownInputOptions["plugins"]; + // `build/vite/bundler.ts`), so accept a mix of Rollup and Rolldown plugins + // in the same array. + plugins?: (RollupInputPluginOption | RolldownPluginOption)[]; }; export type RolldownConfig = RolldownInputOptions & {