feat: rebuild supported

This commit is contained in:
YuKun Liu committed 2022-08-27 21:56:31 -07:00
1 parent 1aaedab752
commit 9f20337e5e
4 files changed
+84 -11

No files matched your search

+1 -1
View File
@@ -60,7 +60,7 @@ dioxus-rsx-interpreter = { git = "https://github.com/dioxuslabs/dioxus/" }
proc-macro2 = { version = "1.0", features = ["span-locations"] }
# plugin packages
mlua = { version = "0.8.1", features = ["lua54", "vendored", "async"] }
mlua = { version = "0.8.1", features = ["lua54", "vendored", "async", "send"] }
[[bin]]
path = "src/main.rs"
+1 -1
View File
@@ -65,7 +65,7 @@ impl Serve {
Serve::regen_dev_page(&crate_config)?;
// start the develop server
server::startup(self.serve.port, crate_config.clone()).await?;
server::startup(self.serve.port, crate_config.clone(), plugin_manager).await?;
Ok(())
}
+59
View File
@@ -167,6 +167,65 @@ impl PluginManager {
Ok(())
}
pub fn on_serve_start(&self, crate_config: &CrateConfig) -> anyhow::Result<()> {
let lua = &self.lua;
let manager = lua.globals().get::<_, Table>("manager")?;
let args = lua.create_table()?;
args.set("name", crate_config.dioxus_config.application.name.clone())?;
for i in 1..(manager.len()? as i32 + 1) {
let info = manager.get::<i32, PluginInfo>(i)?;
if let Some(func) = info.serve.on_start {
func.call::<Table, ()>(args.clone())?;
}
}
Ok(())
}
pub fn on_serve_rebuild(&self, timestamp: i64, files: Vec<PathBuf>) -> anyhow::Result<()> {
let lua = &self.lua;
let manager = lua.globals().get::<_, Table>("manager")?;
let args = lua.create_table()?;
args.set("timestamp", timestamp)?;
let files: Vec<String> = files
.iter()
.map(|v| v.to_str().unwrap().to_string())
.collect();
args.set("changed_files", files)?;
for i in 1..(manager.len()? as i32 + 1) {
let info = manager.get::<i32, PluginInfo>(i)?;
if let Some(func) = info.serve.on_rebuild {
func.call::<Table, ()>(args.clone())?;
}
}
Ok(())
}
pub fn on_serve_shutdown(&self, crate_config: &CrateConfig) -> anyhow::Result<()> {
let lua = &self.lua;
let manager = lua.globals().get::<_, Table>("manager")?;
let args = lua.create_table()?;
args.set("name", crate_config.dioxus_config.application.name.clone())?;
for i in 1..(manager.len()? as i32 + 1) {
let info = manager.get::<i32, PluginInfo>(i)?;
if let Some(func) = info.serve.on_shutdown {
func.call::<Table, ()>(args.clone())?;
}
}
Ok(())
}
fn init_plugin_dir() -> PathBuf {
let app_path = app_path();
let plugin_path = app_path.join("plugins");
+23 -9
View File
@@ -16,7 +16,7 @@ use std::{net::UdpSocket, path::PathBuf, process::Command, sync::Arc};
use tower::ServiceBuilder;
use tower_http::services::fs::{ServeDir, ServeFileSystemResponseBody};
use crate::{builder, serve::Serve, BuildResult, CrateConfig, Result};
use crate::{builder, plugin::PluginManager, serve::Serve, BuildResult, CrateConfig, Result};
use tokio::sync::broadcast;
mod hot_reload;
@@ -52,20 +52,26 @@ struct WsReloadState {
update: broadcast::Sender<()>,
}
pub async fn startup(port: u16, config: CrateConfig) -> Result<()> {
pub async fn startup(port: u16, config: CrateConfig, plugin_manager: PluginManager) -> Result<()> {
if config.hot_reload {
startup_hot_reload(port, config).await?
startup_hot_reload(port, config, plugin_manager).await?
} else {
startup_default(port, config).await?
startup_default(port, config, plugin_manager).await?
}
Ok(())
}
pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> {
pub async fn startup_hot_reload(
port: u16,
config: CrateConfig,
plugin_manager: PluginManager,
) -> Result<()> {
let first_build_result = crate::builder::build(&config, false)?;
log::info!("🚀 Starting development server...");
plugin_manager.on_serve_start(&config)?;
let dist_path = config.out_dir.clone();
let (reload_tx, _) = broadcast::channel(100);
let last_file_rebuild = Arc::new(Mutex::new(FileMap::new(config.crate_dir.clone())));
@@ -274,11 +280,17 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> {
Ok(())
}
pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> {
pub async fn startup_default(
port: u16,
config: CrateConfig,
plugin_manager: PluginManager,
) -> Result<()> {
let first_build_result = crate::builder::build(&config, false)?;
log::info!("🚀 Starting development server...");
plugin_manager.on_serve_start(&config)?;
let dist_path = config.out_dir.clone();
let (reload_tx, _) = broadcast::channel(100);
@@ -306,7 +318,7 @@ pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> {
let watcher_config = config.clone();
let mut watcher = notify::recommended_watcher(move |info: notify::Result<notify::Event>| {
let config = watcher_config.clone();
if info.is_ok() {
if let Ok(e) = info {
if chrono::Local::now().timestamp() > last_update_time {
match build_manager.rebuild() {
Ok(res) => {
@@ -315,11 +327,13 @@ pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> {
port,
&config,
PrettierOptions {
changed: info.unwrap().paths,
changed: e.paths.clone(),
warnings: res.warnings,
elapsed_time: res.elapsed_time,
},
);
let _ = plugin_manager
.on_serve_rebuild(chrono::Local::now().timestamp(), e.paths);
}
Err(e) => log::error!("{}", e),
}
@@ -599,4 +613,4 @@ async fn ws_handler(
reload_watcher.await.unwrap();
})
}
}