diff --git a/.changes/add-total-transferred-field.md b/.changes/add-total-transferred-field.md
deleted file mode 100644
index ac11352f3..000000000
--- a/.changes/add-total-transferred-field.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"upload": "minor"
-"upload-js": "minor"
----
-
-Added a new field `progressTotal` to track the total amount of data transferred during the upload/download process.
diff --git a/.changes/config.json b/.changes/config.json
index 5f5fe841d..7c9f9fe9e 100644
--- a/.changes/config.json
+++ b/.changes/config.json
@@ -56,12 +56,13 @@
"dependencies": [
"barcode-scanner",
"biometric",
- "log-plugin",
+ "log",
"cli",
"clipboard-manager",
"dialog",
"fs",
"global-shortcut",
+ "opener",
"http",
"nfc",
"notification",
@@ -87,6 +88,7 @@
"dialog-js",
"fs-js",
"global-shortcut-js",
+ "opener-js",
"http-js",
"nfc-js",
"notification-js",
@@ -186,6 +188,14 @@
"path": "./plugins/global-shortcut",
"manager": "javascript"
},
+ "opener": {
+ "path": "./plugins/opener",
+ "manager": "rust"
+ },
+ "opener-js": {
+ "path": "./plugins/opener",
+ "manager": "javascript"
+ },
"haptics": {
"path": "./plugins/haptics",
"manager": "rust"
@@ -207,7 +217,7 @@
"path": "./plugins/localhost",
"manager": "rust"
},
- "log-plugin": {
+ "log": {
"path": "./plugins/log",
"manager": "rust"
},
diff --git a/.changes/fix-deep-link-onopenurl-current.md b/.changes/fix-deep-link-onopenurl-current.md
deleted file mode 100644
index 3ede6ebd3..000000000
--- a/.changes/fix-deep-link-onopenurl-current.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-deep-link: patch
-deep-link-js: patch
----
-
-`onOpenUrl()` will now not call `getCurrent()` anymore, matching the documented behavior.
diff --git a/.changes/fix-inconsistent-webview-log-target.md b/.changes/fix-inconsistent-webview-log-target.md
deleted file mode 100644
index 16f964334..000000000
--- a/.changes/fix-inconsistent-webview-log-target.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'log-plugin': 'patch'
-'log-js': 'patch'
----
-
-Make webview log target more consistent that it always starts with `webview`
diff --git a/.changes/fs-read-dir-broken-symlink.md b/.changes/fs-read-dir-broken-symlink.md
deleted file mode 100644
index d1aa3d015..000000000
--- a/.changes/fs-read-dir-broken-symlink.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-"fs": "patch"
-"fs-js": "patch"
----
-
-Fix `readDir` function failing to read directories that contain broken symlinks.
-
diff --git a/.changes/localhost-custom-host-binding.md b/.changes/localhost-custom-host-binding.md
deleted file mode 100644
index b5bd3b53d..000000000
--- a/.changes/localhost-custom-host-binding.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'localhost': 'minor'
----
-
-Add custom host binding to allow external access
\ No newline at end of file
diff --git a/.changes/sql-allow-blocking-without-nested-runtime.md b/.changes/sql-allow-blocking-without-nested-runtime.md
deleted file mode 100644
index ff2c773fe..000000000
--- a/.changes/sql-allow-blocking-without-nested-runtime.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"sql": "patch"
----
-
-Allow blocking on async code without creating a nested runtime.
diff --git a/.github/workflows/check-generated-files.yml b/.github/workflows/check-generated-files.yml
index 96bbdd05a..d2c2c8745 100644
--- a/.github/workflows/check-generated-files.yml
+++ b/.github/workflows/check-generated-files.yml
@@ -53,6 +53,10 @@ jobs:
- .github/workflows/check-generated-files.yml
- plugins/global-shortcut/guest-js/**
- plugins/global-shortcut/src/api-iife.js
+ opener:
+ - .github/workflows/check-generated-files.yml
+ - plugins/opener/guest-js/**
+ - plugins/opener/src/api-iife.js
haptics:
- .github/workflows/check-generated-files.yml
- plugins/haptics/guest-js/**
diff --git a/.github/workflows/lint-rust.yml b/.github/workflows/lint-rust.yml
index d9e0c50cb..db922ef1a 100644
--- a/.github/workflows/lint-rust.yml
+++ b/.github/workflows/lint-rust.yml
@@ -66,6 +66,9 @@ jobs:
tauri-plugin-global-shortcut:
- .github/workflows/lint-rust.yml
- plugins/global-shortcut/**
+ tauri-plugin-opener:
+ - .github/workflows/lint-rust.yml
+ - plugins/opener/**
tauri-plugin-haptics:
- .github/workflows/lint-rust.yml
- plugins/haptics/**
diff --git a/.github/workflows/test-rust.yml b/.github/workflows/test-rust.yml
index 3793160d2..496efe6e9 100644
--- a/.github/workflows/test-rust.yml
+++ b/.github/workflows/test-rust.yml
@@ -47,109 +47,140 @@ jobs:
tauri-plugin-autostart:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/autostart/**
tauri-plugin-cli:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/cli/**
tauri-plugin-clipboard-manager:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/clipboard-manager/**
tauri-plugin-deep-link:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/deep-link/**
tauri-plugin-dialog:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/dialog/**
- plugins/fs/**
tauri-plugin-fs:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/fs/**
tauri-plugin-geolocation:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/geolocation/**
tauri-plugin-global-shortcut:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/global-shortcut/**
+ tauri-plugin-opener:
+ - .github/workflows/test-rust.yml
+ - Cargo.toml
+ - Cargo.lock
+ - plugins/opener/**
tauri-plugin-haptics:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/haptics/**
tauri-plugin-http:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/http/**
- plugins/fs/**
tauri-plugin-localhost:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/localhost/**
tauri-plugin-log:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/log/**
tauri-plugin-notification:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/notification/**
tauri-plugin-os:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/os/**
tauri-plugin-persisted-scope:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/persisted-scope/**
- plugins/fs/**
tauri-plugin-positioner:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/positioner/**
tauri-plugin-process:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/process/**
tauri-plugin-shell:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/shell/**
tauri-plugin-single-instance:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/single-instance/**
tauri-plugin-sql:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/sql/**
tauri-plugin-store:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/store/**
tauri-plugin-stronghold:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/stronghold/**
tauri-plugin-updater:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/updater/**
tauri-plugin-upload:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/upload/**
tauri-plugin-websocket:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/websocket/**
tauri-plugin-window-state:
- .github/workflows/test-rust.yml
- Cargo.toml
+ - Cargo.lock
- plugins/window-state/**
test:
diff --git a/.taurignore b/.taurignore
new file mode 100644
index 000000000..ea7a984c2
--- /dev/null
+++ b/.taurignore
@@ -0,0 +1 @@
+plugins/*/permissions/autogenerated/
\ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index c888bb6ed..144ee6ab6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -113,9 +113,9 @@ dependencies = [
[[package]]
name = "allocator-api2"
-version = "0.2.18"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "android-tzdata"
@@ -151,9 +151,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.15"
+version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526"
+checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -166,47 +166,47 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.8"
+version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
+checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
[[package]]
name = "anstyle-parse"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb"
+checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.1.1"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a"
+checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.4"
+version = "3.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8"
+checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
dependencies = [
"anstyle",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "anyhow"
-version = "1.0.89"
+version = "1.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6"
+checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
[[package]]
name = "api"
-version = "2.0.5"
+version = "2.0.6"
dependencies = [
"log",
"serde",
@@ -226,6 +226,7 @@ dependencies = [
"tauri-plugin-log",
"tauri-plugin-nfc",
"tauri-plugin-notification",
+ "tauri-plugin-opener",
"tauri-plugin-os",
"tauri-plugin-process",
"tauri-plugin-shell",
@@ -273,9 +274,9 @@ dependencies = [
[[package]]
name = "arbitrary"
-version = "1.3.2"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110"
+checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223"
dependencies = [
"derive_arbitrary",
]
@@ -318,9 +319,9 @@ checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
[[package]]
name = "ashpd"
-version = "0.9.2"
+version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d43c03d9e36dd40cab48435be0b09646da362c278223ca535493877b2c1dee9"
+checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3"
dependencies = [
"enumflags2",
"futures-channel",
@@ -334,7 +335,7 @@ dependencies = [
"wayland-backend",
"wayland-client",
"wayland-protocols",
- "zbus",
+ "zbus 5.1.1",
]
[[package]]
@@ -373,9 +374,9 @@ dependencies = [
[[package]]
name = "async-compression"
-version = "0.4.16"
+version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "103db485efc3e41214fe4fda9f3dbeae2eb9082f48fd236e6095627a9422066e"
+checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522"
dependencies = [
"brotli",
"flate2",
@@ -411,9 +412,9 @@ dependencies = [
[[package]]
name = "async-io"
-version = "2.3.4"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8"
+checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059"
dependencies = [
"async-lock",
"cfg-if",
@@ -466,7 +467,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -501,7 +502,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -549,7 +550,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471"
dependencies = [
"dirs 4.0.0",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"winreg 0.10.1",
]
@@ -708,26 +709,25 @@ dependencies = [
[[package]]
name = "borsh"
-version = "1.3.0"
+version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d4d6dafc1a3bb54687538972158f07b2c948bc57d5890df22c0739098b3028"
+checksum = "2506947f73ad44e344215ccd6403ac2ae18cd8e046e581a441bf8d199f257f03"
dependencies = [
"borsh-derive",
- "cfg_aliases 0.1.1",
+ "cfg_aliases",
]
[[package]]
name = "borsh-derive"
-version = "1.3.0"
+version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4918709cc4dd777ad2b6303ed03cb37f3ca0ccede8c1b0d28ac6db8f4710e0"
+checksum = "c2593a3b8b938bd68373196c9832f516be11fa487ef4ae745eb282e6a56a7244"
dependencies = [
"once_cell",
- "proc-macro-crate 2.0.2",
+ "proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 2.0.87",
- "syn_derive",
+ "syn 2.0.90",
]
[[package]]
@@ -759,9 +759,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]]
name = "byte-unit"
-version = "5.1.4"
+version = "5.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ac19bdf0b2665407c39d82dbc937e951e7e2001609f0fb32edd0af45a2d63e"
+checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174"
dependencies = [
"rust_decimal",
"serde",
@@ -792,9 +792,9 @@ dependencies = [
[[package]]
name = "bytemuck"
-version = "1.19.0"
+version = "1.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d"
+checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
[[package]]
name = "byteorder"
@@ -810,9 +810,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
[[package]]
name = "bytes"
-version = "1.7.2"
+version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
+checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b"
dependencies = [
"serde",
]
@@ -828,7 +828,7 @@ dependencies = [
"glib",
"libc",
"once_cell",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -871,7 +871,7 @@ dependencies = [
"semver",
"serde",
"serde_json",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -881,14 +881,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719"
dependencies = [
"serde",
- "toml 0.8.2",
+ "toml 0.8.19",
]
[[package]]
name = "cc"
-version = "1.1.30"
+version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945"
+checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc"
dependencies = [
"shlex",
]
@@ -926,12 +926,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-[[package]]
-name = "cfg_aliases"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
-
[[package]]
name = "cfg_aliases"
version = "0.2.1"
@@ -994,18 +988,18 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.20"
+version = "4.5.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8"
+checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
-version = "4.5.20"
+version = "4.5.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54"
+checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec"
dependencies = [
"anstream",
"anstyle",
@@ -1015,9 +1009,9 @@ dependencies = [
[[package]]
name = "clap_lex"
-version = "0.7.2"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97"
+checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7"
[[package]]
name = "clipboard-win"
@@ -1070,9 +1064,9 @@ dependencies = [
[[package]]
name = "colorchoice"
-version = "1.0.2"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0"
+checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]]
name = "colored"
@@ -1160,12 +1154,13 @@ dependencies = [
[[package]]
name = "cookie_store"
-version = "0.21.0"
+version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4934e6b7e8419148b6ef56950d277af8561060b56afd59e2aadf98b59fce6baa"
+checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9"
dependencies = [
"cookie",
- "idna 0.5.0",
+ "document-features",
+ "idna",
"log",
"publicsuffix",
"serde",
@@ -1260,9 +1255,9 @@ dependencies = [
[[package]]
name = "cpufeatures"
-version = "0.2.14"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0"
+checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
dependencies = [
"libc",
]
@@ -1368,17 +1363,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
name = "ctor"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
+checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
dependencies = [
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1414,7 +1409,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1438,7 +1433,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1449,14 +1444,14 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
name = "dary_heap"
-version = "0.3.6"
+version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca"
+checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728"
[[package]]
name = "data-encoding"
@@ -1505,26 +1500,15 @@ dependencies = [
"serde",
]
-[[package]]
-name = "derivative"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "derive_arbitrary"
-version = "1.3.2"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
+checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1537,7 +1521,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1628,7 +1612,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1637,7 +1621,7 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
dependencies = [
- "libloading 0.8.5",
+ "libloading 0.8.6",
]
[[package]]
@@ -1660,7 +1644,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1672,6 +1656,15 @@ dependencies = [
"const-random",
]
+[[package]]
+name = "document-features"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
+dependencies = [
+ "litrs",
+]
+
[[package]]
name = "dotenvy"
version = "0.15.7"
@@ -1788,14 +1781,14 @@ dependencies = [
[[package]]
name = "embed-resource"
-version = "2.5.0"
+version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4e24052d7be71f0efb50c201557f6fe7d237cfd5a64fd5bcd7fd8fe32dbbffa"
+checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379"
dependencies = [
"cc",
"memchr",
"rustc_version",
- "toml 0.8.2",
+ "toml 0.8.19",
"vswhom",
"winreg 0.52.0",
]
@@ -1808,9 +1801,9 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
[[package]]
name = "encoding_rs"
-version = "0.8.34"
+version = "0.8.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
+checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
dependencies = [
"cfg-if",
]
@@ -1839,7 +1832,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -1870,12 +1863,12 @@ dependencies = [
[[package]]
name = "errno"
-version = "0.3.9"
+version = "0.3.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1908,9 +1901,9 @@ dependencies = [
[[package]]
name = "event-listener-strategy"
-version = "0.5.2"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1"
+checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2"
dependencies = [
"event-listener",
"pin-project-lite",
@@ -1918,15 +1911,15 @@ dependencies = [
[[package]]
name = "fastrand"
-version = "2.1.1"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
+checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4"
[[package]]
name = "fdeflate"
-version = "0.3.5"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab"
+checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb"
dependencies = [
"simd-adler32",
]
@@ -1990,9 +1983,9 @@ dependencies = [
[[package]]
name = "flate2"
-version = "1.0.34"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
+checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -2000,9 +1993,9 @@ dependencies = [
[[package]]
name = "flume"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095"
dependencies = [
"futures-core",
"futures-sink",
@@ -2042,7 +2035,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -2152,9 +2145,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
[[package]]
name = "futures-lite"
-version = "2.3.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5"
+checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1"
dependencies = [
"fastrand",
"futures-core",
@@ -2171,7 +2164,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -2399,7 +2392,7 @@ dependencies = [
"once_cell",
"pin-project-lite",
"smallvec",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -2435,7 +2428,7 @@ dependencies = [
"memchr",
"once_cell",
"smallvec",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -2445,11 +2438,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
dependencies = [
"heck 0.4.1",
- "proc-macro-crate 2.0.2",
+ "proc-macro-crate 2.0.0",
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -2470,9 +2463,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "global-hotkey"
-version = "0.6.2"
+version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1b75248f33c73df1ed69673f6cb36d2e048ae84d29aa1d3e53199d138ebb1df"
+checksum = "b00d88f1be7bf4cd2e61623ce08e84be2dfa4eab458e5d632d3dab95f16c1f64"
dependencies = [
"crossbeam-channel",
"keyboard-types",
@@ -2480,7 +2473,7 @@ dependencies = [
"objc2-app-kit",
"once_cell",
"serde",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"windows-sys 0.59.0",
"x11-dl",
]
@@ -2556,14 +2549,14 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
name = "h2"
-version = "0.4.6"
+version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
+checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
dependencies = [
"atomic-waker",
"bytes",
@@ -2571,7 +2564,7 @@ dependencies = [
"futures-core",
"futures-sink",
"http",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"slab",
"tokio",
"tokio-util",
@@ -2599,9 +2592,9 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.15.0"
+version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
+checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
[[package]]
name = "hashlink"
@@ -2624,12 +2617,6 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
[[package]]
name = "hermit-abi"
version = "0.4.0"
@@ -2691,7 +2678,7 @@ checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
dependencies = [
"bytes",
"fnv",
- "itoa 1.0.11",
+ "itoa 1.0.14",
]
[[package]]
@@ -2737,9 +2724,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hyper"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
+checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f"
dependencies = [
"bytes",
"futures-channel",
@@ -2749,7 +2736,7 @@ dependencies = [
"http-body",
"httparse",
"httpdate",
- "itoa 1.0.11",
+ "itoa 1.0.14",
"pin-project-lite",
"smallvec",
"tokio",
@@ -2793,9 +2780,9 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.9"
+version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b"
+checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
dependencies = [
"bytes",
"futures-channel",
@@ -2843,6 +2830,124 @@ dependencies = [
"png",
]
+[[package]]
+name = "icu_collections"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_locid_transform_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locid_transform_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
+
+[[package]]
+name = "icu_normalizer"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "utf16_iter",
+ "utf8_iter",
+ "write16",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+
+[[package]]
+name = "icu_properties"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_locid_transform",
+ "icu_properties_data",
+ "icu_provider",
+ "tinystr",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+
+[[package]]
+name = "icu_provider"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+dependencies = [
+ "displaydoc",
+ "icu_locid",
+ "icu_provider_macros",
+ "stable_deref_trait",
+ "tinystr",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_provider_macros"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+]
+
[[package]]
name = "ident_case"
version = "1.0.1"
@@ -2851,29 +2956,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "0.3.0"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
]
[[package]]
-name = "idna"
-version = "0.5.0"
+name = "idna_adapter"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
dependencies = [
- "unicode-bidi",
- "unicode-normalization",
+ "icu_normalizer",
+ "icu_properties",
]
[[package]]
name = "image"
-version = "0.25.3"
+version = "0.25.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d97eb9a8e0cd5b76afea91d7eecd5cf8338cd44ced04256cf1f800474b227c52"
+checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b"
dependencies = [
"bytemuck",
"byteorder-lite",
@@ -2895,12 +3001,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.6.0"
+version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
+checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
dependencies = [
"equivalent",
- "hashbrown 0.15.0",
+ "hashbrown 0.15.2",
"serde",
]
@@ -3000,7 +3106,7 @@ dependencies = [
"stronghold-derive",
"stronghold-utils",
"stronghold_engine",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"zeroize",
]
@@ -3049,9 +3155,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
[[package]]
name = "itoa"
-version = "1.0.11"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "javascriptcore-rs"
@@ -3087,7 +3193,7 @@ dependencies = [
"combine",
"jni-sys",
"log",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"walkdir",
"windows-sys 0.45.0",
]
@@ -3106,10 +3212,11 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
[[package]]
name = "js-sys"
-version = "0.3.72"
+version = "0.3.74"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9"
+checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705"
dependencies = [
+ "once_cell",
"wasm-bindgen",
]
@@ -3122,7 +3229,7 @@ dependencies = [
"jsonptr",
"serde",
"serde_json",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -3227,9 +3334,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.160"
+version = "0.2.167"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f"
+checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc"
[[package]]
name = "libflate"
@@ -3267,9 +3374,9 @@ dependencies = [
[[package]]
name = "libloading"
-version = "0.8.5"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
+checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets 0.52.6",
@@ -3277,9 +3384,9 @@ dependencies = [
[[package]]
name = "libm"
-version = "0.2.8"
+version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
[[package]]
name = "libredox"
@@ -3294,9 +3401,9 @@ dependencies = [
[[package]]
name = "libsodium-sys-stable"
-version = "1.21.3"
+version = "1.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90e7b5bc5a90cb1a680d8b0340f935d575292b8458e077f8da8cf134289d7dcf"
+checksum = "798a1c6d8c3424c0686ca46f2929d81809b371ef61a68c5d1880570584d32b85"
dependencies = [
"cc",
"libc",
@@ -3326,6 +3433,18 @@ version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+[[package]]
+name = "litemap"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
+
+[[package]]
+name = "litrs"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
+
[[package]]
name = "lock_api"
version = "0.4.12"
@@ -3479,11 +3598,10 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.0.2"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
+checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
dependencies = [
- "hermit-abi 0.3.9",
"libc",
"log",
"wasi 0.11.0+wasi-snapshot-preview1",
@@ -3492,9 +3610,9 @@ dependencies = [
[[package]]
name = "mockito"
-version = "1.5.0"
+version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09b34bd91b9e5c5b06338d392463e1318d683cf82ec3d3af4014609be6e2108d"
+checksum = "652cd6d169a36eaf9d1e6bce1a221130439a966d7f27858af66a33a66e9c4ee2"
dependencies = [
"assert-json-diff",
"bytes",
@@ -3516,9 +3634,9 @@ dependencies = [
[[package]]
name = "muda"
-version = "0.15.1"
+version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8123dfd4996055ac9b15a60ad263b44b01e539007523ad7a4a533a3d93b0591"
+checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484"
dependencies = [
"crossbeam-channel",
"dpi",
@@ -3530,7 +3648,7 @@ dependencies = [
"once_cell",
"png",
"serde",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"windows-sys 0.59.0",
]
@@ -3546,7 +3664,7 @@ dependencies = [
"openssl-probe",
"openssl-sys",
"schannel",
- "security-framework",
+ "security-framework 2.11.1",
"security-framework-sys",
"tempfile",
]
@@ -3563,7 +3681,7 @@ dependencies = [
"ndk-sys",
"num_enum",
"raw-window-handle",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -3601,12 +3719,13 @@ dependencies = [
[[package]]
name = "nix"
-version = "0.27.1"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
"bitflags 2.6.0",
"cfg-if",
+ "cfg_aliases",
"libc",
"memoffset 0.9.1",
]
@@ -3669,7 +3788,7 @@ dependencies = [
"mac-notification-sys",
"serde",
"tauri-winrt-notification",
- "zbus",
+ "zbus 4.4.0",
]
[[package]]
@@ -3750,10 +3869,10 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [
- "proc-macro-crate 2.0.2",
+ "proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -4036,9 +4155,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "open"
-version = "5.3.0"
+version = "5.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3"
+checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c"
dependencies = [
"is-wsl",
"libc",
@@ -4068,7 +4187,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -4079,9 +4198,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
-version = "300.3.2+3.3.2"
+version = "300.4.1+3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b"
+checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c"
dependencies = [
"cc",
]
@@ -4127,9 +4246,9 @@ dependencies = [
[[package]]
name = "os_info"
-version = "3.8.2"
+version = "3.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092"
+checksum = "e5ca711d8b83edbb00b44d504503cd247c9c0bd8b0fa2694f2a1a3d8165379ce"
dependencies = [
"log",
"serde",
@@ -4208,9 +4327,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pathdiff"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361"
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
[[package]]
name = "pbkdf2"
@@ -4341,7 +4460,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -4373,9 +4492,9 @@ dependencies = [
[[package]]
name = "pin-project-lite"
-version = "0.2.14"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
+checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
[[package]]
name = "pin-utils"
@@ -4428,7 +4547,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [
"base64 0.22.1",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"quick-xml 0.32.0",
"serde",
"time",
@@ -4449,13 +4568,13 @@ dependencies = [
[[package]]
name = "polling"
-version = "3.7.3"
+version = "3.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511"
+checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f"
dependencies = [
"cfg-if",
"concurrent-queue",
- "hermit-abi 0.4.0",
+ "hermit-abi",
"pin-project-lite",
"rustix",
"tracing",
@@ -4518,12 +4637,20 @@ dependencies = [
[[package]]
name = "proc-macro-crate"
-version = "2.0.2"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
+checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8"
dependencies = [
- "toml_datetime",
- "toml_edit 0.20.2",
+ "toml_edit 0.20.7",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
+dependencies = [
+ "toml_edit 0.22.22",
]
[[package]]
@@ -4558,9 +4685,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
-version = "1.0.88"
+version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9"
+checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
@@ -4593,11 +4720,11 @@ dependencies = [
[[package]]
name = "publicsuffix"
-version = "2.2.3"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457"
+checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf"
dependencies = [
- "idna 0.3.0",
+ "idna",
"psl-types",
]
@@ -4636,9 +4763,9 @@ dependencies = [
[[package]]
name = "quinn"
-version = "0.11.5"
+version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684"
+checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef"
dependencies = [
"bytes",
"pin-project-lite",
@@ -4647,34 +4774,38 @@ dependencies = [
"rustc-hash",
"rustls",
"socket2",
- "thiserror 1.0.64",
+ "thiserror 2.0.3",
"tokio",
"tracing",
]
[[package]]
name = "quinn-proto"
-version = "0.11.8"
+version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6"
+checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d"
dependencies = [
"bytes",
+ "getrandom 0.2.15",
"rand 0.8.5",
"ring",
"rustc-hash",
"rustls",
+ "rustls-pki-types",
"slab",
- "thiserror 1.0.64",
+ "thiserror 2.0.3",
"tinyvec",
"tracing",
+ "web-time",
]
[[package]]
name = "quinn-udp"
-version = "0.5.5"
+version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b"
+checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da"
dependencies = [
+ "cfg_aliases",
"libc",
"once_cell",
"socket2",
@@ -4812,14 +4943,14 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
dependencies = [
"getrandom 0.2.15",
"libredox",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
name = "regex"
-version = "1.11.0"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
+checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
@@ -4829,9 +4960,9 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.4.8"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
+checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
@@ -4855,9 +4986,9 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.8"
+version = "0.12.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b"
+checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f"
dependencies = [
"async-compression",
"base64 0.22.1",
@@ -4922,9 +5053,9 @@ dependencies = [
[[package]]
name = "rfd"
-version = "0.15.0"
+version = "0.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8af382a047821a08aa6bfc09ab0d80ff48d45d8726f7cd8e44891f7cb4a4278e"
+checksum = "46f6f80a9b882647d9014673ca9925d30ffc9750f2eed2b4490e189eaebd01e8"
dependencies = [
"ashpd",
"block2",
@@ -4995,9 +5126,9 @@ checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
[[package]]
name = "rsa"
-version = "0.9.6"
+version = "0.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519"
dependencies = [
"const-oid",
"digest",
@@ -5071,9 +5202,9 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustc-hash"
-version = "2.0.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
+checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497"
[[package]]
name = "rustc_version"
@@ -5086,9 +5217,9 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.37"
+version = "0.38.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
+checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6"
dependencies = [
"bitflags 2.6.0",
"errno",
@@ -5099,9 +5230,9 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.23.15"
+version = "0.23.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993"
+checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1"
dependencies = [
"once_cell",
"ring",
@@ -5113,15 +5244,14 @@ dependencies = [
[[package]]
name = "rustls-native-certs"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a"
+checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3"
dependencies = [
"openssl-probe",
- "rustls-pemfile",
"rustls-pki-types",
"schannel",
- "security-framework",
+ "security-framework 3.0.1",
]
[[package]]
@@ -5138,6 +5268,9 @@ name = "rustls-pki-types"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
+dependencies = [
+ "web-time",
+]
[[package]]
name = "rustls-webpki"
@@ -5188,9 +5321,9 @@ dependencies = [
[[package]]
name = "schannel"
-version = "0.1.26"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1"
+checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
dependencies = [
"windows-sys 0.59.0",
]
@@ -5219,7 +5352,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -5278,11 +5411,24 @@ dependencies = [
"security-framework-sys",
]
+[[package]]
+name = "security-framework"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8"
+dependencies = [
+ "bitflags 2.6.0",
+ "core-foundation 0.10.0",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
[[package]]
name = "security-framework-sys"
-version = "2.12.0"
+version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6"
+checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2"
dependencies = [
"core-foundation-sys",
"libc",
@@ -5319,9 +5465,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.210"
+version = "1.0.215"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
+checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
dependencies = [
"serde_derive",
]
@@ -5339,13 +5485,13 @@ dependencies = [
[[package]]
name = "serde_derive"
-version = "1.0.210"
+version = "1.0.215"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
+checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -5356,16 +5502,16 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
name = "serde_json"
-version = "1.0.128"
+version = "1.0.133"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8"
+checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377"
dependencies = [
- "itoa 1.0.11",
+ "itoa 1.0.14",
"memchr",
"ryu",
"serde",
@@ -5379,7 +5525,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -5398,7 +5544,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
dependencies = [
"form_urlencoded",
- "itoa 1.0.11",
+ "itoa 1.0.14",
"ryu",
"serde",
]
@@ -5413,7 +5559,7 @@ dependencies = [
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"serde",
"serde_derive",
"serde_json",
@@ -5430,7 +5576,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -5578,9 +5724,9 @@ dependencies = [
[[package]]
name = "socket2"
-version = "0.5.7"
+version = "0.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
+checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -5593,7 +5739,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08"
dependencies = [
"bytemuck",
- "cfg_aliases 0.2.1",
+ "cfg_aliases",
"core-graphics 0.24.0",
"foreign-types 0.5.0",
"js-sys",
@@ -5642,7 +5788,7 @@ checksum = "4ccbb212565d2dc177bc15ecb7b039d66c4490da892436a4eee5b394d620c9bc"
dependencies = [
"paste",
"specta-macros",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
]
[[package]]
@@ -5654,7 +5800,7 @@ dependencies = [
"Inflector",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -5720,7 +5866,7 @@ dependencies = [
"hashbrown 0.14.5",
"hashlink",
"hex",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"log",
"memchr",
"once_cell",
@@ -5733,7 +5879,7 @@ dependencies = [
"sha2",
"smallvec",
"sqlformat",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"time",
"tokio",
"tokio-stream",
@@ -5752,7 +5898,7 @@ dependencies = [
"quote",
"sqlx-core",
"sqlx-macros-core",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -5775,7 +5921,7 @@ dependencies = [
"sqlx-mysql",
"sqlx-postgres",
"sqlx-sqlite",
- "syn 2.0.87",
+ "syn 2.0.90",
"tempfile",
"tokio",
"url",
@@ -5804,7 +5950,7 @@ dependencies = [
"hex",
"hkdf",
"hmac",
- "itoa 1.0.11",
+ "itoa 1.0.14",
"log",
"md-5",
"memchr",
@@ -5818,7 +5964,7 @@ dependencies = [
"smallvec",
"sqlx-core",
"stringprep",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"time",
"tracing",
"whoami",
@@ -5845,7 +5991,7 @@ dependencies = [
"hkdf",
"hmac",
"home",
- "itoa 1.0.11",
+ "itoa 1.0.14",
"log",
"md-5",
"memchr",
@@ -5857,7 +6003,7 @@ dependencies = [
"smallvec",
"sqlx-core",
"stringprep",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"time",
"tracing",
"whoami",
@@ -5961,7 +6107,7 @@ dependencies = [
"nix 0.24.3",
"rand 0.8.5",
"serde",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"windows 0.36.1",
"zeroize",
]
@@ -5990,7 +6136,7 @@ dependencies = [
"paste",
"serde",
"stronghold-runtime",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"zeroize",
]
@@ -6030,9 +6176,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.87"
+version = "2.0.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
+checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
dependencies = [
"proc-macro2",
"quote",
@@ -6040,31 +6186,30 @@ dependencies = [
]
[[package]]
-name = "syn_derive"
-version = "0.1.8"
+name = "sync_wrapper"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
dependencies = [
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 2.0.87",
+ "futures-core",
]
[[package]]
-name = "sync_wrapper"
-version = "1.0.1"
+name = "synstructure"
+version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
+checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
- "futures-core",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
]
[[package]]
name = "sys-locale"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0"
+checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4"
dependencies = [
"libc",
]
@@ -6099,15 +6244,15 @@ dependencies = [
"cfg-expr",
"heck 0.5.0",
"pkg-config",
- "toml 0.8.2",
+ "toml 0.8.19",
"version-compare",
]
[[package]]
name = "tao"
-version = "0.30.7"
+version = "0.30.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0368f818393ddb38d84cf7446adbf343cca3896da7dd2c8c2311059c11cb1740"
+checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da"
dependencies = [
"bitflags 2.6.0",
"cocoa",
@@ -6150,7 +6295,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -6161,9 +6306,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]]
name = "tar"
-version = "0.4.42"
+version = "0.4.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020"
+checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6"
dependencies = [
"filetime",
"libc",
@@ -6250,7 +6395,7 @@ dependencies = [
"tauri-codegen",
"tauri-utils",
"tauri-winres",
- "toml 0.8.2",
+ "toml 0.8.19",
"walkdir",
]
@@ -6272,7 +6417,7 @@ dependencies = [
"serde",
"serde_json",
"sha2",
- "syn 2.0.87",
+ "syn 2.0.90",
"tauri-utils",
"thiserror 2.0.3",
"time",
@@ -6290,16 +6435,16 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
"tauri-codegen",
"tauri-utils",
]
[[package]]
name = "tauri-plugin"
-version = "2.0.1"
+version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2e6660a409963e4d57b9bfab4addd141eeff41bd3a7fb14e13004a832cf7ef6"
+checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79"
dependencies = [
"anyhow",
"glob",
@@ -6308,7 +6453,7 @@ dependencies = [
"serde",
"serde_json",
"tauri-utils",
- "toml 0.8.2",
+ "toml 0.8.19",
"walkdir",
]
@@ -6317,7 +6462,6 @@ name = "tauri-plugin-autostart"
version = "2.0.1"
dependencies = [
"auto-launch",
- "log",
"serde",
"serde_json",
"tauri",
@@ -6378,10 +6522,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-deep-link"
-version = "2.0.1"
+version = "2.0.2"
dependencies = [
"dunce",
- "log",
"rust-ini",
"serde",
"serde_json",
@@ -6389,6 +6532,7 @@ dependencies = [
"tauri-plugin",
"tauri-utils",
"thiserror 2.0.3",
+ "tracing",
"url",
"windows-registry 0.3.0",
"windows-result 0.2.0",
@@ -6396,7 +6540,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-dialog"
-version = "2.0.3"
+version = "2.0.4"
dependencies = [
"log",
"raw-window-handle",
@@ -6412,7 +6556,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
-version = "2.0.3"
+version = "2.1.0"
dependencies = [
"anyhow",
"dunce",
@@ -6426,7 +6570,9 @@ dependencies = [
"serde_repr",
"tauri",
"tauri-plugin",
+ "tauri-utils",
"thiserror 2.0.3",
+ "toml 0.8.19",
"url",
"uuid",
]
@@ -6472,7 +6618,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-http"
-version = "2.0.3"
+version = "2.0.4"
dependencies = [
"data-url",
"http",
@@ -6486,13 +6632,14 @@ dependencies = [
"tauri-plugin-fs",
"thiserror 2.0.3",
"tokio",
+ "tracing",
"url",
"urlpattern",
]
[[package]]
name = "tauri-plugin-localhost"
-version = "2.0.1"
+version = "2.1.0"
dependencies = [
"http",
"log",
@@ -6505,7 +6652,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-log"
-version = "2.0.2"
+version = "2.0.3"
dependencies = [
"android_logger",
"byte-unit",
@@ -6558,6 +6705,26 @@ dependencies = [
"windows-version",
]
+[[package]]
+name = "tauri-plugin-opener"
+version = "2.0.0"
+dependencies = [
+ "dunce",
+ "glob",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "open",
+ "schemars",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-plugin",
+ "thiserror 2.0.3",
+ "url",
+ "windows 0.58.0",
+ "zbus 4.4.0",
+]
+
[[package]]
name = "tauri-plugin-os"
version = "2.0.1"
@@ -6576,7 +6743,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-persisted-scope"
-version = "2.0.3"
+version = "2.1.0"
dependencies = [
"aho-corasick",
"bincode",
@@ -6590,7 +6757,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-positioner"
-version = "2.0.2"
+version = "2.1.0"
dependencies = [
"log",
"serde",
@@ -6630,25 +6797,25 @@ dependencies = [
[[package]]
name = "tauri-plugin-single-instance"
-version = "2.0.1"
+version = "2.0.2"
dependencies = [
- "log",
"semver",
"serde",
"serde_json",
"tauri",
"tauri-plugin-deep-link",
"thiserror 2.0.3",
+ "tracing",
"windows-sys 0.59.0",
- "zbus",
+ "zbus 4.4.0",
]
[[package]]
name = "tauri-plugin-sql"
-version = "2.0.2"
+version = "2.0.3"
dependencies = [
"futures-core",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"log",
"serde",
"serde_json",
@@ -6665,13 +6832,13 @@ name = "tauri-plugin-store"
version = "2.1.0"
dependencies = [
"dunce",
- "log",
"serde",
"serde_json",
"tauri",
"tauri-plugin",
"thiserror 2.0.3",
"tokio",
+ "tracing",
]
[[package]]
@@ -6697,7 +6864,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-updater"
-version = "2.0.2"
+version = "2.1.0"
dependencies = [
"base64 0.22.1",
"dirs 5.0.1",
@@ -6725,7 +6892,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-upload"
-version = "2.1.0"
+version = "2.2.1"
dependencies = [
"futures-util",
"log",
@@ -6849,7 +7016,7 @@ dependencies = [
"serialize-to-javascript",
"swift-rs",
"thiserror 2.0.3",
- "toml 0.8.2",
+ "toml 0.8.19",
"url",
"urlpattern",
"uuid",
@@ -6879,9 +7046,9 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.13.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
+checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c"
dependencies = [
"cfg-if",
"fastrand",
@@ -6918,11 +7085,11 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
[[package]]
name = "thiserror"
-version = "1.0.64"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
- "thiserror-impl 1.0.64",
+ "thiserror-impl 1.0.69",
]
[[package]]
@@ -6936,13 +7103,13 @@ dependencies = [
[[package]]
name = "thiserror-impl"
-version = "1.0.64"
+version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -6953,7 +7120,7 @@ checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -6974,7 +7141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
dependencies = [
"deranged",
- "itoa 1.0.11",
+ "itoa 1.0.14",
"libc",
"num-conv",
"num_threads",
@@ -7021,6 +7188,16 @@ dependencies = [
"log",
]
+[[package]]
+name = "tinystr"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
[[package]]
name = "tinyvec"
version = "1.8.0"
@@ -7038,9 +7215,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.40.0"
+version = "1.41.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
+checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33"
dependencies = [
"backtrace",
"bytes",
@@ -7063,7 +7240,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -7095,7 +7272,7 @@ checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f"
dependencies = [
"either",
"futures-util",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"tokio",
]
@@ -7156,21 +7333,21 @@ dependencies = [
[[package]]
name = "toml"
-version = "0.8.2"
+version = "0.8.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
- "toml_edit 0.20.2",
+ "toml_edit 0.22.22",
]
[[package]]
name = "toml_datetime"
-version = "0.6.3"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
dependencies = [
"serde",
]
@@ -7181,24 +7358,35 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow",
+ "winnow 0.5.40",
]
[[package]]
name = "toml_edit"
-version = "0.20.2"
+version = "0.20.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
dependencies = [
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
+ "toml_datetime",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
+dependencies = [
+ "indexmap 2.7.0",
"serde",
"serde_spanned",
"toml_datetime",
- "winnow",
+ "winnow 0.6.20",
]
[[package]]
@@ -7209,9 +7397,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
-version = "0.1.40"
+version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
dependencies = [
"log",
"pin-project-lite",
@@ -7221,29 +7409,29 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
name = "tracing-core"
-version = "0.1.32"
+version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
dependencies = [
"once_cell",
]
[[package]]
name = "tray-icon"
-version = "0.19.1"
+version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c92af36a182b46206723bdf8a7942e20838cde1cf062e5b97854d57eb01763b"
+checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b"
dependencies = [
"core-graphics 0.24.0",
"crossbeam-channel",
@@ -7256,7 +7444,7 @@ dependencies = [
"once_cell",
"png",
"serde",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"windows-sys 0.59.0",
]
@@ -7289,7 +7477,7 @@ dependencies = [
"rustls",
"rustls-pki-types",
"sha1",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"utf-8",
]
@@ -7359,12 +7547,9 @@ dependencies = [
[[package]]
name = "unicase"
-version = "2.7.0"
+version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
-dependencies = [
- "version_check",
-]
+checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df"
[[package]]
name = "unicode-bidi"
@@ -7374,9 +7559,9 @@ checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893"
[[package]]
name = "unicode-ident"
-version = "1.0.13"
+version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
+checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "unicode-normalization"
@@ -7448,12 +7633,12 @@ dependencies = [
[[package]]
name = "url"
-version = "2.5.2"
+version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
+checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
dependencies = [
"form_urlencoded",
- "idna 0.5.0",
+ "idna",
"percent-encoding",
"serde",
]
@@ -7476,12 +7661,24 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+[[package]]
+name = "utf16_iter"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
+
[[package]]
name = "utf8-width"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3"
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -7500,9 +7697,9 @@ dependencies = [
[[package]]
name = "value-bag"
-version = "1.9.0"
+version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101"
+checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2"
[[package]]
name = "vcpkg"
@@ -7590,9 +7787,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
[[package]]
name = "wasm-bindgen"
-version = "0.2.95"
+version = "0.2.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e"
+checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c"
dependencies = [
"cfg-if",
"once_cell",
@@ -7601,36 +7798,37 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.95"
+version = "0.2.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358"
+checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.45"
+version = "0.4.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b"
+checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d"
dependencies = [
"cfg-if",
"js-sys",
+ "once_cell",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.95"
+version = "0.2.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56"
+checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -7638,28 +7836,28 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.95"
+version = "0.2.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
+checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.95"
+version = "0.2.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
+checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49"
[[package]]
name = "wasm-streams"
-version = "0.4.1"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd"
+checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65"
dependencies = [
"futures-util",
"js-sys",
@@ -7684,9 +7882,9 @@ dependencies = [
[[package]]
name = "wayland-client"
-version = "0.31.6"
+version = "0.31.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d"
+checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280"
dependencies = [
"bitflags 2.6.0",
"rustix",
@@ -7696,9 +7894,9 @@ dependencies = [
[[package]]
name = "wayland-protocols"
-version = "0.32.4"
+version = "0.32.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0"
+checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e"
dependencies = [
"bitflags 2.6.0",
"wayland-backend",
@@ -7730,9 +7928,19 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.72"
+version = "0.3.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "web-time"
+version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -7784,9 +7992,9 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "0.26.6"
+version = "0.26.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
+checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e"
dependencies = [
"rustls-pki-types",
]
@@ -7827,7 +8035,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -7836,7 +8044,7 @@ version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886"
dependencies = [
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"windows 0.58.0",
"windows-core 0.58.0",
]
@@ -7987,7 +8195,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -7998,7 +8206,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -8009,7 +8217,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -8020,7 +8228,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
]
[[package]]
@@ -8344,6 +8552,15 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "winnow"
+version = "0.6.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
+dependencies = [
+ "memchr",
+]
+
[[package]]
name = "winreg"
version = "0.10.1"
@@ -8363,11 +8580,23 @@ dependencies = [
"windows-sys 0.48.0",
]
+[[package]]
+name = "write16"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
+
+[[package]]
+name = "writeable"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+
[[package]]
name = "wry"
-version = "0.47.0"
+version = "0.47.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "553ca1ce149982123962fac2506aa75b8b76288779a77e72b12fa2fc34938647"
+checksum = "61ce51277d65170f6379d8cda935c80e3c2d1f0ff712a123c8bddb11b31a4b73"
dependencies = [
"base64 0.22.1",
"block2",
@@ -8395,7 +8624,7 @@ dependencies = [
"sha2",
"soup3",
"tao-macros",
- "thiserror 1.0.64",
+ "thiserror 1.0.69",
"url",
"webkit2gtk",
"webkit2gtk-sys",
@@ -8485,11 +8714,35 @@ dependencies = [
"windows-sys 0.59.0",
]
+[[package]]
+name = "yoke"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "synstructure",
+]
+
[[package]]
name = "zbus"
-version = "4.0.1"
+version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030"
+checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725"
dependencies = [
"async-broadcast",
"async-executor",
@@ -8501,42 +8754,84 @@ dependencies = [
"async-task",
"async-trait",
"blocking",
- "derivative",
"enumflags2",
"event-listener",
"futures-core",
"futures-sink",
"futures-util",
"hex",
- "nix 0.27.1",
+ "nix 0.29.0",
"ordered-stream",
"rand 0.8.5",
"serde",
"serde_repr",
"sha1",
"static_assertions",
- "tokio",
"tracing",
"uds_windows",
"windows-sys 0.52.0",
"xdg-home",
- "zbus_macros",
- "zbus_names",
- "zvariant",
+ "zbus_macros 4.4.0",
+ "zbus_names 3.0.0",
+ "zvariant 4.2.0",
+]
+
+[[package]]
+name = "zbus"
+version = "5.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1162094dc63b1629fcc44150bcceeaa80798cd28bcbe7fa987b65a034c258608"
+dependencies = [
+ "async-broadcast",
+ "async-recursion",
+ "async-trait",
+ "enumflags2",
+ "event-listener",
+ "futures-core",
+ "futures-util",
+ "hex",
+ "nix 0.29.0",
+ "ordered-stream",
+ "serde",
+ "serde_repr",
+ "static_assertions",
+ "tokio",
+ "tracing",
+ "uds_windows",
+ "windows-sys 0.59.0",
+ "winnow 0.6.20",
+ "xdg-home",
+ "zbus_macros 5.1.1",
+ "zbus_names 4.1.0",
+ "zvariant 5.1.0",
]
[[package]]
name = "zbus_macros"
-version = "4.0.1"
+version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7"
+checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e"
dependencies = [
- "proc-macro-crate 1.3.1",
+ "proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "regex",
- "syn 1.0.109",
- "zvariant_utils",
+ "syn 2.0.90",
+ "zvariant_utils 2.1.0",
+]
+
+[[package]]
+name = "zbus_macros"
+version = "5.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cd2dcdce3e2727f7d74b7e33b5a89539b3cc31049562137faf7ae4eb86cd16d"
+dependencies = [
+ "proc-macro-crate 3.2.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "zbus_names 4.1.0",
+ "zvariant 5.1.0",
+ "zvariant_utils 3.0.2",
]
[[package]]
@@ -8547,7 +8842,19 @@ checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c"
dependencies = [
"serde",
"static_assertions",
- "zvariant",
+ "zvariant 4.2.0",
+]
+
+[[package]]
+name = "zbus_names"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "856b7a38811f71846fd47856ceee8bccaec8399ff53fb370247e66081ace647b"
+dependencies = [
+ "serde",
+ "static_assertions",
+ "winnow 0.6.20",
+ "zvariant 5.1.0",
]
[[package]]
@@ -8568,7 +8875,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "synstructure",
]
[[package]]
@@ -8589,23 +8917,45 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.87",
+ "syn 2.0.90",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
]
[[package]]
name = "zip"
-version = "2.2.0"
+version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc5e4288ea4057ae23afc69a4472434a87a2495cafce6632fd1c4ec9f5cf3494"
+checksum = "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352"
dependencies = [
"arbitrary",
"crc32fast",
"crossbeam-utils",
"displaydoc",
"flate2",
- "indexmap 2.6.0",
+ "indexmap 2.7.0",
"memchr",
- "thiserror 1.0.64",
+ "thiserror 2.0.3",
"zopfli",
]
@@ -8625,38 +8975,80 @@ dependencies = [
[[package]]
name = "zvariant"
-version = "4.0.0"
+version = "4.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe"
+dependencies = [
+ "endi",
+ "enumflags2",
+ "serde",
+ "static_assertions",
+ "zvariant_derive 4.2.0",
+]
+
+[[package]]
+name = "zvariant"
+version = "5.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65"
+checksum = "a1200ee6ac32f1e5a312e455a949a4794855515d34f9909f4a3e082d14e1a56f"
dependencies = [
"endi",
"enumflags2",
"serde",
"static_assertions",
"url",
- "zvariant_derive",
+ "winnow 0.6.20",
+ "zvariant_derive 5.1.0",
+ "zvariant_utils 3.0.2",
]
[[package]]
name = "zvariant_derive"
-version = "4.0.0"
+version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e"
+checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449"
dependencies = [
- "proc-macro-crate 1.3.1",
+ "proc-macro-crate 3.2.0",
"proc-macro2",
"quote",
- "syn 1.0.109",
- "zvariant_utils",
+ "syn 2.0.90",
+ "zvariant_utils 2.1.0",
+]
+
+[[package]]
+name = "zvariant_derive"
+version = "5.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "687e3b97fae6c9104fbbd36c73d27d149abf04fb874e2efbd84838763daa8916"
+dependencies = [
+ "proc-macro-crate 3.2.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.90",
+ "zvariant_utils 3.0.2",
]
[[package]]
name = "zvariant_utils"
-version = "1.1.0"
+version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172"
+checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340"
dependencies = [
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.90",
+]
+
+[[package]]
+name = "zvariant_utils"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20d1d011a38f12360e5fcccceeff5e2c42a8eb7f27f0dcba97a0862ede05c9c6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "static_assertions",
+ "syn 2.0.90",
+ "winnow 0.6.20",
]
diff --git a/Cargo.toml b/Cargo.toml
index 4143e048d..d7543fd8d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,6 +10,7 @@ resolver = "2"
[workspace.dependencies]
serde = { version = "1", features = ["derive"] }
+tracing = "0.1"
log = "0.4"
tauri = { version = "2", default-features = false }
tauri-build = "2"
@@ -21,6 +22,8 @@ url = "2"
schemars = "0.8"
dunce = "1"
specta = "=2.0.0-rc.20"
+glob = "0.3"
+zbus = "4"
#tauri-specta = "=2.0.0-rc.11"
[workspace.package]
diff --git a/README.md b/README.md
index fe4f90f2b..f9fa736af 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,7 @@ This repo and all plugins require a Rust version of at least **1.77.2**
| [log](plugins/log) | Configurable logging. | ✅ | ✅ | ✅ | ✅ | ✅ |
| [nfc](plugins/nfc) | Read and write NFC tags on Android and iOS. | ? | ? | ? | ✅ | ✅ |
| [notification](plugins/notification) | Send message notifications (brief auto-expiring OS window element) to your user. Can also be used with the Notification Web API. | ✅ | ✅ | ✅ | ✅ | ✅ |
+| [opener](plugins/opener) | Open files and URLs using their default application. | ✅ | ✅ | ✅ | ? | ? |
| [os](plugins/os) | Read information about the operating system. | ✅ | ✅ | ✅ | ✅ | ✅ |
| [persisted-scope](plugins/persisted-scope) | Persist runtime scope changes on the filesystem. | ✅ | ✅ | ✅ | ? | ? |
| [positioner](plugins/positioner) | Move windows to common locations. | ✅ | ✅ | ✅ | ❌ | ❌ |
diff --git a/examples/api/CHANGELOG.md b/examples/api/CHANGELOG.md
index 4313f7e3a..49dc568e4 100644
--- a/examples/api/CHANGELOG.md
+++ b/examples/api/CHANGELOG.md
@@ -1,5 +1,14 @@
# Changelog
+## \[2.0.3]
+
+### Dependencies
+
+- Upgraded to `clipboard-manager-js@2.0.1`
+- Upgraded to `log-js@2.0.1`
+- Upgraded to `fs-js@2.0.3`
+- Upgraded to `opener-js@2.0.0`
+
## \[2.0.2]
### Dependencies
diff --git a/examples/api/package.json b/examples/api/package.json
index 53b66b37d..8cecc3f42 100644
--- a/examples/api/package.json
+++ b/examples/api/package.json
@@ -1,7 +1,7 @@
{
"name": "api",
"private": true,
- "version": "2.0.2",
+ "version": "2.0.3",
"type": "module",
"scripts": {
"dev": "vite --clearScreen false",
@@ -14,11 +14,12 @@
"@tauri-apps/plugin-barcode-scanner": "2.0.0",
"@tauri-apps/plugin-biometric": "2.0.0",
"@tauri-apps/plugin-cli": "2.0.0",
- "@tauri-apps/plugin-clipboard-manager": "2.0.0",
+ "@tauri-apps/plugin-clipboard-manager": "2.0.1",
"@tauri-apps/plugin-dialog": "2.0.1",
- "@tauri-apps/plugin-fs": "2.0.2",
+ "@tauri-apps/plugin-fs": "2.0.3",
"@tauri-apps/plugin-geolocation": "2.0.0",
"@tauri-apps/plugin-global-shortcut": "2.0.0",
+ "@tauri-apps/plugin-opener": "2.0.0",
"@tauri-apps/plugin-haptics": "2.0.0",
"@tauri-apps/plugin-http": "2.0.1",
"@tauri-apps/plugin-nfc": "2.0.0",
@@ -33,11 +34,11 @@
"devDependencies": {
"@iconify-json/codicon": "^1.1.37",
"@iconify-json/ph": "^1.1.8",
- "@sveltejs/vite-plugin-svelte": "^4.0.0",
+ "@sveltejs/vite-plugin-svelte": "^5.0.0",
"@tauri-apps/cli": "2.1.0",
- "@unocss/extractor-svelte": "^0.64.0",
+ "@unocss/extractor-svelte": "^0.65.0",
"svelte": "^5.0.0",
- "unocss": "^0.64.0",
- "vite": "^5.4.7"
+ "unocss": "^0.65.0",
+ "vite": "^6.0.0"
}
}
diff --git a/examples/api/src-tauri/CHANGELOG.md b/examples/api/src-tauri/CHANGELOG.md
index d4855a8bb..e8fea24be 100644
--- a/examples/api/src-tauri/CHANGELOG.md
+++ b/examples/api/src-tauri/CHANGELOG.md
@@ -1,5 +1,16 @@
# Changelog
+## \[2.0.6]
+
+### Dependencies
+
+- Upgraded to `fs@2.1.0`
+- Upgraded to `updater@2.1.0`
+- Upgraded to `dialog@2.0.4`
+- Upgraded to `log-plugin@2.0.3`
+- Upgraded to `http@2.0.4`
+- Upgraded to `opener@2.0.0`
+
## \[2.0.5]
### Dependencies
diff --git a/examples/api/src-tauri/Cargo.toml b/examples/api/src-tauri/Cargo.toml
index 6bf016149..6a60f5b76 100644
--- a/examples/api/src-tauri/Cargo.toml
+++ b/examples/api/src-tauri/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "api"
publish = false
-version = "2.0.5"
+version = "2.0.6"
description = "An example Tauri Application showcasing the api"
edition = "2021"
rust-version = { workspace = true }
@@ -19,20 +19,21 @@ serde_json = { workspace = true }
serde = { workspace = true }
tiny_http = "0.12"
log = { workspace = true }
-tauri-plugin-log = { path = "../../../plugins/log", version = "2.0.2" }
-tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.0.3", features = [
+tauri-plugin-log = { path = "../../../plugins/log", version = "2.0.3" }
+tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.1.0", features = [
"watch",
] }
tauri-plugin-clipboard-manager = { path = "../../../plugins/clipboard-manager", version = "2.0.2" }
-tauri-plugin-dialog = { path = "../../../plugins/dialog", version = "2.0.3" }
+tauri-plugin-dialog = { path = "../../../plugins/dialog", version = "2.0.4" }
tauri-plugin-http = { path = "../../../plugins/http", features = [
"multipart",
-], version = "2.0.3" }
+], version = "2.0.4" }
tauri-plugin-notification = { path = "../../../plugins/notification", version = "2.0.1", features = [
"windows7-compat",
] }
tauri-plugin-os = { path = "../../../plugins/os", version = "2.0.1" }
tauri-plugin-process = { path = "../../../plugins/process", version = "2.0.1" }
+tauri-plugin-opener = { path = "../../../plugins/opener", version = "2.0.0" }
tauri-plugin-shell = { path = "../../../plugins/shell", version = "2.0.2" }
tauri-plugin-store = { path = "../../../plugins/store", version = "2.1.0" }
@@ -52,7 +53,7 @@ features = [
[target."cfg(any(target_os = \"macos\", windows, target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies]
tauri-plugin-cli = { path = "../../../plugins/cli", version = "2.0.1" }
tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut", version = "2.0.1" }
-tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.0.2" }
+tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.1.0" }
tauri-plugin-window-state = { path = "../../../plugins/window-state", version = "2.0.0" }
[target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies]
diff --git a/examples/api/src-tauri/capabilities/base.json b/examples/api/src-tauri/capabilities/base.json
index 68a22389d..92532e7d1 100644
--- a/examples/api/src-tauri/capabilities/base.json
+++ b/examples/api/src-tauri/capabilities/base.json
@@ -80,6 +80,11 @@
],
"deny": ["$APPDATA/db/*.stronghold"]
},
- "store:default"
+ "store:default",
+ "opener:default",
+ {
+ "identifier": "opener:allow-open-path",
+ "allow": [{ "path": "$APPDATA" }, { "path": "$APPDATA/**" }]
+ }
]
}
diff --git a/examples/api/src-tauri/src/lib.rs b/examples/api/src-tauri/src/lib.rs
index 701f67318..dc1337995 100644
--- a/examples/api/src-tauri/src/lib.rs
+++ b/examples/api/src-tauri/src/lib.rs
@@ -36,6 +36,7 @@ pub fn run() {
.plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_os::init())
.plugin(tauri_plugin_process::init())
+ .plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_store::Builder::default().build())
.setup(move |app| {
diff --git a/examples/api/src/App.svelte b/examples/api/src/App.svelte
index f93198c26..9396f6f93 100644
--- a/examples/api/src/App.svelte
+++ b/examples/api/src/App.svelte
@@ -1,6 +1,5 @@
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
index 20b052cc1..35e93626c 100644
--- a/package.json
+++ b/package.json
@@ -11,20 +11,20 @@
"example:api:dev": "pnpm run --filter \"api\" tauri dev"
},
"devDependencies": {
- "@eslint/js": "9.14.0",
+ "@eslint/js": "9.16.0",
"@rollup/plugin-node-resolve": "15.3.0",
"@rollup/plugin-terser": "0.4.4",
"@rollup/plugin-typescript": "11.1.6",
"@types/eslint__js": "8.42.3",
"covector": "^0.12.3",
- "eslint": "9.14.0",
+ "eslint": "9.16.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-security": "3.0.1",
- "prettier": "3.3.3",
- "rollup": "4.27.2",
+ "prettier": "3.4.1",
+ "rollup": "4.28.0",
"tslib": "2.8.1",
- "typescript": "5.6.3",
- "typescript-eslint": "8.14.0"
+ "typescript": "5.7.2",
+ "typescript-eslint": "8.17.0"
},
"resolutions": {
"semver": ">=7.5.2",
diff --git a/plugins/autostart/Cargo.toml b/plugins/autostart/Cargo.toml
index 77f555e60..69848bf6b 100644
--- a/plugins/autostart/Cargo.toml
+++ b/plugins/autostart/Cargo.toml
@@ -27,6 +27,5 @@ tauri-plugin = { workspace = true, features = ["build"] }
serde = { workspace = true }
serde_json = { workspace = true }
tauri = { workspace = true }
-log = { workspace = true }
thiserror = { workspace = true }
auto-launch = "0.5"
diff --git a/plugins/autostart/README.md b/plugins/autostart/README.md
index 0a1415dbd..76d68f73c 100644
--- a/plugins/autostart/README.md
+++ b/plugins/autostart/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-autostart#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
use tauri_plugin_autostart::MacosLauncher;
diff --git a/plugins/autostart/src/lib.rs b/plugins/autostart/src/lib.rs
index c0cf295d6..5550bfa1d 100644
--- a/plugins/autostart/src/lib.rs
+++ b/plugins/autostart/src/lib.rs
@@ -11,8 +11,6 @@
#![cfg(not(any(target_os = "android", target_os = "ios")))]
use auto_launch::{AutoLaunch, AutoLaunchBuilder};
-#[cfg(target_os = "macos")]
-use log::info;
use serde::{ser::Serializer, Serialize};
use tauri::{
command,
@@ -133,7 +131,6 @@ pub fn init(
} else {
exe_path
};
- info!("auto_start path {}", &app_path);
builder.set_app_path(&app_path);
}
#[cfg(target_os = "linux")]
diff --git a/plugins/barcode-scanner/README.md b/plugins/barcode-scanner/README.md
index eba7ca9e7..4abbef0ad 100644
--- a/plugins/barcode-scanner/README.md
+++ b/plugins/barcode-scanner/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-barcode-scanner#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/biometric/README.md b/plugins/biometric/README.md
index 2028595dd..c7844f7bd 100644
--- a/plugins/biometric/README.md
+++ b/plugins/biometric/README.md
@@ -56,7 +56,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-biometric#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/cli/README.md b/plugins/cli/README.md
index 05d5bd35e..91a8080b8 100644
--- a/plugins/cli/README.md
+++ b/plugins/cli/README.md
@@ -55,7 +55,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-cli#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/clipboard-manager/CHANGELOG.md b/plugins/clipboard-manager/CHANGELOG.md
index 6b352e774..1ab76211f 100644
--- a/plugins/clipboard-manager/CHANGELOG.md
+++ b/plugins/clipboard-manager/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## \[2.0.1]
+
+- [`3fa0fc09`](https://github.com/tauri-apps/plugins-workspace/commit/3fa0fc09bbee0d619801e5757af9fb3c09883c97) ([#2099](https://github.com/tauri-apps/plugins-workspace/pull/2099) by [@rasteiner](https://github.com/tauri-apps/plugins-workspace/../../rasteiner)) Fix clipboard manager client side api not copying fallback alternative text when calling `writeHtml`.
+
## \[2.0.2]
- [`d57df4de`](https://github.com/tauri-apps/plugins-workspace/commit/d57df4debe7c75cfbd6d6558fff1beb07dbee54c) ([#1986](https://github.com/tauri-apps/plugins-workspace/pull/1986) by [@RikaKagurasaka](https://github.com/tauri-apps/plugins-workspace/../../RikaKagurasaka)) Fix that `read_image` wrongly set the image rgba data with binary PNG data.
diff --git a/plugins/clipboard-manager/README.md b/plugins/clipboard-manager/README.md
index daec970d4..935d8ff9d 100644
--- a/plugins/clipboard-manager/README.md
+++ b/plugins/clipboard-manager/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-clipboard-manager#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/clipboard-manager/api-iife.js b/plugins/clipboard-manager/api-iife.js
index 7750e01d1..0b790d2b4 100644
--- a/plugins/clipboard-manager/api-iife.js
+++ b/plugins/clipboard-manager/api-iife.js
@@ -1 +1 @@
-if("__TAURI__"in window){var __TAURI_PLUGIN_CLIPBOARD_MANAGER__=function(e){"use strict";var t;async function r(e,t={},r){return window.__TAURI_INTERNALS__.invoke(e,t,r)}"function"==typeof SuppressedError&&SuppressedError;class n{get rid(){return function(e,t,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)}(this,t,"f")}constructor(e){t.set(this,void 0),function(e,t,r,n,a){if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");t.set(e,r)}(this,t,e)}async close(){return r("plugin:resources|close",{rid:this.rid})}}t=new WeakMap;class a extends n{constructor(e){super(e)}static async new(e,t,n){return r("plugin:image|new",{rgba:i(e),width:t,height:n}).then((e=>new a(e)))}static async fromBytes(e){return r("plugin:image|from_bytes",{bytes:i(e)}).then((e=>new a(e)))}static async fromPath(e){return r("plugin:image|from_path",{path:e}).then((e=>new a(e)))}async rgba(){return r("plugin:image|rgba",{rid:this.rid}).then((e=>new Uint8Array(e)))}async size(){return r("plugin:image|size",{rid:this.rid})}}function i(e){return null==e?null:"string"==typeof e?e:e instanceof a?e.rid:e}return e.clear=async function(){await r("plugin:clipboard-manager|clear")},e.readImage=async function(){return await r("plugin:clipboard-manager|read_image").then((e=>new a(e)))},e.readText=async function(){return await r("plugin:clipboard-manager|read_text")},e.writeHtml=async function(e,t){await r("plugin:clipboard-manager|write_html",{html:e,altHtml:t})},e.writeImage=async function(e){await r("plugin:clipboard-manager|write_image",{image:i(e)})},e.writeText=async function(e,t){await r("plugin:clipboard-manager|write_text",{label:t?.label,text:e})},e}({});Object.defineProperty(window.__TAURI__,"clipboardManager",{value:__TAURI_PLUGIN_CLIPBOARD_MANAGER__})}
+if("__TAURI__"in window){var __TAURI_PLUGIN_CLIPBOARD_MANAGER__=function(e){"use strict";var t;async function r(e,t={},r){return window.__TAURI_INTERNALS__.invoke(e,t,r)}"function"==typeof SuppressedError&&SuppressedError;class n{get rid(){return function(e,t,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)}(this,t,"f")}constructor(e){t.set(this,void 0),function(e,t,r,n,a){if("function"==typeof t?e!==t||!a:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");t.set(e,r)}(this,t,e)}async close(){return r("plugin:resources|close",{rid:this.rid})}}t=new WeakMap;class a extends n{constructor(e){super(e)}static async new(e,t,n){return r("plugin:image|new",{rgba:i(e),width:t,height:n}).then((e=>new a(e)))}static async fromBytes(e){return r("plugin:image|from_bytes",{bytes:i(e)}).then((e=>new a(e)))}static async fromPath(e){return r("plugin:image|from_path",{path:e}).then((e=>new a(e)))}async rgba(){return r("plugin:image|rgba",{rid:this.rid}).then((e=>new Uint8Array(e)))}async size(){return r("plugin:image|size",{rid:this.rid})}}function i(e){return null==e?null:"string"==typeof e?e:e instanceof a?e.rid:e}return e.clear=async function(){await r("plugin:clipboard-manager|clear")},e.readImage=async function(){return await r("plugin:clipboard-manager|read_image").then((e=>new a(e)))},e.readText=async function(){return await r("plugin:clipboard-manager|read_text")},e.writeHtml=async function(e,t){await r("plugin:clipboard-manager|write_html",{html:e,altText:t})},e.writeImage=async function(e){await r("plugin:clipboard-manager|write_image",{image:i(e)})},e.writeText=async function(e,t){await r("plugin:clipboard-manager|write_text",{label:t?.label,text:e})},e}({});Object.defineProperty(window.__TAURI__,"clipboardManager",{value:__TAURI_PLUGIN_CLIPBOARD_MANAGER__})}
diff --git a/plugins/clipboard-manager/guest-js/index.ts b/plugins/clipboard-manager/guest-js/index.ts
index f7f31842a..fb7304262 100644
--- a/plugins/clipboard-manager/guest-js/index.ts
+++ b/plugins/clipboard-manager/guest-js/index.ts
@@ -65,6 +65,7 @@ async function readText(): Promise {
* 0, 255, 0, 255,
* ];
* await writeImage(buffer);
+ * ```
*
* @returns A promise indicating the success or failure of the operation.
*
@@ -90,7 +91,7 @@ async function writeImage(
* import { readImage } from '@tauri-apps/plugin-clipboard-manager';
*
* const clipboardImage = await readImage();
- * const blob = new Blob([clipboardImage.bytes], { type: 'image' })
+ * const blob = new Blob([await clipboardImage.rbga()], { type: 'image' })
* const url = URL.createObjectURL(blob)
* ```
* @since 2.0.0
@@ -120,10 +121,10 @@ async function readImage(): Promise {
*
* @since 2.0.0
*/
-async function writeHtml(html: string, altHtml?: string): Promise {
+async function writeHtml(html: string, altText?: string): Promise {
await invoke('plugin:clipboard-manager|write_html', {
html,
- altHtml
+ altText
})
}
diff --git a/plugins/clipboard-manager/package.json b/plugins/clipboard-manager/package.json
index f48979944..483d66b6b 100644
--- a/plugins/clipboard-manager/package.json
+++ b/plugins/clipboard-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "@tauri-apps/plugin-clipboard-manager",
- "version": "2.0.0",
+ "version": "2.0.1",
"license": "MIT OR Apache-2.0",
"authors": [
"Tauri Programme within The Commons Conservancy"
diff --git a/plugins/deep-link/CHANGELOG.md b/plugins/deep-link/CHANGELOG.md
index 2f2da36dd..4d0495565 100644
--- a/plugins/deep-link/CHANGELOG.md
+++ b/plugins/deep-link/CHANGELOG.md
@@ -2,6 +2,10 @@
## \[2.0.1]
+- [`b2aea045`](https://github.com/tauri-apps/plugins-workspace/commit/b2aea0456799775a7243706fdd7a5abf9a193992) ([#2008](https://github.com/tauri-apps/plugins-workspace/pull/2008) by [@FabianLars](https://github.com/tauri-apps/plugins-workspace/../../FabianLars)) `onOpenUrl()` will now not call `getCurrent()` anymore, matching the documented behavior.
+
+## \[2.0.1]
+
- [`a1a82208`](https://github.com/tauri-apps/plugins-workspace/commit/a1a82208ed4ab87f83310be0dc95428aec9ab241) ([#1873](https://github.com/tauri-apps/plugins-workspace/pull/1873) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Downgrade MSRV to 1.77.2 to support Windows 7.
## \[2.0.0]
diff --git a/plugins/deep-link/Cargo.toml b/plugins/deep-link/Cargo.toml
index db5c02476..dabd1c3bf 100644
--- a/plugins/deep-link/Cargo.toml
+++ b/plugins/deep-link/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tauri-plugin-deep-link"
-version = "2.0.1"
+version = "2.0.2"
description = "Set your Tauri application as the default handler for an URL"
authors = { workspace = true }
license = { workspace = true }
@@ -32,7 +32,7 @@ serde = { workspace = true }
serde_json = { workspace = true }
tauri = { workspace = true }
tauri-utils = { workspace = true }
-log = { workspace = true }
+tracing = { workspace = true }
thiserror = { workspace = true }
url = { workspace = true }
diff --git a/plugins/deep-link/README.md b/plugins/deep-link/README.md
index 77fae2c8a..61a36a80a 100644
--- a/plugins/deep-link/README.md
+++ b/plugins/deep-link/README.md
@@ -133,7 +133,7 @@ Under `tauri.conf.json > plugins > deep-link`, configure the domains (mobile) an
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/deep-link/examples/app/CHANGELOG.md b/plugins/deep-link/examples/app/CHANGELOG.md
index ba903aea3..be90bd2e6 100644
--- a/plugins/deep-link/examples/app/CHANGELOG.md
+++ b/plugins/deep-link/examples/app/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## \[2.0.1]
+
+### Dependencies
+
+- Upgraded to `deep-link-js@2.0.1`
+
## \[2.0.0]
- [`e2c4dfb6`](https://github.com/tauri-apps/plugins-workspace/commit/e2c4dfb6af43e5dd8d9ceba232c315f5febd55c1) Update to tauri v2 stable release.
diff --git a/plugins/deep-link/examples/app/package.json b/plugins/deep-link/examples/app/package.json
index 0e997a5cf..954b14b0b 100644
--- a/plugins/deep-link/examples/app/package.json
+++ b/plugins/deep-link/examples/app/package.json
@@ -1,7 +1,7 @@
{
"name": "deep-link-example",
"private": true,
- "version": "2.0.0",
+ "version": "2.0.1",
"type": "module",
"scripts": {
"dev": "vite",
@@ -11,11 +11,11 @@
},
"dependencies": {
"@tauri-apps/api": "2.1.1",
- "@tauri-apps/plugin-deep-link": "2.0.0"
+ "@tauri-apps/plugin-deep-link": "2.0.1"
},
"devDependencies": {
"@tauri-apps/cli": "2.1.0",
"typescript": "^5.2.2",
- "vite": "^5.4.7"
+ "vite": "^6.0.0"
}
}
diff --git a/plugins/deep-link/guest-js/index.ts b/plugins/deep-link/guest-js/index.ts
index c9190d7ac..461bec8ad 100644
--- a/plugins/deep-link/guest-js/index.ts
+++ b/plugins/deep-link/guest-js/index.ts
@@ -73,7 +73,7 @@ export async function unregister(protocol: string): Promise {
* await isRegistered("my-scheme");
* ```
*
- * #### - **macOS / Android / iOS**: Unsupported, always returns `true`.
+ * #### - **macOS / Android / iOS**: Unsupported.
*
* @since 2.0.0
*/
@@ -92,7 +92,7 @@ export async function isRegistered(protocol: string): Promise {
* await onOpenUrl((urls) => { console.log(urls) });
* ```
*
- * #### - **Windows / Linux**: Unsupported, the OS will spawn a new app instance passing the URL as a CLI argument.
+ * #### - **Windows / Linux**: Unsupported without the single-instance plugin. The OS will spawn a new app instance passing the URL as a CLI argument.
*
* @since 2.0.0
*/
diff --git a/plugins/deep-link/package.json b/plugins/deep-link/package.json
index c2ca9aa23..d92df8fe3 100644
--- a/plugins/deep-link/package.json
+++ b/plugins/deep-link/package.json
@@ -1,6 +1,6 @@
{
"name": "@tauri-apps/plugin-deep-link",
- "version": "2.0.0",
+ "version": "2.0.1",
"description": "Set your Tauri application as the default handler for an URL",
"license": "MIT OR Apache-2.0",
"authors": [
diff --git a/plugins/deep-link/src/lib.rs b/plugins/deep-link/src/lib.rs
index 19065e406..c259e6b2e 100644
--- a/plugins/deep-link/src/lib.rs
+++ b/plugins/deep-link/src/lib.rs
@@ -215,7 +215,7 @@ mod imp {
current.replace(vec![url.clone()]);
let _ = self.app.emit("deep-link://new-url", vec![url]);
} else if cfg!(debug_assertions) {
- log::warn!("argument {url} does not match any configured deep link scheme; skipping it");
+ tracing::warn!("argument {url} does not match any configured deep link scheme; skipping it");
}
}
}
diff --git a/plugins/dialog/CHANGELOG.md b/plugins/dialog/CHANGELOG.md
index 57c510927..9e893e0ed 100644
--- a/plugins/dialog/CHANGELOG.md
+++ b/plugins/dialog/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## \[2.0.4]
+
+- [`76f99ce9`](https://github.com/tauri-apps/plugins-workspace/commit/76f99ce999a2ff9e40235c1675e3eb6570b5e1e2) ([#2108](https://github.com/tauri-apps/plugins-workspace/pull/2108) by [@FabianLars](https://github.com/tauri-apps/plugins-workspace/../../FabianLars)) The `Dialog` struct is now correctly exported, primarily to fix the documentation on `docs.rs`.
+
+### Dependencies
+
+- Upgraded to `fs@2.1.0`
+
## \[2.0.3]
### Dependencies
diff --git a/plugins/dialog/Cargo.toml b/plugins/dialog/Cargo.toml
index 664416a75..d63169b7b 100644
--- a/plugins/dialog/Cargo.toml
+++ b/plugins/dialog/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tauri-plugin-dialog"
-version = "2.0.3"
+version = "2.0.4"
description = "Native system dialogs for opening and saving files along with message dialogs on your Tauri application."
edition = { workspace = true }
authors = { workspace = true }
@@ -34,7 +34,7 @@ tauri = { workspace = true }
log = { workspace = true }
thiserror = { workspace = true }
url = { workspace = true }
-tauri-plugin-fs = { path = "../fs", version = "2.0.3" }
+tauri-plugin-fs = { path = "../fs", version = "2.1.0" }
[target.'cfg(target_os = "ios")'.dependencies]
tauri = { workspace = true, features = ["wry"] }
diff --git a/plugins/dialog/README.md b/plugins/dialog/README.md
index 2259e35b6..63d71767d 100644
--- a/plugins/dialog/README.md
+++ b/plugins/dialog/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-dialog#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/dialog/src/commands.rs b/plugins/dialog/src/commands.rs
index 4129b7b6a..c3caf027f 100644
--- a/plugins/dialog/src/commands.rs
+++ b/plugins/dialog/src/commands.rs
@@ -143,7 +143,7 @@ pub(crate) async fn open(
for folder in folders {
if let Ok(path) = folder.clone().into_path() {
if let Some(s) = window.try_fs_scope() {
- s.allow_directory(&path, options.recursive);
+ s.allow_directory(&path, options.recursive)?;
}
tauri_scope.allow_directory(&path, options.directory)?;
}
@@ -157,7 +157,7 @@ pub(crate) async fn open(
if let Some(folder) = &folder {
if let Ok(path) = folder.clone().into_path() {
if let Some(s) = window.try_fs_scope() {
- s.allow_directory(&path, options.recursive);
+ s.allow_directory(&path, options.recursive)?;
}
tauri_scope.allow_directory(&path, options.directory)?;
}
@@ -175,7 +175,7 @@ pub(crate) async fn open(
for file in files {
if let Ok(path) = file.clone().into_path() {
if let Some(s) = window.try_fs_scope() {
- s.allow_file(&path);
+ s.allow_file(&path)?;
}
tauri_scope.allow_file(&path)?;
@@ -190,7 +190,7 @@ pub(crate) async fn open(
if let Some(file) = &file {
if let Ok(path) = file.clone().into_path() {
if let Some(s) = window.try_fs_scope() {
- s.allow_file(&path);
+ s.allow_file(&path)?;
}
tauri_scope.allow_file(&path)?;
}
@@ -232,7 +232,7 @@ pub(crate) async fn save(
if let Some(p) = &path {
if let Ok(path) = p.clone().into_path() {
if let Some(s) = window.try_fs_scope() {
- s.allow_file(&path);
+ s.allow_file(&path)?;
}
tauri_scope.allow_file(&path)?;
}
diff --git a/plugins/dialog/src/lib.rs b/plugins/dialog/src/lib.rs
index 9a36c317b..2ef1c1ead 100644
--- a/plugins/dialog/src/lib.rs
+++ b/plugins/dialog/src/lib.rs
@@ -39,6 +39,11 @@ use desktop::*;
#[cfg(mobile)]
use mobile::*;
+#[cfg(desktop)]
+pub use desktop::Dialog;
+#[cfg(mobile)]
+pub use mobile::Dialog;
+
pub(crate) const OK: &str = "Ok";
pub(crate) const CANCEL: &str = "Cancel";
pub(crate) const YES: &str = "Yes";
diff --git a/plugins/fs/CHANGELOG.md b/plugins/fs/CHANGELOG.md
index ab76200e3..eee42582f 100644
--- a/plugins/fs/CHANGELOG.md
+++ b/plugins/fs/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## \[2.0.3]
+
+- [`ed981027`](https://github.com/tauri-apps/plugins-workspace/commit/ed981027dd4fba7d0e2f836eb5db34d344388d73) ([#1962](https://github.com/tauri-apps/plugins-workspace/pull/1962) by [@amrbashir](https://github.com/tauri-apps/plugins-workspace/../../amrbashir)) Improve performance of `readTextFile` and `readTextFileLines` APIs
+- [`3e78173d`](https://github.com/tauri-apps/plugins-workspace/commit/3e78173df9ce90aa3b19e1f36d1f8712c5020fb6) ([#2018](https://github.com/tauri-apps/plugins-workspace/pull/2018) by [@amrbashir](https://github.com/tauri-apps/plugins-workspace/../../amrbashir)) Fix `readDir` function failing to read directories that contain broken symlinks.
+- [`5092ea5e`](https://github.com/tauri-apps/plugins-workspace/commit/5092ea5e89817c0550d09b0a4ad17bf1253b23df) ([#1964](https://github.com/tauri-apps/plugins-workspace/pull/1964) by [@amrbashir](https://github.com/tauri-apps/plugins-workspace/../../amrbashir)) Add support for using `ReadableStream` with `writeFile` API.
+
## \[2.0.2]
- [`77149dc4`](https://github.com/tauri-apps/plugins-workspace/commit/77149dc4320d26b413e4a6bbe82c654367c51b32) ([#1965](https://github.com/tauri-apps/plugins-workspace/pull/1965) by [@amrbashir](https://github.com/tauri-apps/plugins-workspace/../../amrbashir)) Fix `writeTextFile` converting UTF-8 characters (for example `äöü`) in the given path into replacement character (`�`)
@@ -191,3 +197,11 @@
ac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
+apps/plugins-workspace/pull/371)) First v2 alpha release!
+ .com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
+ 717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
+ kspace/pull/371)) First v2 alpha release!
+ s/plugins-workspace/pull/371)) First v2 alpha release!
+ ac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
+ .com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
+ 717ae670978feb4492fac1f295998b93f2b9347f)([#371](https://github.com/tauri-apps/plugins-workspace/pull/371)) First v2 alpha release!
diff --git a/plugins/fs/Cargo.toml b/plugins/fs/Cargo.toml
index 5d9a7efb6..402a254b2 100644
--- a/plugins/fs/Cargo.toml
+++ b/plugins/fs/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tauri-plugin-fs"
-version = "2.0.3"
+version = "2.1.0"
description = "Access the file system."
authors = { workspace = true }
license = { workspace = true }
@@ -14,7 +14,7 @@ rustc-args = ["--cfg", "docsrs"]
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.platforms.support]
-windows = { level = "full", notes = "" }
+windows = { level = "full", notes = "Apps installed via MSI or NSIS in `perMachine` and `both` mode require admin permissions for write acces in `$RESOURCES` folder" }
linux = { level = "full", notes = "No write access to `$RESOURCES` folder" }
macos = { level = "full", notes = "No write access to `$RESOURCES` folder" }
android = { level = "partial", notes = "Access is restricted to Application folder by default" }
@@ -24,6 +24,8 @@ ios = { level = "partial", notes = "Access is restricted to Application folder b
tauri-plugin = { workspace = true, features = ["build"] }
schemars = { workspace = true }
serde = { workspace = true }
+toml = "0.8"
+tauri-utils = { workspace = true, features = ["build"] }
[dependencies]
serde = { workspace = true }
@@ -34,7 +36,7 @@ thiserror = { workspace = true }
url = { workspace = true }
anyhow = "1"
uuid = { version = "1", features = ["v4"] }
-glob = "0.3"
+glob = { workspace = true }
# TODO: Remove `serialization-compat-6` in v3
notify = { version = "7", optional = true, features = [
"serde",
diff --git a/plugins/fs/README.md b/plugins/fs/README.md
index af5c63a81..dea88824e 100644
--- a/plugins/fs/README.md
+++ b/plugins/fs/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-fs#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/fs/api-iife.js b/plugins/fs/api-iife.js
index e44a180bd..c7f53b9ba 100644
--- a/plugins/fs/api-iife.js
+++ b/plugins/fs/api-iife.js
@@ -1 +1 @@
-if("__TAURI__"in window){var __TAURI_PLUGIN_FS__=function(t){"use strict";function e(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function n(t,e,n,i,o){if("function"==typeof e?t!==e||!o:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(t,n),n}var i,o,r,a;"function"==typeof SuppressedError&&SuppressedError;const s="__TAURI_TO_IPC_KEY__";class c{constructor(){this.__TAURI_CHANNEL_MARKER__=!0,i.set(this,(()=>{})),o.set(this,0),r.set(this,{}),this.id=function(t,e=!1){return window.__TAURI_INTERNALS__.transformCallback(t,e)}((({message:t,id:a})=>{if(a===e(this,o,"f")){n(this,o,a+1),e(this,i,"f").call(this,t);const s=Object.keys(e(this,r,"f"));if(s.length>0){let t=a+1;for(const n of s.sort()){if(parseInt(n)!==t)break;{const o=e(this,r,"f")[n];delete e(this,r,"f")[n],e(this,i,"f").call(this,o),t+=1}}n(this,o,t)}}else e(this,r,"f")[a.toString()]=t}))}set onmessage(t){n(this,i,t)}get onmessage(){return e(this,i,"f")}[(i=new WeakMap,o=new WeakMap,r=new WeakMap,s)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[s]()}}async function f(t,e={},n){return window.__TAURI_INTERNALS__.invoke(t,e,n)}class l{get rid(){return e(this,a,"f")}constructor(t){a.set(this,void 0),n(this,a,t)}async close(){return f("plugin:resources|close",{rid:this.rid})}}var u,p;function w(t){return{isFile:t.isFile,isDirectory:t.isDirectory,isSymlink:t.isSymlink,size:t.size,mtime:null!==t.mtime?new Date(t.mtime):null,atime:null!==t.atime?new Date(t.atime):null,birthtime:null!==t.birthtime?new Date(t.birthtime):null,readonly:t.readonly,fileAttributes:t.fileAttributes,dev:t.dev,ino:t.ino,mode:t.mode,nlink:t.nlink,uid:t.uid,gid:t.gid,rdev:t.rdev,blksize:t.blksize,blocks:t.blocks}}a=new WeakMap,t.BaseDirectory=void 0,(u=t.BaseDirectory||(t.BaseDirectory={}))[u.Audio=1]="Audio",u[u.Cache=2]="Cache",u[u.Config=3]="Config",u[u.Data=4]="Data",u[u.LocalData=5]="LocalData",u[u.Document=6]="Document",u[u.Download=7]="Download",u[u.Picture=8]="Picture",u[u.Public=9]="Public",u[u.Video=10]="Video",u[u.Resource=11]="Resource",u[u.Temp=12]="Temp",u[u.AppConfig=13]="AppConfig",u[u.AppData=14]="AppData",u[u.AppLocalData=15]="AppLocalData",u[u.AppCache=16]="AppCache",u[u.AppLog=17]="AppLog",u[u.Desktop=18]="Desktop",u[u.Executable=19]="Executable",u[u.Font=20]="Font",u[u.Home=21]="Home",u[u.Runtime=22]="Runtime",u[u.Template=23]="Template",t.SeekMode=void 0,(p=t.SeekMode||(t.SeekMode={}))[p.Start=0]="Start",p[p.Current=1]="Current",p[p.End=2]="End";class h extends l{async read(t){if(0===t.byteLength)return 0;const e=await f("plugin:fs|read",{rid:this.rid,len:t.byteLength}),n=function(t){const e=new Uint8ClampedArray(t),n=e.byteLength;let i=0;for(let t=0;tt instanceof URL?t.toString():t)),options:i,onEvent:r});return()=>{d(a)}},t.watchImmediate=async function(t,e,n){const i={recursive:!1,...n,delayMs:null},o=Array.isArray(t)?t:[t];for(const t of o)if(t instanceof URL&&"file:"!==t.protocol)throw new TypeError("Must be a file URL.");const r=new c;r.onmessage=e;const a=await f("plugin:fs|watch",{paths:o.map((t=>t instanceof URL?t.toString():t)),options:i,onEvent:r});return()=>{d(a)}},t.writeFile=async function(t,e,n){if(t instanceof URL&&"file:"!==t.protocol)throw new TypeError("Must be a file URL.");await f("plugin:fs|write_file",e,{headers:{path:encodeURIComponent(t instanceof URL?t.toString():t),options:JSON.stringify(n)}})},t.writeTextFile=async function(t,e,n){if(t instanceof URL&&"file:"!==t.protocol)throw new TypeError("Must be a file URL.");const i=new TextEncoder;await f("plugin:fs|write_text_file",i.encode(e),{headers:{path:encodeURIComponent(t instanceof URL?t.toString():t),options:JSON.stringify(n)}})},t}({});Object.defineProperty(window.__TAURI__,"fs",{value:__TAURI_PLUGIN_FS__})}
+if("__TAURI__"in window){var __TAURI_PLUGIN_FS__=function(t){"use strict";function e(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function n(t,e,n,i,o){if("function"==typeof e?t!==e||!o:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(t,n),n}var i,o,r,a;"function"==typeof SuppressedError&&SuppressedError;const s="__TAURI_TO_IPC_KEY__";class c{constructor(){this.__TAURI_CHANNEL_MARKER__=!0,i.set(this,(()=>{})),o.set(this,0),r.set(this,{}),this.id=function(t,e=!1){return window.__TAURI_INTERNALS__.transformCallback(t,e)}((({message:t,id:a})=>{if(a===e(this,o,"f")){n(this,o,a+1),e(this,i,"f").call(this,t);const s=Object.keys(e(this,r,"f"));if(s.length>0){let t=a+1;for(const n of s.sort()){if(parseInt(n)!==t)break;{const o=e(this,r,"f")[n];delete e(this,r,"f")[n],e(this,i,"f").call(this,o),t+=1}}n(this,o,t)}}else e(this,r,"f")[a.toString()]=t}))}set onmessage(t){n(this,i,t)}get onmessage(){return e(this,i,"f")}[(i=new WeakMap,o=new WeakMap,r=new WeakMap,s)](){return`__CHANNEL__:${this.id}`}toJSON(){return this[s]()}}async function f(t,e={},n){return window.__TAURI_INTERNALS__.invoke(t,e,n)}class l{get rid(){return e(this,a,"f")}constructor(t){a.set(this,void 0),n(this,a,t)}async close(){return f("plugin:resources|close",{rid:this.rid})}}var u,p;function w(t){return{isFile:t.isFile,isDirectory:t.isDirectory,isSymlink:t.isSymlink,size:t.size,mtime:null!==t.mtime?new Date(t.mtime):null,atime:null!==t.atime?new Date(t.atime):null,birthtime:null!==t.birthtime?new Date(t.birthtime):null,readonly:t.readonly,fileAttributes:t.fileAttributes,dev:t.dev,ino:t.ino,mode:t.mode,nlink:t.nlink,uid:t.uid,gid:t.gid,rdev:t.rdev,blksize:t.blksize,blocks:t.blocks}}a=new WeakMap,t.BaseDirectory=void 0,(u=t.BaseDirectory||(t.BaseDirectory={}))[u.Audio=1]="Audio",u[u.Cache=2]="Cache",u[u.Config=3]="Config",u[u.Data=4]="Data",u[u.LocalData=5]="LocalData",u[u.Document=6]="Document",u[u.Download=7]="Download",u[u.Picture=8]="Picture",u[u.Public=9]="Public",u[u.Video=10]="Video",u[u.Resource=11]="Resource",u[u.Temp=12]="Temp",u[u.AppConfig=13]="AppConfig",u[u.AppData=14]="AppData",u[u.AppLocalData=15]="AppLocalData",u[u.AppCache=16]="AppCache",u[u.AppLog=17]="AppLog",u[u.Desktop=18]="Desktop",u[u.Executable=19]="Executable",u[u.Font=20]="Font",u[u.Home=21]="Home",u[u.Runtime=22]="Runtime",u[u.Template=23]="Template",t.SeekMode=void 0,(p=t.SeekMode||(t.SeekMode={}))[p.Start=0]="Start",p[p.Current=1]="Current",p[p.End=2]="End";class d extends l{async read(t){if(0===t.byteLength)return 0;const e=await f("plugin:fs|read",{rid:this.rid,len:t.byteLength}),n=function(t){const e=new Uint8ClampedArray(t),n=e.byteLength;let i=0;for(let t=0;tt instanceof URL?t.toString():t)),options:i,onEvent:r});return()=>{y(a)}},t.watchImmediate=async function(t,e,n){const i={recursive:!1,...n,delayMs:null},o=Array.isArray(t)?t:[t];for(const t of o)if(t instanceof URL&&"file:"!==t.protocol)throw new TypeError("Must be a file URL.");const r=new c;r.onmessage=e;const a=await f("plugin:fs|watch",{paths:o.map((t=>t instanceof URL?t.toString():t)),options:i,onEvent:r});return()=>{y(a)}},t.writeFile=async function(t,e,n){if(t instanceof URL&&"file:"!==t.protocol)throw new TypeError("Must be a file URL.");if(e instanceof ReadableStream){const i=await h(t,n);for await(const t of e)await i.write(t);await i.close()}else await f("plugin:fs|write_file",e,{headers:{path:encodeURIComponent(t instanceof URL?t.toString():t),options:JSON.stringify(n)}})},t.writeTextFile=async function(t,e,n){if(t instanceof URL&&"file:"!==t.protocol)throw new TypeError("Must be a file URL.");const i=new TextEncoder;await f("plugin:fs|write_text_file",i.encode(e),{headers:{path:encodeURIComponent(t instanceof URL?t.toString():t),options:JSON.stringify(n)}})},t}({});Object.defineProperty(window.__TAURI__,"fs",{value:__TAURI_PLUGIN_FS__})}
diff --git a/plugins/fs/build.rs b/plugins/fs/build.rs
index cb9d00daf..3909b1c0a 100644
--- a/plugins/fs/build.rs
+++ b/plugins/fs/build.rs
@@ -7,6 +7,8 @@ use std::{
path::{Path, PathBuf},
};
+use tauri_utils::acl::manifest::PermissionFile;
+
#[path = "src/scope.rs"]
#[allow(dead_code)]
mod scope;
@@ -16,10 +18,23 @@ mod scope;
#[serde(untagged)]
#[allow(unused)]
enum FsScopeEntry {
- /// FS scope path.
+ /// A path that can be accessed by the webview when using the fs APIs.
+ /// FS scope path pattern.
+ ///
+ /// The 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`.
Value(PathBuf),
Object {
- /// FS scope path.
+ /// A path that can be accessed by the webview when using the fs APIs.
+ ///
+ /// The 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`.
path: PathBuf,
},
}
@@ -62,31 +77,32 @@ const BASE_DIR_VARS: &[&str] = &[
"APPCACHE",
"APPLOG",
];
-const COMMANDS: &[&str] = &[
- "mkdir",
- "create",
- "copy_file",
- "remove",
- "rename",
- "truncate",
- "ftruncate",
- "write",
- "write_file",
- "write_text_file",
- "read_dir",
- "read_file",
- "read",
- "open",
- "read_text_file",
- "read_text_file_lines",
- "read_text_file_lines_next",
- "seek",
- "stat",
- "lstat",
- "fstat",
- "exists",
- "watch",
- "unwatch",
+const COMMANDS: &[(&str, &[&str])] = &[
+ ("mkdir", &[]),
+ ("create", &[]),
+ ("copy_file", &[]),
+ ("remove", &[]),
+ ("rename", &[]),
+ ("truncate", &[]),
+ ("ftruncate", &[]),
+ ("write", &[]),
+ ("write_file", &["open", "write"]),
+ ("write_text_file", &[]),
+ ("read_dir", &[]),
+ ("read_file", &[]),
+ ("read", &[]),
+ ("open", &[]),
+ ("read_text_file", &[]),
+ ("read_text_file_lines", &["read_text_file_lines_next"]),
+ ("read_text_file_lines_next", &[]),
+ ("seek", &[]),
+ ("stat", &[]),
+ ("lstat", &[]),
+ ("fstat", &[]),
+ ("exists", &[]),
+ ("watch", &[]),
+ ("unwatch", &[]),
+ ("size", &[]),
];
fn main() {
@@ -192,9 +208,47 @@ permissions = [
}
}
- tauri_plugin::Builder::new(COMMANDS)
+ tauri_plugin::Builder::new(&COMMANDS.iter().map(|c| c.0).collect::>())
.global_api_script_path("./api-iife.js")
.global_scope_schema(schemars::schema_for!(FsScopeEntry))
.android_path("android")
.build();
+
+ // workaround to include nested permissions as `tauri_plugin` doesn't support it
+ let permissions_dir = autogenerated.join("commands");
+ for (command, nested_commands) in COMMANDS {
+ if nested_commands.is_empty() {
+ continue;
+ }
+
+ let permission_path = permissions_dir.join(format!("{command}.toml"));
+
+ let content = std::fs::read_to_string(&permission_path)
+ .unwrap_or_else(|_| panic!("failed to read {command}.toml"));
+
+ let mut permission_file = toml::from_str::(&content)
+ .unwrap_or_else(|_| panic!("failed to deserialize {command}.toml"));
+
+ for p in permission_file
+ .permission
+ .iter_mut()
+ .filter(|p| p.identifier.starts_with("allow"))
+ {
+ p.commands
+ .allow
+ .extend(nested_commands.iter().map(|s| s.to_string()));
+ }
+
+ let out = toml::to_string_pretty(&permission_file)
+ .unwrap_or_else(|_| panic!("failed to serialize {command}.toml"));
+ let out = format!(
+ r#"# Automatically generated - DO NOT EDIT!
+
+"$schema" = "../../schemas/schema.json"
+
+{out}"#
+ );
+ std::fs::write(permission_path, out)
+ .unwrap_or_else(|_| panic!("failed to write {command}.toml"));
+ }
}
diff --git a/plugins/fs/guest-js/index.ts b/plugins/fs/guest-js/index.ts
index dabfbc924..448335c42 100644
--- a/plugins/fs/guest-js/index.ts
+++ b/plugins/fs/guest-js/index.ts
@@ -266,6 +266,7 @@ function fromBytes(buffer: FixedSizeArray): number {
const size = bytes.byteLength
let x = 0
for (let i = 0; i < size; i++) {
+ // eslint-disable-next-line security/detect-object-injection
const byte = bytes[i]
x *= 0x100
x += byte
@@ -427,11 +428,11 @@ class FileHandle extends Resource {
}
/**
- * Writes `p.byteLength` bytes from `p` to the underlying data stream. It
- * resolves to the number of bytes written from `p` (`0` <= `n` <=
- * `p.byteLength`) or reject with the error encountered that caused the
+ * Writes `data.byteLength` bytes from `data` to the underlying data stream. It
+ * resolves to the number of bytes written from `data` (`0` <= `n` <=
+ * `data.byteLength`) or reject with the error encountered that caused the
* write to stop early. `write()` must reject with a non-null error if
- * would resolve to `n` < `p.byteLength`. `write()` must not modify the
+ * would resolve to `n` < `data.byteLength`. `write()` must not modify the
* slice data, even temporarily.
*
* @example
@@ -769,10 +770,14 @@ async function readTextFile(
throw new TypeError('Must be a file URL.')
}
- return await invoke('plugin:fs|read_text_file', {
+ const arr = await invoke('plugin:fs|read_text_file', {
path: path instanceof URL ? path.toString() : path,
options
})
+
+ const bytes = arr instanceof ArrayBuffer ? arr : Uint8Array.from(arr)
+
+ return new TextDecoder().decode(bytes)
}
/**
@@ -803,6 +808,7 @@ async function readTextFileLines(
return await Promise.resolve({
path: pathStr,
rid: null as number | null,
+
async next(): Promise> {
if (this.rid === null) {
this.rid = await invoke('plugin:fs|read_text_file_lines', {
@@ -811,19 +817,35 @@ async function readTextFileLines(
})
}
- const [line, done] = await invoke<[string | null, boolean]>(
+ const arr = await invoke(
'plugin:fs|read_text_file_lines_next',
{ rid: this.rid }
)
- // an iteration is over, reset rid for next iteration
- if (done) this.rid = null
+ const bytes =
+ arr instanceof ArrayBuffer ? new Uint8Array(arr) : Uint8Array.from(arr)
+
+ // Rust side will never return an empty array for this command and
+ // ensure there is at least one elements there.
+ //
+ // This is an optimization to include whether we finished iteration or not (1 or 0)
+ // at the end of returned array to avoid serialization overhead of separate values.
+ const done = bytes[bytes.byteLength - 1] === 1
+
+ if (done) {
+ // a full iteration is over, reset rid for next iteration
+ this.rid = null
+ return { value: null, done }
+ }
+
+ const line = new TextDecoder().decode(bytes.slice(0, bytes.byteLength))
return {
- value: done ? '' : line!,
+ value: line,
done
}
},
+
[Symbol.asyncIterator](): AsyncIterableIterator {
return this
}
@@ -1044,19 +1066,27 @@ interface WriteFileOptions {
*/
async function writeFile(
path: string | URL,
- data: Uint8Array,
+ data: Uint8Array | ReadableStream,
options?: WriteFileOptions
): Promise {
if (path instanceof URL && path.protocol !== 'file:') {
throw new TypeError('Must be a file URL.')
}
- await invoke('plugin:fs|write_file', data, {
- headers: {
- path: encodeURIComponent(path instanceof URL ? path.toString() : path),
- options: JSON.stringify(options)
+ if (data instanceof ReadableStream) {
+ const file = await open(path, options)
+ for await (const chunk of data) {
+ await file.write(chunk)
}
- })
+ await file.close()
+ } else {
+ await invoke('plugin:fs|write_file', data, {
+ headers: {
+ path: encodeURIComponent(path instanceof URL ? path.toString() : path),
+ options: JSON.stringify(options)
+ }
+ })
+ }
}
/**
@@ -1292,6 +1322,31 @@ async function watchImmediate(
}
}
+/**
+ * Get the size of a file or directory. For files, the `stat` functions can be used as well.
+ *
+ * If `path` is a directory, this function will recursively iterate over every file and every directory inside of `path` and therefore will be very time consuming if used on larger directories.
+ *
+ * @example
+ * ```typescript
+ * import { size, BaseDirectory } from '@tauri-apps/plugin-fs';
+ * // Get the size of the `$APPDATA/tauri` directory.
+ * const dirSize = await size('tauri', { baseDir: BaseDirectory.AppData });
+ * console.log(dirSize); // 1024
+ * ```
+ *
+ * @since 2.1.0
+ */
+async function size(path: string | URL): Promise {
+ if (path instanceof URL && path.protocol !== 'file:') {
+ throw new TypeError('Must be a file URL.')
+ }
+
+ return await invoke('plugin:fs|size', {
+ path: path instanceof URL ? path.toString() : path
+ })
+}
+
export type {
CreateOptions,
OpenOptions,
@@ -1339,5 +1394,6 @@ export {
writeTextFile,
exists,
watch,
- watchImmediate
+ watchImmediate,
+ size
}
diff --git a/plugins/fs/package.json b/plugins/fs/package.json
index dfecaee24..eeb9f8a4a 100644
--- a/plugins/fs/package.json
+++ b/plugins/fs/package.json
@@ -1,6 +1,6 @@
{
"name": "@tauri-apps/plugin-fs",
- "version": "2.0.2",
+ "version": "2.0.3",
"description": "Access the file system.",
"license": "MIT OR Apache-2.0",
"authors": [
diff --git a/plugins/fs/permissions/autogenerated/commands/read_text_file_lines.toml b/plugins/fs/permissions/autogenerated/commands/read_text_file_lines.toml
index 1ba629cbf..84b4ebb22 100644
--- a/plugins/fs/permissions/autogenerated/commands/read_text_file_lines.toml
+++ b/plugins/fs/permissions/autogenerated/commands/read_text_file_lines.toml
@@ -5,9 +5,18 @@
[[permission]]
identifier = "allow-read-text-file-lines"
description = "Enables the read_text_file_lines command without any pre-configured scope."
-commands.allow = ["read_text_file_lines"]
+
+[permission.commands]
+allow = [
+ "read_text_file_lines",
+ "read_text_file_lines_next",
+]
+deny = []
[[permission]]
identifier = "deny-read-text-file-lines"
description = "Denies the read_text_file_lines command without any pre-configured scope."
-commands.deny = ["read_text_file_lines"]
+
+[permission.commands]
+allow = []
+deny = ["read_text_file_lines"]
diff --git a/plugins/fs/permissions/autogenerated/commands/size.toml b/plugins/fs/permissions/autogenerated/commands/size.toml
new file mode 100644
index 000000000..8a0ea55cc
--- /dev/null
+++ b/plugins/fs/permissions/autogenerated/commands/size.toml
@@ -0,0 +1,13 @@
+# Automatically generated - DO NOT EDIT!
+
+"$schema" = "../../schemas/schema.json"
+
+[[permission]]
+identifier = "allow-size"
+description = "Enables the size command without any pre-configured scope."
+commands.allow = ["size"]
+
+[[permission]]
+identifier = "deny-size"
+description = "Denies the size command without any pre-configured scope."
+commands.deny = ["size"]
diff --git a/plugins/fs/permissions/autogenerated/commands/write_file.toml b/plugins/fs/permissions/autogenerated/commands/write_file.toml
index cb0450fc5..ea7d51368 100644
--- a/plugins/fs/permissions/autogenerated/commands/write_file.toml
+++ b/plugins/fs/permissions/autogenerated/commands/write_file.toml
@@ -5,9 +5,19 @@
[[permission]]
identifier = "allow-write-file"
description = "Enables the write_file command without any pre-configured scope."
-commands.allow = ["write_file"]
+
+[permission.commands]
+allow = [
+ "write_file",
+ "open",
+ "write",
+]
+deny = []
[[permission]]
identifier = "deny-write-file"
description = "Denies the write_file command without any pre-configured scope."
-commands.deny = ["write_file"]
+
+[permission.commands]
+allow = []
+deny = ["write_file"]
diff --git a/plugins/fs/permissions/autogenerated/reference.md b/plugins/fs/permissions/autogenerated/reference.md
index 05d14475b..3cec32ed8 100644
--- a/plugins/fs/permissions/autogenerated/reference.md
+++ b/plugins/fs/permissions/autogenerated/reference.md
@@ -3410,6 +3410,32 @@ Denies the seek command without any pre-configured scope.
+`fs:allow-size`
+
+ |
+
+
+Enables the size command without any pre-configured scope.
+
+ |
+
+
+
+
+
+`fs:deny-size`
+
+ |
+
+
+Denies the size command without any pre-configured scope.
+
+ |
+
+
+
+
+
`fs:allow-stat`
|
diff --git a/plugins/fs/permissions/read-meta.toml b/plugins/fs/permissions/read-meta.toml
index 09c731ad6..83024b0c2 100644
--- a/plugins/fs/permissions/read-meta.toml
+++ b/plugins/fs/permissions/read-meta.toml
@@ -3,4 +3,4 @@
[[permission]]
identifier = "read-meta"
description = "This enables all index or metadata related commands without any pre-configured accessible paths."
-commands.allow = ["read_dir", "stat", "lstat", "fstat", "exists"]
+commands.allow = ["read_dir", "stat", "lstat", "fstat", "exists", "size"]
diff --git a/plugins/fs/permissions/schemas/schema.json b/plugins/fs/permissions/schemas/schema.json
index 275e44d19..2c13d5c61 100644
--- a/plugins/fs/permissions/schemas/schema.json
+++ b/plugins/fs/permissions/schemas/schema.json
@@ -1589,6 +1589,16 @@
"type": "string",
"const": "deny-seek"
},
+ {
+ "description": "Enables the size command without any pre-configured scope.",
+ "type": "string",
+ "const": "allow-size"
+ },
+ {
+ "description": "Denies the size command without any pre-configured scope.",
+ "type": "string",
+ "const": "deny-size"
+ },
{
"description": "Enables the stat command without any pre-configured scope.",
"type": "string",
diff --git a/plugins/fs/src/commands.rs b/plugins/fs/src/commands.rs
index 3b5cc44e5..29d1104f1 100644
--- a/plugins/fs/src/commands.rs
+++ b/plugins/fs/src/commands.rs
@@ -15,14 +15,14 @@ use tauri::{
use std::{
borrow::Cow,
fs::File,
- io::{BufReader, Lines, Read, Write},
- path::PathBuf,
+ io::{BufRead, BufReader, Read, Write},
+ path::{Path, PathBuf},
str::FromStr,
sync::Mutex,
time::{SystemTime, UNIX_EPOCH},
};
-use crate::{scope::Entry, Error, FsExt, SafeFilePath};
+use crate::{scope::Entry, Error, SafeFilePath};
#[derive(Debug, thiserror::Error)]
pub enum CommandError {
@@ -372,6 +372,7 @@ pub async fn read_file(
Ok(tauri::ipc::Response::new(contents))
}
+// TODO, remove in v3, rely on `read_file` command instead
#[tauri::command]
pub async fn read_text_file(
webview: Webview,
@@ -379,33 +380,8 @@ pub async fn read_text_file(
command_scope: CommandScope,
path: SafeFilePath,
options: Option,
-) -> CommandResult {
- let (mut file, path) = resolve_file(
- &webview,
- &global_scope,
- &command_scope,
- path,
- OpenOptions {
- base: BaseOptions {
- base_dir: options.as_ref().and_then(|o| o.base_dir),
- },
- options: crate::OpenOptions {
- read: true,
- ..Default::default()
- },
- },
- )?;
-
- let mut contents = String::new();
-
- file.read_to_string(&mut contents).map_err(|e| {
- format!(
- "failed to read file as text at path: {} with error: {e}",
- path.display()
- )
- })?;
-
- Ok(contents)
+) -> CommandResult {
+ read_file(webview, global_scope, command_scope, path, options).await
}
#[tauri::command]
@@ -416,8 +392,6 @@ pub fn read_text_file_lines(
path: SafeFilePath,
options: Option,
) -> CommandResult {
- use std::io::BufRead;
-
let resolved_path = resolve_path(
&webview,
&global_scope,
@@ -433,7 +407,7 @@ pub fn read_text_file_lines(
)
})?;
- let lines = BufReader::new(file).lines();
+ let lines = BufReader::new(file);
let rid = webview.resources_table().add(StdLinesResource::new(lines));
Ok(rid)
@@ -443,18 +417,28 @@ pub fn read_text_file_lines(
pub async fn read_text_file_lines_next(
webview: Webview,
rid: ResourceId,
-) -> CommandResult<(Option, bool)> {
+) -> CommandResult {
let mut resource_table = webview.resources_table();
let lines = resource_table.get::(rid)?;
- let ret = StdLinesResource::with_lock(&lines, |lines| {
- lines.next().map(|a| (a.ok(), false)).unwrap_or_else(|| {
- let _ = resource_table.close(rid);
- (None, true)
- })
+ let ret = StdLinesResource::with_lock(&lines, |lines| -> CommandResult> {
+ // This is an optimization to include wether we finished iteration or not (1 or 0)
+ // at the end of returned vector so we can use `tauri::ipc::Response`
+ // and avoid serialization overhead of separate values.
+ match lines.next() {
+ Some(Ok(mut bytes)) => {
+ bytes.push(false as u8);
+ Ok(bytes)
+ }
+ Some(Err(_)) => Ok(vec![false as u8]),
+ None => {
+ resource_table.close(rid)?;
+ Ok(vec![true as u8])
+ }
+ }
});
- Ok(ret)
+ ret.map(tauri::ipc::Response::new)
}
#[derive(Debug, Clone, Deserialize)]
@@ -805,10 +789,11 @@ fn default_create_value() -> bool {
true
}
-fn write_file_inner(
+#[tauri::command]
+pub async fn write_file(
webview: Webview,
- global_scope: &GlobalScope,
- command_scope: &CommandScope,
+ global_scope: GlobalScope,
+ command_scope: CommandScope,
request: tauri::ipc::Request<'_>,
) -> CommandResult<()> {
let data = match request.body() {
@@ -839,8 +824,8 @@ fn write_file_inner(
let (mut file, path) = resolve_file(
&webview,
- global_scope,
- command_scope,
+ &global_scope,
+ &command_scope,
path,
if let Some(opts) = options {
OpenOptions {
@@ -883,35 +868,43 @@ fn write_file_inner(
.map_err(Into::into)
}
+// TODO, remove in v3, rely on `write_file` command instead
#[tauri::command]
-pub async fn write_file(
+pub async fn write_text_file(
webview: Webview,
global_scope: GlobalScope,
command_scope: CommandScope,
request: tauri::ipc::Request<'_>,
) -> CommandResult<()> {
- write_file_inner(webview, &global_scope, &command_scope, request)
+ write_file(webview, global_scope, command_scope, request).await
}
-// TODO, in v3, remove this command and rely on `write_file` command only
#[tauri::command]
-pub async fn write_text_file(
+pub fn exists(
webview: Webview,
global_scope: GlobalScope,
command_scope: CommandScope,
- request: tauri::ipc::Request<'_>,
-) -> CommandResult<()> {
- write_file_inner(webview, &global_scope, &command_scope, request)
+ path: SafeFilePath,
+ options: Option,
+) -> CommandResult {
+ let resolved_path = resolve_path(
+ &webview,
+ &global_scope,
+ &command_scope,
+ path,
+ options.as_ref().and_then(|o| o.base_dir),
+ )?;
+ Ok(resolved_path.exists())
}
#[tauri::command]
-pub fn exists(
+pub async fn size(
webview: Webview,
global_scope: GlobalScope,
command_scope: CommandScope,
path: SafeFilePath,
options: Option,
-) -> CommandResult {
+) -> CommandResult {
let resolved_path = resolve_path(
&webview,
&global_scope,
@@ -919,7 +912,38 @@ pub fn exists(
path,
options.as_ref().and_then(|o| o.base_dir),
)?;
- Ok(resolved_path.exists())
+
+ let metadata = resolved_path.metadata()?;
+
+ if metadata.is_file() {
+ Ok(metadata.len())
+ } else {
+ let size = get_dir_size(&resolved_path).map_err(|e| {
+ format!(
+ "failed to get size at path: {} with error: {e}",
+ resolved_path.display()
+ )
+ })?;
+
+ Ok(size)
+ }
+}
+
+fn get_dir_size(path: &PathBuf) -> CommandResult {
+ let mut size = 0;
+
+ for entry in std::fs::read_dir(path)? {
+ let entry = entry?;
+ let metadata = entry.metadata()?;
+
+ if metadata.is_file() {
+ size += metadata.len();
+ } else if metadata.is_dir() {
+ size += get_dir_size(&entry.path())?;
+ }
+ }
+
+ Ok(size)
}
#[cfg(not(target_os = "android"))]
@@ -967,6 +991,8 @@ pub fn resolve_file(
path: SafeFilePath,
open_options: OpenOptions,
) -> CommandResult<(File, PathBuf)> {
+ use crate::FsExt;
+
match path {
SafeFilePath::Url(url) => {
let path = url.as_str().into();
@@ -999,40 +1025,81 @@ pub fn resolve_path(
path
};
+ let fs_scope = webview.state::();
+
let scope = tauri::scope::fs::Scope::new(
webview,
&FsScope::Scope {
- allow: webview
- .fs_scope()
- .allowed
- .lock()
- .unwrap()
- .clone()
- .into_iter()
- .chain(global_scope.allows().iter().filter_map(|e| e.path.clone()))
+ allow: global_scope
+ .allows()
+ .iter()
+ .filter_map(|e| e.path.clone())
.chain(command_scope.allows().iter().filter_map(|e| e.path.clone()))
.collect(),
- deny: webview
- .fs_scope()
- .denied
- .lock()
- .unwrap()
- .clone()
- .into_iter()
- .chain(global_scope.denies().iter().filter_map(|e| e.path.clone()))
+ deny: global_scope
+ .denies()
+ .iter()
+ .filter_map(|e| e.path.clone())
.chain(command_scope.denies().iter().filter_map(|e| e.path.clone()))
.collect(),
- require_literal_leading_dot: webview.fs_scope().require_literal_leading_dot,
+ require_literal_leading_dot: fs_scope.require_literal_leading_dot,
},
)?;
- if scope.is_allowed(&path) {
+ let require_literal_leading_dot = fs_scope.require_literal_leading_dot.unwrap_or(cfg!(unix));
+
+ if is_forbidden(&fs_scope.scope, &path, require_literal_leading_dot)
+ || is_forbidden(&scope, &path, require_literal_leading_dot)
+ {
+ return Err(CommandError::Plugin(Error::PathForbidden(path)));
+ }
+
+ if fs_scope.scope.is_allowed(&path) || scope.is_allowed(&path) {
Ok(path)
} else {
Err(CommandError::Plugin(Error::PathForbidden(path)))
}
}
+fn is_forbidden>(
+ scope: &tauri::fs::Scope,
+ path: P,
+ require_literal_leading_dot: bool,
+) -> bool {
+ let path = path.as_ref();
+ let path = if path.is_symlink() {
+ match std::fs::read_link(path) {
+ Ok(p) => p,
+ Err(_) => return false,
+ }
+ } else {
+ path.to_path_buf()
+ };
+ let path = if !path.exists() {
+ crate::Result::Ok(path)
+ } else {
+ std::fs::canonicalize(path).map_err(Into::into)
+ };
+
+ if let Ok(path) = path {
+ let path: PathBuf = path.components().collect();
+ scope.forbidden_patterns().iter().any(|p| {
+ p.matches_path_with(
+ &path,
+ glob::MatchOptions {
+ // this is needed so `/dir/*` doesn't match files within subdirectories such as `/dir/subdir/file.txt`
+ // see:
+ require_literal_separator: true,
+ require_literal_leading_dot,
+ ..Default::default()
+ },
+ )
+ })
+ } else {
+ false
+ }
+}
+
struct StdFileResource(Mutex);
impl StdFileResource {
@@ -1048,14 +1115,38 @@ impl StdFileResource {
impl Resource for StdFileResource {}
-struct StdLinesResource(Mutex>>);
+/// Same as [std::io::Lines] but with bytes
+struct LinesBytes(T);
+
+impl Iterator for LinesBytes {
+ type Item = std::io::Result>;
+
+ fn next(&mut self) -> Option>> {
+ let mut buf = Vec::new();
+ match self.0.read_until(b'\n', &mut buf) {
+ Ok(0) => None,
+ Ok(_n) => {
+ if buf.last() == Some(&b'\n') {
+ buf.pop();
+ if buf.last() == Some(&b'\r') {
+ buf.pop();
+ }
+ }
+ Some(Ok(buf))
+ }
+ Err(e) => Some(Err(e)),
+ }
+ }
+}
+
+struct StdLinesResource(Mutex>>);
impl StdLinesResource {
- fn new(lines: Lines>) -> Self {
- Self(Mutex::new(lines))
+ fn new(lines: BufReader) -> Self {
+ Self(Mutex::new(LinesBytes(lines)))
}
- fn with_lock>) -> R>(&self, mut f: F) -> R {
+ fn with_lock>) -> R>(&self, mut f: F) -> R {
let mut lines = self.0.lock().unwrap();
f(&mut lines)
}
@@ -1154,7 +1245,12 @@ fn get_stat(metadata: std::fs::Metadata) -> FileInfo {
}
}
+#[cfg(test)]
mod test {
+ use std::io::{BufRead, BufReader};
+
+ use super::LinesBytes;
+
#[test]
fn safe_file_path_parse() {
use super::SafeFilePath;
@@ -1168,4 +1264,24 @@ mod test {
Ok(SafeFilePath::Url(_))
));
}
+
+ #[test]
+ fn test_lines_bytes() {
+ let base = String::from("line 1\nline2\nline 3\nline 4");
+ let bytes = base.as_bytes();
+
+ let string1 = base.lines().collect::();
+ let string2 = BufReader::new(bytes)
+ .lines()
+ .map_while(Result::ok)
+ .collect::();
+ let string3 = LinesBytes(BufReader::new(bytes))
+ .flatten()
+ .flat_map(String::from_utf8)
+ .collect::();
+
+ assert_eq!(string1, string2);
+ assert_eq!(string1, string3);
+ assert_eq!(string2, string3);
+ }
}
diff --git a/plugins/fs/src/file_path.rs b/plugins/fs/src/file_path.rs
index 9ff7a9476..735fc105e 100644
--- a/plugins/fs/src/file_path.rs
+++ b/plugins/fs/src/file_path.rs
@@ -138,7 +138,7 @@ impl<'de> serde::Deserialize<'de> for FilePath {
{
struct FilePathVisitor;
- impl<'de> serde::de::Visitor<'de> for FilePathVisitor {
+ impl serde::de::Visitor<'_> for FilePathVisitor {
type Value = FilePath;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
@@ -169,7 +169,7 @@ impl<'de> serde::Deserialize<'de> for SafeFilePath {
{
struct SafeFilePathVisitor;
- impl<'de> serde::de::Visitor<'de> for SafeFilePathVisitor {
+ impl serde::de::Visitor<'_> for SafeFilePathVisitor {
type Value = SafeFilePath;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
diff --git a/plugins/fs/src/lib.rs b/plugins/fs/src/lib.rs
index b48b24dcb..731c7040a 100644
--- a/plugins/fs/src/lib.rs
+++ b/plugins/fs/src/lib.rs
@@ -15,7 +15,7 @@ use serde::Deserialize;
use tauri::{
ipc::ScopeObject,
plugin::{Builder as PluginBuilder, TauriPlugin},
- utils::acl::Value,
+ utils::{acl::Value, config::FsScope},
AppHandle, DragDropEvent, Manager, RunEvent, Runtime, WindowEvent,
};
@@ -39,7 +39,6 @@ pub use desktop::Fs;
pub use mobile::Fs;
pub use error::Error;
-pub use scope::{Event as ScopeEvent, Scope};
pub use file_path::FilePath;
pub use file_path::SafeFilePath;
@@ -365,21 +364,26 @@ impl ScopeObject for scope::Entry {
}
}
+pub(crate) struct Scope {
+ pub(crate) scope: tauri::fs::Scope,
+ pub(crate) require_literal_leading_dot: Option,
+}
+
pub trait FsExt {
- fn fs_scope(&self) -> &Scope;
- fn try_fs_scope(&self) -> Option<&Scope>;
+ fn fs_scope(&self) -> tauri::fs::Scope;
+ fn try_fs_scope(&self) -> Option;
/// Cross platform file system APIs that also support manipulating Android files.
fn fs(&self) -> &Fs;
}
impl> FsExt for T {
- fn fs_scope(&self) -> &Scope {
- self.state::().inner()
+ fn fs_scope(&self) -> tauri::fs::Scope {
+ self.state::().scope.clone()
}
- fn try_fs_scope(&self) -> Option<&Scope> {
- self.try_state::().map(|s| s.inner())
+ fn try_fs_scope(&self) -> Option {
+ self.try_state::().map(|s| s.scope.clone())
}
fn fs(&self) -> &Fs {
@@ -413,17 +417,20 @@ pub fn init() -> TauriPlugin> {
commands::write_file,
commands::write_text_file,
commands::exists,
+ commands::size,
#[cfg(feature = "watch")]
watcher::watch,
#[cfg(feature = "watch")]
watcher::unwatch
])
.setup(|app, api| {
- let mut scope = Scope::default();
- scope.require_literal_leading_dot = api
- .config()
- .as_ref()
- .and_then(|c| c.require_literal_leading_dot);
+ let scope = Scope {
+ require_literal_leading_dot: api
+ .config()
+ .as_ref()
+ .and_then(|c| c.require_literal_leading_dot),
+ scope: tauri::fs::Scope::new(app, &FsScope::default())?,
+ };
#[cfg(target_os = "android")]
{
@@ -446,9 +453,9 @@ pub fn init() -> TauriPlugin> {
let scope = app.fs_scope();
for path in paths {
if path.is_file() {
- scope.allow_file(path);
+ let _ = scope.allow_file(path);
} else {
- scope.allow_directory(path, true);
+ let _ = scope.allow_directory(path, true);
}
}
}
diff --git a/plugins/fs/src/scope.rs b/plugins/fs/src/scope.rs
index e8361d511..7914706a5 100644
--- a/plugins/fs/src/scope.rs
+++ b/plugins/fs/src/scope.rs
@@ -2,130 +2,18 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
-use std::{
- collections::HashMap,
- path::{Path, PathBuf},
- sync::{
- atomic::{AtomicU32, Ordering},
- Mutex,
- },
-};
+use std::path::PathBuf;
use serde::Deserialize;
-#[derive(Deserialize)]
-#[serde(untagged)]
-pub(crate) enum EntryRaw {
- Value(PathBuf),
- Object { path: PathBuf },
-}
-
#[derive(Debug)]
pub struct Entry {
pub path: Option,
}
-pub type EventId = u32;
-type EventListener = Box;
-
-/// Scope change event.
-#[derive(Debug, Clone)]
-pub enum Event {
- /// A path has been allowed.
- PathAllowed(PathBuf),
- /// A path has been forbidden.
- PathForbidden(PathBuf),
-}
-
-#[derive(Default)]
-pub struct Scope {
- pub(crate) allowed: Mutex>,
- pub(crate) denied: Mutex>,
- event_listeners: Mutex>,
- next_event_id: AtomicU32,
- pub(crate) require_literal_leading_dot: Option,
-}
-
-impl Scope {
- /// Extend the allowed patterns with the given directory.
- ///
- /// After this function has been called, the frontend will be able to use the Tauri API to read
- /// the directory and all of its files. If `recursive` is `true`, subdirectories will be accessible too.
- pub fn allow_directory>(&self, path: P, recursive: bool) {
- let path = path.as_ref();
-
- {
- let mut allowed = self.allowed.lock().unwrap();
- allowed.push(path.to_path_buf());
- allowed.push(path.join(if recursive { "**" } else { "*" }));
- }
-
- self.emit(Event::PathAllowed(path.to_path_buf()));
- }
-
- /// Extend the allowed patterns with the given file path.
- ///
- /// After this function has been called, the frontend will be able to use the Tauri API to read the contents of this file.
- pub fn allow_file>(&self, path: P) {
- let path = path.as_ref();
-
- self.allowed.lock().unwrap().push(path.to_path_buf());
-
- self.emit(Event::PathAllowed(path.to_path_buf()));
- }
-
- /// Set the given directory path to be forbidden by this scope.
- ///
- /// **Note:** this takes precedence over allowed paths, so its access gets denied **always**.
- pub fn forbid_directory>(&self, path: P, recursive: bool) {
- let path = path.as_ref();
-
- {
- let mut denied = self.denied.lock().unwrap();
- denied.push(path.to_path_buf());
- denied.push(path.join(if recursive { "**" } else { "*" }));
- }
-
- self.emit(Event::PathForbidden(path.to_path_buf()));
- }
-
- /// Set the given file path to be forbidden by this scope.
- ///
- /// **Note:** this takes precedence over allowed paths, so its access gets denied **always**.
- pub fn forbid_file>(&self, path: P) {
- let path = path.as_ref();
-
- self.denied.lock().unwrap().push(path.to_path_buf());
-
- self.emit(Event::PathForbidden(path.to_path_buf()));
- }
-
- /// List of allowed paths.
- pub fn allowed(&self) -> Vec {
- self.allowed.lock().unwrap().clone()
- }
-
- /// List of forbidden paths.
- pub fn forbidden(&self) -> Vec {
- self.denied.lock().unwrap().clone()
- }
-
- fn next_event_id(&self) -> u32 {
- self.next_event_id.fetch_add(1, Ordering::Relaxed)
- }
-
- fn emit(&self, event: Event) {
- let listeners = self.event_listeners.lock().unwrap();
- let handlers = listeners.values();
- for listener in handlers {
- listener(&event);
- }
- }
-
- /// Listen to an event on this scope.
- pub fn listen(&self, f: F) -> EventId {
- let id = self.next_event_id();
- self.event_listeners.lock().unwrap().insert(id, Box::new(f));
- id
- }
+#[derive(Deserialize)]
+#[serde(untagged)]
+pub(crate) enum EntryRaw {
+ Value(PathBuf),
+ Object { path: PathBuf },
}
diff --git a/plugins/geolocation/README.md b/plugins/geolocation/README.md
index dd9d8e613..bf8e1741e 100644
--- a/plugins/geolocation/README.md
+++ b/plugins/geolocation/README.md
@@ -81,7 +81,7 @@ The Google Play Store uses this property to decide whether it should show the ap
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/global-shortcut/README.md b/plugins/global-shortcut/README.md
index 12a9b08d5..53e7b19fe 100644
--- a/plugins/global-shortcut/README.md
+++ b/plugins/global-shortcut/README.md
@@ -55,7 +55,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-global-shortcut#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/haptics/README.md b/plugins/haptics/README.md
index b96e267c3..e5f0e6973 100644
--- a/plugins/haptics/README.md
+++ b/plugins/haptics/README.md
@@ -58,7 +58,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-haptics#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/http/CHANGELOG.md b/plugins/http/CHANGELOG.md
index e814ddd9d..8b03f22d9 100644
--- a/plugins/http/CHANGELOG.md
+++ b/plugins/http/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## \[2.0.4]
+
+- [`a3b553dd`](https://github.com/tauri-apps/plugins-workspace/commit/a3b553ddb403771aa699362c4e69a064b7731da5) ([#2079](https://github.com/tauri-apps/plugins-workspace/pull/2079) by [@amrbashir](https://github.com/tauri-apps/plugins-workspace/../../amrbashir)) Add tracing logs for requestes and responses behind `tracing` feature flag.
+
+### Dependencies
+
+- Upgraded to `fs@2.1.0`
+
## \[2.0.3]
### Dependencies
diff --git a/plugins/http/Cargo.toml b/plugins/http/Cargo.toml
index 8c1801a38..e4303f196 100644
--- a/plugins/http/Cargo.toml
+++ b/plugins/http/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tauri-plugin-http"
-version = "2.0.3"
+version = "2.0.4"
description = "Access an HTTP client written in Rust."
edition = { workspace = true }
authors = { workspace = true }
@@ -34,13 +34,14 @@ serde_json = { workspace = true }
tauri = { workspace = true }
thiserror = { workspace = true }
tokio = { version = "1", features = ["sync", "macros"] }
-tauri-plugin-fs = { path = "../fs", version = "2.0.3" }
+tauri-plugin-fs = { path = "../fs", version = "2.1.0" }
urlpattern = "0.3"
regex = "1"
http = "1"
reqwest = { version = "0.12", default-features = false }
url = { workspace = true }
data-url = "0.3"
+tracing = { workspace = true, optional = true }
[features]
default = [
@@ -71,3 +72,4 @@ http2 = ["reqwest/http2"]
charset = ["reqwest/charset"]
macos-system-configuration = ["reqwest/macos-system-configuration"]
unsafe-headers = []
+tracing = ["dep:tracing"]
diff --git a/plugins/http/README.md b/plugins/http/README.md
index c3fe92c03..5c3cd9c2e 100644
--- a/plugins/http/README.md
+++ b/plugins/http/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-http#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/http/src/commands.rs b/plugins/http/src/commands.rs
index f4bc3aabc..03c84adf5 100644
--- a/plugins/http/src/commands.rs
+++ b/plugins/http/src/commands.rs
@@ -283,6 +283,9 @@ pub async fn fetch(
request = request.headers(headers);
+ #[cfg(feature = "tracing")]
+ tracing::trace!("{:?}", request);
+
let fut = async move { request.send().await.map_err(Into::into) };
let mut resources_table = webview.resources_table();
let rid = resources_table.add_request(Box::pin(fut));
@@ -304,6 +307,9 @@ pub async fn fetch(
.header(header::CONTENT_TYPE, data_url.mime_type().to_string())
.body(reqwest::Body::from(body))?;
+ #[cfg(feature = "tracing")]
+ tracing::trace!("{:?}", response);
+
let fut = async move { Ok(reqwest::Response::from(response)) };
let mut resources_table = webview.resources_table();
let rid = resources_table.add_request(Box::pin(fut));
@@ -351,6 +357,9 @@ pub async fn fetch_send(
}
};
+ #[cfg(feature = "tracing")]
+ tracing::trace!("{:?}", res);
+
let status = res.status();
let url = res.url().to_string();
let mut headers = Vec::new();
diff --git a/plugins/localhost/CHANGELOG.md b/plugins/localhost/CHANGELOG.md
index 3a2bf0609..0b2669251 100644
--- a/plugins/localhost/CHANGELOG.md
+++ b/plugins/localhost/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## \[2.1.0]
+
+- [`3449dd5a`](https://github.com/tauri-apps/plugins-workspace/commit/3449dd5a8f6d12fee8d6389c034fe47e19d72bcd) ([#1982](https://github.com/tauri-apps/plugins-workspace/pull/1982) by [@arihav](https://github.com/tauri-apps/plugins-workspace/../../arihav)) Add custom host binding to allow external access
+
## \[2.0.1]
- [`a1a82208`](https://github.com/tauri-apps/plugins-workspace/commit/a1a82208ed4ab87f83310be0dc95428aec9ab241) ([#1873](https://github.com/tauri-apps/plugins-workspace/pull/1873) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Downgrade MSRV to 1.77.2 to support Windows 7.
diff --git a/plugins/localhost/Cargo.toml b/plugins/localhost/Cargo.toml
index 3d9460d04..2f0fcebd7 100644
--- a/plugins/localhost/Cargo.toml
+++ b/plugins/localhost/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tauri-plugin-localhost"
-version = "2.0.1"
+version = "2.1.0"
description = "Expose your apps assets through a localhost server instead of the default custom protocol."
authors = { workspace = true }
license = { workspace = true }
diff --git a/plugins/localhost/README.md b/plugins/localhost/README.md
index 4e23c0383..dc0d98d21 100644
--- a/plugins/localhost/README.md
+++ b/plugins/localhost/README.md
@@ -38,7 +38,7 @@ tauri-plugin-localhost = { git = "https://github.com/tauri-apps/plugins-workspac
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
use tauri::{Manager, window::WindowBuilder, WindowUrl};
diff --git a/plugins/log/CHANGELOG.md b/plugins/log/CHANGELOG.md
index acc49d4fc..d9b564606 100644
--- a/plugins/log/CHANGELOG.md
+++ b/plugins/log/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## \[2.0.1]
+
+- [`371a2f73`](https://github.com/tauri-apps/plugins-workspace/commit/371a2f7361e0b91cf66f1287ffb18b34414a6cb8) ([#2021](https://github.com/tauri-apps/plugins-workspace/pull/2021) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Make webview log target more consistent that it always starts with `webview`
+
## \[2.0.2]
- [`606fa08d`](https://github.com/tauri-apps/plugins-workspace/commit/606fa08dae1acd074b961fb360623f4c86f13ee8) ([#1997](https://github.com/tauri-apps/plugins-workspace/pull/1997) by [@renovate](https://github.com/tauri-apps/plugins-workspace/../../renovate)) **Potentially breaking:** Updated `fern` from 0.6 to 0.7. This is technically a breaking change because `fern` is re-exported in `tauri-plugin-log`.
diff --git a/plugins/log/Cargo.toml b/plugins/log/Cargo.toml
index 7b94e9a4b..89416ff1d 100644
--- a/plugins/log/Cargo.toml
+++ b/plugins/log/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tauri-plugin-log"
-version = "2.0.2"
+version = "2.0.3"
description = "Configurable logging for your Tauri app."
authors = { workspace = true }
license = { workspace = true }
diff --git a/plugins/log/README.md b/plugins/log/README.md
index 1748d0c0e..09369173f 100644
--- a/plugins/log/README.md
+++ b/plugins/log/README.md
@@ -56,7 +56,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-log#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
use tauri_plugin_log::{Target, TargetKind};
diff --git a/plugins/log/package.json b/plugins/log/package.json
index fd0217012..d2cecb033 100644
--- a/plugins/log/package.json
+++ b/plugins/log/package.json
@@ -1,6 +1,6 @@
{
"name": "@tauri-apps/plugin-log",
- "version": "2.0.0",
+ "version": "2.0.1",
"description": "Configurable logging for your Tauri app.",
"license": "MIT OR Apache-2.0",
"authors": [
diff --git a/plugins/nfc/README.md b/plugins/nfc/README.md
index e8a9e1569..1f8ceb6bd 100644
--- a/plugins/nfc/README.md
+++ b/plugins/nfc/README.md
@@ -56,7 +56,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-nfc#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/notification/Cargo.toml b/plugins/notification/Cargo.toml
index 02e5cce89..a4a5a2d29 100644
--- a/plugins/notification/Cargo.toml
+++ b/plugins/notification/Cargo.toml
@@ -15,7 +15,7 @@ rustdoc-args = ["--cfg", "docsrs"]
targets = ["x86_64-unknown-linux-gnu", "x86_64-linux-android"]
[package.metadata.platforms.support]
-windows = { level = "full", notes = "" }
+windows = { level = "full", notes = "Only works for installed apps. Shows powershell name & icon in development." }
linux = { level = "full", notes = "" }
macos = { level = "full", notes = "" }
android = { level = "full", notes = "" }
diff --git a/plugins/notification/README.md b/plugins/notification/README.md
index e75ce540a..046324930 100644
--- a/plugins/notification/README.md
+++ b/plugins/notification/README.md
@@ -54,7 +54,7 @@ yarn add https://github.com/tauri-apps/tauri-plugin-notification#v2
First you need to register the core plugin with Tauri:
-`src-tauri/src/main.rs`
+`src-tauri/src/lib.rs`
```rust
fn main() {
diff --git a/plugins/opener/CHANGELOG.md b/plugins/opener/CHANGELOG.md
new file mode 100644
index 000000000..ab348e4f5
--- /dev/null
+++ b/plugins/opener/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Changelog
+
+## \[2.0.0]
+
+- [`383e636a`](https://github.com/tauri-apps/plugins-workspace/commit/383e636a8e595aec1300999a8aeb7d9bf8c14632) ([#2019](https://github.com/tauri-apps/plugins-workspace/pull/2019) by [@amrbashir](https://github.com/tauri-apps/plugins-workspace/../../amrbashir)) Initial Release
diff --git a/plugins/opener/Cargo.toml b/plugins/opener/Cargo.toml
new file mode 100644
index 000000000..ab690df66
--- /dev/null
+++ b/plugins/opener/Cargo.toml
@@ -0,0 +1,65 @@
+[package]
+name = "tauri-plugin-opener"
+version = "2.0.0"
+description = "Open files and URLs using their default application."
+edition = { workspace = true }
+authors = { workspace = true }
+license = { workspace = true }
+repository = { workspace = true }
+links = "tauri-plugin-opener"
+
+[package.metadata.docs.rs]
+rustc-args = ["--cfg", "docsrs"]
+rustdoc-args = ["--cfg", "docsrs"]
+
+# Platforms supported by the plugin
+# Support levels are "full", "partial", "none", "unknown"
+# Details of the support level are left to plugin maintainer
+[package.metadata.platforms]
+windows = { level = "full", notes = "" }
+linux = { level = "full", notes = "" }
+macos = { level = "full", notes = "" }
+android = { level = "partial", notes = "Only allows to open URLs via `open`" }
+ios = { level = "partial", notes = "Only allows to open URLs via `open`" }
+
+
+[build-dependencies]
+tauri-plugin = { workspace = true, features = ["build"] }
+schemars = { workspace = true }
+serde = { workspace = true }
+
+[dependencies]
+serde = { workspace = true }
+serde_json = { workspace = true }
+tauri = { workspace = true }
+thiserror = { workspace = true }
+open = { version = "5", features = ["shellexecute-on-windows"] }
+glob = { workspace = true }
+
+[target."cfg(windows)".dependencies]
+dunce = { workspace = true }
+
+[target."cfg(windows)".dependencies.windows]
+version = "0.58"
+features = [
+ "Win32_Foundation",
+ "Win32_UI_Shell_Common",
+ "Win32_UI_WindowsAndMessaging",
+ "Win32_System_Com",
+ "Win32_System_Registry",
+]
+
+[target."cfg(any(target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"netbsd\", target_os = \"openbsd\"))".dependencies]
+zbus = { workspace = true }
+url = { workspace = true }
+
+[target."cfg(target_os = \"macos\")".dependencies.objc2-app-kit]
+version = "0.2"
+features = ["NSWorkspace"]
+
+[target."cfg(target_os = \"macos\")".dependencies.objc2-foundation]
+version = "0.2"
+features = ["NSURL", "NSArray", "NSString"]
+
+[target.'cfg(target_os = "ios")'.dependencies]
+tauri = { workspace = true, features = ["wry"] }
diff --git a/plugins/opener/LICENSE.spdx b/plugins/opener/LICENSE.spdx
new file mode 100644
index 000000000..cdd0df5ad
--- /dev/null
+++ b/plugins/opener/LICENSE.spdx
@@ -0,0 +1,20 @@
+SPDXVersion: SPDX-2.1
+DataLicense: CC0-1.0
+PackageName: tauri
+DataFormat: SPDXRef-1
+PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy
+PackageHomePage: https://tauri.app
+PackageLicenseDeclared: Apache-2.0
+PackageLicenseDeclared: MIT
+PackageCopyrightText: 2019-2022, The Tauri Programme in the Commons Conservancy
+PackageSummary: Tauri is a rust project that enables developers to make secure
+and small desktop applications using a web frontend.
+
+PackageComment: The package includes the following libraries; see
+Relationship information.
+
+Created: 2019-05-20T09:00:00Z
+PackageDownloadLocation: git://github.com/tauri-apps/tauri
+PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git
+PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git
+Creator: Person: Daniel Thompson-Yvetot
\ No newline at end of file
diff --git a/plugins/opener/LICENSE_APACHE-2.0 b/plugins/opener/LICENSE_APACHE-2.0
new file mode 100644
index 000000000..4947287f7
--- /dev/null
+++ b/plugins/opener/LICENSE_APACHE-2.0
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/plugins/opener/LICENSE_MIT b/plugins/opener/LICENSE_MIT
new file mode 100644
index 000000000..4d7547256
--- /dev/null
+++ b/plugins/opener/LICENSE_MIT
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 - Present Tauri Apps Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/plugins/opener/README.md b/plugins/opener/README.md
new file mode 100644
index 000000000..82d0fea18
--- /dev/null
+++ b/plugins/opener/README.md
@@ -0,0 +1,100 @@
+![opener](https://github.com/tauri-apps/plugins-workspace/raw/v2/plugins/opener/banner.png)
+
+
+
+| Platform | Supported |
+| -------- | --------- |
+| Linux | ✓ |
+| Windows | ✓ |
+| macOS | ✓ |
+| Android | ? |
+| iOS | ? |
+
+## Install
+
+_This plugin requires a Rust version of at least **1.77.2**_
+
+There are three general methods of installation that we can recommend.
+
+1. Use crates.io and npm (easiest, and requires you to trust that our publishing pipeline worked)
+2. Pull sources directly from Github using git tags / revision hashes (most secure)
+3. Git submodule install this repo in your tauri project and then use file protocol to ingest the source (most secure, but inconvenient to use)
+
+Install the Core plugin by adding the following to your `Cargo.toml` file:
+
+`src-tauri/Cargo.toml`
+
+```toml
+[dependencies]
+tauri-plugin-opener = "2.0.0"
+# alternatively with Git:
+tauri-plugin-opener = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" }
+```
+
+You can install the JavaScript Guest bindings using your preferred JavaScript package manager:
+
+> Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use.
+
+
+
+```sh
+pnpm add @tauri-apps/plugin-opener
+# or
+npm add @tauri-apps/plugin-opener
+# or
+yarn add @tauri-apps/plugin-opener
+
+# alternatively with Git:
+pnpm add https://github.com/tauri-apps/tauri-plugin-opener#v2
+# or
+npm add https://github.com/tauri-apps/tauri-plugin-opener#v2
+# or
+yarn add https://github.com/tauri-apps/tauri-plugin-opener#v2
+```
+
+## Usage
+
+First you need to register the core plugin with Tauri:
+
+`src-tauri/src/lib.rs`
+
+```rust
+fn main() {
+ tauri::Builder::default()
+ .plugin(tauri_plugin_opener::init())
+ .run(tauri::generate_context!())
+ .expect("error while running tauri application");
+}
+```
+
+Afterwards all the plugin's APIs are available through the JavaScript guest bindings:
+
+```javascript
+
+```
+
+## Contributing
+
+PRs accepted. Please make sure to read the Contributing Guide before making a pull request.
+
+## Partners
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+For the complete list of sponsors please visit our [website](https://tauri.app#sponsors) and [Open Collective](https://opencollective.com/tauri).
+
+## License
+
+Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy.
+
+MIT or MIT/Apache 2.0 where applicable.
diff --git a/plugins/opener/SECURITY.md b/plugins/opener/SECURITY.md
new file mode 100644
index 000000000..4f09bbacd
--- /dev/null
+++ b/plugins/opener/SECURITY.md
@@ -0,0 +1,23 @@
+# Security Policy
+
+**Do not report security vulnerabilities through public GitHub issues.**
+
+**Please use the [Private Vulnerability Disclosure](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability) feature of GitHub.**
+
+Include as much of the following information:
+
+- Type of issue (e.g. improper input parsing, privilege escalation, etc.)
+- The location of the affected source code (tag/branch/commit or direct URL)
+- Any special configuration required to reproduce the issue
+- The distribution affected or used to help us with reproduction of the issue
+- Step-by-step instructions to reproduce the issue
+- Ideally a reproduction repository
+- Impact of the issue, including how an attacker might exploit the issue
+
+We prefer to receive reports in English.
+
+## Contact
+
+Please disclose a vulnerability or security relevant issue here: [https://github.com/tauri-apps/plugins-workspace/security/advisories/new](https://github.com/tauri-apps/plugins-workspace/security/advisories/new).
+
+Alternatively, you can also contact us by email via [security@tauri.app](mailto:security@tauri.app).
diff --git a/plugins/opener/android/.gitignore b/plugins/opener/android/.gitignore
new file mode 100644
index 000000000..c0f21ec2f
--- /dev/null
+++ b/plugins/opener/android/.gitignore
@@ -0,0 +1,2 @@
+/build
+/.tauri
diff --git a/plugins/opener/android/build.gradle.kts b/plugins/opener/android/build.gradle.kts
new file mode 100644
index 000000000..9dcce212e
--- /dev/null
+++ b/plugins/opener/android/build.gradle.kts
@@ -0,0 +1,39 @@
+plugins {
+ id("com.android.library")
+ id("org.jetbrains.kotlin.android")
+}
+
+android {
+ namespace = "app.tauri.opener"
+ compileSdk = 34
+
+ defaultConfig {
+ minSdk = 24
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles("consumer-rules.pro")
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = "1.8"
+ }
+}
+
+dependencies {
+ implementation("androidx.core:core-ktx:1.9.0")
+ implementation("com.fasterxml.jackson.core:jackson-databind:2.15.3")
+ implementation(project(":tauri-android"))
+}
diff --git a/plugins/opener/android/proguard-rules.pro b/plugins/opener/android/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/plugins/opener/android/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/plugins/opener/android/settings.gradle b/plugins/opener/android/settings.gradle
new file mode 100644
index 000000000..14a752e43
--- /dev/null
+++ b/plugins/opener/android/settings.gradle
@@ -0,0 +1,2 @@
+include ':tauri-android'
+project(':tauri-android').projectDir = new File('./.tauri/tauri-api')
diff --git a/plugins/opener/android/src/main/AndroidManifest.xml b/plugins/opener/android/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..9a40236b9
--- /dev/null
+++ b/plugins/opener/android/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/plugins/opener/android/src/main/java/OpenerPlugin.kt b/plugins/opener/android/src/main/java/OpenerPlugin.kt
new file mode 100644
index 000000000..0beeb9775
--- /dev/null
+++ b/plugins/opener/android/src/main/java/OpenerPlugin.kt
@@ -0,0 +1,30 @@
+// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-License-Identifier: MIT
+
+package app.tauri.shell
+
+import android.app.Activity
+import android.content.Intent
+import android.net.Uri
+import app.tauri.annotation.Command
+import app.tauri.annotation.TauriPlugin
+import app.tauri.plugin.Invoke
+import app.tauri.plugin.Plugin
+import java.io.File
+
+@TauriPlugin
+class OpenerPlugin(private val activity: Activity) : Plugin(activity) {
+ @Command
+ fun open(invoke: Invoke) {
+ try {
+ val url = invoke.parseArgs(String::class.java)
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ activity.applicationContext?.startActivity(intent)
+ invoke.resolve()
+ } catch (ex: Exception) {
+ invoke.reject(ex.message)
+ }
+ }
+}
\ No newline at end of file
diff --git a/plugins/opener/api-iife.js b/plugins/opener/api-iife.js
new file mode 100644
index 000000000..30415a61e
--- /dev/null
+++ b/plugins/opener/api-iife.js
@@ -0,0 +1 @@
+if("__TAURI__"in window){var __TAURI_PLUGIN_OPENER__=function(n){"use strict";async function e(n,e={},_){return window.__TAURI_INTERNALS__.invoke(n,e,_)}return"function"==typeof SuppressedError&&SuppressedError,n.openPath=async function(n,_){await e("plugin:opener|open_path",{path:n,with:_})},n.openUrl=async function(n,_){await e("plugin:opener|open_url",{url:n,with:_})},n.revealItemInDir=async function(n){return e("plugin:opener|reveal_item_in_dir",{path:n})},n}({});Object.defineProperty(window.__TAURI__,"opener",{value:__TAURI_PLUGIN_OPENER__})}
diff --git a/plugins/opener/build.rs b/plugins/opener/build.rs
new file mode 100644
index 000000000..fbad4d3ac
--- /dev/null
+++ b/plugins/opener/build.rs
@@ -0,0 +1,136 @@
+// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-License-Identifier: MIT
+
+use std::path::PathBuf;
+
+#[path = "src/scope_entry.rs"]
+#[allow(dead_code)]
+mod scope;
+
+/// Opener scope application.
+#[derive(schemars::JsonSchema)]
+#[serde(untagged)]
+#[allow(unused)]
+enum Application {
+ /// Open in default application.
+ Default,
+ /// If true, allow open with any application.
+ Enable(bool),
+ /// Allow specific application to open with.
+ App(String),
+}
+
+impl Default for Application {
+ fn default() -> Self {
+ Self::Default
+ }
+}
+
+/// Opener scope entry.
+#[derive(schemars::JsonSchema)]
+#[serde(untagged)]
+#[allow(unused)]
+enum OpenerScopeEntry {
+ Url {
+ /// A URL that can be opened by the webview when using the Opener APIs.
+ ///
+ /// Wildcards can be used following the UNIX glob pattern.
+ ///
+ /// Examples:
+ ///
+ /// - "https://*" : allows all HTTPS origin
+ ///
+ /// - "https://*.github.com/tauri-apps/tauri": allows any subdomain of "github.com" with the "tauri-apps/api" path
+ ///
+ /// - "https://myapi.service.com/users/*": allows access to any URLs that begins with "https://myapi.service.com/users/"
+ url: String,
+ /// An application to open this url with, for example: firefox.
+ #[serde(default)]
+ app: Application,
+ },
+ Path {
+ /// A path that can be opened by the webview when using the Opener APIs.
+ ///
+ /// The 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`.
+ path: PathBuf,
+ /// An application to open this path with, for example: xdg-open.
+ #[serde(default)]
+ app: Application,
+ },
+}
+
+// Ensure `OpenerScopeEntry` and `scope::EntryRaw` is kept in sync
+fn _f() {
+ match (scope::EntryRaw::Url {
+ url: String::new(),
+ app: scope::Application::Enable(true),
+ }) {
+ scope::EntryRaw::Url { url, app } => OpenerScopeEntry::Url {
+ url,
+ app: match app {
+ scope::Application::Enable(p) => Application::Enable(p),
+ scope::Application::App(p) => Application::App(p),
+ scope::Application::Default => Application::Default,
+ },
+ },
+ scope::EntryRaw::Path { path, app } => OpenerScopeEntry::Path {
+ path,
+ app: match app {
+ scope::Application::Enable(p) => Application::Enable(p),
+ scope::Application::App(p) => Application::App(p),
+ scope::Application::Default => Application::Default,
+ },
+ },
+ };
+ match (OpenerScopeEntry::Url {
+ url: String::new(),
+ app: Application::Enable(true),
+ }) {
+ OpenerScopeEntry::Url { url, app } => scope::EntryRaw::Url {
+ url,
+ app: match app {
+ Application::Enable(p) => scope::Application::Enable(p),
+ Application::App(p) => scope::Application::App(p),
+ Application::Default => scope::Application::Default,
+ },
+ },
+ OpenerScopeEntry::Path { path, app } => scope::EntryRaw::Path {
+ path,
+ app: match app {
+ Application::Enable(p) => scope::Application::Enable(p),
+ Application::App(p) => scope::Application::App(p),
+ Application::Default => scope::Application::Default,
+ },
+ },
+ };
+}
+
+const COMMANDS: &[&str] = &["open_url", "open_path", "reveal_item_in_dir"];
+
+fn main() {
+ tauri_plugin::Builder::new(COMMANDS)
+ .global_api_script_path("./api-iife.js")
+ .android_path("android")
+ .ios_path("ios")
+ .global_scope_schema(schemars::schema_for!(OpenerScopeEntry))
+ .build();
+
+ let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
+ let mobile = target_os == "ios" || target_os == "android";
+ alias("desktop", !mobile);
+ alias("mobile", mobile);
+}
+
+// creates a cfg alias if `has_feature` is true.
+// `alias` must be a snake case string.
+fn alias(alias: &str, has_feature: bool) {
+ println!("cargo:rustc-check-cfg=cfg({alias})");
+ if has_feature {
+ println!("cargo:rustc-cfg={alias}");
+ }
+}
diff --git a/plugins/opener/guest-js/index.ts b/plugins/opener/guest-js/index.ts
new file mode 100644
index 000000000..0d92596b9
--- /dev/null
+++ b/plugins/opener/guest-js/index.ts
@@ -0,0 +1,92 @@
+// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-License-Identifier: MIT
+
+/**
+ * Open files and URLs using their default application.
+ *
+ * ## Security
+ *
+ * This API has a scope configuration that forces you to restrict the files and urls to be opened.
+ *
+ * ### Restricting access to the {@link open | `open`} API
+ *
+ * On the configuration object, `open: true` means that the {@link open} API can be used with any URL,
+ * as the argument is validated with the `^((mailto:\w+)|(tel:\w+)|(https?://\w+)).+` regex.
+ * You can change that regex by changing the boolean value to a string, e.g. `open: ^https://github.com/`.
+ *
+ * @module
+ */
+
+import { invoke } from '@tauri-apps/api/core'
+
+/**
+ * Opens a url with the system's default app, or the one specified with {@linkcode openWith}.
+ *
+ * @example
+ * ```typescript
+ * import { openUrl } from '@tauri-apps/plugin-opener';
+ *
+ * // opens the given URL on the default browser:
+ * await openUrl('https://github.com/tauri-apps/tauri');
+ * // opens the given URL using `firefox`:
+ * await openUrl('https://github.com/tauri-apps/tauri', 'firefox');
+ * ```
+ *
+ * @param url The URL to open.
+ * @param openWith The app to open the URL with. If not specified, defaults to the system default application for the specified url type.
+ *
+ * @since 2.0.0
+ */
+export async function openUrl(url: string, openWith?: string): Promise {
+ await invoke('plugin:opener|open_url', {
+ url,
+ with: openWith
+ })
+}
+
+/**
+ * Opens a path with the system's default app, or the one specified with {@linkcode openWith}.
+ *
+ * @example
+ * ```typescript
+ * import { openPath } from '@tauri-apps/plugin-opener';
+ *
+ * // opens a file using the default program:
+ * await openPath('/path/to/file');
+ * // opens a file using `vlc` command on Windows.
+ * await openPath('C:/path/to/file', 'vlc');
+ * ```
+ *
+ * @param path The path to open.
+ * @param openWith The app to open the path with. If not specified, defaults to the system default application for the specified path type.
+ *
+ * @since 2.0.0
+ */
+export async function openPath(path: string, openWith?: string): Promise {
+ await invoke('plugin:opener|open_path', {
+ path,
+ with: openWith
+ })
+}
+
+/**
+ * Reveal a path the system's default explorer.
+ *
+ * #### Platform-specific:
+ *
+ * - **Android / iOS:** Unsupported.
+ *
+ * @example
+ * ```typescript
+ * import { revealItemInDir } from '@tauri-apps/plugin-opener';
+ * await revealItemInDir('/path/to/file');
+ * ```
+ *
+ * @param path The path to reveal.
+ *
+ * @since 2.0.0
+ */
+export async function revealItemInDir(path: string) {
+ return invoke('plugin:opener|reveal_item_in_dir', { path })
+}
diff --git a/plugins/opener/guest-js/init.ts b/plugins/opener/guest-js/init.ts
new file mode 100644
index 000000000..046db99c4
--- /dev/null
+++ b/plugins/opener/guest-js/init.ts
@@ -0,0 +1,61 @@
+// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-License-Identifier: MIT
+
+import { invoke } from '@tauri-apps/api/core'
+
+// open links with the API
+window.addEventListener('click', function (evt) {
+ // return early if
+ if (
+ // event was prevented
+ evt.defaultPrevented ||
+ // or not a left click
+ evt.button !== 0 ||
+ // or meta key pressed
+ evt.metaKey ||
+ // or al key pressed
+ evt.altKey
+ )
+ return
+
+ const a = evt
+ .composedPath()
+ .find((el) => el instanceof Node && el.nodeName.toUpperCase() === 'A') as
+ | HTMLAnchorElement
+ | undefined
+
+ // return early if
+ if (
+ // not tirggered from element
+ !a ||
+ // or doesn't have a href
+ !a.href ||
+ // or not supposed to be open in a new tab
+ !(
+ a.target === '_blank' ||
+ // or ctrl key pressed
+ evt.ctrlKey ||
+ // or shift key pressed
+ evt.shiftKey
+ )
+ )
+ return
+
+ const url = new URL(a.href)
+
+ // return early if
+ if (
+ // same origin (internal navigation)
+ url.origin === window.location.origin ||
+ // not default protocols
+ ['http:', 'https:', 'mailto:', 'tel:'].every((p) => url.protocol !== p)
+ )
+ return
+
+ evt.preventDefault()
+
+ void invoke('plugin:opener|open_url', {
+ url
+ })
+})
diff --git a/plugins/opener/ios/Package.resolved b/plugins/opener/ios/Package.resolved
new file mode 100644
index 000000000..5f998e0e6
--- /dev/null
+++ b/plugins/opener/ios/Package.resolved
@@ -0,0 +1,16 @@
+{
+ "object": {
+ "pins": [
+ {
+ "package": "SwiftRs",
+ "repositoryURL": "https://github.com/Brendonovich/swift-rs",
+ "state": {
+ "branch": null,
+ "revision": "b5ed223fcdab165bc21219c1925dc1e77e2bef5e",
+ "version": "1.0.6"
+ }
+ }
+ ]
+ },
+ "version": 1
+}
diff --git a/plugins/opener/ios/Package.swift b/plugins/opener/ios/Package.swift
new file mode 100644
index 000000000..8d06936e6
--- /dev/null
+++ b/plugins/opener/ios/Package.swift
@@ -0,0 +1,34 @@
+// swift-tools-version:5.3
+// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-License-Identifier: MIT
+
+import PackageDescription
+
+let package = Package(
+ name: "tauri-plugin-opener",
+ platforms: [
+ .macOS(.v10_13),
+ .iOS(.v13),
+ ],
+ products: [
+ // Products define the executables and libraries a package produces, and make them visible to other packages.
+ .library(
+ name: "tauri-plugin-opener",
+ type: .static,
+ targets: ["tauri-plugin-opener"])
+ ],
+ dependencies: [
+ .package(name: "Tauri", path: "../.tauri/tauri-api")
+ ],
+ targets: [
+ // Targets are the basic building blocks of a package. A target can define a module or a test suite.
+ // Targets can depend on other targets in this package, and on products in packages this package depends on.
+ .target(
+ name: "tauri-plugin-opener",
+ dependencies: [
+ .byName(name: "Tauri")
+ ],
+ path: "Sources")
+ ]
+)
diff --git a/plugins/opener/ios/Sources/OpenerPlugin.swift b/plugins/opener/ios/Sources/OpenerPlugin.swift
new file mode 100644
index 000000000..39bc5725c
--- /dev/null
+++ b/plugins/opener/ios/Sources/OpenerPlugin.swift
@@ -0,0 +1,34 @@
+// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-License-Identifier: MIT
+
+import Foundation
+
+import SwiftRs
+import Tauri
+import UIKit
+import WebKit
+
+class OpenerPlugin: Plugin {
+
+ @objc public func open(_ invoke: Invoke) throws {
+ do {
+ let urlString = try invoke.parseArgs(String.self)
+ if let url = URL(string: urlString) {
+ if #available(iOS 10, *) {
+ UIApplication.shared.open(url, options: [:])
+ } else {
+ UIApplication.shared.openURL(url)
+ }
+ }
+ invoke.resolve()
+ } catch {
+ invoke.reject(error.localizedDescription)
+ }
+ }
+}
+
+@_cdecl("init_plugin_shell")
+func initPlugin() -> Plugin {
+ return OpenerPlugin()
+}
diff --git a/plugins/opener/package.json b/plugins/opener/package.json
new file mode 100644
index 000000000..cacdb03e2
--- /dev/null
+++ b/plugins/opener/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@tauri-apps/plugin-opener",
+ "version": "2.0.0",
+ "description": "Open files and URLs using their default application.",
+ "license": "MIT OR Apache-2.0",
+ "authors": [
+ "Tauri Programme within The Commons Conservancy"
+ ],
+ "repository": "https://github.com/tauri-apps/plugins-workspace",
+ "type": "module",
+ "types": "./dist-js/index.d.ts",
+ "main": "./dist-js/index.cjs",
+ "module": "./dist-js/index.js",
+ "exports": {
+ "types": "./dist-js/index.d.ts",
+ "import": "./dist-js/index.js",
+ "require": "./dist-js/index.cjs"
+ },
+ "scripts": {
+ "build": "rollup -c"
+ },
+ "files": [
+ "dist-js",
+ "README.md",
+ "LICENSE"
+ ],
+ "dependencies": {
+ "@tauri-apps/api": "^2.0.0"
+ }
+}
diff --git a/plugins/opener/permissions/allow-default-urls.toml b/plugins/opener/permissions/allow-default-urls.toml
new file mode 100644
index 000000000..93495b897
--- /dev/null
+++ b/plugins/opener/permissions/allow-default-urls.toml
@@ -0,0 +1,17 @@
+"$schema" = "schemas/schema.json"
+
+[[permission]]
+identifier = "allow-default-urls"
+description = "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
+
+[[permission.scope.allow]]
+url = "mailto:*"
+
+[[permission.scope.allow]]
+url = "tel:*"
+
+[[permission.scope.allow]]
+url = "http://*"
+
+[[permission.scope.allow]]
+url = "https://*"
diff --git a/plugins/opener/permissions/autogenerated/commands/open_path.toml b/plugins/opener/permissions/autogenerated/commands/open_path.toml
new file mode 100644
index 000000000..ae67b9394
--- /dev/null
+++ b/plugins/opener/permissions/autogenerated/commands/open_path.toml
@@ -0,0 +1,13 @@
+# Automatically generated - DO NOT EDIT!
+
+"$schema" = "../../schemas/schema.json"
+
+[[permission]]
+identifier = "allow-open-path"
+description = "Enables the open_path command without any pre-configured scope."
+commands.allow = ["open_path"]
+
+[[permission]]
+identifier = "deny-open-path"
+description = "Denies the open_path command without any pre-configured scope."
+commands.deny = ["open_path"]
diff --git a/plugins/opener/permissions/autogenerated/commands/open_url.toml b/plugins/opener/permissions/autogenerated/commands/open_url.toml
new file mode 100644
index 000000000..f1e694b1b
--- /dev/null
+++ b/plugins/opener/permissions/autogenerated/commands/open_url.toml
@@ -0,0 +1,13 @@
+# Automatically generated - DO NOT EDIT!
+
+"$schema" = "../../schemas/schema.json"
+
+[[permission]]
+identifier = "allow-open-url"
+description = "Enables the open_url command without any pre-configured scope."
+commands.allow = ["open_url"]
+
+[[permission]]
+identifier = "deny-open-url"
+description = "Denies the open_url command without any pre-configured scope."
+commands.deny = ["open_url"]
diff --git a/plugins/opener/permissions/autogenerated/commands/reveal_item_in_dir.toml b/plugins/opener/permissions/autogenerated/commands/reveal_item_in_dir.toml
new file mode 100644
index 000000000..e669620ff
--- /dev/null
+++ b/plugins/opener/permissions/autogenerated/commands/reveal_item_in_dir.toml
@@ -0,0 +1,13 @@
+# Automatically generated - DO NOT EDIT!
+
+"$schema" = "../../schemas/schema.json"
+
+[[permission]]
+identifier = "allow-reveal-item-in-dir"
+description = "Enables the reveal_item_in_dir command without any pre-configured scope."
+commands.allow = ["reveal_item_in_dir"]
+
+[[permission]]
+identifier = "deny-reveal-item-in-dir"
+description = "Denies the reveal_item_in_dir command without any pre-configured scope."
+commands.deny = ["reveal_item_in_dir"]
diff --git a/plugins/opener/permissions/autogenerated/reference.md b/plugins/opener/permissions/autogenerated/reference.md
new file mode 100644
index 000000000..66c232c6f
--- /dev/null
+++ b/plugins/opener/permissions/autogenerated/reference.md
@@ -0,0 +1,109 @@
+## Default Permission
+
+This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application
+as well as reveal file in directories using default file explorer
+
+- `allow-open-url`
+- `allow-reveal-item-in-dir`
+- `allow-default-urls`
+
+## Permission Table
+
+
+
+Identifier |
+Description |
+
+
+
+
+
+
+`opener:allow-default-urls`
+
+ |
+
+
+This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.
+
+ |
+
+
+
+
+
+`opener:allow-open-path`
+
+ |
+
+
+Enables the open_path command without any pre-configured scope.
+
+ |
+
+
+
+
+
+`opener:deny-open-path`
+
+ |
+
+
+Denies the open_path command without any pre-configured scope.
+
+ |
+
+
+
+
+
+`opener:allow-open-url`
+
+ |
+
+
+Enables the open_url command without any pre-configured scope.
+
+ |
+
+
+
+
+
+`opener:deny-open-url`
+
+ |
+
+
+Denies the open_url command without any pre-configured scope.
+
+ |
+
+
+
+
+
+`opener:allow-reveal-item-in-dir`
+
+ |
+
+
+Enables the reveal_item_in_dir command without any pre-configured scope.
+
+ |
+
+
+
+
+
+`opener:deny-reveal-item-in-dir`
+
+ |
+
+
+Denies the reveal_item_in_dir command without any pre-configured scope.
+
+ |
+
+
diff --git a/plugins/opener/permissions/default.toml b/plugins/opener/permissions/default.toml
new file mode 100644
index 000000000..846d6e51b
--- /dev/null
+++ b/plugins/opener/permissions/default.toml
@@ -0,0 +1,10 @@
+"$schema" = "schemas/schema.json"
+
+[default]
+description = """This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application
+as well as reveal file in directories using default file explorer"""
+permissions = [
+ "allow-open-url",
+ "allow-reveal-item-in-dir",
+ "allow-default-urls",
+]
diff --git a/plugins/opener/permissions/schemas/schema.json b/plugins/opener/permissions/schemas/schema.json
new file mode 100644
index 000000000..b958ac636
--- /dev/null
+++ b/plugins/opener/permissions/schemas/schema.json
@@ -0,0 +1,340 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "PermissionFile",
+ "description": "Permission file that can define a default permission, a set of permissions or a list of inlined permissions.",
+ "type": "object",
+ "properties": {
+ "default": {
+ "description": "The default permission set for the plugin",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/DefaultPermission"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "set": {
+ "description": "A list of permissions sets defined",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PermissionSet"
+ }
+ },
+ "permission": {
+ "description": "A list of inlined permissions",
+ "default": [],
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Permission"
+ }
+ }
+ },
+ "definitions": {
+ "DefaultPermission": {
+ "description": "The default permission set of the plugin.\n\nWorks similarly to a permission with the \"default\" identifier.",
+ "type": "object",
+ "required": [
+ "permissions"
+ ],
+ "properties": {
+ "version": {
+ "description": "The version of the permission.",
+ "type": [
+ "integer",
+ "null"
+ ],
+ "format": "uint64",
+ "minimum": 1.0
+ },
+ "description": {
+ "description": "Human-readable description of what the permission does. Tauri convention is to use