@@ -4,8 +4,8 @@ use crate::utils::http;
44use keyring:: Entry ;
55use rand:: Rng ;
66use rolldown:: {
7- Bundler , BundlerOptions , ExperimentalOptions , InputItem , LogLevel , OutputFormat , Platform ,
8- WatchOption , Watcher ,
7+ BundleEvent , Bundler , BundlerOptions , ExperimentalOptions , InputItem , LogLevel , OutputFormat ,
8+ Platform , WatchOption , Watcher , WatcherEvent ,
99} ;
1010use serde:: Deserialize ;
1111use std:: collections:: HashSet ;
@@ -114,12 +114,53 @@ async fn dev(args: PluginPathArg) -> CommandResult {
114114 ensure_plugin_build_inputs ( & plugin_dir) ?;
115115
116116 ui:: info ( & format ! ( "Watching plugin {}..." , plugin_dir. display( ) ) ) ;
117- ui:: info ( "Press Ctrl-C to stop" ) ;
118117
119118 let bundler = Bundler :: new ( bundler_options ( & plugin_dir, true ) )
120119 . map_err ( |err| format ! ( "Failed to initialize Rolldown watcher: {err}" ) ) ?;
121120 let watcher = Watcher :: new ( vec ! [ Arc :: new( Mutex :: new( bundler) ) ] , None )
122121 . map_err ( |err| format ! ( "Failed to start Rolldown watcher: {err}" ) ) ?;
122+ let emitter = watcher. emitter ( ) ;
123+ let watch_root = plugin_dir. clone ( ) ;
124+ let _event_logger = tokio:: spawn ( async move {
125+ loop {
126+ let event = {
127+ let rx = emitter. rx . lock ( ) . await ;
128+ rx. recv ( )
129+ } ;
130+
131+ let Ok ( event) = event else {
132+ break ;
133+ } ;
134+
135+ match event {
136+ WatcherEvent :: Change ( change) => {
137+ let changed_path = Path :: new ( change. path . as_str ( ) ) ;
138+ let display_path = changed_path
139+ . strip_prefix ( & watch_root)
140+ . map ( |p| p. display ( ) . to_string ( ) )
141+ . unwrap_or_else ( |_| {
142+ changed_path
143+ . file_name ( )
144+ . map ( |name| name. to_string_lossy ( ) . into_owned ( ) )
145+ . unwrap_or_else ( || "unknown" . to_string ( ) )
146+ } ) ;
147+ ui:: info ( & format ! ( "Rebuilding plugin {display_path}" ) ) ;
148+ }
149+ WatcherEvent :: Event ( BundleEvent :: BundleEnd ( _) ) => { }
150+ WatcherEvent :: Event ( BundleEvent :: Error ( event) ) => {
151+ if event. error . diagnostics . is_empty ( ) {
152+ ui:: error ( "Plugin build failed" ) ;
153+ } else {
154+ for diagnostic in event. error . diagnostics {
155+ ui:: error ( & diagnostic. to_string ( ) ) ;
156+ }
157+ }
158+ }
159+ WatcherEvent :: Close => break ,
160+ _ => { }
161+ }
162+ }
163+ } ) ;
123164
124165 watcher. start ( ) . await ;
125166 Ok ( ( ) )
0 commit comments