diff --git a/src/config.ts b/src/config.ts index 559b05b..6e06e88 100644 --- a/src/config.ts +++ b/src/config.ts @@ -195,14 +195,20 @@ export async function resolveConfig( const { main, preload, renderer } = loadResult.config if (main) { + main.build ??= {} + setupRollupOptionCompat(main.build) userConfig.main = await new MainConfigFactory(main, config, { outDir, root }).build() } if (preload) { + preload.build ??= {} + setupRollupOptionCompat(preload.build) userConfig.preload = await new PreloadConfigFactory(preload, config, { outDir, root }).build() } if (renderer) { + renderer.build ??= {} + setupRollupOptionCompat(renderer.build) userConfig.renderer = await new RendererConfigFactory(renderer, config, { outDir, root }).build() } @@ -220,6 +226,14 @@ export async function resolveConfig( return resolved } +function setupRollupOptionCompat>( + buildConfig: T +): asserts buildConfig is T & { + rolldownOptions: Exclude +} { + buildConfig.rolldownOptions ??= buildConfig.rollupOptions +} + export abstract class ConfigFactory { constructor( protected readonly baseConfig: T, diff --git a/src/plugins/bytecode.ts b/src/plugins/bytecode.ts index 569c8c4..31d864b 100644 --- a/src/plugins/bytecode.ts +++ b/src/plugins/bytecode.ts @@ -205,7 +205,7 @@ export function bytecodePlugin(options: BytecodeOptions = {}): Plugin | null { return } const build = config.build - const resolvedOutputs = resolveBuildOutputs(build.rollupOptions.output, build.lib) + const resolvedOutputs = resolveBuildOutputs(build.rolldownOptions.output, build.lib) if (resolvedOutputs) { const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] const output = outputs[0] @@ -213,7 +213,7 @@ export function bytecodePlugin(options: BytecodeOptions = {}): Plugin | null { config.logger.warn( colors.yellow( 'bytecodePlugin does not support ES module, please remove "type": "module" ' + - 'in package.json or set the "build.rollupOptions.output.format" option to "cjs".' + 'in package.json or set build.rollupOptions.output.format (or build.rolldownOptions.output.format) to "cjs".' ) ) } diff --git a/src/plugins/electron.ts b/src/plugins/electron.ts index 6d455ea..57b415b 100644 --- a/src/plugins/electron.ts +++ b/src/plugins/electron.ts @@ -73,7 +73,7 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions): outDir: path.resolve(root, 'out', 'main'), target: nodeTarget, assetsDir: 'chunks', - rollupOptions: { + rolldownOptions: { external: ['electron', /^electron\/.+/, ...builtinModules.flatMap(m => [m, `node:${m}`])], output: {} }, @@ -83,10 +83,10 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions): } const build = config.build || {} - const rollupOptions = build.rollupOptions || {} - if (!rollupOptions.input) { + const rolldownOptions = build.rolldownOptions || {} + if (!rolldownOptions.input) { const libOptions = build.lib - const outputOptions = rollupOptions.output + const outputOptions = rolldownOptions.output defaultConfig.build['lib'] = { entry: findLibEntry(root, 'main'), formats: @@ -95,10 +95,10 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions): : [outputOptions && !Array.isArray(outputOptions) && outputOptions.format ? outputOptions.format : format] } } else { - defaultConfig.build.rollupOptions.output['format'] = format + defaultConfig.build.rolldownOptions.output['format'] = format } - defaultConfig.build.rollupOptions.output['assetFileNames'] = path.posix.join( + defaultConfig.build.rolldownOptions.output['assetFileNames'] = path.posix.join( build.assetsDir || defaultConfig.build.assetsDir, '[name]-[hash].[ext]' ) @@ -121,8 +121,9 @@ export function electronMainConfigPresetPlugin(options?: ElectronPluginOptions): // enable ssr build config.build.ssr = true config.build.ssrEmitAssets = true - config.build.rolldownOptions = config.build.rollupOptions config.ssr = { ...config.ssr, ...{ noExternal: true } } + + config.build.rollupOptions = config.build.rolldownOptions } } } @@ -144,16 +145,17 @@ export function electronMainConfigValidatorPlugin(): Plugin { } const libOptions = build.lib - const rollupOptions = build.rollupOptions + const rolldownOptions = build.rolldownOptions - if (!(libOptions && libOptions.entry) && !rollupOptions?.input) { + if (!(libOptions && libOptions.entry) && !rolldownOptions?.input) { throw new Error( 'An entry point is required in the electron vite main config, ' + - 'which can be specified using "build.lib.entry" or "build.rollupOptions.input".' + 'which can be specified using build.lib.entry, build.rollupOptions.input, ' + + 'or build.rolldownOptions.input.' ) } - const resolvedOutputs = resolveBuildOutputs(rollupOptions.output, libOptions) + const resolvedOutputs = resolveBuildOutputs(rolldownOptions.output, libOptions) if (resolvedOutputs) { const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] @@ -204,7 +206,7 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption outDir: path.resolve(root, 'out', 'preload'), target: nodeTarget, assetsDir: 'chunks', - rollupOptions: { + rolldownOptions: { external: ['electron', /^electron\/.+/, ...builtinModules.flatMap(m => [m, `node:${m}`])], output: {} }, @@ -214,10 +216,10 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption } const build = config.build || {} - const rollupOptions = build.rollupOptions || {} - if (!rollupOptions.input) { + const rolldownOptions = build.rolldownOptions || {} + if (!rolldownOptions.input) { const libOptions = build.lib - const outputOptions = rollupOptions.output + const outputOptions = rolldownOptions.output defaultConfig.build['lib'] = { entry: findLibEntry(root, 'preload'), formats: @@ -226,10 +228,10 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption : [outputOptions && !Array.isArray(outputOptions) && outputOptions.format ? outputOptions.format : format] } } else { - defaultConfig.build.rollupOptions.output['format'] = format + defaultConfig.build.rolldownOptions.output['format'] = format } - defaultConfig.build.rollupOptions.output['assetFileNames'] = path.posix.join( + defaultConfig.build.rolldownOptions.output['assetFileNames'] = path.posix.join( build.assetsDir || defaultConfig.build.assetsDir, '[name]-[hash].[ext]' ) @@ -237,22 +239,22 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption const buildConfig = mergeConfig(defaultConfig.build, build) config.build = buildConfig - const resolvedOutputs = resolveBuildOutputs(config.build.rollupOptions!.output, config.build.lib || false) + const resolvedOutputs = resolveBuildOutputs(config.build.rolldownOptions!.output, config.build.lib || false) if (resolvedOutputs) { const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] if (outputs.find(({ format }) => format === 'es')) { - if (Array.isArray(config.build.rollupOptions!.output)) { - config.build.rollupOptions!.output.forEach(output => { + if (Array.isArray(config.build.rolldownOptions!.output)) { + config.build.rolldownOptions!.output.forEach(output => { if (output.format === 'es') { output['entryFileNames'] = '[name].mjs' output['chunkFileNames'] = '[name]-[hash].mjs' } }) } else { - config.build.rollupOptions!.output!['entryFileNames'] = '[name].mjs' - config.build.rollupOptions!.output!['chunkFileNames'] = '[name]-[hash].mjs' + config.build.rolldownOptions!.output!['entryFileNames'] = '[name].mjs' + config.build.rolldownOptions!.output!['chunkFileNames'] = '[name]-[hash].mjs' } } } @@ -270,9 +272,10 @@ export function electronPreloadConfigPresetPlugin(options?: ElectronPluginOption // enable ssr build config.build.ssr = true config.build.ssrEmitAssets = true - config.build.rolldownOptions = config.build.rollupOptions config.ssr = mergeConfig(defaultConfig.ssr, config.ssr || {}) config.ssr.noExternal = true + + config.build.rollupOptions = config.build.rolldownOptions } } } @@ -294,16 +297,17 @@ export function electronPreloadConfigValidatorPlugin(): Plugin { } const libOptions = build.lib - const rollupOptions = build.rollupOptions + const rolldownOptions = build.rolldownOptions - if (!(libOptions && libOptions.entry) && !rollupOptions?.input) { + if (!(libOptions && libOptions.entry) && !rolldownOptions?.input) { throw new Error( 'An entry point is required in the electron vite preload config, ' + - 'which can be specified using "build.lib.entry" or "build.rollupOptions.input".' + 'which can be specified using build.lib.entry, build.rollupOptions.input, ' + + ' or build.rolldownOptions.input.' ) } - const resolvedOutputs = resolveBuildOutputs(rollupOptions.output, libOptions) + const resolvedOutputs = resolveBuildOutputs(rolldownOptions.output, libOptions) if (resolvedOutputs) { const outputs = Array.isArray(resolvedOutputs) ? resolvedOutputs : [resolvedOutputs] @@ -359,7 +363,7 @@ export function electronRendererConfigPresetPlugin(options?: ElectronPluginOptio outDir: path.resolve(root, 'out', 'renderer'), target: chromeTarget, modulePreload: { polyfill: false }, - rollupOptions: { + rolldownOptions: { input: findInput(root) }, reportCompressedSize: false, @@ -378,6 +382,8 @@ export function electronRendererConfigPresetPlugin(options?: ElectronPluginOptio config.envDir = config.envDir || path.resolve(root) config.envPrefix = config.envPrefix || ['RENDERER_VITE_', 'VITE_'] + + config.build.rollupOptions = config.build.rolldownOptions } } } @@ -403,10 +409,12 @@ export function electronRendererConfigValidatorPlugin(): Plugin { } } - const rollupOptions = build.rollupOptions - if (!rollupOptions.input) { + const rolldownOptions = build.rolldownOptions + if (!rolldownOptions.input) { config.logger.warn(colors.yellow(`index.html file is not found in ${colors.dim('/src/renderer')} directory.`)) - throw new Error('build.rollupOptions.input option is required in the electron vite renderer config.') + throw new Error( + 'build.rollupOptions.input or build.rolldownOptions.input option is required in the electron vite renderer config.' + ) } } } diff --git a/src/plugins/externalizeDeps.ts b/src/plugins/externalizeDeps.ts index 076f244..cb604be 100644 --- a/src/plugins/externalizeDeps.ts +++ b/src/plugins/externalizeDeps.ts @@ -33,13 +33,15 @@ export function externalizeDepsPlugin(options: ExternalOptions = {}): Plugin | n config(config): void { const defaultConfig = { build: { - rollupOptions: { + rolldownOptions: { external: deps.length > 0 ? [...deps, new RegExp(`^(${deps.join('|')})/.+`)] : [] } } } const buildConfig = mergeConfig(defaultConfig.build, config.build || {}) config.build = buildConfig + + config.build.rollupOptions = config.build.rolldownOptions } } } diff --git a/src/plugins/isolateEntries.ts b/src/plugins/isolateEntries.ts index 5d17ec2..c15ea84 100644 --- a/src/plugins/isolateEntries.ts +++ b/src/plugins/isolateEntries.ts @@ -134,7 +134,7 @@ async function bundleEntryFile( }) as InlineConfig // rewrite the input instead of merging - viteConfig.build!.rollupOptions!.input = input + viteConfig.build!.rolldownOptions!.input = input const bundles = (await viteBuild(viteConfig)) as Rolldown.RolldownOutput diff --git a/src/plugins/modulePath.ts b/src/plugins/modulePath.ts index 50e383b..63ca63d 100644 --- a/src/plugins/modulePath.ts +++ b/src/plugins/modulePath.ts @@ -115,8 +115,8 @@ async function bundleEntryFile(input: string, config: InlineConfig): Promise