From f7481c6ce2d2e801a515c8f280311051c2610278 Mon Sep 17 00:00:00 2001 From: Jonas Thelemann Date: Mon, 27 Jul 2026 02:37:06 +0200 Subject: [PATCH] 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 & {