From 4c5cc17545ef20988c60183cefce85779e3c5ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Tue, 26 May 2026 11:51:57 +0200 Subject: [PATCH 1/5] macOS: handle app re-open --- src-tauri/Cargo.lock | 26 ++++++++++++------------- src-tauri/src/bin/defguard-client.rs | 9 +++++++++ src-tauri/src/tray.rs | 6 +++--- src-tauri/src/window_manager/mod.rs | 14 ++++--------- src/shared/images/png/logo_256-256.png | Bin 34482 -> 27413 bytes 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 70af8679f..9882914b2 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1431,7 +1431,7 @@ dependencies = [ "os_info", "prost", "regex", - "reqwest 0.13.3", + "reqwest 0.13.4", "rust-ini", "semver", "serde", @@ -1486,7 +1486,7 @@ dependencies = [ "defguard_wireguard_rs", "dirs-next", "prost", - "reqwest 0.13.3", + "reqwest 0.13.4", "serde", "serde_json", "thiserror 2.0.18", @@ -2723,9 +2723,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" dependencies = [ "bytes", "itoa", @@ -3456,9 +3456,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" dependencies = [ "serde_core", "value-bag", @@ -5109,9 +5109,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64 0.22.1", "bytes", @@ -6143,18 +6143,18 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "struct-patch" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f19113e4a69e522707bfc091d0bf34def27cb734506a58e086288bec295093ac" +checksum = "be0dd3602dc475cc00732da8b54a79d1aec0843b3ecfa3a1efcbf8ff00e181a5" dependencies = [ "struct-patch-derive", ] [[package]] name = "struct-patch-derive" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b68ee01d5cbcd4f403fd8a9cb4ad1af95debf22d66de15603afe3f74598e45" +checksum = "97409f38bb9816c7606c9ba860b2bb26f0bd1d5b4254b7fc26aa827af6af760c" dependencies = [ "proc-macro2", "quote", @@ -6398,7 +6398,7 @@ dependencies = [ "percent-encoding", "plist", "raw-window-handle", - "reqwest 0.13.3", + "reqwest 0.13.4", "serde", "serde_json", "serde_repr", diff --git a/src-tauri/src/bin/defguard-client.rs b/src-tauri/src/bin/defguard-client.rs index 782549bc8..f8f41d2bc 100644 --- a/src-tauri/src/bin/defguard-client.rs +++ b/src-tauri/src/bin/defguard-client.rs @@ -512,6 +512,15 @@ fn main() { }); } } + #[cfg(target_os = "macos")] + RunEvent::Reopen { + has_visible_windows, + .. + } => { + if !has_visible_windows { + let _ = WindowManager::open_tray(app_handle); + } + } _ => { trace!("Received event: {event:?}"); } diff --git a/src-tauri/src/tray.rs b/src-tauri/src/tray.rs index abedaeb94..5f9417391 100644 --- a/src-tauri/src/tray.rs +++ b/src-tauri/src/tray.rs @@ -17,7 +17,7 @@ use crate::{ database::{models::location::Location, DB_POOL}, error::Error, events::EventKey, - window_manager::{show_new_ui_window_near_tray, NEW_UI_WINDOW_ID, OLD_UI_WINDOW_ID}, + window_manager::{show_new_ui_window, NEW_UI_WINDOW_ID, OLD_UI_WINDOW_ID}, ConnectionType, }; @@ -188,7 +188,7 @@ pub async fn setup_tray(app: &AppHandle) -> Result<(), Error> { if let Some(old_ui) = app.get_webview_window(OLD_UI_WINDOW_ID) { let _ = old_ui.hide(); } - show_new_ui_window_near_tray(app); + show_new_ui_window(app); } else { let _ = WindowManager::open_full_view(app); } @@ -258,7 +258,7 @@ pub fn handle_tray_menu_event(app: &AppHandle, event: MenuEvent) { info!("Received QUIT request. Initiating shutdown..."); handle.exit(0); } - TRAY_EVENT_SHOW => show_new_ui_window_near_tray(app), + TRAY_EVENT_SHOW => show_new_ui_window(app), TRAY_EVENT_HIDE => hide_visible_windows(app), TRAY_EVENT_UPDATES => { let _ = webbrowser::open(SUBSCRIBE_UPDATES_LINK); diff --git a/src-tauri/src/window_manager/mod.rs b/src-tauri/src/window_manager/mod.rs index 8ab01c079..2a782dd24 100644 --- a/src-tauri/src/window_manager/mod.rs +++ b/src-tauri/src/window_manager/mod.rs @@ -89,6 +89,8 @@ impl WindowManager { #[cfg(target_os = "macos")] macos::position_window_near_tray(app, &window); #[cfg(target_os = "macos")] + let _ = app.set_dock_visibility(false); + #[cfg(target_os = "macos")] let _ = app.show(); let _ = window.show(); let _ = window.set_focus(); @@ -103,6 +105,8 @@ impl WindowManager { Self::build_full_window(app)? }; #[cfg(target_os = "macos")] + let _ = app.set_dock_visibility(true); + #[cfg(target_os = "macos")] let _ = app.show(); let _ = window.show(); let _ = window.set_focus(); @@ -123,10 +127,6 @@ pub(crate) fn show_new_ui_window(app: &AppHandle) { let _ = WindowManager::open_tray(app); } -pub(crate) fn show_new_ui_window_near_tray(app: &AppHandle) { - show_new_ui_window(app); -} - #[tauri::command] pub fn open_new_ui_window(app: AppHandle) { show_new_ui_window(&app); @@ -142,9 +142,6 @@ pub fn open_old_ui_window(app: AppHandle) { #[tauri::command] pub fn swap_to_old_ui(app: AppHandle) { tracing::info!("swap_to_old_ui called"); - #[cfg(target_os = "macos")] - let _ = app.set_dock_visibility(true); - if let Some(window) = tauri::Manager::get_webview_window(&app, NEW_UI_WINDOW_ID) { if let Err(err) = window.hide() { tracing::error!("swap_to_old_ui task: Failed to hide new-ui window: {err:?}"); @@ -175,9 +172,6 @@ pub fn close_tray_window(app: AppHandle) { #[tauri::command] pub fn swap_to_new_ui(app: AppHandle) { tracing::info!("swap_to_new_ui called"); - #[cfg(target_os = "macos")] - let _ = app.set_dock_visibility(false); - show_new_ui_window(&app); if let Some(window) = tauri::Manager::get_webview_window(&app, OLD_UI_WINDOW_ID) { if let Err(err) = window.hide() { diff --git a/src/shared/images/png/logo_256-256.png b/src/shared/images/png/logo_256-256.png index a18d538b07780e5598bf969ff389e7d9fe6d0734..12f44fdee1e9fe0bac7cd5f2734c02f1bf2f9afd 100644 GIT binary patch literal 27413 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 Date: Tue, 26 May 2026 12:15:52 +0200 Subject: [PATCH 2/5] Merge common logic --- src-tauri/src/bin/defguard-client.rs | 56 +++++++++++++--------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/src-tauri/src/bin/defguard-client.rs b/src-tauri/src/bin/defguard-client.rs index f8f41d2bc..74906b550 100644 --- a/src-tauri/src/bin/defguard-client.rs +++ b/src-tauri/src/bin/defguard-client.rs @@ -34,7 +34,7 @@ use defguard_client::{ LOG_FILENAME, VERSION, }; use log::{Level, LevelFilter}; -use tauri::{AppHandle, Builder, Manager, RunEvent, WindowEvent}; +use tauri::{async_runtime, AppHandle, Builder, Manager, RunEvent, WindowEvent}; use tauri_plugin_deep_link::DeepLinkExt; use tauri_plugin_log::{Target, TargetKind}; @@ -100,7 +100,7 @@ async fn startup(app_handle: &AppHandle) { .lock() .expect("failed to lock app state") .mtu(); - let handle = tauri::async_runtime::spawn(async move { + let handle = async_runtime::spawn(async move { if let Err(err) = defguard_client::apple::sync_locations_and_tunnels(mtu).await { error!("Failed to sync locations and tunnels: {err}"); } @@ -122,7 +122,7 @@ async fn startup(app_handle: &AppHandle) { }); let handle = app_handle.clone(); - tauri::async_runtime::spawn(async move { + async_runtime::spawn(async move { defguard_client::apple::connection_state_update_thread(&handle).await; error!("Connection state update thread has exited unexpectedly, quitting the app."); handle.exit(0); @@ -131,7 +131,7 @@ async fn startup(app_handle: &AppHandle) { // Run periodic tasks. let periodic_tasks_handle = app_handle.clone(); - tauri::async_runtime::spawn(async move { + async_runtime::spawn(async move { run_periodic_tasks(&periodic_tasks_handle).await; // One of the tasks exited, so something went wrong, quit the app error!("One of the periodic tasks has stopped unexpectedly. Exiting the application."); @@ -154,6 +154,16 @@ async fn startup(app_handle: &AppHandle) { debug!("Tray menu has been re-generated successfully."); } +/// Open the appropriate window, either the old or the new UI, depending if there are locations. +fn open_appropriate_window(app_handle: &AppHandle) { + let has_locations = async_runtime::block_on(has_non_service_locations()); + if has_locations { + let _ = WindowManager::open_tray(app_handle); + } else { + let _ = WindowManager::open_full_view(app_handle); + } +} + fn main() { let app = Builder::default() .invoke_handler(tauri::generate_handler![ @@ -220,14 +230,7 @@ fn main() { #[cfg(not(target_os = "linux"))] { - let has_locations = tauri::async_runtime::block_on( - defguard_client::window_manager::has_non_service_locations(), - ); - if has_locations { - let _ = WindowManager::open_tray(app); - } else { - let _ = WindowManager::open_full_view(app); - } + open_appropriate_window(app); } } })) @@ -370,12 +373,12 @@ fn main() { )?; // run DB migrations - tauri::async_runtime::block_on(handle_db_migrations()); + async_runtime::block_on(handle_db_migrations()); // Check if client needs to be initialized // and try to load provisioning config if necessary let provisioning_config = - tauri::async_runtime::block_on(handle_client_initialization(app_handle)); + async_runtime::block_on(handle_client_initialization(app_handle)); let state = AppState::new(config, provisioning_config); app.manage(state); @@ -395,7 +398,8 @@ fn main() { } #[cfg(not(target_os = "linux"))] { - // If the app was cold-launched by a deep link the full view must open, not the tray. + // If the app was cold-launched by a deep-link, the full view must open, not the + // tray. let launched_by_deep_link = app_handle .deep_link() .get_current() @@ -406,15 +410,7 @@ fn main() { info!("App launched via deep link, opening full view directly."); let _ = WindowManager::open_full_view(app_handle); } else { - let has_locations = tauri::async_runtime::block_on( - defguard_client::window_manager::has_non_service_locations() - ); - if has_locations { - WindowManager::open_tray(app_handle)?; - } else { - info!("No locations found, showing full view on startup."); - let _ = WindowManager::open_full_view(app_handle); - } + open_appropriate_window(app_handle); } } @@ -455,7 +451,7 @@ fn main() { log_dir.display(), service::config::DEFAULT_LOG_DIR ); - tauri::async_runtime::block_on(startup(app_handle)); + async_runtime::block_on(startup(app_handle)); // Handle a deep link that launched the app (startup case). if let Ok(Some(urls)) = app_handle.deep_link().get_current() { @@ -465,7 +461,7 @@ fn main() { // Handle Ctrl-C. debug!("Setting up Ctrl-C handler."); let app_handle_clone = app_handle.clone(); - tauri::async_runtime::spawn(async move { + async_runtime::spawn(async move { tokio::signal::ctrl_c() .await .expect("Signal handler failure"); @@ -490,7 +486,7 @@ fn main() { let semaphore = Arc::new(AtomicBool::new(false)); let semaphore_clone = Arc::clone(&semaphore); - let handle = tauri::async_runtime::spawn(async move { + let handle = async_runtime::spawn(async move { let _ = close_all_connections().await; // This will clean the database file, pruning write-ahead log. DB_POOL.close().await; @@ -499,13 +495,13 @@ fn main() { // Obj-C API needs a runtime, but at this point Tauri has closed its runtime, so // create a temporary one. defguard_client::apple::spawn_runloop_and_wait_for(&semaphore); - tauri::async_runtime::block_on(async move { + async_runtime::block_on(async move { let _ = handle.await; }); } #[cfg(not(target_os = "macos"))] { - tauri::async_runtime::block_on(async move { + async_runtime::block_on(async move { let _ = close_all_connections().await; // This will clean the database file, pruning write-ahead log. DB_POOL.close().await; @@ -518,7 +514,7 @@ fn main() { .. } => { if !has_visible_windows { - let _ = WindowManager::open_tray(app_handle); + open_appropriate_window(app_handle); } } _ => { From 662e0ac96ee26eaac80d2525c46f0615f22494a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Tue, 26 May 2026 12:39:30 +0200 Subject: [PATCH 3/5] Fix clippy and add quick db query --- ...a0705b638769ce6631c1b455cbf45e82bb14.json} | 4 +- ...82cf1590e6d15ba30360c41b0a5a3482df3df.json | 20 ++++++++ ...66abfdc6b571d1631a4f77fbf4fa5cfbe7e7.json} | 4 +- ...a11ab0d2e123989e97dfceb57e472523398c.json} | 4 +- ...73e0c79c6a8d671c300ec2ea3eb0d58342b5.json} | 4 +- src-tauri/src/bin/defguard-client.rs | 1 + src-tauri/src/database/models/location.rs | 47 +++++++++++++------ src-tauri/src/window_manager/mod.rs | 5 +- 8 files changed, 62 insertions(+), 27 deletions(-) rename src-tauri/.sqlx/{query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json => query-31e1b340bfbdf29dde642b657124a0705b638769ce6631c1b455cbf45e82bb14.json} (50%) create mode 100644 src-tauri/.sqlx/query-3bedd8a0e3a8d4b76330ba0f81d82cf1590e6d15ba30360c41b0a5a3482df3df.json rename src-tauri/.sqlx/{query-f88f92313f52f0b2c584f48b40e6edb4bc14d96f3000bd58a3ca68eecb8e4a88.json => query-97a52a8bbf020b77afe5dc427efb66abfdc6b571d1631a4f77fbf4fa5cfbe7e7.json} (94%) rename src-tauri/.sqlx/{query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json => query-af70b9b18d8452a03d4d5624c2f3a11ab0d2e123989e97dfceb57e472523398c.json} (67%) rename src-tauri/.sqlx/{query-49039d91cfdefbb32284d15af739a2090ba7baf9dee8cf00e8800b9a5f891fab.json => query-c6a5e793cccc520039e28da8b4fb73e0c79c6a8d671c300ec2ea3eb0d58342b5.json} (96%) diff --git a/src-tauri/.sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json b/src-tauri/.sqlx/query-31e1b340bfbdf29dde642b657124a0705b638769ce6631c1b455cbf45e82bb14.json similarity index 50% rename from src-tauri/.sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json rename to src-tauri/.sqlx/query-31e1b340bfbdf29dde642b657124a0705b638769ce6631c1b455cbf45e82bb14.json index 0da21a4fc..004d36d09 100644 --- a/src-tauri/.sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json +++ b/src-tauri/.sqlx/query-31e1b340bfbdf29dde642b657124a0705b638769ce6631c1b455cbf45e82bb14.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "DELETE FROM location WHERE id = $1;", + "query": "DELETE FROM location WHERE id = $1", "describe": { "columns": [], "parameters": { @@ -8,5 +8,5 @@ }, "nullable": [] }, - "hash": "1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22" + "hash": "31e1b340bfbdf29dde642b657124a0705b638769ce6631c1b455cbf45e82bb14" } diff --git a/src-tauri/.sqlx/query-3bedd8a0e3a8d4b76330ba0f81d82cf1590e6d15ba30360c41b0a5a3482df3df.json b/src-tauri/.sqlx/query-3bedd8a0e3a8d4b76330ba0f81d82cf1590e6d15ba30360c41b0a5a3482df3df.json new file mode 100644 index 000000000..9f7beee72 --- /dev/null +++ b/src-tauri/.sqlx/query-3bedd8a0e3a8d4b76330ba0f81d82cf1590e6d15ba30360c41b0a5a3482df3df.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "SELECT EXISTS (SELECT 1 FROM location WHERE service_location_mode <= $1)", + "describe": { + "columns": [ + { + "name": "EXISTS (SELECT 1 FROM location WHERE service_location_mode <= $1)", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "3bedd8a0e3a8d4b76330ba0f81d82cf1590e6d15ba30360c41b0a5a3482df3df" +} diff --git a/src-tauri/.sqlx/query-f88f92313f52f0b2c584f48b40e6edb4bc14d96f3000bd58a3ca68eecb8e4a88.json b/src-tauri/.sqlx/query-97a52a8bbf020b77afe5dc427efb66abfdc6b571d1631a4f77fbf4fa5cfbe7e7.json similarity index 94% rename from src-tauri/.sqlx/query-f88f92313f52f0b2c584f48b40e6edb4bc14d96f3000bd58a3ca68eecb8e4a88.json rename to src-tauri/.sqlx/query-97a52a8bbf020b77afe5dc427efb66abfdc6b571d1631a4f77fbf4fa5cfbe7e7.json index ee360eaf0..e0c2aeee7 100644 --- a/src-tauri/.sqlx/query-f88f92313f52f0b2c584f48b40e6edb4bc14d96f3000bd58a3ca68eecb8e4a88.json +++ b/src-tauri/.sqlx/query-97a52a8bbf020b77afe5dc427efb66abfdc6b571d1631a4f77fbf4fa5cfbe7e7.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, keepalive_interval, location_mfa_mode \"location_mfa_mode: LocationMfaMode\", service_location_mode \"service_location_mode: ServiceLocationMode\",\n mfa_method \"mfa_method: _\", posture_check_required FROM location WHERE pubkey = $1;", + "query": "SELECT id \"id: _\", instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, keepalive_interval, location_mfa_mode \"location_mfa_mode: LocationMfaMode\", service_location_mode \"service_location_mode: ServiceLocationMode\",\n mfa_method \"mfa_method: _\", posture_check_required FROM location WHERE pubkey = $1", "describe": { "columns": [ { @@ -100,5 +100,5 @@ false ] }, - "hash": "f88f92313f52f0b2c584f48b40e6edb4bc14d96f3000bd58a3ca68eecb8e4a88" + "hash": "97a52a8bbf020b77afe5dc427efb66abfdc6b571d1631a4f77fbf4fa5cfbe7e7" } diff --git a/src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json b/src-tauri/.sqlx/query-af70b9b18d8452a03d4d5624c2f3a11ab0d2e123989e97dfceb57e472523398c.json similarity index 67% rename from src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json rename to src-tauri/.sqlx/query-af70b9b18d8452a03d4d5624c2f3a11ab0d2e123989e97dfceb57e472523398c.json index a8ba1030a..a0a75036b 100644 --- a/src-tauri/.sqlx/query-ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e.json +++ b/src-tauri/.sqlx/query-af70b9b18d8452a03d4d5624c2f3a11ab0d2e123989e97dfceb57e472523398c.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "UPDATE location SET route_all_traffic = 0 WHERE instance_id = $1;", + "query": "UPDATE location SET route_all_traffic = 0 WHERE instance_id = $1", "describe": { "columns": [], "parameters": { @@ -8,5 +8,5 @@ }, "nullable": [] }, - "hash": "ba54bef9b71c2add858203b7be2c0e87d3a54d536ef96a923a6b949e16b9746e" + "hash": "af70b9b18d8452a03d4d5624c2f3a11ab0d2e123989e97dfceb57e472523398c" } diff --git a/src-tauri/.sqlx/query-49039d91cfdefbb32284d15af739a2090ba7baf9dee8cf00e8800b9a5f891fab.json b/src-tauri/.sqlx/query-c6a5e793cccc520039e28da8b4fb73e0c79c6a8d671c300ec2ea3eb0d58342b5.json similarity index 96% rename from src-tauri/.sqlx/query-49039d91cfdefbb32284d15af739a2090ba7baf9dee8cf00e8800b9a5f891fab.json rename to src-tauri/.sqlx/query-c6a5e793cccc520039e28da8b4fb73e0c79c6a8d671c300ec2ea3eb0d58342b5.json index c6b90053b..2436bff93 100644 --- a/src-tauri/.sqlx/query-49039d91cfdefbb32284d15af739a2090ba7baf9dee8cf00e8800b9a5f891fab.json +++ b/src-tauri/.sqlx/query-c6a5e793cccc520039e28da8b4fb73e0c79c6a8d671c300ec2ea3eb0d58342b5.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id, instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, keepalive_interval, location_mfa_mode \"location_mfa_mode: LocationMfaMode\", service_location_mode \"service_location_mode: ServiceLocationMode\", mfa_method \"mfa_method: _\", posture_check_required FROM location WHERE service_location_mode <= $1 ORDER BY name ASC;", + "query": "SELECT id, instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id, route_all_traffic, keepalive_interval, location_mfa_mode \"location_mfa_mode: LocationMfaMode\", service_location_mode \"service_location_mode: ServiceLocationMode\", mfa_method \"mfa_method: _\", posture_check_required FROM location WHERE service_location_mode <= $1 ORDER BY name ASC", "describe": { "columns": [ { @@ -100,5 +100,5 @@ false ] }, - "hash": "49039d91cfdefbb32284d15af739a2090ba7baf9dee8cf00e8800b9a5f891fab" + "hash": "c6a5e793cccc520039e28da8b4fb73e0c79c6a8d671c300ec2ea3eb0d58342b5" } diff --git a/src-tauri/src/bin/defguard-client.rs b/src-tauri/src/bin/defguard-client.rs index 74906b550..8925cd6f4 100644 --- a/src-tauri/src/bin/defguard-client.rs +++ b/src-tauri/src/bin/defguard-client.rs @@ -155,6 +155,7 @@ async fn startup(app_handle: &AppHandle) { } /// Open the appropriate window, either the old or the new UI, depending if there are locations. +#[cfg(not(target_os = "linux"))] fn open_appropriate_window(app_handle: &AppHandle) { let has_locations = async_runtime::block_on(has_non_service_locations()); if has_locations { diff --git a/src-tauri/src/database/models/location.rs b/src-tauri/src/database/models/location.rs index 85c470c35..543d480b9 100644 --- a/src-tauri/src/database/models/location.rs +++ b/src-tauri/src/database/models/location.rs @@ -5,7 +5,7 @@ use std::str::FromStr; #[cfg(not(target_os = "macos"))] use defguard_wireguard_rs::{key::Key, net::IpAddrMask, peer::Peer, InterfaceConfiguration}; use serde::{Deserialize, Serialize}; -use sqlx::{prelude::Type, query, query_as, query_scalar, Error as SqlxError, SqliteExecutor}; +use sqlx::{prelude::Type, query, query_as, query_scalar, SqliteExecutor}; #[cfg(not(target_os = "macos"))] use super::wireguard_keys::WireguardKeys; @@ -129,7 +129,7 @@ impl Location { pub(crate) async fn all<'e, E>( executor: E, include_service_locations: bool, - ) -> Result, SqlxError> + ) -> sqlx::Result> where E: SqliteExecutor<'e>, { @@ -143,14 +143,34 @@ impl Location { service_location_mode \"service_location_mode: ServiceLocationMode\", \ mfa_method \"mfa_method: _\", posture_check_required \ FROM location WHERE service_location_mode <= $1 \ - ORDER BY name ASC;", + ORDER BY name ASC", max_service_location_mode ) .fetch_all(executor) .await } - pub(crate) async fn save<'e, E>(&mut self, executor: E) -> Result<(), SqlxError> + #[cfg(any(windows, target_os = "macos"))] + pub(crate) async fn exist<'e, E>( + executor: E, + include_service_locations: bool, + ) -> sqlx::Result + where + E: SqliteExecutor<'e>, + { + let max_service_location_mode = + Self::get_service_location_mode_filter(include_service_locations); + let result = query_scalar!( + "SELECT EXISTS (SELECT 1 FROM location WHERE service_location_mode <= $1)", + max_service_location_mode + ) + .fetch_one(executor) + .await?; + + Ok(result != 0) + } + + pub(crate) async fn save<'e, E>(&mut self, executor: E) -> sqlx::Result<()> where E: SqliteExecutor<'e>, { @@ -186,7 +206,7 @@ impl Location { pub(crate) async fn find_by_id<'e, E>( executor: E, location_id: Id, - ) -> Result, SqlxError> + ) -> sqlx::Result> where E: SqliteExecutor<'e>, { @@ -208,7 +228,7 @@ impl Location { executor: E, instance_id: Id, include_service_locations: bool, - ) -> Result, SqlxError> + ) -> sqlx::Result> where E: SqliteExecutor<'e>, { @@ -230,10 +250,7 @@ impl Location { .await } - pub(crate) async fn find_by_public_key<'e, E>( - executor: E, - pubkey: &str, - ) -> Result + pub(crate) async fn find_by_public_key<'e, E>(executor: E, pubkey: &str) -> sqlx::Result where E: SqliteExecutor<'e>, { @@ -244,18 +261,18 @@ impl Location { location_mfa_mode \"location_mfa_mode: LocationMfaMode\", \ service_location_mode \"service_location_mode: ServiceLocationMode\", mfa_method \"mfa_method: _\", posture_check_required \ - FROM location WHERE pubkey = $1;", + FROM location WHERE pubkey = $1", pubkey ) .fetch_one(executor) .await } - pub(crate) async fn delete<'e, E>(&self, executor: E) -> Result<(), SqlxError> + pub(crate) async fn delete<'e, E>(&self, executor: E) -> sqlx::Result<()> where E: SqliteExecutor<'e>, { - query!("DELETE FROM location WHERE id = $1;", self.id) + query!("DELETE FROM location WHERE id = $1", self.id) .execute(executor) .await?; Ok(()) @@ -270,7 +287,7 @@ impl Location { E: SqliteExecutor<'e>, { query!( - "UPDATE location SET route_all_traffic = 0 WHERE instance_id = $1;", + "UPDATE location SET route_all_traffic = 0 WHERE instance_id = $1", instance_id ) .execute(executor) @@ -401,7 +418,7 @@ impl Location { } impl Location { - pub(crate) async fn save<'e, E>(self, executor: E) -> Result, SqlxError> + pub(crate) async fn save<'e, E>(self, executor: E) -> sqlx::Result> where E: SqliteExecutor<'e>, { diff --git a/src-tauri/src/window_manager/mod.rs b/src-tauri/src/window_manager/mod.rs index 2a782dd24..be3d38c02 100644 --- a/src-tauri/src/window_manager/mod.rs +++ b/src-tauri/src/window_manager/mod.rs @@ -8,10 +8,7 @@ use crate::database::{models::location::Location, DB_POOL}; /// Returns `true` if there are any non-service locations in the database. #[cfg(not(target_os = "linux"))] pub async fn has_non_service_locations() -> bool { - match Location::all(&*DB_POOL, false).await { - Ok(locations) => !locations.is_empty(), - Err(_) => false, - } + Location::exist(&*DB_POOL, false).await.unwrap_or_default() } pub const NEW_UI_WINDOW_ID: &str = "new-ui"; From ddfd31ad3a2f2e700e85c6d7016c818f46f3101f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Tue, 26 May 2026 20:14:25 +0200 Subject: [PATCH 4/5] Trigger workflow action --- package.json | 2 +- pnpm-lock.yaml | 324 ++++++++++++++++++++++++------------------------- 2 files changed, 163 insertions(+), 163 deletions(-) diff --git a/package.json b/package.json index fc5ab6899..ab4d56fe4 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@stablelib/base64": "^2.0.1", "@stablelib/x25519": "^2.0.1", "@tanstack/query-core": "^5.100.14", - "@tanstack/react-virtual": "^3.13.25", + "@tanstack/react-virtual": "^3.13.26", "@tauri-apps/api": "^2.11.0", "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-deep-link": "^2.4.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ea7039e1..b09b936b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: ^5.100.14 version: 5.100.14 '@tanstack/react-virtual': - specifier: ^3.13.25 - version: 3.13.25(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^3.13.26 + version: 3.13.26(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@tauri-apps/api': specifier: ^2.11.0 version: 2.11.0 @@ -255,91 +255,91 @@ importers: packages: - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.3': - resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.3': - resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} '@biomejs/biome@2.4.15': @@ -1162,14 +1162,14 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.25': - resolution: {integrity: sha512-bmNoqMu6gcAW9JGrKVB0Q1tN1i5RONZF8r1fW0bbE4Oyf3DwEGnzzQJ2OW+Ozg1P4s8PyugkHg2ULZoFQN+cqw==} + '@tanstack/react-virtual@3.13.26': + resolution: {integrity: sha512-DosdgjOxCLahkn0o+ilmZYwEjo1glfMGuRT/j3PQ18yr5XqA8N/BCaL9IJ3B5TRl+nnzyK2IOFgAILwzN3a9xQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.15.0': - resolution: {integrity: sha512-0AwPGx0I8QxPYjAxShT/+z+ZOe9u8mW5rsXvivCTjRfRmz9a43+3mRyi4wwlyoUqOC56q/jatKa0Bh9M99BEHQ==} + '@tanstack/virtual-core@3.16.0': + resolution: {integrity: sha512-Er2N7q3WOiH6y2JLxsxNX+u2/sLqSsL0bxFgDjuiPiA7vKhZRm+IzcS17vRee3GNXr64UsesA5CAp9yTiIYw9A==} '@tauri-apps/api@2.11.0': resolution: {integrity: sha512-7CinYODhky9lmO23xHnUFv0Xt43fbtWMyxZcLcRBlFkcgXKuEirBvHpmtJ89YMhyeGcq20Wuc47Fa4XjyniywA==} @@ -1464,8 +1464,8 @@ packages: brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - brace-expansion@2.1.0: - resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} brace-expansion@5.0.6: resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} @@ -1806,8 +1806,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.46.1: - resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} + es-toolkit@1.47.0: + resolution: {integrity: sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw==} esbuild@0.27.7: resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} @@ -3085,25 +3085,25 @@ packages: snapshots: - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.3': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -3113,91 +3113,91 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.7': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.3 - '@babel/helper-validator-option': 7.27.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-option@7.29.7': {} - '@babel/helpers@7.29.2': + '@babel/helpers@7.29.7': dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 - '@babel/parser@7.29.3': + '@babel/parser@7.29.7': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.3 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': + '@babel/types@7.29.7': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@biomejs/biome@2.4.15': optionalDependencies: @@ -3236,8 +3236,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.28.6 - '@babel/runtime': 7.29.2 + '@babel/helper-module-imports': 7.29.7 + '@babel/runtime': 7.29.7 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -3268,7 +3268,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -3294,7 +3294,7 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@19.2.15)(react@19.2.6) @@ -3686,49 +3686,49 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.0)': + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.29.7 - '@svgr/babel-preset@8.1.0(@babel/core@7.29.0)': + '@svgr/babel-preset@8.1.0(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.0) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.0) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.0) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.0) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.0) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.0) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.0) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.29.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.7) '@svgr/cli@8.1.0(typescript@6.0.3)': dependencies: @@ -3748,8 +3748,8 @@ snapshots: '@svgr/core@8.1.0(typescript@6.0.3)': dependencies: - '@babel/core': 7.29.0 - '@svgr/babel-preset': 8.1.0(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7) camelcase: 6.3.0 cosmiconfig: 8.3.6(typescript@6.0.3) snake-case: 3.0.4 @@ -3759,13 +3759,13 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@6.0.3))': dependencies: - '@babel/core': 7.29.0 - '@svgr/babel-preset': 8.1.0(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.29.7) '@svgr/core': 8.1.0(typescript@6.0.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 @@ -3862,13 +3862,13 @@ snapshots: '@tanstack/query-core': 5.100.14 react: 19.2.6 - '@tanstack/react-virtual@3.13.25(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@tanstack/react-virtual@3.13.26(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@tanstack/virtual-core': 3.15.0 + '@tanstack/virtual-core': 3.16.0 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@tanstack/virtual-core@3.15.0': {} + '@tanstack/virtual-core@3.16.0': {} '@tauri-apps/api@2.11.0': {} @@ -3965,24 +3965,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 '@types/byte-size@8.1.2': {} @@ -4079,9 +4079,9 @@ snapshots: '@vitejs/plugin-react@5.2.0(vite@7.3.3(@types/node@25.9.1)(sass@1.92.1)(yaml@2.9.0))': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 @@ -4133,7 +4133,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 cosmiconfig: 7.1.0 resolve: 1.22.12 @@ -4152,7 +4152,7 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.0: + brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 @@ -4539,7 +4539,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.46.1: {} + es-toolkit@1.47.0: {} esbuild@0.27.7: optionalDependencies: @@ -5230,7 +5230,7 @@ snapshots: minimatch@5.1.9: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 2.1.1 motion-dom@12.40.0: dependencies: @@ -5334,7 +5334,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5489,7 +5489,7 @@ snapshots: '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1))(react@19.2.6) clsx: 2.1.1 decimal.js-light: 2.5.1 - es-toolkit: 1.46.1 + es-toolkit: 1.47.0 eventemitter3: 5.0.4 immer: 10.2.0 react: 19.2.6 @@ -5926,7 +5926,7 @@ snapshots: use-deep-compare-effect@1.8.1(react@19.2.6): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 dequal: 2.0.3 react: 19.2.6 From bd5b9ae20d274e6c8bfa299abd53c2a6b8b54aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Wed, 27 May 2026 05:59:16 +0200 Subject: [PATCH 5/5] Another workflow trigger --- src-tauri/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 9882914b2..1015b0d5b 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3520,9 +3520,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" [[package]] name = "memoffset"