From b5aa018702bf45dc98297698f9b7d238705865a6 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Thu, 9 Oct 2025 08:30:36 -0300 Subject: [PATCH 001/119] feat(cli): update cargo-mobile2 to 0.21, closes #14238 (#14268) --- .changes/cargo-mobile-0.21.md | 6 ++++++ Cargo.lock | 10 +++++----- crates/tauri-cli/Cargo.toml | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 .changes/cargo-mobile-0.21.md diff --git a/.changes/cargo-mobile-0.21.md b/.changes/cargo-mobile-0.21.md new file mode 100644 index 000000000..17e99609f --- /dev/null +++ b/.changes/cargo-mobile-0.21.md @@ -0,0 +1,6 @@ +--- +'tauri-cli': 'minor:enhance' +'@tauri-apps/cli': minor:enhance +--- + +Update cargo-mobile2 to 0.21, enhancing error messages and opening Xcode when multiple apps are installed. diff --git a/Cargo.lock b/Cargo.lock index 56ec5ecad..16526fe9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1055,9 +1055,9 @@ dependencies = [ [[package]] name = "cargo-mobile2" -version = "0.20.6" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35613119e2e16b293e56557a27da0d5bc42031f5edc0bf4f73a2b4d310d39c65" +checksum = "7705eddd52bb9e1d1fa94b79c5e869055fdf505a27217574c6ebd4f35389abbe" dependencies = [ "colored", "core-foundation 0.10.0", @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -4311,7 +4311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -10315,7 +10315,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index b8bf475c4..e854602c7 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -36,7 +36,7 @@ name = "cargo-tauri" path = "src/main.rs" [target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"windows\", target_os = \"macos\"))".dependencies] -cargo-mobile2 = { version = "0.20.6", default-features = false } +cargo-mobile2 = { version = "0.21", default-features = false } [dependencies] jsonrpsee = { version = "0.24", features = ["server"] } From c5008b829dc779f0768089bff9b891fc76b11355 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Fri, 10 Oct 2025 19:11:08 +0800 Subject: [PATCH 002/119] fix: skip empty script tag for CSP hash properly (#14274) * fix: skip empty script tag for CSP hash properly * add change file --------- Co-authored-by: Lucas Nogueira --- .changes/fix-csp-empty-selector.md | 5 +++++ crates/tauri-codegen/src/context.rs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changes/fix-csp-empty-selector.md diff --git a/.changes/fix-csp-empty-selector.md b/.changes/fix-csp-empty-selector.md new file mode 100644 index 000000000..e40457b1e --- /dev/null +++ b/.changes/fix-csp-empty-selector.md @@ -0,0 +1,5 @@ +--- +"tauri-codegen": patch:bug +--- + +Do not hash empty scripts when generating the Content-Security-Policy SHA-256 hashes. diff --git a/crates/tauri-codegen/src/context.rs b/crates/tauri-codegen/src/context.rs index ed61481d2..9176aea64 100644 --- a/crates/tauri-codegen/src/context.rs +++ b/crates/tauri-codegen/src/context.rs @@ -45,7 +45,7 @@ pub struct ContextData { } fn inject_script_hashes(document: &NodeRef, key: &AssetKey, csp_hashes: &mut CspHashes) { - if let Ok(inline_script_elements) = document.select("script:not(empty)") { + if let Ok(inline_script_elements) = document.select("script:not(:empty)") { let mut scripts = Vec::new(); for inline_script_el in inline_script_elements { let script = inline_script_el.as_node().text_contents(); From 7b0d4e73227e42d88732b6d9fe643499dd78ec4e Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Fri, 10 Oct 2025 08:11:38 -0300 Subject: [PATCH 003/119] fix(core): SHA256 hash for JS scripts CSP on Windows (#14265) * fix(core): SHA256 hash for JS scripts CSP on Windows we hash JS scripts as SHA256 for the Content-Security-Policy (CSP) header. The isolation pattern is broken on Windows due to the hash including carriage return characters, which are not processed when the webview checks the script hash to see if the CSP allows the script. * fmt, clippy --- .changes/fix-csp-windows.md | 5 +++ .changes/normalize_script_for_csp.md | 5 +++ crates/tauri-codegen/src/context.rs | 4 +- crates/tauri-codegen/src/embedded_assets.rs | 10 +++-- crates/tauri-utils/src/html.rs | 42 +++++++++++++++++++++ 5 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 .changes/fix-csp-windows.md create mode 100644 .changes/normalize_script_for_csp.md diff --git a/.changes/fix-csp-windows.md b/.changes/fix-csp-windows.md new file mode 100644 index 000000000..8321e7b1a --- /dev/null +++ b/.changes/fix-csp-windows.md @@ -0,0 +1,5 @@ +--- +"tauri-codegen": patch:bug +--- + +Fix JavaScript SHA256 hash generation on Windows not ignoring carriage return characters. diff --git a/.changes/normalize_script_for_csp.md b/.changes/normalize_script_for_csp.md new file mode 100644 index 000000000..3fa4bb533 --- /dev/null +++ b/.changes/normalize_script_for_csp.md @@ -0,0 +1,5 @@ +--- +"tauri-utils": patch:feat +--- + +Added `html::normalize_script_for_csp`. diff --git a/crates/tauri-codegen/src/context.rs b/crates/tauri-codegen/src/context.rs index 9176aea64..87a05d702 100644 --- a/crates/tauri-codegen/src/context.rs +++ b/crates/tauri-codegen/src/context.rs @@ -50,7 +50,9 @@ fn inject_script_hashes(document: &NodeRef, key: &AssetKey, csp_hashes: &mut Csp for inline_script_el in inline_script_elements { let script = inline_script_el.as_node().text_contents(); let mut hasher = Sha256::new(); - hasher.update(&script); + hasher.update(tauri_utils::html::normalize_script_for_csp( + script.as_bytes(), + )); let hash = hasher.finalize(); scripts.push(format!( "'sha256-{}'", diff --git a/crates/tauri-codegen/src/embedded_assets.rs b/crates/tauri-codegen/src/embedded_assets.rs index 20b00a105..ede7ee6d9 100644 --- a/crates/tauri-codegen/src/embedded_assets.rs +++ b/crates/tauri-codegen/src/embedded_assets.rs @@ -180,10 +180,12 @@ impl CspHashes { if dangerous_disable_asset_csp_modification.can_modify("script-src") { let mut hasher = Sha256::new(); hasher.update( - &std::fs::read(path).map_err(|error| EmbeddedAssetsError::AssetRead { - path: path.to_path_buf(), - error, - })?, + &std::fs::read(path) + .map(|b| tauri_utils::html::normalize_script_for_csp(&b)) + .map_err(|error| EmbeddedAssetsError::AssetRead { + path: path.to_path_buf(), + error, + })?, ); let hash = hasher.finalize(); self.scripts.push(format!( diff --git a/crates/tauri-utils/src/html.rs b/crates/tauri-utils/src/html.rs index bfa203f00..d29a61d08 100644 --- a/crates/tauri-utils/src/html.rs +++ b/crates/tauri-utils/src/html.rs @@ -286,6 +286,38 @@ pub fn inline_isolation(document: &NodeRef, dir: &Path) { } } +/// Normalize line endings in script content to match what the browser uses for CSP hashing. +/// +/// According to the HTML spec, browsers normalize: +/// - `\r\n` → `\n` +/// - `\r` → `\n` +pub fn normalize_script_for_csp(input: &[u8]) -> Vec { + let mut output = Vec::with_capacity(input.len()); + + let mut i = 0; + while i < input.len() { + match input[i] { + b'\r' => { + if i + 1 < input.len() && input[i + 1] == b'\n' { + // CRLF → LF + output.push(b'\n'); + i += 2; + } else { + // Lone CR → LF + output.push(b'\n'); + i += 1; + } + } + _ => { + output.push(input[i]); + i += 1; + } + } + } + + output +} + #[cfg(test)] mod tests { @@ -307,4 +339,14 @@ mod tests { ); } } + + #[test] + fn normalize_script_for_csp() { + let js = "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\r// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\r\n\r\nwindow.__TAURI_ISOLATION_HOOK__ = (payload, options) => {\r\n return payload\r\n}\r\n"; + let expected = "// Copyright 2019-2024 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n\nwindow.__TAURI_ISOLATION_HOOK__ = (payload, options) => {\n return payload\n}\n"; + assert_eq!( + super::normalize_script_for_csp(js.as_bytes()), + expected.as_bytes() + ) + } } From a27948585662db6da90aaef998a7a43efdb6f647 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Fri, 10 Oct 2025 13:44:33 -0300 Subject: [PATCH 004/119] chore(cli): update cargo-mobile2 to 0.21.1 applies https://github.com/tauri-apps/cargo-mobile2/pull/491 --- Cargo.lock | 4 ++-- crates/tauri-cli/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16526fe9c..e1acdb31e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1055,9 +1055,9 @@ dependencies = [ [[package]] name = "cargo-mobile2" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7705eddd52bb9e1d1fa94b79c5e869055fdf505a27217574c6ebd4f35389abbe" +checksum = "dcea7efeaac9f0fd9f886f43a13dde186a1e2266fe6b53a42659e4e0689570de" dependencies = [ "colored", "core-foundation 0.10.0", diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index e854602c7..d46bf7ef2 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -36,7 +36,7 @@ name = "cargo-tauri" path = "src/main.rs" [target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\", target_os = \"windows\", target_os = \"macos\"))".dependencies] -cargo-mobile2 = { version = "0.21", default-features = false } +cargo-mobile2 = { version = "0.21.1", default-features = false } [dependencies] jsonrpsee = { version = "0.24", features = ["server"] } From 25e920e169db900ca4f07c2bb9eb290e9f9f2c7d Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Tue, 14 Oct 2025 07:28:18 -0300 Subject: [PATCH 005/119] fix(cli): wait for dev command to exit with --no-watch, closes #14284 (#14298) --- .changes/fix-no-watch-dev-server-kill.md | 6 ++++++ crates/tauri-cli/src/interface/rust.rs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changes/fix-no-watch-dev-server-kill.md diff --git a/.changes/fix-no-watch-dev-server-kill.md b/.changes/fix-no-watch-dev-server-kill.md new file mode 100644 index 000000000..f9bb0d0be --- /dev/null +++ b/.changes/fix-no-watch-dev-server-kill.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Wait for dev server to exit before exiting the CLI when the app is closed on `tauri dev --no-watch`. diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index c52c4f508..067dd5ca3 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -215,8 +215,8 @@ impl Interface for Rust { if options.no_watch { let (tx, rx) = sync_channel(1); self.run_dev(options, run_args, move |status, reason| { + on_exit(status, reason); tx.send(()).unwrap(); - on_exit(status, reason) })?; rx.recv().unwrap(); From 684791efa6f3c671a0435d456ac208bca871d8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20H=C3=A4cker?= Date: Tue, 14 Oct 2025 16:58:43 +0200 Subject: [PATCH 006/119] fix(macos): Always try to create webview, even if webkit runtime isn't detected correctly (#14276) --- .changes/macos-always-create-webview.md | 5 +++++ crates/tauri-runtime-wry/src/lib.rs | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .changes/macos-always-create-webview.md diff --git a/.changes/macos-always-create-webview.md b/.changes/macos-always-create-webview.md new file mode 100644 index 000000000..835782ba8 --- /dev/null +++ b/.changes/macos-always-create-webview.md @@ -0,0 +1,5 @@ +--- +"tauri-runtime-wry": patch:bug +--- + +Always try to create macOS WebKit webview, even if webkit runtime doesn't get detected correctly diff --git a/crates/tauri-runtime-wry/src/lib.rs b/crates/tauri-runtime-wry/src/lib.rs index 4b47b9d17..1aac9f1aa 100644 --- a/crates/tauri-runtime-wry/src/lib.rs +++ b/crates/tauri-runtime-wry/src/lib.rs @@ -4535,7 +4535,11 @@ You may have it installed on another user account, but it is not available for t "#, ); - return Err(Error::WebviewRuntimeNotInstalled); + if cfg!(target_os = "macos") { + log::warn!("WebKit webview runtime not found, attempting to create webview anyway."); + } else { + return Err(Error::WebviewRuntimeNotInstalled); + } } #[allow(unused_mut)] From 3b4fac2017832d426dd07c5e24e26684eda57f7b Mon Sep 17 00:00:00 2001 From: Bipin Pandey <31367252+bipsBro@users.noreply.github.com> Date: Tue, 14 Oct 2025 23:46:54 +0545 Subject: [PATCH 007/119] feat(android): add auto_increment_version_code option for Android builds (#14194) * add new api (auto_increment_version_code) in android configuration * ensure increment is only ran once * skip on dev * update doc * change file --------- Co-authored-by: Lucas Nogueira --- .../auto-increment-android-version-code.md | 8 +++ crates/tauri-build/src/lib.rs | 2 +- crates/tauri-build/src/mobile.rs | 57 +---------------- crates/tauri-cli/config.schema.json | 7 ++ crates/tauri-cli/src/mobile/android/build.rs | 8 ++- crates/tauri-cli/src/mobile/android/dev.rs | 6 +- crates/tauri-cli/src/mobile/android/mod.rs | 64 +++++++++++++++++++ .../schemas/config.schema.json | 7 ++ crates/tauri-utils/src/config.rs | 11 ++++ 9 files changed, 112 insertions(+), 58 deletions(-) create mode 100644 .changes/auto-increment-android-version-code.md diff --git a/.changes/auto-increment-android-version-code.md b/.changes/auto-increment-android-version-code.md new file mode 100644 index 000000000..1703ae424 --- /dev/null +++ b/.changes/auto-increment-android-version-code.md @@ -0,0 +1,8 @@ +--- +"tauri-cli": minor:feat +"@tauri-apps/cli": minor:feat +"tauri-build": minor:feat +"tauri-utils": minor:feat +--- + +Add `tauri.conf.json > bundle > android > autoIncrementVersionCode` config option to automatically increment the Android version code. diff --git a/crates/tauri-build/src/lib.rs b/crates/tauri-build/src/lib.rs index 5e392d210..1cd9c7b78 100644 --- a/crates/tauri-build/src/lib.rs +++ b/crates/tauri-build/src/lib.rs @@ -499,7 +499,7 @@ pub fn try_build(attributes: Attributes) -> Result<()> { println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_NAME_PREFIX={android_package_prefix}"); if let Some(project_dir) = env::var_os("TAURI_ANDROID_PROJECT_PATH").map(PathBuf::from) { - mobile::generate_gradle_files(project_dir, &config)?; + mobile::generate_gradle_files(project_dir)?; } cfg_alias("dev", is_dev()); diff --git a/crates/tauri-build/src/mobile.rs b/crates/tauri-build/src/mobile.rs index 836b0d935..9acef2e91 100644 --- a/crates/tauri-build/src/mobile.rs +++ b/crates/tauri-build/src/mobile.rs @@ -2,18 +2,14 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use std::{fs::write, path::PathBuf}; +use std::path::PathBuf; use anyhow::{Context, Result}; -use semver::Version; -use tauri_utils::{config::Config, write_if_changed}; +use tauri_utils::write_if_changed; -use crate::is_dev; - -pub fn generate_gradle_files(project_dir: PathBuf, config: &Config) -> Result<()> { +pub fn generate_gradle_files(project_dir: PathBuf) -> Result<()> { let gradle_settings_path = project_dir.join("tauri.settings.gradle"); let app_build_gradle_path = project_dir.join("app").join("tauri.build.gradle.kts"); - let app_tauri_properties_path = project_dir.join("app").join("tauri.properties"); let mut gradle_settings = "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n".to_string(); @@ -21,7 +17,6 @@ pub fn generate_gradle_files(project_dir: PathBuf, config: &Config) -> Result<() val implementation by configurations dependencies {" .to_string(); - let mut app_tauri_properties = Vec::new(); for (env, value) in std::env::vars_os() { let env = env.to_string_lossy(); @@ -54,32 +49,6 @@ dependencies {" app_build_gradle.push_str("\n}"); - if let Some(version) = config.version.as_ref() { - app_tauri_properties.push(format!("tauri.android.versionName={version}")); - if let Some(version_code) = config.bundle.android.version_code.as_ref() { - app_tauri_properties.push(format!("tauri.android.versionCode={version_code}")); - } else if let Ok(version) = Version::parse(version) { - let mut version_code = version.major * 1000000 + version.minor * 1000 + version.patch; - - if is_dev() { - version_code = version_code.clamp(1, 2100000000); - } - - if version_code == 0 { - return Err(anyhow::anyhow!( - "You must change the `version` in `tauri.conf.json`. The default value `0.0.0` is not allowed for Android package and must be at least `0.0.1`." - )); - } else if version_code > 2100000000 { - return Err(anyhow::anyhow!( - "Invalid version code {}. Version code must be between 1 and 2100000000. You must change the `version` in `tauri.conf.json`.", - version_code - )); - } - - app_tauri_properties.push(format!("tauri.android.versionCode={version_code}")); - } - } - // Overwrite only if changed to not trigger rebuilds write_if_changed(&gradle_settings_path, gradle_settings) .context("failed to write tauri.settings.gradle")?; @@ -87,28 +56,8 @@ dependencies {" write_if_changed(&app_build_gradle_path, app_build_gradle) .context("failed to write tauri.build.gradle.kts")?; - if !app_tauri_properties.is_empty() { - let app_tauri_properties_content = format!( - "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n{}", - app_tauri_properties.join("\n") - ); - if std::fs::read_to_string(&app_tauri_properties_path) - .map(|o| o != app_tauri_properties_content) - .unwrap_or(true) - { - write(&app_tauri_properties_path, app_tauri_properties_content) - .context("failed to write tauri.properties")?; - } - } - println!("cargo:rerun-if-changed={}", gradle_settings_path.display()); println!("cargo:rerun-if-changed={}", app_build_gradle_path.display()); - if !app_tauri_properties.is_empty() { - println!( - "cargo:rerun-if-changed={}", - app_tauri_properties_path.display() - ); - } Ok(()) } diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 6d480475c..0c25453f3 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -84,6 +84,7 @@ "default": { "active": false, "android": { + "autoIncrementVersionCode": false, "minSdkVersion": 24 }, "createUpdaterArtifacts": false, @@ -2282,6 +2283,7 @@ "android": { "description": "Android configuration.", "default": { + "autoIncrementVersionCode": false, "minSdkVersion": 24 }, "allOf": [ @@ -3826,6 +3828,11 @@ "format": "uint32", "maximum": 2100000000.0, "minimum": 1.0 + }, + "autoIncrementVersionCode": { + "description": "Whether to automatically increment the `versionCode` on each build.\n\n - If `true`, the generator will try to read the last `versionCode` from\n `tauri.properties` and increment it by 1 for every build.\n - If `false` or not set, it falls back to `version_code` or semver-derived logic.\n\n Note that to use this feature, you should remove `/tauri.properties` from `src-tauri/gen/android/app/.gitignore` so the current versionCode is committed to the repository.", + "default": false, + "type": "boolean" } }, "additionalProperties": false diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index a8f5ff2d2..86c4f22c5 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -15,7 +15,7 @@ use crate::{ flock, }, interface::{AppInterface, Interface, Options as InterfaceOptions}, - mobile::{write_options, CliOptions, TargetDevice}, + mobile::{android::generate_tauri_properties, write_options, CliOptions, TargetDevice}, ConfigValue, Error, Result, }; use clap::{ArgAction, Parser}; @@ -178,6 +178,12 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result Result<()> { Ok(()) } + +fn generate_tauri_properties( + config: &AndroidConfig, + tauri_config: &TauriConfig, + dev: bool, +) -> Result<()> { + let app_tauri_properties_path = config.project_dir().join("app").join("tauri.properties"); + + let mut app_tauri_properties = Vec::new(); + if let Some(version) = tauri_config.version.as_ref() { + app_tauri_properties.push(format!("tauri.android.versionName={version}")); + if tauri_config.bundle.android.auto_increment_version_code && !dev { + let last_version_code = std::fs::read_to_string(&app_tauri_properties_path) + .ok() + .and_then(|content| { + content + .lines() + .find(|line| line.starts_with("tauri.android.versionCode=")) + .and_then(|line| line.split('=').nth(1)) + .and_then(|s| s.trim().parse::().ok()) + }); + let new_version_code = last_version_code.map(|v| v.saturating_add(1)).unwrap_or(1); + app_tauri_properties.push(format!("tauri.android.versionCode={new_version_code}")); + } else if let Some(version_code) = tauri_config.bundle.android.version_code.as_ref() { + app_tauri_properties.push(format!("tauri.android.versionCode={version_code}")); + } else if let Ok(version) = Version::parse(version) { + let mut version_code = version.major * 1000000 + version.minor * 1000 + version.patch; + + if dev { + version_code = version_code.clamp(1, 2100000000); + } + + if version_code == 0 { + crate::error::bail!( + "You must change the `version` in `tauri.conf.json`. The default value `0.0.0` is not allowed for Android package and must be at least `0.0.1`." + ); + } else if version_code > 2100000000 { + crate::error::bail!( + "Invalid version code {}. Version code must be between 1 and 2100000000. You must change the `version` in `tauri.conf.json`.", + version_code + ); + } + + app_tauri_properties.push(format!("tauri.android.versionCode={version_code}")); + } + } + + if !app_tauri_properties.is_empty() { + let app_tauri_properties_content = format!( + "// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.\n{}", + app_tauri_properties.join("\n") + ); + if std::fs::read_to_string(&app_tauri_properties_path) + .map(|o| o != app_tauri_properties_content) + .unwrap_or(true) + { + write(&app_tauri_properties_path, app_tauri_properties_content) + .context("failed to write tauri.properties")?; + } + } + + Ok(()) +} diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 6d480475c..0c25453f3 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -84,6 +84,7 @@ "default": { "active": false, "android": { + "autoIncrementVersionCode": false, "minSdkVersion": 24 }, "createUpdaterArtifacts": false, @@ -2282,6 +2283,7 @@ "android": { "description": "Android configuration.", "default": { + "autoIncrementVersionCode": false, "minSdkVersion": 24 }, "allOf": [ @@ -3826,6 +3828,11 @@ "format": "uint32", "maximum": 2100000000.0, "minimum": 1.0 + }, + "autoIncrementVersionCode": { + "description": "Whether to automatically increment the `versionCode` on each build.\n\n - If `true`, the generator will try to read the last `versionCode` from\n `tauri.properties` and increment it by 1 for every build.\n - If `false` or not set, it falls back to `version_code` or semver-derived logic.\n\n Note that to use this feature, you should remove `/tauri.properties` from `src-tauri/gen/android/app/.gitignore` so the current versionCode is committed to the repository.", + "default": false, + "type": "boolean" } }, "additionalProperties": false diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index 89ec983c7..40d33292a 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -2929,6 +2929,16 @@ pub struct AndroidConfig { #[serde(alias = "version-code")] #[cfg_attr(feature = "schema", validate(range(min = 1, max = 2_100_000_000)))] pub version_code: Option, + + /// Whether to automatically increment the `versionCode` on each build. + /// + /// - If `true`, the generator will try to read the last `versionCode` from + /// `tauri.properties` and increment it by 1 for every build. + /// - If `false` or not set, it falls back to `version_code` or semver-derived logic. + /// + /// Note that to use this feature, you should remove `/tauri.properties` from `src-tauri/gen/android/app/.gitignore` so the current versionCode is committed to the repository. + #[serde(alias = "auto-increment-version-code", default)] + pub auto_increment_version_code: bool, } impl Default for AndroidConfig { @@ -2936,6 +2946,7 @@ impl Default for AndroidConfig { Self { min_sdk_version: default_min_sdk_version(), version_code: None, + auto_increment_version_code: false, } } } From 3397fd9bfe5f6b1337110149f6c34731b8a44bb3 Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Wed, 15 Oct 2025 20:50:15 -0300 Subject: [PATCH 008/119] feat(core): back button event on Android, closes #8142 (#14133) * feat(core): back button event and exit on Android, closes #8142 I've used https://github.com/ionic-team/capacitor-plugins/blob/main/app/android/src/main/java/com/capacitorjs/plugins/app/AppPlugin.java as a reference here, checking if there's a back button event handler with a default of webview's goBack implementation * missing change file * remove exit impl * fmt * update wry * fix default back press * add remove_listener --- .changes/android-app-plugin.md | 5 ++ .changes/back-button-press-api.md | 5 ++ Cargo.lock | 4 +- crates/tauri-runtime-wry/Cargo.toml | 2 +- crates/tauri/build.rs | 2 + .../mobile/android-codegen/TauriActivity.kt | 1 + .../src/main/java/app/tauri/AppPlugin.kt | 54 +++++++++++++++++++ .../src/main/java/app/tauri/plugin/Plugin.kt | 6 ++- .../app/autogenerated/reference.md | 54 +++++++++++++++++++ crates/tauri/scripts/bundle.global.js | 2 +- crates/tauri/src/app/plugin.rs | 11 ++++ crates/tauri/src/path/android.rs | 5 +- packages/api/src/app.ts | 28 +++++++++- 13 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 .changes/android-app-plugin.md create mode 100644 .changes/back-button-press-api.md create mode 100644 crates/tauri/mobile/android/src/main/java/app/tauri/AppPlugin.kt diff --git a/.changes/android-app-plugin.md b/.changes/android-app-plugin.md new file mode 100644 index 000000000..5c575a700 --- /dev/null +++ b/.changes/android-app-plugin.md @@ -0,0 +1,5 @@ +--- +"tauri": minor:feat +--- + +Added mobile app plugin to support exit and back button press event. diff --git a/.changes/back-button-press-api.md b/.changes/back-button-press-api.md new file mode 100644 index 000000000..cb5c31926 --- /dev/null +++ b/.changes/back-button-press-api.md @@ -0,0 +1,5 @@ +--- +"@tauri-apps/api": minor:feat +--- + +Added `app > onBackButtonPress` for Android back button handling. diff --git a/Cargo.lock b/Cargo.lock index e1acdb31e..882439070 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10947,9 +10947,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.53.2" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b6763512fe4b51c80b3ce9b50939d682acb4de335dfabbdb20d7a2642199b7" +checksum = "6d78ec082b80fa088569a970d043bb3050abaabf4454101d44514ee8d9a8c9f6" dependencies = [ "base64 0.22.1", "block2 0.6.0", diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index d2d7a34ff..bddc37c1e 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -17,7 +17,7 @@ rustc-args = ["--cfg", "docsrs"] rustdoc-args = ["--cfg", "docsrs"] [dependencies] -wry = { version = "0.53.2", default-features = false, features = [ +wry = { version = "0.53.4", default-features = false, features = [ "drag-drop", "protocol", "os-webview", diff --git a/crates/tauri/build.rs b/crates/tauri/build.rs index 4248728b5..d63401ed0 100644 --- a/crates/tauri/build.rs +++ b/crates/tauri/build.rs @@ -164,6 +164,8 @@ const PLUGINS: &[(&str, &[(&str, bool)])] = &[ ("set_app_theme", false), ("set_dock_visibility", false), ("bundle_type", true), + ("register_listener", true), + ("remove_listener", true), ], ), ( diff --git a/crates/tauri/mobile/android-codegen/TauriActivity.kt b/crates/tauri/mobile/android-codegen/TauriActivity.kt index 1b3fb7b0f..2420a0998 100644 --- a/crates/tauri/mobile/android-codegen/TauriActivity.kt +++ b/crates/tauri/mobile/android-codegen/TauriActivity.kt @@ -12,6 +12,7 @@ import app.tauri.plugin.PluginManager abstract class TauriActivity : WryActivity() { var pluginManager: PluginManager = PluginManager(this) + override val handleBackNavigation: Boolean = false override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/AppPlugin.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/AppPlugin.kt new file mode 100644 index 000000000..0c2dc71f7 --- /dev/null +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/AppPlugin.kt @@ -0,0 +1,54 @@ +// Copyright 2019-2024 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +package app.tauri + +import android.app.Activity +import android.webkit.WebView +import androidx.activity.OnBackPressedCallback +import androidx.appcompat.app.AppCompatActivity +import app.tauri.annotation.Command +import app.tauri.annotation.TauriPlugin +import app.tauri.plugin.Plugin +import app.tauri.plugin.Invoke +import app.tauri.plugin.JSObject + +@TauriPlugin +class AppPlugin(private val activity: Activity): Plugin(activity) { + private val BACK_BUTTON_EVENT = "back-button" + + private var webView: WebView? = null + + override fun load(webView: WebView) { + this.webView = webView + } + + init { + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (!hasListener(BACK_BUTTON_EVENT)) { + if (this@AppPlugin.webView?.canGoBack() == true) { + this@AppPlugin.webView!!.goBack() + } else { + this.isEnabled = false + this@AppPlugin.activity.onBackPressed() + this.isEnabled = true + } + } else { + val data = JSObject().apply { + put("canGoBack", this@AppPlugin.webView?.canGoBack() ?: false) + } + trigger(BACK_BUTTON_EVENT, data) + } + } + } + (activity as AppCompatActivity).onBackPressedDispatcher.addCallback(activity, callback) + } + + @Command + fun exit(invoke: Invoke) { + invoke.resolve() + activity.finish() + } +} diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt index 3a6cde9bf..70b2b6317 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt @@ -8,7 +8,6 @@ import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.net.Uri -import android.os.Bundle import android.webkit.WebView import androidx.activity.result.IntentSenderRequest import androidx.core.app.ActivityCompat @@ -22,7 +21,6 @@ import app.tauri.annotation.InvokeArg import app.tauri.annotation.PermissionCallback import app.tauri.annotation.TauriPlugin import com.fasterxml.jackson.databind.ObjectMapper -import org.json.JSONException import java.util.* import java.util.concurrent.CopyOnWriteArrayList @@ -148,6 +146,10 @@ abstract class Plugin(private val activity: Activity) { } } + fun hasListener(event: String): Boolean { + return !listeners[event].isNullOrEmpty() + } + @Command open fun registerListener(invoke: Invoke) { val args = invoke.parseArgs(RegisterListenerArgs::class.java) diff --git a/crates/tauri/permissions/app/autogenerated/reference.md b/crates/tauri/permissions/app/autogenerated/reference.md index 1b721d6c8..178a632d9 100644 --- a/crates/tauri/permissions/app/autogenerated/reference.md +++ b/crates/tauri/permissions/app/autogenerated/reference.md @@ -9,6 +9,8 @@ Default permissions for the plugin. - `allow-tauri-version` - `allow-identifier` - `allow-bundle-type` +- `allow-register-listener` +- `allow-remove-listener` ## Permission Table @@ -204,6 +206,32 @@ Denies the name command without any pre-configured scope. +`core:app:allow-register-listener` + + + + +Enables the register_listener command without any pre-configured scope. + + + + + + + +`core:app:deny-register-listener` + + + + +Denies the register_listener command without any pre-configured scope. + + + + + + + `core:app:allow-remove-data-store` @@ -230,6 +258,32 @@ Denies the remove_data_store command without any pre-configured scope. +`core:app:allow-remove-listener` + + + + +Enables the remove_listener command without any pre-configured scope. + + + + + + + +`core:app:deny-remove-listener` + + + + +Denies the remove_listener command without any pre-configured scope. + + + + + + + `core:app:allow-set-app-theme` diff --git a/crates/tauri/scripts/bundle.global.js b/crates/tauri/scripts/bundle.global.js index 870ac2ec6..0b3f0bf86 100644 --- a/crates/tauri/scripts/bundle.global.js +++ b/crates/tauri/scripts/bundle.global.js @@ -1 +1 @@ -var __TAURI_IIFE__=function(e){"use strict";function n(e,n,t,i){if("a"===t&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!i:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===t?i:"a"===t?i.call(e):i?i.value:n.get(e)}function t(e,n,t,i,r){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?r.call(e,t):r?r.value=t:n.set(e,t),t}var i,r,s,a,l;"function"==typeof SuppressedError&&SuppressedError;const o="__TAURI_TO_IPC_KEY__";function u(e,n=!1){return window.__TAURI_INTERNALS__.transformCallback(e,n)}class c{constructor(e){i.set(this,void 0),r.set(this,0),s.set(this,[]),a.set(this,void 0),t(this,i,e||(()=>{}),"f"),this.id=u(e=>{const l=e.index;if("end"in e)return void(l==n(this,r,"f")?this.cleanupCallback():t(this,a,l,"f"));const o=e.message;if(l==n(this,r,"f")){for(n(this,i,"f").call(this,o),t(this,r,n(this,r,"f")+1,"f");n(this,r,"f")in n(this,s,"f");){const e=n(this,s,"f")[n(this,r,"f")];n(this,i,"f").call(this,e),delete n(this,s,"f")[n(this,r,"f")],t(this,r,n(this,r,"f")+1,"f")}n(this,r,"f")===n(this,a,"f")&&this.cleanupCallback()}else n(this,s,"f")[l]=o})}cleanupCallback(){window.__TAURI_INTERNALS__.unregisterCallback(this.id)}set onmessage(e){t(this,i,e,"f")}get onmessage(){return n(this,i,"f")}[(i=new WeakMap,r=new WeakMap,s=new WeakMap,a=new WeakMap,o)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[o]()}}class d{constructor(e,n,t){this.plugin=e,this.event=n,this.channelId=t}async unregister(){return p(`plugin:${this.plugin}|remove_listener`,{event:this.event,channelId:this.channelId})}}async function p(e,n={},t){return window.__TAURI_INTERNALS__.invoke(e,n,t)}class h{get rid(){return n(this,l,"f")}constructor(e){l.set(this,void 0),t(this,l,e,"f")}async close(){return p("plugin:resources|close",{rid:this.rid})}}l=new WeakMap;var w=Object.freeze({__proto__:null,Channel:c,PluginListener:d,Resource:h,SERIALIZE_TO_IPC_FN:o,addPluginListener:async function(e,n,t){const i=new c(t);try{return p(`plugin:${e}|register_listener`,{event:n,handler:i}).then(()=>new d(e,n,i.id))}catch{return p(`plugin:${e}|registerListener`,{event:n,handler:i}).then(()=>new d(e,n,i.id))}},checkPermissions:async function(e){return p(`plugin:${e}|check_permissions`)},convertFileSrc:function(e,n="asset"){return window.__TAURI_INTERNALS__.convertFileSrc(e,n)},invoke:p,isTauri:function(){return!!(globalThis||window).isTauri},requestPermissions:async function(e){return p(`plugin:${e}|request_permissions`)},transformCallback:u});class _ extends h{constructor(e){super(e)}static async new(e,n,t){return p("plugin:image|new",{rgba:y(e),width:n,height:t}).then(e=>new _(e))}static async fromBytes(e){return p("plugin:image|from_bytes",{bytes:y(e)}).then(e=>new _(e))}static async fromPath(e){return p("plugin:image|from_path",{path:e}).then(e=>new _(e))}async rgba(){return p("plugin:image|rgba",{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return p("plugin:image|size",{rid:this.rid})}}function y(e){return null==e?null:"string"==typeof e?e:e instanceof _?e.rid:e}var g,b=Object.freeze({__proto__:null,Image:_,transformImage:y});!function(e){e.Nsis="nsis",e.Msi="msi",e.Deb="deb",e.Rpm="rpm",e.AppImage="appimage",e.App="app"}(g||(g={}));var m=Object.freeze({__proto__:null,get BundleType(){return g},defaultWindowIcon:async function(){return p("plugin:app|default_window_icon").then(e=>e?new _(e):null)},fetchDataStoreIdentifiers:async function(){return p("plugin:app|fetch_data_store_identifiers")},getBundleType:async function(){return p("plugin:app|bundle_type")},getIdentifier:async function(){return p("plugin:app|identifier")},getName:async function(){return p("plugin:app|name")},getTauriVersion:async function(){return p("plugin:app|tauri_version")},getVersion:async function(){return p("plugin:app|version")},hide:async function(){return p("plugin:app|app_hide")},removeDataStore:async function(e){return p("plugin:app|remove_data_store",{uuid:e})},setDockVisibility:async function(e){return p("plugin:app|set_dock_visibility",{visible:e})},setTheme:async function(e){return p("plugin:app|set_app_theme",{theme:e})},show:async function(){return p("plugin:app|app_show")}});class f{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.width=e[0].Logical.width,this.height=e[0].Logical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toPhysical(e){return new v(this.width*e,this.height*e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class v{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.width=e[0].Physical.width,this.height=e[0].Physical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toLogical(e){return new f(this.width/e,this.height/e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class k{constructor(e){this.size=e}toLogical(e){return this.size instanceof f?this.size:this.size.toLogical(e)}toPhysical(e){return this.size instanceof v?this.size:this.size.toPhysical(e)}[o](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[o]()}}class A{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.x=e[0].Logical.x,this.y=e[0].Logical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toPhysical(e){return new T(this.x*e,this.y*e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class T{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.x=e[0].Physical.x,this.y=e[0].Physical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toLogical(e){return new A(this.x/e,this.y/e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class I{constructor(e){this.position=e}toLogical(e){return this.position instanceof A?this.position:this.position.toLogical(e)}toPhysical(e){return this.position instanceof T?this.position:this.position.toPhysical(e)}[o](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[o]()}}var E,R=Object.freeze({__proto__:null,LogicalPosition:A,LogicalSize:f,PhysicalPosition:T,PhysicalSize:v,Position:I,Size:k});async function D(e,n){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,n),await p("plugin:event|unlisten",{event:e,eventId:n})}async function S(e,n,t){var i;const r="string"==typeof(null==t?void 0:t.target)?{kind:"AnyLabel",label:t.target}:null!==(i=null==t?void 0:t.target)&&void 0!==i?i:{kind:"Any"};return p("plugin:event|listen",{event:e,target:r,handler:u(n)}).then(n=>async()=>D(e,n))}async function N(e,n,t){return S(e,t=>{D(e,t.id),n(t)},t)}async function L(e,n){await p("plugin:event|emit",{event:e,payload:n})}async function C(e,n,t){const i="string"==typeof e?{kind:"AnyLabel",label:e}:e;await p("plugin:event|emit_to",{target:i,event:n,payload:t})}!function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"}(E||(E={}));var x,P,z,W=Object.freeze({__proto__:null,get TauriEvent(){return E},emit:L,emitTo:C,listen:S,once:N});function O(e){var n;if("items"in e)e.items=null===(n=e.items)||void 0===n?void 0:n.map(e=>"rid"in e?e:O(e));else if("action"in e&&e.action){const n=new c;return n.onmessage=e.action,delete e.action,{...e,handler:n}}return e}async function U(e,n){const t=new c;if(n&&"object"==typeof n&&("action"in n&&n.action&&(t.onmessage=n.action,delete n.action),"item"in n&&n.item&&"object"==typeof n.item&&"About"in n.item&&n.item.About&&"object"==typeof n.item.About&&"icon"in n.item.About&&n.item.About.icon&&(n.item.About.icon=y(n.item.About.icon)),"icon"in n&&n.icon&&(n.icon=y(n.icon)),"items"in n&&n.items)){function i(e){var n;return"rid"in e?[e.rid,e.kind]:("item"in e&&"object"==typeof e.item&&(null===(n=e.item.About)||void 0===n?void 0:n.icon)&&(e.item.About.icon=y(e.item.About.icon)),"icon"in e&&e.icon&&(e.icon=y(e.icon)),"items"in e&&e.items&&(e.items=e.items.map(i)),O(e))}n.items=n.items.map(i)}return p("plugin:menu|new",{kind:e,options:n,handler:t})}class F extends h{get id(){return n(this,x,"f")}get kind(){return n(this,P,"f")}constructor(e,n,i){super(e),x.set(this,void 0),P.set(this,void 0),t(this,x,n,"f"),t(this,P,i,"f")}}x=new WeakMap,P=new WeakMap;class M extends F{constructor(e,n){super(e,n,"MenuItem")}static async new(e){return U("MenuItem",e).then(([e,n])=>new M(e,n))}async text(){return p("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return p("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return p("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return p("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return p("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}}class B extends F{constructor(e,n){super(e,n,"Check")}static async new(e){return U("Check",e).then(([e,n])=>new B(e,n))}async text(){return p("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return p("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return p("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return p("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return p("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async isChecked(){return p("plugin:menu|is_checked",{rid:this.rid})}async setChecked(e){return p("plugin:menu|set_checked",{rid:this.rid,checked:e})}}!function(e){e.Add="Add",e.Advanced="Advanced",e.Bluetooth="Bluetooth",e.Bookmarks="Bookmarks",e.Caution="Caution",e.ColorPanel="ColorPanel",e.ColumnView="ColumnView",e.Computer="Computer",e.EnterFullScreen="EnterFullScreen",e.Everyone="Everyone",e.ExitFullScreen="ExitFullScreen",e.FlowView="FlowView",e.Folder="Folder",e.FolderBurnable="FolderBurnable",e.FolderSmart="FolderSmart",e.FollowLinkFreestanding="FollowLinkFreestanding",e.FontPanel="FontPanel",e.GoLeft="GoLeft",e.GoRight="GoRight",e.Home="Home",e.IChatTheater="IChatTheater",e.IconView="IconView",e.Info="Info",e.InvalidDataFreestanding="InvalidDataFreestanding",e.LeftFacingTriangle="LeftFacingTriangle",e.ListView="ListView",e.LockLocked="LockLocked",e.LockUnlocked="LockUnlocked",e.MenuMixedState="MenuMixedState",e.MenuOnState="MenuOnState",e.MobileMe="MobileMe",e.MultipleDocuments="MultipleDocuments",e.Network="Network",e.Path="Path",e.PreferencesGeneral="PreferencesGeneral",e.QuickLook="QuickLook",e.RefreshFreestanding="RefreshFreestanding",e.Refresh="Refresh",e.Remove="Remove",e.RevealFreestanding="RevealFreestanding",e.RightFacingTriangle="RightFacingTriangle",e.Share="Share",e.Slideshow="Slideshow",e.SmartBadge="SmartBadge",e.StatusAvailable="StatusAvailable",e.StatusNone="StatusNone",e.StatusPartiallyAvailable="StatusPartiallyAvailable",e.StatusUnavailable="StatusUnavailable",e.StopProgressFreestanding="StopProgressFreestanding",e.StopProgress="StopProgress",e.TrashEmpty="TrashEmpty",e.TrashFull="TrashFull",e.User="User",e.UserAccounts="UserAccounts",e.UserGroup="UserGroup",e.UserGuest="UserGuest"}(z||(z={}));class V extends F{constructor(e,n){super(e,n,"Icon")}static async new(e){return U("Icon",e).then(([e,n])=>new V(e,n))}async text(){return p("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return p("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return p("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return p("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return p("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async setIcon(e){return p("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:y(e)})}}class G extends F{constructor(e,n){super(e,n,"Predefined")}static async new(e){return U("Predefined",e).then(([e,n])=>new G(e,n))}async text(){return p("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return p("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}}function j([e,n,t]){switch(t){case"Submenu":return new H(e,n);case"Predefined":return new G(e,n);case"Check":return new B(e,n);case"Icon":return new V(e,n);default:return new M(e,n)}}class H extends F{constructor(e,n){super(e,n,"Submenu")}static async new(e){return U("Submenu",e).then(([e,n])=>new H(e,n))}async text(){return p("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return p("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return p("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return p("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async append(e){return p("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return p("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return p("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return p("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return p("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(j)}async items(){return p("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(j))}async get(e){return p("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?j(e):null)}async popup(e,n){var t;return p("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof I?e:e?new I(e):null})}async setAsWindowsMenuForNSApp(){return p("plugin:menu|set_as_windows_menu_for_nsapp",{rid:this.rid})}async setAsHelpMenuForNSApp(){return p("plugin:menu|set_as_help_menu_for_nsapp",{rid:this.rid})}async setIcon(e){return p("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:y(e)})}}class $ extends F{constructor(e,n){super(e,n,"Menu")}static async new(e){return U("Menu",e).then(([e,n])=>new $(e,n))}static async default(){return p("plugin:menu|create_default").then(([e,n])=>new $(e,n))}async append(e){return p("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return p("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return p("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return p("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return p("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(j)}async items(){return p("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(j))}async get(e){return p("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?j(e):null)}async popup(e,n){var t;return p("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof I?e:e?new I(e):null})}async setAsAppMenu(){return p("plugin:menu|set_as_app_menu",{rid:this.rid}).then(e=>e?new $(e[0],e[1]):null)}async setAsWindowMenu(e){var n;return p("plugin:menu|set_as_window_menu",{rid:this.rid,window:null!==(n=null==e?void 0:e.label)&&void 0!==n?n:null}).then(e=>e?new $(e[0],e[1]):null)}}var q=Object.freeze({__proto__:null,CheckMenuItem:B,IconMenuItem:V,Menu:$,MenuItem:M,get NativeIcon(){return z},PredefinedMenuItem:G,Submenu:H,itemFromKind:j});function J(){var e,n;window.__TAURI_INTERNALS__=null!==(e=window.__TAURI_INTERNALS__)&&void 0!==e?e:{},window.__TAURI_EVENT_PLUGIN_INTERNALS__=null!==(n=window.__TAURI_EVENT_PLUGIN_INTERNALS__)&&void 0!==n?n:{}}var Q,Z=Object.freeze({__proto__:null,clearMocks:function(){"object"==typeof window.__TAURI_INTERNALS__&&(delete window.__TAURI_INTERNALS__.invoke,delete window.__TAURI_INTERNALS__.transformCallback,delete window.__TAURI_INTERNALS__.unregisterCallback,delete window.__TAURI_INTERNALS__.runCallback,delete window.__TAURI_INTERNALS__.callbacks,delete window.__TAURI_INTERNALS__.convertFileSrc,delete window.__TAURI_INTERNALS__.metadata,"object"==typeof window.__TAURI_EVENT_PLUGIN_INTERNALS__&&delete window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener)},mockConvertFileSrc:function(e){J(),window.__TAURI_INTERNALS__.convertFileSrc=function(n,t="asset"){const i=encodeURIComponent(n);return"windows"===e?`http://${t}.localhost/${i}`:`${t}://localhost/${i}`}},mockIPC:function(e,n){function t(e,n){switch(e){case"plugin:event|listen":return function(e){i.has(e.event)||i.set(e.event,[]);return i.get(e.event).push(e.handler),e.handler}(n);case"plugin:event|emit":return function(e){const n=i.get(e.event)||[];for(const t of n)a(t,e);return null}(n);case"plugin:event|unlisten":return function(e){const n=i.get(e.event);if(n){const t=n.indexOf(e.id);-1!==t&&n.splice(t,1)}}(n)}}J();const i=new Map,r=new Map;function s(e){r.delete(e)}function a(e,n){const t=r.get(e);t?t(n):console.warn(`[TAURI] Couldn't find callback id ${e}. This might happen when the app is reloaded while Rust is running an asynchronous operation.`)}window.__TAURI_INTERNALS__.invoke=async function(i,r,s){return(null==n?void 0:n.shouldMockEvents)&&function(e){return e.startsWith("plugin:event|")}(i)?t(i,r):e(i,r)},window.__TAURI_INTERNALS__.transformCallback=function(e,n=!1){const t=window.crypto.getRandomValues(new Uint32Array(1))[0];return r.set(t,i=>(n&&s(t),e&&e(i))),t},window.__TAURI_INTERNALS__.unregisterCallback=s,window.__TAURI_INTERNALS__.runCallback=a,window.__TAURI_INTERNALS__.callbacks=r,window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener=function(e,n){s(n)}},mockWindows:function(e,...n){J(),window.__TAURI_INTERNALS__.metadata={currentWindow:{label:e},currentWebview:{windowLabel:e,label:e}}}});!function(e){e[e.Audio=1]="Audio",e[e.Cache=2]="Cache",e[e.Config=3]="Config",e[e.Data=4]="Data",e[e.LocalData=5]="LocalData",e[e.Document=6]="Document",e[e.Download=7]="Download",e[e.Picture=8]="Picture",e[e.Public=9]="Public",e[e.Video=10]="Video",e[e.Resource=11]="Resource",e[e.Temp=12]="Temp",e[e.AppConfig=13]="AppConfig",e[e.AppData=14]="AppData",e[e.AppLocalData=15]="AppLocalData",e[e.AppCache=16]="AppCache",e[e.AppLog=17]="AppLog",e[e.Desktop=18]="Desktop",e[e.Executable=19]="Executable",e[e.Font=20]="Font",e[e.Home=21]="Home",e[e.Runtime=22]="Runtime",e[e.Template=23]="Template"}(Q||(Q={}));var K=Object.freeze({__proto__:null,get BaseDirectory(){return Q},appCacheDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.AppCache})},appConfigDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.AppConfig})},appDataDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.AppData})},appLocalDataDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.AppLocalData})},appLogDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.AppLog})},audioDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Audio})},basename:async function(e,n){return p("plugin:path|basename",{path:e,ext:n})},cacheDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Cache})},configDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Config})},dataDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Data})},delimiter:function(){return window.__TAURI_INTERNALS__.plugins.path.delimiter},desktopDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Desktop})},dirname:async function(e){return p("plugin:path|dirname",{path:e})},documentDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Document})},downloadDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Download})},executableDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Executable})},extname:async function(e){return p("plugin:path|extname",{path:e})},fontDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Font})},homeDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Home})},isAbsolute:async function(e){return p("plugin:path|is_absolute",{path:e})},join:async function(...e){return p("plugin:path|join",{paths:e})},localDataDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.LocalData})},normalize:async function(e){return p("plugin:path|normalize",{path:e})},pictureDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Picture})},publicDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Public})},resolve:async function(...e){return p("plugin:path|resolve",{paths:e})},resolveResource:async function(e){return p("plugin:path|resolve_directory",{directory:Q.Resource,path:e})},resourceDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Resource})},runtimeDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Runtime})},sep:function(){return window.__TAURI_INTERNALS__.plugins.path.sep},tempDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Temp})},templateDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Template})},videoDir:async function(){return p("plugin:path|resolve_directory",{directory:Q.Video})}});class Y extends h{constructor(e,n){super(e),this.id=n}static async getById(e){return p("plugin:tray|get_by_id",{id:e}).then(n=>n?new Y(n,e):null)}static async removeById(e){return p("plugin:tray|remove_by_id",{id:e})}static async new(e){(null==e?void 0:e.menu)&&(e.menu=[e.menu.rid,e.menu.kind]),(null==e?void 0:e.icon)&&(e.icon=y(e.icon));const n=new c;if(null==e?void 0:e.action){const t=e.action;n.onmessage=e=>t(function(e){const n=e;return n.position=new T(e.position),n.rect.position=new T(e.rect.position),n.rect.size=new v(e.rect.size),n}(e)),delete e.action}return p("plugin:tray|new",{options:null!=e?e:{},handler:n}).then(([e,n])=>new Y(e,n))}async setIcon(e){let n=null;return e&&(n=y(e)),p("plugin:tray|set_icon",{rid:this.rid,icon:n})}async setMenu(e){return e&&(e=[e.rid,e.kind]),p("plugin:tray|set_menu",{rid:this.rid,menu:e})}async setTooltip(e){return p("plugin:tray|set_tooltip",{rid:this.rid,tooltip:e})}async setTitle(e){return p("plugin:tray|set_title",{rid:this.rid,title:e})}async setVisible(e){return p("plugin:tray|set_visible",{rid:this.rid,visible:e})}async setTempDirPath(e){return p("plugin:tray|set_temp_dir_path",{rid:this.rid,path:e})}async setIconAsTemplate(e){return p("plugin:tray|set_icon_as_template",{rid:this.rid,asTemplate:e})}async setMenuOnLeftClick(e){return p("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}async setShowMenuOnLeftClick(e){return p("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}}var X,ee,ne=Object.freeze({__proto__:null,TrayIcon:Y});!function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"}(X||(X={}));class te{constructor(e){this._preventDefault=!1,this.event=e.event,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}function ie(){return new ae(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function re(){return p("plugin:window|get_all_windows").then(e=>e.map(e=>new ae(e,{skip:!0})))}!function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"}(ee||(ee={}));const se=["tauri://created","tauri://error"];class ae{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||p("plugin:window|create",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await re()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return ie()}static async getAll(){return re()}static async getFocusedWindow(){for(const e of await re())if(await e.isFocused())return e;return null}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:S(e,n,{target:{kind:"Window",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Window",label:this.label}})}async emit(e,n){if(!se.includes(e))return L(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!se.includes(n))return C(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!se.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async scaleFactor(){return p("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return p("plugin:window|inner_position",{label:this.label}).then(e=>new T(e))}async outerPosition(){return p("plugin:window|outer_position",{label:this.label}).then(e=>new T(e))}async innerSize(){return p("plugin:window|inner_size",{label:this.label}).then(e=>new v(e))}async outerSize(){return p("plugin:window|outer_size",{label:this.label}).then(e=>new v(e))}async isFullscreen(){return p("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return p("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return p("plugin:window|is_maximized",{label:this.label})}async isFocused(){return p("plugin:window|is_focused",{label:this.label})}async isDecorated(){return p("plugin:window|is_decorated",{label:this.label})}async isResizable(){return p("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return p("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return p("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return p("plugin:window|is_closable",{label:this.label})}async isVisible(){return p("plugin:window|is_visible",{label:this.label})}async title(){return p("plugin:window|title",{label:this.label})}async theme(){return p("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return p("plugin:window|is_always_on_top",{label:this.label})}async center(){return p("plugin:window|center",{label:this.label})}async requestUserAttention(e){let n=null;return e&&(n=e===X.Critical?{type:"Critical"}:{type:"Informational"}),p("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(e){return p("plugin:window|set_resizable",{label:this.label,value:e})}async setEnabled(e){return p("plugin:window|set_enabled",{label:this.label,value:e})}async isEnabled(){return p("plugin:window|is_enabled",{label:this.label})}async setMaximizable(e){return p("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return p("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return p("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return p("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return p("plugin:window|maximize",{label:this.label})}async unmaximize(){return p("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return p("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return p("plugin:window|minimize",{label:this.label})}async unminimize(){return p("plugin:window|unminimize",{label:this.label})}async show(){return p("plugin:window|show",{label:this.label})}async hide(){return p("plugin:window|hide",{label:this.label})}async close(){return p("plugin:window|close",{label:this.label})}async destroy(){return p("plugin:window|destroy",{label:this.label})}async setDecorations(e){return p("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return p("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return p("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return p("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return p("plugin:window|set_always_on_top",{label:this.label,value:e})}async setAlwaysOnBottom(e){return p("plugin:window|set_always_on_bottom",{label:this.label,value:e})}async setContentProtected(e){return p("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){return p("plugin:window|set_size",{label:this.label,value:e instanceof k?e:new k(e)})}async setMinSize(e){return p("plugin:window|set_min_size",{label:this.label,value:e instanceof k?e:e?new k(e):null})}async setMaxSize(e){return p("plugin:window|set_max_size",{label:this.label,value:e instanceof k?e:e?new k(e):null})}async setSizeConstraints(e){function n(e){return e?{Logical:e}:null}return p("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(null==e?void 0:e.minWidth),minHeight:n(null==e?void 0:e.minHeight),maxWidth:n(null==e?void 0:e.maxWidth),maxHeight:n(null==e?void 0:e.maxHeight)}})}async setPosition(e){return p("plugin:window|set_position",{label:this.label,value:e instanceof I?e:new I(e)})}async setFullscreen(e){return p("plugin:window|set_fullscreen",{label:this.label,value:e})}async setSimpleFullscreen(e){return p("plugin:window|set_simple_fullscreen",{label:this.label,value:e})}async setFocus(){return p("plugin:window|set_focus",{label:this.label})}async setFocusable(e){return p("plugin:window|set_focusable",{label:this.label,value:e})}async setIcon(e){return p("plugin:window|set_icon",{label:this.label,value:y(e)})}async setSkipTaskbar(e){return p("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return p("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return p("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return p("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setBackgroundColor(e){return p("plugin:window|set_background_color",{color:e})}async setCursorPosition(e){return p("plugin:window|set_cursor_position",{label:this.label,value:e instanceof I?e:new I(e)})}async setIgnoreCursorEvents(e){return p("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return p("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(e){return p("plugin:window|start_resize_dragging",{label:this.label,value:e})}async setBadgeCount(e){return p("plugin:window|set_badge_count",{label:this.label,value:e})}async setBadgeLabel(e){return p("plugin:window|set_badge_label",{label:this.label,value:e})}async setOverlayIcon(e){return p("plugin:window|set_overlay_icon",{label:this.label,value:e?y(e):void 0})}async setProgressBar(e){return p("plugin:window|set_progress_bar",{label:this.label,value:e})}async setVisibleOnAllWorkspaces(e){return p("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:e})}async setTitleBarStyle(e){return p("plugin:window|set_title_bar_style",{label:this.label,value:e})}async setTheme(e){return p("plugin:window|set_theme",{label:this.label,value:e})}async onResized(e){return this.listen(E.WINDOW_RESIZED,n=>{n.payload=new v(n.payload),e(n)})}async onMoved(e){return this.listen(E.WINDOW_MOVED,n=>{n.payload=new T(n.payload),e(n)})}async onCloseRequested(e){return this.listen(E.WINDOW_CLOSE_REQUESTED,async n=>{const t=new te(n);await e(t),t.isPreventDefault()||await this.destroy()})}async onDragDropEvent(e){const n=await this.listen(E.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new T(n.payload.position)}})}),t=await this.listen(E.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new T(n.payload.position)}})}),i=await this.listen(E.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new T(n.payload.position)}})}),r=await this.listen(E.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}async onFocusChanged(e){const n=await this.listen(E.WINDOW_FOCUS,n=>{e({...n,payload:!0})}),t=await this.listen(E.WINDOW_BLUR,n=>{e({...n,payload:!1})});return()=>{n(),t()}}async onScaleChanged(e){return this.listen(E.WINDOW_SCALE_FACTOR_CHANGED,e)}async onThemeChanged(e){return this.listen(E.WINDOW_THEME_CHANGED,e)}}var le,oe,ue,ce;function de(e){return null===e?null:{name:e.name,scaleFactor:e.scaleFactor,position:new T(e.position),size:new v(e.size),workArea:{position:new T(e.workArea.position),size:new v(e.workArea.size)}}}!function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"}(le||(le={})),function(e){e.Default="default",e.FluentOverlay="fluentOverlay"}(oe||(oe={})),function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"}(ue||(ue={})),function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"}(ce||(ce={}));var pe=Object.freeze({__proto__:null,CloseRequestedEvent:te,get Effect(){return ue},get EffectState(){return ce},LogicalPosition:A,LogicalSize:f,PhysicalPosition:T,PhysicalSize:v,get ProgressBarStatus(){return ee},get UserAttentionType(){return X},Window:ae,availableMonitors:async function(){return p("plugin:window|available_monitors").then(e=>e.map(de))},currentMonitor:async function(){return p("plugin:window|current_monitor").then(de)},cursorPosition:async function(){return p("plugin:window|cursor_position").then(e=>new T(e))},getAllWindows:re,getCurrentWindow:ie,monitorFromPoint:async function(e,n){return p("plugin:window|monitor_from_point",{x:e,y:n}).then(de)},primaryMonitor:async function(){return p("plugin:window|primary_monitor").then(de)}});function he(){return new ye(ie(),window.__TAURI_INTERNALS__.metadata.currentWebview.label,{skip:!0})}async function we(){return p("plugin:webview|get_all_webviews").then(e=>e.map(e=>new ye(new ae(e.windowLabel,{skip:!0}),e.label,{skip:!0})))}const _e=["tauri://created","tauri://error"];class ye{constructor(e,n,t){this.window=e,this.label=n,this.listeners=Object.create(null),(null==t?void 0:t.skip)||p("plugin:webview|create_webview",{windowLabel:e.label,options:{...t,label:n}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await we()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return he()}static async getAll(){return we()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:S(e,n,{target:{kind:"Webview",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Webview",label:this.label}})}async emit(e,n){if(!_e.includes(e))return L(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!_e.includes(n))return C(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!_e.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async position(){return p("plugin:webview|webview_position",{label:this.label}).then(e=>new T(e))}async size(){return p("plugin:webview|webview_size",{label:this.label}).then(e=>new v(e))}async close(){return p("plugin:webview|webview_close",{label:this.label})}async setSize(e){return p("plugin:webview|set_webview_size",{label:this.label,value:e instanceof k?e:new k(e)})}async setPosition(e){return p("plugin:webview|set_webview_position",{label:this.label,value:e instanceof I?e:new I(e)})}async setFocus(){return p("plugin:webview|set_webview_focus",{label:this.label})}async setAutoResize(e){return p("plugin:webview|set_webview_auto_resize",{label:this.label,value:e})}async hide(){return p("plugin:webview|webview_hide",{label:this.label})}async show(){return p("plugin:webview|webview_show",{label:this.label})}async setZoom(e){return p("plugin:webview|set_webview_zoom",{label:this.label,value:e})}async reparent(e){return p("plugin:webview|reparent",{label:this.label,window:"string"==typeof e?e:e.label})}async clearAllBrowsingData(){return p("plugin:webview|clear_all_browsing_data")}async setBackgroundColor(e){return p("plugin:webview|set_webview_background_color",{color:e})}async onDragDropEvent(e){const n=await this.listen(E.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new T(n.payload.position)}})}),t=await this.listen(E.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new T(n.payload.position)}})}),i=await this.listen(E.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new T(n.payload.position)}})}),r=await this.listen(E.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}}var ge,be,me=Object.freeze({__proto__:null,Webview:ye,getAllWebviews:we,getCurrentWebview:he});function fe(){const e=he();return new ke(e.label,{skip:!0})}async function ve(){return p("plugin:window|get_all_windows").then(e=>e.map(e=>new ke(e,{skip:!0})))}class ke{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||p("plugin:webview|create_webview_window",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;const t=null!==(n=(await ve()).find(n=>n.label===e))&&void 0!==n?n:null;return t?new ke(t.label,{skip:!0}):null}static getCurrent(){return fe()}static async getAll(){return ve()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:S(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async setBackgroundColor(e){return p("plugin:window|set_background_color",{color:e}).then(()=>p("plugin:webview|set_webview_background_color",{color:e}))}}ge=ke,be=[ae,ye],(Array.isArray(be)?be:[be]).forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(n=>{var t;"object"==typeof ge.prototype&&ge.prototype&&n in ge.prototype||Object.defineProperty(ge.prototype,n,null!==(t=Object.getOwnPropertyDescriptor(e.prototype,n))&&void 0!==t?t:Object.create(null))})});var Ae=Object.freeze({__proto__:null,WebviewWindow:ke,getAllWebviewWindows:ve,getCurrentWebviewWindow:fe});return e.app=m,e.core=w,e.dpi=R,e.event=W,e.image=b,e.menu=q,e.mocks=Z,e.path=K,e.tray=ne,e.webview=me,e.webviewWindow=Ae,e.window=pe,e}({});window.__TAURI__=__TAURI_IIFE__; +var __TAURI_IIFE__=function(e){"use strict";function n(e,n,t,i){if("a"===t&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!i:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===t?i:"a"===t?i.call(e):i?i.value:n.get(e)}function t(e,n,t,i,r){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?r.call(e,t):r?r.value=t:n.set(e,t),t}var i,r,s,a,l;"function"==typeof SuppressedError&&SuppressedError;const o="__TAURI_TO_IPC_KEY__";function u(e,n=!1){return window.__TAURI_INTERNALS__.transformCallback(e,n)}class c{constructor(e){i.set(this,void 0),r.set(this,0),s.set(this,[]),a.set(this,void 0),t(this,i,e||(()=>{}),"f"),this.id=u(e=>{const l=e.index;if("end"in e)return void(l==n(this,r,"f")?this.cleanupCallback():t(this,a,l,"f"));const o=e.message;if(l==n(this,r,"f")){for(n(this,i,"f").call(this,o),t(this,r,n(this,r,"f")+1,"f");n(this,r,"f")in n(this,s,"f");){const e=n(this,s,"f")[n(this,r,"f")];n(this,i,"f").call(this,e),delete n(this,s,"f")[n(this,r,"f")],t(this,r,n(this,r,"f")+1,"f")}n(this,r,"f")===n(this,a,"f")&&this.cleanupCallback()}else n(this,s,"f")[l]=o})}cleanupCallback(){window.__TAURI_INTERNALS__.unregisterCallback(this.id)}set onmessage(e){t(this,i,e,"f")}get onmessage(){return n(this,i,"f")}[(i=new WeakMap,r=new WeakMap,s=new WeakMap,a=new WeakMap,o)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[o]()}}class d{constructor(e,n,t){this.plugin=e,this.event=n,this.channelId=t}async unregister(){return h(`plugin:${this.plugin}|remove_listener`,{event:this.event,channelId:this.channelId})}}async function p(e,n,t){const i=new c(t);try{return h(`plugin:${e}|register_listener`,{event:n,handler:i}).then(()=>new d(e,n,i.id))}catch{return h(`plugin:${e}|registerListener`,{event:n,handler:i}).then(()=>new d(e,n,i.id))}}async function h(e,n={},t){return window.__TAURI_INTERNALS__.invoke(e,n,t)}class w{get rid(){return n(this,l,"f")}constructor(e){l.set(this,void 0),t(this,l,e,"f")}async close(){return h("plugin:resources|close",{rid:this.rid})}}l=new WeakMap;var _=Object.freeze({__proto__:null,Channel:c,PluginListener:d,Resource:w,SERIALIZE_TO_IPC_FN:o,addPluginListener:p,checkPermissions:async function(e){return h(`plugin:${e}|check_permissions`)},convertFileSrc:function(e,n="asset"){return window.__TAURI_INTERNALS__.convertFileSrc(e,n)},invoke:h,isTauri:function(){return!!(globalThis||window).isTauri},requestPermissions:async function(e){return h(`plugin:${e}|request_permissions`)},transformCallback:u});class y extends w{constructor(e){super(e)}static async new(e,n,t){return h("plugin:image|new",{rgba:g(e),width:n,height:t}).then(e=>new y(e))}static async fromBytes(e){return h("plugin:image|from_bytes",{bytes:g(e)}).then(e=>new y(e))}static async fromPath(e){return h("plugin:image|from_path",{path:e}).then(e=>new y(e))}async rgba(){return h("plugin:image|rgba",{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return h("plugin:image|size",{rid:this.rid})}}function g(e){return null==e?null:"string"==typeof e?e:e instanceof y?e.rid:e}var b,m=Object.freeze({__proto__:null,Image:y,transformImage:g});!function(e){e.Nsis="nsis",e.Msi="msi",e.Deb="deb",e.Rpm="rpm",e.AppImage="appimage",e.App="app"}(b||(b={}));var f=Object.freeze({__proto__:null,get BundleType(){return b},defaultWindowIcon:async function(){return h("plugin:app|default_window_icon").then(e=>e?new y(e):null)},fetchDataStoreIdentifiers:async function(){return h("plugin:app|fetch_data_store_identifiers")},getBundleType:async function(){return h("plugin:app|bundle_type")},getIdentifier:async function(){return h("plugin:app|identifier")},getName:async function(){return h("plugin:app|name")},getTauriVersion:async function(){return h("plugin:app|tauri_version")},getVersion:async function(){return h("plugin:app|version")},hide:async function(){return h("plugin:app|app_hide")},onBackButtonPress:async function(e){return p("app","back-button",e)},removeDataStore:async function(e){return h("plugin:app|remove_data_store",{uuid:e})},setDockVisibility:async function(e){return h("plugin:app|set_dock_visibility",{visible:e})},setTheme:async function(e){return h("plugin:app|set_app_theme",{theme:e})},show:async function(){return h("plugin:app|app_show")}});class v{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.width=e[0].Logical.width,this.height=e[0].Logical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toPhysical(e){return new k(this.width*e,this.height*e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class k{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.width=e[0].Physical.width,this.height=e[0].Physical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toLogical(e){return new v(this.width/e,this.height/e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class A{constructor(e){this.size=e}toLogical(e){return this.size instanceof v?this.size:this.size.toLogical(e)}toPhysical(e){return this.size instanceof k?this.size:this.size.toPhysical(e)}[o](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[o]()}}class T{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.x=e[0].Logical.x,this.y=e[0].Logical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toPhysical(e){return new I(this.x*e,this.y*e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class I{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.x=e[0].Physical.x,this.y=e[0].Physical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toLogical(e){return new T(this.x/e,this.y/e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class E{constructor(e){this.position=e}toLogical(e){return this.position instanceof T?this.position:this.position.toLogical(e)}toPhysical(e){return this.position instanceof I?this.position:this.position.toPhysical(e)}[o](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[o]()}}var R,D=Object.freeze({__proto__:null,LogicalPosition:T,LogicalSize:v,PhysicalPosition:I,PhysicalSize:k,Position:E,Size:A});async function S(e,n){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,n),await h("plugin:event|unlisten",{event:e,eventId:n})}async function N(e,n,t){var i;const r="string"==typeof(null==t?void 0:t.target)?{kind:"AnyLabel",label:t.target}:null!==(i=null==t?void 0:t.target)&&void 0!==i?i:{kind:"Any"};return h("plugin:event|listen",{event:e,target:r,handler:u(n)}).then(n=>async()=>S(e,n))}async function L(e,n,t){return N(e,t=>{S(e,t.id),n(t)},t)}async function C(e,n){await h("plugin:event|emit",{event:e,payload:n})}async function x(e,n,t){const i="string"==typeof e?{kind:"AnyLabel",label:e}:e;await h("plugin:event|emit_to",{target:i,event:n,payload:t})}!function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"}(R||(R={}));var P,z,W,O=Object.freeze({__proto__:null,get TauriEvent(){return R},emit:C,emitTo:x,listen:N,once:L});function U(e){var n;if("items"in e)e.items=null===(n=e.items)||void 0===n?void 0:n.map(e=>"rid"in e?e:U(e));else if("action"in e&&e.action){const n=new c;return n.onmessage=e.action,delete e.action,{...e,handler:n}}return e}async function F(e,n){const t=new c;if(n&&"object"==typeof n&&("action"in n&&n.action&&(t.onmessage=n.action,delete n.action),"item"in n&&n.item&&"object"==typeof n.item&&"About"in n.item&&n.item.About&&"object"==typeof n.item.About&&"icon"in n.item.About&&n.item.About.icon&&(n.item.About.icon=g(n.item.About.icon)),"icon"in n&&n.icon&&(n.icon=g(n.icon)),"items"in n&&n.items)){function i(e){var n;return"rid"in e?[e.rid,e.kind]:("item"in e&&"object"==typeof e.item&&(null===(n=e.item.About)||void 0===n?void 0:n.icon)&&(e.item.About.icon=g(e.item.About.icon)),"icon"in e&&e.icon&&(e.icon=g(e.icon)),"items"in e&&e.items&&(e.items=e.items.map(i)),U(e))}n.items=n.items.map(i)}return h("plugin:menu|new",{kind:e,options:n,handler:t})}class M extends w{get id(){return n(this,P,"f")}get kind(){return n(this,z,"f")}constructor(e,n,i){super(e),P.set(this,void 0),z.set(this,void 0),t(this,P,n,"f"),t(this,z,i,"f")}}P=new WeakMap,z=new WeakMap;class B extends M{constructor(e,n){super(e,n,"MenuItem")}static async new(e){return F("MenuItem",e).then(([e,n])=>new B(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}}class V extends M{constructor(e,n){super(e,n,"Check")}static async new(e){return F("Check",e).then(([e,n])=>new V(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async isChecked(){return h("plugin:menu|is_checked",{rid:this.rid})}async setChecked(e){return h("plugin:menu|set_checked",{rid:this.rid,checked:e})}}!function(e){e.Add="Add",e.Advanced="Advanced",e.Bluetooth="Bluetooth",e.Bookmarks="Bookmarks",e.Caution="Caution",e.ColorPanel="ColorPanel",e.ColumnView="ColumnView",e.Computer="Computer",e.EnterFullScreen="EnterFullScreen",e.Everyone="Everyone",e.ExitFullScreen="ExitFullScreen",e.FlowView="FlowView",e.Folder="Folder",e.FolderBurnable="FolderBurnable",e.FolderSmart="FolderSmart",e.FollowLinkFreestanding="FollowLinkFreestanding",e.FontPanel="FontPanel",e.GoLeft="GoLeft",e.GoRight="GoRight",e.Home="Home",e.IChatTheater="IChatTheater",e.IconView="IconView",e.Info="Info",e.InvalidDataFreestanding="InvalidDataFreestanding",e.LeftFacingTriangle="LeftFacingTriangle",e.ListView="ListView",e.LockLocked="LockLocked",e.LockUnlocked="LockUnlocked",e.MenuMixedState="MenuMixedState",e.MenuOnState="MenuOnState",e.MobileMe="MobileMe",e.MultipleDocuments="MultipleDocuments",e.Network="Network",e.Path="Path",e.PreferencesGeneral="PreferencesGeneral",e.QuickLook="QuickLook",e.RefreshFreestanding="RefreshFreestanding",e.Refresh="Refresh",e.Remove="Remove",e.RevealFreestanding="RevealFreestanding",e.RightFacingTriangle="RightFacingTriangle",e.Share="Share",e.Slideshow="Slideshow",e.SmartBadge="SmartBadge",e.StatusAvailable="StatusAvailable",e.StatusNone="StatusNone",e.StatusPartiallyAvailable="StatusPartiallyAvailable",e.StatusUnavailable="StatusUnavailable",e.StopProgressFreestanding="StopProgressFreestanding",e.StopProgress="StopProgress",e.TrashEmpty="TrashEmpty",e.TrashFull="TrashFull",e.User="User",e.UserAccounts="UserAccounts",e.UserGroup="UserGroup",e.UserGuest="UserGuest"}(W||(W={}));class G extends M{constructor(e,n){super(e,n,"Icon")}static async new(e){return F("Icon",e).then(([e,n])=>new G(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async setIcon(e){return h("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:g(e)})}}class j extends M{constructor(e,n){super(e,n,"Predefined")}static async new(e){return F("Predefined",e).then(([e,n])=>new j(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}}function H([e,n,t]){switch(t){case"Submenu":return new $(e,n);case"Predefined":return new j(e,n);case"Check":return new V(e,n);case"Icon":return new G(e,n);default:return new B(e,n)}}class $ extends M{constructor(e,n){super(e,n,"Submenu")}static async new(e){return F("Submenu",e).then(([e,n])=>new $(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async append(e){return h("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return h("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return h("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return h("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return h("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(H)}async items(){return h("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(H))}async get(e){return h("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?H(e):null)}async popup(e,n){var t;return h("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof E?e:e?new E(e):null})}async setAsWindowsMenuForNSApp(){return h("plugin:menu|set_as_windows_menu_for_nsapp",{rid:this.rid})}async setAsHelpMenuForNSApp(){return h("plugin:menu|set_as_help_menu_for_nsapp",{rid:this.rid})}async setIcon(e){return h("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:g(e)})}}class q extends M{constructor(e,n){super(e,n,"Menu")}static async new(e){return F("Menu",e).then(([e,n])=>new q(e,n))}static async default(){return h("plugin:menu|create_default").then(([e,n])=>new q(e,n))}async append(e){return h("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return h("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return h("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return h("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return h("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(H)}async items(){return h("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(H))}async get(e){return h("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?H(e):null)}async popup(e,n){var t;return h("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof E?e:e?new E(e):null})}async setAsAppMenu(){return h("plugin:menu|set_as_app_menu",{rid:this.rid}).then(e=>e?new q(e[0],e[1]):null)}async setAsWindowMenu(e){var n;return h("plugin:menu|set_as_window_menu",{rid:this.rid,window:null!==(n=null==e?void 0:e.label)&&void 0!==n?n:null}).then(e=>e?new q(e[0],e[1]):null)}}var J=Object.freeze({__proto__:null,CheckMenuItem:V,IconMenuItem:G,Menu:q,MenuItem:B,get NativeIcon(){return W},PredefinedMenuItem:j,Submenu:$,itemFromKind:H});function Q(){var e,n;window.__TAURI_INTERNALS__=null!==(e=window.__TAURI_INTERNALS__)&&void 0!==e?e:{},window.__TAURI_EVENT_PLUGIN_INTERNALS__=null!==(n=window.__TAURI_EVENT_PLUGIN_INTERNALS__)&&void 0!==n?n:{}}var Z,K=Object.freeze({__proto__:null,clearMocks:function(){"object"==typeof window.__TAURI_INTERNALS__&&(delete window.__TAURI_INTERNALS__.invoke,delete window.__TAURI_INTERNALS__.transformCallback,delete window.__TAURI_INTERNALS__.unregisterCallback,delete window.__TAURI_INTERNALS__.runCallback,delete window.__TAURI_INTERNALS__.callbacks,delete window.__TAURI_INTERNALS__.convertFileSrc,delete window.__TAURI_INTERNALS__.metadata,"object"==typeof window.__TAURI_EVENT_PLUGIN_INTERNALS__&&delete window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener)},mockConvertFileSrc:function(e){Q(),window.__TAURI_INTERNALS__.convertFileSrc=function(n,t="asset"){const i=encodeURIComponent(n);return"windows"===e?`http://${t}.localhost/${i}`:`${t}://localhost/${i}`}},mockIPC:function(e,n){function t(e,n){switch(e){case"plugin:event|listen":return function(e){i.has(e.event)||i.set(e.event,[]);return i.get(e.event).push(e.handler),e.handler}(n);case"plugin:event|emit":return function(e){const n=i.get(e.event)||[];for(const t of n)a(t,e);return null}(n);case"plugin:event|unlisten":return function(e){const n=i.get(e.event);if(n){const t=n.indexOf(e.id);-1!==t&&n.splice(t,1)}}(n)}}Q();const i=new Map,r=new Map;function s(e){r.delete(e)}function a(e,n){const t=r.get(e);t?t(n):console.warn(`[TAURI] Couldn't find callback id ${e}. This might happen when the app is reloaded while Rust is running an asynchronous operation.`)}window.__TAURI_INTERNALS__.invoke=async function(i,r,s){return(null==n?void 0:n.shouldMockEvents)&&function(e){return e.startsWith("plugin:event|")}(i)?t(i,r):e(i,r)},window.__TAURI_INTERNALS__.transformCallback=function(e,n=!1){const t=window.crypto.getRandomValues(new Uint32Array(1))[0];return r.set(t,i=>(n&&s(t),e&&e(i))),t},window.__TAURI_INTERNALS__.unregisterCallback=s,window.__TAURI_INTERNALS__.runCallback=a,window.__TAURI_INTERNALS__.callbacks=r,window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener=function(e,n){s(n)}},mockWindows:function(e,...n){Q(),window.__TAURI_INTERNALS__.metadata={currentWindow:{label:e},currentWebview:{windowLabel:e,label:e}}}});!function(e){e[e.Audio=1]="Audio",e[e.Cache=2]="Cache",e[e.Config=3]="Config",e[e.Data=4]="Data",e[e.LocalData=5]="LocalData",e[e.Document=6]="Document",e[e.Download=7]="Download",e[e.Picture=8]="Picture",e[e.Public=9]="Public",e[e.Video=10]="Video",e[e.Resource=11]="Resource",e[e.Temp=12]="Temp",e[e.AppConfig=13]="AppConfig",e[e.AppData=14]="AppData",e[e.AppLocalData=15]="AppLocalData",e[e.AppCache=16]="AppCache",e[e.AppLog=17]="AppLog",e[e.Desktop=18]="Desktop",e[e.Executable=19]="Executable",e[e.Font=20]="Font",e[e.Home=21]="Home",e[e.Runtime=22]="Runtime",e[e.Template=23]="Template"}(Z||(Z={}));var Y=Object.freeze({__proto__:null,get BaseDirectory(){return Z},appCacheDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppCache})},appConfigDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppConfig})},appDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppData})},appLocalDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppLocalData})},appLogDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppLog})},audioDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Audio})},basename:async function(e,n){return h("plugin:path|basename",{path:e,ext:n})},cacheDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Cache})},configDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Config})},dataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Data})},delimiter:function(){return window.__TAURI_INTERNALS__.plugins.path.delimiter},desktopDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Desktop})},dirname:async function(e){return h("plugin:path|dirname",{path:e})},documentDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Document})},downloadDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Download})},executableDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Executable})},extname:async function(e){return h("plugin:path|extname",{path:e})},fontDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Font})},homeDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Home})},isAbsolute:async function(e){return h("plugin:path|is_absolute",{path:e})},join:async function(...e){return h("plugin:path|join",{paths:e})},localDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.LocalData})},normalize:async function(e){return h("plugin:path|normalize",{path:e})},pictureDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Picture})},publicDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Public})},resolve:async function(...e){return h("plugin:path|resolve",{paths:e})},resolveResource:async function(e){return h("plugin:path|resolve_directory",{directory:Z.Resource,path:e})},resourceDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Resource})},runtimeDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Runtime})},sep:function(){return window.__TAURI_INTERNALS__.plugins.path.sep},tempDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Temp})},templateDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Template})},videoDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Video})}});class X extends w{constructor(e,n){super(e),this.id=n}static async getById(e){return h("plugin:tray|get_by_id",{id:e}).then(n=>n?new X(n,e):null)}static async removeById(e){return h("plugin:tray|remove_by_id",{id:e})}static async new(e){(null==e?void 0:e.menu)&&(e.menu=[e.menu.rid,e.menu.kind]),(null==e?void 0:e.icon)&&(e.icon=g(e.icon));const n=new c;if(null==e?void 0:e.action){const t=e.action;n.onmessage=e=>t(function(e){const n=e;return n.position=new I(e.position),n.rect.position=new I(e.rect.position),n.rect.size=new k(e.rect.size),n}(e)),delete e.action}return h("plugin:tray|new",{options:null!=e?e:{},handler:n}).then(([e,n])=>new X(e,n))}async setIcon(e){let n=null;return e&&(n=g(e)),h("plugin:tray|set_icon",{rid:this.rid,icon:n})}async setMenu(e){return e&&(e=[e.rid,e.kind]),h("plugin:tray|set_menu",{rid:this.rid,menu:e})}async setTooltip(e){return h("plugin:tray|set_tooltip",{rid:this.rid,tooltip:e})}async setTitle(e){return h("plugin:tray|set_title",{rid:this.rid,title:e})}async setVisible(e){return h("plugin:tray|set_visible",{rid:this.rid,visible:e})}async setTempDirPath(e){return h("plugin:tray|set_temp_dir_path",{rid:this.rid,path:e})}async setIconAsTemplate(e){return h("plugin:tray|set_icon_as_template",{rid:this.rid,asTemplate:e})}async setMenuOnLeftClick(e){return h("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}async setShowMenuOnLeftClick(e){return h("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}}var ee,ne,te=Object.freeze({__proto__:null,TrayIcon:X});!function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"}(ee||(ee={}));class ie{constructor(e){this._preventDefault=!1,this.event=e.event,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}function re(){return new le(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function se(){return h("plugin:window|get_all_windows").then(e=>e.map(e=>new le(e,{skip:!0})))}!function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"}(ne||(ne={}));const ae=["tauri://created","tauri://error"];class le{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||h("plugin:window|create",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await se()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return re()}static async getAll(){return se()}static async getFocusedWindow(){for(const e of await se())if(await e.isFocused())return e;return null}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Window",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"Window",label:this.label}})}async emit(e,n){if(!ae.includes(e))return C(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!ae.includes(n))return x(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!ae.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async scaleFactor(){return h("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return h("plugin:window|inner_position",{label:this.label}).then(e=>new I(e))}async outerPosition(){return h("plugin:window|outer_position",{label:this.label}).then(e=>new I(e))}async innerSize(){return h("plugin:window|inner_size",{label:this.label}).then(e=>new k(e))}async outerSize(){return h("plugin:window|outer_size",{label:this.label}).then(e=>new k(e))}async isFullscreen(){return h("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return h("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return h("plugin:window|is_maximized",{label:this.label})}async isFocused(){return h("plugin:window|is_focused",{label:this.label})}async isDecorated(){return h("plugin:window|is_decorated",{label:this.label})}async isResizable(){return h("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return h("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return h("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return h("plugin:window|is_closable",{label:this.label})}async isVisible(){return h("plugin:window|is_visible",{label:this.label})}async title(){return h("plugin:window|title",{label:this.label})}async theme(){return h("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return h("plugin:window|is_always_on_top",{label:this.label})}async center(){return h("plugin:window|center",{label:this.label})}async requestUserAttention(e){let n=null;return e&&(n=e===ee.Critical?{type:"Critical"}:{type:"Informational"}),h("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(e){return h("plugin:window|set_resizable",{label:this.label,value:e})}async setEnabled(e){return h("plugin:window|set_enabled",{label:this.label,value:e})}async isEnabled(){return h("plugin:window|is_enabled",{label:this.label})}async setMaximizable(e){return h("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return h("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return h("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return h("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return h("plugin:window|maximize",{label:this.label})}async unmaximize(){return h("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return h("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return h("plugin:window|minimize",{label:this.label})}async unminimize(){return h("plugin:window|unminimize",{label:this.label})}async show(){return h("plugin:window|show",{label:this.label})}async hide(){return h("plugin:window|hide",{label:this.label})}async close(){return h("plugin:window|close",{label:this.label})}async destroy(){return h("plugin:window|destroy",{label:this.label})}async setDecorations(e){return h("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return h("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return h("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return h("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return h("plugin:window|set_always_on_top",{label:this.label,value:e})}async setAlwaysOnBottom(e){return h("plugin:window|set_always_on_bottom",{label:this.label,value:e})}async setContentProtected(e){return h("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){return h("plugin:window|set_size",{label:this.label,value:e instanceof A?e:new A(e)})}async setMinSize(e){return h("plugin:window|set_min_size",{label:this.label,value:e instanceof A?e:e?new A(e):null})}async setMaxSize(e){return h("plugin:window|set_max_size",{label:this.label,value:e instanceof A?e:e?new A(e):null})}async setSizeConstraints(e){function n(e){return e?{Logical:e}:null}return h("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(null==e?void 0:e.minWidth),minHeight:n(null==e?void 0:e.minHeight),maxWidth:n(null==e?void 0:e.maxWidth),maxHeight:n(null==e?void 0:e.maxHeight)}})}async setPosition(e){return h("plugin:window|set_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setFullscreen(e){return h("plugin:window|set_fullscreen",{label:this.label,value:e})}async setSimpleFullscreen(e){return h("plugin:window|set_simple_fullscreen",{label:this.label,value:e})}async setFocus(){return h("plugin:window|set_focus",{label:this.label})}async setFocusable(e){return h("plugin:window|set_focusable",{label:this.label,value:e})}async setIcon(e){return h("plugin:window|set_icon",{label:this.label,value:g(e)})}async setSkipTaskbar(e){return h("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return h("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return h("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return h("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setBackgroundColor(e){return h("plugin:window|set_background_color",{color:e})}async setCursorPosition(e){return h("plugin:window|set_cursor_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setIgnoreCursorEvents(e){return h("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return h("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(e){return h("plugin:window|start_resize_dragging",{label:this.label,value:e})}async setBadgeCount(e){return h("plugin:window|set_badge_count",{label:this.label,value:e})}async setBadgeLabel(e){return h("plugin:window|set_badge_label",{label:this.label,value:e})}async setOverlayIcon(e){return h("plugin:window|set_overlay_icon",{label:this.label,value:e?g(e):void 0})}async setProgressBar(e){return h("plugin:window|set_progress_bar",{label:this.label,value:e})}async setVisibleOnAllWorkspaces(e){return h("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:e})}async setTitleBarStyle(e){return h("plugin:window|set_title_bar_style",{label:this.label,value:e})}async setTheme(e){return h("plugin:window|set_theme",{label:this.label,value:e})}async onResized(e){return this.listen(R.WINDOW_RESIZED,n=>{n.payload=new k(n.payload),e(n)})}async onMoved(e){return this.listen(R.WINDOW_MOVED,n=>{n.payload=new I(n.payload),e(n)})}async onCloseRequested(e){return this.listen(R.WINDOW_CLOSE_REQUESTED,async n=>{const t=new ie(n);await e(t),t.isPreventDefault()||await this.destroy()})}async onDragDropEvent(e){const n=await this.listen(R.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new I(n.payload.position)}})}),t=await this.listen(R.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new I(n.payload.position)}})}),i=await this.listen(R.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new I(n.payload.position)}})}),r=await this.listen(R.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}async onFocusChanged(e){const n=await this.listen(R.WINDOW_FOCUS,n=>{e({...n,payload:!0})}),t=await this.listen(R.WINDOW_BLUR,n=>{e({...n,payload:!1})});return()=>{n(),t()}}async onScaleChanged(e){return this.listen(R.WINDOW_SCALE_FACTOR_CHANGED,e)}async onThemeChanged(e){return this.listen(R.WINDOW_THEME_CHANGED,e)}}var oe,ue,ce,de;function pe(e){return null===e?null:{name:e.name,scaleFactor:e.scaleFactor,position:new I(e.position),size:new k(e.size),workArea:{position:new I(e.workArea.position),size:new k(e.workArea.size)}}}!function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"}(oe||(oe={})),function(e){e.Default="default",e.FluentOverlay="fluentOverlay"}(ue||(ue={})),function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"}(ce||(ce={})),function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"}(de||(de={}));var he=Object.freeze({__proto__:null,CloseRequestedEvent:ie,get Effect(){return ce},get EffectState(){return de},LogicalPosition:T,LogicalSize:v,PhysicalPosition:I,PhysicalSize:k,get ProgressBarStatus(){return ne},get UserAttentionType(){return ee},Window:le,availableMonitors:async function(){return h("plugin:window|available_monitors").then(e=>e.map(pe))},currentMonitor:async function(){return h("plugin:window|current_monitor").then(pe)},cursorPosition:async function(){return h("plugin:window|cursor_position").then(e=>new I(e))},getAllWindows:se,getCurrentWindow:re,monitorFromPoint:async function(e,n){return h("plugin:window|monitor_from_point",{x:e,y:n}).then(pe)},primaryMonitor:async function(){return h("plugin:window|primary_monitor").then(pe)}});function we(){return new ge(re(),window.__TAURI_INTERNALS__.metadata.currentWebview.label,{skip:!0})}async function _e(){return h("plugin:webview|get_all_webviews").then(e=>e.map(e=>new ge(new le(e.windowLabel,{skip:!0}),e.label,{skip:!0})))}const ye=["tauri://created","tauri://error"];class ge{constructor(e,n,t){this.window=e,this.label=n,this.listeners=Object.create(null),(null==t?void 0:t.skip)||h("plugin:webview|create_webview",{windowLabel:e.label,options:{...t,label:n}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await _e()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return we()}static async getAll(){return _e()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Webview",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"Webview",label:this.label}})}async emit(e,n){if(!ye.includes(e))return C(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!ye.includes(n))return x(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!ye.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async position(){return h("plugin:webview|webview_position",{label:this.label}).then(e=>new I(e))}async size(){return h("plugin:webview|webview_size",{label:this.label}).then(e=>new k(e))}async close(){return h("plugin:webview|webview_close",{label:this.label})}async setSize(e){return h("plugin:webview|set_webview_size",{label:this.label,value:e instanceof A?e:new A(e)})}async setPosition(e){return h("plugin:webview|set_webview_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setFocus(){return h("plugin:webview|set_webview_focus",{label:this.label})}async setAutoResize(e){return h("plugin:webview|set_webview_auto_resize",{label:this.label,value:e})}async hide(){return h("plugin:webview|webview_hide",{label:this.label})}async show(){return h("plugin:webview|webview_show",{label:this.label})}async setZoom(e){return h("plugin:webview|set_webview_zoom",{label:this.label,value:e})}async reparent(e){return h("plugin:webview|reparent",{label:this.label,window:"string"==typeof e?e:e.label})}async clearAllBrowsingData(){return h("plugin:webview|clear_all_browsing_data")}async setBackgroundColor(e){return h("plugin:webview|set_webview_background_color",{color:e})}async onDragDropEvent(e){const n=await this.listen(R.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new I(n.payload.position)}})}),t=await this.listen(R.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new I(n.payload.position)}})}),i=await this.listen(R.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new I(n.payload.position)}})}),r=await this.listen(R.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}}var be,me,fe=Object.freeze({__proto__:null,Webview:ge,getAllWebviews:_e,getCurrentWebview:we});function ve(){const e=we();return new Ae(e.label,{skip:!0})}async function ke(){return h("plugin:window|get_all_windows").then(e=>e.map(e=>new Ae(e,{skip:!0})))}class Ae{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||h("plugin:webview|create_webview_window",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;const t=null!==(n=(await ke()).find(n=>n.label===e))&&void 0!==n?n:null;return t?new Ae(t.label,{skip:!0}):null}static getCurrent(){return ve()}static async getAll(){return ke()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async setBackgroundColor(e){return h("plugin:window|set_background_color",{color:e}).then(()=>h("plugin:webview|set_webview_background_color",{color:e}))}}be=Ae,me=[le,ge],(Array.isArray(me)?me:[me]).forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(n=>{var t;"object"==typeof be.prototype&&be.prototype&&n in be.prototype||Object.defineProperty(be.prototype,n,null!==(t=Object.getOwnPropertyDescriptor(e.prototype,n))&&void 0!==t?t:Object.create(null))})});var Te=Object.freeze({__proto__:null,WebviewWindow:Ae,getAllWebviewWindows:ke,getCurrentWebviewWindow:ve});return e.app=f,e.core=_,e.dpi=D,e.event=O,e.image=m,e.menu=J,e.mocks=K,e.path=Y,e.tray=te,e.webview=fe,e.webviewWindow=Te,e.window=he,e}({});window.__TAURI__=__TAURI_IIFE__; diff --git a/crates/tauri/src/app/plugin.rs b/crates/tauri/src/app/plugin.rs index d070bab27..8b9d3f358 100644 --- a/crates/tauri/src/app/plugin.rs +++ b/crates/tauri/src/app/plugin.rs @@ -132,5 +132,16 @@ pub fn init() -> TauriPlugin { set_dock_visibility, bundle_type, ]) + .setup(|_app, _api| { + #[cfg(target_os = "android")] + { + let handle = _api.register_android_plugin("app.tauri", "AppPlugin")?; + _app.manage(AppPlugin(handle)); + } + Ok(()) + }) .build() } + +#[cfg(target_os = "android")] +pub(crate) struct AppPlugin(pub crate::plugin::PluginHandle); diff --git a/crates/tauri/src/path/android.rs b/crates/tauri/src/path/android.rs index aa185f84f..451032ee7 100644 --- a/crates/tauri/src/path/android.rs +++ b/crates/tauri/src/path/android.rs @@ -4,10 +4,7 @@ use super::Result; use crate::{plugin::PluginHandle, Runtime}; -use std::{ - ffi::OsStr, - path::{Path, PathBuf}, -}; +use std::path::{Path, PathBuf}; /// A helper class to access the mobile path APIs. pub struct PathResolver(pub(crate) PluginHandle); diff --git a/packages/api/src/app.ts b/packages/api/src/app.ts index 55b0f3e2f..55b280436 100644 --- a/packages/api/src/app.ts +++ b/packages/api/src/app.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -import { invoke } from './core' +import { addPluginListener, invoke, PluginListener } from './core' import { Image } from './image' import { Theme } from './window' @@ -252,6 +252,28 @@ async function getBundleType(): Promise { return invoke('plugin:app|bundle_type') } +/** + * Payload for the onBackButtonPress event. + */ +type OnBackButtonPressPayload = { + /** Whether the webview canGoBack property is true. */ + canGoBack: boolean +} + +/** + * Listens to the backButton event on Android. + * @param handler + */ +async function onBackButtonPress( + handler: (payload: OnBackButtonPressPayload) => void +): Promise { + return addPluginListener( + 'app', + 'back-button', + handler + ) +} + export { getName, getVersion, @@ -264,5 +286,7 @@ export { fetchDataStoreIdentifiers, removeDataStore, setDockVisibility, - getBundleType + getBundleType, + type OnBackButtonPressPayload, + onBackButtonPress } From 68cb318979317c09f401825150e007d60377e75e Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Mon, 20 Oct 2025 08:49:26 -0300 Subject: [PATCH 009/119] feat(core): add stop, restart, destroy and configuration changed Android hooks (#14328) * feat(core): add pause, destroy and configuration changed Android hooks * Apply suggestions from code review --- .changes/extended-hooks.md | 5 ++++ Cargo.lock | 4 +-- crates/tauri-runtime-wry/Cargo.toml | 2 +- .../mobile/android-codegen/TauriActivity.kt | 22 +++++++++++++++- .../src/main/java/app/tauri/plugin/Plugin.kt | 23 +++++++++++++++++ .../java/app/tauri/plugin/PluginManager.kt | 25 +++++++++++++++++++ 6 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 .changes/extended-hooks.md diff --git a/.changes/extended-hooks.md b/.changes/extended-hooks.md new file mode 100644 index 000000000..292b12eea --- /dev/null +++ b/.changes/extended-hooks.md @@ -0,0 +1,5 @@ +--- +"tauri": minor:feat +--- + +Added `onStop`, `onDestroy`, `onRestart`, `onConfigurationChanged` Android plugin hooks. diff --git a/Cargo.lock b/Cargo.lock index 882439070..259e0ad59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8411,9 +8411,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.2" +version = "0.34.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4daa814018fecdfb977b59a094df4bd43b42e8e21f88fddfc05807e6f46efaaf" +checksum = "6121216ff67fe4bcfe64508ea1700bc15f74937d835a07b4a209cc00a8926a84" dependencies = [ "bitflags 2.7.0", "block2 0.6.0", diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index bddc37c1e..5a9d38142 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -23,7 +23,7 @@ wry = { version = "0.53.4", default-features = false, features = [ "os-webview", "linux-body", ] } -tao = { version = "0.34.2", default-features = false, features = ["rwh_06"] } +tao = { version = "0.34.4", default-features = false, features = ["rwh_06"] } tauri-runtime = { version = "2.8.0", path = "../tauri-runtime" } tauri-utils = { version = "2.7.0", path = "../tauri-utils" } raw-window-handle = "0.6" diff --git a/crates/tauri/mobile/android-codegen/TauriActivity.kt b/crates/tauri/mobile/android-codegen/TauriActivity.kt index 2420a0998..1c96394b8 100644 --- a/crates/tauri/mobile/android-codegen/TauriActivity.kt +++ b/crates/tauri/mobile/android-codegen/TauriActivity.kt @@ -6,8 +6,8 @@ package {{package}} -import android.os.Bundle import android.content.Intent +import android.content.res.Configuration import app.tauri.plugin.PluginManager abstract class TauriActivity : WryActivity() { @@ -28,4 +28,24 @@ abstract class TauriActivity : WryActivity() { super.onPause() pluginManager.onPause() } + + override fun onRestart() { + super.onRestart() + pluginManager.onRestart() + } + + override fun onStop() { + super.onStop() + pluginManager.onStop() + } + + override fun onDestroy() { + super.onDestroy() + pluginManager.onDestroy() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + pluginManager.onConfigurationChanged(newConfig) + } } diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt index 70b2b6317..d33fa8a4d 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/Plugin.kt @@ -5,6 +5,7 @@ package app.tauri.plugin import android.app.Activity +import android.content.res.Configuration import android.content.Intent import android.content.pm.PackageManager import android.net.Uri @@ -70,6 +71,28 @@ abstract class Plugin(private val activity: Activity) { */ open fun onResume() {} + /** + * This event is called after onStop() when the current activity is being re-displayed to the user (the user has navigated back to it). + * It will be followed by onStart() and then onResume(). + */ + open fun onRestart() {} + + /** + * This event is called when the app is no longer visible to the user. + * You will next receive either onRestart(), onDestroy(), or nothing, depending on later user activity. + */ + open fun onStop() {} + + /** + * This event is called before the activity is destroyed. + */ + open fun onDestroy() {} + + /** + * This event is called when a configuration change occurs but the app does not recreate the activity. + */ + open fun onConfigurationChanged(newConfig: Configuration) {} + /** * Start activity for result with the provided Intent and resolve calling the provided callback method name. * diff --git a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt index 6e6d0f604..362896b70 100644 --- a/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt +++ b/crates/tauri/mobile/android/src/main/java/app/tauri/plugin/PluginManager.kt @@ -5,6 +5,7 @@ package app.tauri.plugin import android.app.PendingIntent +import android.content.res.Configuration import android.content.Context import android.content.Intent import android.webkit.WebView @@ -98,6 +99,30 @@ class PluginManager(val activity: AppCompatActivity) { } } + fun onRestart() { + for (plugin in plugins.values) { + plugin.instance.onRestart() + } + } + + fun onStop() { + for (plugin in plugins.values) { + plugin.instance.onStop() + } + } + + fun onDestroy() { + for (plugin in plugins.values) { + plugin.instance.onDestroy() + } + } + + fun onConfigurationChanged(newConfig: Configuration) { + for (plugin in plugins.values) { + plugin.instance.onConfigurationChanged(newConfig) + } + } + fun startActivityForResult(intent: Intent, callback: ActivityResultCallback) { startActivityForResultCallback = callback startActivityForResultLauncher.launch(intent) From 06f26bbb2449a98b82af6c5a536ce1f337a23fe9 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Mon, 20 Oct 2025 09:20:13 -0300 Subject: [PATCH 010/119] chore(deps): update tao to 0.34.5 --- Cargo.lock | 4 ++-- crates/tauri-runtime-wry/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 259e0ad59..28e199ff3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8411,9 +8411,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.4" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6121216ff67fe4bcfe64508ea1700bc15f74937d835a07b4a209cc00a8926a84" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ "bitflags 2.7.0", "block2 0.6.0", diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index 5a9d38142..9e0e1a742 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -23,7 +23,7 @@ wry = { version = "0.53.4", default-features = false, features = [ "os-webview", "linux-body", ] } -tao = { version = "0.34.4", default-features = false, features = ["rwh_06"] } +tao = { version = "0.34.5", default-features = false, features = ["rwh_06"] } tauri-runtime = { version = "2.8.0", path = "../tauri-runtime" } tauri-utils = { version = "2.7.0", path = "../tauri-utils" } raw-window-handle = "0.6" From 6aa7f2d852870aeba1d4dd0e07f8be2bc9b66286 Mon Sep 17 00:00:00 2001 From: Lucas Nogueira Date: Mon, 20 Oct 2025 09:25:07 -0300 Subject: [PATCH 011/119] chore(deps): minor bump plugin, codegen and macros crates --- .changes/utils-bump.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changes/utils-bump.md diff --git a/.changes/utils-bump.md b/.changes/utils-bump.md new file mode 100644 index 000000000..804ced0d8 --- /dev/null +++ b/.changes/utils-bump.md @@ -0,0 +1,7 @@ +--- +"tauri-plugin": minor:deps +"tauri-codegen": minor:deps +"tauri-macros": minor:deps +--- + +Upgraded to `tauri-utils@2.8.0` From cb28f4368cc8bdc43c6bde88f793f68a30a2d54c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 09:49:46 -0300 Subject: [PATCH 012/119] apply version updates (#14137) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- ...ollbarstyle-webview-option-to-tauri-api.md | 5 --- ...barstyle-webview-option-to-tauri-config.md | 6 --- ...-scrollbarstyle-webview-option-to-tauri.md | 9 ----- .changes/CHANGES.md | 6 --- .changes/adaptive_icons.md | 5 --- .changes/android-app-plugin.md | 5 --- .changes/android-init-windows-unix.md | 6 --- .../android-plugin-bool-is-deserialize.md | 5 --- .../auto-increment-android-version-code.md | 8 ---- .changes/back-button-press-api.md | 5 --- .changes/cargo-mobile-0.21.md | 6 --- .../check-mismatched-versions-tauri-info.md | 6 --- .changes/data-dir-js.md | 6 --- .changes/default-log-level.md | 6 --- .changes/ensure-android-env.md | 6 --- .changes/extended-hooks.md | 5 --- .changes/file-association-content-type.md | 6 --- .../file-association-exported-type-cli.md | 6 --- .changes/file-association-exported-type.md | 5 --- .changes/fix-android-build-nvm4w-windows.md | 6 --- .changes/fix-csp-empty-selector.md | 5 --- .changes/fix-csp-windows.md | 5 --- .changes/fix-ios-cmd-pkg-name-change.md | 6 --- .changes/fix-js-icon-tauri-info.md | 6 --- .changes/fix-no-watch-dev-server-kill.md | 6 --- .changes/fix-unspeficied-dev-host.md | 6 --- .changes/improve-errors.md | 8 ---- .changes/info-plist-config.md | 8 ---- .changes/install-ios-platform.md | 6 --- .changes/ios-async-support.md | 5 --- .changes/linuxdeploy-extract.md | 5 --- .changes/macos-always-create-webview.md | 5 --- .changes/mobile-pnpm-dlx-init.md | 6 --- .changes/mobile-run.md | 6 --- .changes/normalize_script_for_csp.md | 5 --- .changes/refactor-info-plist.md | 5 --- .changes/register-plugin-listener-fix.md | 5 --- .changes/stack-overflow-release-build.md | 6 --- .changes/support-raw-entitlements.md | 5 --- .changes/universal-app-links-macos.md | 7 ---- .changes/utils-bump.md | 7 ---- .changes/warn-missing-product-name.md | 7 ---- Cargo.lock | 26 ++++++------- crates/tauri-build/CHANGELOG.md | 11 ++++++ crates/tauri-build/Cargo.toml | 6 +-- crates/tauri-bundler/CHANGELOG.md | 23 +++++++++++ crates/tauri-bundler/Cargo.toml | 4 +- crates/tauri-cli/CHANGELOG.md | 39 +++++++++++++++++++ crates/tauri-cli/Cargo.toml | 6 +-- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-cli/metadata-v2.json | 8 ++-- crates/tauri-codegen/CHANGELOG.md | 12 ++++++ crates/tauri-codegen/Cargo.toml | 4 +- crates/tauri-macros/CHANGELOG.md | 12 ++++++ crates/tauri-macros/Cargo.toml | 6 +-- crates/tauri-plugin/CHANGELOG.md | 7 ++++ crates/tauri-plugin/Cargo.toml | 4 +- crates/tauri-runtime-wry/CHANGELOG.md | 17 ++++++++ crates/tauri-runtime-wry/Cargo.toml | 6 +-- crates/tauri-runtime/CHANGELOG.md | 12 ++++++ crates/tauri-runtime/Cargo.toml | 4 +- .../schemas/config.schema.json | 2 +- crates/tauri-utils/CHANGELOG.md | 15 +++++++ crates/tauri-utils/Cargo.toml | 2 +- crates/tauri/CHANGELOG.md | 24 ++++++++++++ crates/tauri/Cargo.toml | 14 +++---- packages/api/CHANGELOG.md | 15 +++++++ packages/api/package.json | 2 +- packages/cli/CHANGELOG.md | 35 +++++++++++++++++ packages/cli/package.json | 2 +- 70 files changed, 271 insertions(+), 297 deletions(-) delete mode 100644 .changes/14089-expose-scrollbarstyle-webview-option-to-tauri-api.md delete mode 100644 .changes/14089-expose-scrollbarstyle-webview-option-to-tauri-config.md delete mode 100644 .changes/14089-expose-scrollbarstyle-webview-option-to-tauri.md delete mode 100644 .changes/CHANGES.md delete mode 100644 .changes/adaptive_icons.md delete mode 100644 .changes/android-app-plugin.md delete mode 100644 .changes/android-init-windows-unix.md delete mode 100644 .changes/android-plugin-bool-is-deserialize.md delete mode 100644 .changes/auto-increment-android-version-code.md delete mode 100644 .changes/back-button-press-api.md delete mode 100644 .changes/cargo-mobile-0.21.md delete mode 100644 .changes/check-mismatched-versions-tauri-info.md delete mode 100644 .changes/data-dir-js.md delete mode 100644 .changes/default-log-level.md delete mode 100644 .changes/ensure-android-env.md delete mode 100644 .changes/extended-hooks.md delete mode 100644 .changes/file-association-content-type.md delete mode 100644 .changes/file-association-exported-type-cli.md delete mode 100644 .changes/file-association-exported-type.md delete mode 100644 .changes/fix-android-build-nvm4w-windows.md delete mode 100644 .changes/fix-csp-empty-selector.md delete mode 100644 .changes/fix-csp-windows.md delete mode 100644 .changes/fix-ios-cmd-pkg-name-change.md delete mode 100644 .changes/fix-js-icon-tauri-info.md delete mode 100644 .changes/fix-no-watch-dev-server-kill.md delete mode 100644 .changes/fix-unspeficied-dev-host.md delete mode 100644 .changes/improve-errors.md delete mode 100644 .changes/info-plist-config.md delete mode 100644 .changes/install-ios-platform.md delete mode 100644 .changes/ios-async-support.md delete mode 100644 .changes/linuxdeploy-extract.md delete mode 100644 .changes/macos-always-create-webview.md delete mode 100644 .changes/mobile-pnpm-dlx-init.md delete mode 100644 .changes/mobile-run.md delete mode 100644 .changes/normalize_script_for_csp.md delete mode 100644 .changes/refactor-info-plist.md delete mode 100644 .changes/register-plugin-listener-fix.md delete mode 100644 .changes/stack-overflow-release-build.md delete mode 100644 .changes/support-raw-entitlements.md delete mode 100644 .changes/universal-app-links-macos.md delete mode 100644 .changes/utils-bump.md delete mode 100644 .changes/warn-missing-product-name.md diff --git a/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri-api.md b/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri-api.md deleted file mode 100644 index 00c59e3d5..000000000 --- a/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri-api.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@tauri-apps/api": minor:feat ---- - -Adds the `scrollBarStyle` option to the Webview and WebviewBuilder constructors. diff --git a/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri-config.md b/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri-config.md deleted file mode 100644 index 0d8b8dcfa..000000000 --- a/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri-config.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": minor:feat -"tauri-utils": minor:feat ---- - -Adds the `scrollBarStyle` option to the window configuration. diff --git a/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri.md b/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri.md deleted file mode 100644 index 9d604375c..000000000 --- a/.changes/14089-expose-scrollbarstyle-webview-option-to-tauri.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"tauri-runtime-wry": minor:feat -"tauri-runtime": minor:feat -"tauri": minor:feat ---- - -Adds the `scroll_bar_style` option to the Webview and WebviewWindow builders. -The possible values for this option are gated behind conditional compilation -flags, and will need to be applied using conditional compilation if customised. diff --git a/.changes/CHANGES.md b/.changes/CHANGES.md deleted file mode 100644 index 132f1aa2e..000000000 --- a/.changes/CHANGES.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'tauri-cli': 'minor:feat' -'tauri-bundler': 'minor:feat' ---- - -Add a `--no-sign` flag to the `tauri build` and `tauri bundle` commands to skip the code signing step, improving the developer experience for local testing and development without requiring code signing keys. diff --git a/.changes/adaptive_icons.md b/.changes/adaptive_icons.md deleted file mode 100644 index cee66fe93..000000000 --- a/.changes/adaptive_icons.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'tauri-cli': 'patch:enhance' ---- - -Add support for Android's adaptive and themed icons. diff --git a/.changes/android-app-plugin.md b/.changes/android-app-plugin.md deleted file mode 100644 index 5c575a700..000000000 --- a/.changes/android-app-plugin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri": minor:feat ---- - -Added mobile app plugin to support exit and back button press event. diff --git a/.changes/android-init-windows-unix.md b/.changes/android-init-windows-unix.md deleted file mode 100644 index e188ee5bd..000000000 --- a/.changes/android-init-windows-unix.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'tauri-cli': 'patch:bug' -'@tauri-apps/cli': patch:bug ---- - -Strip Windows-only extensions from the binary path so an Android project initialized on Windows can be used on UNIX systems. diff --git a/.changes/android-plugin-bool-is-deserialize.md b/.changes/android-plugin-bool-is-deserialize.md deleted file mode 100644 index bf4eceac5..000000000 --- a/.changes/android-plugin-bool-is-deserialize.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri": patch:bug ---- - -Properly deserialize Android plugin args with key starting with `is` (previously treated as a getter instead of a field name). diff --git a/.changes/auto-increment-android-version-code.md b/.changes/auto-increment-android-version-code.md deleted file mode 100644 index 1703ae424..000000000 --- a/.changes/auto-increment-android-version-code.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"tauri-cli": minor:feat -"@tauri-apps/cli": minor:feat -"tauri-build": minor:feat -"tauri-utils": minor:feat ---- - -Add `tauri.conf.json > bundle > android > autoIncrementVersionCode` config option to automatically increment the Android version code. diff --git a/.changes/back-button-press-api.md b/.changes/back-button-press-api.md deleted file mode 100644 index cb5c31926..000000000 --- a/.changes/back-button-press-api.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@tauri-apps/api": minor:feat ---- - -Added `app > onBackButtonPress` for Android back button handling. diff --git a/.changes/cargo-mobile-0.21.md b/.changes/cargo-mobile-0.21.md deleted file mode 100644 index 17e99609f..000000000 --- a/.changes/cargo-mobile-0.21.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'tauri-cli': 'minor:enhance' -'@tauri-apps/cli': minor:enhance ---- - -Update cargo-mobile2 to 0.21, enhancing error messages and opening Xcode when multiple apps are installed. diff --git a/.changes/check-mismatched-versions-tauri-info.md b/.changes/check-mismatched-versions-tauri-info.md deleted file mode 100644 index 88bf5f190..000000000 --- a/.changes/check-mismatched-versions-tauri-info.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": patch:enhance -"@tauri-apps/cli": patch:enhance ---- - -Check mismatched versions in `tauri info` diff --git a/.changes/data-dir-js.md b/.changes/data-dir-js.md deleted file mode 100644 index 9fff3317d..000000000 --- a/.changes/data-dir-js.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-utils": "minor:enhance" -"@tauri-apps/api": "minor:enhance" ---- - -Added a config to set a data_directory relative to the app-specific data dir in JavaScript and `tauri.conf.json`. diff --git a/.changes/default-log-level.md b/.changes/default-log-level.md deleted file mode 100644 index 7b3f0ca3e..000000000 --- a/.changes/default-log-level.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@tauri-apps/cli": patch:enhance -"tauri-cli": patch:enhance ---- - -Set a default log level filter when running `tauri add log`. diff --git a/.changes/ensure-android-env.md b/.changes/ensure-android-env.md deleted file mode 100644 index f7e13f8da..000000000 --- a/.changes/ensure-android-env.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": minor:feat -"@tauri-apps/cli": minor:feat ---- - -Try to detect ANDROID_HOME and NDK_HOME environment variables from default system locations and install them if needed using the Android Studio command line tools. diff --git a/.changes/extended-hooks.md b/.changes/extended-hooks.md deleted file mode 100644 index 292b12eea..000000000 --- a/.changes/extended-hooks.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri": minor:feat ---- - -Added `onStop`, `onDestroy`, `onRestart`, `onConfigurationChanged` Android plugin hooks. diff --git a/.changes/file-association-content-type.md b/.changes/file-association-content-type.md deleted file mode 100644 index 985bbfa24..000000000 --- a/.changes/file-association-content-type.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": minor:feat -"@tauri-apps/cli": minor:feat ---- - -Added support to defining the content type of the declared file association on macOS (maps to LSItemContentTypes property). diff --git a/.changes/file-association-exported-type-cli.md b/.changes/file-association-exported-type-cli.md deleted file mode 100644 index b2685b37d..000000000 --- a/.changes/file-association-exported-type-cli.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": minor:feat -"@tauri-apps/cli": minor:feat ---- - -Added support to defining the metadata for custom types declared in `tauri.conf.json > bundle > fileAssociations > exportedType` via the `UTExportedTypeDeclarations` Info.plist property. diff --git a/.changes/file-association-exported-type.md b/.changes/file-association-exported-type.md deleted file mode 100644 index 75cf0545f..000000000 --- a/.changes/file-association-exported-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-utils": minor:feat ---- - -Added `FileAssociation::exported_type` and `FileAssociation::content_types` for better support to defining custom types on macOS. diff --git a/.changes/fix-android-build-nvm4w-windows.md b/.changes/fix-android-build-nvm4w-windows.md deleted file mode 100644 index bbc706cde..000000000 --- a/.changes/fix-android-build-nvm4w-windows.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'tauri-cli': 'patch:bug' -'@tauri-apps/cli': patch:bug ---- - -Enhance Android build script usage on Windows by attempting to run cmd, bat and exe formats. diff --git a/.changes/fix-csp-empty-selector.md b/.changes/fix-csp-empty-selector.md deleted file mode 100644 index e40457b1e..000000000 --- a/.changes/fix-csp-empty-selector.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-codegen": patch:bug ---- - -Do not hash empty scripts when generating the Content-Security-Policy SHA-256 hashes. diff --git a/.changes/fix-csp-windows.md b/.changes/fix-csp-windows.md deleted file mode 100644 index 8321e7b1a..000000000 --- a/.changes/fix-csp-windows.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-codegen": patch:bug ---- - -Fix JavaScript SHA256 hash generation on Windows not ignoring carriage return characters. diff --git a/.changes/fix-ios-cmd-pkg-name-change.md b/.changes/fix-ios-cmd-pkg-name-change.md deleted file mode 100644 index 42c4eb1e7..000000000 --- a/.changes/fix-ios-cmd-pkg-name-change.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": patch:bug -"@tauri-apps/cli": patch:bug ---- - -Fix iOS CLI usage after modifying the package name. diff --git a/.changes/fix-js-icon-tauri-info.md b/.changes/fix-js-icon-tauri-info.md deleted file mode 100644 index e0da44656..000000000 --- a/.changes/fix-js-icon-tauri-info.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": patch:bug -"@tauri-apps/cli": patch:bug ---- - -Replaced the non-standard nerd font character with ` ⱼₛ` in `tarui info` diff --git a/.changes/fix-no-watch-dev-server-kill.md b/.changes/fix-no-watch-dev-server-kill.md deleted file mode 100644 index f9bb0d0be..000000000 --- a/.changes/fix-no-watch-dev-server-kill.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": patch:bug -"@tauri-apps/cli": patch:bug ---- - -Wait for dev server to exit before exiting the CLI when the app is closed on `tauri dev --no-watch`. diff --git a/.changes/fix-unspeficied-dev-host.md b/.changes/fix-unspeficied-dev-host.md deleted file mode 100644 index 488585513..000000000 --- a/.changes/fix-unspeficied-dev-host.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@tauri-apps/cli": patch:bug -"tauri-cli": patch:bug ---- - -Resolve local IP address when `tauri.conf.json > build > devUrl` host is `0.0.0.0`. diff --git a/.changes/improve-errors.md b/.changes/improve-errors.md deleted file mode 100644 index 7a8cfe734..000000000 --- a/.changes/improve-errors.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@tauri-apps/cli": minor:enhance -"tauri-cli": minor:enhance -"tauri-bundler": minor:enhance ---- - -Improve error messages with more context. - diff --git a/.changes/info-plist-config.md b/.changes/info-plist-config.md deleted file mode 100644 index cafab53c8..000000000 --- a/.changes/info-plist-config.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"tauri-utils": minor:feat -"tauri-cli": minor:feat -"@tauri-apps/cli": minor:feat ---- - -Added `bundle > macOS > infoPlist` and `bundle > iOS > infoPlist` configurations to allow defining custom Info.plist extensions. - diff --git a/.changes/install-ios-platform.md b/.changes/install-ios-platform.md deleted file mode 100644 index 907f411e5..000000000 --- a/.changes/install-ios-platform.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@tauri-apps/cli": minor:enhance -"tauri-cli": minor:enhance ---- - -Prompt to install the iOS platform if it isn't installed yet. diff --git a/.changes/ios-async-support.md b/.changes/ios-async-support.md deleted file mode 100644 index cfe444e0a..000000000 --- a/.changes/ios-async-support.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri": minor:feat ---- - -Support async Swift plugin methods (`completionHandler:`) in PluginManager diff --git a/.changes/linuxdeploy-extract.md b/.changes/linuxdeploy-extract.md deleted file mode 100644 index d6dceada1..000000000 --- a/.changes/linuxdeploy-extract.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-bundler: patch:bug ---- - -Set `APPIMAGE_EXTRACT_AND_RUN` on top of using the `--appimage-extra-and-run` cli arg for linuxdeploy. diff --git a/.changes/macos-always-create-webview.md b/.changes/macos-always-create-webview.md deleted file mode 100644 index 835782ba8..000000000 --- a/.changes/macos-always-create-webview.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-runtime-wry": patch:bug ---- - -Always try to create macOS WebKit webview, even if webkit runtime doesn't get detected correctly diff --git a/.changes/mobile-pnpm-dlx-init.md b/.changes/mobile-pnpm-dlx-init.md deleted file mode 100644 index f9a0f3925..000000000 --- a/.changes/mobile-pnpm-dlx-init.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@tauri-apps/cli": patch:bug -"tauri-cli": patch:bug ---- - -Fixes mobile project initialization when using `pnpx` or `pnpm dlx`. diff --git a/.changes/mobile-run.md b/.changes/mobile-run.md deleted file mode 100644 index 9026f2273..000000000 --- a/.changes/mobile-run.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@tauri-apps/cli": minor:feat -"tauri-cli": minor:feat ---- - -Added `ios run` and `android run` commands to run the app in production mode. diff --git a/.changes/normalize_script_for_csp.md b/.changes/normalize_script_for_csp.md deleted file mode 100644 index 3fa4bb533..000000000 --- a/.changes/normalize_script_for_csp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-utils": patch:feat ---- - -Added `html::normalize_script_for_csp`. diff --git a/.changes/refactor-info-plist.md b/.changes/refactor-info-plist.md deleted file mode 100644 index 734969f27..000000000 --- a/.changes/refactor-info-plist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-bundler": minor:breaking ---- - -Changed `MacOsSettings::info_plist_path` to `MacOsSettings::info_plist`. diff --git a/.changes/register-plugin-listener-fix.md b/.changes/register-plugin-listener-fix.md deleted file mode 100644 index e3b31cc86..000000000 --- a/.changes/register-plugin-listener-fix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@tauri-apps/api": patch:bug ---- - -Fix `core > addPluginListener` failing on command permission check. diff --git a/.changes/stack-overflow-release-build.md b/.changes/stack-overflow-release-build.md deleted file mode 100644 index 921e614ba..000000000 --- a/.changes/stack-overflow-release-build.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri": "patch:bug" -"tauri-macros": "patch:bug" ---- - -Fix the stack overflow when having too many commands in a single invoke handler in release build diff --git a/.changes/support-raw-entitlements.md b/.changes/support-raw-entitlements.md deleted file mode 100644 index a23732405..000000000 --- a/.changes/support-raw-entitlements.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-bundler": minor:feat ---- - -Support providing `plist::Value` as macOS entitlements. diff --git a/.changes/universal-app-links-macos.md b/.changes/universal-app-links-macos.md deleted file mode 100644 index 8aef107f7..000000000 --- a/.changes/universal-app-links-macos.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"tauri-cli": minor:feat -"@tauri-apps/cli": minor:feat -"tauri-utils": minor:feat ---- - -Added support to universal app links on macOS with the `plugins > deep-link > desktop > domains` configuration. diff --git a/.changes/utils-bump.md b/.changes/utils-bump.md deleted file mode 100644 index 804ced0d8..000000000 --- a/.changes/utils-bump.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"tauri-plugin": minor:deps -"tauri-codegen": minor:deps -"tauri-macros": minor:deps ---- - -Upgraded to `tauri-utils@2.8.0` diff --git a/.changes/warn-missing-product-name.md b/.changes/warn-missing-product-name.md deleted file mode 100644 index f2a78eae8..000000000 --- a/.changes/warn-missing-product-name.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"tauri-cli": patch:enhance -"@tauri-apps/cli": patch:enhance ---- - -Warn if productName is empty when initializing mobile project. - diff --git a/Cargo.lock b/Cargo.lock index 28e199ff3..b2528bb9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -4311,7 +4311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -8485,7 +8485,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.8.5" +version = "2.9.0" dependencies = [ "anyhow", "bytes", @@ -8546,7 +8546,7 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.4.1" +version = "2.5.0" dependencies = [ "anyhow", "cargo_toml", @@ -8568,7 +8568,7 @@ dependencies = [ [[package]] name = "tauri-bundler" -version = "2.6.1" +version = "2.7.0" dependencies = [ "anyhow", "ar", @@ -8614,7 +8614,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.8.4" +version = "2.9.0" dependencies = [ "ar", "axum", @@ -8707,7 +8707,7 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.4.0" +version = "2.5.0" dependencies = [ "base64 0.22.1", "brotli", @@ -8793,7 +8793,7 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.4.0" +version = "2.5.0" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -8805,7 +8805,7 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.4.0" +version = "2.5.0" dependencies = [ "anyhow", "glob", @@ -8853,7 +8853,7 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.8.0" +version = "2.9.0" dependencies = [ "cookie", "dpi", @@ -8876,7 +8876,7 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.8.1" +version = "2.9.0" dependencies = [ "gtk", "http 1.3.1", @@ -8927,7 +8927,7 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.7.0" +version = "2.8.0" dependencies = [ "aes-gcm", "anyhow", @@ -10315,7 +10315,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/crates/tauri-build/CHANGELOG.md b/crates/tauri-build/CHANGELOG.md index 5b3c82913..05d4867d1 100644 --- a/crates/tauri-build/CHANGELOG.md +++ b/crates/tauri-build/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## \[2.5.0] + +### New Features + +- [`3b4fac201`](https://www.github.com/tauri-apps/tauri/commit/3b4fac2017832d426dd07c5e24e26684eda57f7b) ([#14194](https://www.github.com/tauri-apps/tauri/pull/14194)) Add `tauri.conf.json > bundle > android > autoIncrementVersionCode` config option to automatically increment the Android version code. + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- Upgraded to `tauri-codegen@2.5.0` + ## \[2.4.1] ### Enhancements diff --git a/crates/tauri-build/Cargo.toml b/crates/tauri-build/Cargo.toml index c52bd7ee7..47c587587 100644 --- a/crates/tauri-build/Cargo.toml +++ b/crates/tauri-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-build" -version = "2.4.1" +version = "2.5.0" description = "build time code to pair with https://crates.io/crates/tauri" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -28,8 +28,8 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] anyhow = "1" quote = { version = "1", optional = true } -tauri-codegen = { version = "2.4.0", path = "../tauri-codegen", optional = true } -tauri-utils = { version = "2.7.0", path = "../tauri-utils", features = [ +tauri-codegen = { version = "2.5.0", path = "../tauri-codegen", optional = true } +tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ "build", "resources", ] } diff --git a/crates/tauri-bundler/CHANGELOG.md b/crates/tauri-bundler/CHANGELOG.md index bfc358258..f07521914 100644 --- a/crates/tauri-bundler/CHANGELOG.md +++ b/crates/tauri-bundler/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## \[2.7.0] + +### New Features + +- [`2a06d1006`](https://www.github.com/tauri-apps/tauri/commit/2a06d10066a806e392efe8bfb16d943ee0b0b61d) ([#14052](https://www.github.com/tauri-apps/tauri/pull/14052)) Add a `--no-sign` flag to the `tauri build` and `tauri bundle` commands to skip the code signing step, improving the developer experience for local testing and development without requiring code signing keys. +- [`cc8c0b531`](https://www.github.com/tauri-apps/tauri/commit/cc8c0b53171173dbd1d01781a50de1a3ea159031) ([#14031](https://www.github.com/tauri-apps/tauri/pull/14031)) Support providing `plist::Value` as macOS entitlements. + +### Enhancements + +- [`b06b3bd09`](https://www.github.com/tauri-apps/tauri/commit/b06b3bd091b0fed26cdcfb23cacb0462a7a9cc2d) ([#14126](https://www.github.com/tauri-apps/tauri/pull/14126)) Improve error messages with more context. + +### Bug Fixes + +- [`06d4a4ed6`](https://www.github.com/tauri-apps/tauri/commit/06d4a4ed6c146d6c7782016cf90037b56b944445) ([#14241](https://www.github.com/tauri-apps/tauri/pull/14241)) Set `APPIMAGE_EXTRACT_AND_RUN` on top of using the `--appimage-extra-and-run` cli arg for linuxdeploy. + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` + +### Breaking Changes + +- [`ed7c9a410`](https://www.github.com/tauri-apps/tauri/commit/ed7c9a4100e08c002212265549d12130d021ad1e) ([#14108](https://www.github.com/tauri-apps/tauri/pull/14108)) Changed `MacOsSettings::info_plist_path` to `MacOsSettings::info_plist`. + ## \[2.6.1] ### Bug Fixes diff --git a/crates/tauri-bundler/Cargo.toml b/crates/tauri-bundler/Cargo.toml index 37e19f4f7..e74135518 100644 --- a/crates/tauri-bundler/Cargo.toml +++ b/crates/tauri-bundler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-bundler" -version = "2.6.1" +version = "2.7.0" authors = [ "George Burton ", "Tauri Programme within The Commons Conservancy", @@ -15,7 +15,7 @@ rust-version = "1.77.2" exclude = ["CHANGELOG.md", "/target", "rustfmt.toml"] [dependencies] -tauri-utils = { version = "2.7.0", path = "../tauri-utils", features = [ +tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ "resources", ] } image = "0.25" diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index 5d539f82a..6debafbee 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,44 @@ # Changelog +## \[2.9.0] + +### New Features + +- [`f5851ee00`](https://www.github.com/tauri-apps/tauri/commit/f5851ee00d6d1f4d560a220ca5a728fedd525092) ([#14089](https://www.github.com/tauri-apps/tauri/pull/14089)) Adds the `scrollBarStyle` option to the window configuration. +- [`2a06d1006`](https://www.github.com/tauri-apps/tauri/commit/2a06d10066a806e392efe8bfb16d943ee0b0b61d) ([#14052](https://www.github.com/tauri-apps/tauri/pull/14052)) Add a `--no-sign` flag to the `tauri build` and `tauri bundle` commands to skip the code signing step, improving the developer experience for local testing and development without requiring code signing keys. +- [`3b4fac201`](https://www.github.com/tauri-apps/tauri/commit/3b4fac2017832d426dd07c5e24e26684eda57f7b) ([#14194](https://www.github.com/tauri-apps/tauri/pull/14194)) Add `tauri.conf.json > bundle > android > autoIncrementVersionCode` config option to automatically increment the Android version code. +- [`673867aa0`](https://www.github.com/tauri-apps/tauri/commit/673867aa0e1ccd766ee879ffe96aba58c758613c) ([#14094](https://www.github.com/tauri-apps/tauri/pull/14094)) Try to detect ANDROID_HOME and NDK_HOME environment variables from default system locations and install them if needed using the Android Studio command line tools. +- [`3d6868d09`](https://www.github.com/tauri-apps/tauri/commit/3d6868d09c323d68a152f3c3f8c7256311bd020a) ([#14128](https://www.github.com/tauri-apps/tauri/pull/14128)) Added support to defining the content type of the declared file association on macOS (maps to LSItemContentTypes property). +- [`3d6868d09`](https://www.github.com/tauri-apps/tauri/commit/3d6868d09c323d68a152f3c3f8c7256311bd020a) ([#14128](https://www.github.com/tauri-apps/tauri/pull/14128)) Added support to defining the metadata for custom types declared in `tauri.conf.json > bundle > fileAssociations > exportedType` via the `UTExportedTypeDeclarations` Info.plist property. +- [`ed7c9a410`](https://www.github.com/tauri-apps/tauri/commit/ed7c9a4100e08c002212265549d12130d021ad1e) ([#14108](https://www.github.com/tauri-apps/tauri/pull/14108)) Added `bundle > macOS > infoPlist` and `bundle > iOS > infoPlist` configurations to allow defining custom Info.plist extensions. +- [`75082cc5b`](https://www.github.com/tauri-apps/tauri/commit/75082cc5b340e30e2c4b4cd4bd6a1fe5382164aa) ([#14120](https://www.github.com/tauri-apps/tauri/pull/14120)) Added `ios run` and `android run` commands to run the app in production mode. +- [`cc8c0b531`](https://www.github.com/tauri-apps/tauri/commit/cc8c0b53171173dbd1d01781a50de1a3ea159031) ([#14031](https://www.github.com/tauri-apps/tauri/pull/14031)) Added support to universal app links on macOS with the `plugins > deep-link > desktop > domains` configuration. + +### Enhancements + +- [`94cbd40fc`](https://www.github.com/tauri-apps/tauri/commit/94cbd40fc733e08c0bccd48149d22a0e9c2f1e5c) ([#14223](https://www.github.com/tauri-apps/tauri/pull/14223)) Add support for Android's adaptive and themed icons. +- [`b5aa01870`](https://www.github.com/tauri-apps/tauri/commit/b5aa018702bf45dc98297698f9b7d238705865a6) ([#14268](https://www.github.com/tauri-apps/tauri/pull/14268)) Update cargo-mobile2 to 0.21, enhancing error messages and opening Xcode when multiple apps are installed. +- [`55453e845`](https://www.github.com/tauri-apps/tauri/commit/55453e8453d927b8197f1ba9f26fd944482938f7) ([#14262](https://www.github.com/tauri-apps/tauri/pull/14262)) Check mismatched versions in `tauri info` +- [`1a6627ee7`](https://www.github.com/tauri-apps/tauri/commit/1a6627ee7d085a4e66784e2705254714d68c7244) ([#14122](https://www.github.com/tauri-apps/tauri/pull/14122)) Set a default log level filter when running `tauri add log`. +- [`b06b3bd09`](https://www.github.com/tauri-apps/tauri/commit/b06b3bd091b0fed26cdcfb23cacb0462a7a9cc2d) ([#14126](https://www.github.com/tauri-apps/tauri/pull/14126)) Improve error messages with more context. +- [`f6622a3e3`](https://www.github.com/tauri-apps/tauri/commit/f6622a3e342f5dd5fb3cf6e0f79fb309a10e9b3d) ([#14129](https://www.github.com/tauri-apps/tauri/pull/14129)) Prompt to install the iOS platform if it isn't installed yet. +- [`6bbb530fd`](https://www.github.com/tauri-apps/tauri/commit/6bbb530fd5edfc07b180a4f3782b8566872ca3b1) ([#14105](https://www.github.com/tauri-apps/tauri/pull/14105)) Warn if productName is empty when initializing mobile project. + +### Bug Fixes + +- [`19fb6f7cb`](https://www.github.com/tauri-apps/tauri/commit/19fb6f7cb0d702cb2f25f6f2d1e11014d9dada5d) ([#14146](https://www.github.com/tauri-apps/tauri/pull/14146)) Strip Windows-only extensions from the binary path so an Android project initialized on Windows can be used on UNIX systems. +- [`19fb6f7cb`](https://www.github.com/tauri-apps/tauri/commit/19fb6f7cb0d702cb2f25f6f2d1e11014d9dada5d) ([#14146](https://www.github.com/tauri-apps/tauri/pull/14146)) Enhance Android build script usage on Windows by attempting to run cmd, bat and exe formats. +- [`28a2f9bc5`](https://www.github.com/tauri-apps/tauri/commit/28a2f9bc55f658eb71ef1a970ff9f791346f7682) ([#14101](https://www.github.com/tauri-apps/tauri/pull/14101)) Fix iOS CLI usage after modifying the package name. +- [`d2938486e`](https://www.github.com/tauri-apps/tauri/commit/d2938486e9d974debd90c15d7160b8a17bf4d763) ([#14261](https://www.github.com/tauri-apps/tauri/pull/14261)) Replaced the non-standard nerd font character with ` ⱼₛ ` in `tarui info` +- [`25e920e16`](https://www.github.com/tauri-apps/tauri/commit/25e920e169db900ca4f07c2bb9eb290e9f9f2c7d) ([#14298](https://www.github.com/tauri-apps/tauri/pull/14298)) Wait for dev server to exit before exiting the CLI when the app is closed on `tauri dev --no-watch`. +- [`b0012424c`](https://www.github.com/tauri-apps/tauri/commit/b0012424c5f432debfa42ba145e2672966d5f6d5) ([#14115](https://www.github.com/tauri-apps/tauri/pull/14115)) Resolve local IP address when `tauri.conf.json > build > devUrl` host is `0.0.0.0`. +- [`abf7e8850`](https://www.github.com/tauri-apps/tauri/commit/abf7e8850ba41e7173e9e9a3fdd6dfb8f357d72d) ([#14118](https://www.github.com/tauri-apps/tauri/pull/14118)) Fixes mobile project initialization when using `pnpx` or `pnpm dlx`. + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- Upgraded to `tauri-bundler@2.7.0` + ## \[2.8.4] ### Enhancements diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index d46bf7ef2..2764488ad 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.8.4" +version = "2.9.0" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" @@ -47,7 +47,7 @@ sublime_fuzzy = "0.7" clap_complete = "4" clap = { version = "4", features = ["derive", "env"] } thiserror = "2" -tauri-bundler = { version = "2.6.1", default-features = false, path = "../tauri-bundler" } +tauri-bundler = { version = "2.7.0", default-features = false, path = "../tauri-bundler" } colored = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } @@ -58,7 +58,7 @@ shared_child = "1" duct = "1.0" toml_edit = { version = "0.23", features = ["serde"] } json-patch = "3" -tauri-utils = { version = "2.7.0", path = "../tauri-utils", features = [ +tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ "isolation", "schema", "config-json5", diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 0c25453f3..323da1041 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.8.5", + "$id": "https://schema.tauri.app/config/2.9.0", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index e68c243f6..725d89c07 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,9 +1,9 @@ { "cli.js": { - "version": "2.8.4", + "version": "2.9.0", "node": ">= 10.0.0" }, - "tauri": "2.8.5", - "tauri-build": "2.4.1", - "tauri-plugin": "2.4.0" + "tauri": "2.9.0", + "tauri-build": "2.5.0", + "tauri-plugin": "2.5.0" } diff --git a/crates/tauri-codegen/CHANGELOG.md b/crates/tauri-codegen/CHANGELOG.md index 197f07e11..a846e1604 100644 --- a/crates/tauri-codegen/CHANGELOG.md +++ b/crates/tauri-codegen/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## \[2.5.0] + +### Bug Fixes + +- [`c5008b829`](https://www.github.com/tauri-apps/tauri/commit/c5008b829dc779f0768089bff9b891fc76b11355) ([#14274](https://www.github.com/tauri-apps/tauri/pull/14274)) Do not hash empty scripts when generating the Content-Security-Policy SHA-256 hashes. +- [`7b0d4e732`](https://www.github.com/tauri-apps/tauri/commit/7b0d4e73227e42d88732b6d9fe643499dd78ec4e) ([#14265](https://www.github.com/tauri-apps/tauri/pull/14265)) Fix JavaScript SHA256 hash generation on Windows not ignoring carriage return characters. + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- [`6aa7f2d85`](https://www.github.com/tauri-apps/tauri/commit/6aa7f2d852870aeba1d4dd0e07f8be2bc9b66286) Upgraded to `tauri-utils@2.8.0` + ## \[2.4.0] ### Dependencies diff --git a/crates/tauri-codegen/Cargo.toml b/crates/tauri-codegen/Cargo.toml index ea9ebd8a1..7c569776c 100644 --- a/crates/tauri-codegen/Cargo.toml +++ b/crates/tauri-codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-codegen" -version = "2.4.0" +version = "2.5.0" description = "code generation meant to be consumed inside of `tauri` through `tauri-build` or `tauri-macros`" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,7 +20,7 @@ quote = "1" syn = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" -tauri-utils = { version = "2.7.0", path = "../tauri-utils", features = [ +tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ "build", ] } thiserror = "2" diff --git a/crates/tauri-macros/CHANGELOG.md b/crates/tauri-macros/CHANGELOG.md index 875c2c797..19e6c3c82 100644 --- a/crates/tauri-macros/CHANGELOG.md +++ b/crates/tauri-macros/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## \[2.5.0] + +### Bug Fixes + +- [`69476d8e2`](https://www.github.com/tauri-apps/tauri/commit/69476d8e2314b85bf46046140bc5495fe29b7d29) ([#14170](https://www.github.com/tauri-apps/tauri/pull/14170)) Fix the stack overflow when having too many commands in a single invoke handler in release build + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- Upgraded to `tauri-codegen@2.5.0` +- [`6aa7f2d85`](https://www.github.com/tauri-apps/tauri/commit/6aa7f2d852870aeba1d4dd0e07f8be2bc9b66286) Upgraded to `tauri-utils@2.8.0` + ## \[2.4.0] ### Dependencies diff --git a/crates/tauri-macros/Cargo.toml b/crates/tauri-macros/Cargo.toml index 82cf3d976..e4ddb61ac 100644 --- a/crates/tauri-macros/Cargo.toml +++ b/crates/tauri-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-macros" -version = "2.4.0" +version = "2.5.0" description = "Macros for the tauri crate." exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,8 +20,8 @@ proc-macro2 = { version = "1", features = ["span-locations"] } quote = "1" syn = { version = "2", features = ["full"] } heck = "0.5" -tauri-codegen = { version = "2.4.0", default-features = false, path = "../tauri-codegen" } -tauri-utils = { version = "2.7.0", path = "../tauri-utils" } +tauri-codegen = { version = "2.5.0", default-features = false, path = "../tauri-codegen" } +tauri-utils = { version = "2.8.0", path = "../tauri-utils" } [features] custom-protocol = [] diff --git a/crates/tauri-plugin/CHANGELOG.md b/crates/tauri-plugin/CHANGELOG.md index c6c10bebd..eacb6a9c5 100644 --- a/crates/tauri-plugin/CHANGELOG.md +++ b/crates/tauri-plugin/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## \[2.5.0] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- [`6aa7f2d85`](https://www.github.com/tauri-apps/tauri/commit/6aa7f2d852870aeba1d4dd0e07f8be2bc9b66286) Upgraded to `tauri-utils@2.8.0` + ## \[2.4.0] ### New Features diff --git a/crates/tauri-plugin/Cargo.toml b/crates/tauri-plugin/Cargo.toml index 7b2a6ae95..a0108c068 100644 --- a/crates/tauri-plugin/Cargo.toml +++ b/crates/tauri-plugin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-plugin" -version = "2.4.0" +version = "2.5.0" description = "Build script and runtime Tauri plugin definitions" authors.workspace = true homepage.workspace = true @@ -30,7 +30,7 @@ runtime = [] [dependencies] anyhow = { version = "1", optional = true } serde = { version = "1", optional = true } -tauri-utils = { version = "2.7.0", default-features = false, features = [ +tauri-utils = { version = "2.8.0", default-features = false, features = [ "build", ], path = "../tauri-utils" } serde_json = { version = "1", optional = true } diff --git a/crates/tauri-runtime-wry/CHANGELOG.md b/crates/tauri-runtime-wry/CHANGELOG.md index c53d32e43..014fab581 100644 --- a/crates/tauri-runtime-wry/CHANGELOG.md +++ b/crates/tauri-runtime-wry/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## \[2.9.0] + +### New Features + +- [`f5851ee00`](https://www.github.com/tauri-apps/tauri/commit/f5851ee00d6d1f4d560a220ca5a728fedd525092) ([#14089](https://www.github.com/tauri-apps/tauri/pull/14089)) Adds the `scroll_bar_style` option to the Webview and WebviewWindow builders. + The possible values for this option are gated behind conditional compilation + flags, and will need to be applied using conditional compilation if customised. + +### Bug Fixes + +- [`684791efa`](https://www.github.com/tauri-apps/tauri/commit/684791efa6f3c671a0435d456ac208bca871d8c1) ([#14276](https://www.github.com/tauri-apps/tauri/pull/14276)) Always try to create macOS WebKit webview, even if webkit runtime doesn't get detected correctly + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- Upgraded to `tauri-runtime@2.9.0` + ## \[2.8.1] ### Bug Fixes diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index 9e0e1a742..d0b24c964 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime-wry" -version = "2.8.1" +version = "2.9.0" description = "Wry bindings to the Tauri runtime" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -24,8 +24,8 @@ wry = { version = "0.53.4", default-features = false, features = [ "linux-body", ] } tao = { version = "0.34.5", default-features = false, features = ["rwh_06"] } -tauri-runtime = { version = "2.8.0", path = "../tauri-runtime" } -tauri-utils = { version = "2.7.0", path = "../tauri-utils" } +tauri-runtime = { version = "2.9.0", path = "../tauri-runtime" } +tauri-utils = { version = "2.8.0", path = "../tauri-utils" } raw-window-handle = "0.6" http = "1" url = "2" diff --git a/crates/tauri-runtime/CHANGELOG.md b/crates/tauri-runtime/CHANGELOG.md index 128b2ab7d..333c6d005 100644 --- a/crates/tauri-runtime/CHANGELOG.md +++ b/crates/tauri-runtime/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## \[2.9.0] + +### New Features + +- [`f5851ee00`](https://www.github.com/tauri-apps/tauri/commit/f5851ee00d6d1f4d560a220ca5a728fedd525092) ([#14089](https://www.github.com/tauri-apps/tauri/pull/14089)) Adds the `scroll_bar_style` option to the Webview and WebviewWindow builders. + The possible values for this option are gated behind conditional compilation + flags, and will need to be applied using conditional compilation if customised. + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` + ## \[2.8.0] ### New Features diff --git a/crates/tauri-runtime/Cargo.toml b/crates/tauri-runtime/Cargo.toml index a1ab86ade..aebc4209d 100644 --- a/crates/tauri-runtime/Cargo.toml +++ b/crates/tauri-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime" -version = "2.8.0" +version = "2.9.0" description = "Runtime for Tauri applications" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -29,7 +29,7 @@ targets = [ serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" -tauri-utils = { version = "2.7.0", path = "../tauri-utils" } +tauri-utils = { version = "2.8.0", path = "../tauri-utils" } http = "1" raw-window-handle = "0.6" url = { version = "2" } diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 0c25453f3..323da1041 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.8.5", + "$id": "https://schema.tauri.app/config/2.9.0", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-utils/CHANGELOG.md b/crates/tauri-utils/CHANGELOG.md index 73e37c472..538887203 100644 --- a/crates/tauri-utils/CHANGELOG.md +++ b/crates/tauri-utils/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## \[2.8.0] + +### New Features + +- [`f5851ee00`](https://www.github.com/tauri-apps/tauri/commit/f5851ee00d6d1f4d560a220ca5a728fedd525092) ([#14089](https://www.github.com/tauri-apps/tauri/pull/14089)) Adds the `scrollBarStyle` option to the window configuration. +- [`3b4fac201`](https://www.github.com/tauri-apps/tauri/commit/3b4fac2017832d426dd07c5e24e26684eda57f7b) ([#14194](https://www.github.com/tauri-apps/tauri/pull/14194)) Add `tauri.conf.json > bundle > android > autoIncrementVersionCode` config option to automatically increment the Android version code. +- [`3d6868d09`](https://www.github.com/tauri-apps/tauri/commit/3d6868d09c323d68a152f3c3f8c7256311bd020a) ([#14128](https://www.github.com/tauri-apps/tauri/pull/14128)) Added `FileAssociation::exported_type` and `FileAssociation::content_types` for better support to defining custom types on macOS. +- [`ed7c9a410`](https://www.github.com/tauri-apps/tauri/commit/ed7c9a4100e08c002212265549d12130d021ad1e) ([#14108](https://www.github.com/tauri-apps/tauri/pull/14108)) Added `bundle > macOS > infoPlist` and `bundle > iOS > infoPlist` configurations to allow defining custom Info.plist extensions. +- [`7b0d4e732`](https://www.github.com/tauri-apps/tauri/commit/7b0d4e73227e42d88732b6d9fe643499dd78ec4e) ([#14265](https://www.github.com/tauri-apps/tauri/pull/14265)) Added `html::normalize_script_for_csp`. +- [`cc8c0b531`](https://www.github.com/tauri-apps/tauri/commit/cc8c0b53171173dbd1d01781a50de1a3ea159031) ([#14031](https://www.github.com/tauri-apps/tauri/pull/14031)) Added support to universal app links on macOS with the `plugins > deep-link > desktop > domains` configuration. + +### Enhancements + +- [`59089723f`](https://www.github.com/tauri-apps/tauri/commit/59089723fc20d66f3f305f2008adeb279bf87462) ([#14091](https://www.github.com/tauri-apps/tauri/pull/14091)) Added a config to set a data_directory relative to the app-specific data dir in JavaScript and `tauri.conf.json`. + ## \[2.7.0] ### New Features diff --git a/crates/tauri-utils/Cargo.toml b/crates/tauri-utils/Cargo.toml index 939cb93ed..7cc6f5c78 100644 --- a/crates/tauri-utils/Cargo.toml +++ b/crates/tauri-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-utils" -version = "2.7.0" +version = "2.8.0" description = "Utilities for Tauri" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" diff --git a/crates/tauri/CHANGELOG.md b/crates/tauri/CHANGELOG.md index 695022218..8b60c5c7b 100644 --- a/crates/tauri/CHANGELOG.md +++ b/crates/tauri/CHANGELOG.md @@ -1,5 +1,29 @@ # Changelog +## \[2.9.0] + +### New Features + +- [`f5851ee00`](https://www.github.com/tauri-apps/tauri/commit/f5851ee00d6d1f4d560a220ca5a728fedd525092) ([#14089](https://www.github.com/tauri-apps/tauri/pull/14089)) Adds the `scroll_bar_style` option to the Webview and WebviewWindow builders. + The possible values for this option are gated behind conditional compilation + flags, and will need to be applied using conditional compilation if customised. +- [`3397fd9bf`](https://www.github.com/tauri-apps/tauri/commit/3397fd9bfe5f6b1337110149f6c34731b8a44bb3) ([#14133](https://www.github.com/tauri-apps/tauri/pull/14133)) Added mobile app plugin to support exit and back button press event. +- [`68cb31897`](https://www.github.com/tauri-apps/tauri/commit/68cb318979317c09f401825150e007d60377e75e) ([#14328](https://www.github.com/tauri-apps/tauri/pull/14328)) Added `onStop`, `onDestroy`, `onRestart`, `onConfigurationChanged` Android plugin hooks. +- [`2e089f6ac`](https://www.github.com/tauri-apps/tauri/commit/2e089f6acb854e4d7f8eafb9b2f8242b1c9fa491) ([#14148](https://www.github.com/tauri-apps/tauri/pull/14148)) Support async Swift plugin methods (`completionHandler:`) in PluginManager + +### Bug Fixes + +- [`006d59283`](https://www.github.com/tauri-apps/tauri/commit/006d592837259cac87f15cf3ffc99e7fce97685e) ([#14260](https://www.github.com/tauri-apps/tauri/pull/14260)) Properly deserialize Android plugin args with key starting with `is` (previously treated as a getter instead of a field name). +- [`69476d8e2`](https://www.github.com/tauri-apps/tauri/commit/69476d8e2314b85bf46046140bc5495fe29b7d29) ([#14170](https://www.github.com/tauri-apps/tauri/pull/14170)) Fix the stack overflow when having too many commands in a single invoke handler in release build + +### Dependencies + +- Upgraded to `tauri-utils@2.8.0` +- Upgraded to `tauri-runtime-wry@2.9.0` +- Upgraded to `tauri-runtime@2.9.0` +- Upgraded to `tauri-build@2.5.0` +- Upgraded to `tauri-macros@2.5.0` + ## \[2.8.5] ### Enhancements diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 7d453f8e7..e3d312b45 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri" -version = "2.8.5" +version = "2.9.0" description = "Make tiny, secure apps for all desktop platforms with Tauri" exclude = ["/test", "/.scripts", "CHANGELOG.md", "/target"] readme = "README.md" @@ -56,12 +56,12 @@ uuid = { version = "1", features = ["v4"], optional = true } url = "2" anyhow = "1" thiserror = "2" -tauri-runtime = { version = "2.8.0", path = "../tauri-runtime" } -tauri-macros = { version = "2.4.0", path = "../tauri-macros" } -tauri-utils = { version = "2.7.0", features = [ +tauri-runtime = { version = "2.9.0", path = "../tauri-runtime" } +tauri-macros = { version = "2.5.0", path = "../tauri-macros" } +tauri-utils = { version = "2.8.0", features = [ "resources", ], path = "../tauri-utils" } -tauri-runtime-wry = { version = "2.8.1", path = "../tauri-runtime-wry", default-features = false, optional = true } +tauri-runtime-wry = { version = "2.9.0", path = "../tauri-runtime-wry", default-features = false, optional = true } getrandom = "0.3" serde_repr = "0.1" http = "1" @@ -164,8 +164,8 @@ objc2-ui-kit = { version = "0.3.0", default-features = false, features = [ [build-dependencies] glob = "0.3" heck = "0.5" -tauri-build = { path = "../tauri-build/", default-features = false, version = "2.4.1" } -tauri-utils = { path = "../tauri-utils/", version = "2.7.0", features = [ +tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.0" } +tauri-utils = { path = "../tauri-utils/", version = "2.8.0", features = [ "build", ] } diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 6d256dec1..be0325b77 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## \[2.9.0] + +### New Features + +- [`f5851ee00`](https://www.github.com/tauri-apps/tauri/commit/f5851ee00d6d1f4d560a220ca5a728fedd525092) ([#14089](https://www.github.com/tauri-apps/tauri/pull/14089)) Adds the `scrollBarStyle` option to the Webview and WebviewBuilder constructors. +- [`3397fd9bf`](https://www.github.com/tauri-apps/tauri/commit/3397fd9bfe5f6b1337110149f6c34731b8a44bb3) ([#14133](https://www.github.com/tauri-apps/tauri/pull/14133)) Added `app > onBackButtonPress` for Android back button handling. + +### Enhancements + +- [`59089723f`](https://www.github.com/tauri-apps/tauri/commit/59089723fc20d66f3f305f2008adeb279bf87462) ([#14091](https://www.github.com/tauri-apps/tauri/pull/14091)) Added a config to set a data_directory relative to the app-specific data dir in JavaScript and `tauri.conf.json`. + +### Bug Fixes + +- [`08bda64c2`](https://www.github.com/tauri-apps/tauri/commit/08bda64c25008bd45c5b58d06ff14649081a2f5d) ([#14132](https://www.github.com/tauri-apps/tauri/pull/14132)) Fix `core > addPluginListener` failing on command permission check. + ## \[2.8.0] ### New Features diff --git a/packages/api/package.json b/packages/api/package.json index a75bcbffc..ea631f6f6 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/api", - "version": "2.8.0", + "version": "2.9.0", "description": "Tauri API definitions", "funding": { "type": "opencollective", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 642a5043b..c7b9f0ac2 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,40 @@ # Changelog +## \[2.9.0] + +### New Features + +- [`3b4fac201`](https://www.github.com/tauri-apps/tauri/commit/3b4fac2017832d426dd07c5e24e26684eda57f7b) ([#14194](https://www.github.com/tauri-apps/tauri/pull/14194)) Add `tauri.conf.json > bundle > android > autoIncrementVersionCode` config option to automatically increment the Android version code. +- [`673867aa0`](https://www.github.com/tauri-apps/tauri/commit/673867aa0e1ccd766ee879ffe96aba58c758613c) ([#14094](https://www.github.com/tauri-apps/tauri/pull/14094)) Try to detect ANDROID_HOME and NDK_HOME environment variables from default system locations and install them if needed using the Android Studio command line tools. +- [`3d6868d09`](https://www.github.com/tauri-apps/tauri/commit/3d6868d09c323d68a152f3c3f8c7256311bd020a) ([#14128](https://www.github.com/tauri-apps/tauri/pull/14128)) Added support to defining the content type of the declared file association on macOS (maps to LSItemContentTypes property). +- [`3d6868d09`](https://www.github.com/tauri-apps/tauri/commit/3d6868d09c323d68a152f3c3f8c7256311bd020a) ([#14128](https://www.github.com/tauri-apps/tauri/pull/14128)) Added support to defining the metadata for custom types declared in `tauri.conf.json > bundle > fileAssociations > exportedType` via the `UTExportedTypeDeclarations` Info.plist property. +- [`ed7c9a410`](https://www.github.com/tauri-apps/tauri/commit/ed7c9a4100e08c002212265549d12130d021ad1e) ([#14108](https://www.github.com/tauri-apps/tauri/pull/14108)) Added `bundle > macOS > infoPlist` and `bundle > iOS > infoPlist` configurations to allow defining custom Info.plist extensions. +- [`75082cc5b`](https://www.github.com/tauri-apps/tauri/commit/75082cc5b340e30e2c4b4cd4bd6a1fe5382164aa) ([#14120](https://www.github.com/tauri-apps/tauri/pull/14120)) Added `ios run` and `android run` commands to run the app in production mode. +- [`cc8c0b531`](https://www.github.com/tauri-apps/tauri/commit/cc8c0b53171173dbd1d01781a50de1a3ea159031) ([#14031](https://www.github.com/tauri-apps/tauri/pull/14031)) Added support to universal app links on macOS with the `plugins > deep-link > desktop > domains` configuration. + +### Enhancements + +- [`b5aa01870`](https://www.github.com/tauri-apps/tauri/commit/b5aa018702bf45dc98297698f9b7d238705865a6) ([#14268](https://www.github.com/tauri-apps/tauri/pull/14268)) Update cargo-mobile2 to 0.21, enhancing error messages and opening Xcode when multiple apps are installed. +- [`55453e845`](https://www.github.com/tauri-apps/tauri/commit/55453e8453d927b8197f1ba9f26fd944482938f7) ([#14262](https://www.github.com/tauri-apps/tauri/pull/14262)) Check mismatched versions in `tauri info` +- [`1a6627ee7`](https://www.github.com/tauri-apps/tauri/commit/1a6627ee7d085a4e66784e2705254714d68c7244) ([#14122](https://www.github.com/tauri-apps/tauri/pull/14122)) Set a default log level filter when running `tauri add log`. +- [`b06b3bd09`](https://www.github.com/tauri-apps/tauri/commit/b06b3bd091b0fed26cdcfb23cacb0462a7a9cc2d) ([#14126](https://www.github.com/tauri-apps/tauri/pull/14126)) Improve error messages with more context. +- [`f6622a3e3`](https://www.github.com/tauri-apps/tauri/commit/f6622a3e342f5dd5fb3cf6e0f79fb309a10e9b3d) ([#14129](https://www.github.com/tauri-apps/tauri/pull/14129)) Prompt to install the iOS platform if it isn't installed yet. +- [`6bbb530fd`](https://www.github.com/tauri-apps/tauri/commit/6bbb530fd5edfc07b180a4f3782b8566872ca3b1) ([#14105](https://www.github.com/tauri-apps/tauri/pull/14105)) Warn if productName is empty when initializing mobile project. + +### Bug Fixes + +- [`19fb6f7cb`](https://www.github.com/tauri-apps/tauri/commit/19fb6f7cb0d702cb2f25f6f2d1e11014d9dada5d) ([#14146](https://www.github.com/tauri-apps/tauri/pull/14146)) Strip Windows-only extensions from the binary path so an Android project initialized on Windows can be used on UNIX systems. +- [`19fb6f7cb`](https://www.github.com/tauri-apps/tauri/commit/19fb6f7cb0d702cb2f25f6f2d1e11014d9dada5d) ([#14146](https://www.github.com/tauri-apps/tauri/pull/14146)) Enhance Android build script usage on Windows by attempting to run cmd, bat and exe formats. +- [`28a2f9bc5`](https://www.github.com/tauri-apps/tauri/commit/28a2f9bc55f658eb71ef1a970ff9f791346f7682) ([#14101](https://www.github.com/tauri-apps/tauri/pull/14101)) Fix iOS CLI usage after modifying the package name. +- [`d2938486e`](https://www.github.com/tauri-apps/tauri/commit/d2938486e9d974debd90c15d7160b8a17bf4d763) ([#14261](https://www.github.com/tauri-apps/tauri/pull/14261)) Replaced the non-standard nerd font character with ` ⱼₛ ` in `tarui info` +- [`25e920e16`](https://www.github.com/tauri-apps/tauri/commit/25e920e169db900ca4f07c2bb9eb290e9f9f2c7d) ([#14298](https://www.github.com/tauri-apps/tauri/pull/14298)) Wait for dev server to exit before exiting the CLI when the app is closed on `tauri dev --no-watch`. +- [`b0012424c`](https://www.github.com/tauri-apps/tauri/commit/b0012424c5f432debfa42ba145e2672966d5f6d5) ([#14115](https://www.github.com/tauri-apps/tauri/pull/14115)) Resolve local IP address when `tauri.conf.json > build > devUrl` host is `0.0.0.0`. +- [`abf7e8850`](https://www.github.com/tauri-apps/tauri/commit/abf7e8850ba41e7173e9e9a3fdd6dfb8f357d72d) ([#14118](https://www.github.com/tauri-apps/tauri/pull/14118)) Fixes mobile project initialization when using `pnpx` or `pnpm dlx`. + +### Dependencies + +- Upgraded to `tauri-cli@2.9.0` + ## \[2.8.4] ### Enhancements diff --git a/packages/cli/package.json b/packages/cli/package.json index 8fd5434f3..f0fc53ed5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.8.4", + "version": "2.9.0", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From 752c923002ba7752c89f2892dbcff95bdca02334 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:51:28 +0800 Subject: [PATCH 013/119] chore: fix some typos (#14334) --- .scripts/ci/check-change-tags.js | 2 +- .scripts/ci/check-license-header.js | 2 +- Cargo.lock | 1 - crates/tauri-build/src/acl.rs | 6 +++--- crates/tauri-build/src/lib.rs | 2 +- crates/tauri-cli/config.schema.json | 4 ++-- .../src/migrate/migrations/v1/config.rs | 4 ++-- crates/tauri-runtime-wry/src/lib.rs | 2 +- crates/tauri-runtime-wry/src/window/mod.rs | 2 +- .../schemas/config.schema.json | 4 ++-- crates/tauri-utils/src/acl/mod.rs | 2 +- crates/tauri-utils/src/acl/schema.rs | 18 +++++++++--------- crates/tauri-utils/src/lib.rs | 6 +++--- crates/tauri-utils/src/platform.rs | 2 +- crates/tauri-utils/src/resources.rs | 2 +- crates/tauri/Cargo.toml | 1 - crates/tauri/src/app.rs | 6 +++--- crates/tauri/src/ipc/mod.rs | 2 +- crates/tauri/src/lib.rs | 2 +- crates/tauri/src/manager/mod.rs | 4 ++-- crates/tauri/src/plugin.rs | 2 +- crates/tauri/src/tray/mod.rs | 4 ++-- crates/tauri/src/webview/mod.rs | 2 +- crates/tauri/src/webview/webview_window.rs | 4 ++-- crates/tauri/src/window/mod.rs | 4 ++-- crates/tauri/src/window/scripts/drag.js | 4 ++-- examples/api/unocss.config.js | 4 ++-- .../file-associations/src-tauri/src/main.rs | 2 +- packages/api/src/core.ts | 2 +- packages/api/src/dpi.ts | 2 +- packages/api/src/webviewWindow.ts | 2 +- packages/api/src/window.ts | 2 +- 32 files changed, 53 insertions(+), 55 deletions(-) diff --git a/.scripts/ci/check-change-tags.js b/.scripts/ci/check-change-tags.js index 1cd7de3d9..cf6463439 100644 --- a/.scripts/ci/check-change-tags.js +++ b/.scripts/ci/check-change-tags.js @@ -57,7 +57,7 @@ function checkChangeFiles(changeFiles) { for (const [file, packages] of unknownTagsEntries) { for (const { package, tag } of packages) { console.error( - `Package \`${package}\` has an uknown change tag ${tag} in ${file} ` + `Package \`${package}\` has an unknown change tag ${tag} in ${file} ` ) } } diff --git a/.scripts/ci/check-license-header.js b/.scripts/ci/check-license-header.js index 03ad824e4..4dd48fa46 100644 --- a/.scripts/ci/check-license-header.js +++ b/.scripts/ci/check-license-header.js @@ -29,7 +29,7 @@ const ignore = [ async function checkFile(file) { if ( extensions.some((e) => file.endsWith(e)) - && !ignore.some((i) => file.includes(`/${i}/`) || path.basename(file) == i) + && !ignore.some((i) => file.includes(`/${i}/`) || path.basename(file) === i) ) { const fileStream = fs.createReadStream(file) const rl = readline.createInterface({ diff --git a/Cargo.lock b/Cargo.lock index b2528bb9c..15b6fe5b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8536,7 +8536,6 @@ dependencies = [ "tracing", "tray-icon", "url", - "urlpattern", "uuid", "webkit2gtk", "webview2-com", diff --git a/crates/tauri-build/src/acl.rs b/crates/tauri-build/src/acl.rs index 474c63006..16f529d6a 100644 --- a/crates/tauri-build/src/acl.rs +++ b/crates/tauri-build/src/acl.rs @@ -157,7 +157,7 @@ fn read_plugins_manifests() -> Result> { Ok(manifests) } -struct InlinedPuginsAcl { +struct InlinedPluginsAcl { manifests: BTreeMap, permission_files: BTreeMap>, } @@ -165,7 +165,7 @@ struct InlinedPuginsAcl { fn inline_plugins( out_dir: &Path, inlined_plugins: HashMap<&'static str, InlinedPlugin>, -) -> Result { +) -> Result { let mut acl_manifests = BTreeMap::new(); let mut permission_files_map = BTreeMap::new(); @@ -250,7 +250,7 @@ permissions = [{default_permissions}] acl_manifests.insert(name.into(), manifest); } - Ok(InlinedPuginsAcl { + Ok(InlinedPluginsAcl { manifests: acl_manifests, permission_files: permission_files_map, }) diff --git a/crates/tauri-build/src/lib.rs b/crates/tauri-build/src/lib.rs index 1cd9c7b78..cd9724252 100644 --- a/crates/tauri-build/src/lib.rs +++ b/crates/tauri-build/src/lib.rs @@ -263,7 +263,7 @@ impl WindowsAttributes { } } - /// Creates the default attriute set wihtou the default app manifest. + /// Creates the default attribute set without the default app manifest. #[must_use] pub fn new_without_app_manifest() -> Self { Self { diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 323da1041..672ace507 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -921,7 +921,7 @@ ] }, { - "description": "Mica effect that matches the system dark perefence **Windows 11 Only**", + "description": "Mica effect that matches the system dark preference **Windows 11 Only**", "type": "string", "enum": [ "mica" @@ -942,7 +942,7 @@ ] }, { - "description": "Tabbed effect that matches the system dark perefence **Windows 11 Only**", + "description": "Tabbed effect that matches the system dark preference **Windows 11 Only**", "type": "string", "enum": [ "tabbed" diff --git a/crates/tauri-cli/src/migrate/migrations/v1/config.rs b/crates/tauri-cli/src/migrate/migrations/v1/config.rs index 2d7d1be4b..3de72747d 100644 --- a/crates/tauri-cli/src/migrate/migrations/v1/config.rs +++ b/crates/tauri-cli/src/migrate/migrations/v1/config.rs @@ -104,7 +104,7 @@ fn migrate_config(config: &mut Value) -> Result { } // dangerousUseHttpScheme/useHttpsScheme - let dangerouse_use_http = tauri_config + let dangerous_use_http = tauri_config .get("security") .and_then(|w| w.as_object()) .and_then(|w| { @@ -120,7 +120,7 @@ fn migrate_config(config: &mut Value) -> Result { { for window in windows { if let Some(window) = window.as_object_mut() { - window.insert("useHttpsScheme".to_string(), (!dangerouse_use_http).into()); + window.insert("useHttpsScheme".to_string(), (!dangerous_use_http).into()); } } } diff --git a/crates/tauri-runtime-wry/src/lib.rs b/crates/tauri-runtime-wry/src/lib.rs index 1aac9f1aa..6b919e746 100644 --- a/crates/tauri-runtime-wry/src/lib.rs +++ b/crates/tauri-runtime-wry/src/lib.rs @@ -812,7 +812,7 @@ impl WindowBuilder for WindowBuilderWrapper { { // TODO: find a proper way to prevent webview being pushed out of the window. // Workround for issue: https://github.com/tauri-apps/tauri/issues/10225 - // The window requies `NSFullSizeContentViewWindowMask` flag to prevent devtools + // The window requires `NSFullSizeContentViewWindowMask` flag to prevent devtools // pushing the content view out of the window. // By setting the default style to `TitleBarStyle::Visible` should fix the issue for most of the users. builder = builder.title_bar_style(TitleBarStyle::Visible); diff --git a/crates/tauri-runtime-wry/src/window/mod.rs b/crates/tauri-runtime-wry/src/window/mod.rs index 02af23661..6fb2dbe17 100644 --- a/crates/tauri-runtime-wry/src/window/mod.rs +++ b/crates/tauri-runtime-wry/src/window/mod.rs @@ -39,7 +39,7 @@ pub trait WindowExt { /// - **Android / iOS**: Unsupported. fn center(&self) {} - /// Clears the window sufrace. i.e make it it transparent. + /// Clears the window surface. i.e make it it transparent. #[cfg(windows)] fn draw_surface( &self, diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 323da1041..672ace507 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -921,7 +921,7 @@ ] }, { - "description": "Mica effect that matches the system dark perefence **Windows 11 Only**", + "description": "Mica effect that matches the system dark preference **Windows 11 Only**", "type": "string", "enum": [ "mica" @@ -942,7 +942,7 @@ ] }, { - "description": "Tabbed effect that matches the system dark perefence **Windows 11 Only**", + "description": "Tabbed effect that matches the system dark preference **Windows 11 Only**", "type": "string", "enum": [ "tabbed" diff --git a/crates/tauri-utils/src/acl/mod.rs b/crates/tauri-utils/src/acl/mod.rs index 4d2322c39..03c33d4fd 100644 --- a/crates/tauri-utils/src/acl/mod.rs +++ b/crates/tauri-utils/src/acl/mod.rs @@ -50,7 +50,7 @@ pub const PERMISSION_SCHEMA_FILE_NAME: &str = "schema.json"; pub const APP_ACL_KEY: &str = "__app-acl__"; /// Known acl manifests file pub const ACL_MANIFESTS_FILE_NAME: &str = "acl-manifests.json"; -/// Known capabilityies file +/// Known capabilities file pub const CAPABILITIES_FILE_NAME: &str = "capabilities.json"; /// Allowed commands file name pub const ALLOWED_COMMANDS_FILE_NAME: &str = "allowed-commands.json"; diff --git a/crates/tauri-utils/src/acl/schema.rs b/crates/tauri-utils/src/acl/schema.rs index 56b50a5f6..c1a793fc7 100644 --- a/crates/tauri-utils/src/acl/schema.rs +++ b/crates/tauri-utils/src/acl/schema.rs @@ -194,7 +194,7 @@ impl<'a> PermissionSchemaGenerator<'a, Iter<'a, PermissionSet>, Iter<'a, Permiss } } -/// Collect and include all possible identifiers in `Identifier` defintion in the schema +/// Collect and include all possible identifiers in `Identifier` definition in the schema fn extend_identifier_schema(schema: &mut RootSchema, acl: &BTreeMap) { if let Some(Schema::Object(identifier_schema)) = schema.definitions.get_mut("Identifier") { let permission_schemas = acl @@ -214,9 +214,9 @@ fn extend_identifier_schema(schema: &mut RootSchema, acl: &BTreeMap>( #[no_mangle] #[cfg_attr(not(target_vendor = "apple"), link_section = ".taubndl")] #[cfg_attr(target_vendor = "apple", link_section = "__DATA,taubndl")] -// Marked as `mut` becuase it could get optimized away without it, +// Marked as `mut` because it could get optimized away without it, // see https://github.com/tauri-apps/tauri/pull/13812 static mut __TAURI_BUNDLE_TYPE: &str = "UNK"; diff --git a/crates/tauri-utils/src/resources.rs b/crates/tauri-utils/src/resources.rs index 414815e2b..58a07d265 100644 --- a/crates/tauri-utils/src/resources.rs +++ b/crates/tauri-utils/src/resources.rs @@ -206,7 +206,7 @@ impl ResourcePathsIter<'_> { fn next_current_path(&mut self) -> Option> { // should be safe to unwrap since every call to `self.next_current_path()` - // is preceeded with assignemt to `self.current_path` + // is preceded with assignment to `self.current_path` let path = self.current_path.take().unwrap(); let is_dir = path.is_dir(); diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index e3d312b45..33eef1799 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -69,7 +69,6 @@ dirs = "6" percent-encoding = "2" raw-window-handle = { version = "0.6", features = ["std"] } glob = "0.3" -urlpattern = "0.3" mime = "0.3" data-url = { version = "0.3", optional = true } serialize-to-javascript = "0.1.2" diff --git a/crates/tauri/src/app.rs b/crates/tauri/src/app.rs index 06a3abe44..b950895bc 100644 --- a/crates/tauri/src/app.rs +++ b/crates/tauri/src/app.rs @@ -386,7 +386,7 @@ impl AppHandle { #[cfg(target_vendor = "apple")] impl AppHandle { - /// Fetches all Data Store Indentifiers by this app + /// Fetches all Data Store Identifiers by this app /// /// Needs to be called from Main Thread pub async fn fetch_data_store_identifiers(&self) -> crate::Result> { @@ -513,7 +513,7 @@ impl AppHandle { /// } /// /// let plugin = init_plugin(); - /// // `.name()` requires the `PLugin` trait import + /// // `.name()` requires the `Plugin` trait import /// let plugin_name = plugin.name(); /// tauri::Builder::default() /// .plugin(plugin) @@ -1577,7 +1577,7 @@ impl Builder { /// Append a custom initialization script. /// - /// Allow to append custom initialization script instend of replacing entire invoke system. + /// Allow to append custom initialization script instead of replacing entire invoke system. /// /// # Examples /// diff --git a/crates/tauri/src/ipc/mod.rs b/crates/tauri/src/ipc/mod.rs index 3b1d8cd1f..aff4d4891 100644 --- a/crates/tauri/src/ipc/mod.rs +++ b/crates/tauri/src/ipc/mod.rs @@ -345,7 +345,7 @@ impl InvokeResolver { F: Future> + Send + 'static, { // Dynamic dispatch the call in dev for a faster compile time - // TODO: Revisit this and see if we can do this for the release build as well if the performace hit is not a problem + // TODO: Revisit this and see if we can do this for the release build as well if the performance hit is not a problem #[cfg(debug_assertions)] { self.respond_async_serialized_dyn(Box::pin(task)) diff --git a/crates/tauri/src/lib.rs b/crates/tauri/src/lib.rs index 68a58edcc..6f326cf1f 100644 --- a/crates/tauri/src/lib.rs +++ b/crates/tauri/src/lib.rs @@ -296,7 +296,7 @@ pub enum EventLoopMessage { /// The webview runtime interface. A wrapper around [`runtime::Runtime`] with the proper user event type associated. pub trait Runtime: runtime::Runtime {} -/// The webview runtime handle. A wrapper arond [`runtime::RuntimeHandle`] with the proper user event type associated. +/// The webview runtime handle. A wrapper around [`runtime::RuntimeHandle`] with the proper user event type associated. pub trait RuntimeHandle: runtime::RuntimeHandle {} impl> Runtime for W {} diff --git a/crates/tauri/src/manager/mod.rs b/crates/tauri/src/manager/mod.rs index b97d9fbec..2126dd895 100644 --- a/crates/tauri/src/manager/mod.rs +++ b/crates/tauri/src/manager/mod.rs @@ -265,7 +265,7 @@ impl AppManager { crate::app::GlobalTrayIconEventListener>, >, window_event_listeners: Vec>, - webiew_event_listeners: Vec>, + webview_event_listeners: Vec>, #[cfg(desktop)] window_menu_event_listeners: HashMap< String, crate::app::GlobalMenuEventListener>, @@ -292,7 +292,7 @@ impl AppManager { invoke_handler, on_page_load, uri_scheme_protocols: Mutex::new(uri_scheme_protocols), - event_listeners: Arc::new(webiew_event_listeners), + event_listeners: Arc::new(webview_event_listeners), invoke_initialization_script, invoke_key: invoke_key.clone(), }, diff --git a/crates/tauri/src/plugin.rs b/crates/tauri/src/plugin.rs index e1624377c..9c7f9a1ab 100644 --- a/crates/tauri/src/plugin.rs +++ b/crates/tauri/src/plugin.rs @@ -90,7 +90,7 @@ pub trait Plugin: Send { #[allow(unused_variables)] fn webview_created(&mut self, webview: Webview) {} - /// Callback invoked when webview tries to navigate to the given Url. Returning falses cancels navigation. + /// Callback invoked when webview tries to navigate to the given Url. Returning false cancels navigation. #[allow(unused_variables)] fn on_navigation(&mut self, webview: &Webview, url: &Url) -> bool { true diff --git a/crates/tauri/src/tray/mod.rs b/crates/tauri/src/tray/mod.rs index 5980844c9..3f487b010 100644 --- a/crates/tauri/src/tray/mod.rs +++ b/crates/tauri/src/tray/mod.rs @@ -73,7 +73,7 @@ impl From for MouseButton { /// /// ## Platform-specific: /// -/// - **Linux**: Unsupported. The event is not emmited even though the icon is shown +/// - **Linux**: Unsupported. The event is not emitted even though the icon is shown /// and will still show a context menu on right click. #[derive(Debug, Clone, Serialize)] #[serde(tag = "type")] @@ -314,7 +314,7 @@ impl TrayIconBuilder { /// - **Linux:** Unsupported. #[deprecated( since = "2.2.0", - note = "Use `TrayIconBuiler::show_menu_on_left_click` instead." + note = "Use `TrayIconBuilder::show_menu_on_left_click` instead." )] pub fn menu_on_left_click(mut self, enable: bool) -> Self { self.inner = self.inner.with_menu_on_left_click(enable); diff --git a/crates/tauri/src/webview/mod.rs b/crates/tauri/src/webview/mod.rs index c185e7c62..9c4a6e0ea 100644 --- a/crates/tauri/src/webview/mod.rs +++ b/crates/tauri/src/webview/mod.rs @@ -2068,7 +2068,7 @@ tauri::Builder::default() /// Specify the webview background color. /// - /// ## Platfrom-specific: + /// ## Platform-specific: /// /// - **macOS / iOS**: Not implemented. /// - **Windows**: diff --git a/crates/tauri/src/webview/webview_window.rs b/crates/tauri/src/webview/webview_window.rs index f4a48c168..24232993a 100644 --- a/crates/tauri/src/webview/webview_window.rs +++ b/crates/tauri/src/webview/webview_window.rs @@ -2042,9 +2042,9 @@ impl WebviewWindow { /// Sets this window's minimum inner width. pub fn set_size_constraints( &self, - constriants: tauri_runtime::window::WindowSizeConstraints, + constraints: tauri_runtime::window::WindowSizeConstraints, ) -> crate::Result<()> { - self.window.set_size_constraints(constriants) + self.window.set_size_constraints(constraints) } /// Sets this window's position. diff --git a/crates/tauri/src/window/mod.rs b/crates/tauri/src/window/mod.rs index 92a515237..9e74e694b 100644 --- a/crates/tauri/src/window/mod.rs +++ b/crates/tauri/src/window/mod.rs @@ -1941,12 +1941,12 @@ tauri::Builder::default() /// Sets this window's minimum inner width. pub fn set_size_constraints( &self, - constriants: tauri_runtime::window::WindowSizeConstraints, + constraints: tauri_runtime::window::WindowSizeConstraints, ) -> crate::Result<()> { self .window .dispatcher - .set_size_constraints(constriants) + .set_size_constraints(constraints) .map_err(Into::into) } diff --git a/crates/tauri/src/window/scripts/drag.js b/crates/tauri/src/window/scripts/drag.js index 21aa05697..1c9461b63 100644 --- a/crates/tauri/src/window/scripts/drag.js +++ b/crates/tauri/src/window/scripts/drag.js @@ -30,7 +30,7 @@ ) { // macOS maximization happens on `mouseup`, // so we save needed state and early return - if (osName === 'macos' && e.detail == 2) { + if (osName === 'macos' && e.detail === 2) { initialX = e.clientX initialY = e.clientY return @@ -48,7 +48,7 @@ window.__TAURI_INTERNALS__.invoke('plugin:window|' + cmd) } }) - // on macOS we maximze on mouseup instead, to match the system behavior where maximization can be canceled + // on macOS we maximize on mouseup instead, to match the system behavior where maximization can be canceled // if the mouse moves outside the data-tauri-drag-region if (osName === 'macos') { document.addEventListener('mouseup', (e) => { diff --git a/examples/api/unocss.config.js b/examples/api/unocss.config.js index 6e379c5a1..c1665d25a 100644 --- a/examples/api/unocss.config.js +++ b/examples/api/unocss.config.js @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -import { defineConfig, presetIcons, presetUno, presetWebFonts } from 'unocss' +import { defineConfig, presetIcons, presetWind3, presetWebFonts } from 'unocss' import extractorSvelte from '@unocss/extractor-svelte' export default defineConfig({ @@ -88,7 +88,7 @@ export default defineConfig({ checkbox: 'accent-accent' }, presets: [ - presetUno(), + presetWind3(), presetIcons(), presetWebFonts({ fonts: { diff --git a/examples/file-associations/src-tauri/src/main.rs b/examples/file-associations/src-tauri/src/main.rs index caf6affeb..c2c631e24 100644 --- a/examples/file-associations/src-tauri/src/main.rs +++ b/examples/file-associations/src-tauri/src/main.rs @@ -56,7 +56,7 @@ fn main() { // NOTICE: `args` may include URL protocol (`your-app-protocol://`) // or arguments (`--`) if your app supports them. - // files may aslo be passed as `file://path/to/file` + // files may also be passed as `file://path/to/file` for maybe_file in std::env::args().skip(1) { // skip flags like -f or --flag if maybe_file.starts_with('-') { diff --git a/packages/api/src/core.ts b/packages/api/src/core.ts index d3a91edb4..30665d796 100644 --- a/packages/api/src/core.ts +++ b/packages/api/src/core.ts @@ -294,7 +294,7 @@ function convertFileSrc(filePath: string, protocol = 'asset'): string { * A rust-backed resource stored through `tauri::Manager::resources_table` API. * * The resource lives in the main process and does not exist - * in the Javascript world, and thus will not be cleaned up automatiacally + * in the Javascript world, and thus will not be cleaned up automatically * except on application exit. If you want to clean it up early, call {@linkcode Resource.close} * * @example diff --git a/packages/api/src/dpi.ts b/packages/api/src/dpi.ts index 88409726b..0a40d67d0 100644 --- a/packages/api/src/dpi.ts +++ b/packages/api/src/dpi.ts @@ -78,7 +78,7 @@ class LogicalSize { * * Physical pixels represent actual screen pixels, and are DPI-independent. * For high-DPI windows, this means that any point in the window on the screen - * will have a different position in logical pixels (@linkcode LogicalSize). + * will have a different position in logical pixels {@linkcode LogicalSize}. * * For physical-pixel-based position, see {@linkcode PhysicalPosition}. * diff --git a/packages/api/src/webviewWindow.ts b/packages/api/src/webviewWindow.ts index f73d5cab5..289902b95 100644 --- a/packages/api/src/webviewWindow.ts +++ b/packages/api/src/webviewWindow.ts @@ -134,7 +134,7 @@ class WebviewWindow { } /** - * Listen to an emitted event on this webivew window. + * Listen to an emitted event on this webview window. * * @example * ```typescript diff --git a/packages/api/src/window.ts b/packages/api/src/window.ts index e89a8ae6c..090108337 100644 --- a/packages/api/src/window.ts +++ b/packages/api/src/window.ts @@ -2229,7 +2229,7 @@ enum Effect { */ Acrylic = 'acrylic', /** - * Tabbed effect that matches the system dark perefence **Windows 11 Only** + * Tabbed effect that matches the system dark preference **Windows 11 Only** */ Tabbed = 'tabbed', /** From a1c231ec297fc53dc28acb8d50e8d63b9d21c1fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:30:28 +0800 Subject: [PATCH 014/119] chore(deps-dev): bump vite from 7.1.5 to 7.1.11 (#14336) * chore(deps-dev): bump vite from 7.1.5 to 7.1.11 Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.5 to 7.1.11. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.1.11/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.1.11 dependency-type: direct:development ... Signed-off-by: dependabot[bot] * Dedupe --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tony --- examples/api/package.json | 2 +- pnpm-lock.yaml | 60 +++++++++++++++++++-------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/examples/api/package.json b/examples/api/package.json index 9aa081b90..65ede4686 100644 --- a/examples/api/package.json +++ b/examples/api/package.json @@ -19,6 +19,6 @@ "@unocss/extractor-svelte": "^66.3.3", "svelte": "^5.35.6", "unocss": "^66.3.3", - "vite": "^7.1.5" + "vite": "^7.1.11" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a8167155..747c138b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 1.2.2 '@sveltejs/vite-plugin-svelte': specifier: ^6.0.0 - version: 6.0.0(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + version: 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) '@unocss/extractor-svelte': specifier: ^66.3.3 version: 66.3.3 @@ -47,10 +47,10 @@ importers: version: 5.35.6 unocss: specifier: ^66.3.3 - version: 66.3.3(postcss@8.5.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + version: 66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) vite: - specifier: ^7.1.5 - version: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + specifier: ^7.1.11 + version: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) examples/file-associations: {} @@ -2394,8 +2394,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} + vite@7.1.11: + resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3418,25 +3418,25 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.0.0(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@sveltejs/vite-plugin-svelte': 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) debug: 4.4.1 svelte: 5.35.6 - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.19 svelte: 5.35.6 - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) - vitefu: 1.1.1(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vitefu: 1.1.1(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) transitivePeerDependencies: - supports-color @@ -3556,13 +3556,13 @@ snapshots: '@typescript-eslint/types': 8.34.1 eslint-visitor-keys: 4.2.1 - '@unocss/astro@66.3.3(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': + '@unocss/astro@66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': dependencies: '@unocss/core': 66.3.3 '@unocss/reset': 66.3.3 - '@unocss/vite': 66.3.3(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + '@unocss/vite': 66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) optionalDependencies: - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - vue @@ -3695,7 +3695,7 @@ snapshots: dependencies: '@unocss/core': 66.3.3 - '@unocss/vite@66.3.3(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': + '@unocss/vite@66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.3.3 @@ -3706,7 +3706,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.2.4 - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - vue @@ -3718,13 +3718,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -4703,9 +4703,9 @@ snapshots: universal-user-agent@7.0.3: {} - unocss@66.3.3(postcss@8.5.6)(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)): + unocss@66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)): dependencies: - '@unocss/astro': 66.3.3(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + '@unocss/astro': 66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) '@unocss/cli': 66.3.3 '@unocss/core': 66.3.3 '@unocss/postcss': 66.3.3(postcss@8.5.6) @@ -4723,9 +4723,9 @@ snapshots: '@unocss/transformer-compile-class': 66.3.3 '@unocss/transformer-directives': 66.3.3 '@unocss/transformer-variant-group': 66.3.3 - '@unocss/vite': 66.3.3(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + '@unocss/vite': 66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) optionalDependencies: - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - postcss - supports-color @@ -4746,7 +4746,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - jiti @@ -4761,7 +4761,7 @@ snapshots: - tsx - yaml - vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): + vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): dependencies: esbuild: 0.25.4 fdir: 6.5.0(picomatch@4.0.3) @@ -4775,15 +4775,15 @@ snapshots: jiti: 2.4.2 terser: 5.43.1 - vitefu@1.1.1(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)): + vitefu@1.1.1(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)): optionalDependencies: - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) vitest@3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -4801,7 +4801,7 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) vite-node: 3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: From cdc5594286ec40ed224ab94f6df4fd0a53dfbe83 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 17:09:40 +0800 Subject: [PATCH 015/119] chore(deps): update dependency rollup to v4.52.5 (#14339) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index ea631f6f6..765ebe9db 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.52.4", + "rollup": "4.52.5", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 747c138b5..61f7893b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.52.4) + version: 0.4.4(rollup@4.52.5) '@rollup/plugin-typescript': specifier: 12.1.4 - version: 12.1.4(rollup@4.52.4)(tslib@2.8.1)(typescript@5.8.3) + version: 12.1.4(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.52.4 - version: 4.52.4 + specifier: 4.52.5 + version: 4.52.5 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1103,113 +1103,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.4': - resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.4': - resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.4': - resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.4': - resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.4': - resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.4': - resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': - resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.4': - resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.4': - resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.4': - resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.4': - resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.4': - resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.4': - resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.4': - resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.4': - resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.4': - resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.4': - resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.4': - resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.4': - resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.4': - resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.4': - resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.4': - resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] @@ -2168,8 +2168,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.52.4: - resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3323,95 +3323,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.52.4)': + '@rollup/plugin-terser@0.4.4(rollup@4.52.5)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.52.4 + rollup: 4.52.5 - '@rollup/plugin-typescript@12.1.4(rollup@4.52.4)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.1.4(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.4) + '@rollup/pluginutils': 5.2.0(rollup@4.52.5) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.52.4 + rollup: 4.52.5 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.52.4)': + '@rollup/pluginutils@5.2.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.4 + rollup: 4.52.5 - '@rollup/rollup-android-arm-eabi@4.52.4': + '@rollup/rollup-android-arm-eabi@4.52.5': optional: true - '@rollup/rollup-android-arm64@4.52.4': + '@rollup/rollup-android-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.52.4': + '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.52.4': + '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@rollup/rollup-freebsd-arm64@4.52.4': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true - '@rollup/rollup-freebsd-x64@4.52.4': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.4': + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.4': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.4': + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.4': + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.4': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.4': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.4': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.4': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.4': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.52.4': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-openharmony-arm64@4.52.4': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.4': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.4': + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.4': + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.4': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': @@ -4465,32 +4465,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.52.4: + rollup@4.52.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.4 - '@rollup/rollup-android-arm64': 4.52.4 - '@rollup/rollup-darwin-arm64': 4.52.4 - '@rollup/rollup-darwin-x64': 4.52.4 - '@rollup/rollup-freebsd-arm64': 4.52.4 - '@rollup/rollup-freebsd-x64': 4.52.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 - '@rollup/rollup-linux-arm-musleabihf': 4.52.4 - '@rollup/rollup-linux-arm64-gnu': 4.52.4 - '@rollup/rollup-linux-arm64-musl': 4.52.4 - '@rollup/rollup-linux-loong64-gnu': 4.52.4 - '@rollup/rollup-linux-ppc64-gnu': 4.52.4 - '@rollup/rollup-linux-riscv64-gnu': 4.52.4 - '@rollup/rollup-linux-riscv64-musl': 4.52.4 - '@rollup/rollup-linux-s390x-gnu': 4.52.4 - '@rollup/rollup-linux-x64-gnu': 4.52.4 - '@rollup/rollup-linux-x64-musl': 4.52.4 - '@rollup/rollup-openharmony-arm64': 4.52.4 - '@rollup/rollup-win32-arm64-msvc': 4.52.4 - '@rollup/rollup-win32-ia32-msvc': 4.52.4 - '@rollup/rollup-win32-x64-gnu': 4.52.4 - '@rollup/rollup-win32-x64-msvc': 4.52.4 + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4767,7 +4767,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.4 + rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.15.32 From 4b6b8690ab886ebdf1307951cffbe03e31280baa Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 22 Oct 2025 11:33:30 +0200 Subject: [PATCH 016/119] chore: remove `--cfg docsrs` to fix docs.rs builds (#14347) --- .changes/docsrs.md | 9 +++++++++ .github/CONTRIBUTING.md | 2 +- crates/tauri-build/Cargo.toml | 2 -- crates/tauri-plugin/Cargo.toml | 2 -- crates/tauri-runtime-wry/Cargo.toml | 4 ---- crates/tauri-runtime/Cargo.toml | 2 -- crates/tauri/Cargo.toml | 2 -- 7 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 .changes/docsrs.md diff --git a/.changes/docsrs.md b/.changes/docsrs.md new file mode 100644 index 000000000..be7fe825c --- /dev/null +++ b/.changes/docsrs.md @@ -0,0 +1,9 @@ +--- +tauri: patch:bug +tauri-build: patch:bug +tauri-plugin: patch:bug +tauri-runtime: patch:bug +tauri-runtime-wry: patch:bug +--- + +Fixed an issue that caused docs.rs builds to fail. No user facing changes. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a797449d9..975b6d5ae 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -98,7 +98,7 @@ You can use `cargo install --path . --debug` to speed up test builds. You can build the Rust documentation locally running the following script: ```bash -$ RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --open +$ cargo +nightly doc --all-features --open ``` ### Developing the JS API diff --git a/crates/tauri-build/Cargo.toml b/crates/tauri-build/Cargo.toml index 47c587587..6bd2d68f5 100644 --- a/crates/tauri-build/Cargo.toml +++ b/crates/tauri-build/Cargo.toml @@ -22,8 +22,6 @@ targets = [ "x86_64-linux-android", "x86_64-apple-ios", ] -rustc-args = ["--cfg", "docsrs"] -rustdoc-args = ["--cfg", "docsrs"] [dependencies] anyhow = "1" diff --git a/crates/tauri-plugin/Cargo.toml b/crates/tauri-plugin/Cargo.toml index a0108c068..f6dac8c65 100644 --- a/crates/tauri-plugin/Cargo.toml +++ b/crates/tauri-plugin/Cargo.toml @@ -12,8 +12,6 @@ rust-version.workspace = true [package.metadata.docs.rs] features = ["build", "runtime"] -rustc-args = ["--cfg", "docsrs"] -rustdoc-args = ["--cfg", "docsrs"] [features] build = [ diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index d0b24c964..ddade7b77 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -12,10 +12,6 @@ license.workspace = true edition.workspace = true rust-version.workspace = true -[package.metadata.docs.rs] -rustc-args = ["--cfg", "docsrs"] -rustdoc-args = ["--cfg", "docsrs"] - [dependencies] wry = { version = "0.53.4", default-features = false, features = [ "drag-drop", diff --git a/crates/tauri-runtime/Cargo.toml b/crates/tauri-runtime/Cargo.toml index aebc4209d..14e58799a 100644 --- a/crates/tauri-runtime/Cargo.toml +++ b/crates/tauri-runtime/Cargo.toml @@ -14,8 +14,6 @@ rust-version.workspace = true [package.metadata.docs.rs] all-features = true -rustc-args = ["--cfg", "docsrs"] -rustdoc-args = ["--cfg", "docsrs"] default-target = "x86_64-unknown-linux-gnu" targets = [ "x86_64-pc-windows-msvc", diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 33eef1799..46a4ee722 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -26,8 +26,6 @@ features = [ "test", "specta", ] -rustc-args = ["--cfg", "docsrs"] -rustdoc-args = ["--cfg", "docsrs"] default-target = "x86_64-unknown-linux-gnu" targets = [ "x86_64-pc-windows-msvc", From f59bf9d5392ffd209e26ce5259c26d1acc31c4ba Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 22 Oct 2025 12:28:10 +0200 Subject: [PATCH 017/119] chore: Add missing changefile for tauri-macos-sign (#14337) --- .changes/macos-codesign-error-enum.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changes/macos-codesign-error-enum.md diff --git a/.changes/macos-codesign-error-enum.md b/.changes/macos-codesign-error-enum.md new file mode 100644 index 000000000..f5bae6975 --- /dev/null +++ b/.changes/macos-codesign-error-enum.md @@ -0,0 +1,5 @@ +--- +tauri-macos-sign: "minor:enhance" +--- + +**Potentially breaking change:** Export custom Error enum instead of using anyhow. The changes happened in https://github.com/tauri-apps/tauri/pull/14126. From 67c7418c0677de6a7dd32fd3291301a2aef352ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Oct 2025 13:38:43 +0200 Subject: [PATCH 018/119] apply version updates (#14348) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changes/docsrs.md | 9 -------- .changes/macos-codesign-error-enum.md | 5 ----- Cargo.lock | 22 +++++++++---------- crates/tauri-build/CHANGELOG.md | 6 +++++ crates/tauri-build/Cargo.toml | 2 +- crates/tauri-bundler/CHANGELOG.md | 6 +++++ crates/tauri-bundler/Cargo.toml | 4 ++-- crates/tauri-cli/CHANGELOG.md | 7 ++++++ crates/tauri-cli/Cargo.toml | 6 ++--- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-cli/metadata-v2.json | 8 +++---- crates/tauri-macos-sign/CHANGELOG.md | 6 +++++ crates/tauri-macos-sign/Cargo.toml | 2 +- crates/tauri-plugin/CHANGELOG.md | 6 +++++ crates/tauri-plugin/Cargo.toml | 2 +- crates/tauri-runtime-wry/CHANGELOG.md | 10 +++++++++ crates/tauri-runtime-wry/Cargo.toml | 4 ++-- crates/tauri-runtime/CHANGELOG.md | 6 +++++ crates/tauri-runtime/Cargo.toml | 2 +- .../schemas/config.schema.json | 2 +- crates/tauri/CHANGELOG.md | 12 ++++++++++ crates/tauri/Cargo.toml | 8 +++---- packages/cli/CHANGELOG.md | 6 +++++ packages/cli/package.json | 2 +- 24 files changed, 98 insertions(+), 47 deletions(-) delete mode 100644 .changes/docsrs.md delete mode 100644 .changes/macos-codesign-error-enum.md diff --git a/.changes/docsrs.md b/.changes/docsrs.md deleted file mode 100644 index be7fe825c..000000000 --- a/.changes/docsrs.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -tauri: patch:bug -tauri-build: patch:bug -tauri-plugin: patch:bug -tauri-runtime: patch:bug -tauri-runtime-wry: patch:bug ---- - -Fixed an issue that caused docs.rs builds to fail. No user facing changes. diff --git a/.changes/macos-codesign-error-enum.md b/.changes/macos-codesign-error-enum.md deleted file mode 100644 index f5bae6975..000000000 --- a/.changes/macos-codesign-error-enum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-macos-sign: "minor:enhance" ---- - -**Potentially breaking change:** Export custom Error enum instead of using anyhow. The changes happened in https://github.com/tauri-apps/tauri/pull/14126. diff --git a/Cargo.lock b/Cargo.lock index 15b6fe5b1..671ddc123 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -4311,7 +4311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -8485,7 +8485,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.9.0" +version = "2.9.1" dependencies = [ "anyhow", "bytes", @@ -8545,7 +8545,7 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "cargo_toml", @@ -8567,7 +8567,7 @@ dependencies = [ [[package]] name = "tauri-bundler" -version = "2.7.0" +version = "2.7.1" dependencies = [ "anyhow", "ar", @@ -8613,7 +8613,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.9.0" +version = "2.9.1" dependencies = [ "ar", "axum", @@ -8772,7 +8772,7 @@ dependencies = [ [[package]] name = "tauri-macos-sign" -version = "2.2.0" +version = "2.3.0" dependencies = [ "apple-codesign", "chrono", @@ -8804,7 +8804,7 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.5.0" +version = "2.5.1" dependencies = [ "anyhow", "glob", @@ -8852,7 +8852,7 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.9.0" +version = "2.9.1" dependencies = [ "cookie", "dpi", @@ -8875,7 +8875,7 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.9.0" +version = "2.9.1" dependencies = [ "gtk", "http 1.3.1", @@ -10314,7 +10314,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/tauri-build/CHANGELOG.md b/crates/tauri-build/CHANGELOG.md index 05d4867d1..95ba81d85 100644 --- a/crates/tauri-build/CHANGELOG.md +++ b/crates/tauri-build/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.5.1] + +### Bug Fixes + +- [`4b6b8690a`](https://www.github.com/tauri-apps/tauri/commit/4b6b8690ab886ebdf1307951cffbe03e31280baa) ([#14347](https://www.github.com/tauri-apps/tauri/pull/14347) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused docs.rs builds to fail. No user facing changes. + ## \[2.5.0] ### New Features diff --git a/crates/tauri-build/Cargo.toml b/crates/tauri-build/Cargo.toml index 6bd2d68f5..3f93769e1 100644 --- a/crates/tauri-build/Cargo.toml +++ b/crates/tauri-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-build" -version = "2.5.0" +version = "2.5.1" description = "build time code to pair with https://crates.io/crates/tauri" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" diff --git a/crates/tauri-bundler/CHANGELOG.md b/crates/tauri-bundler/CHANGELOG.md index f07521914..d986ea714 100644 --- a/crates/tauri-bundler/CHANGELOG.md +++ b/crates/tauri-bundler/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.7.1] + +### Dependencies + +- Upgraded to `tauri-macos-sign@2.3.0` + ## \[2.7.0] ### New Features diff --git a/crates/tauri-bundler/Cargo.toml b/crates/tauri-bundler/Cargo.toml index e74135518..c4e124d25 100644 --- a/crates/tauri-bundler/Cargo.toml +++ b/crates/tauri-bundler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-bundler" -version = "2.7.0" +version = "2.7.1" authors = [ "George Burton ", "Tauri Programme within The Commons Conservancy", @@ -59,7 +59,7 @@ features = ["Win32_System_SystemInformation", "Win32_System_Diagnostics_Debug"] [target."cfg(target_os = \"macos\")".dependencies] icns = { package = "tauri-icns", version = "0.1" } time = { version = "0.3", features = ["formatting"] } -tauri-macos-sign = { version = "2.2.0", path = "../tauri-macos-sign" } +tauri-macos-sign = { version = "2.3.0", path = "../tauri-macos-sign" } [target."cfg(target_os = \"linux\")".dependencies] heck = "0.5" diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index 6debafbee..0e9e511da 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## \[2.9.1] + +### Dependencies + +- Upgraded to `tauri-macos-sign@2.3.0` +- Upgraded to `tauri-bundler@2.7.1` + ## \[2.9.0] ### New Features diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index 2764488ad..d7c11d0fa 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.9.0" +version = "2.9.1" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" @@ -47,7 +47,7 @@ sublime_fuzzy = "0.7" clap_complete = "4" clap = { version = "4", features = ["derive", "env"] } thiserror = "2" -tauri-bundler = { version = "2.7.0", default-features = false, path = "../tauri-bundler" } +tauri-bundler = { version = "2.7.1", default-features = false, path = "../tauri-bundler" } colored = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } @@ -132,7 +132,7 @@ libc = "0.2" [target."cfg(target_os = \"macos\")".dependencies] plist = "1" -tauri-macos-sign = { version = "2.2.0", path = "../tauri-macos-sign" } +tauri-macos-sign = { version = "2.3.0", path = "../tauri-macos-sign" } object = { version = "0.36", default-features = false, features = [ "macho", "read_core", diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 672ace507..6f5665ce5 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.0", + "$id": "https://schema.tauri.app/config/2.9.1", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index 725d89c07..54e944f5a 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,9 +1,9 @@ { "cli.js": { - "version": "2.9.0", + "version": "2.9.1", "node": ">= 10.0.0" }, - "tauri": "2.9.0", - "tauri-build": "2.5.0", - "tauri-plugin": "2.5.0" + "tauri": "2.9.1", + "tauri-build": "2.5.1", + "tauri-plugin": "2.5.1" } diff --git a/crates/tauri-macos-sign/CHANGELOG.md b/crates/tauri-macos-sign/CHANGELOG.md index 93329f55d..c45220b61 100644 --- a/crates/tauri-macos-sign/CHANGELOG.md +++ b/crates/tauri-macos-sign/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.3.0] + +### Enhancements + +- [`f59bf9d53`](https://www.github.com/tauri-apps/tauri/commit/f59bf9d5392ffd209e26ce5259c26d1acc31c4ba) ([#14337](https://www.github.com/tauri-apps/tauri/pull/14337) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) **Potentially breaking change:** Export custom Error enum instead of using anyhow. The changes happened in https://github.com/tauri-apps/tauri/pull/14126. + ## \[2.2.0] ### New Features diff --git a/crates/tauri-macos-sign/Cargo.toml b/crates/tauri-macos-sign/Cargo.toml index 37e787cd4..77984f71b 100644 --- a/crates/tauri-macos-sign/Cargo.toml +++ b/crates/tauri-macos-sign/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-macos-sign" -version = "2.2.0" +version = "2.3.0" authors = ["Tauri Programme within The Commons Conservancy"] license = "Apache-2.0 OR MIT" keywords = ["codesign", "signing", "macos", "ios", "tauri"] diff --git a/crates/tauri-plugin/CHANGELOG.md b/crates/tauri-plugin/CHANGELOG.md index eacb6a9c5..104093af2 100644 --- a/crates/tauri-plugin/CHANGELOG.md +++ b/crates/tauri-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.5.1] + +### Bug Fixes + +- [`4b6b8690a`](https://www.github.com/tauri-apps/tauri/commit/4b6b8690ab886ebdf1307951cffbe03e31280baa) ([#14347](https://www.github.com/tauri-apps/tauri/pull/14347) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused docs.rs builds to fail. No user facing changes. + ## \[2.5.0] ### Dependencies diff --git a/crates/tauri-plugin/Cargo.toml b/crates/tauri-plugin/Cargo.toml index f6dac8c65..971d8c50f 100644 --- a/crates/tauri-plugin/Cargo.toml +++ b/crates/tauri-plugin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-plugin" -version = "2.5.0" +version = "2.5.1" description = "Build script and runtime Tauri plugin definitions" authors.workspace = true homepage.workspace = true diff --git a/crates/tauri-runtime-wry/CHANGELOG.md b/crates/tauri-runtime-wry/CHANGELOG.md index 014fab581..d9ac4f1d1 100644 --- a/crates/tauri-runtime-wry/CHANGELOG.md +++ b/crates/tauri-runtime-wry/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## \[2.9.1] + +### Bug Fixes + +- [`4b6b8690a`](https://www.github.com/tauri-apps/tauri/commit/4b6b8690ab886ebdf1307951cffbe03e31280baa) ([#14347](https://www.github.com/tauri-apps/tauri/pull/14347) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused docs.rs builds to fail. No user facing changes. + +### Dependencies + +- Upgraded to `tauri-runtime@2.9.1` + ## \[2.9.0] ### New Features diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index ddade7b77..e247f3793 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime-wry" -version = "2.9.0" +version = "2.9.1" description = "Wry bindings to the Tauri runtime" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,7 +20,7 @@ wry = { version = "0.53.4", default-features = false, features = [ "linux-body", ] } tao = { version = "0.34.5", default-features = false, features = ["rwh_06"] } -tauri-runtime = { version = "2.9.0", path = "../tauri-runtime" } +tauri-runtime = { version = "2.9.1", path = "../tauri-runtime" } tauri-utils = { version = "2.8.0", path = "../tauri-utils" } raw-window-handle = "0.6" http = "1" diff --git a/crates/tauri-runtime/CHANGELOG.md b/crates/tauri-runtime/CHANGELOG.md index 333c6d005..edf7e1a03 100644 --- a/crates/tauri-runtime/CHANGELOG.md +++ b/crates/tauri-runtime/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.1] + +### Bug Fixes + +- [`4b6b8690a`](https://www.github.com/tauri-apps/tauri/commit/4b6b8690ab886ebdf1307951cffbe03e31280baa) ([#14347](https://www.github.com/tauri-apps/tauri/pull/14347) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused docs.rs builds to fail. No user facing changes. + ## \[2.9.0] ### New Features diff --git a/crates/tauri-runtime/Cargo.toml b/crates/tauri-runtime/Cargo.toml index 14e58799a..b269b8d32 100644 --- a/crates/tauri-runtime/Cargo.toml +++ b/crates/tauri-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime" -version = "2.9.0" +version = "2.9.1" description = "Runtime for Tauri applications" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 672ace507..6f5665ce5 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.0", + "$id": "https://schema.tauri.app/config/2.9.1", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri/CHANGELOG.md b/crates/tauri/CHANGELOG.md index 8b60c5c7b..164368723 100644 --- a/crates/tauri/CHANGELOG.md +++ b/crates/tauri/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## \[2.9.1] + +### Bug Fixes + +- [`4b6b8690a`](https://www.github.com/tauri-apps/tauri/commit/4b6b8690ab886ebdf1307951cffbe03e31280baa) ([#14347](https://www.github.com/tauri-apps/tauri/pull/14347) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused docs.rs builds to fail. No user facing changes. + +### Dependencies + +- Upgraded to `tauri-build@2.5.1` +- Upgraded to `tauri-runtime@2.9.1` +- Upgraded to `tauri-runtime-wry@2.9.1` + ## \[2.9.0] ### New Features diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 46a4ee722..ce6907580 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri" -version = "2.9.0" +version = "2.9.1" description = "Make tiny, secure apps for all desktop platforms with Tauri" exclude = ["/test", "/.scripts", "CHANGELOG.md", "/target"] readme = "README.md" @@ -54,12 +54,12 @@ uuid = { version = "1", features = ["v4"], optional = true } url = "2" anyhow = "1" thiserror = "2" -tauri-runtime = { version = "2.9.0", path = "../tauri-runtime" } +tauri-runtime = { version = "2.9.1", path = "../tauri-runtime" } tauri-macros = { version = "2.5.0", path = "../tauri-macros" } tauri-utils = { version = "2.8.0", features = [ "resources", ], path = "../tauri-utils" } -tauri-runtime-wry = { version = "2.9.0", path = "../tauri-runtime-wry", default-features = false, optional = true } +tauri-runtime-wry = { version = "2.9.1", path = "../tauri-runtime-wry", default-features = false, optional = true } getrandom = "0.3" serde_repr = "0.1" http = "1" @@ -161,7 +161,7 @@ objc2-ui-kit = { version = "0.3.0", default-features = false, features = [ [build-dependencies] glob = "0.3" heck = "0.5" -tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.0" } +tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.1" } tauri-utils = { path = "../tauri-utils/", version = "2.8.0", features = [ "build", ] } diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index c7b9f0ac2..fd4add94a 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.1] + +### Dependencies + +- Upgraded to `tauri-cli@2.9.1` + ## \[2.9.0] ### New Features diff --git a/packages/cli/package.json b/packages/cli/package.json index f0fc53ed5..97e8bba16 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.9.0", + "version": "2.9.1", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From fc017ee2577f48615367ea519386d3f37837e2c1 Mon Sep 17 00:00:00 2001 From: kandrelczyk Date: Tue, 28 Oct 2025 08:03:48 +0100 Subject: [PATCH 019/119] add info to error message (fix 14186) (#14368) * add info to error message * changes file and linux only warning Signed-off-by: Krzysztof Andrelczyk * Update change file --------- Signed-off-by: Krzysztof Andrelczyk Co-authored-by: Tony --- .changes/bundler-warning.md | 5 +++++ crates/tauri-bundler/src/error.rs | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 .changes/bundler-warning.md diff --git a/.changes/bundler-warning.md b/.changes/bundler-warning.md new file mode 100644 index 000000000..37d6931b4 --- /dev/null +++ b/.changes/bundler-warning.md @@ -0,0 +1,5 @@ +--- +'tauri-bundler': 'patch:enhance' +--- + +Mention symbol stripping on Linux in binary patch failed warning message diff --git a/crates/tauri-bundler/src/error.rs b/crates/tauri-bundler/src/error.rs index 3a8fe82dd..92adf63a7 100644 --- a/crates/tauri-bundler/src/error.rs +++ b/crates/tauri-bundler/src/error.rs @@ -99,6 +99,10 @@ pub enum Error { #[error("Wrong package type {0} for platform {1}")] InvalidPackageType(String, String), /// Bundle type symbol missing in binary + #[cfg(target_os = "linux")] + #[error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date and that symbol stripping is disabled (https://doc.rust-lang.org/cargo/reference/profiles.html#strip)")] + MissingBundleTypeVar, + #[cfg(not(target_os = "linux"))] #[error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date")] MissingBundleTypeVar, /// Failed to write binary file changed From 3056d44d96eb6392a0692c3ac46a505b57877014 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 15:57:47 +0800 Subject: [PATCH 020/119] chore(deps): update dependency @rollup/plugin-typescript to v12.3.0 (#14364) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 765ebe9db..5999d215d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@eslint/js": "^9.29.0", "@rollup/plugin-terser": "0.4.4", - "@rollup/plugin-typescript": "12.1.4", + "@rollup/plugin-typescript": "12.3.0", "@types/eslint": "^9.6.1", "@types/node": "^22.15.32", "eslint": "^9.29.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61f7893b9..14589cb61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,8 +65,8 @@ importers: specifier: 0.4.4 version: 0.4.4(rollup@4.52.5) '@rollup/plugin-typescript': - specifier: 12.1.4 - version: 12.1.4(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3) + specifier: 12.3.0 + version: 12.3.0(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -1081,8 +1081,8 @@ packages: rollup: optional: true - '@rollup/plugin-typescript@12.1.4': - resolution: {integrity: sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==} + '@rollup/plugin-typescript@12.3.0': + resolution: {integrity: sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.14.0||^3.0.0||^4.0.0 @@ -3331,7 +3331,7 @@ snapshots: optionalDependencies: rollup: 4.52.5 - '@rollup/plugin-typescript@12.1.4(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3)': dependencies: '@rollup/pluginutils': 5.2.0(rollup@4.52.5) resolve: 1.22.10 From 28b9e7c7b83845c35fe46c37e8ed8e9022b4634e Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Tue, 28 Oct 2025 18:07:50 +0800 Subject: [PATCH 021/119] fix: throw on custom protocol IPC fails (#14377) --- .changes/run-callback-after-catch.md | 5 +++++ crates/tauri/scripts/ipc-protocol.js | 29 +++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 .changes/run-callback-after-catch.md diff --git a/.changes/run-callback-after-catch.md b/.changes/run-callback-after-catch.md new file mode 100644 index 000000000..9eefa9493 --- /dev/null +++ b/.changes/run-callback-after-catch.md @@ -0,0 +1,5 @@ +--- +tauri: patch:bug +--- + +Fix `undefined is not an object (evaluating '[callbackId, data]')` error on custom protocol IPC fails diff --git a/crates/tauri/scripts/ipc-protocol.js b/crates/tauri/scripts/ipc-protocol.js index 7f8f0e29a..9ca244053 100644 --- a/crates/tauri/scripts/ipc-protocol.js +++ b/crates/tauri/scripts/ipc-protocol.js @@ -52,19 +52,21 @@ return response.arrayBuffer().then((r) => [callbackId, r]) } }) - .catch((e) => { - console.warn( - 'IPC custom protocol failed, Tauri will now use the postMessage interface instead', - e - ) - // failed to use the custom protocol IPC (either the webview blocked a custom protocol or it was a CSP error) - // so we need to fallback to the postMessage interface - customProtocolIpcFailed = true - sendIpcMessage(message) - }) - .then(([callbackId, data]) => { - window.__TAURI_INTERNALS__.runCallback(callbackId, data) - }) + .then( + ([callbackId, data]) => { + window.__TAURI_INTERNALS__.runCallback(callbackId, data) + }, + (e) => { + console.warn( + 'IPC custom protocol failed, Tauri will now use the postMessage interface instead', + e + ) + // failed to use the custom protocol IPC (either the webview blocked a custom protocol or it was a CSP error) + // so we need to fallback to the postMessage interface + customProtocolIpcFailed = true + sendIpcMessage(message) + } + ) } else { // otherwise use the postMessage interface const { data } = processIpcMessage({ @@ -78,6 +80,7 @@ payload, __TAURI_INVOKE_KEY__ }) + // `window.ipc.postMessage` came from `tauri-runtime-wry` > `wry` [`with_ipc_handler`](https://github.com/tauri-apps/wry/blob/a0403b9e2f1ff9d73be7dce1184f058afcaa1d82/src/lib.rs#L1130) window.ipc.postMessage(data) } } From bda1d22369880cfbb8e44a86fb1bedf1d8bf5621 Mon Sep 17 00:00:00 2001 From: Braden Wong <13159333+braden-w@users.noreply.github.com> Date: Wed, 29 Oct 2025 00:34:16 -0700 Subject: [PATCH 022/119] docs(webviewWindow): fix incorrect import in JSDoc example (#14388) The getByLabel method is a static method on WebviewWindow, not Webview. Updated the JSDoc example to import and use the correct class name. --- packages/api/src/webviewWindow.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/src/webviewWindow.ts b/packages/api/src/webviewWindow.ts index 289902b95..ed1ebcfe9 100644 --- a/packages/api/src/webviewWindow.ts +++ b/packages/api/src/webviewWindow.ts @@ -102,8 +102,8 @@ class WebviewWindow { * Gets the Webview for the webview associated with the given label. * @example * ```typescript - * import { Webview } from '@tauri-apps/api/webviewWindow'; - * const mainWebview = Webview.getByLabel('main'); + * import { WebviewWindow } from '@tauri-apps/api/webviewWindow'; + * const mainWebview = WebviewWindow.getByLabel('main'); * ``` * * @param label The webview label. From 7f710b8f3b509ed327d76761926511cf56e66b2d Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 29 Oct 2025 14:50:33 +0100 Subject: [PATCH 023/119] fix(bundler): inline linuxdeploy plugin scripts (#14390) --- .../bundler-inline-linuxdeploy-plugins.md | 5 + .../appimage/linuxdeploy-plugin-gstreamer.sh | 165 +++++++++ .../linux/appimage/linuxdeploy-plugin-gtk.sh | 327 ++++++++++++++++++ .../linux/{appimage.rs => appimage/mod.rs} | 12 +- 4 files changed, 503 insertions(+), 6 deletions(-) create mode 100644 .changes/bundler-inline-linuxdeploy-plugins.md create mode 100644 crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gstreamer.sh create mode 100644 crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gtk.sh rename crates/tauri-bundler/src/bundle/linux/{appimage.rs => appimage/mod.rs} (94%) diff --git a/.changes/bundler-inline-linuxdeploy-plugins.md b/.changes/bundler-inline-linuxdeploy-plugins.md new file mode 100644 index 000000000..00fcfd23d --- /dev/null +++ b/.changes/bundler-inline-linuxdeploy-plugins.md @@ -0,0 +1,5 @@ +--- +tauri-bundler: "patch:enhance" +--- + +Inline linuxdeploy plugins which were previously downloaded from `https://raw.githubusercontent.com` which lately blocks many users with a 429 error. diff --git a/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gstreamer.sh b/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gstreamer.sh new file mode 100644 index 000000000..757afd4f0 --- /dev/null +++ b/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gstreamer.sh @@ -0,0 +1,165 @@ +#! /bin/bash + +# abort on all errors +set -e + +if [ "$DEBUG" != "" ]; then + set -x +fi + +script=$(readlink -f "$0") + +show_usage() { + echo "Usage: $script --appdir " + echo + echo "Bundles GStreamer plugins into an AppDir" + echo + echo "Required variables:" + echo " LINUXDEPLOY=\".../linuxdeploy\" path to linuxdeploy (e.g., AppImage); set automatically when plugin is run directly by linuxdeploy" + echo + echo "Optional variables:" + echo " GSTREAMER_INCLUDE_BAD_PLUGINS=\"1\" (default: disabled; set to empty string or unset to disable)" + echo " GSTREAMER_PLUGINS_DIR=\"...\" (directory containing GStreamer plugins; default: guessed based on main distro architecture)" + echo " GSTREAMER_HELPERS_DIR=\"...\" (directory containing GStreamer helper tools like gst-plugin-scanner; default: guessed based on main distro architecture)" + echo " GSTREAMER_VERSION=\"1.0\" (default: 1.0)" +} + +while [ "$1" != "" ]; do + case "$1" in + --plugin-api-version) + echo "0" + exit 0 + ;; + --appdir) + APPDIR="$2" + shift + shift + ;; + --help) + show_usage + exit 0 + ;; + *) + echo "Invalid argument: $1" + echo + show_usage + exit 1 + ;; + esac +done + +if [ "$APPDIR" == "" ]; then + show_usage + exit 1 +fi + +if ! which patchelf &>/dev/null && ! type patchelf &>/dev/null; then + echo "Error: patchelf not found" + echo + show_usage + exit 2 +fi + +if [[ "$LINUXDEPLOY" == "" ]]; then + echo "Error: \$LINUXDEPLOY not set" + echo + show_usage + exit 3 +fi + +mkdir -p "$APPDIR" + +export GSTREAMER_VERSION="${GSTREAMER_VERSION:-1.0}" + +plugins_target_dir="$APPDIR"/usr/lib/gstreamer-"$GSTREAMER_VERSION" +helpers_target_dir="$APPDIR"/usr/lib/gstreamer"$GSTREAMER_VERSION"/gstreamer-"$GSTREAMER_VERSION" + +if [ "$GSTREAMER_PLUGINS_DIR" != "" ]; then + plugins_dir="${GSTREAMER_PLUGINS_DIR}" +elif [ -d /usr/lib/"$(uname -m)"-linux-gnu/gstreamer-"$GSTREAMER_VERSION" ]; then + plugins_dir=/usr/lib/$(uname -m)-linux-gnu/gstreamer-"$GSTREAMER_VERSION" +else + plugins_dir=/usr/lib/gstreamer-"$GSTREAMER_VERSION" +fi + +if [ "$GSTREAMER_HELPERS_DIR" != "" ]; then + helpers_dir="${GSTREAMER_HELPERS_DIR}" +else + helpers_dir=/usr/lib/$(uname -m)-linux-gnu/gstreamer"$GSTREAMER_VERSION"/gstreamer-"$GSTREAMER_VERSION" +fi + +if [ ! -d "$plugins_dir" ]; then + echo "Error: could not find plugins directory: $plugins_dir" + exit 1 +fi + +mkdir -p "$plugins_target_dir" + +echo "Copying plugins into $plugins_target_dir" +for i in "$plugins_dir"/*; do + [ -d "$i" ] && continue + [ ! -f "$i" ] && echo "File does not exist: $i" && continue + + echo "Copying plugin: $i" + cp "$i" "$plugins_target_dir" +done + +"$LINUXDEPLOY" --appdir "$APPDIR" + +for i in "$plugins_target_dir"/*; do + [ -d "$i" ] && continue + [ ! -f "$i" ] && echo "File does not exist: $i" && continue + (file "$i" | grep -v ELF --silent) && echo "Ignoring non ELF file: $i" && continue + + echo "Manually setting rpath for $i" + patchelf --set-rpath '$ORIGIN/..:$ORIGIN' "$i" +done + +mkdir -p "$helpers_target_dir" + +echo "Copying helpers in $helpers_target_dir" +for i in "$helpers_dir"/*; do + [ -d "$i" ] && continue + [ ! -f "$i" ] && echo "File does not exist: $i" && continue + + echo "Copying helper: $i" + cp "$i" "$helpers_target_dir" +done + +for i in "$helpers_target_dir"/*; do + [ -d "$i" ] && continue + [ ! -f "$i" ] && echo "File does not exist: $i" && continue + (file "$i" | grep -v ELF --silent) && echo "Ignoring non ELF file: $i" && continue + + echo "Manually setting rpath for $i" + patchelf --set-rpath '$ORIGIN/../..' "$i" +done + +echo "Installing AppRun hook" +mkdir -p "$APPDIR"/apprun-hooks + +if [ "$GSTREAMER_VERSION" == "1.0" ]; then + cat > "$APPDIR"/apprun-hooks/linuxdeploy-plugin-gstreamer.sh <<\EOF +#! /bin/bash + +export GST_REGISTRY_REUSE_PLUGIN_SCANNER="no" +export GST_PLUGIN_SYSTEM_PATH_1_0="${APPDIR}/usr/lib/gstreamer-1.0" +export GST_PLUGIN_PATH_1_0="${APPDIR}/usr/lib/gstreamer-1.0" + +export GST_PLUGIN_SCANNER_1_0="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner" +export GST_PTP_HELPER_1_0="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-ptp-helper" +EOF +elif [ "$GSTREAMER_VERSION" == "0.10" ]; then + cat > "$APPDIR"/apprun-hooks/linuxdeploy-plugin-gstreamer.sh <<\EOF +#! /bin/bash + +export GST_REGISTRY_REUSE_PLUGIN_SCANNER="no" +export GST_PLUGIN_SYSTEM_PATH_0_10="${APPDIR}/usr/lib/gstreamer-1.0" + +export GST_PLUGIN_SCANNER_0_10="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner" +export GST_PTP_HELPER_0_10="${APPDIR}/usr/lib/gstreamer1.0/gstreamer-1.0/gst-ptp-helper" +EOF +else + echo "Warning: unknown GStreamer version: $GSTREAMER_VERSION, cannot install AppRun hook" +fi + diff --git a/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gtk.sh b/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gtk.sh new file mode 100644 index 000000000..b8e7f6f3a --- /dev/null +++ b/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy-plugin-gtk.sh @@ -0,0 +1,327 @@ +#! /usr/bin/env bash + +# GTK3 environment variables: https://developer.gnome.org/gtk3/stable/gtk-running.html +# GTK4 environment variables: https://developer.gnome.org/gtk4/stable/gtk-running.html + +# abort on all errors +set -e + +if [ "$DEBUG" != "" ]; then + set -x + verbose="--verbose" +fi + +script=$(readlink -f "$0") + +show_usage() { + echo "Usage: $script --appdir " + echo + echo "Bundles resources for applications that use GTK into an AppDir" + echo + echo "Required variables:" + echo " LINUXDEPLOY=\".../linuxdeploy\" path to linuxdeploy (e.g., AppImage); set automatically when plugin is run directly by linuxdeploy" + #echo + #echo "Optional variables:" + #echo " DEPLOY_GTK_VERSION (major version of GTK to deploy, e.g. '2', '3' or '4'; auto-detect by default)" +} + +variable_is_true() { + local var="$1" + + if [ -n "$var" ] && { [ "$var" == "true" ] || [ "$var" -gt 0 ]; } 2> /dev/null; then + return 0 # true + else + return 1 # false + fi +} + +get_pkgconf_variable() { + local variable="$1" + local library="$2" + local default_path="$3" + + path="$("$PKG_CONFIG" --variable="$variable" "$library")" + if [ -n "$path" ]; then + echo "$path" + elif [ -n "$default_path" ]; then + echo "$default_path" + else + echo "$0: there is no '$variable' variable for '$library' library." > /dev/stderr + echo "Please check the '$library.pc' file is present in \$PKG_CONFIG_PATH (you may need to install the appropriate -dev/-devel package)." > /dev/stderr + exit 1 + fi +} + +copy_tree() { + local src=("${@:1:$#-1}") + local dst="${*:$#}" + + for elem in "${src[@]}"; do + mkdir -p "${dst::-1}$elem" + cp "$elem" --archive --parents --target-directory="$dst" $verbose + done +} + +search_tool() { + local tool="$1" + local directory="$2" + + if command -v "$tool"; then + return 0 + fi + + PATH_ARRAY=( + "/usr/lib/$(uname -m)-linux-gnu/$directory/$tool" + "/usr/lib/$directory/$tool" + "/usr/bin/$tool" + "/usr/bin/$tool-64" + "/usr/bin/$tool-32" + ) + + for path in "${PATH_ARRAY[@]}"; do + if [ -x "$path" ]; then + echo "$path" + return 0 + fi + done +} + +#DEPLOY_GTK_VERSION="${DEPLOY_GTK_VERSION:-0}" # When not set by user, this variable use the integer '0' as a sentinel value +DEPLOY_GTK_VERSION=3 # Force GTK3 for tauri apps +APPDIR= + +while [ "$1" != "" ]; do + case "$1" in + --plugin-api-version) + echo "0" + exit 0 + ;; + --appdir) + APPDIR="$2" + shift + shift + ;; + --help) + show_usage + exit 0 + ;; + *) + echo "Invalid argument: $1" + echo + show_usage + exit 1 + ;; + esac +done + +if [ "$APPDIR" == "" ]; then + show_usage + exit 1 +fi + +mkdir -p "$APPDIR" +# make lib64 writable again. +chmod +w "$APPDIR"/usr/lib64 || true + +if command -v pkgconf > /dev/null; then + PKG_CONFIG="pkgconf" +elif command -v pkg-config > /dev/null; then + PKG_CONFIG="pkg-config" +else + echo "$0: pkg-config/pkgconf not found in PATH, aborting" + exit 1 +fi + +if ! command -v find &>/dev/null && ! type find &>/dev/null; then + echo -e "$0: find not found.\nInstall findutils then re-run the plugin." + exit 1 +fi + +if [ -z "$LINUXDEPLOY" ]; then + echo -e "$0: LINUXDEPLOY environment variable is not set.\nDownload a suitable linuxdeploy AppImage, set the environment variable and re-run the plugin." + exit 1 +fi + +gtk_versions=0 # Count major versions of GTK when auto-detect GTK version +if [ "$DEPLOY_GTK_VERSION" -eq 0 ]; then + echo "Determining which GTK version to deploy" + while IFS= read -r -d '' file; do + if [ "$DEPLOY_GTK_VERSION" -ne 2 ] && ldd "$file" | grep -q "libgtk-x11-2.0.so"; then + DEPLOY_GTK_VERSION=2 + gtk_versions="$((gtk_versions+1))" + fi + if [ "$DEPLOY_GTK_VERSION" -ne 3 ] && ldd "$file" | grep -q "libgtk-3.so"; then + DEPLOY_GTK_VERSION=3 + gtk_versions="$((gtk_versions+1))" + fi + if [ "$DEPLOY_GTK_VERSION" -ne 4 ] && ldd "$file" | grep -q "libgtk-4.so"; then + DEPLOY_GTK_VERSION=4 + gtk_versions="$((gtk_versions+1))" + fi + done < <(find "$APPDIR/usr/bin" -executable -type f -print0) +fi + +if [ "$gtk_versions" -gt 1 ]; then + echo "$0: can not deploy multiple GTK versions at the same time." + echo "Please set DEPLOY_GTK_VERSION to {2, 3, 4}." + exit 1 +elif [ "$DEPLOY_GTK_VERSION" -eq 0 ]; then + echo "$0: failed to auto-detect GTK version." + echo "Please set DEPLOY_GTK_VERSION to {2, 3, 4}." + exit 1 +fi + +echo "Installing AppRun hook" +HOOKSDIR="$APPDIR/apprun-hooks" +HOOKFILE="$HOOKSDIR/linuxdeploy-plugin-gtk.sh" +mkdir -p "$HOOKSDIR" +cat > "$HOOKFILE" <<\EOF +#! /usr/bin/env bash + +gsettings get org.gnome.desktop.interface gtk-theme 2> /dev/null | grep -qi "dark" && GTK_THEME_VARIANT="dark" || GTK_THEME_VARIANT="light" +APPIMAGE_GTK_THEME="${APPIMAGE_GTK_THEME:-"Adwaita:$GTK_THEME_VARIANT"}" # Allow user to override theme (discouraged) + +export APPDIR="${APPDIR:-"$(dirname "$(realpath "$0")")"}" # Workaround to run extracted AppImage +export GTK_DATA_PREFIX="$APPDIR" +export GTK_THEME="$APPIMAGE_GTK_THEME" # Custom themes are broken +export GDK_BACKEND=x11 # Crash with Wayland backend on Wayland - We tested it without it and ended up with this: https://github.com/tauri-apps/tauri/issues/8541 +export XDG_DATA_DIRS="$APPDIR/usr/share:/usr/share:$XDG_DATA_DIRS" # g_get_system_data_dirs() from GLib +EOF + +echo "Installing GLib schemas" +# Note: schemasdir is undefined on Ubuntu 16.04 +glib_schemasdir="$(get_pkgconf_variable "schemasdir" "gio-2.0" "/usr/share/glib-2.0/schemas")" +copy_tree "$glib_schemasdir" "$APPDIR/" +glib-compile-schemas "$APPDIR/$glib_schemasdir" +cat >> "$HOOKFILE" <> "$HOOKFILE" < "$APPDIR/$gtk3_immodules_cache_file" + else + echo "WARNING: gtk-query-immodules-3.0 not found" + fi + if [ ! -f "$APPDIR/$gtk3_immodules_cache_file" ]; then + echo "WARNING: immodules.cache file is missing" + fi + sed -i "s|$gtk3_libdir/3.0.0/immodules/||g" "$APPDIR/$gtk3_immodules_cache_file" + ;; + 4) + echo "Installing GTK 4.0 modules" + gtk4_exec_prefix="$(get_pkgconf_variable "exec_prefix" "gtk4" "/usr")" + gtk4_libdir="$(get_pkgconf_variable "libdir" "gtk4")/gtk-4.0" + gtk4_path="$gtk4_libdir/modules" + copy_tree "$gtk4_libdir" "$APPDIR/" + cat >> "$HOOKFILE" <> "$HOOKFILE" < "$APPDIR/$gdk_pixbuf_cache_file" +else + echo "WARNING: gdk-pixbuf-query-loaders not found" +fi +if [ ! -f "$APPDIR/$gdk_pixbuf_cache_file" ]; then + echo "WARNING: loaders.cache file is missing" +fi +sed -i "s|$gdk_pixbuf_moduledir/||g" "$APPDIR/$gdk_pixbuf_cache_file" + +echo "Copying more libraries" +gobject_libdir="$(get_pkgconf_variable "libdir" "gobject-2.0")" +gio_libdir="$(get_pkgconf_variable "libdir" "gio-2.0")" +librsvg_libdir="$(get_pkgconf_variable "libdir" "librsvg-2.0")" +pango_libdir="$(get_pkgconf_variable "libdir" "pango")" +pangocairo_libdir="$(get_pkgconf_variable "libdir" "pangocairo")" +pangoft2_libdir="$(get_pkgconf_variable "libdir" "pangoft2")" +FIND_ARRAY=( + "$gdk_libdir" "libgdk_pixbuf-*.so*" + "$gobject_libdir" "libgobject-*.so*" + "$gio_libdir" "libgio-*.so*" + "$librsvg_libdir" "librsvg-*.so*" + "$pango_libdir" "libpango-*.so*" + "$pangocairo_libdir" "libpangocairo-*.so*" + "$pangoft2_libdir" "libpangoft2-*.so*" +) +LIBRARIES=() +for (( i=0; i<${#FIND_ARRAY[@]}; i+=2 )); do + directory=${FIND_ARRAY[i]} + library=${FIND_ARRAY[i+1]} + while IFS= read -r -d '' file; do + LIBRARIES+=( "--library=$file" ) + done < <(find "$directory" \( -type l -o -type f \) -name "$library" -print0) +done + +env LINUXDEPLOY_PLUGIN_MODE=1 "$LINUXDEPLOY" --appdir="$APPDIR" "${LIBRARIES[@]}" + +# Create symbolic links as a workaround +# Details: https://github.com/linuxdeploy/linuxdeploy-plugin-gtk/issues/24#issuecomment-1030026529 +echo "Manually setting rpath for GTK modules" +PATCH_ARRAY=( + "$gtk3_immodulesdir" + "$gtk3_printbackendsdir" + "$gdk_pixbuf_moduledir" +) +for directory in "${PATCH_ARRAY[@]}"; do + while IFS= read -r -d '' file; do + ln $verbose -s "${file/\/usr\/lib\//}" "$APPDIR/usr/lib" + done < <(find "$directory" -name '*.so' -print0) +done + +# set write permission on lib64 again to make it deletable. +chmod +w "$APPDIR"/usr/lib64 || true + +# We have to copy the files first to not get permission errors when we assign gio_extras_dir +find /usr/lib* -name libgiognutls.so -exec mkdir -p "$APPDIR"/"$(dirname '{}')" \; -exec cp --parents '{}' "$APPDIR/" \; || true +# related files that we seemingly don't need: +# libgiolibproxy.so - libgiognomeproxy.so - glib-pacrunner + +gio_extras_dir=$(find "$APPDIR"/usr/lib* -name libgiognutls.so -exec dirname '{}' \; 2>/dev/null) +cat >> "$HOOKFILE" < crate::Result< let data = download(&format!( "https://github.com/tauri-apps/binary-releases/releases/download/apprun-old/AppRun-{arch}" ))?; - write_and_make_executable(&apprun, data)?; + write_and_make_executable(&apprun, &data)?; } let linuxdeploy_arch = if arch == "i686" { "i383" } else { arch }; let linuxdeploy = tools_path.join(format!("linuxdeploy-{linuxdeploy_arch}.AppImage")); if !linuxdeploy.exists() { let data = download(&format!("https://github.com/tauri-apps/binary-releases/releases/download/linuxdeploy/linuxdeploy-{linuxdeploy_arch}.AppImage"))?; - write_and_make_executable(&linuxdeploy, data)?; + write_and_make_executable(&linuxdeploy, &data)?; } let gtk = tools_path.join("linuxdeploy-plugin-gtk.sh"); if !gtk.exists() { - let data = download("https://raw.githubusercontent.com/tauri-apps/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh")?; + let data = include_bytes!("./linuxdeploy-plugin-gtk.sh"); write_and_make_executable(>k, data)?; } let gstreamer = tools_path.join("linuxdeploy-plugin-gstreamer.sh"); if !gstreamer.exists() { - let data = download("https://raw.githubusercontent.com/tauri-apps/linuxdeploy-plugin-gstreamer/master/linuxdeploy-plugin-gstreamer.sh")?; + let data = include_bytes!("./linuxdeploy-plugin-gstreamer.sh"); write_and_make_executable(&gstreamer, data)?; } @@ -256,7 +256,7 @@ fn prepare_tools(tools_path: &Path, arch: &str, verbose: bool) -> crate::Result< // This is optional, linuxdeploy will fall back to its built-in version if the download failed. let data = download(&format!("https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-{arch}.AppImage")); match data { - Ok(data) => write_and_make_executable(&appimage, data)?, + Ok(data) => write_and_make_executable(&appimage, &data)?, Err(err) => { log::error!("Download of AppImage plugin failed. Using older built-in version instead."); if verbose { @@ -281,7 +281,7 @@ fn prepare_tools(tools_path: &Path, arch: &str, verbose: bool) -> crate::Result< Ok(linuxdeploy) } -fn write_and_make_executable(path: &Path, data: Vec) -> std::io::Result<()> { +fn write_and_make_executable(path: &Path, data: &[u8]) -> std::io::Result<()> { use std::os::unix::fs::PermissionsExt; fs::write(path, data)?; From 100dc94c4847ee9a684f38f73d882dc5ac174941 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 15:15:51 +0100 Subject: [PATCH 024/119] apply version updates (#14378) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changes/bundler-inline-linuxdeploy-plugins.md | 5 ----- .changes/bundler-warning.md | 5 ----- .changes/run-callback-after-catch.md | 5 ----- Cargo.lock | 12 ++++++------ crates/tauri-bundler/CHANGELOG.md | 7 +++++++ crates/tauri-bundler/Cargo.toml | 2 +- crates/tauri-cli/CHANGELOG.md | 6 ++++++ crates/tauri-cli/Cargo.toml | 4 ++-- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-cli/metadata-v2.json | 4 ++-- .../schemas/config.schema.json | 2 +- crates/tauri/CHANGELOG.md | 6 ++++++ crates/tauri/Cargo.toml | 2 +- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 15 files changed, 40 insertions(+), 30 deletions(-) delete mode 100644 .changes/bundler-inline-linuxdeploy-plugins.md delete mode 100644 .changes/bundler-warning.md delete mode 100644 .changes/run-callback-after-catch.md diff --git a/.changes/bundler-inline-linuxdeploy-plugins.md b/.changes/bundler-inline-linuxdeploy-plugins.md deleted file mode 100644 index 00fcfd23d..000000000 --- a/.changes/bundler-inline-linuxdeploy-plugins.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-bundler: "patch:enhance" ---- - -Inline linuxdeploy plugins which were previously downloaded from `https://raw.githubusercontent.com` which lately blocks many users with a 429 error. diff --git a/.changes/bundler-warning.md b/.changes/bundler-warning.md deleted file mode 100644 index 37d6931b4..000000000 --- a/.changes/bundler-warning.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'tauri-bundler': 'patch:enhance' ---- - -Mention symbol stripping on Linux in binary patch failed warning message diff --git a/.changes/run-callback-after-catch.md b/.changes/run-callback-after-catch.md deleted file mode 100644 index 9eefa9493..000000000 --- a/.changes/run-callback-after-catch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri: patch:bug ---- - -Fix `undefined is not an object (evaluating '[callbackId, data]')` error on custom protocol IPC fails diff --git a/Cargo.lock b/Cargo.lock index 671ddc123..cd5f07d45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -4311,7 +4311,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -8485,7 +8485,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.9.1" +version = "2.9.2" dependencies = [ "anyhow", "bytes", @@ -8567,7 +8567,7 @@ dependencies = [ [[package]] name = "tauri-bundler" -version = "2.7.1" +version = "2.7.2" dependencies = [ "anyhow", "ar", @@ -8613,7 +8613,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.9.1" +version = "2.9.2" dependencies = [ "ar", "axum", @@ -10314,7 +10314,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/crates/tauri-bundler/CHANGELOG.md b/crates/tauri-bundler/CHANGELOG.md index d986ea714..3f6b7c9cc 100644 --- a/crates/tauri-bundler/CHANGELOG.md +++ b/crates/tauri-bundler/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## \[2.7.2] + +### Enhancements + +- [`7f710b8f3`](https://www.github.com/tauri-apps/tauri/commit/7f710b8f3b509ed327d76761926511cf56e66b2d) ([#14390](https://www.github.com/tauri-apps/tauri/pull/14390) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Inline linuxdeploy plugins which were previously downloaded from `https://raw.githubusercontent.com` which lately blocks many users with a 429 error. +- [`fc017ee25`](https://www.github.com/tauri-apps/tauri/commit/fc017ee2577f48615367ea519386d3f37837e2c1) ([#14368](https://www.github.com/tauri-apps/tauri/pull/14368) by [@kandrelczyk](https://www.github.com/tauri-apps/tauri/../../kandrelczyk)) Mention symbol stripping on Linux in binary patch failed warning message + ## \[2.7.1] ### Dependencies diff --git a/crates/tauri-bundler/Cargo.toml b/crates/tauri-bundler/Cargo.toml index c4e124d25..df668f0c3 100644 --- a/crates/tauri-bundler/Cargo.toml +++ b/crates/tauri-bundler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-bundler" -version = "2.7.1" +version = "2.7.2" authors = [ "George Burton ", "Tauri Programme within The Commons Conservancy", diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index 0e9e511da..d6347814c 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.2] + +### Dependencies + +- Upgraded to `tauri-bundler@2.7.2` + ## \[2.9.1] ### Dependencies diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index d7c11d0fa..c9f4b7971 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.9.1" +version = "2.9.2" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" @@ -47,7 +47,7 @@ sublime_fuzzy = "0.7" clap_complete = "4" clap = { version = "4", features = ["derive", "env"] } thiserror = "2" -tauri-bundler = { version = "2.7.1", default-features = false, path = "../tauri-bundler" } +tauri-bundler = { version = "2.7.2", default-features = false, path = "../tauri-bundler" } colored = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 6f5665ce5..b2953239f 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.1", + "$id": "https://schema.tauri.app/config/2.9.2", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index 54e944f5a..54650c005 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,9 +1,9 @@ { "cli.js": { - "version": "2.9.1", + "version": "2.9.2", "node": ">= 10.0.0" }, - "tauri": "2.9.1", + "tauri": "2.9.2", "tauri-build": "2.5.1", "tauri-plugin": "2.5.1" } diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 6f5665ce5..b2953239f 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.1", + "$id": "https://schema.tauri.app/config/2.9.2", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri/CHANGELOG.md b/crates/tauri/CHANGELOG.md index 164368723..5dfa01085 100644 --- a/crates/tauri/CHANGELOG.md +++ b/crates/tauri/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.2] + +### Bug Fixes + +- [`28b9e7c7b`](https://www.github.com/tauri-apps/tauri/commit/28b9e7c7b83845c35fe46c37e8ed8e9022b4634e) ([#14377](https://www.github.com/tauri-apps/tauri/pull/14377) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix `undefined is not an object (evaluating '[callbackId, data]')` error on custom protocol IPC fails + ## \[2.9.1] ### Bug Fixes diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index ce6907580..50482e72e 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri" -version = "2.9.1" +version = "2.9.2" description = "Make tiny, secure apps for all desktop platforms with Tauri" exclude = ["/test", "/.scripts", "CHANGELOG.md", "/target"] readme = "README.md" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index fd4add94a..9e0cc6297 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.2] + +### Dependencies + +- Upgraded to `tauri-cli@2.9.2` + ## \[2.9.1] ### Dependencies diff --git a/packages/cli/package.json b/packages/cli/package.json index 97e8bba16..585d8d6cb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.9.1", + "version": "2.9.2", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From 75a1fec705b623d1249f0026889446b4c46de3eb Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Thu, 30 Oct 2025 10:25:12 +0100 Subject: [PATCH 025/119] ci: don't cache pnpm files in version-or-publish workflow (#14392) --- .github/workflows/covector-version-or-publish.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/covector-version-or-publish.yml b/.github/workflows/covector-version-or-publish.yml index 4cebbb2e3..83ff2ddac 100644 --- a/.github/workflows/covector-version-or-publish.yml +++ b/.github/workflows/covector-version-or-publish.yml @@ -78,7 +78,6 @@ jobs: with: node-version: 20 registry-url: 'https://registry.npmjs.org' - cache: 'pnpm' - name: cargo login run: cargo login ${{ secrets.ORG_CRATES_IO_TOKEN }} From 1afa9df6d53ad252ff6b35b395d877b7a15e4b58 Mon Sep 17 00:00:00 2001 From: Sebastian Neubauer Date: Fri, 31 Oct 2025 02:19:35 +0100 Subject: [PATCH 026/119] fix(tauri-utils): Use write_if_changed more (#13621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace `fs::write` with `write_if_changed` in two places. This can prevent unnecessary rebuilds. (I didn’t encounter any, but this should be ok nonetheless.) --- crates/tauri-utils/src/acl/build.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/tauri-utils/src/acl/build.rs b/crates/tauri-utils/src/acl/build.rs index d43afc281..44867f3f9 100644 --- a/crates/tauri-utils/src/acl/build.rs +++ b/crates/tauri-utils/src/acl/build.rs @@ -91,7 +91,8 @@ pub fn define_permissions bool>( let pkg_name_valid_path = pkg_name.replace(':', "-"); let permission_files_path = out_dir.join(format!("{pkg_name_valid_path}-permission-files")); let permission_files_json = serde_json::to_string(&permission_files)?; - fs::write(&permission_files_path, permission_files_json) + + write_if_changed(&permission_files_path, permission_files_json) .map_err(|e| Error::WriteFile(e, permission_files_path.clone()))?; if let Some(plugin_name) = pkg_name.strip_prefix("tauri:") { @@ -151,7 +152,8 @@ pub fn define_global_scope_schema( out_dir: &Path, ) -> Result<(), Error> { let path = out_dir.join("global-scope.json"); - fs::write(&path, serde_json::to_vec(&schema)?).map_err(|e| Error::WriteFile(e, path.clone()))?; + write_if_changed(&path, serde_json::to_vec(&schema)?) + .map_err(|e| Error::WriteFile(e, path.clone()))?; if let Some(plugin_name) = pkg_name.strip_prefix("tauri:") { println!( From b80f9deb5fc6225fd07915953ab03dac3f979ce5 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:12:41 +0800 Subject: [PATCH 027/119] chore: fix new clippy warnings (derive default) (#14395) * chore: fix new clippy warnings (derive default) * Fix left over `#[cfg(feature = "isolation")]` --- crates/tauri-bundler/src/error.rs | 13 ++++--- crates/tauri-cli/src/interface/rust.rs | 9 ++--- crates/tauri-runtime/src/lib.rs | 9 ++--- crates/tauri-utils/src/config.rs | 36 +++++--------------- crates/tauri-utils/src/config_v1/mod.rs | 45 ++++++------------------- crates/tauri-utils/src/html.rs | 9 ++--- crates/tauri-utils/src/lib.rs | 9 ++--- crates/tauri/src/pattern.rs | 10 ++---- crates/tauri/src/tray/mod.rs | 18 +++------- 9 files changed, 40 insertions(+), 118 deletions(-) diff --git a/crates/tauri-bundler/src/error.rs b/crates/tauri-bundler/src/error.rs index 92adf63a7..518cb6ca9 100644 --- a/crates/tauri-bundler/src/error.rs +++ b/crates/tauri-bundler/src/error.rs @@ -99,11 +99,14 @@ pub enum Error { #[error("Wrong package type {0} for platform {1}")] InvalidPackageType(String, String), /// Bundle type symbol missing in binary - #[cfg(target_os = "linux")] - #[error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date and that symbol stripping is disabled (https://doc.rust-lang.org/cargo/reference/profiles.html#strip)")] - MissingBundleTypeVar, - #[cfg(not(target_os = "linux"))] - #[error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date")] + #[cfg_attr( + target_os = "linux", + error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date and that symbol stripping is disabled (https://doc.rust-lang.org/cargo/reference/profiles.html#strip)") + )] + #[cfg_attr( + not(target_os = "linux"), + error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date") + )] MissingBundleTypeVar, /// Failed to write binary file changed #[error("Failed to write binary file changes: `{0}`")] diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 067dd5ca3..fd49ac35b 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -785,7 +785,7 @@ pub struct UpdaterConfig { } /// Install modes for the Windows update. -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive(Default, Debug, PartialEq, Eq, Clone)] pub enum WindowsUpdateInstallMode { /// Specifies there's a basic UI during the installation process, including a final dialog box at the end. BasicUi, @@ -793,17 +793,12 @@ pub enum WindowsUpdateInstallMode { /// Requires admin privileges if the installer does. Quiet, /// Specifies unattended mode, which means the installation only shows a progress bar. + #[default] Passive, // to add more modes, we need to check if the updater relaunch makes sense // i.e. for a full UI mode, the user can also mark the installer to start the app } -impl Default for WindowsUpdateInstallMode { - fn default() -> Self { - Self::Passive - } -} - impl<'de> Deserialize<'de> for WindowsUpdateInstallMode { fn deserialize(deserializer: D) -> std::result::Result where diff --git a/crates/tauri-runtime/src/lib.rs b/crates/tauri-runtime/src/lib.rs index a8d17181e..2874d16b9 100644 --- a/crates/tauri-runtime/src/lib.rs +++ b/crates/tauri-runtime/src/lib.rs @@ -90,23 +90,18 @@ pub enum UserAttentionType { Informational, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Deserialize)] #[serde(tag = "type")] pub enum DeviceEventFilter { /// Always filter out device events. Always, /// Filter out device events while the window is not focused. + #[default] Unfocused, /// Report all device events regardless of window focus. Never, } -impl Default for DeviceEventFilter { - fn default() -> Self { - Self::Unfocused - } -} - /// Defines the orientation that a window resize will be performed. #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] pub enum ResizeDirection { diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index 40d33292a..37c77abff 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -208,9 +208,10 @@ impl<'de> Deserialize<'de> for BundleType { } /// Targets to bundle. Each value is case insensitive. -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone, Default)] pub enum BundleTarget { /// Bundle all targets. + #[default] All, /// A list of bundle targets. List(Vec), @@ -257,12 +258,6 @@ impl schemars::JsonSchema for BundleTarget { } } -impl Default for BundleTarget { - fn default() -> Self { - Self::All - } -} - impl Serialize for BundleTarget { fn serialize(&self, serializer: S) -> std::result::Result where @@ -805,7 +800,7 @@ pub struct WixConfig { /// Compression algorithms used in the NSIS installer. /// /// See -#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Default)] #[cfg_attr(feature = "schema", derive(JsonSchema))] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub enum NsisCompression { @@ -814,19 +809,14 @@ pub enum NsisCompression { /// BZIP2 usually gives better compression ratios than ZLIB, but it is a bit slower and uses more memory. With the default compression level it uses about 4 MB of memory. Bzip2, /// LZMA (default) is a new compression method that gives very good compression ratios. The decompression speed is high (10-20 MB/s on a 2 GHz CPU), the compression speed is lower. The memory size that will be used for decompression is the dictionary size plus a few KBs, the default is 8 MB. + #[default] Lzma, /// Disable compression None, } -impl Default for NsisCompression { - fn default() -> Self { - Self::Lzma - } -} - /// Install Modes for the NSIS installer. -#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] +#[derive(Default, Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] #[serde(rename_all = "camelCase", deny_unknown_fields)] #[cfg_attr(feature = "schema", derive(JsonSchema))] pub enum NSISInstallerMode { @@ -835,6 +825,7 @@ pub enum NSISInstallerMode { /// Install the app by default in a directory that doesn't require Administrator access. /// /// Installer metadata will be saved under the `HKCU` registry path. + #[default] CurrentUser, /// Install the app by default in the `Program Files` folder directory requires Administrator /// access for the installation. @@ -849,12 +840,6 @@ pub enum NSISInstallerMode { Both, } -impl Default for NSISInstallerMode { - fn default() -> Self { - Self::CurrentUser - } -} - /// Configuration for the Installer bundle using NSIS. #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize, Serialize)] #[cfg_attr(feature = "schema", derive(JsonSchema))] @@ -2685,11 +2670,12 @@ impl<'de> Deserialize<'de> for CapabilityEntry { /// The application pattern. #[skip_serializing_none] -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, Default)] #[serde(rename_all = "lowercase", tag = "use", content = "options")] #[cfg_attr(feature = "schema", derive(JsonSchema))] pub enum PatternKind { /// Brownfield pattern. + #[default] Brownfield, /// Isolation pattern. Recommended for security purposes. Isolation { @@ -2698,12 +2684,6 @@ pub enum PatternKind { }, } -impl Default for PatternKind { - fn default() -> Self { - Self::Brownfield - } -} - /// The App configuration object. /// /// See more: diff --git a/crates/tauri-utils/src/config_v1/mod.rs b/crates/tauri-utils/src/config_v1/mod.rs index 5fc9450d9..a8a5fc2e5 100644 --- a/crates/tauri-utils/src/config_v1/mod.rs +++ b/crates/tauri-utils/src/config_v1/mod.rs @@ -131,9 +131,10 @@ impl<'de> Deserialize<'de> for BundleType { } /// Targets to bundle. Each value is case insensitive. -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone, Default)] pub enum BundleTarget { /// Bundle all targets. + #[default] All, /// A list of bundle targets. List(Vec), @@ -251,12 +252,6 @@ impl schemars::JsonSchema for BundleTarget { } } -impl Default for BundleTarget { - fn default() -> Self { - Self::All - } -} - impl Serialize for BundleTarget { fn serialize(&self, serializer: S) -> std::result::Result where @@ -552,7 +547,7 @@ pub struct NsisConfig { } /// Install Modes for the NSIS installer. -#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Default)] #[serde(rename_all = "camelCase", deny_unknown_fields)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] pub enum NSISInstallerMode { @@ -561,6 +556,7 @@ pub enum NSISInstallerMode { /// Install the app by default in a directory that doesn't require Administrator access. /// /// Installer metadata will be saved under the `HKCU` registry path. + #[default] CurrentUser, /// Install the app by default in the `Program Files` folder directory requires Administrator /// access for the installation. @@ -575,12 +571,6 @@ pub enum NSISInstallerMode { Both, } -impl Default for NSISInstallerMode { - fn default() -> Self { - Self::CurrentUser - } -} - /// Install modes for the Webview2 runtime. /// Note that for the updater bundle [`Self::DownloadBootstrapper`] is used. /// @@ -2393,11 +2383,12 @@ impl Allowlist for AllowlistConfig { /// The application pattern. #[skip_serializing_none] -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, Default)] #[serde(rename_all = "lowercase", tag = "use", content = "options")] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] pub enum PatternKind { /// Brownfield pattern. + #[default] Brownfield, /// Isolation pattern. Recommended for security purposes. Isolation { @@ -2406,12 +2397,6 @@ pub enum PatternKind { }, } -impl Default for PatternKind { - fn default() -> Self { - Self::Brownfield - } -} - /// The Tauri configuration object. /// /// See more: https://tauri.app/v1/api/config#tauriconfig @@ -2481,7 +2466,7 @@ impl<'de> Deserialize<'de> for UpdaterEndpoint { } /// Install modes for the Windows update. -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone, Default)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] #[cfg_attr(feature = "schema", schemars(rename_all = "camelCase"))] pub enum WindowsUpdateInstallMode { @@ -2491,6 +2476,7 @@ pub enum WindowsUpdateInstallMode { /// Requires admin privileges if the installer does. Quiet, /// Specifies unattended mode, which means the installation only shows a progress bar. + #[default] Passive, // to add more modes, we need to check if the updater relaunch makes sense // i.e. for a full UI mode, the user can also mark the installer to start the app @@ -2510,12 +2496,6 @@ impl Display for WindowsUpdateInstallMode { } } -impl Default for WindowsUpdateInstallMode { - fn default() -> Self { - Self::Passive - } -} - impl Serialize for WindowsUpdateInstallMode { fn serialize(&self, serializer: S) -> std::result::Result where @@ -2989,10 +2969,11 @@ fn default_build() -> BuildConfig { } /// How the window title bar should be displayed on macOS. -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq, Default)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] pub enum TitleBarStyle { /// A normal title bar. + #[default] Visible, /// Makes the title bar transparent, so the window background color is shown instead. /// @@ -3007,12 +2988,6 @@ pub enum TitleBarStyle { Overlay, } -impl Default for TitleBarStyle { - fn default() -> Self { - Self::Visible - } -} - impl Serialize for TitleBarStyle { fn serialize(&self, serializer: S) -> std::result::Result where diff --git a/crates/tauri-utils/src/html.rs b/crates/tauri-utils/src/html.rs index d29a61d08..958ce5978 100644 --- a/crates/tauri-utils/src/html.rs +++ b/crates/tauri-utils/src/html.rs @@ -211,21 +211,16 @@ impl From<&PatternKind> for PatternObject { } /// Where the JavaScript is injected to -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Default)] #[serde(rename_all = "lowercase")] pub enum IsolationSide { /// Original frame, the Brownfield application + #[default] Original, /// Secure frame, the isolation security application Secure, } -impl Default for IsolationSide { - fn default() -> Self { - Self::Original - } -} - /// Injects the Isolation JavaScript to a codegen time document. /// /// Note: This function is not considered part of the stable API. diff --git a/crates/tauri-utils/src/lib.rs b/crates/tauri-utils/src/lib.rs index e10b24612..25e5a4f97 100644 --- a/crates/tauri-utils/src/lib.rs +++ b/crates/tauri-utils/src/lib.rs @@ -157,11 +157,12 @@ mod window_effects { pub use window_effects::{WindowEffect, WindowEffectState}; /// How the window title bar should be displayed on macOS. -#[derive(Debug, Clone, PartialEq, Eq, Copy)] +#[derive(Debug, Clone, PartialEq, Eq, Copy, Default)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] #[non_exhaustive] pub enum TitleBarStyle { /// A normal title bar. + #[default] Visible, /// Makes the title bar transparent, so the window background color is shown instead. /// @@ -176,12 +177,6 @@ pub enum TitleBarStyle { Overlay, } -impl Default for TitleBarStyle { - fn default() -> Self { - Self::Visible - } -} - impl Serialize for TitleBarStyle { fn serialize(&self, serializer: S) -> std::result::Result where diff --git a/crates/tauri/src/pattern.rs b/crates/tauri/src/pattern.rs index 5048e86e0..c88f11ab3 100644 --- a/crates/tauri/src/pattern.rs +++ b/crates/tauri/src/pattern.rs @@ -64,23 +64,17 @@ impl From<&Pattern> for PatternObject { /// Where the JavaScript is injected to #[cfg(feature = "isolation")] -#[derive(Debug, Serialize)] +#[derive(Default, Debug, Serialize)] #[serde(rename_all = "lowercase")] pub(crate) enum IsolationSide { /// Original frame, the Brownfield application + #[default] Original, /// Secure frame, the isolation security application #[allow(dead_code)] Secure, } -#[cfg(feature = "isolation")] -impl Default for IsolationSide { - fn default() -> Self { - Self::Original - } -} - #[derive(Template)] #[default_template("../scripts/pattern.js")] pub(crate) struct PatternJavascript { diff --git a/crates/tauri/src/tray/mod.rs b/crates/tauri/src/tray/mod.rs index 3f487b010..5ecef674a 100644 --- a/crates/tauri/src/tray/mod.rs +++ b/crates/tauri/src/tray/mod.rs @@ -19,20 +19,15 @@ use std::path::Path; pub use tray_icon::TrayIconId; /// Describes the mouse button state. -#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize)] +#[derive(Default, Clone, Copy, PartialEq, Eq, Debug, Serialize)] pub enum MouseButtonState { /// Mouse button pressed. + #[default] Up, /// Mouse button released. Down, } -impl Default for MouseButtonState { - fn default() -> Self { - Self::Up - } -} - impl From for MouseButtonState { fn from(value: tray_icon::MouseButtonState) -> Self { match value { @@ -43,9 +38,10 @@ impl From for MouseButtonState { } /// Describes which mouse button triggered the event.. -#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize)] +#[derive(Clone, Copy, PartialEq, Eq, Debug, Serialize, Default)] pub enum MouseButton { /// Left mouse button. + #[default] Left, /// Right mouse button. Right, @@ -53,12 +49,6 @@ pub enum MouseButton { Middle, } -impl Default for MouseButton { - fn default() -> Self { - Self::Left - } -} - impl From for MouseButton { fn from(value: tray_icon::MouseButton) -> Self { match value { From 18464d9481f4d522c305f21b38be4b906ab41bd5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 17:21:40 +0800 Subject: [PATCH 028/119] chore(deps): update dependency vitest to v4 (#14361) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/cli/package.json | 2 +- pnpm-lock.yaml | 260 +++++++++++++------------------------- 2 files changed, 91 insertions(+), 171 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 585d8d6cb..551e0f6da 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -44,7 +44,7 @@ "@napi-rs/cli": "^3.0.0", "@types/node": "^22.15.32", "cross-env": "10.1.0", - "vitest": "^3.2.4" + "vitest": "^4.0.0" }, "engines": { "node": ">= 10" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14589cb61..95bff790f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,8 +113,8 @@ importers: specifier: 10.1.0 version: 10.1.0 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + specifier: ^4.0.0 + version: 4.0.6(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) packages: @@ -1213,6 +1213,9 @@ packages: cpu: [x64] os: [win32] + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@sveltejs/acorn-typescript@1.0.5': resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: @@ -1402,34 +1405,34 @@ packages: peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.6': + resolution: {integrity: sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==} - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + '@vitest/mocker@4.0.6': + resolution: {integrity: sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.6': + resolution: {integrity: sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==} - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.6': + resolution: {integrity: sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.6': + resolution: {integrity: sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==} - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.6': + resolution: {integrity: sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==} - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.6': + resolution: {integrity: sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==} '@vue/compiler-core@3.5.17': resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} @@ -1508,10 +1511,6 @@ packages: as-table@1.0.55: resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -1549,9 +1548,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@6.2.0: + resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1560,10 +1559,6 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -1634,8 +1629,8 @@ packages: data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1643,10 +1638,6 @@ packages: supports-color: optional: true - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1754,8 +1745,8 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} exsolve@1.0.7: @@ -1922,9 +1913,6 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1973,9 +1961,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} @@ -2094,10 +2079,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -2258,9 +2239,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2291,16 +2269,8 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} tmp@0.2.5: @@ -2389,11 +2359,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@7.1.11: resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2442,16 +2407,18 @@ packages: vite: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.6: + resolution: {integrity: sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.6 + '@vitest/browser-preview': 4.0.6 + '@vitest/browser-webdriverio': 4.0.6 + '@vitest/ui': 4.0.6 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2461,7 +2428,11 @@ packages: optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': optional: true '@vitest/ui': optional: true @@ -2711,7 +2682,7 @@ snapshots: '@eslint/config-array@0.20.1': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.1 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2729,7 +2700,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -2779,7 +2750,7 @@ snapshots: '@antfu/install-pkg': 1.1.0 '@antfu/utils': 8.1.1 '@iconify/types': 2.0.0 - debug: 4.4.1 + debug: 4.4.3 globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.1.1 @@ -3010,7 +2981,7 @@ snapshots: '@octokit/rest': 22.0.0 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 - debug: 4.4.1 + debug: 4.4.3 find-up: 7.0.0 js-yaml: 4.1.0 lodash-es: 4.17.21 @@ -3033,7 +3004,7 @@ snapshots: dependencies: '@napi-rs/lzma': 1.4.3 '@napi-rs/tar': 0.1.5 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -3414,6 +3385,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true + '@standard-schema/spec@1.0.0': {} + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: acorn: 8.15.0 @@ -3421,7 +3394,7 @@ snapshots: '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': dependencies: '@sveltejs/vite-plugin-svelte': 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) - debug: 4.4.1 + debug: 4.4.3 svelte: 5.35.6 vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: @@ -3430,7 +3403,7 @@ snapshots: '@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) - debug: 4.4.1 + debug: 4.4.3 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.19 @@ -3487,7 +3460,7 @@ snapshots: '@typescript-eslint/types': 8.34.1 '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.34.1 - debug: 4.4.1 + debug: 4.4.3 eslint: 9.29.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -3497,7 +3470,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) '@typescript-eslint/types': 8.34.1 - debug: 4.4.1 + debug: 4.4.3 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3515,7 +3488,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.34.1(typescript@5.8.3) '@typescript-eslint/utils': 8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.1 + debug: 4.4.3 eslint: 9.29.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -3530,7 +3503,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.34.1(typescript@5.8.3) '@typescript-eslint/types': 8.34.1 '@typescript-eslint/visitor-keys': 8.34.1 - debug: 4.4.1 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -3710,47 +3683,44 @@ snapshots: transitivePeerDependencies: - vue - '@vitest/expect@3.2.4': + '@vitest/expect@4.0.6': dependencies: + '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - tinyrainbow: 2.0.0 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 + chai: 6.2.0 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@vitest/mocker@4.0.6(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.6 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) - '@vitest/pretty-format@3.2.4': + '@vitest/pretty-format@4.0.6': dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + '@vitest/runner@4.0.6': dependencies: - '@vitest/utils': 3.2.4 + '@vitest/utils': 4.0.6 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.6': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 4.0.6 magic-string: 0.30.19 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 + '@vitest/spy@4.0.6': {} - '@vitest/utils@3.2.4': + '@vitest/utils@4.0.6': dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + '@vitest/pretty-format': 4.0.6 + tinyrainbow: 3.0.3 '@vue/compiler-core@3.5.17': dependencies: @@ -3846,8 +3816,6 @@ snapshots: dependencies: printable-characters: 1.0.42 - assertion-error@2.0.1: {} - axobject-query@4.1.0: {} balanced-match@3.0.1: {} @@ -3872,13 +3840,7 @@ snapshots: callsites@3.1.0: {} - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.0 + chai@6.2.0: {} chalk@4.1.2: dependencies: @@ -3887,8 +3849,6 @@ snapshots: chardet@0.7.0: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -3957,12 +3917,10 @@ snapshots: data-uri-to-buffer@2.0.2: {} - debug@4.4.1: + debug@4.4.3: dependencies: ms: 2.1.3 - deep-eql@5.0.2: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -4046,7 +4004,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -4102,7 +4060,7 @@ snapshots: exit-hook@2.2.1: {} - expect-type@1.2.1: {} + expect-type@1.2.2: {} exsolve@1.0.7: {} @@ -4243,8 +4201,6 @@ snapshots: jiti@2.4.2: {} - js-tokens@9.0.1: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -4288,8 +4244,6 @@ snapshots: lodash.merge@4.6.2: {} - loupe@3.1.4: {} - magic-string@0.30.19: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4405,8 +4359,6 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} - perfect-debounce@1.0.0: {} picocolors@1.1.1: {} @@ -4591,10 +4543,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -4636,11 +4584,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} - - tinyspy@4.0.3: {} + tinyrainbow@3.0.3: {} tmp@0.2.5: {} @@ -4740,27 +4684,6 @@ snapshots: dependencies: punycode: 2.3.1 - vite-node@3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): dependencies: esbuild: 0.25.4 @@ -4779,19 +4702,18 @@ snapshots: optionalDependencies: vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) - vitest@3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): + vitest@4.0.6(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - debug: 4.4.1 - expect-type: 1.2.1 + '@vitest/expect': 4.0.6 + '@vitest/mocker': 4.0.6(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@vitest/pretty-format': 4.0.6 + '@vitest/runner': 4.0.6 + '@vitest/snapshot': 4.0.6 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 + debug: 4.4.3 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 magic-string: 0.30.19 pathe: 2.0.3 picomatch: 4.0.3 @@ -4799,10 +4721,8 @@ snapshots: tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) - vite-node: 3.2.4(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.32 From fd8c30b4f1bca8dd7165c5c0ebe7fbfd17662153 Mon Sep 17 00:00:00 2001 From: Chase Knowlden Date: Mon, 3 Nov 2025 22:16:11 -0500 Subject: [PATCH 029/119] fix: premultiply alpha before resizing (fix #14351) (#14353) * fix: Premultiply alpha before resizing * feat: Use rayon for process speedup * Fix change tag * `cargo fmt` * Document reasoning & use imageops::resize directly --------- Co-authored-by: Tony --- .changes/image-premultiply-fix.md | 6 ++++++ Cargo.lock | 1 + crates/tauri-cli/Cargo.toml | 1 + crates/tauri-cli/src/icon.rs | 30 ++++++++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 .changes/image-premultiply-fix.md diff --git a/.changes/image-premultiply-fix.md b/.changes/image-premultiply-fix.md new file mode 100644 index 000000000..4abe9b867 --- /dev/null +++ b/.changes/image-premultiply-fix.md @@ -0,0 +1,6 @@ +--- +'tauri-cli': 'patch:bug' +'@tauri-apps/cli': 'patch:bug' +--- + +Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons. diff --git a/Cargo.lock b/Cargo.lock index cd5f07d45..5e1ff78a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8667,6 +8667,7 @@ dependencies = [ "plist", "pretty_assertions", "rand 0.9.1", + "rayon", "regex", "resvg", "semver", diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index c9f4b7971..d1300b9e9 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -113,6 +113,7 @@ uuid = { version = "1", features = ["v5"] } rand = "0.9" zip = { version = "4", default-features = false, features = ["deflate"] } which = "8" +rayon = "1.10" [dev-dependencies] insta = "1" diff --git a/crates/tauri-cli/src/icon.rs b/crates/tauri-cli/src/icon.rs index e072d2c5a..474fb8ad6 100644 --- a/crates/tauri-cli/src/icon.rs +++ b/crates/tauri-cli/src/icon.rs @@ -25,8 +25,9 @@ use image::{ png::{CompressionType, FilterType as PngFilterType, PngEncoder}, }, imageops::FilterType, - open, DynamicImage, ExtendedColorType, GenericImageView, ImageBuffer, ImageEncoder, Rgba, + open, DynamicImage, ExtendedColorType, GenericImageView, ImageBuffer, ImageEncoder, Pixel, Rgba, }; +use rayon::iter::ParallelIterator; use resvg::{tiny_skia, usvg}; use serde::Deserialize; @@ -136,7 +137,32 @@ impl Source { let img_buffer = ImageBuffer::from_raw(size, size, pixmap.take()).unwrap(); Ok(DynamicImage::ImageRgba8(img_buffer)) } - Self::DynamicImage(i) => Ok(i.resize_exact(size, size, FilterType::Lanczos3)), + Self::DynamicImage(image) => { + // `image` does not use premultiplied alpha in resize, so we do it manually here, + // see https://github.com/image-rs/image/issues/1655 + // + // image.resize_exact(size, size, FilterType::Lanczos3) + + // Premultiply alpha + let premultiplied_image = + ImageBuffer::from_par_fn(image.width(), image.height(), |x, y| { + let mut pixel = image.get_pixel(x, y); + let alpha = pixel.0[3] as f32 / u8::MAX as f32; + pixel.apply_without_alpha(|channel_value| (channel_value as f32 * alpha) as u8); + pixel + }); + + let mut resized = + image::imageops::resize(&premultiplied_image, size, size, FilterType::Lanczos3); + + // Unmultiply alpha + resized.par_pixels_mut().for_each(|pixel| { + let alpha = pixel.0[3] as f32 / u8::MAX as f32; + pixel.apply_without_alpha(|channel_value| (channel_value as f32 / alpha) as u8); + }); + + Ok(DynamicImage::ImageRgba8(resized)) + } } } } From 9a192263693d71123a9953e2a6ee60fad07500b4 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Tue, 4 Nov 2025 17:18:21 +0800 Subject: [PATCH 030/119] fix(nsis): uninstall fails when manually close app on kill app dialog (#14410) --- .changes/nsis-uninstall-already-killed.md | 5 +++++ crates/tauri-bundler/src/bundle/windows/nsis/mod.rs | 4 ++-- crates/tauri-bundler/src/bundle/windows/nsis/utils.nsh | 1 + crates/tauri-utils/src/tokens.rs | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 .changes/nsis-uninstall-already-killed.md diff --git a/.changes/nsis-uninstall-already-killed.md b/.changes/nsis-uninstall-already-killed.md new file mode 100644 index 000000000..5bf9b70e8 --- /dev/null +++ b/.changes/nsis-uninstall-already-killed.md @@ -0,0 +1,5 @@ +--- +'tauri-bundler': 'patch:bug' +--- + +Fix uninstall fails if you close the app manually during the 'Click Ok to kill it' dialog diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs index d1729c82f..f4addc79f 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs @@ -40,8 +40,8 @@ const NSIS_URL: &str = #[cfg(target_os = "windows")] const NSIS_SHA1: &str = "057e83c7d82462ec394af76c87d06733605543d4"; const NSIS_TAURI_UTILS_URL: &str = - "https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.5.1/nsis_tauri_utils.dll"; -const NSIS_TAURI_UTILS_SHA1: &str = "B053B2E5FDB97257954C8F935D80964F056520AE"; + "https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.5.2/nsis_tauri_utils.dll"; +const NSIS_TAURI_UTILS_SHA1: &str = "D0C502F45DF55C0465C9406088FF016C2E7E6817"; #[cfg(target_os = "windows")] const NSIS_REQUIRED_FILES: &[&str] = &[ diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/utils.nsh b/crates/tauri-bundler/src/bundle/windows/nsis/utils.nsh index 88b82b0f8..3c5bf75f5 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/utils.nsh +++ b/crates/tauri-bundler/src/bundle/windows/nsis/utils.nsh @@ -48,6 +48,7 @@ Pop $R0 Sleep 500 ${If} $R0 = 0 + ${OrIf} $R0 = 2 Goto app_check_done_${UniqueID} ${Else} IfSilent silent_${UniqueID} ui_${UniqueID} diff --git a/crates/tauri-utils/src/tokens.rs b/crates/tauri-utils/src/tokens.rs index c02fb1fdc..3c566a377 100644 --- a/crates/tauri-utils/src/tokens.rs +++ b/crates/tauri-utils/src/tokens.rs @@ -27,7 +27,7 @@ macro_rules! literal_struct { /// Create a `String` constructor `TokenStream`. /// -/// e.g. `"Hello World" -> String::from("Hello World"). +/// e.g. `"Hello World"` -> `String::from("Hello World")`. /// This takes a `&String` to reduce casting all the `&String` -> `&str` manually. pub fn str_lit(s: impl AsRef) -> TokenStream { let s = s.as_ref(); From 22edc65aad0b3e45515008e8e0866112da70c8a1 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Tue, 4 Nov 2025 10:53:44 +0100 Subject: [PATCH 031/119] fix(bundler/cli): set user-agent when fetching build tools (#14408) --- .changes/bundler-user-agent.md | 6 ++++ crates/tauri-bundler/src/utils/http_utils.rs | 35 ++++++++++++-------- crates/tauri-cli/src/helpers/http.rs | 30 +++++++++-------- 3 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 .changes/bundler-user-agent.md diff --git a/.changes/bundler-user-agent.md b/.changes/bundler-user-agent.md new file mode 100644 index 000000000..52b45ad1a --- /dev/null +++ b/.changes/bundler-user-agent.md @@ -0,0 +1,6 @@ +--- +tauri-bundler: patch:enhance +tauri-cli: patch:enhance +--- + +Set user-agent in bundler and cli http requests when fetching build tools. diff --git a/crates/tauri-bundler/src/utils/http_utils.rs b/crates/tauri-bundler/src/utils/http_utils.rs index bbabb8544..62ade96cb 100644 --- a/crates/tauri-bundler/src/utils/http_utils.rs +++ b/crates/tauri-bundler/src/utils/http_utils.rs @@ -14,6 +14,8 @@ use sha2::Digest; use url::Url; use zip::ZipArchive; +const BUNDLER_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),); + fn generate_github_mirror_url_from_template(github_url: &str) -> Option { std::env::var("TAURI_BUNDLER_TOOLS_GITHUB_MIRROR_TEMPLATE") .ok() @@ -47,7 +49,15 @@ fn generate_github_alternative_url(url: &str) -> Option<(ureq::Agent, String)> { generate_github_mirror_url_from_template(url) .or_else(|| generate_github_mirror_url_from_base(url)) - .map(|alt_url| (ureq::agent(), alt_url)) + .map(|alt_url| { + ( + ureq::Agent::config_builder() + .user_agent(BUNDLER_USER_AGENT) + .build() + .into(), + alt_url, + ) + }) } fn create_agent_and_url(url: &str) -> (ureq::Agent, String) { @@ -55,22 +65,21 @@ fn create_agent_and_url(url: &str) -> (ureq::Agent, String) { } pub(crate) fn base_ureq_agent() -> ureq::Agent { + #[allow(unused_mut)] + let mut config_builder = ureq::Agent::config_builder() + .user_agent(BUNDLER_USER_AGENT) + .proxy(ureq::Proxy::try_from_env()); + #[cfg(feature = "platform-certs")] - let agent: ureq::Agent = ureq::Agent::config_builder() - .tls_config( + { + config_builder = config_builder.tls_config( ureq::tls::TlsConfig::builder() .root_certs(ureq::tls::RootCerts::PlatformVerifier) .build(), - ) - .proxy(ureq::Proxy::try_from_env()) - .build() - .into(); - #[cfg(not(feature = "platform-certs"))] - let agent: ureq::Agent = ureq::Agent::config_builder() - .proxy(ureq::Proxy::try_from_env()) - .build() - .into(); - agent + ); + } + + config_builder.build().into() } #[allow(dead_code)] diff --git a/crates/tauri-cli/src/helpers/http.rs b/crates/tauri-cli/src/helpers/http.rs index 9dfee185a..14e07af9d 100644 --- a/crates/tauri-cli/src/helpers/http.rs +++ b/crates/tauri-cli/src/helpers/http.rs @@ -2,23 +2,25 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use ureq::{http::Response, Body}; +use ureq::{http::Response, Agent, Body}; + +const CLI_USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),); pub fn get(url: &str) -> Result, ureq::Error> { + #[allow(unused_mut)] + let mut config_builder = ureq::Agent::config_builder() + .user_agent(CLI_USER_AGENT) + .proxy(ureq::Proxy::try_from_env()); + #[cfg(feature = "platform-certs")] { - let agent = ureq::Agent::config_builder() - .tls_config( - ureq::tls::TlsConfig::builder() - .root_certs(ureq::tls::RootCerts::PlatformVerifier) - .build(), - ) - .build() - .new_agent(); - agent.get(url).call() - } - #[cfg(not(feature = "platform-certs"))] - { - ureq::get(url).call() + config_builder = config_builder.tls_config( + ureq::tls::TlsConfig::builder() + .root_certs(ureq::tls::RootCerts::PlatformVerifier) + .build(), + ); } + + let agent: Agent = config_builder.build().into(); + agent.get(url).call() } From 779612ac8425a787626da4cefdb9eaf7d63bea18 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 4 Nov 2025 11:16:01 +0100 Subject: [PATCH 032/119] fix(cli): respect required-features field from Cargo.toml (#14379) Co-authored-by: Fabian-Lars --- .changes/change-pr-14379.md | 5 +++++ crates/tauri-cli/src/interface/mod.rs | 4 ++-- crates/tauri-cli/src/interface/rust.rs | 18 ++++++++++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 .changes/change-pr-14379.md diff --git a/.changes/change-pr-14379.md b/.changes/change-pr-14379.md new file mode 100644 index 000000000..96efd7519 --- /dev/null +++ b/.changes/change-pr-14379.md @@ -0,0 +1,5 @@ +--- +"tauri-cli": patch:enhance +--- + +Properly read the `required-features` field of binaries in Cargo.toml to prevent bundling issues when the features weren't enabled. diff --git a/crates/tauri-cli/src/interface/mod.rs b/crates/tauri-cli/src/interface/mod.rs index e0f74ebf7..00ca4c3d1 100644 --- a/crates/tauri-cli/src/interface/mod.rs +++ b/crates/tauri-cli/src/interface/mod.rs @@ -34,7 +34,7 @@ pub trait AppSettings { features: &[String], ) -> crate::Result; fn app_binary_path(&self, options: &Options) -> crate::Result; - fn get_binaries(&self) -> crate::Result>; + fn get_binaries(&self, options: &Options) -> crate::Result>; fn app_name(&self) -> Option; fn lib_name(&self) -> Option; @@ -57,7 +57,7 @@ pub trait AppSettings { tauri_utils::platform::target_triple().context("failed to get target triple")? }; - let mut bins = self.get_binaries()?; + let mut bins = self.get_binaries(&options)?; if let Some(main_binary_name) = &config.main_binary_name { let main = bins.iter_mut().find(|b| b.main()).context("no main bin?")?; main.set_name(main_binary_name.to_owned()); diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index fd49ac35b..0f7d2fd02 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -695,11 +695,13 @@ struct WorkspacePackageSettings { } #[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "kebab-case")] struct BinarySettings { name: String, /// This is from nightly: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#different-binary-name filename: Option, path: Option, + required_features: Option>, } impl BinarySettings { @@ -919,7 +921,7 @@ impl AppSettings for RustAppSettings { } fn app_binary_path(&self, options: &Options) -> crate::Result { - let binaries = self.get_binaries()?; + let binaries = self.get_binaries(options)?; let bin_name = binaries .iter() .find(|x| x.main()) @@ -945,8 +947,8 @@ impl AppSettings for RustAppSettings { Ok(path) } - fn get_binaries(&self) -> crate::Result> { - let mut binaries: Vec = vec![]; + fn get_binaries(&self, options: &Options) -> crate::Result> { + let mut binaries = Vec::new(); if let Some(bins) = &self.cargo_settings.bin { let default_run = self @@ -955,6 +957,14 @@ impl AppSettings for RustAppSettings { .clone() .unwrap_or_default(); for bin in bins { + if let (Some(req_features), Some(opt_features)) = + (&bin.required_features, &options.features) + { + // Check if all required features are enabled. + if !req_features.iter().all(|feat| opt_features.contains(feat)) { + continue; + } + } let file_name = bin.file_name(); let is_main = file_name == self.cargo_package_settings.name || file_name == default_run; binaries.push(BundleBinary::with_path( @@ -1659,7 +1669,7 @@ mod tests { #[test] fn parse_cargo_option() { - let args = vec![ + let args = [ "build".into(), "--".into(), "--profile".into(), From 85ba5315c20bc9fc5c79c3629aca77967eb33af7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 11:27:01 +0100 Subject: [PATCH 033/119] chore(deps): update dependency @types/node to v24 (#14376) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- packages/cli/package.json | 2 +- pnpm-lock.yaml | 202 +++++++++++++++++++------------------- 3 files changed, 103 insertions(+), 103 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 5999d215d..688788095 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -49,7 +49,7 @@ "@rollup/plugin-terser": "0.4.4", "@rollup/plugin-typescript": "12.3.0", "@types/eslint": "^9.6.1", - "@types/node": "^22.15.32", + "@types/node": "^24.0.0", "eslint": "^9.29.0", "eslint-config-prettier": "10.1.8", "eslint-plugin-security": "3.0.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 551e0f6da..40f26fe77 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@napi-rs/cli": "^3.0.0", - "@types/node": "^22.15.32", + "@types/node": "^24.0.0", "cross-env": "10.1.0", "vitest": "^4.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95bff790f..c8bfde6dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 1.2.2 '@sveltejs/vite-plugin-svelte': specifier: ^6.0.0 - version: 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + version: 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)) '@unocss/extractor-svelte': specifier: ^66.3.3 version: 66.3.3 @@ -47,10 +47,10 @@ importers: version: 5.35.6 unocss: specifier: ^66.3.3 - version: 66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + version: 66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) vite: specifier: ^7.1.11 - version: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + version: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) examples/file-associations: {} @@ -71,8 +71,8 @@ importers: specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.15.32 - version: 22.15.32 + specifier: ^24.0.0 + version: 24.10.0 eslint: specifier: ^9.29.0 version: 9.29.0(jiti@2.4.2) @@ -105,16 +105,16 @@ importers: devDependencies: '@napi-rs/cli': specifier: ^3.0.0 - version: 3.0.0(@emnapi/runtime@1.4.3)(@types/node@22.15.32) + version: 3.0.0(@emnapi/runtime@1.4.3)(@types/node@24.10.0) '@types/node': - specifier: ^22.15.32 - version: 22.15.32 + specifier: ^24.0.0 + version: 24.10.0 cross-env: specifier: 10.1.0 version: 10.1.0 vitest: specifier: ^4.0.0 - version: 4.0.6(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + version: 4.0.6(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) packages: @@ -1254,8 +1254,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.15.32': - resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==} + '@types/node@24.10.0': + resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} '@typescript-eslint/eslint-plugin@8.34.1': resolution: {integrity: sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==} @@ -2323,8 +2323,8 @@ packages: unconfig@7.3.2: resolution: {integrity: sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} @@ -2833,27 +2833,27 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@inquirer/checkbox@4.1.9(@types/node@22.15.32)': + '@inquirer/checkbox@4.1.9(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/type': 3.0.7(@types/node@24.10.0) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/confirm@5.1.13(@types/node@22.15.32)': + '@inquirer/confirm@5.1.13(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/core@10.1.14(@types/node@22.15.32)': + '@inquirer/core@10.1.14(@types/node@24.10.0)': dependencies: '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/type': 3.0.7(@types/node@24.10.0) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -2861,93 +2861,93 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/editor@4.2.14(@types/node@22.15.32)': + '@inquirer/editor@4.2.14(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) external-editor: 3.1.0 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/expand@4.0.16(@types/node@22.15.32)': + '@inquirer/expand@4.0.16(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 '@inquirer/figures@1.0.12': {} - '@inquirer/input@4.2.0(@types/node@22.15.32)': + '@inquirer/input@4.2.0(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/number@3.0.16(@types/node@22.15.32)': + '@inquirer/number@3.0.16(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/password@4.0.16(@types/node@22.15.32)': + '@inquirer/password@4.0.16(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/prompts@7.6.0(@types/node@22.15.32)': + '@inquirer/prompts@7.6.0(@types/node@24.10.0)': dependencies: - '@inquirer/checkbox': 4.1.9(@types/node@22.15.32) - '@inquirer/confirm': 5.1.13(@types/node@22.15.32) - '@inquirer/editor': 4.2.14(@types/node@22.15.32) - '@inquirer/expand': 4.0.16(@types/node@22.15.32) - '@inquirer/input': 4.2.0(@types/node@22.15.32) - '@inquirer/number': 3.0.16(@types/node@22.15.32) - '@inquirer/password': 4.0.16(@types/node@22.15.32) - '@inquirer/rawlist': 4.1.4(@types/node@22.15.32) - '@inquirer/search': 3.0.16(@types/node@22.15.32) - '@inquirer/select': 4.2.4(@types/node@22.15.32) + '@inquirer/checkbox': 4.1.9(@types/node@24.10.0) + '@inquirer/confirm': 5.1.13(@types/node@24.10.0) + '@inquirer/editor': 4.2.14(@types/node@24.10.0) + '@inquirer/expand': 4.0.16(@types/node@24.10.0) + '@inquirer/input': 4.2.0(@types/node@24.10.0) + '@inquirer/number': 3.0.16(@types/node@24.10.0) + '@inquirer/password': 4.0.16(@types/node@24.10.0) + '@inquirer/rawlist': 4.1.4(@types/node@24.10.0) + '@inquirer/search': 3.0.16(@types/node@24.10.0) + '@inquirer/select': 4.2.4(@types/node@24.10.0) optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/rawlist@4.1.4(@types/node@22.15.32)': + '@inquirer/rawlist@4.1.4(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) + '@inquirer/type': 3.0.7(@types/node@24.10.0) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/search@3.0.16(@types/node@22.15.32)': + '@inquirer/search@3.0.16(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/type': 3.0.7(@types/node@24.10.0) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/select@4.2.4(@types/node@22.15.32)': + '@inquirer/select@4.2.4(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.15.32) + '@inquirer/core': 10.1.14(@types/node@24.10.0) '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.15.32) + '@inquirer/type': 3.0.7(@types/node@24.10.0) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 - '@inquirer/type@3.0.7(@types/node@22.15.32)': + '@inquirer/type@3.0.7(@types/node@24.10.0)': optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 '@jridgewell/gen-mapping@0.3.12': dependencies: @@ -2973,9 +2973,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/cli@3.0.0(@emnapi/runtime@1.4.3)(@types/node@22.15.32)': + '@napi-rs/cli@3.0.0(@emnapi/runtime@1.4.3)(@types/node@24.10.0)': dependencies: - '@inquirer/prompts': 7.6.0(@types/node@22.15.32) + '@inquirer/prompts': 7.6.0(@types/node@24.10.0) '@napi-rs/cross-toolchain': 0.0.19 '@napi-rs/wasm-tools': 0.0.3 '@octokit/rest': 22.0.0 @@ -3391,25 +3391,25 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@sveltejs/vite-plugin-svelte': 6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)) debug: 4.4.3 svelte: 5.35.6 - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.0.0(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)))(svelte@5.35.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)) debug: 4.4.3 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.19 svelte: 5.35.6 - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) - vitefu: 1.1.1(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) + vitefu: 1.1.1(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)) transitivePeerDependencies: - supports-color @@ -3433,9 +3433,9 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.15.32': + '@types/node@24.10.0': dependencies: - undici-types: 6.21.0 + undici-types: 7.16.0 '@typescript-eslint/eslint-plugin@8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: @@ -3529,13 +3529,13 @@ snapshots: '@typescript-eslint/types': 8.34.1 eslint-visitor-keys: 4.2.1 - '@unocss/astro@66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': + '@unocss/astro@66.3.3(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': dependencies: '@unocss/core': 66.3.3 '@unocss/reset': 66.3.3 - '@unocss/vite': 66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + '@unocss/vite': 66.3.3(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) optionalDependencies: - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - vue @@ -3668,7 +3668,7 @@ snapshots: dependencies: '@unocss/core': 66.3.3 - '@unocss/vite@66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': + '@unocss/vite@66.3.3(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3))': dependencies: '@ampproject/remapping': 2.3.0 '@unocss/config': 66.3.3 @@ -3679,7 +3679,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.2.4 - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - vue @@ -3692,13 +3692,13 @@ snapshots: chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.6(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))': + '@vitest/mocker@4.0.6(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))': dependencies: '@vitest/spy': 4.0.6 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) '@vitest/pretty-format@4.0.6': dependencies: @@ -4629,7 +4629,7 @@ snapshots: jiti: 2.4.2 quansync: 0.2.10 - undici-types@6.21.0: {} + undici-types@7.16.0: {} undici@5.29.0: dependencies: @@ -4647,9 +4647,9 @@ snapshots: universal-user-agent@7.0.3: {} - unocss@66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)): + unocss@66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)): dependencies: - '@unocss/astro': 66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + '@unocss/astro': 66.3.3(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) '@unocss/cli': 66.3.3 '@unocss/core': 66.3.3 '@unocss/postcss': 66.3.3(postcss@8.5.6) @@ -4667,9 +4667,9 @@ snapshots: '@unocss/transformer-compile-class': 66.3.3 '@unocss/transformer-directives': 66.3.3 '@unocss/transformer-variant-group': 66.3.3 - '@unocss/vite': 66.3.3(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) + '@unocss/vite': 66.3.3(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)) optionalDependencies: - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) transitivePeerDependencies: - postcss - supports-color @@ -4684,7 +4684,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): + vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1): dependencies: esbuild: 0.25.4 fdir: 6.5.0(picomatch@4.0.3) @@ -4693,19 +4693,19 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 fsevents: 2.3.3 jiti: 2.4.2 terser: 5.43.1 - vitefu@1.1.1(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)): + vitefu@1.1.1(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)): optionalDependencies: - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) - vitest@4.0.6(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1): + vitest@4.0.6(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1): dependencies: '@vitest/expect': 4.0.6 - '@vitest/mocker': 4.0.6(vite@7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1)) + '@vitest/mocker': 4.0.6(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)) '@vitest/pretty-format': 4.0.6 '@vitest/runner': 4.0.6 '@vitest/snapshot': 4.0.6 @@ -4722,10 +4722,10 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.1.11(@types/node@22.15.32)(jiti@2.4.2)(terser@5.43.1) + vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.15.32 + '@types/node': 24.10.0 transitivePeerDependencies: - jiti - less From b446a858dea4c3d663d5745d8f06bd7d6afee5e7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 17:00:19 +0100 Subject: [PATCH 034/119] apply version updates (#14409) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changes/bundler-user-agent.md | 6 ------ .changes/change-pr-14379.md | 5 ----- .changes/image-premultiply-fix.md | 6 ------ .changes/nsis-uninstall-already-killed.md | 5 ----- Cargo.lock | 4 ++-- crates/tauri-bundler/CHANGELOG.md | 10 ++++++++++ crates/tauri-bundler/Cargo.toml | 2 +- crates/tauri-cli/CHANGELOG.md | 15 +++++++++++++++ crates/tauri-cli/Cargo.toml | 4 ++-- crates/tauri-cli/metadata-v2.json | 2 +- packages/cli/CHANGELOG.md | 10 ++++++++++ packages/cli/package.json | 2 +- 12 files changed, 42 insertions(+), 29 deletions(-) delete mode 100644 .changes/bundler-user-agent.md delete mode 100644 .changes/change-pr-14379.md delete mode 100644 .changes/image-premultiply-fix.md delete mode 100644 .changes/nsis-uninstall-already-killed.md diff --git a/.changes/bundler-user-agent.md b/.changes/bundler-user-agent.md deleted file mode 100644 index 52b45ad1a..000000000 --- a/.changes/bundler-user-agent.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tauri-bundler: patch:enhance -tauri-cli: patch:enhance ---- - -Set user-agent in bundler and cli http requests when fetching build tools. diff --git a/.changes/change-pr-14379.md b/.changes/change-pr-14379.md deleted file mode 100644 index 96efd7519..000000000 --- a/.changes/change-pr-14379.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-cli": patch:enhance ---- - -Properly read the `required-features` field of binaries in Cargo.toml to prevent bundling issues when the features weren't enabled. diff --git a/.changes/image-premultiply-fix.md b/.changes/image-premultiply-fix.md deleted file mode 100644 index 4abe9b867..000000000 --- a/.changes/image-premultiply-fix.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'tauri-cli': 'patch:bug' -'@tauri-apps/cli': 'patch:bug' ---- - -Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons. diff --git a/.changes/nsis-uninstall-already-killed.md b/.changes/nsis-uninstall-already-killed.md deleted file mode 100644 index 5bf9b70e8..000000000 --- a/.changes/nsis-uninstall-already-killed.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'tauri-bundler': 'patch:bug' ---- - -Fix uninstall fails if you close the app manually during the 'Click Ok to kill it' dialog diff --git a/Cargo.lock b/Cargo.lock index 5e1ff78a8..5c23009ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8567,7 +8567,7 @@ dependencies = [ [[package]] name = "tauri-bundler" -version = "2.7.2" +version = "2.7.3" dependencies = [ "anyhow", "ar", @@ -8613,7 +8613,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.9.2" +version = "2.9.3" dependencies = [ "ar", "axum", diff --git a/crates/tauri-bundler/CHANGELOG.md b/crates/tauri-bundler/CHANGELOG.md index 3f6b7c9cc..feb621512 100644 --- a/crates/tauri-bundler/CHANGELOG.md +++ b/crates/tauri-bundler/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## \[2.7.3] + +### Enhancements + +- [`22edc65aa`](https://www.github.com/tauri-apps/tauri/commit/22edc65aad0b3e45515008e8e0866112da70c8a1) ([#14408](https://www.github.com/tauri-apps/tauri/pull/14408) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Set user-agent in bundler and cli http requests when fetching build tools. + +### Bug Fixes + +- [`9a1922636`](https://www.github.com/tauri-apps/tauri/commit/9a192263693d71123a9953e2a6ee60fad07500b4) ([#14410](https://www.github.com/tauri-apps/tauri/pull/14410) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix uninstall fails if you close the app manually during the 'Click Ok to kill it' dialog + ## \[2.7.2] ### Enhancements diff --git a/crates/tauri-bundler/Cargo.toml b/crates/tauri-bundler/Cargo.toml index df668f0c3..5750480b7 100644 --- a/crates/tauri-bundler/Cargo.toml +++ b/crates/tauri-bundler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-bundler" -version = "2.7.2" +version = "2.7.3" authors = [ "George Burton ", "Tauri Programme within The Commons Conservancy", diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index d6347814c..1df8870f7 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## \[2.9.3] + +### Enhancements + +- [`22edc65aa`](https://www.github.com/tauri-apps/tauri/commit/22edc65aad0b3e45515008e8e0866112da70c8a1) ([#14408](https://www.github.com/tauri-apps/tauri/pull/14408) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Set user-agent in bundler and cli http requests when fetching build tools. +- [`779612ac8`](https://www.github.com/tauri-apps/tauri/commit/779612ac8425a787626da4cefdb9eaf7d63bea18) ([#14379](https://www.github.com/tauri-apps/tauri/pull/14379) by [@moubctez](https://www.github.com/tauri-apps/tauri/../../moubctez)) Properly read the `required-features` field of binaries in Cargo.toml to prevent bundling issues when the features weren't enabled. + +### Bug Fixes + +- [`fd8c30b4f`](https://www.github.com/tauri-apps/tauri/commit/fd8c30b4f1bca8dd7165c5c0ebe7fbfd17662153) ([#14353](https://www.github.com/tauri-apps/tauri/pull/14353) by [@ChaseKnowlden](https://www.github.com/tauri-apps/tauri/../../ChaseKnowlden)) Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons. + +### Dependencies + +- Upgraded to `tauri-bundler@2.7.3` + ## \[2.9.2] ### Dependencies diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index d1300b9e9..5e5a22bf2 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.9.2" +version = "2.9.3" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" @@ -47,7 +47,7 @@ sublime_fuzzy = "0.7" clap_complete = "4" clap = { version = "4", features = ["derive", "env"] } thiserror = "2" -tauri-bundler = { version = "2.7.2", default-features = false, path = "../tauri-bundler" } +tauri-bundler = { version = "2.7.3", default-features = false, path = "../tauri-bundler" } colored = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index 54650c005..33235b30e 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,6 +1,6 @@ { "cli.js": { - "version": "2.9.2", + "version": "2.9.3", "node": ">= 10.0.0" }, "tauri": "2.9.2", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 9e0cc6297..0e247a598 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## \[2.9.3] + +### Bug Fixes + +- [`fd8c30b4f`](https://www.github.com/tauri-apps/tauri/commit/fd8c30b4f1bca8dd7165c5c0ebe7fbfd17662153) ([#14353](https://www.github.com/tauri-apps/tauri/pull/14353) by [@ChaseKnowlden](https://www.github.com/tauri-apps/tauri/../../ChaseKnowlden)) Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons. + +### Dependencies + +- Upgraded to `tauri-cli@2.9.3` + ## \[2.9.2] ### Dependencies diff --git a/packages/cli/package.json b/packages/cli/package.json index 40f26fe77..74d81eb45 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.9.2", + "version": "2.9.3", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From d06a1994e943cc9238ed81a288aca9fe0d2732e1 Mon Sep 17 00:00:00 2001 From: Kushal Meghani <168952248+KushalMeghani1644@users.noreply.github.com> Date: Wed, 5 Nov 2025 18:18:32 +0530 Subject: [PATCH 035/119] refactor: improve cli code readability (#14333) --- crates/tauri-cli/src/lib.rs | 126 +++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 60 deletions(-) diff --git a/crates/tauri-cli/src/lib.rs b/crates/tauri-cli/src/lib.rs index b473f63a7..30997d0eb 100644 --- a/crates/tauri-cli/src/lib.rs +++ b/crates/tauri-cli/src/lib.rs @@ -65,28 +65,23 @@ impl FromStr for ConfigValue { let path = PathBuf::from(config); let raw = read_to_string(&path).fs_context("failed to read configuration file", path.clone())?; - match path.extension() { - Some(ext) if ext == "toml" => { - Ok(Self(::toml::from_str(&raw).with_context(|| { - format!("failed to parse config at {} as TOML", path.display()) - })?)) - } - Some(ext) if ext == "json5" => { - Ok(Self(::json5::from_str(&raw).with_context(|| { - format!("failed to parse config at {} as JSON5", path.display()) - })?)) - } - // treat all other extensions as json - _ => Ok(Self( - // from tauri-utils/src/config/parse.rs: - // we also want to support **valid** json5 in the .json extension - // if the json5 is not valid the serde_json error for regular json will be returned. - match ::json5::from_str(&raw) { - Ok(json5) => json5, - Err(_) => serde_json::from_str(&raw) - .with_context(|| format!("failed to parse config at {} as JSON", path.display()))?, - }, - )), + + // treat all other extensions as json + // from tauri-utils/src/config/parse.rs: + // we also want to support **valid** json5 in the .json extension + // if the json5 is not valid the serde_json error for regular json will be returned. + match path.extension().and_then(|ext| ext.to_str()) { + Some("toml") => Ok(Self(::toml::from_str(&raw).with_context(|| { + format!("failed to parse config at {} as TOML", path.display()) + })?)), + Some("json5") => Ok(Self(::json5::from_str(&raw).with_context(|| { + format!("failed to parse config at {} as JSON5", path.display()) + })?)), + _ => Ok(Self(match ::json5::from_str(&raw) { + Ok(json5) => json5, + Err(_) => serde_json::from_str(&raw) + .with_context(|| format!("failed to parse config at {} as JSON", path.display()))?, + })), } } } @@ -178,6 +173,13 @@ fn format_error(err: clap::Error) -> clap::Error { err.format(&mut app) } +fn get_verbosity(cli_verbose: u8) -> u8 { + std::env::var("TAURI_CLI_VERBOSITY") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(cli_verbose) +} + /// Run the Tauri CLI with the passed arguments, exiting if an error occurs. /// /// The passed arguments should have the binary argument(s) stripped out before being passed. @@ -222,23 +224,17 @@ where Err(e) => e.exit(), }; - let verbosity_number = std::env::var("TAURI_CLI_VERBOSITY") - .ok() - .and_then(|v| v.parse().ok()) - .unwrap_or(cli.verbose); - // set the verbosity level so subsequent CLI calls (xcode-script, android-studio-script) refer to it + let verbosity_number = get_verbosity(cli.verbose); std::env::set_var("TAURI_CLI_VERBOSITY", verbosity_number.to_string()); let mut builder = Builder::from_default_env(); - let init_res = builder + if let Err(err) = builder .format_indent(Some(12)) .filter(None, verbosity_level(verbosity_number).to_level_filter()) - // golbin spams an insane amount of really technical logs on the debug level so we're reducing one level .filter( Some("goblin"), verbosity_level(verbosity_number.saturating_sub(1)).to_level_filter(), ) - // handlebars is not that spammy but its debug logs are typically far from being helpful .filter( Some("handlebars"), verbosity_level(verbosity_number.saturating_sub(1)).to_level_filter(), @@ -250,7 +246,6 @@ where is_command_output = action == "stdout" || action == "stderr"; if !is_command_output { let style = Style::new().fg_color(Some(AnsiColor::Green.into())).bold(); - write!(f, "{style}{action:>12}{style:#} ")?; } } else { @@ -264,15 +259,13 @@ where if !is_command_output && log::log_enabled!(Level::Debug) { let style = Style::new().fg_color(Some(AnsiColor::Black.into())); - write!(f, "[{style}{}{style:#}] ", record.target())?; } writeln!(f, "{}", record.args()) }) - .try_init(); - - if let Err(err) = init_res { + .try_init() + { eprintln!("Failed to attach logger: {err}"); } @@ -305,7 +298,7 @@ fn verbosity_level(num: u8) -> Level { match num { 0 => Level::Info, 1 => Level::Debug, - 2.. => Level::Trace, + _ => Level::Trace, } } @@ -321,8 +314,6 @@ fn prettyprint_level(lvl: Level) -> &'static str { } pub trait CommandExt { - // The `pipe` function sets the stdout and stderr to properly - // show the command output in the Node.js wrapper. fn piped(&mut self) -> std::io::Result; fn output_ok(&mut self) -> crate::Result; } @@ -332,9 +323,15 @@ impl CommandExt for Command { self.stdin(os_pipe::dup_stdin()?); self.stdout(os_pipe::dup_stdout()?); self.stderr(os_pipe::dup_stderr()?); - let program = self.get_program().to_string_lossy().into_owned(); - log::debug!(action = "Running"; "Command `{} {}`", program, self.get_args().map(|arg| arg.to_string_lossy()).fold(String::new(), |acc, arg| format!("{acc} {arg}"))); + let program = self.get_program().to_string_lossy().into_owned(); + let args = self + .get_args() + .map(|a| a.to_string_lossy()) + .collect::>() + .join(" "); + + log::debug!(action = "Running"; "Command `{program} {args}`"); self.status() } @@ -342,8 +339,9 @@ impl CommandExt for Command { let program = self.get_program().to_string_lossy().into_owned(); let args = self .get_args() - .map(|arg| arg.to_string_lossy()) - .fold(String::new(), |acc, arg| format!("{acc} {arg}")); + .map(|a| a.to_string_lossy()) + .collect::>() + .join(" "); let cmdline = format!("{program} {args}"); log::debug!(action = "Running"; "Command `{cmdline}`"); @@ -359,16 +357,17 @@ impl CommandExt for Command { let stdout_lines_ = stdout_lines.clone(); std::thread::spawn(move || { let mut line = String::new(); - let mut lines = stdout_lines_.lock().unwrap(); - loop { - line.clear(); - match stdout.read_line(&mut line) { - Ok(0) => break, - Ok(_) => { - log::debug!(action = "stdout"; "{}", line.trim_end()); - lines.extend(line.as_bytes().to_vec()); + if let Ok(mut lines) = stdout_lines_.lock() { + loop { + line.clear(); + match stdout.read_line(&mut line) { + Ok(0) => break, + Ok(_) => { + log::debug!(action = "stdout"; "{}", line.trim_end()); + lines.extend(line.as_bytes()); + } + Err(_) => (), } - Err(_) => (), } } }); @@ -378,16 +377,17 @@ impl CommandExt for Command { let stderr_lines_ = stderr_lines.clone(); std::thread::spawn(move || { let mut line = String::new(); - let mut lines = stderr_lines_.lock().unwrap(); - loop { - line.clear(); - match stderr.read_line(&mut line) { - Ok(0) => break, - Ok(_) => { - log::debug!(action = "stderr"; "{}", line.trim_end()); - lines.extend(line.as_bytes().to_vec()); + if let Ok(mut lines) = stderr_lines_.lock() { + loop { + line.clear(); + match stderr.read_line(&mut line) { + Ok(0) => break, + Ok(_) => { + log::debug!(action = "stderr"; "{}", line.trim_end()); + lines.extend(line.as_bytes()); + } + Err(_) => (), } - Err(_) => (), } } }); @@ -423,4 +423,10 @@ mod tests { fn verify_cli() { Cli::command().debug_assert(); } + + #[test] + fn help_output_includes_build() { + let help = Cli::command().render_help().to_string(); + assert!(help.contains("Build")); + } } From dd70d213cd1c41d6ab9d5904cbee2a94d445b896 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 5 Nov 2025 14:58:54 +0100 Subject: [PATCH 036/119] chore(deps): update minisign to 0.8 (#14415) --- Cargo.lock | 27 ++++++++++++------- crates/tauri-cli/Cargo.toml | 2 +- .../src/helpers/updater_signature.rs | 2 +- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c23009ea..e06187679 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -1641,6 +1641,12 @@ dependencies = [ "syn 2.0.95", ] +[[package]] +name = "ct-codecs" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b10589d1a5e400d61f9f38f12f884cfd080ff345de8f17efda36fe0e4a02aa8" + [[package]] name = "ctor" version = "0.2.9" @@ -2860,9 +2866,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -4311,7 +4319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4592,11 +4600,12 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "minisign" -version = "0.7.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23ef13ff1d745b1e52397daaa247e333c607f3cff96d4df2b798dc252db974b" +checksum = "e6bf96cef396a17a96f7600281aa4da9229860b7a082601b1f6db6eaa5f99ee5" dependencies = [ - "getrandom 0.2.15", + "ct-codecs", + "getrandom 0.3.3", "rpassword", "scrypt", ] @@ -6976,13 +6985,13 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rpassword" -version = "7.3.1" +version = "7.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +checksum = "66d4c8b64f049c6721ec8ccec37ddfc3d641c4a7fca57e8f2a89de509c73df39" dependencies = [ "libc", "rtoolbox", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -10315,7 +10324,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index 5e5a22bf2..b499e6b62 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -70,7 +70,7 @@ jsonschema = "0.33" handlebars = "6" include_dir = "0.7" dirs = "6" -minisign = "=0.7.3" +minisign = "0.8" base64 = "0.22" ureq = { version = "3", default-features = false, features = ["gzip"] } os_info = "3" diff --git a/crates/tauri-cli/src/helpers/updater_signature.rs b/crates/tauri-cli/src/helpers/updater_signature.rs index b7f03cafc..5ec0ebe8a 100644 --- a/crates/tauri-cli/src/helpers/updater_signature.rs +++ b/crates/tauri-cli/src/helpers/updater_signature.rs @@ -203,7 +203,7 @@ where mod tests { const PRIVATE_KEY: &str = "dW50cnVzdGVkIGNvbW1lbnQ6IHJzaWduIGVuY3J5cHRlZCBzZWNyZXQga2V5ClJXUlRZMEl5dkpDN09RZm5GeVAzc2RuYlNzWVVJelJRQnNIV2JUcGVXZUplWXZXYXpqUUFBQkFBQUFBQUFBQUFBQUlBQUFBQTZrN2RnWGh5dURxSzZiL1ZQSDdNcktiaHRxczQwMXdQelRHbjRNcGVlY1BLMTBxR2dpa3I3dDE1UTVDRDE4MXR4WlQwa1BQaXdxKy9UU2J2QmVSNXhOQWFDeG1GSVllbUNpTGJQRkhhTnROR3I5RmdUZi90OGtvaGhJS1ZTcjdZU0NyYzhQWlQ5cGM9Cg=="; - // we use minisign=0.7.3 to prevent a breaking change + // minisign >=0.7.4,<0.8.0 couldn't handle empty passwords. #[test] fn empty_password_is_valid() { let path = std::env::temp_dir().join("minisign-password-text.txt"); From b586ecf1f4b3b087f9aa6c4668c2c18b1b7925f4 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:12:10 +0800 Subject: [PATCH 037/119] fix(cli): demultiply tiny skia pixels (#14416) * fix(cli): demultiply tiny skia pixels * Pull resize out to a function `resize_image` * Move comments as well * Use cow for older rust versions --- .changes/image-premultiply-fix.md | 6 +++ crates/tauri-cli/src/icon.rs | 80 ++++++++++++++++++------------- 2 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 .changes/image-premultiply-fix.md diff --git a/.changes/image-premultiply-fix.md b/.changes/image-premultiply-fix.md new file mode 100644 index 000000000..0ee098c83 --- /dev/null +++ b/.changes/image-premultiply-fix.md @@ -0,0 +1,6 @@ +--- +'tauri-cli': 'patch:bug' +'@tauri-apps/cli': 'patch:bug' +--- + +Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons for svg images. diff --git a/crates/tauri-cli/src/icon.rs b/crates/tauri-cli/src/icon.rs index 474fb8ad6..ca1783d5d 100644 --- a/crates/tauri-cli/src/icon.rs +++ b/crates/tauri-cli/src/icon.rs @@ -9,6 +9,7 @@ use crate::{ }; use std::{ + borrow::Cow, collections::HashMap, fs::{create_dir_all, File}, io::{BufWriter, Write}, @@ -124,7 +125,7 @@ impl Source { } } - fn resize_exact(&self, size: u32) -> Result { + fn resize_exact(&self, size: u32) -> DynamicImage { match self { Self::Svg(svg) => { let mut pixmap = tiny_skia::Pixmap::new(size, size).unwrap(); @@ -134,39 +135,49 @@ impl Source { tiny_skia::Transform::from_scale(scale, scale), &mut pixmap.as_mut(), ); - let img_buffer = ImageBuffer::from_raw(size, size, pixmap.take()).unwrap(); - Ok(DynamicImage::ImageRgba8(img_buffer)) + // Switch to use `Pixmap::take_demultiplied` in the future when it's published + // https://github.com/linebender/tiny-skia/blob/624257c0feb394bf6c4d0d688f8ea8030aae320f/src/pixmap.rs#L266 + let img_buffer = ImageBuffer::from_par_fn(size, size, |x, y| { + let pixel = pixmap.pixel(x, y).unwrap().demultiply(); + Rgba([pixel.red(), pixel.green(), pixel.blue(), pixel.alpha()]) + }); + DynamicImage::ImageRgba8(img_buffer) } Self::DynamicImage(image) => { - // `image` does not use premultiplied alpha in resize, so we do it manually here, - // see https://github.com/image-rs/image/issues/1655 - // // image.resize_exact(size, size, FilterType::Lanczos3) - - // Premultiply alpha - let premultiplied_image = - ImageBuffer::from_par_fn(image.width(), image.height(), |x, y| { - let mut pixel = image.get_pixel(x, y); - let alpha = pixel.0[3] as f32 / u8::MAX as f32; - pixel.apply_without_alpha(|channel_value| (channel_value as f32 * alpha) as u8); - pixel - }); - - let mut resized = - image::imageops::resize(&premultiplied_image, size, size, FilterType::Lanczos3); - - // Unmultiply alpha - resized.par_pixels_mut().for_each(|pixel| { - let alpha = pixel.0[3] as f32 / u8::MAX as f32; - pixel.apply_without_alpha(|channel_value| (channel_value as f32 / alpha) as u8); - }); - - Ok(DynamicImage::ImageRgba8(resized)) + resize_image(image, size, size) } } } } +// `image` does not use premultiplied alpha in resize, so we do it manually here, +// see https://github.com/image-rs/image/issues/1655 +fn resize_image(image: &DynamicImage, new_width: u32, new_height: u32) -> DynamicImage { + // Premultiply alpha + let premultiplied_image = ImageBuffer::from_par_fn(image.width(), image.height(), |x, y| { + let mut pixel = image.get_pixel(x, y); + let alpha = pixel.0[3] as f32 / u8::MAX as f32; + pixel.apply_without_alpha(|channel_value| (channel_value as f32 * alpha) as u8); + pixel + }); + + let mut resized = image::imageops::resize( + &premultiplied_image, + new_width, + new_height, + FilterType::Lanczos3, + ); + + // Demultiply alpha + resized.par_pixels_mut().for_each(|pixel| { + let alpha = pixel.0[3] as f32 / u8::MAX as f32; + pixel.apply_without_alpha(|channel_value| (channel_value as f32 / alpha) as u8); + }); + + DynamicImage::ImageRgba8(resized) +} + fn read_source(path: PathBuf) -> Result { if let Some(extension) = path.extension() { if extension == "svg" { @@ -183,7 +194,7 @@ fn read_source(path: PathBuf) -> Result { ..Default::default() }; - let svg_data = std::fs::read(&path).unwrap(); + let svg_data = std::fs::read(&path).fs_context("Failed to read source icon", &path)?; usvg::Tree::from_data(&svg_data, &opt).unwrap() }; @@ -329,7 +340,7 @@ fn icns(source: &Source, out_dir: &Path) -> Result<()> { let size = entry.size; let mut buf = Vec::new(); - let image = source.resize_exact(size)?; + let image = source.resize_exact(size); write_png(image.as_bytes(), &mut buf, size).context("failed to write output file")?; @@ -364,7 +375,7 @@ fn ico(source: &Source, out_dir: &Path) -> Result<()> { let mut frames = Vec::new(); for size in [32, 16, 24, 48, 64, 256] { - let image = source.resize_exact(size)?; + let image = source.resize_exact(size); // Only the 256px layer can be compressed according to the ico specs. if size == 256 { @@ -795,7 +806,7 @@ fn resize_png( bg: Option, scale_percent: Option, ) -> Result { - let mut image = source.resize_exact(size)?; + let mut image = source.resize_exact(size); match bg { Some(Background::Color(bg_color)) => { @@ -809,7 +820,7 @@ fn resize_png( image = bg_img.into(); } Some(Background::Image(bg_source)) => { - let mut bg = bg_source.resize_exact(size)?; + let mut bg = bg_source.resize_exact(size); let fg = scale_percent .map(|scale| resize_asset(&image, size, scale)) @@ -889,9 +900,10 @@ fn content_bounds(img: &DynamicImage) -> Option<(u32, u32, u32, u32)> { fn resize_asset(img: &DynamicImage, target_size: u32, scale_percent: f32) -> DynamicImage { let cropped = if let Some((x, y, cw, ch)) = content_bounds(img) { - img.crop_imm(x, y, cw, ch) + // TODO: Use `&` here instead when we raise MSRV to above 1.79 + Cow::Owned(img.crop_imm(x, y, cw, ch)) } else { - img.clone() + Cow::Borrowed(img) }; let (cw, ch) = cropped.dimensions(); @@ -901,7 +913,7 @@ fn resize_asset(img: &DynamicImage, target_size: u32, scale_percent: f32) -> Dyn let new_w = (cw as f32 * scale).round() as u32; let new_h = (ch as f32 * scale).round() as u32; - let resized = image::imageops::resize(&cropped, new_w, new_h, image::imageops::Lanczos3); + let resized = resize_image(&cropped, new_w, new_h); // Place on transparent square canvas let mut canvas = ImageBuffer::from_pixel(target_size, target_size, Rgba([0, 0, 0, 0])); From 3899d456d4d7fc8aba8c978541c8831ce9a4b9d8 Mon Sep 17 00:00:00 2001 From: Kushal Meghani <168952248+KushalMeghani1644@users.noreply.github.com> Date: Fri, 7 Nov 2025 07:08:05 +0530 Subject: [PATCH 038/119] Address review comments (#14426) * Address review comments * Revert comments in `impl FromStr for ConfigValue` --- crates/tauri-cli/src/lib.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/crates/tauri-cli/src/lib.rs b/crates/tauri-cli/src/lib.rs index 30997d0eb..186ef0ef8 100644 --- a/crates/tauri-cli/src/lib.rs +++ b/crates/tauri-cli/src/lib.rs @@ -66,10 +66,6 @@ impl FromStr for ConfigValue { let raw = read_to_string(&path).fs_context("failed to read configuration file", path.clone())?; - // treat all other extensions as json - // from tauri-utils/src/config/parse.rs: - // we also want to support **valid** json5 in the .json extension - // if the json5 is not valid the serde_json error for regular json will be returned. match path.extension().and_then(|ext| ext.to_str()) { Some("toml") => Ok(Self(::toml::from_str(&raw).with_context(|| { format!("failed to parse config at {} as TOML", path.display()) @@ -77,11 +73,17 @@ impl FromStr for ConfigValue { Some("json5") => Ok(Self(::json5::from_str(&raw).with_context(|| { format!("failed to parse config at {} as JSON5", path.display()) })?)), - _ => Ok(Self(match ::json5::from_str(&raw) { - Ok(json5) => json5, - Err(_) => serde_json::from_str(&raw) - .with_context(|| format!("failed to parse config at {} as JSON", path.display()))?, - })), + // treat all other extensions as json + _ => Ok(Self( + // from tauri-utils/src/config/parse.rs: + // we also want to support **valid** json5 in the .json extension + // if the json5 is not valid the serde_json error for regular json will be returned. + match ::json5::from_str(&raw) { + Ok(json5) => json5, + Err(_) => serde_json::from_str(&raw) + .with_context(|| format!("failed to parse config at {} as JSON", path.display()))?, + }, + )), } } } @@ -223,7 +225,7 @@ where Ok(s) => s, Err(e) => e.exit(), }; - + // set the verbosity level so subsequent CLI calls (xcode-script, android-studio-script) refer to it let verbosity_number = get_verbosity(cli.verbose); std::env::set_var("TAURI_CLI_VERBOSITY", verbosity_number.to_string()); @@ -231,10 +233,12 @@ where if let Err(err) = builder .format_indent(Some(12)) .filter(None, verbosity_level(verbosity_number).to_level_filter()) + // golbin spams an insane amount of really technical logs on the debug level so we're reducing one level .filter( Some("goblin"), verbosity_level(verbosity_number.saturating_sub(1)).to_level_filter(), ) + // handlebars is not that spammy but its debug logs are typically far from being helpful .filter( Some("handlebars"), verbosity_level(verbosity_number.saturating_sub(1)).to_level_filter(), @@ -314,6 +318,8 @@ fn prettyprint_level(lvl: Level) -> &'static str { } pub trait CommandExt { + // The `pipe` function sets the stdout and stderr to properly + // show the command output in the Node.js wrapper. fn piped(&mut self) -> std::io::Result; fn output_ok(&mut self) -> crate::Result; } From d566679a99efee3f663ed3c7edff06a5970e5b0d Mon Sep 17 00:00:00 2001 From: FabianLars Date: Sun, 9 Nov 2025 12:08:57 +0100 Subject: [PATCH 039/119] ci: don't re-generate lockfile on prepublish --- .changes/config.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.changes/config.json b/.changes/config.json index a4ca328f7..97a6917b8 100644 --- a/.changes/config.json +++ b/.changes/config.json @@ -27,12 +27,6 @@ "dryRunCommand": true, "pipe": true }, - { - "command": "cargo generate-lockfile", - "dryRunCommand": true, - "runFromRoot": true, - "pipe": true - }, { "command": "cargo audit ${ process.env.CARGO_AUDIT_OPTIONS || '' }", "dryRunCommand": true, From 9bb7e79e9704c398d8c1c7ff2c3effca5ad1808d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:48:27 +0100 Subject: [PATCH 040/119] apply version updates (#14425) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changes/image-premultiply-fix.md | 6 ------ Cargo.lock | 2 +- crates/tauri-cli/CHANGELOG.md | 6 ++++++ crates/tauri-cli/Cargo.toml | 2 +- crates/tauri-cli/metadata-v2.json | 2 +- packages/cli/CHANGELOG.md | 10 ++++++++++ packages/cli/package.json | 2 +- 7 files changed, 20 insertions(+), 10 deletions(-) delete mode 100644 .changes/image-premultiply-fix.md diff --git a/.changes/image-premultiply-fix.md b/.changes/image-premultiply-fix.md deleted file mode 100644 index 0ee098c83..000000000 --- a/.changes/image-premultiply-fix.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'tauri-cli': 'patch:bug' -'@tauri-apps/cli': 'patch:bug' ---- - -Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons for svg images. diff --git a/Cargo.lock b/Cargo.lock index e06187679..ce1a21a71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8622,7 +8622,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.9.3" +version = "2.9.4" dependencies = [ "ar", "axum", diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index 1df8870f7..841035738 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.4] + +### Bug Fixes + +- [`b586ecf1f`](https://www.github.com/tauri-apps/tauri/commit/b586ecf1f4b3b087f9aa6c4668c2c18b1b7925f4) ([#14416](https://www.github.com/tauri-apps/tauri/pull/14416) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons for svg images. + ## \[2.9.3] ### Enhancements diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index b499e6b62..625db14b7 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.9.3" +version = "2.9.4" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index 33235b30e..636f344ab 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,6 +1,6 @@ { "cli.js": { - "version": "2.9.3", + "version": "2.9.4", "node": ">= 10.0.0" }, "tauri": "2.9.2", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0e247a598..b242fd9ca 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## \[2.9.4] + +### Bug Fixes + +- [`b586ecf1f`](https://www.github.com/tauri-apps/tauri/commit/b586ecf1f4b3b087f9aa6c4668c2c18b1b7925f4) ([#14416](https://www.github.com/tauri-apps/tauri/pull/14416) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Premultiply Alpha before Resizing which gets rid of the gray fringe around the icons for svg images. + +### Dependencies + +- Upgraded to `tauri-cli@2.9.4` + ## \[2.9.3] ### Bug Fixes diff --git a/packages/cli/package.json b/packages/cli/package.json index 74d81eb45..f6b33fc26 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.9.3", + "version": "2.9.4", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From 236f55b7aa167b57ccd6c58303e9355bab66f656 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 12 Nov 2025 10:21:18 +0100 Subject: [PATCH 041/119] docs: enable dynamic-acl feature on docs.rs (#14452) --- crates/tauri/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 50482e72e..6cac9dcb1 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -25,6 +25,7 @@ features = [ "protocol-asset", "test", "specta", + "dynamic-acl", ] default-target = "x86_64-unknown-linux-gnu" targets = [ From cfe47871a5f3a03e82ecbc6e076c802a4ed91dcc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:05:17 +0800 Subject: [PATCH 042/119] chore(deps): update dependency rollup to v4.53.1 (#14444) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 688788095..e10acd321 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.52.5", + "rollup": "4.53.1", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8bfde6dd..97c44fed1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.52.5) + version: 0.4.4(rollup@4.53.1) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.53.1)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.52.5 - version: 4.52.5 + specifier: 4.53.1 + version: 4.53.1 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1103,113 +1103,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.5': - resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + '@rollup/rollup-android-arm-eabi@4.53.1': + resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.5': - resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + '@rollup/rollup-android-arm64@4.53.1': + resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.5': - resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + '@rollup/rollup-darwin-arm64@4.53.1': + resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': - resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + '@rollup/rollup-darwin-x64@4.53.1': + resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': - resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + '@rollup/rollup-freebsd-arm64@4.53.1': + resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.5': - resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + '@rollup/rollup-freebsd-x64@4.53.1': + resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + '@rollup/rollup-linux-arm-musleabihf@4.53.1': + resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.5': - resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + '@rollup/rollup-linux-arm64-gnu@4.53.1': + resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': - resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + '@rollup/rollup-linux-arm64-musl@4.53.1': + resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.5': - resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + '@rollup/rollup-linux-loong64-gnu@4.53.1': + resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + '@rollup/rollup-linux-ppc64-gnu@4.53.1': + resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + '@rollup/rollup-linux-riscv64-gnu@4.53.1': + resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.5': - resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + '@rollup/rollup-linux-riscv64-musl@4.53.1': + resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.5': - resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + '@rollup/rollup-linux-s390x-gnu@4.53.1': + resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.5': - resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + '@rollup/rollup-linux-x64-gnu@4.53.1': + resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': - resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + '@rollup/rollup-linux-x64-musl@4.53.1': + resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.5': - resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + '@rollup/rollup-openharmony-arm64@4.53.1': + resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.5': - resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + '@rollup/rollup-win32-arm64-msvc@4.53.1': + resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.5': - resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + '@rollup/rollup-win32-ia32-msvc@4.53.1': + resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.5': - resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + '@rollup/rollup-win32-x64-gnu@4.53.1': + resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.5': - resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + '@rollup/rollup-win32-x64-msvc@4.53.1': + resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} cpu: [x64] os: [win32] @@ -2149,8 +2149,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.52.5: - resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + rollup@4.53.1: + resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3294,95 +3294,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.52.5)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.1)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.1 - '@rollup/plugin-typescript@12.3.0(rollup@4.52.5)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.53.1)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.53.1) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.1 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.52.5)': + '@rollup/pluginutils@5.2.0(rollup@4.53.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.5 + rollup: 4.53.1 - '@rollup/rollup-android-arm-eabi@4.52.5': + '@rollup/rollup-android-arm-eabi@4.53.1': optional: true - '@rollup/rollup-android-arm64@4.52.5': + '@rollup/rollup-android-arm64@4.53.1': optional: true - '@rollup/rollup-darwin-arm64@4.52.5': + '@rollup/rollup-darwin-arm64@4.53.1': optional: true - '@rollup/rollup-darwin-x64@4.52.5': + '@rollup/rollup-darwin-x64@4.53.1': optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': + '@rollup/rollup-freebsd-arm64@4.53.1': optional: true - '@rollup/rollup-freebsd-x64@4.52.5': + '@rollup/rollup-freebsd-x64@4.53.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + '@rollup/rollup-linux-arm-gnueabihf@4.53.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.5': + '@rollup/rollup-linux-arm-musleabihf@4.53.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.5': + '@rollup/rollup-linux-arm64-gnu@4.53.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': + '@rollup/rollup-linux-arm64-musl@4.53.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.5': + '@rollup/rollup-linux-loong64-gnu@4.53.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.5': + '@rollup/rollup-linux-ppc64-gnu@4.53.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.5': + '@rollup/rollup-linux-riscv64-gnu@4.53.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.5': + '@rollup/rollup-linux-riscv64-musl@4.53.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.5': + '@rollup/rollup-linux-s390x-gnu@4.53.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.5': + '@rollup/rollup-linux-x64-gnu@4.53.1': optional: true - '@rollup/rollup-linux-x64-musl@4.52.5': + '@rollup/rollup-linux-x64-musl@4.53.1': optional: true - '@rollup/rollup-openharmony-arm64@4.52.5': + '@rollup/rollup-openharmony-arm64@4.53.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.5': + '@rollup/rollup-win32-arm64-msvc@4.53.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.5': + '@rollup/rollup-win32-ia32-msvc@4.53.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.5': + '@rollup/rollup-win32-x64-gnu@4.53.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.5': + '@rollup/rollup-win32-x64-msvc@4.53.1': optional: true '@standard-schema/spec@1.0.0': {} @@ -4417,32 +4417,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.52.5: + rollup@4.53.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.5 - '@rollup/rollup-android-arm64': 4.52.5 - '@rollup/rollup-darwin-arm64': 4.52.5 - '@rollup/rollup-darwin-x64': 4.52.5 - '@rollup/rollup-freebsd-arm64': 4.52.5 - '@rollup/rollup-freebsd-x64': 4.52.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 - '@rollup/rollup-linux-arm-musleabihf': 4.52.5 - '@rollup/rollup-linux-arm64-gnu': 4.52.5 - '@rollup/rollup-linux-arm64-musl': 4.52.5 - '@rollup/rollup-linux-loong64-gnu': 4.52.5 - '@rollup/rollup-linux-ppc64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-musl': 4.52.5 - '@rollup/rollup-linux-s390x-gnu': 4.52.5 - '@rollup/rollup-linux-x64-gnu': 4.52.5 - '@rollup/rollup-linux-x64-musl': 4.52.5 - '@rollup/rollup-openharmony-arm64': 4.52.5 - '@rollup/rollup-win32-arm64-msvc': 4.52.5 - '@rollup/rollup-win32-ia32-msvc': 4.52.5 - '@rollup/rollup-win32-x64-gnu': 4.52.5 - '@rollup/rollup-win32-x64-msvc': 4.52.5 + '@rollup/rollup-android-arm-eabi': 4.53.1 + '@rollup/rollup-android-arm64': 4.53.1 + '@rollup/rollup-darwin-arm64': 4.53.1 + '@rollup/rollup-darwin-x64': 4.53.1 + '@rollup/rollup-freebsd-arm64': 4.53.1 + '@rollup/rollup-freebsd-x64': 4.53.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 + '@rollup/rollup-linux-arm-musleabihf': 4.53.1 + '@rollup/rollup-linux-arm64-gnu': 4.53.1 + '@rollup/rollup-linux-arm64-musl': 4.53.1 + '@rollup/rollup-linux-loong64-gnu': 4.53.1 + '@rollup/rollup-linux-ppc64-gnu': 4.53.1 + '@rollup/rollup-linux-riscv64-gnu': 4.53.1 + '@rollup/rollup-linux-riscv64-musl': 4.53.1 + '@rollup/rollup-linux-s390x-gnu': 4.53.1 + '@rollup/rollup-linux-x64-gnu': 4.53.1 + '@rollup/rollup-linux-x64-musl': 4.53.1 + '@rollup/rollup-openharmony-arm64': 4.53.1 + '@rollup/rollup-win32-arm64-msvc': 4.53.1 + '@rollup/rollup-win32-ia32-msvc': 4.53.1 + '@rollup/rollup-win32-x64-gnu': 4.53.1 + '@rollup/rollup-win32-x64-msvc': 4.53.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4690,7 +4690,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.5 + rollup: 4.53.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From 8e3bd63db919a4cf72bb3d28028033d8654deb34 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Thu, 13 Nov 2025 15:24:10 +0800 Subject: [PATCH 043/119] perf(codegen): wrap generated context in a fn (#14457) * perf(codegen): wrap generated context in a fn * Add comment about the reasoning --- .changes/wrap-generate-context.md | 5 +++++ crates/tauri-codegen/src/context.rs | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 .changes/wrap-generate-context.md diff --git a/.changes/wrap-generate-context.md b/.changes/wrap-generate-context.md new file mode 100644 index 000000000..10f610a39 --- /dev/null +++ b/.changes/wrap-generate-context.md @@ -0,0 +1,5 @@ +--- +"tauri-codegen": "patch:perf" +--- + +Wrap the generated context code in a function to make rust analyzer faster diff --git a/crates/tauri-codegen/src/context.rs b/crates/tauri-codegen/src/context.rs index 87a05d702..b60d2b9fd 100644 --- a/crates/tauri-codegen/src/context.rs +++ b/crates/tauri-codegen/src/context.rs @@ -469,19 +469,24 @@ pub fn context_codegen(data: ContextData) -> EmbeddedAssetsResult { }); Ok(quote!({ - let thread = ::std::thread::Builder::new() - .name(String::from("generated tauri context creation")) - .stack_size(8 * 1024 * 1024) - .spawn(|| #context) - .expect("unable to create thread with 8MiB stack"); + // Wrapping in a function to make rust analyzer faster, + // see https://github.com/tauri-apps/tauri/pull/14457 + fn inner() -> #root::Context { + let thread = ::std::thread::Builder::new() + .name(String::from("generated tauri context creation")) + .stack_size(8 * 1024 * 1024) + .spawn(|| #context) + .expect("unable to create thread with 8MiB stack"); - match thread.join() { - Ok(context) => context, - Err(_) => { - eprintln!("the generated Tauri `Context` panicked during creation"); - ::std::process::exit(101); + match thread.join() { + Ok(context) => context, + Err(_) => { + eprintln!("the generated Tauri `Context` panicked during creation"); + ::std::process::exit(101); + } } } + inner() })) } From 4b00130b86a27b6f121bf57897b5e92d83bcc0fc Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Thu, 13 Nov 2025 08:18:50 -0300 Subject: [PATCH 044/119] refactor(core): improve iOS log messages from stdout/stderr (#14385) * refactor(core): improve iOS log messages from stdout/stderr move the stdout/stderr forward logic to Swift so it does not consume a Rust thread and never deadlocks on the simulator I had to work on this because i'm facing #12172 again on latest Xcode (26.1) * patch --- .changes/refactor-ios-stdout-stderr.md | 6 ++ .../mobile/ios-api/Sources/Tauri/Logger.swift | 83 ++++++++++++++++++- .../mobile/ios-api/Sources/Tauri/Tauri.swift | 8 ++ crates/tauri/src/ios.rs | 1 + crates/tauri/src/lib.rs | 32 +------ 5 files changed, 99 insertions(+), 31 deletions(-) create mode 100644 .changes/refactor-ios-stdout-stderr.md diff --git a/.changes/refactor-ios-stdout-stderr.md b/.changes/refactor-ios-stdout-stderr.md new file mode 100644 index 000000000..766cd9fb5 --- /dev/null +++ b/.changes/refactor-ios-stdout-stderr.md @@ -0,0 +1,6 @@ +--- +"tauri": patch:bug +"tauri-macros": patch:bug +--- + +Fix iOS deadlock when running on the simulator from Xcode by properly piping stdout/stderr messages through the Xcode console and OSLog. diff --git a/crates/tauri/mobile/ios-api/Sources/Tauri/Logger.swift b/crates/tauri/mobile/ios-api/Sources/Tauri/Logger.swift index 9fa6e3fe7..d055090dc 100644 --- a/crates/tauri/mobile/ios-api/Sources/Tauri/Logger.swift +++ b/crates/tauri/mobile/ios-api/Sources/Tauri/Logger.swift @@ -4,6 +4,86 @@ import os.log import UIKit +import Foundation + +class StdoutRedirector { + private var originalStdout: Int32 = -1 + private var originalStderr: Int32 = -1 + private var stdoutPipe: [Int32] = [-1, -1] + private var stderrPipe: [Int32] = [-1, -1] + private var stdoutReadSource: DispatchSourceRead? + private var stderrReadSource: DispatchSourceRead? + + func start() { + originalStdout = dup(STDOUT_FILENO) + originalStderr = dup(STDERR_FILENO) + + guard Darwin.pipe(&stdoutPipe) == 0, + Darwin.pipe(&stderrPipe) == 0 else { + Logger.error("Failed to create stdout/stderr pipes") + return + } + + dup2(stdoutPipe[1], STDOUT_FILENO) + dup2(stderrPipe[1], STDERR_FILENO) + close(stdoutPipe[1]) + close(stderrPipe[1]) + + stdoutReadSource = createReader( + readPipe: stdoutPipe[0], + writeToOriginal: originalStdout, + label: "stdout" + ) + + stderrReadSource = createReader( + readPipe: stderrPipe[0], + writeToOriginal: originalStderr, + label: "stderr" + ) + } + + private func createReader( + readPipe: Int32, + writeToOriginal: Int32, + label: String + ) -> DispatchSourceRead { + let source = DispatchSource.makeReadSource( + fileDescriptor: readPipe, + queue: .global(qos: .utility) + ) + + source.setEventHandler { + let bufferSize = 4096 + var buffer = [UInt8](repeating: 0, count: bufferSize) + let bytesRead = read(readPipe, &buffer, bufferSize) + + if bytesRead > 0 { + let output = String( + bytes: buffer[0.. Date: Thu, 13 Nov 2025 09:14:14 -0300 Subject: [PATCH 045/119] apply version updates (#14458) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changes/refactor-ios-stdout-stderr.md | 6 ------ .changes/wrap-generate-context.md | 5 ----- Cargo.lock | 14 +++++++------- crates/tauri-build/CHANGELOG.md | 6 ++++++ crates/tauri-build/Cargo.toml | 4 ++-- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-cli/metadata-v2.json | 4 ++-- crates/tauri-codegen/CHANGELOG.md | 6 ++++++ crates/tauri-codegen/Cargo.toml | 2 +- crates/tauri-macros/CHANGELOG.md | 10 ++++++++++ crates/tauri-macros/Cargo.toml | 4 ++-- .../schemas/config.schema.json | 2 +- crates/tauri/CHANGELOG.md | 11 +++++++++++ crates/tauri/Cargo.toml | 6 +++--- 14 files changed, 52 insertions(+), 30 deletions(-) delete mode 100644 .changes/refactor-ios-stdout-stderr.md delete mode 100644 .changes/wrap-generate-context.md diff --git a/.changes/refactor-ios-stdout-stderr.md b/.changes/refactor-ios-stdout-stderr.md deleted file mode 100644 index 766cd9fb5..000000000 --- a/.changes/refactor-ios-stdout-stderr.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri": patch:bug -"tauri-macros": patch:bug ---- - -Fix iOS deadlock when running on the simulator from Xcode by properly piping stdout/stderr messages through the Xcode console and OSLog. diff --git a/.changes/wrap-generate-context.md b/.changes/wrap-generate-context.md deleted file mode 100644 index 10f610a39..000000000 --- a/.changes/wrap-generate-context.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-codegen": "patch:perf" ---- - -Wrap the generated context code in a function to make rust analyzer faster diff --git a/Cargo.lock b/Cargo.lock index ce1a21a71..85b84ee01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -4319,7 +4319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -8494,7 +8494,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.9.2" +version = "2.9.3" dependencies = [ "anyhow", "bytes", @@ -8554,7 +8554,7 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.5.1" +version = "2.5.2" dependencies = [ "anyhow", "cargo_toml", @@ -8716,7 +8716,7 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.5.0" +version = "2.5.1" dependencies = [ "base64 0.22.1", "brotli", @@ -8802,7 +8802,7 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.5.0" +version = "2.5.1" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -10324,7 +10324,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/crates/tauri-build/CHANGELOG.md b/crates/tauri-build/CHANGELOG.md index 95ba81d85..8568ec929 100644 --- a/crates/tauri-build/CHANGELOG.md +++ b/crates/tauri-build/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.5.2] + +### Dependencies + +- Upgraded to `tauri-codegen@2.5.1` + ## \[2.5.1] ### Bug Fixes diff --git a/crates/tauri-build/Cargo.toml b/crates/tauri-build/Cargo.toml index 3f93769e1..b8e3c6434 100644 --- a/crates/tauri-build/Cargo.toml +++ b/crates/tauri-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-build" -version = "2.5.1" +version = "2.5.2" description = "build time code to pair with https://crates.io/crates/tauri" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -26,7 +26,7 @@ targets = [ [dependencies] anyhow = "1" quote = { version = "1", optional = true } -tauri-codegen = { version = "2.5.0", path = "../tauri-codegen", optional = true } +tauri-codegen = { version = "2.5.1", path = "../tauri-codegen", optional = true } tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ "build", "resources", diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index b2953239f..b9cdcae1d 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.2", + "$id": "https://schema.tauri.app/config/2.9.3", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index 636f344ab..a3ad3dc81 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -3,7 +3,7 @@ "version": "2.9.4", "node": ">= 10.0.0" }, - "tauri": "2.9.2", - "tauri-build": "2.5.1", + "tauri": "2.9.3", + "tauri-build": "2.5.2", "tauri-plugin": "2.5.1" } diff --git a/crates/tauri-codegen/CHANGELOG.md b/crates/tauri-codegen/CHANGELOG.md index a846e1604..9d78e2b78 100644 --- a/crates/tauri-codegen/CHANGELOG.md +++ b/crates/tauri-codegen/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.5.1] + +### Performance Improvements + +- [`8e3bd63db`](https://www.github.com/tauri-apps/tauri/commit/8e3bd63db919a4cf72bb3d28028033d8654deb34) ([#14457](https://www.github.com/tauri-apps/tauri/pull/14457) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Wrap the generated context code in a function to make rust analyzer faster + ## \[2.5.0] ### Bug Fixes diff --git a/crates/tauri-codegen/Cargo.toml b/crates/tauri-codegen/Cargo.toml index 7c569776c..de391d521 100644 --- a/crates/tauri-codegen/Cargo.toml +++ b/crates/tauri-codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-codegen" -version = "2.5.0" +version = "2.5.1" description = "code generation meant to be consumed inside of `tauri` through `tauri-build` or `tauri-macros`" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" diff --git a/crates/tauri-macros/CHANGELOG.md b/crates/tauri-macros/CHANGELOG.md index 19e6c3c82..0775a58d4 100644 --- a/crates/tauri-macros/CHANGELOG.md +++ b/crates/tauri-macros/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## \[2.5.1] + +### Bug Fixes + +- [`4b00130b8`](https://www.github.com/tauri-apps/tauri/commit/4b00130b86a27b6f121bf57897b5e92d83bcc0fc) ([#14385](https://www.github.com/tauri-apps/tauri/pull/14385) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Fix iOS deadlock when running on the simulator from Xcode by properly piping stdout/stderr messages through the Xcode console and OSLog. + +### Dependencies + +- Upgraded to `tauri-codegen@2.5.1` + ## \[2.5.0] ### Bug Fixes diff --git a/crates/tauri-macros/Cargo.toml b/crates/tauri-macros/Cargo.toml index e4ddb61ac..79d5a7230 100644 --- a/crates/tauri-macros/Cargo.toml +++ b/crates/tauri-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-macros" -version = "2.5.0" +version = "2.5.1" description = "Macros for the tauri crate." exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,7 +20,7 @@ proc-macro2 = { version = "1", features = ["span-locations"] } quote = "1" syn = { version = "2", features = ["full"] } heck = "0.5" -tauri-codegen = { version = "2.5.0", default-features = false, path = "../tauri-codegen" } +tauri-codegen = { version = "2.5.1", default-features = false, path = "../tauri-codegen" } tauri-utils = { version = "2.8.0", path = "../tauri-utils" } [features] diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index b2953239f..b9cdcae1d 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.2", + "$id": "https://schema.tauri.app/config/2.9.3", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri/CHANGELOG.md b/crates/tauri/CHANGELOG.md index 5dfa01085..e1332ea34 100644 --- a/crates/tauri/CHANGELOG.md +++ b/crates/tauri/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## \[2.9.3] + +### Bug Fixes + +- [`4b00130b8`](https://www.github.com/tauri-apps/tauri/commit/4b00130b86a27b6f121bf57897b5e92d83bcc0fc) ([#14385](https://www.github.com/tauri-apps/tauri/pull/14385) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Fix iOS deadlock when running on the simulator from Xcode by properly piping stdout/stderr messages through the Xcode console and OSLog. + +### Dependencies + +- Upgraded to `tauri-macros@2.5.1` +- Upgraded to `tauri-build@2.5.2` + ## \[2.9.2] ### Bug Fixes diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 6cac9dcb1..dda4f4124 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri" -version = "2.9.2" +version = "2.9.3" description = "Make tiny, secure apps for all desktop platforms with Tauri" exclude = ["/test", "/.scripts", "CHANGELOG.md", "/target"] readme = "README.md" @@ -56,7 +56,7 @@ url = "2" anyhow = "1" thiserror = "2" tauri-runtime = { version = "2.9.1", path = "../tauri-runtime" } -tauri-macros = { version = "2.5.0", path = "../tauri-macros" } +tauri-macros = { version = "2.5.1", path = "../tauri-macros" } tauri-utils = { version = "2.8.0", features = [ "resources", ], path = "../tauri-utils" } @@ -162,7 +162,7 @@ objc2-ui-kit = { version = "0.3.0", default-features = false, features = [ [build-dependencies] glob = "0.3" heck = "0.5" -tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.1" } +tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.2" } tauri-utils = { path = "../tauri-utils/", version = "2.8.0", features = [ "build", ] } From beffcd880f81595c5c081ff914f89b5b7cb07e95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 15 Nov 2025 10:23:57 +0800 Subject: [PATCH 046/119] chore(deps): update dependency rollup to v4.53.2 (#14459) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index e10acd321..0aa4d6c5b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.53.1", + "rollup": "4.53.2", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97c44fed1..6b7a85474 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.53.1) + version: 0.4.4(rollup@4.53.2) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.53.1)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.53.2)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.53.1 - version: 4.53.1 + specifier: 4.53.2 + version: 4.53.2 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1103,113 +1103,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.1': - resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} + '@rollup/rollup-android-arm-eabi@4.53.2': + resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.1': - resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} + '@rollup/rollup-android-arm64@4.53.2': + resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.1': - resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} + '@rollup/rollup-darwin-arm64@4.53.2': + resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.1': - resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} + '@rollup/rollup-darwin-x64@4.53.2': + resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.1': - resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} + '@rollup/rollup-freebsd-arm64@4.53.2': + resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.1': - resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} + '@rollup/rollup-freebsd-x64@4.53.2': + resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.1': - resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.1': - resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} + '@rollup/rollup-linux-arm-musleabihf@4.53.2': + resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.1': - resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} + '@rollup/rollup-linux-arm64-gnu@4.53.2': + resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.1': - resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} + '@rollup/rollup-linux-arm64-musl@4.53.2': + resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.1': - resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} + '@rollup/rollup-linux-loong64-gnu@4.53.2': + resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.1': - resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} + '@rollup/rollup-linux-ppc64-gnu@4.53.2': + resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.1': - resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} + '@rollup/rollup-linux-riscv64-gnu@4.53.2': + resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.1': - resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} + '@rollup/rollup-linux-riscv64-musl@4.53.2': + resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.1': - resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} + '@rollup/rollup-linux-s390x-gnu@4.53.2': + resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.1': - resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} + '@rollup/rollup-linux-x64-gnu@4.53.2': + resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.1': - resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} + '@rollup/rollup-linux-x64-musl@4.53.2': + resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.1': - resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} + '@rollup/rollup-openharmony-arm64@4.53.2': + resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.1': - resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} + '@rollup/rollup-win32-arm64-msvc@4.53.2': + resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.1': - resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} + '@rollup/rollup-win32-ia32-msvc@4.53.2': + resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.1': - resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} + '@rollup/rollup-win32-x64-gnu@4.53.2': + resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.1': - resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} + '@rollup/rollup-win32-x64-msvc@4.53.2': + resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} cpu: [x64] os: [win32] @@ -2149,8 +2149,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.1: - resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} + rollup@4.53.2: + resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3294,95 +3294,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.53.1)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.53.1 + rollup: 4.53.2 - '@rollup/plugin-typescript@12.3.0(rollup@4.53.1)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.53.2)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.53.1) + '@rollup/pluginutils': 5.2.0(rollup@4.53.2) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.53.1 + rollup: 4.53.2 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.53.1)': + '@rollup/pluginutils@5.2.0(rollup@4.53.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.1 + rollup: 4.53.2 - '@rollup/rollup-android-arm-eabi@4.53.1': + '@rollup/rollup-android-arm-eabi@4.53.2': optional: true - '@rollup/rollup-android-arm64@4.53.1': + '@rollup/rollup-android-arm64@4.53.2': optional: true - '@rollup/rollup-darwin-arm64@4.53.1': + '@rollup/rollup-darwin-arm64@4.53.2': optional: true - '@rollup/rollup-darwin-x64@4.53.1': + '@rollup/rollup-darwin-x64@4.53.2': optional: true - '@rollup/rollup-freebsd-arm64@4.53.1': + '@rollup/rollup-freebsd-arm64@4.53.2': optional: true - '@rollup/rollup-freebsd-x64@4.53.1': + '@rollup/rollup-freebsd-x64@4.53.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.1': + '@rollup/rollup-linux-arm-musleabihf@4.53.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.1': + '@rollup/rollup-linux-arm64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.1': + '@rollup/rollup-linux-arm64-musl@4.53.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.1': + '@rollup/rollup-linux-loong64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.1': + '@rollup/rollup-linux-ppc64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.1': + '@rollup/rollup-linux-riscv64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.1': + '@rollup/rollup-linux-riscv64-musl@4.53.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.1': + '@rollup/rollup-linux-s390x-gnu@4.53.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.1': + '@rollup/rollup-linux-x64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-x64-musl@4.53.1': + '@rollup/rollup-linux-x64-musl@4.53.2': optional: true - '@rollup/rollup-openharmony-arm64@4.53.1': + '@rollup/rollup-openharmony-arm64@4.53.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.1': + '@rollup/rollup-win32-arm64-msvc@4.53.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.1': + '@rollup/rollup-win32-ia32-msvc@4.53.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.1': + '@rollup/rollup-win32-x64-gnu@4.53.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.1': + '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true '@standard-schema/spec@1.0.0': {} @@ -4417,32 +4417,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.1: + rollup@4.53.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.1 - '@rollup/rollup-android-arm64': 4.53.1 - '@rollup/rollup-darwin-arm64': 4.53.1 - '@rollup/rollup-darwin-x64': 4.53.1 - '@rollup/rollup-freebsd-arm64': 4.53.1 - '@rollup/rollup-freebsd-x64': 4.53.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 - '@rollup/rollup-linux-arm-musleabihf': 4.53.1 - '@rollup/rollup-linux-arm64-gnu': 4.53.1 - '@rollup/rollup-linux-arm64-musl': 4.53.1 - '@rollup/rollup-linux-loong64-gnu': 4.53.1 - '@rollup/rollup-linux-ppc64-gnu': 4.53.1 - '@rollup/rollup-linux-riscv64-gnu': 4.53.1 - '@rollup/rollup-linux-riscv64-musl': 4.53.1 - '@rollup/rollup-linux-s390x-gnu': 4.53.1 - '@rollup/rollup-linux-x64-gnu': 4.53.1 - '@rollup/rollup-linux-x64-musl': 4.53.1 - '@rollup/rollup-openharmony-arm64': 4.53.1 - '@rollup/rollup-win32-arm64-msvc': 4.53.1 - '@rollup/rollup-win32-ia32-msvc': 4.53.1 - '@rollup/rollup-win32-x64-gnu': 4.53.1 - '@rollup/rollup-win32-x64-msvc': 4.53.1 + '@rollup/rollup-android-arm-eabi': 4.53.2 + '@rollup/rollup-android-arm64': 4.53.2 + '@rollup/rollup-darwin-arm64': 4.53.2 + '@rollup/rollup-darwin-x64': 4.53.2 + '@rollup/rollup-freebsd-arm64': 4.53.2 + '@rollup/rollup-freebsd-x64': 4.53.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 + '@rollup/rollup-linux-arm-musleabihf': 4.53.2 + '@rollup/rollup-linux-arm64-gnu': 4.53.2 + '@rollup/rollup-linux-arm64-musl': 4.53.2 + '@rollup/rollup-linux-loong64-gnu': 4.53.2 + '@rollup/rollup-linux-ppc64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-musl': 4.53.2 + '@rollup/rollup-linux-s390x-gnu': 4.53.2 + '@rollup/rollup-linux-x64-gnu': 4.53.2 + '@rollup/rollup-linux-x64-musl': 4.53.2 + '@rollup/rollup-openharmony-arm64': 4.53.2 + '@rollup/rollup-win32-arm64-msvc': 4.53.2 + '@rollup/rollup-win32-ia32-msvc': 4.53.2 + '@rollup/rollup-win32-x64-gnu': 4.53.2 + '@rollup/rollup-win32-x64-msvc': 4.53.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4690,7 +4690,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.1 + rollup: 4.53.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From ad1dec2e2488fe5c0a004b69f1bd290dfc593bf8 Mon Sep 17 00:00:00 2001 From: Aleksey Ponomarev Date: Sat, 15 Nov 2025 06:07:51 +0200 Subject: [PATCH 047/119] fix(core): properly handle async errors in addPluginListener (#14464) * fix(core): properly handle async errors in addPluginListener The previous implementation used .then() after invoke() without await, which prevented the catch block from handling rejected promises. Now using await to properly catch errors and allow fallback to camelCase registerListener method. * Change file and generate `bundle.global.js` --------- Co-authored-by: Tony --- .changes/add-plugin-listener-error-handling.md | 5 +++++ crates/tauri/scripts/bundle.global.js | 2 +- packages/api/src/core.ts | 10 +++++----- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 .changes/add-plugin-listener-error-handling.md diff --git a/.changes/add-plugin-listener-error-handling.md b/.changes/add-plugin-listener-error-handling.md new file mode 100644 index 000000000..38474f02a --- /dev/null +++ b/.changes/add-plugin-listener-error-handling.md @@ -0,0 +1,5 @@ +--- +"@tauri-apps/api": patch:bug +--- + +Fix `addPluginListener` fallback added in https://github.com/tauri-apps/tauri/pull/14132 didn't work properly diff --git a/crates/tauri/scripts/bundle.global.js b/crates/tauri/scripts/bundle.global.js index 0b3f0bf86..7f8eff34b 100644 --- a/crates/tauri/scripts/bundle.global.js +++ b/crates/tauri/scripts/bundle.global.js @@ -1 +1 @@ -var __TAURI_IIFE__=function(e){"use strict";function n(e,n,t,i){if("a"===t&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!i:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===t?i:"a"===t?i.call(e):i?i.value:n.get(e)}function t(e,n,t,i,r){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?r.call(e,t):r?r.value=t:n.set(e,t),t}var i,r,s,a,l;"function"==typeof SuppressedError&&SuppressedError;const o="__TAURI_TO_IPC_KEY__";function u(e,n=!1){return window.__TAURI_INTERNALS__.transformCallback(e,n)}class c{constructor(e){i.set(this,void 0),r.set(this,0),s.set(this,[]),a.set(this,void 0),t(this,i,e||(()=>{}),"f"),this.id=u(e=>{const l=e.index;if("end"in e)return void(l==n(this,r,"f")?this.cleanupCallback():t(this,a,l,"f"));const o=e.message;if(l==n(this,r,"f")){for(n(this,i,"f").call(this,o),t(this,r,n(this,r,"f")+1,"f");n(this,r,"f")in n(this,s,"f");){const e=n(this,s,"f")[n(this,r,"f")];n(this,i,"f").call(this,e),delete n(this,s,"f")[n(this,r,"f")],t(this,r,n(this,r,"f")+1,"f")}n(this,r,"f")===n(this,a,"f")&&this.cleanupCallback()}else n(this,s,"f")[l]=o})}cleanupCallback(){window.__TAURI_INTERNALS__.unregisterCallback(this.id)}set onmessage(e){t(this,i,e,"f")}get onmessage(){return n(this,i,"f")}[(i=new WeakMap,r=new WeakMap,s=new WeakMap,a=new WeakMap,o)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[o]()}}class d{constructor(e,n,t){this.plugin=e,this.event=n,this.channelId=t}async unregister(){return h(`plugin:${this.plugin}|remove_listener`,{event:this.event,channelId:this.channelId})}}async function p(e,n,t){const i=new c(t);try{return h(`plugin:${e}|register_listener`,{event:n,handler:i}).then(()=>new d(e,n,i.id))}catch{return h(`plugin:${e}|registerListener`,{event:n,handler:i}).then(()=>new d(e,n,i.id))}}async function h(e,n={},t){return window.__TAURI_INTERNALS__.invoke(e,n,t)}class w{get rid(){return n(this,l,"f")}constructor(e){l.set(this,void 0),t(this,l,e,"f")}async close(){return h("plugin:resources|close",{rid:this.rid})}}l=new WeakMap;var _=Object.freeze({__proto__:null,Channel:c,PluginListener:d,Resource:w,SERIALIZE_TO_IPC_FN:o,addPluginListener:p,checkPermissions:async function(e){return h(`plugin:${e}|check_permissions`)},convertFileSrc:function(e,n="asset"){return window.__TAURI_INTERNALS__.convertFileSrc(e,n)},invoke:h,isTauri:function(){return!!(globalThis||window).isTauri},requestPermissions:async function(e){return h(`plugin:${e}|request_permissions`)},transformCallback:u});class y extends w{constructor(e){super(e)}static async new(e,n,t){return h("plugin:image|new",{rgba:g(e),width:n,height:t}).then(e=>new y(e))}static async fromBytes(e){return h("plugin:image|from_bytes",{bytes:g(e)}).then(e=>new y(e))}static async fromPath(e){return h("plugin:image|from_path",{path:e}).then(e=>new y(e))}async rgba(){return h("plugin:image|rgba",{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return h("plugin:image|size",{rid:this.rid})}}function g(e){return null==e?null:"string"==typeof e?e:e instanceof y?e.rid:e}var b,m=Object.freeze({__proto__:null,Image:y,transformImage:g});!function(e){e.Nsis="nsis",e.Msi="msi",e.Deb="deb",e.Rpm="rpm",e.AppImage="appimage",e.App="app"}(b||(b={}));var f=Object.freeze({__proto__:null,get BundleType(){return b},defaultWindowIcon:async function(){return h("plugin:app|default_window_icon").then(e=>e?new y(e):null)},fetchDataStoreIdentifiers:async function(){return h("plugin:app|fetch_data_store_identifiers")},getBundleType:async function(){return h("plugin:app|bundle_type")},getIdentifier:async function(){return h("plugin:app|identifier")},getName:async function(){return h("plugin:app|name")},getTauriVersion:async function(){return h("plugin:app|tauri_version")},getVersion:async function(){return h("plugin:app|version")},hide:async function(){return h("plugin:app|app_hide")},onBackButtonPress:async function(e){return p("app","back-button",e)},removeDataStore:async function(e){return h("plugin:app|remove_data_store",{uuid:e})},setDockVisibility:async function(e){return h("plugin:app|set_dock_visibility",{visible:e})},setTheme:async function(e){return h("plugin:app|set_app_theme",{theme:e})},show:async function(){return h("plugin:app|app_show")}});class v{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.width=e[0].Logical.width,this.height=e[0].Logical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toPhysical(e){return new k(this.width*e,this.height*e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class k{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.width=e[0].Physical.width,this.height=e[0].Physical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toLogical(e){return new v(this.width/e,this.height/e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class A{constructor(e){this.size=e}toLogical(e){return this.size instanceof v?this.size:this.size.toLogical(e)}toPhysical(e){return this.size instanceof k?this.size:this.size.toPhysical(e)}[o](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[o]()}}class T{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.x=e[0].Logical.x,this.y=e[0].Logical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toPhysical(e){return new I(this.x*e,this.y*e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class I{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.x=e[0].Physical.x,this.y=e[0].Physical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toLogical(e){return new T(this.x/e,this.y/e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class E{constructor(e){this.position=e}toLogical(e){return this.position instanceof T?this.position:this.position.toLogical(e)}toPhysical(e){return this.position instanceof I?this.position:this.position.toPhysical(e)}[o](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[o]()}}var R,D=Object.freeze({__proto__:null,LogicalPosition:T,LogicalSize:v,PhysicalPosition:I,PhysicalSize:k,Position:E,Size:A});async function S(e,n){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,n),await h("plugin:event|unlisten",{event:e,eventId:n})}async function N(e,n,t){var i;const r="string"==typeof(null==t?void 0:t.target)?{kind:"AnyLabel",label:t.target}:null!==(i=null==t?void 0:t.target)&&void 0!==i?i:{kind:"Any"};return h("plugin:event|listen",{event:e,target:r,handler:u(n)}).then(n=>async()=>S(e,n))}async function L(e,n,t){return N(e,t=>{S(e,t.id),n(t)},t)}async function C(e,n){await h("plugin:event|emit",{event:e,payload:n})}async function x(e,n,t){const i="string"==typeof e?{kind:"AnyLabel",label:e}:e;await h("plugin:event|emit_to",{target:i,event:n,payload:t})}!function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"}(R||(R={}));var P,z,W,O=Object.freeze({__proto__:null,get TauriEvent(){return R},emit:C,emitTo:x,listen:N,once:L});function U(e){var n;if("items"in e)e.items=null===(n=e.items)||void 0===n?void 0:n.map(e=>"rid"in e?e:U(e));else if("action"in e&&e.action){const n=new c;return n.onmessage=e.action,delete e.action,{...e,handler:n}}return e}async function F(e,n){const t=new c;if(n&&"object"==typeof n&&("action"in n&&n.action&&(t.onmessage=n.action,delete n.action),"item"in n&&n.item&&"object"==typeof n.item&&"About"in n.item&&n.item.About&&"object"==typeof n.item.About&&"icon"in n.item.About&&n.item.About.icon&&(n.item.About.icon=g(n.item.About.icon)),"icon"in n&&n.icon&&(n.icon=g(n.icon)),"items"in n&&n.items)){function i(e){var n;return"rid"in e?[e.rid,e.kind]:("item"in e&&"object"==typeof e.item&&(null===(n=e.item.About)||void 0===n?void 0:n.icon)&&(e.item.About.icon=g(e.item.About.icon)),"icon"in e&&e.icon&&(e.icon=g(e.icon)),"items"in e&&e.items&&(e.items=e.items.map(i)),U(e))}n.items=n.items.map(i)}return h("plugin:menu|new",{kind:e,options:n,handler:t})}class M extends w{get id(){return n(this,P,"f")}get kind(){return n(this,z,"f")}constructor(e,n,i){super(e),P.set(this,void 0),z.set(this,void 0),t(this,P,n,"f"),t(this,z,i,"f")}}P=new WeakMap,z=new WeakMap;class B extends M{constructor(e,n){super(e,n,"MenuItem")}static async new(e){return F("MenuItem",e).then(([e,n])=>new B(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}}class V extends M{constructor(e,n){super(e,n,"Check")}static async new(e){return F("Check",e).then(([e,n])=>new V(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async isChecked(){return h("plugin:menu|is_checked",{rid:this.rid})}async setChecked(e){return h("plugin:menu|set_checked",{rid:this.rid,checked:e})}}!function(e){e.Add="Add",e.Advanced="Advanced",e.Bluetooth="Bluetooth",e.Bookmarks="Bookmarks",e.Caution="Caution",e.ColorPanel="ColorPanel",e.ColumnView="ColumnView",e.Computer="Computer",e.EnterFullScreen="EnterFullScreen",e.Everyone="Everyone",e.ExitFullScreen="ExitFullScreen",e.FlowView="FlowView",e.Folder="Folder",e.FolderBurnable="FolderBurnable",e.FolderSmart="FolderSmart",e.FollowLinkFreestanding="FollowLinkFreestanding",e.FontPanel="FontPanel",e.GoLeft="GoLeft",e.GoRight="GoRight",e.Home="Home",e.IChatTheater="IChatTheater",e.IconView="IconView",e.Info="Info",e.InvalidDataFreestanding="InvalidDataFreestanding",e.LeftFacingTriangle="LeftFacingTriangle",e.ListView="ListView",e.LockLocked="LockLocked",e.LockUnlocked="LockUnlocked",e.MenuMixedState="MenuMixedState",e.MenuOnState="MenuOnState",e.MobileMe="MobileMe",e.MultipleDocuments="MultipleDocuments",e.Network="Network",e.Path="Path",e.PreferencesGeneral="PreferencesGeneral",e.QuickLook="QuickLook",e.RefreshFreestanding="RefreshFreestanding",e.Refresh="Refresh",e.Remove="Remove",e.RevealFreestanding="RevealFreestanding",e.RightFacingTriangle="RightFacingTriangle",e.Share="Share",e.Slideshow="Slideshow",e.SmartBadge="SmartBadge",e.StatusAvailable="StatusAvailable",e.StatusNone="StatusNone",e.StatusPartiallyAvailable="StatusPartiallyAvailable",e.StatusUnavailable="StatusUnavailable",e.StopProgressFreestanding="StopProgressFreestanding",e.StopProgress="StopProgress",e.TrashEmpty="TrashEmpty",e.TrashFull="TrashFull",e.User="User",e.UserAccounts="UserAccounts",e.UserGroup="UserGroup",e.UserGuest="UserGuest"}(W||(W={}));class G extends M{constructor(e,n){super(e,n,"Icon")}static async new(e){return F("Icon",e).then(([e,n])=>new G(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async setIcon(e){return h("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:g(e)})}}class j extends M{constructor(e,n){super(e,n,"Predefined")}static async new(e){return F("Predefined",e).then(([e,n])=>new j(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}}function H([e,n,t]){switch(t){case"Submenu":return new $(e,n);case"Predefined":return new j(e,n);case"Check":return new V(e,n);case"Icon":return new G(e,n);default:return new B(e,n)}}class $ extends M{constructor(e,n){super(e,n,"Submenu")}static async new(e){return F("Submenu",e).then(([e,n])=>new $(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async append(e){return h("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return h("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return h("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return h("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return h("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(H)}async items(){return h("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(H))}async get(e){return h("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?H(e):null)}async popup(e,n){var t;return h("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof E?e:e?new E(e):null})}async setAsWindowsMenuForNSApp(){return h("plugin:menu|set_as_windows_menu_for_nsapp",{rid:this.rid})}async setAsHelpMenuForNSApp(){return h("plugin:menu|set_as_help_menu_for_nsapp",{rid:this.rid})}async setIcon(e){return h("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:g(e)})}}class q extends M{constructor(e,n){super(e,n,"Menu")}static async new(e){return F("Menu",e).then(([e,n])=>new q(e,n))}static async default(){return h("plugin:menu|create_default").then(([e,n])=>new q(e,n))}async append(e){return h("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return h("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return h("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return h("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return h("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(H)}async items(){return h("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(H))}async get(e){return h("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?H(e):null)}async popup(e,n){var t;return h("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof E?e:e?new E(e):null})}async setAsAppMenu(){return h("plugin:menu|set_as_app_menu",{rid:this.rid}).then(e=>e?new q(e[0],e[1]):null)}async setAsWindowMenu(e){var n;return h("plugin:menu|set_as_window_menu",{rid:this.rid,window:null!==(n=null==e?void 0:e.label)&&void 0!==n?n:null}).then(e=>e?new q(e[0],e[1]):null)}}var J=Object.freeze({__proto__:null,CheckMenuItem:V,IconMenuItem:G,Menu:q,MenuItem:B,get NativeIcon(){return W},PredefinedMenuItem:j,Submenu:$,itemFromKind:H});function Q(){var e,n;window.__TAURI_INTERNALS__=null!==(e=window.__TAURI_INTERNALS__)&&void 0!==e?e:{},window.__TAURI_EVENT_PLUGIN_INTERNALS__=null!==(n=window.__TAURI_EVENT_PLUGIN_INTERNALS__)&&void 0!==n?n:{}}var Z,K=Object.freeze({__proto__:null,clearMocks:function(){"object"==typeof window.__TAURI_INTERNALS__&&(delete window.__TAURI_INTERNALS__.invoke,delete window.__TAURI_INTERNALS__.transformCallback,delete window.__TAURI_INTERNALS__.unregisterCallback,delete window.__TAURI_INTERNALS__.runCallback,delete window.__TAURI_INTERNALS__.callbacks,delete window.__TAURI_INTERNALS__.convertFileSrc,delete window.__TAURI_INTERNALS__.metadata,"object"==typeof window.__TAURI_EVENT_PLUGIN_INTERNALS__&&delete window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener)},mockConvertFileSrc:function(e){Q(),window.__TAURI_INTERNALS__.convertFileSrc=function(n,t="asset"){const i=encodeURIComponent(n);return"windows"===e?`http://${t}.localhost/${i}`:`${t}://localhost/${i}`}},mockIPC:function(e,n){function t(e,n){switch(e){case"plugin:event|listen":return function(e){i.has(e.event)||i.set(e.event,[]);return i.get(e.event).push(e.handler),e.handler}(n);case"plugin:event|emit":return function(e){const n=i.get(e.event)||[];for(const t of n)a(t,e);return null}(n);case"plugin:event|unlisten":return function(e){const n=i.get(e.event);if(n){const t=n.indexOf(e.id);-1!==t&&n.splice(t,1)}}(n)}}Q();const i=new Map,r=new Map;function s(e){r.delete(e)}function a(e,n){const t=r.get(e);t?t(n):console.warn(`[TAURI] Couldn't find callback id ${e}. This might happen when the app is reloaded while Rust is running an asynchronous operation.`)}window.__TAURI_INTERNALS__.invoke=async function(i,r,s){return(null==n?void 0:n.shouldMockEvents)&&function(e){return e.startsWith("plugin:event|")}(i)?t(i,r):e(i,r)},window.__TAURI_INTERNALS__.transformCallback=function(e,n=!1){const t=window.crypto.getRandomValues(new Uint32Array(1))[0];return r.set(t,i=>(n&&s(t),e&&e(i))),t},window.__TAURI_INTERNALS__.unregisterCallback=s,window.__TAURI_INTERNALS__.runCallback=a,window.__TAURI_INTERNALS__.callbacks=r,window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener=function(e,n){s(n)}},mockWindows:function(e,...n){Q(),window.__TAURI_INTERNALS__.metadata={currentWindow:{label:e},currentWebview:{windowLabel:e,label:e}}}});!function(e){e[e.Audio=1]="Audio",e[e.Cache=2]="Cache",e[e.Config=3]="Config",e[e.Data=4]="Data",e[e.LocalData=5]="LocalData",e[e.Document=6]="Document",e[e.Download=7]="Download",e[e.Picture=8]="Picture",e[e.Public=9]="Public",e[e.Video=10]="Video",e[e.Resource=11]="Resource",e[e.Temp=12]="Temp",e[e.AppConfig=13]="AppConfig",e[e.AppData=14]="AppData",e[e.AppLocalData=15]="AppLocalData",e[e.AppCache=16]="AppCache",e[e.AppLog=17]="AppLog",e[e.Desktop=18]="Desktop",e[e.Executable=19]="Executable",e[e.Font=20]="Font",e[e.Home=21]="Home",e[e.Runtime=22]="Runtime",e[e.Template=23]="Template"}(Z||(Z={}));var Y=Object.freeze({__proto__:null,get BaseDirectory(){return Z},appCacheDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppCache})},appConfigDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppConfig})},appDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppData})},appLocalDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppLocalData})},appLogDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppLog})},audioDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Audio})},basename:async function(e,n){return h("plugin:path|basename",{path:e,ext:n})},cacheDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Cache})},configDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Config})},dataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Data})},delimiter:function(){return window.__TAURI_INTERNALS__.plugins.path.delimiter},desktopDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Desktop})},dirname:async function(e){return h("plugin:path|dirname",{path:e})},documentDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Document})},downloadDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Download})},executableDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Executable})},extname:async function(e){return h("plugin:path|extname",{path:e})},fontDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Font})},homeDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Home})},isAbsolute:async function(e){return h("plugin:path|is_absolute",{path:e})},join:async function(...e){return h("plugin:path|join",{paths:e})},localDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.LocalData})},normalize:async function(e){return h("plugin:path|normalize",{path:e})},pictureDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Picture})},publicDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Public})},resolve:async function(...e){return h("plugin:path|resolve",{paths:e})},resolveResource:async function(e){return h("plugin:path|resolve_directory",{directory:Z.Resource,path:e})},resourceDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Resource})},runtimeDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Runtime})},sep:function(){return window.__TAURI_INTERNALS__.plugins.path.sep},tempDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Temp})},templateDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Template})},videoDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Video})}});class X extends w{constructor(e,n){super(e),this.id=n}static async getById(e){return h("plugin:tray|get_by_id",{id:e}).then(n=>n?new X(n,e):null)}static async removeById(e){return h("plugin:tray|remove_by_id",{id:e})}static async new(e){(null==e?void 0:e.menu)&&(e.menu=[e.menu.rid,e.menu.kind]),(null==e?void 0:e.icon)&&(e.icon=g(e.icon));const n=new c;if(null==e?void 0:e.action){const t=e.action;n.onmessage=e=>t(function(e){const n=e;return n.position=new I(e.position),n.rect.position=new I(e.rect.position),n.rect.size=new k(e.rect.size),n}(e)),delete e.action}return h("plugin:tray|new",{options:null!=e?e:{},handler:n}).then(([e,n])=>new X(e,n))}async setIcon(e){let n=null;return e&&(n=g(e)),h("plugin:tray|set_icon",{rid:this.rid,icon:n})}async setMenu(e){return e&&(e=[e.rid,e.kind]),h("plugin:tray|set_menu",{rid:this.rid,menu:e})}async setTooltip(e){return h("plugin:tray|set_tooltip",{rid:this.rid,tooltip:e})}async setTitle(e){return h("plugin:tray|set_title",{rid:this.rid,title:e})}async setVisible(e){return h("plugin:tray|set_visible",{rid:this.rid,visible:e})}async setTempDirPath(e){return h("plugin:tray|set_temp_dir_path",{rid:this.rid,path:e})}async setIconAsTemplate(e){return h("plugin:tray|set_icon_as_template",{rid:this.rid,asTemplate:e})}async setMenuOnLeftClick(e){return h("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}async setShowMenuOnLeftClick(e){return h("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}}var ee,ne,te=Object.freeze({__proto__:null,TrayIcon:X});!function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"}(ee||(ee={}));class ie{constructor(e){this._preventDefault=!1,this.event=e.event,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}function re(){return new le(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function se(){return h("plugin:window|get_all_windows").then(e=>e.map(e=>new le(e,{skip:!0})))}!function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"}(ne||(ne={}));const ae=["tauri://created","tauri://error"];class le{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||h("plugin:window|create",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await se()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return re()}static async getAll(){return se()}static async getFocusedWindow(){for(const e of await se())if(await e.isFocused())return e;return null}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Window",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"Window",label:this.label}})}async emit(e,n){if(!ae.includes(e))return C(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!ae.includes(n))return x(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!ae.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async scaleFactor(){return h("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return h("plugin:window|inner_position",{label:this.label}).then(e=>new I(e))}async outerPosition(){return h("plugin:window|outer_position",{label:this.label}).then(e=>new I(e))}async innerSize(){return h("plugin:window|inner_size",{label:this.label}).then(e=>new k(e))}async outerSize(){return h("plugin:window|outer_size",{label:this.label}).then(e=>new k(e))}async isFullscreen(){return h("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return h("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return h("plugin:window|is_maximized",{label:this.label})}async isFocused(){return h("plugin:window|is_focused",{label:this.label})}async isDecorated(){return h("plugin:window|is_decorated",{label:this.label})}async isResizable(){return h("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return h("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return h("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return h("plugin:window|is_closable",{label:this.label})}async isVisible(){return h("plugin:window|is_visible",{label:this.label})}async title(){return h("plugin:window|title",{label:this.label})}async theme(){return h("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return h("plugin:window|is_always_on_top",{label:this.label})}async center(){return h("plugin:window|center",{label:this.label})}async requestUserAttention(e){let n=null;return e&&(n=e===ee.Critical?{type:"Critical"}:{type:"Informational"}),h("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(e){return h("plugin:window|set_resizable",{label:this.label,value:e})}async setEnabled(e){return h("plugin:window|set_enabled",{label:this.label,value:e})}async isEnabled(){return h("plugin:window|is_enabled",{label:this.label})}async setMaximizable(e){return h("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return h("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return h("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return h("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return h("plugin:window|maximize",{label:this.label})}async unmaximize(){return h("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return h("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return h("plugin:window|minimize",{label:this.label})}async unminimize(){return h("plugin:window|unminimize",{label:this.label})}async show(){return h("plugin:window|show",{label:this.label})}async hide(){return h("plugin:window|hide",{label:this.label})}async close(){return h("plugin:window|close",{label:this.label})}async destroy(){return h("plugin:window|destroy",{label:this.label})}async setDecorations(e){return h("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return h("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return h("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return h("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return h("plugin:window|set_always_on_top",{label:this.label,value:e})}async setAlwaysOnBottom(e){return h("plugin:window|set_always_on_bottom",{label:this.label,value:e})}async setContentProtected(e){return h("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){return h("plugin:window|set_size",{label:this.label,value:e instanceof A?e:new A(e)})}async setMinSize(e){return h("plugin:window|set_min_size",{label:this.label,value:e instanceof A?e:e?new A(e):null})}async setMaxSize(e){return h("plugin:window|set_max_size",{label:this.label,value:e instanceof A?e:e?new A(e):null})}async setSizeConstraints(e){function n(e){return e?{Logical:e}:null}return h("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(null==e?void 0:e.minWidth),minHeight:n(null==e?void 0:e.minHeight),maxWidth:n(null==e?void 0:e.maxWidth),maxHeight:n(null==e?void 0:e.maxHeight)}})}async setPosition(e){return h("plugin:window|set_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setFullscreen(e){return h("plugin:window|set_fullscreen",{label:this.label,value:e})}async setSimpleFullscreen(e){return h("plugin:window|set_simple_fullscreen",{label:this.label,value:e})}async setFocus(){return h("plugin:window|set_focus",{label:this.label})}async setFocusable(e){return h("plugin:window|set_focusable",{label:this.label,value:e})}async setIcon(e){return h("plugin:window|set_icon",{label:this.label,value:g(e)})}async setSkipTaskbar(e){return h("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return h("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return h("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return h("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setBackgroundColor(e){return h("plugin:window|set_background_color",{color:e})}async setCursorPosition(e){return h("plugin:window|set_cursor_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setIgnoreCursorEvents(e){return h("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return h("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(e){return h("plugin:window|start_resize_dragging",{label:this.label,value:e})}async setBadgeCount(e){return h("plugin:window|set_badge_count",{label:this.label,value:e})}async setBadgeLabel(e){return h("plugin:window|set_badge_label",{label:this.label,value:e})}async setOverlayIcon(e){return h("plugin:window|set_overlay_icon",{label:this.label,value:e?g(e):void 0})}async setProgressBar(e){return h("plugin:window|set_progress_bar",{label:this.label,value:e})}async setVisibleOnAllWorkspaces(e){return h("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:e})}async setTitleBarStyle(e){return h("plugin:window|set_title_bar_style",{label:this.label,value:e})}async setTheme(e){return h("plugin:window|set_theme",{label:this.label,value:e})}async onResized(e){return this.listen(R.WINDOW_RESIZED,n=>{n.payload=new k(n.payload),e(n)})}async onMoved(e){return this.listen(R.WINDOW_MOVED,n=>{n.payload=new I(n.payload),e(n)})}async onCloseRequested(e){return this.listen(R.WINDOW_CLOSE_REQUESTED,async n=>{const t=new ie(n);await e(t),t.isPreventDefault()||await this.destroy()})}async onDragDropEvent(e){const n=await this.listen(R.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new I(n.payload.position)}})}),t=await this.listen(R.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new I(n.payload.position)}})}),i=await this.listen(R.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new I(n.payload.position)}})}),r=await this.listen(R.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}async onFocusChanged(e){const n=await this.listen(R.WINDOW_FOCUS,n=>{e({...n,payload:!0})}),t=await this.listen(R.WINDOW_BLUR,n=>{e({...n,payload:!1})});return()=>{n(),t()}}async onScaleChanged(e){return this.listen(R.WINDOW_SCALE_FACTOR_CHANGED,e)}async onThemeChanged(e){return this.listen(R.WINDOW_THEME_CHANGED,e)}}var oe,ue,ce,de;function pe(e){return null===e?null:{name:e.name,scaleFactor:e.scaleFactor,position:new I(e.position),size:new k(e.size),workArea:{position:new I(e.workArea.position),size:new k(e.workArea.size)}}}!function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"}(oe||(oe={})),function(e){e.Default="default",e.FluentOverlay="fluentOverlay"}(ue||(ue={})),function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"}(ce||(ce={})),function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"}(de||(de={}));var he=Object.freeze({__proto__:null,CloseRequestedEvent:ie,get Effect(){return ce},get EffectState(){return de},LogicalPosition:T,LogicalSize:v,PhysicalPosition:I,PhysicalSize:k,get ProgressBarStatus(){return ne},get UserAttentionType(){return ee},Window:le,availableMonitors:async function(){return h("plugin:window|available_monitors").then(e=>e.map(pe))},currentMonitor:async function(){return h("plugin:window|current_monitor").then(pe)},cursorPosition:async function(){return h("plugin:window|cursor_position").then(e=>new I(e))},getAllWindows:se,getCurrentWindow:re,monitorFromPoint:async function(e,n){return h("plugin:window|monitor_from_point",{x:e,y:n}).then(pe)},primaryMonitor:async function(){return h("plugin:window|primary_monitor").then(pe)}});function we(){return new ge(re(),window.__TAURI_INTERNALS__.metadata.currentWebview.label,{skip:!0})}async function _e(){return h("plugin:webview|get_all_webviews").then(e=>e.map(e=>new ge(new le(e.windowLabel,{skip:!0}),e.label,{skip:!0})))}const ye=["tauri://created","tauri://error"];class ge{constructor(e,n,t){this.window=e,this.label=n,this.listeners=Object.create(null),(null==t?void 0:t.skip)||h("plugin:webview|create_webview",{windowLabel:e.label,options:{...t,label:n}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await _e()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return we()}static async getAll(){return _e()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Webview",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"Webview",label:this.label}})}async emit(e,n){if(!ye.includes(e))return C(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!ye.includes(n))return x(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!ye.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async position(){return h("plugin:webview|webview_position",{label:this.label}).then(e=>new I(e))}async size(){return h("plugin:webview|webview_size",{label:this.label}).then(e=>new k(e))}async close(){return h("plugin:webview|webview_close",{label:this.label})}async setSize(e){return h("plugin:webview|set_webview_size",{label:this.label,value:e instanceof A?e:new A(e)})}async setPosition(e){return h("plugin:webview|set_webview_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setFocus(){return h("plugin:webview|set_webview_focus",{label:this.label})}async setAutoResize(e){return h("plugin:webview|set_webview_auto_resize",{label:this.label,value:e})}async hide(){return h("plugin:webview|webview_hide",{label:this.label})}async show(){return h("plugin:webview|webview_show",{label:this.label})}async setZoom(e){return h("plugin:webview|set_webview_zoom",{label:this.label,value:e})}async reparent(e){return h("plugin:webview|reparent",{label:this.label,window:"string"==typeof e?e:e.label})}async clearAllBrowsingData(){return h("plugin:webview|clear_all_browsing_data")}async setBackgroundColor(e){return h("plugin:webview|set_webview_background_color",{color:e})}async onDragDropEvent(e){const n=await this.listen(R.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new I(n.payload.position)}})}),t=await this.listen(R.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new I(n.payload.position)}})}),i=await this.listen(R.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new I(n.payload.position)}})}),r=await this.listen(R.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}}var be,me,fe=Object.freeze({__proto__:null,Webview:ge,getAllWebviews:_e,getCurrentWebview:we});function ve(){const e=we();return new Ae(e.label,{skip:!0})}async function ke(){return h("plugin:window|get_all_windows").then(e=>e.map(e=>new Ae(e,{skip:!0})))}class Ae{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||h("plugin:webview|create_webview_window",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;const t=null!==(n=(await ke()).find(n=>n.label===e))&&void 0!==n?n:null;return t?new Ae(t.label,{skip:!0}):null}static getCurrent(){return ve()}static async getAll(){return ke()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async setBackgroundColor(e){return h("plugin:window|set_background_color",{color:e}).then(()=>h("plugin:webview|set_webview_background_color",{color:e}))}}be=Ae,me=[le,ge],(Array.isArray(me)?me:[me]).forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(n=>{var t;"object"==typeof be.prototype&&be.prototype&&n in be.prototype||Object.defineProperty(be.prototype,n,null!==(t=Object.getOwnPropertyDescriptor(e.prototype,n))&&void 0!==t?t:Object.create(null))})});var Te=Object.freeze({__proto__:null,WebviewWindow:Ae,getAllWebviewWindows:ke,getCurrentWebviewWindow:ve});return e.app=f,e.core=_,e.dpi=D,e.event=O,e.image=m,e.menu=J,e.mocks=K,e.path=Y,e.tray=te,e.webview=fe,e.webviewWindow=Te,e.window=he,e}({});window.__TAURI__=__TAURI_IIFE__; +var __TAURI_IIFE__=function(e){"use strict";function n(e,n,t,i){if("a"===t&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof n?e!==n||!i:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===t?i:"a"===t?i.call(e):i?i.value:n.get(e)}function t(e,n,t,i,r){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof n?e!==n||!r:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?r.call(e,t):r?r.value=t:n.set(e,t),t}var i,r,s,a,l;"function"==typeof SuppressedError&&SuppressedError;const o="__TAURI_TO_IPC_KEY__";function u(e,n=!1){return window.__TAURI_INTERNALS__.transformCallback(e,n)}class c{constructor(e){i.set(this,void 0),r.set(this,0),s.set(this,[]),a.set(this,void 0),t(this,i,e||(()=>{}),"f"),this.id=u(e=>{const l=e.index;if("end"in e)return void(l==n(this,r,"f")?this.cleanupCallback():t(this,a,l,"f"));const o=e.message;if(l==n(this,r,"f")){for(n(this,i,"f").call(this,o),t(this,r,n(this,r,"f")+1,"f");n(this,r,"f")in n(this,s,"f");){const e=n(this,s,"f")[n(this,r,"f")];n(this,i,"f").call(this,e),delete n(this,s,"f")[n(this,r,"f")],t(this,r,n(this,r,"f")+1,"f")}n(this,r,"f")===n(this,a,"f")&&this.cleanupCallback()}else n(this,s,"f")[l]=o})}cleanupCallback(){window.__TAURI_INTERNALS__.unregisterCallback(this.id)}set onmessage(e){t(this,i,e,"f")}get onmessage(){return n(this,i,"f")}[(i=new WeakMap,r=new WeakMap,s=new WeakMap,a=new WeakMap,o)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[o]()}}class d{constructor(e,n,t){this.plugin=e,this.event=n,this.channelId=t}async unregister(){return h(`plugin:${this.plugin}|remove_listener`,{event:this.event,channelId:this.channelId})}}async function p(e,n,t){const i=new c(t);try{return await h(`plugin:${e}|register_listener`,{event:n,handler:i}),new d(e,n,i.id)}catch{return await h(`plugin:${e}|registerListener`,{event:n,handler:i}),new d(e,n,i.id)}}async function h(e,n={},t){return window.__TAURI_INTERNALS__.invoke(e,n,t)}class w{get rid(){return n(this,l,"f")}constructor(e){l.set(this,void 0),t(this,l,e,"f")}async close(){return h("plugin:resources|close",{rid:this.rid})}}l=new WeakMap;var _=Object.freeze({__proto__:null,Channel:c,PluginListener:d,Resource:w,SERIALIZE_TO_IPC_FN:o,addPluginListener:p,checkPermissions:async function(e){return h(`plugin:${e}|check_permissions`)},convertFileSrc:function(e,n="asset"){return window.__TAURI_INTERNALS__.convertFileSrc(e,n)},invoke:h,isTauri:function(){return!!(globalThis||window).isTauri},requestPermissions:async function(e){return h(`plugin:${e}|request_permissions`)},transformCallback:u});class y extends w{constructor(e){super(e)}static async new(e,n,t){return h("plugin:image|new",{rgba:g(e),width:n,height:t}).then(e=>new y(e))}static async fromBytes(e){return h("plugin:image|from_bytes",{bytes:g(e)}).then(e=>new y(e))}static async fromPath(e){return h("plugin:image|from_path",{path:e}).then(e=>new y(e))}async rgba(){return h("plugin:image|rgba",{rid:this.rid}).then(e=>new Uint8Array(e))}async size(){return h("plugin:image|size",{rid:this.rid})}}function g(e){return null==e?null:"string"==typeof e?e:e instanceof y?e.rid:e}var b,m=Object.freeze({__proto__:null,Image:y,transformImage:g});!function(e){e.Nsis="nsis",e.Msi="msi",e.Deb="deb",e.Rpm="rpm",e.AppImage="appimage",e.App="app"}(b||(b={}));var f=Object.freeze({__proto__:null,get BundleType(){return b},defaultWindowIcon:async function(){return h("plugin:app|default_window_icon").then(e=>e?new y(e):null)},fetchDataStoreIdentifiers:async function(){return h("plugin:app|fetch_data_store_identifiers")},getBundleType:async function(){return h("plugin:app|bundle_type")},getIdentifier:async function(){return h("plugin:app|identifier")},getName:async function(){return h("plugin:app|name")},getTauriVersion:async function(){return h("plugin:app|tauri_version")},getVersion:async function(){return h("plugin:app|version")},hide:async function(){return h("plugin:app|app_hide")},onBackButtonPress:async function(e){return p("app","back-button",e)},removeDataStore:async function(e){return h("plugin:app|remove_data_store",{uuid:e})},setDockVisibility:async function(e){return h("plugin:app|set_dock_visibility",{visible:e})},setTheme:async function(e){return h("plugin:app|set_app_theme",{theme:e})},show:async function(){return h("plugin:app|app_show")}});class v{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.width=e[0].Logical.width,this.height=e[0].Logical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toPhysical(e){return new k(this.width*e,this.height*e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class k{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.width=e[0].Physical.width,this.height=e[0].Physical.height):(this.width=e[0].width,this.height=e[0].height):(this.width=e[0],this.height=e[1])}toLogical(e){return new v(this.width/e,this.height/e)}[o](){return{width:this.width,height:this.height}}toJSON(){return this[o]()}}class A{constructor(e){this.size=e}toLogical(e){return this.size instanceof v?this.size:this.size.toLogical(e)}toPhysical(e){return this.size instanceof k?this.size:this.size.toPhysical(e)}[o](){return{[`${this.size.type}`]:{width:this.size.width,height:this.size.height}}}toJSON(){return this[o]()}}class T{constructor(...e){this.type="Logical",1===e.length?"Logical"in e[0]?(this.x=e[0].Logical.x,this.y=e[0].Logical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toPhysical(e){return new I(this.x*e,this.y*e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class I{constructor(...e){this.type="Physical",1===e.length?"Physical"in e[0]?(this.x=e[0].Physical.x,this.y=e[0].Physical.y):(this.x=e[0].x,this.y=e[0].y):(this.x=e[0],this.y=e[1])}toLogical(e){return new T(this.x/e,this.y/e)}[o](){return{x:this.x,y:this.y}}toJSON(){return this[o]()}}class E{constructor(e){this.position=e}toLogical(e){return this.position instanceof T?this.position:this.position.toLogical(e)}toPhysical(e){return this.position instanceof I?this.position:this.position.toPhysical(e)}[o](){return{[`${this.position.type}`]:{x:this.position.x,y:this.position.y}}}toJSON(){return this[o]()}}var R,D=Object.freeze({__proto__:null,LogicalPosition:T,LogicalSize:v,PhysicalPosition:I,PhysicalSize:k,Position:E,Size:A});async function S(e,n){window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener(e,n),await h("plugin:event|unlisten",{event:e,eventId:n})}async function N(e,n,t){var i;const r="string"==typeof(null==t?void 0:t.target)?{kind:"AnyLabel",label:t.target}:null!==(i=null==t?void 0:t.target)&&void 0!==i?i:{kind:"Any"};return h("plugin:event|listen",{event:e,target:r,handler:u(n)}).then(n=>async()=>S(e,n))}async function L(e,n,t){return N(e,t=>{S(e,t.id),n(t)},t)}async function C(e,n){await h("plugin:event|emit",{event:e,payload:n})}async function x(e,n,t){const i="string"==typeof e?{kind:"AnyLabel",label:e}:e;await h("plugin:event|emit_to",{target:i,event:n,payload:t})}!function(e){e.WINDOW_RESIZED="tauri://resize",e.WINDOW_MOVED="tauri://move",e.WINDOW_CLOSE_REQUESTED="tauri://close-requested",e.WINDOW_DESTROYED="tauri://destroyed",e.WINDOW_FOCUS="tauri://focus",e.WINDOW_BLUR="tauri://blur",e.WINDOW_SCALE_FACTOR_CHANGED="tauri://scale-change",e.WINDOW_THEME_CHANGED="tauri://theme-changed",e.WINDOW_CREATED="tauri://window-created",e.WEBVIEW_CREATED="tauri://webview-created",e.DRAG_ENTER="tauri://drag-enter",e.DRAG_OVER="tauri://drag-over",e.DRAG_DROP="tauri://drag-drop",e.DRAG_LEAVE="tauri://drag-leave"}(R||(R={}));var P,z,W,O=Object.freeze({__proto__:null,get TauriEvent(){return R},emit:C,emitTo:x,listen:N,once:L});function U(e){var n;if("items"in e)e.items=null===(n=e.items)||void 0===n?void 0:n.map(e=>"rid"in e?e:U(e));else if("action"in e&&e.action){const n=new c;return n.onmessage=e.action,delete e.action,{...e,handler:n}}return e}async function F(e,n){const t=new c;if(n&&"object"==typeof n&&("action"in n&&n.action&&(t.onmessage=n.action,delete n.action),"item"in n&&n.item&&"object"==typeof n.item&&"About"in n.item&&n.item.About&&"object"==typeof n.item.About&&"icon"in n.item.About&&n.item.About.icon&&(n.item.About.icon=g(n.item.About.icon)),"icon"in n&&n.icon&&(n.icon=g(n.icon)),"items"in n&&n.items)){function i(e){var n;return"rid"in e?[e.rid,e.kind]:("item"in e&&"object"==typeof e.item&&(null===(n=e.item.About)||void 0===n?void 0:n.icon)&&(e.item.About.icon=g(e.item.About.icon)),"icon"in e&&e.icon&&(e.icon=g(e.icon)),"items"in e&&e.items&&(e.items=e.items.map(i)),U(e))}n.items=n.items.map(i)}return h("plugin:menu|new",{kind:e,options:n,handler:t})}class M extends w{get id(){return n(this,P,"f")}get kind(){return n(this,z,"f")}constructor(e,n,i){super(e),P.set(this,void 0),z.set(this,void 0),t(this,P,n,"f"),t(this,z,i,"f")}}P=new WeakMap,z=new WeakMap;class B extends M{constructor(e,n){super(e,n,"MenuItem")}static async new(e){return F("MenuItem",e).then(([e,n])=>new B(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}}class V extends M{constructor(e,n){super(e,n,"Check")}static async new(e){return F("Check",e).then(([e,n])=>new V(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async isChecked(){return h("plugin:menu|is_checked",{rid:this.rid})}async setChecked(e){return h("plugin:menu|set_checked",{rid:this.rid,checked:e})}}!function(e){e.Add="Add",e.Advanced="Advanced",e.Bluetooth="Bluetooth",e.Bookmarks="Bookmarks",e.Caution="Caution",e.ColorPanel="ColorPanel",e.ColumnView="ColumnView",e.Computer="Computer",e.EnterFullScreen="EnterFullScreen",e.Everyone="Everyone",e.ExitFullScreen="ExitFullScreen",e.FlowView="FlowView",e.Folder="Folder",e.FolderBurnable="FolderBurnable",e.FolderSmart="FolderSmart",e.FollowLinkFreestanding="FollowLinkFreestanding",e.FontPanel="FontPanel",e.GoLeft="GoLeft",e.GoRight="GoRight",e.Home="Home",e.IChatTheater="IChatTheater",e.IconView="IconView",e.Info="Info",e.InvalidDataFreestanding="InvalidDataFreestanding",e.LeftFacingTriangle="LeftFacingTriangle",e.ListView="ListView",e.LockLocked="LockLocked",e.LockUnlocked="LockUnlocked",e.MenuMixedState="MenuMixedState",e.MenuOnState="MenuOnState",e.MobileMe="MobileMe",e.MultipleDocuments="MultipleDocuments",e.Network="Network",e.Path="Path",e.PreferencesGeneral="PreferencesGeneral",e.QuickLook="QuickLook",e.RefreshFreestanding="RefreshFreestanding",e.Refresh="Refresh",e.Remove="Remove",e.RevealFreestanding="RevealFreestanding",e.RightFacingTriangle="RightFacingTriangle",e.Share="Share",e.Slideshow="Slideshow",e.SmartBadge="SmartBadge",e.StatusAvailable="StatusAvailable",e.StatusNone="StatusNone",e.StatusPartiallyAvailable="StatusPartiallyAvailable",e.StatusUnavailable="StatusUnavailable",e.StopProgressFreestanding="StopProgressFreestanding",e.StopProgress="StopProgress",e.TrashEmpty="TrashEmpty",e.TrashFull="TrashFull",e.User="User",e.UserAccounts="UserAccounts",e.UserGroup="UserGroup",e.UserGuest="UserGuest"}(W||(W={}));class G extends M{constructor(e,n){super(e,n,"Icon")}static async new(e){return F("Icon",e).then(([e,n])=>new G(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async setAccelerator(e){return h("plugin:menu|set_accelerator",{rid:this.rid,kind:this.kind,accelerator:e})}async setIcon(e){return h("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:g(e)})}}class j extends M{constructor(e,n){super(e,n,"Predefined")}static async new(e){return F("Predefined",e).then(([e,n])=>new j(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}}function H([e,n,t]){switch(t){case"Submenu":return new $(e,n);case"Predefined":return new j(e,n);case"Check":return new V(e,n);case"Icon":return new G(e,n);default:return new B(e,n)}}class $ extends M{constructor(e,n){super(e,n,"Submenu")}static async new(e){return F("Submenu",e).then(([e,n])=>new $(e,n))}async text(){return h("plugin:menu|text",{rid:this.rid,kind:this.kind})}async setText(e){return h("plugin:menu|set_text",{rid:this.rid,kind:this.kind,text:e})}async isEnabled(){return h("plugin:menu|is_enabled",{rid:this.rid,kind:this.kind})}async setEnabled(e){return h("plugin:menu|set_enabled",{rid:this.rid,kind:this.kind,enabled:e})}async append(e){return h("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return h("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return h("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return h("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return h("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(H)}async items(){return h("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(H))}async get(e){return h("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?H(e):null)}async popup(e,n){var t;return h("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof E?e:e?new E(e):null})}async setAsWindowsMenuForNSApp(){return h("plugin:menu|set_as_windows_menu_for_nsapp",{rid:this.rid})}async setAsHelpMenuForNSApp(){return h("plugin:menu|set_as_help_menu_for_nsapp",{rid:this.rid})}async setIcon(e){return h("plugin:menu|set_icon",{rid:this.rid,kind:this.kind,icon:g(e)})}}class q extends M{constructor(e,n){super(e,n,"Menu")}static async new(e){return F("Menu",e).then(([e,n])=>new q(e,n))}static async default(){return h("plugin:menu|create_default").then(([e,n])=>new q(e,n))}async append(e){return h("plugin:menu|append",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async prepend(e){return h("plugin:menu|prepend",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e)})}async insert(e,n){return h("plugin:menu|insert",{rid:this.rid,kind:this.kind,items:(Array.isArray(e)?e:[e]).map(e=>"rid"in e?[e.rid,e.kind]:e),position:n})}async remove(e){return h("plugin:menu|remove",{rid:this.rid,kind:this.kind,item:[e.rid,e.kind]})}async removeAt(e){return h("plugin:menu|remove_at",{rid:this.rid,kind:this.kind,position:e}).then(H)}async items(){return h("plugin:menu|items",{rid:this.rid,kind:this.kind}).then(e=>e.map(H))}async get(e){return h("plugin:menu|get",{rid:this.rid,kind:this.kind,id:e}).then(e=>e?H(e):null)}async popup(e,n){var t;return h("plugin:menu|popup",{rid:this.rid,kind:this.kind,window:null!==(t=null==n?void 0:n.label)&&void 0!==t?t:null,at:e instanceof E?e:e?new E(e):null})}async setAsAppMenu(){return h("plugin:menu|set_as_app_menu",{rid:this.rid}).then(e=>e?new q(e[0],e[1]):null)}async setAsWindowMenu(e){var n;return h("plugin:menu|set_as_window_menu",{rid:this.rid,window:null!==(n=null==e?void 0:e.label)&&void 0!==n?n:null}).then(e=>e?new q(e[0],e[1]):null)}}var J=Object.freeze({__proto__:null,CheckMenuItem:V,IconMenuItem:G,Menu:q,MenuItem:B,get NativeIcon(){return W},PredefinedMenuItem:j,Submenu:$,itemFromKind:H});function Q(){var e,n;window.__TAURI_INTERNALS__=null!==(e=window.__TAURI_INTERNALS__)&&void 0!==e?e:{},window.__TAURI_EVENT_PLUGIN_INTERNALS__=null!==(n=window.__TAURI_EVENT_PLUGIN_INTERNALS__)&&void 0!==n?n:{}}var Z,K=Object.freeze({__proto__:null,clearMocks:function(){"object"==typeof window.__TAURI_INTERNALS__&&(delete window.__TAURI_INTERNALS__.invoke,delete window.__TAURI_INTERNALS__.transformCallback,delete window.__TAURI_INTERNALS__.unregisterCallback,delete window.__TAURI_INTERNALS__.runCallback,delete window.__TAURI_INTERNALS__.callbacks,delete window.__TAURI_INTERNALS__.convertFileSrc,delete window.__TAURI_INTERNALS__.metadata,"object"==typeof window.__TAURI_EVENT_PLUGIN_INTERNALS__&&delete window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener)},mockConvertFileSrc:function(e){Q(),window.__TAURI_INTERNALS__.convertFileSrc=function(n,t="asset"){const i=encodeURIComponent(n);return"windows"===e?`http://${t}.localhost/${i}`:`${t}://localhost/${i}`}},mockIPC:function(e,n){function t(e,n){switch(e){case"plugin:event|listen":return function(e){i.has(e.event)||i.set(e.event,[]);return i.get(e.event).push(e.handler),e.handler}(n);case"plugin:event|emit":return function(e){const n=i.get(e.event)||[];for(const t of n)a(t,e);return null}(n);case"plugin:event|unlisten":return function(e){const n=i.get(e.event);if(n){const t=n.indexOf(e.id);-1!==t&&n.splice(t,1)}}(n)}}Q();const i=new Map,r=new Map;function s(e){r.delete(e)}function a(e,n){const t=r.get(e);t?t(n):console.warn(`[TAURI] Couldn't find callback id ${e}. This might happen when the app is reloaded while Rust is running an asynchronous operation.`)}window.__TAURI_INTERNALS__.invoke=async function(i,r,s){return(null==n?void 0:n.shouldMockEvents)&&function(e){return e.startsWith("plugin:event|")}(i)?t(i,r):e(i,r)},window.__TAURI_INTERNALS__.transformCallback=function(e,n=!1){const t=window.crypto.getRandomValues(new Uint32Array(1))[0];return r.set(t,i=>(n&&s(t),e&&e(i))),t},window.__TAURI_INTERNALS__.unregisterCallback=s,window.__TAURI_INTERNALS__.runCallback=a,window.__TAURI_INTERNALS__.callbacks=r,window.__TAURI_EVENT_PLUGIN_INTERNALS__.unregisterListener=function(e,n){s(n)}},mockWindows:function(e,...n){Q(),window.__TAURI_INTERNALS__.metadata={currentWindow:{label:e},currentWebview:{windowLabel:e,label:e}}}});!function(e){e[e.Audio=1]="Audio",e[e.Cache=2]="Cache",e[e.Config=3]="Config",e[e.Data=4]="Data",e[e.LocalData=5]="LocalData",e[e.Document=6]="Document",e[e.Download=7]="Download",e[e.Picture=8]="Picture",e[e.Public=9]="Public",e[e.Video=10]="Video",e[e.Resource=11]="Resource",e[e.Temp=12]="Temp",e[e.AppConfig=13]="AppConfig",e[e.AppData=14]="AppData",e[e.AppLocalData=15]="AppLocalData",e[e.AppCache=16]="AppCache",e[e.AppLog=17]="AppLog",e[e.Desktop=18]="Desktop",e[e.Executable=19]="Executable",e[e.Font=20]="Font",e[e.Home=21]="Home",e[e.Runtime=22]="Runtime",e[e.Template=23]="Template"}(Z||(Z={}));var Y=Object.freeze({__proto__:null,get BaseDirectory(){return Z},appCacheDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppCache})},appConfigDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppConfig})},appDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppData})},appLocalDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppLocalData})},appLogDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.AppLog})},audioDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Audio})},basename:async function(e,n){return h("plugin:path|basename",{path:e,ext:n})},cacheDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Cache})},configDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Config})},dataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Data})},delimiter:function(){return window.__TAURI_INTERNALS__.plugins.path.delimiter},desktopDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Desktop})},dirname:async function(e){return h("plugin:path|dirname",{path:e})},documentDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Document})},downloadDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Download})},executableDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Executable})},extname:async function(e){return h("plugin:path|extname",{path:e})},fontDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Font})},homeDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Home})},isAbsolute:async function(e){return h("plugin:path|is_absolute",{path:e})},join:async function(...e){return h("plugin:path|join",{paths:e})},localDataDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.LocalData})},normalize:async function(e){return h("plugin:path|normalize",{path:e})},pictureDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Picture})},publicDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Public})},resolve:async function(...e){return h("plugin:path|resolve",{paths:e})},resolveResource:async function(e){return h("plugin:path|resolve_directory",{directory:Z.Resource,path:e})},resourceDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Resource})},runtimeDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Runtime})},sep:function(){return window.__TAURI_INTERNALS__.plugins.path.sep},tempDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Temp})},templateDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Template})},videoDir:async function(){return h("plugin:path|resolve_directory",{directory:Z.Video})}});class X extends w{constructor(e,n){super(e),this.id=n}static async getById(e){return h("plugin:tray|get_by_id",{id:e}).then(n=>n?new X(n,e):null)}static async removeById(e){return h("plugin:tray|remove_by_id",{id:e})}static async new(e){(null==e?void 0:e.menu)&&(e.menu=[e.menu.rid,e.menu.kind]),(null==e?void 0:e.icon)&&(e.icon=g(e.icon));const n=new c;if(null==e?void 0:e.action){const t=e.action;n.onmessage=e=>t(function(e){const n=e;return n.position=new I(e.position),n.rect.position=new I(e.rect.position),n.rect.size=new k(e.rect.size),n}(e)),delete e.action}return h("plugin:tray|new",{options:null!=e?e:{},handler:n}).then(([e,n])=>new X(e,n))}async setIcon(e){let n=null;return e&&(n=g(e)),h("plugin:tray|set_icon",{rid:this.rid,icon:n})}async setMenu(e){return e&&(e=[e.rid,e.kind]),h("plugin:tray|set_menu",{rid:this.rid,menu:e})}async setTooltip(e){return h("plugin:tray|set_tooltip",{rid:this.rid,tooltip:e})}async setTitle(e){return h("plugin:tray|set_title",{rid:this.rid,title:e})}async setVisible(e){return h("plugin:tray|set_visible",{rid:this.rid,visible:e})}async setTempDirPath(e){return h("plugin:tray|set_temp_dir_path",{rid:this.rid,path:e})}async setIconAsTemplate(e){return h("plugin:tray|set_icon_as_template",{rid:this.rid,asTemplate:e})}async setMenuOnLeftClick(e){return h("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}async setShowMenuOnLeftClick(e){return h("plugin:tray|set_show_menu_on_left_click",{rid:this.rid,onLeft:e})}}var ee,ne,te=Object.freeze({__proto__:null,TrayIcon:X});!function(e){e[e.Critical=1]="Critical",e[e.Informational=2]="Informational"}(ee||(ee={}));class ie{constructor(e){this._preventDefault=!1,this.event=e.event,this.id=e.id}preventDefault(){this._preventDefault=!0}isPreventDefault(){return this._preventDefault}}function re(){return new le(window.__TAURI_INTERNALS__.metadata.currentWindow.label,{skip:!0})}async function se(){return h("plugin:window|get_all_windows").then(e=>e.map(e=>new le(e,{skip:!0})))}!function(e){e.None="none",e.Normal="normal",e.Indeterminate="indeterminate",e.Paused="paused",e.Error="error"}(ne||(ne={}));const ae=["tauri://created","tauri://error"];class le{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||h("plugin:window|create",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await se()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return re()}static async getAll(){return se()}static async getFocusedWindow(){for(const e of await se())if(await e.isFocused())return e;return null}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Window",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"Window",label:this.label}})}async emit(e,n){if(!ae.includes(e))return C(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!ae.includes(n))return x(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!ae.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async scaleFactor(){return h("plugin:window|scale_factor",{label:this.label})}async innerPosition(){return h("plugin:window|inner_position",{label:this.label}).then(e=>new I(e))}async outerPosition(){return h("plugin:window|outer_position",{label:this.label}).then(e=>new I(e))}async innerSize(){return h("plugin:window|inner_size",{label:this.label}).then(e=>new k(e))}async outerSize(){return h("plugin:window|outer_size",{label:this.label}).then(e=>new k(e))}async isFullscreen(){return h("plugin:window|is_fullscreen",{label:this.label})}async isMinimized(){return h("plugin:window|is_minimized",{label:this.label})}async isMaximized(){return h("plugin:window|is_maximized",{label:this.label})}async isFocused(){return h("plugin:window|is_focused",{label:this.label})}async isDecorated(){return h("plugin:window|is_decorated",{label:this.label})}async isResizable(){return h("plugin:window|is_resizable",{label:this.label})}async isMaximizable(){return h("plugin:window|is_maximizable",{label:this.label})}async isMinimizable(){return h("plugin:window|is_minimizable",{label:this.label})}async isClosable(){return h("plugin:window|is_closable",{label:this.label})}async isVisible(){return h("plugin:window|is_visible",{label:this.label})}async title(){return h("plugin:window|title",{label:this.label})}async theme(){return h("plugin:window|theme",{label:this.label})}async isAlwaysOnTop(){return h("plugin:window|is_always_on_top",{label:this.label})}async center(){return h("plugin:window|center",{label:this.label})}async requestUserAttention(e){let n=null;return e&&(n=e===ee.Critical?{type:"Critical"}:{type:"Informational"}),h("plugin:window|request_user_attention",{label:this.label,value:n})}async setResizable(e){return h("plugin:window|set_resizable",{label:this.label,value:e})}async setEnabled(e){return h("plugin:window|set_enabled",{label:this.label,value:e})}async isEnabled(){return h("plugin:window|is_enabled",{label:this.label})}async setMaximizable(e){return h("plugin:window|set_maximizable",{label:this.label,value:e})}async setMinimizable(e){return h("plugin:window|set_minimizable",{label:this.label,value:e})}async setClosable(e){return h("plugin:window|set_closable",{label:this.label,value:e})}async setTitle(e){return h("plugin:window|set_title",{label:this.label,value:e})}async maximize(){return h("plugin:window|maximize",{label:this.label})}async unmaximize(){return h("plugin:window|unmaximize",{label:this.label})}async toggleMaximize(){return h("plugin:window|toggle_maximize",{label:this.label})}async minimize(){return h("plugin:window|minimize",{label:this.label})}async unminimize(){return h("plugin:window|unminimize",{label:this.label})}async show(){return h("plugin:window|show",{label:this.label})}async hide(){return h("plugin:window|hide",{label:this.label})}async close(){return h("plugin:window|close",{label:this.label})}async destroy(){return h("plugin:window|destroy",{label:this.label})}async setDecorations(e){return h("plugin:window|set_decorations",{label:this.label,value:e})}async setShadow(e){return h("plugin:window|set_shadow",{label:this.label,value:e})}async setEffects(e){return h("plugin:window|set_effects",{label:this.label,value:e})}async clearEffects(){return h("plugin:window|set_effects",{label:this.label,value:null})}async setAlwaysOnTop(e){return h("plugin:window|set_always_on_top",{label:this.label,value:e})}async setAlwaysOnBottom(e){return h("plugin:window|set_always_on_bottom",{label:this.label,value:e})}async setContentProtected(e){return h("plugin:window|set_content_protected",{label:this.label,value:e})}async setSize(e){return h("plugin:window|set_size",{label:this.label,value:e instanceof A?e:new A(e)})}async setMinSize(e){return h("plugin:window|set_min_size",{label:this.label,value:e instanceof A?e:e?new A(e):null})}async setMaxSize(e){return h("plugin:window|set_max_size",{label:this.label,value:e instanceof A?e:e?new A(e):null})}async setSizeConstraints(e){function n(e){return e?{Logical:e}:null}return h("plugin:window|set_size_constraints",{label:this.label,value:{minWidth:n(null==e?void 0:e.minWidth),minHeight:n(null==e?void 0:e.minHeight),maxWidth:n(null==e?void 0:e.maxWidth),maxHeight:n(null==e?void 0:e.maxHeight)}})}async setPosition(e){return h("plugin:window|set_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setFullscreen(e){return h("plugin:window|set_fullscreen",{label:this.label,value:e})}async setSimpleFullscreen(e){return h("plugin:window|set_simple_fullscreen",{label:this.label,value:e})}async setFocus(){return h("plugin:window|set_focus",{label:this.label})}async setFocusable(e){return h("plugin:window|set_focusable",{label:this.label,value:e})}async setIcon(e){return h("plugin:window|set_icon",{label:this.label,value:g(e)})}async setSkipTaskbar(e){return h("plugin:window|set_skip_taskbar",{label:this.label,value:e})}async setCursorGrab(e){return h("plugin:window|set_cursor_grab",{label:this.label,value:e})}async setCursorVisible(e){return h("plugin:window|set_cursor_visible",{label:this.label,value:e})}async setCursorIcon(e){return h("plugin:window|set_cursor_icon",{label:this.label,value:e})}async setBackgroundColor(e){return h("plugin:window|set_background_color",{color:e})}async setCursorPosition(e){return h("plugin:window|set_cursor_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setIgnoreCursorEvents(e){return h("plugin:window|set_ignore_cursor_events",{label:this.label,value:e})}async startDragging(){return h("plugin:window|start_dragging",{label:this.label})}async startResizeDragging(e){return h("plugin:window|start_resize_dragging",{label:this.label,value:e})}async setBadgeCount(e){return h("plugin:window|set_badge_count",{label:this.label,value:e})}async setBadgeLabel(e){return h("plugin:window|set_badge_label",{label:this.label,value:e})}async setOverlayIcon(e){return h("plugin:window|set_overlay_icon",{label:this.label,value:e?g(e):void 0})}async setProgressBar(e){return h("plugin:window|set_progress_bar",{label:this.label,value:e})}async setVisibleOnAllWorkspaces(e){return h("plugin:window|set_visible_on_all_workspaces",{label:this.label,value:e})}async setTitleBarStyle(e){return h("plugin:window|set_title_bar_style",{label:this.label,value:e})}async setTheme(e){return h("plugin:window|set_theme",{label:this.label,value:e})}async onResized(e){return this.listen(R.WINDOW_RESIZED,n=>{n.payload=new k(n.payload),e(n)})}async onMoved(e){return this.listen(R.WINDOW_MOVED,n=>{n.payload=new I(n.payload),e(n)})}async onCloseRequested(e){return this.listen(R.WINDOW_CLOSE_REQUESTED,async n=>{const t=new ie(n);await e(t),t.isPreventDefault()||await this.destroy()})}async onDragDropEvent(e){const n=await this.listen(R.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new I(n.payload.position)}})}),t=await this.listen(R.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new I(n.payload.position)}})}),i=await this.listen(R.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new I(n.payload.position)}})}),r=await this.listen(R.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}async onFocusChanged(e){const n=await this.listen(R.WINDOW_FOCUS,n=>{e({...n,payload:!0})}),t=await this.listen(R.WINDOW_BLUR,n=>{e({...n,payload:!1})});return()=>{n(),t()}}async onScaleChanged(e){return this.listen(R.WINDOW_SCALE_FACTOR_CHANGED,e)}async onThemeChanged(e){return this.listen(R.WINDOW_THEME_CHANGED,e)}}var oe,ue,ce,de;function pe(e){return null===e?null:{name:e.name,scaleFactor:e.scaleFactor,position:new I(e.position),size:new k(e.size),workArea:{position:new I(e.workArea.position),size:new k(e.workArea.size)}}}!function(e){e.Disabled="disabled",e.Throttle="throttle",e.Suspend="suspend"}(oe||(oe={})),function(e){e.Default="default",e.FluentOverlay="fluentOverlay"}(ue||(ue={})),function(e){e.AppearanceBased="appearanceBased",e.Light="light",e.Dark="dark",e.MediumLight="mediumLight",e.UltraDark="ultraDark",e.Titlebar="titlebar",e.Selection="selection",e.Menu="menu",e.Popover="popover",e.Sidebar="sidebar",e.HeaderView="headerView",e.Sheet="sheet",e.WindowBackground="windowBackground",e.HudWindow="hudWindow",e.FullScreenUI="fullScreenUI",e.Tooltip="tooltip",e.ContentBackground="contentBackground",e.UnderWindowBackground="underWindowBackground",e.UnderPageBackground="underPageBackground",e.Mica="mica",e.Blur="blur",e.Acrylic="acrylic",e.Tabbed="tabbed",e.TabbedDark="tabbedDark",e.TabbedLight="tabbedLight"}(ce||(ce={})),function(e){e.FollowsWindowActiveState="followsWindowActiveState",e.Active="active",e.Inactive="inactive"}(de||(de={}));var he=Object.freeze({__proto__:null,CloseRequestedEvent:ie,get Effect(){return ce},get EffectState(){return de},LogicalPosition:T,LogicalSize:v,PhysicalPosition:I,PhysicalSize:k,get ProgressBarStatus(){return ne},get UserAttentionType(){return ee},Window:le,availableMonitors:async function(){return h("plugin:window|available_monitors").then(e=>e.map(pe))},currentMonitor:async function(){return h("plugin:window|current_monitor").then(pe)},cursorPosition:async function(){return h("plugin:window|cursor_position").then(e=>new I(e))},getAllWindows:se,getCurrentWindow:re,monitorFromPoint:async function(e,n){return h("plugin:window|monitor_from_point",{x:e,y:n}).then(pe)},primaryMonitor:async function(){return h("plugin:window|primary_monitor").then(pe)}});function we(){return new ge(re(),window.__TAURI_INTERNALS__.metadata.currentWebview.label,{skip:!0})}async function _e(){return h("plugin:webview|get_all_webviews").then(e=>e.map(e=>new ge(new le(e.windowLabel,{skip:!0}),e.label,{skip:!0})))}const ye=["tauri://created","tauri://error"];class ge{constructor(e,n,t){this.window=e,this.label=n,this.listeners=Object.create(null),(null==t?void 0:t.skip)||h("plugin:webview|create_webview",{windowLabel:e.label,options:{...t,label:n}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;return null!==(n=(await _e()).find(n=>n.label===e))&&void 0!==n?n:null}static getCurrent(){return we()}static async getAll(){return _e()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"Webview",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"Webview",label:this.label}})}async emit(e,n){if(!ye.includes(e))return C(e,n);for(const t of this.listeners[e]||[])t({event:e,id:-1,payload:n})}async emitTo(e,n,t){if(!ye.includes(n))return x(e,n,t);for(const e of this.listeners[n]||[])e({event:n,id:-1,payload:t})}_handleTauriEvent(e,n){return!!ye.includes(e)&&(e in this.listeners?this.listeners[e].push(n):this.listeners[e]=[n],!0)}async position(){return h("plugin:webview|webview_position",{label:this.label}).then(e=>new I(e))}async size(){return h("plugin:webview|webview_size",{label:this.label}).then(e=>new k(e))}async close(){return h("plugin:webview|webview_close",{label:this.label})}async setSize(e){return h("plugin:webview|set_webview_size",{label:this.label,value:e instanceof A?e:new A(e)})}async setPosition(e){return h("plugin:webview|set_webview_position",{label:this.label,value:e instanceof E?e:new E(e)})}async setFocus(){return h("plugin:webview|set_webview_focus",{label:this.label})}async setAutoResize(e){return h("plugin:webview|set_webview_auto_resize",{label:this.label,value:e})}async hide(){return h("plugin:webview|webview_hide",{label:this.label})}async show(){return h("plugin:webview|webview_show",{label:this.label})}async setZoom(e){return h("plugin:webview|set_webview_zoom",{label:this.label,value:e})}async reparent(e){return h("plugin:webview|reparent",{label:this.label,window:"string"==typeof e?e:e.label})}async clearAllBrowsingData(){return h("plugin:webview|clear_all_browsing_data")}async setBackgroundColor(e){return h("plugin:webview|set_webview_background_color",{color:e})}async onDragDropEvent(e){const n=await this.listen(R.DRAG_ENTER,n=>{e({...n,payload:{type:"enter",paths:n.payload.paths,position:new I(n.payload.position)}})}),t=await this.listen(R.DRAG_OVER,n=>{e({...n,payload:{type:"over",position:new I(n.payload.position)}})}),i=await this.listen(R.DRAG_DROP,n=>{e({...n,payload:{type:"drop",paths:n.payload.paths,position:new I(n.payload.position)}})}),r=await this.listen(R.DRAG_LEAVE,n=>{e({...n,payload:{type:"leave"}})});return()=>{n(),i(),t(),r()}}}var be,me,fe=Object.freeze({__proto__:null,Webview:ge,getAllWebviews:_e,getCurrentWebview:we});function ve(){const e=we();return new Ae(e.label,{skip:!0})}async function ke(){return h("plugin:window|get_all_windows").then(e=>e.map(e=>new Ae(e,{skip:!0})))}class Ae{constructor(e,n={}){var t;this.label=e,this.listeners=Object.create(null),(null==n?void 0:n.skip)||h("plugin:webview|create_webview_window",{options:{...n,parent:"string"==typeof n.parent?n.parent:null===(t=n.parent)||void 0===t?void 0:t.label,label:e}}).then(async()=>this.emit("tauri://created")).catch(async e=>this.emit("tauri://error",e))}static async getByLabel(e){var n;const t=null!==(n=(await ke()).find(n=>n.label===e))&&void 0!==n?n:null;return t?new Ae(t.label,{skip:!0}):null}static getCurrent(){return ve()}static async getAll(){return ke()}async listen(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:N(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async once(e,n){return this._handleTauriEvent(e,n)?()=>{const t=this.listeners[e];t.splice(t.indexOf(n),1)}:L(e,n,{target:{kind:"WebviewWindow",label:this.label}})}async setBackgroundColor(e){return h("plugin:window|set_background_color",{color:e}).then(()=>h("plugin:webview|set_webview_background_color",{color:e}))}}be=Ae,me=[le,ge],(Array.isArray(me)?me:[me]).forEach(e=>{Object.getOwnPropertyNames(e.prototype).forEach(n=>{var t;"object"==typeof be.prototype&&be.prototype&&n in be.prototype||Object.defineProperty(be.prototype,n,null!==(t=Object.getOwnPropertyDescriptor(e.prototype,n))&&void 0!==t?t:Object.create(null))})});var Te=Object.freeze({__proto__:null,WebviewWindow:Ae,getAllWebviewWindows:ke,getCurrentWebviewWindow:ve});return e.app=f,e.core=_,e.dpi=D,e.event=O,e.image=m,e.menu=J,e.mocks=K,e.path=Y,e.tray=te,e.webview=fe,e.webviewWindow=Te,e.window=he,e}({});window.__TAURI__=__TAURI_IIFE__; diff --git a/packages/api/src/core.ts b/packages/api/src/core.ts index 30665d796..5e928516d 100644 --- a/packages/api/src/core.ts +++ b/packages/api/src/core.ts @@ -186,16 +186,16 @@ async function addPluginListener( ): Promise { const handler = new Channel(cb) try { - return invoke(`plugin:${plugin}|register_listener`, { + await invoke(`plugin:${plugin}|register_listener`, { event, handler - }).then(() => new PluginListener(plugin, event, handler.id)) + }) + return new PluginListener(plugin, event, handler.id) } catch { // TODO(v3): remove this fallback // note: we must try with camelCase here for backwards compatibility - return invoke(`plugin:${plugin}|registerListener`, { event, handler }).then( - () => new PluginListener(plugin, event, handler.id) - ) + await invoke(`plugin:${plugin}|registerListener`, { event, handler }) + return new PluginListener(plugin, event, handler.id) } } From ce98d87ce0aaa907285852eb80691197424e03c3 Mon Sep 17 00:00:00 2001 From: Tunglies Date: Sun, 16 Nov 2025 19:49:20 +0800 Subject: [PATCH 048/119] refactor: remove needless collect (#14474) Co-authored-by: Fabian-Lars --- .changes/fix-needles-collect.md | 8 ++++++++ crates/tauri-bundler/src/bundle.rs | 5 ++--- crates/tauri-cli/src/icon.rs | 22 +++++++++------------- crates/tauri/src/process.rs | 2 +- 4 files changed, 20 insertions(+), 17 deletions(-) create mode 100644 .changes/fix-needles-collect.md diff --git a/.changes/fix-needles-collect.md b/.changes/fix-needles-collect.md new file mode 100644 index 000000000..f7ffa30f9 --- /dev/null +++ b/.changes/fix-needles-collect.md @@ -0,0 +1,8 @@ +--- +"tauri": patch:perf +"tauri-cli": patch:perf +"tauri-bundler": patch:perf +"@tauri-apps/cli": patch:perf +--- + +refactor: remove needless collect. No user facing changes. diff --git a/crates/tauri-bundler/src/bundle.rs b/crates/tauri-bundler/src/bundle.rs index c5a3acc81..654ad5647 100644 --- a/crates/tauri-bundler/src/bundle.rs +++ b/crates/tauri-bundler/src/bundle.rs @@ -241,11 +241,10 @@ pub fn bundle_project(settings: &Settings) -> crate::Result> { return Ok(bundles); } - let bundles_wo_updater = bundles + let finished_bundles = bundles .iter() .filter(|b| b.package_type != PackageType::Updater) - .collect::>(); - let finished_bundles = bundles_wo_updater.len(); + .count(); let pluralised = if finished_bundles == 1 { "bundle" } else { diff --git a/crates/tauri-cli/src/icon.rs b/crates/tauri-cli/src/icon.rs index ca1783d5d..6228dc97b 100644 --- a/crates/tauri-cli/src/icon.rs +++ b/crates/tauri-cli/src/icon.rs @@ -280,19 +280,15 @@ pub fn command(options: Options) -> Result<()> { android(&source, &input, manifest, &bg_color_string, &out_dir) .context("Failed to generate android icons")?; } else { - for target in png_icon_sizes - .into_iter() - .map(|size| { - let name = format!("{size}x{size}.png"); - let out_path = out_dir.join(&name); - PngEntry { - name, - out_path, - size, - } - }) - .collect::>() - { + for target in png_icon_sizes.into_iter().map(|size| { + let name = format!("{size}x{size}.png"); + let out_path = out_dir.join(&name); + PngEntry { + name, + out_path, + size, + } + }) { log::info!(action = "PNG"; "Creating {}", target.name); resize_and_save_png(&source, target.size, &target.out_path, None, None)?; } diff --git a/crates/tauri/src/process.rs b/crates/tauri/src/process.rs index 76937b1fe..0264b5702 100644 --- a/crates/tauri/src/process.rs +++ b/crates/tauri/src/process.rs @@ -116,7 +116,7 @@ fn restart_macos_app(current_binary: &std::path::Path, env: &Env) { .and_then(|v| v.as_string()) { if let Err(e) = Command::new(macos_directory.join(binary_name)) - .args(env.args_os.iter().skip(1).collect::>()) + .args(env.args_os.iter().skip(1)) .spawn() { log::error!("failed to restart app: {e}"); From b5ef603d84bd8044625e50dcfdabb099b2e9fdd9 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 16 Nov 2025 21:56:05 +0800 Subject: [PATCH 049/119] chore(deps): update NSIS to 3.11 (#14478) --- .changes/nsis-3.11.md | 5 +++++ crates/tauri-bundler/src/bundle/windows/nsis/mod.rs | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 .changes/nsis-3.11.md diff --git a/.changes/nsis-3.11.md b/.changes/nsis-3.11.md new file mode 100644 index 000000000..5d56bae0f --- /dev/null +++ b/.changes/nsis-3.11.md @@ -0,0 +1,5 @@ +--- +"tauri-bundler": patch:deps +--- + +Updated NSIS from 3.8 to 3.11 diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs index f4addc79f..8b2bc4eef 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs @@ -36,9 +36,9 @@ use std::{ // URLS for the NSIS toolchain. #[cfg(target_os = "windows")] const NSIS_URL: &str = - "https://github.com/tauri-apps/binary-releases/releases/download/nsis-3/nsis-3.zip"; + "https://github.com/tauri-apps/binary-releases/releases/download/nsis-3.11/nsis-3.11.zip"; #[cfg(target_os = "windows")] -const NSIS_SHA1: &str = "057e83c7d82462ec394af76c87d06733605543d4"; +const NSIS_SHA1: &str = "EF7FF767E5CBD9EDD22ADD3A32C9B8F4500BB10D"; const NSIS_TAURI_UTILS_URL: &str = "https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.5.2/nsis_tauri_utils.dll"; const NSIS_TAURI_UTILS_SHA1: &str = "D0C502F45DF55C0465C9406088FF016C2E7E6817"; @@ -55,6 +55,9 @@ const NSIS_REQUIRED_FILES: &[&str] = &[ "Include/x64.nsh", "Include/nsDialogs.nsh", "Include/WinMessages.nsh", + "Include/Win/COM.nsh", + "Include/Win/Propkey.nsh", + "Include/Win/RestartManager.nsh", ]; const NSIS_PLUGIN_FILES: &[&str] = &[ "NSISdl.dll", @@ -125,7 +128,7 @@ fn get_and_extract_nsis(nsis_toolset_path: &Path, _tauri_tools_path: &Path) -> c let data = download_and_verify(NSIS_URL, NSIS_SHA1, HashAlgorithm::Sha1)?; log::info!("extracting NSIS"); crate::utils::http_utils::extract_zip(&data, _tauri_tools_path)?; - fs::rename(_tauri_tools_path.join("nsis-3.08"), nsis_toolset_path)?; + fs::rename(_tauri_tools_path.join("nsis-3.11"), nsis_toolset_path)?; } // download additional plugins From ee3cc4a91bf1315ecaefe90f423ffd55ef6c40db Mon Sep 17 00:00:00 2001 From: Tunglies Date: Mon, 17 Nov 2025 22:27:49 +0800 Subject: [PATCH 050/119] perf: remove needless clones in various files for improved performance (#14475) Co-authored-by: Fabian-Lars --- .changes/perf-remove-needless-clone.md | 8 +++++++ crates/tauri-bundler/src/bundle/macos/app.rs | 24 +++++-------------- crates/tauri-bundler/src/bundle/macos/ios.rs | 12 ++++------ crates/tauri-cli/src/acl/permission/ls.rs | 2 +- .../tauri-cli/src/dev/builtin_dev_server.rs | 4 ++-- .../src/helpers/updater_signature.rs | 6 ++--- crates/tauri-cli/src/init.rs | 4 ++-- .../tauri-cli/src/interface/rust/desktop.rs | 2 +- .../tauri-cli/src/interface/rust/manifest.rs | 2 +- .../src/migrate/migrations/v1/manifest.rs | 2 +- .../src/migrate/migrations/v2_beta.rs | 6 ++--- crates/tauri-cli/src/mobile/ios/build.rs | 2 +- crates/tauri-macos-sign/src/lib.rs | 2 +- crates/tauri/src/path/plugin.rs | 4 ++-- 14 files changed, 34 insertions(+), 46 deletions(-) create mode 100644 .changes/perf-remove-needless-clone.md diff --git a/.changes/perf-remove-needless-clone.md b/.changes/perf-remove-needless-clone.md new file mode 100644 index 000000000..3e23288c4 --- /dev/null +++ b/.changes/perf-remove-needless-clone.md @@ -0,0 +1,8 @@ +--- +"tauri-bundler": patch:perf +"tauri-cli": patch:perf +"tauri-macos-sign": patch:perf +"tauri": patch:perf +--- + +perf: remove needless clones in various files for improved performance. No user facing changes. diff --git a/crates/tauri-bundler/src/bundle/macos/app.rs b/crates/tauri-bundler/src/bundle/macos/app.rs index cd7055f30..703973c2b 100644 --- a/crates/tauri-bundler/src/bundle/macos/app.rs +++ b/crates/tauri-bundler/src/bundle/macos/app.rs @@ -65,16 +65,12 @@ pub fn bundle_project(settings: &Settings) -> crate::Result> { log::info!(action = "Bundling"; "{} ({})", app_product_name, app_bundle_path.display()); if app_bundle_path.exists() { - fs::remove_dir_all(&app_bundle_path).fs_context( - "failed to remove old app bundle", - app_bundle_path.to_path_buf(), - )?; + fs::remove_dir_all(&app_bundle_path) + .fs_context("failed to remove old app bundle", &app_bundle_path)?; } let bundle_directory = app_bundle_path.join("Contents"); - fs::create_dir_all(&bundle_directory).fs_context( - "failed to create bundle directory", - bundle_directory.to_path_buf(), - )?; + fs::create_dir_all(&bundle_directory) + .fs_context("failed to create bundle directory", &bundle_directory)?; let resources_dir = bundle_directory.join("Resources"); let bin_dir = bundle_directory.join("MacOS"); @@ -459,20 +455,12 @@ fn copy_frameworks_to_bundle( ) -> crate::Result> { let mut paths = Vec::new(); - let frameworks = settings - .macos() - .frameworks - .as_ref() - .cloned() - .unwrap_or_default(); + let frameworks = settings.macos().frameworks.clone().unwrap_or_default(); if frameworks.is_empty() { return Ok(paths); } let dest_dir = bundle_directory.join("Frameworks"); - fs::create_dir_all(&dest_dir).fs_context( - "failed to create Frameworks directory", - dest_dir.to_path_buf(), - )?; + fs::create_dir_all(&dest_dir).fs_context("failed to create Frameworks directory", &dest_dir)?; for framework in frameworks.iter() { if framework.ends_with(".framework") { let src_path = PathBuf::from(framework); diff --git a/crates/tauri-bundler/src/bundle/macos/ios.rs b/crates/tauri-bundler/src/bundle/macos/ios.rs index e2a028113..ac035127a 100644 --- a/crates/tauri-bundler/src/bundle/macos/ios.rs +++ b/crates/tauri-bundler/src/bundle/macos/ios.rs @@ -44,15 +44,11 @@ pub fn bundle_project(settings: &Settings) -> crate::Result> { log::info!(action = "Bundling"; "{} ({})", app_product_name, app_bundle_path.display()); if app_bundle_path.exists() { - fs::remove_dir_all(&app_bundle_path).fs_context( - "failed to remove old app bundle", - app_bundle_path.to_path_buf(), - )?; + fs::remove_dir_all(&app_bundle_path) + .fs_context("failed to remove old app bundle", &app_bundle_path)?; } - fs::create_dir_all(&app_bundle_path).fs_context( - "failed to create bundle directory", - app_bundle_path.to_path_buf(), - )?; + fs::create_dir_all(&app_bundle_path) + .fs_context("failed to create bundle directory", &app_bundle_path)?; for src in settings.resource_files() { let src = src?; diff --git a/crates/tauri-cli/src/acl/permission/ls.rs b/crates/tauri-cli/src/acl/permission/ls.rs index 7cb7c3d1b..1265c3c24 100644 --- a/crates/tauri-cli/src/acl/permission/ls.rs +++ b/crates/tauri-cli/src/acl/permission/ls.rs @@ -34,7 +34,7 @@ pub fn command(options: Options) -> Result<()> { if acl_manifests_path.exists() { let plugin_manifest_json = read_to_string(&acl_manifests_path) - .fs_context("failed to read plugin manifest", acl_manifests_path.clone())?; + .fs_context("failed to read plugin manifest", acl_manifests_path)?; let acl = serde_json::from_str::>(&plugin_manifest_json) .context("failed to parse plugin manifest as JSON")?; diff --git a/crates/tauri-cli/src/dev/builtin_dev_server.rs b/crates/tauri-cli/src/dev/builtin_dev_server.rs index 067a64f67..1b49058ed 100644 --- a/crates/tauri-cli/src/dev/builtin_dev_server.rs +++ b/crates/tauri-cli/src/dev/builtin_dev_server.rs @@ -155,9 +155,9 @@ fn inject_address(html_bytes: Vec, address: &SocketAddr) -> Vec { } fn fs_read_scoped(path: PathBuf, scope: &Path) -> crate::Result> { - let path = dunce::canonicalize(&path).fs_context("failed to canonicalize path", path.clone())?; + let path = dunce::canonicalize(&path).fs_context("failed to canonicalize path", path)?; if path.starts_with(scope) { - std::fs::read(&path).fs_context("failed to read file", path.clone()) + std::fs::read(&path).fs_context("failed to read file", &path) } else { crate::error::bail!("forbidden path") } diff --git a/crates/tauri-cli/src/helpers/updater_signature.rs b/crates/tauri-cli/src/helpers/updater_signature.rs index 5ec0ebe8a..9367e7bad 100644 --- a/crates/tauri-cli/src/helpers/updater_signature.rs +++ b/crates/tauri-cli/src/helpers/updater_signature.rs @@ -146,10 +146,8 @@ where std::fs::write(&signature_path, encoded_signature.as_bytes()) .fs_context("failed to write signature file", signature_path.clone())?; Ok(( - fs::canonicalize(&signature_path).fs_context( - "failed to canonicalize signature file", - signature_path.clone(), - )?, + fs::canonicalize(&signature_path) + .fs_context("failed to canonicalize signature file", &signature_path)?, signature_box, )) } diff --git a/crates/tauri-cli/src/init.rs b/crates/tauri-cli/src/init.rs index a72137388..a809ba317 100644 --- a/crates/tauri-cli/src/init.rs +++ b/crates/tauri-cli/src/init.rs @@ -78,8 +78,8 @@ impl Options { let package_json_path = PathBuf::from(&self.directory).join("package.json"); let init_defaults = if package_json_path.exists() { - let package_json_text = read_to_string(&package_json_path) - .fs_context("failed to read", package_json_path.clone())?; + let package_json_text = + read_to_string(&package_json_path).fs_context("failed to read", &package_json_path)?; let package_json: crate::PackageJson = serde_json::from_str(&package_json_text).context("failed to parse JSON")?; let (framework, _) = infer_framework(&package_json_text); diff --git a/crates/tauri-cli/src/interface/rust/desktop.rs b/crates/tauri-cli/src/interface/rust/desktop.rs index f5edb4d6e..e747f236b 100644 --- a/crates/tauri-cli/src/interface/rust/desktop.rs +++ b/crates/tauri-cli/src/interface/rust/desktop.rs @@ -335,7 +335,7 @@ fn rename_app( "" }; let new_path = bin_path.with_file_name(format!("{main_binary_name}{extension}")); - fs::rename(&bin_path, &new_path).fs_context("failed to rename app binary", bin_path.clone())?; + fs::rename(&bin_path, &new_path).fs_context("failed to rename app binary", bin_path)?; Ok(new_path) } else { Ok(bin_path) diff --git a/crates/tauri-cli/src/interface/rust/manifest.rs b/crates/tauri-cli/src/interface/rust/manifest.rs index 452aecaaa..03e9768bd 100644 --- a/crates/tauri-cli/src/interface/rust/manifest.rs +++ b/crates/tauri-cli/src/interface/rust/manifest.rs @@ -314,7 +314,7 @@ pub fn rewrite_manifest(config: &Config) -> crate::Result<(Manifest, bool)> { if persist && original_manifest_str != new_manifest_str { std::fs::write(&manifest_path, new_manifest_str) - .fs_context("failed to rewrite Cargo manifest", manifest_path.clone())?; + .fs_context("failed to rewrite Cargo manifest", &manifest_path)?; Ok(( Manifest { inner: manifest, diff --git a/crates/tauri-cli/src/migrate/migrations/v1/manifest.rs b/crates/tauri-cli/src/migrate/migrations/v1/manifest.rs index d4d03f38d..2092651d3 100644 --- a/crates/tauri-cli/src/migrate/migrations/v1/manifest.rs +++ b/crates/tauri-cli/src/migrate/migrations/v1/manifest.rs @@ -21,7 +21,7 @@ pub fn migrate(tauri_dir: &Path) -> Result<()> { migrate_manifest(&mut manifest)?; std::fs::write(&manifest_path, serialize_manifest(&manifest)) - .fs_context("failed to rewrite Cargo manifest", manifest_path.clone())?; + .fs_context("failed to rewrite Cargo manifest", &manifest_path)?; Ok(()) } diff --git a/crates/tauri-cli/src/migrate/migrations/v2_beta.rs b/crates/tauri-cli/src/migrate/migrations/v2_beta.rs index 6910ba116..aad493670 100644 --- a/crates/tauri-cli/src/migrate/migrations/v2_beta.rs +++ b/crates/tauri-cli/src/migrate/migrations/v2_beta.rs @@ -28,10 +28,8 @@ pub fn run() -> Result<()> { migrate_npm_dependencies(frontend_dir)?; - std::fs::write(&manifest_path, serialize_manifest(&manifest)).fs_context( - "failed to rewrite Cargo manifest", - manifest_path.to_path_buf(), - )?; + std::fs::write(&manifest_path, serialize_manifest(&manifest)) + .fs_context("failed to rewrite Cargo manifest", &manifest_path)?; Ok(()) } diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index 9f4aab42c..3f5b2c1a2 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -311,7 +311,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result fn normalize_path(path: &Path) -> PathBuf { let mut components = path.components().peekable(); - let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().cloned() { + let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().copied() { components.next(); PathBuf::from(c.as_os_str()) } else { @@ -47,7 +47,7 @@ fn normalize_path(path: &Path) -> PathBuf { /// fn normalize_path_no_absolute(path: &Path) -> PathBuf { let mut components = path.components().peekable(); - let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().cloned() { + let mut ret = if let Some(c @ Component::Prefix(..)) = components.peek().copied() { components.next(); PathBuf::from(c.as_os_str()) } else { From f855caf8a3830aa5dd6d0b039312866a5d9c3606 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Tue, 18 Nov 2025 18:16:29 +0800 Subject: [PATCH 051/119] fix(cli): mismatched versions check for pnpm (#14481) --- .changes/pnpm-package-version-check.md | 6 ++++++ crates/tauri-cli/src/helpers/npm.rs | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changes/pnpm-package-version-check.md diff --git a/.changes/pnpm-package-version-check.md b/.changes/pnpm-package-version-check.md new file mode 100644 index 000000000..090e64995 --- /dev/null +++ b/.changes/pnpm-package-version-check.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Fixed the mismatched tauri package versions check didn't work for pnpm diff --git a/crates/tauri-cli/src/helpers/npm.rs b/crates/tauri-cli/src/helpers/npm.rs index a39c5ffd0..58df0d443 100644 --- a/crates/tauri-cli/src/helpers/npm.rs +++ b/crates/tauri-cli/src/helpers/npm.rs @@ -332,7 +332,14 @@ impl PackageManager { version: String, } - let json: ListOutput = serde_json::from_str(&stdout).context("failed to parse npm list")?; + let json = if matches!(self, PackageManager::Pnpm) { + serde_json::from_str::>(&stdout) + .ok() + .and_then(|out| out.into_iter().next()) + .context("failed to parse pnpm list")? + } else { + serde_json::from_str::(&stdout).context("failed to parse npm list")? + }; for (package, dependency) in json.dependencies.into_iter().chain(json.dev_dependencies) { let version = dependency.version; if let Ok(version) = semver::Version::parse(&version) { From 79a7d9ec01be1a371b8e923848140fea75e9caed Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Tue, 18 Nov 2025 16:08:17 +0100 Subject: [PATCH 052/119] fix(cli): change Cargo.toml version check to debug log (#14468) --- .changes/version-req-error.md | 5 +++++ crates/tauri-cli/src/info/plugins.rs | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changes/version-req-error.md diff --git a/.changes/version-req-error.md b/.changes/version-req-error.md new file mode 100644 index 000000000..523d6f1c8 --- /dev/null +++ b/.changes/version-req-error.md @@ -0,0 +1,5 @@ +--- +tauri-cli: patch:bug +--- + +Fixed an issue that caused the cli to print errors like `Error Failed to parse version 2 for crate tauri` when there was no `Cargo.lock` file present yet. This will still be logged in `--verbose` mode. diff --git a/crates/tauri-cli/src/info/plugins.rs b/crates/tauri-cli/src/info/plugins.rs index 989abe356..a5080caf1 100644 --- a/crates/tauri-cli/src/info/plugins.rs +++ b/crates/tauri-cli/src/info/plugins.rs @@ -72,7 +72,10 @@ pub fn installed_tauri_packages( crate_version(tauri_dir, manifest.as_ref(), lock.as_ref(), crate_name).version?; let crate_version = semver::Version::parse(&crate_version) .inspect_err(|_| { - log::error!("Failed to parse version `{crate_version}` for crate `{crate_name}`"); + // On first run there's no lockfile yet so we get the version requirement from Cargo.toml. + // In our templates that's `2` which is not a valid semver version but a version requirement. + // log::error confused users so we use log::debug to still be able to see this error if needed. + log::debug!("Failed to parse version `{crate_version}` for crate `{crate_name}`"); }) .ok()?; Some((crate_name.clone(), crate_version)) From afdd288eab7d8473fd6ad2796571a24c4873a8db Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 19 Nov 2025 11:53:13 +0100 Subject: [PATCH 053/119] chore(deps): update js-yaml (#14498) --- .github/CONTRIBUTING.md | 2 - package.json | 2 +- packages/cli/package.json | 2 +- pnpm-lock.yaml | 906 ++++++++++++++++++-------------------- 4 files changed, 434 insertions(+), 478 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 975b6d5ae..f0b35f439 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -33,11 +33,9 @@ Hi! We, the maintainers, are really excited that you are interested in contribut - It's OK to have multiple small commits as you work on the PR - we will let GitHub automatically squash it before merging. - If adding new feature: - - Provide convincing reason to add this feature. Ideally you should open a suggestion issue first and have it greenlighted before working on it. - If fixing a bug: - - If you are resolving a special issue, add `(fix: #xxxx[,#xxx])` (#xxxx is the issue id) in your PR title for a better release log, e.g. `fix: update entities encoding/decoding (fix #3899)`. - Provide detailed description of the bug in the PR, or link to an issue that does. diff --git a/package.json b/package.json index bc5249279..2d55f6313 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "example:api:dev": "pnpm run --filter \"api\" tauri dev" }, "devDependencies": { - "prettier": "^3.5.3" + "prettier": "^3.6.2" }, "minimumReleaseAge": 4320, "packageManager": "pnpm@10.16.0", diff --git a/packages/cli/package.json b/packages/cli/package.json index f6b33fc26..cf9a13172 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -41,7 +41,7 @@ ] }, "devDependencies": { - "@napi-rs/cli": "^3.0.0", + "@napi-rs/cli": "^3.4.1", "@types/node": "^24.0.0", "cross-env": "10.1.0", "vitest": "^4.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b7a85474..4e94cee94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: .: devDependencies: prettier: - specifier: ^3.5.3 - version: 3.5.3 + specifier: ^3.6.2 + version: 3.6.2 crates/tauri-schema-worker: devDependencies: @@ -104,8 +104,8 @@ importers: packages/cli: devDependencies: '@napi-rs/cli': - specifier: ^3.0.0 - version: 3.0.0(@emnapi/runtime@1.4.3)(@types/node@24.10.0) + specifier: ^3.4.1 + version: 3.4.1(@emnapi/runtime@1.7.1)(@types/node@24.10.0) '@types/node': specifier: ^24.0.0 version: 24.10.0 @@ -132,17 +132,17 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@cloudflare/kv-asset-handler@0.4.0': @@ -192,14 +192,14 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -537,8 +537,12 @@ packages: cpu: [x64] os: [win32] - '@inquirer/checkbox@4.1.9': - resolution: {integrity: sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -546,8 +550,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.13': - resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -555,8 +559,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.14': - resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -564,8 +568,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.14': - resolution: {integrity: sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==} + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -573,8 +577,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.16': - resolution: {integrity: sha512-oiDqafWzMtofeJyyGkb1CTPaxUkjIcSxePHHQCfif8t3HV9pHcw1Kgdw3/uGpDvaFfeTluwQtWiqzPVjAqS3zA==} + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -582,12 +586,8 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.12': - resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} - engines: {node: '>=18'} - - '@inquirer/input@4.2.0': - resolution: {integrity: sha512-opqpHPB1NjAmDISi3uvZOTrjEEU5CWVu/HBkDby8t93+6UxYX0Z7Ps0Ltjm5sZiEbWenjubwUkivAEYQmy9xHw==} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -595,8 +595,12 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.16': - resolution: {integrity: sha512-kMrXAaKGavBEoBYUCgualbwA9jWUx2TjMA46ek+pEKy38+LFpL9QHlTd8PO2kWPUgI/KB+qi02o4y2rwXbzr3Q==} + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -604,8 +608,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.16': - resolution: {integrity: sha512-g8BVNBj5Zeb5/Y3cSN+hDUL7CsIFDIuVxb9EPty3lkxBaYpjL5BNRKSYOF9yOLe+JOcKFd+TSVeADQ4iSY7rbg==} + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -613,8 +617,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.6.0': - resolution: {integrity: sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==} + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -622,8 +626,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.4': - resolution: {integrity: sha512-5GGvxVpXXMmfZNtvWw4IsHpR7RzqAR624xtkPd1NxxlV5M+pShMqzL4oRddRkg8rVEOK9fKdJp1jjVML2Lr7TQ==} + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -631,8 +635,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.16': - resolution: {integrity: sha512-POCmXo+j97kTGU6aeRjsPyuCpQQfKcMXdeTMw708ZMtWrj5aykZvlUxH4Qgz3+Y1L/cAVZsSpA+UgZCu2GMOMg==} + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -640,8 +644,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.2.4': - resolution: {integrity: sha512-unTppUcTjmnbl/q+h8XeQDhAqIOmwWYWNyiiP2e3orXrg6tOaa5DHXja9PChCSbChOsktyKgOieRZFnajzxoBg==} + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -649,8 +653,17 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.7': - resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -677,328 +690,337 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@napi-rs/cli@3.0.0': - resolution: {integrity: sha512-V4xSbP4AnS+1POtAGVRhCt0erOTEyLAsZ2+MJOcI1NXCwgsKZGjp8cf/UmVo8e2jUE8tTkyxvnIPCqzVkT3RjQ==} + '@napi-rs/cli@3.4.1': + resolution: {integrity: sha512-ayhm+NfrP5Hmh7vy5pfyYm/ktYtLh2PrgdLuqHTAubO7RoO2JkUE4F991AtgYxNewwXI8+guZLxU8itV7QnDrQ==} engines: {node: '>= 16'} hasBin: true peerDependencies: - '@emnapi/runtime': ^1.1.0 - emnapi: ^1.1.0 + '@emnapi/runtime': ^1.5.0 peerDependenciesMeta: '@emnapi/runtime': optional: true - emnapi: - optional: true - '@napi-rs/cross-toolchain@0.0.19': - resolution: {integrity: sha512-StHXqYANdTaMFqJJ3JXHqKQMylOzOJPcrOCd9Nt2NIGfvfaXK3SzpmNfkJimkOAYfTsfpfuRERsML0bUZCpHBQ==} + '@napi-rs/cross-toolchain@1.0.3': + resolution: {integrity: sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg==} peerDependencies: - '@napi-rs/cross-toolchain-arm64-target-aarch64': ^0.0.19 - '@napi-rs/cross-toolchain-arm64-target-armv7': ^0.0.19 - '@napi-rs/cross-toolchain-arm64-target-x86_64': ^0.0.19 - '@napi-rs/cross-toolchain-x64-target-aarch64': ^0.0.19 - '@napi-rs/cross-toolchain-x64-target-armv7': ^0.0.19 - '@napi-rs/cross-toolchain-x64-target-x86_64': ^0.0.19 + '@napi-rs/cross-toolchain-arm64-target-aarch64': ^1.0.3 + '@napi-rs/cross-toolchain-arm64-target-armv7': ^1.0.3 + '@napi-rs/cross-toolchain-arm64-target-ppc64le': ^1.0.3 + '@napi-rs/cross-toolchain-arm64-target-s390x': ^1.0.3 + '@napi-rs/cross-toolchain-arm64-target-x86_64': ^1.0.3 + '@napi-rs/cross-toolchain-x64-target-aarch64': ^1.0.3 + '@napi-rs/cross-toolchain-x64-target-armv7': ^1.0.3 + '@napi-rs/cross-toolchain-x64-target-ppc64le': ^1.0.3 + '@napi-rs/cross-toolchain-x64-target-s390x': ^1.0.3 + '@napi-rs/cross-toolchain-x64-target-x86_64': ^1.0.3 peerDependenciesMeta: '@napi-rs/cross-toolchain-arm64-target-aarch64': optional: true '@napi-rs/cross-toolchain-arm64-target-armv7': optional: true + '@napi-rs/cross-toolchain-arm64-target-ppc64le': + optional: true + '@napi-rs/cross-toolchain-arm64-target-s390x': + optional: true '@napi-rs/cross-toolchain-arm64-target-x86_64': optional: true '@napi-rs/cross-toolchain-x64-target-aarch64': optional: true '@napi-rs/cross-toolchain-x64-target-armv7': optional: true + '@napi-rs/cross-toolchain-x64-target-ppc64le': + optional: true + '@napi-rs/cross-toolchain-x64-target-s390x': + optional: true '@napi-rs/cross-toolchain-x64-target-x86_64': optional: true - '@napi-rs/lzma-android-arm-eabi@1.4.3': - resolution: {integrity: sha512-XpjRUZ/EbWtVbMvW+ucon5Ykz7PjMoX65mIlUdAiVnaPGykzFAUrl8dl6Br5bfqnhQQfDjjUIgTAwWl3G++n1g==} + '@napi-rs/lzma-android-arm-eabi@1.4.5': + resolution: {integrity: sha512-Up4gpyw2SacmyKWWEib06GhiDdF+H+CCU0LAV8pnM4aJIDqKKd5LHSlBht83Jut6frkB0vwEPmAkv4NjQ5u//Q==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@napi-rs/lzma-android-arm64@1.4.3': - resolution: {integrity: sha512-Bve6BF/4pnlO6HotIgRWgmUT3rbbW/QH471RF/GBA29GfEeUOPEdfQWC7tlzrLYsVFNX2KCWKd+XlxQNz9sRaA==} + '@napi-rs/lzma-android-arm64@1.4.5': + resolution: {integrity: sha512-uwa8sLlWEzkAM0MWyoZJg0JTD3BkPknvejAFG2acUA1raXM8jLrqujWCdOStisXhqQjZ2nDMp3FV6cs//zjfuQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/lzma-darwin-arm64@1.4.3': - resolution: {integrity: sha512-UxTb56kL6pSVTsZ1ShibnqLSwJZLTWtPU5TNYuyIjVNQYAIG8JQ5Yxz35azjwBCK7AjD8pBdpWLYUSyJRGAVAw==} + '@napi-rs/lzma-darwin-arm64@1.4.5': + resolution: {integrity: sha512-0Y0TQLQ2xAjVabrMDem1NhIssOZzF/y/dqetc6OT8mD3xMTDtF8u5BqZoX3MyPc9FzpsZw4ksol+w7DsxHrpMA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/lzma-darwin-x64@1.4.3': - resolution: {integrity: sha512-ps6HiwGKS1P4ottyV2/hVboZ0ugdM1Z1qO9YFpcuKweORfxAkxwJ6S8jOt7G27LQiWiiQHVwsUCODTHDFhOUPQ==} + '@napi-rs/lzma-darwin-x64@1.4.5': + resolution: {integrity: sha512-vR2IUyJY3En+V1wJkwmbGWcYiT8pHloTAWdW4pG24+51GIq+intst6Uf6D/r46citObGZrlX0QvMarOkQeHWpw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/lzma-freebsd-x64@1.4.3': - resolution: {integrity: sha512-W49h41U3+vLnbthbPzvJX1fQtTG+1jyUlfB+wX3oxILvIur06PjJRdMXrFtOZpWkFsihK9gO2DRkQYQJIIgTZw==} + '@napi-rs/lzma-freebsd-x64@1.4.5': + resolution: {integrity: sha512-XpnYQC5SVovO35tF0xGkbHYjsS6kqyNCjuaLQ2dbEblFRr5cAZVvsJ/9h7zj/5FluJPJRDojVNxGyRhTp4z2lw==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@napi-rs/lzma-linux-arm-gnueabihf@1.4.3': - resolution: {integrity: sha512-11PNPiMGuwwxIxd9yPZY3Ek6RFGFRFQb/AtMStJIwlmJ6sM/djEknClLJVbVXbC/nqm7htVZEr+qmYgoDy0fAw==} + '@napi-rs/lzma-linux-arm-gnueabihf@1.4.5': + resolution: {integrity: sha512-ic1ZZMoRfRMwtSwxkyw4zIlbDZGC6davC9r+2oX6x9QiF247BRqqT94qGeL5ZP4Vtz0Hyy7TEViWhx5j6Bpzvw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/lzma-linux-arm64-gnu@1.4.3': - resolution: {integrity: sha512-XzlxZjSXTcrWFHbvvv2xbV5+bSV5IJqCJ8CCksc7xV3uWEAso9yBPJ8VSRD3GPc7ZoBDRqJmgCb/HQzHpLBekw==} + '@napi-rs/lzma-linux-arm64-gnu@1.4.5': + resolution: {integrity: sha512-asEp7FPd7C1Yi6DQb45a3KPHKOFBSfGuJWXcAd4/bL2Fjetb2n/KK2z14yfW8YC/Fv6x3rBM0VAZKmJuz4tysg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/lzma-linux-arm64-musl@1.4.3': - resolution: {integrity: sha512-k4fWiI4Pm61Esj8hnm7NWIbpZueTtP2jlJqmMhTqJyjqW3NUxbTHjSErZOZKIFRF1B3if4v5Tyzo7JL2X+BaSQ==} + '@napi-rs/lzma-linux-arm64-musl@1.4.5': + resolution: {integrity: sha512-yWjcPDgJ2nIL3KNvi4536dlT/CcCWO0DUyEOlBs/SacG7BeD6IjGh6yYzd3/X1Y3JItCbZoDoLUH8iB1lTXo3w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/lzma-linux-ppc64-gnu@1.4.3': - resolution: {integrity: sha512-tTIfk+TYZYbFySxaCMuzp4Zz1T3I6OYVYNAm+IrCSkZDLmUKUzBK3+Su+mT+PjcTNsAiHBa5NVjARXC7b7jmgQ==} + '@napi-rs/lzma-linux-ppc64-gnu@1.4.5': + resolution: {integrity: sha512-0XRhKuIU/9ZjT4WDIG/qnX7Xz7mSQHYZo9Gb3MP2gcvBgr6BA4zywQ9k3gmQaPn9ECE+CZg2V7DV7kT+x2pUMQ==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - '@napi-rs/lzma-linux-riscv64-gnu@1.4.3': - resolution: {integrity: sha512-HPyLYOYhkN7QYaWiKWhSnsLmx/l0pqgiiyaYeycgxCm9dwL8ummFWxveZqYjqdbUUvG7Mgi1jqgRe+55MVdyZQ==} + '@napi-rs/lzma-linux-riscv64-gnu@1.4.5': + resolution: {integrity: sha512-QrqDIPEUUB23GCpyQj/QFyMlr8SGxxyExeZz9OWFnHfb70kXdTLWrHS/hEI1Ru+lSbQ/6xRqeoGyQ4Aqdg+/RA==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - '@napi-rs/lzma-linux-s390x-gnu@1.4.3': - resolution: {integrity: sha512-YkcV+RSZZIMM3D5sPZqvo2Q7/tHXBhgJWBi+6ceo46pTlqgn/nH+pVz+CzsDmLWz5hqNSXyv5IAhOcg2CH6rAg==} + '@napi-rs/lzma-linux-s390x-gnu@1.4.5': + resolution: {integrity: sha512-k8RVM5aMhW86E9H0QXdquwojew4H3SwPxbRVbl49/COJQWCUjGi79X6mYruMnMPEznZinUiT1jgKbFo2A00NdA==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - '@napi-rs/lzma-linux-x64-gnu@1.4.3': - resolution: {integrity: sha512-ep6PLjN1+g4P12Hc7sLRmVpXXaHX22ykqxnOzjXUoj1KTph5XgM4+fUCyE5dsYI+lB4/tXqFuf9ZeFgHk5f00A==} + '@napi-rs/lzma-linux-x64-gnu@1.4.5': + resolution: {integrity: sha512-6rMtBgnIq2Wcl1rQdZsnM+rtCcVCbws1nF8S2NzaUsVaZv8bjrPiAa0lwg4Eqnn1d9lgwqT+cZgm5m+//K08Kw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/lzma-linux-x64-musl@1.4.3': - resolution: {integrity: sha512-QkCO6rVw0Z7eY0ziVc4aCFplbOTMpt0UBLPXWxsPd2lXtkAlRChzqaHOxdcL/HoLmBsqdCxmG0EZuHuAP/vKZQ==} + '@napi-rs/lzma-linux-x64-musl@1.4.5': + resolution: {integrity: sha512-eiadGBKi7Vd0bCArBUOO/qqRYPHt/VQVvGyYvDFt6C2ZSIjlD+HuOl+2oS1sjf4CFjK4eDIog6EdXnL0NE6iyQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/lzma-wasm32-wasi@1.4.3': - resolution: {integrity: sha512-+rMamB0xaeDyVt4OP4cV888cnmso+m78iUebNhGcrL/WXIziwql50KQrmj7PBdBCza/W7XEcraZT8pO8gSDGcg==} + '@napi-rs/lzma-wasm32-wasi@1.4.5': + resolution: {integrity: sha512-+VyHHlr68dvey6fXc2hehw9gHVFIW3TtGF1XkcbAu65qVXsA9D/T+uuoRVqhE+JCyFHFrO0ixRbZDRK1XJt1sA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@napi-rs/lzma-win32-arm64-msvc@1.4.3': - resolution: {integrity: sha512-6gQ+R6ztw11hswdsEu0jsOOXXnJPwhOA1yHRjqfuFemhf6esMd8l9b0uh3BfLBNe7qumtrH4KLrHu8yC9pSY3g==} + '@napi-rs/lzma-win32-arm64-msvc@1.4.5': + resolution: {integrity: sha512-eewnqvIyyhHi3KaZtBOJXohLvwwN27gfS2G/YDWdfHlbz1jrmfeHAmzMsP5qv8vGB+T80TMHNkro4kYjeh6Deg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/lzma-win32-ia32-msvc@1.4.3': - resolution: {integrity: sha512-+AJeJQoGE+QtZKlwM4VzDkfLmUa+6DsGOO5zdbIPlRCB6PEstRCXxp8lkMiQBNgk9f/IO0UEkRcJSZ+Hhqd8zw==} + '@napi-rs/lzma-win32-ia32-msvc@1.4.5': + resolution: {integrity: sha512-OeacFVRCJOKNU/a0ephUfYZ2Yt+NvaHze/4TgOwJ0J0P4P7X1mHzN+ig9Iyd74aQDXYqc7kaCXA2dpAOcH87Cg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@napi-rs/lzma-win32-x64-msvc@1.4.3': - resolution: {integrity: sha512-66dFCX9ACpVUyTTom89nxhllc88yJyjxGFHO0M2olFcrSJArulfbE9kNIATgh04NDAe/l8VsDhnAxWuvJY1GuA==} + '@napi-rs/lzma-win32-x64-msvc@1.4.5': + resolution: {integrity: sha512-T4I1SamdSmtyZgDXGAGP+y5LEK5vxHUFwe8mz6D4R7Sa5/WCxTcCIgPJ9BD7RkpO17lzhlaM2vmVvMy96Lvk9Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/lzma@1.4.3': - resolution: {integrity: sha512-uBjLLoUM9ll03jL/bP7XjyPg0vTU0vQ35N1vVqQHbzlK/fVZyuF2B1p/A6kqPsFFhaoBKgO6oaxsuerv091RtQ==} + '@napi-rs/lzma@1.4.5': + resolution: {integrity: sha512-zS5LuN1OBPAyZpda2ZZgYOEDC+xecUdAGnrvbYzjnLXkrq/OBC3B9qcRvlxbDR3k5H/gVfvef1/jyUqPknqjbg==} engines: {node: '>= 10'} - '@napi-rs/tar-android-arm-eabi@0.1.5': - resolution: {integrity: sha512-FM2qNG3ELeYibnZC8dfsCV4i/pql1nlLKVINfRC7TSwqFfgj5gbezZ0rT8gRPHbLyslVt6m4MPZfRE8Uj/MuCA==} + '@napi-rs/tar-android-arm-eabi@1.1.0': + resolution: {integrity: sha512-h2Ryndraj/YiKgMV/r5by1cDusluYIRT0CaE0/PekQ4u+Wpy2iUVqvzVU98ZPnhXaNeYxEvVJHNGafpOfaD0TA==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@napi-rs/tar-android-arm64@0.1.5': - resolution: {integrity: sha512-OpP0QyD+K0a68nqyko793lLWiC2BN1wWF/Doatus1OCKxgj61vtrUPVO2cQGQS5i07I/+YGRF8lD0tQDrk4JDQ==} + '@napi-rs/tar-android-arm64@1.1.0': + resolution: {integrity: sha512-DJFyQHr1ZxNZorm/gzc1qBNLF/FcKzcH0V0Vwan5P+o0aE2keQIGEjJ09FudkF9v6uOuJjHCVDdK6S6uHtShAw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/tar-darwin-arm64@0.1.5': - resolution: {integrity: sha512-sfyM/9gxFabdMTFt4quvLJuKbXS6StGIUf7Cp3l8aV2WqCURJevdpN6wW8XtGBo/iSnAP52ERwMRdyIavPYruw==} + '@napi-rs/tar-darwin-arm64@1.1.0': + resolution: {integrity: sha512-Zz2sXRzjIX4e532zD6xm2SjXEym6MkvfCvL2RMpG2+UwNVDVscHNcz3d47Pf3sysP2e2af7fBB3TIoK2f6trPw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/tar-darwin-x64@0.1.5': - resolution: {integrity: sha512-NtY8bADKE/3ODBM3hW/RgPeeERJpI6/jgipT3eLJ/CQWY1VJ6t9GHR7anJKhx1oxVdmSfqfCGMolM8WPV9x9bw==} + '@napi-rs/tar-darwin-x64@1.1.0': + resolution: {integrity: sha512-EI+CptIMNweT0ms9S3mkP/q+J6FNZ1Q6pvpJOEcWglRfyfQpLqjlC0O+dptruTPE8VamKYuqdjxfqD8hifZDOA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/tar-freebsd-x64@0.1.5': - resolution: {integrity: sha512-azl0nWrDJAGg25cGVKEY7UtU5ABGz4sQASKvemDLwGbzMDtkJgCoPb+OunI1pezijRAyhiuZEQ4jK8S1qNAWCg==} + '@napi-rs/tar-freebsd-x64@1.1.0': + resolution: {integrity: sha512-J0PIqX+pl6lBIAckL/c87gpodLbjZB1OtIK+RDscKC9NLdpVv6VGOxzUV/fYev/hctcE8EfkLbgFOfpmVQPg2g==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@napi-rs/tar-linux-arm-gnueabihf@0.1.5': - resolution: {integrity: sha512-OjGdKjaW7b0m96rAvsLthMBhwYSSgpTM/WkHqRJo91HCYQ6tHXDBnq4VIQx2FpwT1PoetvRsbSgy0tOc95iYjA==} + '@napi-rs/tar-linux-arm-gnueabihf@1.1.0': + resolution: {integrity: sha512-SLgIQo3f3EjkZ82ZwvrEgFvMdDAhsxCYjyoSuWfHCz0U16qx3SuGCp8+FYOPYCECHN3ZlGjXnoAIt9ERd0dEUg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/tar-linux-arm64-gnu@0.1.5': - resolution: {integrity: sha512-o3b2VE5c7+NFb6XRcXrdXgur1yhpx+XNItFoeJUMBE8z0AGAISf2DJSbcJawmefUvrGtr+iLr61hsr6f2hw+5Q==} + '@napi-rs/tar-linux-arm64-gnu@1.1.0': + resolution: {integrity: sha512-d014cdle52EGaH6GpYTQOP9Py7glMO1zz/+ynJPjjzYFSxvdYx0byrjumZk2UQdIyGZiJO2MEFpCkEEKFSgPYA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/tar-linux-arm64-musl@0.1.5': - resolution: {integrity: sha512-5xTxsoPVqovnZ197CqTc+q3psRM4i+ErdiyfDgkG4nP045jh50gp22WKZuE24dc7/iS+IyUrM3+PRbmj2mzR8g==} + '@napi-rs/tar-linux-arm64-musl@1.1.0': + resolution: {integrity: sha512-L/y1/26q9L/uBqiW/JdOb/Dc94egFvNALUZV2WCGKQXc6UByPBMgdiEyW2dtoYxYYYYc+AKD+jr+wQPcvX2vrQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/tar-linux-ppc64-gnu@0.1.5': - resolution: {integrity: sha512-7FF1u8EkDpCEPCgU0/kvuzsO+opB7eIbsGfKRIbOqrDT7c1DYxDetNTtukPvNoT2kvwfxxThgTfcPADPxdOE/w==} + '@napi-rs/tar-linux-ppc64-gnu@1.1.0': + resolution: {integrity: sha512-EPE1K/80RQvPbLRJDJs1QmCIcH+7WRi0F73+oTe1582y9RtfGRuzAkzeBuAGRXAQEjRQw/RjtNqr6UTJ+8UuWQ==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - '@napi-rs/tar-linux-s390x-gnu@0.1.5': - resolution: {integrity: sha512-uyIZ7OLCLHtVBpogoJUD0GSAF1IUa3d5c5AVUemTLIwYkVgzdEB+khh3i2+/oKObf79ZKfQ8mYxOryHqfx+ulw==} + '@napi-rs/tar-linux-s390x-gnu@1.1.0': + resolution: {integrity: sha512-B2jhWiB1ffw1nQBqLUP1h4+J1ovAxBOoe5N2IqDMOc63fsPZKNqF1PvO/dIem8z7LL4U4bsfmhy3gBfu547oNQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - '@napi-rs/tar-linux-x64-gnu@0.1.5': - resolution: {integrity: sha512-y8pFyVTU6lSYiW2lse6i1Ns9yt9mBkAqPbcJnIjqC7ZqRd61T6g3XZDSrKmsM6ycTfsAqoE5WyyFxBjQN29AOA==} + '@napi-rs/tar-linux-x64-gnu@1.1.0': + resolution: {integrity: sha512-tbZDHnb9617lTnsDMGo/eAMZxnsQFnaRe+MszRqHguKfMwkisc9CCJnks/r1o84u5fECI+J/HOrKXgczq/3Oww==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/tar-linux-x64-musl@0.1.5': - resolution: {integrity: sha512-8phLYc0QX+tqvp34PQHUulZUi4sy/fdg1KgFHiyYExTRRleBB01vM7KSn7Bk9dwH7lannO5D7j4O8OY46Xcr/A==} + '@napi-rs/tar-linux-x64-musl@1.1.0': + resolution: {integrity: sha512-dV6cODlzbO8u6Anmv2N/ilQHq/AWz0xyltuXoLU3yUyXbZcnWYZuB2rL8OBGPmqNcD+x9NdScBNXh7vWN0naSQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/tar-wasm32-wasi@0.1.5': - resolution: {integrity: sha512-OpVWC/bwY0zb6nbQDg6koxeZGb441gXwPkaYVjaK4O0TJjNpRKbokLAMlGFtcc/sVSPjghFL0+enfnLDt/P7og==} + '@napi-rs/tar-wasm32-wasi@1.1.0': + resolution: {integrity: sha512-jIa9nb2HzOrfH0F8QQ9g3WE4aMH5vSI5/1NYVNm9ysCmNjCCtMXCAhlI3WKCdm/DwHf0zLqdrrtDFXODcNaqMw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@napi-rs/tar-win32-arm64-msvc@0.1.5': - resolution: {integrity: sha512-FXwQA2Ib55q98szshvDsitgo2iLW2lTD1Q53e8dPMGobPa2yL5e8IjJDCcMI7XJwBZPl9YjJk7nAb8y20DXF+Q==} + '@napi-rs/tar-win32-arm64-msvc@1.1.0': + resolution: {integrity: sha512-vfpG71OB0ijtjemp3WTdmBKJm9R70KM8vsSExMsIQtV0lVzP07oM1CW6JbNRPXNLhRoue9ofYLiUDk8bE0Hckg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/tar-win32-ia32-msvc@0.1.5': - resolution: {integrity: sha512-XEt58yFslNkwf2yJ+uX5nDNmPAk15Metkx2hVPeH29mOpuG2H8nuS8/42hZ+dQfZf3xABRjyurVMMH9JcgLZIQ==} + '@napi-rs/tar-win32-ia32-msvc@1.1.0': + resolution: {integrity: sha512-hGPyPW60YSpOSgzfy68DLBHgi6HxkAM+L59ZZZPMQ0TOXjQg+p2EW87+TjZfJOkSpbYiEkULwa/f4a2hcVjsqQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@napi-rs/tar-win32-x64-msvc@0.1.5': - resolution: {integrity: sha512-9Rq0Ob4S5NGFwNL3kGQkgrYlObqQgw19QMSZdVuhzZ9sSxn9OSF5cWgZ/n1oMEPWK+u6n9GSN2XbPn4DI7pm7Q==} + '@napi-rs/tar-win32-x64-msvc@1.1.0': + resolution: {integrity: sha512-L6Ed1DxXK9YSCMyvpR8MiNAyKNkQLjsHsHK9E0qnHa8NzLFqzDKhvs5LfnWxM2kJ+F7m/e5n9zPm24kHb3LsVw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/tar@0.1.5': - resolution: {integrity: sha512-skgWKcpjtUqJUk1jwhVl8vXYCXQlFC532KiryU3hQBr6ZIJk0E0qD9FG99hUqtPko8mIMS5HDPO+uSnvHfgRVg==} + '@napi-rs/tar@1.1.0': + resolution: {integrity: sha512-7cmzIu+Vbupriudo7UudoMRH2OA3cTw67vva8MxeoAe5S7vPFI7z0vp0pMXiA25S8IUJefImQ90FeJjl8fjEaQ==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-tools-android-arm-eabi@0.0.3': - resolution: {integrity: sha512-T2tme8w5jZ/ZCjJurqNtKCxYtGoDjW9v2rn1bfI60ewCfkYXNpxrTURdkOib85sz+BcwmOfXn0enbg5W9KohoQ==} + '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': + resolution: {integrity: sha512-lr07E/l571Gft5v4aA1dI8koJEmF1F0UigBbsqg9OWNzg80H3lDPO+auv85y3T/NHE3GirDk7x/D3sLO57vayw==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@napi-rs/wasm-tools-android-arm64@0.0.3': - resolution: {integrity: sha512-siHTjrxxBrvsVty5X2jI5waAyzJpr756GqGVUqxqS2eoTuqYRfgaFNvX8asp9LAagFtOojfD0fZfuvxK7dc4Rw==} + '@napi-rs/wasm-tools-android-arm64@1.0.1': + resolution: {integrity: sha512-WDR7S+aRLV6LtBJAg5fmjKkTZIdrEnnQxgdsb7Cf8pYiMWBHLU+LC49OUVppQ2YSPY0+GeYm9yuZWW3kLjJ7Bg==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/wasm-tools-darwin-arm64@0.0.3': - resolution: {integrity: sha512-0MqsSOYJ4jXcLv/nAInS8nwU+/hL0rSEJo7JXKj3dhkT9UNSj4zfidcOaIb05O9VskJBPmV040+edtWPHXNt2Q==} + '@napi-rs/wasm-tools-darwin-arm64@1.0.1': + resolution: {integrity: sha512-qWTI+EEkiN0oIn/N2gQo7+TVYil+AJ20jjuzD2vATS6uIjVz+Updeqmszi7zq7rdFTLp6Ea3/z4kDKIfZwmR9g==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/wasm-tools-darwin-x64@0.0.3': - resolution: {integrity: sha512-yXAK2mrlBMZZYK/59JRHZu/c683HFpr5ork1cn++fy8gqUBRLbjuq47VDjA7oyLW5SmWqNDhmhjFTDGvfIvcUg==} + '@napi-rs/wasm-tools-darwin-x64@1.0.1': + resolution: {integrity: sha512-bA6hubqtHROR5UI3tToAF/c6TDmaAgF0SWgo4rADHtQ4wdn0JeogvOk50gs2TYVhKPE2ZD2+qqt7oBKB+sxW3A==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/wasm-tools-freebsd-x64@0.0.3': - resolution: {integrity: sha512-K1rne814utBd9Zo9LCggQ5h0TSnzGPzA+sG78Qr7KfFz8XQxEGDRH5wpzXyF1KaKav2RmO6wGMXlasDgIcq7GA==} + '@napi-rs/wasm-tools-freebsd-x64@1.0.1': + resolution: {integrity: sha512-90+KLBkD9hZEjPQW1MDfwSt5J1L46EUKacpCZWyRuL6iIEO5CgWU0V/JnEgFsDOGyyYtiTvHc5bUdUTWd4I9Vg==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.3': - resolution: {integrity: sha512-Yu3gtpvGc2+hcay3SU5MK7EMrGPBq/V4i8mpw/MEYUCzOb7Vd9aL8CryElzlk0SIbktG08VYMdhFFFoJAjlYtg==} + '@napi-rs/wasm-tools-linux-arm64-gnu@1.0.1': + resolution: {integrity: sha512-rG0QlS65x9K/u3HrKafDf8cFKj5wV2JHGfl8abWgKew0GVPyp6vfsDweOwHbWAjcHtp2LHi6JHoW80/MTHm52Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/wasm-tools-linux-arm64-musl@0.0.3': - resolution: {integrity: sha512-XN+sPgEwFw3P47wDvtcQyOoZNghIL8gaiRjEGzprB+kE9N21GkuMbk3kdjiBBJkjqKF25f4fbOvNAY0jQEAO3A==} + '@napi-rs/wasm-tools-linux-arm64-musl@1.0.1': + resolution: {integrity: sha512-jAasbIvjZXCgX0TCuEFQr+4D6Lla/3AAVx2LmDuMjgG4xoIXzjKWl7c4chuaD+TI+prWT0X6LJcdzFT+ROKGHQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@napi-rs/wasm-tools-linux-x64-gnu@0.0.3': - resolution: {integrity: sha512-mfMvMEqn33YtEjIyLPguZ6yDsNtF5zV7mqc99620YDyj2SLa0aI35TNTc7Dm+/hlgqHRKhdudsWGfYc4dBND2Q==} + '@napi-rs/wasm-tools-linux-x64-gnu@1.0.1': + resolution: {integrity: sha512-Plgk5rPqqK2nocBGajkMVbGm010Z7dnUgq0wtnYRZbzWWxwWcXfZMPa8EYxrK4eE8SzpI7VlZP1tdVsdjgGwMw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/wasm-tools-linux-x64-musl@0.0.3': - resolution: {integrity: sha512-KXMsXWGELoN5xgPCoRHbgt5TScSx8BK2GcCHKJ9OPZ2HMfsXbLgS/SNi6vz1CbLMZMLPBY2G6HAk0gzLGyS0mQ==} + '@napi-rs/wasm-tools-linux-x64-musl@1.0.1': + resolution: {integrity: sha512-GW7AzGuWxtQkyHknHWYFdR0CHmW6is8rG2Rf4V6GNmMpmwtXt/ItWYWtBe4zqJWycMNazpfZKSw/BpT7/MVCXQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/wasm-tools-wasm32-wasi@0.0.3': - resolution: {integrity: sha512-v3iMHnAfMteogpbqHTFeLXPeAzL5AhpDJLvZvLXbuRiMsMRL0dn8CbcEnYja2P/Ui6Xlyky6PcaUsepOUTNb7A==} + '@napi-rs/wasm-tools-wasm32-wasi@1.0.1': + resolution: {integrity: sha512-/nQVSTrqSsn7YdAc2R7Ips/tnw5SPUcl3D7QrXCNGPqjbatIspnaexvaOYNyKMU6xPu+pc0BTnKVmqhlJJCPLA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.3': - resolution: {integrity: sha512-HWrg9cW+u+rQKL9XCQILaGGs6mDYdwX9nwcTIvJAjrpGWu8Dp4wz6i66w6YKHqVng1suGYjjr+LH4/1e0tDaAg==} + '@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1': + resolution: {integrity: sha512-PFi7oJIBu5w7Qzh3dwFea3sHRO3pojMsaEnUIy22QvsW+UJfNQwJCryVrpoUt8m4QyZXI+saEq/0r4GwdoHYFQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.3': - resolution: {integrity: sha512-h99hAWvQKhcloyPfPi0IjrvKRToTE9Z4UVXoXZhcjpCGmr3o1qW+1FAupRy/TcVdMjUJNLE/aenml3UPqzQEQw==} + '@napi-rs/wasm-tools-win32-ia32-msvc@1.0.1': + resolution: {integrity: sha512-gXkuYzxQsgkj05Zaq+KQTkHIN83dFAwMcTKa2aQcpYPRImFm2AQzEyLtpXmyCWzJ0F9ZYAOmbSyrNew8/us6bw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@napi-rs/wasm-tools-win32-x64-msvc@0.0.3': - resolution: {integrity: sha512-7/6IpzMi9VGYxLcc9SJyu9ZIdbDwyyb09glVF/2SFEgke9F5H46XzRrAdSoRnjfcq/tdLyHKJbnpCIB257qVYg==} + '@napi-rs/wasm-tools-win32-x64-msvc@1.0.1': + resolution: {integrity: sha512-rEAf05nol3e3eei2sRButmgXP+6ATgm0/38MKhz9Isne82T4rPIMYsCIFj0kOisaGeVwoi2fnm7O9oWp5YVnYQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/wasm-tools@0.0.3': - resolution: {integrity: sha512-p7NT5wnOIwmP0f3KbXlMabeld5dPFsADpHMWJaBodTSmnPE8P4msguxKJLKWquqAS1FY2dsjBZ62K0/hfiqAUg==} + '@napi-rs/wasm-tools@1.0.1': + resolution: {integrity: sha512-enkZYyuCdo+9jneCPE/0fjIta4wWnvVN9hBo2HuiMpRF0q3lzv1J6b/cl7i0mxZUKhBrV3aCKDBQnCOhwKbPmQ==} engines: {node: '>= 10'} '@nodelib/fs.scandir@2.1.5': @@ -1236,8 +1258,8 @@ packages: svelte: ^5.0.0 vite: ^6.3.0 || ^7.0.0 - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -1485,10 +1507,6 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1556,8 +1574,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1623,8 +1641,8 @@ packages: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} @@ -1658,6 +1676,14 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + emnapi@1.7.1: + resolution: {integrity: sha512-wlLK2xFq+T+rCBlY6+lPlFVDEyE93b7hSn9dMrfWBIcPf4ArwUvymvvMnN9M5WWuiryYQe9M+UJrkqw4trdyRA==} + peerDependencies: + node-addon-api: '>= 6.1.0' + peerDependenciesMeta: + node-addon-api: + optional: true + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1668,6 +1694,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-toolkit@1.42.0: + resolution: {integrity: sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==} + esbuild@0.25.4: resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} @@ -1752,10 +1781,6 @@ packages: exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -1796,10 +1821,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -1856,8 +1877,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -1913,8 +1934,8 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true json-buffer@3.0.1: @@ -1951,18 +1972,11 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} @@ -2039,18 +2053,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} @@ -2062,10 +2068,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2107,8 +2109,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true @@ -2273,10 +2275,6 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2301,10 +2299,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - typescript-eslint@8.34.1: resolution: {integrity: sha512-XjS+b6Vg9oT1BaIUfkW3M3LvqZE++rbzAMEHuccCfO/YkP43ha6w3jTEMilQxMF92nVOYCcdjv1ZUhAa1D/0ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2333,10 +2327,6 @@ packages: unenv@2.0.0-rc.17: resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} @@ -2454,9 +2444,6 @@ packages: typescript: optional: true - wasm-sjlj@1.0.6: - resolution: {integrity: sha512-pjaKtLJejlWm6+okPV2X1A6nIsRDD4qeK97eCh8DP8KXi3Nzn/HY01vpHhZHlhDri12eZqipjm8HhdTVw+ATxw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2506,12 +2493,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} - - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} youch@3.3.4: @@ -2539,16 +2522,16 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.4': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 - '@babel/types@7.28.4': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@cloudflare/kv-asset-handler@0.4.0': dependencies: @@ -2579,18 +2562,18 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/core@1.4.5': + '@emnapi/core@1.7.1': dependencies: - '@emnapi/wasi-threads': 1.0.4 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.4': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true @@ -2705,7 +2688,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -2824,7 +2807,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.7.1 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -2833,119 +2816,128 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@inquirer/checkbox@4.1.9(@types/node@24.10.0)': + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.10.0) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.10.0) + yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.10.0 - '@inquirer/confirm@5.1.13(@types/node@24.10.0)': + '@inquirer/confirm@5.1.21(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) optionalDependencies: '@types/node': 24.10.0 - '@inquirer/core@10.1.14(@types/node@24.10.0)': + '@inquirer/core@10.3.2(@types/node@24.10.0)': dependencies: - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.10.0) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.10.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.10.0 - '@inquirer/editor@4.2.14(@types/node@24.10.0)': + '@inquirer/editor@4.2.23(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) - external-editor: 3.1.0 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/external-editor': 1.0.3(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) optionalDependencies: '@types/node': 24.10.0 - '@inquirer/expand@4.0.16(@types/node@24.10.0)': + '@inquirer/expand@4.0.23(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) + yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.10.0 - '@inquirer/figures@1.0.12': {} - - '@inquirer/input@4.2.0(@types/node@24.10.0)': + '@inquirer/external-editor@1.0.3(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) + chardet: 2.1.1 + iconv-lite: 0.7.0 optionalDependencies: '@types/node': 24.10.0 - '@inquirer/number@3.0.16(@types/node@24.10.0)': + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) optionalDependencies: '@types/node': 24.10.0 - '@inquirer/password@4.0.16(@types/node@24.10.0)': + '@inquirer/number@3.0.23(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) - ansi-escapes: 4.3.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) optionalDependencies: '@types/node': 24.10.0 - '@inquirer/prompts@7.6.0(@types/node@24.10.0)': + '@inquirer/password@4.0.23(@types/node@24.10.0)': dependencies: - '@inquirer/checkbox': 4.1.9(@types/node@24.10.0) - '@inquirer/confirm': 5.1.13(@types/node@24.10.0) - '@inquirer/editor': 4.2.14(@types/node@24.10.0) - '@inquirer/expand': 4.0.16(@types/node@24.10.0) - '@inquirer/input': 4.2.0(@types/node@24.10.0) - '@inquirer/number': 3.0.16(@types/node@24.10.0) - '@inquirer/password': 4.0.16(@types/node@24.10.0) - '@inquirer/rawlist': 4.1.4(@types/node@24.10.0) - '@inquirer/search': 3.0.16(@types/node@24.10.0) - '@inquirer/select': 4.2.4(@types/node@24.10.0) + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) optionalDependencies: '@types/node': 24.10.0 - '@inquirer/rawlist@4.1.4(@types/node@24.10.0)': + '@inquirer/prompts@7.10.1(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/type': 3.0.7(@types/node@24.10.0) - yoctocolors-cjs: 2.1.2 + '@inquirer/checkbox': 4.3.2(@types/node@24.10.0) + '@inquirer/confirm': 5.1.21(@types/node@24.10.0) + '@inquirer/editor': 4.2.23(@types/node@24.10.0) + '@inquirer/expand': 4.0.23(@types/node@24.10.0) + '@inquirer/input': 4.3.1(@types/node@24.10.0) + '@inquirer/number': 3.0.23(@types/node@24.10.0) + '@inquirer/password': 4.0.23(@types/node@24.10.0) + '@inquirer/rawlist': 4.1.11(@types/node@24.10.0) + '@inquirer/search': 3.2.2(@types/node@24.10.0) + '@inquirer/select': 4.4.2(@types/node@24.10.0) optionalDependencies: '@types/node': 24.10.0 - '@inquirer/search@3.0.16(@types/node@24.10.0)': + '@inquirer/rawlist@4.1.11(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.10.0) - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/type': 3.0.10(@types/node@24.10.0) + yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.10.0 - '@inquirer/select@4.2.4(@types/node@24.10.0)': + '@inquirer/search@3.2.2(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.1.14(@types/node@24.10.0) - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@24.10.0) - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.10.0) + yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 24.10.0 - '@inquirer/type@3.0.7(@types/node@24.10.0)': + '@inquirer/select@4.4.2(@types/node@24.10.0)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.10.0) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.10.0) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.10.0 + + '@inquirer/type@3.0.10(@types/node@24.10.0)': optionalDependencies: '@types/node': 24.10.0 @@ -2973,246 +2965,250 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/cli@3.0.0(@emnapi/runtime@1.4.3)(@types/node@24.10.0)': + '@napi-rs/cli@3.4.1(@emnapi/runtime@1.7.1)(@types/node@24.10.0)': dependencies: - '@inquirer/prompts': 7.6.0(@types/node@24.10.0) - '@napi-rs/cross-toolchain': 0.0.19 - '@napi-rs/wasm-tools': 0.0.3 + '@inquirer/prompts': 7.10.1(@types/node@24.10.0) + '@napi-rs/cross-toolchain': 1.0.3 + '@napi-rs/wasm-tools': 1.0.1 '@octokit/rest': 22.0.0 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 debug: 4.4.3 - find-up: 7.0.0 - js-yaml: 4.1.0 - lodash-es: 4.17.21 + emnapi: 1.7.1 + es-toolkit: 1.42.0 + js-yaml: 4.1.1 semver: 7.7.2 typanion: 3.14.0 - wasm-sjlj: 1.0.6 optionalDependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.7.1 transitivePeerDependencies: - '@napi-rs/cross-toolchain-arm64-target-aarch64' - '@napi-rs/cross-toolchain-arm64-target-armv7' + - '@napi-rs/cross-toolchain-arm64-target-ppc64le' + - '@napi-rs/cross-toolchain-arm64-target-s390x' - '@napi-rs/cross-toolchain-arm64-target-x86_64' - '@napi-rs/cross-toolchain-x64-target-aarch64' - '@napi-rs/cross-toolchain-x64-target-armv7' + - '@napi-rs/cross-toolchain-x64-target-ppc64le' + - '@napi-rs/cross-toolchain-x64-target-s390x' - '@napi-rs/cross-toolchain-x64-target-x86_64' - '@types/node' + - node-addon-api - supports-color - '@napi-rs/cross-toolchain@0.0.19': + '@napi-rs/cross-toolchain@1.0.3': dependencies: - '@napi-rs/lzma': 1.4.3 - '@napi-rs/tar': 0.1.5 + '@napi-rs/lzma': 1.4.5 + '@napi-rs/tar': 1.1.0 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@napi-rs/lzma-android-arm-eabi@1.4.3': + '@napi-rs/lzma-android-arm-eabi@1.4.5': optional: true - '@napi-rs/lzma-android-arm64@1.4.3': + '@napi-rs/lzma-android-arm64@1.4.5': optional: true - '@napi-rs/lzma-darwin-arm64@1.4.3': + '@napi-rs/lzma-darwin-arm64@1.4.5': optional: true - '@napi-rs/lzma-darwin-x64@1.4.3': + '@napi-rs/lzma-darwin-x64@1.4.5': optional: true - '@napi-rs/lzma-freebsd-x64@1.4.3': + '@napi-rs/lzma-freebsd-x64@1.4.5': optional: true - '@napi-rs/lzma-linux-arm-gnueabihf@1.4.3': + '@napi-rs/lzma-linux-arm-gnueabihf@1.4.5': optional: true - '@napi-rs/lzma-linux-arm64-gnu@1.4.3': + '@napi-rs/lzma-linux-arm64-gnu@1.4.5': optional: true - '@napi-rs/lzma-linux-arm64-musl@1.4.3': + '@napi-rs/lzma-linux-arm64-musl@1.4.5': optional: true - '@napi-rs/lzma-linux-ppc64-gnu@1.4.3': + '@napi-rs/lzma-linux-ppc64-gnu@1.4.5': optional: true - '@napi-rs/lzma-linux-riscv64-gnu@1.4.3': + '@napi-rs/lzma-linux-riscv64-gnu@1.4.5': optional: true - '@napi-rs/lzma-linux-s390x-gnu@1.4.3': + '@napi-rs/lzma-linux-s390x-gnu@1.4.5': optional: true - '@napi-rs/lzma-linux-x64-gnu@1.4.3': + '@napi-rs/lzma-linux-x64-gnu@1.4.5': optional: true - '@napi-rs/lzma-linux-x64-musl@1.4.3': + '@napi-rs/lzma-linux-x64-musl@1.4.5': optional: true - '@napi-rs/lzma-wasm32-wasi@1.4.3': + '@napi-rs/lzma-wasm32-wasi@1.4.5': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@napi-rs/lzma-win32-arm64-msvc@1.4.3': + '@napi-rs/lzma-win32-arm64-msvc@1.4.5': optional: true - '@napi-rs/lzma-win32-ia32-msvc@1.4.3': + '@napi-rs/lzma-win32-ia32-msvc@1.4.5': optional: true - '@napi-rs/lzma-win32-x64-msvc@1.4.3': + '@napi-rs/lzma-win32-x64-msvc@1.4.5': optional: true - '@napi-rs/lzma@1.4.3': + '@napi-rs/lzma@1.4.5': optionalDependencies: - '@napi-rs/lzma-android-arm-eabi': 1.4.3 - '@napi-rs/lzma-android-arm64': 1.4.3 - '@napi-rs/lzma-darwin-arm64': 1.4.3 - '@napi-rs/lzma-darwin-x64': 1.4.3 - '@napi-rs/lzma-freebsd-x64': 1.4.3 - '@napi-rs/lzma-linux-arm-gnueabihf': 1.4.3 - '@napi-rs/lzma-linux-arm64-gnu': 1.4.3 - '@napi-rs/lzma-linux-arm64-musl': 1.4.3 - '@napi-rs/lzma-linux-ppc64-gnu': 1.4.3 - '@napi-rs/lzma-linux-riscv64-gnu': 1.4.3 - '@napi-rs/lzma-linux-s390x-gnu': 1.4.3 - '@napi-rs/lzma-linux-x64-gnu': 1.4.3 - '@napi-rs/lzma-linux-x64-musl': 1.4.3 - '@napi-rs/lzma-wasm32-wasi': 1.4.3 - '@napi-rs/lzma-win32-arm64-msvc': 1.4.3 - '@napi-rs/lzma-win32-ia32-msvc': 1.4.3 - '@napi-rs/lzma-win32-x64-msvc': 1.4.3 + '@napi-rs/lzma-android-arm-eabi': 1.4.5 + '@napi-rs/lzma-android-arm64': 1.4.5 + '@napi-rs/lzma-darwin-arm64': 1.4.5 + '@napi-rs/lzma-darwin-x64': 1.4.5 + '@napi-rs/lzma-freebsd-x64': 1.4.5 + '@napi-rs/lzma-linux-arm-gnueabihf': 1.4.5 + '@napi-rs/lzma-linux-arm64-gnu': 1.4.5 + '@napi-rs/lzma-linux-arm64-musl': 1.4.5 + '@napi-rs/lzma-linux-ppc64-gnu': 1.4.5 + '@napi-rs/lzma-linux-riscv64-gnu': 1.4.5 + '@napi-rs/lzma-linux-s390x-gnu': 1.4.5 + '@napi-rs/lzma-linux-x64-gnu': 1.4.5 + '@napi-rs/lzma-linux-x64-musl': 1.4.5 + '@napi-rs/lzma-wasm32-wasi': 1.4.5 + '@napi-rs/lzma-win32-arm64-msvc': 1.4.5 + '@napi-rs/lzma-win32-ia32-msvc': 1.4.5 + '@napi-rs/lzma-win32-x64-msvc': 1.4.5 - '@napi-rs/tar-android-arm-eabi@0.1.5': + '@napi-rs/tar-android-arm-eabi@1.1.0': optional: true - '@napi-rs/tar-android-arm64@0.1.5': + '@napi-rs/tar-android-arm64@1.1.0': optional: true - '@napi-rs/tar-darwin-arm64@0.1.5': + '@napi-rs/tar-darwin-arm64@1.1.0': optional: true - '@napi-rs/tar-darwin-x64@0.1.5': + '@napi-rs/tar-darwin-x64@1.1.0': optional: true - '@napi-rs/tar-freebsd-x64@0.1.5': + '@napi-rs/tar-freebsd-x64@1.1.0': optional: true - '@napi-rs/tar-linux-arm-gnueabihf@0.1.5': + '@napi-rs/tar-linux-arm-gnueabihf@1.1.0': optional: true - '@napi-rs/tar-linux-arm64-gnu@0.1.5': + '@napi-rs/tar-linux-arm64-gnu@1.1.0': optional: true - '@napi-rs/tar-linux-arm64-musl@0.1.5': + '@napi-rs/tar-linux-arm64-musl@1.1.0': optional: true - '@napi-rs/tar-linux-ppc64-gnu@0.1.5': + '@napi-rs/tar-linux-ppc64-gnu@1.1.0': optional: true - '@napi-rs/tar-linux-s390x-gnu@0.1.5': + '@napi-rs/tar-linux-s390x-gnu@1.1.0': optional: true - '@napi-rs/tar-linux-x64-gnu@0.1.5': + '@napi-rs/tar-linux-x64-gnu@1.1.0': optional: true - '@napi-rs/tar-linux-x64-musl@0.1.5': + '@napi-rs/tar-linux-x64-musl@1.1.0': optional: true - '@napi-rs/tar-wasm32-wasi@0.1.5': + '@napi-rs/tar-wasm32-wasi@1.1.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@napi-rs/tar-win32-arm64-msvc@0.1.5': + '@napi-rs/tar-win32-arm64-msvc@1.1.0': optional: true - '@napi-rs/tar-win32-ia32-msvc@0.1.5': + '@napi-rs/tar-win32-ia32-msvc@1.1.0': optional: true - '@napi-rs/tar-win32-x64-msvc@0.1.5': + '@napi-rs/tar-win32-x64-msvc@1.1.0': optional: true - '@napi-rs/tar@0.1.5': + '@napi-rs/tar@1.1.0': optionalDependencies: - '@napi-rs/tar-android-arm-eabi': 0.1.5 - '@napi-rs/tar-android-arm64': 0.1.5 - '@napi-rs/tar-darwin-arm64': 0.1.5 - '@napi-rs/tar-darwin-x64': 0.1.5 - '@napi-rs/tar-freebsd-x64': 0.1.5 - '@napi-rs/tar-linux-arm-gnueabihf': 0.1.5 - '@napi-rs/tar-linux-arm64-gnu': 0.1.5 - '@napi-rs/tar-linux-arm64-musl': 0.1.5 - '@napi-rs/tar-linux-ppc64-gnu': 0.1.5 - '@napi-rs/tar-linux-s390x-gnu': 0.1.5 - '@napi-rs/tar-linux-x64-gnu': 0.1.5 - '@napi-rs/tar-linux-x64-musl': 0.1.5 - '@napi-rs/tar-wasm32-wasi': 0.1.5 - '@napi-rs/tar-win32-arm64-msvc': 0.1.5 - '@napi-rs/tar-win32-ia32-msvc': 0.1.5 - '@napi-rs/tar-win32-x64-msvc': 0.1.5 + '@napi-rs/tar-android-arm-eabi': 1.1.0 + '@napi-rs/tar-android-arm64': 1.1.0 + '@napi-rs/tar-darwin-arm64': 1.1.0 + '@napi-rs/tar-darwin-x64': 1.1.0 + '@napi-rs/tar-freebsd-x64': 1.1.0 + '@napi-rs/tar-linux-arm-gnueabihf': 1.1.0 + '@napi-rs/tar-linux-arm64-gnu': 1.1.0 + '@napi-rs/tar-linux-arm64-musl': 1.1.0 + '@napi-rs/tar-linux-ppc64-gnu': 1.1.0 + '@napi-rs/tar-linux-s390x-gnu': 1.1.0 + '@napi-rs/tar-linux-x64-gnu': 1.1.0 + '@napi-rs/tar-linux-x64-musl': 1.1.0 + '@napi-rs/tar-wasm32-wasi': 1.1.0 + '@napi-rs/tar-win32-arm64-msvc': 1.1.0 + '@napi-rs/tar-win32-ia32-msvc': 1.1.0 + '@napi-rs/tar-win32-x64-msvc': 1.1.0 - '@napi-rs/wasm-runtime@0.2.12': + '@napi-rs/wasm-runtime@1.0.7': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.10.0 + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-tools-android-arm-eabi@0.0.3': + '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': optional: true - '@napi-rs/wasm-tools-android-arm64@0.0.3': + '@napi-rs/wasm-tools-android-arm64@1.0.1': optional: true - '@napi-rs/wasm-tools-darwin-arm64@0.0.3': + '@napi-rs/wasm-tools-darwin-arm64@1.0.1': optional: true - '@napi-rs/wasm-tools-darwin-x64@0.0.3': + '@napi-rs/wasm-tools-darwin-x64@1.0.1': optional: true - '@napi-rs/wasm-tools-freebsd-x64@0.0.3': + '@napi-rs/wasm-tools-freebsd-x64@1.0.1': optional: true - '@napi-rs/wasm-tools-linux-arm64-gnu@0.0.3': + '@napi-rs/wasm-tools-linux-arm64-gnu@1.0.1': optional: true - '@napi-rs/wasm-tools-linux-arm64-musl@0.0.3': + '@napi-rs/wasm-tools-linux-arm64-musl@1.0.1': optional: true - '@napi-rs/wasm-tools-linux-x64-gnu@0.0.3': + '@napi-rs/wasm-tools-linux-x64-gnu@1.0.1': optional: true - '@napi-rs/wasm-tools-linux-x64-musl@0.0.3': + '@napi-rs/wasm-tools-linux-x64-musl@1.0.1': optional: true - '@napi-rs/wasm-tools-wasm32-wasi@0.0.3': + '@napi-rs/wasm-tools-wasm32-wasi@1.0.1': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@napi-rs/wasm-tools-win32-arm64-msvc@0.0.3': + '@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools-win32-ia32-msvc@0.0.3': + '@napi-rs/wasm-tools-win32-ia32-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools-win32-x64-msvc@0.0.3': + '@napi-rs/wasm-tools-win32-x64-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools@0.0.3': + '@napi-rs/wasm-tools@1.0.1': optionalDependencies: - '@napi-rs/wasm-tools-android-arm-eabi': 0.0.3 - '@napi-rs/wasm-tools-android-arm64': 0.0.3 - '@napi-rs/wasm-tools-darwin-arm64': 0.0.3 - '@napi-rs/wasm-tools-darwin-x64': 0.0.3 - '@napi-rs/wasm-tools-freebsd-x64': 0.0.3 - '@napi-rs/wasm-tools-linux-arm64-gnu': 0.0.3 - '@napi-rs/wasm-tools-linux-arm64-musl': 0.0.3 - '@napi-rs/wasm-tools-linux-x64-gnu': 0.0.3 - '@napi-rs/wasm-tools-linux-x64-musl': 0.0.3 - '@napi-rs/wasm-tools-wasm32-wasi': 0.0.3 - '@napi-rs/wasm-tools-win32-arm64-msvc': 0.0.3 - '@napi-rs/wasm-tools-win32-ia32-msvc': 0.0.3 - '@napi-rs/wasm-tools-win32-x64-msvc': 0.0.3 + '@napi-rs/wasm-tools-android-arm-eabi': 1.0.1 + '@napi-rs/wasm-tools-android-arm64': 1.0.1 + '@napi-rs/wasm-tools-darwin-arm64': 1.0.1 + '@napi-rs/wasm-tools-darwin-x64': 1.0.1 + '@napi-rs/wasm-tools-freebsd-x64': 1.0.1 + '@napi-rs/wasm-tools-linux-arm64-gnu': 1.0.1 + '@napi-rs/wasm-tools-linux-arm64-musl': 1.0.1 + '@napi-rs/wasm-tools-linux-x64-gnu': 1.0.1 + '@napi-rs/wasm-tools-linux-x64-musl': 1.0.1 + '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1 + '@napi-rs/wasm-tools-win32-arm64-msvc': 1.0.1 + '@napi-rs/wasm-tools-win32-ia32-msvc': 1.0.1 + '@napi-rs/wasm-tools-win32-x64-msvc': 1.0.1 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3406,14 +3402,14 @@ snapshots: debug: 4.4.3 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.19 + magic-string: 0.30.21 svelte: 5.35.6 vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) vitefu: 1.1.1(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1)) transitivePeerDependencies: - supports-color - '@tybys/wasm-util@0.10.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true @@ -3549,7 +3545,7 @@ snapshots: chokidar: 3.6.0 colorette: 2.0.20 consola: 3.4.2 - magic-string: 0.30.19 + magic-string: 0.30.21 pathe: 2.0.3 perfect-debounce: 1.0.0 tinyglobby: 0.2.15 @@ -3648,7 +3644,7 @@ snapshots: '@unocss/rule-utils@66.3.3': dependencies: '@unocss/core': 66.3.3 - magic-string: 0.30.19 + magic-string: 0.30.21 '@unocss/transformer-attributify-jsx@66.3.3': dependencies: @@ -3675,7 +3671,7 @@ snapshots: '@unocss/core': 66.3.3 '@unocss/inspector': 66.3.3(vue@3.5.17(typescript@5.8.3)) chokidar: 3.6.0 - magic-string: 0.30.19 + magic-string: 0.30.21 pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.2.4 @@ -3696,7 +3692,7 @@ snapshots: dependencies: '@vitest/spy': 4.0.6 estree-walker: 3.0.3 - magic-string: 0.30.19 + magic-string: 0.30.21 optionalDependencies: vite: 7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1) @@ -3712,7 +3708,7 @@ snapshots: '@vitest/snapshot@4.0.6': dependencies: '@vitest/pretty-format': 4.0.6 - magic-string: 0.30.19 + magic-string: 0.30.21 pathe: 2.0.3 '@vitest/spy@4.0.6': {} @@ -3724,7 +3720,7 @@ snapshots: '@vue/compiler-core@3.5.17': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@vue/shared': 3.5.17 entities: 4.5.0 estree-walker: 2.0.2 @@ -3737,13 +3733,13 @@ snapshots: '@vue/compiler-sfc@3.5.17': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@vue/compiler-core': 3.5.17 '@vue/compiler-dom': 3.5.17 '@vue/compiler-ssr': 3.5.17 '@vue/shared': 3.5.17 estree-walker: 2.0.2 - magic-string: 0.30.19 + magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 @@ -3766,7 +3762,7 @@ snapshots: '@vue/reactivity': 3.5.17 '@vue/runtime-core': 3.5.17 '@vue/shared': 3.5.17 - csstype: 3.1.3 + csstype: 3.2.3 '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': dependencies: @@ -3793,10 +3789,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -3847,7 +3839,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chardet@0.7.0: {} + chardet@2.1.1: {} chokidar@3.6.0: dependencies: @@ -3913,7 +3905,7 @@ snapshots: mdn-data: 2.12.2 source-map-js: 1.2.1 - csstype@3.1.3: {} + csstype@3.2.3: {} data-uri-to-buffer@2.0.2: {} @@ -3933,12 +3925,16 @@ snapshots: duplexer@0.1.2: {} + emnapi@1.7.1: {} + emoji-regex@8.0.0: {} entities@4.5.0: {} es-module-lexer@1.7.0: {} + es-toolkit@1.42.0: {} + esbuild@0.25.4: optionalDependencies: '@esbuild/aix-ppc64': 0.25.4 @@ -4064,12 +4060,6 @@ snapshots: exsolve@1.0.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.2.5 - fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -4107,12 +4097,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - unicorn-magic: 0.1.0 - flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -4158,7 +4142,7 @@ snapshots: dependencies: function-bind: 1.1.2 - iconv-lite@0.4.24: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 @@ -4201,7 +4185,7 @@ snapshots: jiti@2.4.2: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -4236,15 +4220,9 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash-es@4.17.21: {} - lodash.merge@4.6.2: {} - magic-string@0.30.19: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4329,18 +4307,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.1 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - package-manager-detector@1.3.0: {} parent-module@1.0.1: @@ -4349,8 +4319,6 @@ snapshots: path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-key@3.1.1: {} path-parse@1.0.7: {} @@ -4387,7 +4355,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.5.3: {} + prettier@3.6.2: {} printable-characters@1.0.42: {} @@ -4563,7 +4531,7 @@ snapshots: esrap: 2.1.0 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.19 + magic-string: 0.30.21 zimmerframe: 1.1.2 terser@5.43.1: @@ -4586,8 +4554,6 @@ snapshots: tinyrainbow@3.0.3: {} - tmp@0.2.5: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4606,8 +4572,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.21.3: {} - typescript-eslint@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@typescript-eslint/eslint-plugin': 8.34.1(@typescript-eslint/parser@8.34.1(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.29.0(jiti@2.4.2))(typescript@5.8.3) @@ -4643,8 +4607,6 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 - unicorn-magic@0.1.0: {} - universal-user-agent@7.0.3: {} unocss@66.3.3(postcss@8.5.6)(vite@7.1.11(@types/node@24.10.0)(jiti@2.4.2)(terser@5.43.1))(vue@3.5.17(typescript@5.8.3)): @@ -4714,7 +4676,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 - magic-string: 0.30.19 + magic-string: 0.30.21 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.9.0 @@ -4754,8 +4716,6 @@ snapshots: optionalDependencies: typescript: 5.8.3 - wasm-sjlj@1.0.6: {} - which@2.0.2: dependencies: isexe: 2.0.0 @@ -4801,9 +4761,7 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} - - yoctocolors-cjs@2.1.2: {} + yoctocolors-cjs@2.1.3: {} youch@3.3.4: dependencies: From 2d2a1be42953e24c9fd1e78fd7d6f0a2e63da38e Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Thu, 20 Nov 2025 15:02:46 +0100 Subject: [PATCH 054/119] docs(cli): fix formatting of paths --- crates/tauri-cli/ENVIRONMENT_VARIABLES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/tauri-cli/ENVIRONMENT_VARIABLES.md b/crates/tauri-cli/ENVIRONMENT_VARIABLES.md index 40173018f..5a8a18100 100644 --- a/crates/tauri-cli/ENVIRONMENT_VARIABLES.md +++ b/crates/tauri-cli/ENVIRONMENT_VARIABLES.md @@ -33,7 +33,7 @@ These environment variables are inputs to the CLI which may have an equivalent C - See [creating API keys](https://developer.apple.com/documentation/appstoreconnectapi/creating_api_keys_for_app_store_connect_api) for more information. - `API_PRIVATE_KEYS_DIR` — Specify the directory where your AuthKey file is located. See `APPLE_API_KEY`. - `APPLE_API_ISSUER` — Issuer ID. Required if `APPLE_API_KEY` is specified. -- `APPLE_API_KEY_PATH` - path to the API key `.p8` file. If not specified, for macOS apps the bundler searches the following directories in sequence for a private key file with the name of 'AuthKey\_.p8': './private_keys', '~/private_keys', '~/.private_keys', and '~/.appstoreconnect/private_keys'. **For iOS this variable is required**. +- `APPLE_API_KEY_PATH` - path to the API key `.p8` file. If not specified, for macOS apps the bundler searches the following directories in sequence for a private key file with the name of `AuthKey\_.p8`: `./private_keys`, `~/private_keys`, `~/.private_keys`, and `~/.appstoreconnect/private_keys`. **For iOS this variable is required**. - `APPLE_SIGNING_IDENTITY` — The identity used to code sign. Overwrites `tauri.conf.json > bundle > macOS > signingIdentity`. If neither are set, it is inferred from `APPLE_CERTIFICATE` when provided. - `APPLE_PROVIDER_SHORT_NAME` — If your Apple ID is connected to multiple teams, you have to specify the provider short name of the team you want to use to notarize your app. Overwrites `tauri.conf.json > bundle > macOS > providerShortName`. - `APPLE_DEVELOPMENT_TEAM` — The team ID used to code sign on iOS. Overwrites `tauri.conf.json > bundle > iOS > developmentTeam`. Can be found in https://developer.apple.com/account#MembershipDetailsCard. From dd7e59a4956efef291e17295ba08841e9d74e505 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 13:25:01 +0800 Subject: [PATCH 055/119] chore(deps): update dependency rollup to v4.53.3 (#14519) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 0aa4d6c5b..57628957b 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.53.2", + "rollup": "4.53.3", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e94cee94..c0f85ced8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.53.2) + version: 0.4.4(rollup@4.53.3) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.53.2)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.53.3)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.53.2 - version: 4.53.2 + specifier: 4.53.3 + version: 4.53.3 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1125,113 +1125,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.2': - resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.2': - resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.2': - resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.2': - resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.2': - resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.2': - resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': - resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.2': - resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.2': - resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.2': - resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.2': - resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.2': - resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.2': - resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.2': - resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.2': - resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.2': - resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.2': - resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.2': - resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.2': - resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.2': - resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.2': - resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.2': - resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} cpu: [x64] os: [win32] @@ -2151,8 +2151,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.2: - resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3290,95 +3290,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.53.2)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.3)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.53.2 + rollup: 4.53.3 - '@rollup/plugin-typescript@12.3.0(rollup@4.53.2)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.53.3)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.53.2) + '@rollup/pluginutils': 5.2.0(rollup@4.53.3) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.53.2 + rollup: 4.53.3 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.53.2)': + '@rollup/pluginutils@5.2.0(rollup@4.53.3)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.2 + rollup: 4.53.3 - '@rollup/rollup-android-arm-eabi@4.53.2': + '@rollup/rollup-android-arm-eabi@4.53.3': optional: true - '@rollup/rollup-android-arm64@4.53.2': + '@rollup/rollup-android-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-arm64@4.53.2': + '@rollup/rollup-darwin-arm64@4.53.3': optional: true - '@rollup/rollup-darwin-x64@4.53.2': + '@rollup/rollup-darwin-x64@4.53.3': optional: true - '@rollup/rollup-freebsd-arm64@4.53.2': + '@rollup/rollup-freebsd-arm64@4.53.3': optional: true - '@rollup/rollup-freebsd-x64@4.53.2': + '@rollup/rollup-freebsd-x64@4.53.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.2': + '@rollup/rollup-linux-arm-musleabihf@4.53.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.2': + '@rollup/rollup-linux-arm64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.2': + '@rollup/rollup-linux-arm64-musl@4.53.3': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.2': + '@rollup/rollup-linux-loong64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.2': + '@rollup/rollup-linux-ppc64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.2': + '@rollup/rollup-linux-riscv64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.2': + '@rollup/rollup-linux-riscv64-musl@4.53.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.2': + '@rollup/rollup-linux-s390x-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.2': + '@rollup/rollup-linux-x64-gnu@4.53.3': optional: true - '@rollup/rollup-linux-x64-musl@4.53.2': + '@rollup/rollup-linux-x64-musl@4.53.3': optional: true - '@rollup/rollup-openharmony-arm64@4.53.2': + '@rollup/rollup-openharmony-arm64@4.53.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.2': + '@rollup/rollup-win32-arm64-msvc@4.53.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.2': + '@rollup/rollup-win32-ia32-msvc@4.53.3': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.2': + '@rollup/rollup-win32-x64-gnu@4.53.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.2': + '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true '@standard-schema/spec@1.0.0': {} @@ -4385,32 +4385,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.2: + rollup@4.53.3: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.2 - '@rollup/rollup-android-arm64': 4.53.2 - '@rollup/rollup-darwin-arm64': 4.53.2 - '@rollup/rollup-darwin-x64': 4.53.2 - '@rollup/rollup-freebsd-arm64': 4.53.2 - '@rollup/rollup-freebsd-x64': 4.53.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 - '@rollup/rollup-linux-arm-musleabihf': 4.53.2 - '@rollup/rollup-linux-arm64-gnu': 4.53.2 - '@rollup/rollup-linux-arm64-musl': 4.53.2 - '@rollup/rollup-linux-loong64-gnu': 4.53.2 - '@rollup/rollup-linux-ppc64-gnu': 4.53.2 - '@rollup/rollup-linux-riscv64-gnu': 4.53.2 - '@rollup/rollup-linux-riscv64-musl': 4.53.2 - '@rollup/rollup-linux-s390x-gnu': 4.53.2 - '@rollup/rollup-linux-x64-gnu': 4.53.2 - '@rollup/rollup-linux-x64-musl': 4.53.2 - '@rollup/rollup-openharmony-arm64': 4.53.2 - '@rollup/rollup-win32-arm64-msvc': 4.53.2 - '@rollup/rollup-win32-ia32-msvc': 4.53.2 - '@rollup/rollup-win32-x64-gnu': 4.53.2 - '@rollup/rollup-win32-x64-msvc': 4.53.2 + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4652,7 +4652,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.2 + rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From 1573c72402352949d1fd3ca5c6fdbee46fe69fbb Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 26 Nov 2025 11:22:45 +0100 Subject: [PATCH 056/119] fix: remove \\r from schema files on windows (#14561) --- .changes/schema-carriage-return.md | 5 +++++ crates/tauri-utils/src/acl/schema.rs | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changes/schema-carriage-return.md diff --git a/.changes/schema-carriage-return.md b/.changes/schema-carriage-return.md new file mode 100644 index 000000000..44bbf97d2 --- /dev/null +++ b/.changes/schema-carriage-return.md @@ -0,0 +1,5 @@ +--- +tauri-utils: patch:bug +--- + +Fixed an issue that caused schema files to have `\r` characters on Windows. diff --git a/crates/tauri-utils/src/acl/schema.rs b/crates/tauri-utils/src/acl/schema.rs index c1a793fc7..3bb7ecff5 100644 --- a/crates/tauri-utils/src/acl/schema.rs +++ b/crates/tauri-utils/src/acl/schema.rs @@ -317,6 +317,9 @@ pub fn generate_capability_schema( extend_permission_entry_schema(&mut schema, acl); let schema_str = serde_json::to_string_pretty(&schema).unwrap(); + // FIXME: in schemars@v1 this doesn't seem to be necessary anymore. If it is, find a better solution. + let schema_str = schema_str.replace("\\r\\n", "\\n"); + let out_dir = PathBuf::from(CAPABILITIES_SCHEMA_FOLDER_PATH); fs::create_dir_all(&out_dir)?; @@ -389,6 +392,9 @@ pub fn generate_permissions_schema>( let schema_str = serde_json::to_string_pretty(&schema)?; + // FIXME: in schemars@v1 this doesn't seem to be necessary anymore. If it is, find a better solution. + let schema_str = schema_str.replace("\\r\\n", "\\n"); + let out_dir = out_dir.as_ref().join(PERMISSION_SCHEMAS_FOLDER_NAME); fs::create_dir_all(&out_dir).map_err(|e| Error::CreateDir(e, out_dir.clone()))?; From f022b2d1ae57612e39c75782926f2f341d9034a8 Mon Sep 17 00:00:00 2001 From: hrzlgnm Date: Sun, 30 Nov 2025 04:45:43 +0100 Subject: [PATCH 057/119] fix(cli): Skip signing bundles entirely if `--no-sign` is requested (#14582) Closes #14581 --- .changes/fix-no-sign-option.md | 6 ++++++ crates/tauri-cli/src/bundle.rs | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 .changes/fix-no-sign-option.md diff --git a/.changes/fix-no-sign-option.md b/.changes/fix-no-sign-option.md new file mode 100644 index 000000000..71352c5ee --- /dev/null +++ b/.changes/fix-no-sign-option.md @@ -0,0 +1,6 @@ +--- +tauri-cli: patch:bug +--- + +Fixed an issue that caused the cli to error out with missing private key, in case the option `--no-sign` was requested and the `tauri.config` has signing key set and the plugin `tauri-plugin-updater` is used. + diff --git a/crates/tauri-cli/src/bundle.rs b/crates/tauri-cli/src/bundle.rs index e48aee197..890386cd7 100644 --- a/crates/tauri-cli/src/bundle.rs +++ b/crates/tauri-cli/src/bundle.rs @@ -249,6 +249,11 @@ fn sign_updaters( return Ok(()); } + if settings.no_sign() { + log::warn!("Updater signing is skipped due to --no-sign flag."); + return Ok(()); + } + // get the public key let pubkey = &update_settings.pubkey; // check if pubkey points to a file... From 1496145f8222649efeff22b819a96208670bbea1 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Sun, 30 Nov 2025 07:49:33 +0100 Subject: [PATCH 058/119] fix(bundler): typo in 32bit arch (#14585) * fix(bundler): typo in 32bit arch * changefile --- .changes/appimage-32bit.md | 5 +++++ crates/tauri-bundler/src/bundle/linux/appimage/mod.rs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changes/appimage-32bit.md diff --git a/.changes/appimage-32bit.md b/.changes/appimage-32bit.md new file mode 100644 index 000000000..9c4437f29 --- /dev/null +++ b/.changes/appimage-32bit.md @@ -0,0 +1,5 @@ +--- +tauri-bundler: patch:bug +--- + +Fixed an issue that caused the AppImage bundler to fail with 404 errors for 32-bit builds. diff --git a/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs b/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs index 3a3b8bf47..29eb87bee 100644 --- a/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs +++ b/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs @@ -232,7 +232,7 @@ fn prepare_tools(tools_path: &Path, arch: &str, verbose: bool) -> crate::Result< write_and_make_executable(&apprun, &data)?; } - let linuxdeploy_arch = if arch == "i686" { "i383" } else { arch }; + let linuxdeploy_arch = if arch == "i686" { "i386" } else { arch }; let linuxdeploy = tools_path.join(format!("linuxdeploy-{linuxdeploy_arch}.AppImage")); if !linuxdeploy.exists() { let data = download(&format!("https://github.com/tauri-apps/binary-releases/releases/download/linuxdeploy/linuxdeploy-{linuxdeploy_arch}.AppImage"))?; From 4408f72af66c4827799c7fad80e9d9a73a4973a6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 30 Nov 2025 11:22:38 +0100 Subject: [PATCH 059/119] apply version updates (#14467) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../add-plugin-listener-error-handling.md | 5 ---- .changes/appimage-32bit.md | 5 ---- .changes/fix-needles-collect.md | 8 ------ .changes/fix-no-sign-option.md | 6 ---- .changes/nsis-3.11.md | 5 ---- .changes/perf-remove-needless-clone.md | 8 ------ .changes/pnpm-package-version-check.md | 6 ---- .changes/schema-carriage-return.md | 5 ---- .changes/version-req-error.md | 5 ---- Cargo.lock | 28 +++++++++---------- crates/tauri-build/CHANGELOG.md | 7 +++++ crates/tauri-build/Cargo.toml | 6 ++-- crates/tauri-bundler/CHANGELOG.md | 17 +++++++++++ crates/tauri-bundler/Cargo.toml | 6 ++-- crates/tauri-cli/CHANGELOG.md | 19 +++++++++++++ crates/tauri-cli/Cargo.toml | 8 +++--- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-cli/metadata-v2.json | 8 +++--- crates/tauri-codegen/CHANGELOG.md | 6 ++++ crates/tauri-codegen/Cargo.toml | 4 +-- crates/tauri-macos-sign/CHANGELOG.md | 6 ++++ crates/tauri-macos-sign/Cargo.toml | 2 +- crates/tauri-macros/CHANGELOG.md | 7 +++++ crates/tauri-macros/Cargo.toml | 6 ++-- crates/tauri-plugin/CHANGELOG.md | 6 ++++ crates/tauri-plugin/Cargo.toml | 4 +-- crates/tauri-runtime-wry/CHANGELOG.md | 7 +++++ crates/tauri-runtime-wry/Cargo.toml | 6 ++-- crates/tauri-runtime/CHANGELOG.md | 6 ++++ crates/tauri-runtime/Cargo.toml | 4 +-- .../schemas/config.schema.json | 2 +- crates/tauri-utils/CHANGELOG.md | 6 ++++ crates/tauri-utils/Cargo.toml | 2 +- crates/tauri/CHANGELOG.md | 15 ++++++++++ crates/tauri/Cargo.toml | 14 +++++----- packages/api/CHANGELOG.md | 6 ++++ packages/api/package.json | 2 +- packages/cli/CHANGELOG.md | 14 ++++++++++ packages/cli/package.json | 2 +- 39 files changed, 175 insertions(+), 106 deletions(-) delete mode 100644 .changes/add-plugin-listener-error-handling.md delete mode 100644 .changes/appimage-32bit.md delete mode 100644 .changes/fix-needles-collect.md delete mode 100644 .changes/fix-no-sign-option.md delete mode 100644 .changes/nsis-3.11.md delete mode 100644 .changes/perf-remove-needless-clone.md delete mode 100644 .changes/pnpm-package-version-check.md delete mode 100644 .changes/schema-carriage-return.md delete mode 100644 .changes/version-req-error.md diff --git a/.changes/add-plugin-listener-error-handling.md b/.changes/add-plugin-listener-error-handling.md deleted file mode 100644 index 38474f02a..000000000 --- a/.changes/add-plugin-listener-error-handling.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@tauri-apps/api": patch:bug ---- - -Fix `addPluginListener` fallback added in https://github.com/tauri-apps/tauri/pull/14132 didn't work properly diff --git a/.changes/appimage-32bit.md b/.changes/appimage-32bit.md deleted file mode 100644 index 9c4437f29..000000000 --- a/.changes/appimage-32bit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-bundler: patch:bug ---- - -Fixed an issue that caused the AppImage bundler to fail with 404 errors for 32-bit builds. diff --git a/.changes/fix-needles-collect.md b/.changes/fix-needles-collect.md deleted file mode 100644 index f7ffa30f9..000000000 --- a/.changes/fix-needles-collect.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"tauri": patch:perf -"tauri-cli": patch:perf -"tauri-bundler": patch:perf -"@tauri-apps/cli": patch:perf ---- - -refactor: remove needless collect. No user facing changes. diff --git a/.changes/fix-no-sign-option.md b/.changes/fix-no-sign-option.md deleted file mode 100644 index 71352c5ee..000000000 --- a/.changes/fix-no-sign-option.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tauri-cli: patch:bug ---- - -Fixed an issue that caused the cli to error out with missing private key, in case the option `--no-sign` was requested and the `tauri.config` has signing key set and the plugin `tauri-plugin-updater` is used. - diff --git a/.changes/nsis-3.11.md b/.changes/nsis-3.11.md deleted file mode 100644 index 5d56bae0f..000000000 --- a/.changes/nsis-3.11.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-bundler": patch:deps ---- - -Updated NSIS from 3.8 to 3.11 diff --git a/.changes/perf-remove-needless-clone.md b/.changes/perf-remove-needless-clone.md deleted file mode 100644 index 3e23288c4..000000000 --- a/.changes/perf-remove-needless-clone.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"tauri-bundler": patch:perf -"tauri-cli": patch:perf -"tauri-macos-sign": patch:perf -"tauri": patch:perf ---- - -perf: remove needless clones in various files for improved performance. No user facing changes. diff --git a/.changes/pnpm-package-version-check.md b/.changes/pnpm-package-version-check.md deleted file mode 100644 index 090e64995..000000000 --- a/.changes/pnpm-package-version-check.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"tauri-cli": patch:bug -"@tauri-apps/cli": patch:bug ---- - -Fixed the mismatched tauri package versions check didn't work for pnpm diff --git a/.changes/schema-carriage-return.md b/.changes/schema-carriage-return.md deleted file mode 100644 index 44bbf97d2..000000000 --- a/.changes/schema-carriage-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-utils: patch:bug ---- - -Fixed an issue that caused schema files to have `\r` characters on Windows. diff --git a/.changes/version-req-error.md b/.changes/version-req-error.md deleted file mode 100644 index 523d6f1c8..000000000 --- a/.changes/version-req-error.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-cli: patch:bug ---- - -Fixed an issue that caused the cli to print errors like `Error Failed to parse version 2 for crate tauri` when there was no `Cargo.lock` file present yet. This will still be logged in `--verbose` mode. diff --git a/Cargo.lock b/Cargo.lock index 85b84ee01..cddd7b662 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -4319,7 +4319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -8494,7 +8494,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.9.3" +version = "2.9.4" dependencies = [ "anyhow", "bytes", @@ -8554,7 +8554,7 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.5.2" +version = "2.5.3" dependencies = [ "anyhow", "cargo_toml", @@ -8576,7 +8576,7 @@ dependencies = [ [[package]] name = "tauri-bundler" -version = "2.7.3" +version = "2.7.4" dependencies = [ "anyhow", "ar", @@ -8622,7 +8622,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.9.4" +version = "2.9.5" dependencies = [ "ar", "axum", @@ -8716,7 +8716,7 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.5.1" +version = "2.5.2" dependencies = [ "base64 0.22.1", "brotli", @@ -8782,7 +8782,7 @@ dependencies = [ [[package]] name = "tauri-macos-sign" -version = "2.3.0" +version = "2.3.1" dependencies = [ "apple-codesign", "chrono", @@ -8802,7 +8802,7 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.5.1" +version = "2.5.2" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -8814,7 +8814,7 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.5.1" +version = "2.5.2" dependencies = [ "anyhow", "glob", @@ -8862,7 +8862,7 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.9.1" +version = "2.9.2" dependencies = [ "cookie", "dpi", @@ -8885,7 +8885,7 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.9.1" +version = "2.9.2" dependencies = [ "gtk", "http 1.3.1", @@ -8936,7 +8936,7 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.8.0" +version = "2.8.1" dependencies = [ "aes-gcm", "anyhow", @@ -10324,7 +10324,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crates/tauri-build/CHANGELOG.md b/crates/tauri-build/CHANGELOG.md index 8568ec929..4e5c9c97a 100644 --- a/crates/tauri-build/CHANGELOG.md +++ b/crates/tauri-build/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## \[2.5.3] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` +- Upgraded to `tauri-codegen@2.5.2` + ## \[2.5.2] ### Dependencies diff --git a/crates/tauri-build/Cargo.toml b/crates/tauri-build/Cargo.toml index b8e3c6434..da35d963b 100644 --- a/crates/tauri-build/Cargo.toml +++ b/crates/tauri-build/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-build" -version = "2.5.2" +version = "2.5.3" description = "build time code to pair with https://crates.io/crates/tauri" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -26,8 +26,8 @@ targets = [ [dependencies] anyhow = "1" quote = { version = "1", optional = true } -tauri-codegen = { version = "2.5.1", path = "../tauri-codegen", optional = true } -tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ +tauri-codegen = { version = "2.5.2", path = "../tauri-codegen", optional = true } +tauri-utils = { version = "2.8.1", path = "../tauri-utils", features = [ "build", "resources", ] } diff --git a/crates/tauri-bundler/CHANGELOG.md b/crates/tauri-bundler/CHANGELOG.md index feb621512..0ae31a2bd 100644 --- a/crates/tauri-bundler/CHANGELOG.md +++ b/crates/tauri-bundler/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## \[2.7.4] + +### Bug Fixes + +- [`1496145f8`](https://www.github.com/tauri-apps/tauri/commit/1496145f8222649efeff22b819a96208670bbea1) ([#14585](https://www.github.com/tauri-apps/tauri/pull/14585) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused the AppImage bundler to fail with 404 errors for 32-bit builds. + +### Performance Improvements + +- [`ce98d87ce`](https://www.github.com/tauri-apps/tauri/commit/ce98d87ce0aaa907285852eb80691197424e03c3) ([#14474](https://www.github.com/tauri-apps/tauri/pull/14474) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) refactor: remove needless collect. No user facing changes. +- [`ee3cc4a91`](https://www.github.com/tauri-apps/tauri/commit/ee3cc4a91bf1315ecaefe90f423ffd55ef6c40db) ([#14475](https://www.github.com/tauri-apps/tauri/pull/14475) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) perf: remove needless clones in various files for improved performance. No user facing changes. + +### Dependencies + +- Upgraded to `tauri-macos-sign@2.3.1` +- Upgraded to `tauri-utils@2.8.1` +- [`b5ef603d8`](https://www.github.com/tauri-apps/tauri/commit/b5ef603d84bd8044625e50dcfdabb099b2e9fdd9) ([#14478](https://www.github.com/tauri-apps/tauri/pull/14478) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Updated NSIS from 3.8 to 3.11 + ## \[2.7.3] ### Enhancements diff --git a/crates/tauri-bundler/Cargo.toml b/crates/tauri-bundler/Cargo.toml index 5750480b7..351b072ed 100644 --- a/crates/tauri-bundler/Cargo.toml +++ b/crates/tauri-bundler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-bundler" -version = "2.7.3" +version = "2.7.4" authors = [ "George Burton ", "Tauri Programme within The Commons Conservancy", @@ -15,7 +15,7 @@ rust-version = "1.77.2" exclude = ["CHANGELOG.md", "/target", "rustfmt.toml"] [dependencies] -tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ +tauri-utils = { version = "2.8.1", path = "../tauri-utils", features = [ "resources", ] } image = "0.25" @@ -59,7 +59,7 @@ features = ["Win32_System_SystemInformation", "Win32_System_Diagnostics_Debug"] [target."cfg(target_os = \"macos\")".dependencies] icns = { package = "tauri-icns", version = "0.1" } time = { version = "0.3", features = ["formatting"] } -tauri-macos-sign = { version = "2.3.0", path = "../tauri-macos-sign" } +tauri-macos-sign = { version = "2.3.1", path = "../tauri-macos-sign" } [target."cfg(target_os = \"linux\")".dependencies] heck = "0.5" diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index 841035738..ba3f2baf5 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## \[2.9.5] + +### Bug Fixes + +- [`f022b2d1a`](https://www.github.com/tauri-apps/tauri/commit/f022b2d1ae57612e39c75782926f2f341d9034a8) ([#14582](https://www.github.com/tauri-apps/tauri/pull/14582) by [@hrzlgnm](https://www.github.com/tauri-apps/tauri/../../hrzlgnm)) Fixed an issue that caused the cli to error out with missing private key, in case the option `--no-sign` was requested and the `tauri.config` has signing key set and the plugin `tauri-plugin-updater` is used. +- [`f855caf8a`](https://www.github.com/tauri-apps/tauri/commit/f855caf8a3830aa5dd6d0b039312866a5d9c3606) ([#14481](https://www.github.com/tauri-apps/tauri/pull/14481) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fixed the mismatched tauri package versions check didn't work for pnpm +- [`79a7d9ec0`](https://www.github.com/tauri-apps/tauri/commit/79a7d9ec01be1a371b8e923848140fea75e9caed) ([#14468](https://www.github.com/tauri-apps/tauri/pull/14468) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused the cli to print errors like `Error Failed to parse version 2 for crate tauri` when there was no `Cargo.lock` file present yet. This will still be logged in `--verbose` mode. + +### Performance Improvements + +- [`ce98d87ce`](https://www.github.com/tauri-apps/tauri/commit/ce98d87ce0aaa907285852eb80691197424e03c3) ([#14474](https://www.github.com/tauri-apps/tauri/pull/14474) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) refactor: remove needless collect. No user facing changes. +- [`ee3cc4a91`](https://www.github.com/tauri-apps/tauri/commit/ee3cc4a91bf1315ecaefe90f423ffd55ef6c40db) ([#14475](https://www.github.com/tauri-apps/tauri/pull/14475) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) perf: remove needless clones in various files for improved performance. No user facing changes. + +### Dependencies + +- Upgraded to `tauri-bundler@2.7.4` +- Upgraded to `tauri-macos-sign@2.3.1` +- Upgraded to `tauri-utils@2.8.1` + ## \[2.9.4] ### Bug Fixes diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index 625db14b7..89d2ead0c 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.9.4" +version = "2.9.5" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" @@ -47,7 +47,7 @@ sublime_fuzzy = "0.7" clap_complete = "4" clap = { version = "4", features = ["derive", "env"] } thiserror = "2" -tauri-bundler = { version = "2.7.3", default-features = false, path = "../tauri-bundler" } +tauri-bundler = { version = "2.7.4", default-features = false, path = "../tauri-bundler" } colored = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } @@ -58,7 +58,7 @@ shared_child = "1" duct = "1.0" toml_edit = { version = "0.23", features = ["serde"] } json-patch = "3" -tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ +tauri-utils = { version = "2.8.1", path = "../tauri-utils", features = [ "isolation", "schema", "config-json5", @@ -133,7 +133,7 @@ libc = "0.2" [target."cfg(target_os = \"macos\")".dependencies] plist = "1" -tauri-macos-sign = { version = "2.3.0", path = "../tauri-macos-sign" } +tauri-macos-sign = { version = "2.3.1", path = "../tauri-macos-sign" } object = { version = "0.36", default-features = false, features = [ "macho", "read_core", diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index b9cdcae1d..1d19c20ea 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.3", + "$id": "https://schema.tauri.app/config/2.9.4", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index a3ad3dc81..b57586d4a 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,9 +1,9 @@ { "cli.js": { - "version": "2.9.4", + "version": "2.9.5", "node": ">= 10.0.0" }, - "tauri": "2.9.3", - "tauri-build": "2.5.2", - "tauri-plugin": "2.5.1" + "tauri": "2.9.4", + "tauri-build": "2.5.3", + "tauri-plugin": "2.5.2" } diff --git a/crates/tauri-codegen/CHANGELOG.md b/crates/tauri-codegen/CHANGELOG.md index 9d78e2b78..0da7581fe 100644 --- a/crates/tauri-codegen/CHANGELOG.md +++ b/crates/tauri-codegen/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.5.2] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` + ## \[2.5.1] ### Performance Improvements diff --git a/crates/tauri-codegen/Cargo.toml b/crates/tauri-codegen/Cargo.toml index de391d521..4bb00a1ac 100644 --- a/crates/tauri-codegen/Cargo.toml +++ b/crates/tauri-codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-codegen" -version = "2.5.1" +version = "2.5.2" description = "code generation meant to be consumed inside of `tauri` through `tauri-build` or `tauri-macros`" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,7 +20,7 @@ quote = "1" syn = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" -tauri-utils = { version = "2.8.0", path = "../tauri-utils", features = [ +tauri-utils = { version = "2.8.1", path = "../tauri-utils", features = [ "build", ] } thiserror = "2" diff --git a/crates/tauri-macos-sign/CHANGELOG.md b/crates/tauri-macos-sign/CHANGELOG.md index c45220b61..6da5a62a8 100644 --- a/crates/tauri-macos-sign/CHANGELOG.md +++ b/crates/tauri-macos-sign/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.3.1] + +### Performance Improvements + +- [`ee3cc4a91`](https://www.github.com/tauri-apps/tauri/commit/ee3cc4a91bf1315ecaefe90f423ffd55ef6c40db) ([#14475](https://www.github.com/tauri-apps/tauri/pull/14475) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) perf: remove needless clones in various files for improved performance. No user facing changes. + ## \[2.3.0] ### Enhancements diff --git a/crates/tauri-macos-sign/Cargo.toml b/crates/tauri-macos-sign/Cargo.toml index 77984f71b..620c3f750 100644 --- a/crates/tauri-macos-sign/Cargo.toml +++ b/crates/tauri-macos-sign/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-macos-sign" -version = "2.3.0" +version = "2.3.1" authors = ["Tauri Programme within The Commons Conservancy"] license = "Apache-2.0 OR MIT" keywords = ["codesign", "signing", "macos", "ios", "tauri"] diff --git a/crates/tauri-macros/CHANGELOG.md b/crates/tauri-macros/CHANGELOG.md index 0775a58d4..61d35b3bc 100644 --- a/crates/tauri-macros/CHANGELOG.md +++ b/crates/tauri-macros/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## \[2.5.2] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` +- Upgraded to `tauri-codegen@2.5.2` + ## \[2.5.1] ### Bug Fixes diff --git a/crates/tauri-macros/Cargo.toml b/crates/tauri-macros/Cargo.toml index 79d5a7230..7a096d01c 100644 --- a/crates/tauri-macros/Cargo.toml +++ b/crates/tauri-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-macros" -version = "2.5.1" +version = "2.5.2" description = "Macros for the tauri crate." exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,8 +20,8 @@ proc-macro2 = { version = "1", features = ["span-locations"] } quote = "1" syn = { version = "2", features = ["full"] } heck = "0.5" -tauri-codegen = { version = "2.5.1", default-features = false, path = "../tauri-codegen" } -tauri-utils = { version = "2.8.0", path = "../tauri-utils" } +tauri-codegen = { version = "2.5.2", default-features = false, path = "../tauri-codegen" } +tauri-utils = { version = "2.8.1", path = "../tauri-utils" } [features] custom-protocol = [] diff --git a/crates/tauri-plugin/CHANGELOG.md b/crates/tauri-plugin/CHANGELOG.md index 104093af2..51505ca06 100644 --- a/crates/tauri-plugin/CHANGELOG.md +++ b/crates/tauri-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.5.2] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` + ## \[2.5.1] ### Bug Fixes diff --git a/crates/tauri-plugin/Cargo.toml b/crates/tauri-plugin/Cargo.toml index 971d8c50f..c774a8862 100644 --- a/crates/tauri-plugin/Cargo.toml +++ b/crates/tauri-plugin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-plugin" -version = "2.5.1" +version = "2.5.2" description = "Build script and runtime Tauri plugin definitions" authors.workspace = true homepage.workspace = true @@ -28,7 +28,7 @@ runtime = [] [dependencies] anyhow = { version = "1", optional = true } serde = { version = "1", optional = true } -tauri-utils = { version = "2.8.0", default-features = false, features = [ +tauri-utils = { version = "2.8.1", default-features = false, features = [ "build", ], path = "../tauri-utils" } serde_json = { version = "1", optional = true } diff --git a/crates/tauri-runtime-wry/CHANGELOG.md b/crates/tauri-runtime-wry/CHANGELOG.md index d9ac4f1d1..2fee3f822 100644 --- a/crates/tauri-runtime-wry/CHANGELOG.md +++ b/crates/tauri-runtime-wry/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## \[2.9.2] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` +- Upgraded to `tauri-runtime@2.9.2` + ## \[2.9.1] ### Bug Fixes diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index e247f3793..3284cddbd 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime-wry" -version = "2.9.1" +version = "2.9.2" description = "Wry bindings to the Tauri runtime" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -20,8 +20,8 @@ wry = { version = "0.53.4", default-features = false, features = [ "linux-body", ] } tao = { version = "0.34.5", default-features = false, features = ["rwh_06"] } -tauri-runtime = { version = "2.9.1", path = "../tauri-runtime" } -tauri-utils = { version = "2.8.0", path = "../tauri-utils" } +tauri-runtime = { version = "2.9.2", path = "../tauri-runtime" } +tauri-utils = { version = "2.8.1", path = "../tauri-utils" } raw-window-handle = "0.6" http = "1" url = "2" diff --git a/crates/tauri-runtime/CHANGELOG.md b/crates/tauri-runtime/CHANGELOG.md index edf7e1a03..c4ae73bec 100644 --- a/crates/tauri-runtime/CHANGELOG.md +++ b/crates/tauri-runtime/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.2] + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` + ## \[2.9.1] ### Bug Fixes diff --git a/crates/tauri-runtime/Cargo.toml b/crates/tauri-runtime/Cargo.toml index b269b8d32..53db45873 100644 --- a/crates/tauri-runtime/Cargo.toml +++ b/crates/tauri-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime" -version = "2.9.1" +version = "2.9.2" description = "Runtime for Tauri applications" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" @@ -27,7 +27,7 @@ targets = [ serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" -tauri-utils = { version = "2.8.0", path = "../tauri-utils" } +tauri-utils = { version = "2.8.1", path = "../tauri-utils" } http = "1" raw-window-handle = "0.6" url = { version = "2" } diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index b9cdcae1d..1d19c20ea 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.3", + "$id": "https://schema.tauri.app/config/2.9.4", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-utils/CHANGELOG.md b/crates/tauri-utils/CHANGELOG.md index 538887203..a63e5103b 100644 --- a/crates/tauri-utils/CHANGELOG.md +++ b/crates/tauri-utils/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.8.1] + +### Bug Fixes + +- [`1573c7240`](https://www.github.com/tauri-apps/tauri/commit/1573c72402352949d1fd3ca5c6fdbee46fe69fbb) ([#14561](https://www.github.com/tauri-apps/tauri/pull/14561) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue that caused schema files to have `\r` characters on Windows. + ## \[2.8.0] ### New Features diff --git a/crates/tauri-utils/Cargo.toml b/crates/tauri-utils/Cargo.toml index 7cc6f5c78..25debb2db 100644 --- a/crates/tauri-utils/Cargo.toml +++ b/crates/tauri-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-utils" -version = "2.8.0" +version = "2.8.1" description = "Utilities for Tauri" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" diff --git a/crates/tauri/CHANGELOG.md b/crates/tauri/CHANGELOG.md index e1332ea34..d4b868f5e 100644 --- a/crates/tauri/CHANGELOG.md +++ b/crates/tauri/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## \[2.9.4] + +### Performance Improvements + +- [`ce98d87ce`](https://www.github.com/tauri-apps/tauri/commit/ce98d87ce0aaa907285852eb80691197424e03c3) ([#14474](https://www.github.com/tauri-apps/tauri/pull/14474) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) refactor: remove needless collect. No user facing changes. +- [`ee3cc4a91`](https://www.github.com/tauri-apps/tauri/commit/ee3cc4a91bf1315ecaefe90f423ffd55ef6c40db) ([#14475](https://www.github.com/tauri-apps/tauri/pull/14475) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) perf: remove needless clones in various files for improved performance. No user facing changes. + +### Dependencies + +- Upgraded to `tauri-utils@2.8.1` +- Upgraded to `tauri-runtime@2.9.2` +- Upgraded to `tauri-runtime-wry@2.9.2` +- Upgraded to `tauri-macros@2.5.2` +- Upgraded to `tauri-build@2.5.3` + ## \[2.9.3] ### Bug Fixes diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index dda4f4124..48336f82a 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri" -version = "2.9.3" +version = "2.9.4" description = "Make tiny, secure apps for all desktop platforms with Tauri" exclude = ["/test", "/.scripts", "CHANGELOG.md", "/target"] readme = "README.md" @@ -55,12 +55,12 @@ uuid = { version = "1", features = ["v4"], optional = true } url = "2" anyhow = "1" thiserror = "2" -tauri-runtime = { version = "2.9.1", path = "../tauri-runtime" } -tauri-macros = { version = "2.5.1", path = "../tauri-macros" } -tauri-utils = { version = "2.8.0", features = [ +tauri-runtime = { version = "2.9.2", path = "../tauri-runtime" } +tauri-macros = { version = "2.5.2", path = "../tauri-macros" } +tauri-utils = { version = "2.8.1", features = [ "resources", ], path = "../tauri-utils" } -tauri-runtime-wry = { version = "2.9.1", path = "../tauri-runtime-wry", default-features = false, optional = true } +tauri-runtime-wry = { version = "2.9.2", path = "../tauri-runtime-wry", default-features = false, optional = true } getrandom = "0.3" serde_repr = "0.1" http = "1" @@ -162,8 +162,8 @@ objc2-ui-kit = { version = "0.3.0", default-features = false, features = [ [build-dependencies] glob = "0.3" heck = "0.5" -tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.2" } -tauri-utils = { path = "../tauri-utils/", version = "2.8.0", features = [ +tauri-build = { path = "../tauri-build/", default-features = false, version = "2.5.3" } +tauri-utils = { path = "../tauri-utils/", version = "2.8.1", features = [ "build", ] } diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index be0325b77..f9cce7cdf 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.1] + +### Bug Fixes + +- [`ad1dec2e2`](https://www.github.com/tauri-apps/tauri/commit/ad1dec2e2488fe5c0a004b69f1bd290dfc593bf8) ([#14464](https://www.github.com/tauri-apps/tauri/pull/14464) by [@funnydino](https://www.github.com/tauri-apps/tauri/../../funnydino)) Fix `addPluginListener` fallback added in https://github.com/tauri-apps/tauri/pull/14132 didn't work properly + ## \[2.9.0] ### New Features diff --git a/packages/api/package.json b/packages/api/package.json index 57628957b..bc7aba711 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/api", - "version": "2.9.0", + "version": "2.9.1", "description": "Tauri API definitions", "funding": { "type": "opencollective", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index b242fd9ca..669c6b313 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## \[2.9.5] + +### Bug Fixes + +- [`f855caf8a`](https://www.github.com/tauri-apps/tauri/commit/f855caf8a3830aa5dd6d0b039312866a5d9c3606) ([#14481](https://www.github.com/tauri-apps/tauri/pull/14481) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fixed the mismatched tauri package versions check didn't work for pnpm + +### Performance Improvements + +- [`ce98d87ce`](https://www.github.com/tauri-apps/tauri/commit/ce98d87ce0aaa907285852eb80691197424e03c3) ([#14474](https://www.github.com/tauri-apps/tauri/pull/14474) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) refactor: remove needless collect. No user facing changes. + +### Dependencies + +- Upgraded to `tauri-cli@2.9.5` + ## \[2.9.4] ### Bug Fixes diff --git a/packages/cli/package.json b/packages/cli/package.json index cf9a13172..0d2bf618c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.9.4", + "version": "2.9.5", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From 4176f93ae43ef66714c4934feb3df19df3a3e28a Mon Sep 17 00:00:00 2001 From: chfaft <129761080+chfaft@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:58:35 +0100 Subject: [PATCH 060/119] feat(bundler): consider extensions defined in main.wxs. (#14570) * feat(bundler): consider extensions defined in main.wxs. * chore(bundler): apply nitpick and add a change file. * Update crates/tauri-bundler/src/bundle/windows/msi/mod.rs chore(bundler): avoid clone and use reference. Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> * Update .changes/support-template-extensions.md chore(bundler): reclassify changes. Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> --------- Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> --- .changes/support-template-extensions.md | 5 +++++ .../src/bundle/windows/msi/mod.rs | 20 ++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 .changes/support-template-extensions.md diff --git a/.changes/support-template-extensions.md b/.changes/support-template-extensions.md new file mode 100644 index 000000000..8fa4654c9 --- /dev/null +++ b/.changes/support-template-extensions.md @@ -0,0 +1,5 @@ +--- +tauri-bundler: patch:enhance +--- + +Consider extensions that are defined in the wxs template. diff --git a/crates/tauri-bundler/src/bundle/windows/msi/mod.rs b/crates/tauri-bundler/src/bundle/windows/msi/mod.rs index cc5f83883..4c00d8f33 100644 --- a/crates/tauri-bundler/src/bundle/windows/msi/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/msi/mod.rs @@ -753,26 +753,28 @@ pub fn build_wix_app_installer( } let main_wxs_path = output_path.join("main.wxs"); - fs::write(main_wxs_path, handlebars.render("main.wxs", &data)?)?; + fs::write(&main_wxs_path, handlebars.render("main.wxs", &data)?)?; - let mut candle_inputs = vec![("main.wxs".into(), Vec::new())]; + let mut candle_inputs = vec![]; let current_dir = std::env::current_dir()?; let extension_regex = Regex::new("\"http://schemas.microsoft.com/wix/(\\w+)\"")?; - for fragment_path in fragment_paths { - let fragment_path = current_dir.join(fragment_path); - let fragment_content = fs::read_to_string(&fragment_path)?; - let fragment_handlebars = Handlebars::new(); - let fragment = fragment_handlebars.render_template(&fragment_content, &data)?; + let input_paths = + std::iter::once(main_wxs_path).chain(fragment_paths.iter().map(|p| current_dir.join(p))); + + for input_path in input_paths { + let input_content = fs::read_to_string(&input_path)?; + let input_handlebars = Handlebars::new(); + let input = input_handlebars.render_template(&input_content, &data)?; let mut extensions = Vec::new(); - for cap in extension_regex.captures_iter(&fragment) { + for cap in extension_regex.captures_iter(&input) { let path = wix_toolset_path.join(format!("Wix{}.dll", &cap[1])); if settings.windows().can_sign() { try_sign(&path, settings)?; } extensions.push(path); } - candle_inputs.push((fragment_path, extensions)); + candle_inputs.push((input_path, extensions)); } let mut fragment_extensions = HashSet::new(); From 60174527c06950964ed5146eca1be0088321c800 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:19:09 +0800 Subject: [PATCH 061/119] chore(deps): update rust crate ico to 0.5 (#14589) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- crates/tauri-codegen/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cddd7b662..56d688771 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3467,9 +3467,9 @@ dependencies = [ [[package]] name = "ico" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" dependencies = [ "byteorder", "png", diff --git a/crates/tauri-codegen/Cargo.toml b/crates/tauri-codegen/Cargo.toml index 4bb00a1ac..751ef1402 100644 --- a/crates/tauri-codegen/Cargo.toml +++ b/crates/tauri-codegen/Cargo.toml @@ -30,7 +30,7 @@ brotli = { version = "8", optional = true, default-features = false, features = ] } uuid = { version = "1", features = ["v4"] } semver = "1" -ico = "0.4" +ico = "0.5" png = "0.17" json-patch = "3" url = "2" From 514cf21e1417c7a78a0db494f891ba79d948b73d Mon Sep 17 00:00:00 2001 From: Tunglies Date: Tue, 2 Dec 2025 10:20:35 +0800 Subject: [PATCH 062/119] chore(deps): update num-bigint-dig to version 0.8.6 (#14591) * chore(deps): update num-bigint-dig to version 0.8.6 * Update .changes/bump-version-num-bigint-dig.md --------- Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> --- .changes/bump-version-num-bigint-dig.md | 5 +++++ Cargo.lock | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 .changes/bump-version-num-bigint-dig.md diff --git a/.changes/bump-version-num-bigint-dig.md b/.changes/bump-version-num-bigint-dig.md new file mode 100644 index 000000000..5b7214e58 --- /dev/null +++ b/.changes/bump-version-num-bigint-dig.md @@ -0,0 +1,5 @@ +--- +"tauri-macos-sign": patch:deps +--- + +Update num-bigint-dig from 0.8.4 to 0.8.6 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 56d688771..407c0f444 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4897,11 +4897,10 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "byteorder", "lazy_static", "libm", "num-integer", From 546b296405bfff42f2181e1bacbb9724e32c469e Mon Sep 17 00:00:00 2001 From: sftse Date: Fri, 5 Dec 2025 04:56:34 +0100 Subject: [PATCH 063/119] fix(tauri-bundler): add a bit more context to error message (#14606) --- crates/tauri-bundler/src/bundle/linux/debian.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/tauri-bundler/src/bundle/linux/debian.rs b/crates/tauri-bundler/src/bundle/linux/debian.rs index a99409728..3fedef4b7 100644 --- a/crates/tauri-bundler/src/bundle/linux/debian.rs +++ b/crates/tauri-bundler/src/bundle/linux/debian.rs @@ -119,8 +119,9 @@ pub fn generate_data( for bin in settings.binaries() { let bin_path = settings.binary_path(bin); - fs_utils::copy_file(&bin_path, &bin_dir.join(bin.name())) - .with_context(|| format!("Failed to copy binary from {bin_path:?}"))?; + let trgt = bin_dir.join(bin.name()); + fs_utils::copy_file(&bin_path, &trgt) + .with_context(|| format!("Failed to copy binary from {bin_path:?} to {trgt:?}"))?; } copy_resource_files(settings, &data_dir).with_context(|| "Failed to copy resource files")?; From 7b1b3514df771e6e9859b9f54fa4df332433948e Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 7 Dec 2025 21:06:27 +0800 Subject: [PATCH 064/119] changes(cli): log npm package version parse in debug level (#14621) --- .changes/version-req-error.md | 5 +++++ crates/tauri-cli/src/helpers/npm.rs | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changes/version-req-error.md diff --git a/.changes/version-req-error.md b/.changes/version-req-error.md new file mode 100644 index 000000000..902151b34 --- /dev/null +++ b/.changes/version-req-error.md @@ -0,0 +1,5 @@ +--- +tauri-cli: patch:changes +--- + +Errors like `Error Failed to parse version 2 for for NPM package tauri` when there was no `package-lock.json` file present yet or when using ones like `link:./tauri` are now only logged in `--verbose` mode. diff --git a/crates/tauri-cli/src/helpers/npm.rs b/crates/tauri-cli/src/helpers/npm.rs index 58df0d443..eced925ac 100644 --- a/crates/tauri-cli/src/helpers/npm.rs +++ b/crates/tauri-cli/src/helpers/npm.rs @@ -345,7 +345,7 @@ impl PackageManager { if let Ok(version) = semver::Version::parse(&version) { versions.insert(package, version); } else { - log::error!("Failed to parse version `{version}` for NPM package `{package}`"); + log::debug!("Failed to parse version `{version}` for NPM package `{package}`"); } } Ok(versions) @@ -397,7 +397,7 @@ fn yarn_package_versions( if let Ok(version) = semver::Version::parse(version) { versions.insert(name.to_owned(), version); } else { - log::error!("Failed to parse version `{version}` for NPM package `{name}`"); + log::debug!("Failed to parse version `{version}` for NPM package `{name}`"); } } return Ok(versions); @@ -450,7 +450,7 @@ fn yarn_berry_package_versions( if let Ok(version) = semver::Version::parse(&version) { versions.insert(name.to_owned(), version); } else { - log::error!("Failed to parse version `{version}` for NPM package `{name}`"); + log::debug!("Failed to parse version `{version}` for NPM package `{name}`"); } } } From 731dd5bfdc62505c904bf8e7262bb5c1428b5a5a Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 7 Dec 2025 23:09:11 +0800 Subject: [PATCH 065/119] docs: remove `$APP` and `$LOG` from `FsScope` (#14623) --- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-schema-generator/schemas/config.schema.json | 2 +- crates/tauri-utils/src/config.rs | 4 ++-- .../tests/acl/fixtures/capabilities/scope-extended/cap.json | 4 ++-- crates/tests/acl/fixtures/plugins/fs/scope.toml | 4 ++-- crates/tests/acl/fixtures/plugins/os/windows.toml | 2 +- .../snapshots/acl_tests__tests__file-explorer-remote.snap | 2 +- .../fixtures/snapshots/acl_tests__tests__file-explorer.snap | 2 +- .../fixtures/snapshots/acl_tests__tests__multiwindow.snap | 2 +- .../snapshots/acl_tests__tests__scope-extended.snap | 6 +++--- .../acl/fixtures/snapshots/acl_tests__tests__scope.snap | 2 +- .../acl_tests__tests__platform-specific-permissions.snap | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 1d19c20ea..c71bf6e2d 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1296,7 +1296,7 @@ "additionalProperties": false }, "FsScope": { - "description": "Protocol scope definition.\n It is a list of glob patterns that restrict the API access from the webview.\n\n Each pattern can start with a variable that resolves to a system base directory.\n The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`,\n `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`,\n `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`,\n `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "description": "Protocol scope definition.\n It is a list of glob patterns that restrict the API access from the webview.\n\n Each pattern can start with a variable that resolves to a system base directory.\n The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`,\n `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`,\n `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$TEMP`,\n `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "anyOf": [ { "description": "A list of paths that are allowed by this scope.", diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 1d19c20ea..c71bf6e2d 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1296,7 +1296,7 @@ "additionalProperties": false }, "FsScope": { - "description": "Protocol scope definition.\n It is a list of glob patterns that restrict the API access from the webview.\n\n Each pattern can start with a variable that resolves to a system base directory.\n The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`,\n `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`,\n `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`,\n `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "description": "Protocol scope definition.\n It is a list of glob patterns that restrict the API access from the webview.\n\n Each pattern can start with a variable that resolves to a system base directory.\n The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`,\n `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`,\n `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$TEMP`,\n `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "anyOf": [ { "description": "A list of paths that are allowed by this scope.", diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index 37c77abff..c90dc3e59 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -2211,8 +2211,8 @@ impl Default for DisabledCspModificationKind { /// Each pattern can start with a variable that resolves to a system base directory. /// The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, /// `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, -/// `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, -/// `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`. +/// `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$TEMP`, +/// `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`. #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] #[serde(untagged)] #[cfg_attr(feature = "schema", derive(JsonSchema))] diff --git a/crates/tests/acl/fixtures/capabilities/scope-extended/cap.json b/crates/tests/acl/fixtures/capabilities/scope-extended/cap.json index 26355eed5..78ec36d96 100644 --- a/crates/tests/acl/fixtures/capabilities/scope-extended/cap.json +++ b/crates/tests/acl/fixtures/capabilities/scope-extended/cap.json @@ -25,12 +25,12 @@ "identifier": "fs:allow-app", "allow": [ { - "path": "$APP/**" + "path": "$APPDATA/**" } ], "deny": [ { - "path": "$APP/*.db" + "path": "$APPDATA/*.db" } ] }, diff --git a/crates/tests/acl/fixtures/plugins/fs/scope.toml b/crates/tests/acl/fixtures/plugins/fs/scope.toml index 6d8a29a3f..efe82a96c 100644 --- a/crates/tests/acl/fixtures/plugins/fs/scope.toml +++ b/crates/tests/acl/fixtures/plugins/fs/scope.toml @@ -1,8 +1,8 @@ [[permission]] identifier = "allow-app" -description = "Allows accessing the $APP path." +description = "Allows accessing the $APPDATA path." [[permission.scope.allow]] -path = "$APP" +path = "$APPDATA" [[permission]] identifier = "allow-download-dir" diff --git a/crates/tests/acl/fixtures/plugins/os/windows.toml b/crates/tests/acl/fixtures/plugins/os/windows.toml index 577b0c967..1f84a6d99 100644 --- a/crates/tests/acl/fixtures/plugins/os/windows.toml +++ b/crates/tests/acl/fixtures/plugins/os/windows.toml @@ -3,4 +3,4 @@ identifier = "deny-webview-folder-windows" platforms = ["windows"] description = "Denies access to the webview folder on Windows" [[permission.scope.deny]] -path = "$APP/EBWebView/**" +path = "$APPLOCALDATA/EBWebView/**" diff --git a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer-remote.snap b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer-remote.snap index dd9b05093..50029e7bd 100644 --- a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer-remote.snap +++ b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer-remote.snap @@ -398,7 +398,7 @@ Resolved { Map( { "path": String( - "$APP", + "$APPDATA", ), }, ), diff --git a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer.snap b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer.snap index a3e4cd8b3..03f795b43 100644 --- a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer.snap +++ b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__file-explorer.snap @@ -68,7 +68,7 @@ Resolved { Map( { "path": String( - "$APP", + "$APPDATA", ), }, ), diff --git a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__multiwindow.snap b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__multiwindow.snap index f80ef7566..95ba3490d 100644 --- a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__multiwindow.snap +++ b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__multiwindow.snap @@ -310,7 +310,7 @@ Resolved { Map( { "path": String( - "$APP", + "$APPDATA", ), }, ), diff --git a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope-extended.snap b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope-extended.snap index 41d2d99d7..7f1606fae 100644 --- a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope-extended.snap +++ b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope-extended.snap @@ -244,14 +244,14 @@ Resolved { Map( { "path": String( - "$APP/**", + "$APPDATA/**", ), }, ), Map( { "path": String( - "$APP", + "$APPDATA", ), }, ), @@ -281,7 +281,7 @@ Resolved { Map( { "path": String( - "$APP/*.db", + "$APPDATA/*.db", ), }, ), diff --git a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope.snap b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope.snap index e98810961..b74d04381 100644 --- a/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope.snap +++ b/crates/tests/acl/fixtures/snapshots/acl_tests__tests__scope.snap @@ -208,7 +208,7 @@ Resolved { Map( { "path": String( - "$APP", + "$APPDATA", ), }, ), diff --git a/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap b/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap index 618dcd1a7..17498f928 100644 --- a/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap +++ b/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap @@ -56,7 +56,7 @@ Resolved { Map( { "path": String( - "$APP/EBWebView/**", + "$APPLOCALDATA/EBWebView/**", ), }, ), From 018b4db22e167fa67b37b0933e192a0f3556d3e5 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:13:43 +0800 Subject: [PATCH 066/119] fix(bundler): skip signing for nsis uninstaller on `--no-sign` (#14625) --- .changes/no-sign-skip-nsis-uninstaller.md | 5 +++++ crates/tauri-bundler/src/bundle.rs | 2 +- crates/tauri-bundler/src/bundle/windows/nsis/mod.rs | 8 ++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changes/no-sign-skip-nsis-uninstaller.md diff --git a/.changes/no-sign-skip-nsis-uninstaller.md b/.changes/no-sign-skip-nsis-uninstaller.md new file mode 100644 index 000000000..3e7952d93 --- /dev/null +++ b/.changes/no-sign-skip-nsis-uninstaller.md @@ -0,0 +1,5 @@ +--- +tauri-bundler: patch:bug +--- + +Skip signing for NSIS uninstaller when using `--no-sign` flag diff --git a/crates/tauri-bundler/src/bundle.rs b/crates/tauri-bundler/src/bundle.rs index 654ad5647..bac77c041 100644 --- a/crates/tauri-bundler/src/bundle.rs +++ b/crates/tauri-bundler/src/bundle.rs @@ -273,7 +273,7 @@ fn sign_binaries_if_needed(settings: &Settings, target_os: &TargetPlatform) -> c if matches!(target_os, TargetPlatform::Windows) { if settings.windows().can_sign() { if settings.no_sign() { - log::info!("Skipping binary signing due to --no-sign flag."); + log::warn!("Skipping binary signing due to --no-sign flag."); return Ok(()); } diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs index 8b2bc4eef..f456ed97a 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs @@ -298,8 +298,12 @@ fn build_nsis_app_installer( data.insert("copyright", to_json(settings.copyright_string())); if settings.windows().can_sign() { - let sign_cmd = format!("{:?}", sign_command("%1", &settings.sign_params())?); - data.insert("uninstaller_sign_cmd", to_json(sign_cmd)); + if settings.no_sign() { + log::warn!("Skipping signing for NSIS uninstaller due to --no-sign flag."); + } else { + let sign_cmd = format!("{:?}", sign_command("%1", &settings.sign_params())?); + data.insert("uninstaller_sign_cmd", to_json(sign_cmd)); + } } let version = settings.version_string(); From 91becd9e4fa2db089ddc6b21dadc06133e939e08 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:13:52 +0800 Subject: [PATCH 067/119] fix(nsis): plugins not signed (#14627) --- .changes/nsis-plugin-sign-path.md | 5 +++++ .../src/bundle/windows/nsis/mod.rs | 17 ++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 .changes/nsis-plugin-sign-path.md diff --git a/.changes/nsis-plugin-sign-path.md b/.changes/nsis-plugin-sign-path.md new file mode 100644 index 000000000..99f4f6861 --- /dev/null +++ b/.changes/nsis-plugin-sign-path.md @@ -0,0 +1,5 @@ +--- +tauri-bundler: patch:bug +--- + +Fix NSIS plugins not being signed due to wrong path handlings diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs index f456ed97a..d4d8f2cac 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs @@ -621,13 +621,16 @@ fn build_nsis_app_installer( fs::create_dir_all(nsis_installer_path.parent().unwrap())?; if settings.windows().can_sign() { - log::info!("Signing NSIS plugins"); - for dll in NSIS_PLUGIN_FILES { - let path = additional_plugins_path.join(dll); - if path.exists() { - try_sign(&path, settings)?; - } else { - log::warn!("Could not find {}, skipping signing", path.display()); + if let Some(plugin_copy_path) = &maybe_plugin_copy_path { + let plugin_copy_path = plugin_copy_path.join("x86-unicode"); + log::info!("Signing NSIS plugins"); + for dll in NSIS_PLUGIN_FILES { + let path = plugin_copy_path.join(dll); + if path.exists() { + try_sign(&path, settings)?; + } else { + log::warn!("Could not find {}, skipping signing", path.display()); + } } } } From 251203b8963419cb3b40741767393e8f3c909ef9 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:05:12 +0800 Subject: [PATCH 068/119] fix(linux): work area returns logical rect (#14637) --- .changes/linux-workarea-logical-size.md | 6 ++++++ crates/tauri-runtime-wry/src/monitor/linux.rs | 7 ++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 .changes/linux-workarea-logical-size.md diff --git a/.changes/linux-workarea-logical-size.md b/.changes/linux-workarea-logical-size.md new file mode 100644 index 000000000..a151910f6 --- /dev/null +++ b/.changes/linux-workarea-logical-size.md @@ -0,0 +1,6 @@ +--- +tauri: patch:bug +tauri-runtime-wry: patch:bug +--- + +Fix `Monitor::work_area` returns logical position and size inside the `PhysicalRect` on Linux diff --git a/crates/tauri-runtime-wry/src/monitor/linux.rs b/crates/tauri-runtime-wry/src/monitor/linux.rs index 6b6a33bce..62f87eb05 100644 --- a/crates/tauri-runtime-wry/src/monitor/linux.rs +++ b/crates/tauri-runtime-wry/src/monitor/linux.rs @@ -4,14 +4,15 @@ use gtk::prelude::MonitorExt; use tao::platform::unix::MonitorHandleExtUnix; -use tauri_runtime::dpi::{PhysicalPosition, PhysicalRect, PhysicalSize}; +use tauri_runtime::dpi::{LogicalPosition, LogicalSize, PhysicalRect}; impl super::MonitorExt for tao::monitor::MonitorHandle { fn work_area(&self) -> PhysicalRect { let rect = self.gdk_monitor().workarea(); + let scale_factor = self.scale_factor(); PhysicalRect { - size: PhysicalSize::new(rect.width() as u32, rect.height() as u32), - position: PhysicalPosition::new(rect.x(), rect.y()), + size: LogicalSize::new(rect.width() as u32, rect.height() as u32).to_physical(scale_factor), + position: LogicalPosition::new(rect.x(), rect.y()).to_physical(scale_factor), } } } From 54e8d93db1278e4bd3e9e1ae57ecb4ac1b4f63cd Mon Sep 17 00:00:00 2001 From: FabianLars Date: Tue, 9 Dec 2025 12:11:53 +0100 Subject: [PATCH 069/119] ci(renovate): group worker-rs updates --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/renovate.json b/renovate.json index 016c0c807..3f55df977 100644 --- a/renovate.json +++ b/renovate.json @@ -29,6 +29,11 @@ "https://github.com/microsoft/windows-rs", "https://github.com/wravery/webview2-rs" ] + }, + { + "description": "Group worker-rs crates", + "groupName": "worker-rs crates", + "matchSourceUrls": ["https://github.com/cloudflare/workers-rs"] } ], "postUpdateOptions": ["pnpmDedupe"] From f2e0405dc2d8bae949de6bb5e479bbf3cde401b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 12:41:05 +0100 Subject: [PATCH 070/119] apply version updates (#14592) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changes/bump-version-num-bigint-dig.md | 5 ----- .changes/linux-workarea-logical-size.md | 6 ------ .changes/no-sign-skip-nsis-uninstaller.md | 5 ----- .changes/nsis-plugin-sign-path.md | 5 ----- .changes/support-template-extensions.md | 5 ----- .changes/version-req-error.md | 5 ----- Cargo.lock | 16 ++++++++-------- crates/tauri-bundler/CHANGELOG.md | 15 +++++++++++++++ crates/tauri-bundler/Cargo.toml | 4 ++-- crates/tauri-cli/CHANGELOG.md | 11 +++++++++++ crates/tauri-cli/Cargo.toml | 6 +++--- crates/tauri-cli/config.schema.json | 2 +- crates/tauri-cli/metadata-v2.json | 4 ++-- crates/tauri-macos-sign/CHANGELOG.md | 6 ++++++ crates/tauri-macos-sign/Cargo.toml | 2 +- crates/tauri-runtime-wry/CHANGELOG.md | 6 ++++++ crates/tauri-runtime-wry/Cargo.toml | 2 +- .../schemas/config.schema.json | 2 +- crates/tauri/CHANGELOG.md | 10 ++++++++++ crates/tauri/Cargo.toml | 4 ++-- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 22 files changed, 76 insertions(+), 53 deletions(-) delete mode 100644 .changes/bump-version-num-bigint-dig.md delete mode 100644 .changes/linux-workarea-logical-size.md delete mode 100644 .changes/no-sign-skip-nsis-uninstaller.md delete mode 100644 .changes/nsis-plugin-sign-path.md delete mode 100644 .changes/support-template-extensions.md delete mode 100644 .changes/version-req-error.md diff --git a/.changes/bump-version-num-bigint-dig.md b/.changes/bump-version-num-bigint-dig.md deleted file mode 100644 index 5b7214e58..000000000 --- a/.changes/bump-version-num-bigint-dig.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"tauri-macos-sign": patch:deps ---- - -Update num-bigint-dig from 0.8.4 to 0.8.6 \ No newline at end of file diff --git a/.changes/linux-workarea-logical-size.md b/.changes/linux-workarea-logical-size.md deleted file mode 100644 index a151910f6..000000000 --- a/.changes/linux-workarea-logical-size.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tauri: patch:bug -tauri-runtime-wry: patch:bug ---- - -Fix `Monitor::work_area` returns logical position and size inside the `PhysicalRect` on Linux diff --git a/.changes/no-sign-skip-nsis-uninstaller.md b/.changes/no-sign-skip-nsis-uninstaller.md deleted file mode 100644 index 3e7952d93..000000000 --- a/.changes/no-sign-skip-nsis-uninstaller.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-bundler: patch:bug ---- - -Skip signing for NSIS uninstaller when using `--no-sign` flag diff --git a/.changes/nsis-plugin-sign-path.md b/.changes/nsis-plugin-sign-path.md deleted file mode 100644 index 99f4f6861..000000000 --- a/.changes/nsis-plugin-sign-path.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-bundler: patch:bug ---- - -Fix NSIS plugins not being signed due to wrong path handlings diff --git a/.changes/support-template-extensions.md b/.changes/support-template-extensions.md deleted file mode 100644 index 8fa4654c9..000000000 --- a/.changes/support-template-extensions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-bundler: patch:enhance ---- - -Consider extensions that are defined in the wxs template. diff --git a/.changes/version-req-error.md b/.changes/version-req-error.md deleted file mode 100644 index 902151b34..000000000 --- a/.changes/version-req-error.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -tauri-cli: patch:changes ---- - -Errors like `Error Failed to parse version 2 for for NPM package tauri` when there was no `package-lock.json` file present yet or when using ones like `link:./tauri` are now only logged in `--verbose` mode. diff --git a/Cargo.lock b/Cargo.lock index 407c0f444..d571d8aae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -4319,7 +4319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -8493,7 +8493,7 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.9.4" +version = "2.9.5" dependencies = [ "anyhow", "bytes", @@ -8575,7 +8575,7 @@ dependencies = [ [[package]] name = "tauri-bundler" -version = "2.7.4" +version = "2.7.5" dependencies = [ "anyhow", "ar", @@ -8621,7 +8621,7 @@ dependencies = [ [[package]] name = "tauri-cli" -version = "2.9.5" +version = "2.9.6" dependencies = [ "ar", "axum", @@ -8781,7 +8781,7 @@ dependencies = [ [[package]] name = "tauri-macos-sign" -version = "2.3.1" +version = "2.3.2" dependencies = [ "apple-codesign", "chrono", @@ -8884,7 +8884,7 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.9.2" +version = "2.9.3" dependencies = [ "gtk", "http 1.3.1", @@ -10323,7 +10323,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/crates/tauri-bundler/CHANGELOG.md b/crates/tauri-bundler/CHANGELOG.md index 0ae31a2bd..c8e880524 100644 --- a/crates/tauri-bundler/CHANGELOG.md +++ b/crates/tauri-bundler/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## \[2.7.5] + +### Enhancements + +- [`4176f93ae`](https://www.github.com/tauri-apps/tauri/commit/4176f93ae43ef66714c4934feb3df19df3a3e28a) ([#14570](https://www.github.com/tauri-apps/tauri/pull/14570) by [@chfaft](https://www.github.com/tauri-apps/tauri/../../chfaft)) Consider extensions that are defined in the wxs template. + +### Bug Fixes + +- [`018b4db22`](https://www.github.com/tauri-apps/tauri/commit/018b4db22e167fa67b37b0933e192a0f3556d3e5) ([#14625](https://www.github.com/tauri-apps/tauri/pull/14625) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Skip signing for NSIS uninstaller when using `--no-sign` flag +- [`91becd9e4`](https://www.github.com/tauri-apps/tauri/commit/91becd9e4fa2db089ddc6b21dadc06133e939e08) ([#14627](https://www.github.com/tauri-apps/tauri/pull/14627) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix NSIS plugins not being signed due to wrong path handlings + +### Dependencies + +- Upgraded to `tauri-macos-sign@2.3.2` + ## \[2.7.4] ### Bug Fixes diff --git a/crates/tauri-bundler/Cargo.toml b/crates/tauri-bundler/Cargo.toml index 351b072ed..cb88cb9a9 100644 --- a/crates/tauri-bundler/Cargo.toml +++ b/crates/tauri-bundler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-bundler" -version = "2.7.4" +version = "2.7.5" authors = [ "George Burton ", "Tauri Programme within The Commons Conservancy", @@ -59,7 +59,7 @@ features = ["Win32_System_SystemInformation", "Win32_System_Diagnostics_Debug"] [target."cfg(target_os = \"macos\")".dependencies] icns = { package = "tauri-icns", version = "0.1" } time = { version = "0.3", features = ["formatting"] } -tauri-macos-sign = { version = "2.3.1", path = "../tauri-macos-sign" } +tauri-macos-sign = { version = "2.3.2", path = "../tauri-macos-sign" } [target."cfg(target_os = \"linux\")".dependencies] heck = "0.5" diff --git a/crates/tauri-cli/CHANGELOG.md b/crates/tauri-cli/CHANGELOG.md index ba3f2baf5..cb3bc6716 100644 --- a/crates/tauri-cli/CHANGELOG.md +++ b/crates/tauri-cli/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## \[2.9.6] + +### What's Changed + +- [`7b1b3514d`](https://www.github.com/tauri-apps/tauri/commit/7b1b3514df771e6e9859b9f54fa4df332433948e) ([#14621](https://www.github.com/tauri-apps/tauri/pull/14621) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Errors like `Error Failed to parse version 2 for for NPM package tauri` when there was no `package-lock.json` file present yet or when using ones like `link:./tauri` are now only logged in `--verbose` mode. + +### Dependencies + +- Upgraded to `tauri-macos-sign@2.3.2` +- Upgraded to `tauri-bundler@2.7.5` + ## \[2.9.5] ### Bug Fixes diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index 89d2ead0c..cbd4bebf6 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-cli" -version = "2.9.5" +version = "2.9.6" authors = ["Tauri Programme within The Commons Conservancy"] edition = "2021" rust-version = "1.77.2" @@ -47,7 +47,7 @@ sublime_fuzzy = "0.7" clap_complete = "4" clap = { version = "4", features = ["derive", "env"] } thiserror = "2" -tauri-bundler = { version = "2.7.4", default-features = false, path = "../tauri-bundler" } +tauri-bundler = { version = "2.7.5", default-features = false, path = "../tauri-bundler" } colored = "2" serde = { version = "1", features = ["derive"] } serde_json = { version = "1", features = ["preserve_order"] } @@ -133,7 +133,7 @@ libc = "0.2" [target."cfg(target_os = \"macos\")".dependencies] plist = "1" -tauri-macos-sign = { version = "2.3.1", path = "../tauri-macos-sign" } +tauri-macos-sign = { version = "2.3.2", path = "../tauri-macos-sign" } object = { version = "0.36", default-features = false, features = [ "macho", "read_core", diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index c71bf6e2d..4ccf34d1b 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.4", + "$id": "https://schema.tauri.app/config/2.9.5", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri-cli/metadata-v2.json b/crates/tauri-cli/metadata-v2.json index b57586d4a..510949b94 100644 --- a/crates/tauri-cli/metadata-v2.json +++ b/crates/tauri-cli/metadata-v2.json @@ -1,9 +1,9 @@ { "cli.js": { - "version": "2.9.5", + "version": "2.9.6", "node": ">= 10.0.0" }, - "tauri": "2.9.4", + "tauri": "2.9.5", "tauri-build": "2.5.3", "tauri-plugin": "2.5.2" } diff --git a/crates/tauri-macos-sign/CHANGELOG.md b/crates/tauri-macos-sign/CHANGELOG.md index 6da5a62a8..6cccf2a3e 100644 --- a/crates/tauri-macos-sign/CHANGELOG.md +++ b/crates/tauri-macos-sign/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.3.2] + +### Dependencies + +- [`514cf21e1`](https://www.github.com/tauri-apps/tauri/commit/514cf21e1417c7a78a0db494f891ba79d948b73d) ([#14591](https://www.github.com/tauri-apps/tauri/pull/14591) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) Update num-bigint-dig from 0.8.4 to 0.8.6 + ## \[2.3.1] ### Performance Improvements diff --git a/crates/tauri-macos-sign/Cargo.toml b/crates/tauri-macos-sign/Cargo.toml index 620c3f750..9fc874364 100644 --- a/crates/tauri-macos-sign/Cargo.toml +++ b/crates/tauri-macos-sign/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-macos-sign" -version = "2.3.1" +version = "2.3.2" authors = ["Tauri Programme within The Commons Conservancy"] license = "Apache-2.0 OR MIT" keywords = ["codesign", "signing", "macos", "ios", "tauri"] diff --git a/crates/tauri-runtime-wry/CHANGELOG.md b/crates/tauri-runtime-wry/CHANGELOG.md index 2fee3f822..76f0a046f 100644 --- a/crates/tauri-runtime-wry/CHANGELOG.md +++ b/crates/tauri-runtime-wry/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.3] + +### Bug Fixes + +- [`251203b89`](https://www.github.com/tauri-apps/tauri/commit/251203b8963419cb3b40741767393e8f3c909ef9) ([#14637](https://www.github.com/tauri-apps/tauri/pull/14637) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix `Monitor::work_area` returns logical position and size inside the `PhysicalRect` on Linux + ## \[2.9.2] ### Dependencies diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index 3284cddbd..339b07f4a 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri-runtime-wry" -version = "2.9.2" +version = "2.9.3" description = "Wry bindings to the Tauri runtime" exclude = ["CHANGELOG.md", "/target"] readme = "README.md" diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index c71bf6e2d..4ccf34d1b 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1,6 +1,6 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://schema.tauri.app/config/2.9.4", + "$id": "https://schema.tauri.app/config/2.9.5", "title": "Config", "description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```", "type": "object", diff --git a/crates/tauri/CHANGELOG.md b/crates/tauri/CHANGELOG.md index d4b868f5e..ea3c1568c 100644 --- a/crates/tauri/CHANGELOG.md +++ b/crates/tauri/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## \[2.9.5] + +### Bug Fixes + +- [`251203b89`](https://www.github.com/tauri-apps/tauri/commit/251203b8963419cb3b40741767393e8f3c909ef9) ([#14637](https://www.github.com/tauri-apps/tauri/pull/14637) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix `Monitor::work_area` returns logical position and size inside the `PhysicalRect` on Linux + +### Dependencies + +- Upgraded to `tauri-runtime-wry@2.9.3` + ## \[2.9.4] ### Performance Improvements diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 48336f82a..4da7736cd 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tauri" -version = "2.9.4" +version = "2.9.5" description = "Make tiny, secure apps for all desktop platforms with Tauri" exclude = ["/test", "/.scripts", "CHANGELOG.md", "/target"] readme = "README.md" @@ -60,7 +60,7 @@ tauri-macros = { version = "2.5.2", path = "../tauri-macros" } tauri-utils = { version = "2.8.1", features = [ "resources", ], path = "../tauri-utils" } -tauri-runtime-wry = { version = "2.9.2", path = "../tauri-runtime-wry", default-features = false, optional = true } +tauri-runtime-wry = { version = "2.9.3", path = "../tauri-runtime-wry", default-features = false, optional = true } getrandom = "0.3" serde_repr = "0.1" http = "1" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 669c6b313..305a65a38 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## \[2.9.6] + +### Dependencies + +- Upgraded to `tauri-cli@2.9.6` + ## \[2.9.5] ### Bug Fixes diff --git a/packages/cli/package.json b/packages/cli/package.json index 0d2bf618c..f6dce72a9 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@tauri-apps/cli", - "version": "2.9.5", + "version": "2.9.6", "description": "Command line interface for building Tauri apps", "type": "commonjs", "funding": { From 18c69df8c771885533c324eece3004c44311aa9c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 13:42:27 +0100 Subject: [PATCH 071/119] chore(deps): update worker-rs crates to 0.7 (#14638) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: FabianLars --- Cargo.lock | 77 ++++++++---------------- crates/tauri-schema-worker/Cargo.toml | 4 +- crates/tauri-schema-worker/wrangler.toml | 3 +- 3 files changed, 28 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d571d8aae..9dae76c32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -3968,9 +3968,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -4319,7 +4319,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -10062,35 +10062,22 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.95", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -10101,9 +10088,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10111,22 +10098,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.95", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] @@ -10146,9 +10133,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -10323,7 +10310,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -10868,9 +10855,9 @@ dependencies = [ [[package]] name = "worker" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6ac1566a3005b790b974f0621d77431e2a47e5f481276485f5ac0485775de2" +checksum = "42c76c5889873a2c309365ad4503810c007d3c25fbb4e9fa9e4e23c4ceb3c7f2" dependencies = [ "async-trait", "axum", @@ -10893,31 +10880,15 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "worker-kv", "worker-macros", "worker-sys", ] -[[package]] -name = "worker-kv" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d30eb90e8db0657414129624c0d12c6cb480574bc2ddd584822db196cb9a52" -dependencies = [ - "js-sys", - "serde", - "serde-wasm-bindgen", - "serde_json", - "thiserror 2.0.12", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "worker-macros" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ba7478759843ae3d56dc7ba2445e7a514a5d043eaa98cebac2789f7ab5221ee" +checksum = "62c62584d037bad33789a6a5d605b3fccea1c52de9251d06f9d44054170dc612" dependencies = [ "async-trait", "proc-macro2", @@ -10931,9 +10902,9 @@ dependencies = [ [[package]] name = "worker-sys" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb4d7a3273dd584b9526aec77bbcf815c51d1a0e17407b1a390cf5a39b6d4fbd" +checksum = "72ddd412fd62c6eeffc1dd85e6ae5960a33b534f44a733df75b6e7519972bc74" dependencies = [ "cfg-if", "js-sys", diff --git a/crates/tauri-schema-worker/Cargo.toml b/crates/tauri-schema-worker/Cargo.toml index 70462e5f9..34da45cc7 100644 --- a/crates/tauri-schema-worker/Cargo.toml +++ b/crates/tauri-schema-worker/Cargo.toml @@ -8,8 +8,8 @@ publish = false crate-type = ["cdylib"] [dependencies] -worker = { version = "0.6", features = ['http', 'axum'] } -worker-macros = { version = "0.6", features = ['http'] } +worker = { version = "0.7", features = ['http', 'axum'] } +worker-macros = { version = "0.7", features = ['http'] } console_error_panic_hook = { version = "0.1" } axum = { version = "0.8", default-features = false } tower-service = "0.3" diff --git a/crates/tauri-schema-worker/wrangler.toml b/crates/tauri-schema-worker/wrangler.toml index c7b811908..661b6059a 100644 --- a/crates/tauri-schema-worker/wrangler.toml +++ b/crates/tauri-schema-worker/wrangler.toml @@ -7,8 +7,9 @@ main = "build/worker/shim.mjs" compatibility_date = "2023-08-23" send_metrics = false +# The minor version of worker-build must match worker/worker-macros in Cargo.toml! [build] -command = "cargo install -q worker-build && worker-build --release" +command = "cargo install -q worker-build@^0.7 && worker-build --release" [observability] enabled = true From 2d28e3143ee3d97d7570ea03877aa00a0d6e47d0 Mon Sep 17 00:00:00 2001 From: sftse Date: Tue, 9 Dec 2025 14:38:14 +0100 Subject: [PATCH 072/119] Cleanups (#14632) * refactor(tauri-utils): current_dest and current_pattern always change in-sync, group them to one Option * refactor(tauri-utils): pass path as explicit argument instead of implicitly through self * refactor(tauri-utils): remove struct field that is never set to Some * refactor(tauri-cli): use OsString, OsStr where possible * refactor(tauri-cli): Deref Arc early * refactor(tauri-cli): lock config before passing to build::setup() * refactor(tauri-build, tauri-utils): bettern pattern matching and borrowing * refactor(tauri-cli): dont need Arc if already have static * fix(tauri-cli): race condition initializing static flag, remove unnecessary OnceLock * refactor(tauri-cli): use expect * refactor(tauri-cli): remove unnecessary OnceLock * refactor(tauri-cli): better use of dunce api * refactor(tauri-cli): rename --- .changes/change-pr-14632.md | 7 +++ crates/tauri-build/src/lib.rs | 16 +++---- .../tauri-bundler/src/bundle/windows/sign.rs | 3 +- crates/tauri-cli/src/build.rs | 39 +++++++-------- crates/tauri-cli/src/bundle.rs | 4 +- crates/tauri-cli/src/dev.rs | 16 +++---- crates/tauri-cli/src/helpers/app_paths.rs | 16 ++----- crates/tauri-cli/src/helpers/config.rs | 35 +++++++------- crates/tauri-cli/src/mobile/android/build.rs | 7 ++- crates/tauri-cli/src/mobile/android/dev.rs | 2 +- crates/tauri-cli/src/mobile/ios/build.rs | 7 ++- crates/tauri-utils/src/config/parse.rs | 2 +- crates/tauri-utils/src/platform.rs | 12 ++--- crates/tauri-utils/src/resources.rs | 47 +++++-------------- 14 files changed, 89 insertions(+), 124 deletions(-) create mode 100644 .changes/change-pr-14632.md diff --git a/.changes/change-pr-14632.md b/.changes/change-pr-14632.md new file mode 100644 index 000000000..068994f0d --- /dev/null +++ b/.changes/change-pr-14632.md @@ -0,0 +1,7 @@ +--- +"tauri-utils": patch:enhance +"tauri-build": patch:enhance +"tauri-cli": patch:enhance +--- + +Small code refactors for improved code readability. No user facing changes. diff --git a/crates/tauri-build/src/lib.rs b/crates/tauri-build/src/lib.rs index cd9724252..42c9275b4 100644 --- a/crates/tauri-build/src/lib.rs +++ b/crates/tauri-build/src/lib.rs @@ -165,21 +165,21 @@ fn copy_frameworks(dest_dir: &Path, frameworks: &[String]) -> Result<()> { .with_context(|| format!("Failed to create frameworks output directory at {dest_dir:?}"))?; for framework in frameworks.iter() { if framework.ends_with(".framework") { - let src_path = PathBuf::from(framework); + let src_path = Path::new(framework); let src_name = src_path .file_name() .expect("Couldn't get framework filename"); let dest_path = dest_dir.join(src_name); - copy_dir(&src_path, &dest_path)?; + copy_dir(src_path, &dest_path)?; continue; } else if framework.ends_with(".dylib") { - let src_path = PathBuf::from(framework); + let src_path = Path::new(framework); if !src_path.exists() { return Err(anyhow::anyhow!("Library not found: {}", framework)); } let src_name = src_path.file_name().expect("Couldn't get library filename"); let dest_path = dest_dir.join(src_name); - copy_file(&src_path, &dest_path)?; + copy_file(src_path, &dest_path)?; continue; } else if framework.contains('/') { return Err(anyhow::anyhow!( @@ -192,12 +192,8 @@ fn copy_frameworks(dest_dir: &Path, frameworks: &[String]) -> Result<()> { continue; } } - if copy_framework_from(&PathBuf::from("/Library/Frameworks/"), framework, dest_dir)? - || copy_framework_from( - &PathBuf::from("/Network/Library/Frameworks/"), - framework, - dest_dir, - )? + if copy_framework_from("/Library/Frameworks/".as_ref(), framework, dest_dir)? + || copy_framework_from("/Network/Library/Frameworks/".as_ref(), framework, dest_dir)? { continue; } diff --git a/crates/tauri-bundler/src/bundle/windows/sign.rs b/crates/tauri-bundler/src/bundle/windows/sign.rs index 04e5a2da5..f7c7ad1e2 100644 --- a/crates/tauri-bundler/src/bundle/windows/sign.rs +++ b/crates/tauri-bundler/src/bundle/windows/sign.rs @@ -266,8 +266,7 @@ pub fn try_sign>(file_path: P, settings: &Settings) -> crate::Res pub fn should_sign(file_path: &Path) -> crate::Result { let is_binary = file_path .extension() - .and_then(|extension| extension.to_str()) - .is_some_and(|extension| matches!(extension, "exe" | "dll")); + .is_some_and(|ext| ext == "exe" || ext == "dll"); if !is_binary { return Ok(false); } diff --git a/crates/tauri-cli/src/build.rs b/crates/tauri-cli/src/build.rs index 12accb16f..ac8c5552a 100644 --- a/crates/tauri-cli/src/build.rs +++ b/crates/tauri-cli/src/build.rs @@ -8,7 +8,7 @@ use crate::{ helpers::{ self, app_paths::{frontend_dir, tauri_dir}, - config::{get as get_config, ConfigHandle, FrontendDist}, + config::{get as get_config, ConfigMetadata, FrontendDist}, }, info::plugins::check_mismatched_packages, interface::{rust::get_cargo_target_dir, AppInterface, Interface}, @@ -106,11 +106,11 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> { options.target.clone(), )?; - setup(&interface, &mut options, config.clone(), false)?; - let config_guard = config.lock().unwrap(); let config_ = config_guard.as_ref().unwrap(); + setup(&interface, &mut options, config_, false)?; + if let Some(minimum_system_version) = &config_.bundle.macos.minimum_system_version { std::env::set_var("MACOSX_DEPLOYMENT_TARGET", minimum_system_version); } @@ -132,7 +132,7 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> { verbosity, ci, &interface, - &app_settings, + &*app_settings, config_, &out_dir, )?; @@ -144,7 +144,7 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> { pub fn setup( interface: &AppInterface, options: &mut Options, - config: ConfigHandle, + config: &ConfigMetadata, mobile: bool, ) -> Result<()> { let tauri_path = tauri_dir(); @@ -162,44 +162,39 @@ pub fn setup( set_current_dir(tauri_path).context("failed to set current directory")?; - let config_guard = config.lock().unwrap(); - let config_ = config_guard.as_ref().unwrap(); - - let bundle_identifier_source = config_ + let bundle_identifier_source = config .find_bundle_identifier_overwriter() .unwrap_or_else(|| "tauri.conf.json".into()); - if config_.identifier == "com.tauri.dev" { + if config.identifier == "com.tauri.dev" { crate::error::bail!( "You must change the bundle identifier in `{bundle_identifier_source} identifier`. The default value `com.tauri.dev` is not allowed as it must be unique across applications.", ); } - if config_ + if config .identifier .chars() .any(|ch| !(ch.is_alphanumeric() || ch == '-' || ch == '.')) { crate::error::bail!( - "The bundle identifier \"{}\" set in `{} identifier`. The bundle identifier string must contain only alphanumeric characters (A-Z, a-z, and 0-9), hyphens (-), and periods (.).", - config_.identifier, - bundle_identifier_source + "The bundle identifier \"{}\" set in `{bundle_identifier_source:?} identifier`. The bundle identifier string must contain only alphanumeric characters (A-Z, a-z, and 0-9), hyphens (-), and periods (.).", + config.identifier, ); } - if config_.identifier.ends_with(".app") { + if config.identifier.ends_with(".app") { log::warn!( - "The bundle identifier \"{}\" set in `{} identifier` ends with `.app`. This is not recommended because it conflicts with the application bundle extension on macOS.", - config_.identifier, - bundle_identifier_source + "The bundle identifier \"{}\" set in `{bundle_identifier_source:?} identifier` ends with `.app`. This is not recommended because it conflicts with the application bundle extension on macOS.", + config.identifier, ); } - if let Some(before_build) = config_.build.before_build_command.clone() { + if let Some(before_build) = config.build.before_build_command.clone() { helpers::run_hook("beforeBuildCommand", before_build, interface, options.debug)?; } - if let Some(FrontendDist::Directory(web_asset_path)) = &config_.build.frontend_dist { + if let Some(FrontendDist::Directory(web_asset_path)) = &config.build.frontend_dist { if !web_asset_path.exists() { let absolute_path = web_asset_path .parent() @@ -252,13 +247,13 @@ pub fn setup( } if options.runner.is_none() { - options.runner = config_.build.runner.clone(); + options.runner = config.build.runner.clone(); } options .features .get_or_insert(Vec::new()) - .extend(config_.build.features.clone().unwrap_or_default()); + .extend(config.build.features.clone().unwrap_or_default()); interface.build_options(&mut options.args, &mut options.features, mobile); Ok(()) diff --git a/crates/tauri-cli/src/bundle.rs b/crates/tauri-cli/src/bundle.rs index 890386cd7..646f44ddb 100644 --- a/crates/tauri-cli/src/bundle.rs +++ b/crates/tauri-cli/src/bundle.rs @@ -158,7 +158,7 @@ pub fn command(options: Options, verbosity: u8) -> crate::Result<()> { verbosity, ci, &interface, - &app_settings, + &*app_settings, config_, &out_dir, ) @@ -170,7 +170,7 @@ pub fn bundle( verbosity: u8, ci: bool, interface: &AppInterface, - app_settings: &std::sync::Arc, + app_settings: &A, config: &ConfigMetadata, out_dir: &Path, ) -> crate::Result<()> { diff --git a/crates/tauri-cli/src/dev.rs b/crates/tauri-cli/src/dev.rs index 9179e9cfd..7ebabb458 100644 --- a/crates/tauri-cli/src/dev.rs +++ b/crates/tauri-cli/src/dev.rs @@ -34,7 +34,7 @@ use std::{ mod builtin_dev_server; static BEFORE_DEV: OnceLock>> = OnceLock::new(); -static KILL_BEFORE_DEV_FLAG: OnceLock = OnceLock::new(); +static KILL_BEFORE_DEV_FLAG: AtomicBool = AtomicBool::new(false); #[cfg(unix)] const KILL_CHILDREN_SCRIPT: &[u8] = include_bytes!("../scripts/kill-children.sh"); @@ -218,14 +218,13 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand let status = child_ .wait() .expect("failed to wait on \"beforeDevCommand\""); - if !(status.success() || KILL_BEFORE_DEV_FLAG.get().unwrap().load(Ordering::Relaxed)) { + if !(status.success() || KILL_BEFORE_DEV_FLAG.load(Ordering::Relaxed)) { log::error!("The \"beforeDevCommand\" terminated with a non-zero status code."); exit(status.code().unwrap_or(1)); } }); BEFORE_DEV.set(Mutex::new(child)).unwrap(); - KILL_BEFORE_DEV_FLAG.set(AtomicBool::default()).unwrap(); let _ = ctrlc::set_handler(move || { kill_before_dev_process(); @@ -304,12 +303,10 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand if !options.no_dev_server_wait { if let Some(url) = dev_url { - let host = url - .host() - .unwrap_or_else(|| panic!("No host name in the URL")); + let host = url.host().expect("No host name in the URL"); let port = url .port_or_known_default() - .unwrap_or_else(|| panic!("No port number in the URL")); + .expect("No port number in the URL"); let addrs; let addr; let addrs = match host { @@ -380,11 +377,10 @@ pub fn on_app_exit(code: Option, reason: ExitReason, exit_on_panic: bool, n pub fn kill_before_dev_process() { if let Some(child) = BEFORE_DEV.get() { let child = child.lock().unwrap(); - let kill_before_dev_flag = KILL_BEFORE_DEV_FLAG.get().unwrap(); - if kill_before_dev_flag.load(Ordering::Relaxed) { + if KILL_BEFORE_DEV_FLAG.load(Ordering::Relaxed) { return; } - kill_before_dev_flag.store(true, Ordering::Relaxed); + KILL_BEFORE_DEV_FLAG.store(true, Ordering::Relaxed); #[cfg(windows)] { let powershell_path = std::env::var("SYSTEMROOT").map_or_else( diff --git a/crates/tauri-cli/src/helpers/app_paths.rs b/crates/tauri-cli/src/helpers/app_paths.rs index 1bf1ef9b5..3c728f5ba 100644 --- a/crates/tauri-cli/src/helpers/app_paths.rs +++ b/crates/tauri-cli/src/helpers/app_paths.rs @@ -75,21 +75,13 @@ fn lookup bool>(dir: &Path, checker: F) -> Option { } fn env_tauri_app_path() -> Option { - std::env::var(ENV_TAURI_APP_PATH) - .map(PathBuf::from) - .ok()? - .canonicalize() - .ok() - .map(|p| dunce::simplified(&p).to_path_buf()) + let p = PathBuf::from(std::env::var_os(ENV_TAURI_APP_PATH)?); + dunce::canonicalize(p).ok() } fn env_tauri_frontend_path() -> Option { - std::env::var(ENV_TAURI_FRONTEND_PATH) - .map(PathBuf::from) - .ok()? - .canonicalize() - .ok() - .map(|p| dunce::simplified(&p).to_path_buf()) + let p = PathBuf::from(std::env::var_os(ENV_TAURI_FRONTEND_PATH)?); + dunce::canonicalize(p).ok() } pub fn resolve_tauri_dir() -> Option { diff --git a/crates/tauri-cli/src/helpers/config.rs b/crates/tauri-cli/src/helpers/config.rs index f21ce4a4b..d25c29d4f 100644 --- a/crates/tauri-cli/src/helpers/config.rs +++ b/crates/tauri-cli/src/helpers/config.rs @@ -12,9 +12,9 @@ pub use tauri_utils::{config::*, platform::Target}; use std::{ collections::HashMap, env::{current_dir, set_current_dir, set_var}, - ffi::OsStr, + ffi::{OsStr, OsString}, process::exit, - sync::{Arc, Mutex, OnceLock}, + sync::Mutex, }; use crate::error::Context; @@ -30,7 +30,7 @@ pub struct ConfigMetadata { inner: Config, /// The config extensions (platform-specific config files or the config CLI argument). /// Maps the extension name to its value. - extensions: HashMap, + extensions: HashMap, } impl std::ops::Deref for ConfigMetadata { @@ -50,7 +50,7 @@ impl ConfigMetadata { } /// Checks which config is overwriting the bundle identifier. - pub fn find_bundle_identifier_overwriter(&self) -> Option { + pub fn find_bundle_identifier_overwriter(&self) -> Option { for (ext, config) in &self.extensions { if let Some(identifier) = config .as_object() @@ -66,7 +66,7 @@ impl ConfigMetadata { } } -pub type ConfigHandle = Arc>>; +pub type ConfigHandle = &'static Mutex>; pub fn wix_settings(config: WixConfig) -> tauri_bundler::WixSettings { tauri_bundler::WixSettings { @@ -141,9 +141,9 @@ pub fn custom_sign_settings( } } -fn config_handle() -> &'static ConfigHandle { - static CONFIG_HANDLE: OnceLock = OnceLock::new(); - CONFIG_HANDLE.get_or_init(Default::default) +fn config_handle() -> ConfigHandle { + static CONFIG_HANDLE: Mutex> = Mutex::new(None); + &CONFIG_HANDLE } /// Gets the static parsed config from `tauri.conf.json`. @@ -153,14 +153,14 @@ fn get_internal( target: Target, ) -> crate::Result { if !reload && config_handle().lock().unwrap().is_some() { - return Ok(config_handle().clone()); + return Ok(config_handle()); } let tauri_dir = super::app_paths::tauri_dir(); let (mut config, config_path) = tauri_utils::config::parse::parse_value(target, tauri_dir.join("tauri.conf.json")) .context("failed to parse config")?; - let config_file_name = config_path.file_name().unwrap().to_string_lossy(); + let config_file_name = config_path.file_name().unwrap(); let mut extensions = HashMap::new(); let original_identifier = config @@ -174,10 +174,7 @@ fn get_internal( .context("failed to parse platform config")? { merge(&mut config, &platform_config); - extensions.insert( - config_path.file_name().unwrap().to_str().unwrap().into(), - platform_config, - ); + extensions.insert(config_path.file_name().unwrap().into(), platform_config); } if !merge_configs.is_empty() { @@ -203,9 +200,9 @@ fn get_internal( for error in errors { let path = error.instance_path.into_iter().join(" > "); if path.is_empty() { - log::error!("`{}` error: {}", config_file_name, error); + log::error!("`{config_file_name:?}` error: {}", error); } else { - log::error!("`{}` error on `{}`: {}", config_file_name, path, error); + log::error!("`{config_file_name:?}` error on `{}`: {}", path, error); } } if !reload { @@ -243,7 +240,7 @@ fn get_internal( extensions, }); - Ok(config_handle().clone()) + Ok(config_handle()) } pub fn get(target: Target, merge_configs: &[&serde_json::Value]) -> crate::Result { @@ -268,7 +265,7 @@ pub fn merge_with(merge_configs: &[&serde_json::Value]) -> crate::Result crate::Result Result) -> bool { let path = path.into(); - let source_file_name = path.file_name().unwrap().to_str().unwrap(); + let source_file_name = path.file_name().unwrap(); let lookup_platform_config = ENABLED_FORMATS .iter() .any(|format| source_file_name == format.into_platform_file_name(target)); diff --git a/crates/tauri-utils/src/platform.rs b/crates/tauri-utils/src/platform.rs index 542cea53c..2ace45790 100644 --- a/crates/tauri-utils/src/platform.rs +++ b/crates/tauri-utils/src/platform.rs @@ -238,16 +238,12 @@ const CARGO_OUTPUT_DIRECTORIES: &[&str] = &["debug", "release", "custom-profile" #[cfg(test)] fn is_cargo_output_directory(path: &std::path::Path) -> bool { - let last_component = path - .components() - .next_back() - .unwrap() - .as_os_str() - .to_str() - .unwrap(); + let Some(last_component) = path.components().next_back() else { + return false; + }; CARGO_OUTPUT_DIRECTORIES .iter() - .any(|dirname| &last_component == dirname) + .any(|dirname| &last_component.as_os_str() == dirname) } /// Computes the resource directory of the current environment. diff --git a/crates/tauri-utils/src/resources.rs b/crates/tauri-utils/src/resources.rs index 58a07d265..dfba0746c 100644 --- a/crates/tauri-utils/src/resources.rs +++ b/crates/tauri-utils/src/resources.rs @@ -97,9 +97,7 @@ impl<'a> ResourcePaths<'a> { iter: ResourcePathsIter { pattern_iter: PatternIter::Slice(patterns.iter()), allow_walk, - current_path: None, current_pattern: None, - current_dest: None, walk_iter: None, glob_iter: None, }, @@ -112,9 +110,7 @@ impl<'a> ResourcePaths<'a> { iter: ResourcePathsIter { pattern_iter: PatternIter::Map(patterns.iter()), allow_walk, - current_path: None, current_pattern: None, - current_dest: None, walk_iter: None, glob_iter: None, }, @@ -136,13 +132,9 @@ pub struct ResourcePathsIter<'a> { /// whether the resource paths allows directories or not. allow_walk: bool, - current_path: Option, - /// The key of map when `pattern_iter` is a [`PatternIter::Map`], + /// The (key, value) of map when `pattern_iter` is a [`PatternIter::Map`], /// used for determining [`Resource::target`] - current_pattern: Option, - /// The value of the map when `pattern_iter` is a [`PatternIter::Map`], - /// used for determining [`Resource::target`] - current_dest: Option, + current_pattern: Option<(String, PathBuf)>, walk_iter: Option, glob_iter: Option, @@ -157,8 +149,7 @@ impl ResourcePathsIter<'_> { Err(err) => return Some(Err(err.into())), }; - self.current_path = Some(normalize(&entry)); - self.next_current_path() + self.next_current_path(normalize(&entry)) } fn next_walk_iter(&mut self) -> Option> { @@ -169,8 +160,7 @@ impl ResourcePathsIter<'_> { Err(err) => return Some(Err(err.into())), }; - self.current_path = Some(normalize(entry.path())); - self.next_current_path() + self.next_current_path(normalize(entry.path())) } fn resource_from_path(&mut self, path: &Path) -> crate::Result { @@ -180,12 +170,11 @@ impl ResourcePathsIter<'_> { Ok(Resource { path: path.to_path_buf(), - target: if let Some(current_dest) = &self.current_dest { + target: if let Some((pattern, dest)) = &self.current_pattern { // if processing a directory, preserve directory structure under current_dest if self.walk_iter.is_some() { - let current_pattern = self.current_pattern.as_ref().unwrap(); - current_dest.join(path.strip_prefix(current_pattern).unwrap_or(path)) - } else if current_dest.components().count() == 0 { + dest.join(path.strip_prefix(pattern).unwrap_or(path)) + } else if dest.components().count() == 0 { // if current_dest is empty while processing a file pattern or glob // we preserve the file name as it is PathBuf::from(path.file_name().unwrap()) @@ -193,9 +182,9 @@ impl ResourcePathsIter<'_> { // if processing a glob and current_dest is not empty // we put all globbed paths under current_dest // preserving the file name as it is - current_dest.join(path.file_name().unwrap()) + dest.join(path.file_name().unwrap()) } else { - current_dest.clone() + dest.clone() } } else { // If `pattern_iter` is a [`PatternIter::Slice`] @@ -204,11 +193,7 @@ impl ResourcePathsIter<'_> { }) } - fn next_current_path(&mut self) -> Option> { - // should be safe to unwrap since every call to `self.next_current_path()` - // is preceded with assignment to `self.current_path` - let path = self.current_path.take().unwrap(); - + fn next_current_path(&mut self, path: PathBuf) -> Option> { let is_dir = path.is_dir(); if is_dir { @@ -238,15 +223,12 @@ impl ResourcePathsIter<'_> { fn next_pattern(&mut self) -> Option> { self.current_pattern = None; - self.current_dest = None; - self.current_path = None; let pattern = match &mut self.pattern_iter { PatternIter::Slice(iter) => iter.next()?, PatternIter::Map(iter) => { let (pattern, dest) = iter.next()?; - self.current_pattern = Some(pattern.clone()); - self.current_dest = Some(resource_relpath(Path::new(dest))); + self.current_pattern = Some((pattern.clone(), resource_relpath(Path::new(dest)))); pattern } }; @@ -265,8 +247,7 @@ impl ResourcePathsIter<'_> { } } - self.current_path = Some(normalize(Path::new(pattern))); - self.next_current_path() + self.next_current_path(normalize(Path::new(pattern))) } } @@ -282,10 +263,6 @@ impl Iterator for ResourcePathsIter<'_> { type Item = crate::Result; fn next(&mut self) -> Option> { - if self.current_path.is_some() { - return self.next_current_path(); - } - if self.walk_iter.is_some() { match self.next_walk_iter() { Some(r) => return Some(r), From ff5d76ca214b94a7b6e88aa4f0f797bbf747824d Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 14 Dec 2025 16:21:44 +0800 Subject: [PATCH 073/119] fix: default `WindowConfig::focus` to false in `Default::default` (#14653) --- .changes/window-config-focus-default-true.md | 5 +++++ crates/tauri-cli/config.schema.json | 2 +- .../schemas/config.schema.json | 2 +- crates/tauri-utils/src/config.rs | 12 ++++++++++-- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 .changes/window-config-focus-default-true.md diff --git a/.changes/window-config-focus-default-true.md b/.changes/window-config-focus-default-true.md new file mode 100644 index 000000000..38d24aebc --- /dev/null +++ b/.changes/window-config-focus-default-true.md @@ -0,0 +1,5 @@ +--- +tauri: patch:bug +--- + +`WindowConfig::focus` is set to `false` in `WindowConfig::default()` diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 4ccf34d1b..148379e83 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -231,7 +231,7 @@ "type": "string" }, "create": { - "description": "Whether Tauri should create this window at app startup or not.\n\n When this is set to `false` you must manually grab the config object via `app.config().app.windows`\n and create it with [`WebviewWindowBuilder::from_config`](https://docs.rs/tauri/2/tauri/webview/struct.WebviewWindowBuilder.html#method.from_config).\n\n ## Example:\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", + "description": "Whether Tauri should create this window at app startup or not.\n\n When this is set to `false` you must manually grab the config object via `app.config().app.windows`\n and create it with [`WebviewWindowBuilder::from_config`](https://docs.rs/tauri/2/tauri/webview/struct.WebviewWindowBuilder.html#method.from_config).\n\n ## Example:\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), &app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", "default": true, "type": "boolean" }, diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 4ccf34d1b..148379e83 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -231,7 +231,7 @@ "type": "string" }, "create": { - "description": "Whether Tauri should create this window at app startup or not.\n\n When this is set to `false` you must manually grab the config object via `app.config().app.windows`\n and create it with [`WebviewWindowBuilder::from_config`](https://docs.rs/tauri/2/tauri/webview/struct.WebviewWindowBuilder.html#method.from_config).\n\n ## Example:\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", + "description": "Whether Tauri should create this window at app startup or not.\n\n When this is set to `false` you must manually grab the config object via `app.config().app.windows`\n and create it with [`WebviewWindowBuilder::from_config`](https://docs.rs/tauri/2/tauri/webview/struct.WebviewWindowBuilder.html#method.from_config).\n\n ## Example:\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), &app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", "default": true, "type": "boolean" }, diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index c90dc3e59..24b111830 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -1653,7 +1653,7 @@ pub struct WindowConfig { /// ```rust /// tauri::Builder::default() /// .setup(|app| { - /// tauri::WebviewWindowBuilder::from_config(app.handle(), app.config().app.windows[0])?.build()?; + /// tauri::WebviewWindowBuilder::from_config(app.handle(), &app.config().app.windows[0])?.build()?; /// Ok(()) /// }); /// ``` @@ -2006,7 +2006,7 @@ impl Default for WindowConfig { closable: true, title: default_title(), fullscreen: false, - focus: false, + focus: true, focusable: true, transparent: false, maximized: false, @@ -4384,4 +4384,12 @@ mod test { assert!(object_json.contains("\"cwd\":null") || !object_json.contains("cwd")); assert!(object_json.contains("\"args\":null") || !object_json.contains("args")); } + + #[test] + fn window_config_default_same_as_deserialize() { + let config_from_deserialization: WindowConfig = serde_json::from_str("{}").unwrap(); + let config_from_default: WindowConfig = WindowConfig::default(); + + assert_eq!(config_from_deserialization, config_from_default); + } } From b79386010d2be0a92d7109231314a1e3a6256bfc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 22:49:52 +0800 Subject: [PATCH 074/119] chore(deps): update dependency rollup to v4.53.4 (#14670) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index bc7aba711..930142eb2 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.53.3", + "rollup": "4.53.4", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c0f85ced8..e273bc3dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.53.3) + version: 0.4.4(rollup@4.53.4) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.53.3)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.53.4)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.53.3 - version: 4.53.3 + specifier: 4.53.4 + version: 4.53.4 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1125,113 +1125,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.53.4': + resolution: {integrity: sha512-PWU3Y92H4DD0bOqorEPp1Y0tbzwAurFmIYpjcObv5axGVOtcTlB0b2UKMd2echo08MgN7jO8WQZSSysvfisFSQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.53.4': + resolution: {integrity: sha512-Gw0/DuVm3rGsqhMGYkSOXXIx20cC3kTlivZeuaGt4gEgILivykNyBWxeUV5Cf2tDA2nPLah26vq3emlRrWVbng==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.53.4': + resolution: {integrity: sha512-+w06QvXsgzKwdVg5qRLZpTHh1bigHZIqoIUPtiqh05ZiJVUQ6ymOxaPkXTvRPRLH88575ZCRSRM3PwIoNma01Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.53.4': + resolution: {integrity: sha512-EB4Na9G2GsrRNRNFPuxfwvDRDUwQEzJPpiK1vo2zMVhEeufZ1k7J1bKnT0JYDfnPC7RNZ2H5YNQhW6/p2QKATw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.53.4': + resolution: {integrity: sha512-bldA8XEqPcs6OYdknoTMaGhjytnwQ0NClSPpWpmufOuGPN5dDmvIa32FygC2gneKK4A1oSx86V1l55hyUWUYFQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.53.4': + resolution: {integrity: sha512-3T8GPjH6mixCd0YPn0bXtcuSXi1Lj+15Ujw2CEb7dd24j9thcKscCf88IV7n76WaAdorOzAgSSbuVRg4C8V8Qw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.4': + resolution: {integrity: sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.53.4': + resolution: {integrity: sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.53.4': + resolution: {integrity: sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.53.4': + resolution: {integrity: sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.53.4': + resolution: {integrity: sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-ppc64-gnu@4.53.4': + resolution: {integrity: sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-riscv64-gnu@4.53.4': + resolution: {integrity: sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.53.4': + resolution: {integrity: sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.53.4': + resolution: {integrity: sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.53.4': + resolution: {integrity: sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.53.4': + resolution: {integrity: sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openharmony-arm64@4.53.4': + resolution: {integrity: sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.53.4': + resolution: {integrity: sha512-WvUpUAWmUxZKtRnQWpRKnLW2DEO8HB/l8z6oFFMNuHndMzFTJEXzaYJ5ZAmzNw0L21QQJZsUQFt2oPf3ykAD/w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.53.4': + resolution: {integrity: sha512-JGbeF2/FDU0x2OLySw/jgvkwWUo05BSiJK0dtuI4LyuXbz3wKiC1xHhLB1Tqm5VU6ZZDmAorj45r/IgWNWku5g==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.53.4': + resolution: {integrity: sha512-zuuC7AyxLWLubP+mlUwEyR8M1ixW1ERNPHJfXm8x7eQNP4Pzkd7hS3qBuKBR70VRiQ04Kw8FNfRMF5TNxuZq2g==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.53.4': + resolution: {integrity: sha512-Sbx45u/Lbb5RyptSbX7/3deP+/lzEmZ0BTSHxwxN/IMOZDZf8S0AGo0hJD5n/LQssxb5Z3B4og4P2X6Dd8acCA==} cpu: [x64] os: [win32] @@ -2151,8 +2151,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.53.4: + resolution: {integrity: sha512-YpXaaArg0MvrnJpvduEDYIp7uGOqKXbH9NsHGQ6SxKCOsNAjZF018MmxefFUulVP2KLtiGw1UvZbr+/ekjvlDg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3290,95 +3290,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.53.3)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.4)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.53.3 + rollup: 4.53.4 - '@rollup/plugin-typescript@12.3.0(rollup@4.53.3)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.53.4)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.53.3) + '@rollup/pluginutils': 5.2.0(rollup@4.53.4) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.53.3 + rollup: 4.53.4 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.53.3)': + '@rollup/pluginutils@5.2.0(rollup@4.53.4)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.3 + rollup: 4.53.4 - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-android-arm-eabi@4.53.4': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-android-arm64@4.53.4': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-darwin-arm64@4.53.4': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-darwin-x64@4.53.4': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.53.4': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-freebsd-x64@4.53.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.53.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.53.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.53.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.53.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.53.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.53.4': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-linux-x64-musl@4.53.4': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-openharmony-arm64@4.53.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.53.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.53.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-x64-gnu@4.53.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.53.4': optional: true '@standard-schema/spec@1.0.0': {} @@ -4385,32 +4385,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.3: + rollup@4.53.4: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.53.4 + '@rollup/rollup-android-arm64': 4.53.4 + '@rollup/rollup-darwin-arm64': 4.53.4 + '@rollup/rollup-darwin-x64': 4.53.4 + '@rollup/rollup-freebsd-arm64': 4.53.4 + '@rollup/rollup-freebsd-x64': 4.53.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.4 + '@rollup/rollup-linux-arm-musleabihf': 4.53.4 + '@rollup/rollup-linux-arm64-gnu': 4.53.4 + '@rollup/rollup-linux-arm64-musl': 4.53.4 + '@rollup/rollup-linux-loong64-gnu': 4.53.4 + '@rollup/rollup-linux-ppc64-gnu': 4.53.4 + '@rollup/rollup-linux-riscv64-gnu': 4.53.4 + '@rollup/rollup-linux-riscv64-musl': 4.53.4 + '@rollup/rollup-linux-s390x-gnu': 4.53.4 + '@rollup/rollup-linux-x64-gnu': 4.53.4 + '@rollup/rollup-linux-x64-musl': 4.53.4 + '@rollup/rollup-openharmony-arm64': 4.53.4 + '@rollup/rollup-win32-arm64-msvc': 4.53.4 + '@rollup/rollup-win32-ia32-msvc': 4.53.4 + '@rollup/rollup-win32-x64-gnu': 4.53.4 + '@rollup/rollup-win32-x64-msvc': 4.53.4 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4652,7 +4652,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.3 + rollup: 4.53.4 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From e290642fb4ccd2b656517aa771bf21d8dcf5f118 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:15:17 +0800 Subject: [PATCH 075/119] chore(deps): update dependency rollup to v4.53.5 (#14676) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 930142eb2..6b3bffdf0 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.53.4", + "rollup": "4.53.5", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e273bc3dd..381ee880b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.53.4) + version: 0.4.4(rollup@4.53.5) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.53.4)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.53.5)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.53.4 - version: 4.53.4 + specifier: 4.53.5 + version: 4.53.5 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1125,113 +1125,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.4': - resolution: {integrity: sha512-PWU3Y92H4DD0bOqorEPp1Y0tbzwAurFmIYpjcObv5axGVOtcTlB0b2UKMd2echo08MgN7jO8WQZSSysvfisFSQ==} + '@rollup/rollup-android-arm-eabi@4.53.5': + resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.4': - resolution: {integrity: sha512-Gw0/DuVm3rGsqhMGYkSOXXIx20cC3kTlivZeuaGt4gEgILivykNyBWxeUV5Cf2tDA2nPLah26vq3emlRrWVbng==} + '@rollup/rollup-android-arm64@4.53.5': + resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.4': - resolution: {integrity: sha512-+w06QvXsgzKwdVg5qRLZpTHh1bigHZIqoIUPtiqh05ZiJVUQ6ymOxaPkXTvRPRLH88575ZCRSRM3PwIoNma01Q==} + '@rollup/rollup-darwin-arm64@4.53.5': + resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.4': - resolution: {integrity: sha512-EB4Na9G2GsrRNRNFPuxfwvDRDUwQEzJPpiK1vo2zMVhEeufZ1k7J1bKnT0JYDfnPC7RNZ2H5YNQhW6/p2QKATw==} + '@rollup/rollup-darwin-x64@4.53.5': + resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.4': - resolution: {integrity: sha512-bldA8XEqPcs6OYdknoTMaGhjytnwQ0NClSPpWpmufOuGPN5dDmvIa32FygC2gneKK4A1oSx86V1l55hyUWUYFQ==} + '@rollup/rollup-freebsd-arm64@4.53.5': + resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.4': - resolution: {integrity: sha512-3T8GPjH6mixCd0YPn0bXtcuSXi1Lj+15Ujw2CEb7dd24j9thcKscCf88IV7n76WaAdorOzAgSSbuVRg4C8V8Qw==} + '@rollup/rollup-freebsd-x64@4.53.5': + resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.4': - resolution: {integrity: sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': + resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.4': - resolution: {integrity: sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==} + '@rollup/rollup-linux-arm-musleabihf@4.53.5': + resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.4': - resolution: {integrity: sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==} + '@rollup/rollup-linux-arm64-gnu@4.53.5': + resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.4': - resolution: {integrity: sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==} + '@rollup/rollup-linux-arm64-musl@4.53.5': + resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.4': - resolution: {integrity: sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==} + '@rollup/rollup-linux-loong64-gnu@4.53.5': + resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.4': - resolution: {integrity: sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==} + '@rollup/rollup-linux-ppc64-gnu@4.53.5': + resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.4': - resolution: {integrity: sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==} + '@rollup/rollup-linux-riscv64-gnu@4.53.5': + resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.4': - resolution: {integrity: sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==} + '@rollup/rollup-linux-riscv64-musl@4.53.5': + resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.4': - resolution: {integrity: sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==} + '@rollup/rollup-linux-s390x-gnu@4.53.5': + resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.4': - resolution: {integrity: sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==} + '@rollup/rollup-linux-x64-gnu@4.53.5': + resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.4': - resolution: {integrity: sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==} + '@rollup/rollup-linux-x64-musl@4.53.5': + resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.4': - resolution: {integrity: sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==} + '@rollup/rollup-openharmony-arm64@4.53.5': + resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.4': - resolution: {integrity: sha512-WvUpUAWmUxZKtRnQWpRKnLW2DEO8HB/l8z6oFFMNuHndMzFTJEXzaYJ5ZAmzNw0L21QQJZsUQFt2oPf3ykAD/w==} + '@rollup/rollup-win32-arm64-msvc@4.53.5': + resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.4': - resolution: {integrity: sha512-JGbeF2/FDU0x2OLySw/jgvkwWUo05BSiJK0dtuI4LyuXbz3wKiC1xHhLB1Tqm5VU6ZZDmAorj45r/IgWNWku5g==} + '@rollup/rollup-win32-ia32-msvc@4.53.5': + resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.4': - resolution: {integrity: sha512-zuuC7AyxLWLubP+mlUwEyR8M1ixW1ERNPHJfXm8x7eQNP4Pzkd7hS3qBuKBR70VRiQ04Kw8FNfRMF5TNxuZq2g==} + '@rollup/rollup-win32-x64-gnu@4.53.5': + resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.4': - resolution: {integrity: sha512-Sbx45u/Lbb5RyptSbX7/3deP+/lzEmZ0BTSHxwxN/IMOZDZf8S0AGo0hJD5n/LQssxb5Z3B4og4P2X6Dd8acCA==} + '@rollup/rollup-win32-x64-msvc@4.53.5': + resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} cpu: [x64] os: [win32] @@ -2151,8 +2151,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.4: - resolution: {integrity: sha512-YpXaaArg0MvrnJpvduEDYIp7uGOqKXbH9NsHGQ6SxKCOsNAjZF018MmxefFUulVP2KLtiGw1UvZbr+/ekjvlDg==} + rollup@4.53.5: + resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3290,95 +3290,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.53.4)': + '@rollup/plugin-terser@0.4.4(rollup@4.53.5)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.53.4 + rollup: 4.53.5 - '@rollup/plugin-typescript@12.3.0(rollup@4.53.4)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.53.5)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.53.4) + '@rollup/pluginutils': 5.2.0(rollup@4.53.5) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.53.4 + rollup: 4.53.5 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.53.4)': + '@rollup/pluginutils@5.2.0(rollup@4.53.5)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.4 + rollup: 4.53.5 - '@rollup/rollup-android-arm-eabi@4.53.4': + '@rollup/rollup-android-arm-eabi@4.53.5': optional: true - '@rollup/rollup-android-arm64@4.53.4': + '@rollup/rollup-android-arm64@4.53.5': optional: true - '@rollup/rollup-darwin-arm64@4.53.4': + '@rollup/rollup-darwin-arm64@4.53.5': optional: true - '@rollup/rollup-darwin-x64@4.53.4': + '@rollup/rollup-darwin-x64@4.53.5': optional: true - '@rollup/rollup-freebsd-arm64@4.53.4': + '@rollup/rollup-freebsd-arm64@4.53.5': optional: true - '@rollup/rollup-freebsd-x64@4.53.4': + '@rollup/rollup-freebsd-x64@4.53.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.4': + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.4': + '@rollup/rollup-linux-arm-musleabihf@4.53.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.4': + '@rollup/rollup-linux-arm64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.4': + '@rollup/rollup-linux-arm64-musl@4.53.5': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.4': + '@rollup/rollup-linux-loong64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.4': + '@rollup/rollup-linux-ppc64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.4': + '@rollup/rollup-linux-riscv64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.4': + '@rollup/rollup-linux-riscv64-musl@4.53.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.4': + '@rollup/rollup-linux-s390x-gnu@4.53.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.4': + '@rollup/rollup-linux-x64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-x64-musl@4.53.4': + '@rollup/rollup-linux-x64-musl@4.53.5': optional: true - '@rollup/rollup-openharmony-arm64@4.53.4': + '@rollup/rollup-openharmony-arm64@4.53.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.4': + '@rollup/rollup-win32-arm64-msvc@4.53.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.4': + '@rollup/rollup-win32-ia32-msvc@4.53.5': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.4': + '@rollup/rollup-win32-x64-gnu@4.53.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.4': + '@rollup/rollup-win32-x64-msvc@4.53.5': optional: true '@standard-schema/spec@1.0.0': {} @@ -4385,32 +4385,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.4: + rollup@4.53.5: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.4 - '@rollup/rollup-android-arm64': 4.53.4 - '@rollup/rollup-darwin-arm64': 4.53.4 - '@rollup/rollup-darwin-x64': 4.53.4 - '@rollup/rollup-freebsd-arm64': 4.53.4 - '@rollup/rollup-freebsd-x64': 4.53.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.4 - '@rollup/rollup-linux-arm-musleabihf': 4.53.4 - '@rollup/rollup-linux-arm64-gnu': 4.53.4 - '@rollup/rollup-linux-arm64-musl': 4.53.4 - '@rollup/rollup-linux-loong64-gnu': 4.53.4 - '@rollup/rollup-linux-ppc64-gnu': 4.53.4 - '@rollup/rollup-linux-riscv64-gnu': 4.53.4 - '@rollup/rollup-linux-riscv64-musl': 4.53.4 - '@rollup/rollup-linux-s390x-gnu': 4.53.4 - '@rollup/rollup-linux-x64-gnu': 4.53.4 - '@rollup/rollup-linux-x64-musl': 4.53.4 - '@rollup/rollup-openharmony-arm64': 4.53.4 - '@rollup/rollup-win32-arm64-msvc': 4.53.4 - '@rollup/rollup-win32-ia32-msvc': 4.53.4 - '@rollup/rollup-win32-x64-gnu': 4.53.4 - '@rollup/rollup-win32-x64-msvc': 4.53.4 + '@rollup/rollup-android-arm-eabi': 4.53.5 + '@rollup/rollup-android-arm64': 4.53.5 + '@rollup/rollup-darwin-arm64': 4.53.5 + '@rollup/rollup-darwin-x64': 4.53.5 + '@rollup/rollup-freebsd-arm64': 4.53.5 + '@rollup/rollup-freebsd-x64': 4.53.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.5 + '@rollup/rollup-linux-arm-musleabihf': 4.53.5 + '@rollup/rollup-linux-arm64-gnu': 4.53.5 + '@rollup/rollup-linux-arm64-musl': 4.53.5 + '@rollup/rollup-linux-loong64-gnu': 4.53.5 + '@rollup/rollup-linux-ppc64-gnu': 4.53.5 + '@rollup/rollup-linux-riscv64-gnu': 4.53.5 + '@rollup/rollup-linux-riscv64-musl': 4.53.5 + '@rollup/rollup-linux-s390x-gnu': 4.53.5 + '@rollup/rollup-linux-x64-gnu': 4.53.5 + '@rollup/rollup-linux-x64-musl': 4.53.5 + '@rollup/rollup-openharmony-arm64': 4.53.5 + '@rollup/rollup-win32-arm64-msvc': 4.53.5 + '@rollup/rollup-win32-ia32-msvc': 4.53.5 + '@rollup/rollup-win32-x64-gnu': 4.53.5 + '@rollup/rollup-win32-x64-msvc': 4.53.5 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4652,7 +4652,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.4 + rollup: 4.53.5 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From 7f48ee906825a624d73231960f506f2480b05530 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 21 Dec 2025 22:04:33 +0800 Subject: [PATCH 076/119] chore(deps): update rust crate toml_edit to 0.24 (#14683) * chore(deps): update rust crate toml_edit to 0.24 * Downgrade indexmap to 2.11.4 for MSRV --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Tony --- Cargo.lock | 136 ++++++++++++++++++++---------------- crates/tauri-cli/Cargo.toml | 2 +- 2 files changed, 75 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9dae76c32..50bead4b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1083,7 +1083,7 @@ dependencies = [ "serde_json", "textwrap", "thiserror 2.0.12", - "toml 0.9.4", + "toml 0.9.10+spec-1.1.0", "ureq", "which", "windows 0.61.1", @@ -1120,7 +1120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml 0.9.4", + "toml 0.9.10+spec-1.1.0", ] [[package]] @@ -2219,7 +2219,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.9.4", + "toml 0.9.10+spec-1.1.0", "vswhom", "winreg 0.55.0", ] @@ -3105,7 +3105,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -3124,7 +3124,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.7.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -3177,9 +3177,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "heck" @@ -3722,13 +3722,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.1", "serde", + "serde_core", ] [[package]] @@ -4233,7 +4234,7 @@ checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 2.7.0", + "indexmap 2.11.4", "selectors", ] @@ -5263,7 +5264,7 @@ dependencies = [ "crc32fast", "flate2", "hashbrown 0.14.5", - "indexmap 2.7.0", + "indexmap 2.11.4", "memchr", "ruzstd", ] @@ -6093,7 +6094,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", - "indexmap 2.7.0", + "indexmap 2.11.4", "quick-xml", "serde", "time", @@ -7527,10 +7528,11 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -7579,10 +7581,19 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.219" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -7611,15 +7622,16 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.11.4", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -7654,11 +7666,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -7683,7 +7695,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.0", + "indexmap 2.11.4", "serde", "serde_derive", "serde_json", @@ -7709,7 +7721,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -8569,7 +8581,7 @@ dependencies = [ "tauri-codegen", "tauri-utils", "tauri-winres", - "toml 0.9.4", + "toml 0.9.10+spec-1.1.0", "walkdir", ] @@ -8691,8 +8703,8 @@ dependencies = [ "tempfile", "thiserror 2.0.12", "tokio", - "toml 0.9.4", - "toml_edit 0.23.2", + "toml 0.9.10+spec-1.1.0", + "toml_edit 0.24.0+spec-1.1.0", "ureq", "url", "uuid", @@ -8822,7 +8834,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml 0.9.4", + "toml 0.9.10+spec-1.1.0", "walkdir", ] @@ -8967,7 +8979,7 @@ dependencies = [ "serialize-to-javascript", "swift-rs", "thiserror 2.0.12", - "toml 0.9.4", + "toml 0.9.10+spec-1.1.0", "url", "urlpattern", "uuid", @@ -8981,8 +8993,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c6d9028d41d4de835e3c482c677a8cb88137ac435d6ff9a71f392d4421576c9" dependencies = [ "embed-resource", - "indexmap 2.7.0", - "toml 0.9.4", + "indexmap 2.11.4", + "toml 0.9.10+spec-1.1.0", ] [[package]] @@ -9311,17 +9323,17 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.4" +version = "0.9.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ae868b5a0f67631c14589f7e250c1ea2c574ee5ba21c6c8dd4b1485705a5a1" +checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" dependencies = [ - "indexmap 2.7.0", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "indexmap 2.11.4", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.11", + "winnow 0.7.14", ] [[package]] @@ -9335,11 +9347,11 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -9348,7 +9360,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.11.4", "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -9359,7 +9371,7 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.11.4", "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -9370,42 +9382,42 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.11.4", "serde", "serde_spanned 0.6.8", "toml_datetime 0.6.8", - "winnow 0.7.11", + "winnow 0.7.14", ] [[package]] name = "toml_edit" -version = "0.23.2" +version = "0.24.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1dee9dc43ac2aaf7d3b774e2fba5148212bf2bd9374f4e50152ebe9afd03d42" +checksum = "8c740b185920170a6d9191122cafef7010bd6270a3824594bff6784c04d7f09e" dependencies = [ - "indexmap 2.7.0", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", + "indexmap 2.11.4", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow 0.7.11", + "winnow 0.7.14", ] [[package]] name = "toml_parser" -version = "1.0.1" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" dependencies = [ - "winnow 0.7.11", + "winnow 0.7.14", ] [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.6+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" [[package]] name = "tower" @@ -10811,9 +10823,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] @@ -11244,7 +11256,7 @@ dependencies = [ "arbitrary", "crc32fast", "flate2", - "indexmap 2.7.0", + "indexmap 2.11.4", "memchr", "zopfli", ] diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index cbd4bebf6..5aa656ff7 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -56,7 +56,7 @@ notify = "8" notify-debouncer-full = "0.6" shared_child = "1" duct = "1.0" -toml_edit = { version = "0.23", features = ["serde"] } +toml_edit = { version = "0.24", features = ["serde"] } json-patch = "3" tauri-utils = { version = "2.8.1", path = "../tauri-utils", features = [ "isolation", From 51a0d6d66d1a8c8366503dc2378aa8a28a8264e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 22:49:57 +0800 Subject: [PATCH 077/119] chore(deps): update dependency rollup to v4.54.0 (#14688) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 206 +++++++++++++++++++------------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 6b3bffdf0..35b0db2b0 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.53.5", + "rollup": "4.54.0", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 381ee880b..55b351c20 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.53.5) + version: 0.4.4(rollup@4.54.0) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.53.5)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.54.0)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.53.5 - version: 4.53.5 + specifier: 4.54.0 + version: 4.54.0 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1125,113 +1125,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.5': - resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==} + '@rollup/rollup-android-arm-eabi@4.54.0': + resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.5': - resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} + '@rollup/rollup-android-arm64@4.54.0': + resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.5': - resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} + '@rollup/rollup-darwin-arm64@4.54.0': + resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.5': - resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} + '@rollup/rollup-darwin-x64@4.54.0': + resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.5': - resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} + '@rollup/rollup-freebsd-arm64@4.54.0': + resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.5': - resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} + '@rollup/rollup-freebsd-x64@4.54.0': + resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.5': - resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.5': - resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.5': - resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} + '@rollup/rollup-linux-arm64-gnu@4.54.0': + resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.5': - resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} + '@rollup/rollup-linux-arm64-musl@4.54.0': + resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.5': - resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} + '@rollup/rollup-linux-loong64-gnu@4.54.0': + resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.5': - resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.5': - resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.5': - resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} + '@rollup/rollup-linux-riscv64-musl@4.54.0': + resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.5': - resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} + '@rollup/rollup-linux-s390x-gnu@4.54.0': + resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.5': - resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} + '@rollup/rollup-linux-x64-gnu@4.54.0': + resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.5': - resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} + '@rollup/rollup-linux-x64-musl@4.54.0': + resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.5': - resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} + '@rollup/rollup-openharmony-arm64@4.54.0': + resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.5': - resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} + '@rollup/rollup-win32-arm64-msvc@4.54.0': + resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.5': - resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} + '@rollup/rollup-win32-ia32-msvc@4.54.0': + resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.5': - resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} + '@rollup/rollup-win32-x64-gnu@4.54.0': + resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.5': - resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} + '@rollup/rollup-win32-x64-msvc@4.54.0': + resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} cpu: [x64] os: [win32] @@ -2151,8 +2151,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.5: - resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==} + rollup@4.54.0: + resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3290,95 +3290,95 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.53.5)': + '@rollup/plugin-terser@0.4.4(rollup@4.54.0)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.53.5 + rollup: 4.54.0 - '@rollup/plugin-typescript@12.3.0(rollup@4.53.5)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.54.0)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.53.5) + '@rollup/pluginutils': 5.2.0(rollup@4.54.0) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.53.5 + rollup: 4.54.0 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.53.5)': + '@rollup/pluginutils@5.2.0(rollup@4.54.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.5 + rollup: 4.54.0 - '@rollup/rollup-android-arm-eabi@4.53.5': + '@rollup/rollup-android-arm-eabi@4.54.0': optional: true - '@rollup/rollup-android-arm64@4.53.5': + '@rollup/rollup-android-arm64@4.54.0': optional: true - '@rollup/rollup-darwin-arm64@4.53.5': + '@rollup/rollup-darwin-arm64@4.54.0': optional: true - '@rollup/rollup-darwin-x64@4.53.5': + '@rollup/rollup-darwin-x64@4.54.0': optional: true - '@rollup/rollup-freebsd-arm64@4.53.5': + '@rollup/rollup-freebsd-arm64@4.54.0': optional: true - '@rollup/rollup-freebsd-x64@4.53.5': + '@rollup/rollup-freebsd-x64@4.54.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.5': + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.5': + '@rollup/rollup-linux-arm-musleabihf@4.54.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.5': + '@rollup/rollup-linux-arm64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.5': + '@rollup/rollup-linux-arm64-musl@4.54.0': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.5': + '@rollup/rollup-linux-loong64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.5': + '@rollup/rollup-linux-ppc64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.5': + '@rollup/rollup-linux-riscv64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.5': + '@rollup/rollup-linux-riscv64-musl@4.54.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.5': + '@rollup/rollup-linux-s390x-gnu@4.54.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.5': + '@rollup/rollup-linux-x64-gnu@4.54.0': optional: true - '@rollup/rollup-linux-x64-musl@4.53.5': + '@rollup/rollup-linux-x64-musl@4.54.0': optional: true - '@rollup/rollup-openharmony-arm64@4.53.5': + '@rollup/rollup-openharmony-arm64@4.54.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.5': + '@rollup/rollup-win32-arm64-msvc@4.54.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.5': + '@rollup/rollup-win32-ia32-msvc@4.54.0': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.5': + '@rollup/rollup-win32-x64-gnu@4.54.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.5': + '@rollup/rollup-win32-x64-msvc@4.54.0': optional: true '@standard-schema/spec@1.0.0': {} @@ -4385,32 +4385,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.5: + rollup@4.54.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.5 - '@rollup/rollup-android-arm64': 4.53.5 - '@rollup/rollup-darwin-arm64': 4.53.5 - '@rollup/rollup-darwin-x64': 4.53.5 - '@rollup/rollup-freebsd-arm64': 4.53.5 - '@rollup/rollup-freebsd-x64': 4.53.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.5 - '@rollup/rollup-linux-arm-musleabihf': 4.53.5 - '@rollup/rollup-linux-arm64-gnu': 4.53.5 - '@rollup/rollup-linux-arm64-musl': 4.53.5 - '@rollup/rollup-linux-loong64-gnu': 4.53.5 - '@rollup/rollup-linux-ppc64-gnu': 4.53.5 - '@rollup/rollup-linux-riscv64-gnu': 4.53.5 - '@rollup/rollup-linux-riscv64-musl': 4.53.5 - '@rollup/rollup-linux-s390x-gnu': 4.53.5 - '@rollup/rollup-linux-x64-gnu': 4.53.5 - '@rollup/rollup-linux-x64-musl': 4.53.5 - '@rollup/rollup-openharmony-arm64': 4.53.5 - '@rollup/rollup-win32-arm64-msvc': 4.53.5 - '@rollup/rollup-win32-ia32-msvc': 4.53.5 - '@rollup/rollup-win32-x64-gnu': 4.53.5 - '@rollup/rollup-win32-x64-msvc': 4.53.5 + '@rollup/rollup-android-arm-eabi': 4.54.0 + '@rollup/rollup-android-arm64': 4.54.0 + '@rollup/rollup-darwin-arm64': 4.54.0 + '@rollup/rollup-darwin-x64': 4.54.0 + '@rollup/rollup-freebsd-arm64': 4.54.0 + '@rollup/rollup-freebsd-x64': 4.54.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 + '@rollup/rollup-linux-arm-musleabihf': 4.54.0 + '@rollup/rollup-linux-arm64-gnu': 4.54.0 + '@rollup/rollup-linux-arm64-musl': 4.54.0 + '@rollup/rollup-linux-loong64-gnu': 4.54.0 + '@rollup/rollup-linux-ppc64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-musl': 4.54.0 + '@rollup/rollup-linux-s390x-gnu': 4.54.0 + '@rollup/rollup-linux-x64-gnu': 4.54.0 + '@rollup/rollup-linux-x64-musl': 4.54.0 + '@rollup/rollup-openharmony-arm64': 4.54.0 + '@rollup/rollup-win32-arm64-msvc': 4.54.0 + '@rollup/rollup-win32-ia32-msvc': 4.54.0 + '@rollup/rollup-win32-x64-gnu': 4.54.0 + '@rollup/rollup-win32-x64-msvc': 4.54.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4652,7 +4652,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.5 + rollup: 4.54.0 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From c1d82eb3a3fa4b555745ba699edf1cc532030117 Mon Sep 17 00:00:00 2001 From: Kushal Meghani <168952248+KushalMeghani1644@users.noreply.github.com> Date: Thu, 25 Dec 2025 17:33:15 +0530 Subject: [PATCH 078/119] fix(linux): reuse WebContext to prevent WebKitNetworkProcess leak (#14628) Co-authored-by: Fabian-Lars --- .changes/linux-webcontext.md | 5 +++++ crates/tauri-runtime-wry/src/lib.rs | 12 ++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 .changes/linux-webcontext.md diff --git a/.changes/linux-webcontext.md b/.changes/linux-webcontext.md new file mode 100644 index 000000000..0a14638d3 --- /dev/null +++ b/.changes/linux-webcontext.md @@ -0,0 +1,5 @@ +--- +tauri-runtime-wry: patch:bug +--- + +On Linux, keep the WebContext alive to prevent zombie WebKit processes after repeatedly closing all windows and re-opening them. diff --git a/crates/tauri-runtime-wry/src/lib.rs b/crates/tauri-runtime-wry/src/lib.rs index 6b919e746..821fbacec 100644 --- a/crates/tauri-runtime-wry/src/lib.rs +++ b/crates/tauri-runtime-wry/src/lib.rs @@ -2422,6 +2422,18 @@ impl Drop for WebviewWrapper { if let Some(web_context) = context_store.get_mut(&self.context_key) { web_context.referenced_by_webviews.remove(&self.label); + // https://github.com/tauri-apps/tauri/issues/14626 + // Because WebKit does not close its network process even when no webviews are running, + // we need to ensure to re-use the existing process on Linux by keeping the WebContext + // alive for the lifetime of the app. + // WebKit on macOS handles this itself. + #[cfg(not(any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + )))] if web_context.referenced_by_webviews.is_empty() { context_store.remove(&self.context_key); } From 0650852d147ae4ac427411c9f4cd5d7f4596b010 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Thu, 25 Dec 2025 20:05:02 +0800 Subject: [PATCH 079/119] docs: things related to `WebviewUrl` (#14692) * Typos * Rename to `handler`/`protocol_handler` * Fix the `AssetResolver::get` fallback docs * Refactor and update the docs for `get_url` * Rename the remaining ones to `get_app_url` * Apply suggestions from code review Co-authored-by: Fabian-Lars * Generate schema --- crates/tauri-cli/config.schema.json | 8 +-- crates/tauri-runtime/src/webview.rs | 9 ++-- .../schemas/config.schema.json | 8 +-- crates/tauri-utils/src/config.rs | 8 +-- crates/tauri/src/app.rs | 28 +++++----- crates/tauri/src/manager/mod.rs | 54 +++++++++---------- crates/tauri/src/manager/webview.rs | 8 +-- crates/tauri/src/plugin.rs | 10 ++-- crates/tauri/src/protocol/mod.rs | 2 + crates/tauri/src/protocol/tauri.rs | 6 +-- crates/tauri/src/webview/mod.rs | 6 +-- 11 files changed, 73 insertions(+), 74 deletions(-) diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 148379e83..5e4a5a349 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -1991,7 +1991,7 @@ "description": "Defines the URL or assets to embed in the application.", "anyOf": [ { - "description": "An external URL that should be used as the default application URL.", + "description": "An external URL that should be used as the default application URL. No assets are embedded in the app in this case.", "type": "string", "format": "uri" }, @@ -2000,7 +2000,7 @@ "type": "string" }, { - "description": "An array of files to embed on the app.", + "description": "An array of files to embed in the app.", "type": "array", "items": { "type": "string" @@ -2792,7 +2792,7 @@ "type": "object", "properties": { "version": { - "description": "MSI installer version in the format `major.minor.patch.build` (build is optional).\n\n Because a valid version is required for MSI installer, it will be derived from [`Config::version`] if this field is not set.\n\n The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255.\n The third and foruth fields have a maximum value of 65,535.\n\n See for more info.", + "description": "MSI installer version in the format `major.minor.patch.build` (build is optional).\n\n Because a valid version is required for MSI installer, it will be derived from [`Config::version`] if this field is not set.\n\n The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255.\n The third and fourth fields have a maximum value of 65,535.\n\n See for more info.", "type": [ "string", "null" @@ -3096,7 +3096,7 @@ "description": "Custom Signing Command configuration.", "anyOf": [ { - "description": "A string notation of the script to execute.\n\n \"%1\" will be replaced with the path to the binary to be signed.\n\n This is a simpler notation for the command.\n Tauri will split the string with `' '` and use the first element as the command name and the rest as arguments.\n\n If you need to use whitespace in the command or arguments, use the object notation [`Self::ScriptWithOptions`].", + "description": "A string notation of the script to execute.\n\n \"%1\" will be replaced with the path to the binary to be signed.\n\n This is a simpler notation for the command.\n Tauri will split the string with `' '` and use the first element as the command name and the rest as arguments.\n\n If you need to use whitespace in the command or arguments, use the object notation [`Self::CommandWithOptions`].", "type": "string" }, { diff --git a/crates/tauri-runtime/src/webview.rs b/crates/tauri-runtime/src/webview.rs index f9c904ef9..efce7d814 100644 --- a/crates/tauri-runtime/src/webview.rs +++ b/crates/tauri-runtime/src/webview.rs @@ -23,7 +23,7 @@ use std::{ sync::Arc, }; -type UriSchemeProtocol = dyn Fn(&str, http::Request>, Box>) + Send>) +type UriSchemeProtocolHandler = dyn Fn(&str, http::Request>, Box>) + Send>) + Send + Sync + 'static; @@ -199,7 +199,8 @@ pub struct PendingWebview> { /// The [`WebviewAttributes`] that the webview will be created with. pub webview_attributes: WebviewAttributes, - pub uri_scheme_protocols: HashMap>, + /// Custom protocols to register on the webview + pub uri_scheme_protocols: HashMap>, /// How to handle IPC calls on the webview. pub ipc_handler: Option>, @@ -263,12 +264,12 @@ impl> PendingWebview { >( &mut self, uri_scheme: N, - protocol: H, + protocol_handler: H, ) { let uri_scheme = uri_scheme.into(); self .uri_scheme_protocols - .insert(uri_scheme, Box::new(protocol)); + .insert(uri_scheme, Box::new(protocol_handler)); } #[cfg(target_os = "android")] diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 148379e83..5e4a5a349 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -1991,7 +1991,7 @@ "description": "Defines the URL or assets to embed in the application.", "anyOf": [ { - "description": "An external URL that should be used as the default application URL.", + "description": "An external URL that should be used as the default application URL. No assets are embedded in the app in this case.", "type": "string", "format": "uri" }, @@ -2000,7 +2000,7 @@ "type": "string" }, { - "description": "An array of files to embed on the app.", + "description": "An array of files to embed in the app.", "type": "array", "items": { "type": "string" @@ -2792,7 +2792,7 @@ "type": "object", "properties": { "version": { - "description": "MSI installer version in the format `major.minor.patch.build` (build is optional).\n\n Because a valid version is required for MSI installer, it will be derived from [`Config::version`] if this field is not set.\n\n The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255.\n The third and foruth fields have a maximum value of 65,535.\n\n See for more info.", + "description": "MSI installer version in the format `major.minor.patch.build` (build is optional).\n\n Because a valid version is required for MSI installer, it will be derived from [`Config::version`] if this field is not set.\n\n The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255.\n The third and fourth fields have a maximum value of 65,535.\n\n See for more info.", "type": [ "string", "null" @@ -3096,7 +3096,7 @@ "description": "Custom Signing Command configuration.", "anyOf": [ { - "description": "A string notation of the script to execute.\n\n \"%1\" will be replaced with the path to the binary to be signed.\n\n This is a simpler notation for the command.\n Tauri will split the string with `' '` and use the first element as the command name and the rest as arguments.\n\n If you need to use whitespace in the command or arguments, use the object notation [`Self::ScriptWithOptions`].", + "description": "A string notation of the script to execute.\n\n \"%1\" will be replaced with the path to the binary to be signed.\n\n This is a simpler notation for the command.\n Tauri will split the string with `' '` and use the first element as the command name and the rest as arguments.\n\n If you need to use whitespace in the command or arguments, use the object notation [`Self::CommandWithOptions`].", "type": "string" }, { diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index 24b111830..2c1b6938e 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -739,7 +739,7 @@ pub struct WixConfig { /// Because a valid version is required for MSI installer, it will be derived from [`Config::version`] if this field is not set. /// /// The first field is the major version and has a maximum value of 255. The second field is the minor version and has a maximum value of 255. - /// The third and foruth fields have a maximum value of 65,535. + /// The third and fourth fields have a maximum value of 65,535. /// /// See for more info. pub version: Option, @@ -996,7 +996,7 @@ pub enum CustomSignCommandConfig { /// This is a simpler notation for the command. /// Tauri will split the string with `' '` and use the first element as the command name and the rest as arguments. /// - /// If you need to use whitespace in the command or arguments, use the object notation [`Self::ScriptWithOptions`]. + /// If you need to use whitespace in the command or arguments, use the object notation [`Self::CommandWithOptions`]. Command(String), /// An object notation of the command. /// @@ -2941,11 +2941,11 @@ fn default_min_sdk_version() -> u32 { #[serde(untagged, deny_unknown_fields)] #[non_exhaustive] pub enum FrontendDist { - /// An external URL that should be used as the default application URL. + /// An external URL that should be used as the default application URL. No assets are embedded in the app in this case. Url(Url), /// Path to a directory containing the frontend dist assets. Directory(PathBuf), - /// An array of files to embed on the app. + /// An array of files to embed in the app. Files(Vec), } diff --git a/crates/tauri/src/app.rs b/crates/tauri/src/app.rs index b950895bc..e53f22675 100644 --- a/crates/tauri/src/app.rs +++ b/crates/tauri/src/app.rs @@ -278,12 +278,11 @@ impl AssetResolver { /// were configured with [`crate::webview::WebviewBuilder::use_https_scheme`] or `tauri.conf.json > app > windows > useHttpsScheme`. /// If you are resolving an asset for a webview with a more dynamic configuration, see [`AssetResolver::get_for_scheme`]. /// - /// Resolves to the embedded asset that is part of the app - /// in dev when [`devUrl`](https://v2.tauri.app/reference/config/#devurl) points to a folder in your filesystem - /// or in production when [`frontendDist`](https://v2.tauri.app/reference/config/#frontenddist) - /// points to your frontend assets. + /// In production, this resolves to the embedded asset bundled in the app executable + /// which contains your frontend assets in [`frontendDist`](https://v2.tauri.app/reference/config/#frontenddist) during build time. /// - /// Fallbacks to reading the asset from the [distDir] folder so the behavior is consistent in development. + /// In dev mode, if [`devUrl`](https://v2.tauri.app/reference/config/#devurl) is set, we don't bundle the assets to reduce re-builds, + /// and this will fall back to read from `frontendDist` directly. /// Note that the dist directory must exist so you might need to build your frontend assets first. pub fn get(&self, path: String) -> Option { let use_https_scheme = self @@ -301,9 +300,8 @@ impl AssetResolver { pub fn get_for_scheme(&self, path: String, use_https_scheme: bool) -> Option { #[cfg(dev)] { - // on dev if the devPath is a path to a directory we have the embedded assets - // so we can use get_asset() directly - // we only fallback to reading from distDir directly if we're using an external URL (which is likely) + // We don't bundle the assets when in dev mode and `devUrl` is set, so fall back to read from `frontendDist` directly + // TODO: Maybe handle `FrontendDist::Files` as well if let (Some(_), Some(crate::utils::config::FrontendDist::Directory(dist_path))) = ( &self.manager.config().build.dev_url, &self.manager.config().build.frontend_dist, @@ -1990,13 +1988,13 @@ tauri::Builder::default() >( mut self, uri_scheme: N, - protocol: H, + protocol_handler: H, ) -> Self { self.uri_scheme_protocols.insert( uri_scheme.into(), Arc::new(UriSchemeProtocol { - protocol: Box::new(move |ctx, request, responder| { - responder.respond(protocol(ctx, request)) + handler: Box::new(move |ctx, request, responder| { + responder.respond(protocol_handler(ctx, request)) }), }), ); @@ -2032,8 +2030,8 @@ tauri::Builder::default() /// .body("failed to read file".as_bytes().to_vec()) /// .unwrap() /// ); - /// } - /// }); + /// } + /// }); /// }); /// ``` /// @@ -2054,12 +2052,12 @@ tauri::Builder::default() >( mut self, uri_scheme: N, - protocol: H, + protocol_handler: H, ) -> Self { self.uri_scheme_protocols.insert( uri_scheme.into(), Arc::new(UriSchemeProtocol { - protocol: Box::new(protocol), + handler: Box::new(protocol_handler), }), ); self diff --git a/crates/tauri/src/manager/mod.rs b/crates/tauri/src/manager/mod.rs index 2126dd895..9973ef46d 100644 --- a/crates/tauri/src/manager/mod.rs +++ b/crates/tauri/src/manager/mod.rs @@ -333,25 +333,9 @@ impl AppManager { self.state.clone() } - /// Get the base path to serve data from. - /// - /// * In dev mode, this will be based on the `devUrl` configuration value. - /// * Otherwise, this will be based on the `frontendDist` configuration value. - #[cfg(not(dev))] - fn base_path(&self) -> Option<&Url> { - use crate::utils::config::FrontendDist; - match self.config.build.frontend_dist.as_ref() { - Some(FrontendDist::Url(url)) => Some(url), - _ => None, - } - } - - #[cfg(dev)] - fn base_path(&self) -> Option<&Url> { - self.config.build.dev_url.as_ref() - } - - pub(crate) fn protocol_url(&self, https: bool) -> Cow<'_, Url> { + /// The `tauri` custom protocol URL we use to serve the embedded assets. + /// Returns `tauri://localhost` or its `wry` workaround URL `http://tauri.localhost`/`https://tauri.localhost` + pub(crate) fn tauri_protocol_url(&self, https: bool) -> Cow<'_, Url> { if cfg!(windows) || cfg!(target_os = "android") { let scheme = if https { "https" } else { "http" }; Cow::Owned(Url::parse(&format!("{scheme}://tauri.localhost")).unwrap()) @@ -360,13 +344,24 @@ impl AppManager { } } - /// Get the base URL to use for webview requests. + /// Get the base app URL for [`WebviewUrl::App`](tauri_utils::config::WebviewUrl::App). /// - /// In dev mode, this will be based on the `devUrl` configuration value. - pub(crate) fn get_url(&self, https: bool) -> Cow<'_, Url> { - match self.base_path() { - Some(url) => Cow::Borrowed(url), - _ => self.protocol_url(https), + /// * In dev mode, this is the [`devUrl`](tauri_utils::config::BuildConfig::dev_url) configuration value if it exsits. + /// * In production mode, this is the [`frontendDist`](tauri_utils::config::BuildConfig::frontend_dist) configuration value if it's a [`FrontendDist::Url`](tauri_utils::config::FrontendDist::Url). + /// * Returns [`Self::tauri_protocol_url`] (e.g. `tauri://localhost`) otherwise. + pub(crate) fn get_app_url(&self, https: bool) -> Cow<'_, Url> { + #[cfg(dev)] + let url = self.config.build.dev_url.as_ref(); + #[cfg(not(dev))] + let url = match self.config.build.frontend_dist.as_ref() { + Some(crate::utils::config::FrontendDist::Url(url)) => Some(url), + _ => None, + }; + + if let Some(url) = url { + Cow::Borrowed(url) + } else { + self.tauri_protocol_url(https) } } @@ -790,7 +785,7 @@ mod test { #[cfg(custom_protocol)] { assert_eq!( - manager.get_url(false).to_string(), + manager.get_app_url(false).to_string(), if cfg!(windows) || cfg!(target_os = "android") { "http://tauri.localhost/" } else { @@ -798,7 +793,7 @@ mod test { } ); assert_eq!( - manager.get_url(true).to_string(), + manager.get_app_url(true).to_string(), if cfg!(windows) || cfg!(target_os = "android") { "https://tauri.localhost/" } else { @@ -808,7 +803,10 @@ mod test { } #[cfg(dev)] - assert_eq!(manager.get_url(false).to_string(), "http://localhost:4000/"); + assert_eq!( + manager.get_app_url(false).to_string(), + "http://localhost:4000/" + ); } struct EventSetup { diff --git a/crates/tauri/src/manager/webview.rs b/crates/tauri/src/manager/webview.rs index 623b31d24..98c470b76 100644 --- a/crates/tauri/src/manager/webview.rs +++ b/crates/tauri/src/manager/webview.rs @@ -60,7 +60,7 @@ pub(crate) struct IpcJavascript<'a> { pub struct UriSchemeProtocol { /// Handler for protocol #[allow(clippy::type_complexity)] - pub protocol: + pub handler: Box, http::Request>, UriSchemeResponder) + Send + Sync>, } @@ -231,7 +231,7 @@ impl WebviewManager { app_handle: &app_handle, webview_label: webview_id, }; - (protocol.protocol)(context, request, UriSchemeResponder(responder)) + (protocol.handler)(context, request, UriSchemeResponder(responder)) }); } @@ -413,7 +413,7 @@ impl WebviewManager { #[allow(unused_mut)] // mut url only for the data-url parsing let mut url = match &pending.webview_attributes.url { WebviewUrl::App(path) => { - let app_url = app_manager.get_url(pending.webview_attributes.use_https_scheme); + let app_url = app_manager.get_app_url(pending.webview_attributes.use_https_scheme); let url = if PROXY_DEV_SERVER && is_local_network_url(&app_url) { Cow::Owned(Url::parse("tauri://localhost").unwrap()) } else { @@ -431,7 +431,7 @@ impl WebviewManager { } } WebviewUrl::External(url) => { - let config_url = app_manager.get_url(pending.webview_attributes.use_https_scheme); + let config_url = app_manager.get_app_url(pending.webview_attributes.use_https_scheme); let is_app_url = config_url.make_relative(url).is_some(); let mut url = url.clone(); if is_app_url && PROXY_DEV_SERVER && is_local_network_url(&url) { diff --git a/crates/tauri/src/plugin.rs b/crates/tauri/src/plugin.rs index 9c7f9a1ab..3a22de7bc 100644 --- a/crates/tauri/src/plugin.rs +++ b/crates/tauri/src/plugin.rs @@ -642,13 +642,13 @@ impl Builder { >( mut self, uri_scheme: N, - protocol: H, + protocol_handler: H, ) -> Self { self.uri_scheme_protocols.insert( uri_scheme.into(), Arc::new(UriSchemeProtocol { - protocol: Box::new(move |ctx, request, responder| { - responder.respond(protocol(ctx, request)) + handler: Box::new(move |ctx, request, responder| { + responder.respond(protocol_handler(ctx, request)) }), }), ); @@ -712,12 +712,12 @@ impl Builder { >( mut self, uri_scheme: N, - protocol: H, + protocol_handler: H, ) -> Self { self.uri_scheme_protocols.insert( uri_scheme.into(), Arc::new(UriSchemeProtocol { - protocol: Box::new(protocol), + handler: Box::new(protocol_handler), }), ); self diff --git a/crates/tauri/src/protocol/mod.rs b/crates/tauri/src/protocol/mod.rs index 2298bd51f..8542e2ae0 100644 --- a/crates/tauri/src/protocol/mod.rs +++ b/crates/tauri/src/protocol/mod.rs @@ -2,6 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT +//! Custom protocol handlers + #[cfg(feature = "protocol-asset")] pub mod asset; #[cfg(feature = "isolation")] diff --git a/crates/tauri/src/protocol/tauri.rs b/crates/tauri/src/protocol/tauri.rs index 52ba6119d..10cab2ced 100644 --- a/crates/tauri/src/protocol/tauri.rs +++ b/crates/tauri/src/protocol/tauri.rs @@ -32,7 +32,7 @@ pub fn get( #[cfg(all(dev, mobile))] let url = { let mut url = manager - .get_url(window_origin.starts_with("https")) + .get_app_url(window_origin.starts_with("https")) .as_str() .to_string(); if url.ends_with('/') { @@ -95,9 +95,9 @@ fn get_response( let path = path .strip_prefix("tauri://localhost") .map(|p| p.to_string()) - // the `strip_prefix` only returns None when a request is made to `https://tauri.$P` on Windows + // the `strip_prefix` only returns None when a request is made to `https://tauri.$P` on Windows and Android // where `$P` is not `localhost/*` - .unwrap_or_else(|| "".to_string()); + .unwrap_or_default(); let mut builder = HttpResponse::builder() .add_configured_headers(manager.config.app.security.headers.as_ref()) diff --git a/crates/tauri/src/webview/mod.rs b/crates/tauri/src/webview/mod.rs index 9c4a6e0ea..44d9e0a36 100644 --- a/crates/tauri/src/webview/mod.rs +++ b/crates/tauri/src/webview/mod.rs @@ -1682,7 +1682,7 @@ tauri::Builder::default() // if from `tauri://` custom protocol ({ - let protocol_url = self.manager().protocol_url(uses_https); + let protocol_url = self.manager().tauri_protocol_url(uses_https); current_url.scheme() == protocol_url.scheme() && current_url.domain() == protocol_url.domain() }) || @@ -1690,7 +1690,7 @@ tauri::Builder::default() // or if relative to `devUrl` or `frontendDist` self .manager() - .get_url(uses_https) + .get_app_url(uses_https) .make_relative(current_url) .is_some() @@ -1706,7 +1706,7 @@ tauri::Builder::default() // so we check using the first part of the domain #[cfg(any(windows, target_os = "android"))] let local = { - let protocol_url = self.manager().protocol_url(uses_https); + let protocol_url = self.manager().tauri_protocol_url(uses_https); let maybe_protocol = current_url .domain() .and_then(|d| d .split_once('.')) From 51f0fcb69cf969cbb5d47b3d92a914d897919ca0 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 28 Dec 2025 10:40:03 +0800 Subject: [PATCH 080/119] docs: pixel units (#14702) --- crates/tauri-cli/config.schema.json | 20 +++++++++---------- crates/tauri-runtime/src/window.rs | 8 ++++---- .../schemas/config.schema.json | 20 +++++++++---------- crates/tauri-utils/src/config.rs | 20 +++++++++---------- crates/tauri/src/webview/webview_window.rs | 8 ++++---- crates/tauri/src/window/mod.rs | 8 ++++---- packages/api/src/webview.ts | 8 ++++---- packages/api/src/window.ts | 16 +++++++-------- 8 files changed, 54 insertions(+), 54 deletions(-) diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 5e4a5a349..02c0bf908 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -262,7 +262,7 @@ "type": "boolean" }, "x": { - "description": "The horizontal position of the window's top left corner", + "description": "The horizontal position of the window's top left corner in logical pixels", "type": [ "number", "null" @@ -270,7 +270,7 @@ "format": "double" }, "y": { - "description": "The vertical position of the window's top left corner", + "description": "The vertical position of the window's top left corner in logical pixels", "type": [ "number", "null" @@ -278,19 +278,19 @@ "format": "double" }, "width": { - "description": "The window width.", + "description": "The window width in logical pixels.", "default": 800.0, "type": "number", "format": "double" }, "height": { - "description": "The window height.", + "description": "The window height in logical pixels.", "default": 600.0, "type": "number", "format": "double" }, "minWidth": { - "description": "The min window width.", + "description": "The min window width in logical pixels.", "type": [ "number", "null" @@ -298,7 +298,7 @@ "format": "double" }, "minHeight": { - "description": "The min window height.", + "description": "The min window height in logical pixels.", "type": [ "number", "null" @@ -306,7 +306,7 @@ "format": "double" }, "maxWidth": { - "description": "The max window width.", + "description": "The max window width in logical pixels.", "type": [ "number", "null" @@ -314,7 +314,7 @@ "format": "double" }, "maxHeight": { - "description": "The max window height.", + "description": "The max window height in logical pixels.", "type": [ "number", "null" @@ -652,13 +652,13 @@ ], "properties": { "width": { - "description": "Horizontal margin in physical unit", + "description": "Horizontal margin in physical pixels", "type": "integer", "format": "uint32", "minimum": 0.0 }, "height": { - "description": "Vertical margin in physical unit", + "description": "Vertical margin in physical pixels", "type": "integer", "format": "uint32", "minimum": 0.0 diff --git a/crates/tauri-runtime/src/window.rs b/crates/tauri-runtime/src/window.rs index cdda26883..652832c1e 100644 --- a/crates/tauri-runtime/src/window.rs +++ b/crates/tauri-runtime/src/window.rs @@ -247,19 +247,19 @@ pub trait WindowBuilder: WindowBuilderBase { #[must_use] fn center(self) -> Self; - /// The initial position of the window's. + /// The initial position of the window in logical pixels. #[must_use] fn position(self, x: f64, y: f64) -> Self; - /// Window size. + /// Window size in logical pixels. #[must_use] fn inner_size(self, width: f64, height: f64) -> Self; - /// Window min inner size. + /// Window min inner size in logical pixels. #[must_use] fn min_inner_size(self, min_width: f64, min_height: f64) -> Self; - /// Window max inner size. + /// Window max inner size in logical pixels. #[must_use] fn max_inner_size(self, max_width: f64, max_height: f64) -> Self; diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 5e4a5a349..02c0bf908 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -262,7 +262,7 @@ "type": "boolean" }, "x": { - "description": "The horizontal position of the window's top left corner", + "description": "The horizontal position of the window's top left corner in logical pixels", "type": [ "number", "null" @@ -270,7 +270,7 @@ "format": "double" }, "y": { - "description": "The vertical position of the window's top left corner", + "description": "The vertical position of the window's top left corner in logical pixels", "type": [ "number", "null" @@ -278,19 +278,19 @@ "format": "double" }, "width": { - "description": "The window width.", + "description": "The window width in logical pixels.", "default": 800.0, "type": "number", "format": "double" }, "height": { - "description": "The window height.", + "description": "The window height in logical pixels.", "default": 600.0, "type": "number", "format": "double" }, "minWidth": { - "description": "The min window width.", + "description": "The min window width in logical pixels.", "type": [ "number", "null" @@ -298,7 +298,7 @@ "format": "double" }, "minHeight": { - "description": "The min window height.", + "description": "The min window height in logical pixels.", "type": [ "number", "null" @@ -306,7 +306,7 @@ "format": "double" }, "maxWidth": { - "description": "The max window width.", + "description": "The max window width in logical pixels.", "type": [ "number", "null" @@ -314,7 +314,7 @@ "format": "double" }, "maxHeight": { - "description": "The max window height.", + "description": "The max window height in logical pixels.", "type": [ "number", "null" @@ -652,13 +652,13 @@ ], "properties": { "width": { - "description": "Horizontal margin in physical unit", + "description": "Horizontal margin in physical pixels", "type": "integer", "format": "uint32", "minimum": 0.0 }, "height": { - "description": "Vertical margin in physical unit", + "description": "Vertical margin in physical pixels", "type": "integer", "format": "uint32", "minimum": 0.0 diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index 2c1b6938e..ada9041a6 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -1593,9 +1593,9 @@ pub struct WindowEffectsConfig { #[cfg_attr(feature = "schema", derive(JsonSchema))] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct PreventOverflowMargin { - /// Horizontal margin in physical unit + /// Horizontal margin in physical pixels pub width: u32, - /// Vertical margin in physical unit + /// Vertical margin in physical pixels pub height: u32, } @@ -1673,26 +1673,26 @@ pub struct WindowConfig { /// Whether or not the window starts centered or not. #[serde(default)] pub center: bool, - /// The horizontal position of the window's top left corner + /// The horizontal position of the window's top left corner in logical pixels pub x: Option, - /// The vertical position of the window's top left corner + /// The vertical position of the window's top left corner in logical pixels pub y: Option, - /// The window width. + /// The window width in logical pixels. #[serde(default = "default_width")] pub width: f64, - /// The window height. + /// The window height in logical pixels. #[serde(default = "default_height")] pub height: f64, - /// The min window width. + /// The min window width in logical pixels. #[serde(alias = "min-width")] pub min_width: Option, - /// The min window height. + /// The min window height in logical pixels. #[serde(alias = "min-height")] pub min_height: Option, - /// The max window width. + /// The max window width in logical pixels. #[serde(alias = "max-width")] pub max_width: Option, - /// The max window height. + /// The max window height in logical pixels. #[serde(alias = "max-height")] pub max_height: Option, /// Whether or not to prevent the window from overflowing the workarea diff --git a/crates/tauri/src/webview/webview_window.rs b/crates/tauri/src/webview/webview_window.rs index 24232993a..f3c8665c3 100644 --- a/crates/tauri/src/webview/webview_window.rs +++ b/crates/tauri/src/webview/webview_window.rs @@ -465,28 +465,28 @@ impl<'a, R: Runtime, M: Manager> WebviewWindowBuilder<'a, R, M> { self } - /// The initial position of the window's. + /// The initial position of the window in logical pixels. #[must_use] pub fn position(mut self, x: f64, y: f64) -> Self { self.window_builder = self.window_builder.position(x, y); self } - /// Window size. + /// Window size in logical pixels. #[must_use] pub fn inner_size(mut self, width: f64, height: f64) -> Self { self.window_builder = self.window_builder.inner_size(width, height); self } - /// Window min inner size. + /// Window min inner size in logical pixels. #[must_use] pub fn min_inner_size(mut self, min_width: f64, min_height: f64) -> Self { self.window_builder = self.window_builder.min_inner_size(min_width, min_height); self } - /// Window max inner size. + /// Window max inner size in logical pixels. #[must_use] pub fn max_inner_size(mut self, max_width: f64, max_height: f64) -> Self { self.window_builder = self.window_builder.max_inner_size(max_width, max_height); diff --git a/crates/tauri/src/window/mod.rs b/crates/tauri/src/window/mod.rs index 9e74e694b..a67784cc3 100644 --- a/crates/tauri/src/window/mod.rs +++ b/crates/tauri/src/window/mod.rs @@ -443,28 +443,28 @@ impl<'a, R: Runtime, M: Manager> WindowBuilder<'a, R, M> { self } - /// The initial position of the window's. + /// The initial position of the window in logical pixels. #[must_use] pub fn position(mut self, x: f64, y: f64) -> Self { self.window_builder = self.window_builder.position(x, y); self } - /// Window size. + /// Window size in logical pixels. #[must_use] pub fn inner_size(mut self, width: f64, height: f64) -> Self { self.window_builder = self.window_builder.inner_size(width, height); self } - /// Window min inner size. + /// Window min inner size in logical pixels. #[must_use] pub fn min_inner_size(mut self, min_width: f64, min_height: f64) -> Self { self.window_builder = self.window_builder.min_inner_size(min_width, min_height); self } - /// Window max inner size. + /// Window max inner size in logical pixels. #[must_use] pub fn max_inner_size(mut self, max_width: f64, max_height: f64) -> Self { self.window_builder = self.window_builder.max_inner_size(max_width, max_height); diff --git a/packages/api/src/webview.ts b/packages/api/src/webview.ts index cf78dffe6..47a497fb6 100644 --- a/packages/api/src/webview.ts +++ b/packages/api/src/webview.ts @@ -714,13 +714,13 @@ interface WebviewOptions { * - local file path or route such as `/path/to/page.html` or `/users` is appended to the application URL (the devServer URL on development, or `tauri://localhost/` and `https://tauri.localhost/` on production). */ url?: string - /** The initial vertical position. */ + /** The initial vertical position in logical pixels. */ x: number - /** The initial horizontal position. */ + /** The initial horizontal position in logical pixels. */ y: number - /** The initial width. */ + /** The initial width in logical pixels. */ width: number - /** The initial height. */ + /** The initial height in logical pixels. */ height: number /** * Whether the webview is transparent or not. diff --git a/packages/api/src/window.ts b/packages/api/src/window.ts index 090108337..8a11d2cc3 100644 --- a/packages/api/src/window.ts +++ b/packages/api/src/window.ts @@ -2305,21 +2305,21 @@ interface PreventOverflowMargin { interface WindowOptions { /** Show window in the center of the screen.. */ center?: boolean - /** The initial vertical position. Only applies if `y` is also set. */ + /** The initial vertical position in logical pixels. Only applies if `y` is also set. */ x?: number - /** The initial horizontal position. Only applies if `x` is also set. */ + /** The initial horizontal position in logical pixels. Only applies if `x` is also set. */ y?: number - /** The initial width. */ + /** The initial width in logical pixels. */ width?: number - /** The initial height. */ + /** The initial height in logical pixels. */ height?: number - /** The minimum width. Only applies if `minHeight` is also set. */ + /** The minimum width in logical pixels. Only applies if `minHeight` is also set. */ minWidth?: number - /** The minimum height. Only applies if `minWidth` is also set. */ + /** The minimum height in logical pixels. Only applies if `minWidth` is also set. */ minHeight?: number - /** The maximum width. Only applies if `maxHeight` is also set. */ + /** The maximum width in logical pixels. Only applies if `maxHeight` is also set. */ maxWidth?: number - /** The maximum height. Only applies if `maxWidth` is also set. */ + /** The maximum height in logical pixels. Only applies if `maxWidth` is also set. */ maxHeight?: number /** * Prevent the window from overflowing the working area (e.g. monitor size - taskbar size) From a2abe2e6bcb9e1eed8484240dfdb76a5bc28ae58 Mon Sep 17 00:00:00 2001 From: sftse Date: Mon, 29 Dec 2025 06:54:51 +0100 Subject: [PATCH 081/119] refactor(cli): simplify `features: Option>` to `Vec` (#14607) * refactor: use empty vector for features instead of None * refactor: reorder * add change file * comment: highlight places where serialization is used * refactor: simplify serialization * Update .changes/empty-vec-instead-of-none.md * Update crates/tauri-cli/src/mobile/ios/mod.rs --------- Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> --- .changes/empty-vec-instead-of-none.md | 6 ++++ crates/tauri-cli/src/build.rs | 5 ++-- crates/tauri-cli/src/bundle.rs | 2 +- crates/tauri-cli/src/dev.rs | 6 ++-- crates/tauri-cli/src/interface/mod.rs | 2 +- crates/tauri-cli/src/interface/rust.rs | 30 +++++++------------ .../tauri-cli/src/interface/rust/desktop.rs | 4 +-- .../mobile/android/android_studio_script.rs | 2 +- crates/tauri-cli/src/mobile/android/build.rs | 4 +-- crates/tauri-cli/src/mobile/android/dev.rs | 2 +- crates/tauri-cli/src/mobile/android/mod.rs | 19 +++++------- crates/tauri-cli/src/mobile/android/run.rs | 2 +- crates/tauri-cli/src/mobile/init.rs | 4 +-- crates/tauri-cli/src/mobile/ios/build.rs | 4 +-- crates/tauri-cli/src/mobile/ios/dev.rs | 4 +-- crates/tauri-cli/src/mobile/ios/mod.rs | 21 +++++++------ crates/tauri-cli/src/mobile/ios/run.rs | 4 +-- .../tauri-cli/src/mobile/ios/xcode_script.rs | 2 +- crates/tauri-cli/src/mobile/mod.rs | 4 +-- 19 files changed, 57 insertions(+), 70 deletions(-) create mode 100644 .changes/empty-vec-instead-of-none.md diff --git a/.changes/empty-vec-instead-of-none.md b/.changes/empty-vec-instead-of-none.md new file mode 100644 index 000000000..6b0dd9fd9 --- /dev/null +++ b/.changes/empty-vec-instead-of-none.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:enhance +"tauri-cli": patch:enhance +--- + +Simplified internal representation of `features: Option>` with `Vec`, no user facing changes diff --git a/crates/tauri-cli/src/build.rs b/crates/tauri-cli/src/build.rs index ac8c5552a..0bd5a5320 100644 --- a/crates/tauri-cli/src/build.rs +++ b/crates/tauri-cli/src/build.rs @@ -40,7 +40,7 @@ pub struct Options { pub target: Option, /// Space or comma separated list of features to activate #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// Space or comma separated list of bundles to package. #[clap(short, long, action = ArgAction::Append, num_args(0..), value_delimiter = ',')] pub bundles: Option>, @@ -252,8 +252,7 @@ pub fn setup( options .features - .get_or_insert(Vec::new()) - .extend(config.build.features.clone().unwrap_or_default()); + .extend_from_slice(config.build.features.as_deref().unwrap_or_default()); interface.build_options(&mut options.args, &mut options.features, mobile); Ok(()) diff --git a/crates/tauri-cli/src/bundle.rs b/crates/tauri-cli/src/bundle.rs index 646f44ddb..8c1f320b5 100644 --- a/crates/tauri-cli/src/bundle.rs +++ b/crates/tauri-cli/src/bundle.rs @@ -71,7 +71,7 @@ pub struct Options { pub config: Vec, /// Space or comma separated list of features, should be the same features passed to `tauri build` if any. #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// Target triple to build against. /// /// It must be one of the values outputted by `$rustc --print target-list` or `universal-apple-darwin` for an universal macOS application. diff --git a/crates/tauri-cli/src/dev.rs b/crates/tauri-cli/src/dev.rs index 7ebabb458..e2ac61fce 100644 --- a/crates/tauri-cli/src/dev.rs +++ b/crates/tauri-cli/src/dev.rs @@ -57,7 +57,7 @@ pub struct Options { pub target: Option, /// List of cargo features to activate #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// Exit on panic #[clap(short, long)] pub exit_on_panic: bool, @@ -254,9 +254,7 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand .features .clone() .unwrap_or_default(); - if let Some(features) = &options.features { - cargo_features.extend(features.clone()); - } + cargo_features.extend(options.features.clone()); let mut dev_url = config .lock() diff --git a/crates/tauri-cli/src/interface/mod.rs b/crates/tauri-cli/src/interface/mod.rs index 00ca4c3d1..b153b33bf 100644 --- a/crates/tauri-cli/src/interface/mod.rs +++ b/crates/tauri-cli/src/interface/mod.rs @@ -46,7 +46,7 @@ pub trait AppSettings { package_types: Vec, ) -> crate::Result { let no_default_features = options.args.contains(&"--no-default-features".into()); - let mut enabled_features = options.features.clone().unwrap_or_default(); + let mut enabled_features = options.features.clone(); if !no_default_features { enabled_features.push("default".into()); } diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 0f7d2fd02..801e18767 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -51,7 +51,7 @@ pub struct Options { pub runner: Option, pub debug: bool, pub target: Option, - pub features: Option>, + pub features: Vec, pub args: Vec, pub config: Vec, pub no_watch: bool, @@ -108,7 +108,7 @@ impl From for Options { #[derive(Debug, Clone)] pub struct MobileOptions { pub debug: bool, - pub features: Option>, + pub features: Vec, pub args: Vec, pub config: Vec, pub no_watch: bool, @@ -393,7 +393,7 @@ fn dev_options( mobile: bool, args: &mut Vec, run_args: &mut Vec, - features: &mut Option>, + features: &mut Vec, app_settings: &RustAppSettings, ) { let mut dev_args = Vec::new(); @@ -429,9 +429,7 @@ fn dev_options( }) .collect(); args.push("--no-default-features".into()); - if !enable_features.is_empty() { - features.get_or_insert(Vec::new()).extend(enable_features); - } + features.extend(enable_features); } } @@ -498,15 +496,8 @@ fn get_watch_folders(additional_watch_folders: &[PathBuf]) -> crate::Result, - features: &mut Option>, - mobile: bool, - ) { - features - .get_or_insert(Vec::new()) - .push("tauri/custom-protocol".into()); + pub fn build_options(&self, args: &mut Vec, features: &mut Vec, mobile: bool) { + features.push("tauri/custom-protocol".into()); if mobile { args.push("--lib".into()); } else { @@ -957,11 +948,12 @@ impl AppSettings for RustAppSettings { .clone() .unwrap_or_default(); for bin in bins { - if let (Some(req_features), Some(opt_features)) = - (&bin.required_features, &options.features) - { + if let Some(req_features) = &bin.required_features { // Check if all required features are enabled. - if !req_features.iter().all(|feat| opt_features.contains(feat)) { + if !req_features + .iter() + .all(|feat| options.features.contains(feat)) + { continue; } } diff --git a/crates/tauri-cli/src/interface/rust/desktop.rs b/crates/tauri-cli/src/interface/rust/desktop.rs index e747f236b..b372dc015 100644 --- a/crates/tauri-cli/src/interface/rust/desktop.rs +++ b/crates/tauri-cli/src/interface/rust/desktop.rs @@ -262,9 +262,7 @@ fn cargo_command( build_cmd.args(&options.args); let mut features = config_features; - if let Some(f) = options.features { - features.extend(f); - } + features.extend(options.features); if !features.is_empty() { build_cmd.arg("--features"); build_cmd.arg(features.join(",")); diff --git a/crates/tauri-cli/src/mobile/android/android_studio_script.rs b/crates/tauri-cli/src/mobile/android/android_studio_script.rs index c3dfdff4b..4657ac673 100644 --- a/crates/tauri-cli/src/mobile/android/android_studio_script.rs +++ b/crates/tauri-cli/src/mobile/android/android_studio_script.rs @@ -80,7 +80,7 @@ pub fn command(options: Options) -> Result<()> { &AppInterface::new(tauri_config_, None)?, ), tauri_config_, - None, + &[], &cli_options, ); (config, metadata) diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index 4aae6df68..c91ba73c1 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -48,7 +48,7 @@ pub struct Options { pub targets: Option>, /// List of cargo features to activate #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// JSON strings or paths to JSON, JSON5 or TOML files to merge with the default configuration file /// /// Configurations are merged in the order they are provided, which means a particular value overwrites previous values when a config key-value pair conflicts. @@ -152,7 +152,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result>, + pub features: Vec, /// Exit on panic #[clap(short, long)] exit_on_panic: bool, diff --git a/crates/tauri-cli/src/mobile/android/mod.rs b/crates/tauri-cli/src/mobile/android/mod.rs index 1990cf2f4..9a73f91e0 100644 --- a/crates/tauri-cli/src/mobile/android/mod.rs +++ b/crates/tauri-cli/src/mobile/android/mod.rs @@ -128,19 +128,14 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> { pub fn get_config( app: &App, config: &TauriConfig, - features: Option<&Vec>, + features: &[String], cli_options: &CliOptions, ) -> (AndroidConfig, AndroidMetadata) { let mut android_options = cli_options.clone(); - if let Some(features) = features { - android_options - .features - .get_or_insert(Vec::new()) - .extend_from_slice(features); - } + android_options.features.extend_from_slice(features); let raw = RawAndroidConfig { - features: android_options.features.clone(), + features: Some(android_options.features.clone()), logcat_filter_specs: vec![ "RustStdoutStderr".into(), format!( @@ -161,7 +156,7 @@ pub fn get_config( let metadata = AndroidMetadata { supported: true, cargo_args: Some(android_options.args), - features: android_options.features, + features: Some(android_options.features), ..Default::default() }; @@ -257,8 +252,8 @@ fn ensure_java() -> Result<()> { fn ensure_sdk(non_interactive: bool) -> Result<()> { let android_home = std::env::var_os("ANDROID_HOME") - .map(PathBuf::from) - .or_else(|| std::env::var_os("ANDROID_SDK_ROOT").map(PathBuf::from)); + .or_else(|| std::env::var_os("ANDROID_SDK_ROOT")) + .map(PathBuf::from); if !android_home.as_ref().is_some_and(|v| v.exists()) { log::info!( "ANDROID_HOME {}, trying to locate Android SDK...", @@ -354,8 +349,8 @@ fn ensure_sdk(non_interactive: bool) -> Result<()> { fn ensure_ndk(non_interactive: bool) -> Result<()> { // re-evaluate ANDROID_HOME let android_home = std::env::var_os("ANDROID_HOME") + .or_else(|| std::env::var_os("ANDROID_SDK_ROOT")) .map(PathBuf::from) - .or_else(|| std::env::var_os("ANDROID_SDK_ROOT").map(PathBuf::from)) .context("Failed to locate Android SDK")?; let mut installed_ndks = read_dir(android_home.join("ndk")) .map(|dir| { diff --git a/crates/tauri-cli/src/mobile/android/run.rs b/crates/tauri-cli/src/mobile/android/run.rs index 9c276c4d9..8bab82b84 100644 --- a/crates/tauri-cli/src/mobile/android/run.rs +++ b/crates/tauri-cli/src/mobile/android/run.rs @@ -29,7 +29,7 @@ pub struct Options { pub release: bool, /// List of cargo features to activate #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// JSON strings or paths to JSON, JSON5 or TOML files to merge with the default configuration file /// /// Configurations are merged in the order they are provided, which means a particular value overwrites previous values when a config key-value pair conflicts. diff --git a/crates/tauri-cli/src/mobile/init.rs b/crates/tauri-cli/src/mobile/init.rs index 2a3cab0b4..eef38d1e9 100644 --- a/crates/tauri-cli/src/mobile/init.rs +++ b/crates/tauri-cli/src/mobile/init.rs @@ -135,7 +135,7 @@ pub fn exec( Target::Android => { let _env = super::android::env(non_interactive)?; let (config, metadata) = - super::android::get_config(&app, tauri_config_, None, &Default::default()); + super::android::get_config(&app, tauri_config_, &[], &Default::default()); map.insert("android", &config); super::android::project::gen( &config, @@ -150,7 +150,7 @@ pub fn exec( // Generate Xcode project Target::Ios => { let (config, metadata) = - super::ios::get_config(&app, tauri_config_, None, &Default::default())?; + super::ios::get_config(&app, tauri_config_, &[], &Default::default())?; map.insert("apple", &config); super::ios::project::gen( tauri_config_, diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index f52f892d1..e8348726b 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -60,7 +60,7 @@ pub struct Options { pub targets: Option>, /// List of cargo features to activate #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// JSON strings or paths to JSON, JSON5 or TOML files to merge with the default configuration file /// /// Configurations are merged in the order they are provided, which means a particular value overwrites previous values when a config key-value pair conflicts. @@ -201,7 +201,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result>, + pub features: Vec, /// Exit on panic #[clap(short, long)] exit_on_panic: bool, @@ -197,7 +197,7 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { let (config, _metadata) = get_config( &app, tauri_config_, - dev_options.features.as_ref(), + &dev_options.features, &Default::default(), )?; diff --git a/crates/tauri-cli/src/mobile/ios/mod.rs b/crates/tauri-cli/src/mobile/ios/mod.rs index ca4aade41..d589f76a6 100644 --- a/crates/tauri-cli/src/mobile/ios/mod.rs +++ b/crates/tauri-cli/src/mobile/ios/mod.rs @@ -40,7 +40,7 @@ use crate::{ use std::{ env::{set_var, var_os}, fs::create_dir_all, - path::PathBuf, + path::Path, str::FromStr, thread::sleep, time::Duration, @@ -126,16 +126,11 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> { pub fn get_config( app: &App, tauri_config: &TauriConfig, - features: Option<&Vec>, + features: &[String], cli_options: &CliOptions, ) -> Result<(AppleConfig, AppleMetadata)> { let mut ios_options = cli_options.clone(); - if let Some(features) = features { - ios_options - .features - .get_or_insert(Vec::new()) - .extend_from_slice(features); - } + ios_options.features.extend_from_slice(features); let bundle_version = if let Some(bundle_version) = tauri_config .bundle @@ -232,7 +227,7 @@ pub fn get_config( } } }), - ios_features: ios_options.features.clone(), + ios_features: Some(ios_options.features.clone()), bundle_version, bundle_version_short, ios_version: Some(tauri_config.bundle.ios.minimum_system_version.clone()), @@ -252,7 +247,7 @@ pub fn get_config( .clone() .unwrap_or_default() { - let framework_path = PathBuf::from(&framework); + let framework_path = Path::new(&framework); let ext = framework_path.extension().unwrap_or_default(); if ext.is_empty() { frameworks.push(framework); @@ -277,7 +272,11 @@ pub fn get_config( supported: true, ios: ApplePlatform { cargo_args: Some(ios_options.args), - features: ios_options.features, + features: if ios_options.features.is_empty() { + None + } else { + Some(ios_options.features) + }, frameworks: Some(frameworks), vendor_frameworks: Some(vendor_frameworks), ..Default::default() diff --git a/crates/tauri-cli/src/mobile/ios/run.rs b/crates/tauri-cli/src/mobile/ios/run.rs index 0ae1cef12..844e2f4c8 100644 --- a/crates/tauri-cli/src/mobile/ios/run.rs +++ b/crates/tauri-cli/src/mobile/ios/run.rs @@ -26,7 +26,7 @@ pub struct Options { pub release: bool, /// List of cargo features to activate #[clap(short, long, action = ArgAction::Append, num_args(0..))] - pub features: Option>, + pub features: Vec, /// JSON strings or paths to JSON, JSON5 or TOML files to merge with the default configuration file /// /// Configurations are merged in the order they are provided, which means a particular value overwrites previous values when a config key-value pair conflicts. @@ -77,7 +77,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { super::build::Options { debug: !options.release, targets: Some(vec![]), /* skips IPA build since there's no target */ - features: None, + features: Vec::new(), config: options.config.clone(), build_number: None, open: options.open, diff --git a/crates/tauri-cli/src/mobile/ios/xcode_script.rs b/crates/tauri-cli/src/mobile/ios/xcode_script.rs index 34d697614..25955c5ae 100644 --- a/crates/tauri-cli/src/mobile/ios/xcode_script.rs +++ b/crates/tauri-cli/src/mobile/ios/xcode_script.rs @@ -128,7 +128,7 @@ pub fn command(options: Options) -> Result<()> { &AppInterface::new(tauri_config_, None)?, ), tauri_config_, - None, + &[], &cli_options, )?; (config, metadata) diff --git a/crates/tauri-cli/src/mobile/mod.rs b/crates/tauri-cli/src/mobile/mod.rs index 2a20c66b6..b94543d65 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -181,7 +181,7 @@ impl Default for DevHost { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CliOptions { pub dev: bool, - pub features: Option>, + pub features: Vec, pub args: Vec, pub noise_level: NoiseLevel, pub vars: HashMap, @@ -193,7 +193,7 @@ impl Default for CliOptions { fn default() -> Self { Self { dev: false, - features: None, + features: Vec::new(), args: vec!["--lib".into()], noise_level: Default::default(), vars: Default::default(), From 8a43e4f9d90450e5a262fb59f5688f2c420d41ed Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Mon, 29 Dec 2025 19:43:09 +0800 Subject: [PATCH 082/119] refactor: use u64 instead of usize for nonce gen (#14708) --- crates/tauri/src/manager/mod.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/crates/tauri/src/manager/mod.rs b/crates/tauri/src/manager/mod.rs index 9973ef46d..25ae8eaab 100644 --- a/crates/tauri/src/manager/mod.rs +++ b/crates/tauri/src/manager/mod.rs @@ -129,14 +129,7 @@ fn replace_csp_nonce( ) { let mut nonces = Vec::new(); *asset = replace_with_callback(asset, token, || { - #[cfg(target_pointer_width = "64")] - let mut raw = [0u8; 8]; - #[cfg(target_pointer_width = "32")] - let mut raw = [0u8; 4]; - #[cfg(target_pointer_width = "16")] - let mut raw = [0u8; 2]; - getrandom::fill(&mut raw).expect("failed to get random bytes"); - let nonce = usize::from_ne_bytes(raw); + let nonce = getrandom::u64().expect("failed to get random bytes"); nonces.push(nonce); nonce.to_string() }); From 1dbf6fd067f418f73015cb751a35dbe3cfa4ed4f Mon Sep 17 00:00:00 2001 From: Bruno Verachten Date: Mon, 29 Dec 2025 14:21:49 +0100 Subject: [PATCH 083/119] feat(cli): add RISC-V 64-bit pre-built binary support (#14685) * feat(cli): add RISC-V 64-bit pre-built binary support Add riscv64gc-unknown-linux-gnu target to the tauri-cli release workflow, enabling pre-built binaries for RISC-V 64-bit Linux systems. This eliminates the multi-hour QEMU compilation time that currently blocks RISC-V adoption of Tauri apps. Native compilation on RISC-V hardware takes ~63 minutes. Changes: - Add RISC-V entry to build matrix with self-hosted runner support - Support custom `runs_on` field for matrix entries (falls back to `os`) - Skip dtolnay/rust-toolchain and rust-cache for self-hosted runners - Source ~/.cargo/env for self-hosted runners where Rust is pre-installed Tested on: - Hardware: Banana Pi F3 (RISC-V64, 16GB RAM) - OS: Debian Trixie (required for WebKit2GTK RISC-V support) - Build time: 1h 2m 28s - Binary: ELF 64-bit RISC-V, 16MB stripped * feat(cli): use cross for RISC-V cross-compilation Switch from self-hosted runners to cross-rs for building RISC-V binaries. This approach is simpler and doesn't require maintaining self-hosted infrastructure. Local testing confirms cross builds a valid RISC-V binary in ~4 minutes. * refactor(cli): address review feedback for RISC-V workflow - Skip Rust toolchain and cache setup for cross builds (unnecessary) - Pin cross version to 0.2.5 for reproducibility - Fix Linux dependencies condition to match ubuntu-* variants --- .github/workflows/publish-cli-rs.yml | 29 +++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-cli-rs.yml b/.github/workflows/publish-cli-rs.yml index a6471161c..39887eec7 100644 --- a/.github/workflows/publish-cli-rs.yml +++ b/.github/workflows/publish-cli-rs.yml @@ -38,35 +38,62 @@ jobs: rust_target: aarch64-pc-windows-msvc ext: '.exe' args: '' + - os: ubuntu-22.04 + rust_target: riscv64gc-unknown-linux-gnu + ext: '' + args: '' + cross: true steps: - uses: actions/checkout@v4 - name: 'Setup Rust' + if: ${{ !matrix.config.cross }} uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.config.rust_target }} - uses: Swatinem/rust-cache@v2 + if: ${{ !matrix.config.cross }} with: key: ${{ matrix.config.rust_target }} - name: install Linux dependencies - if: matrix.config.os == 'ubuntu-latest' + if: ${{ !matrix.config.cross && startsWith(matrix.config.os, 'ubuntu') }} run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev + - name: Install cross + if: ${{ matrix.config.cross }} + uses: taiki-e/install-action@v2 + with: + tool: cross@0.2.5 + - name: Build CLI + if: ${{ !matrix.config.cross }} run: cargo build --manifest-path ./crates/tauri-cli/Cargo.toml --profile release-size-optimized ${{ matrix.config.args }} + - name: Build CLI (cross) + if: ${{ matrix.config.cross }} + run: cross build --manifest-path ./crates/tauri-cli/Cargo.toml --target ${{ matrix.config.rust_target }} --profile release-size-optimized ${{ matrix.config.args }} + - name: Upload CLI + if: ${{ !matrix.config.cross }} uses: actions/upload-artifact@v4 with: name: cargo-tauri-${{ matrix.config.rust_target }}${{ matrix.config.ext }} path: target/release-size-optimized/cargo-tauri${{ matrix.config.ext }} if-no-files-found: error + - name: Upload CLI (cross) + if: ${{ matrix.config.cross }} + uses: actions/upload-artifact@v4 + with: + name: cargo-tauri-${{ matrix.config.rust_target }}${{ matrix.config.ext }} + path: target/${{ matrix.config.rust_target }}/release-size-optimized/cargo-tauri${{ matrix.config.ext }} + if-no-files-found: error + upload: needs: build runs-on: ubuntu-latest From 9b242e40c844189c877a91e513ae6196202d5ae9 Mon Sep 17 00:00:00 2001 From: Camilla F Date: Mon, 29 Dec 2025 16:29:07 +0000 Subject: [PATCH 084/119] fix: BSD support in tauri-runtime (#14700) Co-authored-by: Fabian-Lars --- .changes/runtime-bsd.md | 6 +++++ crates/tauri-runtime-wry/src/lib.rs | 34 +++++++++++++++++++++++---- crates/tauri-runtime/src/lib.rs | 21 +++++++++++++++-- crates/tauri/src/test/mock_runtime.rs | 9 ++++++- 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 .changes/runtime-bsd.md diff --git a/.changes/runtime-bsd.md b/.changes/runtime-bsd.md new file mode 100644 index 000000000..c9c97b4c4 --- /dev/null +++ b/.changes/runtime-bsd.md @@ -0,0 +1,6 @@ +--- +tauri-runtime: patch:bug +tauri-runtime-wry: patch:bug +--- + +Fix compilation errors when targeting BSD. diff --git a/crates/tauri-runtime-wry/src/lib.rs b/crates/tauri-runtime-wry/src/lib.rs index 821fbacec..61799d039 100644 --- a/crates/tauri-runtime-wry/src/lib.rs +++ b/crates/tauri-runtime-wry/src/lib.rs @@ -37,7 +37,13 @@ use tauri_runtime::{ use objc2::rc::Retained; #[cfg(target_os = "macos")] use tao::platform::macos::{EventLoopWindowTargetExtMacOS, WindowBuilderExtMacOS}; -#[cfg(target_os = "linux")] +#[cfg(any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" +))] use tao::platform::unix::{WindowBuilderExtUnix, WindowExtUnix}; #[cfg(windows)] use tao::platform::windows::{WindowBuilderExtWindows, WindowExtWindows}; @@ -862,7 +868,13 @@ impl WindowBuilder for WindowBuilderWrapper { "); } - #[cfg(target_os = "linux")] + #[cfg(any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] { // Mouse event is disabled on Linux since sudden event bursts could block event loop. window.inner = window.inner.with_cursor_moved_event(false); @@ -1194,7 +1206,14 @@ impl WindowBuilder for WindowBuilderWrapper { self } - #[cfg(any(windows, target_os = "linux"))] + #[cfg(any( + windows, + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] fn skip_taskbar(mut self, skip: bool) -> Self { self.inner = self.inner.with_skip_taskbar(skip); self @@ -3417,7 +3436,14 @@ fn handle_user_message( } #[allow(unused_variables)] WindowMessage::SetSkipTaskbar(skip) => { - #[cfg(any(windows, target_os = "linux"))] + #[cfg(any( + windows, + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] let _ = window.set_skip_taskbar(skip); } WindowMessage::SetCursorGrab(grab) => { diff --git a/crates/tauri-runtime/src/lib.rs b/crates/tauri-runtime/src/lib.rs index 2874d16b9..5bf869dcd 100644 --- a/crates/tauri-runtime/src/lib.rs +++ b/crates/tauri-runtime/src/lib.rs @@ -399,8 +399,25 @@ pub trait Runtime: Debug + Sized + 'static { fn new(args: RuntimeInitArgs) -> Result; /// Creates a new webview runtime on any thread. - #[cfg(any(windows, target_os = "linux"))] - #[cfg_attr(docsrs, doc(cfg(any(windows, target_os = "linux"))))] + #[cfg(any( + windows, + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] + #[cfg_attr( + docsrs, + doc(cfg(any( + windows, + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))) + )] fn new_any_thread(args: RuntimeInitArgs) -> Result; /// Creates an `EventLoopProxy` that can be used to dispatch user events to the main event loop. diff --git a/crates/tauri/src/test/mock_runtime.rs b/crates/tauri/src/test/mock_runtime.rs index 16b136ef7..5fbedd013 100644 --- a/crates/tauri/src/test/mock_runtime.rs +++ b/crates/tauri/src/test/mock_runtime.rs @@ -1146,7 +1146,14 @@ impl Runtime for MockRuntime { Ok(Self::init()) } - #[cfg(any(windows, target_os = "linux"))] + #[cfg(any( + windows, + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] fn new_any_thread(_args: RuntimeInitArgs) -> Result { Ok(Self::init()) } From dcd1a6588948bf42d31ddab94109068605965337 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Fri, 2 Jan 2026 16:02:23 +0100 Subject: [PATCH 085/119] chore: fix tests (#14720) * chore: fix tests * windows --- Cargo.lock | 1 + crates/tauri-cli/config.schema.json | 2 +- crates/tauri-schema-generator/schemas/config.schema.json | 2 +- crates/tauri-utils/Cargo.toml | 1 + crates/tauri-utils/src/config.rs | 2 +- .../acl_tests__tests__platform-specific-permissions.snap | 1 + 6 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 50bead4b4..929c91254 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8978,6 +8978,7 @@ dependencies = [ "serial_test", "serialize-to-javascript", "swift-rs", + "tauri", "thiserror 2.0.12", "toml 0.9.10+spec-1.1.0", "url", diff --git a/crates/tauri-cli/config.schema.json b/crates/tauri-cli/config.schema.json index 02c0bf908..58fab551a 100644 --- a/crates/tauri-cli/config.schema.json +++ b/crates/tauri-cli/config.schema.json @@ -165,7 +165,7 @@ "type": "object", "properties": { "windows": { - "description": "The app windows configuration.\n\n ## Example:\n\n To create a window at app startup\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n If not specified, the window's label (its identifier) defaults to \"main\",\n you can use this label to get the window through\n `app.get_webview_window` in Rust or `WebviewWindow.getByLabel` in JavaScript\n\n When working with multiple windows, each window will need an unique label\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"label\": \"main\", \"width\": 800, \"height\": 600 },\n { \"label\": \"secondary\", \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n You can also set `create` to false and use this config through the Rust APIs\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"create\": false, \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n and use it like this\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", + "description": "The app windows configuration.\n\n ## Example:\n\n To create a window at app startup\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n If not specified, the window's label (its identifier) defaults to \"main\",\n you can use this label to get the window through\n `app.get_webview_window` in Rust or `WebviewWindow.getByLabel` in JavaScript\n\n When working with multiple windows, each window will need an unique label\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"label\": \"main\", \"width\": 800, \"height\": 600 },\n { \"label\": \"secondary\", \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n You can also set `create` to false and use this config through the Rust APIs\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"create\": false, \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n and use it like this\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), &app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", "default": [], "type": "array", "items": { diff --git a/crates/tauri-schema-generator/schemas/config.schema.json b/crates/tauri-schema-generator/schemas/config.schema.json index 02c0bf908..58fab551a 100644 --- a/crates/tauri-schema-generator/schemas/config.schema.json +++ b/crates/tauri-schema-generator/schemas/config.schema.json @@ -165,7 +165,7 @@ "type": "object", "properties": { "windows": { - "description": "The app windows configuration.\n\n ## Example:\n\n To create a window at app startup\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n If not specified, the window's label (its identifier) defaults to \"main\",\n you can use this label to get the window through\n `app.get_webview_window` in Rust or `WebviewWindow.getByLabel` in JavaScript\n\n When working with multiple windows, each window will need an unique label\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"label\": \"main\", \"width\": 800, \"height\": 600 },\n { \"label\": \"secondary\", \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n You can also set `create` to false and use this config through the Rust APIs\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"create\": false, \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n and use it like this\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", + "description": "The app windows configuration.\n\n ## Example:\n\n To create a window at app startup\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n If not specified, the window's label (its identifier) defaults to \"main\",\n you can use this label to get the window through\n `app.get_webview_window` in Rust or `WebviewWindow.getByLabel` in JavaScript\n\n When working with multiple windows, each window will need an unique label\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"label\": \"main\", \"width\": 800, \"height\": 600 },\n { \"label\": \"secondary\", \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n You can also set `create` to false and use this config through the Rust APIs\n\n ```json\n {\n \"app\": {\n \"windows\": [\n { \"create\": false, \"width\": 800, \"height\": 600 }\n ]\n }\n }\n ```\n\n and use it like this\n\n ```rust\n tauri::Builder::default()\n .setup(|app| {\n tauri::WebviewWindowBuilder::from_config(app.handle(), &app.config().app.windows[0])?.build()?;\n Ok(())\n });\n ```", "default": [], "type": "array", "items": { diff --git a/crates/tauri-utils/Cargo.toml b/crates/tauri-utils/Cargo.toml index 25debb2db..6ce1271a0 100644 --- a/crates/tauri-utils/Cargo.toml +++ b/crates/tauri-utils/Cargo.toml @@ -57,6 +57,7 @@ swift-rs = { version = "1", optional = true, features = ["build"] } [dev-dependencies] getrandom = { version = "0.3", features = ["std"] } serial_test = "3" +tauri = { path = "../tauri" } [features] build = [ diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index ada9041a6..4350398d0 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -2742,7 +2742,7 @@ pub struct AppConfig { /// ```rust /// tauri::Builder::default() /// .setup(|app| { - /// tauri::WebviewWindowBuilder::from_config(app.handle(), app.config().app.windows[0])?.build()?; + /// tauri::WebviewWindowBuilder::from_config(app.handle(), &app.config().app.windows[0])?.build()?; /// Ok(()) /// }); /// ``` diff --git a/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap b/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap index 17498f928..3c1197d81 100644 --- a/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap +++ b/crates/tests/acl/fixtures/snapshots/windows/acl_tests__tests__platform-specific-permissions.snap @@ -3,6 +3,7 @@ source: crates/tests/acl/src/lib.rs expression: resolved --- Resolved { + has_app_acl: false, allowed_commands: { "plugin:os|spawn": [ ResolvedCommand { From b75ea5beadeb1b40582315e46d32f6bb0acc87a7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 Jan 2026 12:34:59 +0800 Subject: [PATCH 086/119] chore(deps): update rust crate reqwest to 0.13 (#14724) * chore(deps): update rust crate reqwest to 0.13 * Fix feature name --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Tony --- Cargo.lock | 307 ++++++++++++++++++++++++++++++++-------- crates/tauri/Cargo.toml | 4 +- 2 files changed, 253 insertions(+), 58 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 929c91254..07477e279 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,7 +300,7 @@ dependencies = [ "ring", "rsa", "scroll", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "semver", "serde", @@ -553,6 +553,28 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "aws-lc-rs" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88aab2464f1f25453baa7a07c84c5b7684e274054ba06817f382357f77a288" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45afffdee1e7c9126814751f88dddc747f41d91da16c9551a0f1e8a11e788a1" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "axum" version = "0.8.4" @@ -567,7 +589,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.8.1", "hyper-util", "itoa", "matchit 0.8.4", @@ -1152,10 +1174,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.22" +version = "1.2.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -1300,6 +1323,15 @@ dependencies = [ "digest", ] +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -2468,6 +2500,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" + [[package]] name = "flate2" version = "1.1.1" @@ -2596,6 +2634,12 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -3347,7 +3391,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -3356,13 +3400,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2 0.4.7", "http 1.3.1", "http-body 1.0.1", @@ -3370,6 +3415,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -3397,14 +3443,13 @@ checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.3.1", - "hyper 1.5.2", + "hyper 1.8.1", "hyper-util", - "rustls 0.23.20", + "rustls 0.23.35", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", "tower-service", - "webpki-roots 0.26.7", ] [[package]] @@ -3415,7 +3460,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.2", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -3425,18 +3470,23 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.2", + "hyper 1.8.1", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.1", "tokio", "tower-service", "tracing", @@ -3817,6 +3867,16 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-terminal" version = "0.4.13" @@ -4077,7 +4137,7 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.8.1", "hyper-util", "jsonrpsee-core", "jsonrpsee-types", @@ -4289,9 +4349,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libfuzzer-sys" @@ -4720,10 +4780,10 @@ dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.1.5", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -5353,6 +5413,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-probe" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" + [[package]] name = "openssl-src" version = "300.4.1+3.4.0" @@ -6367,8 +6433,8 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.20", - "socket2", + "rustls 0.23.35", + "socket2 0.5.8", "thiserror 2.0.12", "tokio", "tracing", @@ -6380,12 +6446,13 @@ version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ + "aws-lc-rs", "bytes", "getrandom 0.2.15", "rand 0.8.5", "ring", "rustc-hash", - "rustls 0.23.20", + "rustls 0.23.35", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -6403,7 +6470,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.8", "tracing", "windows-sys 0.59.0", ] @@ -6830,39 +6897,70 @@ dependencies = [ "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", - "hyper-rustls 0.27.5", - "hyper-tls", + "hyper 1.8.1", "hyper-util", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "quinn", - "rustls 0.23.20", - "rustls-pemfile 2.2.0", - "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.2", "tokio", + "tower 0.5.2", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry 0.2.0", +] + +[[package]] +name = "reqwest" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.8.1", + "hyper-rustls 0.27.5", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.35", + "rustls-pki-types", + "rustls-platform-verifier 0.6.2", + "serde", + "serde_json", + "sync_wrapper 1.0.2", + "tokio", "tokio-native-tls", "tokio-rustls 0.26.1", "tokio-util", "tower 0.5.2", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.7", - "windows-registry 0.2.0", ] [[package]] @@ -7168,15 +7266,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ + "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.8", + "rustls-webpki 0.103.8", "subtle", "zeroize", ] @@ -7187,10 +7286,10 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ - "openssl-probe", + "openssl-probe 0.1.5", "rustls-pemfile 1.0.4", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -7199,11 +7298,23 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ - "openssl-probe", + "openssl-probe 0.1.5", "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe 0.2.0", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", ] [[package]] @@ -7226,11 +7337,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ "web-time", + "zeroize", ] [[package]] @@ -7244,16 +7356,37 @@ dependencies = [ "jni 0.19.0", "log", "once_cell", - "rustls 0.23.20", + "rustls 0.23.35", "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki 0.102.8", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "webpki-roots 0.26.7", "winapi", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation 0.10.0", + "core-foundation-sys", + "jni 0.21.1", + "log", + "once_cell", + "rustls 0.23.35", + "rustls-native-certs 0.8.3", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.8", + "security-framework 3.5.1", + "security-framework-sys", + "webpki-root-certs 1.0.5", + "windows-sys 0.60.2", +] + [[package]] name = "rustls-platform-verifier-android" version = "0.1.1" @@ -7281,6 +7414,18 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.19" @@ -7484,10 +7629,23 @@ dependencies = [ ] [[package]] -name = "security-framework-sys" -version = "2.14.0" +name = "security-framework" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags 2.7.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -8020,6 +8178,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "socks" version = "0.3.4" @@ -8538,7 +8706,7 @@ dependencies = [ "quickcheck", "quickcheck_macros", "raw-window-handle", - "reqwest 0.12.12", + "reqwest 0.13.1", "serde", "serde_json", "serde_repr", @@ -8758,7 +8926,7 @@ dependencies = [ "futures", "futures-util", "http-body-util", - "hyper 1.5.2", + "hyper 1.8.1", "hyper-util", "pico-args", "serde", @@ -9226,7 +9394,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.8", "tokio-macros", "windows-sys 0.52.0", ] @@ -9268,7 +9436,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.20", + "rustls 0.23.35", "tokio", ] @@ -9451,6 +9619,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.7.0", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -9801,14 +9987,14 @@ dependencies = [ "log", "native-tls", "percent-encoding", - "rustls 0.23.20", + "rustls 0.23.35", "rustls-pemfile 2.2.0", "rustls-pki-types", - "rustls-platform-verifier", + "rustls-platform-verifier 0.3.4", "socks", "ureq-proto", "utf-8", - "webpki-root-certs", + "webpki-root-certs 0.26.7", "webpki-roots 0.26.7", ] @@ -10217,6 +10403,15 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.25.4" diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 4da7736cd..b7cee807a 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -141,7 +141,7 @@ windows = { version = "0.61", features = [ # mobile [target.'cfg(any(target_os = "android", all(target_vendor = "apple", not(target_os = "macos"))))'.dependencies] bytes = { version = "1", features = ["serde"] } -reqwest = { version = "0.12", default-features = false, features = [ +reqwest = { version = "0.13", default-features = false, features = [ "json", "stream", @@ -201,7 +201,7 @@ custom-protocol = ["tauri-macros/custom-protocol"] # For now those feature flags keep enabling reqwest features in case some users depend on that by accident. native-tls = ["reqwest/native-tls"] native-tls-vendored = ["reqwest/native-tls-vendored"] -rustls-tls = ["reqwest/rustls-tls"] +rustls-tls = ["reqwest/rustls"] devtools = ["tauri-runtime/devtools", "tauri-runtime-wry?/devtools"] process-relaunch-dangerous-allow-symlink-macos = [ "tauri-utils/process-relaunch-dangerous-allow-symlink-macos", From a03219ca196372fca542633900a5ad26d805fcf7 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sat, 3 Jan 2026 19:30:42 +0800 Subject: [PATCH 087/119] refactor(cli): disable jsonschema resolving external resources (#14725) * refactor(cli): disable jsonschema resolving external resources * Move `CONFIG_SCHEMA_VALIDATOR` to fn * Format * Update ureq to fix compile on linux * New clippy warnings --- Cargo.lock | 178 +++++-------------------- crates/tauri-cli/Cargo.toml | 2 +- crates/tauri-cli/src/helpers/config.rs | 21 ++- crates/tauri-cli/src/interface/rust.rs | 2 +- 4 files changed, 48 insertions(+), 155 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07477e279..cf21f5252 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2365,11 +2365,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erased-serde" -version = "0.4.5" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" dependencies = [ "serde", + "serde_core", "typeid", ] @@ -3976,20 +3977,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "jni" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", -] - [[package]] name = "jni" version = "0.21.1" @@ -4200,7 +4187,6 @@ dependencies = [ "referencing", "regex", "regex-syntax", - "reqwest 0.12.12", "serde", "serde_json", "uuid-simd", @@ -4488,9 +4474,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.22" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ "value-bag", ] @@ -6883,43 +6869,6 @@ dependencies = [ "winreg 0.50.0", ] -[[package]] -name = "reqwest" -version = "0.12.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "http-body-util", - "hyper 1.8.1", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.2", - "tokio", - "tower 0.5.2", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry 0.2.0", -] - [[package]] name = "reqwest" version = "0.13.1" @@ -6945,7 +6894,7 @@ dependencies = [ "quinn", "rustls 0.23.35", "rustls-pki-types", - "rustls-platform-verifier 0.6.2", + "rustls-platform-verifier", "serde", "serde_json", "sync_wrapper 1.0.2", @@ -7345,27 +7294,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-platform-verifier" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" -dependencies = [ - "core-foundation 0.9.4", - "core-foundation-sys", - "jni 0.19.0", - "log", - "once_cell", - "rustls 0.23.35", - "rustls-native-certs 0.7.3", - "rustls-platform-verifier-android", - "rustls-webpki 0.102.8", - "security-framework 2.11.1", - "security-framework-sys", - "webpki-roots 0.26.7", - "winapi", -] - [[package]] name = "rustls-platform-verifier" version = "0.6.2" @@ -7374,7 +7302,7 @@ checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ "core-foundation 0.10.0", "core-foundation-sys", - "jni 0.21.1", + "jni", "log", "once_cell", "rustls 0.23.35", @@ -7383,7 +7311,7 @@ dependencies = [ "rustls-webpki 0.103.8", "security-framework 3.5.1", "security-framework-sys", - "webpki-root-certs 1.0.5", + "webpki-root-certs", "windows-sys 0.60.2", ] @@ -7624,7 +7552,6 @@ dependencies = [ "core-foundation 0.9.4", "core-foundation-sys", "libc", - "num-bigint", "security-framework-sys", ] @@ -8614,7 +8541,7 @@ dependencies = [ "gdkwayland-sys", "gdkx11-sys", "gtk", - "jni 0.21.1", + "jni", "lazy_static", "libc", "log", @@ -8690,7 +8617,7 @@ dependencies = [ "http 1.3.1", "http-range", "image", - "jni 0.21.1", + "jni", "libc", "log", "mime", @@ -8794,7 +8721,7 @@ dependencies = [ "uuid", "walkdir", "which", - "windows-registry 0.5.0", + "windows-registry", "windows-sys 0.60.2", "zip 4.0.0", ] @@ -9047,7 +8974,7 @@ dependencies = [ "dpi", "gtk", "http 1.3.1", - "jni 0.21.1", + "jni", "objc2 0.6.0", "objc2-ui-kit", "objc2-web-kit", @@ -9068,7 +8995,7 @@ version = "2.9.3" dependencies = [ "gtk", "http 1.3.1", - "jni 0.21.1", + "jni", "log", "objc2 0.6.0", "objc2-app-kit", @@ -9976,33 +9903,31 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.0.3" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "217751151c53226090391713e533d9a5e904ba2570dabaaace29032687589c3e" +checksum = "d39cb1dbab692d82a977c0392ffac19e188bd9186a9f32806f0aaa859d75585a" dependencies = [ "base64 0.22.1", - "cc", "der", "flate2", "log", "native-tls", "percent-encoding", "rustls 0.23.35", - "rustls-pemfile 2.2.0", "rustls-pki-types", - "rustls-platform-verifier 0.3.4", + "rustls-platform-verifier", "socks", "ureq-proto", "utf-8", - "webpki-root-certs 0.26.7", - "webpki-roots 0.26.7", + "webpki-root-certs", + "webpki-roots 1.0.5", ] [[package]] name = "ureq-proto" -version = "0.3.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c51fe73e1d8c4e06bb2698286f7e7453c6fc90528d6d2e7fc36bb4e87fe09b1" +checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" dependencies = [ "base64 0.22.1", "http 1.3.1", @@ -10126,9 +10051,9 @@ dependencies = [ [[package]] name = "value-bag" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" dependencies = [ "value-bag-serde1", "value-bag-sval2", @@ -10136,20 +10061,20 @@ dependencies = [ [[package]] name = "value-bag-serde1" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb773bd36fd59c7ca6e336c94454d9c66386416734817927ac93d81cb3c5b0b" +checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5" dependencies = [ "erased-serde", - "serde", + "serde_core", "serde_fmt", ] [[package]] name = "value-bag-sval2" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a916a702cac43a88694c97657d449775667bcd14b70419441d05b7fea4a83a" +checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f" dependencies = [ "sval", "sval_buffer", @@ -10394,15 +10319,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "webpki-root-certs" -version = "0.26.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd5da49bdf1f30054cfe0b8ce2958b8fbeb67c4d82c8967a598af481bef255c" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "webpki-root-certs" version = "1.0.5" @@ -10420,9 +10336,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.7" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" dependencies = [ "rustls-pki-types", ] @@ -10592,7 +10508,7 @@ dependencies = [ "windows-implement", "windows-interface", "windows-link", - "windows-result 0.3.2", + "windows-result", "windows-strings 0.4.0", ] @@ -10644,17 +10560,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows-registry" version = "0.5.0" @@ -10662,19 +10567,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c44a98275e31bfd112bb06ba96c8ab13c03383a3753fdddd715406a1824c7e0" dependencies = [ "windows-link", - "windows-result 0.3.2", + "windows-result", "windows-strings 0.3.1", ] -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-result" version = "0.3.2" @@ -10684,16 +10580,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows-strings" version = "0.3.1" @@ -11150,7 +11036,7 @@ dependencies = [ "html5ever", "http 1.3.1", "javascriptcore-rs", - "jni 0.21.1", + "jni", "kuchikiki", "libc", "ndk", diff --git a/crates/tauri-cli/Cargo.toml b/crates/tauri-cli/Cargo.toml index 5aa656ff7..131b654a7 100644 --- a/crates/tauri-cli/Cargo.toml +++ b/crates/tauri-cli/Cargo.toml @@ -66,7 +66,7 @@ tauri-utils = { version = "2.8.1", path = "../tauri-utils", features = [ "html-manipulation", ] } toml = "0.9" -jsonschema = "0.33" +jsonschema = { version = "0.33", default-features = false } handlebars = "6" include_dir = "0.7" dirs = "6" diff --git a/crates/tauri-cli/src/helpers/config.rs b/crates/tauri-cli/src/helpers/config.rs index d25c29d4f..eb2a643de 100644 --- a/crates/tauri-cli/src/helpers/config.rs +++ b/crates/tauri-cli/src/helpers/config.rs @@ -14,7 +14,7 @@ use std::{ env::{current_dir, set_current_dir, set_var}, ffi::{OsStr, OsString}, process::exit, - sync::Mutex, + sync::{Mutex, OnceLock}, }; use crate::error::Context; @@ -146,6 +146,16 @@ fn config_handle() -> ConfigHandle { &CONFIG_HANDLE } +fn config_schema_validator() -> &'static jsonschema::Validator { + // TODO: Switch to `LazyLock` when we bump MSRV to above 1.80 + static CONFIG_SCHEMA_VALIDATOR: OnceLock = OnceLock::new(); + CONFIG_SCHEMA_VALIDATOR.get_or_init(|| { + let schema: JsonValue = serde_json::from_str(include_str!("../../config.schema.json")) + .expect("Failed to parse config schema bundled in the tauri-cli"); + jsonschema::validator_for(&schema).expect("Config schema bundled in the tauri-cli is invalid") + }) +} + /// Gets the static parsed config from `tauri.conf.json`. fn get_internal( merge_configs: &[&serde_json::Value], @@ -192,17 +202,14 @@ fn get_internal( if config_path.extension() == Some(OsStr::new("json")) || config_path.extension() == Some(OsStr::new("json5")) { - let schema: JsonValue = serde_json::from_str(include_str!("../../config.schema.json")) - .context("failed to parse config schema")?; - let validator = jsonschema::validator_for(&schema).expect("Invalid schema"); - let mut errors = validator.iter_errors(&config).peekable(); + let mut errors = config_schema_validator().iter_errors(&config).peekable(); if errors.peek().is_some() { for error in errors { let path = error.instance_path.into_iter().join(" > "); if path.is_empty() { - log::error!("`{config_file_name:?}` error: {}", error); + log::error!("`{config_file_name:?}` error: {error}"); } else { - log::error!("`{config_file_name:?}` error on `{}`: {}", path, error); + log::error!("`{config_file_name:?}` error on `{path}`: {error}"); } } if !reload { diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 801e18767..6f303c732 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -485,7 +485,7 @@ fn get_watch_folders(additional_watch_folders: &[PathBuf]) -> crate::Result { // If this fails cargo itself should fail too. But we still try to keep going with the unexpanded path. - log::error!("Error watching {}: {}", p.display(), err.to_string()); + log::error!("Error watching {}: {}", p.display(), err); watch_folders.push(p); } }; From fea4d0240341c6526105fa713ca97b00563aecd7 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Tue, 6 Jan 2026 11:16:00 +0100 Subject: [PATCH 088/119] chore(deps): update rkyv, closes #14734 (#14736) --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf21f5252..86f90143f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6991,9 +6991,9 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.45" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" dependencies = [ "bitvec", "bytecheck", @@ -7009,9 +7009,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.7.45" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" dependencies = [ "proc-macro2", "quote", From 3d102e0c136955f20e699835ddfcd004bc0ce799 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jan 2026 19:26:47 +0100 Subject: [PATCH 089/119] chore(deps): bump rsa from 0.9.7 to 0.9.10 (#14738) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86f90143f..d5b88b912 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7073,9 +7073,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.7" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ "const-oid", "digest", From 897529d7a28049c9142a0f060ecd90e2e0ca8921 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Thu, 8 Jan 2026 22:14:51 +0800 Subject: [PATCH 090/119] fix: map `rustls-tls` to `reqwest/rustls-no-provider` (#14726) Co-authored-by: FabianLars --- Cargo.lock | 107 +---------------------------- crates/tauri/Cargo.toml | 7 +- crates/tauri/src/protocol/tauri.rs | 12 ++-- 3 files changed, 13 insertions(+), 113 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d5b88b912..777ea58a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -553,28 +553,6 @@ dependencies = [ "arrayvec", ] -[[package]] -name = "aws-lc-rs" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88aab2464f1f25453baa7a07c84c5b7684e274054ba06817f382357f77a288" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45afffdee1e7c9126814751f88dddc747f41d91da16c9551a0f1e8a11e788a1" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - [[package]] name = "axum" version = "0.8.4" @@ -1323,15 +1301,6 @@ dependencies = [ "digest", ] -[[package]] -name = "cmake" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" -dependencies = [ - "cc", -] - [[package]] name = "color_quant" version = "1.1.0" @@ -2635,12 +2604,6 @@ dependencies = [ "thiserror 1.0.69", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "fsevent-sys" version = "4.1.0" @@ -2898,10 +2861,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -6408,59 +6369,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "quinn" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls 0.23.35", - "socket2 0.5.8", - "thiserror 2.0.12", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" -dependencies = [ - "aws-lc-rs", - "bytes", - "getrandom 0.2.15", - "rand 0.8.5", - "ring", - "rustc-hash", - "rustls 0.23.35", - "rustls-pki-types", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.5.8", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "quote" version = "1.0.38" @@ -6891,7 +6799,6 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", - "quinn", "rustls 0.23.35", "rustls-pki-types", "rustls-platform-verifier", @@ -7219,7 +7126,6 @@ version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ - "aws-lc-rs", "log", "once_cell", "ring", @@ -7290,7 +7196,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ - "web-time", "zeroize", ] @@ -7348,7 +7253,6 @@ version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -8634,6 +8538,7 @@ dependencies = [ "quickcheck_macros", "raw-window-handle", "reqwest 0.13.1", + "rustls 0.23.35", "serde", "serde_json", "serde_repr", @@ -10265,16 +10170,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webkit2gtk" version = "2.0.1" diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index b7cee807a..72fb921b9 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -144,8 +144,10 @@ bytes = { version = "1", features = ["serde"] } reqwest = { version = "0.13", default-features = false, features = [ "json", "stream", - ] } +rustls = { version = "0.23", default-features = false, features = [ + "ring", +], optional = true } # android [target.'cfg(target_os = "android")'.dependencies] @@ -198,10 +200,9 @@ linux-libxdo = ["tray-icon/libxdo", "muda/libxdo"] isolation = ["tauri-utils/isolation", "tauri-macros/isolation", "uuid"] custom-protocol = ["tauri-macros/custom-protocol"] # TODO: Remove these flags in v3 and/or enable them by default behind a mobile flag https://github.com/tauri-apps/tauri/issues/12384 -# For now those feature flags keep enabling reqwest features in case some users depend on that by accident. native-tls = ["reqwest/native-tls"] native-tls-vendored = ["reqwest/native-tls-vendored"] -rustls-tls = ["reqwest/rustls"] +rustls-tls = ["reqwest/rustls-no-provider", "dep:rustls"] devtools = ["tauri-runtime/devtools", "tauri-runtime-wry?/devtools"] process-relaunch-dangerous-allow-symlink-macos = [ "tauri-utils/process-relaunch-dangerous-allow-symlink-macos", diff --git a/crates/tauri/src/protocol/tauri.rs b/crates/tauri/src/protocol/tauri.rs index 10cab2ced..a346754f0 100644 --- a/crates/tauri/src/protocol/tauri.rs +++ b/crates/tauri/src/protocol/tauri.rs @@ -114,6 +114,11 @@ fn get_response( decoded_path.trim_start_matches('/') ); + #[cfg(feature = "rustls-tls")] + if rustls::crypto::CryptoProvider::get_default().is_none() { + let _ = rustls::crypto::ring::default_provider().install_default(); + } + let mut client = reqwest::ClientBuilder::new(); if url.starts_with("https://") { @@ -126,10 +131,9 @@ fn get_response( ))] { log::info!("adding dev server root certificate"); - client = client.add_root_certificate( - reqwest::Certificate::from_pem(cert_pem.as_bytes()) - .expect("failed to parse TAURI_DEV_ROOT_CERTIFICATE"), - ); + let certificate = reqwest::Certificate::from_pem(cert_pem.as_bytes()) + .expect("failed to parse TAURI_DEV_ROOT_CERTIFICATE"); + client = client.tls_certs_merge([certificate]); } #[cfg(not(any( From 84b04c4a8d3310b7a7091d10e36244bf94996e51 Mon Sep 17 00:00:00 2001 From: Amr Bashir Date: Sun, 11 Jan 2026 20:37:52 +0200 Subject: [PATCH 091/119] fix: fix leftover inconsistent env var in `tauri signer sign` command (#14759) --- .changes/signing-env-vars.md | 14 +++++++++ crates/tauri-cli/src/signer/generate.rs | 37 ++++++++++++----------- crates/tauri-cli/src/signer/sign.rs | 39 +++++++++++++++++++++++-- 3 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 .changes/signing-env-vars.md diff --git a/.changes/signing-env-vars.md b/.changes/signing-env-vars.md new file mode 100644 index 000000000..c164c3b9a --- /dev/null +++ b/.changes/signing-env-vars.md @@ -0,0 +1,14 @@ +--- +"tauri-cli": patch:enhance +"@tauri-apps/cli": patch:enhance +--- + +Added new environment variables for `tauri signer sign` command, to align with existing environment variables used in `tauri build`, `tauri bundle` and `tauri signer generate` +- `TAURI_SIGNING_PRIVATE_KEY` +- `TAURI_SIGNING_PRIVATE_KEY_PATH` +- `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` + +The old environment variables are deprecated and will be removed in a future release. +- `TAURI_PRIVATE_KEY` +- `TAURI_PRIVATE_KEY_PATH` +- `TAURI_PRIVATE_KEY_PASSWORD` diff --git a/crates/tauri-cli/src/signer/generate.rs b/crates/tauri-cli/src/signer/generate.rs index 97f3b3708..6ca4244c7 100644 --- a/crates/tauri-cli/src/signer/generate.rs +++ b/crates/tauri-cli/src/signer/generate.rs @@ -39,26 +39,29 @@ pub fn command(mut options: Options) -> Result<()> { save_keypair(options.force, output_path, &keypair.sk, &keypair.pk) .expect("Unable to write keypair"); - println!( - "\nYour keypair was generated successfully\nPrivate: {} (Keep it secret!)\nPublic: {}\n---------------------------", - display_path(secret_path), - display_path(public_path) - ) + println!(); + println!("Your keypair was generated successfully:"); + println!("Private: {} (Keep it secret!)", display_path(secret_path)); + println!("Public: {}", display_path(public_path)); + println!("---------------------------") } else { - println!( - "\nYour secret key was generated successfully - Keep it secret!\n{}\n\n", - keypair.sk - ); - println!( - "Your public key was generated successfully:\n{}\n\nAdd the public key in your tauri.conf.json\n---------------------------\n", - keypair.pk - ); + println!(); + println!("Your keys were generated successfully!",); + println!(); + println!("Private: (Keep it secret!)"); + println!("{}", keypair.sk); + println!(); + println!("Public:"); + println!("{}", keypair.pk); } - println!("\nEnvironment variables used to sign:"); - println!("`TAURI_SIGNING_PRIVATE_KEY` Path or String of your private key"); - println!("`TAURI_SIGNING_PRIVATE_KEY_PASSWORD` Your private key password (optional)"); - println!("\nATTENTION: If you lose your private key OR password, you'll not be able to sign your update package and updates will not work.\n---------------------------\n"); + println!(); + println!("Environment variables used to sign:"); + println!("- `TAURI_SIGNING_PRIVATE_KEY`: String of your private key"); + println!("- `TAURI_SIGNING_PRIVATE_KEY_PATH`: Path to your private key file"); + println!("- `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`: Your private key password (optional if key has no password)"); + println!(); + println!("ATTENTION: If you lose your private key OR password, you'll not be able to sign your update package and updates will not work"); Ok(()) } diff --git a/crates/tauri-cli/src/signer/sign.rs b/crates/tauri-cli/src/signer/sign.rs index 44eee5d57..a50e4e083 100644 --- a/crates/tauri-cli/src/signer/sign.rs +++ b/crates/tauri-cli/src/signer/sign.rs @@ -21,7 +21,7 @@ pub struct Options { short = 'k', long, conflicts_with("private_key_path"), - env = "TAURI_PRIVATE_KEY" + env = "TAURI_SIGNING_PRIVATE_KEY" )] private_key: Option, /// Load the private key from a file @@ -29,17 +29,50 @@ pub struct Options { short = 'f', long, conflicts_with("private_key"), - env = "TAURI_PRIVATE_KEY_PATH" + env = "TAURI_SIGNING_PRIVATE_KEY_PATH" )] private_key_path: Option, /// Set private key password when signing - #[clap(short, long, env = "TAURI_PRIVATE_KEY_PASSWORD")] + #[clap(short, long, env = "TAURI_SIGNING_PRIVATE_KEY_PASSWORD")] password: Option, /// Sign the specified file file: PathBuf, } +// Backwards compatibility with old env vars +// TODO: remove in v3.0 +fn backward_env_vars(mut options: Options) -> Options { + let get_env = |old, new| { + if let Ok(old_value) = std::env::var(old) { + println!( + "\x1b[33mWarning: The environment variable '{old}' is deprecated. Please use '{new}' instead.\x1b[0m", + ); + Some(old_value) + } else { + None + } + }; + + options.private_key = options + .private_key + .or_else(|| get_env("TAURI_PRIVATE_KEY", "TAURI_SIGNING_PRIVATE_KEY")); + + options.private_key_path = options.private_key_path.or_else(|| { + get_env("TAURI_PRIVATE_KEY_PATH", "TAURI_SIGNING_PRIVATE_KEY_PATH").map(PathBuf::from) + }); + + options.password = options.password.or_else(|| { + get_env( + "TAURI_PRIVATE_KEY_PASSWORD", + "TAURI_SIGNING_PRIVATE_KEY_PASSWORD", + ) + }); + options +} + pub fn command(mut options: Options) -> Result<()> { + options = backward_env_vars(options); + options.private_key = if let Some(private_key) = options.private_key_path { Some(std::fs::read_to_string(Path::new(&private_key)).expect("Unable to extract private key")) } else { From 1b0e335d3f3445948d6590f7e074275d97cd9859 Mon Sep 17 00:00:00 2001 From: Wuelfhis Asuaje Date: Tue, 13 Jan 2026 22:09:45 -0300 Subject: [PATCH 092/119] Fix: Updater signer failed signing file without extension (#14713) * fixing bug where updater signer failed signing file withou extension * removing unnecessary unwrap() * Adding change file. Removing commnent. Adding TODO. * Apply suggestions from code review --------- Co-authored-by: Wuelfhis Asuaje Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> --- .changes/updater-signer-files-without-extension.md | 6 ++++++ crates/tauri-cli/src/helpers/updater_signature.rs | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 .changes/updater-signer-files-without-extension.md diff --git a/.changes/updater-signer-files-without-extension.md b/.changes/updater-signer-files-without-extension.md new file mode 100644 index 000000000..1ff41edbd --- /dev/null +++ b/.changes/updater-signer-files-without-extension.md @@ -0,0 +1,6 @@ +--- +tauri-cli: patch:bug +"@tauri-apps/cli": patch:bug +--- + +`tauri signer sign` doesn't work for files without an extension diff --git a/crates/tauri-cli/src/helpers/updater_signature.rs b/crates/tauri-cli/src/helpers/updater_signature.rs index 9367e7bad..ba9012359 100644 --- a/crates/tauri-cli/src/helpers/updater_signature.rs +++ b/crates/tauri-cli/src/helpers/updater_signature.rs @@ -120,9 +120,14 @@ where { let bin_path = bin_path.as_ref(); // We need to append .sig at the end it's where the signature will be stored - let mut extension = bin_path.extension().unwrap().to_os_string(); - extension.push(".sig"); - let signature_path = bin_path.with_extension(extension); + // TODO: use with_added_extension when we bump MSRV to > 1.91' + let signature_path = if let Some(ext) = bin_path.extension() { + let mut extension = ext.to_os_string(); + extension.push(".sig"); + bin_path.with_extension(extension) + } else { + bin_path.with_extension("sig") + }; let trusted_comment = format!( "timestamp:{}\tfile:{}", From 137576e8a481896af24cbf076aca4b5e8545d879 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 11:51:21 +0100 Subject: [PATCH 093/119] chore(deps): update dependency rollup to v4.55.1 (#14746) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 233 +++++++++++++++++++++----------------- 2 files changed, 131 insertions(+), 104 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 35b0db2b0..b514d120f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^16.2.0", - "rollup": "4.54.0", + "rollup": "4.55.1", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55b351c20..00adfe120 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.54.0) + version: 0.4.4(rollup@4.55.1) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.54.0)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.55.1)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^16.2.0 version: 16.2.0 rollup: - specifier: 4.54.0 - version: 4.54.0 + specifier: 4.55.1 + version: 4.55.1 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1125,113 +1125,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.54.0': - resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.54.0': - resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.54.0': - resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.54.0': - resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.54.0': - resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.54.0': - resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': - resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.54.0': - resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.54.0': - resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.54.0': - resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.54.0': - resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.54.0': - resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.54.0': - resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.54.0': - resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.54.0': - resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.54.0': - resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.54.0': - resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.54.0': - resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.54.0': - resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.54.0': - resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.54.0': - resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.54.0': - resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} cpu: [x64] os: [win32] @@ -2151,8 +2166,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.54.0: - resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3290,95 +3305,104 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.54.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.55.1)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.54.0 + rollup: 4.55.1 - '@rollup/plugin-typescript@12.3.0(rollup@4.54.0)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.55.1)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.54.0) + '@rollup/pluginutils': 5.2.0(rollup@4.55.1) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.54.0 + rollup: 4.55.1 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.54.0)': + '@rollup/pluginutils@5.2.0(rollup@4.55.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.54.0 + rollup: 4.55.1 - '@rollup/rollup-android-arm-eabi@4.54.0': + '@rollup/rollup-android-arm-eabi@4.55.1': optional: true - '@rollup/rollup-android-arm64@4.54.0': + '@rollup/rollup-android-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-arm64@4.54.0': + '@rollup/rollup-darwin-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-x64@4.54.0': + '@rollup/rollup-darwin-x64@4.55.1': optional: true - '@rollup/rollup-freebsd-arm64@4.54.0': + '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - '@rollup/rollup-freebsd-x64@4.54.0': + '@rollup/rollup-freebsd-x64@4.55.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.54.0': + '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.54.0': + '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.54.0': + '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.54.0': + '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.54.0': + '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.54.0': + '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.54.0': + '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.54.0': + '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.54.0': + '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - '@rollup/rollup-linux-x64-musl@4.54.0': + '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - '@rollup/rollup-openharmony-arm64@4.54.0': + '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.54.0': + '@rollup/rollup-linux-x64-musl@4.55.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.54.0': + '@rollup/rollup-openbsd-x64@4.55.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.54.0': + '@rollup/rollup-openharmony-arm64@4.55.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.54.0': + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true '@standard-schema/spec@1.0.0': {} @@ -4385,32 +4409,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.54.0: + rollup@4.55.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.54.0 - '@rollup/rollup-android-arm64': 4.54.0 - '@rollup/rollup-darwin-arm64': 4.54.0 - '@rollup/rollup-darwin-x64': 4.54.0 - '@rollup/rollup-freebsd-arm64': 4.54.0 - '@rollup/rollup-freebsd-x64': 4.54.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 - '@rollup/rollup-linux-arm-musleabihf': 4.54.0 - '@rollup/rollup-linux-arm64-gnu': 4.54.0 - '@rollup/rollup-linux-arm64-musl': 4.54.0 - '@rollup/rollup-linux-loong64-gnu': 4.54.0 - '@rollup/rollup-linux-ppc64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-musl': 4.54.0 - '@rollup/rollup-linux-s390x-gnu': 4.54.0 - '@rollup/rollup-linux-x64-gnu': 4.54.0 - '@rollup/rollup-linux-x64-musl': 4.54.0 - '@rollup/rollup-openharmony-arm64': 4.54.0 - '@rollup/rollup-win32-arm64-msvc': 4.54.0 - '@rollup/rollup-win32-ia32-msvc': 4.54.0 - '@rollup/rollup-win32-x64-gnu': 4.54.0 - '@rollup/rollup-win32-x64-msvc': 4.54.0 + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4652,7 +4679,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.54.0 + rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From 9a53c84ec0a41ea1d784e02e13aa90b94a4c8a8e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 12:28:04 +0100 Subject: [PATCH 094/119] chore(deps): update dependency globals to v17 (#14730) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index b514d120f..6a08a7dd3 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -54,7 +54,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", - "globals": "^16.2.0", + "globals": "^17.0.0", "rollup": "4.55.1", "tslib": "^2.8.1", "typescript": "^5.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00adfe120..0acf16256 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,8 +86,8 @@ importers: specifier: 3.3.3 version: 3.3.3 globals: - specifier: ^16.2.0 - version: 16.2.0 + specifier: ^17.0.0 + version: 17.0.0 rollup: specifier: 4.55.1 version: 4.55.1 @@ -1873,8 +1873,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.2.0: - resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + globals@17.0.0: + resolution: {integrity: sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==} engines: {node: '>=18'} graphemer@1.4.0: @@ -4152,7 +4152,7 @@ snapshots: globals@15.15.0: {} - globals@16.2.0: {} + globals@17.0.0: {} graphemer@1.4.0: {} From 07788af13fa87038fcaf4121dd9ee28b19ef44cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 12:53:18 +0100 Subject: [PATCH 095/119] chore(deps): update rust crate signal-hook-tokio to 0.4 (#14729) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: FabianLars --- Cargo.lock | 8 ++++---- crates/tauri-driver/Cargo.toml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 777ea58a4..aae0d652c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7853,9 +7853,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "2a37d01603c37b5466f808de79f845c7116049b0579adb70a6b7d47c1fa3a952" dependencies = [ "libc", "signal-hook-registry", @@ -7872,9 +7872,9 @@ dependencies = [ [[package]] name = "signal-hook-tokio" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213241f76fb1e37e27de3b6aa1b068a2c333233b59cca6634f634b80a27ecf1e" +checksum = "e513e435a8898a0002270f29d0a708b7879708fb5c4d00e46983ca2d2d378cf0" dependencies = [ "futures-core", "libc", diff --git a/crates/tauri-driver/Cargo.toml b/crates/tauri-driver/Cargo.toml index ad44b8a89..9b35fe111 100644 --- a/crates/tauri-driver/Cargo.toml +++ b/crates/tauri-driver/Cargo.toml @@ -31,8 +31,8 @@ tokio = { version = "1", features = ["macros"] } which = "8" [target."cfg(unix)".dependencies] -signal-hook = "0.3" -signal-hook-tokio = { version = "0.3", features = ["futures-v0_3"] } +signal-hook = "0.4" +signal-hook-tokio = { version = "0.4", features = ["futures-v0_3"] } [target."cfg(windows)".dependencies] win32job = "2" From 268bb339f0c512f021cc94e102573432cf2696d0 Mon Sep 17 00:00:00 2001 From: sftse Date: Thu, 15 Jan 2026 13:14:30 +0100 Subject: [PATCH 096/119] build(tauri-macos-sign): remove once-cell-regex (#14766) Co-authored-by: Fabian-Lars --- .changes/change-pr-14766.md | 5 +++++ Cargo.lock | 3 ++- crates/tauri-macos-sign/Cargo.toml | 3 ++- crates/tauri-macos-sign/src/keychain/identity.rs | 10 ++++++---- 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 .changes/change-pr-14766.md diff --git a/.changes/change-pr-14766.md b/.changes/change-pr-14766.md new file mode 100644 index 000000000..4fb885f88 --- /dev/null +++ b/.changes/change-pr-14766.md @@ -0,0 +1,5 @@ +--- +"tauri-macos-sign": patch:deps +--- + +Remove once-cell-regex from direct dependencies. diff --git a/Cargo.lock b/Cargo.lock index aae0d652c..c9d5e6511 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8799,11 +8799,12 @@ dependencies = [ "chrono", "dirs 6.0.0", "log", - "once-cell-regex", + "once_cell", "os_pipe", "p12", "plist", "rand 0.9.1", + "regex", "serde", "serde_json", "tempfile", diff --git a/crates/tauri-macos-sign/Cargo.toml b/crates/tauri-macos-sign/Cargo.toml index 9fc874364..309938c27 100644 --- a/crates/tauri-macos-sign/Cargo.toml +++ b/crates/tauri-macos-sign/Cargo.toml @@ -15,7 +15,8 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" tempfile = "3" x509-certificate = "0.23" -once-cell-regex = "0.2" +once_cell = "1" +regex = "1" os_pipe = "1" plist = "1" rand = "0.9" diff --git a/crates/tauri-macos-sign/src/keychain/identity.rs b/crates/tauri-macos-sign/src/keychain/identity.rs index a39c48423..6ac146915 100644 --- a/crates/tauri-macos-sign/src/keychain/identity.rs +++ b/crates/tauri-macos-sign/src/keychain/identity.rs @@ -2,7 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use once_cell_regex::regex; +use once_cell::sync::OnceCell; +use regex::Regex; use std::{collections::BTreeSet, path::Path, process::Command}; use x509_certificate::certificate::X509Certificate; @@ -49,9 +50,10 @@ impl Team { organization } else { println!( - "found cert {common_name:?} but failed to get organization; falling back to displaying common name" - ); - regex!(r"Apple Develop\w+: (.*) \(.+\)") + "found cert {common_name:?} but failed to get organization; falling back to displaying common name" + ); + static APPLE_DEV: OnceCell = OnceCell::new(); + APPLE_DEV.get_or_init(|| Regex::new(r"Apple Develop\w+: (.*) \(.+\)").unwrap()) .captures(&common_name) .map(|caps| caps[1].to_owned()) .unwrap_or_else(|| { From 75057c7c08f0d4d3dd8d10cea4e2217e5d61fe1a Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Thu, 15 Jan 2026 14:48:45 +0100 Subject: [PATCH 097/119] chore(deps): update wry to 0.54 and webkit2gtk-rs to 2.0.2 (#14778) --- .changes/webkitgtk202.md | 7 +++++++ .changes/wry-054.md | 6 ++++++ Cargo.lock | 12 ++++++------ crates/tauri-runtime-wry/Cargo.toml | 2 +- crates/tauri/Cargo.toml | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 .changes/webkitgtk202.md create mode 100644 .changes/wry-054.md diff --git a/.changes/webkitgtk202.md b/.changes/webkitgtk202.md new file mode 100644 index 000000000..07f547e4c --- /dev/null +++ b/.changes/webkitgtk202.md @@ -0,0 +1,7 @@ +--- +tauri-runtime-wry: patch:deps +tauri-runtime: patch:deps +tauri: patch:deps +--- + +**Breaking Change** for `with_webview` users: Updated webkit2gtk-rs crates to `v2.0.2`. \ No newline at end of file diff --git a/.changes/wry-054.md b/.changes/wry-054.md new file mode 100644 index 000000000..9e4a0cdbe --- /dev/null +++ b/.changes/wry-054.md @@ -0,0 +1,6 @@ +--- +tauri-runtime-wry: patch:deps +tauri: patch:deps +--- + +Update wry to `v0.54`. \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c9d5e6511..2df411247 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10173,9 +10173,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -10197,9 +10197,9 @@ dependencies = [ [[package]] name = "webkit2gtk-sys" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" dependencies = [ "bitflags 1.3.2", "cairo-sys-rs", @@ -10916,9 +10916,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.53.4" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d78ec082b80fa088569a970d043bb3050abaabf4454101d44514ee8d9a8c9f6" +checksum = "e456eeaf7f09413fdc16799782879b2b9f1d264dfdbce4cf7e924df0ef36afb9" dependencies = [ "base64 0.22.1", "block2 0.6.0", diff --git a/crates/tauri-runtime-wry/Cargo.toml b/crates/tauri-runtime-wry/Cargo.toml index 339b07f4a..3abe48253 100644 --- a/crates/tauri-runtime-wry/Cargo.toml +++ b/crates/tauri-runtime-wry/Cargo.toml @@ -13,7 +13,7 @@ edition.workspace = true rust-version.workspace = true [dependencies] -wry = { version = "0.53.4", default-features = false, features = [ +wry = { version = "0.54.0", default-features = false, features = [ "drag-drop", "protocol", "os-webview", diff --git a/crates/tauri/Cargo.toml b/crates/tauri/Cargo.toml index 72fb921b9..6d3c9137c 100644 --- a/crates/tauri/Cargo.toml +++ b/crates/tauri/Cargo.toml @@ -97,7 +97,7 @@ tray-icon = { version = "0.21", default-features = false, features = [ # linux [target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd"))'.dependencies] gtk = { version = "0.18", features = ["v3_24"] } -webkit2gtk = { version = "=2.0.1", features = ["v2_40"], optional = true } +webkit2gtk = { version = "=2.0.2", features = ["v2_40"], optional = true } # darwin [target.'cfg(target_vendor = "apple")'.dependencies] From 123d63a0c1b31a150cf459a93aa0ac0b79c2b5b8 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Thu, 15 Jan 2026 17:00:58 +0100 Subject: [PATCH 098/119] chore: change webkit2gtk bump to minor --- .changes/webkitgtk202.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.changes/webkitgtk202.md b/.changes/webkitgtk202.md index 07f547e4c..739ce1ebd 100644 --- a/.changes/webkitgtk202.md +++ b/.changes/webkitgtk202.md @@ -1,7 +1,7 @@ --- -tauri-runtime-wry: patch:deps -tauri-runtime: patch:deps -tauri: patch:deps +tauri-runtime-wry: minor:deps +tauri-runtime: minor:deps +tauri: minor:deps --- -**Breaking Change** for `with_webview` users: Updated webkit2gtk-rs crates to `v2.0.2`. \ No newline at end of file +**Breaking Change** for `with_webview` users: Updated webkit2gtk-rs crates to `v2.0.2`. From 7873c4a1c680b6809cc954ff904a6a7a536cfa3b Mon Sep 17 00:00:00 2001 From: yy Date: Sat, 17 Jan 2026 20:30:14 +0900 Subject: [PATCH 099/119] docs: fix typos in comments (#14787) --- crates/tauri-bundler/src/bundle/macos/sign.rs | 2 +- crates/tauri-bundler/src/bundle/settings.rs | 2 +- crates/tauri-runtime-wry/src/window/mod.rs | 2 +- crates/tauri-runtime/src/webview.rs | 2 +- crates/tauri/src/webview/mod.rs | 2 +- crates/tauri/src/webview/webview_window.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/tauri-bundler/src/bundle/macos/sign.rs b/crates/tauri-bundler/src/bundle/macos/sign.rs index 8d8bf6c2b..acde62708 100644 --- a/crates/tauri-bundler/src/bundle/macos/sign.rs +++ b/crates/tauri-bundler/src/bundle/macos/sign.rs @@ -21,7 +21,7 @@ pub fn keychain(identity: Option<&str>) -> crate::Result>, - /// the list of of RPM dependencies your application recommends. + /// the list of RPM dependencies your application recommends. pub recommends: Option>, /// The list of RPM dependencies your application provides. pub provides: Option>, diff --git a/crates/tauri-runtime-wry/src/window/mod.rs b/crates/tauri-runtime-wry/src/window/mod.rs index 6fb2dbe17..b18543e5d 100644 --- a/crates/tauri-runtime-wry/src/window/mod.rs +++ b/crates/tauri-runtime-wry/src/window/mod.rs @@ -39,7 +39,7 @@ pub trait WindowExt { /// - **Android / iOS**: Unsupported. fn center(&self) {} - /// Clears the window surface. i.e make it it transparent. + /// Clears the window surface. i.e make it transparent. #[cfg(windows)] fn draw_surface( &self, diff --git a/crates/tauri-runtime/src/webview.rs b/crates/tauri-runtime/src/webview.rs index efce7d814..80f7edf0e 100644 --- a/crates/tauri-runtime/src/webview.rs +++ b/crates/tauri-runtime/src/webview.rs @@ -363,7 +363,7 @@ pub struct WebviewAttributes { /// see https://docs.rs/objc2-web-kit/latest/objc2_web_kit/struct.WKWebView.html#method.allowsLinkPreview pub allow_link_preview: bool, pub scroll_bar_style: ScrollBarStyle, - /// Allows overriding the the keyboard accessory view on iOS. + /// Allows overriding the keyboard accessory view on iOS. /// Returning `None` effectively removes the view. /// /// The closure parameter is the webview instance. diff --git a/crates/tauri/src/webview/mod.rs b/crates/tauri/src/webview/mod.rs index 44d9e0a36..4df09182a 100644 --- a/crates/tauri/src/webview/mod.rs +++ b/crates/tauri/src/webview/mod.rs @@ -1202,7 +1202,7 @@ fn main() { self } - /// Allows overriding the the keyboard accessory view on iOS. + /// Allows overriding the keyboard accessory view on iOS. /// Returning `None` effectively removes the view. /// /// The closure parameter is the webview instance. diff --git a/crates/tauri/src/webview/webview_window.rs b/crates/tauri/src/webview/webview_window.rs index f3c8665c3..92b033b06 100644 --- a/crates/tauri/src/webview/webview_window.rs +++ b/crates/tauri/src/webview/webview_window.rs @@ -1230,7 +1230,7 @@ impl> WebviewWindowBuilder<'_, R, M> { self } - /// Allows overriding the the keyboard accessory view on iOS. + /// Allows overriding the keyboard accessory view on iOS. /// Returning `None` effectively removes the view. /// /// The closure parameter is the webview instance. From 7f7d9aac214e22d9492490543f7a9bcae0a6659e Mon Sep 17 00:00:00 2001 From: sftse Date: Sat, 17 Jan 2026 16:52:42 +0100 Subject: [PATCH 100/119] Less statics (#14668) * refactor(tauri-cli): introduce replacement functions * refactor(tauri-cli): apply replacement to remove.rs * refactor(tauri-cli): apply replacement to icon.rs * refactor(tauri-cli): apply replacement to bundle.rs * refactor(tauri-cli): apply replacement to build.rs * refactor(tauri-cli): apply replacement to add.rs * refactor(tauri-cli): apply replacement to dev.rs * refactor(tauri-cli): less controlflow * refactor(tauri-cli): split config loading from locking static * refactor(tauri-cli): remove duplicate checks covered by if let Some(tauri_dir) = tauri_dir tauri_dir.is_some() must be true, otherwise the entire block is not run, so the frontend_dir check is irrelevant * fmt * refactor(tauri-cli): apply replacement to inspect.rs * refactor(tauri-cli): dont use statics for config * refactor(tauri-cli): finish threading directory paths through functions * fix: clippy * fixup CI * refactor(tauri-cli): dont need mutex * refactor(tauri-cli): rescope mutex use to minimal necessary * fix CI, reduce mutex use * fixup PR #14607 * fix: clippy * refactor(tauri-cli): remove ConfigHandle * refactor(tauri-cli): remove more unwraps and panicing functions * refactor(tauri-cli): less mutexes * refactor(tauri-cli): undo mistaken change, address review comment * Split android build to 2 functions * Pass in dirs to migration v1 like the v2 beta * Add change file --------- Co-authored-by: Tony --- .changes/reduce-internal-statics.md | 6 + crates/tauri-cli/src/acl/capability/new.rs | 12 +- crates/tauri-cli/src/acl/permission/ls.rs | 6 +- crates/tauri-cli/src/add.rs | 20 ++- crates/tauri-cli/src/build.rs | 45 ++--- crates/tauri-cli/src/bundle.rs | 35 ++-- crates/tauri-cli/src/dev.rs | 114 +++++------- crates/tauri-cli/src/helpers/app_paths.rs | 30 ++-- .../tauri-cli/src/helpers/cargo_manifest.rs | 2 +- crates/tauri-cli/src/helpers/config.rs | 95 +++++----- crates/tauri-cli/src/helpers/mod.rs | 5 +- crates/tauri-cli/src/icon.rs | 5 +- crates/tauri-cli/src/info/app.rs | 74 ++++---- crates/tauri-cli/src/info/mod.rs | 14 +- crates/tauri-cli/src/info/plugins.rs | 44 ++--- crates/tauri-cli/src/inspect.rs | 26 +-- crates/tauri-cli/src/interface/mod.rs | 32 +++- crates/tauri-cli/src/interface/rust.rs | 165 +++++++++++------- .../tauri-cli/src/interface/rust/desktop.rs | 9 +- .../tauri-cli/src/interface/rust/manifest.rs | 9 +- .../src/migrate/migrations/v1/mod.rs | 34 ++-- .../src/migrate/migrations/v2_beta.rs | 16 +- crates/tauri-cli/src/migrate/mod.rs | 23 +-- .../mobile/android/android_studio_script.rs | 61 +++---- crates/tauri-cli/src/mobile/android/build.rs | 71 ++++---- crates/tauri-cli/src/mobile/android/dev.rs | 69 ++++---- crates/tauri-cli/src/mobile/android/mod.rs | 19 +- crates/tauri-cli/src/mobile/android/run.rs | 18 +- crates/tauri-cli/src/mobile/init.rs | 21 ++- crates/tauri-cli/src/mobile/ios/build.rs | 70 +++----- crates/tauri-cli/src/mobile/ios/dev.rs | 93 +++++----- crates/tauri-cli/src/mobile/ios/mod.rs | 51 ++---- crates/tauri-cli/src/mobile/ios/run.rs | 14 ++ .../tauri-cli/src/mobile/ios/xcode_script.rs | 55 +++--- crates/tauri-cli/src/mobile/mod.rs | 60 +++---- crates/tauri-cli/src/remove.rs | 17 +- 36 files changed, 682 insertions(+), 758 deletions(-) create mode 100644 .changes/reduce-internal-statics.md diff --git a/.changes/reduce-internal-statics.md b/.changes/reduce-internal-statics.md new file mode 100644 index 000000000..bc20780b1 --- /dev/null +++ b/.changes/reduce-internal-statics.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:changes +"tauri-cli": patch:changes +--- + +Refactored internal use of static on config and directory resolvings, no user facing changes, please report any regressions if you encounter any diff --git a/crates/tauri-cli/src/acl/capability/new.rs b/crates/tauri-cli/src/acl/capability/new.rs index aceddc05d..14324be18 100644 --- a/crates/tauri-cli/src/acl/capability/new.rs +++ b/crates/tauri-cli/src/acl/capability/new.rs @@ -7,12 +7,7 @@ use std::{collections::HashSet, path::PathBuf}; use clap::Parser; use tauri_utils::acl::capability::{Capability, PermissionEntry}; -use crate::{ - acl::FileFormat, - error::ErrorExt, - helpers::{app_paths::tauri_dir, prompts}, - Result, -}; +use crate::{acl::FileFormat, error::ErrorExt, helpers::prompts, Result}; #[derive(Debug, Parser)] #[clap(about = "Create a new permission file")] @@ -37,7 +32,7 @@ pub struct Options { } pub fn command(options: Options) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); let identifier = match options.identifier { Some(i) => i, @@ -111,8 +106,7 @@ pub fn command(options: Options) -> Result<()> { .canonicalize() .fs_context("failed to canonicalize capability file path", o.clone())?, None => { - let dir = tauri_dir(); - let capabilities_dir = dir.join("capabilities"); + let capabilities_dir = dirs.tauri.join("capabilities"); capabilities_dir.join(format!( "{}.{}", capability.identifier, diff --git a/crates/tauri-cli/src/acl/permission/ls.rs b/crates/tauri-cli/src/acl/permission/ls.rs index 1265c3c24..ccebfebf0 100644 --- a/crates/tauri-cli/src/acl/permission/ls.rs +++ b/crates/tauri-cli/src/acl/permission/ls.rs @@ -6,7 +6,6 @@ use clap::Parser; use crate::{ error::{Context, ErrorExt}, - helpers::app_paths::tauri_dir, Result, }; use colored::Colorize; @@ -25,9 +24,10 @@ pub struct Options { } pub fn command(options: Options) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); - let acl_manifests_path = tauri_dir() + let acl_manifests_path = dirs + .tauri .join("gen") .join("schemas") .join("acl-manifests.json"); diff --git a/crates/tauri-cli/src/add.rs b/crates/tauri-cli/src/add.rs index 8a45c0880..074b0e3b2 100644 --- a/crates/tauri-cli/src/add.rs +++ b/crates/tauri-cli/src/add.rs @@ -10,7 +10,7 @@ use crate::{ acl, error::ErrorExt, helpers::{ - app_paths::{resolve_frontend_dir, tauri_dir}, + app_paths::{resolve_frontend_dir, Dirs}, cargo, npm::PackageManager, }, @@ -39,11 +39,11 @@ pub struct Options { } pub fn command(options: Options) -> Result<()> { - crate::helpers::app_paths::resolve(); - run(options) + let dirs = crate::helpers::app_paths::resolve_dirs(); + run(options, &dirs) } -pub fn run(options: Options) -> Result<()> { +pub fn run(options: Options, dirs: &Dirs) -> Result<()> { let (plugin, version) = options .plugin .split_once('@') @@ -71,7 +71,6 @@ pub fn run(options: Options) -> Result<()> { } let frontend_dir = resolve_frontend_dir(); - let tauri_dir = tauri_dir(); let target_str = metadata .desktop_only @@ -90,7 +89,7 @@ pub fn run(options: Options) -> Result<()> { branch: options.branch.as_deref(), rev: options.rev.as_deref(), tag: options.tag.as_deref(), - cwd: Some(tauri_dir), + cwd: Some(dirs.tauri), target: target_str, })?; @@ -117,7 +116,7 @@ pub fn run(options: Options) -> Result<()> { (None, None, None, None) => npm_name, _ => crate::error::bail!("Only one of --tag, --rev and --branch can be specified"), }; - manager.install(&[npm_spec], tauri_dir)?; + manager.install(&[npm_spec], dirs.tauri)?; } let _ = acl::permission::add::command(acl::permission::add::Options { @@ -143,7 +142,10 @@ pub fn run(options: Options) -> Result<()> { let plugin_init = format!(".plugin(tauri_plugin_{plugin_snake_case}::{plugin_init_fn})"); let re = Regex::new(r"(tauri\s*::\s*Builder\s*::\s*default\(\))(\s*)").unwrap(); - for file in [tauri_dir.join("src/main.rs"), tauri_dir.join("src/lib.rs")] { + for file in [ + dirs.tauri.join("src/main.rs"), + dirs.tauri.join("src/lib.rs"), + ] { let contents = std::fs::read_to_string(&file).fs_context("failed to read Rust entry point", file.clone())?; @@ -166,7 +168,7 @@ pub fn run(options: Options) -> Result<()> { log::info!("Running `cargo fmt`..."); let _ = Command::new("cargo") .arg("fmt") - .current_dir(tauri_dir) + .current_dir(dirs.tauri) .status(); } diff --git a/crates/tauri-cli/src/build.rs b/crates/tauri-cli/src/build.rs index 0bd5a5320..754b1793e 100644 --- a/crates/tauri-cli/src/build.rs +++ b/crates/tauri-cli/src/build.rs @@ -7,8 +7,8 @@ use crate::{ error::{Context, ErrorExt}, helpers::{ self, - app_paths::{frontend_dir, tauri_dir}, - config::{get as get_config, ConfigMetadata, FrontendDist}, + app_paths::Dirs, + config::{get_config, ConfigMetadata, FrontendDist}, }, info::plugins::check_mismatched_packages, interface::{rust::get_cargo_target_dir, AppInterface, Interface}, @@ -82,7 +82,7 @@ pub struct Options { } pub fn command(mut options: Options, verbosity: u8) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); if options.no_sign { log::warn!("--no-sign flag detected: Signing will be skipped."); @@ -99,42 +99,38 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> { let config = get_config( target, &options.config.iter().map(|c| &c.0).collect::>(), + dirs.tauri, )?; - let mut interface = AppInterface::new( - config.lock().unwrap().as_ref().unwrap(), - options.target.clone(), - )?; + let mut interface = AppInterface::new(&config, options.target.clone(), dirs.tauri)?; - let config_guard = config.lock().unwrap(); - let config_ = config_guard.as_ref().unwrap(); + setup(&interface, &mut options, &config, false, &dirs)?; - setup(&interface, &mut options, config_, false)?; - - if let Some(minimum_system_version) = &config_.bundle.macos.minimum_system_version { + if let Some(minimum_system_version) = &config.bundle.macos.minimum_system_version { std::env::set_var("MACOSX_DEPLOYMENT_TARGET", minimum_system_version); } let app_settings = interface.app_settings(); let interface_options = options.clone().into(); - let out_dir = app_settings.out_dir(&interface_options)?; + let out_dir = app_settings.out_dir(&interface_options, dirs.tauri)?; - let bin_path = interface.build(interface_options)?; + let bin_path = interface.build(interface_options, &dirs)?; log::info!(action ="Built"; "application at: {}", tauri_utils::display_path(bin_path)); let app_settings = interface.app_settings(); - if !options.no_bundle && (config_.bundle.active || options.bundles.is_some()) { + if !options.no_bundle && (config.bundle.active || options.bundles.is_some()) { crate::bundle::bundle( &options.into(), verbosity, ci, &interface, &*app_settings, - config_, + &config, &out_dir, + &dirs, )?; } @@ -146,13 +142,12 @@ pub fn setup( options: &mut Options, config: &ConfigMetadata, mobile: bool, + dirs: &Dirs, ) -> Result<()> { - let tauri_path = tauri_dir(); - // TODO: Maybe optimize this to run in parallel in the future // see https://github.com/tauri-apps/tauri/pull/13993#discussion_r2280697117 log::info!("Looking up installed tauri packages to check mismatched versions..."); - if let Err(error) = check_mismatched_packages(frontend_dir(), tauri_path) { + if let Err(error) = check_mismatched_packages(dirs.frontend, dirs.tauri) { if options.ignore_version_mismatches { log::error!("{error}"); } else { @@ -160,7 +155,7 @@ pub fn setup( } } - set_current_dir(tauri_path).context("failed to set current directory")?; + set_current_dir(dirs.tauri).context("failed to set current directory")?; let bundle_identifier_source = config .find_bundle_identifier_overwriter() @@ -191,7 +186,13 @@ pub fn setup( } if let Some(before_build) = config.build.before_build_command.clone() { - helpers::run_hook("beforeBuildCommand", before_build, interface, options.debug)?; + helpers::run_hook( + "beforeBuildCommand", + before_build, + interface, + options.debug, + dirs.frontend, + )?; } if let Some(FrontendDist::Directory(web_asset_path)) = &config.build.frontend_dist { @@ -219,7 +220,7 @@ pub fn setup( // Issue #13287 - Allow the use of target dir inside frontendDist/distDir // https://github.com/tauri-apps/tauri/issues/13287 - let target_path = get_cargo_target_dir(&options.args)?; + let target_path = get_cargo_target_dir(&options.args, dirs.tauri)?; let mut out_folders = Vec::new(); if let Ok(web_asset_canonical) = dunce::canonicalize(web_asset_path) { if let Ok(relative_path) = target_path.strip_prefix(&web_asset_canonical) { diff --git a/crates/tauri-cli/src/bundle.rs b/crates/tauri-cli/src/bundle.rs index 8c1f320b5..57e4a6f38 100644 --- a/crates/tauri-cli/src/bundle.rs +++ b/crates/tauri-cli/src/bundle.rs @@ -16,8 +16,8 @@ use crate::{ error::{Context, ErrorExt}, helpers::{ self, - app_paths::tauri_dir, - config::{get as get_config, ConfigMetadata}, + app_paths::Dirs, + config::{get_config, ConfigMetadata}, updater_signature, }, interface::{AppInterface, AppSettings, Interface}, @@ -118,7 +118,7 @@ impl From for Options { } pub fn command(options: Options, verbosity: u8) -> crate::Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); let ci = options.ci; @@ -131,27 +131,21 @@ pub fn command(options: Options, verbosity: u8) -> crate::Result<()> { let config = get_config( target, &options.config.iter().map(|c| &c.0).collect::>(), + dirs.tauri, )?; - let interface = AppInterface::new( - config.lock().unwrap().as_ref().unwrap(), - options.target.clone(), - )?; + let interface = AppInterface::new(&config, options.target.clone(), dirs.tauri)?; - let tauri_path = tauri_dir(); - std::env::set_current_dir(tauri_path).context("failed to set current directory")?; + std::env::set_current_dir(dirs.tauri).context("failed to set current directory")?; - let config_guard = config.lock().unwrap(); - let config_ = config_guard.as_ref().unwrap(); - - if let Some(minimum_system_version) = &config_.bundle.macos.minimum_system_version { + if let Some(minimum_system_version) = &config.bundle.macos.minimum_system_version { std::env::set_var("MACOSX_DEPLOYMENT_TARGET", minimum_system_version); } let app_settings = interface.app_settings(); let interface_options = options.clone().into(); - let out_dir = app_settings.out_dir(&interface_options)?; + let out_dir = app_settings.out_dir(&interface_options, dirs.tauri)?; bundle( &options, @@ -159,8 +153,9 @@ pub fn command(options: Options, verbosity: u8) -> crate::Result<()> { ci, &interface, &*app_settings, - config_, + &config, &out_dir, + &dirs, ) } @@ -173,6 +168,7 @@ pub fn bundle( app_settings: &A, config: &ConfigMetadata, out_dir: &Path, + dirs: &Dirs, ) -> crate::Result<()> { let package_types: Vec = if let Some(bundles) = &options.bundles { bundles.iter().map(|bundle| bundle.0).collect::>() @@ -198,12 +194,19 @@ pub fn bundle( before_bundle, interface, options.debug, + dirs.frontend, )?; } } let mut settings = app_settings - .get_bundler_settings(options.clone().into(), config, out_dir, package_types) + .get_bundler_settings( + options.clone().into(), + config, + out_dir, + package_types, + dirs.tauri, + ) .with_context(|| "failed to build bundler settings")?; settings.set_no_sign(options.no_sign); diff --git a/crates/tauri-cli/src/dev.rs b/crates/tauri-cli/src/dev.rs index e2ac61fce..5bf62ef10 100644 --- a/crates/tauri-cli/src/dev.rs +++ b/crates/tauri-cli/src/dev.rs @@ -5,11 +5,9 @@ use crate::{ error::{Context, ErrorExt}, helpers::{ - app_paths::{frontend_dir, tauri_dir}, + app_paths::Dirs, command_env, - config::{ - get as get_config, reload as reload_config, BeforeDevCommand, ConfigHandle, FrontendDist, - }, + config::{get_config, reload_config, BeforeDevCommand, ConfigMetadata, FrontendDist}, }, info::plugins::check_mismatched_packages, interface::{AppInterface, ExitReason, Interface}, @@ -99,61 +97,59 @@ pub struct Options { } pub fn command(options: Options) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); - let r = command_internal(options); + let r = command_internal(options, dirs); if r.is_err() { kill_before_dev_process(); } r } -fn command_internal(mut options: Options) -> Result<()> { +fn command_internal(mut options: Options, dirs: Dirs) -> Result<()> { let target = options .target .as_deref() .map(Target::from_triple) .unwrap_or_else(Target::current); - let config = get_config( + let mut cfg = get_config( target, &options.config.iter().map(|c| &c.0).collect::>(), + dirs.tauri, )?; - let mut interface = AppInterface::new( - config.lock().unwrap().as_ref().unwrap(), - options.target.clone(), - )?; + let mut interface = AppInterface::new(&cfg, options.target.clone(), dirs.tauri)?; - setup(&interface, &mut options, config)?; + setup(&interface, &mut options, &mut cfg, &dirs)?; + + let config = Mutex::new(cfg); let exit_on_panic = options.exit_on_panic; let no_watch = options.no_watch; - interface.dev(options.into(), move |status, reason| { - on_app_exit(status, reason, exit_on_panic, no_watch) - }) + interface.dev( + &config, + options.into(), + move |status, reason| on_app_exit(status, reason, exit_on_panic, no_watch), + &dirs, + ) } -pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHandle) -> Result<()> { - let tauri_path = tauri_dir(); - +pub fn setup( + interface: &AppInterface, + options: &mut Options, + config: &mut ConfigMetadata, + dirs: &Dirs, +) -> Result<()> { std::thread::spawn(|| { - if let Err(error) = check_mismatched_packages(frontend_dir(), tauri_path) { + if let Err(error) = check_mismatched_packages(dirs.frontend, dirs.tauri) { log::error!("{error}"); } }); - set_current_dir(tauri_path).context("failed to set current directory")?; + set_current_dir(dirs.tauri).context("failed to set current directory")?; - if let Some(before_dev) = config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .before_dev_command - .clone() - { + if let Some(before_dev) = config.build.before_dev_command.clone() { let (script, script_cwd, wait) = match before_dev { BeforeDevCommand::Script(s) if s.is_empty() => (None, None, false), BeforeDevCommand::Script(s) => (Some(s), None, false), @@ -161,7 +157,7 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand (Some(script), cwd.map(Into::into), wait) } }; - let cwd = script_cwd.unwrap_or_else(|| frontend_dir().clone()); + let cwd = script_cwd.unwrap_or_else(|| dirs.frontend.to_owned()); if let Some(before_dev) = script { log::info!(action = "Running"; "BeforeDevCommand (`{}`)", before_dev); let mut env = command_env(true); @@ -235,43 +231,14 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand } if options.runner.is_none() { - options.runner = config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .runner - .clone(); + options.runner = config.build.runner.clone(); } - let mut cargo_features = config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .features - .clone() - .unwrap_or_default(); + let mut cargo_features = config.build.features.clone().unwrap_or_default(); cargo_features.extend(options.features.clone()); - let mut dev_url = config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .dev_url - .clone(); - let frontend_dist = config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .frontend_dist - .clone(); + let mut dev_url = config.build.dev_url.clone(); + let frontend_dist = config.build.frontend_dist.clone(); if !options.no_dev_server && dev_url.is_none() { if let Some(FrontendDist::Directory(path)) = &frontend_dist { if path.exists() { @@ -294,7 +261,11 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand } }))); - reload_config(&options.config.iter().map(|c| &c.0).collect::>())?; + reload_config( + config, + &options.config.iter().map(|c| &c.0).collect::>(), + dirs.tauri, + )?; } } } @@ -347,16 +318,9 @@ pub fn setup(interface: &AppInterface, options: &mut Options, config: ConfigHand } if options.additional_watch_folders.is_empty() { - options.additional_watch_folders.extend( - config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .additional_watch_folders - .clone(), - ); + options + .additional_watch_folders + .extend(config.build.additional_watch_folders.clone()); } Ok(()) diff --git a/crates/tauri-cli/src/helpers/app_paths.rs b/crates/tauri-cli/src/helpers/app_paths.rs index 3c728f5ba..5b3e0d91a 100644 --- a/crates/tauri-cli/src/helpers/app_paths.rs +++ b/crates/tauri-cli/src/helpers/app_paths.rs @@ -23,6 +23,11 @@ const ENV_TAURI_APP_PATH: &str = "TAURI_APP_PATH"; // path to the frontend app directory, usually `/` const ENV_TAURI_FRONTEND_PATH: &str = "TAURI_FRONTEND_PATH"; +pub struct Dirs { + pub tauri: &'static Path, + pub frontend: &'static Path, +} + static FRONTEND_DIR: OnceLock = OnceLock::new(); static TAURI_DIR: OnceLock = OnceLock::new(); @@ -122,8 +127,8 @@ pub fn resolve_tauri_dir() -> Option { }) } -pub fn resolve() { - TAURI_DIR.set(resolve_tauri_dir().unwrap_or_else(|| { +pub fn resolve_dirs() -> Dirs { + let tauri = TAURI_DIR.get_or_init(|| resolve_tauri_dir().unwrap_or_else(|| { let env_var_name = env_tauri_app_path().is_some().then(|| format!("`{ENV_TAURI_APP_PATH}`")); panic!("Couldn't recognize the {} folder as a Tauri project. It must contain a `{}`, `{}` or `{}` file in any subfolder.", env_var_name.as_deref().unwrap_or("current"), @@ -131,16 +136,11 @@ pub fn resolve() { ConfigFormat::Json5.into_file_name(), ConfigFormat::Toml.into_file_name() ) - })).expect("tauri dir already resolved"); - FRONTEND_DIR - .set(resolve_frontend_dir().unwrap_or_else(|| tauri_dir().parent().unwrap().to_path_buf())) - .expect("app dir already resolved"); -} - -pub fn tauri_dir() -> &'static PathBuf { - TAURI_DIR - .get() - .expect("app paths not initialized, this is a Tauri CLI bug") + })); + let frontend = FRONTEND_DIR.get_or_init(|| { + resolve_frontend_dir().unwrap_or_else(|| tauri.parent().unwrap().to_path_buf()) + }); + Dirs { tauri, frontend } } pub fn resolve_frontend_dir() -> Option { @@ -165,9 +165,3 @@ pub fn resolve_frontend_dir() -> Option { }) .map(|p| p.parent().unwrap().to_path_buf()) } - -pub fn frontend_dir() -> &'static PathBuf { - FRONTEND_DIR - .get() - .expect("app paths not initialized, this is a Tauri CLI bug") -} diff --git a/crates/tauri-cli/src/helpers/cargo_manifest.rs b/crates/tauri-cli/src/helpers/cargo_manifest.rs index 0ccf71790..b1bfa9a10 100644 --- a/crates/tauri-cli/src/helpers/cargo_manifest.rs +++ b/crates/tauri-cli/src/helpers/cargo_manifest.rs @@ -56,7 +56,7 @@ pub fn cargo_manifest_and_lock(tauri_dir: &Path) -> (Option, Opti .ok() .and_then(|manifest_contents| toml::from_str(&manifest_contents).ok()); - let lock: Option = get_workspace_dir() + let lock: Option = get_workspace_dir(tauri_dir) .ok() .and_then(|p| fs::read_to_string(p.join("Cargo.lock")).ok()) .and_then(|s| toml::from_str(&s).ok()); diff --git a/crates/tauri-cli/src/helpers/config.rs b/crates/tauri-cli/src/helpers/config.rs index eb2a643de..d819867bd 100644 --- a/crates/tauri-cli/src/helpers/config.rs +++ b/crates/tauri-cli/src/helpers/config.rs @@ -13,8 +13,9 @@ use std::{ collections::HashMap, env::{current_dir, set_current_dir, set_var}, ffi::{OsStr, OsString}, + path::Path, process::exit, - sync::{Mutex, OnceLock}, + sync::OnceLock, }; use crate::error::Context; @@ -66,14 +67,11 @@ impl ConfigMetadata { } } -pub type ConfigHandle = &'static Mutex>; - pub fn wix_settings(config: WixConfig) -> tauri_bundler::WixSettings { tauri_bundler::WixSettings { version: config.version, upgrade_code: config.upgrade_code, - fips_compliant: std::env::var("TAURI_BUNDLER_WIX_FIPS_COMPLIANT") - .ok() + fips_compliant: std::env::var_os("TAURI_BUNDLER_WIX_FIPS_COMPLIANT") .map(|v| v == "true") .unwrap_or(config.fips_compliant), language: tauri_bundler::WixLanguage(match config.language { @@ -141,11 +139,6 @@ pub fn custom_sign_settings( } } -fn config_handle() -> ConfigHandle { - static CONFIG_HANDLE: Mutex> = Mutex::new(None); - &CONFIG_HANDLE -} - fn config_schema_validator() -> &'static jsonschema::Validator { // TODO: Switch to `LazyLock` when we bump MSRV to above 1.80 static CONFIG_SCHEMA_VALIDATOR: OnceLock = OnceLock::new(); @@ -156,17 +149,12 @@ fn config_schema_validator() -> &'static jsonschema::Validator { }) } -/// Gets the static parsed config from `tauri.conf.json`. -fn get_internal( +fn load_config( merge_configs: &[&serde_json::Value], reload: bool, target: Target, -) -> crate::Result { - if !reload && config_handle().lock().unwrap().is_some() { - return Ok(config_handle()); - } - - let tauri_dir = super::app_paths::tauri_dir(); + tauri_dir: &Path, +) -> crate::Result { let (mut config, config_path) = tauri_utils::config::parse::parse_value(target, tauri_dir.join("tauri.conf.json")) .context("failed to parse config")?; @@ -240,59 +228,54 @@ fn get_internal( std::env::set_var(REMOVE_UNUSED_COMMANDS_ENV_VAR, tauri_dir); } - *config_handle().lock().unwrap() = Some(ConfigMetadata { + Ok(ConfigMetadata { target, original_identifier, inner: config, extensions, - }); - - Ok(config_handle()) + }) } -pub fn get(target: Target, merge_configs: &[&serde_json::Value]) -> crate::Result { - get_internal(merge_configs, false, target) +pub fn get_config( + target: Target, + merge_configs: &[&serde_json::Value], + tauri_dir: &Path, +) -> crate::Result { + load_config(merge_configs, false, target, tauri_dir) } -pub fn reload(merge_configs: &[&serde_json::Value]) -> crate::Result { - let target = config_handle() - .lock() - .unwrap() - .as_ref() - .map(|conf| conf.target); - if let Some(target) = target { - get_internal(merge_configs, true, target) - } else { - crate::error::bail!("config not loaded"); - } +pub fn reload_config( + config: &mut ConfigMetadata, + merge_configs: &[&serde_json::Value], + tauri_dir: &Path, +) -> crate::Result<()> { + let target = config.target; + *config = load_config(merge_configs, true, target, tauri_dir)?; + Ok(()) } /// merges the loaded config with the given value -pub fn merge_with(merge_configs: &[&serde_json::Value]) -> crate::Result { - let handle = config_handle(); - +pub fn merge_config_with( + config: &mut ConfigMetadata, + merge_configs: &[&serde_json::Value], +) -> crate::Result<()> { if merge_configs.is_empty() { - return Ok(handle); + return Ok(()); } - if let Some(config_metadata) = &mut *handle.lock().unwrap() { - let mut merge_config = serde_json::Value::Object(Default::default()); - for conf in merge_configs { - merge_patches(&mut merge_config, conf); - } - - let merge_config_str = serde_json::to_string(&merge_config).unwrap(); - set_var("TAURI_CONFIG", merge_config_str); - - let mut value = - serde_json::to_value(config_metadata.inner.clone()).context("failed to serialize config")?; - merge(&mut value, &merge_config); - config_metadata.inner = serde_json::from_value(value).context("failed to parse config")?; - - Ok(handle) - } else { - crate::error::bail!("config not loaded"); + let mut merge_config = serde_json::Value::Object(Default::default()); + for conf in merge_configs { + merge_patches(&mut merge_config, conf); } + + let merge_config_str = serde_json::to_string(&merge_config).unwrap(); + set_var("TAURI_CONFIG", merge_config_str); + + let mut value = + serde_json::to_value(config.inner.clone()).context("failed to serialize config")?; + merge(&mut value, &merge_config); + config.inner = serde_json::from_value(value).context("failed to parse config")?; + Ok(()) } /// Same as [`json_patch::merge`] but doesn't delete the key when the patch's value is `null` diff --git a/crates/tauri-cli/src/helpers/mod.rs b/crates/tauri-cli/src/helpers/mod.rs index 06ff052ce..3d2a5f0e9 100644 --- a/crates/tauri-cli/src/helpers/mod.rs +++ b/crates/tauri-cli/src/helpers/mod.rs @@ -35,8 +35,6 @@ use crate::{ CommandExt, }; -use self::app_paths::frontend_dir; - pub fn command_env(debug: bool) -> HashMap<&'static str, String> { let mut map = HashMap::new(); @@ -78,13 +76,14 @@ pub fn run_hook( hook: HookCommand, interface: &AppInterface, debug: bool, + frontend_dir: &Path, ) -> crate::Result<()> { let (script, script_cwd) = match hook { HookCommand::Script(s) if s.is_empty() => (None, None), HookCommand::Script(s) => (Some(s), None), HookCommand::ScriptWithOptions { script, cwd } => (Some(script), cwd.map(Into::into)), }; - let cwd = script_cwd.unwrap_or_else(|| frontend_dir().clone()); + let cwd = script_cwd.unwrap_or_else(|| frontend_dir.to_owned()); if let Some(script) = script { log::info!(action = "Running"; "{} `{}`", name, script); diff --git a/crates/tauri-cli/src/icon.rs b/crates/tauri-cli/src/icon.rs index 6228dc97b..4945fb826 100644 --- a/crates/tauri-cli/src/icon.rs +++ b/crates/tauri-cli/src/icon.rs @@ -4,7 +4,6 @@ use crate::{ error::{Context, Error, ErrorExt}, - helpers::app_paths::tauri_dir, Result, }; @@ -237,8 +236,8 @@ fn parse_bg_color(bg_color_string: &String) -> Result> { pub fn command(options: Options) -> Result<()> { let input = options.input; let out_dir = options.output.unwrap_or_else(|| { - crate::helpers::app_paths::resolve(); - tauri_dir().join("icons") + let dirs = crate::helpers::app_paths::resolve_dirs(); + dirs.tauri.join("icons") }); let png_icon_sizes = options.png.unwrap_or_default(); diff --git a/crates/tauri-cli/src/info/app.rs b/crates/tauri-cli/src/info/app.rs index 624d79bd3..6814c96bd 100644 --- a/crates/tauri-cli/src/info/app.rs +++ b/crates/tauri-cli/src/info/app.rs @@ -3,56 +3,46 @@ // SPDX-License-Identifier: MIT use super::SectionItem; +use crate::helpers::config::ConfigMetadata; use crate::helpers::framework; -use std::{ - fs::read_to_string, - path::{Path, PathBuf}, -}; -use tauri_utils::platform::Target; +use std::{fs::read_to_string, path::PathBuf}; -pub fn items(frontend_dir: Option<&PathBuf>, tauri_dir: Option<&Path>) -> Vec { +pub fn items(config: &ConfigMetadata, frontend_dir: Option<&PathBuf>) -> Vec { let mut items = Vec::new(); - if tauri_dir.is_some() { - if let Ok(config) = crate::helpers::config::get(Target::current(), &[]) { - let config_guard = config.lock().unwrap(); - let config = config_guard.as_ref().unwrap(); + let bundle_or_build = if config.bundle.active { + "bundle" + } else { + "build" + }; + items.push(SectionItem::new().description(format!("build-type: {bundle_or_build}"))); - let bundle_or_build = if config.bundle.active { - "bundle" - } else { - "build" - }; - items.push(SectionItem::new().description(format!("build-type: {bundle_or_build}"))); + let csp = config + .app + .security + .csp + .clone() + .map(|c| c.to_string()) + .unwrap_or_else(|| "unset".to_string()); + items.push(SectionItem::new().description(format!("CSP: {csp}"))); - let csp = config - .app - .security - .csp - .clone() - .map(|c| c.to_string()) - .unwrap_or_else(|| "unset".to_string()); - items.push(SectionItem::new().description(format!("CSP: {csp}"))); + if let Some(frontend_dist) = &config.build.frontend_dist { + items.push(SectionItem::new().description(format!("frontendDist: {frontend_dist}"))); + } - if let Some(frontend_dist) = &config.build.frontend_dist { - items.push(SectionItem::new().description(format!("frontendDist: {frontend_dist}"))); + if let Some(dev_url) = &config.build.dev_url { + items.push(SectionItem::new().description(format!("devUrl: {dev_url}"))); + } + + if let Some(frontend_dir) = frontend_dir { + if let Ok(package_json) = read_to_string(frontend_dir.join("package.json")) { + let (framework, bundler) = framework::infer_from_package_json(&package_json); + + if let Some(framework) = framework { + items.push(SectionItem::new().description(format!("framework: {framework}"))); } - if let Some(dev_url) = &config.build.dev_url { - items.push(SectionItem::new().description(format!("devUrl: {dev_url}"))); - } - - if let Some(frontend_dir) = frontend_dir { - if let Ok(package_json) = read_to_string(frontend_dir.join("package.json")) { - let (framework, bundler) = framework::infer_from_package_json(&package_json); - - if let Some(framework) = framework { - items.push(SectionItem::new().description(format!("framework: {framework}"))); - } - - if let Some(bundler) = bundler { - items.push(SectionItem::new().description(format!("bundler: {bundler}"))); - } - } + if let Some(bundler) = bundler { + items.push(SectionItem::new().description(format!("bundler: {bundler}"))); } } } diff --git a/crates/tauri-cli/src/info/mod.rs b/crates/tauri-cli/src/info/mod.rs index 0f89d31c1..cb52415a9 100644 --- a/crates/tauri-cli/src/info/mod.rs +++ b/crates/tauri-cli/src/info/mod.rs @@ -12,6 +12,7 @@ use colored::{ColoredString, Colorize}; use dialoguer::{theme::ColorfulTheme, Confirm}; use serde::Deserialize; use std::fmt::{self, Display, Formatter}; +use tauri_utils::platform::Target; mod app; mod env_nodejs; @@ -265,11 +266,6 @@ pub fn command(options: Options) -> Result<()> { let frontend_dir = resolve_frontend_dir(); let tauri_dir = resolve_tauri_dir(); - if tauri_dir.is_some() { - // safe to initialize - crate::helpers::app_paths::resolve(); - } - let package_manager = frontend_dir .as_ref() .map(packages_nodejs::package_manager) @@ -313,9 +309,11 @@ pub fn command(options: Options) -> Result<()> { interactive, items: Vec::new(), }; - app - .items - .extend(app::items(frontend_dir.as_ref(), tauri_dir.as_deref())); + if let Some(tauri_dir) = &tauri_dir { + if let Ok(config) = crate::helpers::config::get_config(Target::current(), &[], tauri_dir) { + app.items.extend(app::items(&config, frontend_dir.as_ref())); + }; + } environment.display(); diff --git a/crates/tauri-cli/src/info/plugins.rs b/crates/tauri-cli/src/info/plugins.rs index a5080caf1..d0ede6b25 100644 --- a/crates/tauri-cli/src/info/plugins.rs +++ b/crates/tauri-cli/src/info/plugins.rs @@ -111,33 +111,27 @@ pub fn items( ) -> Vec { let mut items = Vec::new(); - if tauri_dir.is_some() || frontend_dir.is_some() { - if let Some(tauri_dir) = tauri_dir { - let (manifest, lock) = cargo_manifest_and_lock(tauri_dir); + if let Some(tauri_dir) = tauri_dir { + let (manifest, lock) = cargo_manifest_and_lock(tauri_dir); - for p in helpers::plugins::known_plugins().keys() { - let dep = format!("tauri-plugin-{p}"); - let crate_version = crate_version(tauri_dir, manifest.as_ref(), lock.as_ref(), &dep); - if !crate_version.has_version() { - continue; - } - let item = packages_rust::rust_section_item(&dep, crate_version); - items.push(item); - - let Some(frontend_dir) = frontend_dir else { - continue; - }; - - let package = format!("@tauri-apps/plugin-{p}"); - - let item = packages_nodejs::nodejs_section_item( - package, - None, - frontend_dir.clone(), - package_manager, - ); - items.push(item); + for p in helpers::plugins::known_plugins().keys() { + let dep = format!("tauri-plugin-{p}"); + let crate_version = crate_version(tauri_dir, manifest.as_ref(), lock.as_ref(), &dep); + if !crate_version.has_version() { + continue; } + let item = packages_rust::rust_section_item(&dep, crate_version); + items.push(item); + + let Some(frontend_dir) = frontend_dir else { + continue; + }; + + let package = format!("@tauri-apps/plugin-{p}"); + + let item = + packages_nodejs::nodejs_section_item(package, None, frontend_dir.clone(), package_manager); + items.push(item); } } diff --git a/crates/tauri-cli/src/inspect.rs b/crates/tauri-cli/src/inspect.rs index 68d040ed2..a2bb3bfa1 100644 --- a/crates/tauri-cli/src/inspect.rs +++ b/crates/tauri-cli/src/inspect.rs @@ -1,6 +1,7 @@ // Copyright 2019-2024 Tauri Programme within The Commons Conservancy // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT +use std::path::Path; use crate::Result; use clap::{Parser, Subcommand}; @@ -21,19 +22,18 @@ enum Commands { } pub fn command(cli: Cli) -> Result<()> { + let dirs = crate::helpers::app_paths::resolve_dirs(); match cli.command { - Commands::WixUpgradeCode => wix_upgrade_code(), + Commands::WixUpgradeCode => wix_upgrade_code(dirs.tauri), } } // NOTE: if this is ever changed, make sure to also update Wix upgrade code generation in tauri-bundler -fn wix_upgrade_code() -> Result<()> { - crate::helpers::app_paths::resolve(); - +fn wix_upgrade_code(tauri_dir: &Path) -> Result<()> { let target = tauri_utils::platform::Target::Windows; - let config = crate::helpers::config::get(target, &[])?; + let config = crate::helpers::config::get_config(target, &[], tauri_dir)?; - let interface = AppInterface::new(config.lock().unwrap().as_ref().unwrap(), None)?; + let interface = AppInterface::new(&config, None, tauri_dir)?; let product_name = interface.app_settings().get_package_settings().product_name; @@ -44,13 +44,13 @@ fn wix_upgrade_code() -> Result<()> { .to_string(); log::info!("Default WiX Upgrade Code, derived from {product_name}: {upgrade_code}"); - if let Some(code) = config.lock().unwrap().as_ref().and_then(|c| { - c.bundle - .windows - .wix - .as_ref() - .and_then(|wix| wix.upgrade_code) - }) { + if let Some(code) = config + .bundle + .windows + .wix + .as_ref() + .and_then(|wix| wix.upgrade_code) + { log::info!("Application Upgrade Code override: {code}"); } diff --git a/crates/tauri-cli/src/interface/mod.rs b/crates/tauri-cli/src/interface/mod.rs index b153b33bf..8b797091d 100644 --- a/crates/tauri-cli/src/interface/mod.rs +++ b/crates/tauri-cli/src/interface/mod.rs @@ -9,9 +9,13 @@ use std::{ path::{Path, PathBuf}, process::ExitStatus, sync::Arc, + sync::Mutex, }; -use crate::{error::Context, helpers::config::Config}; +use crate::{ + error::Context, helpers::app_paths::Dirs, helpers::config::Config, + helpers::config::ConfigMetadata, +}; use tauri_bundler::bundle::{PackageType, Settings, SettingsBuilder}; pub use rust::{MobileOptions, Options, Rust as AppInterface, WatcherOptions}; @@ -32,9 +36,14 @@ pub trait AppSettings { options: &Options, config: &Config, features: &[String], + tauri_dir: &Path, ) -> crate::Result; - fn app_binary_path(&self, options: &Options) -> crate::Result; - fn get_binaries(&self, options: &Options) -> crate::Result>; + fn app_binary_path(&self, options: &Options, tauri_dir: &Path) -> crate::Result; + fn get_binaries( + &self, + options: &Options, + tauri_dir: &Path, + ) -> crate::Result>; fn app_name(&self) -> Option; fn lib_name(&self) -> Option; @@ -44,6 +53,7 @@ pub trait AppSettings { config: &Config, out_dir: &Path, package_types: Vec, + tauri_dir: &Path, ) -> crate::Result { let no_default_features = options.args.contains(&"--no-default-features".into()); let mut enabled_features = options.features.clone(); @@ -57,7 +67,7 @@ pub trait AppSettings { tauri_utils::platform::target_triple().context("failed to get target triple")? }; - let mut bins = self.get_binaries(&options)?; + let mut bins = self.get_binaries(&options, tauri_dir)?; if let Some(main_binary_name) = &config.main_binary_name { let main = bins.iter_mut().find(|b| b.main()).context("no main bin?")?; main.set_name(main_binary_name.to_owned()); @@ -65,7 +75,7 @@ pub trait AppSettings { let mut settings_builder = SettingsBuilder::new() .package_settings(self.get_package_settings()) - .bundle_settings(self.get_bundle_settings(&options, config, &enabled_features)?) + .bundle_settings(self.get_bundle_settings(&options, config, &enabled_features, tauri_dir)?) .binaries(bins) .project_out_directory(out_dir) .target(target) @@ -73,7 +83,7 @@ pub trait AppSettings { if config.bundle.use_local_tools_dir { settings_builder = settings_builder.local_tools_directory( - rust::get_cargo_metadata() + rust::get_cargo_metadata(tauri_dir) .context("failed to get cargo metadata")? .target_directory, ) @@ -99,23 +109,29 @@ pub enum ExitReason { pub trait Interface: Sized { type AppSettings: AppSettings; - fn new(config: &Config, target: Option) -> crate::Result; + fn new(config: &Config, target: Option, tauri_dir: &Path) -> crate::Result; fn app_settings(&self) -> Arc; fn env(&self) -> HashMap<&str, String>; - fn build(&mut self, options: Options) -> crate::Result; + fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Result; fn dev, ExitReason) + Send + Sync + 'static>( &mut self, + config: &Mutex, options: Options, on_exit: F, + dirs: &Dirs, ) -> crate::Result<()>; fn mobile_dev crate::Result>>( &mut self, + config: &Mutex, options: MobileOptions, runner: R, + dirs: &Dirs, ) -> crate::Result<()>; fn watch crate::Result>>( &mut self, + config: &Mutex, options: WatcherOptions, runner: R, + dirs: &Dirs, ) -> crate::Result<()>; } diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 6f303c732..a9a42363a 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -31,8 +31,8 @@ use super::{AppSettings, DevProcess, ExitReason, Interface}; use crate::{ error::{Context, Error, ErrorExt}, helpers::{ - app_paths::{frontend_dir, tauri_dir}, - config::{nsis_settings, reload as reload_config, wix_settings, BundleResources, Config}, + app_paths::Dirs, + config::{nsis_settings, reload_config, wix_settings, BundleResources, Config, ConfigMetadata}, }, ConfigValue, }; @@ -137,7 +137,7 @@ pub struct Rust { impl Interface for Rust { type AppSettings = RustAppSettings; - fn new(config: &Config, target: Option) -> crate::Result { + fn new(config: &Config, target: Option, tauri_dir: &Path) -> crate::Result { let manifest = { let (tx, rx) = sync_channel(1); let mut watcher = new_debouncer(Duration::from_secs(1), None, move |r| { @@ -147,14 +147,9 @@ impl Interface for Rust { }) .unwrap(); watcher - .watch(tauri_dir().join("Cargo.toml"), RecursiveMode::NonRecursive) - .with_context(|| { - format!( - "failed to watch {}", - tauri_dir().join("Cargo.toml").display() - ) - })?; - let (manifest, modified) = rewrite_manifest(config)?; + .watch(tauri_dir.join("Cargo.toml"), RecursiveMode::NonRecursive) + .with_context(|| format!("failed to watch {}", tauri_dir.join("Cargo.toml").display()))?; + let (manifest, modified) = rewrite_manifest(config, tauri_dir)?; if modified { // Wait for the modified event so we don't trigger a re-build later on let _ = rx.recv_timeout(Duration::from_secs(2)); @@ -172,7 +167,7 @@ impl Interface for Rust { ); } - let app_settings = RustAppSettings::new(config, manifest, target)?; + let app_settings = RustAppSettings::new(config, manifest, target, tauri_dir)?; Ok(Self { app_settings: Arc::new(app_settings), @@ -186,20 +181,23 @@ impl Interface for Rust { self.app_settings.clone() } - fn build(&mut self, options: Options) -> crate::Result { + fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Result { desktop::build( options, &self.app_settings, &mut self.available_targets, self.config_features.clone(), self.main_binary_name.as_deref(), + dirs.tauri, ) } fn dev, ExitReason) + Send + Sync + 'static>( &mut self, + config: &Mutex, mut options: Options, on_exit: F, + dirs: &Dirs, ) -> crate::Result<()> { let on_exit = Arc::new(on_exit); @@ -229,14 +227,22 @@ impl Interface for Rust { on_exit(status, reason) }) }); - self.run_dev_watcher(&options.additional_watch_folders, &merge_configs, run) + self.run_dev_watcher( + config, + &options.additional_watch_folders, + &merge_configs, + run, + dirs, + ) } } fn mobile_dev crate::Result>>( &mut self, + config: &Mutex, mut options: MobileOptions, runner: R, + dirs: &Dirs, ) -> crate::Result<()> { let mut run_args = Vec::new(); dev_options( @@ -252,23 +258,33 @@ impl Interface for Rust { Ok(()) } else { self.watch( + config, WatcherOptions { config: options.config.clone(), additional_watch_folders: options.additional_watch_folders.clone(), }, move || runner(options.clone()), + dirs, ) } } fn watch crate::Result>>( &mut self, + config: &Mutex, options: WatcherOptions, runner: R, + dirs: &Dirs, ) -> crate::Result<()> { let merge_configs = options.config.iter().map(|c| &c.0).collect::>(); let run = Arc::new(|_rust: &mut Rust| runner()); - self.run_dev_watcher(&options.additional_watch_folders, &merge_configs, run) + self.run_dev_watcher( + config, + &options.additional_watch_folders, + &merge_configs, + run, + dirs, + ) } fn env(&self) -> HashMap<&str, String> { @@ -443,19 +459,21 @@ fn expand_member_path(path: &Path) -> crate::Result> { Ok(res) } -fn get_watch_folders(additional_watch_folders: &[PathBuf]) -> crate::Result> { - let tauri_path = tauri_dir(); - let workspace_path = get_workspace_dir()?; +fn get_watch_folders( + additional_watch_folders: &[PathBuf], + tauri_dir: &Path, +) -> crate::Result> { + let workspace_path = get_workspace_dir(tauri_dir)?; // We always want to watch the main tauri folder. - let mut watch_folders = vec![tauri_path.to_path_buf()]; + let mut watch_folders = vec![tauri_dir.to_path_buf()]; // Add the additional watch folders, resolving the path from the tauri path if it is relative watch_folders.extend(additional_watch_folders.iter().filter_map(|dir| { let path = if dir.is_absolute() { dir.to_owned() } else { - tauri_path.join(dir) + tauri_dir.join(dir) }; let canonicalized = canonicalize(&path).ok(); @@ -523,17 +541,18 @@ impl Rust { fn run_dev_watcher crate::Result>>( &mut self, + config: &Mutex, additional_watch_folders: &[PathBuf], merge_configs: &[&serde_json::Value], run: Arc, + dirs: &Dirs, ) -> crate::Result<()> { let child = run(self)?; let process = Arc::new(Mutex::new(child)); let (tx, rx) = sync_channel(1); - let frontend_path = frontend_dir(); - let watch_folders = get_watch_folders(additional_watch_folders)?; + let watch_folders = get_watch_folders(additional_watch_folders, dirs.tauri)?; let common_ancestor = common_path::common_path_all(watch_folders.iter().map(Path::new)) .expect("watch_folders should not be empty"); @@ -573,22 +592,21 @@ impl Rust { if let Some(event_path) = event.paths.first() { if !ignore_matcher.is_ignore(event_path, event_path.is_dir()) { - if is_configuration_file(self.app_settings.target_platform, event_path) { - if let Ok(config) = reload_config(merge_configs) { - let (manifest, modified) = - rewrite_manifest(config.lock().unwrap().as_ref().unwrap())?; - if modified { - *self.app_settings.manifest.lock().unwrap() = manifest; - // no need to run the watcher logic, the manifest was modified - // and it will trigger the watcher again - continue; - } + if is_configuration_file(self.app_settings.target_platform, event_path) + && reload_config(&mut config.lock().unwrap(), merge_configs, dirs.tauri).is_ok() + { + let (manifest, modified) = rewrite_manifest(&config.lock().unwrap(), dirs.tauri)?; + if modified { + *self.app_settings.manifest.lock().unwrap() = manifest; + // no need to run the watcher logic, the manifest was modified + // and it will trigger the watcher again + continue; } } log::info!( "File {} changed. Rebuilding application...", - display_path(event_path.strip_prefix(frontend_path).unwrap_or(event_path)) + display_path(event_path.strip_prefix(dirs.frontend).unwrap_or(event_path)) ); let mut p = process.lock().unwrap(); @@ -837,6 +855,7 @@ impl AppSettings for RustAppSettings { options: &Options, config: &Config, features: &[String], + tauri_dir: &Path, ) -> crate::Result { let arch64bits = self.target_triple.starts_with("x86_64") || self.target_triple.starts_with("aarch64") @@ -867,6 +886,7 @@ impl AppSettings for RustAppSettings { self, features, config, + tauri_dir, config.bundle.clone(), updater_settings, arch64bits, @@ -911,8 +931,8 @@ impl AppSettings for RustAppSettings { Ok(settings) } - fn app_binary_path(&self, options: &Options) -> crate::Result { - let binaries = self.get_binaries(options)?; + fn app_binary_path(&self, options: &Options, tauri_dir: &Path) -> crate::Result { + let binaries = self.get_binaries(options, tauri_dir)?; let bin_name = binaries .iter() .find(|x| x.main()) @@ -920,7 +940,7 @@ impl AppSettings for RustAppSettings { .name(); let out_dir = self - .out_dir(options) + .out_dir(options, tauri_dir) .context("failed to get project out directory")?; let mut path = out_dir.join(bin_name); @@ -938,7 +958,7 @@ impl AppSettings for RustAppSettings { Ok(path) } - fn get_binaries(&self, options: &Options) -> crate::Result> { + fn get_binaries(&self, options: &Options, tauri_dir: &Path) -> crate::Result> { let mut binaries = Vec::new(); if let Some(bins) = &self.cargo_settings.bin { @@ -967,8 +987,6 @@ impl AppSettings for RustAppSettings { } } - let tauri_dir = tauri_dir(); - let mut binaries_paths = std::fs::read_dir(tauri_dir.join("src/bin")) .map(|dir| { dir @@ -1060,8 +1078,12 @@ impl AppSettings for RustAppSettings { } impl RustAppSettings { - pub fn new(config: &Config, manifest: Manifest, target: Option) -> crate::Result { - let tauri_dir = tauri_dir(); + pub fn new( + config: &Config, + manifest: Manifest, + target: Option, + tauri_dir: &Path, + ) -> crate::Result { let cargo_settings = CargoSettings::load(tauri_dir).context("failed to load Cargo settings")?; let cargo_package_settings = match &cargo_settings.package { Some(package_info) => package_info.clone(), @@ -1072,7 +1094,7 @@ impl RustAppSettings { } }; - let ws_package_settings = CargoSettings::load(&get_workspace_dir()?) + let ws_package_settings = CargoSettings::load(&get_workspace_dir(tauri_dir)?) .context("failed to load Cargo settings from workspace root")? .workspace .and_then(|v| v.package); @@ -1177,8 +1199,8 @@ impl RustAppSettings { .or_else(|| self.cargo_config.build().target()) } - pub fn out_dir(&self, options: &Options) -> crate::Result { - get_target_dir(self.target(options), options) + pub fn out_dir(&self, options: &Options, tauri_dir: &Path) -> crate::Result { + get_target_dir(self.target(options), options, tauri_dir) } } @@ -1188,10 +1210,10 @@ pub(crate) struct CargoMetadata { pub(crate) workspace_root: PathBuf, } -pub(crate) fn get_cargo_metadata() -> crate::Result { +pub(crate) fn get_cargo_metadata(tauri_dir: &Path) -> crate::Result { let output = Command::new("cargo") .args(["metadata", "--no-deps", "--format-version", "1"]) - .current_dir(tauri_dir()) + .current_dir(tauri_dir) .output() .map_err(|error| Error::CommandFailed { command: "cargo metadata --no-deps --format-version 1".to_string(), @@ -1211,13 +1233,13 @@ pub(crate) fn get_cargo_metadata() -> crate::Result { /// Get the cargo target directory based on the provided arguments. /// If "--target-dir" is specified in args, use it as the target directory (relative to current directory). /// Otherwise, use the target directory from cargo metadata. -pub(crate) fn get_cargo_target_dir(args: &[String]) -> crate::Result { +pub(crate) fn get_cargo_target_dir(args: &[String], tauri_dir: &Path) -> crate::Result { let path = if let Some(target) = get_cargo_option(args, "--target-dir") { std::env::current_dir() .context("failed to get current directory")? .join(target) } else { - get_cargo_metadata() + get_cargo_metadata(tauri_dir) .context("failed to run 'cargo metadata' command to get target directory")? .target_directory }; @@ -1227,8 +1249,12 @@ pub(crate) fn get_cargo_target_dir(args: &[String]) -> crate::Result { /// This function determines the 'target' directory and suffixes it with the profile /// to determine where the compiled binary will be located. -fn get_target_dir(triple: Option<&str>, options: &Options) -> crate::Result { - let mut path = get_cargo_target_dir(&options.args)?; +fn get_target_dir( + triple: Option<&str>, + options: &Options, + tauri_dir: &Path, +) -> crate::Result { + let mut path = get_cargo_target_dir(&options.args, tauri_dir)?; if let Some(triple) = triple { path.push(triple); @@ -1253,9 +1279,9 @@ fn get_cargo_option<'a>(args: &'a [String], option: &'a str) -> Option<&'a str> } /// Executes `cargo metadata` to get the workspace directory. -pub fn get_workspace_dir() -> crate::Result { +pub fn get_workspace_dir(tauri_dir: &Path) -> crate::Result { Ok( - get_cargo_metadata() + get_cargo_metadata(tauri_dir) .context("failed to run 'cargo metadata' command to get workspace directory")? .workspace_root, ) @@ -1281,6 +1307,7 @@ fn tauri_config_to_bundle_settings( settings: &RustAppSettings, features: &[String], tauri_config: &Config, + tauri_dir: &Path, config: crate::helpers::config::BundleConfig, updater_config: Option, arch64bits: bool, @@ -1562,7 +1589,7 @@ fn tauri_config_to_bundle_settings( info_plist: { let mut src_plists = vec![]; - let path = tauri_dir().join("Info.plist"); + let path = tauri_dir.join("Info.plist"); if path.exists() { src_plists.push(path.into()); } @@ -1604,7 +1631,7 @@ fn tauri_config_to_bundle_settings( .unwrap() }) }), - license_file: config.license_file.map(|l| tauri_dir().join(l)), + license_file: config.license_file.map(|l| tauri_dir.join(l)), updater: updater_config, ..Default::default() }) @@ -1741,7 +1768,7 @@ mod tests { #[test] fn parse_target_dir_from_opts() { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); let current_dir = std::env::current_dir().unwrap(); let options = Options { @@ -1758,11 +1785,11 @@ mod tests { }; assert_eq!( - get_target_dir(None, &options).unwrap(), + get_target_dir(None, &options, dirs.tauri).unwrap(), current_dir.join("path/to/some/dir/release") ); assert_eq!( - get_target_dir(Some("x86_64-pc-windows-msvc"), &options).unwrap(), + get_target_dir(Some("x86_64-pc-windows-msvc"), &options, dirs.tauri).unwrap(), current_dir .join("path/to/some/dir") .join("x86_64-pc-windows-msvc") @@ -1781,23 +1808,27 @@ mod tests { }; #[cfg(windows)] - assert!(get_target_dir(Some("x86_64-pc-windows-msvc"), &options) - .unwrap() - .ends_with("x86_64-pc-windows-msvc\\release")); + assert!( + get_target_dir(Some("x86_64-pc-windows-msvc"), &options, dirs.tauri) + .unwrap() + .ends_with("x86_64-pc-windows-msvc\\release") + ); #[cfg(not(windows))] - assert!(get_target_dir(Some("x86_64-pc-windows-msvc"), &options) - .unwrap() - .ends_with("x86_64-pc-windows-msvc/release")); + assert!( + get_target_dir(Some("x86_64-pc-windows-msvc"), &options, dirs.tauri) + .unwrap() + .ends_with("x86_64-pc-windows-msvc/release") + ); #[cfg(windows)] { std::env::set_var("CARGO_TARGET_DIR", "D:\\path\\to\\env\\dir"); assert_eq!( - get_target_dir(None, &options).unwrap(), + get_target_dir(None, &options, dirs.tauri).unwrap(), PathBuf::from("D:\\path\\to\\env\\dir\\release") ); assert_eq!( - get_target_dir(Some("x86_64-pc-windows-msvc"), &options).unwrap(), + get_target_dir(Some("x86_64-pc-windows-msvc"), &options, dirs.tauri).unwrap(), PathBuf::from("D:\\path\\to\\env\\dir\\x86_64-pc-windows-msvc\\release") ); } @@ -1806,11 +1837,11 @@ mod tests { { std::env::set_var("CARGO_TARGET_DIR", "/path/to/env/dir"); assert_eq!( - get_target_dir(None, &options).unwrap(), + get_target_dir(None, &options, dirs.tauri).unwrap(), PathBuf::from("/path/to/env/dir/release") ); assert_eq!( - get_target_dir(Some("x86_64-pc-windows-msvc"), &options).unwrap(), + get_target_dir(Some("x86_64-pc-windows-msvc"), &options, dirs.tauri).unwrap(), PathBuf::from("/path/to/env/dir/x86_64-pc-windows-msvc/release") ); } diff --git a/crates/tauri-cli/src/interface/rust/desktop.rs b/crates/tauri-cli/src/interface/rust/desktop.rs index b372dc015..15cd503e6 100644 --- a/crates/tauri-cli/src/interface/rust/desktop.rs +++ b/crates/tauri-cli/src/interface/rust/desktop.rs @@ -12,7 +12,7 @@ use shared_child::SharedChild; use std::{ fs, io::{BufReader, ErrorKind, Write}, - path::PathBuf, + path::{Path, PathBuf}, process::{Command, ExitStatus, Stdio}, sync::{ atomic::{AtomicBool, Ordering}, @@ -158,9 +158,10 @@ pub fn build( available_targets: &mut Option>, config_features: Vec, main_binary_name: Option<&str>, + tauri_dir: &Path, ) -> crate::Result { - let out_dir = app_settings.out_dir(&options)?; - let bin_path = app_settings.app_binary_path(&options)?; + let out_dir = app_settings.out_dir(&options, tauri_dir)?; + let bin_path = app_settings.app_binary_path(&options, tauri_dir)?; if !std::env::var("STATIC_VCRUNTIME").is_ok_and(|v| v == "false") { std::env::set_var("STATIC_VCRUNTIME", "true"); @@ -182,7 +183,7 @@ pub fn build( options.target.replace(triple.into()); let triple_out_dir = app_settings - .out_dir(&options) + .out_dir(&options, tauri_dir) .with_context(|| format!("failed to get {triple} out dir"))?; build_production_app(options, available_targets, config_features.clone()) diff --git a/crates/tauri-cli/src/interface/rust/manifest.rs b/crates/tauri-cli/src/interface/rust/manifest.rs index 03e9768bd..58a5dd6c1 100644 --- a/crates/tauri-cli/src/interface/rust/manifest.rs +++ b/crates/tauri-cli/src/interface/rust/manifest.rs @@ -4,10 +4,7 @@ use crate::{ error::{Context, ErrorExt}, - helpers::{ - app_paths::tauri_dir, - config::{Config, PatternKind}, - }, + helpers::config::{Config, PatternKind}, }; use itertools::Itertools; @@ -272,8 +269,8 @@ fn inject_features( Ok(persist) } -pub fn rewrite_manifest(config: &Config) -> crate::Result<(Manifest, bool)> { - let manifest_path = tauri_dir().join("Cargo.toml"); +pub fn rewrite_manifest(config: &Config, tauri_dir: &Path) -> crate::Result<(Manifest, bool)> { + let manifest_path = tauri_dir.join("Cargo.toml"); let (mut manifest, original_manifest_str) = read_manifest(&manifest_path)?; let mut dependencies = Vec::new(); diff --git a/crates/tauri-cli/src/migrate/migrations/v1/mod.rs b/crates/tauri-cli/src/migrate/migrations/v1/mod.rs index 14a9cd7c4..6372db7b5 100644 --- a/crates/tauri-cli/src/migrate/migrations/v1/mod.rs +++ b/crates/tauri-cli/src/migrate/migrations/v1/mod.rs @@ -2,35 +2,31 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use crate::{ - error::Context, - helpers::app_paths::{frontend_dir, tauri_dir}, - Result, -}; +use crate::{error::Context, helpers::app_paths::Dirs, Result}; mod config; mod frontend; mod manifest; -pub fn run() -> Result<()> { - let tauri_dir = tauri_dir(); - let frontend_dir = frontend_dir(); - - let mut migrated = config::migrate(tauri_dir).context("Could not migrate config")?; - manifest::migrate(tauri_dir).context("Could not migrate manifest")?; - let plugins = frontend::migrate(frontend_dir)?; +pub fn run(dirs: &Dirs) -> Result<()> { + let mut migrated = config::migrate(dirs.tauri).context("Could not migrate config")?; + manifest::migrate(dirs.tauri).context("Could not migrate manifest")?; + let plugins = frontend::migrate(dirs.frontend)?; migrated.plugins.extend(plugins); // Add plugins for plugin in migrated.plugins { - crate::add::run(crate::add::Options { - plugin: plugin.clone(), - branch: None, - tag: None, - rev: None, - no_fmt: false, - }) + crate::add::run( + crate::add::Options { + plugin: plugin.clone(), + branch: None, + tag: None, + rev: None, + no_fmt: false, + }, + dirs, + ) .with_context(|| format!("Could not migrate plugin '{plugin}'"))?; } diff --git a/crates/tauri-cli/src/migrate/migrations/v2_beta.rs b/crates/tauri-cli/src/migrate/migrations/v2_beta.rs index aad493670..dcb6e52c2 100644 --- a/crates/tauri-cli/src/migrate/migrations/v2_beta.rs +++ b/crates/tauri-cli/src/migrate/migrations/v2_beta.rs @@ -4,10 +4,7 @@ use crate::{ error::{Context, ErrorExt}, - helpers::{ - app_paths::{frontend_dir, tauri_dir}, - npm::PackageManager, - }, + helpers::{app_paths::Dirs, npm::PackageManager}, interface::rust::manifest::{read_manifest, serialize_manifest}, Result, }; @@ -16,17 +13,14 @@ use std::{fs::read_to_string, path::Path}; use toml_edit::{DocumentMut, Item, Table, TableLike, Value}; -pub fn run() -> Result<()> { - let frontend_dir = frontend_dir(); - let tauri_dir = tauri_dir(); - - let manifest_path = tauri_dir.join("Cargo.toml"); +pub fn run(dirs: &Dirs) -> Result<()> { + let manifest_path = dirs.tauri.join("Cargo.toml"); let (mut manifest, _) = read_manifest(&manifest_path)?; migrate_manifest(&mut manifest)?; - migrate_permissions(tauri_dir)?; + migrate_permissions(dirs.tauri)?; - migrate_npm_dependencies(frontend_dir)?; + migrate_npm_dependencies(dirs.frontend)?; std::fs::write(&manifest_path, serialize_manifest(&manifest)) .fs_context("failed to rewrite Cargo manifest", &manifest_path)?; diff --git a/crates/tauri-cli/src/migrate/mod.rs b/crates/tauri-cli/src/migrate/mod.rs index 575a2516b..9a75089b0 100644 --- a/crates/tauri-cli/src/migrate/mod.rs +++ b/crates/tauri-cli/src/migrate/mod.rs @@ -4,10 +4,7 @@ use crate::{ error::{bail, Context, ErrorExt}, - helpers::{ - app_paths::tauri_dir, - cargo_manifest::{crate_version, CargoLock, CargoManifest}, - }, + helpers::cargo_manifest::{crate_version, CargoLock, CargoManifest}, interface::rust::get_workspace_dir, Result, }; @@ -17,22 +14,20 @@ use std::{fs::read_to_string, str::FromStr}; mod migrations; pub fn command() -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); - let tauri_dir = tauri_dir(); - - let manifest_contents = read_to_string(tauri_dir.join("Cargo.toml")).fs_context( + let manifest_contents = read_to_string(dirs.tauri.join("Cargo.toml")).fs_context( "failed to read Cargo manifest", - tauri_dir.join("Cargo.toml"), + dirs.tauri.join("Cargo.toml"), )?; let manifest = toml::from_str::(&manifest_contents).with_context(|| { format!( "failed to parse Cargo manifest {}", - tauri_dir.join("Cargo.toml").display() + dirs.tauri.join("Cargo.toml").display() ) })?; - let workspace_dir = get_workspace_dir()?; + let workspace_dir = get_workspace_dir(dirs.tauri)?; let lock_path = workspace_dir.join("Cargo.lock"); let lock = if lock_path.exists() { let lockfile_contents = @@ -44,19 +39,19 @@ pub fn command() -> Result<()> { None }; - let tauri_version = crate_version(tauri_dir, Some(&manifest), lock.as_ref(), "tauri") + let tauri_version = crate_version(dirs.tauri, Some(&manifest), lock.as_ref(), "tauri") .version .context("failed to get tauri version")?; let tauri_version = semver::Version::from_str(&tauri_version) .with_context(|| format!("failed to parse tauri version {tauri_version}"))?; if tauri_version.major == 1 { - migrations::v1::run().context("failed to migrate from v1")?; + migrations::v1::run(&dirs).context("failed to migrate from v1")?; } else if tauri_version.major == 2 { if let Some((pre, _number)) = tauri_version.pre.as_str().split_once('.') { match pre { "beta" => { - migrations::v2_beta::run().context("failed to migrate from v2 beta")?; + migrations::v2_beta::run(&dirs).context("failed to migrate from v2 beta")?; } "alpha" => { bail!( diff --git a/crates/tauri-cli/src/mobile/android/android_studio_script.rs b/crates/tauri-cli/src/mobile/android/android_studio_script.rs index 4657ac673..ce1d6ba8e 100644 --- a/crates/tauri-cli/src/mobile/android/android_studio_script.rs +++ b/crates/tauri-cli/src/mobile/android/android_studio_script.rs @@ -5,7 +5,7 @@ use super::{detect_target_ok, ensure_init, env, get_app, get_config, read_options, MobileTarget}; use crate::{ error::{Context, ErrorExt}, - helpers::config::{get as get_tauri_config, reload as reload_tauri_config}, + helpers::config::{get_config as get_tauri_config, reload_config as reload_tauri_config}, interface::{AppInterface, Interface}, mobile::CliOptions, Error, Result, @@ -38,7 +38,7 @@ pub struct Options { } pub fn command(options: Options) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); let profile = if options.release { Profile::Release @@ -46,40 +46,31 @@ pub fn command(options: Options) -> Result<()> { Profile::Debug }; - let (tauri_config, cli_options) = { - let tauri_config = get_tauri_config(tauri_utils::platform::Target::Android, &[])?; - let cli_options = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - read_options(tauri_config_) - }; + let mut tauri_config = get_tauri_config(tauri_utils::platform::Target::Android, &[], dirs.tauri)?; + let cli_options = read_options(&tauri_config); - let tauri_config = if cli_options.config.is_empty() { - tauri_config - } else { - // reload config with merges from the android dev|build script - reload_tauri_config( - &cli_options - .config - .iter() - .map(|conf| &conf.0) - .collect::>(), - )? - }; - - (tauri_config, cli_options) + if !cli_options.config.is_empty() { + // reload config with merges from the android dev|build script + reload_tauri_config( + &mut tauri_config, + &cli_options + .config + .iter() + .map(|conf| &conf.0) + .collect::>(), + dirs.tauri, + )? }; let (config, metadata) = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); let (config, metadata) = get_config( &get_app( MobileTarget::Android, - tauri_config_, - &AppInterface::new(tauri_config_, None)?, + &tauri_config, + &AppInterface::new(&tauri_config, None, dirs.tauri)?, + dirs.tauri, ), - tauri_config_, + &tauri_config, &[], &cli_options, ); @@ -95,7 +86,8 @@ pub fn command(options: Options) -> Result<()> { )?; if !cli_options.config.is_empty() { - crate::helpers::config::merge_with( + crate::helpers::config::merge_config_with( + &mut tauri_config, &cli_options .config .iter() @@ -107,16 +99,7 @@ pub fn command(options: Options) -> Result<()> { let env = env(std::env::var("CI").is_ok())?; if cli_options.dev { - let dev_url = tauri_config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .dev_url - .clone(); - - if let Some(url) = dev_url { + if let Some(url) = &tauri_config.build.dev_url { let localhost = match url.host() { Some(url::Host::Domain(d)) => d == "localhost", Some(url::Host::Ipv4(i)) => i == std::net::Ipv4Addr::LOCALHOST, diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index c91ba73c1..dee966a1f 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -10,8 +10,8 @@ use crate::{ build::Options as BuildOptions, error::Context, helpers::{ - app_paths::tauri_dir, - config::{get as get_tauri_config, ConfigHandle}, + app_paths::Dirs, + config::{get_config as get_tauri_config, ConfigMetadata}, flock, }, interface::{AppInterface, Interface, Options as InterfaceOptions}, @@ -27,6 +27,8 @@ use cargo_mobile2::{ }; use std::env::set_current_dir; +use std::path::Path; +use std::sync::Mutex; #[derive(Debug, Clone, Parser)] #[clap( @@ -116,8 +118,25 @@ pub struct BuiltApplication { } pub fn command(options: Options, noise_level: NoiseLevel) -> Result { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); + let tauri_config = Mutex::new(get_tauri_config( + tauri_utils::platform::Target::Android, + &options + .config + .iter() + .map(|conf| &conf.0) + .collect::>(), + dirs.tauri, + )?); + run(options, noise_level, &dirs, &tauri_config) +} +pub fn run( + options: Options, + noise_level: NoiseLevel, + dirs: &Dirs, + tauri_config: &Mutex, +) -> Result { delete_codegen_vars(); let mut build_options: BuildOptions = options.clone().into(); @@ -132,26 +151,16 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result>(), - )?; let (interface, config, metadata) = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - - let interface = AppInterface::new(tauri_config_, build_options.target.clone())?; + let interface = AppInterface::new(tauri_config, build_options.target.clone(), dirs.tauri)?; interface.build_options(&mut Vec::new(), &mut build_options.features, true); - let app = get_app(MobileTarget::Android, tauri_config_, &interface); + let app = get_app(MobileTarget::Android, tauri_config, &interface, dirs.tauri); let (config, metadata) = get_config( &app, - tauri_config_, + tauri_config, &build_options.features, &Default::default(), ); @@ -164,11 +173,10 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result Result Result Result { if !(options.apk.is_some() || options.aab.is_some()) { // if the user didn't specify the format to build, we'll do both @@ -257,7 +258,7 @@ fn run_build( }; let app_settings = interface.app_settings(); - let out_dir = app_settings.out_dir(&interface_options)?; + let out_dir = app_settings.out_dir(&interface_options, tauri_dir)?; let _lock = flock::open_rw(out_dir.join("lock").with_extension("android"), "Android")?; let cli_options = CliOptions { @@ -269,9 +270,9 @@ fn run_build( config: build_options.config, target_device: options.target_device.clone(), }; - let handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; + let handle = write_options(tauri_config, cli_options)?; - inject_resources(config, tauri_config.lock().unwrap().as_ref().unwrap())?; + inject_resources(config, tauri_config)?; let apk_outputs = if options.apk.unwrap_or_default() { apk::build( diff --git a/crates/tauri-cli/src/mobile/android/dev.rs b/crates/tauri-cli/src/mobile/android/dev.rs index 5dbaf8778..bb4624980 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -10,8 +10,8 @@ use crate::{ dev::Options as DevOptions, error::{Context, ErrorExt}, helpers::{ - app_paths::tauri_dir, - config::{get as get_tauri_config, ConfigHandle}, + app_paths::Dirs, + config::{get_config as get_tauri_config, ConfigMetadata}, flock, }, interface::{AppInterface, Interface, MobileOptions, Options as InterfaceOptions}, @@ -35,6 +35,7 @@ use cargo_mobile2::{ }; use url::Host; +use std::sync::Mutex; use std::{env::set_current_dir, net::Ipv4Addr, path::PathBuf}; #[derive(Debug, Clone, Parser)] @@ -131,16 +132,16 @@ impl From for DevOptions { } pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); - let result = run_command(options, noise_level); + let result = run_command(options, noise_level, dirs); if result.is_err() { crate::dev::kill_before_dev_process(); } result } -fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { +fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) -> Result<()> { delete_codegen_vars(); // setup env additions before calling env() if let Some(root_certificate_path) = &options.root_certificate_path { @@ -160,6 +161,7 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { .iter() .map(|conf| &conf.0) .collect::>(), + dirs.tauri, )?; let env = env(false)?; @@ -183,23 +185,19 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { dev_options.target = Some(target_triple); let (interface, config, metadata) = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); + let interface = AppInterface::new(&tauri_config, dev_options.target.clone(), dirs.tauri)?; - let interface = AppInterface::new(tauri_config_, dev_options.target.clone())?; - - let app = get_app(MobileTarget::Android, tauri_config_, &interface); + let app = get_app(MobileTarget::Android, &tauri_config, &interface, dirs.tauri); let (config, metadata) = get_config( &app, - tauri_config_, + &tauri_config, dev_options.features.as_ref(), &Default::default(), ); (interface, config, metadata) }; - let tauri_path = tauri_dir(); - set_current_dir(tauri_path).context("failed to set current directory to Tauri directory")?; + set_current_dir(dirs.tauri).context("failed to set current directory to Tauri directory")?; ensure_init( &tauri_config, @@ -218,6 +216,7 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { &config, &metadata, noise_level, + &dirs, ) } @@ -226,12 +225,13 @@ fn run_dev( mut interface: AppInterface, options: Options, mut dev_options: DevOptions, - tauri_config: ConfigHandle, + mut tauri_config: ConfigMetadata, device: Option, mut env: Env, config: &AndroidConfig, metadata: &AndroidMetadata, noise_level: NoiseLevel, + dirs: &Dirs, ) -> Result<()> { // when --host is provided or running on a physical device or resolving 0.0.0.0 we must use the network IP if options.host.0.is_some() @@ -239,25 +239,24 @@ fn run_dev( .as_ref() .map(|device| !device.serial_no().starts_with("emulator")) .unwrap_or(false) - || tauri_config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .dev_url - .as_ref() - .is_some_and(|url| { - matches!( - url.host(), - Some(Host::Ipv4(i)) if i == Ipv4Addr::UNSPECIFIED - ) - }) + || tauri_config.build.dev_url.as_ref().is_some_and(|url| { + matches!( + url.host(), + Some(Host::Ipv4(i)) if i == Ipv4Addr::UNSPECIFIED + ) + }) { - use_network_address_for_dev_url(&tauri_config, &mut dev_options, options.force_ip_prompt)?; + use_network_address_for_dev_url( + &mut tauri_config, + &mut dev_options, + options.force_ip_prompt, + dirs.tauri, + )?; } - crate::dev::setup(&interface, &mut dev_options, tauri_config)?; + crate::dev::setup(&interface, &mut dev_options, &mut tauri_config, dirs)?; + + let tauri_config = Mutex::new(tauri_config); let interface_options = InterfaceOptions { debug: !dev_options.release_mode, @@ -266,12 +265,12 @@ fn run_dev( }; let app_settings = interface.app_settings(); - let out_dir = app_settings.out_dir(&interface_options)?; + let out_dir = app_settings.out_dir(&interface_options, dirs.tauri)?; let _lock = flock::open_rw(out_dir.join("lock").with_extension("android"), "Android")?; configure_cargo(&mut env, config)?; - generate_tauri_properties(config, tauri_config.lock().unwrap().as_ref().unwrap(), true)?; + generate_tauri_properties(config, &tauri_config.lock().unwrap(), true)?; let installed_targets = crate::interface::rust::installation::installed_targets().unwrap_or_default(); @@ -307,6 +306,7 @@ fn run_dev( let open = options.open; interface.mobile_dev( + &tauri_config, MobileOptions { debug: !options.release_mode, features: options.features, @@ -329,9 +329,9 @@ fn run_dev( }), }; - let _handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; + let _handle = write_options(&tauri_config.lock().unwrap(), cli_options)?; - inject_resources(config, tauri_config.lock().unwrap().as_ref().unwrap())?; + inject_resources(config, &tauri_config.lock().unwrap())?; if open { open_and_wait(config, &env) @@ -347,6 +347,7 @@ fn run_dev( open_and_wait(config, &env) } }, + dirs, ) } diff --git a/crates/tauri-cli/src/mobile/android/mod.rs b/crates/tauri-cli/src/mobile/android/mod.rs index 9a73f91e0..002ed73ac 100644 --- a/crates/tauri-cli/src/mobile/android/mod.rs +++ b/crates/tauri-cli/src/mobile/android/mod.rs @@ -104,18 +104,17 @@ enum Commands { } pub fn command(cli: Cli, verbosity: u8) -> Result<()> { + let dirs = crate::helpers::app_paths::resolve_dirs(); let noise_level = NoiseLevel::from_occurrences(verbosity as u64); match cli.command { - Commands::Init(options) => { - crate::helpers::app_paths::resolve(); - init_command( - MobileTarget::Android, - options.ci, - false, - options.skip_targets_install, - options.config, - )? - } + Commands::Init(options) => init_command( + MobileTarget::Android, + options.ci, + false, + options.skip_targets_install, + options.config, + &dirs, + )?, Commands::Dev(options) => dev::command(options, noise_level)?, Commands::Build(options) => build::command(options, noise_level).map(|_| ())?, Commands::Run(options) => run::command(options, noise_level)?, diff --git a/crates/tauri-cli/src/mobile/android/run.rs b/crates/tauri-cli/src/mobile/android/run.rs index 8bab82b84..986990ac3 100644 --- a/crates/tauri-cli/src/mobile/android/run.rs +++ b/crates/tauri-cli/src/mobile/android/run.rs @@ -9,6 +9,7 @@ use cargo_mobile2::{ }; use clap::{ArgAction, Parser}; use std::path::PathBuf; +use std::sync::Mutex; use super::{configure_cargo, device_prompt, env}; use crate::{ @@ -77,7 +78,18 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { } }; - let mut built_application = super::build::command( + let dirs = crate::helpers::app_paths::resolve_dirs(); + let cfg = crate::helpers::config::get_config( + tauri_utils::platform::Target::Android, + &options + .config + .iter() + .map(|conf| &conf.0) + .collect::>(), + dirs.tauri, + )?; + let tauri_config = Mutex::new(cfg); + let mut built_application = super::build::run( super::build::Options { debug: !options.release, targets: device.as_ref().map(|d| { @@ -102,6 +114,8 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { }), }, noise_level, + &dirs, + &tauri_config, )?; configure_cargo(&mut env, &built_application.config)?; @@ -139,11 +153,13 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { runner()?; } else { built_application.interface.watch( + &tauri_config, WatcherOptions { config: options.config, additional_watch_folders: options.additional_watch_folders, }, runner, + &dirs, )?; } } diff --git a/crates/tauri-cli/src/mobile/init.rs b/crates/tauri-cli/src/mobile/init.rs index eef38d1e9..0a7324970 100644 --- a/crates/tauri-cli/src/mobile/init.rs +++ b/crates/tauri-cli/src/mobile/init.rs @@ -4,7 +4,8 @@ use super::{get_app, Target}; use crate::{ - helpers::{config::get as get_tauri_config, template::JsonMap}, + helpers::app_paths::Dirs, + helpers::{config::get_config as get_tauri_config, template::JsonMap}, interface::{AppInterface, Interface}, ConfigValue, Result, }; @@ -28,6 +29,7 @@ pub fn command( reinstall_deps: bool, skip_targets_install: bool, config: Vec, + dirs: &Dirs, ) -> Result<()> { let wrapper = TextWrapper::default(); @@ -38,6 +40,7 @@ pub fn command( reinstall_deps, skip_targets_install, config, + dirs, )?; Ok(()) } @@ -49,19 +52,19 @@ pub fn exec( #[allow(unused_variables)] reinstall_deps: bool, skip_targets_install: bool, config: Vec, + dirs: &Dirs, ) -> Result { let tauri_config = get_tauri_config( target.platform_target(), &config.iter().map(|conf| &conf.0).collect::>(), + dirs.tauri, )?; - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - let app = get_app( target, - tauri_config_, - &AppInterface::new(tauri_config_, None)?, + &tauri_config, + &AppInterface::new(&tauri_config, None, dirs.tauri)?, + dirs.tauri, ); let (handlebars, mut map) = handlebars(&app); @@ -135,7 +138,7 @@ pub fn exec( Target::Android => { let _env = super::android::env(non_interactive)?; let (config, metadata) = - super::android::get_config(&app, tauri_config_, &[], &Default::default()); + super::android::get_config(&app, &tauri_config, &[], &Default::default()); map.insert("android", &config); super::android::project::gen( &config, @@ -150,10 +153,10 @@ pub fn exec( // Generate Xcode project Target::Ios => { let (config, metadata) = - super::ios::get_config(&app, tauri_config_, &[], &Default::default())?; + super::ios::get_config(&app, &tauri_config, &[], &Default::default(), dirs.tauri)?; map.insert("apple", &config); super::ios::project::gen( - tauri_config_, + &tauri_config, &config, &metadata, (handlebars, map), diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index e8348726b..dba74df4e 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -11,8 +11,8 @@ use crate::{ build::Options as BuildOptions, error::{Context, ErrorExt}, helpers::{ - app_paths::tauri_dir, - config::{get as get_tauri_config, ConfigHandle}, + app_paths::Dirs, + config::{get_config as get_tauri_config, ConfigMetadata}, flock, plist::merge_plist, }, @@ -167,9 +167,7 @@ pub struct BuiltApplication { options_handle: OptionsHandle, } -pub fn command(options: Options, noise_level: NoiseLevel) -> Result { - crate::helpers::app_paths::resolve(); - +pub fn command(options: Options, noise_level: NoiseLevel, dirs: &Dirs) -> Result { let mut build_options: BuildOptions = options.clone().into(); build_options.target = Some( Target::all() @@ -189,26 +187,24 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result>(), + dirs.tauri, )?; let (interface, mut config) = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - - let interface = AppInterface::new(tauri_config_, build_options.target.clone())?; + let interface = AppInterface::new(&tauri_config, build_options.target.clone(), dirs.tauri)?; interface.build_options(&mut Vec::new(), &mut build_options.features, true); - let app = get_app(MobileTarget::Ios, tauri_config_, &interface); + let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri); let (config, _metadata) = get_config( &app, - tauri_config_, + &tauri_config, &build_options.features, &Default::default(), + dirs.tauri, )?; (interface, config) }; - let tauri_path = tauri_dir(); - set_current_dir(tauri_path).context("failed to set current directory")?; + set_current_dir(dirs.tauri).context("failed to set current directory")?; ensure_init( &tauri_config, @@ -217,7 +213,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result Result Result Result { let profile = if options.debug { Profile::Debug @@ -367,20 +357,18 @@ fn run_build( Profile::Release }; - crate::build::setup( - interface, - &mut build_options, - tauri_config.lock().unwrap().as_ref().unwrap(), - true, - )?; + crate::build::setup(interface, &mut build_options, &tauri_config, true, dirs)?; let app_settings = interface.app_settings(); - let out_dir = app_settings.out_dir(&InterfaceOptions { - debug: build_options.debug, - target: build_options.target.clone(), - args: build_options.args.clone(), - ..Default::default() - })?; + let out_dir = app_settings.out_dir( + &InterfaceOptions { + debug: build_options.debug, + target: build_options.target.clone(), + args: build_options.args.clone(), + ..Default::default() + }, + dirs.tauri, + )?; let _lock = flock::open_rw(out_dir.join("lock").with_extension("ios"), "iOS")?; let cli_options = CliOptions { @@ -392,7 +380,7 @@ fn run_build( config: build_options.config.clone(), target_device: options.target_device.clone(), }; - let handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; + let handle = write_options(&tauri_config, cli_options)?; if options.open { return Ok(handle); diff --git a/crates/tauri-cli/src/mobile/ios/dev.rs b/crates/tauri-cli/src/mobile/ios/dev.rs index 2661581ef..6d9c8a697 100644 --- a/crates/tauri-cli/src/mobile/ios/dev.rs +++ b/crates/tauri-cli/src/mobile/ios/dev.rs @@ -10,8 +10,8 @@ use crate::{ dev::Options as DevOptions, error::{Context, ErrorExt}, helpers::{ - app_paths::tauri_dir, - config::{get as get_tauri_config, ConfigHandle}, + app_paths::Dirs, + config::{get_config as get_tauri_config, ConfigMetadata}, flock, plist::merge_plist, }, @@ -35,6 +35,7 @@ use cargo_mobile2::{ }; use url::Host; +use std::sync::Mutex; use std::{env::set_current_dir, net::Ipv4Addr, path::PathBuf}; const PHYSICAL_IPHONE_DEV_WARNING: &str = "To develop on physical phones you need the `--host` option (not required for Simulators). See the documentation for more information: https://v2.tauri.app/develop/#development-server"; @@ -138,16 +139,16 @@ impl From for DevOptions { } pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); - let result = run_command(options, noise_level); + let result = run_command(options, noise_level, dirs); if result.is_err() { crate::dev::kill_before_dev_process(); } result } -fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { +fn run_command(options: Options, noise_level: NoiseLevel, dirs: Dirs) -> Result<()> { // setup env additions before calling env() if let Some(root_certificate_path) = &options.root_certificate_path { std::env::set_var( @@ -186,26 +187,24 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { let tauri_config = get_tauri_config( tauri_utils::platform::Target::Ios, &options.config.iter().map(|c| &c.0).collect::>(), + dirs.tauri, )?; let (interface, config) = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); + let interface = AppInterface::new(&tauri_config, Some(target_triple), dirs.tauri)?; - let interface = AppInterface::new(tauri_config_, Some(target_triple))?; - - let app = get_app(MobileTarget::Ios, tauri_config_, &interface); + let app = get_app(MobileTarget::Ios, &tauri_config, &interface, dirs.tauri); let (config, _metadata) = get_config( &app, - tauri_config_, + &tauri_config, &dev_options.features, &Default::default(), + dirs.tauri, )?; (interface, config) }; - let tauri_path = tauri_dir(); - set_current_dir(tauri_path).context("failed to set current directory to Tauri directory")?; + set_current_dir(dirs.tauri).context("failed to set current directory to Tauri directory")?; ensure_init( &tauri_config, @@ -214,28 +213,20 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { MobileTarget::Ios, false, )?; - inject_resources(&config, tauri_config.lock().unwrap().as_ref().unwrap())?; + inject_resources(&config, &tauri_config)?; let info_plist_path = config .project_dir() .join(config.scheme()) .join("Info.plist"); let mut src_plists = vec![info_plist_path.clone().into()]; - if tauri_path.join("Info.plist").exists() { - src_plists.push(tauri_path.join("Info.plist").into()); + if dirs.tauri.join("Info.plist").exists() { + src_plists.push(dirs.tauri.join("Info.plist").into()); } - if tauri_path.join("Info.ios.plist").exists() { - src_plists.push(tauri_path.join("Info.ios.plist").into()); + if dirs.tauri.join("Info.ios.plist").exists() { + src_plists.push(dirs.tauri.join("Info.ios.plist").into()); } - if let Some(info_plist) = &tauri_config - .lock() - .unwrap() - .as_ref() - .unwrap() - .bundle - .ios - .info_plist - { + if let Some(info_plist) = &tauri_config.bundle.ios.info_plist { src_plists.push(info_plist.clone().into()); } let merged_info_plist = merge_plist(src_plists)?; @@ -274,6 +265,7 @@ fn run_command(options: Options, noise_level: NoiseLevel) -> Result<()> { env, &config, noise_level, + &dirs, ) } @@ -282,11 +274,12 @@ fn run_dev( mut interface: AppInterface, options: Options, mut dev_options: DevOptions, - tauri_config: ConfigHandle, + mut tauri_config: ConfigMetadata, device: Option, env: Env, config: &AppleConfig, noise_level: NoiseLevel, + dirs: &Dirs, ) -> Result<()> { // when --host is provided or running on a physical device or resolving 0.0.0.0 we must use the network IP if options.host.0.is_some() @@ -294,38 +287,41 @@ fn run_dev( .as_ref() .map(|device| !matches!(device.kind(), DeviceKind::Simulator)) .unwrap_or(false) - || tauri_config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .dev_url - .as_ref() - .is_some_and(|url| { - matches!( + || tauri_config.build.dev_url.as_ref().is_some_and(|url| { + matches!( url.host(), Some(Host::Ipv4(i)) if i == Ipv4Addr::UNSPECIFIED - ) - }) + ) + }) { - use_network_address_for_dev_url(&tauri_config, &mut dev_options, options.force_ip_prompt)?; + use_network_address_for_dev_url( + &mut tauri_config, + &mut dev_options, + options.force_ip_prompt, + dirs.tauri, + )?; } - crate::dev::setup(&interface, &mut dev_options, tauri_config.clone())?; + crate::dev::setup(&interface, &mut dev_options, &mut tauri_config, &dirs)?; + + let tauri_config = Mutex::new(tauri_config); let app_settings = interface.app_settings(); - let out_dir = app_settings.out_dir(&InterfaceOptions { - debug: !dev_options.release_mode, - target: dev_options.target.clone(), - ..Default::default() - })?; + let out_dir = app_settings.out_dir( + &InterfaceOptions { + debug: !dev_options.release_mode, + target: dev_options.target.clone(), + ..Default::default() + }, + dirs.tauri, + )?; let _lock = flock::open_rw(out_dir.join("lock").with_extension("ios"), "iOS")?; let set_host = options.host.0.is_some(); let open = options.open; interface.mobile_dev( + &tauri_config, MobileOptions { debug: true, features: options.features, @@ -344,7 +340,7 @@ fn run_dev( config: dev_options.config.clone(), target_device: None, }; - let _handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?; + let _handle = write_options(&tauri_config.lock().unwrap(), cli_options)?; let open_xcode = || { if !set_host { @@ -371,6 +367,7 @@ fn run_dev( open_xcode() } }, + &dirs, ) } diff --git a/crates/tauri-cli/src/mobile/ios/mod.rs b/crates/tauri-cli/src/mobile/ios/mod.rs index d589f76a6..0590e772a 100644 --- a/crates/tauri-cli/src/mobile/ios/mod.rs +++ b/crates/tauri-cli/src/mobile/ios/mod.rs @@ -30,8 +30,7 @@ use super::{ use crate::{ error::{Context, ErrorExt}, helpers::{ - app_paths::tauri_dir, - config::{BundleResources, Config as TauriConfig, ConfigHandle}, + config::{BundleResources, Config as TauriConfig, ConfigMetadata}, pbxproj, strip_semver_prerelease_tag, }, ConfigValue, Error, Result, @@ -103,19 +102,18 @@ enum Commands { pub fn command(cli: Cli, verbosity: u8) -> Result<()> { let noise_level = NoiseLevel::from_occurrences(verbosity as u64); + let dirs = crate::helpers::app_paths::resolve_dirs(); match cli.command { - Commands::Init(options) => { - crate::helpers::app_paths::resolve(); - init_command( - MobileTarget::Ios, - options.ci, - options.reinstall_deps, - options.skip_targets_install, - options.config, - )? - } + Commands::Init(options) => init_command( + MobileTarget::Ios, + options.ci, + options.reinstall_deps, + options.skip_targets_install, + options.config, + &dirs, + )?, Commands::Dev(options) => dev::command(options, noise_level)?, - Commands::Build(options) => build::command(options, noise_level).map(|_| ())?, + Commands::Build(options) => build::command(options, noise_level, &dirs).map(|_| ())?, Commands::Run(options) => run::command(options, noise_level)?, Commands::XcodeScript(options) => xcode_script::command(options)?, } @@ -128,6 +126,7 @@ pub fn get_config( tauri_config: &TauriConfig, features: &[String], cli_options: &CliOptions, + tauri_dir: &Path, ) -> Result<(AppleConfig, AppleMetadata)> { let mut ios_options = cli_options.clone(); ios_options.features.extend_from_slice(features); @@ -236,8 +235,6 @@ pub fn get_config( let config = AppleConfig::from_raw(app.clone(), Some(raw)) .context("failed to create Apple configuration")?; - let tauri_dir = tauri_dir(); - let mut vendor_frameworks = Vec::new(); let mut frameworks = Vec::new(); for framework in tauri_config @@ -272,11 +269,7 @@ pub fn get_config( supported: true, ios: ApplePlatform { cargo_args: Some(ios_options.args), - features: if ios_options.features.is_empty() { - None - } else { - Some(ios_options.features) - }, + features: Some(ios_options.features), frameworks: Some(frameworks), vendor_frameworks: Some(vendor_frameworks), ..Default::default() @@ -553,26 +546,14 @@ pub fn load_pbxproj(config: &AppleConfig) -> Result { pub fn synchronize_project_config( config: &AppleConfig, - tauri_config: &ConfigHandle, + tauri_config: &ConfigMetadata, pbxproj: &mut pbxproj::Pbxproj, export_options_plist: &mut plist::Dictionary, project_config: &ProjectConfig, debug: bool, ) -> Result<()> { - let identifier = tauri_config - .lock() - .unwrap() - .as_ref() - .unwrap() - .identifier - .clone(); - let product_name = tauri_config - .lock() - .unwrap() - .as_ref() - .unwrap() - .product_name - .clone(); + let identifier = tauri_config.identifier.clone(); + let product_name = tauri_config.product_name.clone(); let manual_signing = project_config.code_sign_identity.is_some() || project_config.provisioning_profile_uuid.is_some(); diff --git a/crates/tauri-cli/src/mobile/ios/run.rs b/crates/tauri-cli/src/mobile/ios/run.rs index 844e2f4c8..7d18cdb60 100644 --- a/crates/tauri-cli/src/mobile/ios/run.rs +++ b/crates/tauri-cli/src/mobile/ios/run.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: MIT use std::path::PathBuf; +use std::sync::Mutex; use cargo_mobile2::opts::{NoiseLevel, Profile}; use clap::{ArgAction, Parser}; @@ -10,6 +11,7 @@ use clap::{ArgAction, Parser}; use super::{device_prompt, env}; use crate::{ error::Context, + helpers::config::get_config as get_tauri_config, interface::{DevProcess, Interface, WatcherOptions}, mobile::{DevChild, TargetDevice}, ConfigValue, Result, @@ -73,6 +75,8 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { } }; + let dirs = crate::helpers::app_paths::resolve_dirs(); + let mut built_application = super::build::command( super::build::Options { debug: !options.release, @@ -91,8 +95,16 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { }), }, noise_level, + &dirs, )?; + let cfg = get_tauri_config( + tauri_utils::platform::Target::Ios, + &options.config.iter().map(|c| &c.0).collect::>(), + dirs.tauri, + )?; + let tauri_config = Mutex::new(cfg); + // options.open is handled by the build command // so all we need to do here is run the app on the selected device if let Some(device) = device { @@ -117,11 +129,13 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { runner()?; } else { built_application.interface.watch( + &tauri_config, WatcherOptions { config: options.config, additional_watch_folders: options.additional_watch_folders, }, runner, + &dirs, )?; } } diff --git a/crates/tauri-cli/src/mobile/ios/xcode_script.rs b/crates/tauri-cli/src/mobile/ios/xcode_script.rs index 25955c5ae..0b30ba2f4 100644 --- a/crates/tauri-cli/src/mobile/ios/xcode_script.rs +++ b/crates/tauri-cli/src/mobile/ios/xcode_script.rs @@ -5,7 +5,7 @@ use super::{ensure_init, env, get_app, get_config, read_options, MobileTarget}; use crate::{ error::{Context, ErrorExt}, - helpers::config::{get as get_tauri_config, reload as reload_tauri_config}, + helpers::config::{get_config as get_tauri_config, reload_config as reload_tauri_config}, interface::{AppInterface, Interface, Options as InterfaceOptions}, mobile::ios::LIB_OUTPUT_FILE_NAME, Error, Result, @@ -89,47 +89,43 @@ pub fn command(options: Options) -> Result<()> { .unwrap(); } - crate::helpers::app_paths::resolve(); + let dirs = crate::helpers::app_paths::resolve_dirs(); let profile = profile_from_configuration(&options.configuration); let macos = macos_from_platform(&options.platform); - let (tauri_config, cli_options) = { - let tauri_config = get_tauri_config(tauri_utils::platform::Target::Ios, &[])?; - let cli_options = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - read_options(tauri_config_) - }; - let tauri_config = if cli_options.config.is_empty() { - tauri_config - } else { + let mut tauri_config = get_tauri_config(tauri_utils::platform::Target::Ios, &[], dirs.tauri)?; + let cli_options = { + let cli_options = { read_options(&tauri_config) }; + if !cli_options.config.is_empty() { // reload config with merges from the ios dev|build script reload_tauri_config( + &mut tauri_config, &cli_options .config .iter() .map(|conf| &conf.0) .collect::>(), + dirs.tauri, )? }; - (tauri_config, cli_options) + cli_options }; let (config, metadata) = { - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - let cli_options = read_options(tauri_config_); + let cli_options = read_options(&tauri_config); let (config, metadata) = get_config( &get_app( MobileTarget::Ios, - tauri_config_, - &AppInterface::new(tauri_config_, None)?, + &tauri_config, + &AppInterface::new(&tauri_config, None, dirs.tauri)?, + dirs.tauri, ), - tauri_config_, + &tauri_config, &[], &cli_options, + dirs.tauri, )?; (config, metadata) }; @@ -142,7 +138,8 @@ pub fn command(options: Options) -> Result<()> { )?; if !cli_options.config.is_empty() { - crate::helpers::config::merge_with( + crate::helpers::config::merge_config_with( + &mut tauri_config, &cli_options .config .iter() @@ -236,10 +233,7 @@ pub fn command(options: Options) -> Result<()> { } }; - let interface = AppInterface::new( - tauri_config.lock().unwrap().as_ref().unwrap(), - Some(rust_triple.into()), - )?; + let interface = AppInterface::new(&tauri_config, Some(rust_triple.into()), dirs.tauri)?; let cflags = format!("CFLAGS_{env_triple}"); let cxxflags = format!("CFLAGS_{env_triple}"); @@ -280,11 +274,14 @@ pub fn command(options: Options) -> Result<()> { ) .context("failed to compile iOS app")?; - let out_dir = interface.app_settings().out_dir(&InterfaceOptions { - debug: matches!(profile, Profile::Debug), - target: Some(rust_triple.into()), - ..Default::default() - })?; + let out_dir = interface.app_settings().out_dir( + &InterfaceOptions { + debug: matches!(profile, Profile::Debug), + target: Some(rust_triple.into()), + ..Default::default() + }, + dirs.tauri, + )?; let lib_path = out_dir.join(format!("lib{}.a", config.app().lib_name())); if !lib_path.exists() { diff --git a/crates/tauri-cli/src/mobile/mod.rs b/crates/tauri-cli/src/mobile/mod.rs index b94543d65..6b06e0cac 100644 --- a/crates/tauri-cli/src/mobile/mod.rs +++ b/crates/tauri-cli/src/mobile/mod.rs @@ -4,10 +4,7 @@ use crate::{ error::{Context, ErrorExt}, - helpers::{ - app_paths::tauri_dir, - config::{reload as reload_config, Config as TauriConfig, ConfigHandle, ConfigMetadata}, - }, + helpers::config::{reload_config, Config as TauriConfig, ConfigMetadata}, interface::{AppInterface, AppSettings, DevProcess, Interface, Options as InterfaceOptions}, ConfigValue, Error, Result, }; @@ -31,7 +28,7 @@ use std::{ fmt::{Display, Write}, fs::{read_to_string, write}, net::{AddrParseError, IpAddr, Ipv4Addr, SocketAddr}, - path::PathBuf, + path::{Path, PathBuf}, process::{exit, ExitStatus}, str::FromStr, sync::{ @@ -217,12 +214,9 @@ fn local_ip_address(force: bool) -> &'static IpAddr { }) .collect(); - match addresses.len() { - 0 => panic!("No external IP detected."), - 1 => { - let ipaddr = addresses.first().unwrap(); - *ipaddr - } + match addresses.as_slice() { + [] => panic!("No external IP detected."), + [ipaddr] => *ipaddr, _ => { let selected = dialoguer::Select::with_theme(&dialoguer::theme::ColorfulTheme::default()) .with_prompt( @@ -252,18 +246,12 @@ struct DevUrlConfig { } fn use_network_address_for_dev_url( - config: &ConfigHandle, + config: &mut ConfigMetadata, dev_options: &mut crate::dev::Options, force_ip_prompt: bool, + tauri_dir: &Path, ) -> crate::Result { - let mut dev_url = config - .lock() - .unwrap() - .as_ref() - .unwrap() - .build - .dev_url - .clone(); + let mut dev_url = config.build.dev_url.clone(); let ip = if let Some(url) = &mut dev_url { let localhost = match url.host() { @@ -299,11 +287,13 @@ fn use_network_address_for_dev_url( }))); reload_config( + config, &dev_options .config .iter() .map(|conf| &conf.0) .collect::>(), + tauri_dir, )?; Some(ip) @@ -441,7 +431,12 @@ fn read_options(config: &ConfigMetadata) -> CliOptions { options } -pub fn get_app(target: Target, config: &TauriConfig, interface: &AppInterface) -> App { +pub fn get_app( + target: Target, + config: &TauriConfig, + interface: &AppInterface, + tauri_dir: &Path, +) -> App { let identifier = match target { Target::Android => config.identifier.replace('-', "_"), #[cfg(target_os = "macos")] @@ -478,22 +473,26 @@ pub fn get_app(target: Target, config: &TauriConfig, interface: &AppInterface) - }; let app_settings = interface.app_settings(); - App::from_raw(tauri_dir().to_path_buf(), raw) + let tauri_dir = tauri_dir.to_path_buf(); + App::from_raw(tauri_dir.to_path_buf(), raw) .unwrap() .with_target_dir_resolver(move |target, profile| { app_settings - .out_dir(&InterfaceOptions { - debug: matches!(profile, Profile::Debug), - target: Some(target.into()), - ..Default::default() - }) + .out_dir( + &InterfaceOptions { + debug: matches!(profile, Profile::Debug), + target: Some(target.into()), + ..Default::default() + }, + &tauri_dir, + ) .expect("failed to resolve target directory") }) } #[allow(unused_variables)] fn ensure_init( - tauri_config: &ConfigHandle, + tauri_config: &ConfigMetadata, app: &App, project_dir: PathBuf, target: Target, @@ -508,16 +507,13 @@ fn ensure_init( ) } - let tauri_config_guard = tauri_config.lock().unwrap(); - let tauri_config_ = tauri_config_guard.as_ref().unwrap(); - let mut project_outdated_reasons = Vec::new(); match target { Target::Android => { let java_folder = project_dir .join("app/src/main/java") - .join(tauri_config_.identifier.replace('.', "/").replace('-', "_")); + .join(tauri_config.identifier.replace('.', "/").replace('-', "_")); if java_folder.exists() { #[cfg(unix)] ensure_gradlew(&project_dir)?; diff --git a/crates/tauri-cli/src/remove.rs b/crates/tauri-cli/src/remove.rs index 319f60e82..ba20ae778 100644 --- a/crates/tauri-cli/src/remove.rs +++ b/crates/tauri-cli/src/remove.rs @@ -6,11 +6,7 @@ use clap::Parser; use crate::{ acl, - helpers::{ - app_paths::{resolve_frontend_dir, tauri_dir}, - cargo, - npm::PackageManager, - }, + helpers::{app_paths::resolve_frontend_dir, cargo, npm::PackageManager}, Result, }; @@ -22,11 +18,7 @@ pub struct Options { } pub fn command(options: Options) -> Result<()> { - crate::helpers::app_paths::resolve(); - run(options) -} - -pub fn run(options: Options) -> Result<()> { + let dirs = crate::helpers::app_paths::resolve_dirs(); let plugin = options.plugin; let crate_name = format!("tauri-plugin-{plugin}"); @@ -35,7 +27,6 @@ pub fn run(options: Options) -> Result<()> { let metadata = plugins.remove(plugin.as_str()).unwrap_or_default(); let frontend_dir = resolve_frontend_dir(); - let tauri_dir = tauri_dir(); let target_str = metadata .desktop_only @@ -48,14 +39,14 @@ pub fn run(options: Options) -> Result<()> { cargo::uninstall_one(cargo::CargoUninstallOptions { name: &crate_name, - cwd: Some(tauri_dir), + cwd: Some(dirs.tauri), target: target_str, })?; if !metadata.rust_only { if let Some(manager) = frontend_dir.map(PackageManager::from_project) { let npm_name = format!("@tauri-apps/plugin-{plugin}"); - manager.remove(&[npm_name], tauri_dir)?; + manager.remove(&[npm_name], dirs.tauri)?; } acl::permission::rm::command(acl::permission::rm::Options { From ea31b07f19e0aa467ed0f921f60575cfe09809c8 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 18 Jan 2026 01:23:12 +0800 Subject: [PATCH 101/119] fix(cli): `inspect`'s description (#14789) --- .changes/fix-inspect-description.md | 6 ++++++ crates/tauri-cli/src/inspect.rs | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changes/fix-inspect-description.md diff --git a/.changes/fix-inspect-description.md b/.changes/fix-inspect-description.md new file mode 100644 index 000000000..df1c87db9 --- /dev/null +++ b/.changes/fix-inspect-description.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:bug +"tauri-cli": patch:bug +--- + +Fixed the command description for `tauri inspect` diff --git a/crates/tauri-cli/src/inspect.rs b/crates/tauri-cli/src/inspect.rs index a2bb3bfa1..de26dd984 100644 --- a/crates/tauri-cli/src/inspect.rs +++ b/crates/tauri-cli/src/inspect.rs @@ -9,7 +9,7 @@ use clap::{Parser, Subcommand}; use crate::interface::{AppInterface, AppSettings, Interface}; #[derive(Debug, Parser)] -#[clap(about = "Manage or create permissions for your app or plugin")] +#[clap(about = "Inspect values used by Tauri")] pub struct Cli { #[clap(subcommand)] command: Commands, @@ -40,8 +40,7 @@ fn wix_upgrade_code(tauri_dir: &Path) -> Result<()> { let upgrade_code = uuid::Uuid::new_v5( &uuid::Uuid::NAMESPACE_DNS, format!("{product_name}.exe.app.x64").as_bytes(), - ) - .to_string(); + ); log::info!("Default WiX Upgrade Code, derived from {product_name}: {upgrade_code}"); if let Some(code) = config From 10a8066db309a2793a7a5ef95179a5cb77339f4b Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 18 Jan 2026 20:57:36 +0800 Subject: [PATCH 102/119] refactor(cli): reorder a few parameters (#14792) --- crates/tauri-cli/src/build.rs | 6 +++--- crates/tauri-cli/src/bundle.rs | 4 ++-- crates/tauri-cli/src/helpers/config.rs | 6 ++---- crates/tauri-cli/src/interface/rust/manifest.rs | 5 +---- crates/tauri-cli/src/mobile/android/build.rs | 2 +- crates/tauri-cli/src/mobile/ios/build.rs | 2 +- 6 files changed, 10 insertions(+), 15 deletions(-) diff --git a/crates/tauri-cli/src/build.rs b/crates/tauri-cli/src/build.rs index 754b1793e..b43b3c9ae 100644 --- a/crates/tauri-cli/src/build.rs +++ b/crates/tauri-cli/src/build.rs @@ -104,7 +104,7 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> { let mut interface = AppInterface::new(&config, options.target.clone(), dirs.tauri)?; - setup(&interface, &mut options, &config, false, &dirs)?; + setup(&interface, &mut options, &config, &dirs, false)?; if let Some(minimum_system_version) = &config.bundle.macos.minimum_system_version { std::env::set_var("MACOSX_DEPLOYMENT_TARGET", minimum_system_version); @@ -129,8 +129,8 @@ pub fn command(mut options: Options, verbosity: u8) -> Result<()> { &interface, &*app_settings, &config, - &out_dir, &dirs, + &out_dir, )?; } @@ -141,8 +141,8 @@ pub fn setup( interface: &AppInterface, options: &mut Options, config: &ConfigMetadata, - mobile: bool, dirs: &Dirs, + mobile: bool, ) -> Result<()> { // TODO: Maybe optimize this to run in parallel in the future // see https://github.com/tauri-apps/tauri/pull/13993#discussion_r2280697117 diff --git a/crates/tauri-cli/src/bundle.rs b/crates/tauri-cli/src/bundle.rs index 57e4a6f38..638c215e9 100644 --- a/crates/tauri-cli/src/bundle.rs +++ b/crates/tauri-cli/src/bundle.rs @@ -154,8 +154,8 @@ pub fn command(options: Options, verbosity: u8) -> crate::Result<()> { &interface, &*app_settings, &config, - &out_dir, &dirs, + &out_dir, ) } @@ -167,8 +167,8 @@ pub fn bundle( interface: &AppInterface, app_settings: &A, config: &ConfigMetadata, - out_dir: &Path, dirs: &Dirs, + out_dir: &Path, ) -> crate::Result<()> { let package_types: Vec = if let Some(bundles) = &options.bundles { bundles.iter().map(|bundle| bundle.0).collect::>() diff --git a/crates/tauri-cli/src/helpers/config.rs b/crates/tauri-cli/src/helpers/config.rs index d819867bd..ce1f11c5b 100644 --- a/crates/tauri-cli/src/helpers/config.rs +++ b/crates/tauri-cli/src/helpers/config.rs @@ -55,8 +55,7 @@ impl ConfigMetadata { for (ext, config) in &self.extensions { if let Some(identifier) = config .as_object() - .and_then(|bundle_config| bundle_config.get("identifier")) - .and_then(|id| id.as_str()) + .and_then(|bundle_config| bundle_config.get("identifier")?.as_str()) { if identifier == self.inner.identifier { return Some(ext.clone()); @@ -163,8 +162,7 @@ fn load_config( let original_identifier = config .as_object() - .and_then(|config| config.get("identifier")) - .and_then(|id| id.as_str()) + .and_then(|config| config.get("identifier")?.as_str()) .map(ToString::to_string); if let Some((platform_config, config_path)) = diff --git a/crates/tauri-cli/src/interface/rust/manifest.rs b/crates/tauri-cli/src/interface/rust/manifest.rs index 58a5dd6c1..40d307c2b 100644 --- a/crates/tauri-cli/src/interface/rust/manifest.rs +++ b/crates/tauri-cli/src/interface/rust/manifest.rs @@ -351,10 +351,7 @@ mod tests { } else { None }; - if let Some(f) = item_table - .and_then(|t| t.get("features").cloned()) - .and_then(|f| f.as_array().cloned()) - { + if let Some(f) = item_table.and_then(|t| t.get("features")?.as_array().cloned()) { for feature in f.iter() { let feature = feature.as_str().expect("feature is not a string"); if !dep.all_cli_managed_features.contains(&feature) { diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index dee966a1f..8e672959c 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -188,7 +188,7 @@ pub fn run( generate_tauri_properties(&config, tauri_config, false)?; - crate::build::setup(&interface, &mut build_options, tauri_config, true, dirs)?; + crate::build::setup(&interface, &mut build_options, tauri_config, dirs, true)?; let installed_targets = crate::interface::rust::installation::installed_targets().unwrap_or_default(); diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index dba74df4e..160e0995e 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -357,7 +357,7 @@ fn run_build( Profile::Release }; - crate::build::setup(interface, &mut build_options, &tauri_config, true, dirs)?; + crate::build::setup(interface, &mut build_options, &tauri_config, dirs, true)?; let app_settings = interface.app_settings(); let out_dir = app_settings.out_dir( From 08e35fcda00050237377509742c9daebf1a10561 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Sun, 18 Jan 2026 21:09:36 +0800 Subject: [PATCH 103/119] refactor(cli): remove mutex on config (#14791) * refactor(cli): remove mutex on config * Fix ios * Clippy * Fix ios * Unused import * Fix ios closure and clippy * Import `ConfigMetadata` * Remove life time tags --- crates/tauri-cli/src/dev.rs | 10 ++-- crates/tauri-cli/src/interface/mod.rs | 13 +++--- crates/tauri-cli/src/interface/rust.rs | 48 ++++++++++---------- crates/tauri-cli/src/mobile/android/build.rs | 8 ++-- crates/tauri-cli/src/mobile/android/dev.rs | 13 ++---- crates/tauri-cli/src/mobile/android/run.rs | 11 ++--- crates/tauri-cli/src/mobile/ios/dev.rs | 9 ++-- crates/tauri-cli/src/mobile/ios/run.rs | 12 ++--- 8 files changed, 57 insertions(+), 67 deletions(-) diff --git a/crates/tauri-cli/src/dev.rs b/crates/tauri-cli/src/dev.rs index 5bf62ef10..a66186919 100644 --- a/crates/tauri-cli/src/dev.rs +++ b/crates/tauri-cli/src/dev.rs @@ -113,22 +113,20 @@ fn command_internal(mut options: Options, dirs: Dirs) -> Result<()> { .map(Target::from_triple) .unwrap_or_else(Target::current); - let mut cfg = get_config( + let mut config = get_config( target, &options.config.iter().map(|c| &c.0).collect::>(), dirs.tauri, )?; - let mut interface = AppInterface::new(&cfg, options.target.clone(), dirs.tauri)?; + let mut interface = AppInterface::new(&config, options.target.clone(), dirs.tauri)?; - setup(&interface, &mut options, &mut cfg, &dirs)?; - - let config = Mutex::new(cfg); + setup(&interface, &mut options, &mut config, &dirs)?; let exit_on_panic = options.exit_on_panic; let no_watch = options.no_watch; interface.dev( - &config, + &mut config, options.into(), move |status, reason| on_app_exit(status, reason, exit_on_panic, no_watch), &dirs, diff --git a/crates/tauri-cli/src/interface/mod.rs b/crates/tauri-cli/src/interface/mod.rs index 8b797091d..dc15e7ecb 100644 --- a/crates/tauri-cli/src/interface/mod.rs +++ b/crates/tauri-cli/src/interface/mod.rs @@ -9,7 +9,6 @@ use std::{ path::{Path, PathBuf}, process::ExitStatus, sync::Arc, - sync::Mutex, }; use crate::{ @@ -115,21 +114,23 @@ pub trait Interface: Sized { fn build(&mut self, options: Options, dirs: &Dirs) -> crate::Result; fn dev, ExitReason) + Send + Sync + 'static>( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, options: Options, on_exit: F, dirs: &Dirs, ) -> crate::Result<()>; - fn mobile_dev crate::Result>>( + fn mobile_dev< + R: Fn(MobileOptions, &ConfigMetadata) -> crate::Result>, + >( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, options: MobileOptions, runner: R, dirs: &Dirs, ) -> crate::Result<()>; - fn watch crate::Result>>( + fn watch crate::Result>>( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, options: WatcherOptions, runner: R, dirs: &Dirs, diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index a9a42363a..063d6a175 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -194,7 +194,7 @@ impl Interface for Rust { fn dev, ExitReason) + Send + Sync + 'static>( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, mut options: Options, on_exit: F, dirs: &Dirs, @@ -221,25 +221,26 @@ impl Interface for Rust { Ok(()) } else { let merge_configs = options.config.iter().map(|c| &c.0).collect::>(); - let run = Arc::new(|rust: &mut Rust| { - let on_exit = on_exit.clone(); - rust.run_dev(options.clone(), run_args.clone(), move |status, reason| { - on_exit(status, reason) - }) - }); self.run_dev_watcher( config, &options.additional_watch_folders, &merge_configs, - run, + |rust: &mut Rust, _config| { + let on_exit = on_exit.clone(); + rust.run_dev(options.clone(), run_args.clone(), move |status, reason| { + on_exit(status, reason) + }) + }, dirs, ) } } - fn mobile_dev crate::Result>>( + fn mobile_dev< + R: Fn(MobileOptions, &ConfigMetadata) -> crate::Result>, + >( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, mut options: MobileOptions, runner: R, dirs: &Dirs, @@ -254,7 +255,7 @@ impl Interface for Rust { ); if options.no_watch { - runner(options)?; + runner(options, config)?; Ok(()) } else { self.watch( @@ -263,26 +264,25 @@ impl Interface for Rust { config: options.config.clone(), additional_watch_folders: options.additional_watch_folders.clone(), }, - move || runner(options.clone()), + move |config| runner(options.clone(), config), dirs, ) } } - fn watch crate::Result>>( + fn watch crate::Result>>( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, options: WatcherOptions, runner: R, dirs: &Dirs, ) -> crate::Result<()> { let merge_configs = options.config.iter().map(|c| &c.0).collect::>(); - let run = Arc::new(|_rust: &mut Rust| runner()); self.run_dev_watcher( config, &options.additional_watch_folders, &merge_configs, - run, + |_rust: &mut Rust, config| runner(config), dirs, ) } @@ -539,15 +539,17 @@ impl Rust { .map(|c| Box::new(c) as Box) } - fn run_dev_watcher crate::Result>>( + fn run_dev_watcher< + F: Fn(&mut Rust, &ConfigMetadata) -> crate::Result>, + >( &mut self, - config: &Mutex, + config: &mut ConfigMetadata, additional_watch_folders: &[PathBuf], merge_configs: &[&serde_json::Value], - run: Arc, + run: F, dirs: &Dirs, ) -> crate::Result<()> { - let child = run(self)?; + let child = run(self, config)?; let process = Arc::new(Mutex::new(child)); let (tx, rx) = sync_channel(1); @@ -593,9 +595,9 @@ impl Rust { if let Some(event_path) = event.paths.first() { if !ignore_matcher.is_ignore(event_path, event_path.is_dir()) { if is_configuration_file(self.app_settings.target_platform, event_path) - && reload_config(&mut config.lock().unwrap(), merge_configs, dirs.tauri).is_ok() + && reload_config(config, merge_configs, dirs.tauri).is_ok() { - let (manifest, modified) = rewrite_manifest(&config.lock().unwrap(), dirs.tauri)?; + let (manifest, modified) = rewrite_manifest(config, dirs.tauri)?; if modified { *self.app_settings.manifest.lock().unwrap() = manifest; // no need to run the watcher logic, the manifest was modified @@ -619,7 +621,7 @@ impl Rust { break; } } - *p = run(self)?; + *p = run(self, config)?; } } } diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index 8e672959c..5e5e7cd62 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -28,7 +28,6 @@ use cargo_mobile2::{ use std::env::set_current_dir; use std::path::Path; -use std::sync::Mutex; #[derive(Debug, Clone, Parser)] #[clap( @@ -119,7 +118,7 @@ pub struct BuiltApplication { pub fn command(options: Options, noise_level: NoiseLevel) -> Result { let dirs = crate::helpers::app_paths::resolve_dirs(); - let tauri_config = Mutex::new(get_tauri_config( + let tauri_config = get_tauri_config( tauri_utils::platform::Target::Android, &options .config @@ -127,7 +126,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result>(), dirs.tauri, - )?); + )?; run(options, noise_level, &dirs, &tauri_config) } @@ -135,7 +134,7 @@ pub fn run( options: Options, noise_level: NoiseLevel, dirs: &Dirs, - tauri_config: &Mutex, + tauri_config: &ConfigMetadata, ) -> Result { delete_codegen_vars(); @@ -151,7 +150,6 @@ pub fn run( ) .unwrap(); build_options.target = Some(first_target.triple.into()); - let tauri_config = &tauri_config.lock().unwrap(); let (interface, config, metadata) = { let interface = AppInterface::new(tauri_config, build_options.target.clone(), dirs.tauri)?; diff --git a/crates/tauri-cli/src/mobile/android/dev.rs b/crates/tauri-cli/src/mobile/android/dev.rs index bb4624980..a4cfaacd4 100644 --- a/crates/tauri-cli/src/mobile/android/dev.rs +++ b/crates/tauri-cli/src/mobile/android/dev.rs @@ -35,7 +35,6 @@ use cargo_mobile2::{ }; use url::Host; -use std::sync::Mutex; use std::{env::set_current_dir, net::Ipv4Addr, path::PathBuf}; #[derive(Debug, Clone, Parser)] @@ -256,8 +255,6 @@ fn run_dev( crate::dev::setup(&interface, &mut dev_options, &mut tauri_config, dirs)?; - let tauri_config = Mutex::new(tauri_config); - let interface_options = InterfaceOptions { debug: !dev_options.release_mode, target: dev_options.target.clone(), @@ -270,7 +267,7 @@ fn run_dev( configure_cargo(&mut env, config)?; - generate_tauri_properties(config, &tauri_config.lock().unwrap(), true)?; + generate_tauri_properties(config, &tauri_config, true)?; let installed_targets = crate::interface::rust::installation::installed_targets().unwrap_or_default(); @@ -306,7 +303,7 @@ fn run_dev( let open = options.open; interface.mobile_dev( - &tauri_config, + &mut tauri_config, MobileOptions { debug: !options.release_mode, features: options.features, @@ -315,7 +312,7 @@ fn run_dev( no_watch: options.no_watch, additional_watch_folders: options.additional_watch_folders, }, - |options| { + |options, tauri_config| { let cli_options = CliOptions { dev: true, features: options.features.clone(), @@ -329,9 +326,9 @@ fn run_dev( }), }; - let _handle = write_options(&tauri_config.lock().unwrap(), cli_options)?; + let _handle = write_options(tauri_config, cli_options)?; - inject_resources(config, &tauri_config.lock().unwrap())?; + inject_resources(config, tauri_config)?; if open { open_and_wait(config, &env) diff --git a/crates/tauri-cli/src/mobile/android/run.rs b/crates/tauri-cli/src/mobile/android/run.rs index 986990ac3..736ca84d6 100644 --- a/crates/tauri-cli/src/mobile/android/run.rs +++ b/crates/tauri-cli/src/mobile/android/run.rs @@ -9,11 +9,11 @@ use cargo_mobile2::{ }; use clap::{ArgAction, Parser}; use std::path::PathBuf; -use std::sync::Mutex; use super::{configure_cargo, device_prompt, env}; use crate::{ error::Context, + helpers::config::ConfigMetadata, interface::{DevProcess, Interface, WatcherOptions}, mobile::{DevChild, TargetDevice}, ConfigValue, Result, @@ -79,7 +79,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { }; let dirs = crate::helpers::app_paths::resolve_dirs(); - let cfg = crate::helpers::config::get_config( + let mut tauri_config = crate::helpers::config::get_config( tauri_utils::platform::Target::Android, &options .config @@ -88,7 +88,6 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { .collect::>(), dirs.tauri, )?; - let tauri_config = Mutex::new(cfg); let mut built_application = super::build::run( super::build::Options { debug: !options.release, @@ -125,7 +124,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { if let Some(device) = device { let config = built_application.config.clone(); let release = options.release; - let runner = move || { + let runner = move |_tauri_config: &ConfigMetadata| { device .run( &config, @@ -150,10 +149,10 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { }; if options.no_watch { - runner()?; + runner(&tauri_config)?; } else { built_application.interface.watch( - &tauri_config, + &mut tauri_config, WatcherOptions { config: options.config, additional_watch_folders: options.additional_watch_folders, diff --git a/crates/tauri-cli/src/mobile/ios/dev.rs b/crates/tauri-cli/src/mobile/ios/dev.rs index 6d9c8a697..397875ac2 100644 --- a/crates/tauri-cli/src/mobile/ios/dev.rs +++ b/crates/tauri-cli/src/mobile/ios/dev.rs @@ -35,7 +35,6 @@ use cargo_mobile2::{ }; use url::Host; -use std::sync::Mutex; use std::{env::set_current_dir, net::Ipv4Addr, path::PathBuf}; const PHYSICAL_IPHONE_DEV_WARNING: &str = "To develop on physical phones you need the `--host` option (not required for Simulators). See the documentation for more information: https://v2.tauri.app/develop/#development-server"; @@ -304,8 +303,6 @@ fn run_dev( crate::dev::setup(&interface, &mut dev_options, &mut tauri_config, &dirs)?; - let tauri_config = Mutex::new(tauri_config); - let app_settings = interface.app_settings(); let out_dir = app_settings.out_dir( &InterfaceOptions { @@ -321,7 +318,7 @@ fn run_dev( let open = options.open; interface.mobile_dev( - &tauri_config, + &mut tauri_config, MobileOptions { debug: true, features: options.features, @@ -330,7 +327,7 @@ fn run_dev( no_watch: options.no_watch, additional_watch_folders: options.additional_watch_folders, }, - |options| { + |options, tauri_config| { let cli_options = CliOptions { dev: true, features: options.features.clone(), @@ -340,7 +337,7 @@ fn run_dev( config: dev_options.config.clone(), target_device: None, }; - let _handle = write_options(&tauri_config.lock().unwrap(), cli_options)?; + let _handle = write_options(tauri_config, cli_options)?; let open_xcode = || { if !set_host { diff --git a/crates/tauri-cli/src/mobile/ios/run.rs b/crates/tauri-cli/src/mobile/ios/run.rs index 7d18cdb60..6c75c5acc 100644 --- a/crates/tauri-cli/src/mobile/ios/run.rs +++ b/crates/tauri-cli/src/mobile/ios/run.rs @@ -3,7 +3,6 @@ // SPDX-License-Identifier: MIT use std::path::PathBuf; -use std::sync::Mutex; use cargo_mobile2::opts::{NoiseLevel, Profile}; use clap::{ArgAction, Parser}; @@ -11,7 +10,7 @@ use clap::{ArgAction, Parser}; use super::{device_prompt, env}; use crate::{ error::Context, - helpers::config::get_config as get_tauri_config, + helpers::config::{get_config as get_tauri_config, ConfigMetadata}, interface::{DevProcess, Interface, WatcherOptions}, mobile::{DevChild, TargetDevice}, ConfigValue, Result, @@ -98,17 +97,16 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { &dirs, )?; - let cfg = get_tauri_config( + let mut tauri_config = get_tauri_config( tauri_utils::platform::Target::Ios, &options.config.iter().map(|c| &c.0).collect::>(), dirs.tauri, )?; - let tauri_config = Mutex::new(cfg); // options.open is handled by the build command // so all we need to do here is run the app on the selected device if let Some(device) = device { - let runner = move || { + let runner = move |_tauri_config: &ConfigMetadata| { device .run( &built_application.config, @@ -126,10 +124,10 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { }; if options.no_watch { - runner()?; + runner(&tauri_config)?; } else { built_application.interface.watch( - &tauri_config, + &mut tauri_config, WatcherOptions { config: options.config, additional_watch_folders: options.additional_watch_folders, From eccff97588232055bd0cafd83e6ee03d11a501fb Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Sun, 18 Jan 2026 15:01:36 -0300 Subject: [PATCH 104/119] fix(cli): possibly empty associated-domains entitlement (#14779) --- .changes/fix-empty-entitlements.md | 6 ++++++ crates/tauri-cli/src/interface/rust.rs | 18 ++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 .changes/fix-empty-entitlements.md diff --git a/.changes/fix-empty-entitlements.md b/.changes/fix-empty-entitlements.md new file mode 100644 index 000000000..0bc9eea40 --- /dev/null +++ b/.changes/fix-empty-entitlements.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Fix empty associated-domains entitlements when domains are not configured for deep links. diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index 063d6a175..a960ecc9a 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -1454,14 +1454,16 @@ fn tauri_config_to_bundle_settings( .map(tauri_bundler::bundle::Entitlements::Path) } else { let mut app_links_entitlements = plist::Dictionary::new(); - app_links_entitlements.insert( - "com.apple.developer.associated-domains".to_string(), - domains - .into_iter() - .map(|domain| format!("applinks:{domain}").into()) - .collect::>() - .into(), - ); + if !domains.is_empty() { + app_links_entitlements.insert( + "com.apple.developer.associated-domains".to_string(), + domains + .into_iter() + .map(|domain| format!("applinks:{domain}").into()) + .collect::>() + .into(), + ); + } let entitlements = if let Some(user_provided_entitlements) = config.macos.entitlements { crate::helpers::plist::merge_plist(vec![ PathBuf::from(user_provided_entitlements).into(), From 0575dd287e021b61d2aedf64d62ae84a2c925fb4 Mon Sep 17 00:00:00 2001 From: kandrelczyk Date: Sun, 18 Jan 2026 23:51:02 +0100 Subject: [PATCH 105/119] fix(bundler): patch bundle type via string replacement (#14521) Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com> Co-authored-by: FabianLars --- .changes/fix-binary-patching.md | 8 ++ crates/tauri-bundler/src/bundle.rs | 94 +++++++++++-------- crates/tauri-bundler/src/bundle/kmp/mod.rs | 61 ++++++++++++ crates/tauri-bundler/src/bundle/linux/mod.rs | 5 - crates/tauri-bundler/src/bundle/linux/util.rs | 59 ------------ .../tauri-bundler/src/bundle/windows/mod.rs | 2 - .../tauri-bundler/src/bundle/windows/util.rs | 72 -------------- crates/tauri-bundler/src/error.rs | 10 +- crates/tauri-utils/src/platform.rs | 15 ++- 9 files changed, 131 insertions(+), 195 deletions(-) create mode 100644 .changes/fix-binary-patching.md create mode 100644 crates/tauri-bundler/src/bundle/kmp/mod.rs delete mode 100644 crates/tauri-bundler/src/bundle/linux/util.rs diff --git a/.changes/fix-binary-patching.md b/.changes/fix-binary-patching.md new file mode 100644 index 000000000..0778d600f --- /dev/null +++ b/.changes/fix-binary-patching.md @@ -0,0 +1,8 @@ +--- +"tauri": minor:changes +"tauri-cli": minor:changes +"tauri-bundler": minor:changes +"@tauri-apps/cli": minor:changes +--- + +Change the way bundle type information is added to binary files. Instead of looking up the value of a variable we simply look for the default value. diff --git a/crates/tauri-bundler/src/bundle.rs b/crates/tauri-bundler/src/bundle.rs index bac77c041..042a3dfb2 100644 --- a/crates/tauri-bundler/src/bundle.rs +++ b/crates/tauri-bundler/src/bundle.rs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: MIT mod category; +#[cfg(any(target_os = "linux", target_os = "windows"))] +mod kmp; #[cfg(target_os = "linux")] mod linux; #[cfg(target_os = "macos")] @@ -15,29 +17,46 @@ mod windows; use tauri_utils::{display_path, platform::Target as TargetPlatform}; +#[cfg(any(target_os = "linux", target_os = "windows"))] +const BUNDLE_VAR_TOKEN: &[u8] = b"__TAURI_BUNDLE_TYPE_VAR_UNK"; /// Patch a binary with bundle type information +#[cfg(any(target_os = "linux", target_os = "windows"))] fn patch_binary(binary: &PathBuf, package_type: &PackageType) -> crate::Result<()> { - match package_type { - #[cfg(target_os = "linux")] - PackageType::AppImage | PackageType::Deb | PackageType::Rpm => { - log::info!( - "Patching binary {:?} for type {}", - binary, - package_type.short_name() - ); - linux::patch_binary(binary, package_type)?; - } - PackageType::Nsis | PackageType::WindowsMsi => { - log::info!( - "Patching binary {:?} for type {}", - binary, - package_type.short_name() - ); - windows::patch_binary(binary, package_type)?; - } - _ => (), - } + let mut file_data = std::fs::read(binary).expect("Could not read binary file."); + if let Some(bundle_var_index) = kmp::index_of(BUNDLE_VAR_TOKEN, &file_data) { + #[cfg(target_os = "linux")] + let bundle_type = match package_type { + crate::PackageType::Deb => b"__TAURI_BUNDLE_TYPE_VAR_DEB", + crate::PackageType::Rpm => b"__TAURI_BUNDLE_TYPE_VAR_RPM", + crate::PackageType::AppImage => b"__TAURI_BUNDLE_TYPE_VAR_APP", + _ => { + return Err(crate::Error::InvalidPackageType( + package_type.short_name().to_owned(), + "Linux".to_owned(), + )) + } + }; + #[cfg(target_os = "windows")] + let bundle_type = match package_type { + crate::PackageType::Nsis => b"__TAURI_BUNDLE_TYPE_VAR_NSS", + crate::PackageType::WindowsMsi => b"__TAURI_BUNDLE_TYPE_VAR_MSI", + _ => { + return Err(crate::Error::InvalidPackageType( + package_type.short_name().to_owned(), + "Windows".to_owned(), + )) + } + }; + + file_data[bundle_var_index..bundle_var_index + BUNDLE_VAR_TOKEN.len()] + .copy_from_slice(bundle_type); + + std::fs::write(binary, &file_data) + .map_err(|e| crate::Error::BinaryWriteError(e.to_string()))?; + } else { + return Err(crate::Error::MissingBundleTypeVar); + } Ok(()) } @@ -92,22 +111,17 @@ pub fn bundle_project(settings: &Settings) -> crate::Result> { .expect("Main binary missing in settings"); let main_binary_path = settings.binary_path(main_binary); - // When packaging multiple binary types, we make a copy of the unsigned main_binary so that we can - // restore it after each package_type step. This avoids two issues: + // We make a copy of the unsigned main_binary so that we can restore it after each package_type step. + // This allows us to patch the binary correctly and avoids two issues: // - modifying a signed binary without updating its PE checksum can break signature verification // - codesigning tools should handle calculating+updating this, we just need to ensure // (re)signing is performed after every `patch_binary()` operation // - signing an already-signed binary can result in multiple signatures, causing verification errors - let main_binary_reset_required = matches!(target_os, TargetPlatform::Windows) - && settings.windows().can_sign() - && package_types.len() > 1; - let mut unsigned_main_binary_copy = tempfile::tempfile()?; - if main_binary_reset_required { - let mut unsigned_main_binary = std::fs::File::open(&main_binary_path)?; - std::io::copy(&mut unsigned_main_binary, &mut unsigned_main_binary_copy)?; - } + // TODO: change this to work on a copy while preserving the main binary unchanged + let mut main_binary_copy = tempfile::tempfile()?; + let mut main_binary_orignal = std::fs::File::open(&main_binary_path)?; + std::io::copy(&mut main_binary_orignal, &mut main_binary_copy)?; - let mut main_binary_signed = false; let mut bundles = Vec::::new(); for package_type in &package_types { // bundle was already built! e.g. DMG already built .app @@ -115,22 +129,14 @@ pub fn bundle_project(settings: &Settings) -> crate::Result> { continue; } + #[cfg(any(target_os = "linux", target_os = "windows"))] if let Err(e) = patch_binary(&main_binary_path, package_type) { log::warn!("Failed to add bundler type to the binary: {e}. Updater plugin may not be able to update this package. This shouldn't normally happen, please report it to https://github.com/tauri-apps/tauri/issues"); } // sign main binary for every package type after patch if matches!(target_os, TargetPlatform::Windows) && settings.windows().can_sign() { - if main_binary_signed && main_binary_reset_required { - let mut signed_main_binary = std::fs::OpenOptions::new() - .write(true) - .truncate(true) - .open(&main_binary_path)?; - unsigned_main_binary_copy.seek(SeekFrom::Start(0))?; - std::io::copy(&mut unsigned_main_binary_copy, &mut signed_main_binary)?; - } windows::sign::try_sign(&main_binary_path, settings)?; - main_binary_signed = true; } let bundle_paths = match package_type { @@ -172,6 +178,14 @@ pub fn bundle_project(settings: &Settings) -> crate::Result> { package_type: package_type.to_owned(), bundle_paths, }); + + // Restore unsigned and unpatched binary + let mut modified_main_binary = std::fs::OpenOptions::new() + .write(true) + .truncate(true) + .open(&main_binary_path)?; + main_binary_copy.seek(SeekFrom::Start(0))?; + std::io::copy(&mut main_binary_copy, &mut modified_main_binary)?; } if let Some(updater) = settings.updater() { diff --git a/crates/tauri-bundler/src/bundle/kmp/mod.rs b/crates/tauri-bundler/src/bundle/kmp/mod.rs new file mode 100644 index 000000000..3e8489023 --- /dev/null +++ b/crates/tauri-bundler/src/bundle/kmp/mod.rs @@ -0,0 +1,61 @@ +// Copyright 2016-2019 Cargo-Bundle developers +// Copyright 2019-2024 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +// Knuth–Morris–Pratt algorithm +// based on https://github.com/howeih/rust_kmp +#[cfg(any(target_os = "linux", target_os = "windows"))] +pub fn index_of(pattern: &[u8], target: &[u8]) -> Option { + let failure_function = find_failure_function(pattern); + + let mut t_i: usize = 0; + let mut p_i: usize = 0; + let target_len = target.len(); + let mut result_idx = None; + let pattern_len = pattern.len(); + + while (t_i < target_len) && (p_i < pattern_len) { + if target[t_i] == pattern[p_i] { + if result_idx.is_none() { + result_idx.replace(t_i); + } + t_i += 1; + p_i += 1; + if p_i >= pattern_len { + return result_idx; + } + } else { + if p_i == 0 { + p_i = 0; + t_i += 1; + } else { + p_i = failure_function[p_i - 1]; + } + result_idx = None; + } + } + None +} + +#[cfg(any(target_os = "linux", target_os = "windows"))] +fn find_failure_function(pattern: &[u8]) -> Vec { + let mut i = 1; + let mut j = 0; + let pattern_length = pattern.len(); + let end_i = pattern_length - 1; + let mut failure_function = vec![0usize; pattern_length]; + while i <= end_i { + if pattern[i] == pattern[j] { + failure_function[i] = j + 1; + i += 1; + j += 1; + } else if j == 0 { + failure_function[i] = 0; + i += 1; + } else { + j = failure_function[j - 1]; + } + } + failure_function +} diff --git a/crates/tauri-bundler/src/bundle/linux/mod.rs b/crates/tauri-bundler/src/bundle/linux/mod.rs index ba66a8d39..8459b0528 100644 --- a/crates/tauri-bundler/src/bundle/linux/mod.rs +++ b/crates/tauri-bundler/src/bundle/linux/mod.rs @@ -7,8 +7,3 @@ pub mod appimage; pub mod debian; pub mod freedesktop; pub mod rpm; - -mod util; - -#[cfg(target_os = "linux")] -pub use util::patch_binary; diff --git a/crates/tauri-bundler/src/bundle/linux/util.rs b/crates/tauri-bundler/src/bundle/linux/util.rs deleted file mode 100644 index be1256295..000000000 --- a/crates/tauri-bundler/src/bundle/linux/util.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019-2024 Tauri Programme within The Commons Conservancy -// SPDX-License-Identifier: Apache-2.0 -// SPDX-License-Identifier: MIT - -/// Change value of __TAURI_BUNDLE_TYPE static variable to mark which package type it was bundled in -#[cfg(target_os = "linux")] -pub fn patch_binary( - binary_path: &std::path::PathBuf, - package_type: &crate::PackageType, -) -> crate::Result<()> { - let mut file_data = std::fs::read(binary_path).expect("Could not read binary file."); - - let elf = match goblin::Object::parse(&file_data)? { - goblin::Object::Elf(elf) => elf, - _ => return Err(crate::Error::GenericError("Not an ELF file".to_owned())), - }; - - let offset = find_bundle_type_symbol(elf).ok_or(crate::Error::MissingBundleTypeVar)?; - let offset = offset as usize; - if offset + 3 <= file_data.len() { - let chars = &mut file_data[offset..offset + 3]; - match package_type { - crate::PackageType::Deb => chars.copy_from_slice(b"DEB"), - crate::PackageType::Rpm => chars.copy_from_slice(b"RPM"), - crate::PackageType::AppImage => chars.copy_from_slice(b"APP"), - _ => { - return Err(crate::Error::InvalidPackageType( - package_type.short_name().to_owned(), - "linux".to_owned(), - )) - } - } - - std::fs::write(binary_path, &file_data) - .map_err(|error| crate::Error::BinaryWriteError(error.to_string()))?; - } else { - return Err(crate::Error::BinaryOffsetOutOfRange); - } - - Ok(()) -} - -/// Find address of a symbol in relocations table -#[cfg(target_os = "linux")] -fn find_bundle_type_symbol(elf: goblin::elf::Elf<'_>) -> Option { - for sym in elf.syms.iter() { - if let Some(name) = elf.strtab.get_at(sym.st_name) { - if name == "__TAURI_BUNDLE_TYPE" { - for reloc in elf.dynrelas.iter() { - if reloc.r_offset == sym.st_value { - return Some(reloc.r_addend.unwrap()); - } - } - } - } - } - - None -} diff --git a/crates/tauri-bundler/src/bundle/windows/mod.rs b/crates/tauri-bundler/src/bundle/windows/mod.rs index 366e000e1..b92fb5f56 100644 --- a/crates/tauri-bundler/src/bundle/windows/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/mod.rs @@ -14,5 +14,3 @@ pub use util::{ NSIS_OUTPUT_FOLDER_NAME, NSIS_UPDATER_OUTPUT_FOLDER_NAME, WIX_OUTPUT_FOLDER_NAME, WIX_UPDATER_OUTPUT_FOLDER_NAME, }; - -pub use util::patch_binary; diff --git a/crates/tauri-bundler/src/bundle/windows/util.rs b/crates/tauri-bundler/src/bundle/windows/util.rs index 3685d0c06..55cfea3a9 100644 --- a/crates/tauri-bundler/src/bundle/windows/util.rs +++ b/crates/tauri-bundler/src/bundle/windows/util.rs @@ -77,75 +77,3 @@ pub fn os_bitness<'a>() -> Option<&'a str> { _ => None, } } - -pub fn patch_binary(binary_path: &PathBuf, package_type: &crate::PackageType) -> crate::Result<()> { - let mut file_data = std::fs::read(binary_path)?; - - let pe = match goblin::Object::parse(&file_data)? { - goblin::Object::PE(pe) => pe, - _ => { - return Err(crate::Error::BinaryParseError( - std::io::Error::new(std::io::ErrorKind::InvalidInput, "binary is not a PE file").into(), - )); - } - }; - - let tauri_bundle_section = pe - .sections - .iter() - .find(|s| s.name().unwrap_or_default() == ".taubndl") - .ok_or(crate::Error::MissingBundleTypeVar)?; - - let data_offset = tauri_bundle_section.pointer_to_raw_data as usize; - let pointer_size = if pe.is_64 { 8 } else { 4 }; - let ptr_bytes = file_data - .get(data_offset..data_offset + pointer_size) - .ok_or(crate::Error::BinaryOffsetOutOfRange)?; - // `try_into` is safe to `unwrap` here because we have already checked the slice's size through `get` - let ptr_value = if pe.is_64 { - u64::from_le_bytes(ptr_bytes.try_into().unwrap()) - } else { - u32::from_le_bytes(ptr_bytes.try_into().unwrap()).into() - }; - - let rdata_section = pe - .sections - .iter() - .find(|s| s.name().unwrap_or_default() == ".rdata") - .ok_or_else(|| { - crate::Error::BinaryParseError( - std::io::Error::new(std::io::ErrorKind::InvalidInput, ".rdata section not found").into(), - ) - })?; - - let rva = ptr_value.checked_sub(pe.image_base as u64).ok_or_else(|| { - crate::Error::BinaryParseError( - std::io::Error::new(std::io::ErrorKind::InvalidData, "invalid RVA offset").into(), - ) - })?; - - // see "Relative virtual address (RVA)" for explanation of offset arithmetic here: - // https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#general-concepts - let file_offset = rdata_section.pointer_to_raw_data as usize - + (rva as usize).saturating_sub(rdata_section.virtual_address as usize); - - // Overwrite the string at that offset - let string_bytes = file_data - .get_mut(file_offset..file_offset + 3) - .ok_or(crate::Error::BinaryOffsetOutOfRange)?; - match package_type { - crate::PackageType::Nsis => string_bytes.copy_from_slice(b"NSS"), - crate::PackageType::WindowsMsi => string_bytes.copy_from_slice(b"MSI"), - _ => { - return Err(crate::Error::InvalidPackageType( - package_type.short_name().to_owned(), - "windows".to_owned(), - )); - } - } - - std::fs::write(binary_path, &file_data) - .map_err(|e| crate::Error::BinaryWriteError(e.to_string()))?; - - Ok(()) -} diff --git a/crates/tauri-bundler/src/error.rs b/crates/tauri-bundler/src/error.rs index 518cb6ca9..40547a3ee 100644 --- a/crates/tauri-bundler/src/error.rs +++ b/crates/tauri-bundler/src/error.rs @@ -99,19 +99,13 @@ pub enum Error { #[error("Wrong package type {0} for platform {1}")] InvalidPackageType(String, String), /// Bundle type symbol missing in binary - #[cfg_attr( - target_os = "linux", - error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date and that symbol stripping is disabled (https://doc.rust-lang.org/cargo/reference/profiles.html#strip)") - )] - #[cfg_attr( - not(target_os = "linux"), - error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date") - )] + #[error("__TAURI_BUNDLE_TYPE variable not found in binary. Make sure tauri crate and tauri-cli are up to date")] MissingBundleTypeVar, /// Failed to write binary file changed #[error("Failed to write binary file changes: `{0}`")] BinaryWriteError(String), /// Invalid offset while patching binary file + #[deprecated] #[error("Invalid offset while patching binary file")] BinaryOffsetOutOfRange, /// Unsupported architecture. diff --git a/crates/tauri-utils/src/platform.rs b/crates/tauri-utils/src/platform.rs index 2ace45790..6eaaf3ffe 100644 --- a/crates/tauri-utils/src/platform.rs +++ b/crates/tauri-utils/src/platform.rs @@ -344,23 +344,20 @@ fn resource_dir_from>( // Variable holding the type of bundle the executable is stored in. This is modified by binary // patching during build #[used] -#[no_mangle] -#[cfg_attr(not(target_vendor = "apple"), link_section = ".taubndl")] -#[cfg_attr(target_vendor = "apple", link_section = "__DATA,taubndl")] // Marked as `mut` because it could get optimized away without it, // see https://github.com/tauri-apps/tauri/pull/13812 -static mut __TAURI_BUNDLE_TYPE: &str = "UNK"; +static mut __TAURI_BUNDLE_TYPE: &str = "__TAURI_BUNDLE_TYPE_VAR_UNK"; /// Get the type of the bundle current binary is packaged in. /// If the bundle type is unknown, it returns [`Option::None`]. pub fn bundle_type() -> Option { unsafe { match __TAURI_BUNDLE_TYPE { - "DEB" => Some(BundleType::Deb), - "RPM" => Some(BundleType::Rpm), - "APP" => Some(BundleType::AppImage), - "MSI" => Some(BundleType::Msi), - "NSS" => Some(BundleType::Nsis), + "__TAURI_BUNDLE_TYPE_VAR_DEB" => Some(BundleType::Deb), + "__TAURI_BUNDLE_TYPE_VAR_RPM" => Some(BundleType::Rpm), + "__TAURI_BUNDLE_TYPE_VAR_APP" => Some(BundleType::AppImage), + "__TAURI_BUNDLE_TYPE_VAR_MSI" => Some(BundleType::Msi), + "__TAURI_BUNDLE_TYPE_VAR_NSS" => Some(BundleType::Nsis), _ => { if cfg!(target_os = "macos") { Some(BundleType::App) From e919a760edfc115f9e4b5d841e29cc38d5535ed1 Mon Sep 17 00:00:00 2001 From: Luke Date: Mon, 19 Jan 2026 12:38:37 +0900 Subject: [PATCH 106/119] feat(webview-window): add set_simple_fullscreen to WebviewWindow (#14619) * feat(webview): add set_simple_fullscreen to WebviewWindow * add changes * Combine per platform fn to one --------- Co-authored-by: Tony --- .changes/webview-set-simple-fullscreen.md | 7 +++++ crates/tauri/src/webview/mod.rs | 21 +++++++++++++ crates/tauri/src/webview/webview_window.rs | 14 +++++++++ crates/tauri/src/window/mod.rs | 36 ++++++++++++---------- 4 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 .changes/webview-set-simple-fullscreen.md diff --git a/.changes/webview-set-simple-fullscreen.md b/.changes/webview-set-simple-fullscreen.md new file mode 100644 index 000000000..ba0cdf8bf --- /dev/null +++ b/.changes/webview-set-simple-fullscreen.md @@ -0,0 +1,7 @@ +--- +'tauri': 'minor:feat' +--- + +Add `set_simple_fullscreen` method to `WebviewWindow`. + +This method was already available on the `Window` type and is now also available on `WebviewWindow` for consistency. On macOS, it toggles fullscreen mode without creating a new macOS Space. On other platforms, it falls back to regular fullscreen. diff --git a/crates/tauri/src/webview/mod.rs b/crates/tauri/src/webview/mod.rs index 4df09182a..8842382bf 100644 --- a/crates/tauri/src/webview/mod.rs +++ b/crates/tauri/src/webview/mod.rs @@ -2312,4 +2312,25 @@ mod tests { crate::test_utils::assert_send::(); crate::test_utils::assert_sync::(); } + + #[cfg(target_os = "macos")] + #[test] + fn test_webview_window_has_set_simple_fullscreen_method() { + use crate::test::{mock_builder, mock_context, noop_assets}; + + // Create a mock app with proper context + let app = mock_builder().build(mock_context(noop_assets())).unwrap(); + + // Get or create a webview window + let webview_window = + crate::WebviewWindowBuilder::new(&app, "test", crate::WebviewUrl::default()) + .build() + .unwrap(); + + // This should compile if set_simple_fullscreen exists + let result = webview_window.set_simple_fullscreen(true); + + // We expect this to work without panicking + assert!(result.is_ok(), "set_simple_fullscreen should succeed"); + } } diff --git a/crates/tauri/src/webview/webview_window.rs b/crates/tauri/src/webview/webview_window.rs index 92b033b06..290730067 100644 --- a/crates/tauri/src/webview/webview_window.rs +++ b/crates/tauri/src/webview/webview_window.rs @@ -2057,6 +2057,20 @@ impl WebviewWindow { self.window.set_fullscreen(fullscreen) } + /// Toggles a fullscreen mode that doesn't require a new macOS space. + /// Returns a boolean indicating whether the transition was successful (this won't work if the window was already in the native fullscreen). + /// + /// This is how fullscreen used to work on macOS in versions before Lion. + /// And allows the user to have a fullscreen window without using another space or taking control over the entire monitor. + /// + /// ## Platform-specific + /// + /// - **macOS:** Uses native simple fullscreen mode. + /// - **Other platforms:** Falls back to [`Self::set_fullscreen`]. + pub fn set_simple_fullscreen(&self, enable: bool) -> crate::Result<()> { + self.window.set_simple_fullscreen(enable) + } + /// Bring the window to front and focus. pub fn set_focus(&self) -> crate::Result<()> { self.window.set_focus() diff --git a/crates/tauri/src/window/mod.rs b/crates/tauri/src/window/mod.rs index a67784cc3..47c95628b 100644 --- a/crates/tauri/src/window/mod.rs +++ b/crates/tauri/src/window/mod.rs @@ -1968,25 +1968,27 @@ tauri::Builder::default() .map_err(Into::into) } - /// Toggles a fullscreen mode that doesn’t require a new macOS space. Returns a boolean indicating whether the transition was successful (this won’t work if the window was already in the native fullscreen). + /// Toggles a fullscreen mode that doesn't require a new macOS space. + /// Returns a boolean indicating whether the transition was successful (this won't work if the window was already in the native fullscreen). /// - /// This is how fullscreen used to work on macOS in versions before Lion. And allows the user to have a fullscreen window without using another space or taking control over the entire monitor. - #[cfg(target_os = "macos")] + /// This is how fullscreen used to work on macOS in versions before Lion. + /// And allows the user to have a fullscreen window without using another space or taking control over the entire monitor. + /// + /// ## Platform-specific + /// + /// - **macOS:** Uses native simple fullscreen mode. + /// - **Other platforms:** Falls back to [`Self::set_fullscreen`]. pub fn set_simple_fullscreen(&self, enable: bool) -> crate::Result<()> { - self - .window - .dispatcher - .set_simple_fullscreen(enable) - .map_err(Into::into) - } - - /// On macOS, Toggles a fullscreen mode that doesn’t require a new macOS space. Returns a boolean indicating whether the transition was successful (this won’t work if the window was already in the native fullscreen). - /// This is how fullscreen used to work on macOS in versions before Lion. And allows the user to have a fullscreen window without using another space or taking control over the entire monitor. - /// - /// On other platforms, this is the same as [`Window#method.set_fullscreen`]. - #[cfg(not(target_os = "macos"))] - pub fn set_simple_fullscreen(&self, fullscreen: bool) -> crate::Result<()> { - self.set_fullscreen(fullscreen) + #[cfg(target_os = "macos")] + { + self + .window + .dispatcher + .set_simple_fullscreen(enable) + .map_err(Into::into) + } + #[cfg(not(target_os = "macos"))] + self.set_fullscreen(enable) } /// Bring the window to front and focus. From 62aa13a124ef46bb5ce9887a2a574dd35ef86d4f Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Mon, 19 Jan 2026 16:32:43 -0300 Subject: [PATCH 107/119] fix(cli): Android build --apk and --aab flags requiring a value (#14629) Co-authored-by: Fabian-Lars --- .changes/fix-android-bundle-flag.md | 6 ++++++ crates/tauri-cli/src/mobile/android/build.rs | 16 +++++++++------- crates/tauri-cli/src/mobile/android/run.rs | 5 +++-- 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 .changes/fix-android-bundle-flag.md diff --git a/.changes/fix-android-bundle-flag.md b/.changes/fix-android-bundle-flag.md new file mode 100644 index 000000000..1fc06e69e --- /dev/null +++ b/.changes/fix-android-bundle-flag.md @@ -0,0 +1,6 @@ +--- +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Fix `android build`'s `--aab` and `--apk` flags requiring a value to be provided. diff --git a/crates/tauri-cli/src/mobile/android/build.rs b/crates/tauri-cli/src/mobile/android/build.rs index 5e5e7cd62..7b85ef47d 100644 --- a/crates/tauri-cli/src/mobile/android/build.rs +++ b/crates/tauri-cli/src/mobile/android/build.rs @@ -64,10 +64,12 @@ pub struct Options { pub split_per_abi: bool, /// Build APKs. #[clap(long)] - pub apk: Option, + pub apk: bool, /// Build AABs. #[clap(long)] - pub aab: Option, + pub aab: bool, + #[clap(skip)] + pub skip_bundle: bool, /// Open Android Studio #[clap(short, long)] pub open: bool, @@ -242,10 +244,10 @@ fn run_build( noise_level: NoiseLevel, tauri_dir: &Path, ) -> Result { - if !(options.apk.is_some() || options.aab.is_some()) { + if !(options.skip_bundle || options.apk || options.aab) { // if the user didn't specify the format to build, we'll do both - options.apk = Some(true); - options.aab = Some(true); + options.apk = true; + options.aab = true; } let interface_options = InterfaceOptions { @@ -272,7 +274,7 @@ fn run_build( inject_resources(config, tauri_config)?; - let apk_outputs = if options.apk.unwrap_or_default() { + let apk_outputs = if options.apk { apk::build( config, env, @@ -286,7 +288,7 @@ fn run_build( Vec::new() }; - let aab_outputs = if options.aab.unwrap_or_default() { + let aab_outputs = if options.aab { aab::build( config, env, diff --git a/crates/tauri-cli/src/mobile/android/run.rs b/crates/tauri-cli/src/mobile/android/run.rs index 736ca84d6..c07c6ba6d 100644 --- a/crates/tauri-cli/src/mobile/android/run.rs +++ b/crates/tauri-cli/src/mobile/android/run.rs @@ -101,8 +101,9 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { features: options.features, config: options.config.clone(), split_per_abi: true, - apk: Some(false), - aab: Some(false), + apk: false, + aab: false, + skip_bundle: false, open: options.open, ci: false, args: options.args, From 53611c4d7bdaf89b9a5d7c46a9c4bf4e34216148 Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Tue, 20 Jan 2026 17:52:34 +0800 Subject: [PATCH 108/119] fix(cli): only watch dependent workspace members (#14747) * fix(cli): only watch dependent workspace members * Use manifest path instead of `workspace_default_members` * Add change file * Merge remote-tracking branch 'upstream/dev' into only-watch-dependencies * `bug` not `fix` * Merge branch 'dev' into only-watch-dependencies * Remove `CargoMetadataExpended` * Merge remote-tracking branch 'upstream/dev' into only-watch-dependencies * Remove top level `.taurignore` * Load ignore files from workspace root --- .changes/only-watch-dependencies.md | 6 ++ .taurignore | 16 ---- crates/tauri-cli/src/interface/rust.rs | 123 ++++++++++++++++--------- 3 files changed, 88 insertions(+), 57 deletions(-) create mode 100644 .changes/only-watch-dependencies.md delete mode 100644 .taurignore diff --git a/.changes/only-watch-dependencies.md b/.changes/only-watch-dependencies.md new file mode 100644 index 000000000..e638cb591 --- /dev/null +++ b/.changes/only-watch-dependencies.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:bug +"tauri-cli": patch:bug +--- + +Only watch dependent workspace members when running `tauri dev` instead of watching on all members diff --git a/.taurignore b/.taurignore deleted file mode 100644 index 6e49b1ea8..000000000 --- a/.taurignore +++ /dev/null @@ -1,16 +0,0 @@ -.changes -.devcontainer -.docker -.github -.scripts -.vscode -audits -bench -packages/api -packages/cli -crates/tauri-cli -crates/tauri-bundler -crates/tauri-driver -crates/tauri-macos-sign -crates/tauri-schema-generator -crates/tests diff --git a/crates/tauri-cli/src/interface/rust.rs b/crates/tauri-cli/src/interface/rust.rs index a960ecc9a..3878b8845 100644 --- a/crates/tauri-cli/src/interface/rust.rs +++ b/crates/tauri-cli/src/interface/rust.rs @@ -7,6 +7,7 @@ use std::{ ffi::OsStr, fs::FileType, io::{BufRead, Write}, + iter::once, path::{Path, PathBuf}, process::Command, str::FromStr, @@ -15,7 +16,6 @@ use std::{ }; use dunce::canonicalize; -use glob::glob; use ignore::gitignore::{Gitignore, GitignoreBuilder}; use notify::RecursiveMode; use notify_debouncer_full::new_debouncer; @@ -449,25 +449,15 @@ fn dev_options( } } -// Copied from https://github.com/rust-lang/cargo/blob/69255bb10de7f74511b5cef900a9d102247b6029/src/cargo/core/workspace.rs#L665 -fn expand_member_path(path: &Path) -> crate::Result> { - let path = path.to_str().context("path is not UTF-8 compatible")?; - let res = glob(path).with_context(|| format!("failed to expand glob pattern for {path}"))?; - let res = res - .map(|p| p.with_context(|| format!("failed to expand glob pattern for {path}"))) - .collect::, _>>()?; - Ok(res) -} - fn get_watch_folders( additional_watch_folders: &[PathBuf], tauri_dir: &Path, ) -> crate::Result> { - let workspace_path = get_workspace_dir(tauri_dir)?; - // We always want to watch the main tauri folder. let mut watch_folders = vec![tauri_dir.to_path_buf()]; + watch_folders.extend(get_in_workspace_dependency_paths(tauri_dir)?); + // Add the additional watch folders, resolving the path from the tauri path if it is relative watch_folders.extend(additional_watch_folders.iter().filter_map(|dir| { let path = if dir.is_absolute() { @@ -486,30 +476,6 @@ fn get_watch_folders( canonicalized })); - // We also try to watch workspace members, no matter if the tauri cargo project is the workspace root or a workspace member - let cargo_settings = CargoSettings::load(&workspace_path)?; - if let Some(members) = cargo_settings.workspace.and_then(|w| w.members) { - for p in members { - let p = workspace_path.join(p); - match expand_member_path(&p) { - // Sometimes expand_member_path returns an empty vec, for example if the path contains `[]` as in `C:/[abc]/project/`. - // Cargo won't complain unless theres a workspace.members config with glob patterns so we should support it too. - Ok(expanded_paths) => { - if expanded_paths.is_empty() { - watch_folders.push(p); - } else { - watch_folders.extend(expanded_paths); - } - } - Err(err) => { - // If this fails cargo itself should fail too. But we still try to keep going with the unexpanded path. - log::error!("Error watching {}: {}", p.display(), err); - watch_folders.push(p); - } - }; - } - } - Ok(watch_folders) } @@ -556,8 +522,13 @@ impl Rust { let watch_folders = get_watch_folders(additional_watch_folders, dirs.tauri)?; - let common_ancestor = common_path::common_path_all(watch_folders.iter().map(Path::new)) - .expect("watch_folders should not be empty"); + let common_ancestor = common_path::common_path_all( + watch_folders + .iter() + .map(Path::new) + .chain(once(self.app_settings.workspace_dir.as_path())), + ) + .expect("watch_folders should not be empty"); let ignore_matcher = build_ignore_matcher(&common_ancestor); let mut watcher = new_debouncer(Duration::from_secs(1), None, move |r| { @@ -692,7 +663,7 @@ pub struct TomlWorkspaceField { #[derive(Clone, Debug, Deserialize)] struct WorkspaceSettings { /// the workspace members. - members: Option>, + // members: Option>, package: Option, } @@ -779,6 +750,7 @@ pub struct RustAppSettings { cargo_config: CargoConfig, target_triple: String, target_platform: TargetPlatform, + workspace_dir: PathBuf, } #[derive(Deserialize)] @@ -1096,7 +1068,8 @@ impl RustAppSettings { } }; - let ws_package_settings = CargoSettings::load(&get_workspace_dir(tauri_dir)?) + let workspace_dir = get_workspace_dir(tauri_dir)?; + let ws_package_settings = CargoSettings::load(&workspace_dir) .context("failed to load Cargo settings from workspace root")? .workspace .and_then(|v| v.package); @@ -1191,6 +1164,7 @@ impl RustAppSettings { cargo_config, target_triple, target_platform, + workspace_dir, }) } @@ -1210,6 +1184,23 @@ impl RustAppSettings { pub(crate) struct CargoMetadata { pub(crate) target_directory: PathBuf, pub(crate) workspace_root: PathBuf, + workspace_members: Vec, + packages: Vec, +} + +#[derive(Deserialize)] +struct Package { + name: String, + id: String, + manifest_path: PathBuf, + dependencies: Vec, +} + +#[derive(Deserialize)] +struct Dependency { + name: String, + /// Local package + path: Option, } pub(crate) fn get_cargo_metadata(tauri_dir: &Path) -> crate::Result { @@ -1232,6 +1223,56 @@ pub(crate) fn get_cargo_metadata(tauri_dir: &Path) -> crate::Result crate::Result> { + let metadata = get_cargo_metadata(tauri_dir)?; + let tauri_project_manifest_path = tauri_dir.join("Cargo.toml"); + let tauri_project_package = metadata + .packages + .iter() + .find(|package| package.manifest_path == tauri_project_manifest_path) + .context("tauri project package doesn't exist in cargo metadata output `packages`")?; + + let workspace_packages = metadata + .workspace_members + .iter() + .map(|member_package_id| { + metadata + .packages + .iter() + .find(|package| package.id == *member_package_id) + .context("workspace member doesn't exist in cargo metadata output `packages`") + }) + .collect::>>()?; + + let mut found_dependency_paths = Vec::new(); + find_dependencies( + tauri_project_package, + &workspace_packages, + &mut found_dependency_paths, + ); + Ok(found_dependency_paths) +} + +fn find_dependencies( + package: &Package, + workspace_packages: &Vec<&Package>, + found_dependency_paths: &mut Vec, +) { + for dependency in &package.dependencies { + if let Some(path) = &dependency.path { + if let Some(package) = workspace_packages.iter().find(|workspace_package| { + workspace_package.name == dependency.name + && path.join("Cargo.toml") == workspace_package.manifest_path + && !found_dependency_paths.contains(path) + }) { + found_dependency_paths.push(path.to_owned()); + find_dependencies(package, workspace_packages, found_dependency_paths); + } + } + } +} + /// Get the cargo target directory based on the provided arguments. /// If "--target-dir" is specified in args, use it as the target directory (relative to current directory). /// Otherwise, use the target directory from cargo metadata. From 853ed4642ff77154ccd380dd9289d90815d42691 Mon Sep 17 00:00:00 2001 From: Ishita Singh Date: Wed, 21 Jan 2026 02:22:11 +0530 Subject: [PATCH 109/119] fix(android): improve error handling for external storage file access (#14442) Co-authored-by: Fabian-Lars --- .changes/android-external-files-fix.md | 5 +++++ crates/tauri/src/protocol/asset.rs | 24 ++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 .changes/android-external-files-fix.md diff --git a/.changes/android-external-files-fix.md b/.changes/android-external-files-fix.md new file mode 100644 index 000000000..b6c2a1446 --- /dev/null +++ b/.changes/android-external-files-fix.md @@ -0,0 +1,5 @@ +--- +"tauri": patch:bug +--- + +Fixed 500 error when accessing local video files in Android external storage directory via `convertFileSrc`. Added better error handling and logging for Android external storage access to help diagnose permission and accessibility issues. \ No newline at end of file diff --git a/crates/tauri/src/protocol/asset.rs b/crates/tauri/src/protocol/asset.rs index a5007d294..e7c713324 100644 --- a/crates/tauri/src/protocol/asset.rs +++ b/crates/tauri/src/protocol/asset.rs @@ -48,9 +48,29 @@ fn get_response( return resp.status(403).body(Vec::new().into()).map_err(Into::into); } - let (mut file, len, mime_type, read_bytes) = crate::async_runtime::safe_block_on(async move { - let mut file = File::open(&path).await?; + // Separate block for easier error handling + let mut file = match crate::async_runtime::safe_block_on(File::open(path.clone())) { + Ok(file) => file, + Err(e) => { + #[cfg(target_os = "android")] + { + if path.starts_with("/storage/emulated/0/Android/data/") { + log::error!("Failed to open Android external storage file '{}': {}. This may be due to missing storage permissions.", path, e); + } + } + return if e.kind() == std::io::ErrorKind::NotFound { + log::error!("File does not exist at path: {}", path); + return resp.status(404).body(Vec::new().into()).map_err(Into::into); + } else if e.kind() == std::io::ErrorKind::PermissionDenied { + log::error!("Missing OS permission to access path \"{}\": {}", path, e); + return resp.status(403).body(Vec::new().into()).map_err(Into::into); + } else { + Err(e.into()) + }; + } + }; + let (mut file, len, mime_type, read_bytes) = crate::async_runtime::safe_block_on(async move { // get file length let len = { let old_pos = file.stream_position().await?; From f82594410cd57d6f794f58d4afea0ed335aa796f Mon Sep 17 00:00:00 2001 From: Quentin Goinaud Date: Tue, 20 Jan 2026 22:19:05 +0100 Subject: [PATCH 110/119] feat(cli): allow electron to start tauri (#13253) Co-authored-by: Lucas Fernandes Nogueira --- .changes/change-pr-13253.md | 6 ++++++ packages/cli/tauri.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changes/change-pr-13253.md diff --git a/.changes/change-pr-13253.md b/.changes/change-pr-13253.md new file mode 100644 index 000000000..e42a66072 --- /dev/null +++ b/.changes/change-pr-13253.md @@ -0,0 +1,6 @@ +--- +"@tauri-apps/cli": patch:enhance +"tauri-cli": patch:enhance +--- + +Allow electron to run the CLI directly diff --git a/packages/cli/tauri.js b/packages/cli/tauri.js index d0460573b..452202cbb 100644 --- a/packages/cli/tauri.js +++ b/packages/cli/tauri.js @@ -20,7 +20,7 @@ if (globalThis.navigator?.userAgent?.includes('Deno')) { } // Even if started by a package manager, the binary will be NodeJS. // Some distribution still use "nodejs" as the binary name. -else if (binStem.match(/(nodejs|node|bun)\-?([0-9]*)*$/g)) { +else if (binStem.match(/(nodejs|node|bun|electron)\-?([0-9]*)*$/g)) { const managerStem = process.env.npm_execpath ? path.parse(process.env.npm_execpath).name.toLowerCase() : null From c862a0bd8c30a7b5454d3c54a1b7a81ddb1ef1a5 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 21 Jan 2026 03:42:15 +0100 Subject: [PATCH 111/119] fix(core): update error wording for invalid version field (#14800) * fix(core): update error wording for invalid version field fixes #14799 * fmt --- crates/tauri-utils/src/config.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/tauri-utils/src/config.rs b/crates/tauri-utils/src/config.rs index 4350398d0..8826e3f51 100644 --- a/crates/tauri-utils/src/config.rs +++ b/crates/tauri-utils/src/config.rs @@ -3164,18 +3164,20 @@ impl<'d> serde::Deserialize<'d> for PackageVersion { })?; Ok(PackageVersion( Version::from_str(version) - .map_err(|_| DeError::custom("`package > version` must be a semver string"))? + .map_err(|_| { + DeError::custom("`tauri.conf.json > version` must be a semver string") + })? .to_string(), )) } else { Err(DeError::custom( - "`package > version` value is not a path to a JSON object", + "`tauri.conf.json > version` value is not a path to a JSON object", )) } } else { Ok(PackageVersion( Version::from_str(value) - .map_err(|_| DeError::custom("`package > version` must be a semver string"))? + .map_err(|_| DeError::custom("`tauri.conf.json > version` must be a semver string"))? .to_string(), )) } From 09a4e7f55a267568628c2a1c661a53c9d6f62515 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:06:29 +0100 Subject: [PATCH 112/119] chore(deps-dev): bump wrangler from 4.20.3 to 4.59.1 (#14806) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- crates/tauri-schema-worker/package.json | 2 +- pnpm-lock.yaml | 839 ++++++++++++++++-------- 2 files changed, 575 insertions(+), 266 deletions(-) diff --git a/crates/tauri-schema-worker/package.json b/crates/tauri-schema-worker/package.json index 9b357db3f..d932ee878 100644 --- a/crates/tauri-schema-worker/package.json +++ b/crates/tauri-schema-worker/package.json @@ -8,6 +8,6 @@ "dev": "wrangler dev" }, "devDependencies": { - "wrangler": "^4.20.3" + "wrangler": "^4.59.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0acf16256..01f4694b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: crates/tauri-schema-worker: devDependencies: wrangler: - specifier: ^4.20.3 - version: 4.20.3 + specifier: ^4.59.1 + version: 4.59.1 examples/api: dependencies: @@ -105,7 +105,7 @@ importers: devDependencies: '@napi-rs/cli': specifier: ^3.4.1 - version: 3.4.1(@emnapi/runtime@1.7.1)(@types/node@24.10.0) + version: 3.4.1(@emnapi/runtime@1.8.1)(@types/node@24.10.0) '@types/node': specifier: ^24.0.0 version: 24.10.0 @@ -136,54 +136,54 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} engines: {node: '>=6.9.0'} - '@cloudflare/kv-asset-handler@0.4.0': - resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + '@cloudflare/kv-asset-handler@0.4.1': + resolution: {integrity: sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.3.3': - resolution: {integrity: sha512-/M3MEcj3V2WHIRSW1eAQBPRJ6JnGQHc6JKMAPLkDb7pLs3m6X9ES/+K3ceGqxI6TKeF32AWAi7ls0AYzVxCP0A==} + '@cloudflare/unenv-preset@2.9.0': + resolution: {integrity: sha512-99nEvuOTCGGGRNaIat8UVVXJ27aZK+U09SYDp0kVjQLwC9wyxcrQ28IqLwrQq2DjWLmBI1+UalGJzdPqYgPlRw==} peerDependencies: - unenv: 2.0.0-rc.17 - workerd: ^1.20250508.0 + unenv: 2.0.0-rc.24 + workerd: ^1.20251202.0 peerDependenciesMeta: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20250617.0': - resolution: {integrity: sha512-toG8JUKVLIks4oOJLe9FeuixE84pDpMZ32ip7mCpE7JaFc5BqGFvevk0YC/db3T71AQlialjRwioH3jS/dzItA==} + '@cloudflare/workerd-darwin-64@1.20260111.0': + resolution: {integrity: sha512-UGAjrGLev2/CMLZy7b+v1NIXA4Hupc/QJBFlJwMqldywMcJ/iEqvuUYYuVI2wZXuXeWkgmgFP87oFDQsg78YTQ==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250617.0': - resolution: {integrity: sha512-JTX0exbC9/ZtMmQQA8tDZEZFMXZrxOpTUj2hHnsUkErWYkr5SSZH04RBhPg6dU4VL8bXuB5/eJAh7+P9cZAp7g==} + '@cloudflare/workerd-darwin-arm64@1.20260111.0': + resolution: {integrity: sha512-YFAZwidLCQVa6rKCCaiWrhA+eh87a7MUhyd9lat3KSbLBAGpYM+ORpyTXpi2Gjm3j6Mp1e/wtzcFTSeMIy2UqA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250617.0': - resolution: {integrity: sha512-8jkSoVRJ+1bOx3tuWlZCGaGCV2ew7/jFMl6V3CPXOoEtERUHsZBQLVkQIGKcmC/LKSj7f/mpyBUeu2EPTo2HEg==} + '@cloudflare/workerd-linux-64@1.20260111.0': + resolution: {integrity: sha512-zx1GW6FwfOBjCV7QUCRzGRkViUtn3Is/zaaVPmm57xyy9sjtInx6/SdeBr2Y45tx9AnOP1CnaOFFdmH1P7VIEg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250617.0': - resolution: {integrity: sha512-YAzcOyu897z5dQKFzme1oujGWMGEJCR7/Wrrm1nSP6dqutxFPTubRADM8BHn2CV3ij//vaPnAeLmZE3jVwOwig==} + '@cloudflare/workerd-linux-arm64@1.20260111.0': + resolution: {integrity: sha512-wFVKxNvCyjRaAcgiSnJNJAmIos3p3Vv6Uhf4pFUZ9JIxr69GNlLWlm9SdCPvtwNFAjzSoDaKzDwjj5xqpuCS6Q==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250617.0': - resolution: {integrity: sha512-XWM/6sagDrO0CYDKhXhPjM23qusvIN1ju9ZEml6gOQs8tNOFnq6Cn6X9FAmnyapRFCGUSEC3HZYJAm7zwVKaMA==} + '@cloudflare/workerd-windows-64@1.20260111.0': + resolution: {integrity: sha512-zWgd77L7OI1BxgBbG+2gybDahIMgPX5iNo6e3LqcEz1Xm3KfiqgnDyMBcxeQ7xDrj7fHUGAlc//QnKvDchuUoQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -198,6 +198,9 @@ packages: '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -210,150 +213,306 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.4': resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.4': resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -396,10 +555,6 @@ packages: resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -432,107 +587,139 @@ packages: '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1090,6 +1277,15 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@poppinss/colors@4.1.6': + resolution: {integrity: sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==} + + '@poppinss/dumper@0.6.5': + resolution: {integrity: sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==} + + '@poppinss/exception@1.2.3': + resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} + '@quansync/fs@0.1.3': resolution: {integrity: sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==} engines: {node: '>=20.0.0'} @@ -1250,6 +1446,13 @@ packages: cpu: [x64] os: [win32] + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.14': + resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} + '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} @@ -1541,9 +1744,6 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -1616,13 +1816,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1639,9 +1832,9 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} @@ -1659,9 +1852,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - data-uri-to-buffer@2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1684,8 +1874,8 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} duplexer@0.1.2: @@ -1706,6 +1896,9 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1717,6 +1910,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1851,9 +2049,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-source@2.0.12: - resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1912,9 +2107,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -2009,8 +2201,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - miniflare@4.20250617.1: - resolution: {integrity: sha512-NjwKVzPGCAUgkCOJxHBwgV2Obu3g4/wAJE0JaA9whcYip4VAJwQ1fU9TMtoKLY91jD9ANR221+CqLyqxennjqg==} + miniflare@4.20260111.0: + resolution: {integrity: sha512-pUsbDlumPaTzliA+J9HMAM74nLR8wqpCQNOESximab51jAfvL7ZaP5Npzh4PWNV0Jfq28tlqazakuJcw6w5qlA==} engines: {node: '>=18.0.0'} hasBin: true @@ -2031,10 +2223,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2057,9 +2245,6 @@ packages: ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2129,9 +2314,6 @@ packages: engines: {node: '>=14'} hasBin: true - printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2188,11 +2370,16 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -2210,9 +2397,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@3.0.1: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} @@ -2234,9 +2418,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -2256,6 +2437,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2335,12 +2520,12 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} + undici@7.14.0: + resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.17: - resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} + unenv@2.0.0-rc.24: + resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} @@ -2473,17 +2658,17 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20250617.0: - resolution: {integrity: sha512-Uv6p0PYUHp/W/aWfUPLkZVAoAjapisM27JJlwcX9wCPTfCfnuegGOxFMvvlYpmNaX4YCwEdLCwuNn3xkpSkuZw==} + workerd@1.20260111.0: + resolution: {integrity: sha512-ov6Pt4k6d/ALfJja/EIHohT9IrY/f6GAa0arWEPat2qekp78xHbVM7jSxNWAMbaE7ZmnQQIFEGD1ZhAWZmQKIg==} engines: {node: '>=16'} hasBin: true - wrangler@4.20.3: - resolution: {integrity: sha512-ugvmi43CFPbjeQFfhU7EqE1V0ek6ZFv80jzwHcPk/7jPFmOA4ahT5uUU1ga5ZP6vz6lUuG2bLnyl1T5qJah0cg==} - engines: {node: '>=18.0.0'} + wrangler@4.59.1: + resolution: {integrity: sha512-5DddGSNxHd6dOjREWTDQdovQlZ1Lh80NNRXZFQ4/CrK3fNyVIBj9tqCs9pmXMNrKQ/AnKNeYzEs/l1kr8rHhOg==} + engines: {node: '>=20.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250617.0 + '@cloudflare/workers-types': ^4.20260111.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -2512,14 +2697,17 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - youch@3.3.4: - resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: @@ -2539,38 +2727,38 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@babel/parser@7.28.5': + '@babel/parser@7.28.6': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 - '@babel/types@7.28.5': + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@cloudflare/kv-asset-handler@0.4.0': + '@cloudflare/kv-asset-handler@0.4.1': dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250617.0)': + '@cloudflare/unenv-preset@2.9.0(unenv@2.0.0-rc.24)(workerd@1.20260111.0)': dependencies: - unenv: 2.0.0-rc.17 + unenv: 2.0.0-rc.24 optionalDependencies: - workerd: 1.20250617.0 + workerd: 1.20260111.0 - '@cloudflare/workerd-darwin-64@1.20250617.0': + '@cloudflare/workerd-darwin-64@1.20260111.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250617.0': + '@cloudflare/workerd-darwin-arm64@1.20260111.0': optional: true - '@cloudflare/workerd-linux-64@1.20250617.0': + '@cloudflare/workerd-linux-64@1.20260111.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250617.0': + '@cloudflare/workerd-linux-arm64@1.20260111.0': optional: true - '@cloudflare/workerd-windows-64@1.20250617.0': + '@cloudflare/workerd-windows-64@1.20260111.0': optional: true '@cspotcode/source-map-support@0.8.1': @@ -2588,6 +2776,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 @@ -2598,78 +2791,156 @@ snapshots: '@esbuild/aix-ppc64@0.25.4': optional: true + '@esbuild/aix-ppc64@0.27.0': + optional: true + '@esbuild/android-arm64@0.25.4': optional: true + '@esbuild/android-arm64@0.27.0': + optional: true + '@esbuild/android-arm@0.25.4': optional: true + '@esbuild/android-arm@0.27.0': + optional: true + '@esbuild/android-x64@0.25.4': optional: true + '@esbuild/android-x64@0.27.0': + optional: true + '@esbuild/darwin-arm64@0.25.4': optional: true + '@esbuild/darwin-arm64@0.27.0': + optional: true + '@esbuild/darwin-x64@0.25.4': optional: true + '@esbuild/darwin-x64@0.27.0': + optional: true + '@esbuild/freebsd-arm64@0.25.4': optional: true + '@esbuild/freebsd-arm64@0.27.0': + optional: true + '@esbuild/freebsd-x64@0.25.4': optional: true + '@esbuild/freebsd-x64@0.27.0': + optional: true + '@esbuild/linux-arm64@0.25.4': optional: true + '@esbuild/linux-arm64@0.27.0': + optional: true + '@esbuild/linux-arm@0.25.4': optional: true + '@esbuild/linux-arm@0.27.0': + optional: true + '@esbuild/linux-ia32@0.25.4': optional: true + '@esbuild/linux-ia32@0.27.0': + optional: true + '@esbuild/linux-loong64@0.25.4': optional: true + '@esbuild/linux-loong64@0.27.0': + optional: true + '@esbuild/linux-mips64el@0.25.4': optional: true + '@esbuild/linux-mips64el@0.27.0': + optional: true + '@esbuild/linux-ppc64@0.25.4': optional: true + '@esbuild/linux-ppc64@0.27.0': + optional: true + '@esbuild/linux-riscv64@0.25.4': optional: true + '@esbuild/linux-riscv64@0.27.0': + optional: true + '@esbuild/linux-s390x@0.25.4': optional: true + '@esbuild/linux-s390x@0.27.0': + optional: true + '@esbuild/linux-x64@0.25.4': optional: true + '@esbuild/linux-x64@0.27.0': + optional: true + '@esbuild/netbsd-arm64@0.25.4': optional: true + '@esbuild/netbsd-arm64@0.27.0': + optional: true + '@esbuild/netbsd-x64@0.25.4': optional: true + '@esbuild/netbsd-x64@0.27.0': + optional: true + '@esbuild/openbsd-arm64@0.25.4': optional: true + '@esbuild/openbsd-arm64@0.27.0': + optional: true + '@esbuild/openbsd-x64@0.25.4': optional: true + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + '@esbuild/sunos-x64@0.25.4': optional: true + '@esbuild/sunos-x64@0.27.0': + optional: true + '@esbuild/win32-arm64@0.25.4': optional: true + '@esbuild/win32-arm64@0.27.0': + optional: true + '@esbuild/win32-ia32@0.25.4': optional: true + '@esbuild/win32-ia32@0.27.0': + optional: true + '@esbuild/win32-x64@0.25.4': optional: true + '@esbuild/win32-x64@0.27.0': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0(jiti@2.4.2))': dependencies: eslint: 9.29.0(jiti@2.4.2) @@ -2718,8 +2989,6 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 - '@fastify/busboy@2.1.1': {} - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -2756,79 +3025,100 @@ snapshots: transitivePeerDependencies: - supports-color - '@img/sharp-darwin-arm64@0.33.5': + '@img/colour@1.0.0': {} + + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-arm@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.8.1 optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': optional: true '@inquirer/ansi@1.0.2': {} @@ -2980,7 +3270,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/cli@3.4.1(@emnapi/runtime@1.7.1)(@types/node@24.10.0)': + '@napi-rs/cli@3.4.1(@emnapi/runtime@1.8.1)(@types/node@24.10.0)': dependencies: '@inquirer/prompts': 7.10.1(@types/node@24.10.0) '@napi-rs/cross-toolchain': 1.0.3 @@ -2995,7 +3285,7 @@ snapshots: semver: 7.7.2 typanion: 3.14.0 optionalDependencies: - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.8.1 transitivePeerDependencies: - '@napi-rs/cross-toolchain-arm64-target-aarch64' - '@napi-rs/cross-toolchain-arm64-target-armv7' @@ -3301,6 +3591,18 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@poppinss/colors@4.1.6': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.5': + dependencies: + '@poppinss/colors': 4.1.6 + '@sindresorhus/is': 7.2.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.3': {} + '@quansync/fs@0.1.3': dependencies: quansync: 0.2.10 @@ -3405,6 +3707,10 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true + '@sindresorhus/is@7.2.0': {} + + '@speed-highlight/core@1.2.14': {} + '@standard-schema/spec@1.0.0': {} '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': @@ -3744,7 +4050,7 @@ snapshots: '@vue/compiler-core@3.5.17': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.6 '@vue/shared': 3.5.17 entities: 4.5.0 estree-walker: 2.0.2 @@ -3757,7 +4063,7 @@ snapshots: '@vue/compiler-sfc@3.5.17': dependencies: - '@babel/parser': 7.28.5 + '@babel/parser': 7.28.6 '@vue/compiler-core': 3.5.17 '@vue/compiler-dom': 3.5.17 '@vue/compiler-ssr': 3.5.17 @@ -3828,10 +4134,6 @@ snapshots: aria-query@5.3.2: {} - as-table@1.0.55: - dependencies: - printable-characters: 1.0.42 - axobject-query@4.1.0: {} balanced-match@3.0.1: {} @@ -3891,16 +4193,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - colorette@2.0.20: {} commander@2.20.3: {} @@ -3911,7 +4203,7 @@ snapshots: consola@3.4.2: {} - cookie@0.7.2: {} + cookie@1.1.1: {} cross-env@10.1.0: dependencies: @@ -3931,8 +4223,6 @@ snapshots: csstype@3.2.3: {} - data-uri-to-buffer@2.0.2: {} - debug@4.4.3: dependencies: ms: 2.1.3 @@ -3945,7 +4235,7 @@ snapshots: destr@2.0.5: {} - detect-libc@2.0.4: {} + detect-libc@2.1.2: {} duplexer@0.1.2: {} @@ -3955,6 +4245,8 @@ snapshots: entities@4.5.0: {} + error-stack-parser-es@1.0.5: {} + es-module-lexer@1.7.0: {} es-toolkit@1.42.0: {} @@ -3987,6 +4279,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + escape-string-regexp@4.0.0: {} eslint-config-prettier@10.1.8(eslint@9.29.0(jiti@2.4.2)): @@ -4133,11 +4454,6 @@ snapshots: function-bind@1.1.2: {} - get-source@2.0.12: - dependencies: - data-uri-to-buffer: 2.0.2 - source-map: 0.6.1 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4181,8 +4497,6 @@ snapshots: imurmurhash@0.1.4: {} - is-arrayish@0.3.2: {} - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -4261,20 +4575,20 @@ snapshots: mime@3.0.0: {} - miniflare@4.20250617.1: + miniflare@4.20260111.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 acorn-walk: 8.3.2 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 - sharp: 0.33.5 + sharp: 0.34.5 stoppable: 1.1.0 - undici: 5.29.0 - workerd: 1.20250617.0 + undici: 7.14.0 + workerd: 1.20260111.0 ws: 8.18.0 - youch: 3.3.4 - zod: 3.22.3 + youch: 4.1.0-beta.10 + zod: 3.25.76 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -4298,8 +4612,6 @@ snapshots: ms@2.1.3: {} - mustache@4.2.0: {} - mute-stream@2.0.0: {} nanoid@3.3.11: {} @@ -4316,8 +4628,6 @@ snapshots: node-fetch-native: 1.6.6 ufo: 1.6.1 - ohash@2.0.11: {} - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4381,8 +4691,6 @@ snapshots: prettier@3.6.2: {} - printable-characters@1.0.42: {} - punycode@2.3.1: {} quansync@0.2.10: {} @@ -4454,35 +4762,42 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - sharp@0.33.5: + sharp@0.34.5: dependencies: - color: 4.2.3 - detect-libc: 2.0.4 - semver: 7.7.2 + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 shebang-command@2.0.0: dependencies: @@ -4494,10 +4809,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - sirv@3.0.1: dependencies: '@polka/url': 1.0.0-next.29 @@ -4517,11 +4828,6 @@ snapshots: stackback@0.0.2: {} - stacktracey@2.1.8: - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - std-env@3.9.0: {} stoppable@1.1.0: {} @@ -4538,6 +4844,8 @@ snapshots: strip-json-comments@3.1.1: {} + supports-color@10.2.2: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -4622,17 +4930,11 @@ snapshots: undici-types@7.16.0: {} - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 + undici@7.14.0: {} - unenv@2.0.0-rc.17: + unenv@2.0.0-rc.24: dependencies: - defu: 6.1.4 - exsolve: 1.0.7 - ohash: 2.0.11 pathe: 2.0.3 - ufo: 1.6.1 universal-user-agent@7.0.3: {} @@ -4754,24 +5056,24 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20250617.0: + workerd@1.20260111.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250617.0 - '@cloudflare/workerd-darwin-arm64': 1.20250617.0 - '@cloudflare/workerd-linux-64': 1.20250617.0 - '@cloudflare/workerd-linux-arm64': 1.20250617.0 - '@cloudflare/workerd-windows-64': 1.20250617.0 + '@cloudflare/workerd-darwin-64': 1.20260111.0 + '@cloudflare/workerd-darwin-arm64': 1.20260111.0 + '@cloudflare/workerd-linux-64': 1.20260111.0 + '@cloudflare/workerd-linux-arm64': 1.20260111.0 + '@cloudflare/workerd-windows-64': 1.20260111.0 - wrangler@4.20.3: + wrangler@4.59.1: dependencies: - '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.3.3(unenv@2.0.0-rc.17)(workerd@1.20250617.0) + '@cloudflare/kv-asset-handler': 0.4.1 + '@cloudflare/unenv-preset': 2.9.0(unenv@2.0.0-rc.24)(workerd@1.20260111.0) blake3-wasm: 2.1.5 - esbuild: 0.25.4 - miniflare: 4.20250617.1 + esbuild: 0.27.0 + miniflare: 4.20260111.0 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.17 - workerd: 1.20250617.0 + unenv: 2.0.0-rc.24 + workerd: 1.20260111.0 optionalDependencies: fsevents: 2.3.3 transitivePeerDependencies: @@ -4790,12 +5092,19 @@ snapshots: yoctocolors-cjs@2.1.3: {} - youch@3.3.4: + youch-core@0.3.3: dependencies: - cookie: 0.7.2 - mustache: 4.2.0 - stacktracey: 2.1.8 + '@poppinss/exception': 1.2.3 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: + dependencies: + '@poppinss/colors': 4.1.6 + '@poppinss/dumper': 0.6.5 + '@speed-highlight/core': 1.2.14 + cookie: 1.1.1 + youch-core: 0.3.3 zimmerframe@1.1.2: {} - zod@3.22.3: {} + zod@3.25.76: {} From 4794a6ba22ae8a587a7cb6c870a27fb6c9b1fcf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:09:19 +0100 Subject: [PATCH 113/119] chore(deps): update dependency rollup to v4.55.2 (#14808) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/api/package.json | 2 +- pnpm-lock.yaml | 251 ++++++++++++++++++-------------------- 2 files changed, 119 insertions(+), 134 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 6a08a7dd3..7c6899d72 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -55,7 +55,7 @@ "eslint-plugin-security": "3.0.1", "fast-glob": "3.3.3", "globals": "^17.0.0", - "rollup": "4.55.1", + "rollup": "4.55.2", "tslib": "^2.8.1", "typescript": "^5.8.3", "typescript-eslint": "^8.34.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 01f4694b9..b99d7cc26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,10 +63,10 @@ importers: version: 9.29.0 '@rollup/plugin-terser': specifier: 0.4.4 - version: 0.4.4(rollup@4.55.1) + version: 0.4.4(rollup@4.55.2) '@rollup/plugin-typescript': specifier: 12.3.0 - version: 12.3.0(rollup@4.55.1)(tslib@2.8.1)(typescript@5.8.3) + version: 12.3.0(rollup@4.55.2)(tslib@2.8.1)(typescript@5.8.3) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -89,8 +89,8 @@ importers: specifier: ^17.0.0 version: 17.0.0 rollup: - specifier: 4.55.1 - version: 4.55.1 + specifier: 4.55.2 + version: 4.55.2 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -195,9 +195,6 @@ packages: '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} @@ -1321,128 +1318,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.55.1': - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + '@rollup/rollup-android-arm-eabi@4.55.2': + resolution: {integrity: sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.55.1': - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + '@rollup/rollup-android-arm64@4.55.2': + resolution: {integrity: sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + '@rollup/rollup-darwin-arm64@4.55.2': + resolution: {integrity: sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + '@rollup/rollup-darwin-x64@4.55.2': + resolution: {integrity: sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.1': - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + '@rollup/rollup-freebsd-arm64@4.55.2': + resolution: {integrity: sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + '@rollup/rollup-freebsd-x64@4.55.2': + resolution: {integrity: sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.55.2': + resolution: {integrity: sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + '@rollup/rollup-linux-arm-musleabihf@4.55.2': + resolution: {integrity: sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + '@rollup/rollup-linux-arm64-gnu@4.55.2': + resolution: {integrity: sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.55.1': - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + '@rollup/rollup-linux-arm64-musl@4.55.2': + resolution: {integrity: sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.55.1': - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + '@rollup/rollup-linux-loong64-gnu@4.55.2': + resolution: {integrity: sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.55.1': - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + '@rollup/rollup-linux-loong64-musl@4.55.2': + resolution: {integrity: sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + '@rollup/rollup-linux-ppc64-gnu@4.55.2': + resolution: {integrity: sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.55.1': - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + '@rollup/rollup-linux-ppc64-musl@4.55.2': + resolution: {integrity: sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + '@rollup/rollup-linux-riscv64-gnu@4.55.2': + resolution: {integrity: sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.55.1': - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + '@rollup/rollup-linux-riscv64-musl@4.55.2': + resolution: {integrity: sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.55.1': - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + '@rollup/rollup-linux-s390x-gnu@4.55.2': + resolution: {integrity: sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + '@rollup/rollup-linux-x64-gnu@4.55.2': + resolution: {integrity: sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.55.1': - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + '@rollup/rollup-linux-x64-musl@4.55.2': + resolution: {integrity: sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.55.1': - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + '@rollup/rollup-openbsd-x64@4.55.2': + resolution: {integrity: sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.55.1': - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + '@rollup/rollup-openharmony-arm64@4.55.2': + resolution: {integrity: sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.55.1': - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + '@rollup/rollup-win32-arm64-msvc@4.55.2': + resolution: {integrity: sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + '@rollup/rollup-win32-ia32-msvc@4.55.2': + resolution: {integrity: sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + '@rollup/rollup-win32-x64-gnu@4.55.2': + resolution: {integrity: sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + '@rollup/rollup-win32-x64-msvc@4.55.2': + resolution: {integrity: sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==} cpu: [x64] os: [win32] @@ -2348,8 +2345,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.55.1: - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + rollup@4.55.2: + resolution: {integrity: sha512-PggGy4dhwx5qaW+CKBilA/98Ql9keyfnb7lh4SR6shQ91QQQi1ORJ1v4UinkdP2i87OBs9AQFooQylcrrRfIcg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2365,11 +2362,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -2771,11 +2763,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 @@ -3282,7 +3269,7 @@ snapshots: emnapi: 1.7.1 es-toolkit: 1.42.0 js-yaml: 4.1.1 - semver: 7.7.2 + semver: 7.7.3 typanion: 3.14.0 optionalDependencies: '@emnapi/runtime': 1.8.1 @@ -3454,7 +3441,7 @@ snapshots: '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -3607,104 +3594,104 @@ snapshots: dependencies: quansync: 0.2.10 - '@rollup/plugin-terser@0.4.4(rollup@4.55.1)': + '@rollup/plugin-terser@0.4.4(rollup@4.55.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.43.1 optionalDependencies: - rollup: 4.55.1 + rollup: 4.55.2 - '@rollup/plugin-typescript@12.3.0(rollup@4.55.1)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@12.3.0(rollup@4.55.2)(tslib@2.8.1)(typescript@5.8.3)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.55.1) + '@rollup/pluginutils': 5.2.0(rollup@4.55.2) resolve: 1.22.10 typescript: 5.8.3 optionalDependencies: - rollup: 4.55.1 + rollup: 4.55.2 tslib: 2.8.1 - '@rollup/pluginutils@5.2.0(rollup@4.55.1)': + '@rollup/pluginutils@5.2.0(rollup@4.55.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.55.1 + rollup: 4.55.2 - '@rollup/rollup-android-arm-eabi@4.55.1': + '@rollup/rollup-android-arm-eabi@4.55.2': optional: true - '@rollup/rollup-android-arm64@4.55.1': + '@rollup/rollup-android-arm64@4.55.2': optional: true - '@rollup/rollup-darwin-arm64@4.55.1': + '@rollup/rollup-darwin-arm64@4.55.2': optional: true - '@rollup/rollup-darwin-x64@4.55.1': + '@rollup/rollup-darwin-x64@4.55.2': optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': + '@rollup/rollup-freebsd-arm64@4.55.2': optional: true - '@rollup/rollup-freebsd-x64@4.55.1': + '@rollup/rollup-freebsd-x64@4.55.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + '@rollup/rollup-linux-arm-gnueabihf@4.55.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': + '@rollup/rollup-linux-arm-musleabihf@4.55.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': + '@rollup/rollup-linux-arm64-gnu@4.55.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': + '@rollup/rollup-linux-arm64-musl@4.55.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': + '@rollup/rollup-linux-loong64-gnu@4.55.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.55.1': + '@rollup/rollup-linux-loong64-musl@4.55.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': + '@rollup/rollup-linux-ppc64-gnu@4.55.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.55.1': + '@rollup/rollup-linux-ppc64-musl@4.55.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': + '@rollup/rollup-linux-riscv64-gnu@4.55.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': + '@rollup/rollup-linux-riscv64-musl@4.55.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': + '@rollup/rollup-linux-s390x-gnu@4.55.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': + '@rollup/rollup-linux-x64-gnu@4.55.2': optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': + '@rollup/rollup-linux-x64-musl@4.55.2': optional: true - '@rollup/rollup-openbsd-x64@4.55.1': + '@rollup/rollup-openbsd-x64@4.55.2': optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': + '@rollup/rollup-openharmony-arm64@4.55.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': + '@rollup/rollup-win32-arm64-msvc@4.55.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': + '@rollup/rollup-win32-ia32-msvc@4.55.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': + '@rollup/rollup-win32-x64-gnu@4.55.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': + '@rollup/rollup-win32-x64-msvc@4.55.2': optional: true '@sindresorhus/is@7.2.0': {} @@ -3833,7 +3820,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -4717,35 +4704,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.55.1: + rollup@4.55.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.1 - '@rollup/rollup-android-arm64': 4.55.1 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-freebsd-arm64': 4.55.1 - '@rollup/rollup-freebsd-x64': 4.55.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-arm64-musl': 4.55.1 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 - '@rollup/rollup-linux-loong64-musl': 4.55.1 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-musl': 4.55.1 - '@rollup/rollup-openbsd-x64': 4.55.1 - '@rollup/rollup-openharmony-arm64': 4.55.1 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 - '@rollup/rollup-win32-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 + '@rollup/rollup-android-arm-eabi': 4.55.2 + '@rollup/rollup-android-arm64': 4.55.2 + '@rollup/rollup-darwin-arm64': 4.55.2 + '@rollup/rollup-darwin-x64': 4.55.2 + '@rollup/rollup-freebsd-arm64': 4.55.2 + '@rollup/rollup-freebsd-x64': 4.55.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.2 + '@rollup/rollup-linux-arm-musleabihf': 4.55.2 + '@rollup/rollup-linux-arm64-gnu': 4.55.2 + '@rollup/rollup-linux-arm64-musl': 4.55.2 + '@rollup/rollup-linux-loong64-gnu': 4.55.2 + '@rollup/rollup-linux-loong64-musl': 4.55.2 + '@rollup/rollup-linux-ppc64-gnu': 4.55.2 + '@rollup/rollup-linux-ppc64-musl': 4.55.2 + '@rollup/rollup-linux-riscv64-gnu': 4.55.2 + '@rollup/rollup-linux-riscv64-musl': 4.55.2 + '@rollup/rollup-linux-s390x-gnu': 4.55.2 + '@rollup/rollup-linux-x64-gnu': 4.55.2 + '@rollup/rollup-linux-x64-musl': 4.55.2 + '@rollup/rollup-openbsd-x64': 4.55.2 + '@rollup/rollup-openharmony-arm64': 4.55.2 + '@rollup/rollup-win32-arm64-msvc': 4.55.2 + '@rollup/rollup-win32-ia32-msvc': 4.55.2 + '@rollup/rollup-win32-x64-gnu': 4.55.2 + '@rollup/rollup-win32-x64-msvc': 4.55.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4760,8 +4747,6 @@ snapshots: safer-buffer@2.1.2: {} - semver@7.7.2: {} - semver@7.7.3: {} serialize-javascript@6.0.2: @@ -4981,7 +4966,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.55.1 + rollup: 4.55.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 From 4d5d78daf636feaac20c5bc48a6071491c4291ee Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Sat, 24 Jan 2026 18:00:40 +0800 Subject: [PATCH 114/119] fix(specta): don't use `#[specta(rename = ...)]` with `tauri::ipc::Channel` (#14812) --- .changes/change-pr-14812.md | 5 +++++ crates/tauri/src/ipc/channel.rs | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changes/change-pr-14812.md diff --git a/.changes/change-pr-14812.md b/.changes/change-pr-14812.md new file mode 100644 index 000000000..96c1f36c0 --- /dev/null +++ b/.changes/change-pr-14812.md @@ -0,0 +1,5 @@ +--- +"tauri": patch:bug +--- + +fix(specta): don't use `#[specta(rename = ...)]` with `tauri::ipc::Channel` diff --git a/crates/tauri/src/ipc/channel.rs b/crates/tauri/src/ipc/channel.rs index c33caf2a2..0b3eb6778 100644 --- a/crates/tauri/src/ipc/channel.rs +++ b/crates/tauri/src/ipc/channel.rs @@ -54,9 +54,9 @@ pub struct Channel { #[cfg(feature = "specta")] const _: () = { #[derive(specta::Type)] - #[specta(remote = super::Channel, rename = "TAURI_CHANNEL")] - #[allow(dead_code)] - struct Channel(std::marker::PhantomData); + #[specta(remote = super::Channel)] + #[allow(dead_code, non_camel_case_types)] + struct TAURI_CHANNEL(std::marker::PhantomData); }; impl Clone for Channel { From c769f211fcaa543884c9d0f87ebd2ee106c01382 Mon Sep 17 00:00:00 2001 From: Kf637 Date: Sun, 25 Jan 2026 09:30:50 +0100 Subject: [PATCH 115/119] feat(nsis): add Norwegian language support for installer (#14824) * feat(nsis): add Norwegian language support for installer * feat(nsis): add Norwegian language support for installer strings * Add change file --- .changes/change-pr-14824.md | 5 ++++ .../windows/nsis/languages/Norwegian.nsh | 27 +++++++++++++++++++ .../src/bundle/windows/nsis/mod.rs | 1 + 3 files changed, 33 insertions(+) create mode 100644 .changes/change-pr-14824.md create mode 100644 crates/tauri-bundler/src/bundle/windows/nsis/languages/Norwegian.nsh diff --git a/.changes/change-pr-14824.md b/.changes/change-pr-14824.md new file mode 100644 index 000000000..164991efa --- /dev/null +++ b/.changes/change-pr-14824.md @@ -0,0 +1,5 @@ +--- +'tauri-bundler': 'patch:enhance' +--- + +feat(nsis): add Norwegian language support for installer. \ No newline at end of file diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/languages/Norwegian.nsh b/crates/tauri-bundler/src/bundle/windows/nsis/languages/Norwegian.nsh new file mode 100644 index 000000000..c999a2855 --- /dev/null +++ b/crates/tauri-bundler/src/bundle/windows/nsis/languages/Norwegian.nsh @@ -0,0 +1,27 @@ +LangString addOrReinstall ${LANG_NORWEGIAN} "Legg til/reinstaller komponenter" +LangString alreadyInstalled ${LANG_NORWEGIAN} "Allerede installert" +LangString alreadyInstalledLong ${LANG_NORWEGIAN} "${PRODUCTNAME} ${VERSION} er allerede installert. Velg operasjonen du vil utføre og klikk Neste for å fortsette." +LangString appRunning ${LANG_NORWEGIAN} "{{product_name}} kjører! Lukk den først og prøv igjen." +LangString appRunningOkKill ${LANG_NORWEGIAN} "{{product_name}} kjører!$\nKlikk OK for å avslutte den" +LangString chooseMaintenanceOption ${LANG_NORWEGIAN} "Velg vedlikeholdsoperasjonen som skal utføres." +LangString choowHowToInstall ${LANG_NORWEGIAN} "Velg hvordan du vil installere ${PRODUCTNAME}." +LangString createDesktop ${LANG_NORWEGIAN} "Opprett skrivebordssnarvei" +LangString dontUninstall ${LANG_NORWEGIAN} "Ikke avinstaller" +LangString dontUninstallDowngrade ${LANG_NORWEGIAN} "Ikke avinstaller (nedgradering uten avinstallasjon er deaktivert for denne installasjonen)" +LangString failedToKillApp ${LANG_NORWEGIAN} "Kunne ikke avslutte {{product_name}}. Lukk den først og prøv igjen" +LangString installingWebview2 ${LANG_NORWEGIAN} "Installerer WebView2..." +LangString newerVersionInstalled ${LANG_NORWEGIAN} "En nyere versjon av ${PRODUCTNAME} er allerede installert! Det anbefales ikke at du installerer en eldre versjon. Hvis du virkelig vil installere denne eldre versjonen, er det bedre å avinstallere den nåværende versjonen først. Velg operasjonen du vil utføre og klikk Neste for å fortsette." +LangString older ${LANG_NORWEGIAN} "eldre" +LangString olderOrUnknownVersionInstalled ${LANG_NORWEGIAN} "En $R4-versjon av ${PRODUCTNAME} er installert på systemet ditt. Det anbefales at du avinstallerer den nåværende versjonen før installasjon. Velg operasjonen du vil utføre og klikk Neste for å fortsette." +LangString silentDowngrades ${LANG_NORWEGIAN} "Nedgraderinger er deaktivert for denne installasjonen. Kan ikke fortsette med stille installasjon; bruk den grafiske installasjonen i stedet.$\n" +LangString unableToUninstall ${LANG_NORWEGIAN} "Kunne ikke avinstallere!" +LangString uninstallApp ${LANG_NORWEGIAN} "Avinstaller ${PRODUCTNAME}" +LangString uninstallBeforeInstalling ${LANG_NORWEGIAN} "Avinstaller før installasjon" +LangString unknown ${LANG_NORWEGIAN} "ukjent" +LangString webview2AbortError ${LANG_NORWEGIAN} "Kunne ikke installere WebView2! Appen kan ikke kjøre uten den. Prøv å starte installasjonen på nytt." +LangString webview2DownloadError ${LANG_NORWEGIAN} "Feil: Nedlasting av WebView2 mislyktes - $0" +LangString webview2DownloadSuccess ${LANG_NORWEGIAN} "WebView2-bootstrapper lastet ned" +LangString webview2Downloading ${LANG_NORWEGIAN} "Laster ned WebView2-bootstrapper..." +LangString webview2InstallError ${LANG_NORWEGIAN} "Feil: Installering av WebView2 mislyktes med avslutningskode $1" +LangString webview2InstallSuccess ${LANG_NORWEGIAN} "WebView2 ble installert" +LangString deleteAppData ${LANG_NORWEGIAN} "Slett programdata" diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs index d4d8f2cac..9fc3c11c3 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs @@ -867,6 +867,7 @@ fn get_lang_data(lang: &str) -> Option<(String, &[u8])> { "swedish" => include_bytes!("./languages/Swedish.nsh"), "portuguese" => include_bytes!("./languages/Portuguese.nsh"), "ukrainian" => include_bytes!("./languages/Ukrainian.nsh"), + "norwegian" => include_bytes!("./languages/Norwegian.nsh"), _ => return None, }; Some((path, content)) From 7fca58230f97c3e6834134419514a0c7dbbe784b Mon Sep 17 00:00:00 2001 From: Tony <68118705+Legend-Master@users.noreply.github.com> Date: Mon, 26 Jan 2026 17:55:27 +0800 Subject: [PATCH 116/119] chore(deps): update `nsis_tauri_utils` to 0.5.3 (#14830) --- .changes/nsis-run-as-user.md | 9 +++++++++ crates/tauri-bundler/src/bundle/windows/nsis/mod.rs | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 .changes/nsis-run-as-user.md diff --git a/.changes/nsis-run-as-user.md b/.changes/nsis-run-as-user.md new file mode 100644 index 000000000..ca3d9f9f4 --- /dev/null +++ b/.changes/nsis-run-as-user.md @@ -0,0 +1,9 @@ +--- +"tauri-bundler": patch:bug +"tauri-cli": patch:bug +"@tauri-apps/cli": patch:bug +--- + +Updated `nsis_tauri_utils` to 0.5.3: + +- Use an alternative method `CreateProcessWithTokenW` to run programs as user, this fixed a problem that the program launched with the previous method can't query its own handle diff --git a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs index 9fc3c11c3..5b7479a84 100644 --- a/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs +++ b/crates/tauri-bundler/src/bundle/windows/nsis/mod.rs @@ -40,8 +40,8 @@ const NSIS_URL: &str = #[cfg(target_os = "windows")] const NSIS_SHA1: &str = "EF7FF767E5CBD9EDD22ADD3A32C9B8F4500BB10D"; const NSIS_TAURI_UTILS_URL: &str = - "https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.5.2/nsis_tauri_utils.dll"; -const NSIS_TAURI_UTILS_SHA1: &str = "D0C502F45DF55C0465C9406088FF016C2E7E6817"; + "https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.5.3/nsis_tauri_utils.dll"; +const NSIS_TAURI_UTILS_SHA1: &str = "75197FEE3C6A814FE035788D1C34EAD39349B860"; #[cfg(target_os = "windows")] const NSIS_REQUIRED_FILES: &[&str] = &[ From efc4c26ebc6cf2cfcb16a0efd111a7863c10c58b Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Mon, 26 Jan 2026 17:13:08 +0100 Subject: [PATCH 117/119] chore: fix clippy lints (#14834) --- crates/tauri/src/test/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/tauri/src/test/mod.rs b/crates/tauri/src/test/mod.rs index 6c1311bc3..9161f0979 100644 --- a/crates/tauri/src/test/mod.rs +++ b/crates/tauri/src/test/mod.rs @@ -243,6 +243,7 @@ pub fn assert_ipc_response< ); } +#[allow(clippy::needless_doctest_main)] /// Executes the given IPC message and get the return value. /// /// # Examples From 3a4e165b6f1f0aaeb3d7f8a336f34b7dc777092d Mon Sep 17 00:00:00 2001 From: sftse Date: Tue, 27 Jan 2026 09:33:11 +0100 Subject: [PATCH 118/119] Less statics fixup (#14833) * fix(tauri-cli): be more conservative to preserve behavior (#14804) * refactor(tauri-cli): move app path initialization into commands --- crates/tauri-cli/src/mobile/android/mod.rs | 2 -- crates/tauri-cli/src/mobile/init.rs | 6 +++--- crates/tauri-cli/src/mobile/ios/build.rs | 7 ++++++- crates/tauri-cli/src/mobile/ios/mod.rs | 4 +--- crates/tauri-cli/src/mobile/ios/run.rs | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/crates/tauri-cli/src/mobile/android/mod.rs b/crates/tauri-cli/src/mobile/android/mod.rs index 002ed73ac..8ea6490d0 100644 --- a/crates/tauri-cli/src/mobile/android/mod.rs +++ b/crates/tauri-cli/src/mobile/android/mod.rs @@ -104,7 +104,6 @@ enum Commands { } pub fn command(cli: Cli, verbosity: u8) -> Result<()> { - let dirs = crate::helpers::app_paths::resolve_dirs(); let noise_level = NoiseLevel::from_occurrences(verbosity as u64); match cli.command { Commands::Init(options) => init_command( @@ -113,7 +112,6 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> { false, options.skip_targets_install, options.config, - &dirs, )?, Commands::Dev(options) => dev::command(options, noise_level)?, Commands::Build(options) => build::command(options, noise_level).map(|_| ())?, diff --git a/crates/tauri-cli/src/mobile/init.rs b/crates/tauri-cli/src/mobile/init.rs index 0a7324970..f187b9f12 100644 --- a/crates/tauri-cli/src/mobile/init.rs +++ b/crates/tauri-cli/src/mobile/init.rs @@ -29,8 +29,8 @@ pub fn command( reinstall_deps: bool, skip_targets_install: bool, config: Vec, - dirs: &Dirs, ) -> Result<()> { + let dirs = crate::helpers::app_paths::resolve_dirs(); let wrapper = TextWrapper::default(); exec( @@ -45,14 +45,14 @@ pub fn command( Ok(()) } -pub fn exec( +fn exec( target: Target, wrapper: &TextWrapper, #[allow(unused_variables)] non_interactive: bool, #[allow(unused_variables)] reinstall_deps: bool, skip_targets_install: bool, config: Vec, - dirs: &Dirs, + dirs: Dirs, ) -> Result { let tauri_config = get_tauri_config( target.platform_target(), diff --git a/crates/tauri-cli/src/mobile/ios/build.rs b/crates/tauri-cli/src/mobile/ios/build.rs index 160e0995e..5ad7e58d5 100644 --- a/crates/tauri-cli/src/mobile/ios/build.rs +++ b/crates/tauri-cli/src/mobile/ios/build.rs @@ -167,7 +167,12 @@ pub struct BuiltApplication { options_handle: OptionsHandle, } -pub fn command(options: Options, noise_level: NoiseLevel, dirs: &Dirs) -> Result { +pub fn command(options: Options, noise_level: NoiseLevel) -> Result { + let dirs = crate::helpers::app_paths::resolve_dirs(); + run(options, noise_level, &dirs) +} + +pub fn run(options: Options, noise_level: NoiseLevel, dirs: &Dirs) -> Result { let mut build_options: BuildOptions = options.clone().into(); build_options.target = Some( Target::all() diff --git a/crates/tauri-cli/src/mobile/ios/mod.rs b/crates/tauri-cli/src/mobile/ios/mod.rs index 0590e772a..6c0e0af87 100644 --- a/crates/tauri-cli/src/mobile/ios/mod.rs +++ b/crates/tauri-cli/src/mobile/ios/mod.rs @@ -102,7 +102,6 @@ enum Commands { pub fn command(cli: Cli, verbosity: u8) -> Result<()> { let noise_level = NoiseLevel::from_occurrences(verbosity as u64); - let dirs = crate::helpers::app_paths::resolve_dirs(); match cli.command { Commands::Init(options) => init_command( MobileTarget::Ios, @@ -110,10 +109,9 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> { options.reinstall_deps, options.skip_targets_install, options.config, - &dirs, )?, Commands::Dev(options) => dev::command(options, noise_level)?, - Commands::Build(options) => build::command(options, noise_level, &dirs).map(|_| ())?, + Commands::Build(options) => build::command(options, noise_level).map(|_| ())?, Commands::Run(options) => run::command(options, noise_level)?, Commands::XcodeScript(options) => xcode_script::command(options)?, } diff --git a/crates/tauri-cli/src/mobile/ios/run.rs b/crates/tauri-cli/src/mobile/ios/run.rs index 6c75c5acc..0021ef868 100644 --- a/crates/tauri-cli/src/mobile/ios/run.rs +++ b/crates/tauri-cli/src/mobile/ios/run.rs @@ -76,7 +76,7 @@ pub fn command(options: Options, noise_level: NoiseLevel) -> Result<()> { let dirs = crate::helpers::app_paths::resolve_dirs(); - let mut built_application = super::build::command( + let mut built_application = super::build::run( super::build::Options { debug: !options.release, targets: Some(vec![]), /* skips IPA build since there's no target */ From 20b99f9281e3748f0d5300c4d1f522344bcd9666 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Wed, 28 Jan 2026 20:27:51 +0100 Subject: [PATCH 119/119] refactor: split appimage bundler in multiple files to support new backends (#14841) --- .../src/bundle/linux/appimage/linuxdeploy.rs | 282 ++++++++++++++++++ .../src/bundle/linux/appimage/mod.rs | 278 +---------------- 2 files changed, 288 insertions(+), 272 deletions(-) create mode 100644 crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy.rs diff --git a/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy.rs b/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy.rs new file mode 100644 index 000000000..dccc3b5a2 --- /dev/null +++ b/crates/tauri-bundler/src/bundle/linux/appimage/linuxdeploy.rs @@ -0,0 +1,282 @@ +// Copyright 2016-2019 Cargo-Bundle developers +// Copyright 2019-2024 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +use super::{super::debian, write_and_make_executable}; +use crate::{ + bundle::settings::Arch, + error::{Context, ErrorExt}, + utils::{fs_utils, http_utils::download, CommandExt}, + Settings, +}; +use std::{ + fs, + path::{Path, PathBuf}, + process::Command, +}; + +/// Bundles the project. +/// Returns a vector of PathBuf that shows where the AppImage was created. +pub fn bundle_project(settings: &Settings) -> crate::Result> { + // generate the deb binary name + let appimage_arch: &str = match settings.binary_arch() { + Arch::X86_64 => "amd64", + Arch::X86 => "i386", + Arch::AArch64 => "aarch64", + Arch::Armhf => "armhf", + target => { + return Err(crate::Error::ArchError(format!( + "Unsupported architecture: {target:?}" + ))); + } + }; + + let tools_arch = if settings.binary_arch() == Arch::Armhf { + "armhf" + } else { + settings.target().split('-').next().unwrap() + }; + + let output_path = settings.project_out_directory().join("bundle/appimage"); + if output_path.exists() { + fs::remove_dir_all(&output_path)?; + } + + let tools_path = settings + .local_tools_directory() + .map(|d| d.join(".tauri")) + .unwrap_or_else(|| { + dirs::cache_dir().map_or_else(|| output_path.to_path_buf(), |p| p.join("tauri")) + }); + + fs::create_dir_all(&tools_path)?; + + let linuxdeploy_path = prepare_tools( + &tools_path, + tools_arch, + settings.log_level() != log::Level::Error, + )?; + + let package_dir = settings.project_out_directory().join("bundle/appimage_deb"); + + let main_binary = settings.main_binary()?; + let product_name = settings.product_name(); + + let mut settings = settings.clone(); + if main_binary.name().contains(' ') { + let main_binary_path = settings.binary_path(main_binary); + let project_out_directory = settings.project_out_directory(); + + let main_binary_name_kebab = heck::AsKebabCase(main_binary.name()).to_string(); + let new_path = project_out_directory.join(&main_binary_name_kebab); + fs::copy(main_binary_path, new_path)?; + + let main_binary = settings.main_binary_mut()?; + main_binary.set_name(main_binary_name_kebab); + } + + // generate deb_folder structure + let (data_dir, icons) = debian::generate_data(&settings, &package_dir) + .with_context(|| "Failed to build data folders and files")?; + fs_utils::copy_custom_files(&settings.appimage().files, &data_dir) + .with_context(|| "Failed to copy custom files")?; + + fs::create_dir_all(&output_path)?; + let app_dir_path = output_path.join(format!("{}.AppDir", settings.product_name())); + let appimage_filename = format!( + "{}_{}_{}.AppImage", + settings.product_name(), + settings.version_string(), + appimage_arch + ); + let appimage_path = output_path.join(&appimage_filename); + fs_utils::create_dir(&app_dir_path, true)?; + + fs::create_dir_all(&tools_path)?; + let larger_icon = icons + .iter() + .filter(|i| i.width == i.height) + .max_by_key(|i| i.width) + .expect("couldn't find a square icon to use as AppImage icon"); + let larger_icon_path = larger_icon + .path + .strip_prefix(package_dir.join("data")) + .unwrap() + .to_string_lossy() + .to_string(); + + log::info!(action = "Bundling"; "{} ({})", appimage_filename, appimage_path.display()); + + let app_dir_usr = app_dir_path.join("usr/"); + let app_dir_usr_bin = app_dir_usr.join("bin/"); + let app_dir_usr_lib = app_dir_usr.join("lib/"); + + fs_utils::copy_dir(&data_dir.join("usr/"), &app_dir_usr)?; + + // Using create_dir_all for a single dir so we don't get errors if the path already exists + fs::create_dir_all(&app_dir_usr_bin)?; + fs::create_dir_all(app_dir_usr_lib)?; + + // Copy bins and libs that linuxdeploy doesn't know about + + // we also check if the user may have provided their own copy already + // xdg-open will be handled by the `files` config instead + if settings.deep_link_protocols().is_some() && !app_dir_usr_bin.join("xdg-open").exists() { + fs::copy("/usr/bin/xdg-mime", app_dir_usr_bin.join("xdg-mime")) + .fs_context("xdg-mime binary not found", "/usr/bin/xdg-mime".to_string())?; + } + + // we also check if the user may have provided their own copy already + if settings.appimage().bundle_xdg_open && !app_dir_usr_bin.join("xdg-open").exists() { + fs::copy("/usr/bin/xdg-open", app_dir_usr_bin.join("xdg-open")) + .fs_context("xdg-open binary not found", "/usr/bin/xdg-open".to_string())?; + } + + let search_dirs = [ + match settings.binary_arch() { + Arch::X86_64 => "/usr/lib/x86_64-linux-gnu/", + Arch::X86 => "/usr/lib/i386-linux-gnu/", + Arch::AArch64 => "/usr/lib/aarch64-linux-gnu/", + Arch::Armhf => "/usr/lib/arm-linux-gnueabihf/", + _ => unreachable!(), + }, + "/usr/lib64", + "/usr/lib", + "/usr/libexec", + ]; + + for file in [ + "WebKitNetworkProcess", + "WebKitWebProcess", + "injected-bundle/libwebkit2gtkinjectedbundle.so", + ] { + for source in search_dirs.map(PathBuf::from) { + // TODO: Check if it's the same dir name on all systems + let source = source.join("webkit2gtk-4.1").join(file); + if source.exists() { + fs_utils::copy_file( + &source, + &app_dir_path.join(source.strip_prefix("/").unwrap()), + )?; + } + } + } + + fs::copy( + tools_path.join(format!("AppRun-{tools_arch}")), + app_dir_path.join("AppRun"), + )?; + fs::copy( + app_dir_path.join(larger_icon_path), + app_dir_path.join(format!("{product_name}.png")), + )?; + std::os::unix::fs::symlink( + app_dir_path.join(format!("{product_name}.png")), + app_dir_path.join(".DirIcon"), + )?; + std::os::unix::fs::symlink( + app_dir_path.join(format!("usr/share/applications/{product_name}.desktop")), + app_dir_path.join(format!("{product_name}.desktop")), + )?; + + let log_level = match settings.log_level() { + log::Level::Error => "3", + log::Level::Warn => "2", + log::Level::Info => "1", + _ => "0", + }; + + let mut cmd = Command::new(linuxdeploy_path); + cmd.env("OUTPUT", &appimage_path); + cmd.env("ARCH", tools_arch); + // Looks like the cli arg isn't enough for the updated AppImage output-plugin. + cmd.env("APPIMAGE_EXTRACT_AND_RUN", "1"); + cmd.args([ + "--appimage-extract-and-run", + "--verbosity", + log_level, + "--appdir", + &app_dir_path.display().to_string(), + "--plugin", + "gtk", + ]); + if settings.appimage().bundle_media_framework { + cmd.args(["--plugin", "gstreamer"]); + } + cmd.args(["--output", "appimage"]); + + // Linuxdeploy logs everything into stderr so we have to ignore the output ourselves here + if settings.log_level() == log::Level::Error { + log::debug!(action = "Running"; "Command `linuxdeploy {}`", cmd.get_args().map(|arg| arg.to_string_lossy()).fold(String::new(), |acc, arg| format!("{acc} {arg}"))); + if !cmd.output()?.status.success() { + return Err(crate::Error::GenericError( + "failed to run linuxdeploy".to_string(), + )); + } + } else { + cmd.output_ok()?; + } + + fs::remove_dir_all(&package_dir)?; + Ok(vec![appimage_path]) +} + +// returns the linuxdeploy path to keep linuxdeploy_arch contained +fn prepare_tools(tools_path: &Path, arch: &str, verbose: bool) -> crate::Result { + let apprun = tools_path.join(format!("AppRun-{arch}")); + if !apprun.exists() { + let data = download(&format!( + "https://github.com/tauri-apps/binary-releases/releases/download/apprun-old/AppRun-{arch}" + ))?; + write_and_make_executable(&apprun, data)?; + } + + let linuxdeploy_arch = if arch == "i686" { "i383" } else { arch }; + let linuxdeploy = tools_path.join(format!("linuxdeploy-{linuxdeploy_arch}.AppImage")); + if !linuxdeploy.exists() { + let data = download(&format!("https://github.com/tauri-apps/binary-releases/releases/download/linuxdeploy/linuxdeploy-{linuxdeploy_arch}.AppImage"))?; + write_and_make_executable(&linuxdeploy, data)?; + } + + let gtk = tools_path.join("linuxdeploy-plugin-gtk.sh"); + if !gtk.exists() { + let data = download("https://raw.githubusercontent.com/tauri-apps/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh")?; + write_and_make_executable(>k, data)?; + } + + let gstreamer = tools_path.join("linuxdeploy-plugin-gstreamer.sh"); + if !gstreamer.exists() { + let data = download("https://raw.githubusercontent.com/tauri-apps/linuxdeploy-plugin-gstreamer/master/linuxdeploy-plugin-gstreamer.sh")?; + write_and_make_executable(&gstreamer, data)?; + } + + let appimage = tools_path.join("linuxdeploy-plugin-appimage.AppImage"); + if !appimage.exists() { + // This is optional, linuxdeploy will fall back to its built-in version if the download failed. + let data = download(&format!("https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-{arch}.AppImage")); + match data { + Ok(data) => write_and_make_executable(&appimage, data)?, + Err(err) => { + log::error!("Download of AppImage plugin failed. Using older built-in version instead."); + if verbose { + log::debug!("{err:?}"); + } + } + } + } + + // This should prevent linuxdeploy to be detected by appimage integration tools + let _ = Command::new("dd") + .args([ + "if=/dev/zero", + "bs=1", + "count=3", + "seek=8", + "conv=notrunc", + &format!("of={}", linuxdeploy.display()), + ]) + .output(); + + Ok(linuxdeploy) +} diff --git a/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs b/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs index 29eb87bee..9e30f9cfd 100644 --- a/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs +++ b/crates/tauri-bundler/src/bundle/linux/appimage/mod.rs @@ -1,287 +1,21 @@ -// Copyright 2016-2019 Cargo-Bundle developers // Copyright 2019-2024 Tauri Programme within The Commons Conservancy // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use super::debian; -use crate::{ - bundle::settings::Arch, - error::{Context, ErrorExt}, - utils::{fs_utils, http_utils::download, CommandExt}, - Settings, -}; use std::{ fs, path::{Path, PathBuf}, - process::Command, }; -/// Bundles the project. -/// Returns a vector of PathBuf that shows where the AppImage was created. +use crate::Settings; + +mod linuxdeploy; + pub fn bundle_project(settings: &Settings) -> crate::Result> { - // generate the deb binary name - let appimage_arch: &str = match settings.binary_arch() { - Arch::X86_64 => "amd64", - Arch::X86 => "i386", - Arch::AArch64 => "aarch64", - Arch::Armhf => "armhf", - target => { - return Err(crate::Error::ArchError(format!( - "Unsupported architecture: {target:?}" - ))); - } - }; - - let tools_arch = if settings.binary_arch() == Arch::Armhf { - "armhf" - } else { - settings.target().split('-').next().unwrap() - }; - - let output_path = settings.project_out_directory().join("bundle/appimage"); - if output_path.exists() { - fs::remove_dir_all(&output_path)?; - } - - let tools_path = settings - .local_tools_directory() - .map(|d| d.join(".tauri")) - .unwrap_or_else(|| { - dirs::cache_dir().map_or_else(|| output_path.to_path_buf(), |p| p.join("tauri")) - }); - - fs::create_dir_all(&tools_path)?; - - let linuxdeploy_path = prepare_tools( - &tools_path, - tools_arch, - settings.log_level() != log::Level::Error, - )?; - - let package_dir = settings.project_out_directory().join("bundle/appimage_deb"); - - let main_binary = settings.main_binary()?; - let product_name = settings.product_name(); - - let mut settings = settings.clone(); - if main_binary.name().contains(' ') { - let main_binary_path = settings.binary_path(main_binary); - let project_out_directory = settings.project_out_directory(); - - let main_binary_name_kebab = heck::AsKebabCase(main_binary.name()).to_string(); - let new_path = project_out_directory.join(&main_binary_name_kebab); - fs::copy(main_binary_path, new_path)?; - - let main_binary = settings.main_binary_mut()?; - main_binary.set_name(main_binary_name_kebab); - } - - // generate deb_folder structure - let (data_dir, icons) = debian::generate_data(&settings, &package_dir) - .with_context(|| "Failed to build data folders and files")?; - fs_utils::copy_custom_files(&settings.appimage().files, &data_dir) - .with_context(|| "Failed to copy custom files")?; - - fs::create_dir_all(&output_path)?; - let app_dir_path = output_path.join(format!("{}.AppDir", settings.product_name())); - let appimage_filename = format!( - "{}_{}_{}.AppImage", - settings.product_name(), - settings.version_string(), - appimage_arch - ); - let appimage_path = output_path.join(&appimage_filename); - fs_utils::create_dir(&app_dir_path, true)?; - - fs::create_dir_all(&tools_path)?; - let larger_icon = icons - .iter() - .filter(|i| i.width == i.height) - .max_by_key(|i| i.width) - .expect("couldn't find a square icon to use as AppImage icon"); - let larger_icon_path = larger_icon - .path - .strip_prefix(package_dir.join("data")) - .unwrap() - .to_string_lossy() - .to_string(); - - log::info!(action = "Bundling"; "{} ({})", appimage_filename, appimage_path.display()); - - let app_dir_usr = app_dir_path.join("usr/"); - let app_dir_usr_bin = app_dir_usr.join("bin/"); - let app_dir_usr_lib = app_dir_usr.join("lib/"); - - fs_utils::copy_dir(&data_dir.join("usr/"), &app_dir_usr)?; - - // Using create_dir_all for a single dir so we don't get errors if the path already exists - fs::create_dir_all(&app_dir_usr_bin)?; - fs::create_dir_all(app_dir_usr_lib)?; - - // Copy bins and libs that linuxdeploy doesn't know about - - // we also check if the user may have provided their own copy already - // xdg-open will be handled by the `files` config instead - if settings.deep_link_protocols().is_some() && !app_dir_usr_bin.join("xdg-open").exists() { - fs::copy("/usr/bin/xdg-mime", app_dir_usr_bin.join("xdg-mime")) - .fs_context("xdg-mime binary not found", "/usr/bin/xdg-mime".to_string())?; - } - - // we also check if the user may have provided their own copy already - if settings.appimage().bundle_xdg_open && !app_dir_usr_bin.join("xdg-open").exists() { - fs::copy("/usr/bin/xdg-open", app_dir_usr_bin.join("xdg-open")) - .fs_context("xdg-open binary not found", "/usr/bin/xdg-open".to_string())?; - } - - let search_dirs = [ - match settings.binary_arch() { - Arch::X86_64 => "/usr/lib/x86_64-linux-gnu/", - Arch::X86 => "/usr/lib/i386-linux-gnu/", - Arch::AArch64 => "/usr/lib/aarch64-linux-gnu/", - Arch::Armhf => "/usr/lib/arm-linux-gnueabihf/", - _ => unreachable!(), - }, - "/usr/lib64", - "/usr/lib", - "/usr/libexec", - ]; - - for file in [ - "WebKitNetworkProcess", - "WebKitWebProcess", - "injected-bundle/libwebkit2gtkinjectedbundle.so", - ] { - for source in search_dirs.map(PathBuf::from) { - // TODO: Check if it's the same dir name on all systems - let source = source.join("webkit2gtk-4.1").join(file); - if source.exists() { - fs_utils::copy_file( - &source, - &app_dir_path.join(source.strip_prefix("/").unwrap()), - )?; - } - } - } - - fs::copy( - tools_path.join(format!("AppRun-{tools_arch}")), - app_dir_path.join("AppRun"), - )?; - fs::copy( - app_dir_path.join(larger_icon_path), - app_dir_path.join(format!("{product_name}.png")), - )?; - std::os::unix::fs::symlink( - app_dir_path.join(format!("{product_name}.png")), - app_dir_path.join(".DirIcon"), - )?; - std::os::unix::fs::symlink( - app_dir_path.join(format!("usr/share/applications/{product_name}.desktop")), - app_dir_path.join(format!("{product_name}.desktop")), - )?; - - let log_level = match settings.log_level() { - log::Level::Error => "3", - log::Level::Warn => "2", - log::Level::Info => "1", - _ => "0", - }; - - let mut cmd = Command::new(linuxdeploy_path); - cmd.env("OUTPUT", &appimage_path); - cmd.env("ARCH", tools_arch); - // Looks like the cli arg isn't enough for the updated AppImage output-plugin. - cmd.env("APPIMAGE_EXTRACT_AND_RUN", "1"); - cmd.args([ - "--appimage-extract-and-run", - "--verbosity", - log_level, - "--appdir", - &app_dir_path.display().to_string(), - "--plugin", - "gtk", - ]); - if settings.appimage().bundle_media_framework { - cmd.args(["--plugin", "gstreamer"]); - } - cmd.args(["--output", "appimage"]); - - // Linuxdeploy logs everything into stderr so we have to ignore the output ourselves here - if settings.log_level() == log::Level::Error { - log::debug!(action = "Running"; "Command `linuxdeploy {}`", cmd.get_args().map(|arg| arg.to_string_lossy()).fold(String::new(), |acc, arg| format!("{acc} {arg}"))); - if !cmd.output()?.status.success() { - return Err(crate::Error::GenericError( - "failed to run linuxdeploy".to_string(), - )); - } - } else { - cmd.output_ok()?; - } - - fs::remove_dir_all(&package_dir)?; - Ok(vec![appimage_path]) + linuxdeploy::bundle_project(settings) } -// returns the linuxdeploy path to keep linuxdeploy_arch contained -fn prepare_tools(tools_path: &Path, arch: &str, verbose: bool) -> crate::Result { - let apprun = tools_path.join(format!("AppRun-{arch}")); - if !apprun.exists() { - let data = download(&format!( - "https://github.com/tauri-apps/binary-releases/releases/download/apprun-old/AppRun-{arch}" - ))?; - write_and_make_executable(&apprun, &data)?; - } - - let linuxdeploy_arch = if arch == "i686" { "i386" } else { arch }; - let linuxdeploy = tools_path.join(format!("linuxdeploy-{linuxdeploy_arch}.AppImage")); - if !linuxdeploy.exists() { - let data = download(&format!("https://github.com/tauri-apps/binary-releases/releases/download/linuxdeploy/linuxdeploy-{linuxdeploy_arch}.AppImage"))?; - write_and_make_executable(&linuxdeploy, &data)?; - } - - let gtk = tools_path.join("linuxdeploy-plugin-gtk.sh"); - if !gtk.exists() { - let data = include_bytes!("./linuxdeploy-plugin-gtk.sh"); - write_and_make_executable(>k, data)?; - } - - let gstreamer = tools_path.join("linuxdeploy-plugin-gstreamer.sh"); - if !gstreamer.exists() { - let data = include_bytes!("./linuxdeploy-plugin-gstreamer.sh"); - write_and_make_executable(&gstreamer, data)?; - } - - let appimage = tools_path.join("linuxdeploy-plugin-appimage.AppImage"); - if !appimage.exists() { - // This is optional, linuxdeploy will fall back to its built-in version if the download failed. - let data = download(&format!("https://github.com/linuxdeploy/linuxdeploy-plugin-appimage/releases/download/continuous/linuxdeploy-plugin-appimage-{arch}.AppImage")); - match data { - Ok(data) => write_and_make_executable(&appimage, &data)?, - Err(err) => { - log::error!("Download of AppImage plugin failed. Using older built-in version instead."); - if verbose { - log::debug!("{err:?}"); - } - } - } - } - - // This should prevent linuxdeploy to be detected by appimage integration tools - let _ = Command::new("dd") - .args([ - "if=/dev/zero", - "bs=1", - "count=3", - "seek=8", - "conv=notrunc", - &format!("of={}", linuxdeploy.display()), - ]) - .output(); - - Ok(linuxdeploy) -} - -fn write_and_make_executable(path: &Path, data: &[u8]) -> std::io::Result<()> { +fn write_and_make_executable(path: &Path, data: Vec) -> std::io::Result<()> { use std::os::unix::fs::PermissionsExt; fs::write(path, data)?;