Skip to content

Commit 1ae7f07

Browse files
committed
feat(dev): add binding for DevOptions#rebuild_strategy (#6396)
1 parent 395b548 commit 1ae7f07

File tree

11 files changed

+58
-3
lines changed

11 files changed

+58
-3
lines changed

crates/rolldown_binding/src/binding_dev_engine.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ impl BindingDevEngine {
3131
let session = rolldown_debug::Session::dummy();
3232

3333
let on_hmr_updates_callback = dev_options.as_ref().and_then(|opts| opts.on_hmr_updates.clone());
34+
let rebuild_strategy =
35+
dev_options.as_ref().and_then(|opts| opts.rebuild_strategy).map(Into::into);
3436
let watch_options = dev_options.as_ref().and_then(|opts| opts.watch.as_ref());
3537
let skip_write = watch_options.and_then(|watch| watch.skip_write);
3638
let use_polling = watch_options.and_then(|watch| watch.use_polling);
@@ -78,8 +80,8 @@ impl BindingDevEngine {
7880
let rolldown_dev_options = rolldown::dev::dev_options::DevOptions {
7981
on_hmr_updates,
8082
on_output: None, // Rust-only for now
83+
rebuild_strategy,
8184
watch: dev_watch_options,
82-
..Default::default()
8385
};
8486

8587
let inner = rolldown::DevEngine::with_bundler(bundler, rolldown_dev_options)

crates/rolldown_binding/src/binding_dev_options.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::types::binding_hmr_output::BindingClientHmrUpdate;
2+
use crate::types::binding_rebuild_strategy::BindingRebuildStrategy;
23
use crate::types::js_callback::JsCallback;
34
use napi::bindgen_prelude::FnArgs;
45
use napi_derive::napi;
@@ -20,5 +21,6 @@ pub struct BindingDevOptions {
2021
ts_type = "undefined | ((updates: BindingClientHmrUpdate[], changedFiles: string[]) => void | Promise<void>)"
2122
)]
2223
pub on_hmr_updates: Option<JsCallback<FnArgs<(Vec<BindingClientHmrUpdate>, Vec<String>)>, ()>>,
24+
pub rebuild_strategy: Option<BindingRebuildStrategy>,
2325
pub watch: Option<BindingDevWatchOptions>,
2426
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use napi_derive::napi;
2+
3+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
4+
#[napi]
5+
pub enum BindingRebuildStrategy {
6+
Always,
7+
Auto,
8+
#[default]
9+
Never,
10+
}
11+
12+
impl From<BindingRebuildStrategy> for rolldown::dev::RebuildStrategy {
13+
fn from(value: BindingRebuildStrategy) -> Self {
14+
match value {
15+
BindingRebuildStrategy::Always => Self::Always,
16+
BindingRebuildStrategy::Auto => Self::Auto,
17+
BindingRebuildStrategy::Never => Self::Never,
18+
}
19+
}
20+
}

crates/rolldown_binding/src/types/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub mod binding_normalized_options;
77
pub mod binding_output_asset;
88
pub mod binding_output_chunk;
99
pub mod binding_outputs;
10+
pub mod binding_rebuild_strategy;
1011
pub mod binding_rendered_chunk;
1112
pub mod binding_rendered_module;
1213
pub mod binding_resolve_alias_item;

packages/rolldown/src/api/dev/dev-engine.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { type BindingClientHmrUpdate, BindingDevEngine } from '../../binding';
1+
import {
2+
type BindingClientHmrUpdate,
3+
BindingDevEngine,
4+
BindingRebuildStrategy,
5+
} from '../../binding';
26
import type { InputOptions } from '../../options/input-options';
37
import type { OutputOptions } from '../../options/output-options';
48
import { PluginDriver } from '../../plugin/plugin-driver';
@@ -23,6 +27,13 @@ export class DevEngine {
2327

2428
const bindingDevOptions = {
2529
onHmrUpdates: devOptions.onHmrUpdates,
30+
rebuildStrategy: devOptions.rebuildStrategy
31+
? devOptions.rebuildStrategy === 'always'
32+
? BindingRebuildStrategy.Always
33+
: devOptions.rebuildStrategy === 'auto'
34+
? BindingRebuildStrategy.Auto
35+
: BindingRebuildStrategy.Never
36+
: undefined,
2637
watch: devOptions.watch && {
2738
skipWrite: devOptions.watch.skipWrite,
2839
usePolling: devOptions.watch.usePolling,

packages/rolldown/src/api/dev/dev-options.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,13 @@ export interface DevOptions {
4646
updates: BindingClientHmrUpdate[],
4747
changedFiles: string[],
4848
) => void | Promise<void>;
49+
/**
50+
* Strategy for triggering rebuilds after HMR updates.
51+
* - `'always'`: Always trigger a rebuild after HMR updates
52+
* - `'auto'`: Trigger rebuild only if HMR updates contain full reload updates
53+
* - `'never'`: Never trigger rebuild after HMR updates (default)
54+
* @default 'never'
55+
*/
56+
rebuildStrategy?: 'always' | 'auto' | 'never';
4957
watch?: DevWatchOptions;
5058
}

packages/rolldown/src/binding.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1617,6 +1617,7 @@ export interface BindingDeferSyncScanData {
16171617

16181618
export interface BindingDevOptions {
16191619
onHmrUpdates?: undefined | ((updates: BindingClientHmrUpdate[], changedFiles: string[]) => void | Promise<void>)
1620+
rebuildStrategy?: BindingRebuildStrategy
16201621
watch?: BindingDevWatchOptions
16211622
}
16221623

@@ -2089,6 +2090,12 @@ export interface BindingReactRefreshWrapperPluginConfig {
20892090
reactRefreshHost: string
20902091
}
20912092

2093+
export declare enum BindingRebuildStrategy {
2094+
Always = 0,
2095+
Auto = 1,
2096+
Never = 2
2097+
}
2098+
20922099
export interface BindingRenderBuiltUrlConfig {
20932100
ssr: boolean
20942101
type: 'asset' | 'public'

packages/rolldown/src/binding.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ if (!nativeBinding) {
557557
throw new Error(`Failed to load native binding`)
558558
}
559559

560-
const { minify, Severity, ParseResult, ExportExportNameKind, ExportImportNameKind, ExportLocalNameKind, ImportNameKind, parseAsync, parseSync, rawTransferSupported, ResolverFactory, EnforceExtension, ModuleType, sync, HelperMode, isolatedDeclaration, moduleRunnerTransform, transform, transformAsync, BindingBundleEndEventData, BindingBundleErrorEventData, BindingBundler, BindingBundlerImpl, BindingCallableBuiltinPlugin, BindingChunkingContext, BindingClientHmrUpdate, BindingDevEngine, BindingHmrOutput, BindingMagicString, BindingModuleInfo, BindingNormalizedOptions, BindingOutputAsset, BindingOutputChunk, BindingOutputs, BindingPluginContext, BindingRenderedChunk, BindingRenderedChunkMeta, BindingRenderedModule, BindingTransformPluginContext, BindingWatcher, BindingWatcherChangeData, BindingWatcherEvent, ParallelJsPluginRegistry, ScheduledBuild, TraceSubscriberGuard, BindingAttachDebugInfo, BindingBuiltinPluginName, BindingChunkModuleOrderBy, BindingJsx, BindingLogLevel, BindingPluginOrder, BindingPropertyReadSideEffects, BindingPropertyWriteSideEffects, FilterTokenKind, initTraceSubscriber, registerPlugins, shutdownAsyncRuntime, startAsyncRuntime } = nativeBinding
560+
const { minify, Severity, ParseResult, ExportExportNameKind, ExportImportNameKind, ExportLocalNameKind, ImportNameKind, parseAsync, parseSync, rawTransferSupported, ResolverFactory, EnforceExtension, ModuleType, sync, HelperMode, isolatedDeclaration, moduleRunnerTransform, transform, transformAsync, BindingBundleEndEventData, BindingBundleErrorEventData, BindingBundler, BindingBundlerImpl, BindingCallableBuiltinPlugin, BindingChunkingContext, BindingClientHmrUpdate, BindingDevEngine, BindingHmrOutput, BindingMagicString, BindingModuleInfo, BindingNormalizedOptions, BindingOutputAsset, BindingOutputChunk, BindingOutputs, BindingPluginContext, BindingRenderedChunk, BindingRenderedChunkMeta, BindingRenderedModule, BindingTransformPluginContext, BindingWatcher, BindingWatcherChangeData, BindingWatcherEvent, ParallelJsPluginRegistry, ScheduledBuild, TraceSubscriberGuard, BindingAttachDebugInfo, BindingBuiltinPluginName, BindingChunkModuleOrderBy, BindingJsx, BindingLogLevel, BindingPluginOrder, BindingPropertyReadSideEffects, BindingPropertyWriteSideEffects, BindingRebuildStrategy, FilterTokenKind, initTraceSubscriber, registerPlugins, shutdownAsyncRuntime, startAsyncRuntime } = nativeBinding
561561
export { minify }
562562
export { Severity }
563563
export { ParseResult }
@@ -611,6 +611,7 @@ export { BindingLogLevel }
611611
export { BindingPluginOrder }
612612
export { BindingPropertyReadSideEffects }
613613
export { BindingPropertyWriteSideEffects }
614+
export { BindingRebuildStrategy }
614615
export { FilterTokenKind }
615616
export { initTraceSubscriber }
616617
export { registerPlugins }

packages/rolldown/src/experimental-index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export type { DevOptions, DevWatchOptions } from './api/dev/dev-options';
44
export { scan } from './api/experimental';
55
export {
66
BindingClientHmrUpdate,
7+
BindingRebuildStrategy,
78
isolatedDeclaration,
89
type IsolatedDeclarationsOptions,
910
type IsolatedDeclarationsResult,

packages/rolldown/src/rolldown-binding.wasi-browser.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ export const BindingLogLevel = __napiModule.exports.BindingLogLevel
116116
export const BindingPluginOrder = __napiModule.exports.BindingPluginOrder
117117
export const BindingPropertyReadSideEffects = __napiModule.exports.BindingPropertyReadSideEffects
118118
export const BindingPropertyWriteSideEffects = __napiModule.exports.BindingPropertyWriteSideEffects
119+
export const BindingRebuildStrategy = __napiModule.exports.BindingRebuildStrategy
119120
export const FilterTokenKind = __napiModule.exports.FilterTokenKind
120121
export const initTraceSubscriber = __napiModule.exports.initTraceSubscriber
121122
export const registerPlugins = __napiModule.exports.registerPlugins

0 commit comments

Comments
 (0)